2011年10月20日 星期四

ArchLinux 自動更新系統時間的方法

死撐了許久的 ArchLinux 最終決定要重灌了,原因是不知道倒底缺了哪一些套件,導致抓不到 Android 手機,讓我無法使用它來開發 Android 程式。因為一開始我是使用「最小安裝」,很顯然套件並沒有相依得很好。

重灌後又遇到了另一個問題,我所使用的 PC 內電池是沒有電力的,而為了響應節能減碳每天都會切斷電源,導致每天開機時間總是會差很多。之前的作法是找出更新時間的指令,寫在「rc.local」在一開機的時候執行。

結果重灌前沒有備份,又得到網路上找指令的語法,沒想到發現另一個套件,叫作 openntpd ,一個啟動就能將系統時間和網路上的進行同步。所以趕快打篇文章記錄下來。

#pacman -S openntpd  <= 安裝套件
#/etc/rc.d/openntpd start  <= 啟動服務

既然這是一個服務,當然不會再傻傻的到 rc.local 加程式,直接修改 /etc/rc.conf 檔案,加在最後的 DEAMONS 清單裡就行了。

2011年10月19日 星期三

心有點累

最近有幾個案子同時在進行,壓力頗大,心情也容易煩燥。常常不自覺地加大說話的音量,語氣也沒有那麼和善。之前的我認為作為一個主管要有「泰山崩於前而面不改色的本事」,因為一但手下開始慌亂,什麼事情也作不好。但是這陣子又發現,偶而把不穩定的情緒表現出來,似乎也不全然是壞事。

當一個主管的表現總是「很淡定」,那麼反而會讓手下都覺得無所謂。有著「反正出了事情,時間來不及,主管總有辦法解決」的錯誤想法。

2011年10月18日 星期二

程式的境界 - 續

現在回頭來看,要先有「想作能維護、易懂的程式」的心理,再去學習物件導向或是設計原則會比較好。會很慶幸自己的前兩個學習的程式語言都分別是 QuickBASIC 和 C,都是滿典型的程序型語言,不能說這兩種程式不能很「物件導向」,但是至少在當時程式入門書都是把它當作程序語言教的。

在帶新人的時候,會很明顯的發現以徧程序的語言(PHP)開始學習速度會比較徧物件導向的 FLEX(ActionScript)來快一些,也比較容易掌握的要如何要電腦完成希望達到的工作。不過程序型的程式有個問題,就是容易「背公式」,看到新人只是把公式背出來,卻不知道為什麼要這麼作,環境一但改變就不懂得修正,就可以知道,這個人的程式水準已經被他自己限制住了。

為了寫出更好的程式,為了不在幾個星期之後,要花上大把的時間回頭看從前的程式,慢慢的我進到的核心程式,或是框架的開發。其實也沒有字面上描述的那麼偉大啦~就是將一些總是會用到的功能作成一個一個能夠被 copy 來 copy 去的工具,至少比較低層、關鍵的功能由自己掌握,而其它較未節的就交給新手處理。一來是不用花費大量時間等到新手基本功打好,二來是避免寫出未來讓我難及維護的程式。

雖然早在開始之前就已經開始接觸物件導的向的資訊,也使用過幾種號稱物件導向的程式語言,不過對於怎麼去規劃好的工具,可以讓其它人「不需要懂、只需要會用」,在當時足足困擾我許久,不過深思熟慮是有回報的,第一個核心函數組,足足撐了三年多,經過幾次功能擴充/調整。直到出現更加由效率的演算法,才在最近被全面改寫。

勇於嘗試不同的寫作模式,我認為是這個階段讓我收獲良多的學習方式。不過前提是在已經有一定程度的基本功,知道要把握什麼樣的分寸,不會一股腦的全面改寫,等到來不及的時候才發現不對。因為本身是維護程式的人,也是撰寫程式的人,所以自己造成的問題大都是由自己面對,在不斷和書上理論印證的過程之中,開始體會到設計理論的想法。

我認為,開始不需要死記理論,能夠了解明白理論產生的原因及目的,是第六的階段。也是目前我達到的階段。

在學習程式的過程之中,我滿喜歡這個以用應用為導向的知識,因為理論的發展都是為了要解決某些問題,不見得每個理論或是想法有個「專有的名字」,因為在實務的角度來看,想法了解了,懂得應用來解決實際的問題就完全足夠。理論的名字只是為了便於團隊合作的溝通,而不是去紀念某一個「偉大的人」。

