分类目录归档:思考与随感

参加北京 PyCon China 2018

说来惭愧,我在北京场开始前一个月才知道国内也有PyCon。9月16号,在聊天群里有朋友建议我去参加PyCon。从考虑去不去,到决定演讲主题,报名闪电演讲,再到变成主题演讲,只花了两天的时间。此时距离大会开始还有26天。

与此同时,新书《Flask Web开发实战》刚刚开始正式发售,有很多事情要做:整理新书的勘误、处理各个渠道读者的问题、写宣传新书的文章、处理淘宝上的盗版书、在知乎和v2ex送书并寄出,这些杂务花费了很多时间,导致幻灯片和对应的演讲稿在大会前一天晚上才最终定稿,原计划的多次试讲练习最终也只完成了1次。

因为练习太少,再加上很久没有演讲了,导致说错不少话,哈哈。演讲的过程也状态连连:幻灯片忘记打开注释窗口,忘记带水上去喝……不过,从后续的反馈来看,整体上来说还不错。我的演讲主题是《自由的Flask》,内容比较简单,主要还是想推介一下Flask,让更多的人了解它。

至于活动本身,对比往年的评价,今年可以说是最好的一届。无论如何,都要感谢组织者们的无私投入。但这并不意味着没有缺点,从我个人的体验来说,主要有这些不足:

  • 文件协作方式很糟糕,会场拍摄的照片没有发送给讲师,而演讲视频既没有在网络上公开分享,也没有发送给讲师,只是被几个提供录像服务的赞助商握在手里。

  • 各个会场的投影设备和尺寸不一,分会场A、B是16:9的电子屏幕,而分会场C则是4:3的投影。我的幻灯片一开始使用默认的4:3,后来问了组织方的老师,改成了16:9……

  • 场地和设备不好,尤其是 C 会场,因为是投影而不是电子屏幕,为了录制效果就关掉了讲台的灯,导致会场很黑,没有拍一张正常的照片。而录像也只录了黑漆漆的幻灯片,看不到讲师。

  • 形式太单调,可以在中间穿插一些聊天、座谈、编程等类似的活动,增加一些面对面的交流和互动,而不仅仅是严肃的讲和听。

除此之外,最开心的事情是和华章出版社的杨福川老师以及其他读者见了面,面对面的交流要比网络上的对话有趣的多。在我那场演讲,有一些我的读者来听,很感谢他们的支持!

下次有机会的话,希望能够带来一场更好的分享,也祝PyCon China能够越办越好。

《Flask Web开发实战》的封面设计是如何诞生的?

一本书当然包含很多故事,这篇文章来介绍一下《Flask Web开发实战》封面设计的过程。

其实,这也算不上设计。因为这本书隶属于“Web开发系列”,这个系列的书都有一个通用的设计模板,唯一不同的就是确定封面中的图案。在选择图片前,我立下了几个规则:

  • 使用Flask风格图片(黑白线条)
  • 突出“实战”的含义

基于这两点,我最先发现的合适素材是一张飞机的图片,这个图片是Flask作者Armin Ronacher在2011年的演讲“Opening the Flask”中使用的幻灯片的第10页的插图:

这就是封面设计初稿:

blank

我非常喜欢这个封面,编辑也表示很不错。遗憾的是,我没有搜索到这个图片的版权方,无法商用,而且Armin Ronacher也表示记不起来是从哪里拿到这张图片。

接下来,我花费了大量时间想找一个替代品,但是却始终找不到满意的。

无奈之下,我只好扩大范围,不再局限于飞机图片,而且延伸到了船、武器、人物,陆续找到下面这些替代品:

blank

也许是因为“曾经沧海”,试来试去这些都不满意。这时我忽然有了一个念头:Miguel Grinberg那本《Flask Web开发》封面上是一只狗,我可以用一只狼呀。既能突出实战的特点,又有一点遥相呼应的味道,形成一个有趣的对比。

虽然心底有一些犹疑:会不会太像O’reilly的“动物书”?读者会不会觉得这是山寨?但是当我看到这张狼的图片时,顿时就喜欢上了,疑虑也消了大半:

blank

把图片放到封面上看起来也非常合适:

