Monthly Archives: December 2010

2010圣诞——娱乐活动研究中心年终总结

2010年圣诞是一个值得纪念的日子,虽然我对圣诞节这个节日本身没什么兴趣。

2010年的圣诞,“娱乐活动研究中心”的成员又一次能够欢聚一堂,将各种娱乐活动high到底!为2010年度的娱乐活动画上了一个圆满的句号!

本次活动分两天进行。第一天是小部队行动,时间是25号圣诞节当天,成员有我、风同学、邓同学和很久不见的赵同学,活动内容是去邓同学家吃饭。排骨虽然好吃,但仍然不能降低我们继续娱乐活动的热情。5点的时候去某电影院(忘了名字了)看《让子弹飞》。姜文的电影果然让人看着很痛快,全场大笑至少有三次。总的来说电影很好看,爆米花挺好吃。电影后又去“蓝色港湾”看灯,然后吃石锅拌饭。一系列活动结束后还是意犹未尽,关键是赵同学在某公司压抑的太久了,好不容易有个双休就想好好high一把。正当我们研究通宵唱歌的时候,各个KTV很不给力,不是没有通宵类型的包房就是人满为患,我们在地铁里研究了40分钟之后,最后决定,各回各家……

活动第二天是全体成员都参加的,活动内容是去金鱼家参观游览。经过了近一个小时的地铁,15分钟的打车之后,我们终于到了目的地……虽然地方偏僻了一点,但是新装修的小屋还是很不错的。游览之后又打车去“大鸭梨”吃烤鸭,风同学作为马上要出国的人请大家吃饭,并且祝王同学生日快乐。饭后提议弥补昨天没唱歌的遗憾,找到了东直门附近的某家KTV,从4pm唱到8pm,嗓子唱哑,全部唱high。之后为了迎接明天的工作日,都很不情愿的回家了。

总结一下今年的娱乐活动:

1月:八达岭滑雪
4月:天津行
5月:十渡
7月:凳子家做饭
8月:北戴河
10月:百旺山
12月:圣诞活动

在没有大型活动的6 9 11等月份也有不少小型活动或者局部活动,吃饭、做饭、唱歌等。

在北京打拼不容易,如果是自己一个人就更加孤单。还好有一帮同学们。十年前的同学们肯定不会想到十年后大家在北京玩的这么开心,甚至只有一年作为同班同学。

感谢的话不多说,希望我们“娱乐活动研究中心”2011年发展新成员(首要任务!),有更多更好玩的娱乐活动!

修正n900上maemo-mapper的google map偏移问题

maemo-mapper的地图偏移问题困扰我快一个月了,自从买了n900就看这个问题不爽。这个偏移产生的原因有不少说法,反正就是人为加上去的,而且中国还不公开这个偏移算法。google地图在其他平台上的官方软件上没有偏移问题,因为google会修正这个问题(修正数据怎么得到的就不知道了),而google地图不支持maemo平台,n900又没在中国大陆正式销售,所以诺基亚也不管这个问题。既然没人管,只好自力更生了。

要解决这个问题首先要得到偏移数据。经过搜索,发现还真有人做过这方面的工作。偏移数据的下载地址可以从这里找到。有同学说CSDN的下载地址不可用了,那下这个吧。偏移数据是一个70+m的二进制文件,数据结构如下:

struct offset_data {
        int16_t lon;
        int16_t lat;
        int16_t x_off;
        int16_t y_off;
};

lon lat分别是经度纬度,x_off y_off就是这个坐标所对应的x y方向像素的偏移值,刚才给出的链接里有比较详细的说明。

最重要的偏移数据有了,第二步就是如何根据经纬度查找相应的偏移量。这个偏移数据是经过排序的,而且70M这么大也不可能一下读进内存挨个查找。所以比较自然的想到了二分查找。但是这个bsearch要自己写了,c库里的bsearch只能查找一个key的情况,而这个是经纬度,相当于两个key。正好当作一次算法实现的练习了。先写了一个简单的c程序测试自己的代码,确认了能够正确用二分查找找到所需要的数据。

