分类目录归档:技术

中文排序补丁 for Android 2.1 (Eclair)

image

  • 只有排序(包括联系人、应用程序等),没有检索
  • 无论系统语言设成什么,中文都是按照拼音排序。
  • 在CM 5.0.7/5.0.8上测试通过。其它Eclair的rom应该也能用。

下载地址:http://sunner.cn/pinyin-patch-sorting-only-eclair.zip

和任何Rom的安装方法一样,到Recovery模式下安装。安装后,需要清空一下联系人数据,再重新同步联系人,才能生效。清空方法:Settings->Application->Manage Applications->Menu Filter->All->Contacts Storage->Clear data

做开发的朋友可能用得到这个文件

Android 2.1 (Eclair)的中文联系人拼音检索(App方案)

上一篇文章谈了从修改android入手解决拼音检索的方案。刚才路上又想起了我最早做这件事时想的app方案。Eclair使app可以方便地实现这个功能。有两种策略:

  1. 无root情况,可以从name生成各种检索词,存入nickname,如果允许app写nickname的话
  2. 有root,可以直接操作contacts2.db,把检索词写入

除了中文,还可以用同样的方式去支持很多种语言,还可以靠缩写吸引拉丁语系的用户,群体很大。收费高级版提供周期自动更新检索词的功能,免费版必须手工运行才更新,同时显示广告。

app只有一个不能逾越的问题,就是做不到实时更新,这也是我当初最终选择改android的原因。不过,其实没有几个人刚加了联系人,就去搜索之,所以实时的意义并不大。

思路就是这样,谁有兴趣谁就玩吧,让我免费用收费版就行。

Android 2.1 (Eclair)的中文联系人拼音检索问题

Rainux早上留言说,CM的5.0.7开始支持G1了,而且速度很快。这让我又痒痒了。看了眼xda,现在还是test1,得等等才能用。为了用的时候马上就能爽,于是又跑进eclair的代码里,寻找拼音检索的解决方案。

折腾了一天,得出的结论是:

  1. Eclair已经可以用email地址中@前的字符,以及nickname(编辑联系人时点more可以添加多个nickname)检索联系人;
  2. 所以,我认为结合email、nickname和中文输入法检索,挺方便了。补丁有些不必要了。

如果有朋友还是想要拼音检索,我这里提供一些经验和思路,感兴趣的可以自己弄。

/data/data/com.android.providers.contacts/databases/contacts2.db是联系人数据库文件。其中表name_lookup保存所有的检索关键词,data_id和raw_contact_id分别对应data和raw_contact表。normalized_name就是检索关键词,以sortkey的16进制形式保存。name_type数值的含义定义在packages/providers/ContactsProvider/src/com/android/providers/contacts/ContactsDatabaseHelper.java中的NameLookupType类里。normalized_name多增加几行数据,就多几个关键词。

packages/providers/ContactsProvider/src/com/android/providers/contacts/NameNormalizer.java下定义的NameNormalizer::normalize(String name),是所有(至少我看到的都是)检索关键词入库前都要经过的一道处理。其实在这里把中文都转成拼音,就能实现拼音检索,但这样中文检索就没有了,而且不能实现简拼。

packages/providers/ContactsProvider/src/com/android/providers/contacts/ContactsProvider2.java下定义的StructuredNameRowHandler类,当姓名发生添加/变化时,该类都会被触发。如果在这里自动根据姓名生成若干全拼、简拼字串,然后把这些字串都添加到name_lookup里(调用insertNameLookupForStructuredName()就行),就可以实现拼音检索,而且不影响中文检索。这也许是最容易做到的了。但是不是肯定能实现,得实验才知道。

现在没兴趣(如果有人送我个N1,没准我就会有兴趣了,^_^)继续弄下去了,感兴趣的继续吧。

一台机器同时接多个键盘的系统测试

给笔记本接上了两个usb键盘,做了个测试,觉得挺有意思的。

Windows XP下,用记事本:

  • 两个键盘同时按“a”,出现“aa”;
  • 三个键盘同时按“a”,出现“aaa”;
  • 三个键盘分别按“a”、“b”、“c”,得到abc的随机排列。

