2009年4月29日星期三

Android中文联系人排序及检索补丁的原理

转自http://blog.sunner.cn/2009/04/android_pinyin_sorting/


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

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

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

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

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

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

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

参考external/icu4c/stubdata/helper.sh,用新做好的coll/en.res替换icudt38l.dat里的coll/en.res,并将icu4c目标文件里的translit/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版的补丁在这里下载。

Android相关项目

转自
http://www.zymose.com/android/projects/index.html

Apache Commons Codec

Codec 包含一些通用的编码解码算法。包括一些语音编码器, Hex, Base64, 以及URL encoder.

Apache commons logging

Apache的Common Logging是一个高层的日志框架,本身并没有实现真正的写日志能力,而是依赖其它的日志系统如Log4j或者java本身的 java.util.logging。可以通过配置文件来设定最终使用log4j还是java.util.logging。

Apache Harmony

Apache Harmony 的提案在 2005 年 5 月被 Apache 软件基金会(ASF)接受,并且按照 ASF 惯例成为一个孵化器(incubator)项目。
Harmony 为自己定了两个目标,首先是开发出一个独立并且与现有 JDK 兼容的 Java SE 5 实现,并且以 Apache 软件许可证 2.0 版发行;其次是建立一个开放的模块化运行时架构,包括虚拟机和类库之间及其内部的模块化,并通过这个平台,允许社区在此基础上自由定制自己的 Java 实现,或者对某个模块单独进行创新。
Apache Harmony 项目的成立以及它的这两个目标具有很大的现实意义。首先,由于商业JDK的流行性,它们几乎成为事实上的标准,所以 Harmony 必须与它们保持高度的兼容,才能够使应用程序的迁移成本最低,也就相对容易被用户所接受;其次,Harmony 存在的重要意义之一就在于这是一个属于开源社区的 Java 平台,在这个平台上,社区可以自由的移植和创新,而一个开放的模块化的架构,将为移植和创新带来最大的便利性;最后,Apache 软件许可证是一个对商业公司和开源社区都比较友好的开源许可证,因此 Harmony 可以给最大范围的开发人员和用户带来便利。本文和本系列后续文章将详细介绍 Harmony 在兼容性和模块化方面的努力,以及这些目标带来的价值。
也许正是基于以上一些原因,Harmony 项目成立仅仅一年多一点的时间,就得到了广泛的支持和关注,并且得以飞速发展。目前,Apache Harmony 已经拥有了一个活跃的开发社区,并且接受了来自公司,学校和个人的多次捐赠。IBM 在 developerWorks 上提供了一个 Java 虚拟机环境的免费下载,以支持 Harmony 项目的开发,还多次捐赠了核心类库的实现和测试代码,在 IBM 英国 Hursley 软件开发实验室和中国软件开发中心各有一个开发团队积极参与 Harmony 项目。此外 Harmony 项目还接受了三个 Java 虚拟机实现的捐赠,另外还有一个开源 Java 虚拟机 SableVM 正在积极的与 Harmony 社区合作以实现与 Harmony 类库的集成。Java SE 实现难度最大的是其规模庞大的类库,而最近的类库 API 覆盖率统计表明,Harmony 的 J2SE 1.4.2 类库 API 的覆盖率已经超过 80%,Java SE 5 的覆盖率已经达到 79% 以上。目前经不完全测试,在 Harmony 上已经可以良好运行 Eclipse、JEdit、Ant 等流行的 Java 工具,并且可以部分运行 Tomcat 和 Geronimo 等企业应用。

Apache HttpClient

HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient
    以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的主页。
  • 实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
  • 支持自动转向
  • 支持 HTTPS 协议
  • 支持代理服务器等

Apache HttpComponents

HttpComponents 为那些要用到HTTP协议的程序(包括客户端和服务器端)提供支持.包括Web浏览器,网络爬虫,HTTP代理.Web Services等.

bluez

该项目为Linux下的蓝牙无线协议的实现.源代码用GPL协议发布.

