高見龍

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

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官網手冊

RubyGems

image

RubyGems是很方便的Ruby套件管理工具,要安裝別人寫好的套件很多時候只要簡單的一行指令就能搞定。

例如要安裝devise套件的話:

> gem install devise

還可以指定要裝哪個版本的套件

> gem install devise -v='1.1.8'

如果要把套件砍掉:

> gem uninstall devise

相當便利。在安裝的過程中你應該還會看到兩行,會貼心的幫忙把文件也一起裝進來

Installing ri documentation for devise-1.1.8...
Installing RDoc documentation for devise-1.1.8...

但其實很多時候在寫code的時候不會真的去看ri或rdoc,大多是會偷懶的去googlestackoverflow翻答案,所以其實也是可以在安裝的時候加一些參數,告訴它我不想要ri跟rdoc。

> gem install devise --no-ri --no-rdoc

如果懶得每次都加這個參數,可以透過修改個人home目錄底下的.gemrc檔案(~/.gemrc),加上這行:

gem: --no-ri --no-rdoc

那如果之前已經裝的ri/rdoc要怎麼拿掉? 先找出你的gem裝在哪裡:

> gem env gemdir

以我的電腦為例:

> gem env gemdir
/Users/eddie/.rvm/gems/ruby-1.9.2-p0

每個人的安裝目錄可能都會不太一樣,像我的就是裝在RVM裡。切換到那個資料夾底下可以看到一個doc的資料夾,裡面就是你目前有安裝的gem的ri/rdoc了,不要的話就把doc裡的東西砍掉吧。

或是用一行文搞定:

rm -r `gem env gemdir`/doc

那如果哪天又想要了怎麼辦? 一樣以devise套件為例:

> gem rdoc devise

這樣就幫你再裝回來了,那如果想要把所有的gem的ri/rdoc全部裝回來

> gem rdoc --all

參考資料:

RubyGems手冊

跟大師學簡報技巧

image

週末參加了OSDC 2011,很讚! 除了從大師、神人學了許多專業的內容之外,也從他們身上偷學到不少presentation的技巧。表演這種東西沒有銀彈的,每個主講者的表演方式不同,每個聽眾的接受程度也不同,以下僅就我自己的一點點心得跟大家分享。

投影片的顏色配置

每個人在做投影片都有自己的一套做法,有的喜歡走精緻的設計路線,顏色喜歡暗色系,然後字弄得小小的;也有的喜歡把投影片的字弄很大,配合節奏輕快高橋流來表演,可以很快的抓住觀眾的視覺。

但很多時候在電腦上看到的效果,跟實際投影機打出來的會不太一樣。同一個場子,去年在RubyConf的時候應該就有講者吃過這個虧。記得Gregg Pollackihower的投影片就是用黑底白字,程式碼的syntax用的是黃色、紫色跟紅色。但因會場的光源不足(或是投影機的流明度不夠),我坐在第二排看的時候都有些吃力。

Gregg Pollack的talk

image

影片連結

ihower也稍微中招

image

影片連結

如果花了很多時間做的投影片沒辦法在台上發揮最大效果會很可惜的,我依稀記得ihower甚至有在會場問大家是不是有什麼軟體可以模擬這種投影器的光源的。

不過,今年ihower的session帶來的投影片是用白底黑色製作的,整個清楚很多,我跟去年是坐同一個位置,即使前面幾排的燈有稍微暗一點,也還是看得很清楚(可惜沒拍照)。

當然這點是我自己猜的啦,主講人是不是因為這個原因而改設計的我就不清楚了。不過至少對我這個觀眾來說,我覺得這樣的效果很不錯。

倒數計時

來自githubScott Chacon的session,也讓我印象深刻。session快開始的時候,Scott開始播放一些閃光照片(他自己出去玩的照片,還有他女兒的可愛照片..)。在自動撥放的同時我注意到左下角有個倒數計時,提醒大家在幾分幾秒後session就要開始了。我覺得這個設計很棒,大家在觀看賞心悅目的閃光照片的同時,同時也可以知道自己是不是還夠時間去上個廁所,或是再去外面掃一輪點心。

時間控制

時間的掌控是很不容易的。講太快後面空了一堆的時間不知道要幹嘛(如果是中午時間的話可以去外面先搶好位置吃便當),講太久則會延誤到下一個講者的時間,或是放飯時間。

同樣是Scott的session為例,他在整個投影片的左下角放了一小段資訊:

(60/247 – 24%) (45 – 30%)

確切數字忘了,如果我沒誤會的話,上面這段小字的意思應該是:

我的投影片總共有247張,目前是第60張,進度為24%,我的session有50分鐘,但我想留最後5分鐘給大家問問題,所以我設定45分鐘講完,目前已經過了30%的時間了

這樣的做法同時可以看到自己還有多少投影片,並且還有多少時間可以講,從兩個數字的比例可以更精準的控制自己講的速度。

這個好讚! 雖然Scott最後還是有超過一點的他預計的時間(內容實在太多了,二百多張投影片),本來最後要預留的5分鐘Q&A時間被用掉了,不過Scott的精彩演出,整場聽下來都沒冷場,雖然當天天氣很冷,但我有被高手灌頂的感覺,全身熱哄哄的。

PS: Scott用的簡報軟體應該是他自己寫的,叫做showoff

講故事的技巧

會講故事很重要!

我相信每個上台的講者都是實力深不見底的,但有時候實力深厚不等於會講故事。以電腦書籍來說,我就覺得O’really的Head First的系列書很厲害,能把原本很生硬的技術用很生活化或有趣的插畫來介紹給原本不熟悉的人。

再度以Scott的session為例。git是個很棒的工具,但因為跟以前的版本管理工具(CVS、SVN或是最強大的COPY)的運作原理不太一樣。所以Scott用了不少張的投影片,模擬了簡單的情境來說故事。請參考他的slide的第102頁(講git push的運作,可在瀏覽器按左右鍵換頁),一步一步的對話,第118頁的”crap”出來的時候我笑出來了,第119頁的”it would be mean..”真的很有趣,在有趣的同時,也能更清楚的瞭解git的運作原理了。

聽會講故事的高手講話,真的是種享受!

錄偽live demo

長輩、前輩們常說「Never Live Demo」,這跟某人只要去球場看球就一定會輸一樣的中了詛咒,只要live demo就一定會出包,各種千奇百怪的狀況都可能發生,不管是程式的問題,還是突然網路就是連不上,或是突然投影機壞掉..都出現過。不過如果沒有現場來段live demo表演,又好像少了點什麼。

這次我在ihower的session看到預先錄好的demo,有在現場看的人就知道這個效果真的讚! 保證不會出包,就算出包也一定是計劃好的出包(因為這次的主題是測試,所以測試不過是故意的)。透過這個方法,可以更確保整段session都在自己的掌控之中。

以上,是我覺得對我個人很受用的presentation技巧。希望可以抄襲內化成自己的能力,讓爾後上台表演的時候能給台下的觀眾們有更好的體驗。

最後,OSDC的工作人員辛苦了,很棒的聚會 :)