上一篇文章提到使用RequireJS的CoffeeScriptplugin時,如果寫的 CoffeeScript 語法不正確,瀏覽器即時 compile 就會有錯誤,而且在瀏覽器那邊看到的錯誤訊息根本看不出來是錯誤是在哪個檔案、哪一行,如果專案內檔案很多,那除錯會變得很難,所以我想到的解法就是在寫 coffee 檔的時候就檢查 compile error,就像jslint.vim的行為一樣,上網搜尋了一下Vim的 CoffeeScript 相關外掛,發現都沒人做這功能,於是花了一些時間從 jslint.vim 那邊移植過來,使用的檢查方式是直接coffee -c來編譯,看會不會有錯誤訊息,現在已經發佈到 github 上了,叫coffee-check.vim。
安裝還算簡單,先確定系統已經有安裝 node,然後只要用pathogen或是Vundle把套件裝起來,接著在 vimrc 內加上一行:
au BufRead,BufNewFile *.coffee set ft=coffee
之後每次儲存 *.coffee 檔就會自動跑 CoffeeCompile compile,然後把錯誤訊息丟到 Quickfix Window 裡面,目前有一些已知問題:
- CoffeeScript compile 一次只會有一個錯誤,而不是從頭到尾的完整檢查,所以如果檔案內有兩個以上的錯誤,那就要重複幾次才能把錯誤都修正。
- 有一些錯誤訊息式沒有行號的,但是不給行號的話 Quickfix 那邊會有些行為不一樣,所以這種錯誤訊息我都統一說錯誤是在第一行。
- 第三是現在是用 node require 的方式來跑 compile,和系統自己用 npm 裝的 coffee 沒有關係,我還在考慮要不要用 npm 裝的 coffee 指令,一開始不用是因為用 coffee 指令是因為它 compile 出錯的話不只會有錯誤訊息,還會有錯誤的 trace 的資訊,不過這是我不需要的資訊。
第一和第二個問題基本上是目前無解,除非以後有什麼其它的 syntax error checker 來做這件事,現在的我也還寫不出這種東西,第三點則是近期可能會有更新,如果其它還有什麼建議或問題回報都歡迎,可以直接到 github 開issue。
補充,有人提了我才發現,vim-coffee-script也可以做到幾乎一樣的事情,只要在 vimrc 加入這行:
au BufWritePost *.coffee silent CoffeeMake! -b | cwindow | redraw!
使用 vim-coffee-script 的話,因為CoffeeMake是把 coffee 轉成 js 的指令,所以如果沒有錯誤,就會產生 js 檔案,不過我自己的使用情境是不需要那個 js 檔案的,這也是我當初決定自己做一個的原因,單純只有做語法檢查。
JavaScript 的物件並沒有封裝的概念,所有綁在該物件上的屬性都是外部可見的,不過還是有辦法做到物件封裝的效果,那就是Module Pattern,作法很簡單,想要保持 private 的私有屬性就宣告成建構函式的區域變數,在建構函式的最後回傳一組你要保持 public 的屬性或是 method,範例如下:
function Person(age, gender) {
var _age = age || 16,
_gender = gender || 1;
return {
getAge: function () {
return _age;
}
};
}
這個範例中,age 和 gender 就是私有屬性,在 Person 物件外的操作無法碰到它們,唯一可以做的事情就是用 getAge 來讀取 age 的值,就這樣,我們有了有封裝特性的模組,不過在實際的應用的時候,還有一些問題需要處理,首當其衝的,便是模組之間的相依問題,不管你的程式架構多好,使用了各種設計模式來減少相依性問題,一定還是會有相依性的問題存在,在 server side 的 JavaScript 應用中,模組的相依問題還不明顯,因為你需要的模組都應該在本機系統存在,你的程式才能執行,以現在最熱門的nodejs來說,用的是CommonJS定的Module/1.0,只要把要匯出給其它人用的介面指派給 exports 這個變數,其它程式就可以很簡單的用 require 來取得,程式運作的流程就是很線性的從第一行跑到最後一行下來。
在網頁上的應用多了一個可能的變化,就是為了效能考量,讓一些資源像是 CSS、JavaScript 等檔案用非同步的方法讀取,這時候如果程式需要的模組檔案還沒讀下來,就還會有非同步執行的問題要處理,雖然 XMLHttpRequest 可以使用同步執行的方式,但是這樣會把整個瀏覽器定住,使用者用起來會覺得瀏覽器死當完全沒反應,所以這種作法完全不列入選擇之中,也因此有了AMD這個非同步模組的規範,它的寫法也很簡單:
define('moduleA', [dep1, dep2], function (export1, export2) {
//do something..
return {
method1: function () {},
method2: function () {},
};
});
define 是一個全域的函式,專門用來宣告和註冊模組,它吃三個參數,前兩個都是非必要的,第一個參數是模組的名稱,其它模組如果有需要用到這個模組的話,就會用這麼名字來相認,第二個參數是一個字串的陣列,內容是需要的其它的模組名稱,第三個參數則是模組的建構函式,建構函數的參數則是根據前面第二個參數設定的相依模組來決定,會照定義順序傳入相依模組輸出的介面,而模型的建構函式最後面還需要回傳一個給其它人使用的介面,和 Module Pattern 一樣,其實背後的設計就是把建構函式當成相依模組建置完成的 callback function,所以就可以確保相依模組可以非同步的動態讀入,都準備好了才進入下一步。
AMD 最有名的實作就是RequireJS了,它完整實作了規範沒有講到的,瀏覽器動態且平行的讀取遠端主機上的檔案,用正確的順序執行,然後還把每個模組輸出的介面都管的好好的,不過其實 RequireJS 還提供了更多功能,像是作為 reousrce loader 來讀取 JavaScript 以外的資源,配合plugin可以直接寫CoffeeScript不需要先 compile 好,還有optimize和uglify等 deploy 相關的機制,讓開發環境和正式環境的接軌變得容易許多,不過上面講的都是優點,其實 RequireJS 還是有些缺點的,其中最大的問題就是文件條理不好,會讓把環境和設定搞起來這件事難度增加許多,再來是除錯變得困難許多,像是用 CoffeeScript plugin 即時編譯的話,剛好其中一隻 coffee 檔有語法錯誤,那會變的很難除錯等等,至於是利多還是弊多我覺得是利多,大部分的問題都是搞清楚就好了,CoffeeScript 的錯誤也可以用編輯器外掛來找。所以最後結論,我是蠻推薦可以導入 AMD 到中大型的 Web Application 專案的。
每個月挑了一張照片













