發表文章

目前顯示的是 2010的文章

Linux 下程序的記憶體映射

Linux 下的執行檔為 ELF 格式,其啟動原理與各作業系統上的執行檔一樣,不外乎是載入檔案到記憶體上,並讀取需要的 Shared library link 清單,最後找到於 Filesystem 上對應的 symbol link 和 library,載入外部函式和執行程式。

這邊以 VIM 為例,我們透過 Linux 下的 ldd 指令可以得知執行檔需要的外部 Libraries:
$ ldd /usr/bin/vim linux-gate.so.1 => (0xb7837000) libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb77f2000) libncurses.so.5 => /lib/libncurses.so.5 (0xb77b8000) libselinux.so.1 => /lib/libselinux.so.1 (0xb779c000) libacl.so.1 => /lib/libacl.so.1 (0xb7795000) libgpm.so.2 => /usr/lib/libgpm.so.2 (0xb778f000) libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7649000) libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7645000) /lib/ld-linux.so.2 (0xb7838000) libattr.so.1 => /lib/libattr.so.1 (0xb763f000)
由以上結果可以看到 VIM 所需的 library,以及在 filesystem 上找到的對應 library ,然後還可以得到當 library 被載入到記憶體上時的起始位置。其中比較特別的是 linux-gate.so.1,實體並不存在於 filesystem 中,這代表 kernel system call 的記憶體映射和其位址。

Kernel 其實有 Interface 提供我們取得更多 Process 的記憶體映射資料,藉由讀取 /proc/[Process ID]/maps 這檔案,我們除了可以得到 Process 連結的 library,還可以…

寫支 C 程式用 XRandr Extension 設定你的螢幕解析度

在 X11 下取得螢幕顯示大小,最快的方式就是得到當前的 Screen ,然後用 DisplayWidth() 和 DisplayHeight() 得到寬高,如果是在高階的圖形介面架構下開發應用程式,如:GTK+,也有相關的 API 可以取得 display 的大小。然而,要是我們想取得更多關於螢幕和顯示晶片所支援的模式,便要引入 XRandr Extension 來達成。

