September 28,2006
[Rails 筆記] 在 session 中儲存物件
答案是利用 Ruby 的 Marshal 物件,如下例:
然後在 application.rb 中:
class AdminController < ApplicationController
def do_login
if request.post?
user = User.login(params[:uid], params[:pwd])
if (user)
session[:user] = Marshal.dump(user)
end
end
end
end
然後在 application.rb 中:
class ApplicationController < ActionController::Base這樣有什麼好處,好處是對於一些常用的物件,例如 Query DB 得到的 Model,我不用在每個 page 都再去 query database,將他記錄在 session 中即可,而且可以避免 db schema 更改後還要改 code 的窘境。
model :user
def setup_variables
if (session[:user])
@login_user=Marshal.load(session[:user])
end
end
end
Web2.0 Conference 會後感
請了一整天假(跟我目前工作無關,只好請假了),跑去參加了這場盛會,真的是盛會,難得看到經濟部主辦的活動會有這麼多人參加,大概有一兩千人吧,把整個世貿會議中心大禮堂都塞爆了,而且 Speaker 也都不是泛泛之輩。不過最後我有個想法,關於這場 Conference 的主題 - Web 2.0,我覺得這就好像小時候聽過的一個故事,古時候一個君王牽來一頭大象,再找來九個瞎子要他們摸大象,並告訴君王那是什麼東西,結果每個人回答的結果都不相同,這次的 Conference 也給我同樣的感受,每個 Speaker 都跟 Web2.0 多少有點關係,有的是赫赫有名的網站創辦人,如 flickr、TechCrunch、BubbleShare、HEMiDEMi、wretch 等等,也有創投的老闆,更有傳統科技公司的管理階層,如 IBM、Microsoft 等等,但是每個人嘴中講出的 Web2.0 就是不同,有些人從自己公司的角度去看,有些 Speaker 則是來介紹自己網站的(結果我想了又想,這個網站的型態應該跟 Web2.0 搭不上關係吧),有些人則提了對 Long Tail 的看法(恩..),聽完後,你想給 Web2.0 一個嚴格定義是很難的一件事,而且我是覺得這也是很無聊的事,不過就是個名詞,一個由出版業者提出了的名詞,多點話題性罷了。Anyway,我覺得這場 Conference 只成功了一半,帶來了話題,不過大家還是帶了一堆霧薩薩回家。
因為我很早就到了,所以可以坐的很前面,就順便拍了一些照片:
Tech Crunch 草創者 Michael Arrington:

Flickr 早期的 co-funder Stewart Butterfield,目前則是 Yahoo 的經理,很幽默風趣的一個人:

flickr 的 vision 是 eyes of the world,Butterfield 也舉了幾個例子,其中之一就是最近的 Sony 筆電爆炸,flickr 網友在事件發生後沒多久就把照片上傳了。

HeyMath 創辦人:

BubbleShare 創辦人 Albert Lai ,他讓我感到很驚訝 - 真是年輕啊,看起來比 wretch 的幾個還要年輕,台風雖還不算穩健,但是手部動作很多,頗有大將之風,也很樂意分享他們草創網站的經驗:

(我還在等主辦單位放出他們的 slide ,有看到順便通知一聲)
非常短的 Panel discussion:
下午場有幾個國內的網站做介紹,其中包括無名、愛情公寓、HEMiDEMi 等等。
無名的林弘全,感覺上就像是小朋友一樣,年紀輕,觀念台風等也尚不成熟,有自己的想法,但較缺乏中心思考,講出來的東西也比較難讓人信服。不過有趣的是,他投影片中的一張圖,一張用手繪的簡圖,圖中的線代表 Long Tail 跟他的三角經濟理論,簡單的圖博得滿堂掌聲,也讓我覺得,社會歷練沒給他帶來太多負面影響,還能保有赤子之心。

HEMiDEMi 所講的 Web2.0 跟我的觀念比較接近,社群,引用等等,這才是我所瞭解的 Web2.0,HEMiDEMi 的 Shine Chen 也以他們網站自身的例子來介紹他們所認為的 Web2.0 概念,清楚明瞭,也有趣。

最後,還有 IBM 跟 Microsoft 的串場演說,不過我興趣缺缺。

這次的 Conference 對我來說還是有一些收穫,大致瞭解了創投們的想法,也比以前有更深刻的體驗,Web2.0 並非一定成功,很有可能只是另一波泡沫,如果沒有好的 Business Model,即使有再好的 idea ,難以吸引創投投資,最後也以落敗收場。有時候,過熱之餘還是要冷靜一下多想一想。
因為我很早就到了,所以可以坐的很前面,就順便拍了一些照片:
Tech Crunch 草創者 Michael Arrington:

