Archive for the ‘工程师文化’ Category

Life of Py

星期三, 一月 23rd, 2013

标题灵感来自于 Life of Pi,少年Pi在大银幕上经历了一段奇幻漂流,豆瓣的工程师们——让我们称之为少年Python(豆瓣工程师和Python的关系,这个就不用多说了吧^_^)则在不久前的 Happy Day 上体验了一把 geek 才有的快乐。

2013年1月11日,室外是萧杀的寒冬,在花家地附近某报告厅内却热闹非凡。超过90%的豆瓣工程师在这天参加了2013年第一次、也是豆瓣史上参与人数最多的一次 Happy Day 活动。

Happy Day 是豆瓣工程师团队的传统,也是豆瓣自创立以来开放、鼓励创新的工程师文化的重要组成部分。在Happy的同时为全面挖掘工程师潜能而进行的 Team Building,不乏困难和挑战,但也满含着工程师们才能体会到的快乐。Happy Day 通常每季度会举行一次,包括算法竞赛、现场coding对战、新技术学习以及硬件组装等各种主题活动。

这次 Happy Day 的活动内容是动手组装3D打印机。(是的,你没看错,的确是组装当前最新最潮的3D打印机!)

据Chris Lau老师(华人界第一位3D打印机组装者)介绍,3D打印机通常需要花上一天半才能拼装完成。豆瓣的工程师们可不这么想——几人小团队做着其它公司成百上千人做的事情,豆瓣工程师们把他们在工作中一贯的高效也用在了这次 Happy Day 上。不到一天时间,几乎每个小组都完成了组装工作,最终有两台3D打印机能够正常工作!

活动接近尾声的时候,参与的工程师们意犹未尽,仍在认真调试着线路~~~

下面是打印出来的作品(戒指一枚)

在经过进一步的调校之后,会有三台3D打印机永久入驻豆瓣,为工程师和产品同事们源源不断的创意提供可以实现的设备支持——还记得工程师们用树莓派做的远程开门器么,也许他们正在想着用3D打印机做一个仿真的前台mm吧^_^

使用树莓派制作的远程开门器

星期一, 一月 7th, 2013

背景
话说自从我厂的商务部门搬到旁边的商务楼之后,工程师发现漂亮的前台MM也搬走了,在新前台到来之前,某区只留下冷冷清清的鱼缸。然后,工程师们发现开门成了个问题。鉴于进门需要刷卡,所以没有带卡的工程师就不得不摁下门铃,等待其他人从座位上起身为自己开门。经历过多次不得不让别人来开门以及不得不为别人开门之后,终于有工程师不能忍受了(我就是其中一个),于是,决定自己动手解决问题。要知道,地球上没有能难住工程师的问题!

研究与选择方案
我厂的电子门锁的开门设备是通过一个带弹簧的开关(门内,类似墙面上开灯的开关)控制的,按下开关就能打开门,按下开关的时候能够听到明显的继电器闭合的声音,因此,趁着没人的时候我把开关拆开看了一下,证实的确是通过触电控制的一个继电器。按下开关时,两个金属触电接触,继电器动作,门打开。继电器在动作后延时4秒左右恢复。这样看来,硬件层面的开门实现就非常简单了:跨接一个数字继电器,要开门时,通过电平信号控制继电器闭合并保持2秒即可。

但要实现远程控制,必须设置一台可以通过TCP或是HTTP协议接受用户命令,并能控制开门硬件(继电器)的设备。最初考虑过Arduino,作为一个开源的硬件平台,Arduino的电平输出非常易于控制和操作。而且Arduino也有RJ45或是无线的接口模块。不过在查看了Arduino的无线模块的操作方式之后,我发现要让Arduino接入一个WPA加密的无线网络并实现一个web server并不容易。所以最终还是选择了树莓派(Raspberry PI),虽然RPI的硬件成本更高一点。

RPI与Arduino的设计目标不同,它主要是一个超小的PC主机。幸好RPI本身提供了若干个GPIO的输出口(3.3V),用来操作数字继电器倒是没有问题。

