2011年11月17日 星期四

代班 MIS

話說一大早正在和同事討論技術上的問題,突然收到有網站掛掉的訊息。本來這件事情不會由我處理,偏偏公司裡苦命的 MIS 今天休假,理由又是帶家裡小朋友去看醫生,多麼正當的理由啊!所以我這個不入流的工程師,就得趕鴨子上架去處理問題。

當時倒是沒有想到會遇到一堆讓人鬱悶的事倩…

由於是網站不通,首先當然是由網頁主機的 HTTP 服務開始查起。發現服務仍然好端端的待在 80 port 上,再進一步去追查,發現一堆 httpd 的程式不知道什麼原因,保持活動卻不吃 CPU ,猜想可能是被某種原因卡住動不了,超過 daemon 上限所以後來的網頁要求無法被處理。

OK ,那就重啟 HTTP 服務吧!反正當下沒有人能上得了網站(已經掛了),就不用擔心有人被踢掉的問題。嗯,服務重啟…等待完成訊息…重啟完成,到網站上看一下,原來應該待在那裡的網頁出現了,滿是成就感的回報問題排除,準備打封信去向 MIS 臭屁一下。

誰知道,回報不到 30 秒,就回覆說網站又開不了了,這次是連不到資料庫。

2011年11月11日 星期五

設定滑鼠按鍵

話説大約快半年前,敗了一隻 Kensington 的軌跡球滑鼠,使用不久就發現手腕沒有之前那縻累,但是也感受到這家少數還在作軌跡球的公司,對於它的重視程度依然不高。除了在無法像前代可以指定雙鍵同時按下時表示特殊的意義(如︰中鍵、上一頁、下一頁…等),另外在 Windows 7 也常常出現應用程式重複啟動的狀況。總之…就是「生理上覺得不錯,但是心理上覺得滿糟糕的」。

在官方網站上面,它只有提供 Windows 和 Mac 的程式,並沒有 Linux 的版本。也就導致我一直認為它不能在 Linux 正常運作。一直到後來看關於 Linux XWindow 的書,裡頭説到在理論上可以支援無限數量按鍵的滑鼠。照這個説法來看,我的這支滑鼠應該可以跑在 Linux 上,而不用接在另一台常常會拿來拿去的 Notebook上(工作用桌機是 Linux,筆電是 Windows 7)。

一開始的嘗試並不順利,原因在於一直以來使用 Windows 的習慣告訴我︰「使用硬體一定要安裝對應的驅動程式」,因為像是 nvidia 的顯示卡,就需要安裝對應的 diver 才能發揮其較能。所以我在工作之餘,斷斷續續花了一個多月的時間在找「給 Kensington 的驅動程式」, 而結果當然是找不到。

就快要放棄的時候,翻到書上關於 XWindow 的設定檔 Xorg.conf,其中定義了關於滑鼠 Driver (又是驅動程式,但我就是找不到)和每個按鈕的定義…咦!定義?當下閃過的念頭就是「也許 Linux 已經抓到 Kensongton 了,只是我沒有去定義左右鍵之外的按鈕所代表的功能。

最後查到設定中有一個「ButtonMapping」的屬性,並且有個 xinput set-button-map 的指令,就是定義每一個滑鼠按鍵代表的意義。由於設定每個按鍵的作用,可以算是每個使用者的自由,因此我將設定的指令放在 ~/.xprofile 裡,加了一行…
xinput set-button-map "Kensington Kensington Slimblade Trackball" 1 8 3 4 5 6 7 2 9 10 11 12
這樣軌軌球的左上及右上的按鈕就會有作用。

其作法是利用 xinput 設定滑鼠的「button-map」,而「Kensington Kensinton Slimblade Trackball」是系統本身抓到的硬體名稱。後頭那一堆數字,就是代表每一個按鍵代表的意思。不同的數字代表的意思可以在這裡看到。

雖然是另外的滑鼠,不過重點放在第一行的 ID 和第三行的 Result。我的猜想是,當滑鼠按鍵(包含移動)會發出 ID 訊號,由電腦作出對應的行為。就像是鍵盤上每一個按鈕都有獨立的 ID 編號,這樣上電腦才能精確的辨別出今天使用者按到的右邊還是左邊的「Ctrl 鍵」。因此,只要這個對應表作好,就能夠正常運作。

Kensington 的 ID 送出排列方式,是…「左下 左上 右下 移動(下上左右) 右上,所以上例的設定表示…
左下 → 左鍵(1)
左上 → 回上一頁(8)
右下 → 右鍵(3)
移動 → (4, 5, 6, 7)
右上 → 中鍵(2)
至於後的 10, 11, 12 我就不清楚了,還沒查到是什麼意思。

到目前為止仍不清楚的是…為什麼沒有設定的時候沒有滾輪的部分,是因為是它模擬鍵盤的行為嗎?還有 Kensington 在上個版本的設定程式,支援兩個按鍵同時按,能夠模擬特別的效果,在 Linux 能不能也實現,就有待之後看看還沒有時間讓我去研究了…

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

2011年9月30日 星期五

少一行程式…

最近在看幾個剛入程式領域,還在新手老手間打轉同事的程式碼,讓我有一些感觸。現代程式真的很難「教」,學習的心態和態度都和從前自學程式的自己差別很大。

突然有些懷念早期命令列進到圖形介面的時代,自己就是在這個時期開始我的程式學習。當時自己能寫出來的程式,頂多就是改改書上的範例,試著把程式碼少寫一行,或是換一個更簡捷演算法。因為沒有書籍教導如何撰寫註解,所以也不斷修改變數、函數的命名方式,好讓幾個星期後的自己,還能看懂程式的功用。不知不覺之間,學到了程式寫作中兩個重要的態度,一個是「同樣的功能儘可能用更少的程式完成」,另一個則是「程式碼寫得有意義」。

很可惜的,最近看到的程式人員後輩,都沒有看到這種態度。也許和這個環境有關,也可能身為帶領者的我,需要負擔一部分的責任吧!

2011年9月28日 星期三

Flex Compiler 學習筆記 - 3

再次回顧一次編譯的語法…
mxmlc [要編譯的檔案]
如果帶有參數的話,最好在參數和檔案中間加上「--」分隔比較保險。
mxmlc [參數] -- [要編譯的檔案]

一些個人覺得重要的編譯參數…(因為我是一面看文件一面打的,所以應該會少掉一些還沒看到的參數)

2011年9月22日 星期四

物件導向開發感想…

