laixintao

你好,欢迎光临我的博客!

我是一名热爱计算机的学生,喜欢Python,Java,Linux,js/css/html. 支持自由软件,热爱开源,这是我的github。喜欢电子游戏,我的psn帐号是CenterRight喜欢暴雪的游戏:war3,sc2,炉石。我还是桌面游戏爱好者,喜欢狼人和龙与地下城。喜欢听音乐,我在网易云音乐的帐号是低俗听众喜欢乔治RR马丁、《饥饿游戏》、《布达佩斯大饭店》、爱德华诺顿、姜文和昆汀、The Last of Us。我还对历史,文学,经济学和摄影感兴趣。

这个博客用来分享我的心得,学到的知识,对一些书、电影和游戏的评论。这个博客不会讨论盗版以及破解软件。除特殊说明外均采用CC0创作协议(任何人可以自由地复制,修改,分发和演出——甚至用于商业目的,而不必署名)欢迎转载但是建议保留原文链接以让读者看到最新的版本。本站所有内容仅代表本人观点,与我的雇主无关,并且会永远保持独立性不受任何组织和公司的影响。

如果我们有共同兴趣,或者你遇到了麻烦,可以通过右边的电子邮箱联系我。也欢迎留言和订阅!

《重来2》:远程工作不再遥远?

如今一线城市房价高涨,我常常想,如果能在三线小城市生活,却拿着一线城市的工资,岂不美哉?今天读完了《重来2》这本书(其实这本书的书名翻译非常失败,原名REMOTE,是讲远程工作的。但是此公司之前出版了REWORK,这本书就被当做续作翻译成“重来2”),对这远程工作又有了很大的信心。认为在未来几年内,在家办公完全是可能的。

晚上和名一斋一起吃饭的时候又讨论的这个问题。名一斋想要一边背包走天下,一边写程序。而我想离亲人近一些,不用又太大压力认真做自己喜欢的事情(编程)就能过上美满的生活。一个很现实的问题就是,可以拿一线城市的工资回三线小城市生活,买房,孩子上学,照顾家人都不成问题。简直是逃离北上广的最佳实践。

远程工作的好处有:

  1. 拿一线工资生活在三线城市,生活水平大大提升(买房子压力不大,没户口问题,育儿成本也低。顺提一下,我认为学区房,重点中学之类的对教育水平不是关键作用,家庭环境,父母教育才是关键作用。将教育的权力和任务托付给机构已经是失败了)
  2. 可以随时旅行,甚至周游世界
  3. 不用花很多时间开会,一切工作和交流都会留下痕迹(邮件,IRC等),不会有冗杂的事项
  4. 没有人打扰
  5. 没有上下班通勤的时间(我的经历告诉我,时间、金钱、以及体力成本是巨大的,如果每天花3小时上下班,基本上是不可能有业余时间的,更不可能学习!)
  6. 可以从全世界寻找人才,而不是局限于某个城市/区域

远程工作的缺点:

  1. 不能面对面的交流
  2. 员工可能偷懒
  3. 难以建立公司文化
  4. 没有当老板的感觉
  5. ……

37singles就是远程工作的最佳实践,这本书里面很真诚地讲了他们公司远程工作的经验,可操作性高,非常有借鉴意义。

其实,我觉得远程工作最重要的,也是最难处理的就是信任。

书中提到很多问题,比如面对面交流,企业文化,协作工具等等,都是可以通过技术和工具解决的,尤其对于程序员来说,有irc,版本控制系统,基本可以无痛切换到远程。但是难以解决的地方就是,你是不是在工作,你的老板怎么能放心你在工作,以及如何让老板满意。

这对管理的要求就高了。要有完善的管理体系。怎么休假,开多少会,怎么评价员工的工作。好处是,对每个人来说,拍马屁这种事情显得越发不重要了,所有的工作成果都跃然纸上。管理阶层不会非要去做一些“没事找事让自己看起来很忙”的事情了,比如说没完没了的开会。

从员工的方面说,找到自己感兴趣的工作尤为重要。只要你有兴趣,喜欢你的工作,就会有动力把工作做的又快又好。就像书中说的那样,老板要考虑的不是如何保证员工完成一定时长的工作,而是想办法让员工不要超额工作(远程工作失去了生活和生活的界限)。

我感觉兴趣是远程工作能否成功至关重要的因素。如果没有了兴趣,又成了老板怎么想尽办法压榨员工,员工怎么想办法偷懒的糟糕的模式。但是有了兴趣,老板不用多操心,员工工作的也开心。

所以,在实践远程工作的时候,老板挑员工一定要看此人对这份工作的兴趣和热情;员工挑公司也要挑自己喜欢的。如果大家都在做自己喜欢的事情,那么做什么都会开开心心的。有真正的热爱,团队文化,员工之间的交流,绩效什么的都不会是问题。以前看到一个程序员说,自己只有40%的时间是在工作的,因为喜欢自己的工作,所以不觉得这是工作,只是做自己喜欢的事情而已。如果自己不在上班,也会做这些事情。只有那40%,是需要用“工作”来约束自己去做的。