参考资料
1. RPI的GPIO引脚的定义
2. 引脚的输出规格
3. RPI的GPIO教程

请特别注意:由于GPIO的引脚是没有保护电路的,不当的硬件连接很可能会导致整块RPI板子烧掉,连接和操作时务必慎重。在确定方案时,我个人使用了面包板,电阻和二极管等电子元件搭建实验电路,并反复用万用表验证过输出电压和电流(主要是对RPI的每个脚的输出不确定)。

 

操作步骤

在RPI上安装操作系统
拿到RPI后,首先要在RPI上安装操作系统。请参考这份文档,安装完操作系统后,确保重新启动成功(RPI的视频输出口是HDMI接口,可以直接连接在支持HDMI的显示器或是电视上,或者可以通过HDMI转VGA/DVI的连接线连接到支持VGA/DVI的显示器上。注意:无源的HDMI转VGA的线可能会损坏RPI板)。

配置网络
RPI本身的网络支持已经比较完善,通过有线方式接入的话,只要直接插入网线就可。考虑到无线方式部署比较方便,我采用的是无线连接的方式。

RPI仅对部分网卡支持较好,利用RPI的官网上的无线网卡兼容信息,最终选择了一款相对便宜且能得到较好支持的网卡:TP-LINK TL-WN823N,该网卡在网上就能买到,购买地址见本文最后的列表。

插入网卡后,修改网卡的配置信息:

修改其中与wlan0相关的部分:

这里我选择了使用静态地址,原因是我们不希望开门的服务器地址老是变来边去。设置好网络并确认能够正常工作后,就可以着手进行下一个步骤了。

连接硬件
下图是具体的连接方式,注意连在RPI上的三条线,白色(电源)、黑色(GND)、灰色(信号)分别连接在RPIGPIO的2号、6号与7号针脚上。

编写代码
RPI的操作系统缺省已经有一个Python的安装了。因此,我们可以使用Python来设置Web Server并控制开门的硬件设备。我选择了web.py作为Web server的开发基础,加上GPIO的python库来完成工作。

参考资料
1. Web.py的下载、安装与教程
2. RPI GPIO的python库安装和使用

接下来就是在RPI上设置Web server了。遵循我厂的传统,使用Python作为Web server的主要开发语言。

开门硬件控制相关代码:

Web server代码(基于web.py):

这样就在RPI上建立了一个web server,用HTTP POST方式输入正确的用户名和口令就能实现开门。

为了更方便地应用远程开门(例如,用手机开门显然更cool),可以编写iOS或是Android上运行的开门应用。当然,由于开门只需要发送一个HTTP POST请求,直接写成一个可以在Mac/Linux/Win下运行的命令行也可以。

部署后的全景

  豆瓣开门                                                  豆瓣开门widget

后记与感谢
感谢所有参与这个项目的我厂同学们,豆瓣的确是个有着独特的技术文化的环境,这里不仅有许多可以互相交流想法的技术geek,还有着庞大的对所有新鲜事物感兴趣的工程师群体。欢迎各位喜欢这个环境的其他非我厂同学们加入这个群体 ^_^

成本与硬件列表(为方便想要动手的同学,带购买链接,点击请慎重)
1. 树莓派(MODB-512M):带运费,税费,约300元;
2. TP-LINK TL-WN823N 300M迷你型无线USB网卡: 55元;
3. 连接线:2元;
4. 两路数字继电器:5元;
5. 其它:约60元,导线,4G SD卡一张。

 

Pythonic!我们在践行的路上

星期三, 十月 24th, 2012

在刚刚过去的这个周六,近300名Pythoner聚集在北京东城区方家胡同的Studio-X,共同参与了Pycon China 2012北京站的活动。豆瓣是世界范围内应用Python最为成功的互联网公司之一,这样的行业盛举自然不能缺席。除了对Pycon China这一非营利性的开发者聚会给予资金上的赞助外,我们的设计师还承担了包括主题T-Shirt、海报、易拉宝、背板、明信片在内的宣传物料的设计工作,活动现场也有豆瓣的志愿者团队为参会者提供服务,有客串的摄影师们记录大会的精彩瞬间。豆瓣的工程师们多才多艺,由三位工程师组成的ImportError乐队在会议间歇表演助兴。

 

