2011年8月30日

MacBook Pro (2010 Mid) 自助升級750GB硬碟

上週將 MacBook Pro 13" 升級成 8GB 記憶體,用筆電執行開發環境的效能果然改善不少,但硬碟開始面臨嚴重不足,只剩下少少的5GB可用空間。硬碟的升級我考慮比較容易買到的 Seagate,因為台中 NOVA 附近幾乎都只賣死雞牌。

Seagate 7200RPM 的筆電硬碟,目前有 Momentus XT 500GB (混合4GB SSD) 及 Momentus 750GB,到底要選擇速度比較快的 500GB 還是容量比較大的 750GB?這個問題困擾了許久。

我最後是選擇大容量的 750GB,免得下一次容量不足又要拆筆電。

Seagate Momentus 750GB
型號: ST9750420AS
轉速: 7200RPM
快取: 16MB
介面: SATA 3Gb/s

Mac OS X 作業系統的版本是 10.6.8,複製200多GB資料花費大概 4 個多小時(使用內建磁碟工具),更換硬碟後就能直接用新硬碟完成開機,作業系統沒有出現異常;但也許是轉速比較高的關係,開機後鍵盤下方的機殼可以感覺到微微的震動。

拆裝這一代的 MacBook Pro 需要 PH0 十字螺絲,以及 T6 星形起子。

想自助拆裝升級 MBP 硬碟的朋友,複製舊硬碟作業系統可以看 MacUknow 這篇教學,拆解機器可以先參考 ifixit 這篇教學。只要準備好合適的工具,並且每個步驟都小心,其實並沒什麼難度,而且自己的筆電總是會比較有耐心,不用擔心筆電被粗暴對待。

除了機殼背板,另外需要拆下的就是固定硬碟的塑膠塊,同樣是 PH0 十字螺絲。

將硬碟取出時必須避免拉扯排線。

硬碟側邊共有四個星形螺絲,必須用 T6 起子卸下裝到新硬碟。


MacBook Pro 的硬碟固定方式有防震設計,位置是在溫度比較不會影響其它組件的角落,拆過看了之後對 Mac 筆電的設計更加滿意,也較不太擔心 7200RPM 的轉速對機子溫度有大的影響 : )

活動監視器 - 磁碟用量

df -h

2011年8月27日

快快樂樂飛向雲端 VMWare Micro Cloud Foundry 與 Ruby on Rails 實例測試

Cloud Foundry 是虛擬化技術龍頭 VMWare 推出的開放源碼雲端平台(PaaS)解決方案,從四月開始我們持續觀察它的後續發展。這幾個月雖然持續有相關文件出現,但是想玩 Cloud Foundry 的人應該還是看得霧煞煞,因為處於開發及封閉測試階段,早期參與者需要自己從 GitHub 專案區挖寶

直到最近 Cloud Foundry 正式發佈 Micro 版本,提供虛擬機器下載,可以輕鬆利用私有伺服器架造雲。從無到有建構自己的私有雲服務,並且將 DEMO 專案發佈到雲端,前後大約只要花費一小時,就能一探究竟。

需要更多介紹?請參考本誌過去發表過的 Cloud Foundry 文章:
  1. Micro Cloud Foundry 1.0 發佈 
  2. 開放源碼的Cloud Foundry打造PaaS
本次的實測,伺服器是 Ubuntu 10.04 + VirtualBox 4.0,利用免費的 VirtualBox 就能順利執行下載的 Micro 虛擬機器(需要將 .vmdk 掛載到 vbox 新建的 Ubuntu / 64bit VM)。

虛擬機器調整兩個部份:(1)記憶體配置給予1GB空間、(2)網路卡設定成橋接模式。

Micro 第一次開機會要求進行設定,主要是指派 IP 位址及提供 Cloud Foundry 配發的 configuration token。雖然 IP 設定有 DHCP / Static 兩種,但是為讓 XXX.cloudfoundry.me 的 domain 可以正確指向對外實體 IP 位址,因此直接使用 Static 設定靜態位址比較方便(除非有架設 DHCP 可以把對外實體 IP 配發給虛擬機器)。

從 Cloud Foundry 取得的 domain 名稱長這樣: XXX.cloudfoundry.me
若要將開發好的軟體專案,發佈到 Micro Cloud Foundry 架設的 private cloud,就是使用 api.XXX.cloudfoundry.me

Micro Cloud Foundry 伺服器畫面
虛擬機器設定完成後,必須等待一段時間,讓服務可以啟動完成。從 service status 可以觀察目前各服務的執行狀態,這裡面包含 Nginx 、 MySQL 、 Redis 、 MongoDB。這樣的配置很顯然就是要讓伺服器能耐得住大量連線負載。