Bouncy Castle Crypto

Bouncy Castle 是一种用于 Java 平台的开放源码的轻量级密码术包。它支持大量的密码术算法,并提供 JCE 1.2.1 的实现。因为 Bouncy Castle 被设计成轻量级的,所以从 J2SE 1.4 到 J2ME(包括 MIDP)平台,它都可以运行。它是在 MIDP 上运行的唯一完整的密码术包。

Google Apps APIs

Google Apps是Google 推出的在线的应用应用服务。说得通俗一点,通过 Goolge Apps ,你可以向你的用户提供带有私人标志的电子邮件、即时通信(网上聊天),日历工具,网站设计工具,协同办公工具等。当然,这些服务都是由 Google 托管,而不需要你安装或维护任何软硬件,并且和 Google 的其他服务一样,它们都是免费的。

Google Calendar APIs and Tools

Google日历API支持多种语言程序,包括Java、.NET、PHP、Python和JavaScript等,通过Google日历API, 可以在浏览器客户端实现对日历的完全控制,如进行日程的读取、创建、编辑或删除等操作。

Google data APIs

GData是一种简单的标准协议,用于网络数据的读写。它结合了常见的基于xml的数据聚合格式(Atom与RSS)以及基于 Atom发布协议的Feed发布体系,并扩展了部分功能用于处理查询功能。有时,我们需要发送一个查询请求给服务器,并得到服务器返回的相符的查询结果, 而目前的Atom和RSS标准都不具备这一功能。GData让用户可以使用聚合(syndication)的机制来发送请求并接收结果,它使你可以发送数 据给Google,更新那些Google已经拥有的数据。 这些技术化的说明听起来似乎有点让人头晕。不过,简单地理解,GData扩展了原有的RSS和Atom协议,使其从一种单向的聚合变成了双向的互动,这似 乎是大家都在探索的feed的未来发展方向,比如微软的SSE。 Google 一直以来给人的感觉是对RSS和Atom都不太热心,这次为什么突然提出这个新标准。国外的blogger众说纷纭,Joe Gregorio认为,GData是将RSS、Atom,尤其是Atom发布协议(Atom Publishing Protocol)与Amazon的Openserch标准相结合;Maurice Codik认为GData标准使Google的数据更加开放,各种应用之间可以更方便地利用这一标准来使用数据;甚至有人认为这使得基于Google各种 应用的企业门户雏形开始显现。

Google Map API

Google Maps API是Google公司提供的地图编程接口,使用这个API你可以方便的把Google的地图信息和你自己的数据整合建立你的地理信息服务。

Google Spreadsheets Data API

Google Spreadsheets Data API允许第三方应用程序以Google data API ("GData") 的形式访问Google Docs & Spreadsheets 里的文件数据,包括: 上传本地计算机中的Word 文档或电子表格文档。

ICU(International Components for Unicode)

International Component for Unicode (以下简称 ICU) 是一套稳定成熟、功能强大、轻便易用和跨平台支持Unicode 的开发包,使得开发人员在 C/C++ 和 Java 上开发全球化软件产品更容易,ICU 是由 IBM 发布和维护,并且是开放源代码的。
ICU 可以根据客户端的语言环境给客户返回最接近语言的字符串,也就是说客户端可能与服务器端的语言环境不一致,不能只根据服务器端的语言来返回字符串。而且将 来单独增加或维护资源文件,不需要重新生成可执行文件或动态链接库。为了提高重用性,最好将所有资源信息统一管理,不是每个模块各自维护管理。
ICU是实现Unicode标准最好的开源类库(没有“之一”),目前有ICU4C和ICU4J两个主要版本。IBM作为ICU最重要的支持力量,为它多年的发展做了很大贡献。

JSon

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
    JSON建构于两种结构:
  • “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表 (hash table),有键列表(keyed list),或者关联数组 (associative array)。
  • 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。

KXML

