Home » Facebook應用程式, Featured

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

Lawrence 29 November 2009 837 次閱讀 Comments
Cardinal Blue logo
Facebook on Rails

以上投影片來自Cardinal Blue Software,投影片內容是今年十月份於Ruby Tuesday分享的,主要分享使用Ruby on Rails來開發Facebook應用程式的一些經驗,投影片的內容十分豐富,有興趣的讀者可以深入研究並來信交流、討論。在此簡短摘錄幾點非常值得深入探討的內容。

  • Facebook上的應用程式(或說遊戲)可區分出10種趨勢(應用程式可能僅屬於其中一種類型,或可融合多種元素):
    1. Virtual Worlds
      e.g., YoVille, PetSociety
    2. Customization & Personalization
      e.g., Nintendo’s “Mii” avatars, Buddy Poke
    3. Collections and Wish Lists
      e.g., Mafia Wars
    4. Interactions and Engagement
      e.g., Farm Town, FarmVille, Barn Buddy
    5. Narrative and Missions
    6. Gift Invites
      e.g., Lil Green Patch, Give a Heart
    7. Donations as Revenue
      e.g., SpareChange, PayPal
    8. Virtual Goods
      e.g., Mafia Wars, PetSociety
    9. Recruiting Users
      e.g., FarmVille, Restaurant City, Tycoons
    10. Capitalizing on Player Resources
      All that Glitters, Photo-of-the-Day
  • 使用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
    end
      def 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,當然接下來本格也會盡量分享這分面的研究心得與開發經驗。

Related Posts with Thumbnails
Line Break

關於作者: Lawrence (28 篇文章)

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

blog comments powered by Disqus