Python之于豆瓣,既有技术层面的应用,更有文化基因的融入。坚持技术和产品创新,乐于创造和引领,坚持从内到外的简单、极致和表里如一,这些让我们用豆瓣方式工作、生活的同时,更能领悟原本在编程领域倡导简洁、易读、易懂的Pythonic精神。

就拿这次大会来说,豆瓣的工程师分享了豆瓣阅读从开发到发布过程中的持续集成及发布工程实践。这个过程,是真正的工程实践,包括本地构建环境和脚本系统、jenkins系统、代码静态检查、单元测试、API测试、Webtest、打包、发布、iOS自动化实践、线上监控等,全部是工程师们在项目进行的过程中不断改进的结果。他们在工作中力求简洁,在分享时同样只讲“干货”,易读、易懂。

本次会议是Pycon China首次增设北京站。让人颇感欣慰的是,我们看到了越来越多的开发者加入学习、使用Python的大军,有越来越多的人开始和我们一道了解、践行Pythonic精神,并将它从技术领域延展到产品、流程、模式乃至生活的方方面面 …

豆瓣技术团队的指环王文化

星期一, 十二月 17th, 2007

douban“在豆瓣世界的史前时代,即第一纪(the First Age),那是一个没有历史记载的年代,我们只能通过真假难辨的传说来略微揣测一下当时的史实。传说那时只有一个人类,名叫阿北。有一天,他有了一台服务器,他把它命名为”佛罗多”(Frodo)。他为佛罗多开发了一个程序,起名叫”夏尔”(Shire),不过后来更广为人知的是它的大名——”豆瓣”。后来,很多人从虚无中迁移到夏尔这片土地上,读书,看电影,听音乐,交流信息。人数有百万人之多。”

从阿北开始,豆瓣的技术人员很多都是《指环王》小说电影的fans。06年阿北给我们秀他新买的MacBook Pro,就是在周五的Happy Hour用投影播放《双塔奇兵》。大家在给自己的作品起名时,按照惯例往往采用指环王里的人名和地名,久而久之,就形成了豆瓣技术团队的指环王文化。

豆瓣所有的服务器都以指环王里的人物为名,大家各司其职:佛罗多早已从前台退役,现在作为开发和测试用机;梅里(Merry)和山姆(Sam)这两个霍比特人挑起了大梁,承担起所有用户的请求,向豆友们展现丰富多彩的页面;四个神仙级的精灵:双胞胎爱隆(Elrond)和爱洛斯(Elros),森林女王凯兰崔尔(Galadriel)和灰港之主瑟丹(Círdan)用他们伟大的智慧和不死的生命保护着用户的所有数据;爱隆之女,美丽的亚玟公主(Arwen)帮助用户迅速搜索到想要的信息;另一个霍比特人皮聘(Pippin)和英俊的精灵王子勒苟拉斯(Legolas)执行着一些后台任务;人皇阿拉贡(Aragorn)和刚铎摄政王的儿子波罗莫(Boromir),这两个强壮的人类和矮人金雳(Gimli)一起,承担着数据挖掘的重担;而波罗莫的弟弟法拉墨(Faramir)则逐步接管起图片的显示。运行着英文版豆瓣和豆瓣blog的服务器在美国,由于它离我们比较远,因此我们用中土世界跑得最快的马命名它——甘道夫的坐骑影疾(Shadowfax)。

豆瓣的各个软件项目是用指环王里的地名命名。霍比特人的家园夏尔(Shire)是豆瓣主站项目,希望豆瓣能够成为豆友们开心生活的乐土;数据挖掘项目建立在精灵城堡瑞文戴尔(Rivendell)之上;蜘蛛横行的幽暗森林(Mirkwood)是我们的爬虫项目;而九点依赖的RSS抓取项目,由于博客文章的增长速度惊人,就像被批量制造的兽人(Orcs)一样,我们用最后决战时兽人涌出的地点——黑门(Black Gate)——作为项目名。猜猜RSS抓取主程序的名字叫什么?对,就叫makeorcs.py :) 另外,我们正在开发中的高性能分布式计算平台,当然得拥有一个power到令人害怕的名字: 魔多(Mordor) :p

