《程序员的自我修养》读书笔记

贴一篇旧文:2012 年 6 月写的读书笔记(原文链接)。这个笔记是写给自己看的,里面掺进了太多自己的设想,有可能会对读者造成误导。不过文章太长了,没有时间修订。欢迎吐槽。

近来(2012 年上半年)在郭家华的推荐下,读了LUG书库的《程序员的自我修养——链接、装载与库》一书,有种相见恨晚的感觉。然而快到期末考试了,没有时间把全书读完,因此只写了一部分。

有两种方式构建软件:一种是把它设计得如此简单以至于明显没有缺陷,另一种是把它设计得如此复杂以至于没有明显的缺陷;前一种的难度大得多。

——Hoare 于图灵奖演讲《皇帝的旧衣》

继续阅读“《程序员的自我修养》读书笔记”

虚拟化技术大观

按:2014 年 11 月 21 日,笔者在阿里巴巴技术俱乐部的虚拟化技术交流会暨 “科大云 3.0” 发布会上分享了一些对虚拟化技术的浅见,整理、补充后与诸位探讨。(长文慎入)

虚拟化技术大家都不陌生,我们大都使用过诸如 VMWare、VirtualBox 的虚拟机软件。一些人认为,虚拟化技术是近几年跟着云计算的潮流才火起来的,十年前只是桌面用户测试其他操作系统的玩具。非也。只要计算机上同时运行着多个任务,就会有任务隔离的需求,虚拟化就是让每个任务看起来独占整个计算机、隔离任务之间影响的技术。早在计算机还是庞然大物的 20 世纪 60 年代,虚拟化技术就开始发展了。

IBM 7044

继续阅读“虚拟化技术大观”

编译:一个 C 程序的艺术之旅

正在学习 CS50(一门 MOOC)的 @张静宁 写了一篇《【读图学 C 语言】编译时发生了什么》。她的文章更多讲的是 “what”,本文将尝试解释一些 “why”。

C 程序为什么要编译才能执行?一个 C 程序在变成可执行文件的过程中,为什么要经过预处理、编译、汇编、链接这四道工序?让我们从这段简单的 C 程序开始。

为什么要编译

这并不是一个简单的问题。我们知道 Python 代码不需要 “编译”,输入一行代码就可以运行出结果了,对用户很友好有木有!这种交互式的运行环境被称为 REPL(Read-Evaluate-Print-Loop),也就是读取用户输入的语句,执行语句,输出语句的值,再返回到等待输入状态。 继续阅读“编译:一个 C 程序的艺术之旅”

给开源编译器插入后门

说起 Ken Thompson,我们首先想到的是他发明的 UNIX 操作系统。他因此获得 1984 年的图灵奖。在图灵奖演讲上,Ken Thompson 提出了一个深刻的问题:看到了软件的源码,就意味着没有后门吗?编译器是否可能存在能自我复制的后门?

KenThompson

这篇发表在《ACM 通讯》上的论文只有短短三页,省略了很多细节。原理上有点像输出自身代码的 C 程序,但又比它难很多。我追随先哲的脚步,给一个开源 C 编译器——tcc 插入了能自我复制的后门,这个插入了后门的编译器在编译 Linux 登录程序 sulogin 的源码时,会自动插入一个后门。

继续阅读“给开源编译器插入后门”

逃离活动室

逃离微软

2014 年 9 月 17 日上午,微软亚洲研究院 12 楼会议室。老板刚结束了一个月的国际会议回到北京,我在组会上忐忑地汇报一个月来并不令人满意的进展。这之前的几天我的心一直在狂跳,生怕老板看穿我不认真干活的本质。出人意料的是,老板在汇报结束后并没有骂我,而是说我的模型比起一个月前有了很大进步。不过,我们都清楚地认识到我们的工作不可能赶上 9 月 26 日截止的 NSDI 会议了。

9月17日凌晨的微软大厦
9 月 17 日凌晨的微软大厦
8月25日凌晨的微软大厦
8 月 25 日凌晨的微软大厦