若不了解 XRandr 是什麼,可以開啟終端機(Terminal)程式,接著輸入 xrandr 指令,就會看到顯示器的相關訊息,除了可以得到有幾種螢幕可以用,還分別可以看到支援的模式(解析度和掃描頻率),以下是在筆者 X200t (有外接一台支援 1920x1080 的 24" 顯示器)上執行的結果:
$ xrandr Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 8192 x 8192 VGA1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 531mm x 299mm 1920x1080 60.0*+ 60.0 60.0 1440x900 59.9 1280x800 59.8 1152x864 75.0 1024x768 70.1 60.0 800x600 60.3 56.2 640x480 66.7 60.0 720x400 70.1 LVDS1 connected (normal left inverted right x axis y axis) 1280x800 60.0 + 1024x768 60.0 800x600 60.3 56.2 640x480 59.9 HDMI1 disconnected (normal left inverted right x axis y axis) DP1 disconnect…

Mandice Superted - Non-GoogleTV Web Browser for TV Device

由於一些合作廠商們不願意使用 GoogleTV 或 Android 做 TV Devices,最近實作了 Connected TV 專用的網頁瀏覽器(Web Browser) - 『Superted』。他們選擇不走 Google 之路有很多因素,像是 Google 雖有遠大願景,但當前還不夠成熟,所以目前為止 Android 在 Connected TV 上,還未有立即性的應用程式擴充價值。其次,中國大陸的 PPStream Content 和山寨市場之大,讓華人市場不接受只有 Youtube 的 GoogleTV。再來,就是跨平台開發成本與硬體驅動的議題。這也是為什麼我們會被要求寫一個『比較適合』在 TV Device 上使用的網頁瀏覽器,當然,廠商們的聖旨也說要有大又明顯的 UI,又或者是與 GoogleTV 雷同。

延續過去的 Webkit 網頁瀏覽器實驗品,加上了 3D User Interface 的支援,便完成了 Superted 的原型:



後記

影片中是使用 Acer AspireOne(Intel Atom N270) 第一代 netbook 做功能演示,也已經在 VIA platform 上順利測試過。

Mandice 為您在 Linux 和新產業機會開路

近來忙於工作和協助新團隊的建立,付出於 Blog 上的時間也少了許多,不過,雖然在 Blog 上與自己對話的時間減少,但這些日子,卻自我反省甚多。

回想起過去的經歷,總讓一波波湧出來的『資訊新名詞』,將自己不停往岸上沖。這就是資訊業,三天一小變,五天一大變,稍不留神,已改朝換代而擱淺在岩岸上。但在這浪花四起的時代,總不曉得是被誰所欺負。有時欲求助卻會惹一身麻煩,每每都問自己,到底要忍到何時?知道被沖上岸者眾,人人都不甘心,卻也莫可奈何世代交替,也在擔心哪一天自己會被衝上岸。
經過風風雨雨,能體會許多外界不瞭解的心聲;隨『科技業』起舞多時,我們多少也有在第一線立足的經驗和能力。尋思,與其每天趕潮流拼出貨,日日廢寢忘食只為解決沒價值的人為遐疵,何不帶著最新的技術為沉睡多年的前輩們『重新開路』,開一條不孤單的路,開一條喚醒巨龍的路?
為此,一個全新的台灣車庫團隊 [Mandice] 誕生,宗旨『做正確的事(Do the right thing)』,我們不盲目跟從,我們創造和領導新方向。
由於團隊的存活與堅顧理想是無法避免的考量,我們目前的經營三大方向為: 保本以接案、顧問服務、銷售軟硬體和商業合作為主要訴求創新建立商業模式,開發有產業價值或有自身創意之產品擴展強健內部團隊技術發展和體制

我們計畫推出的服務項目:
各式軟硬體技術整合顧問服務,讓企業精準做正確決策 代理維護底層軟體系統平台,讓企業專注自身優勢發展 伺服器軟硬體建置支援,協助 IT 系統建設 快速供應完全免授權費的商業用 Linux 作業系統,今天下單明天出貨 量身訂做各式專門用途作業系統,使產品效能和品質兼具 協助將 Linux 系統導入自家產品設計,協助業者迎接資訊新世代設計並生產自己的概念產品,創造新時代 
此外,我們也將投入網路服務的發展和創新,期望在台灣重建網路泡沫化後,各界對網路失去的信心。

當前,如果您有以下需求,您就將會是我們的商業夥伴
想有劃時代資作為的老闆和企業 想將原本的應用轉移至更有機會的平台 需要隨機出貨的免授權作業系統 不想自己養大隊人馬貢奉底層系統 不想傷腦筋卻又必需追新東西的人燒錢燒到失望的老闆和企業
無論您瞭不瞭解當今的新名詞,無論您是否遭遇過難搞的技術人事,希望您可以再嘗試一次,萬事起步難,這次開路交給我們。

Linux 上原生的 Google Map 應用程式

為了一些想法和方向,最近開始實作 Google Map 應用程式。經過些許研究,得知了如何從 Google 取得 Map 圖檔,然後自己刻了一支簡單的貼圖引擎,便大致完成了這個應用程式。


或許很多人覺得這種東西只要引入個 Web 瀏覽器引擎,再用 JavaScript 來做就好,但考量到 Web 瀏覽器引擎需要龐大的硬體資源支持,若是什麼小東西都使用它,將可能成為莫大的問題。所以,此次實作使用 C 語言,並在 X11 的架構上繪圖,是一個原生的 Linux Application。

你不需要自由

曾幾何時,『自由』兩字變成了信仰,更變成了宗教狂熱,終以救世主姿態降臨。確實,我們都不喜歡被鎖在一片漆黑毫無自由可言的房中,許多心理實驗也證明了這樣做會造成人們發狂,但是自古到今,絕大多數人類被鎖在地球表面上卻也不曾為此發狂,尋思,自由有這麼重要嗎?我們又真的需要自由嗎?或許,我們只需要有能夠發洩的管道,其實自不自由一點都不重要。

歷史上為了自由而戰的事績何其多,有人為獨立而戰,有人為自己生存權利而戰,更有人為地位而戰,無論如何,大家追求的不過是長久心理壓力的出口。反觀當前科技業,近來開口自由軟體,閉口也自由軟體,暢導『自由』已不是為追求瓶頸出口,而是種貪婪的表現。到最後,雖不花分毫取得和掌控軟體各種權利,卻花了更大的代價去維護,甚至可能因無法控制而走火毀滅。

說到底,身為科技產業的商人要的是什麼?到底是軟體業合作廠商口袋裡的錢?還是市場上的錢?

一個通過重重升學考驗,有一技之長的精英,花了數十年成就一身,使用他們身上的東西,都有每個月個把萬的價值,更何況一個通過重重研發關卡的軟體,餵飽這些軟體的龐大成本更不在話下。而將這些軟體成本放在自己身上,更是種風險和壓力。所以,各自放出口袋不屬於自己的餅,丟掉這份不需要的自由,讓所有人共同追求最大利益不是更好?

一個商人或商業機構,追求利益的出口,無可後非,不過,一個皇帝可以穫得大片江山,卻不能任意奪取民脂民膏,更是不能忘記。

後記

若自由軟體不能勝任,就算熱愛自由軟體,也不應貿然使用,否則造成的後遺症,可不是打出『義和拳』推廣旗織就能解決的。

用 apt-get 節省系統開發和評估的時間

使用 Debian 系統(包括 Ubuntu)的人,應該早就熟於使用 apt-get 去安裝、移除或更新系統,其無痛和方便的操作,帶給 Debian 家族很大的優勢。而對於研發人員而言,我們比較在乎的是如何取得各套件的程式碼,更在乎的是能在『不出錯』的情況下將取得的程式碼完整編譯通過。

你可能碰到過一種情況,辛辛苦苦從各程式的專案首頁去抓回 Source Code 後,卻怎麼也無法在自己的電腦上編譯,單純點的情況是相依性問題,複雜點則是在不同系統上的相容問題,更誇張的是根本不清楚下載回來的 Source Code 是不是『真的沒問題』。相信很多人早已浪費過不少生命在這些麻煩問題上,導致開發效率低落,不過以上問題,卻在 Debian 裡相當容易解決,因為 apt-get 提供了一系列選項,讓我們輕易從下載原始碼、解決相依性問題、到確保通過編譯一次搞定。

# 下載套件原始程式碼: apt-get source <package> # 安裝該套件編譯過程必要的東西 apt-get build-dep <package>
從 apt-get 下載回來的程式碼,會在自動解開時將該 Package Maintainer 所做的 Patch 一併打進程式碼,以此方法解決系統相容性問題,這邊用 lxterminal package 為例,粗字部份就是在解壓縮時上的 patch:
$ apt-get source lxterminal 正在讀取套件清單... 完成 正在重建相依關係 正在讀取狀態資料... 完成 NOTICE: 'lxterminal' packaging is maintained in the 'Git' version control system at: git://git.debian.org/git/collab-maint/lxterminal.git 需要下載 293kB 的原始套件檔。 下載:1 http://ftp.tw.debian.org/debian/ sid/main lxterminal 0.1.8-2 (dsc) [1,372B] 下載:2 http://ftp.tw.debian.org/debian/ sid/main lxterminal 0.1.8-2 (…

超強大的 Bash - Networking 支援

當全世界都在瘋各種擴充性多元的 Script 語言時,所有人便開始遺忘 Unix 上古老的 Shell script,的確,和當今主流的 Python 、Perl 等語言相比,Bash 像個醜小鴨,但是不可否認,其功能和 footprint 的相對價值遠超過其他 script 語言甚多,因此在大多數 Linux 發行版之中,仍然會預設安裝 Bash 。

也因為 Bash 被太多人忽視了,很少人知道, Bash 其實也可以操作 Networking,舉例來說,可以一行指令便連上時間伺服器,透過 Daytime Protocol (RFC-867) 取得目前的標準時間:
$ cat </dev/tcp/time.nist.gov/13 55442 10-09-03 11:19:58 50 0 0 839.8 UTC(NIST) *
Bash 內建了這樣的功能,讓使用者可以透過讀寫 /dev/proto/host/port 的方式去操作網路連線,當然這路徑並不真實存在於系統中,所以透過其他的 script 或程式是無法存取。瞭解有這樣的功能後,我們也可以去試著去抓取網頁內容:
$ exec 3<> /dev/tcp/www.google.com/80 $ echo -e "GET / HTTP/1.1\r\nhost: http://www.google.com\r\nConnection: close\r\n\r\n" >&3 $ cat <& 3 HTTP/1.1 404 Not Found Content-Type: text/html; charset=UTF-8 X-Content-Type-Options: nosniff Date: Fri, 03 Sep 2010 11:40:10 GMT Server: sffe Content-Length: 1354 X-XSS-Protection: 1; mode=block Connection: close <html><head> ... 內容省略 </body></html>
後記

使用 Shell script 是一種身為 Linux/BSD 等 Unix's like 系統工程…

為你的程式加上 Debugging Mode

使用 C 語言開發程式,往往面對的都是數不盡的奇怪臭蟲,若想為程式除錯,通常會使用很多的 printf function,將所有程式執行的流程以及階段訊息印在畫面上。不過,太多的除錯訊息多半也會造成效能的影響,甚至是造成程式在使用上的不便。尋思,若能在 compile 階段設定是否開啟 Debugging Mode,對程式開發和最後包裝釋出,都可減少不少時間花費。

本文主要說明,如何利用 Autotool 和 C 語言 Macro,在 ./configure 執行階段決定啟動 Debugging Mode:
./configure --enable-debug
要達成目標,首先必需修改 configure.ac 並增加設定,使之後產生的 configure 檔案可支援 --enable-debug:
AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug], [Enable debugging]), CFLAGS="$CFLAGS -g -D_DEBUG")
然後在程式中的 C Header (確定該檔案是所有程式碼都會 Include 的 Header),加讓以下 Macro:
#ifdef _DEBUG #define DEBUG(format, args...) printf("[%s:%d] "format, __FILE__, __LINE__, ##args) #else #define DEBUG(args...) #endif
然後我們就可以在程式中使用 DEBUG() 的 Macro,用法和 printf function 一樣,只是該字串只在 Debugging Mode 被啟用時才會被編譯進程式裡:
void main() { DEBUG("Debugging Mode was enabled\n") printf("Hello World!\n"); }
該程式執行後,就會看到類似下面的訊息:
[main.c:3] Debugging mode was enabled Hello World!
由於在 C header 中設計的 DEBUG(),也包括…