在开发上,开发团队采用了敏捷开发方法,每周一次迭代,以迅速响应不断变化的需求。每周的进展都会有一个code name,我们跟随着佛罗多的脚步,从霍比屯(Hobbiton)出发,每周前进一段距离,到达的地点作为下周的code name。比如,下面这段就是我们某周开发工作周报的开头部分:

Milestone: Sprint #8 (Green Hill)
往东南方走了一阵之后,他们来到了绿丘乡(Green Hill Country)。Frodo在山坡上向远方Hobbiton的灯火挥手道别。”不知道我以后还有没有机会再看到这个景象。”他低声说。
上周开发团队关闭了13个ticket,完成了Sprin#8。

一路艰辛跋涉,到现在已经36周过去了,我们成功的躲过了黑骑士的追杀,走上了销毁魔戒的漫漫征途,目前正来到了矮人的地下都市摩瑞亚的墙外(Wall of Moria)。前方还会有很多艰险,但我们将继续坚定的走下去。

在豆瓣,每周都会有一次技术交流会议,每个人轮流主讲,分享自己近期关注的技术点,每次讲完后都会引发热烈的讨论。就像精灵王爱隆召开会议讨论组建魔戒远征军一样。我们用会议的召开地——瑞文戴尔的烈火之厅(Hall of Fire)——命名我们的技术论坛。

豆瓣的指环王文化给相对枯燥的开发工作注入了乐趣,当我们在用frodo等名字称呼我们的服务器时,真的就感觉到那是一个个有个性的可爱的生灵。豆瓣的开发团队也像魔戒远征军一样,虽然路途遥远困难重重,但大家各尽所长,团结一心,最终终将胜利!

P.S. 最近豆瓣的条目图片所使用的虚拟服务器也用几个霍比特人来命名了,有人发现了吗?

长尾数学问题悬赏

星期三, 三月 8th, 2006

今天豆瓣小组里说梦痴·的的慢提了这样一个问题:

现在人数在50人以下的小组大约占了全部4000+个小组的90%,那么按照豆瓣的分布,这后90%的小组全部加起来一共有多少的出现几率?(在全部六个位置中)即我们有多大机会在“15分钟名组”看到一个不到50人的小组?10%?5%?1%?还是更少?

提的比较清楚的是后一个问题。重述在此:

在”15分钟名组”里看到(至少)一个不到50人的小组的几率有多少?

这其实是一个统计的问题。可以去做一个模拟,不过我想看看有没有更聪明的答案. 所以在这里公开征解。

先看看”15分钟名组”是怎么来的。豆瓣的FAQ说:

[6个"15分钟名组"]从所有小组里随机挑选。每15分钟更新一次。这个列表是为了打破以前“最受欢迎的6个小组”造成的贫富分化日巨问题。

但是不是所有小组都机会均等(这样的话,选中的小组基本上会只有一个成员)。小组成员越多,选中的机会越多。挑选是由豆瓣系统自动用随机数进行。所有小组按人气排队以后,选中的几率遵从一个长尾分布。所以即使只有一个人的小组也可能上榜,但极有可能是一个月里某一天的凌晨3点52分。

这个“长尾分布”, 豆瓣的程序里是用Pareto分布计算的。学统计的,或者看过Linked这本书的人应该知道。定义在这里:

http://www.answers.com/topic/pareto-distribution

豆瓣现在用的k=0.5 (就是Pareto Index, 也叫alpha). 排序(x)从1开始。此刻现在共有4154个小组,第421个小组以后成员数就小于50了.

第一个模拟出来的正确答案的,我请喝酒。第一个给出解析正解(就是用公式算出来)的,我送超女之一的亲笔签名T-Shirt (空白T-Shirt自备)。我还不知道正确答案,所以可能需要两个以上正解。

没准这个问题有一天会出现在研究生入学考试题里。:)

欢迎转发。