2012年10月2日

轻量级时间管理方法:番茄,我来了

这两天关注了一下番茄工作法,这个方法属于时间管理策略中轻量级的方法。以前学过最简练的时间管理方法是先列出待办事项,然后排序,然后全力完成前三项。列出待办事项时需要考虑两个维度:紧迫程度和重要程度。完成紧急和重要的事情后务必要抽一点时间完成重要而不紧急的事情。

 

个人感觉时间管理策略中重量级的方法是Getting Thhings Done套餐。如果严格执行会产生非常好的效果,等过一阵子我再开始琢磨一下这个方法。

 

轻量级的时间管理方法个人觉得当属番茄管理方法。读了一些很好的博文,看了番茄工作法发明人的简练的小册子,弄了个简单的思维导图和大家分享。这本书后半部的阅读以及这个思维导图的制作都是按照番茄工作法完成的。深感效率很高。继续琢磨和实践中.........

概要图如下:

Otline

 

详细的大图如下:

Detail

2012年9月30日

2012年9月17日

第一次被大小写转换的sed命令坑了

昨天需要紧急测试一组翻译结果的得分,其中一个步骤是需要把一个文件每行的首字母大写。

网上查了一下sed脚本,参考的两个网页是

http://www.51testing.com/?uid-375540-action-viewspace-itemid-232269

http://www.pyshell.com/index.php/archives/699

得到的答案都是一致的  sed 's/[a-z]/\u&/'

简单测试了一下,也的确没有问题。

但是,这个小小的步骤导致最终我测试的结果都比正确答案少了10%左右的得分。

同事使用的首字母转大写的命令是   perl -ne 'print ucfirst($_);' inputfile > outputfile

仔细对比了多组结果,发现上面的sed命令存在Bug,因为sed 's/[a-z]/\u&/'实际上是将一行文本里出现的第一个小写字母转换为大写。

正确的sed命令应该是sed 's/^[a-z]/\u&/'    [a-z]前面加入的^表示匹配行首。

总结教训,以后再遇到网上找到的shell命令需要仔细的查看并测试后再用,否则很耽误工作啊。

2012年9月15日

Thunder-Decoder加上了Binarization功能

终于给我的层次短语模型翻译系统Thunder-Decoder加上了Binarization功能,一句话概括就是在内存中保留仅能完成源端Parsing的短语表的Trie树结构,将能完成目标端翻译的短语表特征和翻译存放到硬盘上,硬盘上的数据是内存中短语表Trie树中各个叶节点对应的内容。硬盘上的数据只有在需要的时候才会加载到内存中。翻译一定的句子后即可释放掉加载的硬盘数据。这样做的好处是可以让翻译系统在面对非常巨大的短语表时,可以自如应对。


这是我第一次实现类似的机制。为了尽量减少对其他库的依赖(例如Boost的序列化库),我自己实现了相应数据的序列化和反序列化。这个过程中犯下过一个起初不易察觉的低级错误,那就是直接把c++的string数据直接存到硬盘上。实际上存入的只是string的指针变量。如果程序中相应的string数据还未清空的话,fread回来后查看原先的string,居然还是完全正确的。发现这个Bug是在清空完数据后重新fread进来数据,再打印string的内容就变的千奇百怪了。


String数据的序列化需要先存入string的长度值,随后再存入string对应的内容,反序列化则是先读出长度值,根据长度值来读出string的内容。


后续还需要进行一下大规模测试。这次十多天的折腾受益颇多。感谢这个折腾我的Thunder-Decoder。

2012年9月8日

读书的习惯需要好好培养

