發表文章

目前顯示的是 五月, 2008的文章

讓我們輕鬆自在設計自己的 LXPanel Plugin

今年度『LXDE』發展蓬勃,陸續有新血加入,無論是國內外各個 Distribution 的 Package Maintainer 亦或是 Developer、翻譯者,都讓整個 Project Team 充滿熱血的氣氛。 除了已加入的成員外,其他持有興趣者也越來越多,開始有人提出『如何讀 LXDE 的 Source Code』、『該從哪對 LXDE 著手』等議題。充份顯示出目前 LXDE 缺少 Development Primer 和相關開發文件。

其實,只要你願意,你可以從最困難又複雜的『PCManFM』和『LXPanel』逐行讀起,這似乎是一種方法,但我並不建議用這種痛苦的方法參與 LXDE 的計劃。如果真的想讀一個完整的 Source Code,極為簡單的『LXSession-lite』是一個不錯的選擇。不過,就算完全讀通『LXSession-lite』 這類子專案,一般人還是無法在上面有所著力,因為這類子專案之所以簡單,是因為功能需求不複雜且沒有太多需要擴充的空間。不過,要是有人純粹想練功夫, Just do it!

那麼,如何開始在 LXDE 上開發程式呢?建議從 LXPanel Plugin 上起步最佳。就如同研究『Linux Kernel』 一般,入門的第一步通常都是『Writing Module』。你不用完全了解 LXPanel 的架構,只要遵守規範,就可以在上面開發你自己的 Plugin/Module,其撰寫就如同寫一般的 GTK+ 程式,非常容易。

撰寫 Plugin 的準備,是先下載 LXPanel 的 Source Code,然後在『src/plugins』之下建立一個新 Plugin 的目錄,在這次範例中我們建立一個『src/plugins/explugin』目錄,並將程式碼放在裡面。

這邊講一個簡單的 LXPanel Plugin 範例,其功能是載入並顯示一張 PNG 圖檔在 LXPanel 上。

這裡是原始程式碼〔src/plugins/explugin/explugin.c〕:#include <stdlib.h>
#include <glib/gi18n.h>

#include "panel.h"
#include "misc.h"
#include "plugin.h&quo…

輕輕鬆鬆玩 8x51 的 Serial Port 控制

圖片
使用 Serial Port 是一個很基礎且簡單的通訊方式,從中可以很容易了解到 RXD/TXD 的運作原理,而常見的網路卡、電話等等通訊都是建構在相同的原理之上。Serial Port 在電路上很單純,對兩個要互通的電路來說,就是『你的傳送 TXD 是我的接收 RXD 』,很簡單的觀念,只要跳線就可完成。

整個實作目標,是按下開始傳送按鈕後,將透過 Serial Port 傳送 2 Bytes 的資料到另一個外部裝置,當外部裝置傳送 2Bytes 的資料過來時,將此資料顯示在七段顯示器上。其中這 2 Bytes 分別為『個位數』和『十位數』,必需先加總成一個 8bits 的數值,再送到顯示器上。

其程式的設計流程大致如下:


詳細程式碼和註解:
ORG 00H ; 程式開始處
JMP BEGIN ; 跳到 BEGIN
ORG 03H ; 停止按鈕的外部中斷程式
JMP STOP ; 跳到 STOP
ORG 13H ; 開始按鈕的外部中斷程式
JMP START ; 跳到 START

BEGIN:
; 設定一組號碼 06,並拆成十位和個位兩數
MOV R0, #6 ; 設定第一個 Byte 記錄個位數
MOV R1, #0 ; 設定第二個 Byte 記錄十位數
MOV A, R0 ; R0 無法直接 mov 到 R2,故先暫存到 A
MOV R2, A ; 將 A 的值移到 R2
MOV A, R1 ; R1 無法直接 mov 到 R3,故先暫存到 A
MOV R3, A ; 將 A 的值移到 R3
CALL BOND ; 呼叫 BOND 去將兩個位數加總成一個數字到 A
CALL INIT_SERIAL ; 初始化 Serial Port 相關設定
MOV IP, #00000000B ; 低位觸發
MOV IE, #10000111B …

Linux Kernel 2.6.25 - ACPI 的電池狀態大變動

截至這篇文章為止,『Linux Kernel 』的 latest stable version 是 2.6.25-4,或許是因為 2.6.25 正式 release 才約短短一個月左右,多數人應該都還停留 2.6.24 以下的版本。原本用得好好的人,應該也不會去趕流行而換上最新的 kernel,畢竟人人都不願意當白老鼠呀。

