分类目录归档:技术

让远程桌面(RDP)始终保持连接

RDP对我来说实在太重要了,但最近不知道是校园网还是电信网路由做调整,自动断开一段时间没有活动的连接,导致我切换回本地工作一会儿,再回到远程的时候,就得重新连接,非常麻烦。下面方法可以让连接一直保持着:

运行gpedit.msc,依次进入Computer Configuration -> Administrative Templates -> Windows Components -> Terminal Services -> Terminal Server -> Connections -> Configure keep-alive connection interval,将其Enabled,并设置interval到一个合理的值(单位:分钟)。我设置的1。

rdesktop Patch: Switch Local Workspaces and Windows by Local Hot Keys

rdesktop is a powerful RDP client for Linux. The inability of switch applications between remote side and local side by hot key makes it a little uncomfortable. Look around the internet, you can find many requests for the feature but no solutions. So I made the patch. It do things like:

  • Double press Ctrl+Alt+Left or Ctrl+Alt+Right to switch local active workspaces.
  • Double press Ctrl+Alt+Tab to switch local active window.
  • Other hot keys are sent directly to remote machine.
  • If using -fD options and having two or above workspaces, the effect is amazing!
  • If rdesktop is running in fullscreen mode (-f and without -D), Ctrl+Alt+Left/Right/Tab will toggle it to window mode first. After switching back, it can NOT toggle to fullscreen automatically. Press Ctrl+Alt+Enter to do that. (I know this is boring. But it is the best I can do. Rdesktop use override_redirect to implement fullscreen which makes it always the top-most window no matter which workspace/window you have switched to)

Download and unpack rdesktop.tgz to get a patched executable file: rdesktop. Overwrite /usr/bin/rdesktop with it. That’s all. The file was compiled with all debian/ubuntu official patches and tested in Ubuntu 9.10 (Karmic). It should work in other Linux distribution too. If it does or does not work in your environment, please leave a comment to report.

switch_local_workspace_and_window.patch is the code.

rdesktop忽略Ctrl+Alt+Left/Right的补丁

此贴已老,请移步rdesktop Patch: Switch Local Workspaces and Windows by Local Hot Keys

经常本地运行Linux,用rdesktop连接远程的Windows主机,两边配合工作。如果能通过快捷键切换两个桌面环境,会很方便。但rdesktop窗口会吸走所有的按键,发给远程桌面,包括Window Manager管理的热键。加上“-K”参数,远端就收不到很多热键了,比如最常用的Alt+Tab。在网上搜了一下,很多人都为此困扰,但没有任何解决办法。可能大牛们都只用纯用*nix,根本无视rdesktop的存在吧。于是,我就自己做了这个补丁,实现了下面的效果:

  • Linux桌面上要有至少两个Workspace,一个运行rdesktop,其余的本地用
  • 在rdesktop中,连按两次及以上的Ctrl+Alt+Left/Right,可以切换Workspace,也就是虚拟桌面
  • 建议启动rdesktop的时候,不加“-K”参数
  • 如果用全屏方式(-f)启动rdesktop,切换Workspace的时候,rdesktop会跟着走,达不到想要的效果。这和rdesktop用override_redirect方式实现全屏窗口有关。我不知道该怎么解决。如果有了解的朋友,请不吝赐教。我现在是用“-D”参数隐藏rdesktop窗口的外框,用“-g”设一个足够大的窗口,刚好上顶上面的panel,下踩下面的panel。

rdesktop_1.6.0-2ubuntu99_i386.deb是我在Ubuntu karmic上编译好的安装文件,估计Debian上也能用。用“sudo dpkg -i rdesktop_1.6.0_2ubuntu99_i386.deb”安装。其它平台可以下载rdesktop源代码,打上99_switch_desktop_support.dpatch补丁,自己编译试试,估计应该都能好用。

Android中文联系人拼音排序及检索补丁3.5版 for Android 1.6/donut

下载地址:http://sunner.cn/pinyin-patch-v3.5-donut.zip

注意:此版本可能只能在CyanogenMod的donut系列rom上使用,并且刷了cm rom后,至少要重启一次,才能再用本补丁。

和刷任何rom的方法都相同。第一次启动时,会在运营商画面停的时间比较长,此时正在重建数据库,系正常现象。

关于本补丁的功能,请阅读Android中文联系人拼音排序及检索补丁3.5版 for Android 1.5

显示学号的moodle补丁

