高見龍

iOS app/Ruby/Rails Developer & Instructor, 喜愛非主流的新玩具 :)

我選擇的程式語言

image

這篇文章並沒有要比較哪個程式語言比較威,選擇適合自己的,寫得開心才是王道。

工作十餘年,手上吃飯的工具跟換女朋友一樣一直在換,以前看著TIOBE的排行榜跟股市一樣起起伏伏,擔心自己學的技術變成非主流、不值錢了,不過年紀大了,在乎的事情也變得不一樣了,腦袋沒辦法裝太多東西,覺得是該定下來的時候了。

當然,一直換的好處就是一直玩新東西,很有趣,但缺點就是學不精。這裡有一篇該學什麼程式語言,我覺得寫得還滿實際的。

跟著主流跑是不錯的選擇,比較安全,工作好找,而且用的人多,遇到問題的時候網路上能找到的答案也多,不過我個人就是喜歡非主流的玩具就是了。以下是一些我目前比較偏好,沒意外的話也應該會把它當做是長期投資的選擇:

ActionScript

Why?

  • Flash/Flex專用的程式語言。
  • 我對它的熟悉程度最高,這應該是我選擇它的主要原因之一。
  • 學習曲線中等。
  • 豐富的多媒體支援,即使很多人不喜歡它,但還是目前製作web game/FB game的首選。
  • 市場需求不算太低,很多台灣的企業還是會選擇用Flash來製作網站,這對”活下來”來說很重要。
  • 商業公司(Adobe)支援。也許有人就是因為有商業公司而不喜歡,不過我想這比起O社那種把別人買下來之後再把它用一些讓人覺得不舒服的手段把它弄爛好多了。
  • 一直有在更新,這挺重要的。
  • 有目前全世界普及率最高的runtime,幾乎每台能上網的電腦都有安裝flash player。
  • 不用太擔心瀏覽器相容性的問題,這應該是很多web front-end engineer的痛。
  • AIR可以用! 這是我選擇它的另一個重要原因,AIR除了可以拿來寫一般的應用程式,也可以拿來寫手機的app,特別是昇級到2.6版之後支援更多的iOS的硬體裝置,效能也改善不少(可參考Maso的這篇文章)。
  • 跨平台,有了flash player跟AIR,你做的網頁或是應用程式真的有機會可以做到”Write Once, Run Anywhere”。
  • 有很棒的framework(PureMVC、Progression、Gaia、Robotlegs),也有很多現成的lib可以用(3D、Particle..etc),不用每次都重新自己打造輪子。
  • 網路資源多,參考書也不少,官方的API手冊也很棒。
  • 新版的flash player將支援GPU,能做的事情更多了。

Why NOT?

  • 效能差? Flash在慢主要是因為太多圖檔在跑來跑去的關係,這即使用其它的來做也不見得比較好。之後的flash player版本會支援GPU,應該會改善很多。
  • 不開放? 我覺得這不是什麼問題,iOS也沒開放也是一堆人在追。我個人崇尚open source的精神,但並不是什麼東西都要open才是好的。
  • 開發工具太貴? 我覺得還好,Flash IDE不是一套幾百幾十萬,通常只要一、二個專案就可以賺回來。就算不買官方的軟體,也有免費的Flex SDK加上免費又超威且open source的FlashDevelop可以用。

Ruby

Why?

  • 我喜歡它簡單好寫又有趣的語法(純個人喜好)。
  • 學習曲線中等。
  • 有很威的Ruby on Rails可以用,這應該是很多人學習Ruby的原因,甚至很多人以為Rails == Ruby。至於為什麼選擇Rails,可參考這篇
  • 有很多別人寫好的Gem可以用。
  • Unix-like跟Mac OS都有內建安裝了,就算是windows也可以找得到安裝的版本,簡單好寫免編譯,拿來當”膠水“還不錯用。
  • 網路資源夠多,官方的reference也做得挺好
  • 因為學習Ruby/Rails的關係,能玩很多新玩具。這點對我來說很重要,要我一直用一樣的東西實在很痛苦,我不希望自己有一天變成是「號稱有十年工作經驗,但其實是只有一年經驗,但重複九次」。