Flickr 早期的 co-funder Stewart Butterfield,目前則是 Yahoo 的經理,很幽默風趣的一個人:

flickr 的 vision 是 eyes of the world,Butterfield 也舉了幾個例子,其中之一就是最近的 Sony 筆電爆炸,flickr 網友在事件發生後沒多久就把照片上傳了。

HeyMath 創辦人:

BubbleShare 創辦人 Albert Lai ,他讓我感到很驚訝 - 真是年輕啊,看起來比 wretch 的幾個還要年輕,台風雖還不算穩健,但是手部動作很多,頗有大將之風,也很樂意分享他們草創網站的經驗:

(我還在等主辦單位放出他們的 slide ,有看到順便通知一聲)
非常短的 Panel discussion:
下午場有幾個國內的網站做介紹,其中包括無名、愛情公寓、HEMiDEMi 等等。
無名的林弘全,感覺上就像是小朋友一樣,年紀輕,觀念台風等也尚不成熟,有自己的想法,但較缺乏中心思考,講出來的東西也比較難讓人信服。不過有趣的是,他投影片中的一張圖,一張用手繪的簡圖,圖中的線代表 Long Tail 跟他的三角經濟理論,簡單的圖博得滿堂掌聲,也讓我覺得,社會歷練沒給他帶來太多負面影響,還能保有赤子之心。

HEMiDEMi 所講的 Web2.0 跟我的觀念比較接近,社群,引用等等,這才是我所瞭解的 Web2.0,HEMiDEMi 的 Shine Chen 也以他們網站自身的例子來介紹他們所認為的 Web2.0 概念,清楚明瞭,也有趣。

最後,還有 IBM 跟 Microsoft 的串場演說,不過我興趣缺缺。

