simplicity is prerequisite for reliability

最近几周一直在魔改一个重要的生产系统,给这个系统加上了一个嵌入式的关系数据库,在内存中缓存一些结构化的数据,使得应用在和数据库之间发生网络隔离的时候也能做一些关键操作。既然是缓存就会涉及到缓存失效、同步、一致性等一系列问题,好在我可以充分利用业务特性来实现最终一致性,但是还是在数据同步上遇到了一个有趣的问题:如何将数据库中有记录被删除这件事情通知到应用,使得缓存中的相关记录也被删除?

Read More...

网易又双叒叕打造了一款厉害的游戏,我自然也不能免俗下载体验了一番这款名为「阴阳师」的「国民手游」,并首次在其中体验了网游氪金的快感。

前些日子我知道这个游戏,但是由于我一直没有玩网游的习惯和精力,也就一直没有想过要体验一番。后来认识的一些朋友开始在社交网络上各种晒姑获鸟,各种吸欧气,看得我心中长草。因为不知道「吸欧气」是什么鬼,我还专门学习了一个提高了姿势水平,还学到了「玄不救非,氪不改命」这句箴言。学习完之后就开始玩阴阳师了,毕竟也想看看自己到底是欧洲人还是非洲人。

Read More...

前些日子欧气爆发,在高可用架构的微博抽奖活动中得到一张 GIAC 的门票,然后我申请了出差,千里迢迢赶赴京师。去年夏天有幸去北京围观 Velocity,姿势水平提高不少,本次 GIAC 请到了多位业界知名的技术大拿,也有不少和我接下来要做的工作相关的主题分享,这些更是提升了我对本次行程的期待。

确定赴京行程后便是约饭,从朋友处得知之另一个朋友拿到了 Google 的 offer,也是个值得庆祝一番的事情。

Read More...

上一篇博文「魔改 pip 的快乐与痛苦」中,我提到魔改开源代码,一个需要时刻考虑的事情,就是如何方便地合并上游变更。为了合并上游变更,我们要尽量克制自己乱写代码的冲动,不要作出那些使得合并代码变得困难重重的事情,比如像我曾经干出的修改包目录的蠢事。

为了修正我犯下的错,我决定在 mpip 代码仓库中保持基本 pip 一样的包目录,改换包目录这种事情放到编译过程里做。于是我不仅要在编译过程里把代码复制一份,还得把包目录从 pip 移动到 mpip,然后把代码里各种和 pip 相关的包目录、文件路径、常量定义、环境变量,总之一切有可能让 pip 和 mpip 之间不清不楚互相干扰的,都得改干净,这样才能让 mpip 和 pip 和平共处。

Read More...

半年前我做了一个 side project,把 pip 魔改一番,使得我能够将 Maven 的 Nexus 仓库作为 pip 的后端仓库。于是原本通过 pip install xxx==version 命令,我们可以从 https://pypi.python.org/simple/ 把指定版本的包下载下来然后安装,我可以用 mpip install xxx==version 从公司内网的 Nexus 仓库下载包然后安装。

之所以做这么个工具,是因为公司没有提供一个内部的 pypi 服务器。Python 不是公司的主流语言,公司自然不会投人力物力去维护这么一个服务,如果由我所在团队自行维护,又得付出额外的人力物力,并不是十分划算。于是我们之前的做法是将系统依赖的三方包,不管是 whl 还是 tgz,直接放在代码目录里,然后在生成部署包的时候再复制、安装。

Read More...

很长一段时间里,我一直以为,对于同一个时间格式,我们把一个时间对象序列化成字符串之后,还能反序列化成和原对象表达同一个时间的时间对象,至少在不考虑时区之类的问题时,这个命题应该成立。

$$ \forall F \in DateFormat, F(D)=S \rightarrow F^{-1}(S)=D $$

然而就在这两天,我遇到了一个打破上述认知的奇怪问题,Date 对象格式化之后再解析回来,就完全乱套了。

Read More...

我使用 Grav 作为博客系统已经好几个月了,基本上还算满意,除了一直没法愉快地在手机上写博客。

Grav 的 Admin 插件是一个功能完善的后台系统,在电脑上的用户体验尤其不错,可以说是我尝试过的各种博客系统中最让我满意的。最让我满意的是它的扩展性,允许用户通过增加 YAML 语法的 blueprint,为系统增加可视化配置编辑页面,靠着这个功能我已经把 Pastime、Links、Author 等页面或者 Sidebar 的内容做成可视化编辑的配置文件,从模板中剥离了。美中不足的是,Admin 插件集成的一个代码编辑器,在移动端输入中文时有致命缺陷。

Read More...

就像自从我用手机以来就一直被「找不到 SIM 卡」困扰一样,自从两年前我开始置办苹果三件套以来,就一直被一个说大不大说小不小的问题困扰着,这个问题就是我的 iOS 设备一旦使用 USB 数据线连接上 Macbook 之后,有九成以上概率会不停地发出难以形容的声响,伴随着 iTunes 不停地弹出提示框,看起来像是 iOS 设备和 Macbook 直接在不停地断开、连上,断开、连上,断开,连上。然而在预期的行为中,这个声响只在连上的时候发出一次。

长期以来我都尽量避免将 iOS 设备和 Macbook 使用 USB 线直连,各种数据传输都走 Wireless,直到今天我想要把一部电影拷贝进手机而又不愿意在传输上等个五分钟,于是我鬼使神差地再次使用 USB 线,毫无悬念地遭遇了上述的奇怪问题。

Read More...

After working as a software engineer for two years, I find writing weekly report a really tough experience.

I spent lots of time doing trivial daily works and finally I can't recall them when I need to write the fucking report.

I have to spend time writing what I did this week instead of creating useful code pieces, reading some books or having some fun.

Read More...

如果你是一个开发者,那么你拥有至少一台 Mac 的可能性大约是 1/4。如果你是拥有 Mac 的开发者,那么你使用 Homebrew 来安装和管理软件的可能性几乎 100%。

如果你恰好和我生活在同一个国度,头顶同一片天空,怨念同一堵墙,那么你使用 Homebrew 的 cask 子命令来管理 GUI 软件的体验,想必也是不那么愉快的。

于是我写了一个软件,自认为能够提升使用 Homebrew 批量安装软件时的体验。如果你开始感兴趣了,请继续往下看。如果对我的扯淡没兴趣想让我赶紧 show code,也可以直接访问 JamesPan/tmux-parallel

Read More...