Why NOT?

  • 效能差? 如果可以換來更好的開發效率,我覺得還好,而且老實說慢不到哪裡去。
  • 環境取得不易? 這點倒是真的,支援Rails的主機的確是相對的很少,不過對我來說不是太大的問題,我可以自己想辦法setup自己的主機,或是直接去AWS EC2自己弄個instance也能搞定。現在也有mod_rails(passenger)可以掛到現有的apache/nginx上,設定越來越方便。
  • 工程師不好找? 我想今年XDite在OSDC.tw上的那場talk應該有滿好的解釋(投影片)。

Objective-C

Why?

  • 商業公司(Apple)支援,不斷的推出新的設備,i-device的買氣一直居高不下,讓iOS app的需求越來越高,Objective-C的需求自然也跟著上衝,這點不用我講,看它在TIOBE的排名暴衝就知道了。
  • 是iOS app用的原生語言,其實優點不用太多,如果打算往iOS方向發展,光是”Native”這個優點我就會想選它了。
  • 系統不開放,我覺得這是優點,至少不用像另一邊的A牌系統,硬體廠商太多,光是解析度就好幾種了(可參考這則有趣的漫畫)。
  • 市面上的書越來越多,官方的文件更是多到看不完。

Why NOT?

  • 學習曲線高? 程式語法大家看不習慣,API method名子太長,不過這都只要寫一陣子就會慢慢習慣。
  • 開發工具要錢? 新版的Xcode4如果沒加入apple developer program的話,需要5塊美金購買,不過5塊美金比起其它的開發工具來說算滿便宜的。

結論

小的我的腦容量有限,大概目前只能也只想裝這三種了。那其它像Java/C/C++/C#/Python/PHP/ASP的不好嗎? 當然不是不好,不好的話怎麼可能還能長期佔據TIOBE的前幾名? 只能說青菜蘿蔔各有所好,我選擇對我自己來說合適的。

常會聽到有人說XXX語言的效能很差,但這不會是我在乎的點。自己出來開公司就會知道,公司每個月最大的開銷就是人力成本,如果我能用較少人力能換到一樣甚至更高的開發效率,我覺得那種工具就是我要的。

一些個人的想法,供大家參考。

The Art of Being Inspired

image

Photo Courtesy Orange_Beard’s photostream

做網路相關這行很有趣也很辛苦,必須不斷的學新東西來保持自己的競爭力。在學習的路上可能會遇到一些導師、前輩、大師會提點我們。不過到後來,其實就已經不是在前輩學怎麼寫function、怎麼寫迴圈了,更重要的是跟這些前輩們學”學習的方法”。大師之所以是大師,一定是有什麼方法,到底他們是怎麼樣學的? 都看什麼樣的書,或是跟誰拜師、吃了什麼仙丹、補品,才能有這樣的成就。

前不久發現在巴西舉辦的的Flash Camp 2011Grant Skinner的session,不過在schedule上的Grant的主題是「ADHD FTW, LOL」,其實我一開始看不太懂這標題的意思是什麼,後來看到投影片的標題寫著「The Art of Being Inspired」才懂原來是這個意思。slide也許晚些就會放出來了,不過不確定會不會有錄影,以下是一些場記跟個人的簡單心得。(ADHD應該是指注意力不足過動症)

如果AS有寫了一段時間的朋友,應該都聽過Grant Skinner這號人物,也應該很多人想知道為什麼Grant這麼神,能做出這麼酷、這麼炫的作品,他到底是怎麼學的? 或是有什麼秘訣? Grant在這個session就是要來分享一些他的學習心得。

"Ideas Have No Vaule Until They Are Recorded!”

