技术手记

nginx/php/检索折腾记

仅仅是想实现一个查询接口, 后台每天凌晨更新一份数据, 按存储. web 端可以查询所有 key1 对应的记录, 或者 key1 + key3 的记录, key2 不管, 但是也是个 key, 而且结果要按 key1, key2, key3 来排序. 这里有个问题是只按 key1+key3 查, value 有多个

只会很土鳖的 php 和 python, 于是考虑 php 做 web, 后面用 python 来做查询

机器上没有 web server 和 php, 于是先装. 没有 root 权限, 所以尽可能简单的搞, 把 nginx, pcre, php 都下到 /home/yewen/soft, 解压备用. pcre 是一个库, nginx 需要这个库的支持才能读取跟 php 连起来的部分配置

# 编译安装 nginx
cd ~/soft/nginx-1.1.1
./configure --prefix=/home/yewen/nginx --with-pcre=/home/yewen/soft/pcre-8.13
make
make install

# 改配置
cd ~/nginx
vim conf/nginx.conf

# 此处修改端口号 (http/server/listen)
# 修改 php 支持 (去掉 http/server/location ~.php 那一大段的注释, 不是 proxy)
# 修改 php 支持的路径fastcgi_param SCRIPT_FILENAME /home/yewen/nginx/html$fastcgi_script_name;
# 直接启动
./sbin/nginx

# 编译安装 php, 必须启用 fpm
cd ~/soft/php-5.3.8
./configure --prefix=/home/yewen/php --enable-fastcgi --enable-fpm
make
make install

# 改配置
cp php.ini-production ~/php/etc/php.ini
cd ~/php/etc
cp php-fpm.conf.default php-fpm.conf
vim etc/php-fpm.conf

# 将 user/group 改为本地用户
# 去掉 pm.min_spare_servers和 pm.max_spare_servers前面的注释并设置合理值

# 启动
cd ..
./sbin/php-fpm

写了个很简单的 php, 就是接受一个输入 key, 然后把这个 key 作为参数, system 调用 python 处理, 输出到某临时文件, 然后 php 再读这个文件输出, python 处理是用的最土鳖的扫描文件的方式, 而且由于文件里是按 key1, key2, key3 的顺序排序, 我们的查找有按 key1+key3 来的, 所以必须扫描整个文件, 后来发现这么搞实在不靠谱, 一次检索太慢了, 要数据规模稍微大点, 并发多点, 那就崩溃了

于是考虑把所有数据都加载到内存里来, 用 python 做一个 daemon, 然后 php 通过本机 socket 跟这个 daemon 互动. 不会搞 socket, 于是先学 php 和 python 的 socket 使用, 很简单, 只是因为我为了省事 php 编译的太简单, 居然不支持 socket 方法, 问了下 felix021, 改用fsockopen搞定.

这时候 python 是把所有数据 load 到内存, 用一个以 key1 为 key 的 dict 存储, dict 的每条记录是一个 list, 存储了所有 key1 对应的记录. 如果查询是只有 key1 的, 把这个 list 做下格式化返回就行了, 如果是 key1 + key3 的查询, 则把 key1 的 list 取出来, 做一次遍历, 看 key3 是否就是我们要的, 如果是, 加入结果 list, 最后把这个结果 list 做格式化返回. 因为每个 key1 对应的记录撑死也就几万条, 查询速度完全没有问题, 内存占用 3.2G.

后来发现这台机器没法提供对外服务 (这么坑爹的事情这么晚才得到确认), 换用一台台式机来处理, 这时候内存显然不能这么乱搞, 优化一下, 开始写人肉索引. 内存里还是一个以 key1 为 key 的 dict, 只是 value 改成 key1 在原始文件里的偏移量. 查询的时候, 打开文件跳到 key1 对应的偏移量挨条扫描, 直到到达 key1 结束的地方. 速度还是很好, 因为文件操作毕竟不算多, 至少人肉感觉不出来有迟钝, 内存占用 10M.

把这个问题泛化下, 貌似就可以做面试题了, 一个简单的查询系统. 只要按某个 key 有序, 一开始可以全内存搞, 扩大数据规模后就必须内存索引 + 磁盘文件, 再大就要多级索引, 再大就分库. (我决定今年面试我一定要问这个问题, 如果看过我 blog 的, 那就现场写实现, 如果不考虑做 list 格式化, 整个程序不超过 50 行)

Jeff Dean 对 G 的架构的串讲

原始来源: http://www.tektalk.org/2011/08/09/jeff-dean-%E8%B0%B7%E6%AD%8C%EF%BC%8C%E8%BD%AF%E4%BB%B6%E7%B3%BB%E7%BB%9F%EF%BC%8C%E7%BB%8F%E9%AA%8C%E6%95%99%E8%AE%AD/

很多资料外面都有, 不过听下串讲还是不错的

slides: http://www.tektalk.org/wp-content/uploads/2011/08/101110-slides4.pdf

youtube 的视频: http://www.youtube.com/watch?v=ulBalk7Od-Q

历史上的两次事故

/* 关键词: 封连线
* 死程序员的解读: gdb 中断时强行修改变量值, 继续执行导致程序无法检测异常, 出 core
*/

/* 最近一次是 08.2.21, 萧山 (未发生路外事故), 来源 http://news.sina.com.cn/c/2011-07-28/055022890573.shtml */