KXML是一个只占很小存储空间的XML语法分析程序,对于J2ME应用程序非常适合。它有一个非常独特的DOM操作方法和被称为Pull的语法分析方法。
    它有以下性能:  
  • 支持XML名称空间
  • 用"松散"模式分析HTML或其它SGML格式
  •   
  • 占用很少的存储空间(21 kbps)
  • 基于Pull的分析
  • 支持XML写操作
  • 可选的DOM支持
  • 可选的WAP支持

mobile control

mobile-control project为移动设备提供基于Java的M2M解决方案。

OpenGL

OpenGL是用于开发简捷的交互式二维和三维图形应用程序的最佳环境,任何高性能的图形应用程序,从3D动画、CAD辅助设计到可视化访真,都可以利用 OpenGL高质量、高性能的特点。OpenGL自1992年出现以来,逐渐发展完善,已成为一个唯一开放的,独立于应用平台的图形标准,一个典型的 OpenGL应用程序可以在任何平台上运行--只需要使用目标系统的OpenGL库重新编译一下。

SQLite

SQLite是一个支持事务的小型数据库。

WebKit

WebKit是一款开源浏览器引擎。WebKit开始于一个Html与Javascript代码支持的KDE项目,2003年 Steve Jobs在Macworld上宣布正式采用Webkit,现在WebKit是Mac OS X系统架构下Safari、Dashboard、Mail和其它应用程序的Framework名称。   除了Google的Android,WebKit现在应用于苹果的iPhone,以及NOKIA的Symbian S60手机平台中,例如N和E系列中自带的Web Browser for S60。   在桌面领域,基于WebKit的Safari现在拥有3%至5%的浏览器市场占有率,使它成为除微软IE,Mozilla的Firefox之外的第三 大浏览器

XmlPull v1

XmlPull v1 API 是非常好用的XML推解析API。该API非常简单,而且具有很好的性能。可以用在J2ME上。也可以用作服务器端。XML拉解析允许增量解析。解析可以随时中断和恢复解析(当程序获得更多输入的时候)。

2009年4月28日星期二

G1之旅

还真是不少会玩的人,看看吧。
如果你手头有个G1手机,好几千块大洋呢,
你就甘心只是打打电话、发发短信?
那你就是太暴珍天物了。

先看人家是怎么玩的,
然后屁颠屁颠地折腾他丫的,
把那几千大洋赚回来再说。
第一步,获取root权限。

体验过当皇帝的感觉吗?
反正我没有,
可是如果你玩过linux,没有root权限,那还玩的什么劲呢。

拿到root权限后的玩法就多啦去了,
自己编译修改google最新的源代码,然后安装到G1里去,
对开发人员而言,尤其是开源社区的人员而言,
这是一个多么贴心的诱惑,我是很忍不住的啦。

想在自己的G1手机上加入multi-tap的支持吗?

如果野心更大一点,
自己做一个add-ons发布给别人做开发平台,
真是心有多高,
梦就有多远。

2008年12月30日星期二

从Statusbar看Android应用开发

我们将按照SDK文档的组织思路,探索Android的Statusbar应用的开发,本文适合已经完成新兵训练课的同学,你至少浏览过该课程内容。

实现Android的UI
本节内容有
a、怎么实现一个屏幕UI;
b、如何在xml文件中定义屏幕UI并载入到程序代码中;
c、响应UI的各种处理。

Topic1 屏幕元素的层次
Android应用的基本功能单元是Activity,但它本身不具备在屏幕显示的能力;
Android平台的基本UI表达单元是viewviewgroup,前者抽象了widget,后者抽象了layout.
用View和Viewgroup的节点树来定义Activity的UI,构建时可使用平台预定义或自己扩充的widget和layout。把树的根节点传给Activity的setContentView()函数,Android系统就保存根节点的引用,当该Activity被激活并接收焦点时,系统通知该Activity并通知它的根节点计算并显示整棵树,由根节点依次通知它的各子节点重画,Viewgroup子节点负责其直接儿子的重画。
每个Viewgroup类都嵌套实现一个派生自ViewGroup.LayoutParams类,供其子view描述大小和位置,每个子view必须定义与其父viewgroup相近的LayoutParams。viewgroup包含宽度和高度,还可以含页边距和边框。
演示:
a、开启emulator,用hierarchyviewer工具查看status bar的view/viewgroup树。
b、查看源代码,找到向系统设置该树根节点的地方。

