快递柜与蜘蛛:文明的发展到底是不是必然的逆自然?

前段时间经过小区门口的快递柜时发现快递柜的屏幕面前有一张蛛网,中间有一只蜘蛛,之后的好几天我都发现蜘蛛一直在上面,当时觉得挺有意思,因为取快递要操作那个屏幕,那个蛛网非常妨碍人们取快递。理论上对于现代不那么尊重自然和谐的人们来说,这个蛛网应该早就会被清理了,然而它就是一直在那。

LeetCode 刷题:用 Rust 二进制求和

尝试着在 LeetCode 上用 Rust 刷些题。

题目地址:https://leetcode-cn.com/problems/add-binary/

这一题我的解法基本上就是把两个二进制反转后从前往后挨个进行相加进位,感觉代码还不够优雅。

但是基础原理够明白,没有任何所谓的溢出问题。

对于 Rust 不不是很熟悉,最折腾的就是这个 string_bin_vec 函数,最开始直接用 to_bytes() 或 .reverse() 进行反转,被借用、引用折腾好久就是编译不过,最终采用了复制成反转的 vec 方法,不过看了别人的题貌似两个字符串可以使用 .chars().rev() 之后以 iter 的形式进行遍历。

impl Solution {

    pub fn add_binary(a: String, b: String) -> String {
        // 从后向前运算会比较麻烦,所以这里将字符串复制成反转的 vec 后从前往后算就简单的多
        let ab = Solution::string_bin_vec(&a);
        let bb = Solution::string_bin_vec(&b);

        let mut c: Vec<u8> = vec![];

        // 当两个二进制字符串不一样长时,确定最长的处理次数
        let al = ab.len();
        let bl = bb.len();
        let max_len = if al > bl { al } else { bl };

        let mut plus = false;

        for x in 0..max_len {
            let ax: u8 = if x < al { ab[x] } else { 0 };
            let bx: u8 = if x < bl { bb[x] } else { 0 };

            // 确定当前相加值和是否有进位
            let mut cur: u8 = if ax == bx { 0 } else { 1 };
            let mut now_plus: bool = ax == 1 && bx == 1;

            // 如果前一次运算有进位则需要再运算
            if plus {
                cur = if cur == 0 { 1 } else {
                    now_plus = true;
                    0
                }
            }

            println!("ax={}, bx={}, cur={}, plus={}", ax, bx, cur, plus);

            plus = now_plus;
            c.push(cur);
        }

        if plus {
            c.push(1);
        }

        // 结果要再反转一下成为正常的顺序
        c.reverse();

        // 还原成字符串并返回
        let mut cs: String = String::from("");

        for x in 0..c.len() {
            let s = if c[x] == 1 {
                "1"
            } else {
                "0"
            };
            cs.push_str(s);
        }

        cs
    }

    fn string_bin_vec(str: &String) -> Vec<u8> {
        let bytes = &str.as_bytes();
        let mut new_vec: Vec<u8> = vec![];

        for x in 0..bytes.len() {
            new_vec.push(if bytes[x] == 48 { 0 } else { 1 });
        }

        new_vec.reverse();
        new_vec
    }

}


Pader 2020-6-23 0

Rust 学习之 Some、Option、Result

最近学习 Rust 时对它的所有权,借用等概念,包括语法之类的都还算好理解,但碰到 Some、Option、Result 这些,包括语句后面的 ? 号等等着实困惑了一把,不过经过各种资料的翻阅,总算是理解这几样东西的用法及存在的意义,在这里记录一下。

一个不太好的消息“FreeNAS将发布一个基于Linux的版本”

引用链接“https://www.cnbeta.com/articles/soft/987059.htm”。

iXsystems 宣布了一个基于 Debian Linux 的版本叫 TrueNAS SCALE。

目前暂不清楚这个 TrueNAS SCALE 的最终定位是什么,如果最终目的是完全代替掉现有的 FreeNAS/TrueNAS,那么对于 FreeBSD 来说这是一件很悲剧的事。根据原文的说法,里面所讲的优势只有 Docker Hub 的生态才比较明显,而要让一个非常重视文件系统的操作系统在 Linux 上使用 ZFS 目前来说还是不太负责任的做法。

天佑 FreeBSD。

Pader 2020-6-4 1

VGOT Blog 新增了 Akismet 反垃圾评论服务插件

自从评论功能上线没多久,经常收到国外的大量垃圾评论,评论内容都如出一辙,基本上都是国外的各种与博客内容没有实质关系的内容加上在线服务销售网站链接,搞的我不得不进数据库删除这些评论(评论管理功能还没做好)。

上次看到这些垃圾评论后(删除前忘了截图,看不到了),就想着做一个反垃圾评论的功能。后来大概研究了一下,如果自己做反垃圾可能会比较复杂,目前相以现实的反垃圾服务大概有以下几种方式:

  1. 添加验证码或其它验证机制

    英文数字验证码
    滑动验证码

  2. 针对大部分都是英文评论垃圾的情况限制无中文评论发表

  3. 使用第三方反垃圾内容服务
    使用易盾、同盾等国内反垃圾服务
    使用 Wordpress 的 Akismet 服务