我探索技术的灰色地带。痛恨一切不确定性和模棱两可,喜欢刨根问底。

我不喜欢重复的劳动。我相信人类的创新性是计算机无法取代的,人们应该把时间用在创新的工作上,繁杂重复的事情交给计算机。需要正确性的工作上机器会比人做的更好。

我的梦想是让网络变得更加开放、自由和快速。

 

 

 

 

奇葩网站吐槽第四弹

这个周开始,爬虫的工作应该会告一段落了,《奇葩网站吐槽》系列全四弹也算截止了,enjoy!

前期回顾:

  1. 吐槽一些神奇的政府网站
  2. 奇葩网站吐槽第二弹
  3. 奇葩网站吐槽第三弹

本期内容:

20171207 这是12小时制还是24小时制?

20171213 遇到一个网站,带有很多参数,经过发送请求发现有些是固定的,是我要抓的页面定位的参数,有一些是改变的(很迷,甚至要通过不断向服务器发送一个时间戳保存session的生命),终于写好爬虫之后,过了几天发现这个爬虫没有工作!仔细观察发现,有些参数是按天变的……


这…… json请求有必要吗?而且这i18n……


20171225:第一次见可以带两个//的url……


20171228 老哥你这SEO不走心啊

网站介绍很朋克

keyword也很朋克


2018年1月5日更:大哥你这个“19月”可坑死我了……


2018年4月3日更新:今天发现一个网页返回的内容变了,不应该啊,打开一看,原来的 url 返回的内容变成了:

JS重定向到 index.html 首页?打开首页一看,首页原来是 HTTP 的,现在重定向到了 HTTPS (还是302状态码,槽点太多了)。

好嘛,用 JS 作 HTTPS 重定向的还是第一次见。


2018年4月10日更新:这网站日期最远的内容排在第一页,今天的内容排在最后一页。所谓“倒序排列”?

第一页只有年底的内容。

最后一页竟然是今天的内容。

 

使用brew升级Python之后修复virtualenv和pipsi

brew 升级和执行 brew cleanup 之后 Python virtualenv 的路径总是出问题,今天算是把问题找到了,但是却没找到好的解决办法…… 最终的解决方案是将所有的 virtualenv 删除重装。急着修复问题的可以不看中间的尝试直接拉到最下面。

以其中一个虚拟环境为例:

可以看到之前有一个 .Python 文件是软链接到 brew 安装的 Python3 的,以这次升级为例,3.6.4_4 这个版本已经不存在了,目前有的是 /usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/bin/python3.6 ,本打算将新的路径作为 .Python 的软连接:

但发现现在 pylint 是可以执行了,但是找不到依赖的包,于是又写了一个脚本,打算找到其所有的软连接,全都链接到最新的 3.6.5 版本中:

发现执行完之后还是找不到相关的包:

没办法,先重新建一下 virtualenv 吧,以前是这样处理的,应该也是最稳的方法了。

重新安装 pipsi 列表

我的 Python 命令行工具是用 pipsi 安装的,这个工具和 pip 的不同是: 它不会把模块装到系统 Python 而是每一个包新建一个 virtualenv ,然后在这个 virtualenv 中安装,然后链接 bin 的 Path。将所有 pipsi 安装的工具重装的命令如下:

pipsi list | grep -Eo ‘”(.*)”‘ | cut -c2- |rev | cut -c2- | rev | xargs -I {} — zsh -c ‘pipsi uninstall {} –yes ; pipsi install –python python3 {}|| pipsi install {}’

解释如下(按照颜色匹配):

  1. 打印出所有package,比如 “pylint”
  2. 砍掉第一个双引号,翻转,砍掉第一个双引号,再翻转(实际上就是去掉双引号)
  3. 将前面得到的干净包名传给下面的子命令,其中 {} 将被替换成包名
  4. 先卸载,再尝试用 python3 安装,如果失败改用 python2 安装

pipsi 的包就重建好了。virtualenv 里面的工作用的 env 自动重建了没什么意义,因为各个 env 的依赖都是根据项目的 requirements.txt 安装好的。还是用到什么再次重建什么吧。

 

搭建自己的静态 Wiki 站点(Vimwiki+Pages)

以前整理自己的东西都是用印象笔记,槽点太多了,比如只支持1级目录,列表页不友好等,整理起来很不方便。最近发现了 Vimwiki 这个好东西,于是想出另一种策略:

  1. 用 Vim 撰写个人 wiki (Vim 是我最喜欢的编辑器,第二喜欢的是 WordPress 后台编辑器)
  2. 用 git 追踪变更记录,每次写入的时候自动追加 commit 信息 (这样自己完全可以不用关心备份了)
  3. 用 Github pages 来托管 html (静态网站托管无比简单,写 wiki 就是为了方便查阅,如果再耗费很多精力去运维就得不偿失了)

