Deb packages for viewing Chinese characters on Nokia 770

Below are packages I created for viewing Chinese characters on Nokia 770 (2006 OS):

The latest two files are two themes which can display Chinese characters on the title bar correctly. The look and feel of theme1-zh_CN and theme2-zh_CN are same with them1 and theme2 shipped with Nokia 770.

You can save these files on the MMC card, then install them by using Application manager.

I have tested on my Nokia 770 (OS 2006 edition v. 2.2006.39-14).

修改Nokia 770的Root Image

假设当前工作目录是$HOME/nokia_770

1. 下载最新的image文件,OS 2006 edition v. 2.2006.39-14
http://www.maemo.org/downloads/nokia_770

2. 下载Linux下的更新工具flasher-2.0
http://maemo.org/downloads/d3.php

3. 下载用于生成jffs2映像的shell脚本
http://stage.maemo.org/svn/integration/trunk/rootimagescripts/tar2jffs2.sh

3. 安装mtd-tools,因为需要它提供的mkfs.jffs2和sumtool这两个工具

$ sudo apt-get install mtd-tools

或者(你需要先安装wajig)

$ wajig install mtd-tools

4. 首先从官方的image文件里解压出rootfs.jffs2这个文件

$ mkdir SE2006_image
$ cd SE2006_image
$ sudo ../flasher-2.0 --unpack \
-F ../SU-18_2006SE_2.2006.39-14_PR_F5_MR0_ARM.bin

5. 挂载上一步得到的rootfs.jffs2

$ sudo modprobe mtdblock
$ sudo modprobe mtdram total_size=65536 erase_size=256
$ sudo modprobe jffs2
$ sudo modprobe loop
$ sudo losetup /dev/loop0 \
$HOME/nokia_770/SE2006_image/rootfs.jffs2
$ sudo dd if=$HOME/nokia_770/SE2006_image/rootfs.jffs2 \
of=/dev/mtdblock0
$ sudo mkdir /mnt/jffs2
$ sudo mount -t jffs2 /dev/mtdblock0 /mnt/jffs2

6. 从/mnt/jffs2获得rootfs的内容,以便修改

$ mkdir myRootFS
$ cd myRootFS
$ sudo tar czf - /mnt/jffs2 | tar xvzf -

7. 卸载/mnt/jffs2

$ sudo umount /mnt/jffs2
$ sudo losetup -d /dev/loop0
$ sudo rmmod jffs2
$ sudo rmmod loop
$ sudo rmmod mtdram
$ sudo rmmod mtdblock

8. 现在可以做一些修改了,比如给/etc/apt/sources.list添加一些更新源,更改/usr/sbin/gainroot和/etc/sudoers以便获得root权限,添加中文字体等等,或者添加一些软件包

9. 重新将修改后的rootfs做成image

$ cd myRootFS/mnt/jffs2
$ sudo tar czvf $HOME/nokia_770/myRootImage.tgz .
$ cd $HOME/nokia_770
$ sudo ./tar2jffs2.sh myRootImage.tgz

10. 将修改过的root image写到770上

$ sudo ./flasher-2.0 --rootfs myRootImage.jffs2 \
--flash-only rootfs --flash --reboot
flasher v0.8.1 (May 30 2006)

Suitable USB device not found, waiting

用USB线接入你的770,然后开机。一切正常的话,可以看到类似这样的信息:

Found device SU-18, hardware revision 1602

同时,770的屏幕上也可以看到更新的进度条。更新结束后,会自动重新启动。

Ref:

  1. http://maemo.org/maemowiki/HOWTO_FlashLatestNokiaImageWithLinux
  2. http://maemo.org/maemowiki/ModifyingRootImage
  3. http://maemo.org/maemowiki/HowDoiBecomeRoot

Ubuntu Edgy Eft Release Party In Beijing

参加的人真不少,感觉大部分是附近高校的学生朋友。幸好我也有学生朋友帮我占座 :)

Mark的演讲里提到下一个版本的一些新feature,比如3D Desktop、支持windows games(CS, starcraft, etc.)

印象比较深的一句:really join the communtiy

一些感受:
1. 现场翻译效果不太好,显然并不了解技术和opensource背景
2. 等到ubuntu中文社区的老大介绍贡献方法时,人就开始走了,显然要想使opensorce本质深入人心还需要时间