說起來我還真是喜歡買一堆有的沒的,房間一堆漫畫、又會買相機、出門看到包包也一直想買,有點像是女生永遠少一個包包一樣的症狀吧,而除了上面列舉的這些東西,其實還有文具也是我讓我會想花錢亂買的東西,像是省力平針釘書機、筆心會旋轉的自動筆、氣壓筆,或是進口的筆記本RHODIA、Moleskine等等,這兩年在誠品的推波助瀾之下,台灣要買到這些文具,尤其是這些進口筆記本實在是方便很多,雖然相較於其他一般筆記本來說單價實在非常之高,不過還是信者眾多,誠品也樂的不斷引進各種廠牌的筆記本,真是可謂一個願打一個願挨,當然我是後者就是。
前兩天不小心走到信義誠品,然後又不小心走到樓上的風格文具館,下場就是買了四樣東西,花了數百塊,包括 OLFA 的 Limited Series 美工刀Ltd-01和黑刃刀片,一個鈔票夾,還有最後一樣就是maruman的Mnemosyne 筆記本(日本官網),這系列的筆記本我以前沒接觸過,那天才第一次看到,宣傳版上強調書寫時的滑順,然後有給人試寫,試了一下真的很不錯,又是日本製的,就買了一本小本的 Root 方格筆記本,回來查了一下才發現其實這系列筆記本來頭還不小。