blank

这就是最终的封面初稿。当然,经过出版社设计人员的美化,最终的封面要好看得多:

blank

于是,《Flask Web开发实战》的封面就这么诞生了。

《Flask Web开发实战》签名版发货小记

盼了几个月,书终于拿到手了,非常激动。大部分包装需要用到的东西早早的就准备好了,花了一个上午处理完所有签名书。

签名版的书还剩下一些,如果需要可以访问http://helloflask.com/book/signed/购买。

遗失的后记

今天拿到书,才偶然发现编辑把我的后记删掉了……补在这里,请读完最后一页后来看。

《Flask Web开发实战》后记:

经过这一段漫长的Flask之旅,你应该收获了不少东西。虽然本书结束了,但你的学习还没有止步。希望这本书可以让你的某些想法走进现实,带给人们一些特别的记忆。也希望你可以慷慨的分享你的代码、经验和思想,因为你正和其他人一样,用你的方式改变着这个世界。但愿这本书帮到了你,祝你好运!

李辉 

2018年4月1日

文如其人

偶然看到读库网站上的投稿要求——《我们需要什么样的稿件》,觉得非常有意思。与其说是筛选稿件,倒不如说是在筛选作者,因此标题也可以看做《我们需要什么样的作者》。进一步说,这种筛选也会反向作用到读者身上。在大多数媒体和网站都在努力扩大受众群体时,这种主动筛选难能可贵。

……

如果您的文章中,经常出现“我感到……”“我想……”“我觉得……”这样的句式,则基本不符合我们的选稿标准。说得再严苛一些,一篇文章中如果三分之一以上的句子主语都是“我”,就不会出现在《读库》里。

如果您的文章中定语太多,或是结论评价类的形容词太多,则不符合我们的选稿标准。我们只希望你把你看到的记录下来,至于它在你心中泛起的涟漪,希望能通过你的记录和传递,荡漾到读者心中,而描述涟漪本身,是我们不需要的。

如果你的文章试图以小见大,或直接以大见大,以探讨人生终极问题和家国大计为己任,我们也要对您敬而远之。我们要的不是高度的概括性,而是极度的细部展示。具体地说,如果一篇三万字的稿子,其第一段提到的某件事、某个人,有可能被写出三万字,那么这篇稿子就显得大而无当了。

如果你试图充分展示自己的写作才华,我们也要对您敬而远之。《读库》中受人好评的文章,基本没有读者会说“这个作者太有才了”。我们想展示的,是才华的另一面:老老实实把自己想写的东西交代清楚,认认真真把自己感兴趣的东西琢磨个底儿掉,切切实实尊重读者的习惯和判断。

“用写一本书的力气来写一篇文章”,我们最需要这样的稿件。希望您将投稿的目光投向《读库》时,想的不是“我要写一篇好文章”,而是“我要把一件事情搞清楚,并记下来”。当动笔的时候,你心里有着一定的谦卑和热忱。庶几可矣。

糟糕的提问

维护开源项目最怕的大概就是遇见这种提问者:不知道自己要问什么(XY问题),不提供足够的信息(或是提供不全面的甚至是错误的信息),不思考你给出的观点和建议,只希望你给出最终的解决代码。更要命的是,他们还会不断提供不相干的信息和更多的无关问题,给你制造烟雾弹。

https://github.com/greyli/flask-ckeditor/issues/8

夺回对时间和注意力的控制权

写完后,我开始变得懈怠,越来越多的时间被浪费在豆瓣、Twitter、知乎、GitHub这些网站上。直到昨天,我才想到应该做些事情来改变这个状态,重新夺回对时间和注意力的控制权。

所有的网站和程序都在尝试尽可能的让用户上瘾,我们应该与他们对抗。过度的资讯对生活毫无益处,它们只会耗尽你的精力,让你的生活失控。

减少和过滤信息来源

首先,我尝试减少信息来源,做了下面这些事情:

  • 豆瓣关注人数降到10
  • Twitter关注降到10
  • GitHub关注降到6
  • 知乎关注降到2
  • GitHub watch的非自建项目数降到15
  • Stack Overflow watch的标签降到2

