2016 年读书清单,以及...

1.

年末了,整理了今年的读书清单,且附上个人评分和简评,有需要的可以做个参考。

个人评分用 ★ 表示,五颗 ★ 为满分。

书排列没有顺序。

  • 《编写高质量代码:Web前端开发修炼之道》;★★★;大抵比较无聊,可能是出版年代 2010 年吧,很多代码都不大具有参考价值;不过还是有些值得读的部分,比如 HTML 标签规范化,接触前端不长的新手可以花上几小时听老师傅讲经验。

  • 《大型网站技术架构:核心原理与案例分析》;★★★★;内容基本对得起书名,讲的不深,好在覆盖面广,正如它的简介:“为读者呈现一幅包括技术选型、架构设计、性能优化、Web 安全、系统发布、运维监控等在内的大型网站开发全景视图。”

  • 《通俗天文学:和大师一起与宇宙对话》;★★★★★;“每年一本天文书”,至于内容,比起当下一些科普书籍,多了些上上世纪人的执拗,授之以渔,而不是直接抛结论。

  • 《深入理解Bootstrap》;★★★★;对于 Bootstrap 的框架组织和源码分析还是不错的,如果想自己尝试写点框架,此书还是有些参考价值。

  • 《爱因斯坦自述》;★★★★★;如果非要说出不能全盘接收爱因斯坦的地方,那就是私生活有些。。。混乱吧;下面是本书的一些摘抄:

国家总是用谎言欺骗年轻人。 P3/163

可是不同于数学的是,在此领域中,挑选,鉴别知识的眼光我很快就练出来了,挑出那种有用的知识,放弃其他多余的东西,特别是那些只会引领我偏离主要目标,占用我大脑容量的东西。 P8/163

大学里有很多讲座,然而却只有很少崇高的教师。大学里也有很大的教室,却只有很少真正渴求知识的年轻人。庸庸众生总是被大自然一代又一代的生产出来,然而拥有创造性的高超才华的人却不多见。 P59/163

空洞的言辞无法打动人心,并且对于理想的奢谈妄想很容易将人们引向毁灭。人格的形成,要依靠劳动和行动,而绝非对于道德的高谈阔论。 P64/163

2.

今年不到 20 本书的阅读量简直惨不忍睹。。。

实际上还有好些书没列出来。譬如《深入理解计算机系统》这样的,没“读懂”之前是千万不能列出来的。

还有今年增加了好些杂志的阅读,《码农》,《程序员》,还有邮件列表里的《码农周刊》。还有 RSS 里的各种 developer blog,Hacker News,还有公众号的各种订阅号。。。

不扯了,以上的都是借口,真相是,今年阅读量的确大幅度减少。

去年说过的读一些哲学类书籍,今年也没办法兑现了。

不止如此,从 2012 年开始的每天写日记,每读完一本书都会把摘抄注释整理出来,挑一些不错的整理出读书笔记,今年都停止了。

不好的兆头啊,千万不要懈怠了。如同长跑一样,慢下来容易,再想提速就又得长时间训练。

无论如何今年过去了,把明年的目标定好。

明年把主要阅读对象集中在算法,科普上面,具体语言工具的书,业务驱动即可。

今年双十一屯了一堆村上的书,加上以前的存货,数量不少,明年不知能读多少,尽量多一些吧。

重复今年的话:明年读一点哲学类书籍。

3.

今年对于我应该是一个拐点。

标志性事件便是早上起床晚上睡觉,规律生活了大半年。

我记得 2012 年冬天,Cris 带着我参加完成了第一个 hackathon,几乎拔着各种第三方文档拼出了 Enstime 的 Alpha 版本,写完功能测试,出门,漫天大雾。我一边发抖一边唠叨:“我好像爱上了这样的方式,极度饥饿,疲倦,焦虑,可精神又完全不受控制的高度集中。”他说:“是的,这是种伟大的激情。”我说你唱的哪出,他说你懂个蛋。

后来我才知道爱因斯坦经常说这句话。不过这不重要。

接下来的几年便一直在以“hackathon”这样的方式维持工作,通宵写码,休息读书睡觉打游戏,然后继续。这个过程中,4 个项目,一些人离开,一些人加入,然后一起离开。有时心里会想,是不是得感恩有那么些人陪我一起折腾,但又转念一想,创业有风险入行需谨慎,何必矫情。

精疲力竭时我会思考,这样的工作方式能持续多久,我和我的团队年轻,回血快,26 岁,27岁,28岁,29 岁,乐在其中,可毕竟是做公司,不是坐台,并不需要“我的天空里没有太阳总是黑夜但并不暗因为有东西代替了太阳。”

时间总会解决一切问题。今年年初加入了同学的一家公司,问题烟消云散。

