分类 网页与编程 中的文章

PHP 的协程库

协程是当下火热的概念,尤其是 NodeJS 和 Go 语言的流行将协程彻彻底底的带入了大家的视野。然后大家这才意识到,在绝大多数面向服务端的程序中,阻塞式的 IO 才是并发最大的原罪。

PHP 8.0 正式版发布了

PHP开发团队宣布php8.0.0正式版发布了,这是PHP语言目前的最新版本。

前端上传组件Plupload使用指南

Plupload有以下功能和特点:

1、拥有多种上传方式:HTML5、flash、silverlight以及传统的<input type=”file” />。Plupload会自动侦测当前的环境,选择最合适的上传方式,并且会优先使用HTML5的方式。所以你完全不用去操心当前的浏览器支持哪些上传方式,Plupload会自动为你选择最合适的方式。

2、支持以拖拽的方式来选取要上传的文件

3、支持在前端压缩图片,即在图片文件还未上传之前就对它进行压缩

4、可以直接读取原生的文件数据,这样的好处就是例如可以在图片文件还未上传之前就能把它显示在页面上预览

5、支持把大文件切割成小片进行上传,因为有些浏览器对很大的文件比如几G的一些文件无法上传。


Rust 实现的 Aliddns

基于 Rust 实现了一个阿里云动态域名解析更新程序。

https://github.com/xpader/rust-aliddns

主要实现了阿里的 API 动态参数鉴权,公网 IP 与解析设置对比检测,解析添加和更新等等。

学 Rust 的拙劣之作,欢迎评头论足。

Pader 2020-7-31 0

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