很多時候我們都會有些點子,但如果不實際把它寫下來或做出來,它就永遠就不會實現,再好的點子也會沒有那個價值。Grant說其實他從很多地方得到啟發,像是從一些自然景觀,例閃電效果,有次他看了很長一條閃電覺得很酷,於是就自己試著用AS寫出閃電效果;還有像是草原上的草被風吹的效果,就想要試著用程式把它寫出來,而且要把它模擬到很自然。

有時候看到電影裡的一些特效,Grant也會想說「如果這個用AS寫的話,該怎麼寫」,例如最近一部電影”Tron: Legacy“,主角被背後的一道光打到,解體之後被傳送到網格世界的效果。

當然在工作上也可能因為專案的關係,需要研究某種特效出來,在研究的過程中也能常能學到不少新的技巧跟心得。另外網路上常看到有佛心的高手做一些方便的工具或是技術分享,也能從中得到一些啟發。

在session中Grant展示了一些他在受啟發時做的許多試作品,看的時候真的只有”哇~~~”的反應..(聊天頻道上也一堆”WOW!”、”Awesome”的讚嘆語)

“Build Tools for Yourself, and Others”

基本上跟”吃自己的狗食(Eating your own dog food)” 差不多意思,Grant就舉例說他們當初在開發EaselJS的時候,為了可以方便的把SWF快速的轉成給EaselJS用的格式,就寫了一套叫做Zoë的小工具。還有做了給Flash IDE用的panel,可以直接從fla就輸出EaselJS用的格式。一開始只是想做給自己公司內部用的工具,後來發現其實還滿好用的,就也放出來給大家用。

做自己的工具好處其實很多的,不僅方便自己公司內部的作業,而且對第一次接觸EaselJS的人來說也相當有幫助,減少對新玩具的恐懼感。

“Keep Everything Open”

其實這就是open source的精神啦! 當你把程式碼公開出來跟大家分享,各方高手如果發現哪裡有問題或是需要改進的,很多時候都會自動自發的幫忙改bug、做patch,讓整個功能更完整。Grant也提到,其實他也是因為EaselJS的關係,第一次使用Github

EaselJS在Github上的專案: https://github.com/gskinner/EaselJS

“Become Obsessed”

老實說,對某件事不夠沈迷的話,一旦遇到挫折,熱血很快就容易燒光了!

“Explore New Things”

Grant表示,他那時候只是為了想試一些新玩意就做了這個:

結果放上vimeo之後沒多久,馬上就有兩家公司來跟他討論要請他們做類似的產品了。

“Have Fun! and Be Passionate”

要好玩,才會熱情一直玩下去。像是他們就自己在android手機上寫了個AIR的程式,再搭配一些週邊硬體,來控制實體的軌道車:

後來甚至還有做出用聲音控制軌道車的,更有趣了..

其實這跟之前奶綠茶在第二回的AS讀書會展示的那個用手機控制flash寫的飛機跟車子的有異曲同工之妙。

在session的最後甚至還有demo了一下他們未公開的sex toy personal massager,這真的超有趣的,這沒辦法用文字說明的,得看影片才會知道它有趣的點。

另外過程中還有幾句比較有趣的:

“Holy shit!”

這是Grant看到很酷的閃電的第一個反應..

“Can you do bubbles? I said fuck yeah!”

這句可能得要看影片才會比較知道笑點在哪裡了..(聽說”fuck yeah”被現場的即時口譯人員翻譯成”fuck you”了..)

結論:

Picasso曾說 “Good Artists Borrow, Great Artists Steal”,Grant把它修正成”Smart Artists Borrow Great Artists”。其實大多數的我們都是小角色,跟大師”借用”他們的心得可以更有效的讓自己的學習之路更順暢一些。不過在跟大師借心得的同時也要小心,看大師打拳很輕鬆,那是因為他們已經把基本功都練很熟了,隨便出手就是很厲害的招式;但對初學者或是基礎不夠的人可能得注意,不要直接練拳不練功,眼高手低,到老可能會一場空的喔。

