Cardinal Blue的Facebook應用程式開發經驗分享:使用Ruby on Rails與Heroku

View more documents from Cardinal Blue Software.
以上投影片來自Cardinal Blue Software,投影片內容是今年十月份於Ruby Tuesday分享的,主要分享使用Ruby on Rails來開發Facebook應用程式的一些經驗,投影片的內容十分豐富,有興趣的讀者可以深入研究並來信交流、討論。在此簡短摘錄幾點非常值得深入探討的內容。
- Facebook上的應用程式(或說遊戲)可區分出10種趨勢(應用程式可能僅屬於其中一種類型,或可融合多種元素):
- Virtual Worlds
e.g., YoVille, PetSociety - Customization & Personalization
e.g., Nintendo’s “Mii” avatars, Buddy Poke - Collections and Wish Lists
e.g., Mafia Wars - Interactions and Engagement
e.g., Farm Town, FarmVille, Barn Buddy - Narrative and Missions
- Gift Invites
e.g., Lil Green Patch, Give a Heart - Donations as Revenue
e.g., SpareChange, PayPal - Virtual Goods
e.g., Mafia Wars, PetSociety - Recruiting Users
e.g., FarmVille, Restaurant City, Tycoons - Capitalizing on Player Resources
All that Glitters, Photo-of-the-Day
- Virtual Worlds
- 使用Ruby on Rails並搭配知名的Ruby雲端運算平台:Heroku,特色是應用程式隨著流量的成長,無需擔憂系統管理(System Administration)或是硬體水平擴展的問題,Heroku提供了優越的Scalability能耐,透過簡單的應用程式指令或是Web介面便可依照需求調整所需的硬體資源。(類似Amazon EC2 Instance的計費方式,每小時有一定額度的費用)
- 使用NewRelic來進行Rails Application的監控
- 建立User Model的方式,要注意在Heroku上的資料庫是使用PostgreSQL,另外由於Facebook目前使用者的序號長度的關係,在建立migration時要使用bigint(同樣在建立關連欄位時也要指定為bigint而非integer),以下分別是建立User table以及一般關連的例子。
class CreateUsers < ActiveRecord::Migration def self.up create_table :users, :id => false do |t| t.column :id, "bigint PRIMARY KEY", :null => false t.string :name t.string :session_key false t.timestamps end end def self.down drop_table :users end enddef self.up create_table :balloons do |t| t.column :user_id, :bignum t.timestamps end add_index :generators, :user_id # 請養成建立index習慣,對於資料庫效能有很大幫助 - 使用Facebooker Plugin來取用Facebook API的資源
- Facebooker中分別提供了Facebooker::User以及Facebooker::Publisher兩個Class來取用使用者資料以及處理Feeds/Notifications
- 儘管Facebooker提供了方便好用的Class,但建議可以使用Preload FQL的方式來提高應用程式效能,減少query所帶來的延遲時間(一個簡單的Query可能會帶來超過500ms的等待時間,透過Preload FQL的技巧可有效減少等待時間)
- 以下是一個簡單的Preload FQL範例:
preload_fql = Hash.new preload_fql[:preload_user_data] = { :pattern => ".*", :query => "SELECT name, birthday_date FROM user WHERE uid={*user*};" } Facebooker::Admin.new(Facebooker::Session.create).set_app_properties({:preload_fql => preload_fql.to_json})接著可以透過 params 的傳遞讓每一個頁面都能取得資料:
params[:fb_sig_preload_user_data]
- 在目前Facebook上各種流通的訊息都是透過Open Stream API的格式來儲存、取用(Open Stream API是一個公開的標準,有興趣的人可以進一步去研究),Facebook在過去是讓使用者建立Feed template來發送Feed,不過目前有新的作法,範例如下:(這是透過FBJS的方式)
<script> var attachment = { 'media':[{'type':'image', 'src':'http://www.inside.com.tw/wp-content/themes/arthemia/scripts/timthumb.php?src=/wp-content/uploads/2009/11/facebook1_1.jpg&w=300&h=275&zc=1&q=100', 'href':'http://www.inside.com.tw'}]}; Facebook.streamPublish("Hello World", attachment); </script>如此在頁面讀取、執行後就會自動跳出Publish的視窗(您也可以透過onclick或是其他方式來呼叫),完整的參數與使用方式可直接參考Facebook Developer Wiki,當然接下來本格也會盡量分享這分面的研究心得與開發經驗。










關於作者: Lawrence (28 篇文章)
部落客、程式設計師、碩士研究生、網路創業者。 熱愛Web技術、崇尚Web標準,擅長技術為Ruby on Rails。目前致力於使用資訊技術打造可為人們解決問題、創造價值的各種工具應用。 您可透過 deduce _at_ gmail.com 與我聯繫。