服務狀態顯示
在開發機器上需要使用 vmc 指令(Cloud Foundry's Command-line Interface, CLI),才能發佈軟體專案。以下使用 Ubuntu 11.04 的開發環境為例。

首先要確認 Ruby 及 RubyGems 開發工具是否已經完成安裝。

sudo apt-get install ruby-full
sudo apt-get installl rubygems

安裝好 rubygems 系統就會有 gem 指令,利用它將 vmc 裝上。

sudo gem install vmc

如果打 vmc 找不到指令,必須手動加上 PATH 設定。

export PATH=/var/lib/gems/1.8/bin:$PATH

再來使用 vmc 設定目標服務器,XXX 就是 Cloud Foundry 配發的 domain 名稱。

vmc target api.XXX.cloudfoundry.me

然後使用 Cloud Foundry 註冊的帳號(E-Mail)及密碼登入驗證。

vmc login

以上就設定完成 vmc 所需的配置。

我們的第一個 DEMO 專案,將採用 Ruby on Rails 建立。因為目前 Cloud Foundry 僅支援 Rails 3 以上的版本,如果使用 apt 安裝 Ubuntu 套件庫的 rails,版本為 2.x 不符合需求。目前使用 gem 安裝的 rails 預設就是 3.0.10。

sudo gem install rails

檢查一下 rails 版本,沒問題就可以繼續。若版本抓錯,可以考慮用 sudo apt-get purge rails 將之前的安裝移除,再確定 gem 裝得版本沒問題。

gem list
rails -v

因為 rails 預設的資料庫採用 sqlite3 ,為了測試方便我們不想改為 MySQL,所以還要補裝 sqlite3 相關套件。

sudo apt-get install sqlite3 libsqlite3-dev
sudo gem install sqlite3

終於可以建立 rails 專案了,命名為 hello 吧(new 是 rails3+ 才需要的指令)!

rails new hello

切換到新專案資料夾。

cd hello

先檢查、補裝相依套件。

bundle package; bundle install

在本地端測試 rails 專案是否可以順利執行。

rails server

使用瀏覽器打開 http://localhost:3000/ 有看到畫面就是成功,回到終端機用 ctrl+c 把測試伺服器結束。

再來就是要把專案「推」向雲端。

vmc push

它會出現一些 Y 或 N 的問題,通常用預設值就搞定。其中 Application Name 是發佈到雲端之後的應用程式名稱,會影響網址,例如命名為 hello 發佈後就是: http://hello.XXX.cloudfoundry.me/ 。

如果你也跟我一樣僥倖發佈成功,畫面應該是長這樣:

vmc push

那...如果發佈失敗怎麼辦?

還記得李教授曾經說過:死了就上雲端啦!

如果在本地測試成功的專案,發佈到雲端失敗,剛開始還真的覺得死不瞑目吶!!!

現階段 vmc push 之後如果失敗,並不會顯示什麼有用的錯誤訊息,但是在遠(雲)端主機上會留下 log 檔,使用 vmc files 指令可以查看 log 記錄內容。

vmc files hello

輸出:
app/                                         -
logs/                                        -

vmc files hello logs/

輸出:
migration.log                             201B
staging.log                              1006B
stderr.log                                185B
stdout.log                                149B

vmc files hello logs/stderr.log

輸出:
[2011-08-27 11:19:18] INFO  WEBrick 1.3.1
[2011-08-27 11:19:18] INFO  ruby 1.8.7 (2010-08-16) [x86_64-linux]
[2011-08-27 11:19:18] INFO  WEBrick::HTTPServer#start: pid=10276 port=38902

有 log 訊息可以參考,應該比較瞑目了。

快快樂樂馬後炮:如果沒有良好且盡可能完整的測試,就把專案發佈到雲端,出錯要找問題其實相當麻煩。因此 Test-Driven Development 就更顯得重要了。如果軟體專案要為雲端做好準備,請記得測試、要測試、要先寫測試,否則很有可能...專案死了以後它自己上雲端了。

2011年8月26日

Micro Cloud Foundry 1.0 發佈

Cloud Foundry 是由 VMWare 建立的開放源碼雲端平台服務(PaaS),它支援的應用程式框架包含 Spring、Grails、Ruby on Rails、Node.js 及 Scala 等。

已經申請註冊的朋友,近期會收到邀請函及密碼。

註冊 http://www.cloudfoundry.com/signup

這幾天又有新的進展,Micro Cloud Foundry 正式開放下載,版本 1.0 的檔案名稱是 micro-1.0.0.tgz。

設定及下載 http://cloudfoundry.com/micro

使用 E-mail 帳號及邀請函提供的密碼,可以登入 Micro 的下載頁面,此頁面也提供 domain names 管理設定,第一次使用必須先申請一組 domain,其格式如下。

你的服務名稱.cloudfoundry.me

當 domain 建立完成,會產生一組 configuration token,這是稍候設定私有雲端服務器必須填輸入的項目。

接著取得 micro-1.0.0.tgz 檔案。

解開後其實就是 VMWare 虛擬機器的 .vmx / .vmdk 檔,Micro Cloud Foundry 採用虛擬機器的方式發佈,可以幫開發者省去伺服器安裝設定的麻煩。依照官方的建議,此虛擬機器可以用 VMware Player / VMware Workstation / VMware Fusion (Mac) 執行。

因為東家是 VMWare,當然會建議使用自家的虛擬機器產品。但我不想買也不想安裝 VMWare Fusion,所以試著用免費的 VirtualBox 掛載 Micro Cloud Foundry。

使用 VirtualBox 建立新的虛擬機器,作業系統類型選擇 Ubuntu / 64bit,其餘皆照預設。在虛擬磁碟設定將選擇外部的 .vmdk ,網路則依照實際情況調整。
使用 VirtualBox 也能執行 Micro Cloud Foundry (買不起 VMWare Fusion 只好...)

用 VirtualBox 建立好虛擬機器,直接開啓後,就能順利執行 Micro Cloud Foundry。

雖然它是採用 Linux 作業系統為基礎,但是開機完成後,並不會給予一般 Linux 系統的登入提示。而是顯示 Micro Cloud Foundry 專屬設定選單。第一次執行,必須選 1. configure 開始進行一連串設定,最重要的部份就是剛才說明過的 configuration token,透過這組代碼,可以讓申請的 domain 對映到機器實體 IP 位址。
Micro Cloud Foundry 的設定畫面(範例)

建立好私有雲端服務器,接下來要幹嘛呢?

當然就是準備開發應用程式,透過 vmc 或 STS 發佈到雲端服務器,建議從這篇開始閱讀。

2011年8月25日

MacBook Pro (2010 Mid) 自助升級8GB記憶體

上個星期參加 COSCUP 2011 大會,在聽完 Justin Lee 大大的 Titanium 簡報後,我馬上拿出 MacBook Pro 安裝 Titanium Studio,安裝過程很順利,最後也能將測試程式發佈到 Android 模擬器。

但是看到 Android 模擬器龜速運行的囧況,讓我開始悶了。

因為沒有想過要把 Mac 筆電當作開發用途的機器,當初只買了最低階的 13" MBP,處理器是該死的 Core 2 Duo P8600,時脈僅 2.4GHz。為什麼該死呢?因為我才買完過沒幾個月,就出現2011新版MBP,最低階配備i5處理器,而且售價還便宜好幾千!真是欲哭無淚啊!

原本真的沒想過會拿MBP來跑一些吃重的軟體,平常只拿它處理照片、玩Photoshop,另外就是幫我的 iPod Touch / iPad 同步音樂和電子書。

可是後來覺得在 Mac 系統寫程式真是太愉快了!漸漸地它開始負擔一些 Coding 工作。

我很想買一台工作站級的 ThinkPad W520 或 Dell M4600,把記憶體升級到充裕的 16GB,但一出手就是70~80張小朋友,可不是想買就能馬上買,所以直到最近還是用 MBP + VirtualBox 進行一些軟體開發工作。

一直讓我很困擾的是這台 MBP 內建僅 4GB 記憶體,跑一個 .NET 開發的 VM 至少就要耗掉 2GB 以上,更不用說同時還開個吃重的 Office 2011,就連 Chrome / Firefox 瀏覽器也經常吃掉大口記憶體。

在 COSCUP 遇到同梯 BCSE 大,他勸敗我趁著現在記憶體便宜,乾脆把 MBP 升級 8GB,我一直不覺得 8GB 會夠用,畢竟平常用桌機至少都是 16GB 以上的記憶體配置。

但是從 COSCUP 回家之後,一直在想其實外出長時間跑吃重工作的機會似乎也不是那麼頻繁,雖然心裡還是覺得 P8600 這款上上一代處理器,不太有什麼搞頭,但是把記憶體升級到 8GB 至少要跑 VM 就會輕鬆一些,至少可以讓我撐到年底或明年初吧!再等一段時間,也許就能用比較不痛的價格買到夢中的 i7-2820QM + 16GB + SSD ...

在升級記憶體之前,我先將 Mac OS X 切換為 64bit 模式,使用的指令如下。

sudo systemsetup -setkernelbootarchitecture x86_64

接著就上歪拍下訂兩條 MacBook 專用記憶體。

由於傳說中這一代的 MBP 很挑記憶體,我擔心買到不相容或不穩定的顆粒,找了一下發現 Kingston 有一款出廠經過測試的 Apple 專用記憶體,價格和未標示專用差沒多少錢。區分為 1066MHz / 1333MHz 兩種時脈。找了 Kingston 的網頁說明,我最後決定買官方建議的 1066MHz 版本(價格相同)。

Apple MacBook Pro (DDR3) 13-inch (Mid 2010)

Kingston 4GB APPLE DDR3

Apple Memory Upgrades - Compatibility Guaranteed 有保證才安心

準備拆封

幫顆粒拍個特寫

黑色的塑膠盒,留下來可以裝拆下的記憶體

用精密螺絲起子,標示「0」的那支恰恰好

拆螺絲要膽大心細,畢竟MBP背蓋沒有卡榫,崩牙就糟糕了
Apple讓人愛不釋手的地方,連看不見的地方都很講究。手指記得觸摸光碟機旁的金屬部份,釋放靜電。

這是舊的 2GB 記憶體

這個容量不足而且只有 5400RPM 的 250GB 硬碟,就是下一個要升級汰換的項目

扳開兩側的塑膠扣,拆掉上層的記憶體,接著換下層

拆下的記憶體,先放防潮箱等待有緣人出價了
記憶體升級完成,從活動監視器看到總容量為7.75GB

自己升級 MacBook Pro 的記憶體步驟非常簡單,不過拆裝螺絲必須特別小心施力,因為很多網友都有慘痛的經驗分享。用對螺絲起子(我特別找了組日製的精密起子),要轉開並不難,但是把螺絲裝回去時,就必須注意剛好鎖緊即可。

2011年8月22日

程式設計師小心別被框架給「框」住了...

Are Frameworks Making Developers Dumb? 這是一位印度軟體工程師 K. Siva Prasad Reddy 撰寫的文章,內容有關他面試「五年資歷 Java 開發人員」的觀察,結論是程式設計師應該「內外兼修」。

現在有太多的程式設計師只練「外功」,因此履歷表寫起來洋洋灑灑。一位資深 Java 軟體開發工作的求職者,不難發現他說自己會 Spring 、 Hibernate 還懂 Web Services 等等等。

一位求職者說,他最近的專案用了 Spring,瞭解如何在 XML 中設定 Beans,也知道 Dependency Injection 這個 design pattern。但這位求職者並沒有真正清楚他為何需要這麼做,他認為透過 DI 可以在需求改變時,不需要變動 Java 類別和重新編譯,只要修改 XML 設定即可。

儘管不必變動和編譯 Java 類別,但 XML 還是必須要修改,99%的情況下仍必須用 Ant 重新打包 WAR 或 EAR 檔案。對整個專案開發流程來說,用 Spring 到底能幫助些什麼?這位求職者只說 design pattern 建議這麼做。

盡信書不如無書

當然,這位求職者的下場就是:「我們的人資部門會再跟您回覆。」(意思就是:謝謝再聯絡!)

另一位求職的老兄也很高竿,他最近做的專案用上 Spring 、 Hibernate 以及 REST Web Services。既然都這樣說了,面試時當然會被問到,是不是能解釋 RESTful 架構呢?

這位厲害的求職老兄,對語法夠熟悉,不需要開發工具的幫忙,能回答「@RequestMapping(value="/url", method="POST")」這行 Annotation。可是他似乎聽不懂面試官想問的是「Concept」不是「Syntax」。

於是他又被問到:「用 Hibernate 帶來什麼好處呢?」

這位求職者已經用 Hibernate 兩年,很清楚地說明:「用了 Hibernate 我們不用寫任何東西去跟資料庫互動,Hibernate 會把這些事情搞定。」

面試官:「那 Hibernate 要怎麼知道你的專案需求呢?」

求職者:「如果我們用 Hibernate 它就會幫忙處理資料庫儲存、修改或取得資料。」

面試官:「呃...呃... OK... 你平常是否閱讀任何技術相關部落格呢?」

求職者:「當然啦!這就是我深入學習 Hibernate 的方法!」

面試官:「非常好!討論愉快!我們的人資部門會再跟您回覆!」

將場景拉回台灣的軟體開發現場,如果你問 Java 職缺的求職者懂不懂:「Spring、Hibernate 或 Web Services。」若求職者都認為自己瞭解,而且面試官「自己也真的懂」,那很好,至少貴公司不是拿長矛對抗船堅炮利。

但如果要發展成「卓越」的軟體公司或開發團隊,絕對不能只練「外功」而捨棄「內功」。

我們先假設最低為 B 級,就是 Java 軟體開發者,知道怎麼開發 JSP 和 Servlet;但是根本搞不清楚 Scriptless,也不知道自己用的 Tag 就是 JSTL,更不用說什麼 MVC 架構。這種情況下,整個專案的程式碼像是從書本範例抄下來。但只要耗費足夠的人月(man-month),還是可以讓整個專案能動。

好一點的就列為 B+ 級,可能某位高階主管或前人(先烈)決定採用 Struts 等,接下來的十年、二十年大家就照著這遊戲規則走,即使這些框架逐漸令開發者詬病,但沒人在乎或不需要管這件事。

如果一個 Java 軟體開發團隊,擁有足夠的熱誠,就會持續學習研究新技術。例如清楚知道 Spring 帶來的好處,也知道如何利用 Spring 開發架構更好的 J2EE 應用,在重構或開發新專案時,使用 Hibernate 設計 ORM 架構,已經算是 A 級,能夠善用合適的新技術及選擇更好的架構。

學習新技術並非追逐流行,也沒人希望用不成熟的東西加速專案滅亡。而是在 IT 的世界裡,一切都還太年輕,現在看似美好的架構,遲早會變成過時的包袱。因此軟體開發者必須有決心,在從事這個行業時,不斷更新自己的知識庫。

例如 RoR (Ruby-on-Rails) 對軟體開發者來說,是個很棒的禮物!它很棒的原因,並非你真的能用它取代現有的技術,雖然有許多 RoR 的開發者真的做出很棒的應用,但那不見得適合你的公司。但是它清楚示範了 MVC 架構如何幫助軟體專案開發,如果你對 J2EE 的架構熟悉,就會更清楚知道 JSP/Servlet 也可以設計良好的 View/Controller 分離。

優秀的 Java 開發團隊,可能早就使用 Groovy 簡化專案的建置及測試流程,也正研究著如何利用 Scala 開發專案,不必改變現有的 JVM 平台及專案,就能利用更棒的程式語言進行開發。還有許多 Java EE 開發框架,如 Grails 、 Play 及 Lift 等,能提供開發者幫助。

毫無疑問,在 Java 的世界中,Spring 及 Hibernate 早已成為主流技術。瞭解這些技術,並適當地運用在專案開發,對資深 Java EE 開發者來說,幾乎是必修學分。

但是從 A 到 A+ 是一條漫長又艱苦的路。

不管採用什麼技術,其實真正需要運用在專案的,可能只有少數的20%,甚至更少。所以當一位開發者用 Hibernate 開發專案 2 年,很可能只是當初用 2 星期或 2 個月時間,翻了幾頁書或上網 copy&paste 幾個範例,之後就重覆使用長達 2 年之久,只要不出現問題,幾乎不需要多研究些什麼。

每次被問到會不會某項技術,大多數只能說「有寫過」、「有用過」。因為大部分開發專案需要的技術,甚至大部分問題的解決方案,只要掌握 Google 搜尋的技巧,至少就能解決 80% 以上。對於工作來說,必須用最少的時間將問題解決,為了討生活只能如此。

知道如何善用 Google 搜尋的工作者,心裡都明白一件事,有很多工作需要的技術,其實只要關鍵字組合得好,認真找來幾篇資料,也許是網誌或教學文件,或者是官方的幾篇指南,認真吸收消化一下,不花多少時間就能滿足工作需要。甚至在高手雲集的公司,只要肯問、人緣別太差,就能得到答案。

但是在工作之外,若成為「程式設計師」如果是志業,不只是職業,就必須對自己的專業再要求更多一點,對學習的渴望必須比老闆對你工作的要求更高一些。

Spring 再好,它還是用 Java 寫成。Hibernate 再棒,它還是用 JDBC 存取資料庫。MVC 框架再優雅,底層還是運用 JSP/Servlet 等這些 Java EE 標準的機制。

如果一位「資深」的 Java 程式設計師,在過去 3-5 年間在專案中應用這些技術,可是不深入瞭解這些框架解決了甚麼問題、用什麼方法實作、底層如何運作以及如何擴充或調校,就很難有真正屬於自己的 Know-how。

一知半解比無知更可怕。

從事軟體開發的工作,不管做幾年或晉升什麼位階,必須捨棄「老鳥」心態,永遠把自己當作是「菜鳥」。老鳥總是認為自己接觸 XXX 技術已經 N 年,反正遇到 X 問題就是用 Y 方法解決就對了!而菜鳥總是想知道 X 問題有沒有更好的 Y' 解法,遇到 X' 問題時又該怎麼辦,而其他鳥(不管老鳥或菜鳥),也會樂於告訴你更多。

補充:關於 Hibernate 該如何回答才不會被打槍?!

老實說,我也覺得那位求職者的回答是「正解」,講的並「沒錯」。但是原文作者對面試結果不甚滿意,我的猜測是:

(1) 面試時不能啞(dumb)

面試官拋出一道問題,並非就是要針對該問題回答「標準答案」。雖然原文是發生在印度的故事,但是拿到台灣應該也是差不多狀況,病態的教育制度下,可能相當多人都習慣:用標準答案回答問題。 (看看那些研究所及公職考試的教科書就知道嚴重到什麼程度)

如果今天面試的程序,是給每位面試者一張試卷:

簡答第一題:請說明 Hibernate 的主要用途?
簡答第二題:請列出 Hibernate 具有哪三項優點?
申論第一題:請說明先前專案使用 Hibernate 時遇到哪些困難?
                        ‧‧‧

並且依據回答與標準答案的差異,給予 0-100 的評分標準,相信很多人都能拿高分。 (不久後就會出現一本面試教戰大全)

但實際上企業不可能這樣找人才,因為「軟實力」也是很重要的考量因素。

也許求職者真的徹底瞭解關於 Hibernate 的一切,但面試官怎麼會知道呢?

面試官提出一個問題,表示對求職者履歷寫的某項 skill 感興趣,只是點出一個「方向」,讓求職者可以往這個方向多 promote 自己。因為在求職面試時,自己就是一個產品,能把自己成功行銷是很重要的關鍵。講出來的答案固然重要,但是「熱誠」、「思考邏輯」及「談吐舉止」都會影響面試官對這個人的看法。

用 Hibernate 帶來的一些優點,是很顯而易見的答案,在書本前幾章一定都有介紹,通常訓練 3-5 的月的新人也能瞭解與感受。

BUT...

對於一個已經從事 Java 開發 3-5 年的人來說,應該要有很多「好玩、有趣、酷炫」的故事可以講吧?

假設今天要賣的產品不是自己,而是一支神奇拖把。

在人來人往的夜市,路過的人不下千個,每位都可能變成你的顧客。他們對招牌上寫的「快速清潔溜溜、脫地毫不費力」感興趣,願意浪費一分鐘的逛街時間,聽看看你能講些什麼。

你賣的是拖把,你有五年的拖把行銷專業訓練,對拖把的構造、用途、使用方法及行銷話術滾瓜爛熟,公司也編寫五大本拖把神奇功效指南;但同時你也有五年做家事、每天花五小時拖地的實戰經驗。

你有兩種選擇:(1)像工程師一樣正確地告訴顧客這拖把有哪五大功能;(2)像大賣場歐巴桑一樣讓顧客感受到這支拖把可以從此改變你的人生。

回到 Hibernate 的主題。

也許可以和面試官分享,實戰 Hibernate 時遇到最大的難題及用什麼方法解決,或者知道什麼做法可以讓 Hibernate 架構的系統效率更高,如果新公司尚未導入 Hibernate,也可以談如何用 Hibernate 改善公司既有的系統。

把自己當產品行銷,是讓新公司相信你帶來的是過去 3-5 年的寶貴經驗,而不是書本上 3-5 頁就交代完的內容。

當然也可能是遇到一位沉默寡言的宅宅工程師當面試官,但如果這是一份自己想要的工作,就必須認知「機會」是別人願意施捨、自己努力爭取才能得到,不能總是等對方發球才回應,因為 3-5 句話就結束的一次面談,不可能讓面試官真正認識你以及感受到你對工作及專業的熱情。

台灣有相當多優秀的技術人才,可是需要 promote 自己時,千萬別像文中這位印度的求職者一樣「啞」了。

(2) 技術學習是無止盡的漫漫長路

先撇開那些根本不想認真學習技術,只想著要早日從一線開發人員變主管的「熱血缺乏偽程式設計師」不談。因為有些人在不太情願地幹了 3-5 年 Java 開發工作後,就想要著要變成 SA / PM 以求升遷加薪,這些人不會帶著 3-5 年 Programming 經驗再去找一個資深的 Programming 工作,除非他們升級失敗了。

對一位熱情洋溢的 Passionate Programmer 來說,也許前 3-5 月剛進公司接觸 Hibernate 開發,就只熟悉 Hibernate 的語法與 ORM 的方法,熟悉工作所需要的技能是必要也是應該。但是對於 3-5 年的資深 Java 開發者來說,如果還是跟 3-5 個月差異不大,那就需要拖出去鞭打五十大板了。

一位熟悉 Hibernate / HQL / ORM 的工程師,卻不熟 JDBC / SQL / RDBMS 是非常危險的事!簡直比從火星跑到地球更危險!

為什麼要 ORM ?是因為我們用 OOA / OOD / OOP 方式開發軟體,如果不是如此,又為何要 ORM?有許多公司開發軟體的方式,可能連OO的概念都很缺乏,如果只是為了 Hibernate 存取資料庫語法好寫就用它,似乎弄亂了次序。

資料庫儲存的原理,多年來並沒有太大改變,即使 NOSQL 興起也沒有讓 RDBMS 立刻下台。瞭解 ORM 的方法很重要,可是只要 Hibernate 最後處理資料時,仍然是對 RDBMS 操作,就不能只學 Hibernate。

舉例來說,在不同的資料庫系統,原生的分頁(Pagging Results)做法也不相同,以 Oracle 來說,分頁使用的語法甚至大幅影響查詢時間。但是 Hibernate 提供 setFirstResult() 、 setMaxResults() 方法,讓查詢結果可以簡單的做分頁。

此時就面臨原文作者問到的問題:「Hibernate 怎麼知道你的專案需求呢?」

當一個資料表在開發、上線測試的一個月內,也許只有不超過1萬筆資料,但未來半年內可能快速增加到1億筆。如果不清楚或不知道如何控制 Hibernate 產生的資料庫 Schema 結構,不清楚實際在資料庫中的索引及關聯如何建立,也不明白 Hibernate 在查詢資料時,進行分頁、排序等最後所產生的 SQL 語法,就像是在系統中埋入定時炸彈。

也許有人會說,用簡潔好開發的語法,讓系統早日上線,之後再針對效能瓶頸逐步改善就好。其實這就是 3-5 年的資深開發者應該有的經歷,除非系統從來沒上線也沒人用,否則再持續改善、重構的過程中,勢必會更深入瞭解底層的運作機制、原理,也會更廣泛瞭解有關的技術及其他解決方案,在深度、廣度都有著墨。

不僅要追求深度、廣度,對 3-5 年的資深開發者來說,若想在軟體開發的漫漫長路走得更遠,另一個需要培養的是「高度」。

即使已經深入鑽研、廣泛學習很多技術,但是仍有可能「見樹不見林」。在一片樹海裡,活蹦亂跳的松鼠很有活力,擁有高超的爬樹技能,每天爬上爬下,見識過千百棵樹,但牠可能窮其一生也不知道這整片樹林長什麼樣子。一隻老鷹乘著上升氣流翱翔,對抗地心引力來到千尺高空,牠只需要飛個幾次,就知道河水如何流經這片樹林、那些地方已經遭到人類濫墾。

以原文提到的面試情形,求職者如果站在 Architect 的「高度」談論問題,講到細節時又能展現多年鑽研成就的「深度」,同時又懂其他技術、不同解決方案甚至跨領域的知識,展現出「廣度」,也許就不會成為面試官PO文抱怨的題材了。

順便推薦一本新書《學徒模式:優秀軟體開發者的養成之路》。如果你也把軟體開發當作志業;而不是短暫的職業。你不在乎是否能加薪升遷;只在乎是否可以一輩子從事自己熱愛的程式設計。也許可以從書中找到一些職涯規劃、維持熱情的方法。

2011年8月14日

Wheat (NodeJS blog engine) 安裝筆記,以 Ubuntu 11.04 為例

Wheat 是一套網誌引擎(blog engine),它以 NodeJS 開發,採用 Markdown 格式撰寫文件。實際的應用範例,可以參考「How to Node」。

本安裝筆記以 Ubuntu 11.04 為例,Ubuntu Linux 是目前開發測試 NodeJS 相當便利的選擇之一。

安裝 Wheat 前,先確認系統已經裝好 NodeJS 開發環境。(graphviz 非必要安裝項目)
sudo apt-get install build-essential graphviz nodejs

使用 NodeJS 的 npm 模組管理工具,將 wheat 及相關的套件安裝。
npm install spark
npm install creationix
npm install stack
npm install wheat

將 howtonode.org 的資料 clone 一份,作為網站資料的基礎。
cd ~
git clone https://github.com/creationix/howtonode.org

切換到 howtonode.org 資料夾,編輯 server.js 將 HTTP PORT 更換為自訂的埠號。
cd howtonode.org
vim server/server.js

啓動 wheat 的服務。
node server/server.js

資料夾用途說明:
  • articles 儲存文件(markdown格式)
  • authors 作者清單(markdown格式)
  • skin 網站樣板(haml格式)

2011年8月11日

使用 apt-get 安裝 Grails 以 Ubuntu 11.04 Natty 為例

Grails 為 SpringSource 的開放源碼專案,它受到 Ruby on Rails 敏捷的開發方式啟發,實現了 MVC 架構,並提供大量的 Plug-ins 可供專案取用,目標是成為使用 Java EE 開發 Web 2.0 網站應用的框架。

這段影片可以幫助您瞭解 Grails 的開發方式。


使用 Java EE 的開發框架,最容易讓初學者詬病的地方,就是安裝基本開發環境,也有不少瑣碎的設定。Grails 的安裝雖然不難,只要在裝有 JDK 的作業系統下,解壓縮下載的 Grails 檔案,設定好相關 PATH 就可以運作。

但如果您使用 Ubuntu Linux,那過程就可以更加簡單!

以下的指令說明,是以 Ubuntu Linux 11.04 為例。

首先,使用以下的指令,增加 apt repository 的設定(Ubuntu的PPA套件庫)。
sudo add-apt-repository ppa:groovy-dev/grails
sudo apt-get update

使用 apt-get install 即可完成 Grails 的安裝。
sudo apt-get install grails

在 Ubuntu 系統可以同時安裝不同版本的 Grails,使用 apt-cache search 可以查詢哪些 Grails 版本可供安裝。
apt-cache search grails

輸出:
grails-1.3.1 - A rapid web development platform built on Groovy
grails-1.3.2 - A rapid web development platform built on Groovy
grails-1.3.0 - A rapid web development platform built on Groovy
grails-2.0.0 - A rapid web development platform built on Groovy
grails-1.3.7 - A rapid web development platform built on Groovy
grails-1.4.0 - A rapid web development platform built on Groovy
grails-bash-completion - Provides bash autocompletion for Grails, a rapid web development platform built on Groovy
grails - A rapid web development platform built on Groovy
grails-1.2.5 - A rapid web development platform built on Groovy


如果要加裝 Grails 2.0.0 (目前為 Milestone 測試版),則加上版號。
sudo apt-get install grails-2.0.0

也可以安裝較早的舊版本。
sudo apt-get install grails-1.2.5

使用 update-alternatives 可以切換 Grails 的不同版本。
sudo update-alternatives --config grails

輸出:
There are 2 choices for the alternative grails (providing /usr/bin/grails).


  Selection    Path                                   優先級  Status
------------------------------------------------------------
* 0            /usr/share/grails/1.3.7/bin/grails      50        auto mode
  1            /usr/share/grails/1.3.7/bin/grails      50        manual mode
  2            /usr/share/grails/2.0.0.M1/bin/grails   1         manual mode


Press enter to keep the current choice[*], or type selection number: 

參照系統已安裝的 Grails 版本清單,輸入數字就可以完成切換。

輸入 grails 就可以檢視目前的版本編號。
grails

輸出:
Welcome to Grails 1.3.7 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: /usr/share/grails/1.3.7

以往在效能不彰的電腦(尤其是筆電),開發 Java EE 專案相當痛苦,其執行速度之慢,真是每次 Deploy & Test 的時間都足夠泡杯咖啡看部短片。

以 Grails 的開發來說,大部分的專案開發過程的操作,都可以使用 Command-Line 的指令完成。例如「grails create-controller name」,就可以建立 MVC 架構中的控制器程式。並不需要依賴肥大的開發環境,而且程式碼撰寫也像 PHP / Ruby 之類的 Scripting Language 同樣簡單(雖然有些程式仍需要經過編譯才執行)。

因此在開發 Grails 的環境,只需要一(或多)個終端機畫面,搭配 Ubuntu Gnome 內建的 Gedit 文字編輯器,就可以節省不少系統效能的消耗(肥大的整合開發環境是記憶體殺手)。關於 Grails 搭配 Gedit 編輯器的客製化設定,可以參考這篇教學

2011年8月9日

使用西聯快匯輕鬆領取 Google AdSense 廣告佣金收入

在經營的網站刊登 Google AdSense 廣告,是增加額外收入、貼補架站開銷的一種方法。只要累積達美金 100 元,就可以結算取款。

但是身在台灣的網站經營者,要如何取得 Google 公司的匯款呢?

「西聯快匯」是 AdSense 最便捷的一種取款方式!在 Google 付款成立日的隔天,就可以到鄰近的銀行櫃台取款。

使用西聯快匯,必須在 AdSense 的後台管理頁面,選擇設定「西聯快匯」。

接著只要簡單地確認英文姓名是否拼錯,就可以完成這項變更!

當累積廣告收入達到 100 美元,在「付款」的月報表就會出現「付款已核發」,點選詳情後,會出現 MTCN 等密碼資料。底下的「盈餘表」可以產生方便列印的報表,將這份資料印出來。

印出來的資料將包含 付款日期、MTCN、以美金(USD)顯示的金額,以及匯款人資訊(Google Inc.)。將這份資料帶著,找一家鄰近有提供西聯快匯服務的銀行。

並非每家分行都有西聯服務,必須先上網確認,例如:

其它家提供西聯匯款服務的銀行還有:
  • 彰化銀行
  • 台新銀行
  • 京城銀行

國泰世華的西聯快匯只服務到下午 3 點,並非三點半。

以京城銀行來說,西聯服務設有專用櫃台,取款時是以當日公告匯率,換算成台幣現值,填妥表格(英文姓名、匯款人、美金金額)並出示身分證,就可以拿到一張傳票,到一般業務櫃台領取台幣現鈔!大約只要不到20分鐘時間。

經過詢問之後,京城銀行並沒有提供將西聯的美金匯款直接存入外幣帳戶的服務,只能以台幣提領。

雖然我已經開好國泰世華的外幣帳戶,但是最近比較需要現金,尚未向國泰世華求證是否可以將西聯匯款直接以美金存進外幣帳戶,在搜尋結果中看起來是可以這麼做。如果用外幣帳戶存 Google AdSense 廣告佣金,就可以選擇在美元兌換台幣比較划算的時候,才換成台幣,多賺一點 : ) 不過現在的美元一直貶,短線後勢不看好就是了...

