2008年12月28日

《越讀者》網路時代的閱讀需要跨界

《越讀者》沒有越界,不成閱讀,尤其在網路時代
  • 作者:郝明義, 張妙如(插畫)
  • 出版社:網路與書出版
  • 出版日期:2007年05月03日
  • ISBN:9789866841026
  • 裝訂:平裝
搜尋這本書

在金石堂的新書區看到這本書,它最初吸引我的地方,是封面的設計,主要由黑白線條構成的漫畫人物組成,有簡潔的視覺效果。放在陳列區,和其他新書絢彩繽紛的封面設計比起來,這個封面顯得特別突出,於是我就隨手拿起來翻閱。

內頁排版也很有趣,一下子出現彩色圖片,一下子又在文字版面穿插漫畫,甚至有幾頁全是漫畫,更讓我想瞭解內容寫些什麼。
如果你再看看張妙如在封面及內頁的插畫,書裡還有連續十二頁的鄭問的連環漫畫、電影Matrix的幕後故事書,卻偏偏又有各種經典名著及閱讀方法的介紹,你就應該可以體會到這本書為什麼要取名為《越讀者》,以及要傳達的訊息是什麼了。
這本書由『網路與書(Net and Books)』出版,目錄及文章摘路請看這裡。作者郝明義現任大塊文化董事長,也是『網路與書』的發行人,他在出版業有二十多年的工作經驗,但在這本書中,他並非以專業編者的角度評論閱讀這件事,而是一位領會閱讀樂趣的「讀者」,將他的心路歷程在書中分享。

書中的插圖漫畫是張妙如所繪,文字看累了,還可以藉由這些圖畫輕鬆一下。

「閱讀」是攸關城市、國家競爭力的一種習慣,擁有普遍喜愛閱讀的市民、國民,水準自然會提昇,也會有較多的創意,不管是產品或藝術品,都需要透過閱讀才能提昇創造力。因為只有透過閱讀,才能讓大腦裝進更多「語彙」,才有辦法有效地表達自我,才有辦法與其他人溝通,才有辦法激發出各種美妙的想法。就像美食當前,沒有足夠的語彙,身為饕客,你沒辦法說出到底有多好吃,身為廚師,你沒辦法作出這道佳餚。語彙不足,會讓一個人受到極大的限制,就像沒有東西吃、沒有水喝,卻還要連續幾天的翻山越嶺。在有限的人生中,想要達成目標,累積自己能量最快的辦法,就是透過閱讀。

閱讀為何重要?因為前人把發生的事物,都用文字記錄下來,「文字」這個人類偉大的發明,也是現代文明的基礎。雖然知識還有其它許多管道可以傳承,但直到上個世紀,文字仍是最重要的知識表達工具。或許影像及聲音的多媒體技術盛行,但若我們無法以文字表達這些多媒體的內容,那麼又要如何去瞭解呢?
這些自我侷限,很容易錯過今天人類有史以來閱讀資源最豐盛的時代特色。
請看「閱讀的重要性」。

假設,你也認同了閱讀的重要,那麼我們繼續討論這本書吧!

「沒有越界,不成閱讀」這句話很有趣,書的一開頭是這樣形容:「即使愛情,也沒法像閱讀這樣讓我們覺得,越界之舉,可以如此新奇。」越界點出廣泛閱讀的重要性,這也是許多人必要的學習。我們有機會接觸各類知識的階段,大約是在小學至高中的期間,然而注重考試教育的台灣,我們有許多人因位受到填鴨式教學的迫害,而把這些基礎知識當作是通過考試測驗的「課程內容」,也就是考前會努力讀,考試後就算忘光了也沒關係,分數代表了一切。根據過去的經驗,能夠將課本當作漫畫書那樣隨興閱讀,能夠認為課本內容很有趣的人,實在很罕見。事實上,用來培養我們閱讀基礎能力的課本,卻也抹去不少從小培養閱讀習慣的機會,很多時候面對無聊的內容,乾脆用背的比較快。

即使是念到研究所,很多人雖然有不錯的讀書及準備考試技巧,但卻沒辦法發現一個學習領域,藏有自己真正有興趣想研究的學問。其實每個人都有機會找到自己發自內心喜愛的領域,但前提不外乎要閱讀得夠多夠廣,如果只是填了一個志願之後,就只在很窄的領域中學習,那很容易就劃地自限,或許要到進入社會後才有機會重新找尋自我,或許窮其一生也找不著,相當可惜。
郝明義認為,在台灣成長的人,之所以會被一些閱讀界限所捆綁,
可能是考試教育鎖定教科書與參考書所形成的。
可能是中學與大學長達十年時間對閱讀胃口的影響所形成的。
可能是出了社會後的現實壓迫所形成的。
可能是對於「網路」與「書籍」一些既定印象及使用習慣所形成的。
可能是對於閱讀時間、空間、工具、方法的不善掌握所形成的。
可能是從沒有意識過自己劃地自限而形成的。
可能是從沒有想像過跨越這些界限之後的風景而形成的。
現實我們無法改變,不管教改怎麼改,都別抱什麼期待,畢竟每個人適合的學習方式不同,改變全國上下統一的教育政策,結果還是不會有太多變化。

不抱怨,那我們還能做些什麼?

很簡單,就是「閱讀」。

從閱讀自己有興趣的領域開始,重新找回閱讀的樂趣,重新培養良好的閱讀習慣。這不是件很難的事情,只要到書店選本喜歡的書,不管是漫畫、小說都好,只要相信自己的品味和程度不是太差,就不會買到完全沒有意義的書,比起買一本裝飾自己很有學問的書,還不如買本自己會想看的書來得精打細算。

閱讀的時候,是必須用大腦思考的,書的作者一定想在其中表達些什麼,抱持著好奇心,多去想想,這是什麼?是真的嗎?為甚麼是這樣?對我有什麼幫助?如果是我會怎麼做怎麼想?…有時候,放鬆心情把看書當休閒,可以不必太認真思考;但隨時別忘記多思考才能發現樂趣,金錢很難買到那種充實的樂趣。

別說書很貴,沒錢買書所以很少機會閱讀,省個幾杯咖啡、遊戲月卡,就足夠買一本書,學生還可以到圖書館免費借閱。你認為書有多少價值,就是在為改變人生的機會定價。別說沒時間,像是候車、搭車的空檔,都是很好的閱讀時機。

人生必看的一本書《如何閱讀一本書(How to read a book)》,在書中也有提到,這本書讓我們有機會重新認識閱讀,並學會有效閱讀的技巧。我曾經看過這本書,也把它推薦給其他人。但我現在會推薦先看完《越讀者》,核心的觀念都差不多,但讀起來較輕鬆易懂,相對適合中文讀者。

《越讀者》適合的閱讀者,作者郝明義清楚地說了:
所以,閱讀永遠為我們開著一扇窗戶,一扇門。
不論讀這本書的你,是一個正在中學階段,被填鴨填得兇的學生。
還是一個進了大學,正在悠哉悠哉與莫名的不安所混雜的大學生。
還是一個出了社會,被後有知識的浪潮所追趕,前有自己工作生涯要開展的雙重壓迫所苦的社會人。
還是一個像我這樣,苦苦為閱讀是怎麼回事而思索,到四十多歲才算開竅的人。
在aNobii有許多讀者的好評
然而,無論橫向縱向,《越讀者》將閱讀相關的方法論都闡述得既生 動而明確,整體而言確實是深入淺出、引人入勝,但若是能誘發大眾 對閱讀的喜好、令普通讀者能在翻閱的初始便引發出對於閱讀這件事 情的興趣,而非一直探討、分享、講解應該怎麼讀書,就會更加完美 而且更有價值了!畢竟你不能對一個剛進小學的孩子說研究領域的智 識,無論你用的是再有趣簡明的語言,這個觀念的本身,就已經超過 對方的吸收範圍了。 by ms. fion
郝明義將「Winner takes all.」改寫成「Reader takes all.」,一句話三個單字道出他精闢的見解。特別是在網路普及的時代,學習成本降到史無前例的低點,閱讀不再有貧富貴賤之分,是個人人都能夠享受的權利。想成為一名閱讀者,只需要動動滑鼠即可。因為想要閱讀太容易,如果想要在人群中脫穎而出,懂得閱讀只是基本條件,還要能夠「越界」才有勝出機會。
關於「閱讀」這件事,我想《越讀者》可以提供不少的方法,但最重要的是,自己本身要找到自己的閱讀喜好,才能慢慢的展開。 from 文字邊境.換日線
閱讀不能只重視文字,在網路時代,我們還必須培養對影像及聲音的閱讀能力,甚至用眼睛之外的其他身體感官去感受。
另一個也值得思考的點是,「閱讀」不應該只侷限在「眼睛」,我們過份重視視力的使用,並且又「輕圖像」「重文字」,這對於開發我們的腦力或創意,其實都沒
有益處。亦即,郝明義認為我們也應該培養對圖像或影音的閱讀力。除出「視覺」以外,「味覺」、「觸覺」及「聽覺」,也都值得開發;而正是從此,郝明義認為
網路時代的閱讀是可以期待的,換言之,影音及圖像化思考也能有正面意義。 from Fran私觀點
我個人的經驗是,過去長年學習技術,閱讀經常侷限在很小的範圍,也就是Computer Science領域中的某些片段,即使我知道自己的興趣,也很喜歡沈浸在這些知識的學習,但卻因此失去不少跨領域閱讀的機會。或許我們會存在一種迷思,也就是長時間鑽研某個領域,就能成為該領域的達人。這個迷思讓我們很難真正地成功,即使可以肯定自己、創造自己,可是想要超越自己就很不容易。

在我還是個中學生時,有位念理工的大學生告訴過我,雖然他在學校讀的是電機,但只要平時有空,一定會多看社會科學、人文方面的書籍,看這些書對一個理工科學生來說,都是些課外書,對考試沒直接的幫助,但是他認為只有這樣才會使自己感到充實。我當時不懂這個道理,相當慚愧的是直到唸研究所才有所體悟。