這次的 Conference 對我來說還是有一些收穫,大致瞭解了創投們的想法,也比以前有更深刻的體驗,Web2.0 並非一定成功,很有可能只是另一波泡沫,如果沒有好的 Business Model,即使有再好的 idea ,難以吸引創投投資,最後也以落敗收場。有時候,過熱之餘還是要冷靜一下多想一想。
September 25,2006
[Rails 筆記] ActiveRecord 轉換 JSON
酷耶,看到這都快興奮的跳到桌子上了,看看這個連結吧:Accessing ActiveRecord objects in javascript
雖然我看不太懂這段 code 的意思,不過測試的結果,可以 work 耶! 讚!
就只剩下 JSON 轉 ActiveRecord 了,改天再來研究看看。
(1) 安裝 json:
% gem install json
(2) Add a new file : /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/json.rb , 裡頭包含以下程式碼:
(3) 在 environment.rb 中加上: [Update]: 似乎不用加以下這段,加了反讓 fastcgi 掛掉,不加也能 work 啦
(4) 使用時,呼叫 to_json() 函式即可。
雖然我看不太懂這段 code 的意思,不過測試的結果,可以 work 耶! 讚!
就只剩下 JSON 轉 ActiveRecord 了,改天再來研究看看。
(1) 安裝 json:
% gem install json
(2) Add a new file : /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/json.rb , 裡頭包含以下程式碼:
require 'json/lexer'
require 'json/objects'
module ActiveRecord
module Json # :nodoc:
DEFAULT_CONVERSIONS = { Time => [:to_s, :db] }
def to_json(conversions = {})
conversions = DEFAULT_CONVERSIONS.merge(conversions)
self.attributes.keys.inject({}) do |hsh, key|
value = self.send(key)
hsh.merge(key => conversions[value.class] ? value.send(*conversions[value.class]) : value.to_s)
end.to_json
end
end
end
(3) 在 environment.rb 中加上: [Update]: 似乎不用加以下這段,加了反讓 fastcgi 掛掉,不加也能 work 啦
require "#{RAILS_ROOT}/lib/active_record/json"
ActiveRecord::Base.class_eval { include ActiveRecord::Json }
(4) 使用時,呼叫 to_json() 函式即可。
user = User.new()
user.to_json()
[Rails 筆記] 如何使用 Stored Procedure (MySQL)
儘管 Rails 的原始作者之一 David Heinemeier 對 Database 的 Stored Procedure 並不太感興趣,都有了 Active Record 了,何需 Stored Procedure,不過需求總是存在的,要改好像也不太難,這篇筆記都是參考自 - MySQL stored procedures with Ruby 以及 StoredProceduresInMySql。這各式兩種作法,一種是改 Rails 原本的程式碼,另外一種則是改自己的程式碼 ,各有優缺點。
先看改 Rails 的方法:
(1) 找到 Rails 中的 mysql_adapter.rb 檔,他通常位於:
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/connection_adapters/mysql_adapter.rb
(2) 修改底下這行:
ConnectionAdapters::MysqlAdapter.new( mysql, logger, [host, username, password, database, port, socket], config)
把它改成:
ConnectionAdapters::MysqlAdapter.new( mysql, logger, [host, username, password, database, port, socket, Mysql::CLIENT_MULTI_RESULTS], config)
(3) 新增加一個 function:
(4) 使用上,如下例:
如果妳不想改 code,就不能用 Rails 的 adapter ,而是要自己 connect。
先看改 Rails 的方法:
(1) 找到 Rails 中的 mysql_adapter.rb 檔,他通常位於:
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/connection_adapters/mysql_adapter.rb
(2) 修改底下這行:
ConnectionAdapters::MysqlAdapter.new( mysql, logger, [host, username, password, database, port, socket], config)
把它改成:
ConnectionAdapters::MysqlAdapter.new( mysql, logger, [host, username, password, database, port, socket, Mysql::CLIENT_MULTI_RESULTS], config)
(3) 新增加一個 function:
def select_sp(sql, name = nil)
rows = select(sql, name = nil)
while (@connection.more_results?())
@connection.next_result()
end
return rows
end
(4) 使用上,如下例:
connection.select_sp ("CALL my_stored_proc();")
如果妳不想改 code,就不能用 Rails 的 adapter ,而是要自己 connect。
September 24,2006
奇蹟的夏天
這週六與女友去台中新光戲院看了這部電影 -「奇蹟的夏天」,可能多數人沒聽過吧,因為它是國片,紀錄片形式的電影。或許因為知名度不高,整間廳不超過十個觀眾,但是我想人少應該有一半的原因是電影院附近的抗議活動,台中的新光三越到了週末下午應該是人潮眾多,不過這天卻是稀稀疏疏的,電影院裡頭人更是少的可憐,已經快要到那種工作人員比觀眾多的窘境了。不過,「奇蹟的夏天」不會難看,相當精采,雖然沒有大明星,沒有大場面,沒有炫麗特校,但是看著一張張花蓮美崙國中小朋友們的純真臉蛋,心情也跟著舒服。希望大家能多多支持國片,花點時間,花點小錢,進電影院看一下這部片,讓它能夠一場接著一場播映下去。
預告:
其他影片片段:
...繼續閱讀
預告:
其他影片片段:
...繼續閱讀
September 19,2006
看膩了太多所謂的爆料了嗎?
剛剛在終極邊疆看到一個有趣的 News filter,簡單的 Javascript bookmarlet 可以幫助你 Mark 出一些特殊字眼,例如:「據透露」、「據了解」、「據指出」等等,這些新聞媒體現在都不做到查詢義務,老是喜歡搞一些爆料新聞,喜歡用聳動標題,一副唯恐天下不亂。有了這個 Filter,就可以讓這些惡質媒體現形。
September 18,2006
從 google maps 看地球
September 15,2006
[Rails 筆記] Rails Localization
Rails app 怎麼做 localization ? 好問題! 已經有人 port UNIX 上的 gettext 到 ruby 上,並有文件介紹如何與 Rails app 整合。
[安裝]
確認你有安裝 gettext,在 Ubuntu 上請用以下命令安裝:
% apt-get install gettext
安裝
[安裝]
確認你有安裝 gettext,在 Ubuntu 上請用以下命令安裝:
% apt-get install gettext
安裝
libgettext-ruby1.8:
% gem install gettext
或者
% apt-get install libgettext-ruby1.8
[建立環境]
舉例來說,如果我的 Rails app 目錄位於 /var/rails/sandbox/ 路徑下,先在該目錄下建立 po 檔案夾,裡頭包含各個你要 localize 的語言子目錄,如下:
% ls -l podrwxr-xr-x 2 root root 4096 2006-09-15 20:21 endrwxr-xr-x 2 root root 4096 2006-09-15 21:21 jadrwxr-xr-x 2 root root 4096 2006-09-15 20:21 zh_CNdrwxr-xr-x 2 root root 4096 2006-09-15 21:04 zh_TW
編寫 Rakefile,如下:
require(File.join(File.dirname(__FILE__), 'config', 'boot'))
require 'rake'
require 'rake/testtask'
require 'rake/rdoctask'
require 'tasks/rails'
require 'gettext/utils'
desc "Update pot/po files"
task :updatepo do
MY_APP_TEXT_DOMAIN = "sandbox" #sandbox 是我的 Textdomain, 你應該改成你自己的
MY_APP_VERSION = "sandbox 0.0.9"
GetText.update_pofiles(MY_APP_TEXT_DOMAIN,
Dir.glob("{app,lib}/**/*.{rb,rhtml}"),
MY_APP_VERSION)
end
desc "Create mo-files"
task :makemo do
GetText.create_mofiles(true, "po", "locale")
end
[攥寫你的程式碼]
你想要做 localize 的地方可以利用 _() 或者 N_() 函式包裝起來,如下:
<%= _("This string should be localized") %>
<%= N_("This string should be localized") %>
設定 application.rb,如下:
require 'gettext/rails'
class ApplicationController < ActionController::Base
GetText.locale = "zh_TW"
init_gettext "sandbox"
在這裡我先暫時將 locale 強制設定成 zh_TW 做測試,事實上,你可以透過幾種方法來改變語言(如果不直接設定 GetText.locale= 的話):
- QUERY_STRING 中的 lang 參數設定。
- Cookie 中的 lang 參數設定。
HTTP_ACCEPT_LANGUAGE 中的值。- 你也可以透過 config/routes.rb 讓某路徑對應到特定語言中,例如 /login/zh_TW/hello/ 可以對應到 zh_TW 語言中。
ActionController::Routing::Routes.draw do |map|
map.connect ':controller/:lang/:action/:id'
end
[建立 po 跟 mo 檔]
回到你的 Rails Root 路徑下,執行以下命令產生 pot 檔。
% rake updatepo
執行完後你會在 po/ 目錄下找到一份 pot 檔,檔名是你取的 Textdomain,將這份 pot 檔案翻譯後並改名成附檔名為 .po 的檔案,並放到該語言的目錄下,例如你翻譯成中文後,可以放到 zh_TW 目錄下。
翻譯完後,執行:
% rake makemo
你會發現在你 Rails app ROOT 目錄下會多個檔案夾 - locale ,在裡頭你會發現 zh_TW/LC_MESSAGES/sandbox.mo ,這就是產生的 mo 檔,有用過 gettext 的人,相信對這些流程應該不陌生。
執行你的 Rails app 後,你就可以發現你的字串都被置換了。
[參考資源]
- Ruby-Gettext-Package
- Using Gettext To Translate Your Rails Application (y)
- Ruby-GetText-Package HOWTO for Ruby on Rails
September 13,2006
[Ruby 筆記] Rails, MySQL 與 Ubuntu
水土不服?還是我比較倒楣?上次在 Mac 上跑 Rails 以及 MySQL 都很正常,一切順利,現在在 Ubuntu 上跑就是問題不少。
[socket path 不對!]
Rails 預設會去找 /tmp/mysql.sock 檔,不過 Debian 或者 Ubuntu 上的 Mysql 卻不是在那裡,通常是在 /var/run/mysqld/mysqld.sock,這需要改 database.yml,如下:
[Lost connection to MySQL server during query]
Oh! My God! What's this? Is it good to drink?
連結 Mysql 時一直得到這個錯誤,拿這串 message 直接去問估狗大神,他跟你說,是 gcc 版本的問題,要重新 compile ! 喔,不會吧?!不過還好,在我還沒做蠢事前,多問了大神兩句,就得到結果了,少裝了
終於,Mysql 可以順利運作了 T_T
[socket path 不對!]
Rails 預設會去找 /tmp/mysql.sock 檔,不過 Debian 或者 Ubuntu 上的 Mysql 卻不是在那裡,通常是在 /var/run/mysqld/mysqld.sock,這需要改 database.yml,如下:
development:需要多加一個 socket 參數,不過還是可以找到文件說明這個啦。
adapter: mysql
socket: /var/run/mysqld/mysqld.sock
database: sandbox_development
username: abc
password: oh_my_god
host: localhost
[Lost connection to MySQL server during query]
Oh! My God! What's this? Is it good to drink?
連結 Mysql 時一直得到這個錯誤,拿這串 message 直接去問估狗大神,他跟你說,是 gcc 版本的問題,要重新 compile ! 喔,不會吧?!不過還好,在我還沒做蠢事前,多問了大神兩句,就得到結果了,少裝了
libmysql-ruby1.8,如下命令:
% apt-get install libmysql-ruby1.8
這是從這裡看來的。終於,Mysql 可以順利運作了 T_T