Miu Term 讓 iPhone / iPad 也能玩 PTT BBS

雖然 iPhone / iPad 內建的 Safari 瀏覽器,用來上網找資料很方便(除了用 Flash 製作的網頁!!);但是台灣的廣大鄉民同胞們,還是離不開舊愛「批踢踢實業坊」阿!

PTT (批踢踢實業坊) telnet://ptt.cc/

畢竟 PTT 臥虎藏龍,各種專業的論壇都有資深玩家持續在灌溉,在這邊發問可以比知識痂更快得到解答,被網友肯定推文,或是受到砲火猛烈的攻擊。其中有些熱門討論板,更是台灣新聞媒體的第一手「消息來源」: )

在 PC 上大家應該都是用 PCMan 這套連線工具:

PCMan X 的 PTT 登入畫面

可是在 iPhone / iPod Touch / iPad 並沒有 PCMan App 可以下載阿!

本文要介紹的 Miu Term ,就是一款讓你的 i 行動裝置也能方便上 BBS 的軟體。

先來看看 Miu Term 的官方介紹:

Miu Term 的设计理念是能保证单手持机+单指浏览操作(基本上就是大拇指)。双手操作只有在使用键盘输入的时候才需要。因为 iPhone 系列并没有物理键盘,在操作上要求有区别于电脑上的设计。从理论上说,就是把键盘导航和键盘输入区分开,在 iPhone 的触摸屏上用手势动作和方便的快捷键来实现 bbs 导航,iPhone键盘只在输入的时候开启。在实际的实现中,Miu Term 有下面几点比较得意(这个词国语粤语皆可)的设计:
i) 快速的连续的精确的行定位(Jump-to-line)。
ii) 可自定义的快捷键面板 -- 基本保证浏览的时候不需要使用键盘;快捷键可附加动作(如 ^P + 切换键盘);快捷键面板采用分页设计 -- 方便记忆键的位置。
iii) 10多种(稀奇古怪的)单指手势 -- 除单击和长按为系统保留外,可自定义其他所有手势的触发命令(如"右划后上划"为 " ’=‘ + 自动追焦 ","右划后下划"为 " ’\‘ + 自动追焦 " [话说作者对这两个手势的设定非常得意,为啥?经常上bbs的你明白的。。。], "双击后下划" 为 '$' );在记忆自己设置的手势命令的同时你可以忘记键盘了。。。
iv) 放大模式下的透明触控手势框 -- 不影响阅读的同时,也方便用户在拖拽页面和作手势之间无缝(或者说自然的)切换。
v) 长按URL 浏览。这个有点不够分量,前辈们都已经各自实现了, 就当是功能介绍吧。
vi) 在键盘开启时,屏幕自动追焦(简单的说就是显示光标所在部分)。放大模式下,追焦的功能部分开启。
vii) 英文键盘输入直接上屏,使用中文输入法(包括拼音,手写,注音)时输入条会自动出现和消失。
viii) v1.2.0 添加了全文阅读模式,显著提升了放大模式下的阅读体验

