Android: Wakelocks and TuxOnIce

最近為了把 TuxOnIce 整到 Android 上面,著實把 Linux 的電源管
理系統中關於 suspend 與 hibernation 的部份研究了一下。而 Android 為了增
加待機時間加入了 wakelock 的機制,讓情況變得更加複雜。

TuxOnIce

TOI Patch

TuxOnIce 簡稱 TOI,前身是 Software Suspend 2,是一個長期在 linux
upstream 以外耕耘的一個休眠補釘,相較於早期整合到 linux kernel 內的
swsusp,TOI 的功能非常豐富,可以指定把記憶體內容儲存到多種不同的位置,
如檔案或置換空間,還可以選擇不同的壓縮方法。

首先幫 ARM 平台加上基本的休眠功能,使用 Hiroshi DOYU 的 patch:

http://article.gmane.org/gmane.linux.power-management.general/20543

然後到 TOI 網站下載最新的 3.2 補釘,打上去的時候會有一些衝突但是都還滿
容易解決,要注意的是某些衝突是看不出來的,例如因為函式移動位置而造成重
複定義,要小心檢查。

然後因為 TOI 對於非 x86 平台有一些假設現在已經不適用,所以需要修改

https://gitorious.org/0xlab-kernel/kernel/commit/e551caf

OMAPFB

使用 Pandaboard 加上 Android 測試才發現從休眠醒來後 LCD 不會自動點亮,
通常在 x86 平台上有 pm-utils 或是 hibernate script 來幫忙處理這種關閉打
開 LCD 的問題,這次我是先在 kernel 內幫 OMAPFB 加上一個電源管理的呼叫,
讓 kernel 醒來的時候自己重新設定 LCD。

https://gitorious.org/0xlab-kernel/kernel/commit/21e0f14

Pandaboard & Beagleboard xM

在 Pandaboard 或 Beagleboard xM 上面沒有 NAND 可以當作儲存空間,所以一
般都是把檔案放在MMC 上面,第一個 patch 讓 kernel 在開機的時候不要初始化
不存在的 NAND 空間

https://gitorious.org/0xlab-kernel/kernel/commit/3ae6b4c

然後因為 MMC 的 probe 需要時間,第二個 patch 讓 TOI 等待指定的 resume
device 已經偵測到之後才開始進行 resume

https://gitorious.org/0xlab-kernel/kernel/commit/1078bd7

Wakelock

wakelock 是 Android 為了讓裝置可以更積極的休眠又不妨礙正常工作的進行而
加入的機制,究竟是好是壞已經在 LKML 與 LWN 上面討論過非
常多次,可以參考:

失眠症

開始測試 TOI 的效果時遇到的第一個問題就是失眠症,因為 wakelock 從中作
梗,導致每次休眠到一半就被取消掉。原來是因為 TOI 的休眠途徑會先強制檔
案系統把內容寫回,而 MMC 子系統會在寫入/讀取一段時間後嘗試進入低耗電模
式,偏偏 Android 在這裡安插了一個 wakelock,導致之後要凍結所有執行緒的
時候失敗。

解法,首先因為休眠的後半段路徑其實就是要準備進行關機,而一般來說休眠都
是人為啟動,因此可以假設此時使用者了解工作可能還未完成,可以忽略
wakelock,所以第一個 patch 就是讓休眠的路徑不去檢查 wakelock,避免像
MMC 這樣的問題。

https://gitorious.org/0xlab-kernel/kernel/commit/3bb5d6f

接下來是一般的待機路徑,似乎是因為新的 kernel 會積極的嘗試把 MMC 變成
低耗電模式,但 OMAP 預設的 MMC timeout 是 100 毫秒,把工作放在 Queue
裡面反而不斷鎖住 wakelock 讓 Android 無法休眠,第二個 patch 就是讓 MMC
子系統在準備休眠的時候就不要作無謂的掙扎,直接進入低耗電模式。

https://gitorious.org/0xlab-kernel/kernel/commit/88823b9

嗜睡症

解決了失眠症沒想到接下來遇到嗜睡症,因為手機插著 USB 的時候是不會真正
睡著的,所以一直沒機會觀察 Android 睡著是怎麼樣,原來只把 kernel 叫醒
是沒用的,Android 還會檢查目前的 input event 是否屬於 user activity 的
範圍,是的話才會把整個系統帶醒,不然因為 wakelock 的機制,馬上就會又睡
著。