貌似没啥特别的。好玩的是在Linux上。

Ubuntu 9.10,Linux 2.6.31。在控制台,一切正常,和XP表现一样。在gnome里:

  • 两个键盘同时按“a”,出现“aaa”;
  • 三个键盘同时按“a”,出现“aaaaa”;
  • 三个键盘分别按“a”、“b”、“c”,得到abc的随机排列。
  • 两个键盘同时按“a”,另一个键盘按“b”,输出结果里必然有一个“b”和三个“a”。

总结一下gnome的规律。设同时按动按键X的键盘个数为k,那么向系统输入的字符X的数目为2*k-1。

不知道这是否该算作一个bug。没有装KDE、xfce等其它窗口管理器,不能推断这是gnome的问题还是X或其它组件的问题。

多IP(路由、接入)Linux系统的管理

曾管理一台同时有教育网、网通和电信三条接入线路的服务器多年,最近终于略有小成,领略了多线管理的要点。想到现在vpn因为某些伟大的原因变得盛行,这也是一种多线路接入,故撰写此文,同时做为自己的备忘。

为简化,下面仅描述双线的情况。假设两条线路的配置如下:

  1. eth0设备,IP:1.1.1.1,网关:1.1.1.9
  2. eth1设备,IP:2.2.2.2,网关:2.2.2.9

1. 配置基本路由

路由决定了从本地访问不同网站会自动从哪条线路走。比如运行命令:

route add -net 3.3.3.3 netmask 255.255.255.0 gw 1.1.1.9

此后所有对3.3.3.x的访问都会自动从线路一出去。线路一访问哪里快,就把到哪里的路由都配到线路一,然后把线路二配成缺省路由:

route add -net default gw 2.2.2.9

这样所有不从线路一走的访问就从线路二走了。当然,也可以让线路一做缺省,线路二逐条配,具体情况就看怎么方便了。

2.配置基于源地址的策略路由

对于一般用户而言,完成基本路由的配置就够了。但如果这台机器希望通过两条线路同时对外提供服务,或者想使用后面第4条介绍的东东,那么就必须配置源地址路由。为什么呢?原因并不难理解,但挺绕嘴,所以我就不说了。

首先修改/etc/iproute2/rt_tables,增加类似下面两行:

100 line1
101 line2

再用下面命令完成路由配置:

ip route add default via 1.1.1.9 table line1
ip rule add from 1.1.1.1 table line1
ip route add default via 2.2.2.9 table line2
ip rule add from 2.2.2.2 table line2

上面命令的意思是让所有从1.1.1.1发出的包都走1.1.1.9这个网关,所有从2.2.2.2发出的包都走2.2.2.9这个网关。

3. 测速

ping是最常用的测速命令。如果想测试到一个网站(比如:3.3.3.3)的速度,可以先把它路由到线路一,ping一次,再路由到线路二,再ping一次,比较ping的结果决定把它放入哪个路由。这样太麻烦了。无论当前路由是什么样,用下面命令

ping -I eth0 3.3.3.3

都是从线路一ping 3.3.3.3。同理:

ping -I eth1 3.3.3.3

都是从线路二ping 3.3.3.3。

我还拼凑出一个脚本,命名为mping,可以一行命令从多条线路ping一个网址,如下:

#!/bin/sh
 
ifconfig  | grep 'inet addr:'| grep -v '127.0.0.1' | 
cut -d: -f2 | awk '{ print $1}' |
xargs --verbose -I srcip fping $* -eS srcip 2>&1

使用它之前得先安装fping。

4. 若干命令忽视路由的参数

很多命令都能忽视路由配置,直接通过参数指定走哪条线路,列出我知道的几个:

wget --bind-address=x.x.x.x ......
ssh -b x.x.x.x
lftp中set net:socket-bind-ipv4 x.x.x.x

squid中可以这样配置:

acl bgfw dstdomain .google.com .wikipedia.org .............
tcp_outgoing_address x.x.x.x bgfw

我猜想,应该有某个命令可以以wrapper,通过它启动的进程发出网络连接时的来源地址永远是这个命令指定的地址。但我没搜到这样的东东。如果谁知道,赶快告诉我!