Miu Term 一般版本是給 iPhone / iPod Touch 使用,標註 HD 的版本則是給大螢幕的 iPad 專用,HD 版本也針對。這兩套 App 目前的定價都是 $2.99 美金。

在 Apple App Store 購買 Miu Term:

Miu Term (iPhone) 說明短片


Miu Term HD (iPad) 說明短片



大部份的網友對 Miu Term 都是給予肯定的正面評價,於是我就放心地購買了 HD 版本(手邊沒有 iPhone 可以測試 :X)。

簡單地測試一下,發現 Miu Term 拿來上 BBS 真的很順手,除了輸入資料在平板裝置本來就不太方便外,閱讀文章的功能相當順手,就像在操作網頁一樣容易。

以下的螢幕擷圖,是用 iPad 2 為您展示 Miu Term HD 的 BBS 連線功能!

Miu Term 內建 水木社區 / 批踢踢 兩個常用的 BBS 站台

BBS (批踢踢)登入畫面

Miu Term 內建網頁瀏覽功能,在超連結文字(標底線)長按後,可以直接開啓 BBS 文章附帶的連結,免去在不同 App 之間切換的困擾

Miu Term 支援同時登入多個 BBS 站台的功能

輸入資料必須使用螢幕小鍵盤

在 BBS 選單畫面上,只要輕觸就會開啓一個選項。手指在螢幕上向左或向右滑動,可以進入或離開功能。