2月21日17时55分,上海局萧山~萧山西间0038G发生红光带。信号工在处理故障时,不登记停用,不联系汇报,违法使用封连线短路三组继电器接点,导致0038信号机显示错误升级,致使k76次旅客列车在萧山站以正常速度通过,闯入已停留N448次旅客列车的同一闭塞分区,K76次列车在车站值班员连续七次呼叫机车乘务员前方有车,要求慢行的情况下,经紧急制动停车,两车首尾仅仅相距130米,距发生追尾冲突、造成车毁人亡的严重后果差之毫厘之间,后果十分可怕,构成客车一般C类事故。

/* 影响最大的是荣家湾, 来源 http://bbs.railcn.net/viewthread.php?tid=7459 上面新浪那个来源也可以部分参考 */

1997年4月29日10时48分,京广线湖南省境内荣家湾车站发生了324次旅客列车与818次旅客列车追尾冲突行车特大事故。

一、事故经过
(一)概况
1997年4月29日10时48分,昆明开往郑州的324次旅客列车行至京广线荣家湾站1453公里914米处,与停在站内4道的818次旅客列车尾部冲突,造成324次旅客列车机后1至9位颠覆,10至11位脱轨;818次旅客列车机后15至17位(尾部3辆)颠覆。
(二)经过
1997年4月29日,818次旅客列车(长沙——茶岭)全列编组17辆,总重901吨,由长沙机务段ND2型222号机车牵引,司机李睿、副司机李伟和长沙列车段运转车长罗建华担当值乘,长沙客运段担当客运乘务。列车于10时35分到达荣家湾站4道停车,计划待避客车324次。
324次旅客列车(昆明——郑州)全列编组17辆,总重882吨,由长沙机务段DF42520号机车牵引,司机李建文、副司机陈勇和长沙列车段运转车长谭列军担当值乘,郑州客运段担当客运乘务。列车10时42分通过黄秀桥车站后,荣家湾车站值班员曾海泉即布置信号员李满娟办理324次列车Ⅱ道出站信号。324次列车凭荣家湾车站进站信号机绿色灯光进站,行至12号道岔处,司机发现列车进路不对,立即采取紧急制动,停车不及,与停在站内4道的818次旅客列车尾部发生冲突。

二、现场勘察、鉴定及模拟试验
(一)列车冲突时间、地点及现场状态 I
冲突时间:1997年4月29日10时48分。
冲突地点:京广线1453公里914米处。(荣家湾站内4道)。
事故机车、车辆于5月2日7时48分全部起复,车站恢复正常行车。
(二)人员伤亡及损失情况 <$8]lX
1.人员伤亡情况:这起行车事故共造成死亡126人,重伤48人,轻伤182人。 zI
2.行车设备损坏情况:机车报废1台,客车报废11辆、大破3辆、中破1辆、小破1辆,线路损坏415米,直接经济损失415.53万元。
(三)与事故有关的设备现状
信号员在办理324次1道正线通过进路时未发现控制台有任何异状,光带显示正确。事后经查证控制台和解锁盘各部铅封守好齐全;12号道岔反位开通4道,道岔无任何损伤。 &eHe
(四)列车运行监控记录装置检索情况 324次本务机车DF4型2520号列车运行监控记录装置主机(长机—016),从机车上封连线卸下后送岳阳机务段转储检索。

记录数据为:
信号显示:324次列车9时35分从长沙开车至荣家湾进站信号,全程显示绿灯。
进站速度:荣家湾进站时,每小时117公里。
列车管风压:荣家湾进站时为600千帕,行至1454公里12米处,风压为550干帕,3秒钟内降至零。
撞车位置:1453公里914米处。
检索结果表明:324次列车进荣家湾站时信号显示绿色灯光,就由1道正线通过。机车乘务员发现错进轨道时,立即采取了紧急制动措施。
(五)事故原因模拟试验情况
1997年5月3日9时03分至10时26分,技术调查组根据“4·29”事故调查领导小组批准的“4.29特大事故调查组模拟试验提纲”,对4月29日324次旅客列车与818次旅客列车尾部冲突原因进行了现场模拟试验。模拟试验的结果验证了事故发生的原因。

三、错接二极管犯下滔天罪
经过调查、模拟试验及技术分析结果表明,导致这起行车事故的原因及过程是:4月29日8时许,长沙电务段荣家湾信号工区工长吴荣忠,安排信号工郝任重、谢兰英对荣家湾站内南端12号道岔区段以南的道岔及信号机的电缆盒进行配线整理、加端子脾和内部卫生清扫,吴荣忠自己在信号楼内担任联系。8时30分左右,谢兰英步行来荣家湾站南端14号道岔处,开始对14号电缆盒进行清扫、加装端子牌编号;郝任重骑自行车来到12号道岔处开始进行作业,郝先打开12号道岔XB变压器箱,半箱内的1号端于电缆线甩开,擅自使用二极管封连线,将1、3号端子封连(此时12号道岔处于定位),而后又将HZ一24电缆盒打开,进行配线整理。10时22分,车站办理818次旅客列车进4道接车线路时,郝任重发现12号道岔由定位转至反位,马上打电话问吴“现在上行什么车进4道”?吴回答“是818次”。吴告诉郝“818次进站后我要接车”,并要求郝停止作业。10时35分,818次列车进入4道停车后,郝任重又用电话与吴荣忠联系,问“上行还有车吗”,吴回答“上行有车”。但郝任重未及时将二极管封连线卸下,恢复1号端子电缆线,而是坐在工具箱上与荣家湾工务工区巡道工彭拔群聊天。10时42分,车站办理324次旅客列车E道通过进路,控制台Ⅱ道上行进出站信号均显示绿灯,Ⅱ道通过进路显示白光带,12号道岔显示定位(由于郝的二极管封连线未卸下,甩开的1号端子线未接上,故12号道岔实际仍处于反位)。当郝任重看到324次列车将要进站时,仍未将二极管卸下,恢复1号端子电缆线,也不采取拦停列车的措施,而是站在一旁躲车,直至324次与818次尾部发生冲突。事故发生后,吴荣忠在运转室给郝任重打电话,问郝“是不是你支了什么设备,自己去检查一下”。郝接完电话,急忙回到12号道岔XB箱处,将二极管封连线卸下,恢复1号端子电缆线,骑自行车离开现场。