這陣子給自己比較高的學習功課,由早上的 Java/JSP,公司上班時抽空看 FLEX mxmlc 的文件,到回家翻翻 Linux 的書,一開始覺得吃力,但是多少有些進步。但是最終打亂整個節驟的依然是工作上的事情。

因為人力不足,再加上我不放心別人去作最核心的規劃,所以就變成大方向和最前線工作都要同時面對,又再一次讓我感受到「心力交悴」。和以往不同,這次沒有什麼退路可以說休息一下,硬撑個一兩周的就讓我的腦袋有種「轉不過來」以及「常常空轉」的感覺。

當然直接導致本來開始變多的文章想法,又停了下來。

2011年9月14日 星期三

Flex compiler 學習筆記 - 2

# 設定檔 #
老是要輸入一堆設定值才能開始編譯,是一件很煩人的事情,因此可以將設定包覆在設定檔中,在編譯的時候載入。
Flex 預設的設定值存放在「[安裝目錄]/frameworks/flex-config.xml」裡,可以去修改它或是自己 copy 一份再進行調整。
在 Flash Builder 中,會將設定檔複製一份到「[安裝目錄]/sdks/[sdk 版本]/frameworks」下,因此如果要修改 Flash Builder 的設定,要到這個地方,光是修改 flex sdk 的預設值是沒有用的。

可以利用
mxmlc -dump-config [目標檔案名稱]
將目前的預設值 copy 出來存成複本,個人在使用這個指令的時候,會出現「錯誤: 必須指定目標檔案」的錯誤訊息,不過在「mxmlc -help」卻找不到這個指令的相關資訊,可能被隱藏起來了。
不過檔案倒是被建立出來,看到裡面的註解是中文的,又再次感受到 flex 開發團隊的用心。

2011年9月9日 星期五

Flex 學習筆記︰對介面撰碼

記得第一次看到程式設計模式的教學書中提到「對介面撰碼」這個概念時,花了我好長的時間才有些了解。

其中讓我疑惑的地方在於「為什麼要說對『介面』,而不是父類別」,在似懂非懂的狀況下,我自行對這個概念作修改,成為「對介面或父類別撰碼」。
雖然現在證明這個修改是不佳的,不過得和大家分享的是,這種思考「概念是否正確,為什麼要這麼說」的想法,幫助我在程式領域的學習成長很大。

實際上我的修改,如果是在 Java 程式語言,也許沒有太大的問題。由於教導物件導向與設計原則的書大多是以 java 作為示範的對象,而 Java 這個對於物件思考有著大幅規劃的語言,很顯然在規劃的時候就試著去避免一些物件導向可能的問題。(註)

所以一直到我要面對我工作使用的 Flex ,而非書上範例的 Java 時,我才了解為什麼只能對「介面」而不是「父類別」寫程式。

2011年9月8日 星期四

Arch Linux 筆記:使用網芳名稱(NetBIOS Name)

工作中常常需要的建立一個又一個服務,許多只用個兩三天,有些則是常常要搬家到更好(或更差)的主機上。雖然說在區域網路裡的 IP 用不完,但是 IP 總歸是不容易記住的東西,每次建立主機、服務就要替這台主機設定 IP ,並且時常要告訴自己︰「我現在將要測試某某服務,所以我應該去找…呃…好像是 XX IP 的那台主機」。

猜猜看的遊戲真的不怎麼有趣,尤其是當自己好不容易記住主機之間的對應,但是身邊的同事卻老是偷懶不記,一直問我。我又不是 Domain Name Server,提供主機 IP 查詢不是我應該提供的服?務!

說到 DNS ,其實大約半年前公司的 MIS 的架了一個讓我玩過,玩過之後的感想是︰「那個名字真是夭壽長…」,因為不能和網際網路上的 domain 重複(不然就變成屏蔽),所以得先定義一個網域,而每一個名稱後都得把網域名稱輸入進去。

記是記得住,但是設定有點複雜,而且打起來覺得很煩。之後因為這台 DNS 出了一些問題(不是被我玩壞的,是架構的問題),就被 MIS 收了起來。在收起來之前我和 MIS 找到一個不錯的方式,利用 Windows 網路芳鄰的機制。

2011年9月7日 星期三

Flex compiler 學習筆記 - 1

# 概要 #
以命名列編譯 ActionScript(*.as) 或 MXML (*.mxml)檔案,可以使用 mxmlc 和 compc
mxmlc 是用來編譯主程式的,也就是說編譯的結果可以直接由 flashplayer 或是用來打包成 AIR 程式。
而 compc (component compiler)則是用來編譯函數庫、版型、動態函數庫。
(函數庫是在編譯的時候作為資源引入,而動態函數庫則和版型一樣是在執行期動態被載入使用)

# 基礎語法 #
mxmlc [參數…] 目標檔案
其相關的參數列表可以使用指令
mxmlc -help [選項]
或是…
mxmlc -help 參數名稱 [選項]
進行查詢

讓人意外的是…查詢出來的結果中文化程度頗高,令人興奮。
至於提示是否足夠,就要練習和實作後才能評斷了。

Flex Compiler 學習筆記 - 0

緣起… 沒有筆記內容喔~~

由於我想導入測試驅動開發專案開發上,所以希望能夠讓 Flex 這個目前大量使用的技術也能夠納入,因此列出幾個需求…

  1. 每個可以撰寫測試程式的項目都要撰寫類別進行測試
  2. 測試類別需要能簡單執行,簡單到不是開發這個功能的人,也能在沒有文件的情形下執行測試
  3. 測試需要能夠達到由系統定時執行,在沒有人特別維護的狀況下,也能對既有及新加入的測試項目進行處理

為了達到第 3 點,我認為應該得找台沒有人在用的主機,插上電接上公司的區網就能夠放著給它跑。如果發現分析的結果是有問題,在上頭寫個通知的機制,寄封信給我,達到「No news is good news」的原則,讓我可以不用擔心手上的事情一多,就忙到忘記要對程式作檢查。至少有寫測試類別的部分,可以以每天一到數次的頻率持續作檢查。

在 Arch Linux 裝 FreeMind

不得不說 Arch Linux 除了沒有一個很美觀的 UI 介面讓挑選軟體,他的套件管理工具 pacman 及 yaourt 倒是滿方便的。套件多而且安裝也滿方便的,只是有些時候得費點心去找適合自己的版本。

