Published at: 11:01 pm - Sunday January 31 2010
翻译一个po文件。确认安装了gettext工具包。 cd到po目录,创建pot intltool-update –pot 创建相应的语言文件,例如zh_CN msginit -l zh_CN.utf8 程序会提示选择或输入邮箱,之后就会生成zh_CN.po文件,打开文件,逐条编辑msgstr即可。 手动编辑LINGUAS文件,按顺序将zh_CN添加到其中。 可以通过这个命令查看翻译的进度 msgfmt -cv zh_CN.po 对于更新pot更新的情况,可以使用命令更新po文件 intltool-update zh_CN 参考: http://live.gnome.org/TranslationProject/LocalisationGuidezh http://blog.chinaunix.net/u1/37261/showart_476642.html
Published at: 11:01 pm - Saturday January 30 2010
自从libchamplain / geoclue等库发布之后,gnome桌面的地理信息工具和支持发展很迅速:例如之前提到过的eye-of-gnome的地理信息插件,根据EXIF信息在地图上显示。现在gnome桌面上终于有一个专门的地图查看器了,仍然是基于libchamplain,名字叫做emerillon 仍然是使用open street maps,这两年上海的地图发展的非常不错,连最新的二号线东延都已经被标注出来了。相比之下,南京的地图就还是一片空白。 在Ubuntu上安装emerillon,可以从其网站上下载源码编译安装: http://www.novopia.com/emerillon/download.html emerillon的几个主要依赖: libchamplain librest ethos libchamplain在ubuntu 9.10的仓库已经包含 librest也在软件仓库中,不过需要注意的是ubuntu将librest安装在pkg-config里时的名字叫做rest.pc,而emerillon查找的是rest-0.6.pc,所以需要手动建立一个软连接: sudo ln -s /usr/lib/pkgconfig/rest.pc /usr/lib/pkgconfig/rest-0.6.pc ethos是一个Gtk的插件框架,目前还不在软件仓库中,需要从网站下载代码编译: http://git.dronelabs.com/ethos/ ethos网站上提到的PPA源中的版本偏旧,不建议使用。 实际上也可以直接添加emerillon的PPA源: deb http://ppa.launchpad.net/mathieu-tl/emerillon/ubuntu karmic main deb-src http://ppa.launchpad.net/mathieu-tl/emerillon/ubuntu karmic main 另外,也可以通过Ubuntu Tweak安装。 作者Blog: http://blog.pierlux.com/en/
Published at: 10:01 am - Thursday January 28 2010
今早短路,在godaddy上注册了我的新域名sunng.info。更换域名主要出于几方面的考虑: 新域名1年的注册费用相当于原先的一半; 众所周知的原因,域名放在国内存在一定的风险; 原先域名过长不方便记忆和交流; .com后缀和我一穷二白地状况不符 classicning.com曾被加入stopbadware.org,至今没有从twitter的malcious数据库里移除 原先的classicning.com会在今年6月到期,如果没有意外情况我不准备续费了,届时这个使用了四年的域名就要废弃了(当时客服大嫂还在电话里娇嗔地问我为啥不续十年呢,你说为啥呢)。 麻烦大家利用这半年的时间逐步改变习惯,逐步用sunng.info了。
Published at: 10:01 pm - Wednesday January 27 2010
recaptcha的验证码新增了alpha composite的新机制取代干扰线,今天用了一些时间在YAN上也实现了这种绘图机制。 使用Java2D的AlphaComposite实现,选用的Rule为alpha 1.0的SrcOut,即通过公式 Ar = As * (1 – Ad ) Cr = Cs * (1 – Ad ) 用语言描述就是叠加区域的透明度为0. 使用这种机制必须采用BufferedImage.TYPE_INT_ARGB的图像,并且输出支持alpha通道的格式。
Published at: 08:01 pm - Tuesday January 19 2010
这是经历了又一次长时间的unavailable回来。 最近挺忙,新项目启动了,旧项目月底要上线,早先的项目deadline也要到了,还不见动静不知道什么情况,今天又被叫去说数据部门的老大又有新想法了,娘勒,四个,四个啊。 即使有四个,我发现我在twitter上还是那么神情自若,rabr自动取新消息的功能太害人了,忍不住就想点点看看,看了就想点,很影响注意力的集中。于是最近改用lynx / w3m这样的命令行浏览器上rabr。rabr做的还真是非常不错,在没有Javascript支持的情况下依然能用。诚心推荐大家一起来复古,w3m很powerful,支持vim和lynx的快捷键切换,居然还能显示图片,当时我就shock了。 YAN有了200次commit,接下来的主要工作是把它拆成多个maven module,以便未来开发的方便。尽管之前做了一些准备了,但是这个过程预计不会太轻松。最近精力有限,暂时先不全砸在上面吧。 业余的项目还要做下去,分为multimodule之后YAN的开发也就差不多了;之前写的Exaile的豆瓣Cover插件也没有后续开发的必要了,大家有什么点子欢迎分享。 上周去上图发现楼上的阅览室资源很多,我决定以后每个月至少花一天泡在图书馆。 有时候想想我真凄凉啊,哎
Published at: 09:01 pm - Sunday January 10 2010
这年头怪事真叫多。今天在珠江路地铁站,突然过来一位深度大叔,弱弱地问我这个方向是不是去火车站,我说这大叔也真不容易,牌子都不认识怎么进来的,赶紧说是的。 大叔继续问你也去火车站吗,我想这大叔估计第一次来,人生地不熟的,也说是。 这就罢了吧,您跟着我就行了。但是大叔不罢休,继续,“你是学生吗”。我本能地把手装进口袋握住钱包,说了一个我平生最凄凉的谎话,是的。以为会话到此结束的朋友你们错了,大叔继续不依不饶,问你是哪个学校的啊,我刚要如实撒谎,大叔蹦出一句which university(请相信我的听力,我的听力和大叔的口语水平还是相当的),这句没让我当场摔倒完全是多亏中午吃得多有劲。 奇妙的对话从他娘的which university开始了,大叔滔滔不绝 “英语怎么样?四级过了吗?” “你是学什么专业的?which major?” “What about your speaking English?口语怎么样啊?” “你知道向日葵怎么说吗?桑福拉沃” “月季呢?” “肉丝你知道吧?玫瑰。加上中国,China rose就是月季” (地铁来了,我不堪忍受,从旁边的门进去,大叔跟过来继续) “toilet你知道吧?toilet water你猜是什么?” 这个时候终于有个座位,大叔当然不让坐下,还不忘循循善诱,“是花露水”。 好在这课也上到花露水为止。临下车摸了一下手机和钱包,嗯,这课是免费试听的,也罢也罢。原来我长得这么像是有英语培训市场价值的啊。
Published at: 11:01 pm - Monday January 04 2010
最近琢磨OAuth认证方式。OAuth的优点主要在于 用户不需要直接提供用户名密码给第三方应用,就可以让第三方应用访问受限资源; 资源提供方对第三方应用有更细粒度的控制。 在整个OAuth协议里,生成signature的base string是最容易出错的部分。它由HTTP方法名、URL编码的请求路径和请求的参数表组成。 请求的参数表是除去oauth_signature以外的所有参数,按参数名排序,并进行url转义 def to_signature_key(method, url, data): keys = list(data.keys()) keys.sort() encoded = urllib.quote(“&”.join([key+"="+data[key] for key in keys])) return “&”.join([method, urllib.quote(url, safe="~"), encoded]) 有了这个通用的生成signature base string的方法,以后就可以根据OAuth协议规范按步骤进行。 首先获取Request Token。这一步通常使用资源提供方注册的API Key和API Key Secret def request_token_params(consumer_key, consumer_secret, path, method=’GET’): data={} data['oauth_consumer_key']=consumer_key data['oauth_signature_method']=’HMAC-SHA1′ data['oauth_timestamp']=str(int(time.time())) data['oauth_nonce']=”.join([str(random.randint(0,9)) for i in range(10)]) print data msg = to_signature_key(method, path, data) [...]
Published at: 12:01 am - Friday January 01 2010
I am glad to release the Yan 0.4 at the last night of 2009. It’s an important release which witnesses the improvement on both code and the project itself. We have great changes in all modules. Packages have been rearranged and renamed to be more comprehensible. Let’s dive into the changeset: Changeset ApiKey database derby [...]