进一步,我使用广告屏蔽工具和网页样式自定义工具来屏蔽常用网站的页面元素来减少无关信息干扰

  • 屏蔽Twitter主页边栏和“探索”按钮
  • 屏蔽豆瓣主页边栏和“探索”按钮
  • 屏蔽知乎主页动态、边栏和“探索”按钮
  • 屏蔽知乎话题页面、回答页面的边栏以及专栏文章下的推荐

对关注数量,点赞数量的过度关注影响了我的正常工作和行为判断,所以我继续屏蔽了常用网站上的各类关注和点赞数字

  • Twitter关注人数
  • 豆瓣关注人数
  • 知乎个人主页边栏
  • 知乎专栏关注人数
  • 知乎专栏文章的点赞数

统一处理邮件和提醒

当然,这些还远远不够。为了获得更高的工作效率,避免被频繁打断工作状态。邮件、社交网站的私信、GitHub上的Issue需要集中时间统一处理,因此我将每日的社交信息处理时间段设置为每晚的9~10点。

另外,在非处理时间段要避免被消息提醒打扰:

  • 删除邮件和社交网站消息提醒浏览器插件,关闭所有的桌面通知
  • 关闭所有网站不必要的提醒,比如新增关注、点赞

限制网络使用

现在,我越来越相信:工作的时候应该断网。不过,没有外力强制很难做到断网。虽然我将每日的社交信息处理时间段设置为每晚的9~10点,如果没有外力限制,我仍然可能会在这个时间段以外的时间里访问这些网站。这时候必须要用到网络限制工具。

在写Flask书的过程中我就开始尝试使用多种方式来限制网络的使用,限制每天可以访问某些网站的时长,或是直接禁止某个时间段的所有网络访问。Chrome应用商店有很多扩展可以设置网络限制,我现在使用StayFocused(Firefox上可以使用LeechBlock)。

如果有网络使用需求,比如查东西,那么也应该记下需求,在统一的时间段进行处理。

进阶计划

浏览器扩展虽然有效,但大多数扩展没法避免被删除。一般情况下,你可以通过将扩展管理页面和扩展设置页面加入屏蔽规则来避免。不过在Chrome中,仍然可以通过右键点击扩展图标来移除扩展,而隐藏图标后仅仅是把它们放到菜单里。

未来我会考虑尝试使用操作系统层面上的限制软件,它们除了限制网站访问还可以定制限制使用某些程序(比如Steam),并且包含一定的措施避免进程被强制关闭。

另外,我还会考虑按照这篇《How I got to 200 productive hours a month》(这篇文章包含很多关于提高生产力的建议,建议阅读)的建议将工作和生活所使用的环境和电子设备分成两套,这样就不会互相干扰了:

  • 工作:房间A,电脑A,仅安装工作所需的程序,浏览器设置永久禁止访问非工作网站。
  • 娱乐:房间B,电脑B,仅用来玩游戏等娱乐活动。

当然,这要等我有两个房间和足够的钱才能实现。

我加入了Pallets Projects开发团队

今天早晨起来检查收件箱,收到了David Lord(Flask核心维护者)的邮件,他同意了我的申请——前段时间邀请他为我的新书《Flask Web开发实战》写推荐语,同时申请加入Pallets Projects开发团队(Pallets Team)。

Pallets Projects是什么?

简单来说,Pallets Projects就是“Flask项目集合”,为了更好的管理Flask相关项目而由Pocoo分化而来。它同时也是一个GitHub Organization,包括了所有Flask相关的项目,比如Flask、Werkzeug、Jinja、Click等等。

这意味着什么?

这意味着我对于Flask项目拥有更多的操作权限,可以更好的向Flask贡献代码,并且可以帮助处理Issue和Pull Request。

 

书写完了

历时一年零三个月,Flask书的写作终于结束,目前已基本进入正式排版阶段,预计八月底可以上市。

这本书的写作时间线大致如下:

  • 2017/3/1 开始写作
  • 2017/12/7 初稿完成
  • 2018/1/18 二稿完成
  • 2018/3/26 三稿完成
  • 2018/4/29 四稿完成
  • 2018/5/16 五稿完成
  • 2018/5/22 定稿(六稿)
  • 2018/6/5 确定最终修改
  • 进入出版流程,开始排版