继续阅读“逃离活动室”

CSDN 2014 开源技术大会实录

昨天受科大 LUG 之邀参加了 CSDN 主办的 2014 开源技术大会(OSTC),结合会上记的笔记和不靠谱的记忆,与诸位分享,如有错漏之处请回复指出。本文部分图片来自 CSDN 官方的图文直播,演讲者的 slides 我显然没有,据说 CSDN 官方随后几天会发布。

IMG_20140330_081339

早上见到了又高又帅的 Thomas Yao 和 Deepin 的王勇(没拍下来)。

继续阅读“CSDN 2014 开源技术大会实录”

7 万条短信的乌龙指

乌龙指离我们很远吗?非也。前一段时间 LUG 服务器出故障,就错误地发出了 7 万条短信,把学校短信平台的余额用完了,直到网络中心老师给我打电话才发现。

祸起服务监控脚本。它从数据库里获取站点信息,定时访问被监控的站点,如果发现问题,就会给网站所有者发短信报警。服务监控脚本连接数据库失败时,也会给我发报警短信。早先是不会尝试重连数据库的,因此只会发一次报警,不过监控服务不能在数据库恢复后自动恢复运行。这个 bug 在 blog 故障的时候被发现,于是改成自动重连了,但发报警短信的逻辑没有修改,因此如果一直连不上数据库,就会不停地发。

为防止短信轰炸,发出的短信本来都要经过我这里的“风控”,限制每24小时发往每个手机号的短信数。风控是查询数据库的短信日志表获取最近 24 小时向这个号码发送短信数的,当数据库挂掉的时候,查到的值是 NULL,在 PHP 中隐式类型转换成了0,因此认为没有超过限制,就发出去了。学校短信网关也没有任何“风控”,导致大量的短信涌入运营商网络。

继续阅读“7 万条短信的乌龙指”

让 OpenVPN 默认不走 VPN

LUG VPN 的一些用户希望仅对某些特定 IP 使用 VPN,而 OpenVPN 默认是全部走 VPN。也许是我的搜索能力太差,竟然没有 Google 到靠谱的答案。没有耐心的读者可直接看我的解决方案:

$ echo "script-security 2" >>/etc/openvpn/client.conf
$ echo "up /usr/local/bin/remove-ovpn-defroute" >>/etc/openvpn/client.conf

$ cat /usr/local/bin/remove-ovpn-defroute
#!/bin/sh
(
    sleep 2 # wait for routing table to be flushed
    ip route del 0.0.0.0/1 dev tun0
    ip route del 128.0.0.0/1 dev tun0
) &
exit 0

继续阅读“让 OpenVPN 默认不走 VPN”

一个斜杠引发的血案

注:不了解 mirrors 的朋友,请先看《科大开源软件镜像是怎样炼成的》。

祸起 iSCSI

故事要从2013年6月26日讲起。mirrors 有一个网线直连的磁盘阵列,使用 iscsi 协议,上面有一个XFS文件系统。6月26日下午14时许,stephen 在邮件列表里报告 mirrors 挂了。根据 syslog,6月26日13:58,iscsi 连接超时,导致 sdg 访问失败,大量I/O操作被卡住,导致 nginx 被卡住,mirrors HTTP 无法连接。几分钟后,I/O超时,nginx 恢复正常,但磁盘阵列上的源无法使用了。

继续阅读“一个斜杠引发的血案”

我在 LUG 这一年

今天光宇说要去年的工作总结,于是就有了这篇文章。LUG 的主要工作分为活动和网络服务两方面。

活动

我们回顾一下这一年来发生的事情(http://lug.ustc.edu.cn/wiki/lug/events

招新

跟其他社团一起,在开学的第二周,在东活和西活摆摊。偷来的经验是:可以做一些展板和易拉宝,增加出镜率。

招新虽然站着挺辛苦,但跟来自各种院系的同学们聊天挺好玩的,发传单也可以品尝一下经常被拒的滋味。八卦一下,LUG 现任会长的妹子就是那时找到的~

继续阅读“我在 LUG 这一年”