数据也能找到了,最后就需要把这个偏移数据正确应用到maemo-mapper的代码中去了。大体思路可以参考这里(这一系列引用的文章都是同一个人写的),就是把GPS的经纬坐标转换成xy像素值的时候加入相应的偏移,反向转换的时候减去相应的偏移。而这个相互转换的方法可以看看这里。能注意到刚才的文章中给出的转换实现使用了一个zoom作为参数,也就是缩放级别,可是在maemo-mapper中的相应函数中(在src/tile_source.c中,不同类型的数据源使用了不同的函数)却没用到这个参数,而只用了MAX_ZOOM这个宏定义(在src/defines.h中定义为20)。我现在得到的偏移数据是针对缩放级别18的,所以导致我如果直接在mapper中添加这个偏移量,得到的结果修正程度很小,地图还是不准确的。最后的解决方法是把MAX_ZOOM这个宏定义为17,来跟修正数据进行匹配(这个级别的缩放已经很详细了,但为什么是17而不是18,可能是off by one这类问题吧)。

以上的步骤我经过了4天的摸索,再加2天搭建maemo5的SDK开发环境,最后终于把偏移数据增加到mapper里,重新打包成一个armel的deb。我是增加了一种tile的类型,叫做XYZ_OFFSET。在设置tile的时候只需要把想修正的数据源的类型从XYZ_INV(google的是这个类型)改成XYZ_OFFSET,并且把下载到的offset.dat放在/home/user/MyDocs/.maps目录下就可以了。

源码、patch和deb包我都打包上传到rapidshare了,有兴趣的去下载吧。最好下载的给我留个言,我想看看有多少人下载……

2011-1-9更新:

安装3.1版本发现“不兼容”现象的尝试3.2版看看,最近mapper进行升级了。在这里下载。

2011-1-15更新:

关于导航问题,看初步修正n900上maemo-mapper导航偏移问题

linuxfb版聚作业 2010-12-18

好像上次没人写作业啊,我来凭着记忆赶紧写了,时间长了就忘了。

今天是2010年最后一次版聚了。虽然天气寒冷但是现场气氛依旧热烈。
本次版聚到场16人,而且有一位mm(虽然听完偶像bergwolf的pnfs之后就走了),遗憾的是coly同学没能到场。

按照惯例,版聚在2:15正式开始,进行例行的漫长自我介绍+吹牛热身。而同时Leafjohn同学一直在试图把笔记本投影到屏幕上(虽然到最后也没成功……)。本次到场的嘉宾依旧来自各大公司和知名高校,如蓝色巨人IBM,存储巨头EMC,三位来自Novell的工程师和三位来自Redhat的工程师,还有一位之前在Novell现在在Redhat的工程师……当然还有BUPT。

3:00,bergwolf正式开始讲pNFS。这个话题也是我很感兴趣的一个。(以下文字如有描述不正确的地方一定要及时指正,尤其berfwolf同学)

之前对pnfs完全没有概念,很想知道它究竟“P”在了什么地方。原来pnfs只是nfs4.1协议标准中的一个feature,它把metadata和data分离,在nfs server端只存储metadata信息,允许client得到数据metadata之后直接访问后端存储,减轻了server的压力也增加了后端存储的可扩展性。而“P”也是在这个地方体现出来的,可以“并行”访问数据。这就出现了存储、client和server三者之间交互的问题,而只有client和server之间交互的协议叫做pnfs,client和存储之间的交互叫做XX协议(我忘记了 -_-!!),是通过client的layoutdriver实现的,server和存储之间的交互叫做controlprotocol,这个地方也是各个存储厂商差异化竞争最激烈的地方。

接着bergwolf介绍了pnfs的几个key feature,但我现在能记得的只有EOS和No moresilly rename了。EOS是Exactly Once Semantics,nfs server保证同一个请求即使client发送多遍,也只执行一次,并具了一个rename的例子:当client发出一个rename的请求后,server成功执行并返回了,但是如果这个时候返回结果由于某种原因client没有收到,那么它会重试,再次发出同样的请求,这个时候server如果不保证EOS那么请求就会失败,因为前一次rename已经成功,源已经不存在了,client就会得到失败的结果,但是client也读不到源了,如果server保证EOS,那么server接到重复请求后就会把刚才的结果返回,client也得到了正确的结果。No more sillyrename,就是当client打开一个文件后发出一个unlink该文件的请求,这个时候nfsv3会把文件重命名成.nfsxxxxx,当client关闭这个文件后才真正unlink这个文件,而在pnfs中不用做这样的操作,这些状态信息是由server来维护的,bergwolf指出,pnfs不是stateless的。