四、结论
这起事故的直接原因是:长沙电务段荣家湾信号工区信号工郝任重当日在12号道岔电缆盒整理配线作业时,瞒过车站值班员,将12号道岔XB变压器箱内1号端子电缆线甩开,致使12号道岔在反位时不向定位转动;又擅自使用二极管封连线,将l、3号端子封连,造成12号道岔定位假表示,破坏了12号道岔与Ⅱ道通过信号的联锁关系。郝任重在818次列车进站后及发现324次列车将要进站时,既不将二极管卸下,恢复1号端子电缆线,又不拦停列车,导致本应从Ⅱ道通过的324次旅客列车进入4道,与停在该道的818次旅客列车尾部相撞。
因此,这起事故的直接责任者是长沙电务段荣家湾信号工区信号工郝任重。

五、事故性质
关于这起事故的性质,有两种意见。一种认为:这是一起生产过程中的破坏事故。另一种认为:这是一起违章作业造成的责任事故。

有关铁路票价计算方法

原帖见 http://bbs.hasea.com/thread-306466-1-32.html 和 http://bbs.hasea.com/viewthread.php?tid=331506&page=1#pid4828054

中间和里程无关的票价只有这么几类, 均和动车组无关

附加费的种类有:客票发展金、候车室空调费、卧铺票订票费。客票发展金以前叫“软票费”,旅客票价不大于5元时为0.5元,大于5元时为1元;候车室空调费向乘车超过200km的硬席旅客收取,金额为1元,软席旅客不收候车室空调费;卧铺票订票费向购买卧铺票(包括各种等级的软卧、硬卧)的旅客收取,金额为10元。

和动车组票价计算有关的 (其中北京 S2 已经不是这么算的了)

动车组二等组在二等软座的基础上上浮10%,即
0.2805×110%=0.30855(元/千米);
一等座在二等组基础上再上浮20%,即
0.3366×120%=0.37026(元/千米);
特等座在二等组基础上再上浮50%,即
0.3366×150%=0.462825(元/千米);
每票另收硬座基准费率2%的意外伤害强制险,即
0.05861×2%=0.0011722(元/千米)。

普通动车组公布票价:(L为运价里程, 20 起算)
二等:0.2805*1.1*L+0.05861*L*0.02即0.3097222*L
一等:0.3366*1.1*L+0.05861*L*0.02即0.3714322*L
1000km以上二等票价按同里程新空特快硬卧下铺计价,一等与二等票价比为1:1.25。
此外,S2线动车组执行20km起价,并在公布票价基础上打0.76的折扣;京津C车津塘段按普D计价。

HTC Desire (G7) 折腾记

作为一个还算追新的 IT 民工, 在民工聚集处掏出 Nokia 1200 时总会被人 bs 一番, 加上晚上睡觉前, 早上醒来在床上挺尸, 以及吃饭等餐, 蹲坑无聊时还是需要有个打发时间的玩意儿 (勤奋的同学管这叫利用碎片时间学习, 笨狗太懒, 还是玩吧), 在清明节假期于木樨地某淘宝店入手 HTC Desire (G7) 咖啡色一台, 同时被忽悠的还有某喵一台白色的 G7, 阿牛一台同样是咖啡色的 G7, 当时入手价格是 2690/2810 (咖啡色/白色, 裸机带原装电池/充电器/线, 送 4G 卡/屏幕膜/套/擦镜布/读卡器), 跟老板说不要送的东西能不能便宜点, 说其实本来就没几个钱, 也便宜不到哪去, 就这样机器带回家了.

回来后在默认的 Android 2.2 (HTC Sense 2.1?) 用了一个星期, 大概摸熟了这机器的特点. 因为不爽买回来时系统里一堆莫名其妙的东西 (比如压根就没启动还老崩溃的搜狗输入法), 以及严重需要腾 ROM 空间给邮件等需求, 响应 Android 手机使用者的特点 (刷机重启换电池), 开始踏上刷机的不归路.

我自己手里这台机器到我手时已经 S-OFF, 所需的只是 root 权限, 按教程搞了个 unrevoked, 结果总在最后一步提示错误, 说 cid missing, 一开始以为是 3.32 的 unrevoked 有问题, 换 3.2 依旧, 搜了下找到这篇 http://www.miui.com/thread-16907-1-1.html, 按其方法顺利搞定, 越狱拿到 root 权限, 刷机一切顺利.