均衡,對一個人的發展很重要。從飲食我們很容易就能察覺均衡的影響,若挑食、只偏愛某些食物,身體很快就會出現問題,雖然靠著營養補充品可以短時間見效(就像為了參加某個考試特別去念某些速成的書),但長期來說,必定會逐漸與健康疏遠。同樣的道理套用在我們的大腦,也是相同的情況;只是大腦飲食(閱讀)不均衡的病徵是內在,從外表看不出來,所以有些人靠著穿著打扮就能掩飾。

書到用時方恨少,我們遲早都會發現自己的不足,只是趁著年輕早期發現早期治療,自然會比老大徒傷悲來得好。

要能夠均衡地吸收知識,也是相當需要技巧,就像在沒有其他指導的情況下,我們想要做到均衡飲食並不容易。教你如何正確閱讀的書籍,就像一位好的營養師,可以幫助你用正確的方式、有系統地去改善飲食(閱讀)。

對《越讀者》的一些初步分享就先到此告一段落,書中還有分享一些各類知識為何要閱讀、如何閱讀的內容,以及網路時代如何運用科技讓閱讀更有效率的技巧,不失為一本有趣、實用的書。我相信這本書對於想要重新認識閱讀的人,會有相當多的幫助;但是對閱讀已有一番見解的人,就不一定會認同,或許會有更好的看法。若有任何想法,誠摯邀請您透過回應與我們一同討論分享。

使用GCIN及SCIM輸入標點符號

