Displaying articles with tag howto

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: howto

Merb on Dreamhost

Posted by PunNeng, Sat Aug 02 20:18:00 UTC 2008

Get started

Make sure that Ruby on Rails Passenger (mod_rails) is enabled on your domain.
To do that, go to the Domains > Manage Domains section of your panel and then click the "Edit" link next to your domain. On the next page make sure "Ruby on Rails Passenger (mod_rails)?" is enabled. Also, specify your web directory and then click the "Save Changes" button.

Create a directory for compiled packages and Gems

I recommend Ruby 1.8.6 at for running Merb and it is Ruby 1.8.5 on Dreamhost currently. Fortunately, Dreamhost allows installing the own gems and pacakges and nateclark has already blogged which is really good way to follow.

Actually, I needed Readline also but I couldn't get it work. Can anyone get it work?

Install Merb

4 ninjas has already written how to. Install Merb locally and there will be a few problems when you install domysql(dopostgres and do_sqlite3) if you prefer DataMapper. On Ubuntu, it can't find lmysqlclient or can't find mysql.h
To fix that problems,

$ sudo apt-get install mysql
$ sudo apt-get install libmysqlclient15-dev

On OSX, there will be a problem also. The problem is it can't find mysql home. To fix that, open Rakefile in do/do_mysql/ and change these codes below

  1
  2
  3