接下来bergwolf同学介绍了下pnfs的发展现状,基本可以概括为,client作为kernel的模块已经进入upstream(直接跟存储设备打交道的layout driver还没进去)而server还没有一个可用的开源实现,只是各个存储厂商在各自开发自己的产品。据bergwolf猜测,这也是Linus不让那些驱动进upstream的原因之一。

最后大概讲了下Open issue,感觉很复杂,听过就忘了……但是印象就是,pnfs协议设计的有自相矛盾的地方……请bergwolf补充吧。然后,这个话题就结束了。

中场休息的时候,大家纷纷拿出自己的新潮的好玩的东东,比如apt的ipad,wupeng的itouch,guiwuu的kindle,我和caspar的n900,最后还是apt的iPad吸引了最多的眼球,他们在打红警……

第二个话题是来自Leafjohn的ofono(如果我没拼错的话),是一个用在Linux上的telephony中间件,屏蔽下层各种monden的差异,向上层应用提供一个统一的接口,现在在meego中得到使用。由于大家对这个东西都不太懂,所以都比较关心能否用它来在笔记本上打电话……最后caspar还拿出自己的n900作为实验品让Leafjohn进行操作,但是最后也没成功。我个人觉得这东西还是很有意思的,用自己的电脑来驱动猫打电话发短信也是很cool的一件事啊!

5:30,本次版聚结束,小部分人在Linux完了之后就fb去了。感谢本次版聚的赞助商hzmangel同学(我们顺便8了一下hzm后边的angel问题),会议室提供者stufever以及两位主讲人。linuxfb明年再见了!

在Nokia n900 上使用SOCKS代理

买了n900但是如果不能用SOCKS代理那么就太遗憾了。SOCKS代理可以做很多事情,但这事不能说太细。还是主要关注如何让n900自带的浏览器使用SOCKS代理吧。

其实之前在翻系统里的gconf设置的时候看到了SOCKS相关的一些设置,但是我没敢直接修改xml配置文件,因为对gconf不太熟悉。而n900的连接配置里只能配置http代理之类的,没有SOCKS的配置。那么就要配置浏览器了。虽然浏览器里的“选项”也没有代理相关的配置,但是我们可以通过 about:config 这个界面来配置。

首先在浏览器地址栏中输入 about:config,调出配置界面。然后搜索proxy关键字,再找到如下键值,并做相应修改

network.proxy.socks localhost
network.proxy.socks_port 3210
network.proxy.socks_remote_dns true
network.proxy.type 1

其中localhost是代理的地址(因为基本都是走ssh tunnel,所以这里就是localhost了),端口自己设置一个就好,remote_dns设置为true表明使用远程服务器的dns解析,因为我们自己ISP的dns是有天生缺陷的,最后的type再启用SOCKS代理。

这个时候可以输入你想去的网址了(当然要先设置好ssh tunnel)。如果想取消代理就把“type”改成0,虽然比较麻烦,但也没有其他更好的方法了。还好我只需要启用一下,给OAUTH授权一下就好了,以后长时间都不用启用代理了。

Monthly Pic 2010 11

11月还是有不少值得记录一下的。首先是11月11号(北京时间)RHEL6的正式发布,然后是组里的老大Matt从美国来带我们Team Building…大家玩的都很happy,最后是比较无聊的测5.6的bug。

11月也花了不少钱。买了鞋、棉衣、手机、椅子,12月月初还交了3个月的房租,这一下就快1w进去了。接下来的日子节衣缩食。

下面上11月的照片。先是三张打球的。

这张我还是比较喜欢的:)

接下来是两张发球的照片。我的发球还算不错。

然后是我们去水泉沟的照片。那里还是很好玩的,比单纯的爬山有意思多了,各种越野道路

到了这个地方没有路了,被一个小水塘挡住了,只好电话叫来了船家。

然后一次三个人,就这么被拉过河。

最后到了传说中的水长城。

11月的活动还是很丰富的。12月,又一个40bug的5.5.z errata,有我忙的了。

配置Nokia n900的键盘,方便符号输入

纠结了快一年的n900在2010-11-28号终于买了,然后就开始享受折腾的乐趣了。在写正题之前还是习惯先讲故事,这次是讲关于n900的故事。

