分类 网页与编程 中的文章

前端上传组件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

Rust 学习之 Some、Option、Result

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

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

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

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

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

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

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

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