一年以来只写了一篇博文,中间有很长一段时间服务器老是出问题,最后终于把网站搬到了Dreamhost,有了固定处所,不再颠沛流离了。
2011年在年初时候在家休息调整了有2、3个月时间,玩iPhone,玩Mac。在3月底通过朋友的推荐,来到了无线唯科负责彩像事业部。
亿腾泰科磕磕绊绊走的还行,希望新的一年有新的发展。
Q4的时候,“联络”项目形态逐渐成形,每天都为了它兴奋激动,和几个伙伴合计准备好好大搞一番。
希希每天都在成长,已经能说会道开始要慢慢变成小话痨了,幸福的童年好好享受吧。
2011-12-31
别了2011
2011-11-02
本地连接消失了
前几天家里的台式机系统中的"本地连接"突然就消失了,新出来一个"本地连接2",无法上网。症状为:DHCP分配不到地址,设静态IP地址后,能访问接在同一交换机上的另一网络设备的samba服务,但ping网关路由器不通。发现有时候重启之后"本地连接"又出来了,就一切正常了,但得靠运气,不太靠谱。今天运气不好,重启两次都没管用,仔细检查,发现"本地连接2"的MAC地址都是0,于是随便填了一个,然后就一切太平了。
2011-01-24
别了2010年
我个人在2010年最大的一件事情是临近年终时将公司绝大部分股权转让出去,退居二线,引入了包括总经理在内的新的管理团队。这个公司是我一手创办起来的,对它注入了深厚的感情,到2010年年底时人数已达60多,但我并没有舍不得,只有向前看才有更大的发展。希望在2011年能轻装上阵开创一个新的局面。
2010年起先上的比较多的网站是开心网,看看转贴,偶尔玩玩小游戏。后来上Twitter,知道了一些异见人士。现在看的比较多的是新浪微博,主要关注了技术、创业、媒体的一些人。计划2011年开始深入关注SNS、移动互联网、云计算、智能终端应用等领域。
这一年感觉过得特别快,希希都已能独立稳稳当当走好几步路了。
2010-12-30
PHP的mysql模块引起的3221225477错误解决
在windows上,MySQL 5.1中的libmySQL.dll与PHP 5.2.14中的php_mysql模块不兼容,导致3221225477 (0xC0000005)进程退出错误,可以将PHP安装包中的libmySQL.dll复制到apache的bin目录中,重新启动服务就可解决。
2010-10-22
windows下smarty中的date_format格式化乱码问题
环境:Windows XP Professional SP3中文版,Apache 2.2,PHP 5.2.14,smarty 2.6.18
代码:<{$time|date_format:"%Y年%m月"}>
输出:乱码如:2010年%m月�G
原因:默认的locale是
LC_COLLATE=C;LC_CTYPE=Chinese_People's Republic of China.936;LC_MONETARY=C;LC_NUMERIC=C;LC_TIME=C
解决方法:在调用smarty前用 setlocale(LC_CTYPE, "C"); 把LC_CTYPE设置成"C”就可以了。
windows下smarty中的date_format格式化乱码问题
环境:Windows XP Professional SP3中文版,Apache 2.2,PHP 5.2.14,smarty 2.6.18
代码:<{$time|date_format:"%Y年%m月"}>
输出:乱码如:2010年%m月�G
原因:默认的locale是
LC_COLLATE=C;LC_CTYPE=Chinese_People's Republic of China.936;LC_MONETARY=C;LC_NUMERIC=C;LC_TIME=C
解决方法:在调用smarty前用 setlocale(LC_CTYPE, "C"); 把LC_CTYPE设置成"C”就可以了。
2010-08-12
Patch for anonymous’ comments bug on drupal
You may allow anonymous post comments on drupal system by granting those rights to anonymous roles. But there is a bug which preventing the anonymous’ comments to display with the posts or in the comment block. You could apply the patch below to fix the bug. It should work for version 6.16 to 6.19.
Index: modules/comment/comment.admin.inc
===================================================================
--- modules/comment/comment.admin.inc (revision 281)
+++ modules/comment/comment.admin.inc (revision 282)
@@ -57,7 +57,7 @@
array('data' => t('Time'), 'field' => 'timestamp', 'sort' => 'desc'),
array('data' => t('Operations'))
));
- $result = pager_query('SELECT c.subject, c.nid, c.cid, c.comment, c.timestamp, c.status, c.name, c.homepage, u.name AS registered_name, u.uid, n.title as node_title FROM {comments} c INNER JOIN {users} u ON u.uid = c.uid INNER JOIN {node} n ON n.nid = c.nid WHERE c.status = %d'. tablesort_sql($form['header']['#value']), 50, 0, NULL, $status);
+ $result = pager_query('SELECT c.subject, c.nid, c.cid, c.comment, c.timestamp, c.status, c.name, c.homepage, u.name AS registered_name, u.uid, n.title as node_title FROM {comments} c LEFT JOIN {users} u ON u.uid = c.uid INNER JOIN {node} n ON n.nid = c.nid WHERE c.status = %d'. tablesort_sql($form['header']['#value']), 50, 0, NULL, $status);
// build a table listing the appropriate comments
$destination = drupal_get_destination();
@@ -215,7 +215,7 @@
* The comment do be deleted.
*/
function comment_delete($cid = NULL) {
- $comment = db_fetch_object(db_query('SELECT c.*, u.name AS registered_name, u.uid FROM {comments} c INNER JOIN {users} u ON u.uid = c.uid WHERE c.cid = %d', $cid));
+ $comment = db_fetch_object(db_query('SELECT c.*, u.name AS registered_name, u.uid FROM {comments} c LEFT JOIN {users} u ON u.uid = c.uid WHERE c.cid = %d', $cid));
$comment->name = $comment->uid ? $comment->registered_name : $comment->name;
$output = '';
@@ -287,7 +287,7 @@
comment_invoke_comment($comment, 'delete');
// Delete the comment's replies
- $result = db_query('SELECT c.*, u.name AS registered_name, u.uid FROM {comments} c INNER JOIN {users} u ON u.uid = c.uid WHERE pid = %d', $comment->cid);
+ $result = db_query('SELECT c.*, u.name AS registered_name, u.uid FROM {comments} c LEFT JOIN {users} u ON u.uid = c.uid WHERE pid = %d', $comment->cid);
while ($comment = db_fetch_object($result)) {
$comment->name = $comment->uid ? $comment->registered_name : $comment->name;
_comment_delete_thread($comment);
Index: modules/comment/comment.module
===================================================================
--- modules/comment/comment.module (revision 281)
+++ modules/comment/comment.module (revision 282)
@@ -936,7 +936,7 @@
if ($cid && is_numeric($cid)) {
// Single comment view.
- $query = 'SELECT c.cid, c.pid, c.nid, c.subject, c.comment, c.format, c.timestamp, c.name, c.mail, c.homepage, u.uid, u.name AS registered_name, u.signature, u.signature_format, u.picture, u.data, c.status FROM {comments} c INNER JOIN {users} u ON c.uid = u.uid WHERE c.cid = %d';
+ $query = 'SELECT c.cid, c.pid, c.nid, c.subject, c.comment, c.format, c.timestamp, c.name, c.mail, c.homepage, u.uid, u.name AS registered_name, u.signature, u.signature_format, u.picture, u.data, c.status FROM {comments} c LEFT JOIN {users} u ON c.uid = u.uid WHERE c.cid = %d';
$query_args = array($cid);
if (!user_access('administer comments')) {
$query .= ' AND c.status = %d';
@@ -957,7 +957,7 @@
else {
// Multiple comment view
$query_count = 'SELECT COUNT(*) FROM {comments} c WHERE c.nid = %d';
- $query = 'SELECT c.cid as cid, c.pid, c.nid, c.subject, c.comment, c.format, c.timestamp, c.name, c.mail, c.homepage, u.uid, u.name AS registered_name, u.signature, u.signature_format, u.picture, u.data, c.thread, c.status FROM {comments} c INNER JOIN {users} u ON c.uid = u.uid WHERE c.nid = %d';
+ $query = 'SELECT c.cid as cid, c.pid, c.nid, c.subject, c.comment, c.format, c.timestamp, c.name, c.mail, c.homepage, u.uid, u.name AS registered_name, u.signature, u.signature_format, u.picture, u.data, c.thread, c.status FROM {comments} c LEFT JOIN {users} u ON c.uid = u.uid WHERE c.nid = %d';
$query_args = array($nid);
if (!user_access('administer comments')) {
2010-08-10
七年之痒
2010年6月大学同学举行了毕业十周年同学聚会,时间如白马过隙,人生有几个十年啊。可以说这个十年是人生中最一个黄金十年了,而回首往事,却发现自己好像虚度了。
2000年7月毕业进入新浪,那时还是叫四通利方,在万泉河小学的几层楼里,每天上午都能透过窗户看学生们升旗、做早操。当时我在研发中心参与新浪点点通SinaTicker的开发,SinaTicker是一款可以滚动显示新浪新闻的软件,还集成了新浪股票、邮件、SinaPager服务。后来打杂做了较短一段时间发布系统的部署等零活,再转做新浪的IM软件SinaPager。新浪那段时间变动挺多,起先是扩张,2001年互联网冬天的时候裁员。我做SinaPager的时候有段时间已是我一个人在做了,对整体架构重新构建的同时,那段时间对ATL、COM/DCOM比较着迷,用DCOM做了更新一版的集成SinaTicker和SinaPager的统一客户端,可惜那时自从王志东时代之后公司对客户端已经不太重视了。再接着转做Sina Online(SOL),是个集成拨号器的IE内核的浏览器。至2002年10月离职,在新浪的2年多时间,感觉有很大的自由度,做了很多东西,虽然没有太大的成绩,但个人得到了很多的锻炼,还是有点小小成就感的。缺憾的是在新浪的那段时间感觉没有导师做更好的指导,自己自由发展可能看不准方向,容易长歪了,不是正途。
从大三大四时候开始我就在外面找软件开发的兼职了,贴补生活费用的同时也见识了很多。那时候去过清华学生创业公司,还跟人去忽悠丁磊找项目做。出去玩玩还真是挺不错的,好过在宿舍无聊看电视打游戏。刚毕业在新浪工作的时候,比较拮据,也试图在外面找零活做过,后来在一家做电信软件的公司做过一段较长期的兼职。
2002年9月我就是通过做一个兼职项目接触了一个韩国老板,由此从新浪离职后与另一个同事到韩国工作了有2个多月时间,终于在圣诞节前回了北京。然后开始参与组建BTB Wireless中国分公司。那时BTB的主要项目是做智能手机或PDA上的手机浏览器,还有铃声图片等移动增值业务。在中国公司这边,开始我主要负责KVM产品和linux浏览器产品,KVM产品在三星的第一款linux手机i519上成功发布。2003年初,公司准备在symbian上做浏览器,我提出了开发平台无关的浏览器引擎。到8月份,中国这边正式分成两个division,一边是做SP服务和外包系统维护服务,我这边是mobile solution division,负责手机浏览器产品。我们努力自己开发整个平台无关的手机浏览器引擎,当时我们成功地在linux、windows、symbian、smartphone等多个平台上运行了这个浏览器,后来还移植到了CDMA的feature phone上。到2005年6月公司最后决定停止了浏览器产品项目,直接原因是一直得不到正式的商业应用。很可惜,我们4个人2年时间的投入,最后得到的还是个并不特别稳定的半成品。
浏览器产品部门解散后,2005年7月我转入公司刚开始的葡萄音乐网任副总。这是个不小的转变,从做软件转向做网站,从技术管理转向做高层管理。考虑了一段时间后决定迎接这个挑战。最早在大学开始我就伴随着网络成长,大学时的telnet的BBS,到新浪的网络软件,到浏览器的开发,其实和网站都有莫大的关系。之前觉得做网站没有技术含量,但后来对大容量高并发集群服务很感兴趣。我真正做互联网是从葡萄开始的。但实际上在葡萄音乐网期间我并没有做出成绩出来,最后葡萄音乐网由于版权纠纷而关张,我也于2007年7月离职走上创业之路。
从2000年到2007年这7年,我从工程师成长为副总,不乏自己的努力,对技术的深深的热爱。但我感觉我走的这条路,有点太曲折了,薪水职位的上升与能力的上升并不同步。相对来说当年在新浪还是比较有成长环境的,管理等比较正规,有培训机会,也有很多锻炼实践机会,也许我在新浪能安心再奋斗几年的话,可能发展会更好一些,当然如果有比较好的导师的话就更完美了。又或者如果我能在这7年里能去学个MBA之类的,也许也会使自己的发展之路更坚实一些。不过现实就是现实,这7年下来,的确自己应该好好做个职业的转变了。无论自己是否真的准备好了,创业的机会就在眼前,只待放手一搏了。
2010-08-09
创业三年之2009年
公司在2009年继续以每年翻番的速度扩张,年末时在编正式员工数已经达到30人,加上合同工和实习生已经有40人了。各部门组织架构也已较为成熟,有组织明晰的研发/测试部门、产品/市场/销售/设计部门、运营部门等三大业务部门,加上行政/财务后勤辅助部门;以CEO、市场/销售副总、研发总监、副主编组成高层管理层。
由于原CEO因故需在家较长期休养并之后离职,我从2008年11月就开始复任CEO,主要负责管理、行政、财务等工作。这一年的主要变化和成果有:
1. 以运营部门为先行,推动所有业务部门实施了绩效考核制度。
2. 与项目合作方共同商议决定,我5月份开始实际操作合作项目管理。在接下来的半年时间里,我主要推动了目标导向机制,以S.M.A.R.T.方式制定客观目标,推进产品管理、运营管理的考核。
3. 2009年的项目目标成功达到,客户终验时又一次得到高层领导和项目组的极大肯定。项目在业绩也达到了相当的影响力和知名度。
4. 完善财务预决算机制,制定可执行的预算表,加上员工信息管理、工资管理等,形成简单实用的内部财务管理系统。财务出纳机制基本定型。现金流情况也得到很大的改善,不再为生存问题时刻担忧了。
5. 研发部门的两个研发组,加QA组,已稍具规模。技术总监一职在2009年4月开始也由专人担任,不再由我兼任。技术总监也是同学,是我少数几个比较看重的技术人才之一,由他掌舵技术部门之后我轻松了很多。
这一年的主要问题有:
1. 没有在大好形势下勇于拓展新的业务领域,并切实实施。每个稍具眼光的人都会指出公司的项目单一,但我们同样在最初就已意识到,但却像在温水里的青蛙一样没有把危机感真实地落实到现实中并转化为动力。我作为公司的CEO无疑具有不可推卸的责任。
2. 高层管理层之间的沟通太少,公司核心层实际上可以说是一盘散沙,没有高效协作可言。
3. 人员扩张使的同时,我开始完全放权给中层领导,按说在较成型的公司都是这样做的,但实际上创业型公司的组织架构应该更扁平化,这样才更利于巩固公司队伍,凝聚公司文化,提升决策效率。到后来有些员工我很少和他们谈话,有时候甚至连名字和人都对不上号了。
4. 组织没有得到更优化配置,有因人设事情况。此情况出现在产品/市场/销售/设计部门,实际上该部门还负责了一部分的运营工作,如果不具体考察人员情况的话,会觉得很怪异。按此模式进行,该部门将有可能出现发展瓶颈。
2009年华丽丽的过去,公司热热闹闹的包下一个咖啡厅办了年会,按例又请到了客户的高层领导到场给我们加油鼓劲。没吃多少东西,大家就纷纷过来敬酒,那天我喝醉了。
创业三年之2008年
2008年确立了与研究院长期合作的意向,我也找到了两个大学同学,以赠送股份拉入伙,这样我们三个人以一位负责技术,一位负责管理行政财务,一位负责市场销售的合作方式开始了公司的新的一页。
起初三个人意气风发,各自在负责的一块领域拼搏,打算就此干下一番大事业来。2008年,我们的业务已从最初单纯的开发升级为开发、运营、设计、测试等较为整体的解决方案提供,业务水平也算突破简陋的小作坊而进化为稍正规的小作坊了;公司也形成了一定的文化特质:平等、活力、创新;与客户的合作关系进入热恋期,两方面的团队成员打成一片,工作进展顺利;公司的员工趋于稳定,人数翻番,当时的一些员工1年之后就上升为中层领导了,为以后的人力资源扩张打下了良好的基础;财务行政能力也得到了本质上的改善,有了专业的会计和专职的行政人员。
但2008年也暴露出我们管理的问题来,我虽然之前做过高层管理,但基本可以说还是一窍不通。我觉得主要问题在于:
1. 缺乏核心的领导者。按说我作为创始人和最大股东理应担负起这样的责任来,但我自知没有系统成熟的管理理论实践经验,在此问题上我退缩了,我担起了CTO和董事长的角色;然后因为我因为实际情况还是更有威望,而担任CEO的同学又太nice了,被我们两个性格比较强势的人压得无法正常行使CEO的权力来,最终使得他打了退堂鼓。
2. 缺乏管理经验。三个人都没有经过系统成熟的高层管理培训,都在摸着石头过河。读个有用的经管课程对于成长为一个好的领导者还是非常必要的。
3. 没有建立起良好的高层架构和沟通机制。三个人合作,在没有形成核心的状况下,职责定义不是特别明确,沟通协调起来颇为困难,每个人按照自己的处事方式随性行事,感觉有点一团乱麻,三个人无法形成合力。定期沟通会议也不能有效解决问题,经常对提出的一件事各持看法,吵吵个把小时,最后的结果就是此事由谁负责,还是让他自己决策,这样即使是个小事情也要耗费三个人好长的时间。
但无论如何,2008年公司打下了一个较为良好的基础,上了一个台阶。2008年10月,公司也搬到了宽敞明亮的办公楼里,交通非常方便,正面就是燕京八景之一的蓟门烟树,几乎每个来访的客人都会站在会议室的落地窗前感叹环境真好。