另外某喵和阿牛的机器就开始各种诡异了, 先说某喵的. 这个机器是 S-ON 的, 但是一开始没发现, 还是走 unrevoked, 遇到 cid missing 时很开心的用 adb shell 将 misc.img 给改了, 但是改完发现还是越狱不能, 进 recovery 各种折腾后把很多系统文件都搞没了, 后面感觉还是绕不开要 S-OFF, 只能想办法从这里开始. 接下来主要参考的资料是 hiapk 的这一篇 http://hiapk.com/thread-531173-1-1.html, 一开始觉得这个教程很靠谱, 但一看里面要刻盘, 然后再想家里一台台式机一台 X200 两台 X201i 都是没光驱的货, 对此方法就完全没了兴趣, 加上那个丑陋的开机第一屏, 怎么看怎么不爽, 总觉得应该有更合理的方法. 在考虑虚拟机或者量产 U 盘的可能被无数的帖子提示不靠谱后, 发现了用 MaxDos 直接加载 .iso 的方法, 觉得这个有戏, 去 http://skycn.com/soft/19793.html 下载了 MaxDos 装上, 然后把 hiapk 里给的那个 alpharev.iso 改名 maxcd.iso 放到某盘根目录下 (名字路径一定不能错, 笨狗就因此多重启了好几次机器), 重启时选 MaxDos, 然后选加载 maxcd.iso 启动, 顺利进入刷 S-OFF 的界面, 插 USB, 搞定. 然后就一切顺利了, 改版的系统大多自带了 root, 直接刷上就行了.

在搞定某喵的机器后笨狗信心大涨, 立马决定应该把阿牛从 JS 刷的破系统中解救出来. 这个机器拿到手时压根不能进 recovery, 用 unrecoved 越狱失败, 各种理解不能. 一开始没细看就认为跟某喵的是一个德行, 把机器拿过来继续进 MaxDos, 结果插上手机说这货不支持, 仔细看了看英文提示, 确实不支持, 把电脑和手机各重启一遍, 还是不支持… 怒. 再重启手机时一看, 我擦这好像已经 S-OFF 了也, 那 recovery 进不去是咋回事? 而且那个蛋疼的 unrevoked 不管刷自带的 recovery 还是别人的都搞不定. 继续搜刷 recovery 的方法, 看了很多, 也忘记原帖在哪了, 大致是按 http://bbs.xda.cn/forum-viewthread-tid-5874045.html 里提到的方法, 用 http://alpharev.nl/ 里的 PB99IMG_bravo_CM7.zip 弄内存卡里刷 recovery 成功, 既然 recovery 能进了, 那还不就是怎么搞都可以了…

个人觉得 alpharev 的 S-OFF 第一屏实在是不够美观, 半夜不小心看到说不定还会吓出心脏病, 继续按 http://hiapk.com/thread-531173-1-1.html 二楼里的做法改第一屏. 一开始看漏了要在手机 fastboot 界面下接 USB 线, 还想怎么手机连上去死活没反应, 把那个修改第一屏的两个包都搞下来试都不行, 还骂什么破玩意儿下载就扣积分. 冷静了下后想那个帖能被回三百多页并且没看见几个骂人的, 那一定是笨狗哪里搞错了, 把教程仔细又过了一遍, 果然是漏了要在 fastboot 模式下连手机, 重启一次手机, 果然顺利搞定.

目前用的 ROM 是 hiapk v3.4, 基于 2.3.3 的内核 + CM7.0. 刷完后进系统先别登陆 Google 帐户, 不然 Edge 开始哗哗走流量, 先跳过设置, 连上 wifi 后, 把 GPRS 关了慢慢折腾, 做如下设置改动: 1) 长按 Home 键的电源控制; 2) 电源小插件的开关; 3) 状态栏电源控制的开关; 4) 桌面改成 5 行 4 列; 5) 解锁界面改成默认滑块; 6) 修改上滑手势为显示/隐藏扩展栏 (这个是被逼的, 因为经常莫名其妙扩展栏就不见了); 7) 装自己用的一堆东西: (按字母序) Adobe Flash Player, Adobe Reader, QR Droid, Google Reader, System App Remover, 百度地图, 百度输入法, 百度文库, 飞信, 墨迹天气, 奇艺, 人人, 手机 QQ, 有道词典, 掌上百度; 8) 用 System App Remover 卸载 ROM 私货 hiapk 市场, Music^3, Google 输入法, 剩下私货中的智能拨号还行, 留下了; 9) 修改默认铃声等, 启用震动 (不然手机放口袋里短信什么非常容易漏过去), 如果不设全局, 则短信什么的都要进到程序界面, 然后 menu 键进设置里找震动; 10) 登陆寨厂 Exchanger 服务器, 同步最近一天邮件和日程 (随时可以被催命了)

最好养成如下习惯: 1) 用 Google Contact 管理联系人, 其他管理方式都各种不安全和不靠谱, 折腾过几次后就老老实实被 Google 绑架了; 2) 经常记得备份短信和通话记录, 不然以当前 Android 各种 ROM 的稳定性, 除非已经找到一个非常稳定的版本, 不然都各种诡异.