Topic2 常用Layout对象(viewgroup)
最简单的就是FrameLayout, 在屏幕上预留出一块区域,此后每次添加对象(如图片)时,都直接从左上角开始,如果填入的对象不是透明的,该区域先前的对象直接被抹掉。
只简单水平或垂直排列所有子view的LinearLayout,不论子view宽度/高度,都独自占一行(vertical)或列(horizontal)。各子view可指定间距及对齐方式,还可以用weight来指定空白空间的分配比例。
表格布局TableLayout可以在每个单元里设定一个view对象。
绝对布局AbsoluteLayout允许子view指定自己在屏幕上的绝对坐标,除非迫不得已,不推荐使用。
相对布局RelativeLayout则允许子view指定相对于其它子view的相对位置。
这里用一张表简单总结了重要的viewgroup(包含这里没列出来的)。
演示:Statusbar用到的viewgroup。

Topic3 带数据的viewgroup
带UI的viewgroup对象通常派生AdapterView(如Gallery和ListView),这些对象需要
a、在layout里填数据。绑定到某个负责获取数据(hard code或从db中查询)的Adapter即可。
b、处理用户的选择。在AdapterView.OnItemClickerListener类的成员onItemClick方法监听。
演示:Statusbar没有此类view group.

Topic4 在XML中设计屏幕
Android的各个派生View类成员的XML语法在Layout Resources里有定义。在应用的目录res/layout下每个XML文件描述一个View(简单的可视元素或含有子对象的layout元素),最后分别被编译成一个单独View资源,在Activity.onCreate()中可通过setContentView(R.layout.xxx_file_name)加载到代码中。
演示:查看并分析Statusbar屏幕对应的XML文件。
演示:向statusbar中新增一个icon(right icon/类似digital clock)。

Topic5 处理屏幕元素
通过Activity.findViewById方法可以得到屏幕元素,然后使用它可用的方法。
演示:Statusbar屏幕元素的处理。

Topic6 监听UI通知
除Android系统自动发出调用的一些UI通知(如Activity中键盘按下与松开,Widget的焦点切换)外,其它回调都需要手工注册(如按钮的点击事件)。
演示:Statusbar手工注册的回调。

Topic7 应用程序的Theme
a、在XML中分别指定application级或activity级的theme属性。
b、在创建view之前由代码设置,不推荐使用这种方法,因为代码设置的theme不能改变在应用启动前的运行系统动画的theme。

