6/25/2007

淺談 Comet PUSH Server 架構

最近有機會碰到 Comet 或是 PUSH Server 這類的技術,剛好一直覺得之前寫的 Comet For Ruby on Rails and Mongrel不夠有感覺,所以再寫一次。這裡先得講一聲,我的認知就是 Comet == Server PUSH ,有錯請告知。

HTTP 統治網路界

簡單來說,一般的 Socket Programming 都是保持一個雙向的連線,可以送可以收。但是 HTTP Design 為了以下理由,設計方向為單向的。
  1. 提高 Server 處理效能
  2. 方便作 cache,Proxy 容易融入
  3. 方便作 Server Farm
  4. 網路發展初期,實體硬體狀況不佳,很容易造成 connection lose,單向傳輸可以有效避免瞬斷
我跟你 request ,你回我 HTML ,交易完成,connection close,This is HTTP。

如果以 HTTP 當初設計的初衷「文件交換」來看,我們發現到他設計的非常的好,也相當成功的在當初糟糕的網路環境下成功的生存下來。但是就是因為 HTTP 設計太成功了,導致現在網路業者一股腦兒將各式各樣的 App 放在 HTTP 的架構上,想要用當初只是為了文件交換的協定,變成一個包山包海的協定,自然產生很多問題。

HTTP 最大的問題在於即時性

要解決 HTTP 的即時性的問題,有 Polling 跟 Server PUSH 這兩種方式。

Polling

我們想要做到即時傳訊,Server 端觸發 Client 事件等等功能,以現行的 HTTP 架構下,都得利用 Polling 的方式來做到。Polling 其實也就是現在的 RSS Reader 的作法,RSS Reader 會每過半個小時,或是一個小時去問對方 Server 有沒有新文章。用 Polling來作即時性的功能,最大的好處在於容易寫,因為他完全符合 HTTP 的架構,但是最大的壞處在於不夠即時。以 RSS Reader 來說,每過一個小時去問有沒有新文章,代表的意思就是有一整個小時的空窗期,你得每過一個小時才知道有沒有新文章。

以 RSS Reader 的屬性來說,採用 Polling 有很多好處
  1. 我其實不需要知道立刻知道有多少新文章,使用者對於 RSS 的即時性需求沒那麼高
  2. Blog 系統多變,與其設定一個各 Blog 系統共通的 Socket 協定,不如設定一個共通的文件交換格式來的簡單
但是如果使用聊天室,即時訊息傳遞,Polling 就不是一個好主意了。聊天最怕不夠即時,所以必須加快 Polling Interval,但是會帶來「提高 Server 負載」的後果。你一分鐘 Polling 一次,跟一小時一次,前者的負載是後者的 60 倍。等於你用負載換來即時性。這個在人一多的情況下會造成相當大的負擔。

因為 Polling 在某些地方不是那麼的好,所以才有 Server PUSH 機制出現。

Server PUSH

Server PUSH 是建構在建立一個不中斷的 Socket Connection 下面。一個作法是使用 iframe ,送出的header中要把content-type設為” multipart/x-mixed-replace”,來保持一個不間斷的 HTTP Connection。另外一個作法就是用 Flash 來跟 Server 建立一個 xmlsocket。保持一個不中斷的 Connection ,代表 Server 有新訊息就可以直接傳給 Client,不用等待 Client 過來 request。

這樣可以帶來的好處就是,Server 有狀態更新才會有網路傳輸,如果沒有狀態更新,就不會浪費資源。而 Polling 是不管有沒有狀態更新,都得花上固定的網路傳輸成本,當然就會比較浪費資源。

舉個例子,考試成績快出來了,你每個小時都從宿舍去公佈欄看成績出來了沒,假設成績沒那麼快出來,你自然會花上許多無意義的時間在宿舍到公佈欄之間的往返上面( Polling )。但是如果老師有你的手機(不斷線的 Connection ),成績公佈老師就打電話給你,告訴你的成績(Server Push)。這樣不是好多了嗎?

