幫你的類別增加功能

CoffeeScript 很有趣也很好寫,雖然它提供了許多的語法糖衣(Syntactic sugar),讓你用短短的幾行程式碼就能換來原來你在 JavaScript 要做的事。但說白了它本質上還是 JavaScript,JavaScript 做不到的事,用 CoffeeScript 一樣也做不到。

CoffeeScript 裡的全域變數

在 CoffeeScript 裡,即使是一個空的 .coffee 檔,它也會被編譯成這樣:

(function() {

}).call(this);

你在 .coffee 寫的任何變數或 function,都是被宣告為區域變數包在裡面,只會在裡面有作用而已。這其實是好事,因為這樣一來與外界隔離,你寫的東西不會去污染到別人寫的,相對的別人寫的東西也不會去弄髒你寫的。但假設因為某些不可抗力,硬是要把變數或 function 弄成 global 好讓所有頁面都可以直接使用,也不是沒辦法,你可以直接把變數或 function 掛在window物件底下:

window.logout = ->
alert "You've already logout!" if confirm "Are you sure to logout?"

或是這樣做:

root = exports ? this
root.logout = ->
alert "You've already logout!" if confirm "Are you sure to logout?"

第二種寫法看起來比較麻煩,但比較通用。exports 是在Node.js裡定義的物件,上面第 1 行的意思是指會先檢查 exports 是不是已經有定義了,如果這段程式是在 Node.js 裡執行的話,因為 exports 是存在的,所以會定義一個 root 變數並指向它;如果是在一般的網頁上執行,因為沒有 exports,所以會定義一個 root 指向 this,也就是 window 物件 ,所以這樣的寫法的好處就是在網頁或是 Node.js 都行得通。

這樣一來,你在頁面上的按鈕就可以這樣寫:

<input type="button" value="logout" id="Logout" onclick="logout();" />

但是,如果可以的話,建議還是儘量避免用這種 global 變數的方式來寫程式,現在的 JavaScript 越寫越複雜,沒人知道你寫的東西會不會剛好就去衝到誰家寫的 library,或是衝到你自己或同事寫的程式碼 :)

CoffeeScript -> 與 => 的差別

不知道各位在用 CoffeeScript 的 -> (dash rocket)在寫 function 的時候,有沒有發現有另一個長得跟它有點像,但比較胖一點的 => (fat arrow),在 CoffeeScript 的 source code 裡有一段這樣的簡短說明:

CoffeeScript has two different symbols for functions. -> is for ordinary functions, and => is for functions bound to the current value of this.

RVM - Ruby enVironment(Version) Manager

前言

我相信很多人學習Ruby是因為Ruby on Rails的緣故,但 Rails 在改版的速度很快,而且有時候改版的幅度不小,例如從以前的 2.x 版本跳到 3.x 版本,甚至有些小版號的改版幅度也不小。像是不久前 release 出來的 Rails 3.1.0,就跟 3.0.x 的架構就差滿多的。就算不談 Rails,光是主流的 Ruby 目前也有 1.8.x 跟 1.9.x 的分支,在功能上都有些差異。

這些新推出來的新玩具有的很好玩,不裝起來試一下就會覺得手很癢。你當然可以在你電腦裡安裝這些不同版本新玩具,但畢竟在自己工作的機器上試是有風險的,萬一把環境弄壞了還得花時間想辦法回復。以往我們可能會使用類似VirtualBox之類的軟體來模擬作業環境,玩壞了隨時都可以很快的還原或重建一個新的,不過即使這樣還是有點麻煩。

這時候你就需要RVM(Ruby enVironment(或 Version) Manager)了,有了它,你可以安心的在你的電腦裡同時安裝多個不同版本的 Ruby 而不會打架,例如標準的 MRI(Matz's Ruby Interpreter),或是 REE(Ruby Enterprise Edition),甚至是 JRuby、MacRuby 都沒問題,在 RVM 裡都可以都可以隨你高興的切換。RVM 裡每個版本的 Ruby 的 gem 也都是分開裝的,甚至在同一個 Ruby 版本底下也可以建立不同的 gemset,彼此獨立互不影響。如果哪天覺得膩了、不想玩了,可以用 rvm remove 指令移掉指定的版本;萬一哪天整個不想要玩了,因為 RVM 是把檔案安裝在 /home 的個人帳號資料夾底下,所以也不會去影響到系統的設定,不要的時候就整個 ~/.rvm 資料夾砍掉就行了,不會影響原來系統的設定。也就是因為 RVM 是安裝在你的個人帳號底下,所以你在安裝過程中是不需要 root 權限的。

投影片製作與上台表演

請注意,本文有許多個人自以為是的內容,不一定適合每個人,所以請謹慎服用。

我之前工作的某個老闆跟我說過「每次的上台簡報就是一場表演」,這句話我一直記在心裡。既然是表演,表演內容固然很重要,但"說故事"的方法也很重要,不然內容也許真的很棒,但台下卻睡成一團。

不久前看了我的偶像之一Lindsay Fallow(a.k.a Stray)的一份簡報Robotlegs 2 and your brain,真的感覺會做投影片的人就是不一樣,即使人不在現場聽演講,簡報裡也沒有太多的文字說明,光看簡報就能大概知道作者想要表達的意思,這很酷!

所以這回在第一屆的 PHPConf Taiwan上用的投影片,我也想來試一下不同的簡報風格。

當 jQuery 遇上 CoffeeScript

上週的PHPConf Taiwan,有幾位朋友在會後問我CoffeeScript要怎麼樣跟 jQuery 之類的 framework 整合在一起,會不會打架? 基本上是不會的,CoffeeScript 寫出來的東西就是 JavaScript,如果會打架,那表示你即使不用 CoffeeScript 來寫也一樣打架了。

我們來看看要怎麼把 jQuery 跟 CoffeeScript 放一起。

電視影集

我常會笑我老爸老媽每天晚上守著劇情扯到不能再扯的八點檔,然後討論誰的小孩是誰誰誰的私生子,然後誰又是誰的小三。但我自己也好不到哪裡去,即使再忙,也是幾乎每天在看影集。

忘記是從什麼時候開始,我的影集大盤商介紹一些好看的美國影集之後,我就陷入了這個影集無窮迴圈。剛好最近跟朋友們吃飯聊到,於是就來整理一下列表,順便看看我到底浪費了多少生命在上面。