一點小小的個人心得,與大家共勉之!

Add GitHub Ribbons on Your Website

image

如果你喜歡Github,也認同這個品牌,也許你會想把它當做裝飾品掛一份到自己的網站。

Github有放了一系列顏色的緞帶可以用

網址:https://github.com/blog/273-github-ribbons

直接複製語法就可以簡單搞定了,如果上面的顏色你都不喜歡,它也有提供PSD檔可以自己改。

如果你用的是WordPress的話,有善心人士把它寫成plugin了,直接下載來安裝。

網址:http://wordpress.org/extend/plugins/github-ribbon/

設定相當簡單! 只是目前還沒有什麼有用的project可以讓別人fork..

Color Themes for Xcode 4

Xcode更新到4.0之後的版本,原來的顏色主題跑掉了,連放的位置變了,我愛的zenburn配色變成預設的配色了。還好在網路上找到有善心人士處理好的theme可以直接下載來用。

網址:http://allara.blogspot.com/2011/02/zenburn-theme-for-xcode-4.html

下載之後解壓縮,把檔案放到 ~/Library/Developer/Xcode/UserData/FontAndColorThemes/ 這個資料夾裡之後,重開Xcode之後就有新的theme可以選了。(如果FontAndColorThemes資料夾不存在的話就自己手動建一個吧)

image

這樣就搞定了,我覺得Zenburn的配色還挺適合長時間盯著看的,眼睛似乎比較不會那麼累。如果各位跟我一樣苦命,那我推薦這個配色給大家試試看 。如果大家有覺得不錯的theme也歡迎推薦。

同時也備份一下檔案的連結。

RVM and Gemsets

image

“Living on the edge, stay in the beta world”是件有趣的事,可以試一些新玩具、新想法,但也很怕把系統弄爛又要花時間重灌,以前可能會用virtual machine來建立不同的環境,不過實在有點麻煩。在Ruby有個東西叫做RVM(Ruby Version Manager),可以讓你同時安裝多個不同版本的Ruby,看您是想要裝MRI版本的Ruby,或是REE(Ruby Enterprise Edition)、JRuby、MacRuby,都可以裝在RVM裡指後歡樂的切換。RVM裡每個版本的Ruby的gem也都是分開裝的,所以像之前Rails 3還沒正式release,想裝又不知道會不會怕把原來工作的環境搞爛,但不裝又覺得手很癢,這時候用RVM就對了。

安裝

安裝RVM會至少需要兩項工具:curl跟git,你可以檢查一下你電腦裡是否已經安裝,如果沒有的話就把這兩個裝起來吧,反正這兩個也是很棒也很常用的工具。 如果上面這兩個都已經安裝好的話,打開你的終端機,貼上這行:

bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)

它應該就會開始去下載RVM的檔案回來安裝了。安裝完還需要做一下簡單的設定,看你用的shell是哪一套而要要改不同的檔案,例如zsh就改.zshrc,bash就改.bashrc,以此類推,把下面這行加進去:

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"

假設你用的是ubuntu預設的bash shell的話,那可以直接貼下面這行:

echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"' >> ~/.bashrc

更詳細的安裝說明可以參考官網說明。

使用方法

簡單介紹幾個常用的RVM指令。

看看目前有哪些可以安裝的列表:

> rvm list known

安裝特定版本的Ruby:

> rvm install 1.8.7

會自動找1.8.7的最新版來裝,如果想再指定小版本:

> rvm install ruby-1.8.7-p334

列出目前已經安裝在RVM裡的Ruby版本:

> rvm list

rvm rubies

     jruby-1.6.0 [ darwin-x86_64-java ]
     ree-1.8.7-2010.02 [ x86_64 ]
     ruby-1.8.7-p334 [ x86_64 ]