進入八卦板的歡迎畫面

用 iPad 的大螢幕瀏覽 BBS 隨時取得來自鄉民的一手消息,在多頁的文章列表及檢視時,手指向上或向下滑動,可以向下或向上捲動

2011年8月5日

TuneIn 跨平台免費聽廣播,收錄超過5萬個全球各地電台

TuneIn 超過5萬個全球電台免費線上收聽
相信各位喜歡聽廣播的朋友,都有和我同樣的遭遇,就是曾經找到一些好用的免費廣播收聽軟體,可以支援成千上百個電台收聽;可是用了一陣子之後,卻發現怎麼一堆電台都不能聽了,也許更新軟體或電台清單之後,又可以繼續使用,過了不久卻發現這個軟體已經停止開發,必須找下一套好用的軟體。

雖然許多音樂播放軟體,都有內建電台播放功能,電台數量看起來也很多,但不見得能找到想聽的電台。

直到發現 TuneIn 這個相當棒的線上廣播平台,找電台、聽廣播,突然變成一件輕鬆又簡單的事。

TuneIn 目前的員工約20位,位於美國加州,是一家立志成為全球線上廣播領導品牌的公司。

TuneIn 辦公室一隅(圖片來源)
TuneIn 提供強大的搜尋功能,關鍵字不僅能用電台名稱,還可以輸入節目名稱、歌手等。