為了討論需要,安裝了 FreeMind 之後,程式開啟卻看到一堆方框。原來是文字無法顯示,猜了許久也沒有找到可以修改字型的方式。而且 Java 似乎不理會我的 KDE 環境設定,使用和 X Window 一樣的字型。到網路上去爬一會兒文,發現一些奇怪的解法。說是把字型檔案 copy 到 /usr/lib/jre…的目錄下,通常在 Linux 會使用檔案 link 來節省硬碟空間,搞不懂為什麼它還是滿容易找到的作法,都沒看到誰去推翻它。

雖然作法很怪,但至少給我一個提示,FreeMind 是使用 Java 作出來的,而它的字型則是使用 Java 所預設的,也就是說只要能夠滿足 Java 設定中,將字型連結放到指定的位置,或是修改設定使其指向到我希望的字型,就可以解決 FreeMind 中文字都是以 方框 顯示的問題。


2011年8月30日 星期二

Arch Linux 工具︰pacman

在 RedHat 系列(CentOS、Fedora…)有 yum 作為套件管理工具,在 Debian 系列(Ubuntu)有 apt 和 aptitude 。
在 Arch Linux 中則是有 pacman 和 yaourt,這裡的要記錄的,是 Arch Linux 系統剛安裝完畢時,系統預設會包含的套件管理工具。

pacman 是由可拆成兩個部分「pac」和「man」,全名是 package manager utility ,也就是套件管理工具。

在我之前學習的 Linux 指令中,已經習慣的「命令 -[參數集合] [目標對象]」的模式,其中參數的順序是可以改變的,除非是特別要的有其它資訊,不得不擺在最後(像是 tar -xzvf [檔名] 其中的 f 為了要接檔名,所以需要放在最後)。而這個習慣在 pacman 上卻有所不同,因此才讓我想花些時間多了解它一點,以下對我常用到的方式作記錄…

2011年8月25日 星期四

你家的雞不會叫,干我什麼事?

話說我所待的公司是作網路服務的,因此不時會接到一些有關的客訴或問題要處理。

前陣子,接到某知名的網路公司打來的電話,詢問我們為什麼在帳戶退用服務之後,仍然繼續向用戶收錢?
聽到客服轉達這個訊息的時候,我呆了一下,隨之而來是一股「無言」的情緒。

事情是這個樣子的…

2011年8月19日 星期五

現在的年輕人啊~續

本來並沒有打算要寫這麼一篇,不過的這真的令我太驚訝了。

最近工作需要,開始研究 Java 及其 Serverlet 的部分,查找到資料的時候回到很久前曾經申請過帳號的論壇,在裡面逛逛看看,也手癢回應了幾篇文章。想說未來幾個月說不定得在上頭尋求幫助,先對這個論壇付出一些貢獻吧!

一如往常的,在新手專區中看到有小白在發作業文,看看時間,大概是被當掉暑修吧!看那些基本的問題,連改都沒有改的題目內容。給我的第一個想法是,他把其它人當作白痴,連題不都不改一下,直接連著放出5, 6篇文章。任誰都知道是怎麼一回事,所以到後來當然沒有人給出他要的答案,反而得到一些嚧聲。

2011年8月4日 星期四

讀取串流影像

把 Red5 主機架起來,也安裝了測試用的範例,但是測試視訊直播的結果發現畫質不夠理想,翻出原始碼修改後仍然沒有顯著的改善,猜想改使用較新的 AVM2 (註)播放會有比較結果。但是當準備開始實作前,卻發現忘了程式要怎麼寫,回想不起一兩年前的回憶,被迫只好自己去上網研究。研究後發現還滿簡單,在這裡作下記錄…

無論是廣播端(發出訊號)或是接收端(收到訊號)都需要先和 Red5 建立連線,皆需要 NetConnection 類別,再來就是需要串流 NetStream 類別。因此第一步就是建立連線…

2011年8月3日 星期三

Red5 Server 的安裝

RED5 Server 是一個以 Java 撰寫,可以取代的 Flash Media Server 部分功能的伺服平台,算是 Flash 影音串流,即時互動的另一個 Server 解決方案。對我而言它的優點當然是免費,可以很放心的取得,使用,再來就是因為它是一個使用 Java 寫出來的「軟體」,因此可以不限於在 Windows 或 Linux 下使用。但是缺點則是這個平台的開發速度不快,並且說明文件不多且有些是很舊、不能使用的版本,這應該是和開發人員不夠多有關係。

為了試驗串流技術,又再一次安裝起這個軟體,在此作一下記錄。

2011年7月19日 星期二

Android 字串分割和合併

最近搞一個監控狀態的小程式,利用 Android 呼叫特定的網頁,取得資訊呈現在手機上。人總是懶惰的,不想老是要慢慢地輸入主機 IP ,所以就想把它記錄在程式設定中,每次啟動程式先去抓預設值。

因為只是一個很簡單的程式,所以不想為了它去深入研究 SQLite ,所以後來同事選擇使用 SharedPreferences 來記錄程式設定,但是要被監控的主機不只一台,但是能記錄的資料卻沒有陣列可以使用,所以討論後決定使用字串切割的方式來儲存資料。

一開始測試還算順利,String 有提供 split 函數,可以把字串變成陣列。用來呈現主機的 IP 位置到一個事先準備好的 ListView 中。不過當程式離開、關閉的時候,要怎麼把字串拼回去,這就讓我們犯難了,因為 Array 並沒有提一個叫作 join 的函數,這是在 PHP 或 FLEX 已經習慣使用的東西。

現在的社會新鮮人啊~

因為工作上人力不足,所以得對外發出求職公告,面試了幾個人之後,發覺到許多來面試的人,腦袋空空,什麼都沒有準備就來了。讓問問題的我,常常會卡住一時不知道要接什麼話下去。

後來想了一個辦法,我先把認為重要的特質列出,設計出一份問卷寄給求職者。一來是讓應徵的人有時間慢慢在家的想,二來是讓他能夠知道我將要問些什麼。只不過,試行到現在,以上兩個目的的達成效果不怎理想。雖然還是達到讓我在面試之前就了解這個人的一些狀況,但態度的關係,能夠知道的依然有限。

我待的並不是一間大公司,所以不能要求要多頂尖來應徵。而且深深的了解到學歷不能代表什麼,更何況待的又不是有實力養很多高學歷米蟲充門面的公司。因此重視態度更甚於一開始的能力,能力不足還可以教、可以累積,但是態度差的話,就是很單純的找自己麻煩和白白浪費錢而已。

2011年6月24日 星期五

記錄自己刷手機 ROM

