4/08/2008

解決 Textmate 中文問題

沒想到我也會寫這種教學,不過既然有人問就順便講一下啦。嚴格說起來,我完全是參照這篇網頁所教學的方式。

Textmate 對中文的實在爛到不知道怎麼說,主要有兩個問題
1. 沒有中文字型
2. 不能顯示出輸入法提示列

要解決沒有中文字型的方式就是安裝中文字即可,請下載 TextMateJ2 這個字型。複製到 /System/Library/Fonts/ 底下,並且雙擊安裝。安裝字型之後,就是要選擇這個字型,請到 TextMate 的 Preference -> Fonts and Colors 最下面的字型裡面選擇 TextMateJ2。

screen-capture.png


要解決不能顯示輸入法提示列就是安裝 CJK-Input.tmplugin 。解開後就直接點 CJK-Input.tmplugin,他好像就會直接安裝了。

成品就是如底下圖。字型會擠擠的,這是沒辦法的事情。唯一解決方案就是等 TextMate 2 出。
screen-capture-1.png


JRuby 1.1 Release

JRuby 1.1 已經 Release 了,1.0到1.1最主要的不同是在「效能」的成長。JRuby 1.1 在很多 Benchmark 已經超越了 Ruby 1.8,甚至有些也贏過了Ruby 1.9。主要的修改有

1. Ruby code 可以 compile 成 Java Bytecode
2. Regular expression engine 改成 Oniguruma
3. 效能的進步以及相容性的進步

Ruby compile 成 Java Bytecode 一共有兩種模式(AOT或是JIT mode)。

JIT Mode 是預設,代表他會經過一段時間才會運轉到 compile Mode , JRuby Wiki 建議是 跑20次就自動到 JIT Mode 去。

AOT Mode 可以將 Ruby code compile 成 Java 的 .class 檔案。如果想要直接用 Java 去執行,要裝 JRuby.jar ,還有 asm-3.0.jar ,jna.jar。

下載連結:http://dist.codehaus.org/jruby/jruby-bin-1.1.zip

4/04/2008

更換主力 Editor ,改成 TextMate

這是一個困難的決定,不過是一個對的決定。

當我被某人勸說,不小心 Download 下來 TextMate 試用,彷彿打開所謂的禁忌之門,不久我就淪陷啦。我已經正式切換到 TextMate 上面了,vim 已經被冷落一週以上了。

你問我 textmate 好在哪裡,我只能說調性很合我的感覺。

是的,他有一卡車的缺點。這是我第一個花錢買的 Editor,第一個遇到居然連 Big5 都不能編輯的 Editor(他只接受 Unicode),也就是我要用 Vim 繼續處理 Big5 的 Project @@!。第一個連打中文字都要 Plugin 的軟體。

不過,該怎麼說呢。

Vim 是初戀情人,我用他用了5年,他對我有滿滿的回憶。Textmate 就是有很多缺點,但是卻愛的死心塌地,愛的轟轟烈烈的愛人吧。

如果這就是愛
在轉身就該勇敢留下來
就算受傷 就算流淚
都是生命裡溫柔灌溉~~~ 出自『如果愛」這首歌

Rack - 小架子立大功

最近 Ruby Web Framework 界出現了很多新面孔:
Ramze, Sinatra,Waves, Halcyon ,還有 4/1 才發佈的下一代 framework ==> Ruby on Crack!!

這些 framework 各有各的特點,除了為原本被 Rails 一統天下的 web 開發增添了新的風貌,也說明了 Ruby 社群的活躍。而他們(除了太神奇的 Crack 之外)的背後的大功臣,就是今天的主題: Rack。

Rack 到底是何方神聖呢?


每個 web framework 最後一定要接回去 web server 。方法有很多,有人喜歡老牌的 Fastcgi ,有人愛用雜種狗,有人要像 mac book air 一樣薄,有人說退潮最快。

新的 framework 一直冒,新的 web server 一直來,每個人都要重新寫把兩者接起來的 code 實在太累了, Rack 就是為了解決這個問題而出現的。(1)

Rack

Web 程式講白了很簡單,就是拿 request 然後回 response。Rack 就是把各種 web server 的 request 和各種 framewrok 的 response 用統一的介面來處理。那麼這個統一的介面是什麼呢?