比如你想聽 Lady Gaga,只要在搜尋列輸入 Lady Gaga,清單中就會顯示那些正在播放 Lady Gaga 音樂的電台。


當然也可以輸入如「中廣」、「ICRT」、「KISS RADIO TAIWAN」、「飛碟」等關鍵字,都能準確搜尋到你想要聽得電台。

在多數的作業系統(Windows, Linux, Mac OS X)及瀏覽器(IE, Firefox, Chrome, ...),都可以使用 TuneIn 線上直接「收聽」的功能。以下的這張螢幕截圖,就是在 Ubuntu Linux 中使用 Chromium 收聽的畫面,其內嵌的播放器是 VLC Media Player。


TuneIn 厲害的不僅是方便的線上收聽,如果你擁有智慧型手機或平板電腦,就可以安裝 TuneIn Radio 軟體,讓你的行動裝置變成網路電台播放器。TuneIn 支援的行動裝置類型包含市售常見的:iPhone/iPod/iPad、Android、Blackberry、Palm、Samsung Bada、Windows Phone等。


因為 TuneIn 是「線上收聽」,就是必須搭配 3G 行動上網或 WIFI 無線網路,才能在行動裝置(智慧型手機)收聽廣播。

我在 HTC Desire 手機上安裝 TuneIn Radio,在外出、搭車時,就可以接上耳機,用 3G 網路收聽線上廣播。在家中則是用大螢幕的 iPad 平板,也能安裝 TuneIn Radio,放在書桌上、掛在牆上或是擺在床頭,就能變成一台可以收聽線上廣播的音響。