手上的 Vibo A688 是去年前入手的手機,也是我第一支 Android 手機,由於公司裡的 MIS 也有一台相同的機器,因此每次有新的 ROM,只要麻煩它就可以在幾個小時候,有新的系統可以用。不過前陣子他把手機賣了,準備入手更新的手機,因此就不好意思再繼續麻煩他,就自己試著刷機看看。

並不是因為要求最新,為改變而改變,而是因為原廠提供作業系統,總是有一些讓人受不了的缺點,有人作過比較,發現台灣官方放出來內建在手機的預設系統,通常都會附有一些電信商或合作廠的應用程式,那種幾百年都用不到一次的軟體,反而是拖慢手機速度,造成效率不彰、電池很容易就沒電的主要因素。也許部分的人會覺得很方便,可以不用自己再去找軟體,但是對我而言就不是這麼一會事。

我覺得「花錢買手機不是讓手機去作太多無關緊的事情」,所以得去研究如何把系統換成更乾淨、更快速的。

Moodle 學習筆記(零)

和學習其它程式語言及網站框架不同,到目前為止我還是對於學習 Moodle 有些排斥。它是我在大學時候就知道的一個教學平台,也是到寫這篇文章為止唯一為我所知,可以免費取得的教學網站平台,讓我比較不能理解的是,在台灣經過了這麼長的一段時間,學校及政府單位也進行了不少推廣。但是族群多侷限在如何使用 moodle 製作教材,但是卻很難找到有說明如何撰寫程式的地方。

實際上不單台灣,連官網上簡中的文件翻譯,也是作到一半就中斷。對於面前有那麼多前輩們的「屍體」,真的不對「學會到精通 Moodle」抱持著高度的信心。

但是由於論文開發的需要,因此仍然決定使用它進行研究。對自己的一個堅持,不想只作「應付的工作」,既然要開發一個網站平台,我就要對底基層的架構有一些了解。

Moodle 是一個滿嚴謹的框架,以建構式的想法來規劃整個流程,雖然我還沒領會它在建構的想法,不過倒是可以發現一些為了教育的想法在規則中。

2011年6月5日 星期日

Android 的排版學習 (二) - TableLayout

延續上一篇,把主要的區塊定義好。接下來就是一些功能按鈕,文字內容的置入。目標結長這個樣子…
因此將版型 XML 調成這個樣子…

2011年6月3日 星期五

Android 的排版學習 (一) - LinearLayout

學習 Android 的過程中,讓我覺得很挫折的一點,在於我怎麼也排不出讓我滿意的畫面。雖說寫程式的人大多重視功能,而不是畫面的美觀。但是作出來的程式連自己都不想多用一會兒,那就很明顯是失敗了。

翻了一些 Android 的中文書,發現裡頭提到有關版型的篇幅很少,少到讓人無法搞懂要怎麼排出一個「能看」的畫面。所以就「憤而」轉投官方文件(英文),才有前面幾篇 Android 的文章,在忙完論文提要口試文件之後,終於可以回頭繼續研究。

2011年5月6日 星期五

服務沒有回應的可能原因…

當自己運氣不好的時候,我常能夠準確的發現。像是平常都不會打錯的字會不斷打錯,正在忙著處理棘手的問題時,另一個更麻煩的問題讓你不得不暫時放下手上的問題去處理。一片混亂會讓人心情浮燥。

下午正在處理臨時接到的網站修改工作,正作到一半,旁邊處理帳號匯入的同事說大量匯入的程式不動了,沒有任何回應。身為負責整個程式工作的我,只得放下改了一半還有問題的網站,加入檢查問題的行列。

2011年5月5日 星期四

git 學習(二) tortoiseGit 設定和中文遇到的問題

混亂的日子,還得得作點筆記下點東西…

當初同事對我說,他用的 GNOME 和 KDE 桌面工具,都沒有一個很好支援 subversion 軟體,不曉得是因為他不熟悉版本管理的思考原則,還是真有其它的問題(subversion 是 linux 上的版本管理工具,照道理來說應該不會很難用才是)。總之那開啟我研究 git 之路。

在 windows 裡我是用 tortoiseSvn 和 Eclipse 的 Subclipse 外掛來進行資料管理,所以在試著改成 git 的時候,選擇了 tortoiseGit 作為 Client,不過一開始就遇到問題。原來我的那個同事,一開始就使用 gitosis 這套外掛在 git 上,可以進行權限管理的套件。讓我怎麼也無法順利抓回測試的資料庫,研究 gitosis 未果,才先回到更根本的 git 開始,在查找另一個問題,誤打誤撞找到 tortoiseGit 的設定方式。

2011年4月27日 星期三

git 學習(一) 和 CVS 和 Subversion 的差異

從上個星期開始看 git 的文件,斷斷續續到今天才慢慢有一些心得,在這裡記錄一下。先推薦http://progit.chunzi.me/zh 這個網站,不得不說,人多的地方有空翻譯的人也多一些。雖然有些翻得奇怪的地方,不過不影響對 git 的了解。

作為一個版本管理系統, git 和一脈相承的 CVS 和 Subversion 不同,可能和時空背景不同有關係,硬碟空間的價錢變便宜。CVS 和 Subversion 使用的是節省空間的「記錄改變」,因而適合對可以比較的純文字,對於二進位的資料(如:圖檔)就無法處理。雖然省了硬碟空間,但是一旦版本多起來,計算最新版本所需要的時間也越長。因此  git 的出現,其中一個原因就是要解決這個問題。

2011年4月20日 星期三

學習的歷程

最近公司內引入 MVC 的開發方式,由於我有其它工作要進行,所以就把這個平常我處理的工作交給另一個同事。以往而言,都是先由一個人負責了解技術,再教給其它人,讓總共花費的時間的變得少一些。

在後來幾次討論中,讓我覺得意外的是,由同事口中的 MVC 架構和具有類似想法的物件導向設計模式(實際上一些角度來看,MVC 就是設計模式的一種實現),居然有不小的差異,聽到「物件導向」和 MVC 架構是相互衝突的結論,一時之間不知道應該如何回應,就順其發展吧!

2011年4月19日 星期二

phpcassa 初探

使用 NoSQL 的主要目的在於大量存取資料和負截平衡,查了 SimpleCassie 的官方網站,發現連線到 Cassandra 叢集的功能,還在待處理的列表之中。所以只好回頭去找一開始嘗試 Cassandra 時,看到的第一個 PHP 模組 phpcassa。