我很喜欢读书,但读书的方法一直不得要领。小学时因为爱躺在床上看《故事会》眼睛早早的近视,初中毕业的那个暑假在市图书馆借阅了很多古龙的小说,高中看了很多《青年文摘》。真正开始读书,是进入大学,在图书馆的茫茫书海里徜徉的感觉非常好。
前不久看了一本书《如何阅读一本书》里面讲述的方法非常不错,一句话概括就是读书不能从头到尾一字不拉的精读,需要掌握书的逻辑和结构。
最近在看未鹏的《暗时间》,书中讲述了他阅读了大量关于人类思维书籍的过程。今天看到博客“战隼的学习探索”(http://www.read.org.cn/)作者的另外一个博客“读书笔记”里“每天一本书计划”(http://www.write.org.cn/plan-a-book-a-day)里那些FAQ式的内容,都是在讲述他如何读书以及如何抽时间读书的事情。再联想到我前不久认识的一位同事(现在回到北京IBM工作了)的读书方法:用Kindle每次批量阅读主题相关的书籍。这三个人的方法有共同点,就是大量读书,而且按主题阅读,并注意记录阅读心得。
接下来,我也想读书,我用Kindle陆续读完了七八本书,但读书的方法需要加强。恩,从现在开始吧。
引用一下战隼在“每天一本书计划”(http://www.write.org.cn/plan-a-book-a-day)结尾的三句话:

1、如果你只愿意去做轻松的事.生活就是艰难的。 但如果你愿意去做艰难的事情.生活就是轻松的

2、如何真的想做一件事,你一定会找到一个办法。如果不想,你也一定能找到借口

3、影响结果的不是斗志,而是科学

2012年8月18日

DeepLearningC++ Plan

想基于DeepLearning中的核心技术AutoEncoder来做点东西,网上找了半天的可用代码,绝大多数都是Matlab或者Python的,唯一C++版的deeptorch又是基于另外一个库的二次开发,太复杂了,似乎是把复杂的牛刀。用别人的库的最大问题就是很多细节都无法掌握,而且不容易根据自己的需要来修改。无奈之际,还好基本原理都懂了,那就从基本的BPNN开始写一个C++版的用于NLP的DeepLearning库吧。打算从Hinton的2006年Science论文开始实现AutoEncoder,随后Recursive AutoEncoder,最后是Recursive Graph Transformer。最终目标是用于SMT。

2012年8月6日

推荐两道菜肴:手撕豇豆和西芹牛柳

这两日尝试了两道新菜肴,口感很好,做法也很简单,推荐。


手撕豇豆

用料  

豆角  猪肉馅  
老抽   生抽   
料酒  花生油  
葱姜 几片  
鸡精    

做法  

  1. 1.肉馅加少许老抽,生抽,料酒腌制20分钟待用。(腌制的时候,加入调料后要用筷子乱拌,不可顺一个方向搅拌上劲。那样炒出的肉糜就成了肉球,不散了。)手撕豇豆的做法 步骤1
  2. 2.豆角洗净从中间切一刀,下热水里焯熟。(水开后焯5分钟左右,可尝一下,彻底没有生味即可)手撕豇豆的做法 步骤2
  3. 3.捞出后立刻浸泡凉水。控干水份后,用手把豆角从中间撕成两半(我女儿帮撕的,她说从细的一断撕要比从粗的那断撕容易些)手撕豇豆的做法 步骤3
  4. 4.锅里热油,下葱姜爆香,入腌制好的肉馅,立刻划散,不停的翻炒均匀(我忘记拍照片了),盛出备用手撕豇豆的做法 步骤4
  5. 5.用锅内剩的底油,加蒜末爆香,放入豆角,翻炒2分钟。再放入炒好的肉馅,再调入盐,鸡精出锅即可手撕豇豆的做法 步骤5

 


西芹牛柳

 

 

 

 

 

 

 

 

 

 

 

 

 

食材明细

  • 西芹 适量
  •  适量
  • 蚝油 适量
  • 料酒 适量
  • 酱油 适量
  • 淀粉 适量
  • 五香粉 适量
  • 香油 适量
这是一道很家常的菜。但是味道很鲜美,营养价值非常高,很适合糖尿病,高血压人群食用。在过年期间吃大鱼大肉的同时上一道这样营养丰富的菜也是不错的。
  • 1

    牛肉切成条【我切的是片】。
  • 2

    牛肉放入辅料腌制20分钟。
  • 3

    西芹切成片。
  • 4

    在水中放入盐和几滴油,水开后把西芹焯水。
  • 5

    锅中放油,烧热。
  • 6

    下入腌制好的牛肉煸炒至变色盛出。
  • 7

    锅中留底油爆炒西芹。
  • 8

    放入煸炒好的牛肉,炒拌均匀即可出锅。

 

 

2012年8月5日

孙杨的1500米自由泳纪录14.31.02

14.31.02

祝贺sunyang,全程都是一根他自己以前创造的WR的黄线跟在后面,而且越往后拉开的距离越大,何其壮哉!

2012年8月4日

生活或者生命就是不断微创新式的增删改诸多个人小循环系统

生活或者生命就是不断微创新式的增删改诸多个人小循环系统,例如每周六清晨的大扫除和不定期的捐赠洗净的旧衣物能让生活中增加新陈代谢的机制并感受到<冬吴相对论>里的那种扫除的力量

2012年8月3日

专注和持久力是最好的老师

爱因斯坦有句名言:“兴趣是最好的老师。”这话似乎不对,应该是“专注和持久力是最好的老师”,因为单凭兴趣难以坚持下来。后者符合最近流行的一万小时定律,也是 @刘未鹏pongba 的《暗时间》第一章强调的观点之一。开始收敛兴趣,转向专注。希望这个道理的领悟还不算晚。

2012年8月1日

测试一下ScribeFire的Blog发布系统

在Chrome里安装了这个Blog编辑插件,试试效果如何。

2012年7月28日

入手三台6T WD My Book II,折腾两天,彻底搞定定期备份事宜

前一阵子,我们组之前最好的服务器Lavender1的四块硬盘坏掉一块。恰好,我的几乎全部实验数据都在这块盘上。前后耗费两个月时间委托一家非常专业的数据恢复公司来帮我恢复数据,最终结论是这块盘顺坏太严重,无法恢复。为此,数据备份事宜再次在我的平时工作中提高了优先级。

为了解决这个问题,我得到了一块2T的移动硬盘来备份相关数据,但随着最近琢磨新的翻译系统,需要备份的数据超过了2T大小。最终买了三台目前能买到的最大备份硬盘,牌子是WD My Book Studio Edition II,每台都是6T大小。从准备买到拿到这三个盘又花费了一个多月的时间。其中原因主要是因为研究所相关的财务审批和购买流程比较严格。

拿到硬盘后查看说明书,糟糕,这中硬盘居然只支持Windows和Mac,而且默认的磁盘格式居然是Apple的HFS+。我主要的备份目的就是用在Linux上。怎么办?我发现我越发像一个Geek了,网上查了大量的解决方案,折腾了好几种办法后,最终我自己瞎琢磨试验成功了一种方法,哈哈,而且这种方法对于WD My Book II居然没有人弄过。特备份和分享如下:
---------------------------------
将硬盘连到Mac笔记本上,打开磁盘管理工具,将硬盘格式化为exFat。然后就可以直接在Linux、Windows、Mac上都能使用了。
---------------------------------

其实还有一种办法就是在Mac的磁盘管理工具里将硬盘的磁盘日志功能关闭,只是我一直没能成功,意外的发现重新格式化为exFat(Fat32的升级版,支持闪存很好)就可以了。


我的Ubuntu系统有个Bug,就是不能识别超过2T大小的硬盘。再次Geek了一下,网上下载Linux内核源代码修改了一个地方后重新编译Linux内核就可以了,详细log如下
-----------------------------------
sudo apt-get install hfsplus hfsutils hfsprogs
sudo rmmod hfsplus
uname -r         //查出Linux内核的版本
apt-get install linux-headers-2.6.32-41-generic linux-source-2.6.32
sudo apt-get install linux-headers-2.6.32-41-generic linux-source-2.6.32
cd /usr/src/linux-headers-2.6.32-41
sudo mkdir linux-source-2.6.32
mv linux-source-2.6.32.tar.bz2 linux-source-2.6.32
sudo mv linux-source-2.6.32.tar.bz2 linux-source-2.6.32
cd linux-source-2.6.32/
tar xfvp linux-source-2.6.32.tar.bz2 
sudo tar xfvp linux-source-2.6.32.tar.bz2 
cd linux-source-2.6.32/
cd fs/
cd hfsplus/
sudo vi wrapper.c 

        if ((u64)part_start + part_size > 0x100000000ULL) {
                pr_err("hfs: volumes larger than 2TB are not supported yet\n");
                //return -EINVAL;          // 注释掉这行就行了   
        }

cd ../..
kernver=$(uname -r)
kernextraver=$(echo $kernver | sed "s/$kernbase\(.*\)/\1/")
sed -i "s/EXTRAVERSION = .*/EXTRAVERSION = $kernextraver/" Makefile
sudo sed -i "s/EXTRAVERSION = .*/EXTRAVERSION = $kernextraver/" Makefile
sudo cp /usr/src/linux-headers-2.6.32-41-generic/Module.symvers .
sudo cp /boot/config-2.6.32-41-generic .
cd ../cd linux-source-2.6.32/
sudo make oldconfig
sudo make prepare
sudo make modules_prepare
sudo make SUBDIRS=fs/hfsplus/ modules
sudo insmod fs/hfsplus/hfsplus.ko
-----------------------------------


解决上面两个问题后,我的每月定期增量式备份方案如下
先通过sshfs将服务器上的相关文件夹映射到本地台式机上
然后通过pdumpfs实现增量式的备份,这个工具很好用,第一次备份时间较长,随后每次都是将有变化的文件备份一下,以前用这个软件好一年多了,效果贼好的说 :)


哈哈,这下子我的备份方案终于全部搞定。备份与此。

2012年6月21日

svn 服务器 ip地址切换

Eclipse 中重新定位SVN服務器地址


linux 下切换svn地址的命令是 svn switch --relocate FROM TO [PATH...]

公司SVN服務器換了IP地址。我用的是Eclipse的subversion,在SVN資源庫的透視圖中重新輸入新SVN的IP即可,過程如下圖。

不過重新定位SVN服務器的時間比較長,需要耐心等待。

這次在hosts中添加了別名,SVN地址使用了別名。以後SVN服務器換了IP,改host就可以了,無須漫長等待。

2012年4月4日

没有退路

近日看吴军的《浪潮之巅》,颇觉是IT近代史。和别的历史书籍不同,这本书看的激情澎湃,因为很多事情都觉得很贴近。书中讲述了很多大公司在一些很有前景的项目上畏首畏尾或者在当前业务中比重太小而不重视。反倒是一些小公司在这项目上不成功便成仁,拿出破釜沉舟的干劲,最后成功了。

读书时学过太极吴氏老架,当时顺便学了老师独创的太极健身八法。近日练习八法时,想像以往那样跟着视频打,因为总记不全。但手机里的太极视频不知何时弄丢了。重新弄了两次没有成功。一时没了后路。翻出以前打印的相关材料,总结成十个字后练习几次居然可以不再依赖视频独立完整练习了。

面对诸多待办事情时,人谷子里都有拖延的习惯。为什么?因为有退路,现在不做也可以。这种情形往往后果比较严重。因为当前拖延的事情稍候就会变得紧急,久而久之就会不断疲于应付很多紧急的琐事。反倒是那些不紧急但重要的事情没有太多的精力去处理了。长此以往,人就失去了核心优势。

2012年3月5日

C++下类似Perl正则表达式的支持库deelx.h存在严重的内存泄漏,用boost::regex取代deelx.h

经历一番折腾,我用deelx.h支持的正则表达式完成了我需要的全部功能,但测试程序的内存开销时,吓了一大跳。deelx.h存在严重的内存泄漏。经过内存泄漏工具的检测,原来是realloc函数的使用出现了问题。我花了一个小时也没能搞定deelx.h中的这个bug。万般无奈,换到了boost:regex库。结果经过简单的程序片段转换,我完成的新版程序功能和原先的完全一样,而且完全没有内存泄漏。

原先我还有一个Perl程序实现了同样的功能。对比Boost::regex的实现以及Perl的实现,Boost内存开销小一些,但Perl速度快很多,二者都没有内存泄漏。网上对deelx.h的好评很多,猜想他们都是在用match功能,一旦用上replace功能,deelx.h就会吃光内存了。其实deelx.h在CodeProject上也获得了很多好评,但同时也被人发现了内存泄漏问题,很奇怪的是这个问题09年10月就被人发现了,作者也知道这事儿,为什么就还没有被修正呢?有机会时我再试试。

2012年3月2日

C++下类似Perl正则表达式的支持库deelx.h中Bug的修正

今天要转换一段Perl中的正则表达式替换代码到C++中。以前积累下的deelx库可以方便的发挥作用了。
原始的deelx.h可以在这里找到 http://www.regexlab.com/zh/deelx/introidx.htm

但是在使用deelx的Replace功能时,总是遇到三处Bug,如下:
deelx.h:3626: error: cast from ‘const char*’ to ‘int’ loses precision
deelx.h:3637: error: cast from ‘const char*’ to ‘int’ loses precision
deelx.h:3644: error: cast from ‘const char*’ to ‘int’ loses precision

不管我怎么修正我的main.cpp总是会得到这样三个Bug,百思不得其解。最后在一个论坛上找到了解决方案 http://stackoverflow.com/questions/153065/converting-a-pointer-into-an-integer

原来是deelx.h在64位机器上编译时,原先的强制转换(int)都遇到了问题,需要修改为(size_t)来自适应64位的编译器。

三处bug都从(int)修改为(size_t)后就都解决掉了。现在的Replace功能就能正常使用了。

留在此处供遇到同样问题的朋友参考。

2012年2月27日

自然语言处理或者自然语言理解的终极之道:聊天机器人?!

网上看到下面这段文字,让我这样的自然语言处理小辈激动不已。找个时间好好学习一下这个Cleverbot的后台机制,特别是它的自动学习机制。曾经设想过这样的东西,但没有想明白学习机制。这次得好好学习咯。

----------------------------------------------------------------

智能机器人Cleverbot是怎样炼成的?

1988年,英国人罗洛卡彭特(Rollo Carpenter)开始着手这一人工智能研究项目,1997年将机器人Cleverbot接入互联网,使其不断地向访问者学习"知识",增长自己的"才干",直到今年9月才获得初步的成功。请见:"Cleverbot: Artificial Intelligence of the Future, or Just a Jerk?"一文,此文发表于2011年7月18日。

由此可见,机器学习是构建网络智能机器人的基础,不会自动学习,谈何智能机器人?但是,怎么让机器"自动学习"?这就是一个实质性的问题。这个智能机器人研究项目一干就是二十几年,与我们某些"核高基"研究项目的"短视"相比,不可同日而语也。乌呼!