在角落找個地方擺放行動裝置,就能用 TuneIn 讓整個空間充滿音樂

TuneIn Radio 提供 Location 的電台檢索方式,它先根據目前所在位置為中心,在 Google 地圖上標示鄰近提供電台服務的地區,例如點選「台中」後,就會顯示被歸類於台中地區的電台清單。這個服務可以幫助聽眾,探索鄰近的在地電台。
iPad + TuneIn Radio 從地尋找電台
TuneIn 提供一項很貼心的「計時器」功能,所以可以把它擺在床頭,用「睡眠計時器(Sleep timer)」設定多少分鐘時間,就可以安心地聽著廣播音樂入睡,而不用擔心睡著後忘記關閉播放器。
iPad + TuneIn Radio 設定計時器
除了聽音樂、新聞或談話節目,當作休閒或工作時的娛樂,TuneIn 也很適合當作語言學習的聽力練習工具,例如搜尋「BBC」,就會有數十個 BBC 廣播頻道可以收聽。對於美語的學習者,則可以選擇「VOA English」這個頻道,它是美國之音(Voice of America)製作的節目,對象是全球的聽眾,特別適合想練習聽力的學習者。

如果付費 $0.99 美金,購買 TuneIn Radio Pro 版本,除了沒有廣告外,還提供「錄音」功能,可以把喜歡的節目錄製保存下來,讓自己日後可以重複聽。此外,這個錄音的功能,還可以和定時功能結合,在指定的時間自動幫你錄製該時段的廣播節目。