可能是 Cassandra 0.7.3 有 bug 或是其它的原因,總之第一次嘗試 phpcassa 的經驗是很讓人挫折的,這次不同的是,最基本我能夠肯定 Cassandra 和 phpcassa 也會用到的 Thrift 模組都是可運作的。這樣我就可以把重點放在 phpcassa 本身的語法或設定上。

2011年4月15日 星期五

初探 Cassandra

手邊工作告一段落,又回過頭來學習 Cassandra。

研究的主題是用來作為 Client 的 PHP 服務,一開始使用一個叫作「phpcassa」的東東,但是怎麼就是無法使用。後來發覺似乎是 Cassandra 服務本身有問題,所以只好暫時作罷。這次則是用官網最近才列出來另一個叫「SimpleCassie」的東東。

同事已經幫我把 Cassandra 服務架好,也編譯完 PHP 和 Cassandra 溝通所使用的「Thrift」模組。Thrift 是一個同樣由 Apache 協會提供,作為服務之間溝通的模式。Cassandra 提供設定讓人修改成 PHP 或是其它語言的版本。而無論是 phpcassa 和 SimpleCassie 都是建置在 Thrift 之上,兩者在程式層級上只是函數庫而已。

一開始把範例貼到測試站後,卻怎麼都不能執行,還出現服務版本過舊的問題。猜想可能是範例程式碼中用的 keyspace, column family 是不存在,導致出現其它錯誤,產生不相干的錯誤訊息。因此就把程式碼刪掉,一行一行加回去。這才確定我的猜想可能是正確。

SimpleCassie 並沒有提供什麼完善的說明文件,只有一個告訴人如何存取資料程式碼範例,看遍 100 多行的程式,就是沒有找到 keyspace 或是 column family 列表相關函數,這總不能叫我自己去猜一個剛架好的 Cassandra 由面有些什麼東西吧!

只好回頭去查 Cassandra 的管方文件,利用 Cassandra 套件所提供的工具 cassandra-cli ,連到同一台主機的 Cassandra 服務,照著 help 的說明,再參考官方文件對於資料結構的說明,倒是成功的作出一個 keyspace 和 column family 。

回到  PHP 之後就順利許多,加入、修改,以及讀出資料的功能都一一被試出來。和資料庫不同的是,讀出來的資料是一個 Object 而不是如關連資料庫直接取得裡面值,看來需要一些時間習慣。

測試中發現一個滿奇怪的現象,在命令列使用 cassandra-cli 所編輯過的資料,以 PHP 的 SimpleCassie 是無法修改、刪除,而被 cassandra-cli 刪除的資料,也無法由 SimpleCassie 使用同一個 key 值新增回來。但是兩者在現階段都沒有使用帳號登入,表示權限理論上應該一樣才是。這點就變成權限問題,有待之後把帳號、權限建立起來後才研究的部分。

2011年4月7日 星期四

Android 的程式基礎(四) - Manifest File

感覺上,Manifest 檔案有點像是 Java Servlet 的設定檔案,都是用來告訴系統自己的存在以及有哪些功能,應該被如何呼叫、啟動裡面的函數。

在 Android 的四種元素中,Activity、Service、Content Provider都是需要被定義在這個用 XML 格式寫成的設定檔中,否則系統是不承認的,結果就是無法被呼叫、執行。唯一的例外是 Broadcast receiver,它可以在程式執行途中被建立、註冊到系統上,使用一個叫作 registerReceiver() 的方法。

也就是說,必須在 Manifest 定義,否則無法使用 Intent 啟動 Activity 和 Service。

除了定義 Activity 之外,Manifest 也定義這個應用程式需要的系統的配置,像是程式需要有相機鏡頭或是藍牙連線功能,或是最低的 API Level 也就是這個程式最低需要的 Android 第幾版,如︰2.2 版之後機器。每一個釋出的版本,都有對應的一個 API Level 編號,像是 2.2 對應到 API Level 8。

由此看得出, Android 是設計向下相容的。不過支援度如何,就有待之後的驗證了。像是最新蜂巢3.x 能不能完整支援  2.x 版的程式,個人抱著懷疑的態度。

Manifest所定義的資料, Android 系統只把它作為一個「額外的資訊」,只有 Market 才會讀取它,讓搜尋的過程中不會出現不符使用者裝置的應用軟體被裝入。所以,如果直接拿 apk 安裝的話,應該就不會作阻擋的動作。

Manifest 的另一個功能,則是定義 Intent filter(意圖過濾?),也就是之前文章中提到的問題。藉由定義的字串(如︰send 表示發出郵件)表示功能需求,讓自己的應用程式也可以去「處理」這件事情。當 Android 發現有兩個以上程式可以處理,就會出現選單讓使用者進行選擇。一個常見的例子為︰當使用者安裝其它瀏覽器後,當使用者發出「瀏覽網頁」的意圖(Intent)時,系統就會列出既有的和新裝入的瀏覽器讓使用者選擇。

2011年4月6日 星期三

Android 的程式基礎(三)-Intent

在中文裡被翻譯成「意圖」,雖然覺得很彆扭,但是也想不到什麼更好的詞。

Android 程式組成四種元素(Activity、Service、Content Provider、Broadcast receiver)中,除了Content Provider 之外,其它三種都是經由 Intent 所啟動的。以這個規則來猜測,應用程式選單也是一個 Android 程式,列出大部分(不敢說是全部)可以被 Intent 啟動的程式,再代替使用者建立並發出 Intent。

因為不同的元素是繼承於各自的基底類別,所以啟動的方式也不一樣。像是 Activity 使用 Intent.startActivity() 啟動其它程式,或者呼叫 Intent.startActivityForResult() 啟動並等待被啟動的程式回傳訊息(例︰要求相機程式拍完相片,把相片資訊傳回來)。而 Service 除了可以經有 Intent 啟動(startService) 也可以和運作中的 Service 連結(bindService)。

至於 Broadcast receiver 到目前為止還沒能搞清楚它的運作方式,等到基礎文件看完後再去研究好了。

Intent 可以視為一種「要求訊息」,除了用來告訴 Android 系統啟動某程式/服務外,也可以帶有訊息,利用 URI 的方式,像是呼叫手機的播號程式會帶有要播打的號碼,發信程式會帶有目標 Email Address。除了這類訊息之外,在其它書上的例子中還看到可以把要傳遞的資料「打包」一併傳過去,這樣才能傳遞多個或是非文字(二進位)的資料。打包也是等到之後研究到再作筆記。

