發表文章

目前顯示的是 2009的文章

Google Chrome OS 不是長生不老丹

回顧舊文『Android 不是萬靈丹』,因為筆者既不是股票分析師也不是專業的市場分析師,所以看見半年前的猜測一一驗證,令自己感到多少有些欣慰。今天,又看著許多廠商就像當初 Google Android 出來一樣,瘋狂投入著這未知的新領域,有多少認同也多少有不同的意見,因此對於 Google Chrome OS 也有著一些想法。而股票部份就不用再說了,有興趣的人可以回顧舊文。

你的產品是電腦

就如同一般人認為『電腦不等於計算機』,既然你的『輕量化』產品有大螢幕、鍵盤還有可開合的機殼,那麼,無論說破了嘴,消費者依然認定這是台『電腦』。所以,對於消費者來說,電腦該要有什麼用途?不外乎上網、文書、玩遊戲。消費者的期望更是能安裝常用軟體,將家中電腦能夠帶著走。那麼 Windows 肯定還是唯一解。

我的產品是貴桑桑計算機

Chrome OS 說穿了就是只能上網,看看網頁、收發信、PDA功能、看網路上小影片,講更簡單點就是功能單純的計算機。而再貴的計算機,也不會超過一千元台幣,相信念工科出來的朋友都知道。

或許有人不滿意這貶低的說法,因為 Chrome OS 可以上網處理公務,它其實更接近 PDA 產品。但是,現在有哪一台 PDA 可以賣到一萬八?那再次思考,這台搭配了 Chrome OS 有著大螢幕、鍵盤、可開合機殼的『計算機』要賣多少錢可以讓人接受?

電腦廠商賣出來的東西就是電腦

無論電腦廠商如何定位自家產品,賣出來的東西,一定會被消費者認定為電腦類產品。真的想賺這生意的廠商,或許跳出來開一家名稱俗氣的『電子辭典』公司,標榜電子辭典來賣,可能比較適合。

用 ARM 降低成本很有限

對於上網功能來說,一個重要的元件就是 Flash,尤其在這 Facebook 風行的時代,沒有 Flash 根本不能稱之為有上網功能。由於 Flash Player 非 Open Source ,使得 ARM 上面根本不可能使用 PC 上的 Flash player,若是使用 Open Source 版本的實作,效能又非常低落且支援不完整。

雖然 Adobe 已經宣布有 ARM 的 Flash Player 支援,但也限制平台在 ARM11 和 Cortex-A處理器系列中的 ARMv6 和 ARMv7(更簡單說法就是 Cortex-A8),而這些都是屬於最新的晶片,價格自然不低,雖然最後產品整體成本比…

Add GPIO Keys support for Devkit8000

圖片
Using Android on Devkit8000, we have problem of getting back to previous screen. The touchscreen can only be used to decide whether you select item or not, so a BACK button would be needed absolutely for Android. Devkit8000 board has four buttons on the corner, we can set one of it as Back functionality.