今天,不怕死的將 EeePC 裡面 Debian 的 kernel 從 2.6.24-2 換成了 2.6.25-2 ,因為原本 Kernel 的 snd-hda-intel driver 一直無法正確驅動 EeePC 900 的聲音晶片〔EeePC 900 和 701 的晶片有出入〕,所以我換上最新版的 kernel 碰一碰運氣。不過運氣真是不錯, Linux kernel 2.6.25-2 讓 EeePC 900 不再是啞巴了,成功解決 EeePC 900 沒聲音的問題〔不然原本打算要跟 Asus 要 Source Code 了〕。

升級 kernel 後,一切看起來都很正常,唯獨 LXPanel 的電池狀態是壞掉的。追了一下 kernel source code 和 debien bugs 發現, /proc/acpi/battery 和 /proc/acpi/ac_adapter 已經在 2.6.25 被拿掉,統一轉移到 2.6.23 之後被加入的 /sys/class/power_supply。

這樣的大改動,意味著許多 userspace 的電池狀態偵測程式要做改寫才能在 Linux kernel 2.6.25 之後的系統上運作正常。還好,這問題並不大,至少支援 Hal 的電池狀態偵測程式可不用擔心,Hal 早在數個月前已處理好這問題,唯有少數幾個不愛 Hal 的程式會受到影響,如 LXPanel batt plugin 。:-(

後記

已著手在修正這問題,未來幾天在 LXDE 的 SVN 上,應該就會出現改好的 code。

你的『EeePC』今天 LXDE 了沒?

圖片
『EeePC』的確造成一股低價電腦熱,其 Easy Mode 更成為各家大廠爭相花大錢模仿的對像,這似乎成了一種莫明的噱頭,彷彿沒有 Easy Mode 就不叫做簡單好用一樣。暫且不論 Easy Mode 好不好用,我相信所有人的看法都不一樣,但就功能而言『LXDE Project』輸人不輸陣,當然也就會來實作一下 Easy Mode 的 Launcher。

這兩個月來,『LXDE』有許多方面的進步,從功能的完備性、穩定性、資源消耗到操控設定,都有穫得很大的改良,這也多虧了許多『朋友』和『廠商』的設備贊助,還有 Bug Reports。當然,開發者放棄『睡眠時間』更是促使這專案進步的關鍵。如今, LXPanel 已經可以支援 Multi-panel ,可以被設定成上下兩個 panel ,就算要模仿 Gnome 也不是問題;而系統時鐘也可以使用 Calender 日曆的功能;在 Panel 上的各個功能,也都可以直接在上面直接點選滑鼠右鍵設定。

LXPanel Plugin 方面,則增加了『鍵盤燈號顯示』,可在 Panel 上顯示『CAPS LOCK』等鍵盤鎖定燈號,尤其在『EeePC』這種沒有 LED 鍵盤燈號的機器上相當實用。在背景圖上,捨棄了原有的『bgBox』設計,直接畫在 Panel 底層,以增加效能和減少資源消耗,也因此修正了許多 GTK+ 無法令人掌控又惱人的 bug。 :D

這兩個月也新增了一些子項目,像是『lxsession-lite』,用來取代 lxsession。過去,我們密集測試了 lxsession 後,發現原先的 lxsession 有許多難解的問題,而且有許多 Code 是各個大型專案借過來的,其複雜度相當令人難以維護,於是就重新創造了 lxsession-lite。顧名思義,這是一個非常 lite 的 Session 控制程式,不過,雖然看似簡單,目前卻已支援監測 Process 狀態並自動重啟程式的功能。如果你沒使用到『記錄工作行程』的功能,或是根本不曉得這在做什麼的人,可以改用 lxsession-lite 以求更高的穩定性。

圖中所看到的 Launcher(Easy Mode),在先前已經提到過,這是為了提供低價電腦解決方案的實作,lxluncher 是以 FreeDesktop.org 的 Spec 當做標準,會讀取 Desktop …

從 Information Elements 解析無線網路的加密細節

圖片
無線網路的訊號是公開發送的,雖然無法攔截,但只要你有無線裝置,基本上都能『監聽』空氣中的無線網路封包。也因為無線通訊的本身是不安全的,就如同傳統網路可能被 ISP 或連線路徑中的 Route Node 所監聽一樣,所以無論是哪一種通訊,目前的解決方式都是採用封包或資料加密,以達成安全連線的目的。在一般網路通訊中,常聽到的方法有 Secure Sockets Layer(SSL) 這一類,而對於無線網路通訊來說,就有所謂的 WEP、WPA、WPA2 等等眾多規格。嚴格來說,SSL 和無線網路的加密並不算同一層面的實作,但是他們有相同的目的和類似的原理。

最早的無線加密非常單純,可以用 WEP 一種加密方式走遍天下,只要判斷出遠端無線基地台或存取點需要加密金鑰,我們就可以假設該加密是 WEP 。不過由於 WEP 並不安全,有心人經過封包收集後,還是能很快破出金鑰,所以,日後就出現了 WPA、WPA2 種種加密方法的進階補強版。

想要知道該無線訊號是哪一種加密方法,可以從無線裝置所提供的『Information Elements』去得知,從事件 IWEVGENIE 中,就可取得加密的細節 ,這部份可參考 iwlist 或 LXPanel netstat plugin 內部的實作。

Informations Elements(IEs) 的結構定義,分為兩種:

當加密方式是 WPA or Others,這也是最 IEs 原始的定義,結構如下:


當加密方式是 WPA2 時,則沒有 OUI 欄位,定義如下:

Type 欄位:0xdd: WPA or Others0x30: WPA2OUI 定義(3 Bytes):WPA: 0x00, 0x50, 0xf2WPA2: 0x00, 0x0f, 0xac
* 若有 OUI 欄位(4 Bytes),最後 1 Byte 為 0x01
Data 欄位:

* 所有數值皆採用 Little Endian

因為 WPA 和 WPA2 是後來擴充上去的定義,並不在原始的 IEs 標準裡,所以許多欄位可能依遵循的標準而有所增減,不過,除非是發射端過於老舊,理論上都應該會遵循後來 WPA/WPA2 擴充的標準。在程式實作解析WPA/WPA2 時,原則上只要是無法辨別的 Type,一律視為 TKIP 就可以向下相容了,可以…

從國外社群身上學到的事

圖片
近來不少人問我一些事,是關於前些日子所寫的『彼此需要的 Open Tech Summit Taiwan 2008』一文,其中強烈的言詞造成社群內許多衝擊和回應,從許多社群朋友的傳話中發現,有不少人連續看了『OSDC.tw 2008!』與該文,更是誤以為我在指著『某些人』叫罵。事實上,我不過在抒發心情罷了,簡單說出幫忙過程中所遭遇的狀況,並沒牽扯到這麼多利益、人事方面的糾葛,畢竟,這只是 Blog 上的心情筆記。更何況,我與眾社群的前輩們接觸並不深,也沒什麼可罵或值得罵的。當然,許多大家都在罵的我是都罵了,這也不用我一一枚舉了。

回顧這次『OTStw2008』(4/25~4/29)活動,或許不像前輩們辦的活動如此人山人海,門票那樣供不應求,但能感覺到每個參與者的熱情不遜於其他的活動。或許是因為這活動並不是從大規模的金錢和宣傳去著手,而是一個人一個人辛辛苦苦的邀請和接觸,其中可以發現到不敢真正踏入 Open Source Community 的那群有心人,其實一直在等待我們釋出善意。從許多完全不了解 Open Source/Open Hardware 的人來參加和擁抱,就能感受到這現象。更重要的是,他們並未成為活動的局外人,反而興趣高昂呀。 :)

Community 本來就不只限於技術交流,過程中的互動,也使得各種不同領域的朋友可以相互敞開心胸。有人對許多困苦的第三世界有理想和實踐,對不同國家人文有所著墨,當然技術方面的 Geeks 是少不了的,更多文化和職業差異的趣味也是令人收獲良多。如此技術性的活動,卻可以意外在不同層面有如此豐富的互動,真的是前所未見。原來,這群外國人一直嘗試告訴我的 Community 感覺,就是如此,實在特別!

對我來說,這次活動最有趣的議程就是『EeePC Hacker Show』,因為『LXDE Project』一定會出席和上台〔這議程是我排的嘛!當然 Hacker 優先!〕,也算幫 cwhuang 展示一下他之前說服『Asus』上司提供機器給社群的成果。在這議程中,『PCMAN』把『Xandros』系統殺的悉哩嘩啦,展現 LXDE 的效能和資源低消耗,在 EeePC 機器裡連開一堆 OpenOffice 、Firefox 以及 File Manager 後照樣流暢快速!其整體執行效能可能連某些 Laptop 都望塵莫及,更別說到 EeePC …