=> ruby-1.9.2-p0 [ x86_64 ]

可以看到我電腦上目前裝了4套(RVM的) + 1套(系統內建)的Ruby,目前正切換到1.9.2版本。如果要切換到Ruby 1.8.7的版本:

> rvm use 1.8.7

如果要切換到Ruby-1.8.7-p334的版本:

> rvm use ruby-1.8.7-p334

use也可以省略:

> rvm 1.8.7

但RVM會在下次terminal重開的時候會回到預設值(就是回到你系統內建的Ruby版本)。如果你希望每次開terminal的時候都會切到ruby-1.8.7的話:

> rvm 1.8.7 --default

這樣你每次開termnal就會自動切換到1.8.7版了。如果想切回到原來系統內建的版本:

> rvm system

不過今天要看的是RVM裡的gemset。

因為其實套件的版本可能一直有在變,所以可能同一個套件就裝了二、三個以上的版本,看了很討厭,而且也可知道會不會遇到版本衝突的問題,而gemset就是可以讓你在RVM裡面再建立獨立的空間來安裝套件用的。假設我想同時在REE-1.8.7版本的ruby底下同時安裝Rails 2.3.9跟3.0.6版本,來看看怎麼做:

先切換到REE之後,建立一個準備要來裝Rails 2.3.9版的gemset:

> rvm gemset create r239
'r239' gemset created (/Users/eddie/.rvm/gems/ree-1.8.7-2010.02@r239).

再來建一個給Rails 3.0.6版的:

> rvm gemset create r306
'r306' gemset created (/Users/eddie/.rvm/gems/ree-1.8.7-2010.02@r306).

看一下目前的已經建立的gemset:

> rvm gemset list

gemsets for ree-1.8.7-2010.02 (found in /Users/eddie/.rvm/gems/ ree-1.8.7-2010.02)
    r239
    r306

現在有2個gemset了,我們先切換到r239:

> rvm gemset use r239
Now using gemset 'r239'

來安裝一下Rails 2.3.9版:

> gem install rails -v='2.3.9' --no-rdoc --no-ri
Fetching: rake-0.8.7.gem (100%)
Fetching: activesupport-2.3.9.gem (100%)
Fetching: activerecord-2.3.9.gem (100%)
Fetching: rack-1.1.2.gem (100%)
Fetching: actionpack-2.3.9.gem (100%)
Fetching: actionmailer-2.3.9.gem (100%)
Fetching: activeresource-2.3.9.gem (100%)
Fetching: rails-2.3.9.gem (100%)
Successfully installed rake-0.8.7
Successfully installed activesupport-2.3.9
Successfully installed activerecord-2.3.9
Successfully installed rack-1.1.2
Successfully installed actionpack-2.3.9
Successfully installed actionmailer-2.3.9
Successfully installed activeresource-2.3.9
Successfully installed rails-2.3.9
8 gems installed

安裝完成,看起來沒問題,再來切換到r306:

> rvm gemset use r306
Now using gemset 'r306'

再來做一樣的動作,只是版號改成3.0.6:

> gem install rails -v='3.0.6' --no-rdoc --no-ri
Fetching: activesupport-3.0.6.gem (100%)
Fetching: builder-2.1.2.gem (100%)
Fetching: i18n-0.5.0.gem (100%)
Fetching: activemodel-3.0.6.gem (100%)
Fetching: rack-1.2.2.gem (100%)
Fetching: rack-test-0.5.7.gem (100%)
Fetching: rack-mount-0.6.14.gem (100%)
Fetching: tzinfo-0.3.26.gem (100%)
Fetching: abstract-1.0.0.gem (100%)
Fetching: erubis-2.6.6.gem (100%)
Fetching: actionpack-3.0.6.gem (100%)
Fetching: arel-2.0.9.gem (100%)
Fetching: activerecord-3.0.6.gem (100%)
Fetching: activeresource-3.0.6.gem (100%)
Fetching: mime-types-1.16.gem (100%)
Fetching: polyglot-0.3.1.gem (100%)
Fetching: treetop-1.4.9.gem (100%)
Fetching: mail-2.2.15.gem (100%)
Fetching: actionmailer-3.0.6.gem (100%)
Fetching: rake-0.8.7.gem (100%)
Fetching: thor-0.14.6.gem (100%)
Fetching: railties-3.0.6.gem (100%)
Fetching: bundler-1.0.11.gem (100%)
Fetching: rails-3.0.6.gem (100%)
Successfully installed activesupport-3.0.6
Successfully installed builder-2.1.2
Successfully installed i18n-0.5.0
Successfully installed activemodel-3.0.6
Successfully installed rack-1.2.2
Successfully installed rack-test-0.5.7
Successfully installed rack-mount-0.6.14
Successfully installed tzinfo-0.3.26
Successfully installed abstract-1.0.0
Successfully installed erubis-2.6.6
Successfully installed actionpack-3.0.6
Successfully installed arel-2.0.9
Successfully installed activerecord-3.0.6
Successfully installed activeresource-3.0.6
Successfully installed mime-types-1.16
Successfully installed polyglot-0.3.1
Successfully installed treetop-1.4.9
Successfully installed mail-2.2.15
Successfully installed actionmailer-3.0.6
Successfully installed rake-0.8.7
Successfully installed thor-0.14.6
Successfully installed railties-3.0.6
Successfully installed bundler-1.0.11
Successfully installed rails-3.0.6
24 gems installed

跟2.3.9不一樣,Rails 3.0.6版裝了一堆東西..兩個gemset都裝好了,如果你要從別的版本的Ruby直接切換到指定的gemset:

> rvm ree-1.8.7-2010.02@r239

看一下安裝的gem:

> gem list

*** LOCAL GEMS ***

actionmailer (2.3.9)
actionpack (2.3.9)
activerecord (2.3.9)
activeresource (2.3.9)
activesupport (2.3.9)
rack (1.1.2)
rails (2.3.9)
rake (0.8.7)

是2.3.9版的沒錯,再試著換到另一個gemset:

> rvm gemset use r306
Now using gemset 'r306'

> gem list

*** LOCAL GEMS ***

abstract (1.0.0)
actionmailer (3.0.6)
actionpack (3.0.6)
activemodel (3.0.6)
activerecord (3.0.6)
activeresource (3.0.6)
activesupport (3.0.6)
arel (2.0.9)
builder (2.1.2)
bundler (1.0.11)
erubis (2.6.6)
i18n (0.5.0)
mail (2.2.15)
mime-types (1.16)
polyglot (0.3.1)
rack (1.2.2)
rack-mount (0.6.14)
rack-test (0.5.7)
rails (3.0.6)
railties (3.0.6)
rake (0.8.7)
thor (0.14.6)
treetop (1.4.9)
tzinfo (0.3.26)

Good! 看起來沒問題。

你可以隨你高興的建立、切換gemset,各個gemset都是獨立的。如果玩膩了或玩爛了,想要把r239這個gemset清空的話:

> rvm gemset empty r239
WARN: Are you SURE you wish to remove the installed gemset for gemset 'ree-1.8.7-2010.02@r306' (/Users/eddie/.rvm/gems/ree-1.8.7-2010.02@r306)?
(anything other than 'yes' will cancel) > yes

清空只會把安裝的gem砍掉,gemset的名字還會在;如果想把整個gemset刪掉:

> rvm gemset delete r239
WARN: Are you SURE you wish to remove the entire gemset directory 'r239' (/Users/eddie/.rvm/gems/ree-1.8.7-2010.02@r239)?
(anything other than 'yes' will cancel) > yes

大概是這樣,RVM對我這種愛玩新玩具的人真的福音啊!

好RVM,不裝嗎?

參考資料:

RVM官網手冊