Topic8 UI元素及概念的术语表
#Activity
Android应用程序的标准屏,一个可以被本应用或其它应用抛出的匹配Intent启动的类。是一个全屏、浮动或透明窗口的可见化表示,并接收处理UI事件,进而完成复杂的Task.
#View
屏幕一个矩形区,绘画、处理触屏点击,按键及其它交互事件。它是Activity或Dialog屏(text boxes, windows等)组件的基类。接收来自容纳它的容器对象调用进行自绘,并把自己理想的位置和大小告诉它的父对象(尽管父对象可以不理会)
#View Group
可持有多个子View对象的容器,决定了这些子对象的位置与总的大小,需要的时候通知它们进行自绘。可以是不可见的layout本身,也可以自带UI(如滚动列表框)。在widget包中。
#Widget
可自绘并处理UI事件的元素,如文本框或弹出菜单。
#Drawable
装到其它UI元素中的可视元素,常用作背景图。不接收事件,但具备其它属性如状态及定时启用是派生的动画对象或图片库所需的功能。
#Panel
只是一个概念,一个与父窗体紧密联系的View能处理点击并进行简单的跟它父窗体相关的功能。它会浮动在父窗体前并相对于父窗体定位(如Android自带的option菜单可为各屏共用),目前没有类或方法用来创建Panel
#Dialog
浮动窗体,可含有按钮,轻量级窗体常用于处理简单事件(如按钮按下)或者返回结果。不会保存在历史栈里,不适合含有复杂的layout或作复杂的处理,自带有一些常用的标准布局。
#Window
描述通用窗体的常见抽象,如外观(标题栏文本,菜单的定位及内容等)。Dialog和Activity用它的某个实现来绘制窗体。一般不需要实现此类。
#Surface
用来合成屏幕的一块内存,持有用于绘画的Canvas对象,提供绘制layers和改变大小用的辅助方法,不要直接使用此类,可用SurfaceView.
#SurfaceView
一个封装Surface类的View对象用来绘图,提供一些可动态指定它大小和格式的方法。摄像程序的预览功能就用它来实现。为资源紧张型应用(如游戏)提供了一种独立于UI线程进行绘图的方式,会使用额外的内存,同时支持Canvas和OpenGL ES图形。
#Canvas
绘制surface实际位合成,提供绘画bitmaps,线,圆,矩形,文本等方法,是在屏幕画2D对象最简单的方式。便不支持硬件加速。
#OpenGL ES
用于快速、复杂的3D图像,比Canvas对象难用,但更适于3D对象。功能分布在opengl和javax.microedition.khronos.opengles两个包里。

演示:Statusbar涉及到的术语

Android的组件
本节详细描绘各个关键组件(Intents, Activities, Views和事件)。Android应用更像松耦合的组件联邦而不是一个紧耦合的应用,默认各组件都跑在同一进程里,也可以指定某组件在一个单独的进程中运行。
AndroidManifest.xml
Activities
Views
Intents
Services
Notifications
#Android强烈推荐的通知用户注意的机制,在状态栏上显示一个小图标,用户与该图标交互来接收信息。
ContentProviders

演示:Statusbar的各组件.

存储/读取数据
Android应用读写数据有多种方式,各针对不同的需要。
Preferences
Files
Databases
Content Providers
Network

演示:Statusbar用到数据读写功能吗?

安全模型
权限控制与请求,让应用间共享与安全同时兼顾。

演示:Statusbar安全相关?

资源管理与i18n
资源管理系统,资源(如图片,本地化字符串,XML布局)是属于应用的,在运行时解析。本节包括:
a、如何国际化与本地化。
b、如何解析、装载需要的资源。
c、如何创建与使用资源。

演示:Statusbar的资源。

2008年12月21日星期日

Android应用开发之新兵训练课

Android为上层就用程序开发提供了SDK及其文档,这是一个除了源代碼之外的官方的正式信息来源,所有从事就用开发的新兵蛋蛋都可以从这里开始,当然,就像玩游戏一样,如果你没有耐心慢慢来(有时候也确实挺无聊的),完全可以到网上去搜一下各种各样的秘笈。
思绪是不是回到了那快乐却一去不复返了的青春年华?快回来吧,抓紧热身,我们需要按文档指导去安装开发环境(SDK,eclipse及ADT),了解开发和调试的基本知识,然后照猫画虎,整个"Hello Android"玩玩。

我在看各种文档是常常会不停地打开各个相关的链接,想一下子把什么都搞明白。到最后往往都会忘记自己本来是想干什么来着。所以现在我有必要让思想做一些改变,不是什么都需要现在就搞清楚的,要会舍得。要好读文档,要不求甚解。

是时候了解Android应用程序作个简单地系統剖析了,只要对各个組成块有个简单概念就可以了(Activity, Broadcast Intent Receiver, Service和Content Provider),技能是练出来的,没听说过可以看出来的(当然不是说不需要看,而是说看到的要转化成技能,最終还得练),就让我们练习的过程中时不时再回过头来看看吧。

