A quick facebook connect guide

Posted by PunNeng, Tue Feb 17 01:32:00 UTC 2009

Here is a quick todo
http://wiki.developers.facebook.com/index.php/TryingOutFacebook_Connect

There is a tricky part. It is when you are logged in, you have to make the page reload automatically.
Fortunately, there is a javascript helper
http://www.somethingtoputhere.com/therunaround/fbconnect.js

Usage:

put these codes below to your page, it will render the link to log in.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
<script src="/javascripts/fbconnect.js" type="text/javascript"></script>
<script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php" type="text/javascript"></script>
<a href="#" onclick="FB.Connect.requireSession(); return false;" >
  <!-- this can be a text link or image tag -->
  <input type="image" value="facebook" src="/images/buttons/btn_facebook.gif"  />
</a>
<script type="text/javascript"> FB.init("YOUR_APP_KEY", "xd_receiver.htm"); </script>

<script type="text/javascript">
  FB.Connect.ifUserConnected(function(){
   // will be invoked if user is connected and refresh the site to the callback url(explain below)
   window.onload = function() { facebook_onload(true); };
  },
  function(){
   // will be invoked if user is not connected
   window.onload = function() { facebook_onload(false); };
  }
  )
</script>

Changing the callback url:

in fbconnect.js, there are codes:

  1
  2
  3
function refresh_page() {
  window.location = 'index.php';
}

index.php is needed to be changed to the callback path.
This method will be called after the user is connected.

Getting the facebook id:

When it's redirected to the url above, the facebook id or the user details should be in the session of the site. You need to echo the session to see what keys are in the session.

0 comments | Filed Under: General | Tags: facebook howto javascript

Merb gets merged into Rails 3!

Posted by PunNeng, Wed Dec 24 05:46:00 UTC 2008

มีของขวัญวันปีใหม่+คริสต์มาสมาฝากครับ

Merb 2.0 และ Rails 3.0 จะกลายเป็นสิ่งเดียวกัน

ผู้พัฒนาทั้งสองฝั่ง คือ Merb กับ Rails ตัดสินใจ ที่จะพัฒนา framework ทั้งสองตัวนี้ร่วมกัน โดยจะเอาของดีหลักๆ ของ Merb ไปใส่ใน Rails คือ
  • Agnosticism - คือการไม่ยึดติด เช่น ไม่ชอบ AcitveRecord เอาตัวอื่นได้ไหม
  • Modularity - คือการแยกเป็นส่วนๆ แยกไปเลยเป็น module ไว้ทำอะไร เวลาเขียน code ก็อย่าให้มันตีกัน
  • Improved performance - แน่นอน performance ดีขึ้น เร็วขึ้น
  • Public API - บังคับให้คนใช้ คือบางกรณี ดันไปเรียก method ที่ protected/private(ไม่เห็นใน API) ไว้ แต่ถ้าที่ protected/private นั้น มีการ update ล่ะ แน่นอน พังแน่ๆ ก็ต้องตามไป update code ใหม่
แต่ก็ใช่ว่า Merb จะตายไป ทีมก็ยังพัฒนาต่อ และก็ยังพัฒนาร่วมกับ Rails ด้วย แต่ออก Rails 3.0 เมื่อไหร่ มันจะเป็นสิ่งเดียวกัน

สำหรับคนที่ใช้ Merb อยู่ เขาแนะนำให้ใช้ต่อเลย เพราะมันคงใช้เวลาสักพักใหญ่ๆ ในการปรับปรุง ถ้า Rails 3.0 ออกมาอย่างเป็นทางการ ก็ไม่ต้องห่วงเพราะ Yehuda Katz บอกว่า
You will not be left in the cold and we’re going to do everything to make sure that your applications don’t get stuck in the past.

สำหรับคนที่กำลังศึกษาหรือสนใจที่จะศึกษา Merb ผมว่าน่าจะลองเลยครับ เพราะในที่สุดแล้ว แนวทางการเขียนหลักๆ ก็คงจะไม่ต่างจากที่เขียน Merb ในทุกวันนี้หรอก รูัก่อน เป็นก่อน ย่อมได้เปรียบ

ปล. นอกจากผมและสมาชิก codegent แล้ว มีใครใช้ Merb ในงานจริงๆ บ้างเนี่ย

links ที่เกี่ยวข้อง
http://merbist.com/2008/12/23/rails-and-merb-merge/
http://yehudakatz.com/2008/12/23/rails-and-merb-merge/
http://weblog.rubyonrails.org/2008/12/23/merb-gets-merged-into-rails-3
http://brainspl.at/articles/2008/12/23/merb-is-rails
http://splendificent.com/2008/12/the-merb-rails-merger-announcement-an-inside-opinion/
http://rubyonrails.org/merb

1 comment | Filed Under: Merb Ruby on Rails | Tags: merb merge ruby on rails

Ruby on Rails :: Fragment Caching