曾经问过moodle的开发者,为什么用户资料中的学号(idnumber)在整套系统中都几乎被忽略。得到的回答是,学号在西方高校属于个人隐私,通过它可以获得一些秘密信息,所以不能随便公开。但中国不是这样,很多的管理都需要通过学号进行。所以,我在cms.hit.edu.cn上设定了注册时强制输入学号。但这个信息只有在看用户资料的时候才能看到,很多时候挺不方便。于是有了这个补丁,它会在学生全名的前面加上学号,例如:(96510103)张三。

Index: lib/moodlelib.php
===================================================================
RCS file: /cvsroot/moodle/moodle/lib/moodlelib.php,v
retrieving revision 1.960.2.137
diff -r1.960.2.137 moodlelib.php
2686c2686
<         return $user->firstname .' '. $user->lastname;
---
>         $fullname = $user->firstname .' '. $user->lastname;
2689c2689
<         return $user->lastname .' '. $user->firstname;
---
>         $fullname = $user->lastname .' '. $user->firstname;
2693c2693
<             return get_string('fullnamedisplay', '', $user);
---
>             $fullname = get_string('fullnamedisplay', '', $user);
2695c2695
<             return $user->firstname;
---
>             $fullname = $user->firstname;
2699c2699,2705
<     return get_string('fullnamedisplay', '', $user);
---
>     $fullname = get_string('fullnamedisplay', '', $user);
>
>     if (!empty($user->idnumber)) {
>         $fullname = "($user->idnumber)" . $fullname;
>     }
>
>     return $fullname;

不过,并不是所有显示姓名的地方都会把idnumber从数据库查询出来。所以如果想在某个特定地方看到学号,就必须得修改相关代码,select的时候包含上idnumber。

PC机和Android传递信息的最佳途径——QR Code

在G1上装了Barcode Scanner后,认识了QR Code,但没觉得这东西有多大的用处。

最近经常从androidin下载D版软件,走的是下载->拷贝到SD卡->G1安装的路子,途中数据线、读卡器什么的都得用上很麻烦。如果直接用G1的浏览器下载,访问网页的速度又太慢。今天突然想到,如果能把软件的下载链接用QR Code的方式显示,然后用G1一扫,就能直接下载、安装,岂不是相当舒服?

我想得到的,别人也想得到。Firefox插件Mobile Barcode就是干这个的。右键点击链接,弹出菜单里就可以显示该链接的QR Code。此外,还可以生成当前页面,或在页面上选择的文字的QR Code(扫描后,这段文字就直接在剪贴板中了,可以随意使用)。

装了这个插件后,一口气装了好几个软件,过瘾!

Android中文联系人拼音排序及检索补丁3.5版 for Android 1.5(0623更新)

donut/1.6用户请到这里下载

更新记录:

  • 2009-06-23:在zixia的帮助下,发现了处理长姓名的bug。现在安全和稳定性更好了。下载3.5版
  • 2009-05-03:稍微加快了一点点速度。提供了更灵活的方式,可以支持多种固件和recovery,详见下面的安装方法。下载3.43版
  • 2009-05-02:第二次更新,可以支持更广泛的甚至未来的固件。但对recovery有要求。目前在JF v1.43的recovery上测试通过。下载3.42版
  • 2009-05-02:支持直接输入中文检索。在原版ADP 1.5和JF ADP 1.5测试通过。下载3.41版
  • 2009-05-01:开始支持Android 1.5下载3.4版

主要功能:

  • 联系人按拼音排序
  • 用中文、全拼、简拼、简拼混合全拼和email地址检索联系人

安装方法:

  • 和刷固件的方法一样(建议使用JF的recovry程序)
  • 安装后如果无效,就进命令行先运行命令“su”。使用T-Mobile固件的,运行命令“/data/patch/uptm.sh”;使用其它固件的运行命令“/data/patch/up.sh”

劳动节,要劳动,而且要做公益劳动!

http://sunner.cn/pinyin-patch-v3.41.zip

在我的ADP 1.5原版上测试通过。一切功能照旧,使用方法照旧,只是支持1.5了。1.0版(也就是RC33、RC9等)的用户请继续使用3.21版的补丁。

原理上没有任何变化,补丁代码也没有一行变化,就是重新在1.5下编译了一下。有的目标文件甚至大小都没有变化。只有icudt38l.dat文件跟着1.5做了一个极其微小的调整。整体来说,应该比把之前的补丁直接用到1.5上稳定一些(心理层面)。