GStreamer Debugging 參數說明

[GStreamer] 是一個優異的多媒體處理元件 Library,其架構了最先進的多媒體資料流機制,在目前主流的 Linux 系統中,應用極為廣範。GStreamer 支援以 Plugin 的形態擴充自身功能,可以是編解碼器(Encoder/Decoder),亦或是效果處理(Processing),因此,有許多生產硬體解碼晶片的廠商,都會透過提供 Gstreamer Plugin 的方式,支援 Linux 上的多媒體播放。說到多媒體架構,或許讀者也曾聽過 OpenCore/OpenMax,其實 Gstreamer 和 OpenCore 兩者是相類似的東西,只是前者主要被應用在桌面系統居多,後者則常見於嵌入式系統(Embedded System)應用,最廣為人知的便是 Android Multimedia Framework。在此,細節就不多談,本文將要探討 GStreamer Debugging 的一些手段。

如果曾開發過 GStreamer Application,對初始化 GStreamer Backend 應該很熟悉:
gst_init(&argc, &argv);
我們可以理解所有的 GStreamer Application,都會經過這段 Initialization 的動作,因此 gst_init() 會從 main() 得到程式被執行時所代入的後綴參數,換言之,理論上不管是什麼 Application ,我們可以透過這種方式去開啟 GStreamer 的 Debug 模式:
$ ./totem --gst-debug-level=3 0:00:00.003322140 13127 0x8c530a0 INFO GST_INIT gstquery.c:105:_gst_query_initialize: init queries 0:00:00.004700946 13127 0x8c530a0 INFO GST_INIT gstmessage.c:73:_gst_message_initialize: init messages 0:00:00.005529752 13127 0x8c530a0 INFO GST_PLUGIN_LOADING gstplugin…