// 昨天终于搞定某喵和阿牛机器, 暗爽, 同时今天笨狗机器有一些莫名小问题 (比如无线抽风), 手贱重启后无法进系统, 又刷几次, 再跟某虹聊天才发现 Desire 已经跌到 2k2 的价位, 感慨上篇 hi blog 后, 愤而出本文

[转载加翻译]Good PM, Bad PM (一)

小小财神】:评价加翻译。这个文章是微软产品经理对产品经理的认知。虽然我认为微软对产品团队的重要性比较忽视,看到这篇文章,微软对产品经理还是比较重视的,只是微软的产品经理是个small business unit ceo的概念,涵盖了组织、协调、战略、规划、设计、营销和市场多方面的工作,这样的人才在国内特别稀少。国内的产品经理多是讲用户需求、体验和微创新,国内互联网企业也组织了比较大的产品团队,里面所有的人都叫产品经理,实际上如果按照本文的认知,国内的产品团队只有个别人可以叫做产品经理,多数人只能称为助理产品经理。

我翻译这篇文章的时候也思考了很多,外企多使用精英型的产品经理模式,包括google,对产品经理的要求非常高,甚至要求必须是技术出身;国内互联网多使用产品团队模式,两种模式的好坏以后再说。大家理解的时候先将文章中的PM理解为整个产品团队,而不是一个人。

Good product managers know the market, the product, the product line and the competition extremely well and operate from a strong basis of knowledge and confidence. A good product manager is the CEO of the product. Good product managers take full responsibility and measure themselves in terms of the success of the product. They are responsible for right product/right time and all that entails. A good product manager knows the context going in (the company, our revenue funding, competition, etc.), and they take responsibility for devising and executing a winning plan (no excuses).

Bad product managers have lots of excuses. Not enough funding, the engineering manager is an idiot, Microsoft has 10 times as many engineers working on it, I’m overworked, I don’t get enough direction. [Netscape CEO] Barksdale doesn’t make these kinds of excuses and neither should the CEO of a product.

好产品经理非常了解市场、产品、产品线和竞争,运作中有丰富的知识基础和自信。 好产品经理是产品的CEO,他承担产品的全部责任,并自我衡量产品的成功。 他们为所有适当的产品/适当的时间、所有流程负责。 好产品经理了解进入的背景(公司,收入,竞争等),他们承担制定和执行一个成功的计划(没有借口)。

坏产品经理有很多借口:没有足够资金;工程师经理一个白痴;微软拥有10倍多的工程师为它工作,我们劳累过度;我没有得到准确的方向知道。 [网景公司总裁]巴克斯代尔不会使用这些借口,所以产品经理也不应该。

小小财神评】产品CEO的概念,实际上是对产品经理最高要求,要求对每个方面都有清晰的认知。

我觉得最主要的是产品经理心态问题,积极心态是产品经理必有的特质,控制自己可以控制的事情也是产品经理的思维特性。不找理由,不迁怒于人,是一个产品经理基本的心态要求。

Good product managers don’t get all of their time sucked up by the various organizations that must work together to deliver right product right time. They don’t take all the product team minutes, they don’t project manage the various functions; they are not gophers for engineering. They are not part of the product team; they manage the product team. Engineering teams don’t consider Good Product Managers a “marketing resource.” Good product managers are the marketing counterparts of the engineering manager. Good product managers crisply define the target, the “what” (as opposed to the “how”) and manage the delivery of the “what.” Bad product managers feel best about themselves when they figure out “how”. Good product managers communicate crisply to engineering in writing as well as verbally. Good product managers don’t give direction informally. Good product managers gather information informally.

好产品经理不要使他们的时间被各种不同组织灌满,而且合理组织正确的时间交付正确的产品。 他们不是处理所有的产品团队会议记录,他们不是项目式管理的各项功能,他们不是忙于处理各种工程问题(打地鼠)。 他们不是该产品团队的一部分,他们管理产品团队。 工程师团队不应当简单认为好产品经理是“市场资源”, 产品经理应该是工程师经理的市场伙伴。 好产品经理清晰确定目标,确立目标是“什么”(而不是“如何”),同时管理交货“什么”。坏产品经理对自己感觉最好,他们想出“如何”(how)。 好产品经理清晰的和工程师团队进行口头和书面沟通。 好产品经理不给非正式的方向信息,但好产品经理非正式地收集信息。

小小财神评】好的产品经理解决的是发现问题,确立重点,而不是解决问题,如果产品经理集中在解决问题则是本末倒置。

Good product managers create collateral, FAQs, presentations, and white papers that can be leveraged. Bad product managers complain that they spend all day answering questions for the sales force and are swamped. Good product managers anticipate the serious product flaws and build real solutions. Bad product managers put out fires all day. Good product managers take written positions on important issues (competitive silver bullets, tough architectural choices, tough product decisions, markets to attack or yield). Bad product managers voice their opinion verbally and lament that the “powers that be” won’t let it happen. Once bad product managers fail, they point out that they predicted they would fail.

好产品经理创造可利用的市场宣传资料、常见问题解答、演示和白皮书。 坏产品经理抱怨说,他们整天回答问题销售队伍的问题,并泛滥成灾。 好产品经理充分考虑产品的严重缺陷,建立真正的解决方案。 坏产品经理整天扑火。 好产品经理书写重要的立场观点(竞争解决方案,艰难的架构选择,艰难的产品决策,市场进攻策略或收益)。 坏产品经理口头表达自己的意见,并感叹说“权力”才不会让这种事情发生。 坏产品经理一旦失败,他们指出,他们早就预计将失败。