除了可以安裝到行動裝置,有許多影音產品都內建 TuneIn 的功能,包括客廳的電視機和音響播放主機。如果你的車用音響支援 iPod Dock,就可以連接 iPod/iPhone/iPad,讓行車時也能收聽世界各地的電台節目。關於更多現在及未來 TuneIn 的應用發展,可以參考這個網頁

延伸閱讀:
http://crazyipad.blogspot.com/2011/01/ipad-tunein-radio.html

華麗的免費網路速度測試工具 Speedtest.net 免下載免安裝

Speedtest.net
家中的網路升級後,不知道連線速度是否有變快?可以使用 SPEEDTEST.NET 幫你測試。

這是一款不用把垃圾檔案下載到自己的電腦,也不用另外安裝軟體的測速工具,只要用支援 Flash 的瀏覽器開啟「speedtest.net」,就可以測試網路的「PING(回應時間)」、「DOWNLOAD SPEED(下載速度)」、「UPLOAD SPEED(上傳速度)」。

SPEEDTEST.NET 在全球有相當多測試主機可供選擇,拖曳綠色的方框,就可以詳細顯示該區域提供的測試主機位置。如果你想測試和日本主機之間的網路傳輸速度,就可以將方框拉到日本。
選擇地理區域

接著就可以選擇目標測試主機,例如圖中是中國大陸的廈門(Xiamen)。
選擇測試主機位置

按下 [BEGIN TEST] 按鈕,開始速度測試,過程會以動畫呈現。

最後可以看到測試結果,按下 [SHARE THIS RESULT] 就可以把結果發佈到 Twitter 或 Facebook。

手機的3G行動上網,是不是也能用 SPEEDTEST.NET 測速呢?

SPEEDTEST.NET 分別提供 iPhone 的 iOS 版本Android 版本,可以將測速軟體安裝至手機。(使用瀏覽器的FLASH功能測速,實在太為難手機了!還是用離線軟體比較好啦!)


對於網站經營者,如果想提供測速功能給用戶,則可以用 「SPEEDTEST.NET MINI」,將測速小工具內嵌到自己的網站。

2011年8月4日

讓 iPad 變成超大螢幕網路視訊電話 Skype for iPad 正式發行

可能有不少朋友,在8月1日就發現 Skype 推出 iPad 版,短暫出現不到一天,又下架了!

目前 Skype for iPad 終於又在 iTunes 重新上架!

聯絡人列表(圖片來源為Skype)

視訊通話(圖片來源為Skype)

這麼一大塊平板電腦,裝上 Skype 有什麼用處呢?想像一個等公車又拎著公事包的路人,手不斷抖著拿 iPad 講電話的畫面,那可一點都不潮阿!

不過3C產品本來就有不同用途,如果外出要講網路電話,可以用 iPhone 或 Android 手機裝上 Skype,相信早有許多人都是這樣做。

雖然在家也可以用 iPhone 或 Android 手機講網路電話,可是當你不想用手拿著,這時 iPad 似乎是個不錯的選擇,只要把它立在桌上,或是掛在牆上,就變成大螢幕的視訊網路電話,不管是開會或聊天,都會自在愉快一點。也許手機也能立在桌上,可是小螢幕要仔細盯用力瞧才看得清楚,跟 iPad 9.7吋的大螢幕可就無法比了。

Skype for iPad - iTunes 下載專頁
http://itunes.apple.com/us/app/skype-for-ipad/id442012681

延伸閱讀
http://www.ithome.com.tw/itadm/article.php?c=69024
lyhcode by lyhcode
歡迎轉載,請務必註明出處!