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 开发。
  多看软件系统未经许可不得商业贩卖。作者对有商业贩卖行为的单位和个人保留追究其法
  律责任的权利。

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

Android Service with dynamic arguments

Recently when I was preparing some Android training material I found this little trick.

Android “init” can do a lot of things, including “on property change” trigger; one can image some applications use this to implement an ad-hoc IPC. One example is the system/libnetutil that monitors the “init.svc.dhcpcd” property to detect whether dhcpcd is running or not.

閱讀全文 Android Service with dynamic arguments

[非官方] 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”