1.新的 Github 账户

我的 Github 账号的 Pages 已经托管了一些小玩意,所以另申请了一个账号,专门用来记录 wiki。用新账号新建一个 Pages 并将主账号加入到合作者,这样 key、邮箱都不用再另外配置了。

自己邀请自己还有点奇怪

然后新账号就可以丢掉了,以后全部用自己的主账号操作。

接下来配置 Vim 和 Vimwiki。

2.安装和配置

毕竟是一个很老的项目,提供了各种 Vim 包管理工具的安装方式。可以通过 Readme 的信息选择你喜欢的方式安装。

然后 clone 下来我的 Pages 仓库,创建 wiki 文件夹存放源文件,创建 html 文件夹来保存生成的 html 文件。

.vimrc 中加入如下配置,设置 Vimwiki 的路径:

然后在 Vim 中按下 <leader>ww 就可以看到一个新创建好的 index.wiki Buffer 了。

随便写点什么保存,然后在 Vim 中执行 :Vimwiki2HTML 就可以将 wiki 文件编译成 html。然后将其 push 到 Github 上,就可以在线上看到这个页面了。

可以写一个 Makefile 自动化发布的过程。

这样只要运行 make publish 命令,就会自动构建最新的 Wiki 并发布到 Pages 上。

3.自定义域名

静态托管简直太爽,我相信 Pages 在我有生之年不会倒闭,但是为了以防万一,还是使用自己的域名,这样将来万一要切换,也会很方便,直接改下 DNS 解析位置就好了。首先添加一个 CNAME 文件让 Pages 跳转到我自己的域名: echo "wiki.kawabangga.com" > CNAME 然后 PUSH 上去就可以了。然后再到自己的域名服务商那里添加一个 CNAME 指向 laixintao-wikibot.github.io 。等解析生效就可以通过 wiki.kawabangga.com 访问了。

到这里就差不多搭建起来了,接下来就是熟悉一下 WIKI 的语法、学下 Vimwiki 的快捷键使用。另外默认的 template 太丑了,就是一个基本的 html,有时间的话还要在网上找找有没有漂亮点的 theme。

 

参考资料:

  1. 使用 Vimwiki + git 做知识管理
  2. http://kwiki.github.io/tips/vim/vimwiki-guide.html
 

Vim文件编码处理和重新打开乱码文件

Vim 中有两个与编码有关的变量,如果理解了基本就不会再为编码问题头疼了。

  • encoding :Vim 内部编码,例如 buffer、寄存器、文本等。这个值一般用户不要设置,另外打开 Vim 之后再设置这个值也是没有意义的。大家可以将这个值看作是 Vim 程序自己的变量,如果在工作中遇到文件的编码问题,和 encoding 这个变量是万万没有关系的。
  • fileencoding :顾名思义了,就是文件的编码。

此外还有一个值,叫 fileencodings 是个复数。一般我们将这个值在 vimrc 中设置,Vim 打开一个文件的时候回根据 fileencodings 里面设置的顺序来猜测文件的编码。比如这样设置:

那么有时候 Vim 猜错了,打开的文件显示乱码怎么办呢?(ps:通常 Vim 打开文件的时候乱码是因为你的 fileencodings 里面没有写某个编码,所以 Vim 没有猜对。例如从上面的设置中删掉 gb18030 ,那么打开这种编码的文件的时候你会发现 fileencoding 的值是 latin1 ,而文件的显示是乱码)

这时候你可能想到设置 fileencoding 的值,但是此时我们的文件已经打开了,你设置后会发现 Vim buffer 的状态变成了 Edited 。而文件依然显示乱码,没有变化。具体的原因后文会详细解释。

正确的做法是以特定编码重新打开文件,例如在 Vim 中使用重新打开命令 :e ++enc=gb2312 ,其中 ++enc 是一个选项,可以指定使用的编码。打开后你会发现 Vim 按照你指定的形式打开了文件,但是文件变成了 readonly 状态,如果要修改,设置 :set noreadonly 就好。

其实原理有点像 Python 里面有人提出的三明治模型