Posted by PunNeng, Sun Nov 09 22:19:00 UTC 2008

fragment caching เป็น post ต่อจาก page caching กับ action caching

ชื่อมันก็บอกอยู่แล้วว่าทำ cache แบบเป็นชิ้นๆ สิ่งที่นิยมทำ cache แบบนี้คือการ render เป็นส่วนๆ ในฝั่งของ html template ตัวอย่าง

  1
  2
  3
  4
  5
<b><%= @title %></b>
<% cache do %>
  a lot of text or ruby expression hear and it is 
  <%= render :partial => "topic", :locals => {:time => Time.now } %>
<% end %>

ในที่นี้ มันจะ cache ใน block ที่กำหนดไว้ โดยค่า default ในการอ้างถึงจะเป็นชื่อ action และ controller เช่น ถ้าจะ clear cache ก้อนนี้ จะเรียกใช้

expire_fragment(:controller => "topics", :action => "list")

ในความเป็นจริงแล้ว เราอาจจะมี cache หลายที่ในหนึ่งหน้า เลยมี options เพิ่มมา สำหรับกำหนดชื่อให้มันอีก

  1
cache(:action => "list", :action_suffix => "time")

ตัว action_suffix จะเป็นสิ่งที่ทำให้เราสามารถเข้าถึง cache ก้อนนี้ได้ เช่น

expire_fragment(:controller => "topics", :action => "list", :action_suffix => "time")

แล้วมันเอาไปเก็บไว้ที่ไหน??
จริงๆ ผมเขียนไปในตอนที่แล้วแล้ว ว่ามันเก็บไว้เป็น hash โดยใช้ ActiveSupport::Cache::MemoryStore เป็นตัวบันทึก

รายละเอียดเพิ่มเติมดูได้ใน API ได้เลย

1 comment | Filed Under: Ruby on Rails | Tags: cache caching ruby on rails

Ruby on Rails :: Action Caching

Posted by PunNeng, Sun Oct 26 21:09:00 UTC 2008

ต่อจากคราวที่แล้ว

ใน API ของ rails เอง เขียนอธิบายไว้ว่า มันไม่ได้ต่างอะไรกับ page caching มาก แต่ผมว่ามันค่อนข้างต่างเลยแหละ ถ้าจะพิจารณาการบันทึกข้อความสำหรับ cache

เรื่อง configuration ก็เหมือนกับ page caching ครับ จะข้ามไป

แล้ว Action Caching ใช้ตอนไหน ??
ก็ใช้ตอนที่เราต้องใช้ filter เช่น before_filter หรือ after_filter
ตัวอย่างที่เขาใช้อธิบายใน API คือ เรือ่ง authentication ใน code หน้าตาจะประมาณนี้

  1
  2
  3
  4
  5
class ListsController < ApplicationController
    before_filter :authenticate, :except => :public
    caches_page   :public
    caches_action :index, :show, :feed
end

จากตัวอย่างข้างบน จะมีการ authentication ที่ action index, show และ feed ถ้าหากไม่ใช้ caches_action แต่ไปใช้ caches_page แทน มันจะเขียน file.html แล้วมันจะไม่วิ่งเข้า before_filter :authetication
ทางแก้ก็คือ ใช้ caches_action แทน

โดยการเก็บ cache มันจะไปใช้ความสามารถของ Fragment Cache แทน สำหรับ Fragment Cache ไว้ตอนหน้าครับ ซึ่งมันจะเก็บ cache ไว้ที่ Hash ไว้ใน ActiveSupport::Cache::MemoryStore ครับ ถ้าเรา restart server มันก็จะหายไป ไม่ได้เก็บถาวรเหมือน Page Caching

ในการ clear action caching ก็ไม่ได้ซับซ้อนอะไร เพียงแค่

  1
expire_action :controller =>"lists", :action => "index"

นอกจากนี้ยังใส่เงื่อนไขได้ด้วย เช่น

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
class ListsController < ApplicationController
    before_filter :authenticate, :except => :public
    caches_page   :public
    caches_action :index, :if => Proc.new { |c| !c.request.format.json? } # cache if is not a JSON request
    caches_action :show, :cache_path => { :project =&gt; 1 }
    caches_action :feed, :cache_path => Proc.new { |controller|
      controller.params[:user_id] ?
        controller.send(:user_list_url, c.params[:user_id], c.params[:id]) :
        controller.send(:list_url, c.params[:id]) }
end

ข้อมูลเพิ่มเติมดูได้ที่ API เลยครับ

0 comments | Filed Under: Ruby on Rails | Tags: action caching cache ruby on rails

Ruby on Rails :: Page caching

Posted by PunNeng, Mon Oct 06 01:17:00 UTC 2008

รีบปั่นก่อน ก่อนที่ merb 1.0 จะออกมา เดี๋ยวจะไม่ได้เขียน blog สักเท่าไหร่ เพราะคงไปนั่งวุ่นอยู่กับ merb นี่แหละ