我曾經去參加一個科系研究所的入學考試,其中一場四題的申論題目中,有一個問到「在 20 世紀一位有名的理論家發表了什麼理論」,詳細的題目內容我已經忘了,只記得它完全沒有提到這個理論家的名字(好像他重要得大家都得知道他似的)。當然,最後我只考慮的了不到一秒,就放棄了這代表1/4分數的題目(實際上也不得不放棄)。

當然,這個科系在我心中的評價也一下子掉到谷底。因為一個只知道背誦名人/名理論的名字或歷史的科系,不會有太多精力在思考如何使用理論來解決問題。考題代表著這個科系的取才方式,既然這個科系不重視應用,那很顯然和我的取向不合。落榜了其實也沒有什麼好難過的。

會扯到學校,主要是想回頭說說現在畢業生,許多都停在第一層無法突破。也就是其實對程式並沒有什麼興趣,只是聯考志願選到,就覺得「只能走入這行」,更有些是覺得「科技行業不錯」因此就在大學裡混了四年。很天真的以為,只要能夠從大學畢業,就有能夠作的事情,拿到不錯的薪水。

但是現實是,現在的我看不到大學在教「有用的東西」,這不只是課堂上教的內容部分已經過時,更加嚴重的問題是教給這群學生錯誤的觀念及態度。學生們總是在等範例,修修改改看起來功能出現了,就拿去交差了事,完全不管程式是否還有改進的地方。只要需要有了一些變化,是範例中沒有的,那就完全傻在那裡不知道要如何處理。

如果遇到沒有學過的技術,也沒有想要主動學習的欲望。就好像小學生一樣,抱怨考試題目出到沒教過的範圍,所以作不出來是理所當然。遇上幾次這種人就足夠讓我筯疲力盡,不單單要想訓練的流程,還得手把手一步一步帶個好幾次,最後卻只能讓他去作曾經帶過的工作。

這樣子的人,可能永遠無法往程式更高的境界走。可能一直滿足於自己又拼出了多少功能而已。除了對他們這輩子有限的成就感到可惜,也為自己的時間精力白白浪費在這種人身上感到悲哀…

2011年10月16日 星期日

程式的境界

每每提到這類的主題,總是會去酸一下現今的教育,也許應該精確一點的說︰「台灣的教育」。它讓現在身為小主官的我,老是找不到合適的新人能夠幫助到現在及未來的程式開發工作。找來的新人往往讓我花費數倍的力氣,但是卻得不到對等的回報,這裡的回報,指的是新人程式能力的成長。

不斷的修改表達方式及訓練內容,但是所傳遞出去的知識十有八九就像打在棉花上,沒有有反應。回頭思考自己學習程式的歷程,看著一路走來的每一個成長階段,我才發現原來,程式和很多領域的知識一樣,是有境界的。

2011年10月15日 星期六

判斷對象為「物件」

這個標題起得有些奇怪,依照大多數物件導向的理論中,Object 類別是所有的類別的「根」,也就是說,除了一些基本型態的變數(如︰int, float…等),所有類別都是 Object 的子類別。不過,偏偏就讓我遇到一個得判斷「純 Object」的狀況。

事情是這樣子的,我所負責的專案中間有一個編碼/解碼的功能,採用 JSON 格式的字串進行資料儲存。依照「測試驅動開發」的思維,得作一個測試程式,來判斷解碼後可以得到和原始資料完全相同的內容,因此放入假資料開始撰寫程式。

一開始我思考到,JSON 字串通常是用來存放值名對,或是陣列的資料。而身為制定 JSON 格式的自己,很清楚不會放入其它奇怪的資料型態,只要比對每一個鍵值和所包含的內容即可。因此我的第一版程式沒有花費太多時間就寫出來了。

後來由於要編碼的內容變得複雜,得放入數量不固定的多筆資料。因此 JSON 的內容,由原來的值名對 + 基本型態,又多加上了陣列 Array。由於 Array 也是一種物件,所以兩個陣列必須進入的迴圈對每一個元素進行比對,若是直接使用「A == B」則為因為 Array 存放在的記憶體位置不同,而總是得到 false 的結果。它讓我花了一些時間作思考,最後決定使用遞迴的方式進行,以免出現陣列之中間又出現陣列。

再過不久,我發覺資料變得更加複雜,必須得在陣列或是屬性中加入另外的 Object 類別,在 JSON 格式中是被允許的,不過對於我的測試、檢查程式來說,就是一場災難。其中最糟的一點是 Flash AcrionScript 語法中,基本型態也是 Object 的子類別。因此底下的判斷為真…
1 is Object