另外還不了解的,則是 Intent 要如何去綁定,最基本以套件加類別名稱的作法在其它書本上已經看到過。不過怎麼作出像「開啟瀏覽器」這樣可以讓系統彈出選單,詢問要使用哪一種瀏覽器的結果。就不知道了,只能猜出應該是同一個 Intent 訊息中,綁上二個以上的程式,系統無法決定要啟動哪一個的時候就跳出視窗詢問。

不知道像是瀏覽器這類的 Intent 訊息是系統已經定義好的那幾種,還是可以自訂新的種類。等到深入研究的時候應該就會知道了吧!

2011年4月1日 星期五

Android 的程式基礎(二) - 基本元件

和 Java 的 servlet 想法類似,程式不具有 main() 函數作為入口,而是繼承特有的類別,利用物件導向的多型原則,由另外的啟動器來把程式執行起來。HttpServlet 就是 Java Servlet 所可以繼承的其中一個類別,繼承這個類別的,都可以視為一個 servlet 程式。

同樣的,繼承 Android 所認可的類別,就可以被 Android 視為合格的程式,並在特定的時間被呼叫、啟動。而 Android 所認可的類別有 4 種︰
1. Activities︰在中文被翻成很奇怪的「機動程式」,主要用在於一般提供使用者操作介面的程式,繼承 Activity 類別

2. Services︰能在背景執行的程式,不受程式切換而停止。像是音樂播放功能需要放在 Services 類型的程式,這樣才能一面作其它事情,一面聽音樂。繼承 Service 類別

3. Content providers︰提供內容,在物件導向裡,會把資料存取的功能,獨立型成一組類別,讓其它程式只需要知道向它要求或是存入資料,不需要理會背後的實作方式。Content provider 可以和許多不同的媒體溝通,像是 SQLite,網路甚至是其它提供存取權限的程式。繼承 ContentProvider 類別

4. Broadcast receivers︰用來接受事件的類別,例如想要寫一個整理簡訊的應用程式,而捕捉收到簡訊事件就需要靠這種類別。可能和的 Service 合用,讓接受事件的行為在背景運作。繼承 BroadcastReceiver 類別

延續上一篇的內容,由於每一支 Android 程式都是在一個執行緒中(也許應該叫線程 process),所以不單單是沒有 main() 函數,程式之間也不能進行直接呼叫,也因此 Android 提供一個叫作「Intent(意圖)」這個我同樣覺得翻得滿怪的東西,利用告訴系統「想要開某某程式的『想法』」,系統確認有權限後就會代為處理開啟。

就其它書上的說法,意圖不單單只有開啟程式的作用而已,還包含其它的功能。不過目前功能還不到,就留到之後的文章描述吧!

2011年3月31日 星期四

PHP Integer 的最大值

剛剛查了官方文件,實際測試過,PHP 在 32 位元的版本,最大值為「2147483647」,而到了 64 位元的版本,則變成「9223372036854775807」,差距還滿大的。

也許乍看之下沒有什麼特別的,但是只要是使用時間戳記(timestamp)的人都知道,整數是最常用來記錄這個資料的方法,但是「2147483647」這個數字代表的是 2038 年 1 月19 日,使用它難保不會遇到下一個類似百年蟲的東西。

現在好啦!官方文件提到只要使用 64 位元版本的 PHP ,整數就如同 MySQL 的 BIGINT 型態一樣的「9223372036854775807」。不單單是時間戳記,許多使用流水號的使用也可以用它,不需要使用浮點數或是字串處理,節省系統處理需要花費的效能。

升級 PHP 從 32 位元到 64 位元,總比要一行一行改寫程式好得多。看來只要把資料庫的欄位由 INT 改成 BIGINT ,其它的不敢說,至少在我有生之年,時間戳記都能夠順利正常的運作。

2011年3月27日 星期日

Android 的程式基礎(一)

看了部分官網的說明,在這裡寫寫筆記,複習、也加深自己的印象。 使用者清單


Android 是一個以 Linux Kernel 2.6 為基底的作業系統,由 Kernel 、函數庫、 Runtime、 框架以及應用程式所組成。一般軟體程式的寫作人員所開發的,就是應用程式層。了解其底下各層所負責的項目和協作方式,對於程式的了解有很大的幫助(個人一直這麼認為)。

由於是以 Linux Kernel 所發展,所以許多函數庫是以 C 或 C++ 寫成。不過中間經過框架和Runtime,實際上撰寫應用程式時,是以 Java 程式進行。由其它地方看到的訊息,那是一個由 Java 分支於 Apache 的專案衍生出來的,不過由於授權模式並不是很清楚,就演變成之前買下 Sun 的甲骨文公司告 Google 侵權的狀況。

除了部分 Java 核心的類別之外, Android 也加入了許多自己的函數庫,總體而言帶有很重的 Java 風格。但一些差異點,仍然會讓考過 SCJP 的我,搞不清楚狀況。又從頭開始看起 Google 的官方文章。

和 Java 程式中會有 main 啟始函數不同,在 Android 的應用程式都不算是「獨立」的程式,而是作為被另一支程式所呼叫,所以 Android 應用程式,實際都是繼承於 Activity 類別而來,我個人覺得把它翻譯為「活動」類別比較貼切,而不是其它中文書中叫它「機動程式」,一整個很彆扭,讓我一開始一直陷入「它到底哪裡『激動』了」的問題。

Java 程式語言是一個多執行緒的語言,在 Android 也承習了這個概念,當一支程式將被啟動, Android 就建立一個新的執行緒,並且啟動對應的程式。這個時候繼承於 Activity 的效果就出現了,啟動器只知道啟動了一個 Activity 類別,並不在意實際被執行的是哪一個子類別,只要利用父類別(Activity)提供的方法,就可以控制程式的啟動、暫停、終止…等。一個程式設計原則「對父類別撰寫程式」被應用的實例。

在 Android 平台中所不同的地方,在於程式並不單只是不同執行緒,而且在運作的過程中,也配給不同的 User ID,這是利用 Linux 作業系統多用戶的特性。利用 Linux 檔案權限的控管,加上不同應用程式帶有不同 User ID,就可以保護不同的程式彼此之間不會互相干擾,修改到其它程式的檔案,也能夠保護重要的系統資源不被破壞。

在某個特殊的狀況下(還沒看到是什麼狀況),兩支帶有相同驗證資料的應用程式,可以帶有相同的 User ID,待在同一個執行緒中,享受到資源共享的方便。不然就得依照 Android 的規則,開出能夠被其它程式存取的介面,來分享或傳遞資訊。

