發表文章

目前顯示的是 九月, 2009的文章

心得分享 - 重灌 100 次也會很開心的 Linux

圖片
這次受 [ICOS2009(International Conference on Open Source)] 之邀,很榮幸於研討會當天給予了一場 Talk - 『重灌 100 次也會很開心的 Linux』,該議程是將最近手頭正在做的 Open Source Project 做一次具體而微的整理,全程以生命苦短為出發點,用 Linux Distribution 引領人生意義,探討人性之苦痛。
議程簡報可於此下載: http://people.linux.org.tw/~fred/slides/100linux.pdf [PDF]
粗略估計,多數電腦依賴者的一生之中,將有超過一年以上之時間不眠不休浪費在重灌以及更新系統。但在取人錢財的系統廠商不供應免費生前契約的前提之下,何苦賠了性命與之軟體生命周期博鬥?因此,藉由實作一個新的 Linux Distribution,以確保三至五分鐘之內重灌一套全功能的 Linux 系統,便是一個能造福人群的出發點。
有感,Mandice Project 便是在人之生命與軟體壽命之自我衝突中被建構起來的 Linux Distribution,以 Emdebian Grip 為基礎,其相容於 Ubuntu 與 Debian,僅 700MB 之硬碟使用大小而不縮減任何功能,忠於使用者以追求更漂亮且簡單易用的介面,且永遠不必再做大版本號的系統更新,以終生線上更新機制,徹底擺脫『六個月,版本加一號,系統死一次』之現代 Linux 摩爾定律的悲哀。
Mandice Screenshots: 整合 Google Chrome 之展示 Support Adobe Flash Player (展示開心農場) MSN 即時通訊軟體
網路管理 內建所有目前 Linux 所支援的驅動程式(展示 3D 運算) 多媒體功能(展示 PPStream) OpenOffice 文書處理
此外,更因為相容於 Ubuntu,有許多軟體可以直接安裝,操作如使用 Ubuntu 一般。使用者不必重新適應新的環境。而 Mandice 將 100% 相容於 Debian Sid,可以完全取用 Debian 體系下的所有支援。
後記
原計劃於短暫之議程時間內當場表演安裝一百次 Mandice Linux,但因技術上出了問題而作罷,更完整的 Mandice 安裝程式將於近期內釋出。

CUSE - Userspace Character Device 機制

因為最近碰上了 KMS(Kernel Mode Setting)的 bug,造成偵測解析度出現問題,於是為了解決這問題,又開始追 Linux Kernel 的 Log,但原先的目標沒有追到,反而有些其它的意外發現。話說,2.6.31 已經在本月 9 日正式釋出,其中有些新的實作和令人興奮的支援,如:USB 3.0、日前提到過的『Fanotify 更全面性的檔案監控機制』,其實另外還有一個重要的機制『CUSE(Character devices in Userspace)』。

如同 FUSE(Filesystem in Userspace),CUSE 目標提供一個機制,讓開發者可在 userspace 實作 character device,而不用撰寫 kernel space 的 module 來達成這項目的。這機制有助於許多驅動程式的開發,甚至是讓 Linux 在未來開發各種支援時,能有更大的彈性以及使核心有更高的安全性。從 patch 來看,由於許多部份已經在過去開發 FUSE 時被實作過,讓開發者可以輕易的延用過去成果實作 CUSE。

這有一個專案『OOSP(Open Sound System Proxy)』,就嘗試著用 CUSE 實作一個假的裝置檔,讓老的音效應用程式可以在不修改的情況下,藉由這個 OOS Proxy 去使用新的音效驅動程式架構(如:Alsa),其做法就是產生 OSS 的 /dev/dsp、/dev/adsp、/dev/mixer 再將這些 character devices 接收到的訊息,處理並轉送到現代的音效驅動程式架構。

如何回報 Debian Bug?

Debian 對 e-mail 的依賴度相當高,所以大多數 Debian 社群的協作,沒有什麼 Web-based 的系統,一切都使用 e-mail 處理居多,當然,bug report 也是使用 e-mail 來處裡。雖然大家的信件都寄到同一個信箱,但只要遵照格式來寫信,Debian 有一套自動處理的機制,依然會將信轉到負責的 Debian 維護者(Maintainer)手中。至於格式細節可以閱讀官方文件『How to report a bug in Debian using reportbug』,內文中有些範例可以參考。

