Fork me on GitHub
Google

PyCon2015 笔记

原本是知乎上的一个答案,现在挪到博客里来。

1. Type Hints - Guido van Rossum

视频:https://www.youtube.com/watch?v=2wDvzy6Hgxg
主要就是讲 PEP 484 - Type Hints,通过 typing 这个模块,从 3.5 版本开始,Python 也可以做静态检查了!

2. Raymond Hettinger - Beyond PEP 8 -- Best practices for beautiful intelligible code

视频:https://www.youtube.com/watch?v=wf-BqAjZb8M
强烈推荐!Raymond Hettinger 的演讲适合所有层次的程序员看。这个演讲说的是,我们都知道 PEP8 来规划 Python 代码,但是这样是否就够了呢?我们可能忽视了一件更重要的事:Pythonic!这个演讲举了几个例子,怎么 make code more pythonic,比如使用 context manager,使用 @property,使用 Adapter 包装已有代码让 import 更简洁。不过其中最神的我觉得还是通过定义 __len____getitem__ 来构造一个 sequence,然后这个 sequence 自动就是 iterable 的,之前我一直以为必须通过定义 __iter____next__ 方法构造 iterator 才能达到让类支持 for in 的效果。
这个演讲没有 slide,不过代码不多。

3. David Beazley - Modules and Packages: Live and Let Die!

视频:https://www.youtube.com/watch?v=0oTh1CXRaQ0
Slide: http://www.dabeaz.com/modulepackage/ModulePackage.pdf
代码:dabeaz/modulepackage · GitHub
David Beazley 以前的视频我也看过几个,他的演讲最大特点就是 mind-blowing,会在短时间内让你意识到你根本就不会 Python! 如果有人能在不查资料的情况下理解他的演讲的50%内容,那这个人绝对是 Python 高手。这次的视频也是一如既往的烧脑,讲的是和 import 相关的各种知识,因为之前写 ezcf 的缘故这次终于能看懂稍微多一点。。。实在不想介绍了,各位可以自己去看。
之前有人问 Python 里有哪些黑魔法。那个问题我没有答,我只想说 David Beazley 的每一个演讲都充斥着黑魔法。。。

4. Dan Crosta - Good Test, Bad Test

视频:https://www.youtube.com/watch?v=RfR_QRoNZxo
Slide:https://speakerdeck.com/dcrosta/good-test-bad-test
文章:http://late.am/post/2015/04/20/good-test-bad-test.html
关于测试质量的演讲,重点讲述了三个测试的误区:
(1) 过分追求 100% 覆盖率。他认为有些代码反而应该尽量避免去测试,比如依赖于网络上某个服务的代码。
(2) 使用过多 assert。他的建议是一个 test function 里面最好只有一个 assert。
(3) Mock 一定会让测试更好。在测试中用到了数据库,与其直接 mock 一个返回值,不如用简单的代码模拟数据库的工作流程。
第二条我觉得像只用一个 assert 在很多情况下并不方便,但是把 dict 的 assert 拆分成多个键值 assert 还是可以借鉴的。关于数据库的 mock,其实有很多工具可以使用,比如见过一个专门用来为单元测试生成假数据的第三方库,还有 Django 的测试自带测试数据库。

Google

你将度过怎样的大学四年?

今天这篇文章我很久之前就想写了,但是不太敢写。时至今日毕业已将近两年,下定决心还是写出来,不然时间久了难免淡忘。虽然题目是个问句,但其实个人早就有结论了。更准确的题目应该是:哪些因素决定了一个人的大学四年会怎样度过。我的结论是这样的:

30%自身 + 30%专业 + 10%室友 + 10%偶然因素

这里的百分数其实不用深究,它只是大概反映了每一个因素在我看来有多大影响。没有列上去的,也未必就没有影响。分条来说一说。

自身

进了大学靠自己,这是大家都知道的道理,但这里说的“自身”其实并不单单指“个人努力的意愿”。这里的自身实际上说的是一个人的属性,就是你是什么样的人。个人感觉,进入高中,人的各种特点变得逐渐稳定,进入大学则基本固定。回想起来,周边熟悉的同学基本也是如此,大一什么样,大四什么样。那么人有哪些特质呢?太多了,但对大学生活来说,影响最大的还是两个东西:兴趣、智商。大学无疑是一生中最自由的阶段,摆脱了高中成天刷题的日子,又还没有进入必须要为生活挣钱乃至养家糊口的阶段,有大把时间可以做自己想做的事。除了上课和完成作业,你做什么完全看自己的兴趣。至于智商,它会影响你做的每一件事,并且不光是做这件事本身,还包括对事情的计划。想把课程学好,智商也是必不可少的。我就属于智商捉急的那一类,基本从来没有在课堂上完全弄懂老师讲的内容,考试又想不出题目的做法,非常悲惨。当然还有很多别的因素,比如是否愿意和人接触决定了你的交际面,是否够帅/漂亮/有钱影响你是否能找到男/女朋友,总之自身属性是大学四年真正的决定性因素。