另外,像是藍牙、Wifi、GPS、SD記憶卡以及通訊錄、電話…等,也是可以被應用程式存取。不過必需要在安裝的時候,提供使用者,取得同意後才能夠進行存取。

2011年3月17日 星期四

cURL 模組

較傳統的網站間驗證帳號方式,是利用表單將帳號密碼傳到對方的網站,當驗證成功則回到原來網站。如果失敗,則停在對方的網頁,或是導向錯誤訊息頁面。利用瀏覽器轉向(redirect)的方式,甚至可以讓使用者沒有發覺自己曾經連到其它網站。

最近製作的專案,就是為了串接這種模式的帳號驗證,不過這次使用的平台是 AIR 應用程式,無法使用瀏覽器的轉向功能。所以只用其它方式,在 server 端把原來表單資料傳遞的行為重現出來。

和同事討論過可能的作法,他建議使用 PHP 的 cURL 模組。它是用來可以作為要發出 HTTP 要求的工具,和其它人可能會想到的 fopen 方法不同之處,它可以帶著 POST 以及 COOKIE 設定資料,這是 fopen 所作不到的(它頂多只能傳遞 GET 數值)。另外,它也能接收由對方傳回來的 http header,也就是可以收到對方傳來的 COOKIE 設定。

講了那麼多 COOKIE ,是因為我這次需要模擬的,就是利用在瀏覽器中記錄 COOKIE 的方式達到驗證的行為,有 COOKIE 資料,才能合法的取得使用者相關資料。

在介紹程式碼之前,要先說明的是 cURL 並不是大部分 PHP 預設啟用的模組,所以使用前要先檢查已經安裝及啟用。可以由 phpinfo() 輸出的結果得知。

網路上有不少資料可以參考,這裡只拿我所使用的程式片斷為例子說明︰
// 和 fopen 類似,首先要先建立連線,以傳回來的資料作為後續操作之用
$ch = curl_init();

// 使用 curl_setopt 來設定連線參數
curl_setopt($ch, CURLOPT_URL, '連線目標網址');  // 設定連線目標
curl_setopt($ch, CURLOPT_POST, TRUE);              // 使用 POST 傳遞資料
curl_setopt($ch, CURLOPT_POSTFIELDS, 'username=name&passwd=pass'); // POST 資料
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); // 當設定為 true 表示要接到網頁內容
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie 存放檔案位置'); // 設定儲存 cookie 資訊

// 發出要求
$result = curl_exec($ch);
// 由於在 CURLOPT_RETURNTRANSFER 設定為 TRUE ,所以我會收到網頁內容,否則只會依要求成功與否傳回  TRUE/FALSE 資料

// 用完的東西關閉是好習慣 ^ ^
curl_close($ch);

關於 cookie 的部分,花了滿多時間在找資料,沒有看到任何不經過檔案直接取得變數的管道,所以最後還是只能乖乖的把檔案打開,裡面的格式是用 Netscape 格式來儲存,前面幾行註解,在一個空行之後,以 "\t" 的方式,一個變數一行來宣告。相信對字串處理熟悉的人,把 cookie 值抓出來不是困難的事。

至於怎麼送出  cookie 資料呢?可以在設定參數的時候加上︰
curl_setopt($ch, CURLOPT_COOKIE, 'key=value');
來作設定,不過我還不了解的是,這樣要怎麼設定 cookie 所屬的網域(domain)勒?
不過實際測試,收到要求的網站好像依然讀得到,很順利的讀出來。

另外一種方式,則是可以用之前提到的 cookie 檔案來傳,只要使用︰
curl_setopt($ch, CURLOPT_COOKIEFILE, '檔案路徑');
感覺起來,這算是比較保險的作法。

至於 curl 裡面還有另個 multi 系列的函數,似乎是一次可以對不同對象網址發出要求,不過因為已經超過我這個專案的需求了,時間因素就沒有再研究下去了。

2011年3月16日 星期三

Cassandra 筆記-環境需求

Cassandra 是一個以 Java 撰寫的服務,所以理論上只要有 Java Runtime 的環境就可以運作。在 Linux 上進行測試的結果,發現以往某些 Java 程式不支援的 OpenJDK 也支援。

安裝的方式,只有下載和解壓縮。在 Linux 的環境下,只要執行 cassandra 檔案就能啟動服務,而官網是建議一開始使用「cassandra -f」的方式在前景執行,可以看到服務所輸出的訊息,也可以直接使用「Ctrl + C」的方式結束服務。

據公司 MIS 的同事評價,Java Runtime 的記憶體管理不好,常會吃掉很多記憶體並且放不掉,導致程式執行一段時間可能需要重開程式或是重開機才能找回這些記憶體。同樣的他也懷疑 Cassandra 也是如此。估且不論是不是因為 MIS 同事不夠熟悉 Java Runtime 不清楚記憶體使用的設定,至少可以知道的一點是,在沒有特別調整的情形下,Java 服務是很吃記憶體的。

經過測試推測, Cassandra 一啟動要佔用約 256 MB 的記憶體,這是花了半天的時候,不斷嘗試才發現到為什麼架設的測試機(128MB)服務老是死掉。因為目前還搞不定把資料塞進去的技術,所以沒有測試當有許多的資料時,所需要用到的記憶體。

總之沒有 256 MB 以上,就暫時先打消架設的念頭吧!

至於設定的部分,0.7.x 版似乎只有官方有放文件出來,得花時間 K 英文,等到試出心得再寫筆記上來。

2011年3月14日 星期一

Cassandra 吉與凶?

Cassandra 在字典裡查到的意思是「卡珊多拉(人名)」,特洛伊女預言家,也被解釋為凶事預言家。我的英文不好,查到的中文資料並不多,只能大概的知道這個人是何方神聖。

特洛伊,就是那個木馬屠城的那座城。其中一種說法,在神話裡面, Cassandra 是個美人,被太陽神阿波羅所喜歡,阿波羅送給 Cassandra 「預言能力」作為禮物,後來不知道是什麼原因兩個人吹了,不爽的阿波羅沒有收回 Cassandra 的能力,但是讓所有人都不相信 Cassandra 的預言,所以 Cassandra 只能目睹特洛伊被大火焚城,因為沒有人相信她所看到(一說是聽到)的預言。因此 Cassandra 又被引申為悲劇或凶事預言家。

在資訊界這則是一個很紅的資料庫平台,由 facebook 開發,後來釋出給 Apache 團體的一個免費 NoSQL 平台,用來處理傳統關聯式資料庫不容易應付的龐大資料。它的圖示是一隻發亮的眼睛,不曉得和 Cassandra 在神話裡的預言能力是否一樣,表示著未來資料庫的主流應用。