一本书的写作给我自己带来了很多变化,虽然有时感觉非常疲惫,但算得上是一个奇妙的体验。有时间会写一篇文章记录一下这一年的写作经历。

优质信息源推荐

编程学习中,有两种信息,一种是静态的:官方文档,系统教程,参考书,技术书;另一种是动态的:各种优秀的(非纯技术)书,经验总结,发明创造甚至是奇技淫巧。静态的信息建立你的根基,让你强大;动态的信息塑造你的思想和价值观,让你少走弯路,变得灵活。

今天我来推荐三个动态的信息源:一个网站,两个周刊。

 

网站

Hacker News

我没有多少时间去获取资讯。如果你不是躺在养老院里,也不应该投入过多的时间到资讯上,况且大多数资讯根本不值得阅读。但适当的资讯是必要的,这让你增进对世界的了解。Hacker News可以作为每日资讯的获取来源,不仅仅是编程方面的内容,还会有新技术,网站,新闻,项目,书等等。

顺便推荐Hacker News创始人Paul Graham的书《黑客与画家》,书里文章选自他的网站http://paulgraham.com/

 

周刊

1、Fullweb Weekly:The newsletter for fullstack developers

2、Pycoder’s Weekly: A Weekly Python E-Mail Newsletter

这里面有前后端和Python方面的新动态,优秀的库,巧妙的实践,基础知识,各种文章和Tips。尽管内容很多很丰富,但是你应该在打好基础后再来读这些东西。

如果你有大把时间(我想你并没有),可以看看DesignerNewsReddit的Programming板块,以及这个关于Python资讯的列表

 

换域名小记

起名字

起名字是个简单但让人头疼的事情。

你想要一个独特的名字,但又不想透露太多的个人信息。既不能太土,又不能太长,不能太难读,也不能太难记,而且最要命的是,如果你想在所有社交网站都有一个相同的id,这太难了——好名字全被注册完了。

连续换了两个域名后,我想这次终于遇到对我来说完美的域名了——greyli.com

 

换域名

更改完DNS设置后,在数据库里用新域名替换掉旧域名。

和上次同时换主机和域名不同,这次只需要在数据库里改动一些内容就完成了:

wp_options SET option_value = replace(option_value, 'www.mydomain.com','www.newdomain.com');
UPDATE wp_posts SET post_content = replace(post_content, 'www.mydomain.com','www.newdomain.com');
UPDATE wp_comments SET comment_content = replace(comment_content, 'www.mydomain.com', 'www.newdomain.com');
UPDATE wp_comments SET comment_author_url = replace(comment_author_url, 'www.mydomain.com', 'www.newdomain.com');
 
 
文章里有些地址是完整的,所以可能还需要加上下面这条语句:
UPDATE wp_posts SET post_content = replace(post_content, 'http://www.olddomain.com','http://www.newdomain.com');
 
 

我的知乎专栏

注册知乎以来,一直都在潜水,关注一些有趣和有价值的东西,收获了不少帮助。最近写关于Flask的文章,觉得写在博客里太零散,于是就开了个专栏。

开通这个专栏,一来是关于Flask的文章放在专栏里更加系统化,不会和其他的文章混在一起。二来也算是对这个社区的一点小小的贡献,作为对那些无偿分享知识的人的感谢和响应。

这个专栏主要用来写我学习和使用Flask过程中的经验和总结,还有我用Flask做的一些项目的具体实现。主要的写作主题:

  • Flask介绍
  • Flask笔记 —— 包含Flask开发涉及的常用主题,比如模板、表单等。
  • Flask问题集 —— Flask开发中常见的问题,比如在一个页面多个表单的问题。
  • Flask常用插件介绍 —— 介绍常用Flask插件和基本用法。
  • 实践:用Flask写个人博客
  • 实践:用Flask从零实现豆瓣相册
  • 其他相关的前端框架和库的介绍

欢迎关注:Hello, Flask! ——知乎专栏

同时创建了一个Github Organization,专栏上的代码会放在这里:https://github.com/helloflask