小小财神评】产品经理对市场成功负责,要学会建立合适的市场营销知识体系,不会市场的产品经理不是好产品经理,好PM要会FAB,市场策略。好产品经理不依靠权力去贯彻执行,而是依靠领导力。

扯淡一句, 到 xx 年解决一票难求

最近大家很乐衷于发某新闻图, 同之前三峡那个. 看到这个, 忍不住想扯淡一句, 这个需求关系变化实在太快了, 每年的春运铁路客流的增长速度那么快, 超级大疯子刘跨越估计也是没预料到的, 还是希望 350 高铁骨干网尽快成型, 250 支线和城际快点铺开吧. 是扯淡一句不是愤一句, 要写愤一句估计半天内我就被人喷死了.

作为资深伪五毛, 发个搜来的数据:

历年铁路春运人数数据

2004: 1.4亿
2006: 1.49亿
2007: 1.56亿
2008: 1.96亿 (原文注释: 这一年有南方天气因素, 更多选择铁路)
2009: 1.92亿
2010: 预计客流 2.1 亿 (估计是去年或更早点的数据, 2010 还是预估)
2011: 预计客流 2.3 亿

// 2011.01.17 15:43 更新

其实对 “一票难求” 的定义大家也不一致, 如果是大家都能走的了, 大部分情况下还是不会 “一票难求”, 只是如果 “限定日期限定车次限定席别” 这种就比较麻烦, 这种也是黄牛最爱. 如果接受 临客, 接受 其他席别 (比如不一定非得是硬卧), 接受在可调整访问内改变日期, 还是可以的, 至少最近两年我都是硬卧来回, 有临客有改签, 非常好买票

今年懒得去折腾了, 过年不回家

乱弹某家的分词

作为一个严肃的 IT 民工, 对于某家退出这事还是挺关注的, 最近两天比较好玩的一个是 “你妈逼”, 一个是 “美少女战士”, 外行看热闹, 内行看门道, 我们也来乱弹下这里面的门道.

早几年在某家实习的时候, 大概瞄过几眼分词结果, 由于这个内容算是比较敏感的东西, 当时也傻乎乎的对这个没兴趣, 所以没有去看具体怎么做的, 只是觉得怎么这么挫, 分词出来切的这么碎, 你说把 “山谷歌曲” 这样的切开也就算了, 但是自家公司名单独输入时也切开, 这个有点说不过去吧. 后来在搜索结果中看多了, 觉得应该不是这样的, 只是我们都在自作聪明觉得自己很牛叉, 实际上, 最后他应该还是用了很强的方法将其重新粘结起来, 所以效果和更懂中文那家比起来, 应该也是伯仲之间. 下面我们用黑盒测试来分析看看.

回到第一段那两个情况, 第一个由于是粗口, 我们就还是不分析了吧? 还是大家觉得就这种才刺激? 在这个情况里, 真实的原因绝不是因为 “妈” 和 “逼” 两个字是被过滤的而导致只搜出 “你”, 而是 “妈逼” 这个词被过滤, 不信大家分别搜 “你妈逼”, “妈逼”, “妈”, “逼”, “妈了个逼”, 可以发现只有 “妈逼” 俩字挨一起出现才会被过滤, 其他情况都不会. OK, 这里我们得到结论一, 安全搜索里提示的切词结果并不是他们家最终的切词结果, 充其量只能算是最细力度的基本词, 回头他会拼回去的, 而这个拼接功能非常强大.

一上来就拿粗口一句来做样例, 实在是有辱斯文啊, 罪过罪过. 再来看 “美少女战士”, 关于为什么 “美少女战士” 会被提示 “美” “少女” “战士” 被过滤, 而 “少女战士” 等就不会的原因, 见上一段分析, 这里我们分析另一个维度, 请大家去试试看 “美少女戰士”, 是不是什么状况都没发生? 而右上角还是提示我们安全搜索是打开的, 这可以得到结论二, 某家不做简繁转换, 简体就是简体, 繁体就是繁体, 当两种语言来对待, 而且简繁过滤词表不一样.

我刚很犯贱的想去试试看 “胡萝卜”, 结果直接就被盾了, 我真想说功夫网的中文处理能力真的有待提高啊…