一次 Cris 发邮件问我,看你的 GitHub,感觉人都消失了。

我说是的,这一年我是放空了大脑在生活,偶尔写码。

“干 PM 了?”

“不是,杂事太多,故意放慢了节奏,规划一下接下来的路。”

“什么结果?”

4.

我最大的社交圈子在贵阳。

可能是我人。。。不错吧,来贵阳后几乎没有任何一个周末是轻松度过,各种邀各种约,我说的是约酒。

要知道之前几年在广东省,我几乎不参加任何饭局聚会,不打牌,不看电视,不怎么用 IM。我一直认为融入一个新社交圈子成本太高,需要兼容文化,转义俚语,将就个性。我这把年纪已经不想去将就任何东西。君子之交,浅尝则止,保持最低限度的联系即可。

在贵阳完全做不到。我能够听懂这个地方所有的梗,吃的每一样东西都合乎口味,接触的人都是熟识的,交谈顺畅,不需要解释半天来龙去脉。

这真是一件愉快的事,无缝兼容。

在这里度过了 30 岁生日,非常难忘,我都已经记不起上一次庆祝生日是多久之前的事了。

人间五十年,已过了大半。

这些年我一直在避免过上一类“很辛苦”的生活,为油盐柴米,买车买房而劳累奔波,当然了,如果不出意外的话这就是宿命,我只是让它尽量延迟,以获得些相对的“自由”,毕竟这是这几年我唯一觉得骄傲的事情了——完全按照自己的思路在执行人生。

物质上賺了不少钱,花了也差不多,衣食无忧,当然仍旧买不起房,不过也好在没什么债务,当然这些不重要。

可遗憾终归还是存在,这几年做过的事,没有一件做好,而时间不多了。

5.

接下来是要做的事。

kicksbeam,他的形态会是一个 bot,作用是与你对话,终端是有对话框的地方。

如果是这样那也没什么,一个自动回复机器人,对吧。不对,这会是一个 AI。关键词:游戏,谈笑风生。

今年我会花大量时间在这上面,希望能够做出些 different 的东西。

开一个微信订阅号,更新文章。

从 2012 年到 2015 年,tanzhijian.org 写了大致 100+ 篇文章,现在仍然留着的大概 10 余篇。并非这些文章好,舍不得删,而是这些文章暂时可能还会产生些用处。

我一厢情愿的认为,互联网上能够索引的东西,都应该是对别人有价值的。我不能把其他无价值的东西删掉,但能做到删除自己无价值的东西。

大概是时候为社会贡献些“湿货”了。还是从 tanzhijian.org 开始更新,内容写最熟悉的:编程,Steam 游戏,读书笔记,村上春树。尽量不要只顾自己写得爽,尽量保证内容是对别人有用的。待写利索了,开通订阅号,同步更新。

这是个开始。

6.

去年在深圳时,我从未想过今年会来贵阳。而此时在贵阳,仍未知道下一站。

这些年一直处于这样的状态,不知道何时会去何地,只感觉还会去很多地方。

伴随而来的是巨大的不安感,我无法确定其中原因。可正因为如此,我可以一直保持兴奋和专注。

好吧,就这样。

根据 WWDC16 海报配色风格调了个 Sublime Text 3 和 iTerm2 的配色

中秋节在家呆的无聊,老爸老妈都去打牌了,离做下午饭又还有段时间,于是把 Sublime Text 的配色改了。

早就想改成 WWDC 2016 宣传海报的配色玩玩,之前在 Github 找了一个https://github.com/Snazzyham/wwdc-2016,用上后总觉得不对,于是自己也用 TmTheme Editor 调了一个。

能够确定的配色,注释,字符串,关键字,背景色。

其他部分根据自己的审美分配了一下。

最终是这样子:

用 TmTheme Editor 生成的文件,Class name 并没有样式。Google 了一下文档,把

<dict>
    <key>name</key>
    <string>Class name</string>
    <key>scope</key>
    <string>entity.name.class</string>
    <key>settings</key>
    <dict>
        <key>foreground</key>
        <string>#7DCD6E</string>
        <key>fontStyle</key>
        <string> bold</string>
    </dict>
</dict>

entity.name.class 替换成 entity.name.type.class 即可。

也顺便把 iTerm2 的配色改了。

配色文件放在了 Github 上 https://github.com/tanzhijian/wwdc16_color_scheme ,有需要的可以拿去用。


更新:用了几天的感想。。。还是 Monokai 比较可爱啊。

使用爬虫抓取一些足球网站 24 小时以内发布的新闻(续)

没有 datetime,因为上一篇写得差不多了。开始吧,下面是 FourFourTwo

这次麻烦了,新闻列表里只有发布日期,没有具体时间。(ps: 贝大湿作为世界名帅混到纽卡也是 6 的飞起)

