MENU

Keep It Stupid Simple

升到Mac OS High Sierra

今天上午把系统下载完,趁着午饭时间安装了更新;还算顺利吃饭回来发现升级好了。对于丐版Pro来说,硬盘不够用是个大问题,听说 High Sierra 的 APFS 文件系统能腾出点空间,升级完一看果然还是没啥变化;哎,已经用了3年多了,希望还能再战一年。

Read More

String.valueOf(null)引出的两个问题

昨天有人在群里问了这么个问题:

System.out.println(String.valueOf(null));

会报空指针异常;而下面这样就可以打印null

Object obj = null;    
System.out.println(String.valueOf(obj));

debug代码会发现,两种方式执行了不同的重载方法,第一种执行了

public static String valueOf(char data[]) {
    return new String(data);
}

第二种执行了

public static String valueOf(Object obj) {
    return (obj == null) ? ""null"" : obj.toString();
}

如果对重载不熟悉,很难解释其中原因;当然null是另一个让人头疼的问。

重载

Java的重载解析过程是以两阶段运行的:

  • 第一阶段:选取所有可获得并且可应用的方法或构造器。

Read More

博客开启 https 和 gzip

进入阿里云控制台,“安全(云盾)”下的“证书服务”,点击购买证书,选择免费型 DV SSL;购买成功后补全信息,择系统生成 CSR以及DNS 验证方式,提交审核;稍等片刻审核通过,在订单列表中点击下载,选择下载nginx证书;将下载的文件上传至服务器;压缩文件包含.key和.pem文件,放到指定文件夹,例如/etc/nginx/conf.d/wangxs_cn_ss;。

打开nginx配置文件,将之前的listen 80;替换为以下配置:

listen                    443;
server_name               wangxs.cn;
ssl                       on;
ssl_certificate           /etc/nginx/conf.d/wangxs_cn_ssl/214244188290830.pem;
ssl_certificate_key       /etc/nginx/conf.d/wangxs_cn_ssl/214244188290830.key;
ssl_session_timeout       5m;
ssl_ciphers               ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols             TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

并将之前的www跳转到non-www的配置修改为:

server {
    listen                    80;
    server_name               wangxs.cn www.wangxs.cn;
    return 301 https://wangxs.cn$request_uri;
}

Read More

HTTP 代理池实现

首先,使用付费代理的用户可以忽略本文;如果经常使用免费代理又觉得不稳定的用户可以尝试下,尤其适合爬虫这类需要频繁换代理IP的场景。

该项目fork自 https://github.com/henson/ProxyPool;原项目使用了mongodb作为代理的存储,返回json类型数据,大概是这样:

{
    ""ip"": ""27.4.70.129:53281"",
    ""type"": ""http""
}

改造之后,将mongodb换成了redis,加入了cron任务,返回文本数据:27.4.70.129:53281

项目由四个功能构成,api、getter、storage和tasks。

api

//程序版本
const VERSION = ""/v1""

// 提供api服务
func Serve() {
    mux := http.NewServeMux()
    mux.HandleFunc(VERSION+""/ip"", ProxyHandler)
    log.Println(""Starting server"", util.NewConfig().Host)
    http.ListenAndServe(util.NewConfig().Host, mux)
}

//代理处理器
func ProxyHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method == ""GET"" {
        w.Header().Set(""content-type"", ""text/html"")
        ip := storage.ProxyGet()
        w.Write([]byte(ip))
    }
}

提供http服务,GET http://127.0.0.1:8080/v1/ip返回代理ip

Read More

爬取知乎用户数据

最近一直想写个爬虫项目,刷知乎的时候看见很多知乎用户爬虫的文章,而且都放了GitHub地址;不过大都是代码量比稍大的项目,看那一大片一大片的python代码有点晕。直到昨天发现了一个相当简洁的爬虫项目,四个文件加起来大概四五百行代码。不用cookie、不用MySQL,直接将用户信息JSON存到csv,相当简单粗暴。自己写代码的事可以先放一放了,直接站在巨人的肩膀上吧(直接clone下来跑)。

Read More