對於Linux桌面的中文使用者,經常會有輸入標點符號的需求,在Windows使用新酷音輸入法,輸入『`』就可以叫出符號選擇表,而Linux常用的GCIN及SCIM要怎麼做呢?

GCIN:
組合鍵『ctrl+alt+,』

SCIM
組合鍵『ctrl+0』

讓ASUS無線分享器支援3.5G,韌體更新下載

ASUS的WL-500系列無線分享器,算是價格不高、同時又能夠支援USB裝置的機種,只是原廠將USB定位成連接視訊、外接硬碟、印表機的用途,而不支援目前日漸普及的3G/3.5G(HSDPA)上網。其實只要有內建USB-port的WL-500系列分享器,通常都能以改韌體(firmware)的方式,支援3.5G USB無線網卡,並將3.5G的連線分享給多部電腦。

改機之後就變成3.5G分享器,優點是不但便宜,功能也比多數市售的還要好,加上一根10dbi天線之後,訊號效果就不是內建天線的機種可比擬。那麼,有哪些非官方韌體,可以用在WL-500系列分享器呢?簡單地列一下,大概會有:
我們要介紹的韌體,是以Oleg為基礎製作,它所對應的官方版本為1.9.2.7,因為加入了其他功能成為一個分支,Oleg更新的版號當然就不會跟上官方的腳步。支援3.5G的韌體,是由CDMA@wifi發佈,需要的檔案請在這邊下載(最新版本是1.71)。

CDMA@wifi目前提供的1.71版,共有以下八種檔案可供下載,其中其中WL????代表支援的機器型號,1.9.27-??代表對應的韌體版本。
  • WL500gp-1.9.2.7-10-USB-1.71.trx
  • WL500gpv2-1.9.2.7-10-USB-1.71.trx
  • WL500W-1.9.2.7-10-USB-1.71.trx
  • WL500gx-1.9.2.7-10-USB-1.71.trx
  • WL500g-1.9.2.7-9-USB-1.71.trx
  • WL500bv2-1.9.2.7-9-USB-1.71.trx
  • WL500b-1.9.2.7-9-USB-1.71.trx
  • WLHDD-1.9.2.7-9-USB-1.71.trx
市面上還容易找到的機種,應該是WL500W、WL500GPv2,而WL500GP、WLHDD則可以到網拍看看是否還有賣。若是以WLHDD改機,則有體積小巧、可以內建一顆2.5吋硬碟等好處,只是WLHDD已經不容易買到。

自己刷軔體會有風險,特別是非官方的軔體,若造成機器損壞,保固條件會有爭議,所以一定要小心進行(例如要避免突發的斷電情況),無論如何,刷壞的後果本文並不負責。刷好韌體後重新登入分享器的管理網頁(預設是192.168.1.1),可以看到如下的英文介面,左方選單新增加USB Connection(CDMA),就是用來支援3.5G連線的設定。



先用Quick Setup將Mode切換為Home Gateway(左方的ASUS圖示下方會顯示目前狀態),並將連線方式選擇Cable Modem/自動取得IP及DNS。在USB Connection的Connection Mode設定中,選擇GPRS/EDGE/UMTS,就會出現GPRS/EDGE/UMTS Config的選單,請進入這個設定,畫面如下圖所見。



Username及Password通常不用填寫,而APN、Dial Number則依照ISP的設定填入 (例如中華電信為internet、*99#)。在Zero CD Configuration的部份,若Modem type有列出可用的數據卡型號(其中在台灣較常見就僅有Huawei E220/E169等),直接選好即可,否則必須要手動填入USB device Vendor ID、USB device Product ID。

加入Google Friend Connect,部落格變成社交圈

部落格加上一些外掛,就可以增加與閱讀者之間的互動,這並不是什麼新鮮事,早在很久以前就有留言板、讀者追蹤的免費服務,申請後只要將HTML代碼嵌在合適的位置,部落格就可以擁有這些額外的功能。

Google Friend Connect
提供的同樣是社交功能,讓你的部落格/網站變成一個小社群。差別是它是由Google開發,服務給人比較可靠的感覺,加上GMail的普及率很高,很多網友都有GMail帳號,也因此可以用GMail帳號直接登入、成為某個網站的Friend  Connect成員、互相設定為好友。

若想要多了解Google Friends,可以看看Mr.6電腦玩物的介紹。

Google推出這個服務,讓人感到期待的,其實是它的擴充性,雖然它目前提供的功能有限,但熟悉技術的開發者,可以站在這個平台的基礎上,建構出新的功能,分享給廣大的Google使用者。如同iGoogle Gadgets可以讓網頁充滿各種用途的小工具,Friend Connect也提供Social Gadgets,也就是用於建構社群功能的小工具。

舉例來說,Wall Gadgets就是官方提供的留言板功能,在申請Google Friend之後,就可以方便地使用它。可以參考這篇『如何擁有Google Friend Connect留言板?(Wall Gadget)』以及『利用Google Friend Connect做出留言板』。

除了使用E-mail邀請朋友加入自己的社群成員,更好的方式是自己先加入對方的,互相連結就有機會創造更多的人氣。

2008年12月27日

可愛的紙模型,自己印、動手做

上個星期週末,為了哄騙小朋友乖乖聽話,答應幫他們做台汽車模型,材料當然是紙,是作海報剩下的厚卡紙。請他們在空白紙上畫出汽車平面圖後(對還很小的小朋友來說,畫圖也只有平面),先加上幾筆劃把車子畫成立體圖形,接著簡單地另外畫出一個立體展開圖,訂好比例之後,拿了一張新的A4紙重新用尺丈量設計出最終版的展開圖,請小朋友用尺沿線剪下後,教他們折好粘貼處,用雙面膠帶將車子模型組立起來,並粘貼一些裝飾用的配件。

小朋友看到自己畫的車變成立體版,雖然粗糙但還像個玩具車,當然十分開心,畢竟也花了一、兩個小時才完成。但這時候他們的期待更多了,這台車會動嘛?呃...這是紙做的耶!但幸好找來廢棄的包裹厚紙片,掛上橡皮筋,在模型車下方黏上紙條,變成可以用"發射"的模型車,雖然輪子不會轉,但瞬間被彈出也能飛個幾公尺遠。

這讓我回憶起小時候熱愛自己動手做紙玩具,除了自己畫、自己粘貼拼湊出來的紙模型外,也有在紀念品店購買,一整本每一頁都畫好設計圖,都是恐龍身體的每個部位,正確剪裁粘貼後,全部拼湊才能變成一隻立體恐龍。在那個年代,這種買現成的勞作材料回來玩,都是偶爾才能享受到的奢侈品,畢竟做壞的總是比成功的還多。

在數位時代,我開始好奇這種小朋友的童年玩具,是不是也因為網路而變得更加便利。用CorelDraw之類的向量繪圖軟體,固然也可以畫出模型展開圖,但實在太費工,只是做個玩具就要花上大半天設計圖稿。還記得之前看過紙模型繪製的軟體,很神奇地能夠將3D模型轉換成2D展開圖,而且還會設計好粘貼邊,小惡魔的這篇文章介紹得很仔細。

如果站在做玩具的角度,而不是動手創作藝術品,有現成的展開圖,挑個喜歡的就能印給小朋友玩,似乎會更符合童年玩具的需求,在Google找到一篇匯整的文章,介紹許多不錯的參考網站,請看連結一連結二(內容都是一樣的)。

以它推薦的Paper Museum(日文網站)來說,就有提供很多種主題的紙模型,附上A4/PDF版的展開圖與組立說明書,直接下載列印就可以玩,真的很方便,例如以下就是一個完成的範例。



展開圖PDF的檢視,已經有顏色,所以需要用彩色印表機輸出,最好搭配稍厚一點的紙:


除了小朋友會喜歡的卡通版,紙模型也有許多大朋友會喜歡的擬真版,適合精心製作後拿來收藏,例如3D紙模型網就有銷售101大樓紙模型,做好之後看起來可是唯妙唯肖(請看下方影片)。如果夠瘋狂(又有充裕的時間),或許動手打造一個紙糊的小鎮也不是問題。

<a href="http://video.msn.com/?mkt=zh-TW&playlist=videoByUuids:uuids:19aaac84-876d-4b65-b1ee-2c994cd17c22&showPlaylist=true&from=msnvideo" target="_new" title="我的台北101">影片: 我的台北101</a>

Ubuntu/64bit執行Java Webstart程式

最近重新回到Ubuntu桌面環境工作,不管是工作站或筆電都換上Ubuntu 8.10,也花不少時間調校。雖然Ubuntu 8.10已經有非常多的進步,安裝好大致上硬體支援、中文環境都沒什麼問題,但額外安裝的一些軟體就必須自己動手調整。最近justfly也在玩Ubuntu 8.10,但我相信會有許多荊棘正在消磨他的熱情:D。

最近維護的一個專案『程式設計學習網』,是前陣子在XP/Vista下以Eclipse+Tomcat+Groovy打造的Web應用系統,最近打算嘗試將它也移植到Ubuntu下開發,理論上Java開發的程式要跨平台不難,確實Web的部份很容易就可以在Linux下啟動,Tomcat甚至連換版本都不用,而Eclipse也只需要下載for Linux/64bit的版本,重新安裝plug-ins即可。

但麻煩的就在用Java Webstart技術開發,提供寫程式練習的編輯器,它透過Java WS啟動Swing開發的Loader,並下載jEdit相關檔案及教材XML檔,接著啟動jEdit進入練習程式的環境。這個Client端AP程式的移植並沒想像容易,遇到的問題還不少。

在先前的版本,如Ubuntu/64bit 8.04、7.10測試時,Java WS啟動後就沒反應了。目前以Ubuntu/64bit 8.10測試,初步發現Java WS可以順利執行,並且是以32bit方式運作(需要ia32-sun-java6-bin套件),只是很快又發生錯誤訊息,是UnknownHostException的錯誤,線上找到一篇網誌馬上解惑,就是安裝lib32nss-mdns套件即可,這個套件應該是提供32bit程式進行DNS查詢之用。



解決了DNS查詢問題之後,還有中文字變成方塊的問題,這就需要另一篇教學的幫忙,步驟主要是將uming.ttf這個中文字型加到JRE的字型目錄中。以下為轉貼的步驟說明,基本上在8.10只要照著做即可。
在 /usr/lib/jvm/java-6-sun/jre/lib/fonts 建立目录 fallback
sudo mkdir /usr/lib/jvm/java-6-sun/jre/lib/fonts/fallback
将 uming.ttf 链接到 fallback 中
sudo ln -s /usr/share/fonts/truetype/arphic/uming.ttc /usr/lib/jvm/java-6-sun/jre/lib/fonts/fallback/
进入 fallback ,使用 mkfontscale 生成 fonts.scale
cd /usr/lib/jvm/java-6-sun/jre/lib/fonts/fallback/
sudo mkfontscale
回到上一层目录 /usr/lib/jvm/java-6-sun/jre/lib/fonts/
cd ..
使用su命令,以root用户操作,如果忘记密码,使用 sudo passwd root 进行重新设置
su
将 fonts.scale 的内容加到 fonts.dir 中
cat fallback/fonts.scale >> fonts.dir

使用Java WS啟動的Loader畫面,執行使用Jakarta Commons HttpClient為基礎開發的套件自動下載(jEdit&Plug-ins),看起來很正常。


但啟動之後的編輯器,缺少了左方和下方的Plug-ins畫面,查看jEdit的activity.log發現載入階段有錯誤發生:
[debug] ActionSet: Loading actions from jar:file://home/kyle/myplweb/jEdit/works
pace/jars/pl-buffertabs.jar!/actions.xml
[error] URL: java.net.UnknownHostException: home



這個問題還沒辦法確定原因,從jEdit官方下載的jEdit 4.2source,編譯好之後執行,加入Plug-in一切正常。差別是載入Plug-in設定檔的路徑,必須是file:/home/...而不是file://home/...,因為Java支援的這個file protocol,只有在file:/的時候會從local的檔案系統尋找檔案,當斜線有兩條file://時,就會變成從遠端檔案主機找尋(FTP),下個階段再來探討這個問題如何解決。

2008年12月25日

Fotofox上傳相片更簡單

Fotofox是Firefox 3的附加元件,安裝它之後,Firefox瀏覽器就變身相片上傳工具,支援的相簿服務很多,包括Flickr、Tabblo、23hq、SmugMug、Marela、Kodak EasyShare Gallery、Pixelpipe及Zooomr等。

安裝好之後,在『工具』選單會出現『Fotofox』的選項,按下它就可以在側邊欄看到Fotofox的工具畫面。

第一次使用前必須先設定,步驟很簡單,先選擇一個相簿服務,例如Flickr,按下『Continue』按鈕後,等候一下就會彈出Authenticate的瀏覽器視窗,內容是Flickr(yahoo)的登入畫面,先填入帳號密碼完成登入,以Flickr來說,登入後會看到是否要允許Fotofox存取的詢問畫面,這時只要點一下Allow的按鈕,在點Authenticate的『Done』按鈕即可完成設定。

上傳照片也很容易,在Fotofox中有個『Click Here or Drag Images for Upload to ...』的區塊,點一下就可以選擇要上傳的照片檔,可以先準備好多張照片,設定好Tag、標題等,再批次全部上傳。更方便的是Fotofox支援拖曳的方式,我們可以先打開作業系統的檔案瀏覽器,先切換到照片儲存的目錄,再把照片拉到Fotofox,這樣上傳圖片就更輕鬆了。

如果想看附圖的教學,可以參考香腸炒魷魚的這篇『Fotofox讓你快速用Firefox上傳照片到Flickr』,這位有耐心的作者寫得真是詳細。

比較可惜的是Fotofox沒辦法換佈景,預設的配色實在和我的瀏覽器外觀不太撘,如果一定要有配色,個人比較喜歡Lightroom的黑灰色調。Fotofox的外觀請參考下圖囉。


『玩命快遞3』盧貝松動作片再次重現大螢幕

期待了很久,『玩命快遞3(Transporter 3)』12/19首映的當天,就跑到台中日新戲院看這部片。下午五點,在空間很寬敞的至尊廳,居然只有不到1/10的座位有人,但有趣的售票員把所有人都排在一起,有些不想這麼熱鬧的人就各自跑去找其他空位子了。也許台中人不愛看這類型電影,或是說喜歡看的台中人都還沒下班下課,從現場實在很難有『首周末全台票房大破兩千萬』的感受。

老實說,這是第一次在電影院看盧貝松的電影,在看過『終極殺陣1~4』以及『玩命快遞1~2』之後,很容易就能想像這次的新作會有甚麼料,相同的男主角開著同樣廠牌的車,不合乎現實的特效場面、搭配導演獨具風格的幽默,這一定又是一部換湯不換藥的盧貝松動作片。

沒錯!這部片從頭到尾都是為了取悅觀眾,刺激的飆車鏡頭、全身肌肉的帥氣男主角、英雄式的無敵打鬥橋段,反正不管怎麼樣,打不死的Frank Martin(傑森史塔森飾演)絕對不會輸,頂多挨個幾拳就會再把壞人狠狠教訓一頓,而且還擄獲正妹的芳心。劇情發展不到一半,你就可以想像,那個壞人的頭頭最後會有多慘,你知道會很慘,但就是會想知道到底有多慘。

黑色的Audi A8跑車由喜歡穿西裝而且有潔癖的主角駕駛,頓時變成一部進行生死交關快遞任務的飛車,用不可思議的駕駛方式每次都能脫離險境。玩命快遞3又再次重播這一切,導演大概很清楚觀眾就是會想看這樣的『爽片』,即使已經看過一次、又一次,但這種電影目的已經不是讓觀眾看到多麼有深度的劇情,而是讓看的人不用動甚麼大腦,在身心放鬆的情況下,享受電影中安排的畫面及音樂的刺激,在有大螢幕大音響的電影院看這部片,純粹就是為了一個『爽』字。

從頭到尾,劇情發展算是相當緊湊,很少冷場。撇開劇情內容不講,若要挑這部片的缺點,個人覺得是女主角,雖然滿臉雀斑是盧貝松刻意的安排,但還是嚇到我了,即使已經看完了,還是會有一種『不會吧!她真的女主角喔』的感受。但不管怎樣,尬車超帥氣的Frank還是為這部片加不少分。

2008年12月24日

搭台鐵、住青旅、騎鐵馬、瘋台灣

終於收到期待已久的包裹,是青年之家的『台鐵放寒假自由行』專案票卷資料。這個優惠活動的消息來源是Aican,看到環島三天台鐵票+一晚住宿只要899元,二話不說馬上準備資料去申請(有了幾次單車活動報名提前額滿的慘痛經驗,現在只要跟報名有關都會特別提高警覺),趕在11月底前將報名資料寄出,但沒想到截止日期居然延長了兩週,害我開始不知道緊張是為了甚麼。

由於作業上得延遲,青年之家寄來E-mail提到無法準時寄出票卷資料,但會在聖誕節前完成投遞,在聖誕節的前一天,沒想到就真的收到久違的郵包。

牛皮紙袋拆開一看,內容物包含了:
  • 臺鐵FUN寒假3日卷(這張很超值!票價399元可以撘三天火車,如果不誤點的話,繞台灣個幾圈不是問題)
  • 收據(沒有統一發票喔)
  • 臺灣YH住宿兌換卷(用雲彩紙印的,價值五百元*899-399=500,也算是超值優惠)
  • A4說明一張(有特別印上台鐵攜帶自行車的規定)
  • 青年旅遊卡一張(外觀很像吊飾)
  • 台灣鐵路旅遊手冊 * 一本
  • 台灣自助旅遊手冊 * 一本
  • 台灣觀光教通路網圖 * 一本
加300元同時申辦的YH會員卡一張,相關物品有:
  • 台灣國際青年旅舍 * 一張
  • 青年旅遊卡優惠資訊手冊 * 一本
  • 青年之家會員證(雖然有個原住民的圖像,但整體設計相當國際化,看不到任何中文字)
為了盡量每個星期都能出去旅遊,怎麼玩又能省錢就很重要。這一次計畫撘台鐵、帶小摺完成兩鐵(鐵路+鐵馬)環島,作為單車環島的探路之行,隨時準備出發囉。

2008年12月23日

想知道有哪些Web 2.0的新服務嗎?

Web 2.0已經不是個陌生的名詞,但是想要知道有哪些可以算是Web 2.0的新網站?或是想知道最近又多了哪些Web 2.0的應用?找起來可是件累人的事情,幸好有許多網站幫我們整理好了,請看以下的介紹。


Simple Spark讓生活中常用到的Web Apps更容易分享,你可以註冊一個帳號,並設定自己最喜愛的幾個Web Apps,也可以看別人喜愛的有哪些,並提供了多種的檢索方式,透過Category(目錄)、Subject(主題)、Device(根據使用的裝置,智慧型手機、蘋果iPhone/iPod Touch或是Wii)、Icon(隨機圖示)的方式列出不同類型的Web Apps。



Go2Web20用Flash製作很炫的清單,讓你可以方便地從圖示找到感興趣的服務,點一下就會出現說明。


Listio本身像是一個部落格,但它的內容都是對Web 2.0網站的評論(review),所以有比較多詳細的介紹,在首頁有個大塊的關鍵字雲,可以很快看出目前有哪些應用的關鍵字是最熱門。


Web2List提供網路服務的分享,並可以讓你一起決定好(推)或不好(噓)。

超簡單的影片轉檔,使用Ubuntu 8.10與mp4tools

在丟掉Vista擁抱Ubuntu之後,怎麼將影片檔/DVD轉成想要的格式呢?對於需要在行動裝置上播放影片的使用者來說,Windows下有Total Video Converter之類的軟體,可以輕鬆地將檔案轉換成許多種格式,本文針對常用的行動裝置影片格式,例如iPod、PSP、3GP、MP4等,說明如何在Ubuntu作業系統下輕鬆完成轉檔任務。

首先我們需要取得mp4tools軟體套件,它包含轉檔會需要用到的許多程式,在Ubuntu只需要使用apt-get指令完成安裝,由於mp4tools並不是Ubuntu官方提供的套件,因此我們必須先加入兩個軟體來源(Repositories),請在『系統>管理>軟體來源』加入第三方軟體設定(可以參考說明*英文),或是編輯/etc/apt/sources.list加入以下設定。
deb http://ppa.launchpad.net/teknoraver/ubuntu intrepid main
deb-src http://ppa.launchpad.net/teknoraver/ubuntu intrepid main

接著先更新apt套件清單:
sudo apt-get update

再來就可以安裝mp4tools套件:
sudo apt-get install mp4tools

這些步驟完成後,就可以開始使用轉檔指令,想要知道mp4tools提供哪些指令,只要透過dpkg -L來查詢。
$ dpkg -L mp4tools | grep bin
/usr/bin
/usr/bin/dvd2ipod
/usr/bin/dvd2mp4
/usr/bin/mkmp4
/usr/bin/mks60
/usr/bin/dvd2s60
/usr/bin/mk3gp
/usr/bin/mp4tools
/usr/bin/mkamr
/usr/bin/mkipod
/usr/bin/dvd23gp
/usr/bin/dvd2psp
/usr/bin/mkpsp

從指令的名稱可以辨識轉換的來源及目的檔案格式,例如mkmp4就可以將影片檔轉為mp4格式的影片檔,而dvd2ipod就是將DVD轉成ipod支援的影片格式。

雖然mp4tools沒有提供圖形操作介面,但文字指令的使用上更為簡便,假設來源的影片檔名為 movie1.avi,則只需要在終端機輸入指令:mkipod movie1.avi,就會自動偵測來源影片(movie1.avi)的檔案類型、並產生符合iPod影片格式的影片檔。

即使在沒有圖形化環境伺服器主機(例如FTP)上,遠端使用文字指令也能將影片轉檔,搭配shell script還可以做到自動化的批次轉檔任務,這樣的應用可以更加廣泛,例如我們想要對某個資料夾的*.avi檔案都轉成iPod相容格式,只需要搭配find指令,範例為『find /path -name "*.avi" -exec mkipod {} \;』。

*本文參考Full Circle Magazine, Issue 19,『HOW-TO Create Mobile Multimedia』文章作者為Italo Maia,Full Circle是廣受歡迎的線上免費Linux雜誌,特別適合Ubuntu的愛好者閱讀。

2008年12月22日

還在四處找iPod/iPhone韌體嗎?

這個網站相當不錯,手上有蘋果小機器的朋友可以注意一下,上面提供相當完整的iPod/iPod Touch/iPhone韌體,從古老(但應該很少人會那麼懷舊吧)到非常新的版本都有提供,可以直接下載、速度很快,這篇短文還沒打完,就已經下載完。但這個網站僅提供原廠韌體,並不含解放程式,目前QuickPWN已有支援firmware 2.2

MySQL 5.1正式發行

經過漫長的等待,被Sun併購的MySQL終於推出5.1正式發行版。記得在上個月,手邊一個專案由於需要XML/XPath support,Oracle、MS SQL目前都有支援,但MySQL 5.0並未支援,從一些討論中得知MySQL 5.1將會支援,就相當期待這個新版本的正式發行。
昇陽指出,MySQL 5.1 提升了諸多新的大型企業等級功能,包含:支援五種水平資料分區的形式:range、hash、key、list以及composite (sub-partitioning);提供兩種新的複製選項。原始的複製僅會複製從主伺服器到子伺服器之間改變的資料(而不是實際的SQL statements);混合的複製則依據獨立的SQL運作,採用以statement為基礎或以原始資料為基礎的複製。

另外還有新的工具讓開發者和DBA能夠自動化地將資料庫伺服器上所執行的共同循環SQL任務排序;並將提供給MySQL Enterprise的進階訂戶,藉由監控查詢效能和修正錯誤的SQL程式碼,能大幅提升MySQL資料庫應用程式的速度和暖機時間。
(資料來源 ZDNet)
MySQL正式推出5.1版,這是2年前MySQL推出5.0版以後,官方建議企業可採用的第一個正式版本(Generally Available)。在5.1版中,主要增強了叢集化(Clustering)能力,包括新增資料表分割功能(Partitioning)和增強以列處理(Row-based)的副本功能等。

5.1新版增強資料庫的控管機制,例如調整了擴充架構,可以用外掛API(Plugin API)的方式,將需要的功能放入MySQL中,增加資料庫管理人員的使用彈性。並且新增事件排程功能(Event Scheduler),資料庫管理人員可以建立定期執行的SQL指令,不需另外撰寫外部程式來控制。所有資料庫的log記錄,直接儲存到資料表中,用SQL指令就能存取,比過去存log檔案的方式更便利。
(資料來源 iThome/王宏仁)

以下的資料整理自官方文件What's New in MySQL 5.1,列出在這個新版本中有加入哪些新特色,僅部份提供翻譯(只翻我自己有興趣看的部份囉)。
  • Partitioning(資料表分割). 這項功能允許將個別資料表(table)分散成多個部份儲存在檔案系統的不同位置上,根據在資料表被建立時所設定的規則。實際上,資料表的不同部份是以被切割的表格存放在不同位置,但是從使用者的觀點來看,被分割的表格仍是單一的資料表。在語法上,這項功能實現成CREATE TABLE、ALTER TABLE以及EXPLAIN...SELECT等語法的擴充設定。在MySQL 5.1.6的版本中,對被分割的資料表作查詢(queries),可以獲得"partition pruning(分割資料表修剪,可以大幅提昇查詢效率)"的好處。在某些案例中,相較未分割的資料表,同樣的查詢語法在已分割的資料表上能夠獲得速度優異的結果。請看 Chapter 18, Partitioning以獲得更多資訊 (Author: Mikael Ronström)

  • Row-based replication(以資料列為基礎的複製模式). 在過去MySQL從Master端複製到Slave端的功能是以SQL語法為基礎,這被稱作陳述式基礎(statement-based)的複製模式。在MySQL 5.1.5的版本,提供其他複製的基準,這被稱作資料列基礎(row-based)的複製模式。取代Master端藉由傳送SQL語法複製到Slave端的方法,Master將事件(events)寫到它自己的二進位資料紀錄檔(binary log), 進而指出個別的資料列如何被改變,在MySQL 5.1.8的版本中,提供第三種選項"混合模式(mixed)",它預設使用陳述式基礎的複製模式,而只針對特定的案例切換成資料列為基礎的複製模式。閱讀 Section 16.1.2, “Replication Formats”. (Authors: Lars Thalmann, Guilhem Bichot, Mats Kindahl)

  • Plugin API(附加元件應用開發介面). MySQL 5.1增加具有彈性的附加元件開發介面,使得在執行階段可以加載及卸載不同的元件,而不用重新啟動伺服器,儘管這項工作目前還未全部完成,但全文檢索(full-text parsers)的附加元件已經在這種新的方向跨出第一步,這將能夠讓使用者實現他們自己的輸入過濾器(input filter)在被索引的文字,因此即使像PDF或其他類型的文件格式,也能夠提供全文搜尋的功能。A pre-parser full-text plugin performs the actual parsing and extraction of the text and hands it over to the built-in MySQL full-text search. See Section 22.2, “The MySQL Plugin Interface”. (Author: Sergey Vojtovich)

  • Event scheduler(事件排程工具). MySQL的事件(Events)是根據行程表安排執行的任務,當你建立一個事件時,你就建立了一個被命名的資料庫物件,包含一或多個SQL語法,一或多次定期被執行,在特定的日期或時間開始及結束。在概念上,這與Unix的crontab(also known as a “cron job”)工具很相似,也與Windows的工作排程類似。See Section 19.4, “Using the Event Scheduler”. (Author: Andrey Hristov)

  • Server log tables(伺服器紀錄資料表). 在MySQL 5.1之前,只能將一般查詢及緩慢查詢紀錄到磁碟上的紀錄檔,但在MySQL 5.1提供更有彈性的紀錄方式,紀錄可以像之前一樣寫入紀錄檔,但也可以寫到 general_logslow_log 的資料表中。 If logging is enabled, either or both destinations can be selected. The --log-output option controls the destination or destinations of log output. See Section 5.2.1, “Selecting General Query and Slow Query Log Output Destinations”. (Author: Petr Chardin)

  • Upgrade program(升級程式). The mysql_upgrade program (available as of MySQL 5.1.7) checks all existing tables for incompatibilities with the current version of MySQL Server and repairs them if necessary. This program should be run for each MySQL upgrade. See Section 4.4.8, “mysql_upgrade — Check Tables for MySQL Upgrade”. (Authors: Alexey Botchkov, Mikael Widenius)

  • MySQL Cluster(叢集). MySQL Cluster is now released as a separate product, based on MySQL 5.1 but with the addition of the NDBCLUSTER storage engine. Clustering support is no longer available in mainline MySQL 5.1 releases. MySQL Cluster releases are identified by a 3-part NDB version number; currently, the MySQL Cluster NDB 6.2 and MySQL Cluster NDB 6.3 release series are available for production use.

    Some of the changes in MySQL Cluster since MySQL 5.0 are listed here:

    • MySQL Cluster replication. Replication between MySQL Clusters is now supported. It is now also possible to replicate between a MySQL Cluster and a non-cluster database. See Section 17.11, “MySQL Cluster Replication”.

    • MySQL Cluster disk data storage. Formerly, the NDBCLUSTER storage engine was strictly in-memory; now, it is possible to store Cluster data (but not indexes) on disk. This allows MySQL Cluster to scale upward with fewer hardware (RAM) requirements than previously. In addition, the Disk Data implementation includes a new “no-steal” restoration algorithm for fast node restarts when storing very large amounts of data (terabyte range). See Section 17.12, “MySQL Cluster Disk Data Tables”, for more information.

    • Improved backups for MySQL Cluster. A fault arising in a single data node during a Cluster backup no longer causes the entire backup to be aborted, as occurred in previous versions of MySQL Cluster.

    Many other new features and improvements have been made to the NDBCLUSTER storage engine in MySQL Cluster NDB 6.2 and MySQL Cluster NDB 6.3; for more information about these, see Section 17.15, “MySQL Cluster Development Roadmap”.

  • Backup of tablespaces. The mysqldump utility now supports an option for dumping tablespaces. Use -Y or --all-tablespaces to enable this functionality.

  • Improvements to INFORMATION_SCHEMA. MySQL 5.1 provides much more information in its metadata database than was available in MySQL 5.0. New tables in the INFORMATION_SCHEMA database include FILES, EVENTS, PARTITIONS, PROCESSLIST, ENGINES, and PLUGINS.

  • XML functions with XPath support(XML函數包含XPath的支援). ExtractValue() returns the content of a fragment of XML matching a given XPath expression. UpdateXML() replaces the element selected from a fragment of XML by an XPath expression supplied by the user with a second XML fragment (also user-supplied), and returns the modified XML. See Section 11.10, “XML Functions”. (Author: Alexander Barkov)

  • Load emulator(負載模擬工具). The mysqlslap program is designed to emulate client load for a MySQL server and report the timing of each stage. It works as if multiple clients were accessing the server. See Section 4.5.7, “mysqlslap — Load Emulation Client”. (Authors: Patrick Galbraith, Brian Aker)

安裝指南
延伸閱讀

2008年12月20日

論程式設計工作的兩則文章

近日看到的兩篇文章,內容都是再談論程式設計這件工作,作者都是在軟體領域頗有名氣的專業人士,他們的看法也值得作為參考。

以身為「工程師/程式設計師」為榮 - Kenming(矇矇的秘密基地)

程式設計工作者的職場必勝術 - 王建興


程式設計工作,到底好或不好?其實答案很明顯,人就已決定80%,對領域有極度學習熱誠,很容易就能晉身專業,做起工作自然覺得有樂趣,收入也不會太差,不管什麼行業都差不多。剩下20%是要看待什麼樣的公司,有些公司很注重行銷、卻不尊重專業,在這種公司只有往管理階層爬才會有出息,如果只想當個工程師,那就必須接受跟沒經驗的新人同樣的待遇,畢竟頭銜同樣都是"工程師",在這種公司沒人想繼續當個工程師,因為即使技術能力很好的人,也必須努力取得管理職務,才能夠享受與年資相符的待遇。

優秀的技術人員沒辦法好好當個工程師,而必須費心思當個管理者,說起來相當浪費資源,畢竟有能力、經驗及天賦的一流專業人才,往往在生產力上能夠輕易發揮一抵十的優勢,簡單說就是,頂尖程式設計師的生產力往往是普通程式設計師的十倍(Peopleware一書曾經提過)。很多時候,我認為並不是十倍而已,如果是一個很難很難的程式,頂尖程式設計師在三十天終於做出來,而普通的程式設計師可能做一輩子都還做不出來,這時候簡單的算式30/0就可以計算出來生產力的差異。

程式設計(Programming)並不是簡單的工作,而是需要用大量腦力時間才能完成的複雜工作,編寫代碼(Coding)才是簡單的工作,當初上程式課沒學好的管理者,往往弄不清楚兩者之間的分別,畢竟對他們來說,一樣都是坐在電腦前打打字,一樣叫做程式設計師,所以薪水也只需要給一樣多。這種情況下,就很難找到像沃茲尼克這樣的人才來效命,因此也很難像蘋果電腦一樣成功。

但需要思考的是,一般資訊系所的畢業生,到底是Coder還是Programmer呢?抑或都不是…總之,至少要先清楚自己。

文字接龍2.0

故事接龍雖然有趣,但卻有一些問題。大家通常都愛看故事,許多人小時候可能都要聽完故事才會安然入睡;但"說故事"本身不是件容易的事,特別是說一個好笑、好玩的小故事,更別說是動人心弦、感人肺腑的經典故事了。

因此有人告訴我,看到故事接龍網站,雖然想寫,但卻不知如何動筆,寫出來了,自己看卻又覺得不夠好,不敢張貼。現代人運用文字創作的機會愈來愈少了,媒體拿文字寫八卦、政客拿文字鬥爭,他們是少數運用文字的高手,但一般人可就沒那麼幸運,甚至要拿來形容自己的情感、說出一番有道理的見解都很困難,即便是念到較高學歷的研究生,就算有好的研究題材,也可能因為文字表達能力欠佳而寫不出好論文。

故事接龍,會給人一種無形的壓力,也就是寫的東西必須是故事才行。

再經過一番思考後,我決定將故事接龍更改為文字接龍,為了評估更改是否帶來正面的改善,用Google看了一些資料。

故事接龍... 搜尋結果有638,000項符合。

文字接龍... 搜尋結果有772,000項符合。

故事接龍+文字接龍... 搜尋結果有156,000項符合。

雖然文字接龍可以在廣義的解釋上涵蓋故事接龍,但搜尋結果卻沒有明顯高出太多。在喜歡玩文字的族群中,我想還是有多數偏好故事接龍,因此在未來的網站平台發展時,仍會將"完整呈現一則故事(的各種版本)"當作設計考量,也鼓勵甚至可能獎勵說故事。

但是網站仍更名為文字接龍,原因不外乎故事接龍也屬文字接龍的一種,而文字接龍能夠有更多變化,例如成語接龍、名詞接龍、特定人事物接龍、詩詞接龍、…等,只要你一句、我一句,甚至你一詞、我一詞就能開始玩,具有較多的娛樂性質,對於文字運用的練習也有正面的意義,當一個題目已經接不下去的時候,運用多版本功能還可以回到源頭從新接起,而不是像論壇或留言板只能一直循序接下去。

文字接龍可以由第一個發文者說明規則,其他人在遵循這個規則的情況下參與,若有人惡意亂發文怎麼辦呢?全匿名的平台並不允許刪文或改文,但這時只要略過搗蛋文,從正常的那一則繼續接下去即可,在排名機制的運作下,較不受歡迎的那一則回應就會隨著時間淡出、黯然退場。平台提供最基本的建設,由參與者自己訂規則,平台在不變的情況下可以適應新需求、能夠衍生出需要的功能,改為文字接龍似乎更能夠實現由使用者建構功能(User-generated functions)的開發理念。

站在隨意想、輕鬆貼的立場來看,或許這種無聊時還能夠打發時間、不必太認真想就能發言,才能夠符合社會演變的趨勢。總之,我只想提供一個自由的平台,而不是遊戲規則。

2008年12月19日

故事接龍2.0 - Beta開放測試

故事接龍2.0是針對線上文字接龍設計的網路服務,完全免費,可以任意建立新的故事,分享給其他人一起來接龍,所有的故事隨時都可能出現新的劇情發展,一個故事可以有多種結局,您也能扮演劇情發展的共同作者及推手。

網址超簡單好記,好棒(How Bon)…資訊(Info)。
http://howbon.info/



這個網站計畫尚屬實驗性質,是由從未登記立案的速客碼科技(阿宏&阿鴻)創新事業團隊開發,剛開始目的只是要證明隨口說說的Idea可以在三天內做出雛型(3day app),當做出來的東西自己也覺得好玩,才會繼續投入。相較於過去我們歷經多次的Zero成果(0day app,也就是什麼都沒做出來),這一次總算堅持到第二天,而且邁向第三天。

這個平台繼續以實現使用者創造功能(UGF, User-generated functions)為目標,所以有哪些玩法連開發者自己都不清楚,因此故事接龍的教學網頁,本身也是一個開放接龍的故事。 http://howbon.info/61
故事接龍2.0超級自由,您只要寫一小段故事起個頭,發佈後就是一個新的故事串,將故事網址貼在您的部落格或論壇,其他人就可以參與故事的接龍,故事的劇情可以隨意發展,所以能有各種不同的結局,曝光率愈高的劇情發展將會成為故事主軸,所以您可以將最喜愛的劇情網址(在故事下方提供)推薦給其他人,就可以"推"您喜愛的劇情,讓它有更多機會浮出檯面。

2008年12月16日

十二月份雲林斗六地區的單車活動

斗六這個純樸的小地方,雖然沒有像都會區那樣隨處可見單車騎士,但污染及車輛較少的交通環境,鄰近有山有水的天然景色,都是住斗六才能享受得到。這個月雖然已經過了一半,不過還是有許多活動可以參加,以下可以找到一些活動資訊。

天下一家鐵馬家族
週三夜騎(華山、坪頂等),週六晨騎(山峰、碧湖等),週日晨騎(梅山、坪頂等)。

Mobile01雲遊林間討論板
01雲林區板友的夜騎邀約、活動公告。

在雲林騎車的感受比較不一樣,雖然路上不會出現成群結隊、浩浩蕩蕩的車隊,偶爾看到全副武裝的車友就會有股莫名的感動。但在這個地方很容易就能感受到暢遊鄉土間的樂趣。記得有次鄉間小路亂騎的時候,就看見土角屋三合院外一公尺高的圍籬上,有三五隻雞排排站,模樣相當逗趣可愛。即使不想騎山路,許多通往其他鄉鎮的平路,也能夠欣賞田野風光,許多鄉鎮更有古蹟可以探訪,除了運動還可以體驗深入探索地方文化的樂活。

在這個地方,練車可以一個人平靜地踩踏,不會受到太多干擾,也不像許多地方傳出單車族遭搶劫擄車的恐怖新聞,唯一需要在意的就是自己的體力。初學者可以先練習坪頂、地母廟等路線,但建議別夜騎,畢竟路況不熟悉較危險,這些路線即使慢慢騎也只需要2~3小時,下午有空閒就可以出發。體力進步後可以嘗試華山、草嶺路線,依路線規劃的長度,時間可以是上午或上下午。

Ubuntu 8.10的3.5G連線更完美了

還記得不久前才寫了篇說明『Vodafone with Ubuntu 8.04 Hardy AMD64 完美安裝動手作』,使用Vodafone連線3.5G的方式,一直使用到最近,雖然有時候會發生連線的障礙,但大致上是沒什麼問題。最近NB也升級到Ubuntu 8.10,實際測試了NetworkManager對行動寬頻(Mobile Broadband)的支援,這一次Ubuntu的改版讓3.5G連線變得十分簡單,不必再像過去大費周張安裝套件、修改設定,只要使用內建的NetworkManager新增連線,簡單按幾下滑鼠,就可以開始使用。

有多簡單呢?

設定...
狀態列網路管理員圖示按右鍵 > 編輯連線 > Mobile Broadband > 新增 > 下一頁 > 選ISP(例如種花電信) > 下一頁 > 套用 ... 完成!!! (不到三十秒)

使用...
狀態列網路管理員圖示點一下 > 選則設定時建立的Mobile Broadband連線名稱 ... 完成 (不到五秒)

不用裝驅動程式?
我用的是Ubuntu...不是XP也不是Vista...什麼是驅動程式? 那可以吃嗎?

最神奇的事就是,連線等待時間實在有夠短,在XP/Vista等系統偵測到USB網卡的時間,連線就已經完成,更別說XP/Vista還要先打開連線軟體、等硬體初始化完成才能按連線。

有圖有真相...


常用的電信公司都在內建的名單上了,這個設定根本不算設定嘛(太簡單!!!擔心Ubuntu用久了會變笨?...電腦就是要人性化嘛...看看人家Apple...而且很複雜又麻煩的Windows用久了也沒變聰明不是嘛)。


新增好了,連線名稱就叫種花電信。


Mobile Broadband出現在網路連線的選單,開機後只要輕鬆點一下(也可以設定成自動連線),連線就完成了(當然要記得先插上3.5G網卡),這才是想上就上的行動寬頻嘛。

2008年12月15日

VBScript網路流量防護程式

在整理舊硬碟資料時,意外發現以前寫的小程式,這支使用VBScript(請注意是VBScript不是VB)撰寫的WSH程式『宿網守護神』,是讀二技時幫住宿同學製作,可以從宿舍流量統計網站抓取當日的累計流量,當數值超過設定的上限時,就自動關閉某些正在執行的網路程式(就是動物園暫停營業的意思啦)。雖然是個很小的Script程式,不過有用到一些regular expression、command shell、file system的技巧,對需要寫VBScript管理Windows系統的網管人員或許有些幫助,所以就貼在這邊大放送啦。其中有部份CODE不是我寫的,而是發揮程序員都應該知道的密技『C&P』得來,但時日已久,我也分不清楚哪些才是自己寫的,總之有需要的人就自己拿去修改吧。

這個版本只是在網路流量快到上限時,停止網路應用程式,避免超流被鎖卡,對網管人員來說應該是無害的,只是遵守遊戲規則下讓動物園經營成果最佳化。其實當初在撰寫第一版時,就有想到第二版需要哪些改進,舉例來說,自動搜尋同一個網段中,哪些IP address沒有人用(透過過去一段時間的統計資料確定是沒人在用),產生成一份IP清單,然後在一個IP流量快到上限時,自動切換到下一組IP,如此一來,假設每個IP每日限流3G,那麼只要能蒐集到五組,每日就有3G*5的總流量可用。

'Option Explicit

 
on error resume next

 
' [[宿網守護神]]測試版

'========================================== [[設定區-BEGIN]]

'初始化設定(請勿修改以下變數名稱)

'請依照需求修改以下各項設定資料

 
'IP位址設定()

'Dim YourIP : YourIP = "140.125.xxx.xxx"  '手動設定

Dim YourIP : YourIP = GetIP()            '自動偵測

 
'傳輸量上限(單位:MBytes)

Dim LimitTrans : LimitTrans = 3072  '預設3GBytes

 
'流量到達上限時,將自動終止KillApp列表中的程式

Dim KillApp : KillApp = Array("emule.exe", "flashget.exe", "DSLite.exe", "BitComet.exe", "abc.exe", "Bearshare.exe", "BitLord.exe", "bitspirit.exe", "btdownloadgui.exe", "dcplusplus.exe", "edonkey2000.exe", "g3torrent.exe", "kazaa.exe", "limewire.exe", "newsLeecher.exe", "Overnet.exe", "rufus.exe", "slsk.exe", "StrongDC.exe", "utorrent.exe", "winmx.exe")

 
'檢查流量的時間間隔(單位:分鐘)

Dim Refresh : Refresh = 10

'========================================== [[設定區-END]]

 
 
 
 
 
 
'========================================== [[主程式由此開始]]

'程式名稱

Dim ProgName : ProgName = "宿網守護神"

 
'Call ActiveFirewall

 
Call SetSchedule

Call Main

 
'工作排程

Function SetSchedule()

    Dim WS

    Dim ExeTime, AtExeTime

 
    Set WS = CreateObject("WScript.Shell") 

 
    ExeTime = (DateAdd("n", Refresh, Now()))

    AtExeTime = Hour(ExeTime) & ":" & Minute(ExeTime)

 
    WS.Run "at " & AtExeTime & " """ & WScript.ScriptFullName & """"

End Function

 
'主程式執行區段

Sub Main()

    '判斷IP設定是否正確

    If YourIP = vbNullString Then

        MsgBox "錯誤:無法取得主機位址。", , ProgName

        Exit Sub

    End If

 
    '取得流量統計網頁

    Dim Http, HtmlSource, URL

    Set Http = CreateObject("msxml2.xmlhttp") 

    URL = "http://140.125.240.168/?action=ShowIP&IP=" & YourIP

    Http.Open "GET", URL, False

    Http.Send 

    HtmlSource = Http.ResponseText

 
    '取得網頁原始資料

    HtmlArray = RegExpTest("<tr><td>[0-9.-]+</td><td>[0-9.]+</td><td>[0-9.]+</td><td>[0-9.]+</td><td>[0-9.]+</td><td>[0-9.]+</td></tr>\n", HtmlSource)

 
    '判斷是否有讀取到統計資料的HTML原始碼

    If UBound(HtmlArray) = 0 Then

        MsgBox "錯誤:無法取得統計資料,請重新檢查設定。", , ProgName

        Exit Sub

    End If

 
    '取得統計數據資料,由HTML碼轉換為一串陣列

    DataArray = SubMatchTest("<tr><td>([0-9.-]+)</td><td>([0-9.]+)</td><td>([0-9.]+)</td><td>([0-9.]+)</td><td>([0-9.]+)</td><td>([0-9.]+)</td></tr>", HtmlArray(0))

     
    '今天的日期與資料日期

    Dim NowDate, DataDate

    NowDate  = Date

    DataDate = CDate(DataArray(0))

     
    '日期比對,今日的流量統計已經上線才開始進行流量防護

    If NowDate = DataDate Then

     
        Dim TotalTrans '總流量

         
        TotalTrans = CDbl(DataArray(1)) + CDbl(DataArray(2))

 
        '流量已達上限

        If TotalTrans > LimitTrans Then

         
            '終止清單列表的程式

            For Each AppName In KillApp

 
                KillApplication(AppName)

 
            Next

 
        End If

         
    End If

     
End Sub

 
Sub ActiveFirewall()

    '啟用XP防火牆(用來終止某程式網路連線)

    Set objFirewall = CreateObject("HNetCfg.FwMgr")

    Set objPolicy = objFirewall.LocalPolicy.CurrentProfile

     
    objPolicy.FirewallEnabled = TRUE

End Sub

 
'樣式比對

Function RegExpTest(patrn, strng)

    Dim regEx, Match, Matches

 
    Set regEx = New RegExp

    regEx.Pattern = patrn

    regEx.IgnoreCase = True

    regEx.Global = True

 
    Set Matches = regEx.Execute(strng)

 
    Dim MatchesArray()

    Redim MatchesArray(0)

    Dim Num

 
    Num = 0

 
    For Each Match In Matches

        Redim Preserve MatchesArray(Num)

        MatchesArray(Num) = Match.Value

        Num = Num + 1

    Next

 
    RegExpTest = MatchesArray

End Function

 
'樣式比對

Function RegCount(patrn, strng)

    Dim regEx, Match, Matches

 
    Set regEx = New RegExp

 
    regEx.Pattern = patrn

    regEx.IgnoreCase = True

    regEx.Global = True

 
    Set Matches = regEx.Execute(strng)

    RegExpTest = Matches.Count

End Function

 
'樣式比對

Function SubMatchTest(patrn, inpStr)

    Dim oRe, oMatch, oMatches

 
    Set oRe = New RegExp

    oRe.Pattern = patrn

 
    Set oMatches = oRe.Execute(inpStr)

    Set oMatch = oMatches(0)

    Dim retArray(5), Num

    For Num = 0 To 5

        retArray(Num) = oMatch.SubMatches(Num)

    Next

    SubMatchTest = retArray

End Function

 
'IP偵測

Function GetIP() 

    Dim ws : Set ws = CreateObject("WScript.Shell") 

    Dim fso : Set fso = CreateObject("Scripting.FileSystemObject") 

    Dim TmpFile : TmpFile = fso.GetSpecialFolder(2) & "/ip.txt" 

    Dim ThisLine, IP 

    If ws.Environment("SYSTEM")("OS") = "" Then 

    ws.run "winipcfg /batch " & TmpFile, 0, True 

    Else 

    ws.run "%comspec% /c ipconfig > " & TmpFile, 0, True 

    End If

    Dim IPArray()

    Dim Num

    Num = 0

    With fso.GetFile(TmpFile).OpenAsTextStream 

        Do While NOT .AtEndOfStream

            ThisLine = .ReadLine 

            If InStr(ThisLine, "Address") <> 0 Then IP = Mid(ThisLine, InStr(ThisLine, ":") + 2)

            If IP <> "" Then

                If Asc(Right(IP, 1)) = 13 Then IP = Left(IP, Len(IP) - 1)

                Redim Preserve IPArray(Num)

                IPArray(Num) = IP

                Num = Num + 1

                IP = ""

            End If

        Loop

        .Close

    End With

    '取得Gateway位址

    Dim GW

    GW = GetDefaultGateway()

    GW = Left(GW, InStrRev(GW, "."))

    retIP = vbNullString

    For Each IP In IPArray

        If (Left(IP, Len(GW)) = GW) Then

            retIP = IP

            Exit For

        End If

    Next

    GetIP = retIP

    fso.GetFile(TmpFile).Delete

    Set fso = Nothing

    Set ws = Nothing

End Function 

 
'閘道偵測

Function GetDefaultGateway() 

    Dim ws : Set ws = CreateObject("WScript.Shell") 

    Dim fso : Set fso = CreateObject("Scripting.FileSystemObject") 

    Dim TmpFile : TmpFile = fso.GetSpecialFolder(2) & "/gw.txt" 

    Dim ThisLine, GW

    ws.run "%comspec% /c route PRINT > " & TmpFile, 0, True

    With fso.GetFile(TmpFile).OpenAsTextStream 

        Do While NOT .AtEndOfStream

            ThisLine = .ReadLine 

            If InStr(ThisLine, "Default Gateway") <> 0 Then GW = Mid(ThisLine, InStr(ThisLine, ":") + 2)

            If GW <> "" Then

                If Asc(Right(GW, 1)) = 13 Then GW = Left(GW, Len(GW) - 1)

                GW = RTrim(GW) : GW = LTrim(GW)

                Exit Do

            End If

        Loop

        .Close

    End With

    GetDefaultGateway = GW

    fso.GetFile(TmpFile).Delete

    Set fso = Nothing

    Set ws = Nothing

End Function

 
'終止指定程式

Function KillApplication(ProcessName)

    Dim objWMIService, objProcess, colProcess

    Dim strComputer, strProcessKill

 
    strComputer = "."

    strProcessKill = "'" & ProcessName & "'" 

 
    Set objWMIService = GetObject("winmgmts:" _

        & "{impersonationLevel=impersonate}!\\" _ 

        & strComputer & "\root\cimv2") 

 
    Set colProcess = objWMIService.ExecQuery( _

        "Select * from Win32_Process Where Name = " & strProcessKill )

     
    For Each objProcess in colProcess

        objProcess.Terminate()

    Next

End Function

2008年12月14日

Joomla網站被駭

Joomla 1.5.x架設的網站,有漏洞…就被駭了。在aican架的Joomla站被入侵之後,就已經知道有漏洞,於是就把網站晾在那邊,終於等到被駭客換掉首頁。雖然首頁被寫了一堆root權限遭取得的字樣,但實際上只是Joomla的佈景被換掉,影響並不大,登入後台將佈景改掉,再升級程式即可。目前已經改用最新穩定版本的Joomla 1.5.8,內容也正在重新建置中。

雖然Joomla是個相當優秀的CMS,也有廣大的社群,不過發展似乎逐漸緩慢了下來。就過去的經驗看來,有許多很優秀的CMS,最後都接近銷聲匿跡,畢竟後起之秀有更多機會青出於藍。就Joomla的發展,在每次版本較大的改變,例如1.0.x到1.5.x就大幅調整了架構,雖然造成升級的許多不便,但卻有更多機會讓這個軟體生命能夠延續更久。

2008年12月10日

2009年NerverStop永不放棄賽事

NerverStop的單車活動知名度頗高,是國內業餘單車活動中,專為挑戰體力、耐力極限的賽事,包含超長距離的洄瀾極限200K、300K,以及超陡爬坡的新中橫、武嶺、陽金P字山道,最狠的是不但距離長或坡度陡,還有關門時間限制,超過時限就拿不到證書。這種比賽和鐵人三項目的一樣,是超越自我的一種挑戰,只要能夠比完全程就是贏家。

今年才開始玩單車,一直沒膽去報名這麼變態瘋狂的活動,光是看到簡介就覺得隱約寫著新手勿入。最近勤奮練騎的目標(雖然也常因為天氣冷就偷懶),就是參加明年的NeverStop啦!現在的處境其實有點尷尬,因為不到五十公里的輕鬆騎活動,已經懶得報名,通常開車到目的地的時間,可能都比騎車的時間還要長,而距離近的輕鬆騎活動,又是平常就經常騎車的路線。百公里以上的活動,又必須天時地利人和才能參加。總之,明年體力練到一定水準,再遠都要衝去參加啦!

2009 NeverStop活動行事曆


2009/3/28
2009/3/29
洄瀾極限挑戰300K國內首度舉辦個人最長距離之自行車挑戰活動,只要有信心有勇氣敢於接受挑戰更高更快更強的車手均可報名(限定完成時間為20小時)
2009/5/17Climbing Taiwan 探索新中橫由水里玉山國家公園管理處出發沿台21線新中橫至終點塔塔加遊客中心第1停車場海拔2610公尺全程約71公里
2009/9/6挑戰巔峰-武嶺由台灣地理中心碑埔里至台灣公路最高點武嶺海拔3275公尺全程約55公里
2009/10/10
2009/10/11
洄瀾極限挑戰200K暨團隊計時賽活動分2天進行,第1天為個人極限挑戰200K(193線+台9+台11丙),第2天
為團體計時賽,每隊選手3~4人(台11)
2009/12/6挑戰陽金P字山道唯一都會型國家公園自行車挑戰活動,由士林至善公園出發行經仰德大道/陽金公路至金山/萬里大坪國小/風櫃嘴/平等里至冷水坑爬升總海拔約2200公尺全程約75公里

VMWare 6.5 + Ubuntu Linux 發生的按鍵失效

剛升級Ubuntu 8.10,又重新愛上在Linux環境工作的樂趣,但打開VMWare 6.5.x卻發現按鍵失效了。沒反應的按鍵,包括方鍵鍵、DEL等,少了這些按鍵實在很麻煩。幸好smlsun早已察覺這個問題,並分享了修正方法

以下轉錄解決方法:

add below lines to /usr/lib/vmware/config

xkeymap.keycode.108 = 0x138 # Alt_R
xkeymap.keycode.106 = 0x135 # KP_Divide
xkeymap.keycode.104 = 0x11c # KP_Enter
xkeymap.keycode.111 = 0x148 # Up
xkeymap.keycode.116 = 0x150 # Down
xkeymap.keycode.113 = 0x14b # Left
xkeymap.keycode.114 = 0x14d # Right
xkeymap.keycode.105 = 0x11d # Control_R
xkeymap.keycode.118 = 0x152 # Insert
xkeymap.keycode.119 = 0x153 # Delete
xkeymap.keycode.110 = 0x147 # Home
xkeymap.keycode.115 = 0x14f # End
xkeymap.keycode.112 = 0x149 # Prior
xkeymap.keycode.117 = 0x151 # Next
xkeymap.keycode.78 = 0x46 # Scroll_Lock
xkeymap.keycode.127 = 0x100 # Pause
xkeymap.keycode.133 = 0x15b # Meta_L
xkeymap.keycode.134 = 0x15c # Meta_R
xkeymap.keycode.135 = 0x15d # Menu

也有論壇提供以下的設定,據說只要一行就可以取代上述的設定,但沒實際測試過,有興趣的朋友請自行取用。


xkeymap.nokeycodeMap = true

2008年12月9日

升級Ubuntu Linux 8.10的小問題

最近從Ubuntu 8.04升級至8.10(apt-get網路安裝),過程雖有些小錯誤但結果算是順利,新的kernel不必加開機參數就能支援8GB的RAM,但升級之後卻發生NVIDIA 8600GT顯示卡沒辦法正常work的問題,上網找了一下似乎碰到這狀況的人挺多的。

最後發現,問題其實出在kernel的版本。

也就是說,已經升級到8.10,但kernel仍停留在2.6.24,而nvidia-glx-177(這個驅動有確定支援8600GT)的DKMS必須搭配2.6.27的kernel,所以即使套件安裝成功,在build kernel module時還是會失敗,啟動X-server的時候就沒辦法順利使用顯示卡的驅動。

要解決這個問題,首先必須安裝kernel 2.6.27,包含linux-headers、linux-image、linux-restricted-modules、linux-source等套件。

但奇怪的事情發生了,明明已經安裝了新kernel,但開機選單還是沒看到選項,執行grub-update也是沒改變,這種情況或許不是每個人都會遇到,但若真的遇到(見鬼了),就先把/boot/grub/menu.lst備份後再移除,這時grub-update產生的menu.lst就會被正確寫入新的檔案。

只要確定nvidia-glx-177有安裝(可以使用"系統>硬體驅動程式"打個勾就裝到好),重新開機後,就會看到開機階段有一個script會執行DKMS自動build的任務,接下來啟動X-server就能夠正常驅動顯卡。

Java JDK 6 API文件正體中文CHM版

寫Java程式最好的工具書其實就是API文件手冊,特別是編輯器沒有支援自動完成(auto-comple)時,根本連Class定義了哪些method都很難知道,更別說正確了解用途。一般Java的API文件都是HTML型式,例如SUN官方就在線上提供查閱。但用慣MSDN的開發人員,一定會覺得這種缺乏檢索功能的查閱方式,用起來仍是不夠方便,於是有好心的人製作了CHM(Compiled Help Manual)版的Java文件。英文看不懂?沒關係,海峽的那一方已經有打包好的簡體版,不習慣看簡體?大智若魚的老魚好心地分享了正體中文版

沒有理由說不懂API沒辦法寫Java程式了!開始RTFM吧。

PHP+MS SQL Server 寫入Image型態資料

SQL Server有Image的欄位型態,在開發Desktop Application若需要讓使用者儲存圖片,例如大頭照、產品圖片,這時候很常將欄位設定Image型態,在使用整合型的開發工具時,通常只需要做些設定,圖片就能夠順利存取。但如果用PHP寫網頁程式,需要存取這個欄位,就需要多做一些處理。若使用的函式庫有支援Binary資料的存取功能,那只要呼叫這些函式即可解決。比較棘手的情況是,當我們只能下純文字的SQL去存取資料庫時,就必須自己動手克服。

顯示圖片比較簡單,通常只要將查詢的結果dump出來,例如:
showpic.php
$db->query("select content from images where id = 1");
$pic = $db->fetch()->content;
echo $content;

show.html
<img src="showpic.php" />

上傳圖片需要編碼處理,例如我們先用$_FILES取得上傳的圖片資訊:
$name = $_FILES['picfile']['name'];
$tmp_name = $_FILES['picfile']['tmp_name'];

接著將上傳的暫存檔案(即圖片檔)內容全部讀出來(file_get_contents的預設flag是FILE_BINARY,不會有問題)。
$c = file_get_contents($tmp_name);

再來,必須先將圖片內容以HEX編碼轉換成字串(即十六進位表示法)。
$content = "0x";
for ($i=0; $i<strlen($c); $i++) {
  $h = dechex(ord($c[$i]));
  if (strlen($h)<2) $h = '0'.$h;
  $content .= $h;
}

編碼後產生的字串格式…
0x112233445566778899AABBCCDDEEFF

解說:
從圖片檔讀取每一個byte,其ASCII的值範圍是0~255,也就是需要2^8來表示(即8個bit),轉成十六進位必須要16^2表示,也就是每個byte需要儲存成兩個16進位的字元符號,所以轉換的結果以固定每兩個十六進位字元符號來表示一個byte資料的值。例如255就是FF,而10就是A,而A只用了一個字元符號,必須在前面補0變成0A。

轉換之後,要寫入資料庫就跟平常的SQL並無不同。
$db->query("insert into images(name, content) values('$name', $content)";

唯一需要注意的是,範例程式碼中的$content並不需要加上單引號,因為開頭的0x已經宣告這是一串十六進位表示的資料,若加上單引號則會被當作字串,反而會出現型態不符的警告。

又開始失眠

在恢復健康飲食、正常作息的一小段時間後,最後又開始逐漸變得晚睡,雖然不像之前經常到快天亮才睡,但是焦慮卻又開始影響睡眠品質,原訂11點準時睡覺的目標,開始愈難愈難達到。

這一年即將要過去,畢業的日子也近在咫尺,即使沒有什麼課業或工作的壓力,仍會覺得焦躁不安。我所惶恐的是自己的一無所知,過去有太多的日子虛度光陰,有太多知識沒有好好把握學習機會,有太多時候沒有認真實踐夢想,有太多太多人事物沒有親身接觸,轉眼間年輕時光已半數流逝,在有限的人生中,又該如何去追逐那遙遠的夢想呢?!

夢想太遠,時間太少…

老師告訴我在這末日,知識爆炸的時代,不應該將信心建立在知識的追求上,儘管追求知識比起其他事物…如功名財富還要好一些。若以對基督耶穌的信仰而言,值得追求的就是那唯一的真理。

古有明鑑,「生也有涯,知也無涯」,窮其一生去學無限浩瀚的知識,結果是非常危險。人生在世,能看見的也不過是在地球上一瞬間的事物,許多我們現在相信的事,甚至不是真的。

需要開始思考一個方向…

2008年12月8日

FindBugs 自動找出程式碼的臭蟲

在閱讀《Effective Java(2nd Ed.)》時發現新東西,FindBugs是一套專為Java程式碼除錯的工具,採LGPL授權的自由軟體,它利用Bug Pattern自動檢查出程式碼可能發生的錯誤,因此在軟體發佈之前用它做一次徹底檢查,就有機會減少Bug在客戶使用時才發生的機會。FindBugs可以用Command-line方式執行,也有提供簡易GUI介面,更方便的使用方式,是搭配Apache Ant或Eclipse等開發工具,讓程式碼Debug的工作變成自動化流程的一部分。

即使是有經驗的程式設計師,仍無法免於Bug的發生。Java的WORA(Write once, run anywhere)特性,有人說應該是WODA(Write once, debug anywhere)才對,雖然這句玩笑話還蠻常真的發生,但也某種程度代表了程式開發時必須認真看待Bug的態度。往往我們在寫程式時,只能夠先考慮在固定條件下,程式沒有語法錯誤、並能夠通過設定的測試案例,例如特定版本的軟體環境以及正確的操作流程,但是當外在因素改變時,Bug就誕生了。幸好Java比起C/C++程式算是容易除錯,甚至有FindBugs這樣的軟體可以幫助除錯。

FindBugs使用bug patterns找尋可能導致錯誤的程式碼,它分析的對象是Java bytecode(編譯出來的*.class)檔案,所以即時沒有原始碼也還是能夠使用。被FindBugs警告可能引發錯誤,並不能夠完全代表一定真的存在錯誤,誤判率低於50%,可以作為程式開發階段的一個錯誤偵測及預防工具。

以下是一些bug patterns可能的理由:
  • 困難的程式語言特性(Difficult language features)
  • 被誤解的API方法(Misunderstood API methods)
  • 當程式碼在維護時被修改,而存在被誤解的常數(Misunderstood invariants when code is modified during maintenance)
  • 多樣化的錯誤:打錯字、用錯布林運算元(Garden variety mistakes: typos, use of the wrong boolean operator)
舉例來說,當一個用來處理某項任務的method包含System.exit()呼叫,則當此method在某種狀況發生時,整個程式可能就因此而不正常結束,有時我們只希望這個特定的任務發生錯誤時,就放棄這個任務,而不是結束整個程式的運作,這種時候呼叫System.exit()就很危險。另一個例子是,當swtich敘述中的case未加上break,也就是當這個case條件成立時,會直接再往下一個case執行,這種情況很多時候是程式設計者忘記加上break,當然有時候故意這麼做的,但FindBugs的警告可以當作是一個提醒。

相關閱讀:

2008年12月7日

週末的台中羽球館

原本週末打算大清早就上合歡山賞雪,但寒流的冬夜無止盡地延伸到上午十點,早餐頓時間已經變成午餐。就在飽足飯後,突然對一天的行程不知所措,這種天氣外出騎腳踏車,補給熱量的食物花費必定相當驚人,於是有了換種運動的念頭,想起後車廂裡塵封已久的羽球拍,它孤單地被遺忘很久,於是開始尋覓台中適合打羽球的地方。

台中的羽球館很多,但很難找,因為大多數的球館並沒有設網站,所以只能從搜尋結果去發現一些清單。有些雖然看起來距離不遠、場地數量也充足,但電話撥過去就是空號回應。最後決定到一家佳青羽球館,因為即使是週末假日,價格仍相當合理($200/小時)。這家羽球館在南區,提供八個室內場地,照明是兩旁的日光燈管,據說天氣熱還會灑水降溫,地板的止滑效果相當不錯,附近很好停車也有附設專用停車場,若沒有帶球現場零售價每個$25元。到這邊打球的人不少,後來才知道有許多認識的人也都是在這家球館打球,也有不少年輕美眉出現(但這不是重點),穿著很專業的羽球愛好者更是不少(這才是重點)。

雖然很久沒打羽球,打起來有點不太適應,但是在專業的球場打球,感覺果然不太一樣(畢竟花了錢就會認真打)。

搜尋引擎最佳化之新手指南

搜尋引擎的曝光率,是網站經營者需要關心的事,因為龐大的網路商機,需要靠搜尋引擎將陌生的訪客帶來,搜尋引擎建立經營者與瀏覽者之間的橋梁,而了解搜尋引擎如何將網站排名,就是認真的經營者必要研究的課題了。Search Engine Optimization(搜尋引擎最佳化, SEO)早在搜尋引擎出現的很多年前,就已經有許多人在研究,搜尋引擎的規則是我們無法改變的,但要讓自己的網站在搜尋結果中,排名在比較前面、獲得比較多的曝光率,則是有最佳化的方法可依循。過去有許多SEO的研究,目的是欺騙搜尋引擎,加入一些對瀏覽者沒有意義的內容來提高排名,但搜尋引擎為了維護品質,自然會想辦法來對抗這些不正當手法的最佳化,除了改變規則來降低這些欺騙行為的效果外,也可能用更積極的懲罰,對於網站經營者來說,想要永久經營必須站在比較正派的基礎上,

Google's Search Engine Optimization Starter Guide》是由Google官方發表的一篇教學文章,提供一些實用的基礎觀念,讓網站經營者在設計網頁時,有最佳實踐方法可以參考。公開的技巧,如果每個人都會用,那是否就等同無用了呢?在公平的基礎上,想要勝出還是必須依賴內容品質的提昇,瞭解並勤於利用SEO的技巧,則是讓同樣內容品質的網頁有更多機會曝光。

是否需要花很多時間才能做SEO呢?其實廣受歡迎的網站管理平台,諸如Wordpress、Joomla皆有SEO的擴充套件可以利用,善用這些工具,就可以在做SEO時省下不少時間。

延伸閱讀:

2008年12月4日

草根台灣臉譜

在斗六行經文化路往石榴、林內的方向,總會看到顯眼的布條,寫著沈芯菱的名字。她是位78年次的準大學生,但她的故事就已經早在雲林這地方流傳開來。家境貧苦的她,到十一歲終於有台個人電腦,十二歲就成立個人工作室,幫忙國內外公司架設三十多個網站、幫忙家裡e化賣農產品,十四歲已經賺進人生第一個一百萬,除添購設備的花費外,把所得捐給公益活動。即使台灣的年輕人大多學習過電腦,但能夠利用知識和技術勇敢幫自己圓夢的人,卻已是少數,而能夠在十多歲就有想法與能力實現理想,更是渺渺無幾。我們冀望社會能給予我們的東西,實在太多,而我們能夠給予社會的東西,卻又太少,這樣的矛盾使我們總是難以逃脫現實的藩籬。

沈芯菱除了展現出資訊長才,同時也是為攝影愛好者,她花費一百多萬汰換過十幾部相機,走訪台灣各地拍攝辛勤的人們,部落格新作"草根台灣臉譜",收錄了照片及文字,拍攝技巧不亞於專業人士,Motorola推出五百萬照相手機Motozine ZN5還找她拍攝一些作品。草根台灣臉譜字裡行間透露對台灣社會的關懷,她也順利甄試考上清大人文社會學系。庄腳囝仔的奮鬥故事,再添一樁趣聞。

PS.我也曾經念過斗高,這應該能算學妹吧:)
lyhcode by lyhcode
歡迎轉載,請務必註明出處!