但是你會問,假設老師打電話給你,你在收不到訊號的地方怎麼辦?假設班上人數太多,老師不是就會打電話打到手軟?

這剛好講到 Server PUSH 的壞處,第一個壞處是假設 Client 網路不好,connection 造成瞬斷,那麼你的訊息就會消失不見了。另外一個壞處就是,持續性的 connection 很難做到 Load Sharing機制,通常大家都只會跟同一台 PUSH Server 作連接,這台 PUSH Server 在人一多就會產生大負載度的問題。這當然有辦法解決,只是這就已經要討論到很深的地方了。

雖然 Server PUSH 不是萬能的。不過整體來說,以傳遞「即時性需求高的訊息來說」,PUSH Server 帶來的好處絕對會比 Polling 來的好,這倒是無庸置疑的。

6/23/2007

Active Resource 已經打包成 GEM 了

Rails 1.2 的最新力作 Active Resource 已經是 beta 的 gem 了,以後安裝的人就不用每次都用 svn 下載了。

安裝方式就是

gem install activeresource —source http://gems.rubyonrails.org

6/22/2007

SliceHost 入手

我是程式設計師,工作以外的日子,我希望能夠有一台 Server 讓我搞一些小玩意,那我該怎麼辦。

通常大家會推薦 Share Web Hosting。但是仔細想想我們對 Share Web Hosting 第一個印象是什麼?大家一起用一台 Apache,一起用一台 MySQL,好擠呀。想用啥新服務不行,要等公司覺得有商業立基再說,好煩呀。想開個其他 PORT 來跑東西,不行。想幹嘛...不行,不行,不行。敝公司覺得你想要搞垮我們,所以你不可以。充其量,這些 Share Web Hosting 公司只是為了一般不了解架站的大眾而服務。但是像我們這種可以獨立控制一台 Linux 的人,就是不爽。

那 Dedicated Server 呢?我們看看 Godaddy 的價碼,最經濟方案 63.00美金一個月。嗯嗯恩....我爸不是李嘉誠,我們也不是要搞公司,也只好重重拿起廣告單,輕輕的放下。

我們發現到市面上只有兩個選擇。很便宜的 Web Hosting 跟很貴的 Dedicated Server。可是中間有一個
想要一台便宜又方便的 Server 玩玩
的斷層。我們已經厭倦了 Web Hosting 的不自由,但是又沒有 Dedicated Server的需求。以前這樣的需求只能夠自己架站。但是架站的網路,電源,機房等等問題又讓我們卻步。我們是 RD ,我們想玩 Server ,但是不想碰硬體的東西。

這時候 slicehost 這樣的 Virtual Private Server 服務就是我們的解藥,當你付錢給 slicehost 後,他會給你一台 Linux 機器讓你玩,你可以 ssh 進去,你有 Root 權限,你有獨立 IP,你擁有一整台機器可以玩,而且價錢是剛好坐落在 Web Hosting 跟 Dedicated Server 中間,等於你每個月花20~30美金的價碼請一個專職網管幫你管機器,什麼硬碟壞掉,CPU 燒掉,主機板進水等等事情都不用煩惱,你只需要寫你的程式即可。

至於他還有很多優點

第一個是 SliceHost 有 5種 Linux 可以自由選擇,Ubuntu,Gentoo,CentOS,Debian,Fedora,你可以自由的選擇你想要的 OS。而且這裡有一個小插曲,我一開始選錯了 OS ,本來想說要寄信給 SliceHost 公司請他們換 OS,沒想到他們提供了 rebuild slice 的功能,你可以線上就把你的 Server OS 換掉。而且這個功能等於是當你被破台的時候,還是可以重灌 OS。

第二個是因為他是 Ruby on Rails 寫的後台。並且網頁提供一個 AJAX Term console mode,當你機器 reboot 的時候,你可以看到你的 Linux 正在重開的畫面,或是當你重灌 Linux 的時候,你可以看到目前重灌的進度,有你在機房修機器的 fu~~~(註1)