親手打造 Window Manager - Transient 和 OverrideRedirect

若嘗試去讀各個 Window Manager 的程式碼,最大的挫折就是會遭遇其中了龐大數量的專有名詞和屬性,假設沒有對 XWindow 和 Window Manager 整體架構有清楚概念,必定會花不少時間在查詢 X11/Xlib 的官方文件和映證,不過,查證過程雖繁瑣,對瞭解整個實作很有幫助。筆者將在本文記錄幾個比較特別的視窗(window)屬性,以便讀者懂得如何處理一些特殊的 window。

WM_TRANSIENT_FOR

此 Hint 屬性記載著短暫視窗的父視窗的 Window ID,若不是短暫視窗,將回傳沒有父視窗。短暫視窗有與一般視窗不同之特性,其將不會在工作列上被顯示,只是用來做短時間顯示使用,如對話視窗(Dialog Window) 就屬此類。想取得該屬性的設定值,可以藉由此 XGetTransientForHint() 得到:

XGetTransientForHint(Display *, Window, Window*)
OverrideRedirect

此 Window Attributes 參數表明忽略重新定向,若此參數為真(True),視窗管理員(Window Manager) 將不會為該視窗畫上標題框和邊框,如選單視窗(Menu Window)就屬此種會忽略重新定向的視窗。我們可以透過 XGetWindowAttributes() 去取得該屬性,簡單的範例如下:

XWindowAttributes attr; XGetWindowAttributes(display, win, &attr); if (attr.overrideRedirect) .... else ....
暫且撇開一般 X Application 開發者熟知的視窗形態(Type),如:Dock 、Desktop、Toolbar 等等,Window Manager 在畫視窗時,首先要處理的是 WM_TRANSIENT_FOR 和 overrideRedirect 這類的屬性,而視窗形態應該是考量於 Window Manager 自身的應用後,才有不同的設計和呈現。

親手打造 Window Manager - 監聽 Screen 上的 XEvent

在 Linux 等 Unix's like 的系統上,擁有數十載歷史的 X11 通常為主流的圖形介面支援方案,雖架構看似老舊,卻在世界上眾高手的努力下,成就了現在的各種極絢麗的桌面環境,而最為眾人所知的,便是 Compiz 這類『視窗管理器(Window Manager)』,其運用 3D 技術帶來震憾的桌面體驗,因此在目前主流的 Linux 發行版中,無一不預設搭載。而許多人在此時,才真正了解 Window Manager 的厲害和重要性,新興的系統中,無論是 Moblin 還是 Google Chrome OS,也都特地為自家系統打造專屬的 Window Manager。

然而,Window Manager 實作細節雖看起來複雜,但實際上沒有想像中這麼艱澀,單純透過 X Protocol 和 API 去控制 window 的行為,這類工作極為簡單,而真正令人感到棘手的,是在事件(event)處理和 ICCCM/EWMH 的部份。ICCCM/EWMH 現在是由 [FreeDesktop.org] 所維護,其定義了一系列的屬性,用來記錄視窗環境的狀態,並可供所有 X Client 存取,而 Window Manager 要做的就是成為一個常註程式(Daemon),並隨時去提供和更新這些狀態。不過由於 ICCCM/EWMH 這部份細節繁雜,暫不在本文討論範疇(有興趣可自行參閱 FreeDesktop.org EWMH Spec),我們主要是討論如何監聽畫面上視窗的 event。

一般 window 監聽自己的 XEvent 是家常便飯,只要有以 Xlib 寫過純 X Application 的人應該都多少有些了解,會比較不瞭解的部份,就是該如何去監聽整個 screen 上的 event,但在這之前,我們有必要先大致瞭解 X window 的架構。通常在 X 上所呈現的桌面環境,是一層層 window 疊起來而成,舉例來說,桌面上常見的工具列(Panel),上面的狀態 Icon ,如:網路管理、Pidgin Icon 等,都是一個個 window 放在 Panel 的 window 之上,而在 Panel 之後,到最底層便是 screen 的 Root Window,Root Window 在所有 window 之下。

所以,若要做到監聽整個 screen 下所…

Reverse SSH Tunnel 反向打洞實錄

近來經手了幾個案子,其目標都是設計一台做特定用途的系統,但往往這台機器都會被鎖在防火牆後面,甚至不會連上網際網路,是完全封閉的環境。每當接近結案,將系統交到客戶手中以做最後的壓力測試時,便是痛苦的開始。怎麼說呢?因為當面對最後的大量測試,各種大大小小的臭蟲(Bugs)就會原形畢露,一一浮上臺面。而每次問題發生,便要千里迢迢趕到客戶那了解情況、解決問題。如果問題不大倒還好,一旦問題嚴重,被客戶關到三更半夜也是常有的事,更誇張的還必須每天都去報到。所以,為避免車程來回的時間和人力浪費,是否有可以遠端連線做處理呢?便思考起這問題。

雖然這些機器通常都不會有真實 IP,客戶也不會為了我們特別請 MIS 去開啟 NAT 或防火牆,但還好 SSH 提供了反向(Reverse)的機制讓我們可以連進去。其做法就是讓在客戶那的系統,透過 SSH 先連回我們自家有真實 IP 的主機,然後建立反向的通道即可。如此,我們便可從自家的主機,從 SSH 連回放在客戶那的系統。