First step, add a option to kernel config file to enable GPIO keyboard device:
CONFIG_KEYBOARD_GPIO=y
Second step, set USER_KEY as ESC Keycode for back functionality:
diff --git a/arch/arm/mach-omap2/board-omap3devkit8000.c b/arch/arm/mach-omap2/board-omap3devkit8000.c index e86d254..ec17311 100644 --- a/arch/arm/mach-omap2/board-omap3devkit8000.c +++ b/arch/arm/mach-omap2/board-omap3devkit8000.c @@ -462,9 +462,11 @@ static struct platform_device leds_gpio = { static struct gpio_keys_button gpio_buttons[] = { { - .code = BTN_EXTRA, +// .code = BTN_EXTRA, + .code = KEY_ESC, .gpio = 26, .desc = "user", + .active_low = 1, .wakeup = 1, }, }
Here i…

Enable ads7846 Touchscreen in Android that works on Devkit8000

If you would like to make Android work on Devkit8000, you can follow to patch your kernel which is mentioned in my old article(Android Eclair Porting for Devkit8000). After that you might notice the touchscreen doesn't work, it is a ads7846 kernel driver bug from Embinux. So I modified a few lines of code to fix the bug.

Here is the patch:
http://people.linux.org.tw/~fred/patches/devkit8000-touchscreen-android-kernel.patch

Android Eclair Porting for Devkit8000

It's not only for fun! Porting Android is a great practice for me as well. Devkit8000 is a clone of OMAP3 Beagle(Beagleboard), so we can found many porting informations of Beagleboard from internet. It's helpful for us, we only need to deal with a few places which are some differences between Devkit8000 and Beagleboard. Google Android Eclair is working well on the Devkit8000 board now after I tried to port it last weekend.

Here is the patch:
http://people.linux.org.tw/~fred/patches/devkit8000-android-kernel.patch

Based on Embinux, I added the Devkit8000 support, which includes:
OMAP DSS Driver for display4.3 inch LCD Panel support (480x272 60Hz)7 inch LCD Panel support (800x480 60Hz)Touchscreen ADS7846 supportSound Codec (TWL4030)Keypad (TWL4030)Ethernet Device support (DM9000)Kernel Config for Android
Compile Kernel with Devkit8000 kernel config:
make omap3_devkit8000_android_defconfig make CROSS_COMPILE=arm-linux-gnueabi- uImage
Kernel Command Arguments to use LCD Display Outpu…

Git 簡記

在團隊的多人協同作業時,版本控制系統是很重要的工具,除了要將大家的工作成果彙整起來之外,還要確保歷史記錄不遺失,讓日後的追朔工作有跡可尋。早期的 CVS 到後來的 Subversion(SVN) 都是屬於這類的版本控制系統。不過對於堪稱世界上最大最多人協作的 Linux Kernel Project,CVS 與 SVN 顯然像的玩具,根本不敷使用。而其他商業的版本控制系統,也多少有些缺點,這也是為什麼 Linux 之父『 Linus Torvalds 』要下海親自打造一套新的版本控制系統『Git』。既然 Git 能勝任於這世界上最大的專案,說它是下一世代的版本控制系統,應該一點也不為過。

這樣的一個強大的工具,讓很多人都躍躍欲試,但也因為太過強大,網路上長篇大論的文章也讓許多人不敢恭維,有殺雞焉用牛刀之感。回頭想想,若是連如同 CVS/SVN 上的基本功能都無法輕易上手,講再多 Git 的特異功能也是枉然,套句 Torvalds 的經典名句:『full of bullshit』,一切都是廢話和放屁!(筆者真的懂每次都聽到一堆所謂的分散式架構等等優點,但還是不知道要怎麼開始用,是多麼令人覺得自己是 git!亦或者是文件撰寫者是 git?)

從人本考量,我們需要版本控制系統,最初就是要能上傳和提交 source code,使之能放在 Server 上保存。此 Server 可以放在遠端,也可以是自己電腦上,要嘗試架一個在本地端(沒有提供外部連入功能)的 GIT Server 相當容易,裝好相關套件之後,指定一個 Source code 的保存目錄就好:

Server 端的設定:
# 建立一個新目錄,用來放 example project 的程式碼 mkdir example.git cd example.git #  初始化此目錄為 Git 儲存庫 git --bare init
到此,Server 的設定已經完成,新的 example project 儲存庫也已經建立,若是有需要,日後也可以加上 SSH/HTTP 等連線支援,讓外部使用者可以遠端存取此 Git server。

有了 Server 之後,通常真正在做開發工作的,是在客戶端(Client),我們通常會從 Server 上取得一份完整的副本程式碼回家修改,完成工作後再提交回 Git server。在提交之前…

Our Happy Travel for GNOME Summit in Vietnam

圖片
This is first time that we(ULLab guys) make speeches at international event oversea, so we're so exciting on this travel.


Core Founders of ULLAB

Before this travel, in fact that I didn't know anything about Vietnam. I was just under the impression that Vietnam is a highly unstable country in Asia as well as this place is uncomfortable for us. Everyone all over the world always talks about the war and the girls in a bad way when mention Vietnam, so we never get a good impression about this place. However I must acknowledge that I was wrong now, Vietnam is a good place for enjoying our life absolutely, and also there are many people try to be surviving and becoming better in the world. Actually, many students in there have lifelong ambition, it shames me who is a Taiwanese.


When we arrived Vietnam, the first thing which is traffic made us crazy. The traffic in Vietnam was scaring me, I never see so many motorbikes all over the road. My new friends who are local people in there told…

GNOME.Asia Summit 2009 is coming

圖片
GNOME.Asia summit 2009 is one of the top Free and Open Source Software (FOSS) events for developers, enterprises, officials and general users in Vietnam. The event brings together FOSS projects from Asia and around the world. More than 500 participants from 10 countries are expected to participate in the summit, which is the first international community event of its kind in Vietnam. It takes place from Nov. 20-22, 2009, in Ho Chi Minh City.

As a LXDE Developer, I just got invitation from GNOME.Asia committee last month. They expects that LXDE Team can give a talk to introduce and explain LXDE Development. Actually, we are so glad to have a session to talk about LXDE, especially  it can talk at GNOME event. It means we will have an opportunity to discuss with GNOME developer, users and contributor face to face rather than do anything behind closed doors.

Eventually Andrew Lee, Penk and me will attend GNOME.Asia 2009 in spite of there are a lot of factors make us hard to decide whether…

Mandice Installer 嘗鮮預覽

感謝各界的關注和幫忙,最近『Mandice』頗有進展,繼『Mandice Repository』Server 啟動之後,現在安裝程式也總算有個雛形樣貌,廢話就不必多言,直接來看一下 Video:



大體來說,這是在開發 MTK(Mandice Toolkits)時的副產品,在做測試時順便打造出來的安裝程式,不過目前還在測試階段,仍有不少地方需要改進。

PS. 這不是 Mandice 廣告宣傳片!

Clutter Rotation 的惡行

由於之前已經寫過太多雜文說明,『Clutter Toolkit』的威力應該就不必要再多說。雖然說 Clutter 開發上很容易,但在真正開始開發程式後,就會發現有很多地方細節需要注意。

關於開發 Clutter 程式時,會碰到的大部份問題,都出在於其設計邏輯與其他 3D Engine 不同,而最不一樣的地方,就是演員制度。Clutter Toolkit 特別的演員制度邏輯,使開發者將不再以大場景和 3D 空間定位為考量重點,而是以一個個 Actor 的角度去實作一切行為。因此,通常開發者第一個會碰到的行為就是『向左走、向右走』,單單使 Actor 旋轉到我們要的角度,就會碰到些問題。

ClutterActor 定義了一系列 function 去實作各種行為,其中旋轉的部份:

clutter_actor_set_rotation(ClutterActor *self,
                                        ClutterRotateAxis axis,
                                        gdouble angle,
                                        gfloat x,
                                        gfloat y,
                                        gfloat z);

clutter_actor_get_rotation(ClutterActor *self,
                                        ClutterRotateAxis axis,
                                        gfloat *x,
                                        gfloat *y,
                                        gfloat *z);

關於 rotation 的 angle,其範圍在 0 至 360 度之間,若設定超出角度範圍,會有 Warning 出現,有些時候雖然仍可正常執行,但會有無法預期…

GTK+ 全面進化

圖片
Moblin 帶來的震憾莫過於 3D 樣貌的 UI,其底層 Clutter Toolkits 提供方便易用的 API,確實讓開發者能輕易撰寫炫麗的界面。不過,Clutter 的角色一直被視為一套新的 3D Engine,只是讓人重新打造操作介面而已。這未免小覷了 Clutter 的威力,其真正的好戲,在結合了 GTK+ 之後才正要開始。

這是一段結合 GTK+ Notebook Widget 的展示,隨著觸發而產生的換頁特效:




借由 Offscreen 的實作,可將各種 GTK+ Widget 畫在 Clutter Actor 之上,以此做各種動畫效果,其架構如下所示:

我們可以視為 GTK+ Widget 被轉換成一個個 Clutter Actor,當然這些 Widget 仍然還保留著原本各種 GTK+ 的性質,包括 Signal 等機制,只不過在顯示上,Widget 並非直接被畫在螢幕上,而是畫在 Clutter 的 Buffer 上,讓最後的繪圖動作都交由 OpenGL 做處理。此外,Clutter-GTK 實作了一個假的 GtkWindow 以騙過 GTK+ Toolkits,達成結合兩者的目的。

雖然現在許多 UI 設計都是一窩蜂照抄 iPhone,但不可否認,舊有的使用者習慣還是存在,畢竟遵循舊有習慣的軟體數量太多,還是不太可能一時間淘汰掉。但是, Clutter 給了一個新的機會,讓被人稱為極落伍的 GTK+ UI 有再進化的空間,至於能做到什麼程度,就看各開發者的創意了。

2009 Yahoo! Open Hack Day 之偷人瘋!瘋狂醫院

圖片
今年的『Yahoo! Open Hack Day』是在台大醫院旁的國際會議廳舉行,為期兩天(10/17~10/18),其實小弟本來沒有報名,但被再三威脅利誘後妥協,有朋友私下請主辦單位直接在活動舉行前兩天,將小弟加入參加者名單,因此無奈只好去玩樂兩天,或與無名正妹們聊聊天(這應該是大部份參加者的本意吧)。

話說 Yahoo! Open Hack Day 的宣傳標語令人有股 Coding 的衝動:
想跟來自全台灣的網路高手同台較勁? 想體驗 24 小時不斷電的過程? 想在 2 分鐘的時間展現你超棒創意與超強 Coding 能力?
就當場思考創意,立即實作以及團隊合作這幾點而言,就足夠促使大家熱血沸騰,想要在這兩天一展身手。不過可惜的是,原先以為在這種時間緊迫和視覺感觀的刺激下,會讓各隊參賽者絞盡腦汁,爆出火花,但是事實上,多半隊伍都早已在家做好準備或寫好程式,只是來當場修 Bug 和改版如此而已。最早期望看到場內瘋狂討論之場景,幾乎完全沒有出現。因此就感覺上,活動宣傳標語的『 24 小時不斷電』淪為形式,大概只有工作人員和少數正妹們真正在場體驗 24 小時的拼命。:-D

而小弟這次去因為是臨時組隊,到場才知道隊員名單和隊名,所以一開始便抱著『志在把妹不在得獎』的心情參加。隨性抓起手邊的電子產品,我們就先花了點時間讓 Moblin 可以支援 Yahoo! 的無名服務,讓手持式裝置(MID)、小筆電(Netbook)等電子產品可以直接與 Yahoo! 無名的相片、滴咕和 Blog 等服務做連接和存取。



但由於時間太多,我們又做了第二個有趣的專案『Crazy Hospital 瘋狂醫院』。這年頭人人都上網,但不是人人都發 Email,也不是人人都上 MSN,不過卻是人人都上 Facebook 的開心農場!因為 Yahoo! 沒有類似『偷菜』功能,當然就不是人人都會上!由於這次活動重點是運用 Yahoo! Open API 去實作新的服務應用,我們便思考著開心農場在 Yahoo! 平台上的可行性,不過照抄實在是沒創意,幾經思考後決定從活動場地取構思(台大醫院),而成就了『Crazy Hospital 瘋狂醫院』的誕生!




你可以蓋你的醫院,你可以應徵你的小護士,你也可以找帥哥主治醫生,但你要努力把病人治好!當然,你也可以去偷無名好友的病人!更別說當『人球事件』的主角,沒良心的將…

人之將死其言也善

記憶是種很奇妙的東西,硬是要去記一樣東西很難記住,但要是透過聯想和串連,卻可以輕易將許多事一點也不漏的記住,有些人天生就擁有這種能力,有些人則一輩子不曉得這種方法,而有另外一些人是透過訓練得到。
這些能力很棒,能讓人在求學時高人一等,在出入社會後,又能較有效率的處理大小事務,畢竟就電腦的觀點來看,記憶體大本來效能就會比較高些。但是卻有缺點,這種能力過於發展,很可能令當事人雖記住所有細節,卻抓不到重點,就像你對一個人說:『我最壞打算可能搬家』,他重點會放在你要搬家,而不是為何你要搬家。若有更嚴重點的,他重點會放在,要搬去哪,對旁邊人有何影響,諸如此類得無限延伸聯想。
很有趣的是,面對這種人,你只要給他一丁點誘因,他會有如核子彈一般,連鎖反應創造出完整動機,並朝目標行進。但我們無法左右他的思考,因為無論解釋再清楚,他依然抓不到話中的重點,而是會把話中所延伸聯想的內容當做重點,或更可怕的,會將聯想內容視為真實。當下的狀況,無論是誰碰上了,都有『秀才遇到兵有理講不清』之感。(這是另一個例子,這句話他們重點會放在我在罵人,自認是秀才,而不會把它當成為了文章說明方便的形容詞)
其實,人們多半都有這種傾向,只是程度多寡罷了。常在各種討論會議或是各種社交活動中,聽到有人一直在附和別人的話,卻又講的有些文不對題,就是這種情況。但或許你也發現,擁有極大這種傾向的人,是塊業務的料,因為他可以輕易的打蛇隨棍上,講著自已手上的東西。但無論如何,請克制一下,當你不是在推銷東西時,因為旁人很辛苦。
後記
為何本篇命題為『人之將死其言也善』?因為這是沒惡意的發言,我也不期望能有什麼回饋。單純只是舒發講實話。

使用 ssh 挖洞走密道!半夜深入禁宮!

話說廣大的 Windows 使用者,還在不停尋找可以用的 Proxy Server 賺取農民幣,每找到一個新的 Proxy Server 可以用,就有如於大海之中抓到一塊救命浮木,可以開心一整天。其實,身為 Linux/BSD 的愛用者們,可以不用跟麻瓜們湊熱鬧,使用 ssh 的 SOCKSv4/SOCKSv5 來做跳板不就好了?讓 Web Browser 透過 ssh 連線到 Facebook 玩開心農場,多麼愉快呢!
使用 ssh 去建立 Tunnel 如下: ssh -D 5487 <USERNAME>@<SSH SERVER>
待密碼認證和登入後,就可以改 Web Browser 的 Proxy 設定,改成使用 SOCKS Host,主機設成 localhost,而 Port 設成 5487 即可。
後記
我知道一定有很多人用這招,現在一定想罵死我,因為這塊 ssh 國外主機處女地大概要淪陷了。

專做有趣玩夜兒的台客實驗室 - ULLAB

圖片
長久以來 open source 發展大多被挶限於技術的鑽研和交流,嚴肅的氣氛總壓得人喘不過氣來,更常有『正妹』對我們這些阿宅說:『你們那些火星文我聽不懂啦!』,正所謂連被發卡的機會都沒有,就是如此。

講到國內 open source 的相關實驗室,就不得不提到『 jserv 』發起的 [OrzLab] 以及高手如雲的 [0xlab],其研究成果總讓眾人眼睛為之一亮,目瞪口呆,若是不小心提起自己曾有幸與他們成員一同共事,肯定是有自抬身價之嫌。我們雖嚮往著也佩服著這些前輩,但也自認做不到那種程度,雖也成立了一個小小的 team,卻也一直不敢大聲張揚。

以前總是看著前人,現在回頭看自己,從學生一路走來,總是有些志同道合的社群朋友,心中也有些想法,這促使我們成立了一個新的實驗室 [ULLAB - /usr/local/lab] ,亦可笑稱為『台客實驗室』,目標就是從『望妹莫及』進步到『能得到被正妹發卡的機會』,更進一步提升成『能發卡給正妹』。

誰說實驗室只能研究些生澀艱難的東西?以下是 [ULLAB] 的簡介:
#!/usr/local/lab

我們是一群來自台灣的網頁與自由軟體開發者。我們深信 設計 科技 的力量
,恪遵易用性原則,並且用力改變世界。

We are a group of web and FOSS developers based in Taiwan.
We believe in the power of designing and new technologies,
and trying hard to make this world a better place. 當年手機大廠 Nokia 一句『科技來自於人性』,令許多人禁重新省思研發科技之目的,『我們研發到最後只是為了滿足研發人員自己嗎?』這問題,答案肯定是否定的。響應人性科技的發展,[ULLAB] 就專做有趣玩夜兒,希望能用這理想改變世界。目前,[ULLAB] 初步有些成果(部份專案即將釋出):

FlipFlop - 三秒快速開機到 UI 的 Flash Player Linux 整個系統 9.4MB,目前支援平台:x86、ARM、MIPS


Mandice - 輕巧、絢麗、快速安裝的全功能 Linux 發行版
整個系統約 700MB+,擁有 GNOME、LXDE、XFCE 桌面環境


XPUD - 輕巧快速的上網專用作業系…

心得分享 - 重灌 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_…

盡信書不如無書,任無書不如造書

書,載文記字之功用也,乃人造物。文雜,詞誤,字歧,義鈍,皆常事。況執筆者亦非聖賢,能悟不可書,能書不達義,無可厚非。面目和善者,或讀書,或習字,心於書之求道,而屢限自身悟不得者眾,誤習非方圓者則已,錯解其義者甚悲矣。

冰於水,終融而無跡,承源接續,乃不變之定律;異物於水,或溺,或濁,非道德也。同文重義,於閱者異,倘不思源不解續,文無義,無功徒勞;明文謬義,如溺濁水,正道不得入,正路不可取,雞鳴狗道之物。

常有莊周寓言,盛載冰水,卻為解義說書者染之,於後世沉浮,歸宗不可,清談自成其道,盡信書焉?追源無書,還原其貌,自然天成,閱者無不拍案叫絕,又何需多言?

無書追源亦無續,應當造書成命。既執書,必慎要點提綱,內求脈通,外求載無誤,內外同證,利己且濟世。

自愧常提文不慎,望步正軌而改之,文以示無書之道,自許。

實作偽 GLib Singly-Linked Lists

這些日子以來真的被 GLib 給寵壞,它將什麼東西都包成漂亮的 API,讓人用的很開心。但是在許多環境下,像是有限資源的 Embedded System 之中或是在單純的 DOS 裡,想要使用 GLib 可是難上加難,因此免不了要自己實作同樣的功能。而其中最常見的功能莫過於 Linked-list,雖然觀念和方法在所謂的『資料結構』教課本中有如『解數學的聯立方程式』一般被講到爛,但真要一步步做起來也不免覺得麻煩,於是空閒之於就寫好放著,以後 Copy & Paste 就好了。 :-)

既然已經很熟悉 GLib 的 API,就乾脆實作出一模一樣,也方便記憶和使用。
/* Singly-Linked Lists structure */
struct Myslist_ {
void *data;
struct Myslist *next;
};
typedef struct Myslist_ Myslist;

/* marco */
#define myslist_next(list) (list->next);

Myslist *myslist_prepend(Myslist *list, void *data)
{
Myslist *new;

new = (Myslist *)malloc(sizeof(Myslist));
new->data = data;
new->next = list;

return new;
} 然後可以這樣使用,修改自舊文『Glib 就是懶.資料處理好手 - GList 雙向鏈結(Doubly-Linked)』:
typedef struct {
char *name;
char *tel;
} ContactNode;

int main() {
Myslist *contactlist = NULL;
Myslist *list = NULL;
ContactNode *node;

/* Fred's contact information */
node = (ContactNode *)malloc(sizeof(ContactNode));
node->name = strdup("Fred Chien");
node->t…

LXDE on HTC Hero!

圖片
日前在 IRC [irc.freenode.net #lxde] 上有位網友『Andrea Florio』開心的宣布『LXDE running on HTC HERO』,然後公開了幾張手上的照片讓大家嘗鮮。更多 Porting 的細節和說明,可以參考『LXDE can do it! LXDE on Android smartphone!』一文。

文中提到的做法,是在開發『openSUSE@ARM project』過程中的成果,但目前運作的系統是 Debian 而非 OpenSUSE,另外也有提到 HTC Hero 的一些硬體資訊:
# cat /proc/cpuinfo
Processor : ARMv6-compatible processor rev 2 (v6l)
BogoMIPS : 526.25
Features : swp half thumb fastmult edsp java
CPU implementer : 0×41
CPU architecture: 6TEJ
CPU variant : 0×1
CPU part : 0xb36
CPU revision : 2
Cache type : write-back
Cache clean : cp15 c7 ops
Cache lockdown : format C
Cache format : Harvard
I size : 32768
I assoc : 4
I line length : 32
I sets : 256
D size : 32768
D assoc : 4
D line length : 32
D sets : 256Hardware : hero
Revision : 0080
Serial : 0000000000000000

不跟著主流走的 Embedded Hardware

個人電腦追求最快、最新、高規格,台灣廠商也很厲害的達成超值、大量、超低價,成本不但下殺血流成河,其毛利也真的是以『毛』為單位來計算。的確,個人電腦零組件因此能便宜到足夠打壓 嵌入式系統(Embedded System)的市場,若以同樣價格的硬體來比較,個人電腦的效能硬是勝過一大截。

Embedded System 向來以客制化、量身打造為主要優勢,就單純只論達到產品目標,Embedded Hardware 也因為能做到剛剛好合用,使其量產成本下壓。不過如今 Netbook 的出現,令 Intel Atom 大量投入輕省市場,單買現成的 x86 Hardware 已經不會比量產 Embedded Hardware 來得貴時,到底投入 Embedded System 有哪些好處就得再詳加思考了。

使用 Embedded System 不外乎是因為他的省電、輕巧、客制化,因為有許多廠商對硬體的要求其實並不高,如果能夠用更低廉價格和研發成本做出產品,使用 Embedded System 就是值得的。而這些需求其實大致上都可以有個簡單的分類:
運算功能影像處理(一般顯示、進階加速)通用外接 bus (USB、UART、MiniPCI...etc)其他有的沒有的晶片(通訊晶片等...etc)
過去產業的做法,是將以上需求選擇出來,然後重新設計 Layout,最後再自己生產自己的 Embedded Hardware,但往往因為自行擔負了研發成本、開模成本和生產成本,造成價格上根本不敵 PC 大廠的大量產線。那麼,為何還要獨斷獨行?不自己生產又想比 PC 更低價,要怎麼辦?

舉一個例子,有些產品可能只需要不高的『運算功能』加上『通訊晶片』,再更多只要可以一般顯示的『影像處理』即可。事實上,能夠達成這些功能的硬體,在市面上其實已經堆積成山,甚至有許多生產廠『大量庫存』家中,苦往肚子裡吞,不敢為外人所知。然後,等到下一季來到,這些退流行的『貨』更永不見天日。尋思,我們能否借助這些廠商的庫存貨,當做現成硬體,修改成其他產品再出貨呢?對雙方面,都有好處。

當然,以上做法只是針對這個 PC 和 Embedded System 交戰的過渡期,更仔細來分析,其實這有如設計產品的廠商們合併單,一起生產大量的硬體,以取得便宜的硬體,用更平實的說法就是『團購』。不過如此生產出來的硬體會有個問題,那就是無法同時合…

使用 Serial Port(RS-232) Terminal 原來可以這麼容易

現在還在用 [Gtkterm] 就遜掉了!既然立志當 Geek,要向『宅.色.舒服』看齊,那就一定要更宅一些,在 console mode 下搞定一切,才是正道呀!

其實,[GNU Screen] 除了用來掛 IRC 外,亦可以當做 Serial Port (RS-232) Terminal Program:
screen /dev/ttyUSB0 115200

雖然宅,但不要以為 screen 只能拿來掛 IRC 好嗎?

Emdebian - 快速建構你的嵌入式系統

圖片
毫無疑問,目前『Debian』已經成為當今最龐大的 Linux 體系之一,包括目前最為人所知的 Ubuntu,其表皮之下都是 Debian 的骨。Debian 支援超過十一種以上的硬體架構,包括了 i386/IA-32、m68k、sparc、Alpha、PowerPC、ARM、MIPS、hppa、IA-64、s390、AMD64,還有更多計劃支援但仍在移植中的平台,如:ppc64、SuperH、armeb、m32r、AVR32等。要用 Debian 打造任何一種硬體平台上的作業系統,可說是輕而易舉,甚至不必撰寫一行 Code 或學習使用 cross-compiler,只要會用 debootstrap 和 apt-get。

但是,除了傳統 x86 和幾個特定平台外,大多數的硬體架構都是用於嵌入式應用,其硬體資源相對較低,若將 x86 完整的系統移植過去,似乎沒有多大價值,軟體甚至可能因硬體限制(CPU、Memory、Storage)而無法使用。


因此,『Emdebian (Embedded Debian)』計畫誕生,該計畫首要目標是建構最小化的 Debian System,更進一步因應需求而打造出最輕量的嵌入式系統,並保留 Debian 的套件管理結構和特性。目前, Emdebian 分兩種版本:
Emdebian Grip - A smaller Debian-compatible distro

一個小型的 Debian distro,但完全與官方 Debian 保持相容性,這意味著仍然可以在這系統上直接安裝官方 Debian 的東西(包括 Stable、Unstable、Testing 等版本)。其改進了 apt 的工具程式,使基礎系統更輕量化,更進一步將許多套件重新打包,減少平時很少用到的系統文件和相依性。

目前 Grip 所支援的硬體平台有 arm, armel, i386, amd64, powerpc, mips, mipsel。

Emdebian Crush - An ultimately small, cross-built, Debian.

這是針對高要求嵌入式系統所特別開發的版本,為了能真正使用在嵌入式系統,引入了 Busybox 等輕量化的工具程式,捨棄許多原本 Debian 系統內的累贅。目前 Crush 只有支援 ARM 架構,且參考了各版本的 Debi…

COSCUP 2009 閉幕

圖片
這是演唱會入場嗎?沒看過 Open Source 活動要排過這麼長隊伍等著入場,聽說有人第一天早上六點就來排隊了!『COSCUP 2009』實在是盛況空前呀!
在第二天的早上議程,小弟有一場簡短的 LXDE Talk,時間太趕了!我們是唯一一場需要兩個講者的議程呀!

在最後,各工作人員上台一鞠躬,感謝大家的參與!因為多虧大家的支持,今年的 COSCUP 2009 順利閉幕!

明年,希望大家仍給予支持!明年再見!

COSCUP 2009 籌備團隊與工作人員合影

更多照片可去 Flickr 瀏覽:
http://www.flickr.com/photos/tags/coscup2009/

淺談 USB 通訊架構之定義(二)

圖片
之前『淺談 USB 通訊架構之定義(一)』已經提過 USB 大致上的概念和一些特性,以及如何從 Linux 上去嘗試驗證 USB Device 上的 Information,但還尚未談及 USB Device 是如何與 USB Host 做溝通。而且,初始化的過程也很重要,該過程會讓一個 USB Device 描述自己的『模式(Configuration)』和『介面(Interface)』以及更多配置上的關鍵訊息。雖然這些初始化過程和定義繁雜,但是拜 OS 優良的包裝所賜,一般驅動程式都可以假設已知或是透過簡單的 API 去取得這些資訊以進行開發,因為大多數初始化動作會自動由 OS Kernel 和 Firmware 所完成。

簡單的 USB Device 初始化流程
插上 USB 裝置Host 請裝置報告『裝置描述資訊(Device Descriptors)』(此過程又稱為 Enumeration)
由 Device Descriptors 得知『模式的數量(bNumConfigurations)』Host 請裝置回報『模式的描述資訊(Configuration Descriptors)』
由 Configuration Descriptors 得知『介面的數量(bNumInterfaces)』Host 請裝置回報『介面的描述資訊(Interface Descriptors)』
由 Interface Descriptors 得知『端點的數量(bNumEndpoints)』Host 請裝置回報『端點的描述資訊(Endpoint Descriptors)』
由 Endpoint Descriptors 得知『該端點的資料傳輸模式(bmAttributes)』等訊息等待驅動程式進行後續處理整個 USB Device 的描述結構可以圖表示:
當然,若不是 USB Device 設計者或是 USB Host Controller 晶片的 Firmware/Driver 開發人員,可以不用知道這麼多過程細節,因為無論是 Linux 還是其他作業系統,它們都會將這些最低階的過程包裝起來,等著驅動程式去使用,而 Linux Kernel 上負責此任務的就被稱為『USB core』。

註:因為古老的 DOS 在設計上沒有 USB 的支援,故沒有這種中間層的包裝,若要在上面開發 USB 驅動程式…

淺談 USB 通訊架構之定義(一)

圖片
USB(Universal Serial Bus) 的應用範疇以及價值已經不需要再多做說明,其身影從 HID(Human Interface Device)、隨身碟(USB Stick、Flash drive、Pen drive)到各種類比式或非連續訊號接收器(如: Webcam、Microphone、DVB Receiver),更進一步可以講到各種通訊裝置或外接設備,甚至是取代和模擬舊式通訊傳輸線(Serial Port)。USB 所有的 Spec 和相關資訊 ,可參考 http://www.usb.org/

USB 整體運作模式

一般來說 USB 的通訊結構有如 Server/Client,以 PC 上的情形為例,位於主機上的 USB 裝置稱為『USB Host』,我們可以在上面外接上數個裝置(與 USB Host 相連的裝置通常被稱為 USB Device 或 USB Client)。

底層上,『Host 負責主導整個 USB 結構的通訊』,它會輪詢所有的 USB Deivce 以檢查是否有裝置需要傳送資料,所有 USB Device 都必需要等待 Host 的命令,唯有 Host 同意時,USB Device 才可以開始傳送資料。



Host 的行為通常是由 USB Host Controller 在做控制,其控制器是一組控制晶片,而對於現代 PC ,USB Host Controller 的晶片通常都被 Layout 在主機板上,以 PCI Bus 的形式存在供作業系統控制,我們可以使用 lspci 看到它的存在:
00:1a.0 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #4 (rev 03)
00:1a.1 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #5 (rev 03)
00:1a.2 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #6 (rev 03)
00:1a.7 USB Controller: Intel Corporation 82801…