第三個是 SliceHost 標榜不超賣,大家說 Performance 很不錯。

價錢我是選擇 20美金一個月的方案,256MB Ram + 10G Storage + 100G Bandwith 很夠用了。而網路上面大家提到一個很重要的問題,大家說因為 SliceHost 太熱門了,申請要等快一個月的情況並沒有發生,我只等半天。

註1
這個 console mode 真的好有fu~~
重灌畫面


登入 console


開機畫面Reboot 畫面


6/20/2007

300篇達成,版面大修

這位客官,你沒走錯,為了慶祝本 Blog 邁向第三百篇文章,我在版面上作了很大幅度的改變。

1. 搜尋改用 Google

我發現到 Blogger Nav Bar 的搜尋真是爛到極點,所以我砍了 Blogger Nav Bar,並且在側邊欄直接呼叫外掛 Google 大神來幫我作搜尋,大家以後可以直接使用右邊的 Search Bar 來搜尋本站的文章。

2. 版型大改

版型改成我最喜歡的白底黑字,而特別的字就用紅色。除此之外我拿掉幾乎所有的 Blog 的小玩意,包含繼續閱讀,Tag Cloud...等等最 Javascript。這個動作的原因是因為我發現
來看我的 Blog 的人,你們只是來看內容而已
這個趨勢從 Google Analysis 就可以知道


這是我某段時間流量的來源的統計圖,我們可以發現到超過一半以上的人是被 Google 大神抓進來,然後查到你想要的東西,走人。

這個推論,也從本 Blog 黏度只有 2.09 個可以知道(註1),我的觀眾都是查詢資料,查完一兩個網頁之後走人,也不會逗留。

就一般網頁的角度來說,我該做出一些事情來增加黏性呢,但是想想不對
等等,幹嘛增加黏性呢?這是一件好事呀。
因為我當初成立 本 Blog 的目標,就是一個知識為主的 Blog 。而上述現象代表我的 Blog 越來越 Wiki 化了,使用者看待這個 Blog 是一個已知識為主的網頁,而非一個閒聊的網頁。與其弄一堆拉哩佈達的東西讓大家傷眼睛,還不如砍掉所有無意義的部份,只留下最簡單的黑底白字 ,讓大家查詢的時候更加的快而迅速的查到相關的資料。這才是友善的對待顧客吧 。

所以我改了版面,希望大家喜歡。

註1
黏度:點閱網頁/造訪數

6/18/2007

Textile,RedCloth,Vim

Textile

有在用 Instiki 的人就知道,他是使用 Textile 這種語法。當 Web 大流行之後,大家發現到 Web 當中的核心 HTML 語法,雖然設計的很有彈性,但是 HTML 實在不是為了方便人書寫而設計的,裡面格式相當的囉唆而且難以書寫閱讀。為了書寫方便,所以產生 Textile 這種 Light Weight Markup Language 語法。

Textile 的使用方式就不再詳加介紹了,可以看看 Wikipedia的介紹 ,總之 Ruby on Rails 上面很多套件都相當友善的支援 Textile。




Red Cloth

剛剛說到 Ruby and Ruby on Rails 上面很多套件都支援 Textile,他們都是靠 RedCloth
這個 Gem 來支援的。他是一個相當容易使用的 Ruby Plugin,安裝方式就是

gem i redcloth

而使用方式就是

require ‘redcloth’
html = ”strong text and emphasized text
r = RedCloth.new(html)
r.to_html

如何,很容易看的懂吧。

vim

剛剛看到網路上面強者這篇 Editing Textile in VIM ,裡面介紹如何使用 Vim 來編輯 Textile,並且提供 Textile Syntax File [1]。要使用他首先得先把這個 text.vim 放到 /.vim/syntax/ 底下,再來>將 /.vim/filetype.vim 加入一行

au BufNewFile,BufRead *.textile setf textile

假設使用 vim 編輯副檔名為 textile 的檔案,例如 xxx.textile,你就會發現他已經 S#ntax Highlight 過了。

註1 我的 Mirror


6/17/2007