實際的操作步驟:
# 首先,在客戶那理的機器下指令連回我們自己的 Server,並設定自己 Server 上的 12345 port 會對應到幾器上的 SSH port ssh -NfR 12345:localhost:22 fred@myhost.com # 然後在 myhost 的機器上連自己的 12345 port,就可以連回在客戶那的機器 ssh localhost -p 12345
後記

可以將建立 Reverse SSH tunnel 的命令設定在開機後執行,並且透過設定 ssh config 讓斷線時自動重連,如此就可以確保 SSH 連線不會中斷。此外,若是客戶端那的機器是處於完全無法對外連線的環境,則可以考慮使用 3G 網卡,並將網卡暫時借放於客戶那,然後等結案後再取回,雖然 3G 通訊月租不便宜,但和經常來回的通勤費和時間花費相比,可滑算多了。

善用 DRI 加速貼圖

近日以來,筆者都在著手處理 Linux 下圖形運算的議題,不久前也曾發表一篇『善用 XShm 加速貼圖』以探討 X 架構之下的貼圖機制,舊文最後也提出範例,使用共享記憶體(Shared Memory)的方式,達到效能的改善。不過,透過減少資料複製,雖然能有效提升貼圖的效率,但都還只是停留在彌補 X 架構先天上的缺陷,令人不禁去想,是否有更直接的解決方案?尋思,現今硬體能力不可同日而語,幾乎每台電腦都具備著基本能力的影像晶片,若運用 DRI 直接對硬體貼圖應該是種可行的手段。

欲在 X 上透過 DRI 繪圖,最簡單的方法是使用 GLX Extension,藉由建立 OpenGL Window 開啟直接和硬體溝通的管道。我們可以修改與舊文相同的程式碼,並改用 OpenGL 來達成相同的效果:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <X11/Xlib.h> #include <GL/gl.h> #include <GL/glx.h> #include <GL/glu.h> int main(void) { Window win; Display display = XOpenDisplay(getenv("DISPLAY")); unsigned char *buffer; GLint glxattr[] = { GLX_RGBA, GLX_DEPTH_SIZE, 32, GLX_DOUBLEBUFFER, None }; /* Initialize GLX */ xvinfo = glXChooseVisual(display, 0, glxattr); if (xvinfo == NULL) exit(1); /* Initial Window */ win = XCreateSimpleWindow(display, RootWindow(display, DefaultScreen(display)), …

Android is Working on X

圖片
As you know, Android was designed for mobile device, so there is no large value from Android for desktop environment. But there is no denying that Android has extreme applications resources. If we can combine Android and desktop environment, it will make great experience on Linux. By hacking Android framework, we made Android work on X with success, it is a "real" X application right now. You can see these screenshots:




From screenshots, Android is running on Chromium OS, based on Android-x86 project. Currently, we can use chromium browser to surf internet and use Android application in the same time. In first screenshot, using "ps ax" to show all process on system to prove Android is running on X Server rather than emulator.

善用 XShm Extension 加速貼圖

如今的 Xorg 千變萬化,發展出各種(DRI/DRI2/EAA/EXA/UXA/AIGLX)等加速機制,更有極絢麗的 3D 視窗技術,一點也不讓 Mac OS 和 Windows 上的 3D 視窗特效專美於前。話雖如此,很多人們早已遺忘 X Window System 的歷史原由,我們反觀當年的 XFree86 就有如醜小鴨般,其為 Networking 考量的 Client/Server 架構,就是舊 Unix 終端機時代所留下的東西。到目前為止,隨著硬體速度越來越快,Client/Server 的界限雖被 DRI/DRI2/AIGLX 等技術逐漸打破,但無論如何,Xorg 大底上還是維持著 Client/Server 的本質。只不過應用程式層的軟體,因為經過各種 GTK/GDK/Qt 等 Graphical Toolkits 包裝後,多數開發者和使用者已經不會再看到 X 底層的運作模式。

這裡記載著一個簡單的範例程式,用來說明 X 如何利用 XImage 做貼圖運算,其主要是將 buffer(100x100x32bits 的影像)畫在視窗上,該 buffer 可以是讀取圖檔或是使用各種資料來源,為一塊記憶體。此程式將會用 XCreateImage() 建立一組 Structure,然後使用 XPutImage() 將該 Structure 和影像資料吃從 XClient 透過 X Protocol(Socket)傳送到 X Server,X Server 再依 XImage 的敘述將圖形畫在視窗上。

