志敏's profile新的开始,新的生活PhotosBlogListsMore Tools Help

Blog


    11/13/2009

    不折腾了

    [原文: http://www.huangzhimin.com/posts/447]

    这一周真是郁闷,尽在装系统了,从Ubuntu 9.10, XUbuntu 9.10,到Fedora 11,再回到Ubuntu 8.04。

    鼠标键盘老是无法正常运行,估计是我的t43已经适应不了现在的linux内核,还是退回到之前Ubuntu 8.04,现在运行良好,希望继续保持。

    10/25/2009

    Kungfu Rails Conf

    [原文: http://www.huangzhimin.com/posts/446]

    昨天Kungfu Rails会议还是收获很大的

    早上匆匆跑去,正好赶上Yehuda Katz开讲Rails 3,介绍了很多在Rails 3即将推出的新功能,很期待年底Rails 3能够Release

    接着是赵路介绍持续集成和代码质量,这些东西之前都接触过,对这样的开发过程很有同感

    至于我关于plugin/gem的演讲,感觉比上次ruby conf要好些,毕竟实践过的东西比起理论的东西讲起来更顺手

    下午張文鈿的Rails Best Practice的演讲,可以说是这次会议最大的收获了,真的都是金玉良言,以后在项目开发时一定要注意

    Scott关于git的演讲也很不错,github也是我经常去的网站

    Stone介绍自己写的ActiveDirect也不错,不过自己没怎么接触Ext,算是学习了吧

    高桥征义的剪报式演讲让人耳目一新,不过通过中文表达有点打折扣

    最后两个演讲没有听到,赶去参加同学的婚礼了,以后搜搜有没有ppt看看

    9/12/2009

    爬虫复活

    [原文: http://www.huangzhimin.com/posts/444]

    自从上次网站被墙之后,不得已每个月多花2.5美刀买了个独立IP,网站是可以访问了,但是网站上的爬虫却无法爬取中国网站的网页。郁闷~~~

    于是在google app engine上面申请了个app,做代理。发现想直接用Servlet来做代理服务器好像不太可行,只能退而求其次,通过分析QUERY_STRING来转发目标网页的内容。网站上的爬虫终于复活啦,不错。

    GAE上面可以申请10个免费应用,还是值得多尝试尝试的。

    9/1/2009

    网站被墙

    [原文: http://www.huangzhimin.com/posts/443]

    大概是昨天下午吧,网站被墙了。一开始还不知道原因,只是总上不了自己的网站,和hostmonster的客服一说,直接告诉我被墙了,建议我买dedicated ip,试了很久都没用,无奈之下只能花近50美金买20个月的dedicated ip,好不容易网站有点流量了,居然出这种事,只能从头开始了。上twitter抱怨了一把。

    8/26/2009

    github最近有点不稳定

    [原文: http://www.huangzhimin.com/posts/442]

    今天早上在github上面发布bullet插件的第一个gem包,结果等了半天没结果,一会返回Queued for rebuild,一会什么都不返回。在support上面发帖提问,被告知可能是gem build进程运行在low priority,他们会把它升到medium priority。

    等到下午快3点才收到通知说gem已经build成功,不过到现在还没有被加到github的gem list上,说是晚上会强制做一次reindex,希望那时候会成功gem install。

    7/25/2009

    网站三天无法访问

    [原文: http://www.huangzhimin.com/posts/436]

    已经有三天无法正常访问网站了,一开始还以为是Hostmonster网站维护,后来才发现原来是Hostmonster把rails升级到了2.3.3,又没有很好的测试(挺不负责任的)。于是提交Ticket要求修复,不过到现在还没有结果。实在受不了了,自己动手。把网站的gems指向自己的目录,修改rack的源码,搞定,终于又可以看到自己熟悉的网站啦,哈哈

    5/21/2009

    rubyconfchina

    [原文: http://www.huangzhimin.com/posts/430]

    第一次参加这类活动,ruby之父matz先生的出席,受到了所有关心ruby和rails的开发程序员的追捧。

    由于matz的翻译晚到了,所以把我的演讲提前到了第一个。第一次面对300+人演讲,好紧张。上一次演讲还是一年前的论文答辩。之前准备的比较充分,所以总体感觉还行。daniel后来和我说,演讲的ppt还是不要放太多的代码,吸取经验。

    之后matz的演讲是通过翻译来表达的,还不错,讲了很多关于ruby语言创始的事情,经济危机使得工作无所事事,于是诞生了ruby,呵呵,不知道今年的经济危机是不是又会给我们带来一种新的语言呢?

    robbin演讲介绍了javaeye架构,包括web server, cache memory, db server等等。网站是如何从简单的部署环境,遇到性能瓶颈之后是如何一点点解决的。

    陆亦斌介绍了不少rails开发中的陷阱,主要是由于并发带来的问题,这些倒是之前很少会考虑的问题。

    郑晔带来了thoughtwork中使用ruby的经验,从DSL到JRuby。

    TonyI则介绍了如何使用ruby on rails开发企业/政府项目,强调的是文档。

    之后maxime带来了10来分钟的关于scrum的介绍,用的可是中文演讲哦,great!

    Koz介绍了日本地方政府对ruby的支持,不过中文实在不敢恭维。

    最后王浩飞介绍了SAP公司内部的BlueRuby项目,一个为ABAP web应用开发ruby虚拟机。

    今天还是收获不少的,看到这么多充满的ruby爱好者,还看到了杭州的老同事。希望以后有更多的机会参加这类会议!

    5/14/2009

    导入联系人列表的类库

    [原文: http://www.huangzhimin.com/posts/429]

    上个月在google code上发布了一个导入联系人列表的类库,http://code.google.com/p/contact-list,获取用户的msn和邮箱联系人列表,支持的邮箱包括hotmail, gmail, yahoo, sohu, sina, 163, 126, tom和yeah。算是之前一段时间的小成果吧。

    不过由于这个类库的原理是使用抓取网页来分析联系人列表的,所以会因为邮箱网页的改版而无法正确获取联系人列表。 在写代码的时候就碰到过Hotmail改版的情况,所以这个类库是需要不断改版的。还好在发布之前特意写好了测试脚本,很容易找到哪个邮箱出问题了。

    今天收到一个用户的email,说他的新浪和搜狐好像无法导入,我回来test了一下,发现新浪和搜狐没问题,倒是yahoo出问题了。于是给他回信,让他把log4j的level设置成debug,然后把调试信息发给我。现在有了用户的反馈,有点小压力,要好好维护好这个类库

    1/11/2009

    慎用QQ for Linux 1.0Beta版

    今天用VI写些代码,发现ESC键无效了,太可怕了,没有了ESC,VI不就废掉了嘛

    重启电脑,无效。用xev测试,好像没什么问题,抓狂!!!

    结果居然是因为装了QQ for Linux 1.0Beta,关掉QQ就好了,呵呵,QQ还真是霸道呢!

    12/26/2008

    msn让我很失望啊

    昨天收到msn的邮件,说出了msn9.0版本,感觉还不错,就去升级了,安装过程很长很枯燥。

    很期待地打开了新版的msn,结果发现无法登录,登录到现在都没有成功,我汗啊,只能切到笔记本用pidgin上咯,失望啊!

    8/14/2008

    SQL杂感

        在学校里学SQL,也实际操作过,觉得还是掌握的不错的。这两天在公司一用,缺点就暴露了。

        以前做的应用,数据量有个几千上万就不错了,写的SQL语句也大多比较简单,跑跑都不成问题。这两天公司有张数据表A的数据量已经达到24万,我要做的是将这张表A的数据LEFT JOIN另外一张表B,在mysql客户端上一跑,没有反应,等了好几分钟都出不来结果,只能Ctrl+C。看了好久都看不出SQL语句错在哪里,自己另外建了两个表作实验,也没有问题,很快就能显示结果。后来在同事的提醒下,原来是B表关联的字段没有加index,加上index之后果然很快就显示结果了。

        平时自己在实验SQL语句的时候大多将精力集中在SQL语句是否正确,而忽略了SQL语句的性能,好比今天用子查询来找数据,结果发现还不如分成两条SQL语句来的效率高呢。书本上将的金玉良言大多是很有用的,但是也有部分在实际应用中是必须违反的,比如几大范式要避免冗余,但是实际应用中还是会通过增加冗余来提高查询效率。

        看来应该好好在研究一下数据库的性能问题了呢

    7/31/2008

    QQ for Linux

    好消息,好消息,QQ出Linux版本了

    http://im.qq.com/qq/linux/

    以后不需要通过虚拟机上了,也不需要通过Wine上了,哈哈,不错。不过毕竟是Preview版,功能还不全,不过至少是稳定,占资源少,期待正式版的出现^_^

    6/19/2008

    Web开发的多浏览器,很无奈啊

    这个网站的开发平台在Ubuntu上,自然将Firefox作为默认的浏览器,用久了居然忘了还要兼容一下IE, Safari, Opera。刚刚完成的代码高亮功能,在FF上显示相当完美,部署之后用IE一看,真是差距明显,不好看了。整个时间看看能不能fix掉。

    我算是反过来了,大多数网站都是对IE100%支持,对FF什么支持比较差。就因为要用IE才能上网银,用IE才能网上消费,害得我还得装个虚拟机,跑起来还巨占资源。

    哎,偏偏我又不擅长css,要处理这些跨浏览器显示对我来说还真不是件容易的事情呢。

    4/28/2008

    Ubuntu升级到8.04

    Ubuntu 8.04(代号Hardy)的正式版出来好几天了,昨天下定决心做了升级,因为学校有个udlchina的源,所以下载升级包的速度那是相当得快。

    升级过程不如7.04到7.10那么顺利,upgrade的时候有些包好像没有安装上去,后来都是手动重新安装上去的,感叹apt-get的强大!

    除了软件的版本号增大了,升级之后好像也没有发觉什么大的变化呢
    GNome ==> 2.22
    Linux Kernel ==> 2.6.24
    Xorg ==> 7.3
    Firefox ==> 3.0b5

    升级之后最大的问题是字体问题,之前用的是STHeiti,放在/usr/share/fonts/truetype/下面,配置文件是/etc/fonts/language-selector.conf。新版本中字体配置文件/etc/fonts/language-selector.conf已经不存在了,而是需要到/etc/fonts/conf.avail/69-language-selector-zh-cn.conf去修改,还好配置内容几乎没变。

    另外还有一个问题是fcitx,在新版本下中文字显示都为方块,虽然还能输入中文,但是根本没办法找到自己想要输入的字。google了一下,只需要修改~/.fcitx/config,将显示字体(中)=后面填入你的中文字体,我的是STHeiti,OK。

    比较头疼的是Firefox 3.0b5很不稳定,有时候会莫名其妙crash,速度也没有传说中的那么快。最过分的,无法显示railsbrain生成的rails api,这个影响太大,于是去装了个opera,还不错哦,试用几天看看。

    最后发现的问题是新版本导致vim的rails插件crash。具体是当我输入:Rcontroller po<Tab>,本来应该补全称:Rcontroller posts的,结果就crash了,唉,不知道什么时候修正这个错误呢。

    暂时就发现这点问题,还好这次升级没有伤筋动骨,一些小错误暂时先忍忍,谁让自己喜欢尝鲜呢,呵呵!

    4/24/2008

    日志同步发布中

    发布在flyerhzm.com

    同步到flyerhzm.spaces.live.com

    感谢rmetaweblog的作者Pieter Steyn给予的邮件答复,不过由于1.0版本发布日志不能加分类,而且服务器上没有安装rmetaweblog这个gem,所以看了rmetaweblog的源码,重新用xmlrpc/client来实现的,增加了分类的数据

    4/21/2008

    小爬虫备份msn spaces

        上周自己写的blog上线之后,就开始准备把msn spaces上的日志导入到我的blog上。

        一开始是准备用msn spaces提供的MetaWeblog接口来获取日志。正好ruby下面有rmetaweblog的gem,直接拿来用。不过文档写得不怎么样,google了半天也没有用ruby xmlrpc方式管理msn spaces的实例,还好作者留了个gmail的联系方式,请教了一下,作者回复了我一个实例,果然很容易就连上了,不过msn好像限制只能读取最近发布的几十条日志,在前面的好像就读不出来了,不过到可以用来以后做同步日志发布。

        xmlrpc方式受挫之后,就只能写个小爬虫自己去解析了。第一次写爬虫,还是蛮麻烦的。要看html源码,分析所要读取的元素,不断尝试,调试。用了一整天的时间,代码不是很多,就是发送html request,读取html response,然后用正则表达式解析。全部日志读取下来花了10来分钟呢。

        以后估计就把主要的精力放在自己写的blog上了,不过还是会尽量通过xmlrpc同步到msn spaces上,大家以后可以访问我的blog——http://flyerhzm.com

    1/28/2008

    初次安装苹果操作系统失败

        昨天看到Devon的T61上安装的苹果操作系统,Devon还极力推崇在苹果操作系统上开发Rails的高效率,弄得我甚是心痒。应该说在笔记本的品牌上,IBM和Apple算是最受欢迎的吧,被用户们分别戏称为小黑和小白。曾经向往着能够有一台苹果电脑,但是价钱却不是一般得贵啊。现在苹果的操作系统也能在X86的机器上运行了(已经很久之前的事情了),而且能安装在IBM的笔记本上,那我当然要在自己的小黑上面尝试一把咯

        回到实验室,外网的下载是不指望了,还好缘网上有10.4.6的DVD ISO,载下来刻盘。接着将自己笔记本上的重要数据备份到实验室的台式机上。1、2个小时的兴奋之后,终于开始安装,用刻好的盘引导,结果黑屏,然后拿到别人的机器上一试,是可以的,原来自己的COMBO挑盘,读不出来。借了别人T43上的COMBO换到我的机器上,成功引导,不过在刚刚进入安装界面的时候,就不动了,光驱再读,硬盘灯在闪,就是屏幕没动,唉~~~Google了一个晚上,怎么都不行,在虚拟机上尝试也是同样的问题,网上说可能用SATA的光驱或者外接USB光驱就可以了,但是我手头没这玩艺。网上还有通过硬盘安装的,但是镜像DMG要么是电驴要么是BT,校内都没法载。回家之后又没有空间备份数据,郁闷死了。

        哎,看来只能暂时放弃了,不过现在要是装的话,也是盗版的(鄙视自己一把)。还是攒攒钱,买台MacBook吧

    1/19/2008

    用jmeter测试https应用

        实验室的项目是做关于web service的security产品,主要是对soap消息进行加密签名。上一次的性能测试是将单纯调用web service和应用我们的security产品后的web service进行对比,然而差距还是相当明显的,尤其是在高并发的时候,毕竟中间的加密和签名过程是相当消耗时间的。上次review的时候,老师就说性能有很大的程度可以提高,我本来想说基本没太多的空间可以优化(除了之后会加入的线程池,应该会有小幅度性能提升),但是苦于没有数据支持。正好这两天为了准备开题,一直在看一些文章,看到网上有人提到,SSL + WS-Security = Web Service安全保障,主张用https的方式来传输soap消息。虽然不是什么很好的方法,不过不是正好拿来作为产品测试对比的对象嘛。

        tomcat上已经配置好了axis,通过http访问soap消息是没有问题了。但是还没有配置https,所以按着官方文档开始干活了。首先用keytool生成服务器段的keystore:

    keytool -genkey -alias tomcat -keystore ktomcat.keystore

        注意,alias的密码要与keystore的密码一致,tomcat文档上是这么说的。接着是修改了server.xml:

    <Connector
               port="8443" protocol="HTTP/1.1" minSpareThreads="5" maxSpareThreads="75"
               enableLookups="true" disableUploadTimeout="true"
               acceptCount="100"  maxThreads="200"
               scheme="https" secure="true" SSLEnabled="true"
               keystoreFile="ktomcat.keystore" keystorePass="changeit"
               clientAuth="false" sslProtocol="TLS"/>

        重启tomcat之后,输入https://localhost:8443进行验证(注意是8443哦,我一开始居然傻乎乎的输入8080^_^)

        接着设置客户端的trustStore,jmeter需要它来信任tomcat服务器段的证书

    keytool -export -alias tomcat -keystore ktomcat.keystore -file tomcat.crt
    keytool -import -alias tomcat -file tomcat.crt -keystore tclient.keystore

        tomcat上的https配置成功之后,就开始jmeter的配置了,默认情况下用jmeter是不可以访问我们配置的https应用的,不过却可以访问像google等网站上的https应用,原因很简单,我们自己生成的证书是不被信任的。jmeter的官方网站有一个很大的陷阱,上面说只要修改jmeter.properties参数,将SSL Configuration部分内的注释去掉就可以了,如下

    #---------------------------------------------------------------------------
    # SSL configuration
    #---------------------------------------------------------------------------

    #Classname of the ssl provider to be used (to enable testing of https urls)
    #And the package name where Stream Handlers can be found
    #These provided defaults can be uncommented, and they will work if you are using
    #Sun's JSSE implementation.

    ssl.provider=com.sun.net.ssl.internal.ssl.Provider
    ssl.pkgs=com.sun.net.ssl.internal.www.protocol

    #The location of the truststore (trusted certificates) and keystore ( if other than the default.
    #you can uncomment this and change the path to the correct location.
    javax.net.ssl.trustStore=/home/flyerhzm/software/jakarta-jmeter-2.2/tclient.keystore
    javax.net.ssl.keyStore=/home/flyerhzm/software/jakarta-jmeter-2.2/kclient.keystore

    #The password to your keystore
    javax.net.ssl.keyStorePassword=changeit

        不过结果还是失败,尝试了好多次,总是报SSLHandshakeException。如果是通过浏览器访问的话,浏览器都会提醒你对方的证书不合法,是否要信任它,但是java是不会询问你,而是直接抛出异常。但是如果设置了trustStore的话,就会信任对方的证书啦,太奇怪了。

        google了一下有关SSLHandshakeException,网上有说可以用-D方式添加应用参数,于是打开了jmter启动文件,修改最后一句话为:

    java $JVM_ARGS $ARGS -jar `dirname $0`/ApacheJMeter.jar -Djavax.net.ssl.trustStore=/home/flyerhzm/software/jakarta-jmeter-2.2/tclient.keystore -Djavx.net.ssl.trustStorePassword=changeit "$@"

        居然成功了,呵呵。可恶,配置文件jmeter.properties居然不起作用,害我辛苦到现在。

        趁热打铁,测试了一下通过https访问web service,果然比应用我们的security产品要多消耗1倍多的时间,赞,终于有数据可以说服老师了,哈哈。

    1/14/2008

    Google Remind Me

    你是否经常上网......
    你是否将Google设置为主页......
    你是否希望一打开浏览器就有Google提醒你朋友的生日和重要的纪念日......
    如果你对所有问题的回答都是肯定的话,隆重推荐使用Google Gadget之提醒小工具

        呵呵,广告就做到这里了。一直使用google简洁主页,前几天心血来潮使用了其可订制的iGoogle主页,感觉很不错。现在我的主页包括Gmail, Google Reader, Bookmarks, To-Do List, 天气预报和上面提到的提醒小工具(我自己写的^_^)。
    Screenshot-iGoogle - Mozilla Firefox

        捣鼓了几个晚上才写出来的,其实很简单,输入需要提醒的日子,工具会按照剩余天数进行排序,越早到的日子越先提醒咯,当然你也可以配置需要显示的提醒数目。Gadget提供的API还是比较简单的,主要是HTML, XML和Javascript,不过就是debug太麻烦了。所有的html和javascript都必须写在XML的CDATA标签内,这样就没有了语法检查和高亮。另外缺乏IDE的支持,必须在网页上嵌套的Google Gadgets Editor进行调试,而且有些高级功能如setprefs和dynamic-height只有在真是环境下才能显示出来。对于我这个严重依赖IDE的人,还是绕了很大一段远路。下面来个特写screenshot

        其实应该做个网站,上面朋友间可以互相共享生日,内置重要节日,用户定义一些纪念日,然后通过Feed在提醒小工具上面显示,不过现在没时间,也没有服务器搭网站,只能先凑合着用用咯。

        忘了最重要的事了,点击,就可以将提醒小工具加到你的Google主页上了,不妨试试哦^_^

    1/7/2008

    写程序也要拼人品啊

        作为程序员,最痛恨的事莫过于调试一段代码,而这段代码怎么看都是正确的,但是它又偏偏出错了。计算机是不会欺骗人的,所以碰到这样的事可以很肯定是程序员把代码写错了。一般来说呢,这种错误可以分成两种情况:一是错误发生在很小的细节上面,程序员在Review的时候不容易发现;二是错误发生在自己不熟悉的代码块中。碰到这两种情况的时候,能不能解决,花多久时间绝对是拼人品的一件事情。
        不幸的我在写这个项目的时候,两种糟糕的情况都让我碰上了。
        第一种情况发生在代理服务器模块,编程,单元测试,人工测试,都很顺利,但是在用JMeter做性能测试的时候,在10个并发测试就非常不稳定。因为那块代码不是我写的,于是先对代码进行了Review,怎么看怎么没问题,这也意味着痛苦的时候到了。接下去的几天,不断地Review,不断地尝试,不断地测试,还是毫无结果。由于可以肯定错误时发生在并发的时候,所以用GroboUtils做多线程方式的单元测试,虽然锁定了错误发生的代码段,但还是看不出为什么错了。终于在某一天人品大爆发,突然发现有一个变量是类私有静态变量,一个小小的static,晕。。。把它的作用域放到函数内部,问题迎刃而解,长舒一口气啊
        第二种情况是今天刚刚解决的,也是折磨了我好几天。错误发生在对XML进行加解密和签名的模块里,之前照着网上的例子一直运行良好,可是我需要在加解密和签名的基础之上,增加Authentication的功能。结果是,单独Authentication是没有问题的,但是签名验证是总是报错。之前也从来没写过这方面的代码,于是去mailing-list上提问,没想到居然石沉大海,一点回音都没有。更令我郁闷的事,签名验证的单元测试是顺利通过的,第一次有希望看到red bar的想法。又拿socket发送的消息和单元测试出来的消息进行对比,不可行,因为每次签名出来的结果肯定是不一样的。还把客户端和服务器端的代码放到同一台机器上运行,还是出错。重新check out可运行的第一版本,在此基础上一点点把第二版本的新功能加上去,找出了错误代码,不过还是不知道正确的方法,郁闷啊。刚才去吃晚饭回来的时候,灵光乍现,把Authentication用到的xml节点都加上namespace,果然运行通过了,哈哈
        感觉快速寻找bug和快速修改bug是一个好的程序员必须具备的素质。而这种素质不是光看书能够提高的,必须有足够的代码积累,在实践中提高,也许这就是为什么许多公司都要招有经验的程序员的原因吧
        累了,用脑过度