2013年9月22日 星期日

重新開發的DBus Module for Node.js

Standard

Stem OS仍持續開發中,最近針對移植到Cubieboard的工作做了很多努力,為了改善穩定性和增加更多功能,我們重新開發了DBus的模組,讓然後直接跳個大版本號到v0.1。但目前仍處於最後測試階段,待穩定後會上傳至NPM,讓任何人都可以使用。有興趣嘗鮮的人,仍可去git repository,從development分支下載回來使用。

新的DBus模組為了縮小footprint,更適合嵌入式應用,避免引入GLib,為了提升效能,也不使用GContext來處理event loop ,而是完全採用純C/C++和libuv來實作。

此外,舊版的模組一直有個問題,就是大多數功能以同步(Sync)方式在執行,也有與非同步(Asynchronous)設計混搭的情況,導致Node.js程式執行上會不順暢,且有嚴重開發邏輯不一致的問題。有鑑於此,在新的實作中,API被重新設計過,全面採用非同步的設計邏輯。為了讓DBus的操作能更貼近JavaScript 的習慣,也模仿EventEmitter的on()和emit()方法去操作Signal。

除了效能和邏輯的改進之外,新的DBus模組支援了同時建立多個connection的能力。這意味著,開發者可以在同一個process上提供多個DBus的服務。利用這個新特色,我們得以減少StemOS系統上常註程式的數量。

最後,需要注意的是,大量的重新設計,讓新模組的API與舊版完全不相容,如你不打算改寫你的程式,就不該升級到v0.1版本。

後記

做了這麼多年OS的東西,各種用途的系統都有不少經驗,但現在仍然覺得到這是個費力又繁複的工作呀。

不過,努力累積成果,搭上Node.js的列車。最後能對人大聲說這是我們自己設計的JavaScript OS,其莫大的成就感將無可替代!

2013年9月8日 星期日

Hacker 精神,就是一種認真過活的精神

Standard
在這一年平淡的公務員生涯裡,想起了某人的一句話:『一年的經驗,重覆了 N 次。』,這幾年自己做過了一些案子,也與很多人交流,發現,這現象似乎真的在業界是很常發生的。在工作上,一件事或東西只要搞到不要出問題的程度就好,所以永遠也僅此於做完交差,解決完大多能預期的眼前問題,然後交差。所以,在這樣的生態中,無論對任何事,進一步的探討、研究和改進,都是種奢望,更不用想從東西的根本改善。

在這樣的情況下,我們仍然敢說我們有 N 年經驗嗎?

當然,就國內企業的現況和體質來說,想要活的好、拉高員工薪資都還是個問題。我們目前無法期望國內企業們能像 Google 等一些公司那樣,讓每個員工除了完成工作外,也可以有機會挑戰自我和做天馬行空的嘗試、研究,進而改進和發展出許多能開花結果的東西。

但是,撫心自問,就算工作上、公司不給我們這樣的機會,我們又是否願意自己投資去花這些看似沒立即意義的時間呢?

還記得,在某一次的朋友引見中,認識了年輕時曾在 NeXT(就是 Steve Job 創辦的那家電腦公司,其系統就是現代 Mac OS X 的前身)工作過的人,他大方跟我聊起了許多年輕時的故事。其中,最讓我有感覺的一個故事,就是早在 90 年代,Mach kernel 和 OS 就已經被移植到 X86 架構的 PC 上(註:X86 版的 Mac,是 2005 年之後才有的)。而更重要的是,在當時 Steve Job 完全不知道這件事,是 RD 私底下的熱血行徑。雖然不知是真是假,但我仍一直在思考著,這件事有可能在國內的企業中發生嗎?有多少人會在下班後,仍然花時間去投入這樣的工作?這對理解 Hacker 文化和精神的人,應該不會太過驚訝,但這對許多一般人來說可能永遠無法理解。

回頭看看,我比較幸運,還沒畢業就選擇了創業一路,別人沒辦法給我機會,我給了我自己機會。基本上在發展自己產品的過程中,就是在挑戰自我、不斷的創造、改變和嘗試,所以雖然在業界也打滾了幾年,至少還沒有停止過學習和研究的念頭,更不惜一切追求自己的目標,過程中對自己沒有交差了事,只有達到一個個里程碑。

更幸運的是,身為一個愛 Coding 的傢伙,在偶然的機會一腳踏入了 Open Source 的世界,這世界沒有苟且,隨時隨地都有人虎視耽耽把眼前的軟體做改進。你不自覺就感染了這樣的動力,狠狠的盯注各式各樣的軟體,在機會來臨時,就改得它面目全非。是啊,在這樣『不好就打掉重練』的過程中,確實滿足了我愛 Coding 也 Coding 自己的內心渴望,然後一直不斷精進自己的技術、能力和創意。試想,如果我跑去業界打一份普通的工,只是每天上班寫 Code、下班收工,我又有多少機會可以得到這些滿足呢?