XImage 範例程式:
void main(void) {     Window win;     Display display = XOpenDisplay(getenv("DISPLAY"));    XImage *ximage;     unsigned char *buffer;     /* Initial Window */     win = XCreateSimpleWindow(display, RootWindow(display, DefaultScreen(display)),                                                         0, 0, 100, 1…

GLib 就是懶.GThreadPool 高效的執行緒池

開發複雜的程式時,執行緒(Thread)隨處可見,在高負載的應用程式中,就常會使用到多執行緒所構成的演算法,如 Apache 此類有許多流量及使用者操作的程式,就運用 Thread 做負載的分配。但是,每當 Thread 的建立和摧毀,會造成額外的系統資源開銷,若是有大量 Thread 增減將會造成程式效能不彰,所以最好的辦法便是回收並重新運用已經被建立的 Thread。因此,GLib 提供了 GThreadPool 的機制,可重復利用 Thread 以減少不必要的開銷。

這是一個使用 GThreadPool 的範例程式:
void mythread(gpointer data, gpointer user_data) {     printf("%s\n", data);     printf("%s\n", user_data); } void main() {     gchar *data = "this is data";     gchar *user_data = "this is user_data";     GThreadPool *pool;     if(!g_thread_supported())          g_thread_init(NULL);      /* create thread pool */      pool = g_thread_pool_new(mythread, user_data, -1, FALSE, NULL);      if (pool==NULL)          printf("ERROR\n");     /* start three threads */      g_thread_pool_push(pool, data, NULL);      g_thread_pool_push(pool, data, NULL);      g_thread_pool_push(pool, data, NULL); }

體驗舊台灣經濟奇蹟之感

偶見長輩們提起,台灣早期的繁華和奇蹟,而奇蹟發光時,筆者年幼,懵懵懂懂,卻難以感受一二。如今再從長輩口中傳述,只知,當時台灣人民為錢打拼,不遺餘力。此外,由於當時金融和經濟體制不健全,透過所謂的銀行對保等支付方式相當麻煩,也因為當時國際關係,許多金流是在暗地中轉動,廠商間的往來,往往一句話敲定便算。甚至當下,因為一句信任就交付現額鉅款,也是常見的例子,難以令人想像。只能說,在一切混沌的黑暗時期,人人都為了賺進鈔票而努力,先不論黑白兩道的縱橫交錯,最重要的是誠信便成了當時莫明的默契。

上有誠意,下有衝勁

最近走入南部拓展,因緣際會而接觸了早期的科技產業,卻他們仍保有著台灣早期繁榮的文化,做生意總是滿懷誠意,只要合理,二話也不多說,便開始進行後續流程,用台灣話『阿沙力!』來形容,一點也不為過。但更令筆者感到震憾的,是他們工作伙伴的效率驚人,沒有現代的『工作管理系統』和『協同作業機制』,團隊依然有相當可觀的產能。反觀當今主流資訊業大大小小公司,團隊往往是被流程和管理機制推著走,研發人員已經失去了不畏虎的衝勁。

解決問題的態度,令人自形慚愧

也許是現今產業的專業分工所致,許多人總將問題不分清紅皂白推往別處,只堅守自家陣地。往往工程人員解決問題,都早已忘了初衷,只專注於眼前表面的障礙。久而久之,『會動就好』就變成了一種處理事情的態度。但是態度蔓延,從零組件廠開始,『零組會用就好』就成了最後做產品的態度,所有細節問題通通丟給各大零件廠商去處理。就商業考量上雖沒有不對,但是生產出來的東西就不盡人意了,換言之,要是最後的系統整合商不懂得要求,產品就不會有頂尖的品質。

而在某公司的教育訊練中,就因為幾句對話,讓我驚醒:

『這部份的驅動程式官方沒提供程式碼,可能不能移殖』我說。

『官方沒提供程式碼呀?沒有問題,我們自己重寫這驅動程式』該公司工程師說。

『這部份的硬體可能會不合用』我說。

『沒有問題,那我們就改硬體』該公司主管說。

更令我一再省思的,便是該公司無意間提到一些點子和解決方案時:

『CPU 架構不一樣呀?那你可以幫我們實做 emulator 嗎?只要給我們介面, 從外部抽出裡面各個 register 的資料即可, 東西放哪我們能 reversing。』該公司主管說。

先不論技術問題,就出發點而言,他們的技術研發是貼近著產品化而做,所有發想不是純實驗、純好玩,更不是做一個純有遠大…

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[1]); …

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,它們在娛樂市場已有著深不可測的軟體資源,更有完整的架構和體系,Sony 何必和 Google 這…

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.linux.org.tw/~fre…

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=/usr/arm-linux-gnueabi/lib/p…

夜,寂靜

也只有在獨自一人時,才能清醒的與自己對話,於大樹底下偷偷埋藏的思緒,此時會猛然湧上心頭,而靈魂末端的枝葉總自顧掉落。

夜有多麼靜,心跳的聲音卻如此吵雜。惡耗了一整晚,解不清的工作乾脆直接扔在一旁,開始細數著在微弱燈光下忽明忽現的嗡嗡飛蚊,傾聽自己心中的聲音。

驚呼,忽然一陣癢感襲來,將一切停滯的夜又搔動了起來。此時怒氣盛起,我面目掙獰如惡鬼一般,非與飛蚊理論究竟不可。

『唉,你長得比較高大,血多到都可以把我淹死好幾輩子,而我只求貴人賞碗飯,讓我活命罷了,你又何必吝嗇?這世界死氣沉沉寂靜又孤獨,我們相伴不是甚好?』眼前那飛蚊老兄,收起翅膀,坐在眼前電腦螢幕上嘆息說著。

『我並不介意血被吸,而是介意心情被打亂。平時的一切種種已經令我夠煩燥了,現在,只想不要被打擾的思考著。』我說。

飛蚊老兄瞥著頭看了看我,似乎看出了什麼端昵。

『哈哈,你不過就是不相信人而已,不想與外界接觸。就像我,我也不相信你心情好,就會讓我飽餐一頓,還不如我自己找機會大大咬上一口。』飛蚊老兄表現得一付很懂的樣子。

『我在想的就是要不要再給一次機會,將信任再一次留給一個人。畢竟,曾經能信任,也花去了不少時間培養,但就是因為後來有一連串太多太久的猜疑,才讓我越來越痛苦,變了一個人似的。尤其很多話不敢說,更讓情況惡化。害我現在一切收進心底,只有在這時候,才會拿出來想想。』我說。

『想通了,隨時都可以重新來過啊。只要你和其他人願意溝通,有什麼不好重建信任,就像現在我和你一樣的交談簡單,你我不都開朗許多。』說畢,飛蚊老兄飛了起來,搖搖晃晃的從燈光邊緣隱沒。

『若是可以,我也想單單純純、平平淡淡的去維持這關係,不要再有什麼無聊的猜忌亂想。』我邊說,邊伸了一個懶腰,準備開始繼續工作。

我話還沒講完,又感到一陣騷癢,反手『啪』一聲,滿手鮮血。仔細一看,原來,飛蚊老兄已死於我掌下,身驅四分五裂、鮮血淋漓,這似乎說明了人類永遠不可能與蚊蟲互相信任。

接著,早晨的陽光也打亂這夜,一切思緒又沉回樹下的時光寶盒,等待著下一次的開啟。

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 {         int button;         ... };
當設定哪幾個鍵被按下,只要用位元運算設定旗標就可以了:
struct _mouse_event mouse; mouse.button |= MOUSE_LEFT_BUTTON; mouse.button |= MOUSE_LEFT_BUTTON | MOUSE_RIGHT_BUTTON;
當然,反向設定也是可以:
mouse.button &= ~(MOUSE_MID…

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 的成功,全天下的人都妄想製作自家的專利格式,甚至在電子書市場,想要透過格式通殺產業。雖然格式是最後成功和賺錢的關鍵,但尚未被使用者接受前,可是一無是處,與其整天想抽格式費用,還不如先把產品做好。

入門級 Mouse Linux Kernel Driver

每當說起 Linux Kernel Driver 入門,就不免提到如何寫個 Hello World 級的 Module,這樣的第一支程式,除了可供 Linux Kernel 動態載入和卸載,似乎是一點用處也沒有。與一般應用程式不同,開發 Linux Driver 最大的門檻不在於如何撰寫出 Module,而是如何設計系統架構與硬體兩者間的橋樑。其中懂得如何控制和結合 Kernel 內各種機制更是重點,最複雜的莫過於此。

這邊有個 Mouse Kernel Driver,會在 Kernel 上新增一個虛擬滑鼠裝置,然後使用者可從 sysfs 控制該虛擬滑鼠(virmouse.c):
/*  * A Virtual Mouse Driver to send fake events from userspace.  *  * Written by Fred Chien <fred@ullab.org>  *  */ #include <linux/fs.h> #include <asm/uaccess.h> #include <linux/pci.h> #include <linux/input.h> #include <linux/platform_device.h> struct input_dev *virmouse_input_dev; static struct platform_device *virmouse_dev; /* Device structure */ /* Sysfs method to input simulated coordinates */ static ssize_t write_virmouse(struct device *dev,                               struct device_attribute *attr,                               const char *buffer, size_t count) {         int x, y, key;         /* parsing input data */         sscanf(buffer, "%d…

親手打造 HD 多媒體播放器(上)

本月 1/23(六)、1/24(日)兩天,小弟將於台中的『靜宜大學應數系』開設嵌入式系統課程。一如課程名稱『親手打造 HD 多媒體播放器(上)』,將試圖發揮 TI OMAP 353x 的威力,打造多媒體播放器。近年來『Beagleboard』面世,其低廉的價格及強大的硬體效能,在嵌入式系統領域造成不小的影響,使許多人可輕易入手開發板,並在上面做各式各樣的應用。在網路社群中,beagleboard 也因此廣為受歡迎,相關文件齊全,各種技術支援都能輕易取得。

我們將選用 Beagleboard 的複製品『Devkit8000』做為硬體平台,硬體規格和設計幾乎完全與 Beagleboard 相同。之所以選用 Devkit8000,除了因為硬體設計和 Beagleboard 一樣之外,其各種接頭支援相當完整,不用再自行焊接,對於軟體開發人員來說,比 Beagleboard 來的方便許多。

此課程總共分上、下兩部份,上半部從嵌入式系統基礎和認識講起,將談及嵌入式系統現況與未來展望、開發環境架設、嵌入式 Linux 基礎架構,適合入門者參加。由於嵌入式系統以實作經驗為重,課程將以實作為主進行,如題『親手打造』一詞,藉自己動手做以增加實務經驗。

註:靜宜大學將提供學生開發板使用,只需帶著玩樂的心前來即可。

活動詳細訊息

活動名稱:嵌入式系統short courses
活動網址:http://www.excellent.pu.edu.tw/news_detail.php?sid=0&id=1366
活動目標:
嵌入式系統開發系統介紹,了解嵌入式系統的現況與未來展望做中學--學習嵌入式系統的開發環境佈署與建置活動日期:1/23 09:00-16:00
演講者:于昌永老師、錢逢祥工程師
地點:靜安425
對象:全校師生、育成培育廠商
人數:30人
承辦單位:應用數學系
參考資料:

Devkit8000:
http://elinux.org/DevKit8000
http://fred-zone.blogspot.com/2009/12/android-eclair-porting-for-devkit8000.html
http://fred-zone.blogspot.com/2009/12/enable-ads7846-touchscreen-in-android.html
http…

長大吧!台客實驗室(ULLab)

回顧數個月前『專做有趣玩夜兒的台客實驗室 - ULLAB』,幾個朋友因臭味相投而成立了 『ULLab』。這是個非營利性質的自發性組織,參與者都希望藉由致力於自由軟體開發,多多少少改變這世界,並以『宅宅發卡給正妹』為目標而努力前進。慶幸,經過數個月的努力,有一些小成果,陸陸續續也有愈來愈多人注意到我們的有趣玩夜兒。

由於 ULLab 成員似乎人人都有著不為外人而知的經濟壓力,悲慘的背景彷彿已成為必要的履歷項目。過去這些時間,大家總是私下各自尋找賺錢活命的機會,有人接案,有人上班又兼職,更有人大學研究所念不完,欲哭無淚。絕大數時候,每個人都過著自己的忙錄人生,只在空閒時才投入自由軟體的開發。

當初完全沒有料想到,在近幾個月的社群經營以及國內外活動曝光後(COSCUPGNOME.Asia SummitOpen Source Contest 2009),開始有人想委託 ULLab,其中有一些零星的外包,也有進一步的合作研發,甚至是長期的顧問交流。對於我們這些負有沉重壓力的人來說,未嘗不是一件好事。許多好心的廠商藉由合作和外包,資助我們繼續走下去,替我們免去了不少負擔。也感謝一些學校單位,對我們的 Open Source Project 的贊助,無論是設備還是人力。

說來慚愧,也許是因為成員們普遍缺錢,人人趕工搶糧,所以讓合作廠商都覺得效率不算差,願意給予更多機會,讓我們貢獻微薄意見,有時甚至讓我們領導其產品發展。而有些廠商常口頭上過於抬舉,其實,我們只是因為過去挫敗的比別人多,現在比其他人更注意什麼應該避免,什麼應該著重而已。

不過這樣的經歷,使 ULLab 幾乎無所不碰,從 Linux Distribution、Performance Tunning、Application Design、Driver Porting、Customization、Embedded System 甚至是 Google Android,除了可以玩到很多『怪產品』之外,更吸收了不少來自世界各地的第一線資訊,大開了眼界,也對許多產品有了重新省思的眼光。真的很開心,因為能接觸到很多特別的新東西,是身為不起眼的宅宅敲鍵盤工人所夢寐以求。

這兩個月,因為許多的合作計劃和關係成長,其收入已經慢慢的能支持 ULLab 成員們大部份開銷。再者,十二月份天外飛來一筆比賽獎金,促使伙伴們想進一步成為真正攜手…

Debian Sid nfs-kernel-server 1.2.1-1 重大問題

對於長期開發 Embedded System 的人,Debian 真的是太方便了,可以毫不費力的開發多種平台,又可隨自己高興而輕鬆升級該平台上的各種套件,不再只能死板板停留在該平台的官方 BSP 和 Toolchian(有些 Toolchain 充滿了 Bugs,常讓人求生不得求死不能),完全跳出過去 Embedded System 軟體版本總是太老舊的框框。無論缺什麼東西,輕鬆的幾行 apt-cross 指令,就可以確保 corss-compile 的順利,甚至,新版的 GCC compiler 都任君選用。

開發 Embedded System,最常用到的就是 NFS,在最近的 Debian Sid 中,套件『 nfs-kernel-server 1.2.1-1 』有重大問題(Grave Bug),會讓 NFS 無法順利啟動:
$ /etc/init.d/nfs-kernel-server start Exporting directories for NFS kernel daemon.... Starting NFS kernel daemon: nfsd mountd failed!
目前已有人回報此 Bug 至官方(可參閱:http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=562910),在尚無解的情況下,可先 Downgrade 先恢復 NFS 的功能,畢竟工作可不能停:
$ wget http://ftp.tw.debian.org/debian/pool/main/n/nfs-utils/nfs-kernel-server_1.2.0-4.1_i386.deb $ dpkg -i nfs-kernel-server_1.2.0-4.1_i386.deb
該版本是從 Debian Testing 抓回來的舊版套件,在替換後 NFS 就可恢復正常運作。

2010 年的愛

一年時間又匆匆而過,09年對我來說是個很特別的一年,因為心境在這年有了莫大的轉變,有特別的際遇,有患難的真情,也有人生不可缺少的挫折。找到了能一同共事的同伴,遇見了值得我在百忙之中還能抽空想念的人,有夢想、有困境、也有快樂,這一年我不缺任何東西,起起伏伏更充實了自己。曾以為世界末日要來臨,曾以為能穩穩走入人生另一個殿堂,曾以為自己正遊戲人間,曾以為誤會永遠解釋不清,但直到最後,依然只覺得在做著不是屬於自己的夢,雖夢見成為一隻蝴蝶,卻也不過是模糊不清的片斷殘影。

雖然都在年年相同的慶祝活動中渡過跨年一刻,但 2010 年卻是不一樣的意義,它代表了另一個十年的開端,也代表了一段殘章的結束,當回想起千禧年前的事,彷彿其又加上了一層厚重的灰塵,更難以翻塵觸碰。所有看似新的記憶,也隨著09的句點而被包裹起來,隔了一道看不見的煙幕,有莫名的距離感。

我對2010年有什麼自我期許呢?或許更該說我對這未來的十年有何期望?或許,十年之後,我能抱著已完成的夢回頭看今天的我,又或許我抱著的是白白胖胖的小鬼回頭嘲笑今天的自己,也或許我可能不再有機會複習我的人生,悄悄帶走別人永遠取不走的財富。

今年,我不給自己過於明確的目標,隨心所遇而隨心所欲,期望找到 2010 年的愛。Find My Way Home! On My Way Home! 行十年路,回家。