其实,去年我去意大利旅行,就拿着一份外包(中国)工作的工资和CSDN的稿费收入,白天旅行,晚上工作。CSDN的编辑们我至今都没和他们碰过面。至于那份远程的外包工作,我们也只是通过视频通话和IM来交流。

现在看来,将他们作为全职工作也是完全可行的。至于现在,自己水平还不够,有很多东西是自己SOHO学不到的。但是等自学的能力和计算机基础扎实了,希望那天可以实现远程工作,回青岛去住在一个海边充满阳光的地方,做自己喜欢的事情。

 

在担路网的实习经历

去年11月到今年2月底,在担路网差不多实习了四个月。

这段实习给我收获很大,应该是所有实习里面学到东西最多的一个了。之前的实习要么是研究比价多,写代码少;要么是学校分配的外包公司,做一些杂七杂八的东西。在这家公司负责完成一个模块,从了解系统开始,搞数据表,后端代码,重构,然后前端。最后离职的时候还差点火候,大体上算完成了吧。

公司的张哥算是老Python程序员了,经验非常丰富。刚进公司的时候,配置环境有问题,哪一些都是需要我花大半天时间才搞得定的。张哥就能直接根据命令行输出的信息搞定。小到Debug的能力,大到对行业的认识,我都深深体会到了和资深从业者的差距。

现在想想,很多东西其实在网上都有,但是有一些可能是不来这个公司就不曾发现(或者不会现在就能发现)的:

  • 公司的bazaar4项目已经开发了四五年了,现在已经是非常大的项目,Git仓库(如果我没记错的话)就有500M。在这样一个大型项目里面,我接触到了很多之前没见过的Python和Django的高级特性。
  • 系统设计的思想。尽量把一个功能写成组件(或者模块)以便复用。这是老生常谈的问题,但如果开发经验不足的话,很容易就写的耦合性很高。
  • Debug的能力。分析错误输出,这其实不是垃圾信息。
  • 多看官方文档,代码文档,源代码等一手信息。
  • 关注业界顶尖的信息。不要觉得很多人用就很low。
  • 多买书。
  • 尝试新的工具,不要怕麻烦。
  • 遇到问题就去解决,不要想着这个问题的影响不大,先凑活着/放着。

张哥是一个很好的领导。由此偶尔在网上看到前同事写的离职感悟,也对张哥比较赞同。带新人,沟通,技术等方面都很赞。可惜我因为家里的变故,不得不离开这个公司了。有点可惜。

 

SLIC算法分割超像素原理及Python实现

超像素(SuperPixel),就是把原本多个像素点,组合成一个大的像素。比如,原本的图片有二十多万个像素,用超像素处理之后,就只有几千个像素了。后面做直方图等处理就会方便许多。经常作为图像处理的预处理步骤。

在超像素算法方面,SLIC Superpixels Compared to State-of-the-art Superpixel Methods这篇论文非常经典。论文中从算法效率,内存使用以及直观性比较了现有的几种超像素处理方法,并提出了一种更加实用,速度更快的算法——SLIC(simple linear iterative clustering),名字叫做简单的线性迭代聚类。其实是从k-means算法演化的,算法复杂度是O(n),只与图像的像素点数有关。

这个算法突破性的地方有二:

  1. 限制聚类时搜索的区域(2Sx2S),这样将k-means算法的复杂度降为常数。整个算法的复杂度为线性。
  2. 计算距离时考虑LAB颜色和XY距离,5维。这样就把颜色和距离都考虑进去了。通过M可以调整颜色和距离的比重,灵活性强,超像素更加规则。

SLIC算法原理

整个算法的输入只有一个,即超像素的个数K。

图片原有N个像素,要分割成K个像素,那么每个像素的大小是N/K。超像素之间的距离(即规则情况下超像素的边长)就是S=√N/K。

我们的目标是使代价函数(cost function)最小。具体到本算法中,就是每个像素到所属的中心点的距离之和最小。

首先,将K个超像素种子(也叫做聚类,即超像素的中心),均匀撒到图像的像素点上。

一次迭代的第一步,对每个超像素的中心,2S范围内的所有像素点,判断他们是否属于这个超像素。这样之后,就缩短了像素点到超像素中心的距离。

一次迭代的第二步,对每个超像素,将它的超像素中心移动到这个超像素的中点上。这样也缩短了像素点到超像素中心的距离。

一般来说,迭代10是聚类效果和计算成本折中的次数。

