Archive for the ‘技术’ Category.

强制Makefile中的一条必须执行

一个工程有多个子目录。每个子目录下都有一个Makefile,将该子目录下的源代码编译为一个.o文件。根目录下的Makefile控制将这些.o链接到一起形成最终的执行文件。执行文件只依赖.o文件,对每个.o的处理规则都是进入其子目录然后make。这种布局会遇到一个问题,就是子目录里有源码的修改,根目录Makefile定义的依赖关系里检测不到,就不会重新编译。被这个问题困扰很久,今天看qt的Makefile,发现了一个很巧的解决方法。

subdir1/sub1.o: FORCE
    cd subdir1 && make
 
subdir2/sub2.o: FORCE
    cd subdir2 && make
 
FORCE:

Android内核开发的几个便捷命令

在android源码的根目录下执行:

. build/envsetup.sh

可以获得下列非常方便的命令:

croot:   Changes directory to the top of the tree.
m:       Makes from the top of the tree.
mm:      Builds all of the modules in the current directory.
mmm:     Builds all of the modules in the supplied directories.
cgrep:   Greps on all local C/C++ files.
jgrep:   Greps on all local Java files.
resgrep: Greps on all local res/*.xml files.
godir:   Go to the directory containing a file.

当我第一次获知它们的时候,内流满面啊……

用“help”命令可以获知更多……

Android 2.2 (Froyo) 中文联系人拼音检索增强补丁

Froyo终于开始官方支持在任何系统语言下都能把中文联系人按照拼音顺序排序,并且支持全拼和简拼(可以从名字中间任意一字的拼音开始)检索。这要感谢一位叫Bai Tao的工程师。

不过,google的改进有一点不如我以前的补丁,只是很小的一点,就是用“gdg”可以搜索到“郭德纲”,而“gdgang”不行。gdgang这种简全混合的模式在同一简拼的联系人较多的时候,只要比纯简拼多敲1-2个字符,就能让检索的结果好很多。比如“gdga”可以过滤掉郭得乖、国大贵、关定格等等。

下面这个补丁,就补全了这个功能:

--- a/src/com/android/providers/contacts/ContactLocaleUtils.java
+++ b/src/com/android/providers/contacts/ContactLocaleUtils.java
@@ -102,7 +102,13 @@ public class ContactLocaleUtils {
                 final Token token = tokens.get(i);
                 if (Token.PINYIN == token.type) {
                     keyPinyin.insert(0, token.target);
-                    keyInitial.insert(0, token.target.charAt(0));
+                    if (i == tokenCount - 1) {
+                        // Use all characters of the last token
+                        keyInitial.insert(0, token.target);
+                    } else {
+                        // Use the first character of other tokens
+                        keyInitial.insert(0, token.target.charAt(0));
+                    }
                 } else if (Token.LATIN == token.type) {
                     // Avoid adding space at the end of String.
                     if (keyPinyin.length() > 0) {
@@ -112,7 +118,13 @@ public class ContactLocaleUtils {
                         keyOrignal.insert(0, ' ');
                     }
                     keyPinyin.insert(0, token.source);
-                    keyInitial.insert(0, token.source.charAt(0));
+                    if (i == tokenCount - 1) {
+                        // Use all characters of the last token
+                        keyInitial.insert(0, token.source);
+                    } else {
+                        // Use the first character of other tokens
+                        keyInitial.insert(0, token.source.charAt(0));
+                    }
                 }
                 keyOrignal.insert(0, token.source);
                 keys.add(keyOrignal.toString());

我已经编译好一个,安装方法如下:

  1. 下载ContactsProvider.apk,通过adb、Root Explorer等覆盖Android系统的/system/app/下的同名文件;或者下载pyin-patch-froyo-0.1.zip,用刷rom的方法刷一下。
  2. 更改两次系统的语言(比如:中文->英文->中文),并且更改后等一小会儿,让系统在后台刷新联系人检索关键词数据库。
  3. 搞定!

以上内容在CM 6.0 RC3 for G1测试通过。理论上说,只要是2.2的Rom应该都能用,除非厂商自己在ContactsProvider里动了手脚。

欢迎反馈使用情况。如果比较多人喜欢这个,可以考虑提交给google……

Linux内核源码中寻找系统调用入口

在内核源码目录下使用下面命令:

grep SYSCALL_DEFINE[0-6]\(XXXX * -R --include=*.c

XXXX可以替换为任何系统调用名。未必能找到所有的,八九不离十吧。至少2.6.32下是这样。

Moodle Online Judge 1.3.1发布

新特性:

  1. 支持40余种编程语言的在线评测。新语言的支持来自于ideone.com,这是一个免费的Web服务。所有程序都是在ideone.com运行,所以对您的moodle服务器而言,是相当安全。该功能由刘琦卿开发。
  2. 因为可以使用ideone.com运行程序,所以从这个版本开始支持Windows了

下载请到:http://code.google.com/p/sunner-projects/downloads/list

中文排序补丁 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,没准我就会有兴趣了,^_^)继续弄下去了,感兴趣的继续吧。

Moodle在线评测1.2版发布

这个版本最大的改进是不再延迟评分,而是实时评分(由计算机学院06级学生刘琦卿开发)。此外增加了把编译警告视为编译错误的功能,可以帮助学生养成更好的编程习惯。再就是一些安全增强和小修补。

该插件的详细介绍在:http://code.google.com/p/sunner-projects/wiki/OnlineJudgeAssignmentType

在moodle中用姓氏检索用户的补丁

这个补丁可以达到下图效果:

补丁下载。打补丁方法:在moodle目录下用命令“patch -p0 < index-by-surname.patch”。注意,“-p0”中是数字0,不是字母o

还要把langconfig.php存入moodledata/lang/zh_cn_utf8_local/中。如果这个目录不存在,就新建之。