看一下Android就用开发的新手上路都要做些什么吧。闯关去吧,如果你太菜,你也可以选择看每关现存的攻略,但是建议多点耐心,最好别上来就看攻略,至少应该给自己一个说得过去的理由:我不是个孬种,我心安理得。

新兵同志,你的第一项任务是赶到演练场,找到被敌人摧毁的信息系統,尽快修复它的Notepadv1部分,使之正常工作,让我们的人能够向系統添加信息到数据库中,修改信息的功能对我们来说并不是件紧迫的任务。如果我们的情报没错的话,在你到达演练场的时候,要修复的系統还没有完全被摧毁,这将大大节省你的修复时间。是你唯一可以找到帮助的地方,你现在开始直到任务完成,你将需要独自行动,再见。

很好,我们又有新任务了,我们刚刚接到指示需要立刻完成往信息系统添加记录,编辑和删除已有记录的功能。这一次没有提供新的帮助信息。你完成任务后,呆在原地等待命令。

你的成绩很不错,接下来是整个新兵训练的最后一关:我们正在用的系统似乎不能很好的维护自己的状态。新的任务要求:
a、新建/编辑信息界面直接与数据库交互取得信息记录,外部调用只告知记录号。
b、该界面的确认按钮被按下时,主动结束本活动。
c、新建/编辑活动结束时,保存当前信息记录号,它会在下次构建此活动界面实例时由系统传入。
d、利用系统机制,在新建/编辑活动主动或被动暂停时,保存当前信息到数据库里,新建的信息还需要维护新生成的记录号以便暂停的活动恢复里可以继续编辑。
e、新建/编辑活动恢复时,用实际数据库内容更新界面。

恭喜!新兵训练课结束。回去自己写个心得/体会,总结一下。

2008年12月20日星期六

Linux启动过程性能分析工具Bootchar的工作原理

在linux启动过程收集信息并保存在内存中,到启动完成后才把这引起信息保存到磁盘。它統計CPU和磁盘使用状态,进程信息,数据来源于/proc文件系統。
通过修改bootloader初始化选项并设定为bootchartd的路径(init=/sbin/bootchartd),它就会被bootloader启动,它初始化完成后转调linux的内核,这样它就可以监管linux的整个启动过程。

这样的思路同样可以在嵌入式linux系統中使用,先要移植bootchart使它可以在目标平台上运行,然后修改目标平台的bootloader,让bootloader启动bootchartd而不是linux内核,工具的关键在于从/proc文件系統。

Ubuntu Tips

Linux有发布版本有不少,曾经尝试过一些,现在因为工作的原因,开始用了ubuntu,在联网的环境里ubuntu是一个相当不错的选择,这个社区比较活跃,当然,因为活跃,所以不是很多东西都很成熟。

我们常常都会觉得我们系統启动时间太长,恨不能一按power键,系統就ON了,当然,那不过是a pleasant dream, 据说有一个叫做bootchart的項目,安装后重启系統,就可以收集启动信息,以图表的形式保存在/var/log/bootchart/,想不想试一下

在大陸,网络状况常常是相当的不理想,所以安装完Ubuntu 8.10后,我第一件事就是要修改/etc/apt/sources.list,用大家公认的台湾官方链接取代默认的設置,此后,运行apt-get系列的命令要快很多很多,光从这一点看,我们拿什么来“和平統一”台湾啊?

各位看官,听还听收音机吗?听音乐吗?我现在喜欢在Linux上边玩边听网络收音机,rhythmbox很不错的,加拿大的CBC基本上总是可以听到的。

Ubuntu8.10发布的安装盘分两种,desktop版和server版,二者是有点区别的,最明显的就是前者不包含各种服务如www,ftp,mail,ssh,telnet等服务,后者不包含图形化的桌面系統如KDE和gnome。但是Linux有一个好处,就是你的地盘你做主,缺什么完全可以自己补装就可以了,我以前在server加装过gnome,后来直接装了desktop版,今天需要手工加装telnet和openssh-server后就可以从另一台机器远程登录了,sudo apt-get install xinetd telnetd openssh-server。