用 JRuby 來連接 Oracle

JRuby 為 Ruby on Rails 帶來的效果已經出現了。

根據 這篇文章 ,裡面提到了Oracle在 MAC OS X 上面支援度相當的差勁。沒有 standard client 也沒有 standard Oracle C libraries,導致 MAC OS X 上面,用 Ruby 連結到 Oracle 是一個Painful Job。以前遇到這檔事情,大家只能摸摸鼻子,說聲「再加強」。但是現在有了萬能超人 JRuby ,我們交給 JDBC 來解決這檔事情。

首先,按照 我說的方式安裝 JRuby 還有 ActiveRecord JDBC。我文章裡面裡面提到的是如何安裝 MySQL ,要改連接到 Oracle 也是同樣的方式。去 Oracle’s JDBC download page 
下載 ojdbc14.jar ,放到 $JRuby_HOME/lib/ 下面或是 exportCLASSPATH=ojdbc14.jar。

然後在 Config 這樣設定即可
production:
adapter: 'jdbc'
driver: 'oracle.jdbc.driver.OracleDriver'
url: 'jdbc:oracle:thin:@server:1521:database'
username: 'username'
password: 'password'

哈哈哈,Oracle 可以忽略 MAC 上面的用戶,可以忽略 Ruby 的用戶,但是他不能忽略 JAVA 上面的用戶呀,有了 JRuby 真是太美好了。

6/15/2007

JRuby 的未來


右邊這張圖是從 JRuby 老大Charles Nutter 的 Blog 裡面 Copy 過來的(註1)。象徵的意涵是 Java Programmer 面對目前 Java 當前的問題,拼了老命尋找解法,卻發現他們找到了 Ruby 這個發光的寶石。

言歸正傳,JRuby 當初發展到 1.0 的目標就是 Ruby compatibility,而且似乎也已經達成了。而 JRuby 未來的路要怎麼走呢?


JRuby 的主要開發者 Charles Nutter 也早就明示
  1. 繼續加強速度
  2. Java Integration加強,1.1 可能會重寫整個 Lib
  3. 支援 Ruby 2.0 還有 Rubinius 產生的 Bytecode
無獨有偶,Ola Bini 在接受 InfoQ 訪問時也提到未來 JRuby 走向
  1. 效能加強
  2. 正確性加強
  3. Java Integration加強
  4. Java ByteCode Compiler
也就是說,效能正確性,跟 Java 整合度,以及 ByteCode Compiler 是未來 JRuby 努力的目標。

關於 JRuby 未來的 core team 部分,繼 JRuby 兩個作者接受了 SUN 的 offer ,全職工作 JRuby 之後的九個月,Ola Bini 也接受了 ThoughtWorks 的全職工作,性質也是付錢給他開發 JRuby core。JRuby 已經完全顛覆了以往 Open Source 開發者做公益的宿命,三個主要開發者都有人付錢請他們開發。

Ola Bini 上個月提到,JRuby又加入了兩個新的 core team member,Marcin Mielżyński 和 Bill Dortch。顯然 JRuby 社群是相當活躍的, 而且商業力量也一直進駐,他的開發速度怎麼看都覺得會繼續狂飆。

JRuby 這東西前途不可限量。

註 1
我找不到圖片的 License,只好著名出處,有版權問題請告知。

6/13/2007

Leopard 立志成為最好的 Ruby on Rails 開發平台

蘋果自從發現到 Ruby on Rails 使用者有一大部分都是使用 MAC 之後,開始在 OS 上面狂推猛推用力推 Ruby on Rails。到底蘋果支援到什麼程度呢?看看這一頁吧,未來的 OSX 10.5 Leopard 會直接 Boundle 進去 Ruby 1.8.6,Rails ,Mongrel,Capistrano 。


Scripting Bridge.

Mac OS X is now the ideal platform for all kinds of script-based development. Ruby 1.8.6 and Python 2.5 are both first-class languages for Mac development, thanks to Cocoa bridges, Xcode and Interface Builder support, DTrace monitoring, and Framework builds — plus AppleEvent bindings via the new Scripting Bridge. Leopard is also the premier platform for Ruby on Rails development, thanks to Rails, Mongrel, and Capistrano bundling.