task :install => [ :package ] do
  sh %{#{SUDO} gem install --local pkg/#{spec.name}-#{spec.version} --no-update-sources}, :verbose => false
end

to

  1
  2
  3
task :install => [ :package ] do
  sh %{#{SUDO} gem install --local pkg/#{spec.name}-#{spec.version} --no-update-sources -- --with-mysql-dir=/usr/local/mysql}, :verbose => false
end

add

-- --with-mysql-dir=/usr/local/mysql

After you install all gems on your machine, you will have a lot of gems. Just upload all gems to your home on DH and install them.

I have had problems with Dreamhost's shared gems conflicting with gems that you install locally. To fix that, open ~/.bashrc and change $GEM_PATH to

export GEM_PATH="$GEM_HOME"

Merb app configuration

create config.ru to your home app

  • app
    • ...
    • public
    • config.ru << add it

and put these codes below to config.ru

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
# config.ru

ENV['GEM_PATH'] = '/home/your_home/.gems/' # your local gem home

require 'rubygems'
# There were a few problems on loading merb-core at the firt time after Passenger pid has been killed. These codes below were added to fix.
["/home/your_name/.gems/gems/abstract-1.0.0/bin", 
"/home/your_name/.gems/gems/abstract-1.0.0/lib", 
"/home/your_name/.gems/gems/erubis-2.6.2/bin", 
"/home/your_name/.gems/gems/erubis-2.6.2/lib", 
"/home/your_name/.gems/gems/json_pure-1.1.3/bin", 
"/home/your_name/.gems/gems/json_pure-1.1.3/lib", 
"/home/your_name/.gems/gems/rspec-1.1.4/bin", 
"/home/your_name/.gems/gems/rspec-1.1.4/lib", 
"/home/your_name/.gems/gems/mime-types-1.15/bin", 
"/home/your_name/.gems/gems/mime-types-1.15/lib", 
"/home/your_name/.gems/gems/merb-core-0.9.4/bin", 
"/home/your_name/.gems/gems/merb-core-0.9.4/lib"].each do |path|
  $LOAD_PATH << path
end
require 'merb-core'

Merb::Config.setup(:merb_root   => ".",
                   :environment => ENV['RACK_ENV'])
Merb.environment = Merb::Config[:environment]
Merb.root = Merb::Config[:merb_root]
Merb::BootLoader.run

run Merb::Rack::Application.new

and

$ touch tmp/restart.txt

for restarting

Example

Thanks again:
nateclark
4 ninjas
Merb's wiki

5 comments | Filed Under: Merb | Tags: howto

Adding svn repos to github

Posted by PunNeng, Sun Jul 27 23:43:00 UTC 2008

ช่วงนี้กำลังต่อสู้กับ git อยู่ครับ แล้วก็ยังมึนๆ กับมันอยู่ ยังไม่ค่อยเข้าใจอะไรกับมันมาก
แล้วยังกระแดะจะให้มันมาใช้คู่กับ svn อีก ก็ Capistrano บน Dreamhost มันใช้ได้แค่ svn นี่หว่า ก็มาลุยกัน

สมมติว่าติดตั้ง git-svn ไปแล้ว
ก็ clone repo ก่อน

$ git svn clone http://svn.yoursite.com/your_project --trunk=trunk
มันก็จะ init ค่าต่างๆ ใน .git/config สำหรับ svn ให้ แล้วไป init ค่าสำหรับ github
$ git remote add origin git@github.com:YourUsername/your_project.git
$ git push origin master
ก็ลองดูใน .git/config ดูนะครับ ว่ามัน config อะไรเพิ่มไป ใส่เพิ่มว่า
[branch "master"]
    remote = origin
    merge = refs/heads/master

แล้วก็แก้งานไป ตามปกติ แล้วลอง

$ git status
$ git add .
$ git commit -m "your comment"

ณ ตรงนี้ มันจะไปแก้ refs/head/master เป็นค่าๆ นึง ซึ่งเป็นค่าใหม่
ถ้า push จะปกติดี
แต่ปัญหามันอยู่ที่ ถ้า

$ git svn dcommit

ไปก่อน มันก็จะไปจัดการในส่วนของ svn ให้ แต่มันจะไปแก้ refs/head/master เป็นอีกค่านึง(ต่อจากอันเก่า)
พอสั่ง push คราวนี้ จะไม่ได้แล้ว มันจะขึ้นว่า

error: remote 'refs/heads/master' is not a strict subset of local ref 'refs/heads/master'. maybe you are not up-to-date and need to pull first?

อันนี้ เป็นสิ่งที่ยังงงอยู่ ผมเข้าใจว่า ค่าเก่า(ก่อน commit) กับค่าใหม่(หลัง commit) มีอะไรเชื่อมกันอยู่ ถ้า push ก็จะได้ปกติ
แต่ถ้า dcommit แล้ว push มันคงเอาค่าเก่า(ก่อน commit ค่านี้จะอยู่บน github ด้วย) มาทำอะไรกับค่าใหม่กว่า(หลัง dcommit) สิ่งที่เชื่อมกันอยู่ คงจะไม่ถูกต้อง เพราะมันเหมือนกระโดดไปสอง step ใครก็ได้ กรุณาช่วยหาคำตอบให้ผมหน่อยนะครับ ขอบคุณล่วงหน้าครับ อุอุ

วิธีซ่อมคือ

$ git pull origin master

เป็นอันเสร็จพิธี

ถ้า push ก่อน แล้ว dcommit มันจะตรวจว่ามีการแก้ล่าสุดหรือเปล่า กรณี้นี้ ไม่มีการแก้ไขล่าสุด มันจะ reset refs/heads/master เป็นตัวเก่า เลยปกติ
เพราะฉะนั้น ก็ push ก่อน dcommit ละกัน

1 comment | Filed Under: General | Tags: howto

Installing Merb

Posted by PunNeng, Sun Jul 13 15:50:00 UTC 2008

เกริ่นก่อนนิดนึง อะไรคือ Merb??

Merb ก็เป็น MVC Framework เช่นเดียวกับ Ruby on Rails เพียงแต่มันสามารถกำหนดฝั่ง View และ Model เองได้ แต่เห็นจะเน้นไปที่ฝั่ง Model มากกว่า สามสิ่งที่นิยมใช้กับฝั่ง Model ก็คือ ActiveRecore, DataMapper และ Sequel

นั่นหมายความว่า เราสามารถจะเอาไอ้นั่น ไอ้นี่ มาปะติดปะต่อเองได้ เรื่องของเรื่องคือ Ruby on Rails มันช้า magic มันเยอะ บางคนไม่ชอบ magic เพราะมันเกินความจำเป็น(แต่ผมชอบ) ถ้าตัดออกได้ หรือเปลี่ยนได้ ก็น่าจะดีกว่า กอปรกับความเทอะทะของ Rails เอง ทีมที่พัฒนา Merb ก็เลยจัดการเขียนใหม่ซะ

จุดเด่นโดยรวมของ Merb ก็คือ เรื่องความเร็ว(ที่ดีกว่า Rails) และการเลือกใช้ฝั่ง View และ Model เองได้(ผมเลือก DataMapper)

มาเริ่มติดตั้งกัน
ผมจะติ๊งต่างว่าทุกท่านที่เข้ามาอ่านใน blog ผม คงจะเคยติดตั้ง Rails กันมาบ้างแล้ว และสิ่งหนึ่งที่จำเป็นต้องมีคือ RubyGems ดังนั้น ผมจึงข้ามเรื่องการติดตั้ง RubyGems ไป

ก่อนที่จะติดตั้งได้สมบูรณ์ ก็ลองผิดลองถูกมานาน จนได้สูตรสำเร็จว่า update มันใหม่ให้หมด ก็ติดตั้งได้เอง ก็เริ่มด้วยการ upgrade RubyGems ละกัน

$ sudo gem update --system

และ Ruby(1.8.6 เป็นอย่างต่ำ)
วิธีการ upgrate ขึ้นอยู่กับแต่ละท่านครับ บางคน apt-get บางคน MacPorts หรือบางคนก็ compile เองแม่งเลย

สิ่งต่อไปที่ต้องมีคือ Git
บน Ubuntu

$ sudo apt-get install git

บน OSX Leopard

บน OSX Tiger

ก่อนจัดการกับ Merb ก็ติดตั้งพวก gem dependency ก่อน

$ sudo gem install rack mongrel json erubis mime-types rspec hpricot mocha rubigen haml markaby mailfactory ruby2ruby

จากนั้น clone Merb มาด้วย

$ git clone git://github.com/wycats/merb-core.git
$ git clone git://github.com/wycats/merb-plugins.git
$ git clone git://github.com/wycats/merb-more.git

แล้วก็ติดตั้ง

$ cd merb-core ; rake install ; cd ..    
$ cd merb-more ; rake install ; cd ..
$ cd merb-plugins; rake install ; cd ..

ฝั่ง Model ผมเลือก DataMapper เพราะหน้าตาคล้ายกับ ActiveRecord แต่เบากว่า

clone driver ก่อน

$ git clone git://github.com/sam/extlib.git  
$ git clone git://github.com/sam/do.git

แล้วก็ติดตั้ง

$ cd extlib ; rake install ; cd ..
$ cd do 
$ cd data_objects ; rake install ; cd ..
$ cd do_mysql  # || do_postgres || do_sqlite3
$ rake install

ผมเลือก mysql

ขั้นตอนนี้จะมีปัญหานิดหน่อย ขณะที่ติดตั้ง do_mysql
บน Ubuntu ถ้าหากใช้ mysql ที่ติดตั้งเอง แล้ว home directory มันไม่อยู่ที่ default path มันจะมองหา mysql home ไม่เจอ และอีกปัญหานึงคือ มันจะหา mysql.h ไม่เจอ วิธีซ่อมคือ

$ sudo apt-get install mysql

และ libmysqlclient15 สำหรับ myslq.h มันจะไปอยู่ใน /usr/include/mysql

$ sudo apt-get install libmysqlclient15-dev

สำหรับ OSX ก็เหมือนกัน มันจะหา home directory ไม่เจอ ผมแนะนำให้โหลดจากเว็บมันเลย ที่หน้า download อันนี้มี mysql.h มาให้ด้วย
มันยังไม่ใช่แค่นี้ ต้องไปใช้กำลังกันหน่อย
ตอนติดตั้ง mysql ไอ้ home directory มันจะไปอยู่ที่ /usr/local/mysql
ก็ต้องไประบุเพิ่มนิดนึงใน Rakefile ของ do_mysql จะมี

  1
  2
  3
task :install => [ :package ] do
  sh %{#{SUDO} gem install --local pkg/#{spec.name}-#{spec.version} --no-update-sources}, :verbose => false
end

ให้เพิ่ม -- --with-mysql-dir=/usr/local/mysql ไปด้วย เป็น

  1
  2
  3
task :install => [ :package ] do
  sh %{#{SUDO} gem install --local pkg/#{spec.name}-#{spec.version} --no-update-sources -- --with-mysql-dir=/usr/local/mysql}, :verbose => false
end

ยังไม่จบครับ clone ตัว DataMapper กันต่อ

git clone git://github.com/sam/dm-core.git
git clone git://github.com/sam/dm-more.git

แล้วก็ติดตั้ง

$ cd dm-core ; rake install ; cd ..
$ cd dm-more ; rake install

เท่านี้น่าจะเสร็จสิ้น ลองแบบง่ายๆ

$ merb-gen app your_project_name
$ cd your_project_name
$ merb

ก็น่าจะทำงานได้ปกติ ถ้าไม่ปกติ ก็ลง comment หรือ error ไว้ได้ครับ จะช่วย debug

ปล. ยังมีตอนต่อไปอีกหลายตอนครับ
ปอ. สำหรับบน Windows ไปเอาตัวรอดกันเองนะครับ =='

ข้อมูลจาก merb.4ninjas

2 comments | Filed Under: Merb | Tags: howto

Modifying fieldWithErrors

Posted by PunNeng, Sat Jul 05 20:33:00 UTC 2008

fieldWithErrors เนี่ย บางทีมันก็มีประโยชน์ดีนะ แต่บางทีก็อยากจะเอาออก หรืออยากจะแก้ไข

เอาแบบนี้ดีกว่า

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
ActionView::Base.field_error_proc = Proc.new do |html_tag, instance|          
  if html_tag =~ /<label.*>.*<\/label>/
    "<div class=\"labelWithErrors\">#{html_tag}</div>" 
  elsif html_tag =~ /terms_and_conditions/   
    "<div class=\"tickWithErrors\">#{html_tag}</div>"
  elsif html_tag =~ /radio/
    "<div class=\"radioWithErrors\">#{html_tag}</div>"     
  else
    "<div class=\"fieldWithErrors\">#{html_tag}</div>"      
  end                            
end

ใส่ไปใน environment.rb
ใครมีความคิดอะไรก็ใส่ไปให้หมด สำหรับผมการ filter ง่ายๆ ก็ใช้ RegExp ครับ

ไม่มีกะจิตกะใจจะเขียนเท่าไหร่ กำลังทะเลาะกับ Merb อยู่ ทำไมมันติดตั้งยากเยี่ยงนี้ !!

0 comments | Filed Under: Ruby on Rails | Tags: howto

codegent: we're hiring