专业

专业太重要了。如果你有转专业的想法,那就果断转。在不适合自己的专业里呆着,会让人痛不欲生。这方面我依然是反面教材。高考选专业,谁 TM 知道哪个专业干嘛啊,所以就听父母的了。我从来不责怪他们,正是因为我自己没有在高中找到方向,才把选择权丢给了他们。大学里的大部分时间我都过得不爽,因为学的东西不感兴趣,也学不懂。直到大二下学期,一个很偶然的机会,我才意识到自己更喜欢计算机,从此就踏上了成为码农这条路。我无数次地想,如果一开始我就去了计算机系,现在到底过着怎样的生活。

前面说到兴趣是很重要的自身属性,如果专业能符合兴趣,那是最好不过的事了。我认识的转专业的人,有从电子去生物的,有从计算机去学医的,有从精密仪器去自动化的,之后全都过得很开心,因为他们终于可以享受学习了。但中国的大学有一个矛盾,除了浙大,别的学校都不可能让你先呆一年再选专业,但是不了解一个专业,又怎么知道自己感不感兴趣呢?所以要么在高中就明确方向,要么去浙大,要么出国,否则在专业选择上后悔的可能性极大。

室友

这是一个让我不知道该从何说起的话题。什么才是好的室友,个人有个人的标准,所以这个问题并不好讨论。不过我相信所有上过大学的人都会认同室友对自己的影响有多大。如果你拥有了你心目中的“好室友”,请感谢上天。

偶然因素

我曾经是学校推理协会的会长。我们这个协会是怎么成立的呢?某一天,同学 A 和同学 B 在学校书店相遇了。当时,那个书店有专门的一个书架放推理小说,而他们发现对方也在看推理小说,就聊了起来。这两人的相遇是学校推理协会成立的契机,之后他们找到了一些志同道合的人,成立了协会,而我则是第一时间加入的会员。之后我逐渐做到了会长,把学习之外的大部分时间都奉献给了协会。So,如果他们当时擦肩而过了,会怎么样呢?也许,我们学校到今天都没有推理协会,也许有,但是我肯定不会是其中一员,更不会成为会长。如果我没有加入协会,那么我又会去做些什么呢?谁都不知道。蝴蝶效应是真实存在的,这也是生活有意思的地方。

Google

Ubuntu 运行 mongodb 的正确姿势

曾经在多个项目中使用 mongodb,但是最近从头开始安装并启动居然遇到了不少问题。在此记录一下:

环境:Ubuntu 12.04 64bit
版本:mongodb 3.0.2

首先,按照官方教程安装 mongodb。在这个教程中,注意到有一句话

The MongoDB instance stores its data files in /var/lib/mongodb and its log files in /var/log/mongodb by default, and runs using the mongodb user account. You can specify alternate log and data file directories in /etc/mongod.conf.

恩,看来意思是我们可以通过改 /etc/mongod.conf 这个配置文件来设置 data 存放路径。 打开这个文件看看,的确是有这些配置。

# Note: if you run mongodb as a non-root user (recommended) you may
# need to create and set permissions for this directory manually,
# e.g., if the parent directory isn't mutable by the mongodb user.
dbpath=/var/lib/mongodb

#where to log
logpath=/var/log/mongodb/mongod.log

这里假设要用以下命令(称为命令1)启动 mongodb ,指定 wiredTiger 作为存储引擎并标示副本集:

mongod --storageEngine wiredTiger --replSet fbt   # 称为命令1

首先我们非常天真地直接执行上面那行命令:

2015-04-23T14:55:16.152+0800 I STORAGE  [initandlisten] exception in initAndListen: 29 Data directory /data/db not found., terminating
2015-04-23T14:55:16.152+0800 I CONTROL  [initandlisten] dbexit:  rc: 100