聽起來真的很美好,蘋果擁有偉大的 TextMate Editor,跟完全 Native Bundling 的 Ruby on Rails 全套 Package,再加上漂亮的介面,讓我一定會乖乖的掏出錢來買 Leopard。唯一的問題就是,Leopard 到底何時出呢?

6/10/2007

vim 上面使用 ruby 的方式

最近聽到有人在問 vim 上面怎麼使用 ruby,尤其是怎麼縮排的問題,我在這邊稍微提一下怎麼用。其實 vim 的設計就是使用 configuration 來做到支援不同語言,但是撰寫 vim 設定檔其實不是一件很簡單的事情,所以才有 vim-ruby 的存在。vim-ruby 是一個 gem package,只要使用他就可以幫你簡單的做好 vim 上面對 ruby 的支援。


安裝 vim-ruby
gem i vim-ruby

安裝 vim-ruby configuration file
vim-ruby 有附一支 ruby script ,叫做 vim-ruby-install.rb,在安裝 vim-ruby gems 之後,你的路徑下面就會出現這隻 script ,請打入
vim-ruby-install.rb
幫助你自動的把相關的 Syntax ,indent config 檔案放到相關的目錄下。以下就是他會出現的選項
Possible Vim installation directories:
1) /home/wisely/.vim
2) /usr/share/vim/vimfiles
第一個是在講說,將相關 vim-ruby config 安裝在自己目錄下面,只有自己可以使用。第二個就是放在系統的 vim config 下面,不過你當時的權限要 root 才能安裝。原則上兩個都可以啦。

不能縮排的解法

本來這樣的步驟,在我 notebook 上面這樣就可以完全無誤的使用了。但是當我最近新裝另外一台機器的時候,我發現裝好 vim-ruby 之後,很奇怪的 vim 有 syntax highlight,但是卻沒有程式碼縮排。

後來我發現到,只要將我 notebook 上面的 .vimrc 放到新裝的機器上面即可做到縮排,所以
問題不在於 vim-ruby,而是沒有適當的 .vimrc
雖然用 vim 很久了,但是依舊沒有很深入的去了解怎麼去設定,真是很慚愧。不管怎麼說,我先將我的 .vimrc 放上網路,大家確認一下是否可以使用。這隻 .vimrc 陪我征戰大江南北,目前為止還不錯用。

UPDATE:

根據網友提醒,Ruby on Rails Wiki 網頁有講到只要在 .vimrc 裡面加入
set nocompatible " We're running Vim, not Vi!
syntax on " Enable syntax highlighting
filetype plugin indent on " Enable filetype-specific indenting and plugins

" Load matchit (% to bounce from do to end, etc.)
runtime! macros/matchit.vim

augroup myfiletypes
" Clear old autocmds in group
autocmd!
" autoindent with two spaces, always expand tabs
autocmd FileType ruby,eruby,yaml set ai sw=2 sts=2 et
augroup END
這些即可。

6/08/2007

JRuby on Rails 安裝方式

有了號稱可以跑 Rails 的 JRuby ,當然要來試試看 JRuby on Rails 怎麼安裝。因為我的 test 機器上面已經有裝好原先的 Ruby 跟 Rails ,所以我們就每個指令都打全部的執行檔路徑避免搞混。本 Tutorial 在 Linux 上面測試成功。



安裝 Rails

JRuby 有附帶一個 gems 在 $JRuby_PATH/bin/ 底下。我們使用我們最熟悉的方式來裝,就是 gem 安裝
$JRuby_PATH/bin/gem i rails -y
他會安裝 Rails package 到 $JRuby_PATH/lib/ruby/gems/1.8/gems/ 底下。以後所有的 JRuby Gems 都會安裝到這個下面。安裝好了後,$JRuby_PATH/bin/ 會多出 rails 這個指令,這個就是我們熟悉的 rails command。