OK, 等了一会, 恢复后我们继续. 来看看某家在浸淫输入法也好几年后对中文纠错的情况, 先来个简单的, “开心网”, 没错, 一切正常, 那 “开星网” 呢? 会提示我们是不是 “开心网”, 不过很奇怪, 为什么只有前面两个字飘红了? 再试了下 “开星”, 能纠成 “开心”, 看来是按纠错词来给出建议的, 只标记纠错的部分? 为了验证这一想法, 再试了下 “开心不开星” 这样的纠结查询, 果然. 但是回头当我用 “kaixin”, “kaixing”, “kaixinwang” 再实验的时候, 感觉这个又不是很确定了. 今天在某群里, 一群无聊的人在试各种各样奇怪的查询, 比如 “小泽玛利亚”, 华丽丽的被提示每个字都是屏蔽字, 有了前面分析的结论一, 我们知道这其实是因为这五个字有机结合的时候才被屏蔽的, 但是纠错呢? “小泽玛莉亚” 就丝毫没事, 也不提示我们正确的写法, 抑或这种译名某家也没有说确定哪一个才是正确的? 再试试看 “xiaozemaliya” 呢? 也还是不提示, 仔细看了下, 我用的确实还是简体中文的 .com.hk, 按理应该跟 .cn 逻辑一样啊, 也不给纠错提示, 太失望了, 难怪某家占有率一直上不去, 这种淫民大众的基本需求都满足不了. 但是 “小澤瑪利亞” 这个, 却能飘红 “玛利亚”, 这个让我表示比较理解困难, 同理, 用 “小澤玛丽亚” 会提示 “小澤玛利亚” 并标红 “玛利亚”, 而且搜出来的结果中大多也是简体 “小泽玛利亚”, 这个同样理解困难, 某家的拼接术太强了.

后记, 这些乱七八糟的分析足以见得 IT 民工们都是多么的无聊和猥琐, 连测试用例都这么的圈圈叉叉. 不过另一方面来说, 优秀的 IT 民工还是应该刨开口水战, 去分析看看真正的技术细节是怎样的, 今天发了个搜 “百度” 出 “www.google.cn/sh2009” 的广告截图发出来, 那些喷子们却又一个都不敢说话了, 果然只是一群不值一提的喷子. 截图见 http://att.newsmth.net/att.php?p.26.804632.482.jpg, 怎么弄出这个效果各位自行分析 :)

统计学时代

// 友情提示, 本文又意识流了, 不喜欢这种风格, 不想大脑被打结的请绕行

昨天跟着一群无聊的人一起看腾讯 QQ 在线超过一亿, 峰值大概是 103.29M 的样子, 又是一个新的统计学时代的标记.

一亿同时在线, 意味着什么? 就算我们考虑上那些无聊开 N 个 QQ 挂着的, 就算考虑上那些开着 QQ 但是人不在电脑前面的, 就算加上越南版南非版等大部分人闻所未闻的奇怪版本, 这个数字还是异常夸张的. 同时还可以看到 QQ 游戏最高有 625 万同时在线, QQ Live 最高有 301.9 万同时在线. 在对特殊个体提供服务的同时, 很多策略都更多的是考虑大部分人的需求了. 拥有这么大的用户群, 真的是插根筷子都能发芽, 竖根扁担就能开花. 看看 QQ 影音, QQ 拼音等产品现在的装机量, 再想想现在腾讯还在憋的那些产品, 包括已公开的包括影像医生, 和只是招聘信息里泄漏出来的杀毒产品, 真的只能感慨以后除了微软, 是不是整个桌面都会交给腾讯? 至少目前, 我的机器上的绝大部分都被这两家占据了, 操作系统用 Windows7, 办公软件用 Office 2010, 杀毒用 MSE, 听歌用 WMP, 沟通用 TM, 输入用 QQ 拼音, 看电影用 QQ 影音, 下东西用 QQ 旋风, 管理软件用 QQ 软件管理器, 为了应付大陆太过猖獗的流氓软件而用 QQ 医生, 不多的非 M 非 T 的有 Chrome (虽然我也同时用 IE8), SecureCRT (这个没找到好的替代品), WLM/Hi/LibFetion 几个 IM, Adobe Reader, 7zip, 金山词霸 (这个其实用的少了, 只是装着)