參考:

Android 2.3 Introduction & Statistics

如果你有收看 LWN.net 的話,大概知道每次 linux kernel 有新的 release 前
都會有一次針對這次 release 的統計資料,看看主要的貢獻是由哪些人,哪些
公司完成。藉由這次跟 0xlab 分享 Android 2.3 新特性的時候,我學 LWN.net
做了一些小統計,還滿有趣的。

Most active Android 2.3 organizations (by changesets)

4204 google.com
1354 android.com
98 sonyericsson.com
71 gmail.com
39 codeaurora.org
39 samsung.com
38 intel.com
32 nokia.com
32 holtmann.org
29 0xlab.org
25 trusted-logic.com
17 openbossa.org
11 nxp.com
11 linux.org.tw
10 ti.com
10 acer.com.tw
8 themaw.net
8 garmin.com
7 snpe.rs
7 motorola.com
7 mc.pp.se
7 googlemail.com
5 invensense.com
4 mirbsd.org
3 windriver.com
3 realvnc.com
2 teleca.com
2 sharp.co.jp
2 nvidia.com
2 motoya.co.jp
2 lge.com
2 broadcom.com
1 yahoo-inc.com
1 xs4all.nl
1 wdsglobal.com
1 uwevoelker.de
1 strongswan.org
1 stericsson.com
1 signove.com
1 saftware.de
1 richlowe.net
1 pv.com
1 promwad.com
1 pcc.me.uk
1 padovan.org
1 osbeck.com
1 nii.net
1 martin.st
1 ilovelinux.de
1 happydroid.com
1 droidmod.org
1 cpeterso.com
1 big.or.jp
1 arm.com

Most active Android 2.3 developers (by lines changed)

Jesse Wilson
Eric Laurent
Dianne Hackborn
David 'Digit' Turner
Nick Pelly
Mathias Agopian
Nick Kralevich
Brian Carlstrom
Eric Fischer
Andreas Huber
386588
364359
260033
205494
160707
124119
103004
83492
61646
61233
12.8708%
12.13%
8.65%
6.84% 
5.35%
4.13%
3.42%
2.77%
2.05%
2.03%

投影片中還研究了一下各主要開發者主要研究的方向,看 log 的時候依照這個
順序去看,有一定的脈絡可尋 🙂

Understanding UUID

通用唯一識別碼 (Universally Unique IDentifier, UUID) 或是全域唯一識別
碼 (Globally Unique IDentifier, GUID) 是一個 128 bits 的整數,並保證其
在時間與空間的分佈都是獨一無二的。UUID 由開放軟體基金會(OSF) 標準化後
用在他們的 DCE 系統上,後來在微軟的 COM 系統上發揚光大。除此之外在許多
地方也都可以看到 UUID 的身影,如 Linux 上的分割表/區塊裝置就是以 UUID
來標示,或是RSS 的 <guid> 標籤也可以使用 UUID,實際上 UUID 是標準的
URN 表示法之一,你可以在任何需要標示單一物件的地方使用 UUID。

UUID 的文字形式為一個 8-4-4-4-12 的十六進位表示,共有 16 個 bytes,有
人說使用 UUID 不方便人類辨識,但了解 UUID 的組成後你還是可以從這個表示
法看出一些端倪來。本文參考的是 IETF 版本的 RFC4122。

UUID

UUID 共有四個版本,第 13 個字元的位置就是表示版本號。第一種是以時間和網
路卡號組成,時間是以一百奈秒為單位,網路卡號理論上是不會重複的,再加上
clock_seq 這個每次開機重設一次的亂數欄位,就算時間回朔了也不會重複,
代號是 1。第二種和第四種是以命名空間加上一個 hash 組成的,分別可以使
用MD5 或是 SHA1 演算法,算出來後就填到空位中,代號是 35。第三種
是全亂數組成,代號是 4