安裝 MySQL JDBC Driver

因為 JRuby 不能裝我們熟悉的 ruby-mysql,所以使用 JDBC 來操作 MySQL。你可以到任何地方去安裝 MySQL JDBC Driver 的 jar 檔案,但是如果不知道那裡抓的話,可以試試看 MySQL 官方的 Connector/J 。然後 mysql-connector-java.jar 檔案放到 $JRuby_HOME/lib/ 底下。(註1)

安裝 ActiveRecord-JDBC

這是 Active Record 跟 JDBC 的介面,用 gem 來安裝
$JRuby_PATH/bin/gem i ActiveRecord-JDBC
安裝好了之後就可以使用 JDBC 來 Connection MySQL。

新增 Rails APP
熟悉的指令來了,只是請確定你是使用 JRuby 的 rails 來新增 Rails App
$JRuby_HOME/bin/rails app_name
修改 Enviroment config
rails 的 config/enviroment.rb 要稍微修改
Rails::Initializer.run do |config|
end
裡面要加上
RAILS_CONNECTION_ADAPTERS = 'jdbc'
這句,不然會出現 error。(註2)

Database config 修改

因為改成 JDBC 了,所以 config/database.yml 也會改成
development:
__adapter: jdbc
__driver: com.mysql.jdbc.Driver
__url: jdbc:mysql://localhost:3306/資料庫名稱
__username: root
__password:
這個樣子的設定方式,原先的 database 選項是無效的,必須放在 url 選項的最後面才可以使用。

啟動 Rails Server

終於要啟動了,啟動方式就是
jruby script/server
他會啟動 webrick 。

註1
我試過 $CLASSPATH 的方式,但是無法還是無法正確 connection ,會出現以下 error
The driver encountered an error: cannot load Java class com.mysql.jdbc.Driver
所以我採用這個方式。