Python 在从流(例如网络, 文件 I/O 的时候),拿到的是 bytes ,通过 decode() 变成 str 而 Vim 在读入一个文件的时候,根据 fileencoding (用户设置的或者通过 fileencodings 猜测,将其转换成内部 encoding 的编码方式。

Python 在写入文件的时候,用 encode() 变成 bytes 再写。而 Vim 从 buffer 写到文件的时候,也是将数据从内部的 encoding 转换成 fileencoding 再写入。

这也就解释了为什么乱码的时候在 Vim 中修改 fileencoding 没什么卵用。

因为在打开文件之后设置 fileencoding 的值不会改变已经载入到 Vim buffer 中的数据,此时的数据已经是转换完成了的,这个设置只会改变写入的时候使用目前的 fileencoding 来写入,所以总结起来就是“打开文件使用了一个编码,写入文件的时候使用了另一个编码”。

而对乱码正确的需求应该是:我想要以特定的编码形式打开这个文件。

参考:

  1. help :edit
  2. help fileencoding
  3. help ++enc
  4. VIM 文件编码识别与乱码处理
 

无价的价值

今天看到一则杂闻,摘抄简略如下:

假离婚变真离婚,真相原来这般残酷!在北京工作的小琴(化名)近日在网上发帖讲述自己的遭遇:“身为北大博士后的丈夫,以孩子户口为由骗我离婚,之后不肯复婚了,还很快跟女同事结婚,并且新欢已怀孕。”如今,她只有一个想法,就是要讨个说法!

看到之后,觉得其实有很多东西,如果你重视它,它就有自己的价值;如果觉得无所谓,那么它就是真的没什么价值。”无价“来表达这个意思最合适了。听起来有点像宗教,算是有点像吧,但是今天不谈宗教。我最近有这种想法主要还是来源游戏。

最近主要在玩《血源诅咒》和在手机上玩一个老游戏,《This War of Mine》。发现很多游戏有这么一个特点:如果有一天某个地方卡了很久打不过去,或者某个游戏玩的时间长了,你可能把手柄一扔,觉得“算了吧,这游戏也就这样,同样的技巧打打杀杀,找到 Boss 弱点慢慢磨最后过关”。基本上这是我玩腻大多数游戏的原因。一旦有这种想法了,再去玩就觉得真没意思,里面的怪物对我来说毫无吸引力,即使出现新的怪物也没有精神。相反,没有这种想法的时候,就觉得自己真的在这里世界里,享受跟怪物周旋的过程。有趣和无趣,有意义和没有意义,就在一念之间。

上面这一段好像很难把我在自己的意思表达清楚。《This War of Mine》这个游戏更典型一些。这是个战争生存游戏,你可以去各种地方搜刮物资,也会遇到各种各样的人。你需要经常做出抉择:比如在一个寂静的小屋里有一对老人物资非常丰富,抢了他们的东西他们就会死去。你可以把它当成一个纯粹的游戏来玩,按照收益的高低做出各种决定;也可以将自己代入到这个游戏中,依照自己的道德标准做决定。如果你真的认为是自己在这个战争中,那么游戏里面的人不再是只会说两句话的 NPC ,而是战争下受难的苍生。当然了,如果不管自己的道德观念,只是玩这个游戏的话,也可以体验到游戏的乐趣。

回到开头提到的这条新闻。世界上就是有这么两种人:一种人会计算收益行事,假离婚能买到房子,那就假离婚;一种人注重仪式,认为婚姻是一辈子的大事,必须认真看待。这里面有对错吗?我觉得没有。现在的社会后一种人已经很少了。新闻里的这个女人,只能怪自己笨加上运气不好吧。

现在的生活节奏太快了,赚再多的钱,买第二套房子,第三套,意义是什么呢?很少有人会再纠结这个问题了吧。在《血源诅咒》里面击杀怪物,获得血之回响(这个游戏中击杀怪物获得的经验),升级自己的属性,这意义是什么呢?这个游戏中并不需要那么高的属性就可以通关,属性的加成作用还是很小的,其实主要是看技术。我们的人生也一样啊!我们并不需要那么多钱就可以生活的很好。但是很多人都会没日没夜地拼命赚钱,游戏里也有玩家一遍又一遍地刷着血之回响。可能到了最后,这些玩家会发现自己所有的属性加到了最高,可以毫无压力地击杀 Boss ,回头来看却发现自己花费了如此多的时间在经验上,这么多的时间,没有在享受游戏!这样的玩家是不是和游戏中的“加斯科因”神父一样,沉迷于狩猎而迷失了自我?

那么人生的意义是什么呢?游戏的意义是什么?

可能这个问题本来就没有答案吧。如果你认认真真地玩这个游戏,可能会在游戏中体会到更多的乐趣,会体会到喜怒哀乐,会觉得游戏中的小女孩、神父、教堂的女人都是实实在在的人物,可能会为他们高兴、伤心或叹息吧!在生活中,如果认为仪式是一件重要的事情,认为家庭、婚姻是无法用金钱衡量的东西,如果有自己深爱的事业或兴趣,那么也可能体会到更多生活的乐趣吧!

这对我们有什么启发意义呢?好像并没有什么,可能这些都是我的胡思乱想。不过我以前有过一次经历,通过作弊器将某个游戏的经验直接升到最高,缺发现我马上对这个游戏失去了兴趣,觉得什么都有了,什么也都没啥意思。如果我在血源诅咒中有大量的血之回响,可能我也会觉得这个游戏没意思吧。