难道要掐着表到零时整点开始抓取?不,要随时都可以抓。

既然每天抓一次,那每次抓当日和昨日,然后把当日存起来。

第二天继续抓当日和昨日,把昨日与昨天的当日比对求差集,所得结果就是昨日抓取以后的新闻,加上今日便可得。

可是可以,只是不严谨,而且还得专门建个表来存昨日的新闻。

换个思路吧。

先抓取今日和昨日的新闻,存进列表。

每一篇新闻页面是有具体的发布时间,不过小于 24 小时是 ‘6 min ago’, ‘1 hour ago’, ‘3 hours ago’ 的形式,大于 24 小时是 ‘11 March 2016’ 的形式。可以通过抓取具体的新闻页面来确定新闻是否小于 24 小时发布。

如何确定哪些链接是 24 小时以内发布?遍历然后抓取?

二分吧,简单,而且对于每次一百条以下的列表效率也不错。

把已经获取的昨日今日列表等分,列表 1 列表 2。

抓取列表 1 的最后一条 url 和列表 2 第一条 url。

如果列表 1 的最后一条 url 小于 24 小时发布,同时列表 2 的第一条 url 大于 24 小时发布,则可以确定列表 1 的最后一条 url 是 24 小时以内的最后一条。

如果仅是列表 1 的最后一条 url 小于 24 小时,则把列表 2 等分,然后重复上面的步骤。

如果仅是列表 2 的第一条 url 大于 24 小时,则把列表 1 等分,然后重复上面的步骤。

开始写代码,先抓取今日和昨日的新闻,存进列表。

_list = []
now = datetime.now()

# target 为找出的新闻列表中所有的新闻 div
for element in target:
    # 找到发布日期
    date_str = element.find('div', attrs={'class': 'created'}).string
    date_time = datetime.strptime(date_str, "%d %B %Y")
    if (now - date_time).total_seconds() < 3600 * 24 * 2:
        # 把链接找到并添加进列表
        href = 'http://www.fourfourtwo.com' +\
            node.find('h3').find('a').get('href')
        _list.append(href)

完成首页,继续获取下一页,直到当前页面出现昨日以前的新闻,结束。

定义一个函数,用来抓取新闻的具体页面,找出发布时间,并确定是否小于 24 小时发布。确定是否小于 24 小时发布的思路与上一篇的 Squawka 一样,用交集确定。

def less_than_24_hours(url):

    # requests 获取页面,然后交给 BeautifulSoup 处理
    r = requests.get(url)
    soup = BeautifulSoup(r.content, 'lxml')

    # 找到发布时间
    element = soup.find(
        'div', 
        attrs={'id': 'node_news_article_full_group_social'}
    )
    date_time_str = element.find(
        'div', 
        attrs={'class': 'field-name-post-date'}
    ).find('div', attrs={'class': 'field-item'}).string

    # 24 小时以内的关键词,并寻找交集
    keywords = ('min', 'hour', 'hours')
    num = len(set(date_time_str.split()).intersection(keywords))
    # 如果有关键词的交集,说明此新闻是小于 24 小时
    if num > 0:
        return True
    else:
        return False

然后开始二分吧。

# _list 为已找出的今日与昨日的 url 列表
original_list = _list
# 预设没有找到目标
target = False

while not target:

    # 等分
    num = len(original_list) // 2
    list1 = original_list[:num]
    list2 = original_list[num:]

    # 找出 list1 的最后一条 url 和 list2 的第一条 url
    # 使用上面定义的函数,确定是否小于 24 小时发布
    list1_last_url_less_than_24_hours = less_than_24_hours(list1[-1])
    list2_first_url_less_than_24_hours = less_than_24_hours(list2[0])

    # 如果 list1 的最后一条 url 小于 24 小时,同时 list2 的第一条 url 大于 24 小时
    # 则可以确定 list1 的最后一条 url 是 24 小时以内的最后一条,同时结束循环
    if list1_last_url_less_than_24_hours and\
            not list2_first_url_less_than_24_hours:
        target_url = list1[-1]
        target = True
    # 如果 list1 的最后一条 url 小于 24 小时,则 original_list = list2 并继续循环
    elif list1_last_url_less_than_24_hours:
        original_list = list2
    # 如果 list2 的第一条 url 大于 24 小时,则 original_list = list1 并继续循环
    elif not list2_first_url_less_than_24_hours:
        original_list = list1

    # 最后找出最后一条小于 24 小时的 url 位置,就 index 了,简单点
    target_url_num = _list.index(target_url)
    # 切片确定所有小于 24 小时的 url 列表
    url_list = _list[:target_url_num+1]

完成。效率不算高,不过代码少,逻辑也算简单。