發表文章

fork()、pipe()、dup2() 和 execlp() 的組合技法

對一般程式來說,管線(pipe)機制很少會用到,尤其對於在 Windows 底下的程式開發者來說,很可能前所未聞,而在 Unix-like 環境中常見的例子,就是往往在命令後面加上『|』,其意味使用『管子(pipe)』將內容導入另一個程式裡,如:『dmesg | grep ALSA』。在該例中,Shell 有趣的將 demsg 標準輸出(standard output)全數導入 grep 程式的標準輸入(standard input)中,再交由 grep 處理並找出存在 ALSA 字串的句子所在。 另一個情況,Web Server 在支援 CGI 時,也會使用到 pipe。這是最典型的例子,當 Web Server 欲執行一支外部 CGI Program 時,會利用 pipe 去模擬該 CGI 的標準輸入及輸出(Standard I/O)。以上說明當然只是大致上的做法,細節還需加上 fork() 和 dup2() 的配合,透過個範例可清楚瞭解這部份的實作。 這是一個簡單的範例: void cgi_run(const char* filename) { char buffer[1024] = { 0 }; int len; int pfd[2]; int status; pid_t pid; /* create pipe */ if (pipe(pfd)<0) return -1; /* fork to execute external program or scripts */ pid = fork(); if (pid<0) { return 0; } else if (pid==0) { /* child process */ dup2(pfd[1], STDOUT_FILENO); close(pfd[0]); /* execute CGI */ execlp(filename, filename, NULL); exit(0); } else { /* parent process */ close(pfd[...

SCIM Patch: Auto enable input method when getting keyboard focus for a GTK+ text entry

圖片
As you know, Apple iPad is the latest craze and brings back tablet PC marketing cause most manufactories aim to begin to produce products with touchscreen. In order to make applications work with touchscreen for tablet PC, implementing on-screen keyboard is the major issue. There are many open source solutions you can get from internet, but you may get a question, what time is better to start the on-screen keyboard? It is a good idea that enable on-screen keyboard when input box get focus, that is just like Apple iPhone, iPod, iPad and a lot smart phone. SCIM has panel support, it can provide on-screen keyboard. So I have patched scim-bridge to support that auto enable input method when getting keyboard focus for a GTK+ text entry. If so input method is enabled, SCIM will show on-screen keyboard automatically. Here is my patch you can get: http://people.linux.org.tw/~fred/patches/scim-bridge-0.4.16_client-gtk-autoshow.patch

親手打造 HD 多媒體播放器,簡報上線

承年初『 親手打造 HD 多媒體播放器 』所述,小弟有幸於今年 1/23(六)、1/24(日)、3/27(六)、3/28(日),在台中『靜宜大學應數系』開設嵌入式系統實作課程,課程宗旨欲藉由一步步的實作,揭露嵌入式系統開發細節。本課程嘗試避免提及過於深奧的理論和艱澀的名詞,以玩樂中學習並體驗嵌入式系統相關技術。除了實作外,也略微說明相關基礎知識,如:Compiler、 NEON intrinsics 等。 感謝各界參與,本課程已順利結束,有興趣者可自行下載上課簡報檔: http://people.linux.org.tw/~fred/slides/training/hdplayer.pdf

自製垃圾簡訊自動發送器

這年頭自製廣告簡訊自動發送機相當容易,只要找到一張 3G 網卡,寫幾行簡單的 scripts 程式,就可以達成任務。在開始之前,可以先直接藉由指令對網卡下 AT Command,測試一下使用 3G 網卡發簡訊: echo -en "AT+CMGF=1\r" > /dev/ttyUSB0 echo -en "AT+CMGS=\"09xxxxxxxx"\r" > /dev/ttyUSB0 echo -en "You Got SMS.\032" > /dev/ttyUSB0 如此,目標手機門號應該能收到封內容為『You Got SMS.』的簡訊。不過這尚只是單純簡訊發送,離『垃圾簡訊自動發送機』仍有段距離,需做些加工使腳本程式可以讀入電話號碼清單。 garbagesms.sh 詳細程式碼: #!/bin/bash if [ -n $1 ] || [ -n $2 ]; then     exit fi echo -en "AT+CMGF=1\r" > /dev/ttyUSB0 while read NUMBER; do     echo -en "AT+CMGS=\"${NUMBER}"\r" > /dev/ttyUSB0     echo -en "${2}\032" > /dev/ttyUSB0 done < $1 接著,準備一組號碼清單(例:number.lst),然後對所有號碼發送: ./garbagesms.sh number.lst "混人百貨周年慶,本日垃圾簡訊大放送。" 後記 本教學僅供研究參考,筆者未對程式做過實際測試。如因執行或濫用該程式而導致簡訊費用爆增或其他法律責任,請自行負責。

Google TV 創世?還是 Sony 搞笑?

自幾天前 Google TV 被紐約時報揭露後,該新聞在世界各地被各大新聞媒體瘋狂轉述,亦有各式各樣不同的猜想和論點,尤其以電腦族群,一看到 Google 介入這市場,就連忙著拍手叫好,發表支持以及看好的個人論點。許多廠商也都嚇壞了,像無頭蒼蠅般亂竄,不知所措。不可否認,Google 這步棋下的很準確,未來的廣告和作業系統市佔率,勢必提升不少,也一瞬間扭轉了網路影片無版權的情勢。但是另一方面,Sony 大方的與 Google 分享這大餅,究竟所圖為何?『號稱世界上最開放作風的企業』對上『世界上最封閉作風的集團』,無論怎麼看都疑點重重,耐人尋味。 Google 造神運動再一次升華 Google 近年來成長速度太快,又開創出很多過去被視為不可能的免費服務,如:全球化的極速搜尋引擎、超大的免費信箱、全球衛星空照圖、360度街景圖,一切如同將大海切成兩半般不可思議,讓許多人對 Google 產生崇拜和莫名的期待。因此,Google 這兩年挑戰各種霸主,像是激戰多年的瀏覽器之爭、手機產業和作業系統,都受眾人強力宣染之下,而不費吹灰之力蠶食。雖說佈局也花了相當大的功夫,但最後推手還是在於眾人們『對神的無上崇拜』。 實現數位家庭,Sony 哪裡需要 Google? 網路上許多朋友都說著,這是 Google 和 Sony 進軍數位家庭的首戰,也不少報章媒體拿著各家數位機上盒的產品相比較,然後又說 Google TV 因為可以上網、Twitter、Facebook,和安裝眾多的 Android Applications,有著相當大的優勢。 不過這種說法,似乎是直接遺忘了 xbox360 的存在,上述功能和機制微軟早已默默經營很久,內部的介面和架構,數年內也藉悄悄更新而趨於完善,除了有軟體商店,亦有付費機制,還有數不盡的娛樂資源。微軟已吸取多年前數位家庭失敗的經驗,早就重新振作佈局許久。 然後,我們是否也忘了更重要的一件事?它的直接競爭對手『Sony PlayStation 3』跑哪去了?似乎也沒在這事件中露面。數位家庭創始者之一的 Sony,在多年後進軍數位家庭,這說法似乎有些荒謬。 Sony PlayStation v.s. Google TV 仔細想想,無論 xbox360 還是 PS3,它們在娛樂市場已有著深不可測的軟體資源,更有完整的架...

Add Devkit8000 and SBC8100 initial support to 0xdroid

圖片
As you know, I've done Android Eclair porting for Devkit8000 in the past, which is based on Embinux. It's a experimental work for passing time, I have no time to maintain and fix bugs friends reported after that. However, I think it is not good because the result will be getting lost as time goes by. 0xdroid is another Android distribution which is different from Embinux, its developer  Jim Huang(jserv)  who has contacted me a few months ago, and he hope that I can try porting 0xdroid on the Devkit8000. Actually, I am glad to make 0xdroid takes over my work, it is the best result for me. Currently, I've done most works, 0xdroid can run on Devkit8000 with success. And also, My patches have been committed to 0xlab-devel mailing list. Because I have another platform SBC8100 which is also produced by Embest, I've done works on that as well. You can see my patches from 0xlab-devel mailing list, or you can visit my website to download it directly: http://people.lin...

Debian/Ubuntu 交叉編譯 - 函式庫相依性速解法

從來,交叉編譯(Cross-compile)就是一門苦差事,往往取得 Toolchain 之後,還必須自己編譯所需的所有函式庫,花費的時間甚巨,實在不值得。隨著 Debian/Ubuntu 跨平台支援趨於完整,開發和移植各平台程式之工作,已經不用再經歷過去那不足為外人道哉的編譯地獄。我們可以直接抓取不同硬體平台(如:ARM、MIPS)的套件,安裝在系統上供交叉編譯使用。因此,比起專注於 x86 下的其他系統(如:Fedora),Debian/Ubuntu 優異的跨平台支援和資源,更決定了跨平台開發者的效率以及產出品質。 而較為傳統的方法,是建立一個新的 Rootfs ,包括完整目標平台的函式庫和編譯所需檔案,在編譯自己的程式時引入使用即可。如不想這樣麻煩,Debian/Ubuntu 包括了一支工具『apt-cross』可以將目標平台的套件,轉換成交叉編譯專用套件,然後安裝至目前的系統上。 如同常見的 apt-get ,apt-cross 的使用方法極為相似,以安裝 ARM 架構下 的GTK+ Library 和開發用檔案為例(使用 Debian Sid 的 ARM 版套件): apt-cross -a armel -S sid -i libgtk2.0-0 apt-cross -a armel -S sid -i libgtk2.0-dev 如此 apt-cross 會下載 ARM 版本的 GTK+ Library,然後轉換成 libgtk2.0-0-armel-cross 和 libgtk2.0-dev-armel-cross 兩個套件,並安裝至系統中。隨後,我們便可交叉編譯自己的 GTK+ 程式,arm-linux-gnueabi-gcc 會直接去引用這兩個套件內的檔案。 隨帶一提,若執行 ./configure 時會發生 arm-linux-gnueabi-pkg-config 找不到,而自動選用系統上原生的 pkg-config 程式,常會造成編譯時關聯位置錯誤或找不到檔案。這通常是因為 pkg-config 選錯路徑,參考了系統上的編譯參數定義(正確行為應該去引用交叉編譯用的參數)。因此,我們可以在下 ./configure 前指定參考路徑,以解決此問題: export PKG_CONFIG_PATH...

夜,寂靜

也只有在獨自一人時,才能清醒的與自己對話,於大樹底下偷偷埋藏的思緒,此時會猛然湧上心頭,而靈魂末端的枝葉總自顧掉落。 夜有多麼靜,心跳的聲音卻如此吵雜。惡耗了一整晚,解不清的工作乾脆直接扔在一旁,開始細數著在微弱燈光下忽明忽現的嗡嗡飛蚊,傾聽自己心中的聲音。 驚呼,忽然一陣癢感襲來,將一切停滯的夜又搔動了起來。此時怒氣盛起,我面目掙獰如惡鬼一般,非與飛蚊理論究竟不可。 『唉,你長得比較高大,血多到都可以把我淹死好幾輩子,而我只求貴人賞碗飯,讓我活命罷了,你又何必吝嗇?這世界死氣沉沉寂靜又孤獨,我們相伴不是甚好?』眼前那飛蚊老兄,收起翅膀,坐在眼前電腦螢幕上嘆息說著。 『我並不介意血被吸,而是介意心情被打亂。平時的一切種種已經令我夠煩燥了,現在,只想不要被打擾的思考著。』我說。 飛蚊老兄瞥著頭看了看我,似乎看出了什麼端昵。 『哈哈,你不過就是不相信人而已,不想與外界接觸。就像我,我也不相信你心情好,就會讓我飽餐一頓,還不如我自己找機會大大咬上一口。』飛蚊老兄表現得一付很懂的樣子。 『我在想的就是要不要再給一次機會,將信任再一次留給一個人。畢竟,曾經能信任,也花去了不少時間培養,但就是因為後來有一連串太多太久的猜疑,才讓我越來越痛苦,變了一個人似的。尤其很多話不敢說,更讓情況惡化。害我現在一切收進心底,只有在這時候,才會拿出來想想。』我說。 『想通了,隨時都可以重新來過啊。只要你和其他人願意溝通,有什麼不好重建信任,就像現在我和你一樣的交談簡單,你我不都開朗許多。』說畢,飛蚊老兄飛了起來,搖搖晃晃的從燈光邊緣隱沒。 『若是可以,我也想單單純純、平平淡淡的去維持這關係,不要再有什麼無聊的猜忌亂想。』我邊說,邊伸了一個懶腰,準備開始繼續工作。 我話還沒講完,又感到一陣騷癢,反手『啪』一聲,滿手鮮血。仔細一看,原來,飛蚊老兄已死於我掌下,身驅四分五裂、鮮血淋漓,這似乎說明了人類永遠不可能與蚊蟲互相信任。 接著,早晨的陽光也打亂這夜,一切思緒又沉回樹下的時光寶盒,等待著下一次的開啟。

Clutter EGLX Backend doesn't work correctly

Recently, our team work hard on ARM platform which is TI OMAP 3530, and also it makes us crazy actually. As you know that source code of TI PowerVR driver and SGX is not publicly available, there is no open source solution cause it's difficult to debug graphical stuffs. If you have tried to use Clutter with EGLX Backend, you might get only the blank stage and nothing works correctly. It happened due to X server might still have things in its buffer to render when swap buffers. Here is a patch to solve this problem: http://people.linux.org.tw/~fred/patches/clutter-1.0_1.0.8-wait-for-vsync-before-SwapBuffers.patch

模仿且沒有新意的 iPhone-like UI

為了應付即將開學的各項開支,到了春節依然不能停滯而必須努力工作。原本,只是為了工作單單在修某支程式的使用者界面,卻一時心血來潮,幫這選單 UI 添上了『加速度』的處理,更沒想到結果居然讓該 UI 的行為幾乎和 Apple iPhone 一模一樣。就這樣,除夕夜一個晚上,都在玩弄這支程式中不知不覺度過了,半點錢都沒有賭到,歲到是守得很徹底。為了紀念這隻小年獸,就用手機錄下成果。(沒有專業器材,畫質不佳還請多包涵!)

用 C 語言處理常見的旗標位元運算

正如國中理化課所說,電子產品都是由滿滿『0、1』所構成,大家早就都了解這件事。但現實上,由於要求的功能愈疊愈多,低階的運算早就被眾人所忽略。無論大家如何忙著處理物件的繼承問題,又或者是因時間太多而研究『1+1=2 慢吞吞語言』,低階的運算還是依然沒有消失,反而更為重要。 位元運算不外乎就是『AND、OR、XOR...』等邏輯概念,主要目的是把『1 變 0』、『0 變 1』或有條件維持不變,在程式中比較常看到的地方,通常會在硬體驅動程式(Driver)之中。而在高階應用程式中,也往往因為要旗標條件的判斷,也會看得到其存在,如 Linux 下的檔案權限。 一個更貼切的例子,假設我們現在寫一個滑鼠驅動程式,我們要怎麼設計資料結構,讓應用程式得知用戶(User)按了哪幾個鍵?用戶可能是一次只按『一個鍵』,也可能一次按『左右兩個鍵』,更有可能按『左鍵和中間鍵』,有多種組合存在。 一般初學程式者可能會用 boolean 或 int 這樣寫: struct _mouse_event {         int button1;         int button2;         int button3;         ... }; 但明明只是『0、1』,為何要用到 int 資料形態?除了浪費記憶體,運算上也整整慢了好幾個 CPU Clock。所以,多數程式開發者碰到此類問題,會比較偏好以位元為最小單位來寫: enum {         MOUSE_LEFT_BUTTON = (1 << 0),         MOUSE_MIDDLE_BUTTON = (1 << 1),         MOUSE_RIGHT_BUTTON = (1 << 2) }; struct _mouse_event {     ...

Apple iPad 所帶來的省思

就在睡夢中,地球另一端的 Apple 推出了新產品『 iPad 』,傳說中的平板電腦終於亮相,乍看之下 iPhone/iPod 的放大版誕生了,似乎沒什麼特別之處。不過一旦到了這種尺寸,許多人不免會拿 iPad 和國內近來炒翻天的電子書(ebook)相比較。確實,用電腦的思維去看這產品是不太恰當的,會缺少許多電腦狂熱族群要的功能,但若單以電子書的角度來看,這次 Apple 賞了我們一個大巴掌。 國內廠商依然趕不上的 UI 設計 以前電子產品的設計,因為技術限制,只求達到目的,不注重人們的使用經驗。但是,這樣的概念已經慢慢不適用於現在,許多電腦廠商卻仍抱著做出功能即可的心態,才導致功能不斷增加,價格不斷跌落的惡性循環。科幻電影和小說的一切是人們共同忡景,缺少改善使用經驗的努力,就等於跟千千萬萬人們作對一樣。 不可否認,就算 iPhone 第一代發表至今少說也有三年之久,但仍然沒有第二家廠商能做出能與之相敵的界面。就算單單是將 iPhone 的界面直接放大製成 iPad 而不做任何變動,不論流暢度和使用觀感,依然領先群雄。 在 iPad 宣傳影片中,展示了幾幕電子書的應用,Apple 嘗試將書本的感覺和閱讀習慣做到冰冷的玻璃裡面去,翻頁操作也好、翻頁過場效果也好,讓人感到不突兀、不陌生、不多餘,令人感受到有其細膩的設計。雖然並不是全部都很完美,但某些部份確實讓人能感受到友善。 我們可以試想,同樣的硬體,若是交給國內的廠商來設計 UI ,最後產品會變得多麼可笑?我們是不是該花點心思在使用者經驗上?難到就連照抄都抄不出來? 廠商的藉口:特效不重要! 講到 UI 、使用者經驗,許多廠商往往會說特效不重要,試圖運用詭辯,一刀將 Apple 的優點通通斬殺。撇開今天的產品,回想第一代 iPod,當時也沒什麼動畫和特效,一個簡單的圓形觸控,就已滿足了許多人的使用經驗,至今回頭來看,我們依然能感受到其 UI 的友善。 那麼,特效不重要是廠商們做不到的藉口?還是因未深思熟慮 UI 設計的無知之言? 專注內容格式的綁定好無聊 有鑒於 Microsoft DOC/PPT 和 Adobe PDF/Flash 的成功,全天下的人都妄想製作自家的專利格式,甚至在電子書市場,想要透過格式通殺產業。雖然格式是最後成功和賺錢的關鍵,但尚未...