从cupcake的代码看,对日文方方面面的支持已经近乎完备了,不仅能日文排序,还能日文检索,还能按日本习惯分割电话号码……按照日文实现的思路和路线(比如在联系人数据库里增加了一个字段phonetic_name),很快也就能实现中文的类似功能。不过不知道谷歌中国、中国移动和来弄我这些android先驱们在干啥,源码树里一行这样的代码都还没有呢。

Android中文联系人排序及检索补丁的原理(090819更新)

2009年4月26日,更新了源码和相关文件

很久以前做了这个补丁,有幸的是朋友们都还算喜爱它,没白费功夫。不少朋友来信问它的原理,现在就讲一下。不过里面很多地方要靠回忆,未必很精确。如果你不能重现我所写的,欢迎提醒。另外要说明的是,下面所有的一切都是针对android 1.0的。

整个补丁的制作分五个步骤。

1. 制作支持中文排序和文字转换拼音的icudt38l.dat文件

先说一下icu4c。这是一个非常强大的开源软件,基本上把所有多语言要处理的问题都解决了。android对语言的处理主要就是调用它,但并没有包括中文相关的数据。所以先要把中文数据加进去。

android编译过程中直接将external/icu4c/stubdata/icudt38l.dat做为数据文件编译到目标代码中。所以只要向此文件添加中文的东西就行了。

我用的方法是直接下载icu4c的源代码,然后修改source/data/coll/root.txt,把data/coll/zh.txt的内容“合理地”替换进去。为了减少体积,只替换pinyin相关的东西。编译。

参考external/icu4c/stubdata/helper.sh,用新做好的coll/root.res替换icudt38l.dat里的coll/root.res,并将icu4c目标文件里的translit/Han_Latin.restranslit/root.res添加进去。

制作好的icudt38l.dat文件可以从这里下载。放到external/icu4c/stubdata/目录下,用“make libicudata”编译android,应该很快就能得到新生成的libicudata.so。用它替换ROM的同名文件,就已经能中文排序了(只对新增或修改过的联系人有效,详见第4步)。

2. 打开icu4c的translit功能

打开这个功能才能实现中文到拼音的转换,也才能实现快速检索。

打开的方法应该是修改external/icu4c下的某个编译配置文件。但具体改哪个,改成什么我记不清了。源代码也没在随时可以查看的机器上。等查到了,再来补写吧。

icu4c.diff里可以看到打开的方法,涉及到数个文件的简单修改。

3. 改变android为联系人建索引的方式

在联系人数据库中有一个peopleLookup表。它只有两个字段,第一个是token,第二个是联系人id。只要从键盘输入的字符和token能对应上,就会将改id的联系人显示在检索结果中。所以,只要把联系人的拼音写到token,就能实现用硬键盘快速检索。

所有的修改都集中于external/sqlite/android/sqlite3_android.cpp。这个文件为sqlite增加了一些android需要的功能,其中就有一个_TOKENIZE()函数。它的功能就是在指定的表中建立对给定id和字符串的索引。它还能对字符串进行分割,比如sunner sun,会建立三个索引“sunner”,“sun”和“sunner sun”。这就是android联系人功能的初始形态。

_TOKENIZE()的实现是tokenize()函数。我在这里面调用了icu4c的功能,把中文转换成拼音字串,然后再建索引,于是就能拼音检索了。就这么简单,代码也不长,在sqlite3_android.diff中。不过现在不在手边,以后再放上来。

4. 制作数据库刷新脚本

将上述修改编译后,替换到ROM中,并不能马上使用这些功能。因为现存联系人的各种索引信息都是旧的,必须更新一下它们。更新的方法很简单,就是把每个联系人的名字都写回一遍,然后把联系人数据库中的索引都更新一下。细节都在ROM升级文件的updatedb.sh中。

5. 制作ROM升级文件

替换system分区中的文件最好是在系统启动前,否则很可能会造成空间丢失。所以最终把这个补丁做成了一个update.zip,可以用刷机的方式刷上。

做它主要用到的工具是JF’s Build Environments(http://forum.xda-developers.com/showthread.php?t=475381)里的testsign.jar。

分析已有的update.zip文件,就能知道它的基本结构,很简单。按这个结构放好几个要替换的文件,写好update-script脚本(关于这个脚本的语法,只能从android源码获得,在recovery/commands.c里),打成zip包,然后

java -jar testsign.jar src.zip dst.zip

这里的src.zip是前面做好的压缩包,dst.zip就是最终产品。

大概就是这样。

3.21版的补丁在这里下载。