在2009年的12月,诺基亚刚刚发布n900的时候就开始关注这个手机了。n900是诺基亚第一款但很遗憾也是最后一款使用Maemo作为操作系统的智能手机。Maemo5是一个以Debian为基础的手机上的Linux操作系统。n900之所以吸引我就是因为它离我“手机上的Debian“这个,算是理想吧,最接近。之前一直”梦想“着能有一款能打电话的移动Linux系统,甚至想过自己给上网本搭配移动通信模块。而n900最遗憾的一点就是它的操作系统Maemo5只在这一款手机上出现,也是最后一款,以后的n系列高端手机将使用Maemo和Moblin合并之后的项目Meego作为操作系统了,但是Meego从Debian系转成了rpm系,从gtk转成了qt,这些改变都不是我喜欢的。所以我非常希望社区能够持续支持Maemo,让它发展成手机上的Debian,完全由社区维护、自由的、平滑升级的手机操作系统。(当然还有通话部分模块的二进制驱动,这个还需要诺基亚来支持,所以这里只是美好的愿望了)

n900刚发布的时候国内价格是4k+,那是在2月的时候。我从那个时候就开始在淘宝上关注了。有一家信誉很好的店铺,n900价格从开始的4k+到5月的3k左右,最后到7 8月的2k7左右。我想在它降到2k5以下的时候再入手,但是后来悲剧的发现,n900从那家店铺里下架了……之所以犹豫了这么长时间,是因为之前的n76完全没有坏,想买n900只是为了玩,而几k的玩具对我来说显然太贵了。这次能够下定决心买,也是因为物价飞涨,想赶在大膨胀来临之前把钱花出去。

故事就讲到这吧,下面终于进入正题了。

n900也有不少不完善的地方,比如默认的SHELL是/bin/sh,大部分命令都是busybox等等,这些都很好解决,主要的问题在于,键盘只有三行,虽然是全键盘,但是还不能覆盖PC键盘上的所有键位。对于要经常使用命令行的人来说,缺少以下符号键是不能容忍的!

| [ ] { } < > ~ ` % ^ ALT TAB ESC

TAB可以用ctrl+i来代替(要用bash),ESC基本只在vim里用,还可以忍受屏幕上的符号键,ALT键我一直没找到好的解决方法,这些modifier的修改比普通符号键要复杂一些,还没搞明白。这里主要是要解决前边那些基本的符号键的键盘输入问题。

这里要知道一个问题,那就是键盘上每个按键其实都对应4个keycode,它们是1) 直接按键的时候产生的,2)和shift键组合产生的,3)和FN键组合产生的,4)和shift+Fn组合产生的。比如‘a’,单独按的时候只产生一个字母‘a’,当和shift组合的时候就产生大写的‘A’,当和Fn键组合的时候就产生‘*‘,而键盘上所有键的第四种keycode都是和第三种一样的,所以我们就可以更改这个设置,让第四种组合产生我们确实的符号键。还有不少键前三种组合都没有用完,比如退格键和空格键,再有四个方向键。

要修改这个配置就需要修改一个文件,

/usr/share/X11/xkb/symbols/nokia_vndr/rx-51

这个文件里定义了所有的按键信息。编辑这个文件,找到“english_base”, “common_keys”和”arrows_4btns”这几个段,就是所需要修改的地方。我给自己的键盘做了自己的定义。(我没有修改方向键,基本都在english_base修改的)

符号        按键           名称
<          shift+Fn+y     less
>          shift+Fn+u     greater
[          shift+Fn+h     bracketleft
]          shift+Fn+j     bracketright
{          shift+Fn+n     braceleft
}          shift+Fn+m     braceright
~          shift+space    asciitilde
|          shift+bksp     bar
^          shift+Fn+space asciicircum
%          shift+bksp     percent
`          shift+Fn+,     grave

这里名称是在修改配置文件的时候需要填写的按键名称,其他按键的名称可以参考这里。比如我想修改y的按键行为,就修改y那一行

key <AD06>   { [     y,              Y,              6,              less      ] };

中括号中的四个按键代表了按键的四种组合,最后的less就是上边列出的“名称”。其他的键也做相应的修改就好了。

还可以参考以下两篇文章

http://natisbad.org/N900/n900-keyboard-remapping.html
http://cathay4t.blogspot.com/2010/03/perl-scripting-on-n900.html  (要翻墙)

配置文件修改好之后就可以重启或者运行setxkbmap命令重新加载键盘映射,这样就可以用实体键盘输入大部分常用的符号了。