Oops,似乎不行,说 /data/db 不存在。这里就是很坑爹的地方了:虽然 mongod.conf 指定了 dbpath,但是实际上这个配置文件没有起作用!而 mongodb 本身认为 /data/db 才是默认路径。毫无疑问,文档在这方面没有写清楚,因此也有别人被坑过。(后来发现,通过 sudo service mongod start 方式启动会默认使用该配置文件)要想让配置生效,必须手动指定配置文件路径,即:

mongod --storageEngine wiredTiger --replSet fbt -f /etc/mongod.conf

不过这里不打算用这种方式。既然没有 /data/db 这个路径,创建一个不就好了?

sudo mkdir -p /data/db

继续执行命令1,继续报错

2015-04-23T15:17:49.274+0800 E NETWORK  [initandlisten] Failed to unlink socket file /tmp/mongodb-27017.sock errno:1 Operation not permitted
2015-04-23T15:17:49.274+0800 I -        [initandlisten] Fatal Assertion 28578
2015-04-23T15:17:49.274+0800 I -        [initandlisten]

***aborting after fassert() failure

既然它删不掉 /tmp/mongodb-27017.sock,那我手动删。删完之后再次执行命令1:

2015-04-23T15:19:44.972+0800 I STORAGE  [initandlisten] exception in initAndListen: 98 Unable to create/open lock file: /data/db/mongod.lock errno:13 Permission denied Is a mongod instance already running?, terminating
2015-04-23T15:19:44.972+0800 I CONTROL  [initandlisten] dbexit:  rc: 100

这个是可以预期的权限问题,因为我们是拿 sudo 创建的 /data/db 文件夹,而执行的时候没有用 sudo。万能的 stackoverflow 告诉我们要这样做:

sudo chown -R `id -u` /data/db

执行之后当前用户就可以在 /data/db 创建文件了。再次执行命令1

fbt@ebs-39239:~/mongodb$ mongod --storageEngine wiredTiger --replSet fbt
2015-04-23T15:29:38.158+0800 I STORAGE  [initandlisten] wiredtiger_open config: create,cache_size=1G,session_max=20000,eviction=(threads_max=4),statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),checkpoint=(wait=60,log_size=2GB),statistics_log=(wait=0),
2015-04-23T15:29:38.264+0800 I CONTROL  [initandlisten] MongoDB starting : pid=30024 port=27017 dbpath=/data/db 64-bit host=ebs-39239
2015-04-23T15:29:38.265+0800 I CONTROL  [initandlisten]
2015-04-23T15:29:38.265+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2015-04-23T15:29:38.265+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2015-04-23T15:29:38.265+0800 I CONTROL  [initandlisten]
2015-04-23T15:29:38.265+0800 I CONTROL  [initandlisten] db version v3.0.2
2015-04-23T15:29:38.265+0800 I CONTROL  [initandlisten] git version: 6201872043ecbbc0a4cc169b5482dcf385fc464f
2015-04-23T15:29:38.265+0800 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.1 14 Mar 2012
2015-04-23T15:29:38.265+0800 I CONTROL  [initandlisten] build info: Linux ip-10-111-179-219 3.2.0-36-virtual #57-Ubuntu SMP Tue Jan 8 22:04:49 UTC 2013 x86_64 BOOST_LIB_VERSION=1_49
2015-04-23T15:29:38.265+0800 I CONTROL  [initandlisten] allocator: tcmalloc
2015-04-23T15:29:38.265+0800 I CONTROL  [initandlisten] options: { replication: { replSet: "fbt" }, storage: { engine: "wiredTiger" } }
2015-04-23T15:29:38.334+0800 I REPL     [initandlisten] Did not find local replica set configuration document at startup;  NoMatchingDocument Did not find replica set configuration document in local.system.replset
2015-04-23T15:29:38.351+0800 I NETWORK  [initandlisten] waiting for connections on port 27017

这次终于 OK 了。

如果直接执行,最好是单独开一个 screen。如果不想开 screen,则应当加上 --fork 参数把 mongod放到后台去。我采取开 screen 的方式。退出 screen,执行 ps aux | grep mongo 观察 mongod 是否成功启动:

fbt      29783  0.0  0.0  29476  1676 ?        Ss   14:47   0:00 SCREEN -S mongodb
fbt      30042  3.7  1.7 209004 35496 pts/1    Sl+  15:31   0:00 mongod --storageEngine wiredTiger --replSet fbt
fbt      30059  0.0  0.0  11700   944 pts/0    S+   15:31   0:00 grep --color=auto mongo

可以看到,mongod 已经按照之前给的参数在运行了。


top