發表文章

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

Flat Project Demo - An OS for Tablets 平板作業系統

圖片
無奈,前些日子在 COSCUP 2011 因為 Lightening Talk 時電腦出現異常,展示以失敗告終,耿耿於懷。於是趁著這次中秋假期,將 Flat Project(詳細說明請見前文:Flat Project - 從山寨做起,親手打造炫麗的平板系統)開發至一半的測試影片準備好並上傳至 Youtube。但錄影效果不佳,還請包涵。


主要實作了 3D 視窗管理器(Window Manager+Compositor),如果不熟 X11 架構,也可將它視為 Android 上的 SurfaceFlinger,更多深入的技術細節也已經在 COSCUP 2011  Unconference 議程做了粗略說明。藉著這個成果,可輕易將各式應用程式(Firefox+Google Map+OpenGL Application)畫在我們的 3D 物件上,因此可以運用 3D 技術對應用程式做各類特效或翻轉,在本例中,仿 iPad 的『程式啟動/關閉』和『按兩下 Home 鍵』的效果就是這樣完成的。

此外在影片中可以看到,我們也實作了桌面程式選單和原生的 Google Map 應用程式。

後記

目前除了正在補上整個環境所需的元件外和完善架構外,完美結合和運行原生的 Android 應用程式也是長期的目標。期望以過去的成果(見舊文:Android is Working on X)為基礎,讓 Android JVM 可以被移植並整合進來,使 Flat Project 可以執行各式 Linux/Meego 應用程式外,也可以跑 Android App。

發瘋的 Qt QWS TTY Keyboard Driver

最近接了一個小案子,主要是協助客戶將 Qt 應用程式從舊板子移植到新的硬體上,由於硬體是 Third-party 做,當然所有的驅動程式也是由別人處理,我們並不經手,只和硬體廠商密切合作。

這次我們碰到了一些 Keyboard 問題,一開始是 Linux driver 缺少 input_sync() 的操作,導致 Qt 無法正確辯別按鍵的『壓放』。接著碰到個更棘手的問題,就是 Qt 送到應用程式的 Key 事件(Event)有很大機率會送錯。這將導致按鍵所觸發的結果,有很大的機會我們無法預期。檢查過 evdev event 和其發出來的 keycode,我們確定了 Linux Driver 是正確的,判斷應該是 Qt 的問題。

經過一番檢查後,發現是因為 Qt-Embedded 預設使用 TTY Driver(qkbdtty) 去驅動鍵盤,大部份情況下不太會有問題,但因為我們走的是標準的 Linux evdev (/dev/input/eventX),如果很快速或多重觸發鍵盤按鍵,就有可能讓 Qt 的 TTY Driver 取樣和解析出錯誤的 Event 值。最快的解決辦法就是捨棄 Qt TTY Driver,然後改用 Qt  LinuxInput Driver(qkbdlinuxinput)。

不過 qkbdlinuxinput 並不處理 VT,這是與 qkbdtty 最大的差異,此舉會造成板子上的 Console 不正常切換,Debug 用的 Console 會因此壞掉。筆者在此對 QWS Keyboard Driver 做了些修改,讓 tty driver 使用 linuxinput driver 的方式去解析 keyboard event,並保留 VT 的處理機制。

Patch 檔案連結如下:
http://fred-opensource.googlecode.com/git/patches/qkbdtty_qws.patch

開啟網路蟲洞穿越時空,活用 SSH Tunnel VPN

最近去了一趟上海考察,尋找創業發展的機會,但機會暫且不論,此行確實深深體會在中國的網路世界非常不一般。中國和諧的社會實在不容許影響善良風俗的事情存在,許多外來的邪惡,一一被偉大的長城擋在外面。不過,道高一尺魔高一丈,很多人很聰明,懂得翻牆方法,進出自如,多數人使用 Reverse SSH Tunnel(有興趣可參考筆者舊文『Reverse SSH Tunnel 反向打洞實錄』)建立一個臨時的 Proxy Server,讓網頁連線繞道而行。

不過,使用 Proxy Server 的方式只能讓特定的通訊協定能夠不受防火牆的阻擋,如果說要全面性的逃脫網路限制和監控,就要靠 VPN(Virtual Private Network)的方式。VPN 是什麼?簡而言之,就是與遠端的網路環境建立通道,使電腦彷彿真實身處於遠端的內部網路一般。所以 VPN 一旦建立成功,除了可以存取遠方的內部網路,當然亦可以將遠端網路當為中繼站再連到網際網路,換言之,就是可繞過防火牆的一切限制。至於 VPN 的建立方法有很多種, 但都不在本文範疇,這邊要說明的是如何用 SSH Tunnel 建立 VPN。

設定必要的環境變數後,直接執行以下的 Script,就可以和遠端 Server 建立 VPN 連線:
#!/bin/bash # Local Network NETWORK=192.168.16.0 GW=192.168.16.1 # Server IP Address SERVER=123.123.123.123 # Server 對外的 Interface SERVER_IF=eth0 echo "Creating Connection" ssh -w 0:0 -f $SERVER "ifconfig tun0 10.0.2.1 netmask 255.255.255.252 pointopoint 10.0.2.2 ; echo 1 > /proc/sys/net/ipv4/ip_forward ;/sbin/iptables -t nat -A POSTROUTING -o $SERVER_IF -j MASQUERADE ;route add -net $NETWORK gw 10.0.2.2 dev tun0" …