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功能就能正常使用了。

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