Posted by: neokain | กุมภาพันธ์ 9, 2008

Javascript Rails Style

ต้องการที่จะส่ง parameter เข้าไปใน function ของ javascript เพื่อทำงานอะไรบางอย่าง

# controller
class TestController < ApplicationController

  def hello
    @hello1 = "Hello from parameter controller 1"
    @hello2 = "Hello from parameter controller 2"
  end
end

ที่ view ก็จะสามารถใช้ parameter ที่ส่งมาจาก controller ได้อยู่หลายอย่าง

<!-- view -->
<script type="text/javascript" charset="utf-8">
    alert("Hello from view")
</script>
<script type="text/javascript" charset="utf-8">
    alert("<%= @hello1 %>")
</script>
<% javascript_tag do %>
    alert("<%= @hello2 %>")
<% end %>

เมื่อ view source ก็จะได้ดังนี้

<!-- view source -->
<script type="text/javascript" charset="utf-8">
    alert("Hello from view")
</script>
<script type="text/javascript" charset="utf-8">
    alert("Hello from parameter controller 1")
</script>
<script type="text/javascript">
//<![CDATA[

    alert("Hello from parameter controller 2")

//]]>
</script>

เท่านี้ก็จะทำให้ function ของ javascript ใช้ได้ยืดหยุ่นมากขึ้น

Posted by: neokain | ตุลาคม 26, 2007

แก้ปัญหา Double Submits

คิดว่าหลายๆ คนคงจะเคยเจอมาบ้างตอนที่ทำการ submit แล้วไปกด submit อีกครั้ง ผลของมันคือมันจะไปสร้างข้อมูลแบบเดียวกันนั้น 2 ครั้งแน่นอนว่าไม่ดีแน่ๆ ใน rails ก็มี helper ที่ช่วยป้องกันได้อยู่ด้วย

<%= submit_tag 'Sign in', :disable_with => "Signing in ..." %>
Posted by: neokain | ตุลาคม 1, 2007

export http proxy

มันมีปัญหาอยู่ว่าจะทำการ gem install หรือ apt-get หรือใช้ wget ไม่ได้เพราะติดปัญหาเรื่อง http proxy วิธีการแก้ก็คือ export http proxy
export http_proxy=http://<username>:<password>@<host>:<port>
โดยเพิ่มบรรทัดข้างบนนี้ลง .bash_profile ของคุณเท่านี้ก็น่าจะใช้ได้
Posted by: neokain | ตุลาคม 1, 2007

ไม่ต้องการ commit ทั้ง folder ลง svn

เรื่องของเรื่องคือผมมี folder หนึ่งที่ไม่ต้องการ commit เข้า svn เช่น log โดยปกติแล้วหากเราไม่ต้องการจะ commit อะไรลงไปก็สั่ง svn:ignore แต่ว่าหากเป็น folder จะทำไง ก็ทำอย่างนี้
svn add --non-recursive log/
svn ps svn:ignore "*" log/
หลังจากนั้นก็สั่ง commit จะเห็นว่ามันจะไม่ commit folder log ลงไป
Posted by: neokain | ตุลาคม 1, 2007

Subversion Automation

ผมอยากให้ลองใช้ดูนะครับ ง่ายดี ทำให้การใช้ version control ไม่ยุ่งยาก ผมเองก็ใช้อยู่และที่เจ๋งของอันนี้คือ สามารถ export เป็น release version ได้ด้วย ลองดูนะครับ

ที่มา : Subversion Automation

Posted by: neokain | กันยายน 30, 2007

Remove all .svn folders from directory recursively

ปัญหาคือถ้าใช้ svn แล้วทุกๆ โฟลเดอร์จะมี .svn อยู่ จะลบมันทั้งหมดจะทำไง??? ก็ทำอย่างนี้
find . -name .svn -print0 | xargs -0 rm -rf
ซึ่งสามารถประยุกต์ใช้กับการลบอะไรก็ได้ที่อยู่ในโฟลเดอร์นั้นลงไปทั้งหมด โดยเปลี่ยนจาก .svn เป็นอะไรที่ต้องการจะลบ ที่มา : DZone Snippets
Posted by: neokain | สิงหาคม 1, 2007

Safari open debug mode

พิมพ์คำสั่งต่อไปนี้ใน terminal

defaults write com.apple.Safari IncludeDebugMenu 1

ปล. post ไว้กันลืม


เมื่อสักอาทิตย์ก่อนได้รับมอบหมายงานให้ทำการ upload รูปภาพโดยให้ลองกับ photo app. ที่ทำไว้ว่า rails จะลองรับการที่มี record มากขนาดสามล้านได้หรือไม่ ก็ทดลอง upload ไปได้เกือบๆ แสนหนึ่งแล้ว ณ ตอนนี้ ซึ่ง model ของงานนี้มี Photo, Category และ Tag ซึ่งมี relation ดังนี้คือ Photo many to many Category และ Photo many to many Tag จากนั้นให้ทำการ search โดยจะดูว่า rails จะให้เวลาในการค้นคืนเท่าไร และด้วยความอ่อนหัดผมก็เลยคิดว่าจะให้ search สามารถ search ได้ทั้งสาม model ซึ่ง function ของผมก็ออกมาเป็นอย่างนี้
def search
  @photos = Photo.find(:all,
    :conditions => ["photos.name LIKE ? OR photos.description LIKE ? OR
      categories.name LIKE ? OR tags.name LIKE ?",
      "%#{params[:search]}%", "%#{params[:search]}%",
      "%#{params[:search]}%", "%#{params[:search]}%"],
    :include => ["categories", "tags"])
end