贴几张照片,用手机拍的(我的老6600),效果不太好 :( ,最后一张是回去路上拍的ms大楼,呵呵。
Mark's speech
Mark's speech


glade+pygtk学习 (3)

这几天用pygtk和glade写了一个不大的应用,在ubuntu下开发,然后移植到Maemo平台。

学习的过程中发现了SimpleGladeApp.py这个module,可以更方便地以面向对象的方式使用libgrade。

还记得serverinfo这个例子吗?里面是这样得到一个widget的实例的:

self.wTree = gtk.glade.XML(self.gladefile, self.windowname)
self.logwindowview = self.wTree.get_widget("textview1")

用了SimpleGladeApp.py,直接用self.logwindowview就行了。

下面是改造serverinfo使用SimpleGladeApp.py的步骤:

1. 从 http://www.gnomefiles.org/app.php/SimpleGladeApp.py 下载SimpleGladeApp.py

2. 解压缩后把tepache这个脚本放到你的PATH环境变量指定的路径下,比如/usr/local/bin,然后加上执行权限。

3. 我们已经有现成的serverinfo.glade文件了,现在要做的是用tepache这个脚本解析glade文件来生成一个Python模块,里面是一些对应window或dialog等顶层widget的class,并实现他们的callback方法。命令如下(-o选项是为了不覆盖原来的serverinfo.py):

$ tepache serverinfo.glade -o serverinfo_new.py
written file serverinfo_new.py
$ ls
serverinfo.glade serverinfo_new.py serverinfo.py
serverinfo.gladep serverinfo_new.py.orig SimpleGladeApp.py


可以看到tepache生成了三个文件:serverinfo_new.py, serverinfo_new.py.orig, SimpleGladeApp.py
.orig文件很重要,tepache用这个文件保护你在serverinfo_new.py添加的代码,所以不要删除这个文件。

可以先运行serverinfo_new.py看看效果。

4. serverinfo_new.py的部分代码:

......
# Warning: Do not modify any context comment such as #--
# They are required to keep user's code
......
from SimpleGladeApp import SimpleGladeApp
from SimpleGladeApp import bindtextdomain

app_name = "serverinfo"
app_version = "0.0.1"

glade_dir = ""
locale_dir = ""

bindtextdomain(app_name, locale_dir)

class Serverinfo(SimpleGladeApp):

def __init__(self, path="serverinfo.glade",
root="serverinfo",
domain=app_name, **kwargs):
path = os.path.join(glade_dir, path)
SimpleGladeApp.__init__(self, path, root, domain, **kwargs)

#-- Serverinfo.new {
def new(self):
print "A new %s has been created" % self.__class__.__name__
#-- Serverinfo.new }

#-- Serverinfo custom methods {
# Write your own methods here
#-- Serverinfo custom methods }

#-- Serverinfo.on_serverinfo_destroy {
def on_serverinfo_destroy(self, widget, *args):
print "on_serverinfo_destroy called with self.%s" % widget.get_name()
#-- Serverinfo.on_serverinfo_destroy }
......
#-- main {

def main():
serverinfo = Serverinfo()
demodialog = Demodialog()

serverinfo.run()

if __name__ == "__main__":
main()

#-- main }

5. 现在就可以添加一些代码来实现serverinfo的功能了。注意不要修改形如#-- Demodialog custom methods { 这样的注释,否则如果界面(glade文件)有了改动,tepache就没法做patch了。

把原来的insert_row改成ServerInfo类的一个方法,放在#-- Serverinfo custom methods 注释之间。
goUrl方法也放在这里。 注意访问widget实例的方法已经由

host = self.wTree.get_widget("entry1").get_text()

变成

host = self.entry1.get_text()

main方法里的实例化Demodialog的语句要挪到button2的clicked事件响应方法里,不然程序一运行对话框就出现了,你刚才一定注意到了。

destroy响应方法里加入self.gtk_main_quit()以便窗口销毁时能够退出程序。

6. 现在运行serverinfo_new.py,原来serverinfo.py的功能基本上都有了。但有一个问题,对话框弹出后点击“确定”或“取消”按钮都不能关闭对话框。我的解决办法是不在glade设计这个对话框,完成在程序里用代码实现。

7. 注意每次重新设计了界面,修改了glade文件,都要运行tepache来patch生成的python模块,已做的修改不会被覆盖。

新的代码下载地址: http://guoyong.org/?dl=pygtk-learning-serverinfo-simplegladeapp.tar.bz2