post อันนี้ คงจะอยู่ทั้ง blog ผม และ rails66.com ด้วย เขียนทีเดียว แปะมันทั้งสองที่

วิธีการทีจะลดการทำงานของ server ได้ หนึ่งวิธีในนั้นที่ช่วยได้เยอะเลยคือการทำ cache
ใน Rails เองมีการทำ cache อยู่ 4 ระดับ คือ

  • page caching
  • action caching
  • fragment caching
  • sql caching

และตัวควบคุมการลบ cache พวกนี้ ก็คือ

  • sweeper

อันแรกนี้ ขอเป็น page caching ก่อน

ซึ่ง page caching เนี่ย มันจะเก็บ output ไว้เป็น file โดย save ไว้เป็น html เลย โดยเก็บไว้ใน public/ ซึ่งสามารถเปลี่ยนที่เก็บได้ เดี๋ยวค่อยว่ากันอีกที เมื่อมันมี request มา มันจะวิ่งเข้าที่ file นี้แทน แทนที่จะวิ่งไปที่ controller แล้วก็ทำงานตามที่เราเขียนไว้

การทำ page caching นี้ เหมาะสำหรับอะไรที่มันอยู่นานๆ แล้วคงจะไม่เปลี่ยน เช่นระบบ blog ซึ่งปกติ จะไม่ค่อยแก้ไขอะไรเท่าไหร่ จะทำการลบ cache นี้ออก ก็ต่อเมื่อมีการ update หรือมีการเพิ่มข้อคิดเห็น(comment) เป็นต้น

เริ่มต้นด้วยการเปิด cache ก่อน โดยปกติ ถ้าเราทำงานใน development environment มันจะปิดระบบ cache ทั้งหมด แต่ถ้าสลับมาเป็น production environment มันจะทำการเปิด cache ทุกอย่าง ลองดูใน config/environments/production.rb

  1
config.action_controller.perform_caching = true

ไปตั้งค่าให้เป็น true ใน config/environments/development.rb มันก็จะไปเปิดตัวจัดการ cache ให้

สมมติว่าถ้าต้องการเปลี่ยน path ในการเก็บ cache ก็ใส่เพิ่มไปว่า

  1
config.action_controller.page_cache_directory = RAILS_ROOT + "/public/wherever/you/want/"

เวลาเข้าถึงก็ http://localhost:3000/wherever/you/want/file

วิธีเซ็ต page caching ก็ง่ายๆ เราใส่ไปใน controller ว่า

  1
  2
  3
  4
  5
  6
class PostsController < ApplicationController
  caches_page :show
  def show
    @post = Post.find params[:id]
  end
end

แค่นี้เอง

เวลาจะลบ cache สมมติว่าเราจะลบ หลังจากที่เรา update content ของเรา เราก็ใส่ใน controller ไปว่า

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
def update
  @post = Post.find params[:id]
  if @post.update_attributes params[:post]
    flash[:notice] = "Updated"
    expire_page :action => "show", :id => @post.id
    redirect_to :action => "index"
  else 
    render :action => "edit"
  end
end

expire_page จะไปทำการลบให้เองเลย สบายมากๆ (รออีกสักหน่อย เดี๋ยวจะเขียนเรือง sweeper มาจัดการตรงนี้ครับ)

แต่ก็ใช่ว่าจะไม่มีปัญหาเลย เพราะหลังจาก update เสร็จแล้ว เราควรที่จะแสดงข้อความอะไรบอกหน่อย ในที่นี้ผมใส่ไปใน flash[:notice] ปัญหามันคือ มันจะเก็บ cache ไว้ในขณะที่มีข้อความนี้อยู่บนหน้า เพราะมันจะเก็บตอนที่เราสั่ง redirect_to

วิธีซ่อมแบบไม่ลงแรงเลยคือ ใช้ plugin ที่ชื่อว่า Cacheable Flash

เอามาจาก นั่งเทียนเขียนข่าว#12 ครับ

โดยวิธีการมันก็ง่ายๆ ครับ คือเก็บข้อความไว้ใน cookie ก่อน แล้วก็ดึงมาแสดงผลด้วย javascript อีกที
แต่ผมไม่ค่อยชอบ น่าจะมีตรวจว่ามี flash หรือเปล่า ก็เลยลงมืองัดแงะปลุกปล้ำเสียหน่อยได้หน้าตาแบบนี้

  1
caches_page :show, :if => Proc.new{ |p| p.request.session.data["flash"].blank?}

คือ cache ถ้า flash message ว่าง
ดูเท่กว่าเยอะ

ปล. อาทิตย์หน้ามาต่อกับ action caching ครับ

ข้อมูลจาก rails api

1 comment | Filed Under: Ruby on Rails | Tags: flash page caching ruby on rails

codegent: we're hiring