จาก function ก็คือผมจะหารูปภาพ โดยให้หารูปที่มี category และ tag ตรงกับคำที่ใช้ search ด้วย แต่ผลที่ได้กลับเลวร้ายมากๆ ไม่น่าเชื่อแค่ข้อมูลไม่กี่ร้อยก็ช้าแล้ว การเขียนแบบนี้จะทำให้การ search ซ้ำซ้อนไปมา เป็นเพราะการ include model อื่นเข้ามาเกี่ยวด้วยในการ search หลังจากที่เกิดปัญหา ผมก็ตัดไม่ include model อื่นเข้ามา ให้หาแค่ใน model Photo เท่านั้นปรากฎว่าเร็วขึ้นเลย เพราะฉะนั้นใครคิดที่จะให้ function search ของตัวเอง search ได้ทุกอย่างบน rails app. แล้วล่ะก็ระวังด้วยนะครับ ไงๆ ทำเป็น advance search ดีกว่า
Posted by: neokain | มิถุนายน 1, 2007

Finding Intersection of Hash Keys

เรื่องของเรื่องก็คือ เราต้องการที่จะ copy record หนึ่งๆ จาก table หนึ่งไปยังอีก table หนึ่งซึ่งวิธีการทำก็ง่ายแสนง่ายโดย
r1 = Table1.find(:first)
r2 = Table2.create(r1.attributes)
ซึ่งจะทำอย่างนี้ได้ attributes ของ Table1 จะต้องเป็น subset ของ Table2 แต่ถ้าหากว่าใน Table1 มี attributes ที่ไม่อยู่ใน Table2 จะทำให้การ new record error ได้ คำถามคือ แล้วจะทำไง??? เนื่องจาก attributes จะเก็บเป็น Hash เราจึงมีวิธีการในการจัดการดังนี้
>> a = {“a”=>1,”b”=>2,”z”=>3}
=> {“a”=>1, “b”=>2, “z”=>3}
>> b = {“x”=>99,”y”=>88,”z”=>77}
=> {“x”=>99, “y”=>88, “z”=>77}
>> intersection = a.keys & b.keys
=> [“z”]
>> c = a.dup.update(b)
=> {“a”=>1, “x”=>99, “b”=>2, “y”=>88, “z”=>77}
>> inter = {}
=> {}
>> intersection.each {|k| inter[k]=c[k] }
=> [“z”]
>> inter
=> {“z”=>77}
จากตัวอย่างก็ไปประยุกต์ใช้กับการ copy record ได้โดย
r1 = Table1.find(:first)
r2 = Table2.new 

intersection = r2.attributes.keys & r1.attributes.keys
tmp = r2.attributes.dup.update(r1.attributes)
inter = {}
intersection.each { |k| inter[k] = tmp[k] } 

r2 = Table2.create(inter)
ก็คงประมาณนี้หล่ะครับ
Posted by: neokain | มีนาคม 26, 2007

นานแสนนานกับ rflickr

นานจริงๆ กว่าจะใช้ rflickr เป็นเราก็ทำตาม blog ของ Max S. Dunn แต่กว่าจะมาถึงบางอ้อก็ใช้เวลานานเหลือเกินไหนๆ ก็ทำได้แล้วก็ขอเขียน blog สักหน่อยจะได้ไม่มีใครต้องใช้เวลานานอย่างเราอีก ก่อนอื่นก็ลง rflickr เสียก่อนโดยการ gem
$ gem install rflickr
หากว่าคุณ gem ลง flickr ไปแล้วก็เอามันออกก่อนนะครับ
$ gem uninstall flickr
จากนั้นก็ต้องมี api key เสียก่อนโดยจะต้องสมัคร flickr เสียก่อนแล้วไปขอ api ที่

http://www.flickr.com/services/api/

จากนั้นก็ไปโหลดตัวอย่างมาจาก Max S. Dunn

http://www.maxdunn.com/rails_flickr.zip

แล้วไปเพิ่ม code ใน environment.rb

# Include your application configuration below
MY_CONFIG = {
  :flickr_cache_file => "#{RAILS_ROOT}/config/flickr.cache",
  :flickr_key => "3c10ddd41ae761c27d8dd516459ded57",
  :flickr_shared_secret => "640c5c5ce47ffa8b",
  :flickr_id => "29281775@N00",
  :rflickr_lib => true
}

จากนั้นไปเอา Flickr API Key ที่

http://www.flickr.com/services/api/key.gne

โดยต้องเลือกเป็น “For non-commercial use” และในหน้าถัดไปที่ “Authentication Type” ให้เลือก “Desktop Application” แล้วไปเอา Flickr ID ที่

http://idgettr.com/

เรียบร้อยแล้วก่อนจะใช้งานเราต้อง Generate a Flickr Token
$ ./script/console
Loading development environment.

>> f = MyFlickr.new
=> #<MyFlickr:0x3a59020 @blog_cache=nil, @group_by_id={}, ....

>> f.auth.getFrob
=> "4006181-547e8f82559635e1"

>> u = f.auth.login_link('read')
=>"http://flickr.com/services/auth/?api_sig=3a031ccb711d58cc4fc1cd26576887cb&frob=3462763e6bbacaeb35c9968&perms=write&api_key=c1dd096037d33c250fa4dbe9d3a8f2a3"
พอมาถึงตรงนี้ให้ copy url ที่ได้ไปที่ browser เพื่อเข้าไปที่ flickr แล้วทำการยืนยัน (ตรงนี้หละที่ติดอยู่นาน ก็ใครมันจะไปรู้หละ)
>> f.auth.getToken
=> #<Flickr::Token:0x3a7cda0 @token="121...

>> f.auth.cache_token
=> 137
จากนั้นก็ลองทดสอบการทำงานนะ ถ้าได้ก็โชคดีไป ถ้าไม่ได้ก็ตัวใครตัวมันแล้วกัน :-P

Older Posts »

หมวดหมู่