Mnemosyne是希臘神話中的專司記憶的女神,從這層含意上來看,這名字用來當筆記本的名字其實蠻適合的,而且不太好記XD,我寫這篇文章寫到這打了 n 次還是記不起來,生產的 maruman 是一間 90 年的老公司了,Mnemosyne 則是2009 年的日本文具大賞的得獎產品,也是電視冠軍文具王高畑正幸的愛用產品。這系列筆記本在設計的時候是以社會人士的筆記本為出發點來設計,相較於學生用筆記本是操寫老師的筆記,資訊都是已經整理好的,這些筆記本則是用來進行創意發想,雜亂的會議記錄等等,著重在筆記的自由度上,不過你如果問我這些細微的差異真的有差嘛?我其實也不能回答你,因為一來我還沒開始用,二來日本人這方面很龜毛,應該是真的有研究吧,像是有名的1101 手帳,上市十年,它的方格尺寸就調整了三次,從一開始的 3mm ,2003 改成 4mm , 2009 改成 3.45mm 到 2010 改成 3.7mm ,這麼細微的差異不說可能很多人還不會注意,尤其是最近一次改只差了 0.25mm 而已,而看看其它廠商出的筆記本,清一色都是 5mm 方格,但是日本人就是會對這細節一再調整,實際拿起來看過,我確實是喜歡 3.7mm 方格更甚於 5mm 方格,格子小一點感覺畫東西時可以控制的比較精緻,哈,不過這只是我幻想而已,畢竟 1101 手帳是日記帳,對於我這種沒耐心的人絕對是不適用的。

Mnemosyne 畢竟是蠻貴的,不是每個人都花的下幾百塊錢買筆記本,不過還好,無印良品有出一款滑順筆記本,標榜使用的是高級紙(上質紙),外觀和紙的觸感幾乎都和 Mnemosyne 一樣,而且根據可靠情報,其實這款筆記本就是 Mnemosyne,當然價格便宜許多,差在開數和樣式的選擇沒這麼豐富而已,而且這系列筆記本台灣也有賣了,不只店面有,博客來都買的到,如果真的買不下手又想試試看的,無印良品這系列也是可以考慮看看,只是消息來源是覺得兩者還是有差就是了。

Vim-Taiwan第一次聚會我的分享題目:「Vim Plugin Deployment」,內容是在介紹怎樣發佈自己寫的 Vim Plugin,不是 Plugin Developer 才需要知道的東西,不論是偶爾會修改別人的 plugin,抑或是會在 vimrc 裡面寫 function 的人都可以了解一下的。


Steve Jobs 過世已經不讓我意外了,我倒是蠻意外我真的因為這個消息受影響而有些失落,甚至連我媽從沒用過蘋果產品的人也覺得惋惜,這也可以看到他對於世界到底有怎樣的影響力。我是從研究所時期開始使用蘋果的產品的,從末代的前一代 iBook 小白用起,後來換到初代鋁磚 MacBook,同時還有用 iPod 、iPad 等,也跟了好幾年在半夜看發表會,到今天我還可以稍微回想起那 "One More Thing" 的魔力,一群長輩邊開 IRC 邊閒聊邊關注新訊息也是非常快樂的經驗,蘋果這幾年從 iPod 開始, iTunes、iPhone、iPad,回到 OSX 再到 iCloud,整個發展的歷程看下來其實非常可怕,從硬體、軟體、內容到更進一步的雲端服務,整個都包了下來,某天晚上我拿著 iPad 躺在床上使用時,我突然有一個念頭:「這東西大概是科幻小說中才會出現的吧。」如果10年前有人跟我描述 iPad 這個產品,說會有這麼薄,只要用手指就可以控制,還有這麼多功能的設備,我只會認為那是小說或電影裡面的東西,不過 Steve Jobs 帶領的蘋果就是把這樣一個產品做了出來,而且 iPad 發表時,沒人看好,我看發表會時也不覺的怎樣,但是結果非常的出乎意料,大賣到不行,而且也是我唯一有買的 iOS 裝置,這讓我想起 Twitter 創辦人 Biz Stone 說過一句話來形容 Twitter:「It's the messaging system that we didn't know we needed until we had it」,同樣的話,我覺得拿來形容 iPad 也很貼切,唯一不同的是,Steve Jobs 知道人們會需要 iPad,他把它做了出來,改變了人們的生活方式,同樣由他創造出來,改變了世界的產品還有 Apple II 和 iPhone,甚至連賣的不太好的 NeXT 都間接讓現在的網際網路成形,或許他腦袋中還有其它可以改變世界的東西,只可惜我們已經看不到了,或許我也是因此而感到失落的吧。
最後就引述紐約市長彭博的悼詞作結(翻譯來源):
今夜,美國失去了一位天才。賈伯斯的名字將與愛迪生和愛因斯坦一同被銘記。他們的理念改變世界,影響數代人。過去40年,賈伯斯一次次預見到未來,並在多數人遠未洞察之前就將設想付諸實際。賈伯斯才識和力量改變文明。我們每個人都受益於此。
➡ 看看其它文章