SLIC算法步骤

  1. 撒种子。将K个超像素中心分布到图像的像素点上。
  2. 微调种子的位置。以K为中心的3×3范围内,移动超像素中心到这9个点中梯度最小的点上。这样是为了避免超像素点落到噪点或者边界上。
  3. 初始化数据。取一个数组label保存每一个像素点属于哪个超像素。dis数组保存像素点到它属于的那个超像素中心的距离。
  4. 对每一个超像素中心x,它2S范围内的点:如果点到超像素中心x的距离(5维)小于这个点到它原来属于的超像素中心的距离,那么说明这个点属于超像素x。更新dis,更新label。
  5. 对每一个超像素中心,重新计算它的位置。
  6. 重复4 5 两步。

伪代码(来自论文)

Python实现SLIC

最新版本的代码请看这里:https://github.com/laixintao/slic-python-implementation

效果如下:

Lenna图像在M=30,K=500时第一次迭代产生的超像素图。

Lenna图像在M=30,K=500时第10次迭代产生的超像素图。

 

博客反垃圾评论之路

写博客的人(独立网站)都知道,博客经常会收到一些很奇怪的评论,这些评论的特点是:没有实际内容,一般为盲目称赞博文、与博文无关内容、类似水帖。这就是垃圾评论。这些评论的作用是把流量引向他们的网站,或者SEO。说白了,就是通过评论在你的网站上打广告。

在第三方的博客平台写的话也会遇到一些在评论里打广告的。但是这个反垃圾评论的任务就教给博客平台了。

独立网站也可以选择第三方的评论系统,但是这等于放弃了SEO。我非常喜欢Disqus,漂亮,稳定,可用性高。在反垃圾方面也是我用过的最好的。国内有多说,友言等等,但是这些反垃圾都比较差,经常看见很多多说评论里面有大量成人网站的广告,惨不忍睹。

目前,我用的是WordPress自带的评论系统。WordPress博客有个著名的反垃圾插件:Akismet。这个插件使用的是黑名单机制,如果你把一条评论手动定为垃圾评论,那么Akismet就会记住,然后下次出现相同的名字,ip或内容相似,就直接判为垃圾评论。

这和杀毒软件有点像,但不同的是,杀毒软件的病毒库是在本地,Akismet的数据库却是在服务器上,也就是说,用户每发一次评论,Akismet就会将评论提交给服务器,服务器判断是不是垃圾评论,然后Akismet根据结果来处理。大大降低了博客处理评论的速度,尤其是在国内,在我这里,发布一次评论基本上需要10s左右才会给用户响应(取决于你网站的网速,而不是用户的网速)。

虽然慢是慢了点,但是效果挺好的,基本上能阻挡90%的垃圾评论。

一般的垃圾评论比较蠢,带有大量的链接,不是中文,名字留的广告,网址也是广告,一看就是垃圾评论的。这类Akismet基本都能解决。

还有一些评论虽然没含什么广告,但是内容确是“写的不错” “深受启发”这样的没有意义的评论,疑似垃圾评论(留得链接可能指向广告),有时候能通过Akismet,但是我会手动删除。

今天遇到了更高级了,全都通过了Akismet。这类不光内容看似人畜无害,而是还是回复给已经存在的评论!

好在WordPress可以设置黑名单,直接在设置>讨论>黑名单ip里面封杀就好了。

 

VimScript学习笔记(10):正则表达式

一般的编程语言都有正则表达式的功能,对于Vim这种专门处理文本的编辑器来说,正则就更加重要了。在学习这一章节之前,你最好有一些正则表达式的基础。如果没有,可以参考《Learn Regex the Hard Way》来学。

设置高亮

通过下面这条命令,可以打开Vim的高亮设置。这样我们在搜索文本的时候,匹配的文本背景会用高亮的颜色显示。

hlsearch是控制按下回车之后,匹配的文本背景高亮。

incsearch是控制实时刷新匹配的文本高亮。

使用正则搜索

在Vim中,向后搜索按下/,向前搜索按下?。通常会配合executenormal构造字符串命令来执行搜索。

注意在命令中,像+这样的正则符号,需要前面加\进行转义,否则就会解释成字符+,而不是正则上面的含义(好奇怪,.符号默认是正则里面的.而不是符号,+却默认是符号而不是正则)。

而在字符串命令中,转义符号需要先用转义符号将其解释成转义符号,而非符号\。有些绕,举个例子,+在字符串命令中的正则含义需要这样表示: \\+

纯字符串

上一节中我们讨论过纯字符串,在纯字符串(单引号里面的内容)下,就可以不必使用双反斜杠表示转义了。但是需要注意的是,\<cr>这样并不能将其转义成回车。因为这里纯字符串不能解释<cr>。好在,Vim支持字符串拼接。

“魔术时刻”(Very Magic)

太疯狂了是不是,竟然有这么多模式。

如果你对其他语言的正则表达式熟悉的话,可以使用一个叫做Very Magic的模式(就是用\v开头的正则表达式)。

参考这个命令。

我个人比较喜欢这个方案。因为它把命令和正则分开了,而且兼容其他编程语言。