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

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

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

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

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

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

这就是封面设计初稿:

我非常喜欢这个封面,编辑也表示很不错。遗憾的是,我没有搜索到这个图片的版权方,无法商用,而且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

翻译Flask-Bootstrap文档

一个月前,开发翻相册的时候,查文档时发现Flask-Bootstrap的文档还没有中文版本,就打算自己来翻译它。花了半天时间了解sphinx的使用方法和reStructuredText的基本语法,注册了Read The Docs账号,然后就开始翻译了。

格式

因为作者使用的是reStructuredText,所以我也去简单了解了一下,一开始是打算自己来创建新的文件,但后来发现有更方便的做法:直接拷贝一份作者的文档源文件,然后直接在文件里翻译,翻译好了再删掉英文。

翻译

几天后发现技术文档的翻译并不简单。虽然平时阅读不少,但很多词汇还是不知道该翻译成什么合适。比如说“serve”这个单词翻译过来是“服务”,但在这下面三个句子里明显不合适。

  1. How do I serve the static files in deployment?

  2. …setting up your server to serve this address.

  3. …to ensure newer Bootstrap versions are served.

接下来我又遇到了“include”,“include”翻译过来是“包含”,常常用来指在HTML的head标签里添加文件资源,比如css文件和网页头像(favicon),但有些时候翻译成“包含”总是感觉怪怪的,缺少一种动词的意味,所以有些地方我把它译成了“加载”。

类似这样的纠结在翻译过程中发生了很多次,还好我手里有一本Flask的书,很多地方可以借鉴。除此之外,还有一些不常见的短语,比如“per default”,这就要靠查资料来解决了,很多时候google翻译也帮不上什么忙。

后记

翻译这份文档大约用了一个月的空闲时间(终于完成了……)。因为是第一次翻译技术文档,有很多地方还需要完善,但也算是收获了翻译的经验,还了解了reStructuredText的语法和文档的部署方法。翻译的过程中还顺便发现了作者的几个小错误,在Github提交了pull request,作者愉快的接受了。

尽管翻译完了,但事情并没有结束,有时间我会再完善一下。如果你发现了错误,欢迎提交改动。

Github项目地址:https://github.com/lihuii/flask-bootstrap-docs-zh

文档地址:http://flask-bootstrap-zh.readthedocs.io/zh/latest/