一年一度的年终小结又到了,今年似乎做了不少事情,又似乎没做什么,是时候写下来好好的审视一下了。
技术上主要做了两个开源项目:
Easy-Karabiner : Karabiner 是 macOS 上一款改键神器,几乎能实现任何形式的改键,而且内存和 CPU 占用都很少,但是它是通过 XML 进行配置,配置不难但是麻烦,维护十分蛋疼,每次要改什么都得去重新翻文档。基于此,Easy-Karabiner 诞生了,它读取写在 python 文件中的配置,将其导出成 XML,使得配置简化了不少; shadowsocks-rust : shadowsocks 是由 clowwindy 实现的一款 SOCKS5 代理,速度快、占用资源少,shadowsocks-rust 是它的 rust 实现,实现了绝大部分功能,性能同样很好。造这个轮子的出发点是为了学习 rust,实现 shadowsocks 涉及到方方面面的知识,而且工程量适中,代码易懂,很适合用来练习编程语言。其次是:
学会了 Rust ,加深了对类型系统和编程语言的理解; 完成了部分 JOS 的任务(由于考试的缘故中断了,后来就续不上了……),加深了对操作系统的理解,现在我能够读写简单的汇编了; 进一步完善了博客,并将其 docker 化了,现在几行命令就可以搭建起来了;给各种各样的开源项目做出了贡献(提 issue 或 PR,PR 主要是修 bug……),献上我的贡献图:

再就是在开普勒数据科技有限公司为期三个月的实习了:
为合作的公司实现个性化推荐系统。我负责的模块是将发送来的数据序列化后存储到 HBase 中,同时根据各字段间的关系生成某些指标,由于数据量较大,这部分得考虑清楚用什么策略来做,否则可能出现数据源源不断的过来,系统却在“慢吞吞”的处理,导致未处理完的数据堆积得越来越多。另外,还要对接受到的 RPC 请求进行处理,然后响应结果给请求方,这部分就是普通的 RPC 服务器,只需要注意性能跟得上就行;由于业务需要,得实现各种各样的爬虫。写爬虫是个体力活,也不是很难,我在实现这几个爬虫的时候,流程基本上是固定的:
分析需要爬取的数据是怎么得到的,直接请求 HTML 是否有; 如果没有,试试看移动端的页面; 如果还是没有,抓包看有没有隐藏的接口可以用; 如果数据是通过 js 获取的,可能得考虑用 headless browser ; 搞清数据来源后,用 scrapy 之类的框架来做; 如果出现 40x 了,可能是有限速或限 IP,那么就得在程序中限制请求频率或加代理。仔细想想,在完成自己的开源项目上花费了很多时间,比如:Easy-Karabiner 花了一两个月,shadowsocks-rust 花了三四个月。实际有 80% 的时间在完善 20% 的细节或琐事上,比如:新想出来一个点子,要实现;发现一个错误没处理,要搞定;文档没写清楚,要完善。每每做这些事情的时候都是「痛并快乐着」,一方面费时费力,却对整个项目只有很少的贡献;一方面就像打磨璞玉一样,看着它逐渐圆润的过程是很有成就感、很让人快乐的。
生活上和恋爱近三年的女朋友分手了,有成长,也有伤感,意识到自己有一些以往没有注意到的问题,会注意到它们,尝试克服它们。发现自己的身体变得更差了,就连小小的感冒也会十分难受,为了改善这一点,开始参加实验室的运动,有规律的去健身房。
接下来希望今年能完成下面这些「小目标」:
看论文,写爬虫爬取毕设需要的数据,考虑毕设怎么做; 刷 leetcode 上的算法题,完成 medium 和 hard 难度的题; 坚持健身和胡吃海喝,超越 55 公斤; 练习英语,做到能像写中文一样写英文。实现下面两个开源项目中的一个:
实现一个简单的 NoSQL 数据库,考虑用 Go、Rust 或 C 来做; 实现一个支持插件的代理,要做到:性能匹敌 shadowsocks、不依赖 OpenSSL、跨平台。如果还有时间:
看完《 计算机程序的构造和解释 》; 完成程序员的三大浪漫中剩下的两个。