雖然官方文件洋洋灑灑寫了很多篇幅,實際上,一個最簡單的 bug report 信件大致長這個樣子(以昨天回報的 totem-gstreamer bug 為例):Package: totem-gstreamer
Version: 2.26.3-1

The core of totem-gstreamer is very simple and small,
package size is about 2,056K without compression. But
if we'd like to install totem-gstreamer successfully,
it must use more than 24MB of disk space.

The problem is that gnome-icon-theme which is dependency
of totem-gstreamer needs 22MB disk space at least, and also
gnome-icon-theme cannot be replaced with other icons packages
for totem-gstreamer.

Actually, the most icons in the gnome-icon-theme are not
needed by totem. It should be replaceable and allows us to use
other icon theme package. 然後可以將信寄到 Debian Bug Tracking System <submit@bugs.debian.org>,且標題…

好用的 Trace 工具 cflow

自己寫軟體,自己的邏輯,自己的世界,往往不會有什麼困難,這也是很多人從學生時代一路爬上來的歷程,直到進入到職場後撰寫著商業軟體,更是只有自己的一片天。但寫軟體有如寫作文,言之有物前必先廣閱天下文章,否則若是能獨樹一格是好,不能便陳腔濫調且原地踏步。但是看懂別人的程式實在是很困難的一件事,除了要懂他人寫程式的風格和思維外,還要通盤了解架構,這必須要有見山不是山的能力才能勝任。一般人想單靠著程式碼上彎彎曲曲的豆芽菜,反推回去程式的原貌,真有如瞎子摸象。對於做為一般人的我們,這時便要借助些工具,以幫助我們更省時省力的去 Trace 程式碼。

講到閱讀程式碼,『cflow』就是不得不提到的方便工具之一,它能夠幫助我們確認程式的大架構,以及分析程式碼相互的關聯性。這裡是使用 cflow 去演示分析 Android Dalvik VM,分析的檔案是 dalvik/dalvikvm/Main.c:$ cflow dalvikvm/Main.c
main() <int main (int argc,char *const argv[]) at dalvikvm/Main.c:141>:
setvbuf()
malloc()
memset()
strdup()
strcmp()
fprintf()
assert()
blockSigpipe() <void blockSigpipe () at dalvikvm/Main.c:31>:
sigemptyset()
sigaddset()
sigprocmask()
fprintf()
JNI_CreateJavaVM()
createStringArray() <jobjectArray createStringArray (JNIEnv *env,char *const argv[],int argc) at dalvikvm/Main.c:44>:
FindClass()
ExceptionCheck()
fprintf()
assert()
NewObjectArray()
NewStringUTF()
SetObjectAr…

偷拍 Framebuffer 的風流韻事

Linux 下的螢幕抓圖,多半以 Xorg/X11 底下的實作居多,有數不清的工具可以使用,但這都僅限於一般 PC 上的範疇。有許多 Embedded System 不外乎就是小而美,這種小裝置上若要跑上 Xorg,有時便不是這麼容易,因此在多數情況下 Framebuffer 才是顯示影像的主流方法。那麼我們是否可以,來實作一下 Framebuffer 的抓圖呢?嘗試著偷拍這種針孔型裝置的畫面。 :-P

這是一支簡單的程式(screenshot.c),會將 Framebuffer 的影像資料從記憶體中取出並存成 screenshot.jpg:#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <linux/fb.h>
#include <jpeglib.h>

void savetojpeg(unsigned char *img, int width, int height)
{
unsigned char *buffer, *src, *dest;
unsigned char *line;
int length;
int i, line_length;
FILE *fp;
struct jpeg_compress_struct jpeg;
struct jpeg_error_mgr jerr;

/* setting error output */
jpeg.err = jpeg_std_error(&jerr);

/* create jpeg */
jpeg_create_compress(&jpeg);

/* setting image */
jpeg.image_width = width;
jpeg.image_height = height;
jpeg.input_components = 3;
jpeg.in_color_space = JCS_…