一句話

lambda { |env| [200, {}, 'Hello World!' }

首先, Rack 會將 request 傳給要處理這個 request 的物件的 call 函式。這個例子中,處理 request 的物件就是 lambda。(當然你可以用一般的物件,只要它有 call 這個 method 就行了。)
例子中的 env 就是 request,它是一個 hash ,裡面包含了類似 CGI Environment 變數,像是 PATH_INFO,QUERY_STRING 等等的東西。

而 call 的回傳值,會被當成 response 傳回去給 web server。這個回傳值必需是包含三個元素的 Array: status, headers 和 body。

原本 N 個 framework 和 M 個 web server ,要寫出 NxM 個 Adapter。而有了 Rack 後,大家只要對 Rack 的介面做 Adapter ,複雜度馬上減少為 N+M 了!

如此一來,不用一直重新實做橋接的邏輯,可以把心思放在 framework 本身的設計上。有了 rack ,相信 ruby 的 web 開發會更為有趣。

下一篇再來實際寫些 code 吧。


這張圖的 idea 是從這裡來的...

4/01/2008

[連結文] 為何有些 Java EE/J2EE 的專案是沒效率的,至少是效率低下的

原文連結在此,要看簡體翻譯在此。光是第一句我就笑死了。

我想到一句話,「教授是將簡單的事情變得很複雜,天才是把複雜的事情變得很簡單」。




3/31/2008

Rails 2.0 使用 Big5 編碼

沒想到我的有生之年居然還會使用到 Big5!!!

沒錯,基於機緣巧合,我碰到了一個需要使用 Big5 資料庫,網頁也是 Big5 顯示的request。所以我必須匿天而行,強迫 Rails 2.0 使用 Big5。方法很簡單,

config/enviroment.rb 裡面加入
config.action_controller.default_charset = "Big5"

config/database.yml記得加入
development:
host: xxx
adapter: mysql
database: lala
port: 3306
username: root
password:
encoding: Big5

Html 記得加入
<meta http-equiv="content-type" content="text/html;charset=Big5" />

大概就這樣吧,我抱著參觀懷舊的心情來寫這個網頁 XD

3/20/2008

Rails 2.0 比起 Rails 1.2 加速不少

好像是一個對岸人赖洪礼 在自己 blog 發表一篇壓力測試。他發現到 Rails 2.0 比起 Rails 1.2 加速不少,大概是 30%~50%。不過,他的測試方式相當的原始,用 ab 去量 scaffold 頁面的 req/sec。所以數字比例根本不能做准。

但是,至少說明 Rails Team 有在為了 performance 盡力,並且有實際的成果。

3/15/2008

Netbeans 6 相當的威

前陣子需要一個 IDE 來教課,需求如下



  1. 好安裝


  2. 跟 Rails 整合良好


就選了 Netbeans 6 來試試看,結果發現真的還蠻不錯的,因為都是 Sun 的東西,所以直接跟 jruby 有很好的整合



  • Navigation 還不錯用,可以直接跑到這個 Controller 相關的 View,或是這個 View 相關的 Controller ,也可以指到這個 Class 宣告的地方。


  • 內建 svn ,也比 Eclipse 還得裝 SubEclipse 來的方便。


  • 內建 jruby ,也可以直接包成 war file


  • Find Usage 可以找出所有使用這個 class 的程式碼所在,主要找出所有使用這個 Model 的 Controller 列表


  • 內建 mysql GUI Tool


  • Code Hint 超棒


最重要的是,他可以直接把 Model 對應到 attribute 給取出來


activerecord6.png


Product Model 裡面有 description,image_url ... title 等 table column ,Netbeans 6 可以直接取出來放到 code hint 裡面去。這樣就省了點找 db column 的時間了。不過這個功能必須使用 migration ,或是將 db schema dump 到 schema.rb 才可以用,也就是說不是 live db connection 去取 schema 啦。


Netbeans 6 最大的缺點就是速度太慢了.......,不過 6.1 Beta 已經改善了不少。大家可以試試看。


不過我的話,還是 vim 無敵呀。Navigation 用 gf 可以直接跳來跳去,Find Usage 可以用 grep -r --color Patern dir 來取代, 取出 db schema 可以直接用 mysql client + explain db schema 來做到。鍵盤還是真正的王道。




3/09/2008

Rails PUSH Server :Juggernaut 簡介

早就想寫 Juggernaut 的文章了,不過今天是第一次有時間寫。Push Server 技術就不再提了,想知道可以看我之前寫的文章。

簡介

Juggernaut 簡單的來說,是一個 Ruby Push Server 加上 Rails Plugin。

Push Server 取名就叫作 Juggernaut。

Juggernaut 的 Rails Plugin 裡面包含了一些 JS,跟Juggernaut 自己開發的 Flash Client。Push Server Client 端通常需要 Flash 來接收 Push Server Message,Juggernaut Flash Client 是使用 Flash 8 來作開發。支援 IE ,Firefox,Safari。Juggernaut 的強項在於跟 Ruby on Rails 整合良好,我們來看看怎麼使用。

安裝

1. Push Server 安裝

gem i juggernaut -y

2. Rails Plugin 安裝

ruby script/plugin install http://juggernaut.rubyforge.org/svn/trunk/juggernaut


設定

1. Juggernaut_hosts.yml

這裡很容易混淆,這個設定檔是 Rails Plugin 要看的設定檔,如果沒有設定 config/juggernaut_hosts.yml,會導致 Rails 無法啟動,所以必須要設定 config/juggernaut_hosts.yml。請先新增一個 config/juggernaut_hosts.yml ,輸入你的 Push Server 環境

:hosts:
- :port: 5001
:host: localhost
:environment: :production

port 是 push server port ,預設是 5001,Host 是 Push Server 的 IP ,Enviroment 是 Rails 環境。

2. juggernaut.yml

我們用 juggernaut 來產生 juggernaut push server 所需的設定檔。以下指令會產生一個 juggernaut config 檔,取名叫作 juggernaut.yml。

juggernaut -g juggernaut.yml

啟動

要啟動就是要啟動 Push Server ,還有 Ruby on Rails 。
1. 啟動 push server
我們啟動 juggernaut 這個 push server,並且讀取 config 檔。 預設 Push Server port 是 5001,可以到 juggernaut.yml 去修改。
juggernaut -c juggernaut.yml

範例

我們直接用 juggernaut 的範例,聊天室來確認是否 ok。在你的 controller 裡面創立兩個 function
def index

end

def send_data
render :juggernaut do |page|
page.insert_html :top, 'chat_data', "
  • #{h params[:chat_input]}
  • "

    end
    render :nothing => true
    end
    然後在 index view 裡面這樣寫
    <html>
    
    <head>
    <%= javascript_include_tag :defaults, :juggernaut %>
    <%=
    juggernaut %>
    head>
    <body>
    <%= form_remote_tag( :url => { :action => :send_data }, :complete => "$('chat_input').value = ''" ) %>
    <%= text_field_tag( 'chat_input', '', { :size => 20, :id => 'chat_input'} ) %>
    <%= submit_tag "Add" %>
    < /form>
    < id=""chat_data" style="list-style:none"> ul>
    body>
    html>
    這樣聊天室就完成啦,可以試試看玩玩看。

    對了,這個聊天室一開始有一堆 alert message,這是 Juggernaut 預設 Development 環境下會啟動 Debug Function ,只要 config 改成 Production 就不會出現一堆 alert message。

    3/05/2008

    Ebb:又來一個的 Application Server

    這年頭發展 Application Server 好像很有搞頭,也或許是 Rails 社群對 Zed Shaw 的高調離去的反撲。總之,2008 年一月出了 Thin,二月出了SwitchPipe和Swiftiply,現在又有一個 Rails App Server Ebb 出了,而且好像真的很有料。




    ebb-concurrency.jpg


    上面這張圖是 ebb 跟 Mongrel ,和 Event-Driven Mongrel,Thin 的負載程度 benckmark。我們可以發現 ebb 跟其他的 Rails App Server 根本就是不同等級的負載程度。他的 Design 架構上面比較像 Event-Driven Mongrel,差別比較大的就是他很多地方用 c 寫成。


    安裝方式


    gem i ebb


    記得先安裝 glib2。


    跑的方式


    ebb_rails start


    很熟悉的指令。


    測試一下好了。