註2
當沒有寫入 config/enviroment.rb ,啟動時會出現下列 error
> jruby script/server
=> Booting WEBrick...
/home/wisely/jruby-1.0/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/abstract/connection_specification.rb:209:in `establish_connection': database configuration specifies nonexistent jdbc adapter (ActiveRecord::AdapterNotFound)

JRuby 安裝方式

JRuby 1.0 出了,我們開始看看怎麼安裝吧,這裡先測試 Linux 上面安裝方式。



前置動作

你的系統必須安裝好
  • Java 1.4 以上
  • Ant
下載 JRuby Source

你可以到官方下載區,或是我的 Mirror 下載 Source Package。將他解壓縮。

Compile JRuby

他有 bin 的版本的,不過我還是喜歡 compile 。只要有系統有 ant,我們直接打
> ant
即可 compile。

執行檔路徑指定

jruby 的執行檔在 ./bin/jruby 下面,請將 PATH 路徑指到這裡。並且確定你的 JAVA_HOME 變數沒錯。
> PATH=$PATH:/你的/jruby/根目錄/bin
> JAVA_HOME=/你的/java/根目錄
這樣以後執行 jruby gem 才沒有問題。

測試看看

指定好目錄後,直接打
> jruby -v
ruby 1.8.5 (2007-06-08 rev 3841) [i386-jruby1.0]
看看有沒有問題。

執行第一支 JRuby 程式

寫一支簡單的 Ruby 程式,這裡採用之前 JRuby 代表的意義範例 code。
require 'java'
include_class 'java.util.Random'
r = Random.new(123)
puts "Some random number #{r.nextInt % 10}"
r.seed = 456
puts "Another random number #{r.nextInt % 10}"
然後來測試
> jruby random.rb
Some random number 9
Another random number 0
呵呵,成功了。

JRuby 1.0 Release

雖然官網還沒有講,不過 Download 區已經有了1.0版了。將將將,Ruby 有始以來最受期待的 VM
JRuby 1.0 Release 啦~~~~~~~
我這裡為台灣地區 Mirror 一下檔案,這是 src 檔案,這是 bin 檔案。接下來的幾天,每天都要開始介紹 JRuby 的題目歐。

6/04/2007

在 CentOS 安裝 Ruby on Rails

昨天在 CentOS 安裝 Ruby on Rails 的時候,我發現到雖然用 RubyWorks 來安裝很快,但是有些小細節還是得注意。所以還是寫一個 Tutorial 好了。



1. 安裝 RubyWorks

安裝 RubyWorks Repo
wget http://rubyworks.rubyforge.org/public_key.txt
sudo rpm --import public_key.txt
wget http://rubyworks.rubyforge.org/RubyWorks.repo
cp RubyWorks.repo /etc/yum.repos.d/
用 yum 安裝 RubyWorks
yum install rubyworks
安裝好 RubyWorks ,他會把 ruby,rubygems,Mongrel,Haproxy,Monit 安裝跟設定好。但是他不會安裝 Rails ,而是 copy 一份 Rails 在 /usr/rails 上面,這其實是很正確的作法,因為他一開始就取向 Production Server,而 Production Server 本來就該將 Rails 版本 Freeze 在 Rails Doc 裡面。但是如果還是要在 CentOS 安裝 Rails Gem,那就
gem i rails -y
即可。

2. 安裝 MySQL

RubyWorks 好歸好,就是沒有選擇讓我們裝 DB Server,我們這裡就直接用 yum 安裝 MySQL
yum install mysql-server

3. 安裝 Ruby MySQL Native Lib

我發現到 RubyWorks 並不會安裝 Ruby MySQL Native Lib,所以我們得用 gem 安裝,但是又發現 centos 上面安裝 MySQL Gem 會出現這樣的錯誤訊息,網路上也有人在 complian
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lm… yes
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lz… yes
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lsocket… no
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lnsl… yes
checking for mysql_query() in -lmysqlclient… no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.
Provided configuration options:
–with-opt-dir

所以得先 remove MySQL 然後再重新安裝 MySQL 跟 MySQL Development Lib
yum remove mysql
yum install mysql
yum install mysql-devel
gem install mysql
至於為何這樣,我也不太清楚。反正 work 就好啦。

這樣應該就安裝完成了。

JRuby ,Ruby 界的救世主?

今天早上看到 ericsk’s blog 的 JRuby 1.0 開始倒數,就回去看 Charles Nutter 的原文 JRuby 1.0.0RC3 Released - And This Is It!,我發現到 JRuby 很多東西真的很值得一提。


1. JRuby 1.0 這周上市

6/3 JRuby 1.0 RC3 發佈,1.0 Release 也將在這周發表,他將是 Ruby 1.8.5 compatible 的。
The only things that will change from now until a 1.0 final release later this week would be any showstopping bugs that are extremely low-impact to fix. In general, RC3 should be nearly identical to 1.0 final.
2. 效率不錯,並且會引進 JIT

JRuby 1.0 會有 JIT Compiler ,代表可以 compile ruby code,並且大多數的時候可以跑得比一般 Ruby 1.8 快。 Rails 用 JRuby 跑在 Java Application Server 上面的效果一般來說很不賴。但是因為 JRuby 1.0 之前主打的是跟 Java 的整合度,所以可以作的事情還有很多。

We've had anecdotal reports that JRuby on Rails in a Java application server performance extremely well, and other reports that general Ruby applications perform somewhat poorly. The general performance situation is not well-understood, but we all agree there's a lot more work to be done.

3. 跟 Java 整合不錯,但是可以再加強

大部份的時間 call lib 跟 繼承 class 都沒太多問題,不過有些 case 還是沒搞定。這個問題將會在 JRuby 1.1 的時候,以重新 Design Lib 的方式來解決。

基本上其他的東西就不提了,光是 JRuby 1.0 可以跑 Rails 跟可以 JIT Compile 就值得大書特書了。如果實做的沒有太大的問題的話,說不定是下一個 Ruby 跟 Rails 的高峰。

6/03/2007

Rails 2.0 預計的新特色

Ruby on Rails 作者 DHH 在 Rails Conf 2007 主題演講 A peak at Rails 2.0,裡面提到很多 Rails 2.0 預計有的新功能,大致上還是走「加強 REST ,修改許多細節,尤其是 performance 」的方向走,現在我們就來 check 一下吧。由於投影片沒有講得很清楚,我也順便看了 Robbin 的 railsconf2007大会介绍




更好的 REST 支援
  • ActiveResource 正式 release ,不再只能去 check svn 來 download
  • 有了更輕巧的 REST , Action Web Service 要移出 Rails Core
  • HTTP Basic Auth 支援,解決 REST 對於 Auth 的問題
  • respond_to 可以直接輸出 RJS
  • 更強大的 mine_type


更好的 performance

最大的消息就是有 query cache 可以用了。並且他加了不少 static file 處理的強化技巧。可以用
<%= javascript_include_tag :all , :cache => true %>
<%= stylesheet_include_tag :all , :cache => true %>
自動合併以及壓縮一些 css 或是 js static file,順便下 cache。

而且可以在 config 裡面設置
config.action_controller.asset_host = 'static%d.example.com'
讓 images ,js,css 的 render 出來的路徑變成
<img src="static1.example.com">
<img src="static2.example.com">
類似這樣的形式,可以簡單的將 static file 分離到 static server。


更簡單的 Migration

你很討厭寫 t.column 嗎?現在,你可以這樣寫
create_table :people do |t| 
t.first_name :type=>:string
...
end
以及
create_table :people do |t| 
t.string :first_name
...
end
後者更勝一籌。

一些小細節

Breakpoint 回來啦。可以在啟動 Rails 的時候,將初始化動作寫到 initializers 裡面。

這裡是這個投影片


6/01/2007

Fedora 7 安裝 Ruby on Rails

全新燒燙燙的 Fedora7 出來了,當然開始 test 他對 Ruby on Rails 有沒有問題啦(其實只是我愛好安裝新版本 Linux)。我最近發現到 Red Hat 系列對 Ruby on Rails 的支援度真是好,真的還蠻心動的。現在我們一個一個手動安裝吧。




前置動作
就是以下的動作是對於整個過程有幫助,但是不一定要做的方式。
1. 修改 yum server ,指到國內義守的 server
vi /etc/yum.repos.d/fedora.repo
baseurl 改成
baseurl=http://ftp.isu.edu.tw/pub/Linux/Fedora/linux/core/$releasever/$basearch/os/

vi /etc/yum.repos.d/fedora-updates.repo
baseurl 改成 baseurl=http://ftp.isu.edu.tw/pub/Linux/Fedora/linux/core/updates/$releasever/$basearch/

2. 安裝 gcc complier
請打 gcc ,看你有沒有裝好 gcc compiler ,如果沒有的話,我們用暴力一點的方式
yum install gcc*
3. 安裝 MySQL
yum install mysql-server
開始安裝
1. 安裝 Ruby 以及 Ruby 的 MySQL Driver
yum install ruby ruby-libs ruby-devel ruby-rdoc ruby-mysql ruby-irb
2. 安裝 Ruby Gems
太棒了,Ruby gems 也是內建就有的
yum install rubygems
3. 安裝 Rails
gem i rails -y
4. 安裝 Mongrel
如果沒裝 gcc ,這裡會失敗
gem i mongrel
心得
Fedora7 安裝 Ruby on Rails 真的很方便,已經全部整合到 yum 裡面了,要快速架設 Server 應該不是任何問題。

同場加映,Lighttpd + Fastcgi 安裝方式
安裝 fastcgi 
wget http://www.fastcgi.com/dist/fcgi-2.4.0.tar.gz
cd fcgi-2.4.0
./configure
make
sudo make install


Ruby Fastcgi
wget http://www.moonwolf.com/ruby/archive/ruby-fcgi-0.8.7.tar.gz
ruby install.rb config -- --with-fcgi-include=/usr/local/include --with-fcgi-lib=/usr/local/lib
ruby install.rb setup
ruby install.rb install