網路上大多能找到的資料是 0.6.x 版的資料,不過最新的版本已經到 0.7.3 了,聽說原來 twitter 想使用 Cassandra 取代原來部分系統,後來又不知什麼原因放棄了,算算時間可能就是在 0.6.x 版本左右,所以讓人心生懷疑不敢再用 0.6.x 的版本。

不過紅歸紅,但是資料依然很缺乏,官方文件關於安裝也只有短短幾句話,讓我的測試研究陷入很大的困境。不知道 Cassandra 這次預言是未來它的成功,還是我不斷陷入研究的困境。

2011年2月20日 星期日

工作價值觀

小時候父母說,希望自己未來找一份穩定的工作,最好能夠坐在辦公室裡,可以吹冷機,不用在外頭風吹日曬。要好好讀書,將來才能有一份好的工作。在說這些話的同時,大學是很難進的,凡是由大學畢業的人,大多可以找到一份不錯的工作。

長大了一些,學校的老師們會說,人不要好高惡遠,不要想著要進大公司裡,進入職場不用想著一步就作自己理想的工作,在不同的地方累積經驗,存夠自己的本錢後,就可以一步步轉換到自己想要的工作。當時的年代,許多大公司求才的標準,需要有一定的工作經驗(時數)才能應徵。

這些話既使到了現在,都無法說它有什麼不對的。只不過當自己擔任一家小公司的主管後,深深被這種想法所苦。來應徵的,只想著拿薪水,不思如何讓自己的工作成果更好,反正上頭要求的工作完成,就應該得到「應有的報酬」。

來這裡的部分人,只是來的賺工作時數,時間一到,就揮揮手,帶著我付出許多時間的訓練成果離開。我才發覺我白忙了一場,為人作傢。雖然發覺他並沒有學到什麼,沒有被「偷」走太多東西,不過花費的時間和精力,很顯然是回不來了。

公司小,不用指望請進有經驗的人。帶著新手一步一步來,看起來還是一個必經的過程。我的想法應該沒有錯,訓練新人需要投入大量的心神,才能得到可供使用的人才。只希望不要遇到太多只想要來「過水」不想作任何付出的人。

2011年2月9日 星期三

心情浮動

本來以為事情慢慢的進入軌道,沒想到突如其來變故打亂了本來就不完整的規劃。混亂加上心情上的浮動,混合感冒造成的頭痛,真不是一個好受的體驗。人說禍不單行,這應該算是其中一例吧!

逆境最能消磨人的鬥志,不單事件本身的衝擊,也擔心厄運尚未結束,不曉得自己能否撐得過去。本來就遙遠的夢想似乎變得更不可及,反思自己是不是太天真了。

回歸單純,回到本來簡單的思維,不去想那些過多,過於複雜卻又沒有答案的問題。沒有人知道未來會是如何,也許一輩子都不會有達到目標的一天,那又如何呢?世事有太多不如人意的狀況,完美的東西不可求,活著就是為了努力的活下去,心境的平靜,靠得不是的滿足所有的追求,而是滿足已有的。

當回久違的和尚吧!放手去敲響那今天應該敲的鐘。

2011年2月8日 星期二

年資的意義

農曆年前有幾個同事離職了,雖然不確定農曆年對現在的價值是否存在,但總是一件不尋常的事情。除了思考公司內的制度,人力使用上是否有些缺失,也讓我思考員工年資的意義。

入社會之前,因為總是在學校裡,或在服兵役。所以當越久老師,年資越高,領得薪資越多︰當越久的兵,軍階越高,薪水也越多被視為一個理所當然的事情。但是的身為一個公司的老闆,這樣的制合理嗎?

以使用網路服務為例,如果今天所申請的網路常常斷線,服務不穩定,客服電話又老是沒人接,或是解決不了問題。這樣的網路公司,如果在新的年度提出「新年加價不升速」的方案要求重新簽約,我想大部分的人都會想要翻臉吧!得到的東西沒有比較多,只是因為「用得比較久」就得付出更多的代價,很難讓人接受。

雖然拿網路比喻人有些不妥,不過一個常常出小錯誤的員工,今年能作的和去年能作的事情一樣,工作的效率也沒有比較好。然而,這個員工告訴老闆,因為他待滿 X 年了,所以應該要幫他加工資。我想,可能沒有多人老闆會心甘情願的把錢拿出來。

服務的價格每年遞減,但是工資卻被認為應該上漲的原因。除了通貨膨漲的因素,應該是在於員工的價值也因為年資而有所成長,能夠作更多的工作,能夠思考、改進效率,能夠獨立思考,提出好建議,或是帶動其它的員工,創造更高價值。如果一個待了三四年的員工,只能作如同工讀工就能完成的工作,會讓老闆思考,是否仍要花較多的錢,留下這麼一個員工。

我認為這個現象存在許久,不然為什麼越來越多老闆只願請工讀生,或是叫人力派遺,而不願意花錢請正職的員工。因為正職員工沒有成長,待久了反而有人情壓力,變成不能趕又沒有更多產出的存在。這樣反倒不如隨時能說「拜拜」的工讀或是人力派遺。

年資的意義,或是價值,應該是來自於員工的成長和進步,而不是單單只有「待得比較久」而已。

2011年2月6日 星期日

留點文字吧!

記得在大學在系上的 BBS 站開了一個個人版,之後在裡面打了許多「碎碎唸」為標題的文章,把自己在生活中的一些想法、體會放進去。不知道有沒有其它人在看,只是單純打出想打的東西,放些平常找不到人說的話。

後來,BBS 主機硬碟壞了,那些文章也就都消失了。本身並不覺得有什麼可惜的,畢竟當時的經歷不足,許多的想法現在看起來十分的天真。

忘了是什麼原因,讓我建立起自己的部落格。不過那時動輒一兩百行的文章,已經再也打不出來了。找不到 Blog 的主題,也無法像從前那樣的持續的寫,清空站內的文章數次之後,我迷惘了,不知道要怎麼繼續下去。

可能是因為「想要有目的」反而被限制,也許,回到的最初的純粹,單純的把自己的想法寫出來,反而更能夠把堆積在心裡說出來的想法發洩出來。

至於有沒有人看,是否對其它人產生價值,就不管了。我不是什麼聖人,不應該期望能說出什麼真理,也不會有其它人這麼想吧!