前面那些都是没有联系和实际意义的感慨, 真的感慨是在实际的数据上做了这么久的数据挖掘和机器学习后改变的世界观. 以前总以为学习应该是攒够感性认识后再积淀抽象成理性认识这样的过程, 而经典的知识大部分确实都是这样得来的, 而以前所谓的量变引起质变, 说的大概也就是这么一回事. 但是在信息爆炸数据狂潮里, 要想再这样从感性认识提升到理性认识这个过程实在是太慢了, 我们需要大规模的数据挖掘和机器学习方法来加速这个学习过程, 而这个过程给我的感觉更多是不可控的 :( 并不是说我不明白里面的原理, 特征, 拟合方法等完全看不懂, 而是在海量数据上, 直观感觉往往并不靠谱了, 加上数据分布和数据噪声可能远不是我们想象的那样, 直观上的感觉在最后只会错的更离谱.
按照官方的报告, 中国大陆网民已接近四亿, 其中百度的用户有 80%, 那么保守估计一天里会有至少一亿独立用户会访问百度并进行搜索, 这里说的是一亿的独立用户, 他们的搜索行为绝对远不止一亿, 那么在这一点上, 每天积累的用户数据也是难以想象的海量. 互联网发展到现在, 包括信息检索等技术发展了这么久, 很多直观的规则系统都已经被几乎榨干了潜力, 再想提升就只能去分析用户们各种行为下暗流涌动的奇怪特性, 从而提供更贴近大多数人需求的服务. 这里有一个比较有意思的点, 正如最前面说腾讯的时候说道的, “大多数人需求”. 到了这样一个统计学意义上, 除非一些特别恶劣的特殊情况需要保证一定要纠正, 剩余的已经不能拿抽样来很好的说明问题了, 除非抽样能足够大, 而且抽样后的评估也能完全模拟千奇百怪的网民行为, 否则抽样并不能很好的说明问题, 而最终反应在统计层面上的使用率等才有参考意义.

刨开那些简单的用规则和用机器学习实现没区别的简单特性, 在超大规模的数据下, 越来越觉得机器学习的不可控性越来越大, 很多直观的想法一经实现都会发现只有负面效果, 而很多无心插柳的改进都很不好从前往后推, 只能从结果来分析原因. 我讨厌这种不可控的感觉, 虽然很多时候可以解释成我们的想法太 geek 太高端, 虽然说我们已经努力降低 IQ 下限去站在最广大网民的角度去思考问题但是还是不够, 但是, 在一直出现与预期相差甚远的结果时, 总还是会有那么一点抓狂那么一点沮丧. 虽然还是坚信这个世界总是可以通过可以描述的规律来解释其运转的, 但是发现这样的规律已经越来越飘渺, 越来越不被我等凡人所能理解和掌控.

在互联网这个用户可以完全放心用鼠标和键盘投票的地方, 好和坏还是很容易区分的. 在把基于规则的经典方式做到极致后, 只能通过引入基于学习的方法来提升效果, 而在极致上再做调整, 任何的扰动可能都会带来无法想像的后果. 一直认为, 企业如果需要建立在海量用户上, 那么用户信息便是一个绕不开的巨坑, 此用户信息不一定是用户的具体隐私信息等, 而只是一些使用习惯或其他的行为统计数据, 而且这些数据应该是非特定指向的, 即里面的每条信息的置信度大致一样 (由于需要处理作弊等特殊情况, 不能说完全同等置信度, 或者说经过数据清洗后, 置信度会完全一样). 像 Google 百度这样有传统的搜索引擎很难撼动就在于其拥有的用户数据太多, 很多可能带来扰动的因素都已经被他们纳入机制内, 而后来者如果需要追赶, 也只能是走一样的路, 但是在市场已经有领头羊, 这些数据是否还能有同等置信度就很难说了. 比如谷歌中国累积的那么多数据, 是否就能推广到 80% 以上的中国网民上? 用大多数是受过高等教育, 且学术和政治倾向明显的用户产生的数据来推广, 也只能在同类用户群上获得更好的效果吧?

把视野放开来, 在 SNS 上如果进行充分的数据挖掘和学习, 最终对用户的反馈到底会是怎样? 是会由少部分的先进生产力带动整体, 还是大多数的白痴会传染以致整体越来越白痴? 不过应该还好, 他们的一些基本规则还能在机制里生效, 很多底线最好还是不要过的好. 在桌面软件领域, 如前所说, 腾讯的那么多用户可以一直很快乐的做小白鼠, 在给腾讯提供足够的直接反馈的同时也在统计意义上给出更多的功能取舍选择, 微软和 Google 经常说取消某功能的理由也是 “绝大多数用户不用而且这个功能确实没太多用”, 在这样的迭代速度下后起之秀们估计很难壮大起来了, 毕竟现在技术壁垒已经越来越低, 而用户和数据壁垒越来越高, 而且只要有壁垒的一方不自杀, 那这个壁垒只会继续高下去, 而丝毫不会降低.

就在写到这里的时候, 抽开去看了下说 “360 安全恐吓” 的无敌招数, 这个也算是一个学习和规则并存的产物吧, 看多了 QQ 群里 “xxxx 就送 10 QB” 这样的骗子自然知道是骗子, 但是就这种雉还是会越来越多, 那么从统计意义上这个方式就还能继续生效, 然后只要对这样的方式进行微调, 也许又可以推广到别的领域继续兴风作浪 (比如 360 的安全恐吓?).

在用户的整体素质没得到提高之前, 统计意义上为贴近用户的改进大多还是只能让用户的整体素质越来越低, 做的越好用户则越脑残, 而研发人员只能跟着越来越脑残, 因为统计只能统计过去, 无法预测将来. 而只有在新规则推动下才可能带来革命性的进步, 比如在 iPhone 之前触摸操作为什么就没法这么普及? 比如 Gmail 出现前为什么邮件就必须是一封一封的组织而不是会话模式? 还有 Tag 之类的功能, 无法仔细考究谁提出谁推广. 一般的企业会在已有规则上墨守成规最后把自己做死, 稍好的会在已有规则上用统计学习去让已有规则领域做到极致, 而真正能长盛不衰的企业应该是用新规则去开拓新领域, 等把开荒的暴利赚够后把这个领域扔给后面的二三流企业跟进, 自己再去开辟新时代. 做技术做科研同理, 在攒够二三流能力之后还是需要去努力创新开辟新领域, 这才是傲视群雄的霸气. 以上, 与君共勉.

Ubuntu 下多网卡配置自动网关

本文纯属转载, 原文: http://yiding-he.javaeye.com/blog/244943

在公司台式机上折腾了个 VirtualBox, 装了个 Ubuntu 9.10 Server, 为了上网同时开了 host-only (主要是可以分配到个固定 IP, 方便主机连), Bridge (方便公司内其他人访问用), NAT (上外网用, 不过现在不用认证了其实这个没啥意义了), 三网卡的壮观就在于经常流量不知道从哪个网卡出去了, 导致访问不到外面, 该死的自动网关…

按上文提到的方法, 直接用个 sudo route add default gw 172.*.*.* (* 处似乎算机密?) 就可以了, 一试果然