因此我們可以在不同的情境選用不同的 UUID,也可以從 UUID 看出版本跟時間等
資訊,如 4ef17586-f187-11df-8xxx-xxxxxxxxxxxx 看到第三個區塊是
11df 就可以知道是最近產生的以時間卡號為基礎的 UUID,時間
1dff1874ef17586 解出來就是 2010-11-16 13:42:09.173031.0 UTC。而
7c0fdbe4-1b09-4278-9fc9-5f0c6a1f2ae2 就是純亂數的 UUID,沒有任何
意義。

uuid-el

在轉換 Blog 到 ikiwiki 的時候,為了要整合 Disqus 系統,每篇都需要一個唯
一的識別碼,這樣 Disqus 就只認 UUID 而不是網址,將來網址變了也可以對得
上,而此 ID 也可以用在 RSS, ATOM 上面。研究了 RFC 4122 後,用 elisp 寫
了產生 UUID 的工具,uuid-el,使用只需要:

(require 'uuid)
;; Generate UUIDv1
(uuid-1)
;; Generate UUIDv4
(uuid-4)
;; Generate UUIDv3, v5
(uuid-3 uuid-ns-url "http://example.com")
(uuid-4 uuid-ns-url "http://example.com")

搭配以下 snippet 就可以快速展開需要的 metadata:

# -*- mode: snippet -*-
# name: meta
# key: meta
# --
\[[!meta title="$1"]]
\[[!meta guid="${1:$(uuid-urn (uuid-5 uuid-ns-kanru text))}"]]
\[[!meta date="${2:`(current-time-string)`}"]]
$0

最後補上影片:

下一集:用 ffmpeg 製作桌面錄影

Blog Redesigned

最近又把 Blog 整頓了一番,目標是改用靜態網頁。使用靜態網頁搭配一些網頁
樣板程式不禁讓人想起最初使用 MT 來寫 Blog 的時候,不同的是現在有像
Disqus 或是 IntenseDebate 這樣的動態留言服務,讓網頁可以完全
的只提供靜態內容,不用多一個 cgi 程式來提供留言功能,這隱然成為最近流行
的網頁設計方法之一。

轉換的過程中學到一些新東西,紀錄於此。

網頁編譯器

現在網頁是用
IkiWiki
產生的,它是大師 Joey Hess 的作品,大師稱它是一個
wiki compiler
可以透過各種規則把網頁的原始碼 (可能是 markdown 的格式) 轉成 HTML 網頁。
因為強大的 inline 規則以及各式各樣的外掛程式,也有許多人把 ikiwiki 當作
Blog 的平台。

轉換的過程其實滿順利的,因為舊的 Blog 都是以 Markdown 寫成,換到
ikiwiki 的 Markdown 引擎只需要一點點修改。要感謝 WordPress 可以把資料
庫匯出成 XML 格式,轉換只需要簡單的 XSLT 就完成了,我用的
XSL 是參考這裡修改,去掉
Comment 以及更新 meta的格式而成。

改用文字編輯器來寫 Blog 後,會習慣在 72 行的地方換行,但是在瀏覽器中只
要換行就會多一個空白,以前寫網頁的時候遇到中文都要小心的換行才不會讓不
該空白的地方出現空白,也不能打開 Emacs 的 auto-fill 模式。拜 ikiwiki
強大的外掛程式架構以及 Perl 的 Unicode 正規表示式支援,寫個
外掛把不該空白的地方黏起來只要幾分鐘
時間!而 Blog 原始碼則維持容易閱讀的格式。

screenshot

HTML5

既然都換了 Blog 系統,也打算換新的版面,乾脆就升級到網頁標準的新世代
HTML5。在收集 HTML5 相關資訊時發現了 HTML5 Boilerplate 這個網頁樣
板計畫,包含了許多目前 HTML5 的 Best Practice,基於這個樣板設計網頁讓
你馬上就 HTML5 Ready ☺

我認為 HTML5 最有趣的一點是帶有語意的新標籤,如 <article>,
<section> 等等,搭配新的大綱演算法可以自動產生大綱,運用得當
的話,對於機器或是身體不便的人都能更方便的取得資訊。

ikiwiki 原本就有支援實驗性的 HTML5 模式,但是預設的樣板不是很完美,例如
多層嵌套的 <section><nav><article>,都會產生多餘的大綱節
點,若只是需要群組與排版功能的話,最好還是使用 <div> 就好。如我現在
用的 template 長得就像這樣:

    <article>
        <header>
            <h1>TITLE</h1>
            <time>TIME</time>
        </header>
        <div class="content">
            CONTENT
        </div>
        <footer></footer>
    </article>

這裡推薦使用 HTML 5 Outliner 來檢查網頁的大綱,或是用專門的
Chrome 擴展,如果網頁設計無誤,應該會看到如下乾淨的大綱:

screenshot

Web Fonts

使用網路字體可以讓網頁在不同的作業系統、不同的瀏覽器上看起來都是一樣的,
現在有很多提供網路字體的服務,像是 Google 也推出
Google Font Directory,甚至 Fonts.com 還有免費的中文網路字體,
參考 Type Is Beautiful測試頁,速度還不錯呢。

我現在用的是從 Font Squirrel 下載的自由字體,這個網站上不但有大
量的自由字體可以挑選,還有預先整理好的 @font-face Kits 可以直接使用,
或是用 @font-face Generator 產生最佳化的網路字體。

結語

這篇是心得筆記的性質,因為如果不紀錄一下可能很快就忘了…有許多細節都省
略過去,若是要深入探討則每個主題都可以發展成長篇大論,需要更詳細資料的
網友可以參考引用的連結。

一些眉眉角角的東西希望之後有機會可以再單獨拿出來分享囉 ☻

TOP 20 Space-Hungry Packages

Arch Linux 與 Debian 皆可以在安裝的時候選擇最小安裝,究竟哪一個
Distribution 在使用一段時間之後最佔空間呢? 剛安裝完的時候似乎是 Arch
比較小一點,但是因為 Debian 套件切的比較細,所以最後可能是 Debian 會比
較小。

當初在試用 Arch 的時候寫了小程式來畫出前 20 個最佔空間的套件,並依此來
瘦身,結果如下:

Arch Linux Package Size TOP 20
Debian Package Size TOP 20

兩邊因為安裝的套件種類不同因此無從比較,Arch 的 TeXLive 因為沒有切所以
會比 Debian 上較大一點,Debian 上的 ghc6 則是為了測試 xmonad 裝的,
Haskell 本身做出來的執行檔就頗大,ghc6 需要 369MB 實在不意外…

底下是製作圖片的程式,實際上是用 Google Chart API 畫的:

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from pygooglechart import StackedHorizontalBarChart, Axis
    from subprocess import *
     
    TITLE="Debian Package Size TOP 20"
    PKGSIZE_PROG="./dpkgsize"
    OUTPUT="debian-top20pkg.png"
     
    chart = StackedHorizontalBarChart(930, 320)
    chart.set_bar_width(10)
    chart.set_title(TITLE)
     
    size_data = []
    name_data = []
     
    for ln in Popen([PKGSIZE_PROG], stdout=PIPE).stdout:
        size, name = ln.split()
        size_data.append(int(size))
        name_data.append(name)
     
    chart.add_data(size_data[:20])
     
    max_size = size_data[20]
    min_size = size_data[0]
    label = map(lambda x: str(x / 1024)+"MB",
                xrange(min_size, max_size, (max_size-min_size)/10))
    label.reverse()
     
    rev_name_data = name_data[:20]
    rev_name_data.reverse()
    chart.set_axis_labels(Axis.LEFT, rev_name_data)
    chart.set_axis_labels(Axis.BOTTOM, label)
     
    print(chart.get_url())
    chart.download(OUTPUT)

PKGSIZE_PROG 代換成自己 Distro 的就可以了:

Debian:

    #!/bin/sh
    dpkg-query -W -f='${Installed-Size} ${Package}\n'|sort -nr

Arch:

    #!/bin/sh
    pacman -Qi|awk '/^Installed Size/{print int($4), name} /^Name/{name=$3}'|sort -nr

Cool stuff: Pipeline library

如何在 C 程式中方便使用 pipeline 呢?

Unix pipeline 之父說 Unix 程式的哲學就是「只做一件事,並把它做好」:

“This is the Unix philosophy: Write programs that do one thing and do
it well. Write programs to work together. Write programs to handle
text streams, because that is a universal interface.”
― Doug McIlroy, the inventor of Unix pipes

平常有在使用 shell 的朋友想必對 | 這個符號不陌生,他可以把多個指令頭尾相接,各展所長,讓我們可以把各程式的力量組合起來成一個強大的 pipeline。

在 shell script 中可以輕鬆做到的事在程式中就不一定這麼簡單了,在 perl 中可以直接用 open 打開程式作為輸出入裝置,在 python 中有 subprocess 模組的 Popen 可以用,但如果只寫 C 呢?你可以用 pipe2 配合 forkexec—沒錯,想起 Unix Programming 課本了嗎 😉

用 C 寫這樣的程式既麻煩又容易寫錯,Colin Watson 寫到他在維護 man-db 的時候為此寫了專用的 pipeline library,現在決定要把 libpipeline 獨立以 GPLv3 釋出

使用 libpipeline 如果我們要產生像

    apt-get moo|cowsay -n

這樣的 pipeline,可以這樣寫:

    pipeline *p;
    int status;
    p = pipeline_new ();
    pipeline_command_args (p, "apt-get", "moo", NULL);
    pipeline_command_args (p, "cowsay", "-n", NULL);
    pipeline_start (p);
    status = pipeline_wait (p);
    pipeline_free (p);

還可以在 pipeline 中間安插 “built-in” 命令:

    command *inproc = command_new_function ("in-process", &func, NULL, NULL);
    pipeline_command (p, inproc);

有趣嗎?更詳細的說明可以參考 libpipeline(3) 說明文件。

Kindle 來我家

做功課

是這樣的,某天在 IRC 上看到某長輩發言 “j5g: Hmm….有點想買 Kindle DX”,小宇宙就有了光,開始上網搜尋 Kindle 相關資訊,經過 Amazon, Wikipedia, Mobile01, MobileRead 無情的生火之後,終於爆炸了啦啦啦!首先是 Kindle DX 的規格

  • 顯示:9.7 吋 E-Ink®, 825×1200 畫素,150 ppi, 16 級灰階,大小約比 A4 小一點
  • 重量:536 克,適合坐著閱讀
  • 記憶空間:4G
  • 連線: MicroUSB
  • 網路: 3G 上網
  • CPU: Freescale 532 MHz, ARM11 (猜測)
  • 作業系統: Linux 2.6.10*

嗯.. 作業系統是 Linux!有門!趕緊再搜尋一下,的確已經有許許多多成功 Hack Kindle 的案例,其容易的程度,說他是 Hackable Device 也不為過。

開箱

折騰了兩週,訂購的 Kindle DXG 終於在生日當天送達!小小開箱慶祝一下:

開箱之後就是充電,開始把各種不同的文件丟進去測試。這個版本的 Firmware (2.5.5) 對於 PDF 的支援其實已經不錯了,會自動裁掉多餘的留白,內嵌字型也都正常顯示,是一開始閱讀中文的方案之一。測試各種檔案之後發現只有一種不太適合放上來看,就是字很多的雙欄格式論文,因為顯示全頁會顯的字太小,偏偏 150 ppi 的解析度看不太清楚,若是放大瀏覽的話,雙欄論文的走向會需要來回拖拉,而拖拉正是目前 E-Ink® 的弱點…

除此之外,在 Kindle 上面閱讀是非常好的體驗,E-Ink® 的特性可以讓人真的進入閱讀的情境之中,內建的 Text-To-Speech 質量非常好,就有如真人在幫你朗讀一樣,新版的 Firmware 還新增了 Collection 的功能,解決 Kindle 以前一直為人詬病的無法分類電子書的問題,Kindle 3 的新 3.0 Firmware 還有直接支援多國語言,內建 Webkit 瀏覽器等。

中文

最早是把中文檔案做成 PDF 後再放進去瀏覽,但是 PDF 沒有章節不能做註解不能改變字型大小,就是有那麼一點不方便,如果可以直接看中文電子書多好?一不做二不休參考 MobileRead 論壇上的 Font Hack,先 JB 後安裝字型,之後就可以開始看中文電子書了!

不過因為系統一次只用一種字型,沒有 Fontconfig 的取代機制,所以若是把字型全部直接換為 Droid Sans Fallback,那所有的 Sans, Serif, Mono 通通變得一樣醜… 這時把 FontForge 拿出來,寫個 Script 把原本的 Kindle 字型和 Droid Sans Fallback 合併,就可以保留美觀的英文字跟還可以的中文。

    # merge-fonts.pe
    # Usage:
    # Put the Chinese fonts under ch/ and original fonts under en/
    # Run: fontforge -script merge-fonts.pe
    #
    # Pre-operation for some non-standard Chinese font file
    Open("ch/Droid_Sans_Fallback.ttf")
    SelectAll()
    ScaleToEm(1024)
    Generate("temp.ttf", "", 0x14)
    Close()
     
    # Open English font and merge to the Chinese font
    Open("en/Helvetica_LT_65_Medium.ttf")
    SelectAll()
    ScaleToEm(1024)
     
    MergeFonts("temp.ttf")
    Generate("Sans_Regular.ttf", "", 0x14)
    Close()
    # Add more fonts below

不過這樣處理過的字型是不能散佈的,自己使用就好囉 😉

現在可以到古騰堡計劃下載電子書,或是把好讀網的 PDB 格式利用 Calibre 轉成 Mobi 檔案給 Kindle 用。當然若是有出版商販賣 .epub 格式或是其他可以轉檔的電子書,也都可以在 Kindle 上面瀏覽了 🙂

閱讀之餘

如最前面所說,Kindle 可以不只是電子書,還是台 Hackable 的玩意。諸如用 RS232 連線,安裝自己的程式甚至是 Ubuntu 都有人做過了,哪一天 Amazon 真的不再提供軟體升級的時候,我知道我的 Kindle 還是可以繼續帶來不一樣的樂趣 🙂

從 Amazon 取得 Kindle 的 GPL 源始碼,搭配 Firmware Update 的檔案內容,可以發現 Kindle 是相當傳統的 Linux 環境加上 Java 寫的系統程式,因此只要拿到 shell 之後 (無論是透過為裝的 Firmware Update 或是直接拉線開 serial port,或是開 USB Network),就可以作很多有趣的事 🙂

       0 ./gplrelease/
     368 ./gplrelease/alsa-lib-1.0.13_patch.tar.gz
     544 ./gplrelease/alsa-utils-1.0.13_patch.tar.gz
     946 ./gplrelease/e2fsprogs-1.38_patch.tar.gz
    1529 ./gplrelease/procps-3.2.7_patch.tar.gz
    2131 ./gplrelease/module-init-tools-3.2.2_patch.tar.gz
    3996 ./gplrelease/base-files-3.0.14.ipk
   20480 ./gplrelease/fuse-2.7.1_link.tar
   41295 ./gplrelease/picocom-1.4.tar.gz
   44398 ./gplrelease/hotplug-2004_09_20.tar.gz
   46222 ./gplrelease/base-passwd_3.5.9.tar.gz
   55813 ./gplrelease/dosfstools-2.11.tar.bz2
   72842 ./gplrelease/powertop-1.10.tar.gz
   80630 ./gplrelease/bonnie++-1.03c.tgz
   99009 ./gplrelease/sysvinit-2.86.tar.gz
  169182 ./gplrelease/module-init-tools-3.2.2.tar.bz2
  173558 ./gplrelease/iptables-1.3.3.tar.bz2
  194250 ./gplrelease/udev-112.tar.bz2
  222558 ./gplrelease/bootchart-0.9.tar.bz2
  280041 ./gplrelease/mtd-utils-1.0.0.tar.gz
  280938 ./gplrelease/lrzsz-0.12.20.tar.gz
  281965 ./gplrelease/procps-3.2.7.tar.gz
  345794 ./gplrelease/libol-0.3.18.tar.gz
  375416 ./gplrelease/ifupdown_0.6.8.tar.gz
  426692 ./gplrelease/lzo-1.08.tar.gz
  506312 ./gplrelease/fuse-2.7.1.tar.gz
  607442 ./gplrelease/taglib-1.5.tar.bz2
  649399 ./gplrelease/klibc-1.5.tar.bz2
  709862 ./gplrelease/alsa-lib-1.0.13.tar.bz2
  712166 ./gplrelease/syslog-ng-1.6.11.tar.gz
  961662 ./gplrelease/readline-4.3.tar.gz
  980874 ./gplrelease/alsa-utils-1.0.13.tar.bz2
 1195099 ./gplrelease/gst-plugins-base-0.10.6.tar.bz2
 1370907 ./gplrelease/util-linux-2.12r.tar.bz2
 1735498 ./gplrelease/busybox-1.7.2.tar.bz2
 1849092 ./gplrelease/gst-plugins-base-0.10.17.tar.bz2
 2167909 ./gplrelease/gstreamer-0.10.17.tar.bz2
 2902738 ./gplrelease/glib-2.12.9.tar.bz2
 3621193 ./gplrelease/e2fsprogs-1.38.tar.gz
 6969637 ./gplrelease/uboot-1.3.0-rc3.tar.bz2
13080365 ./gplrelease/binutils-2.17.50.0.5.tar.bz2
15321839 ./gplrelease/glibc-2.5.tar.bz2
39707720 ./gplrelease/gcc-4.1.2.tar.bz2
47285020 ./gplrelease/linux-2.6.22-lab126.tar.bz2

Happy Hacking!

Update

有網友提到有個名為“多看”的自製系統,可以安裝在 Kindle 上和原本系統共存。此自製系統整明了要以 Kindle 硬體為底打造自己的電子書系統是可行的,還支援了中文輸入、直接閱讀 ePub 等,社群討論也很踴躍。但是 此系統內許多元件來自 GPL/LGPL 授權的自由軟體,卻沒有提供相關的原始碼,此為不正確的示範,希望該團隊不要再自欺欺人…

版权说明:
  Copyright 2010 DuoKan & www.duokan.com. All Rights Resevered
  版权所有 DuoKan & www.duokan.com。
  本软件由 DuoKan Dev Team 开发。
  多看软件系统未经许可不得商业贩卖。作者对有商业贩卖行为的单位和个人保留追究其法
  律责任的权利。

等到哪天被追究才後悔莫及呀…

[非官方] COSCUP 2010 Mobile App

今年 GoogleIO 時 Android team 不斷在推廣一個 Android UI Pattern,可以觀察到最早利用這個 Pattern 的應該是預設的 Facebook 程式,接下來發展的更為完備的是 Twitter 官方程式,處處可以見到該 Pattern 的影子。GoogleIO 前 Google 也推出一個程式叫作 IOSched 用來顯示議程相關資訊,同樣是使用該 Pattern 的實作。雖然 Twitter 承諾會釋出 source code,但是一直沒下文,因此想要使用這個 UI Pattern 的可以說完全沒有範例可以參考。

今年 COSCUP 就參考 IOSched,嘗試從頭打造一個類似的程式,順便練習一下怎麼使用這個 UI Pattern,結果寫好後才知道上官大神早有 HTML5 的版本,連 IOSched 不知道什麼時候也有 source code 了 (汗)

無論如何,總算是練習了一下 Android Programming,有參加 COSCUP 的人可以試用看看 😛

Source code 在 http://github.com/kanru/Coscup2010

AndroidDev: Provision the device

在 Devkit8000 上把 HOME key 設定好後卻無法作用,仔細看了下處理 HOME key 的地方是 polices 下的 PhoneWindowManager.java,會去檢查這個 device 是否被 “Provision” 了。

這個 Provision 的動作其實就是 Device 第一次啟用時做初始設定,在 Google phone 上面就是 SetupWizard,在 emulator 裏面則有簡單的 Provision.apk,之前無法作用就是因為一直沒有把 Provision.apk 放進去…

Provision.apk 做了什麼事呢?其實很簡短:

public class DefaultActivity extends Activity {
  @Override
  protected void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    // Add a persistent setting to allow other apps to know
    // the device has been provisioned.
    Settings.Secure.putInt(getContentResolver(),
                           Settings.Secure.DEVICE_PROVISIONED, 1);

    // remove this activity from the package manager.
    PackageManager pm = getPackageManager();
    ComponentName name = new ComponentName(this,
                                 DefaultActivity.class);
    pm.setComponentEnabledSetting(name,
               PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);

    // terminate the activity.
    finish();
  }
}

因此若要提供一個類似 SetupWizard 的初始化介面在 Devit8000 上面,只要延伸這個 Provision.apk 做的事,提供 GUI 等等,最重要的就是設定這個 “Settings.Secure.DEVICE_PROVISIONED”