在這社會中,我們都扮演著各種螺絲釘的角色,但與死物不同,不會一輩子只做同樣的事,人會成長、改變而且有感染力。只要能不斷精進自己,今年你是被用來掛牆上的畫,明天你可能會被用來固定保險箱的門,然後你家的保險箱,可能是全世界最堅固的也說不定。

我想,我雖然不敢說有 N 年經驗,但好在我還有 N 年的小宇宙可以燒。:-)

2013年9月1日 星期日

jsdx-disk 讓你使用 JavaScript 管理儲存裝置

Standard
Stem OS』是一個 JavaScript 作業系統,內建 Node.js 和許多 JavaScript 的系統 APIs。如果你有在筆者的開發動態,就會發現 Stem OS 是我們 Mandice 團隊目前的開發重點和產品,我們一直期望能讓懂 JavaScript 的人,都可以來開發系統程式、嵌入式系統,此外,也想運用 JavaScript 語言的流行度,讓嵌入式系統開發門檻降低,使其更為簡單、快速。如果你家中有看似沒用的舊電腦,在安裝 Stem OS 之後,便可以立即用 JavaScript 自行寫一些應用程式,賦予這舊電腦全新的用途。還記得,在今年的 OSDC 活動上,小弟上台給了一場 lightening Talk,即是探討如何將舊電腦改造成一個無紙化傳真機,而改造的時間只需要 5 分鐘,包括安裝 Stem OS 和寫幾行 JavaScript 程式。有興趣的人可以參閱當時的投影片『JSDC 2013 簡報釋出!NPK 與 JavaScript OS (Stem) 登場!』。

JavaScript 語言的好處就是用它寫的程式無需編譯,效能也不俗,這意味著,當你在開發 PC 平台之外的嵌入式裝置(如:ARM),你不必再忍受跨平台編譯(cross-compile)的痛苦,可以很快速開發你的應用。此外 Stem OS 已經將系統和硬體的支援都已經為你處理好,也提供許多低階的系統 APIs,且一開機就是跑你的專屬程式,你可以專心的打造自己的嵌入式應用,完全不用再煩腦和花大量時間在系統整合和移植的開發上。

既然 Stem OS 已經將許多系統功能包裝成 APIs,讓 JavaScript 可以透過這些介面從 UI 控制到硬體,代表我們實際上做了很多這方面的準備工作,本文將要提到的 jsdx-disk,便是其中之一。

jsdx-disk 顧名思義是一個控制硬碟的系統 APIs,你可以用他掛載(Mount)、切割磁區(Partition)和格式化(Format)硬碟。更進一步,你可以用他監控系統上的儲存裝置,以及取得這些儲存裝置的硬體資訊,更進一步處理熱插拔(Hotplug)的行為。在 Stem OS 中,我們以 JavaScript 寫了一支常註程式(Daemon),監控熱插拔隨身碟,自動掛載(Automount)的機制,而這功能就是運用了 jsdx-disk。

Git Repository:
https://github.com/cfsghost/jsdx-disk

使用 jsdx-disk 相當簡單,如果不在 Stem OS 上,你也可以透過 NPM 安裝使用:
npm install jsdx-disk

jsdx-disk 的使用方法相當簡單,如果你要掛載一個 Block device:
var Disk = require('jsdx-disk');

var disk = new Disk();

disk.init(function() {

        var obj = disk.getStorageObject('Block', 'sdb1');

        obj.mount(function(err, mountPath) {

                if (err) {
                        console.log(err);
                        process.exit();
                        return;
                }

                console.log('It was mounted on ' + mountPath);
                process.exit();
        });
});

如果你要監控儲存裝置的新增、移除等熱插拔機制:
var Disk = require('jsdx-disk');

var disk = new Disk();

disk.init(function() {

        disk.on('interfaces_added', function(data) {
                console.log('INTERFACE ADDED: ' + data.objectName);
                console.log(data);
        });

        disk.on('interfaces_removed', function(data) {
                console.log('INTERFACE REMOVED: ' + data.objectName);
                console.log(data);
        });

});

如同開頭所說,jsdx-disk 也有格式化硬碟的 API(注意!請小心執行下面程式,它會格式化 /dev/sdb1):
var Disk = require('jsdx-disk');

var disk = new Disk();

disk.init(function() {

        var obj = disk.getStorageObject('Block', 'sdb1');

        console.log('Formating ...');
        obj.format('ext4', function(err) {

                if (err) {
                        console.log(err);
                        process.exit();
                        return;
                }

                console.log('Done');
                process.exit();
        });
});

更多的功能,可以參考 jsdx-disk 原始程式碼裡的 tests 資料夾,有更多的參考用法。

後記

在台灣創業,開發軟體相較之下比較不易出頭,但我們仍堅持不放棄新創之路,做不一樣的事。我們的團隊雖小,但人人都揮灑著熱情!請支持我們吧!:-)