วันอังคาร, มีนาคม 24, 2552

เตรียมพร้อมสำหรับ Netbean 6.7

ปัญหาอันดับหนึ่งคือ short cut ใน netbean พอเราเปลี่ยนมาใช้ Profile Eclipse จะทำให้พวก command หรือ ctrl มันสลับไปเป็นของ windows หมด ทำให้ไม่คุ้นมือ สิ่งที่พอทำได้คือต้องไป map เอาเอง


จดเอาไว้กันลืมว่าต้อง map อะไรบ้าง

Edit
1. Go to Line [Meta+L]

Other
1. Extend Selection to Beginning of Line [Shift + Meta + Left]
2. Extend Selection to End of Line [Shift + Meta + Right]
3. Insertion Point to Beginning of Line [Meta+ Left]
4. Insertion Point to End of Line [Meta + Right]
5. Move Selection else Line down [Meta+Down]
6. Move Selection else Line up [Meta+Up]

System
1. Save [Meta+S]
2. Save all [Meta+Shift+S]

เท่านี้ชีวิตก็มีความสุขขึ้นอีกนิด

วันพุธ, มีนาคม 18, 2552

ความเป็น google citizen ของผม

ต่อไปการสังกัด Google, Yahoo, Microsoft หรือ Apple อาจจะรุนแรงกว่าการเป็นประชาชนของประเทศก็ได้ เพราะโลก online สำคัญขึ้นทุกวันๆ ไปอยู่ต่างประเทศยังไปได้ แต่ mail หายนี่แย่เลย (อดีตของผม หมดกัน)

identity ของเราในประเทศนี้คือบัตรประชาชน ส่วน identity ของตัวเราเองอาจเป็นการที่แม่ค้าปากซอยจำชื่อเราได้ มาในโลก online ก็มีเหมือนกัน เช่น Hi5, OpenID, หรือ Blog ของตัวเราเอง

ตอนนี้เริ่มแยกไม่ออกว่าสิ่งไหนเป็นสิ่งที่บอกตัวตนของเราได้มากกว่ากัน แต่ตอนนี้ผมเอา online identity ไปฝากไว้กับ Google มากมายทีเดียวครับเริ่มตั้งแต่

  • Mail: ผมใช้ gmail กับงานสำคัญที่ต้องอยู่กันยาวๆ
  • Second Mail: ผมใช้ google app จด apirak@apirak.com เอาไว้ ใช้งานทั่วไป แต่ไม่ใช้ถาวรเพราะ domain อาจจะหายได้ ถ้าผมไม่สามารถต่ออายุ ได้เป็นเวลานาน (เช่น โดนลักพาตัวหายไปสองปี หรือง่ายกว่านั้นคือลืม)
  • Docs: ความรู้ส่วนใหญ่เก็บ online ไว้ที่นี่ ไม่ต้องกลัวเครื่องพัง
  • Address book: ตอนนี้เก็บไว้กับ google หมดแล้ว มือถือหายก็ไม่กลัว
  • Calendar: วันเกิดแฟน วันพบกันครั้งแรก หรือวันสำคัญต่างๆ ก็ย้อนอดีตไปหาได้ตลอด
  • Blog: ผมไม่ทำ drupal, wordpress เองแล้วครับ พบว่าทำเองมี over head มากเกินไป ตอนนี้ apirak.com ย้ายมาอยู่กับ blogger ของ google ไปแล้ว
  • Blog 2: Blog อื่นๆ ก็มาอยู่กับ blogger หมด
  • Photo: ตอนนี้ใช้ Picasaweb อยู่ แต่ด้วยมีรูปไว้ 30G ตัว Picasa คงรับไม่ไหว รูป 5 ดาว เก็บไว้กับ Picasa หมด
  • IM: ใช้ GTalk บ่อยกว่า MSN ซะแล้ว
  • Feed: ตอนนี้ใช้ google reader หมดใจ ไม่เหลือให้ safari หรือ feed reader อื่นๆ แล้ว
  • Mailing list: ย้ายมาจาก Yahoo group มาอยู่ Google จนตอนนี้มี Group ของเพื่อนๆ เกือบ 10 กลุ่มแล้ว

แบบไม่เต็มตัว

  • Movie: ผมฝากให้บน youtube นะเฉพาะอันที่ต้องการใส่ใน blog นอกนั้นก็ยังเก็บไว้กับเครื่องตัวเอง
  • Notebook: เค้าปิดไปแล้ว ทำให้เกิดความสยองขึ้นมากมาย การจะย้าย content ไปไว้ที่ google docs ก็เหนื่อยอยู่
  • Map: สถานที่สำคัญ ผมจดไว้ในนี้ครับ โดยเฉพาะที่เที่ยวที่เคยไป หรือร้านอาหารอร่อยๆ
  • Visitor Statistic: ตัวชี้วัดความเป็นที่รู้จัก อันนี้อยู่บน Google Analytics ทุก blog
  • Feed Statistic: ก็ใช้ Feed burner ครับ กลายเป็นของ Google เหมือนกัน

ลองเขียนออกมาแล้วเยอะกว่าที่คิดเฮะ ถ้า AIG จะล้มละลายคงต้องให้ US ช่วยอุ่ม แต่ถ้า Google จะลม ทั้งโลกคงต้องช่วยอุ้มเลยละครับ

วันเสาร์, มีนาคม 14, 2552

Feedburner กลายเป็นของ Google ไปซะแล้ว

หลังจากย้ายบ้านมาที่ blogger วันนี้มาจัดการเรื่อง feed บน feedburner พอ login มันก็บอกว่าต่อไปให้ใช้ google account แทน แล้วพาเราเข้าไปที่

http://feedburner.google.com

ไม่รู้แบบนี้แปลว่า google ซื้อ feedburner ไปแล้วหรือเปล่า แต่ทำแบบนี้น่าสนใจทีเดียวเพราะช่วยให้ระบบโฆษณาสมบูรณ์แบบมากขึ้น คนทำ web ก็ไม่ต้องมาจัดการ โฆษณาผ่าน feed ด้วยตนเอง เพราะทำออกมาให้ดีได้ยาก

วันศุกร์, มีนาคม 13, 2552

ruby แปลงตัวเลข เป็นตัวหนังสือ

ตอยอดงานของคุณ MRTIGER จาก
http://admincmd.blogspot.com/2007/08/php-convert-digit-to-thai-word.html
เอามาแปลงเป็น ruby ได้ผลออกมาแบบนี้
def convert(number)
  txtnum1 = ['ศูนย์','หนึ่ง','สอง','สาม','สี่','ห้า','หก','เจ็ด','แปด','เก้า','สิบ']
  txtnum2 = ['','สิบ','ร้อย','พัน','หมื่น','แสน','ล้าน']
  number.gsub!(",","") 
  number.gsub!(" ","")
  number.gsub!("บาท","")
  numbers = number.split(".")
  
  if(numbers.length>2) 
    return "มีเครื่องหมาย '.' มากกว่า 1 ตัว" 
  end

  strlen = numbers.first.length
  convert = ""

  0.upto(strlen-1) do |i|
    n = numbers.first[i].chr.to_i
    if (n.chr != "0") 
      if ( i == (strlen-1) and n == 1)
        convert = convert + "เอ็ด"
      elsif ( i == (strlen-2) and n == 2)
        convert = convert + "ยี่"
      elsif ( i == (strlen-2) and n == 1)
        convert = convert + ""
      else
        puts "n = #{n.chr.to_i}"
        convert = convert + txtnum1[n]
      end
      convert = convert + txtnum2[strlen-i-1] 
    end 
  end

  convert = convert + "บาท" 
  if(numbers[1]=="0" or numbers[1]=="00" or numbers[1]=="")
    convert = convert + "ถ้วน"
  else 
    strlen = numbers[1].length
    0.upto(strlen-1) do |i|
      n = numbers.last[i].chr.to_i 
      if(n!=0)
        if(i==(strlen-1) and n==1)
          convert = convert + 'เอ็ด'
        elsif(i==(strlen-2) and n==2)
          convert = convert + 'ยี่'
        elsif(i==(strlen-2) and n==1)
          convert = convert + ''
        else
          convert = convert + txtnum1[n] 
        end
        convert = convert + txtnum2[strlen-i-1] 
      end
    end 
    convert = convert + 'สตางค์' 
  end
  return convert
end

x = convert('5,121.10 บาท')
puts x

โปรแกรมสามารถ Refractor ได้อีก 2 ตลบ อันแรกคือ loop แทนที่จะวนด้วยตัวเลข ก็ใช้ string.each ได้เลย อีกอันคือโปรแกรมนี้ทำส่วนจำนวนเต็มกับทศนิยม คล้ายกันมาก น่าจะแยกออกมาเป็น function ได้

วันอังคาร, มีนาคม 10, 2552

Rails podcast in Thai

ลองทำ pod cast ของ rails ดู เห็นมีหลายคนบ่นๆ ว่า rails podcast บน internet เป็น rails 1.2 มันเอามาใช้ไม่ได้กับ 2.0 ก็เลยลองทำของ 2.0 ดู ทำมาสองตัวคือ การเขียน blog ด้วย rails กับการเขียน blog แล้วมี comment ด้วย จริงๆ อยากจะเอาตัวที่เป็น blog ขึ้นมาก่อน แต่ดัน upload ตัวที่เป็น blog + comment เสร็จซะแล้ว ไว้จะเอาอีกตัวขึ้นวันพรุ่งนี้นะครับ

download

customize text_field

ได้แรงบรรดาลใจมาจาก blog ของ PunNeng หน้านี้ พยายามเอามาใช้กับ project ที่ทำงานอยู่แต่ทำยังไงก็ไม่ work ซะที สงสัยเพราะว่าใช้ rails คนละ version กัน ดูใน ruby trac เค้าบอกว่าจะปรับ attribute ของ form_for ใหม่ แต่ตอนนั้นดูแบบคร่าวๆ เพราะไม่รู้ว่าต้องแก้ตรงนี้

สุดท้ายมั่วไปมั่วมาได้ resolution ว่าให้สร้าง file doo_form_helper.rb ไว้ที่ app/helper แบบนี้

module DooFormHelper 
  def doo_form_for(record_or_name_or_array, *args, &proc) 
    form_for(record_or_name_or_array, *(args << {:builder => DooFormFor}), &proc) 
  end 

  class DooFormFor < ActionView::Helpers::FormBuilder 
    def text_field(method, options = {}) 
      @template.content_tag('p', label(method) + "" + super) 
    end 
  end 
end
จากนั้นที่ _form.html.erb ก็ใช้ doo_form_for แทน ผมลองบน rails 2.0.2 ครับ ไม่รู้ว่า 2.1 จะสามารถใส่ :builder ลงใน form_for เลยได้หรือเปล่า ประมาณนี้ แต่ผมชอบแบบใช้ doo_form_for มากกว่า ดูลึกลับดี ปล. ที่ใช้คำว่า doo ไม่ได้มีความหมายพิเศษครับ แต่เพราะ project ที่ทำงานชื่อว่า dooExpert เลยใช้คำว่า doo นำหน้าน่ะครับ

Rails podcast in Thai ตอน 1

Blog ก่อนหน้านี้ทำให้เข้าใจโครงสร้างของ MVC ชัดเจนมากขึ้น แต่สำหรับ video อันนี้จะเห็นเรื่อง Convention over Configuration ได้มากกว่า



download

ใช้ Number คำนวนเงินกู้

เมื่อก่อนตอนใช้เจ้า Number โปรแกรมสุดจ๊าบในชุด iWork คิดว่านี่ล่ะจะมาแทน MS Excel สิ่งทีประทับใจมากๆ คือการที่หนึ่ง Sheets สามารถมีได้หลายตาราง ทำให้เรามีอิสระมากขึ้นในการจัดหน้า แต่แล้วก็บรรลุว่า สิ่งที่สำคัญในโลกธุรกิจไม่ใช่ความสามารถของ Application แต่เป็น Compatibility ถ้าทำตารางขึ้นมาแล้วส่งไปให้คนอื่นดูไม่ได้ บางครั้งก็ถึงขั้นไร้ความหมาย แต่กับงานส่วนตัวนี่อีกเรื่องนึงครับ :) ผมพึ่งพบว่า Number มีต้นแบบสำหรับคำนวนเงินกู้ด้วย เหมาะกับผมซึ่งกำลังหาตังสร้างบ้านพอดีเลย

หน้าจอต้นแบบมีไว้ให้เราเปรียบเทียบลักษณะการกู้สามประเภท อย่างที่ผมลองทำ ผมกำหนดให้จำนวนเงิน และดอกเบี้ยเท่ากัน แต่ระยะเวลาผ่อนไม่เท่ากัน


ถ้าผมผ่อน 15 ปีจะจ่ายแค่เดือนละ 11,862 บาท แต่ทำให้ผมต้องจ่ายค่าดอกเบี้ยเป็น 635,143 บาท แทนที่จะจ่ายแค่ 280,873 บาท ถ้าเลือกผ่อน 7 ปี ถ้ามาดู sheet ที่สองจะเห็นว่าเดือนแรกผมผ่อน 11,862 บาทเป็นค่าดอกเบี้ยไปซะ 6,250 บาท คิดแล้วเศร้า ถ้าใครอยากลองให้เปิดโปรแกรม Number แล้วกด new

เลือก Loan Comparison อีกตัวอย่างที่เท่ไม่แพ้กัน คือ Mortgage เอาไว้คำนวนตอนซื้อบ้านหรือรถได้เป็นอย่างดี มีระบบเงินดาวให้ แถมมีคำนวนด้วยว่าจะเอาไปหักภาษีต่อปี ได้กี่บาท

พอลองใช้แล้วเริ่มติดใจ เรื่องการทำหลายตารางในหน้าเดียว ตอนกลับไปใช้ excel คงอึดอัดน่าดู

ถ้าคำนวนตามนี้จะเอาไปหักภาษีได้ปีละ 9,268 บาท :)

Love graph

มีบทความหนึ่งเขียนว่า

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

วันเวลาที่ผ่านไป ความเคยชิน เค้ามาแทนที่ สิ่งที่เห็นอยู่ทุกวันกลายเป็นสิ่งน่ารำคาญ เขาสงสัยว่า ทำไม เธอไม่สวยงาม น่าถนุถนอม เหมือนแต่ก่อน ทำไมเวลาจับต้องตัวเธอแล้ว เขาไม่รู้สึกเหมือนแต่ก่อน ทำไมนิสัยไม่ดีของเธอถึงได้ ผุดขึ้นมามากมายแบบนี้ เขารับเธอไม่ได้อีกต่อไป เขาทนไม่ได้ กับการเปลี่ยนแปลงของเธอ ความรักของผู้หญิงเริ่มต้นจาก ศูนย์ เขายังมีสิ่งที่เธอคิดว่าเธอไม่ชอบ ทุกอย่างของเขา ก็ไม่ได้น่าประทับใจอะไรมากนัก เธอตัดสินใจจะลองคบหากับเขา เพื่อที่จะศึกษา สิ่งที่ดีในตัวเขา เวลาผ่านไป เธอรู้สึกว่าเธอโชคดีที่สุดบนโลกนี้ ความรักของเธอให้เขาเกินร้อย ทุ่มเททุกอย่าง ที่เธอมีอยู่ เธอไม่รู้ตัวหรอกว่า.. คะแนนที่มากมายมันเพิ่มมาได้อย่างไรถึงขั้นนี้ ทุกสิ่งทุกอย่างที่เป็นเขา ช่างดูดี และน่าหลงใหล เธอพร้อมที่จะยอมสละทุกอย่าง เพื่อที่จะให้เขากับเธอ อยู่ด้วยกันตลอดไป

มาในวันนี้ เขาและเธอเหมือนอยู่กันคนละซีกโลก เขาคอยวิ่งหนีปัญหา แต่เธอกลับคอยวิ่งแก้ปัญหา วันนี้ เธอเป็นแค่เพียงคนน่ารำคาญ แต่วันนี้ เขากลายเป็นสิ่งๆเดียวที่ทำให้เธอมีชีวิตอยู่ วันนี้ความรักของเขาเต็มศูนย์ ในทางกลับกัน วันนี้ความรักของเธอที่ให้เขา แทบจะไม่มีวันหมดไป

บทความนี้เอามาจากคนอื่น แต่พอเอามาวิเคราะห์ ผมพบว่าสมการความรักของบทความนี้มันมาเพียงครึ่งเดียวเท่านั้น เลยเอามาคิดต่อบน OmniGraffle
download ตัวเต็ม

จริงๆ บทความนี้เขียนใน blog ส่วนตัวของ Bank กับ Kaew แฟนสุดน่ารัก ต้งแต่ปี 2007 แต่เห็นว่าน่าสนใจเลยเอามาลงไว้ที่นี่ด้วย แต่การวิเคราะห์ยังไม่จบแค่นี้ เดี๋ยวเอามา post ต่อ

Open Office 3.0

อ่าน review Open Office 3.0 แล้วตื่นเต้นครับ ดูความก้าวหน้าแล้วน่าสนใจทีเดียว ทั้งด้านความสวยงาม ความคิดสร้างสรรค์ และการเก็บรายละเอียด ต่างจาก version ผ่านๆ มาที่ถึงแม้จะดูสร้างสรรค์แต่ขาดการเก็บรายละเอียดทำให้ความสร้างสรรค์นั้นดูด้อยค่าลงไป ความประทับใจด้านความสวยงามเริ่มจากการปรับปรุง theme ของโปรแกรม Calc


สีที่ bar ด้้านข้างสวยขึ้นอย่างชัดเจน แม้ว่าจะอ่านตัวเลขได้ยากขึ้น แต่ก็น่าใช้กว่าเดิมมาก ส่วนสีที่ใช้สำหรับ hi-light ตัวตารางดีขึ้นอย่างไม่มีที่ดิ ตอนนี้ช่องที่ถูกเลือกจะถูกทับด้วยสีฟ้าจางๆ มองทลุไปถึงพื้นหลัง ทำให้ตารางยังคงความหมายต่างๆ ด้วยสีได้ แม้เวลาที่ถูก hi-light ก็ตาม ความประทับใจในด้านความคิดสร้างสรรค์ต้องยกให้โปรแกรม Impress ผมชอบหน้าจอ second screen มาก เมื่อก่อนใช้โปรแกรม keynote เวลา present จะให้หน้าจอบน present กับหน้าจอบนเครื่องไม่เหมือนกัน เพื่อใช้ดู note หรือดูหน้าจอต่อไป เวลาพูดจะช่วยให้ลื่นไหลมากขึ้น ตอนที่เห็นว่า MS Office บน mac สามารถทำได้เหมือนกันก็ดีใจครับ ทำออกมีลูกเล่นหลายอย่าง แต่ติดตรงที่ทำออกมาไม่สวยเลย :( ของ OO3.0 น่าจะคาดหวังได้มากกว่า



แสดงหน้าจอปัจจุบันใหญ่กว่าหน้าจอต่อไป เพราะวิธีนาทีที่เราพูด เราน่าจะสนใจตัวปัจจุบันมากกว่า (หวังว่าจะปรับแต่งเองได้ เพราะ slide บางประเภทหน้าถัดไปก็สำคัญกว่า) แต่ก็ 80/20 Rule ครับ



Note ใหญ่สะใจดีครับ ตัว default ของ keynote หน้า note มันอันนิดเดียวเอง อ่านไม่ถนัด กลายเป็นว่าตอน present จริงไม่สามารถอ่านได้เลย



หน้านี้ชอบที่สุด ผมว่าทุกคนที่เคย persent จะมีปัญหาว่า ตอนถามคำถามหลังการ present เราต้องเลือก slide ที่ผ่านไปแล้วกลับมาพูด และเราก็ต้องออกจากหน้า present มาเลือก slide ก่อน ทำให้ดูไม่ดีเท่าไหร โดยเฉพาะคนที่มี desktop รกๆ หรือมี wallpaper แบบส่วนตั๋วส่วนตัว บน Keynote และ MS Office ตัวใหม่ก็มี feature ในการเลือก slide โดยไม่ต้องออกจากหน้าจอ present ครับ แต่ไม่มีใครเอามาเรียงเป็น thumbnail แบบ OO3.0 เลย แบบนี้สิถึงจะใช้งานได้จริงๆ สำหรับชาว Mac อยากบอกว่า OO3.0 จะใช้ native display แล้วครับ แม่ต้องพึ่ง X11 อีกแล้ว



ก็หวังว่าเมื่อออกตัวจริง มันจะเร็วปรูดปราดไปเลย นะครับ ที่มา hehe2.net

Emac บน Mac

พยายามจะใช้ gEdit บน mac เพื่อให้ที่ทำงานกับที่บ้านใช้ editor ตัวเดียวกัน แต่ดันต้องใช้ผ่าน dawin port เลยไม่ใช้มันละ วันนี้ก่อนกลับบ้านคุยกับเพื่อนที่ทำงาน (เพื่อนชื่อ sid) เข้าบอกว่าเรียน emacs แล้วคุ้ม เพราะ IDE ส่วนใหญ่ต้องรองรับ short cut ของ emacs ทั้งนั้น คิดว่าได้เวลาทดลองใช้ emacs ซะที (ผมสาวก vi) อันดับแรกผมพยายามจะใช้ Aquamacs เพราะคิดว่ามันมี toolbar กับ menu มาด้วยน่าจะช่วยให้เห็นคำสั่งได้ง่ายขึ้น



ติดว่ามันใช้เวลา download ตั้งชั่วโมง 52.5 MB เลย download ทั้งไว้แล้วหันมาใช้ emac ที่มีมาบนเครื่องแล้วแทนไปก่อน เริ่มต้นด้วย การเปิด terminal แล้วพิมพ์

$ emacs
ที่หน้าแรกเค้าบอกว่าให้กด C-h t = Ctrl+h แล้วตามด้วย t มันจะพาเราเข้าสู่ tutorial บทเรียนแรกบอกว่า control key มีอยู่ 2 อันคือ C- กับ M- คาดว่าบน linux ตัว M คงใช้ปุ่ม alt แต่บน mac เป็นปุ่ม esc ครับ บทเรียนแรกคำสั่ง C-x C-c เป็นคำสั่งออกจาก emacs ครับ ให้กด Ctrl+x ตามด้วย Ctrl+c



ลงมาด้านลางจะเจอคำสั่ง C-v = ไปหน้าถัดไป M-v = ไปหน้าก่อนหน้า C-l = ทำให้ บรรทัดที่ cursor อยู่ มาอยู่ตรงกลางจอ terminal Basic cursor C-p = บรรทัดก่อน C-n = บรรทัดต่อไป C-b = อักษรก่อน C-f = อักษรต่อมา ลองทำแบบนี้ดูครับ ให้กด C-p เลื่อนบรรทัดลงมาเรื่อยๆ จนเจอบรรทัดที่สนใจให้กด C-l บรรทัดที่เราสนใจจะมาอยู่กลางจอทันที อันนี้ใช้แล้วรู้สึกโดน M-b = คำก่อนหน้า M-f = คำถัดไป

ปัญหาของการใช้ esc+f คือมันกด esc ค้างไว้ไม่ได้ :'( C-a = ไปอักษรตัวแรกของบรรทัด C-e = ไปอักษรตัวสุดท้ายของบรรทัด พี่หนึ่งเคยบอกว่า bash shell ใช้คำสั่งแบบเดียวกับ emac แสดงว่ามันใช้ Ctrl+a กับ Ctrl+e ได้เหมือนกัน C-x + u = undo C-) เลือน cursor ไปทางขวาจนพอใจ C-w = ลบตัวอักษรตั้งแต่ ที่กด C+ จะถึง C-w C-x s = เอาไว้ save buffer C-x C-s = save C-x C-f = เปิดไฟล์ C-x C-s = Save ไฟล์ C-x s = Save some buffers C-x C-b = List buffers C-x b = Switch buffer C-x 1 = Delete all but one window
วันนี้ได้คร่าวๆ ละ พรุ่งนี้พอ aquaemac เสร็จเดี๋ยวมาลองกันอีก

ปล1. มาถึงตอนนี้ผมรัก vi มากขึ้นเป็นกองเลยครับ :)
ปล2. ใครอยากเห็นการใช้ emac develop rails ขั้นเทพ ลองดู video นี้ครับ

Best way to query

การหาข้อมูลจำนวนมากช่างยากเสียจริงๆ วันนี้ผมเจอข้อมูลขนาด 9X0,000 Record เลยสับสนว่าควรออกแบบ query และ table แบบไหนดี ตอนนี้มีทางเลือกสำหรับ table อยู่สามแบบ


ข้อมูลจริงในตาราง foo จะมีขนาดประมาณ 9 แสน record ส่วนตาราง bars มีขนาดใหญ่กว่า foo สามเท่า ผมคิด query ได้ 5 แบบ รวมการ query ร่วมกับ ferret ด้วย
SELECT * from foos WHERE foos.id in ( 
  SELECT distince foos_bars.id 
  FROM foos_bars WHERE foos_bars.bar_id in [2,5,3]) 
แบบแรกใช้ sub query จาก table ตามหลักกระทรวงศึกษาธิการ
SELECT * from foos 
  JOIN foos_bars on foos.id = foos_bars.foo_id 
  WHERE foos_bars.id in [2,5,3] GROUP BY foos.id 
แบบที่สองก็ตรงตามหลัก แต่มันน่าจะช้ามากเมื่อเจอคำสั่ง
Group by SELECT * from foos 
  WHERE (bar LIKE '% ข %') 
  AND (bar LIKE '% จ %') 
  AND (bar LIKE '% ค %') 
แบบที่สาม ผมจะลองรวมสาม table มาเป็นอันเดียวแล้วค่อย query ลดการ join table และ group by
SELECT * from foos 
  WHERE (bar LIKE '%[2]%') 
  AND (bar LIKE '%[5]%') 
  AND (bar LIKE '%[3]%') 
แบบที่สี่ ผมทำคล้ายแบบที่สามแต่มีความเชื่อว่าตัวเลขจะเร็วกว่าตัวอักษร
ids = FoosBarsText.bar_search("ก","จ","ค") select * from foos_bars_text where bar in ids
สุดท้ายผมกะจะลองใช้ ferret มาร่วมในการ query ด้วย ถ้าจะเขียน model ของ FoosBarsText น่าจะเขียนประมาณนี้
include Ferret::Search 

class FoosBarsText < ActiveRecord::Base 

acts_as_ferret :fields=> ['bar'] 

def FoosBarsText.bar_search(search_inputs) 
  bq = Ferret::Search::BooleanQuery.new 
  search_inputs.each do |search_input| 
    bq.add_query(Ferret::Search::TermQuery.new(:bar, search_input) 
  end 
  filter = Ferret::Search::QueryFilter.new(bq) 
  @vobjects = Item.find_by_contents(search_text,
    :filter => filter, :sort => ["section", "sale_category"])  
  redirect_to :results 
  end 
end
สุดท้ายไม่รู้ว่าแบบไหนจะเร็วที่สุด ไว้ถ้าได้ทดลองจะนำมาเล่าให้ฟังนะครับ

Simple many to many

ช่วงนี้พยายามหาข้อมูลของ MySQL บังเอิญไปเจอสอง SQL นี้เข้า ในบทความเค้าบอกว่าผลลัพธ์ต่างกันอย่างไร

SELECT x.aid, x.bid, b.bdesc 
  FROM x LEFT JOIN b ON (b.bid = x.bid) 
  WHERE (x.aid = ‘whatever’)
A similar result may also be achieved using the following:
SELECT x.aid, x.bid, b.bdesc 
  FROM x, b 
  WHERE (x.aid = ‘whatever’) AND (b.bid = x.bid) 
The difference between these two SQL queries will only become apparent if an occurrence of table ‘B’ is missing for an occurrence of table ‘X’. With the first query all columns selected from table ‘B’ will be returned as empty. With the second query the effect will be that the occurrence of ‘X’ will be dropped from the selection.

ลองแปลดู ประมาณว่าถ้า table b ไม่เข้ากับเงื่อนไข * query แรกจะแสดง b.b_desc เป็นช่องว่าง แต่ * query ที่สองจะไม่แสดงทั้ง record ไปเลย

ที่มา tonymarston

เรียก controller method จากหน้า view

ปกติแล้วเราจะเรียก method ของ controller จากหน้า view ไม่ได้ วันนี้ได้ดู rails cast ถึงได้รู้ว่าถ้าใช้ method helper_method จะทำให้เราเรียก method นั้นจาก view ได้ เช่น เราสร้าง method foo แล้วบอกให้ method นี้เป็น helper_method

#blogs_controller.rb
...
def foo
  "bar"
end
...
helper_method :foo
จากนั้นทดลองเรียกใช้ในหน้า view

#index.html.erb


ตอนเรียกที่หน้า browser จะมีคำว่า bar ขึ้นมา แต่ถ้าไม่ใช้ helper_method มันจะขึ้น undefined local variable or method `foo' for # เพราะ rails หา method foo ไม่เจอ

ให้งานกับบ้านเป็นทีมเดียวกัน

ที่ทำงานผมใช้ Ubuntu พอกลับมาที่บ้านก็ใช้ Leopard ค่อนข้างลำบากมากๆ กับการสลับหัวให้ใช้ short cut ได้ถูกต้อง จริงๆ แค่แป้นสลับภาษาไทยกับกับ อังกฤษมันต่างกัน ก็สับสนแย่แล้ว ดังนั้นถ้าทำให้ development environment บน mac กับบน linux เหมือนกัน คงเป็นสวรรค์เลยทีเดียว เริ่มต้นครั้งแรกกับ Aptana ครับ Eclipse + Web + Rails สุดยอดแล้ว ก่อนหน้านี้หนีมันไปนานเพราะความไม่เสถียร crash เป็นระยะๆ แต่ตัวล่าสุดนี่ใช้ได้ทีเดียว ความพยายามต่อมาคือการเปลี่ยน Themes จากสีขาวเป็นสีเทา... มันก็พอทำได้ครับ แต่พิการสุดๆ เลยตัดสินใจวาง Aptana ไว้ก่อน เรื่อง themes นี่สำคัญกับผมมากๆ ครับ อันดับต่อมาคือ Netbean ติดตั้งง่าย ใช้งานสะดวก ปรับ themes ได้แทบจะสมบูรณ์ ติดว่า themes สำเร็จรูปที่ให้มา มันทำให้เสีย feature สำคัญของ IDE เช่นตอนที่ curser เราอยู่บนคำสั่งไหน คำสั่งเหมือนกันจะ hi-light ขึ้นมา พยายามหาที่แก้อยู่แต่หาไม่เจอ แต่นั่นไม่ใช่ปัญหาใหญ่เท่าการที่ NetBean บน mac มันหน้าตาเหมือนของเล่นเอามากๆ กลับมาเรื่องหน้าตาอีกครั้ง... ถัดมาคือ gEdit ไม่นึกเลยว่ามันสามารถใส่ plugin จนคล้าย textmate ได้ขนาดนั้น themes ที่ download มาพอปรับหน่อยก็ใช้ได้เลย แถม render text ได้สวยมากๆ ทั้ง Aptana และ Netbean เทียบไม่ติด แม้ว่ามันจะไม่มีความสามารถแบบที่ Aptana หรือ Netbean มี แต่ได้ความเร็วมาทดแทน ปิดๆ เปิดๆ สบายใจ จะติดตอนนี้ก็คือ macro ของมันทำได้แย่มากๆ ไม่ทำเสียดีกว่า พอได้ลองมาซักพักเริ่มชอบมากขึ้นเรื่อยๆ พวก macro แย่ๆ พอปรับให้เข้าทางก็เริ่มทำงานง่ายๆ ได้มากขึ้น ไม่รู้จะทำได้ถึงไหน หลังจากเริ่มสนุกกับ gEdit ขั้นตอนต่อมาคือเอามันมาลงบน mac ให้ได้ ทางเลือกก็มีไม่มากนักครับ เริ่มจากการลง Macport ก่อน...

เปลี่ยน theme ให้ Netbean

วันก่อนเพื่อนที่ทำงาน (Sid) บอกวิธีการเปลี่ยน theme ของ netbean ให้เป็น original swing (Metal) แทนแบบเดิมที่เป็น



วิธีการก็ง่ายมาก บน linux ให้เปิดไฟล์ netbeans.conf ที่อยู่ของไฟล์ขึ้นอยู่กับว่าเราเอา netbean วางไว้ที่ไหน %NETBEANS_HOME%/etc/netbeans.conf จากนั้นเพิ่มข้อความ
"--laf javax.swing.plaf.metal.MetalLookAndFeel" 
ต่อท้าย
netbeans_default_options= netbeans_default_options="-J-
Dcom.sun.aas.installRoot=/Applications/NetBeans/glassfish-v2ur2 -J-
Dcom.sun.aas.installRoot=/Applications/NetBeans/glassfish-v2ur2 -J-client -J-
Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Xverify:none -J-
Dapple.laf.useScreenMenuBar=true -J-Dsun.java2d.noddraw=true"


แก้ให้เป็น

netbeans_default_options="-J-Dcom.sun.aas.installRoot=/Applications/NetBeans/
glassfish-v2ur2 -J-Dcom.sun.aas.installRoot=/Applications/NetBeans/glassfish-
v2ur2 -J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -
J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true -J-Dsun.java2d.noddraw=true
 --laf javax.swing.plaf.metal.MetalLookAndFeel"

เมื่อเปิด netbean ขึ้นมาใหม่ ส่วนตัวผมสังเกตุว่ามันทำงานเร็วขึ้นและหน้าตาดูเรียบร้อย ขอบมุมเก็บได้ครบถ้วน กว่าแบบเดิม วินาทีนี้ผมขอใช้แบบนอกคอกกับระบบปฏิบัติการไปก่อน ไว้ themes ของ GTK หรอของ OSX ทำออกมาเรียบร้อยค่อยกลับมาใหม่ สำหรับคนที่ใช้ osx ให้ click ขวาบนโปรแกรม netbean แล้วเลือก show package content จากนั้นเข้าไปที่ Netbeans 6.1.app/Contents/Resources/NetBeans/etc/netbeans.conf ตอนแก้ไฟล์ก็ทำเหมือนของ windows ครับ

Single Table Inheritance

อุตสาห์ลง mac port จนสำเร็จ ดันเจอปัญหากับ X11 ซะนี่ สุดท้ายก็ใช้ TextMate ต่อไป..
บ่นนิดหน่อยก่อนเข้าเรื่อง วันนี้ได้มีโอกาศใช้ความสามารถ Single Table Inheritance ของ Active Record ซะทีครับ หลังจากที่ใช้ก็เกิดความประทับใจสุดๆ จดต้องเอามาแชร์ให้รู้โดยทั่วกัน



จากรูป ถ้าคิดแบบซื่อๆ การสร้าง Object 3 ตัวก็ต้องมี 3 ตาราง อันแรกเก็บ Player อันที่สอง สาม เก็บ Footballer กับ Cricketer แล้ว link กลับไปที่ Player สร้างแบบนี้ Normalize สุดๆ แต่ใช้งานยากที่สุดๆ เช่นเดียวกัน ดังนั้นถ้าพิจารณาแล้ว Footballer กับ Cricketer เก็บข้อมูลไม่ต่างกันมาก น่าจะเอาสาม table มารวมเป็น table เดียวมากกว่า วิธีการงานก็ง่าย เพราะ Active Record มันเตรียมมาให้เราแล้วครับ
ขั้นแรกให้สร้าง Table Player ให้มี column ชื่อ type

create_table :players do |t|
  t.string :type t.string :name t.timestamps 
end

จากนั้นก็สร้าง model สามตัว สามไฟล์

#/app/model/player.rb 
class Player < ActiveRecord::Base 
end

#/app/model/footbller.rb 
class Footballer < Player 
end

#app/model/cricketer.rb 
class Cricketer < Player 
end
เสร็จแล้วครับ ทดสอบได้โดยเปิด ruby script/console แล้วลอง

f = Footballer.new 
f.name ="Piyapong" f.save

ในฐานข้อมูลจะแสดง type เป็น Footballer ให้อัตโนมัติ ที่นี้ลองแก้ model เพิ่มเติมอีกหน่อย

#/app/model/player.rb 
class Player < ActiveRecord::Base 
end 

#/app/model/footbller.rb 
class Footballer < Player 
  def iam 
    "Footballer" 
  end 
end

#app/model/cricketer.rb 
class Cricketer < Player 
  def iam 
    "Cricketer" 
  end 
end
ลองใส่ข้อมูลลองใน ฐานข้อมูลสัก 4-5 record ให้มี Type เป็น "Cricketer" กับ "Footballer" สลับกัน เปิด irb แล้วลอง

players = Player.find(:all) players.each do |player| 
  puts player.iam 
end 
player แต่ละคนจะรู้ว่าตัวเองเป็นอะไร โดยที่เราไม่ต้องมา if ให้เสียบรรทัด ทำให้ code แยกเป็นสัดส่วน และดูสะอาดตาเป็นยิ่งนัก

Reference: hmartinfowler

เพิ่มเติม :) ในกรณีที่เราไม่ต้องการใช้ column type ในการทำ STI เราสามารถกำหนด manual ได้ด้วยคำสั่ง

#/app/model/player.rb 
class Player < ActiveRecord::Base 
  set_inheritance_column :player_type 
end

คำสั่งนี้ยังใช้ในกรณีที่เราต้องการ column type ไปใช้ทำอย่างอื่นที่ไม่ใช่ sit ก็กำหนดให้ column นี้เป็นอย่างอื่นไปเลย

#/app/model/player.rb 
class Player < ActiveRecord::Base 
  set_inheritance_column :no_sit 
end

เปลี่ยน theme ของ code ให้ NetBeans 6.1 คล้าย textmate

ผมชอบ themes สีเทาเพราะดูแล้วสบายตา จนเดี๋ยวนี้เริ่มติด จน code ที่พึ้นหลังเป็นสีขาวนานๆ แล้วแสบตา วันนี้ได้โอกาสต้องมา set netbean ที่บ้านเลยจดวิธีเอาไว้ก่อน [![theme](/downloads/nbt_mini.png)](/downloads/nbt.png) อันดับแรก download themes จาก [huikau](http://blog.huikau.com/2008/04/28/aloha-color-theme-for-netbeans-61) หรือ download ได้โดยตรงที่ [http://pages.huikau.com/AlohaTheme.nbm.jar](http://pages.huikau.com/AlohaTheme.nbm.jar) ถ้า link เสียผมเก็บไว้อีกชุด [download](/downloads/AlohaTheme.nbm_.jar) สำหรับ leopard เมื่อ download แล้วแก้ไฟล์ name ให้เหลือแค่ AlohaTheme.nbm click ขวาบนไฟล์ แล้วเลือก Get Info หรือเลือกไฟล์แล้วกด command + i แล้วแก้ extension โดยลบ .jar ออก ![info](/downloads/info.png) การติดตั้งให้กด menu > tools > Plugins เลือก tab downloaded กดปุ่ม Add Plugins... แล้วเลือก AlohaTheme.nbm กด install แล้วทำตามขั้นตอนไปจนจบครับ กดดู preference (apple menu > Netbeans > preference) หรือ Edit > option สำหรับ linux และ windows เลือก Font & Color แก้ Profile เป็น Aloha จาก นั้นเลือก menu diff แก้สีของ Added Text -> Black, Changed Text -> Dark Grey ปัญหาต่อมาคือสีตอน select กับสีที่ auto hilight มันเป็นสีเดียวกัน ผมใช้วิธีแก้ Hilighting > Selected text ให้เป็น RGB (63, 68, 79) สำหรับเรื่อง font ถ้าใช้ platform อื่นนอกจาก macintosh ให้ download ได้จาก [http://www.gringod.com/wp-upload/MONACO.TTF](http://www.gringod.com/wp-upload/MONACO.TTF) หรือจาก [http://www.gringod.com/2006/02/24/return-of-monacottf](http://www.gringod.com/2006/02/24/return-of-monacottf) ถ้าไม่ได้เอาใน attachment ของ blog ได้ครับ font อื่นๆ เอาที่นี่ครับ (http://www.gnome.org/fonts/) ต่อจากนั้นผมจะเลือก view > show line number และ เข้าหน้า preference เอา auto popup ออก เป็นอันเสร็จพิธีในเบื้องต้นครับ

ย้าย SVN Repository

วันนี้ได้ลองย้าย SVN Repository จากที่หนึ่ง ไปไว้ใน Repository ที่มีอยู่แล้วอีกที่หนึ่ง ตอนแรกคิดว่าต้องใช้ท่ายากเพราะไม่ได้เป็นการสร้างใหม่ แต่กับง่ายกว่าที่คิด ผมเริ่มจากการ dump reposity ออกมาก่อนด้วยคำสั่ง svnadmin dump repo_path > dump_file ในกรณีของ unix เราใช้ full path ได้เต็มๆ แต่ในกรณีของ windows มันจะบอกว่าไม่รู้จัก c: ผมแก้ปัญหาแบบ OTOP ด้วยการ cd ไปยัง directory ที่เก็บ repository ก่อน จะได้ไม่ต้องระบบ full path ขั้นตอนนี้ถ้าจะประยุกต์ใช้กับการ backup svn ก็ได้ เพราะ dump_file ก็คือ repository ทั้งตัวนี่เอง สำหรับการย้ายก็แค่ copy dump_file ไปไว้ folder เดียวกับ repository ปลายทางจากนั้นสั่ง svnadmin load new_repo < dump_file เช่นเดียวกับกรณี dump ถ้าเป็น windows มันจะไม่รู้จัก c: เราก็ cd ไปอยู่ที่เดียวกับ repository ก่อน แล้วค่อยสั่งครับ แต่บน unix ใช้ full path ได้สบายเลย ในกรณีที่เราไม่ต้องการเอา repository เดิมไปไว้ที่ root ของ repository ใหม่ เราสามารถใส่ path ลงไปได้เลย เช่น svnadmin load new_repo/project/name < dump_file การ load svn จะอ่าน dump_file แล้วค่อยๆ ใส่ข้อมูลลงไปทีละ revision ถ้าเดิม new_repo มี Head revision อยู่ที่ 100 และ dump_file มี Head revision อยู่ที่ 50 หลังจาก load แล้ว Head revision จะเท่ากับ 150 โดยข้อมูลใน dump_file จะเริ่มจาก 101 ถึง 50

MVC มุมมองใหม่ 3F to 3S

หลังจากนั่งทำ Refactoring code ของตัวเอง ทำให้ได้มุมมองใหม่ๆ จากที่เคยจิตนาการว่า [MVC](http://en.wikipedia.org/wiki/Model-view-controller) คือ 3F

  • Fat Model: พยายามยัดทุกอย่างลง model เพื่อให้มันอ้วนๆ
  • Fast Controller: เมื่อทุกอย่างไปอยู่ใน model ทำให้ view เปลี่ยนได้ง่าย
  • Flexible View: ต้องทำให้ View ปรับแต่งได้เร็วที่สุด
แต่จิตนาการแบบนี้กลับทำให้ผมพลาดครั้งใหญ่ หลังจาก Refactoring แล้วผมพบว่าเราไม่ได้ต้องการให้ model มันอ้วนเฮะ ผมต้องการให้ model มันฉลาดต่างหาก มองเหมือน model เป็นลูกน้องของ controller เปลี่ยนจาก

Fat model ไปเป็น Smart Model

เวลาพิจารณาว่าอะไรควรอยู่ใน model ก็ให้จับหลักว่าลูกน้องควรรู้อะไร เพื่อให้หัวหน้าสบายที่สุด

สำหรับ Fast Controller นั้นไม่ค่อยตรงเท่าไหร เพราะ controller ไม่ค่อยเปลี่ยนบ่อยขนาดนั้น สิ่งที่ต้องการคือ ความเข้าใจง่ายและ การทำงานความถูกต้องซะมากกว่า ยิ่งสั้นยิ่งผิดยาก ไม่ควรยาวเกิน action ละ 15 บรรทัด การเป็นหัวหน้าต้องสั่งน้อยๆ ถ้าเมื่อใดสั่งมากแสดงว่าลูกน้องเราไม่ฉลาด ต้องไปเพิ่มความฉลาดให้ลูกน้อง (model) ดังนั้นต่อไปผมจะเปลี่ยนจาก

Fast Controller มาเป็น Short controller

ข้อที่ผมพลาดมากที่สุดคือ Flexible view เมื่อพิจารณาจากจุดเริ่มต้น ผมเริ่มใช้ MVC เพราะผมต้องการแยกงานเขียน code ออกจากงานด้านออกแบบ ถ้าผมพยายามทำให้ View มัน Flexible ผลที่ได้คือ มี Business logic บางส่วนมาอยู่บน view ด้วย เพื่อแก้ปัญหานี้ ต่อไปผมจะพยายามจะนิยาม view ใหม่จาก

Flexible View ไปเป็น Stupid View

ให้ความฉลาดของ view มันอยู่ที่การออกแบบไม่ได้อยู่ที่ code ของโปรแกรม ผมไม่ได้หมายความว่าให้ใช้แต่ HTML/CSS นะครับการใช้ Helper ก็เป็นตัวช่วยให้ view มันโง่ๆ ด้วย สิ่งที่ไม่ควรมีบน view คือพวกการคำนวนหรือ Businees logic เราควรเตรียมให้เรียบร้อยมาตั้งแต่ model
เมื่อคิดได้ดังนั้นจึงเปลี่ยนนิยามของ MVC จาก 3F ไปเป็น 3S แทนครับ
  • Smart Model: เป็นลูกน้องที่ทำงานอย่างฉลาด ไม่ใช่ทำทุกอย่าง
  • Short Controller: ไม่ควรเกิน 15 บรรทัด ถ้าเกินแสดงว่าลูกน้องเราโง่อยู่
  • Stupid View: ให้ความฉลาดอยู่ที่การออกแบบ ไม่ได้อยู่ที่ code

ถ้าทำ Refectoring ต่อไปน่าจะได้มุมมองใหม่ๆ เพิ่มเติมอีก ถึงตอนนั้นนิยามอาจจะเปลี่ยนไปจากนี้ก็ได้ ตื่นเต้นจริงๆ

My new X11

ก่อนหน้านี้เคยพยายามลง [gedit บน leopard](http://gedit.darwinports.com/) โดยการลงผ่าน [dawinport](http://darwinports.com/) ใช้เวลานานข้ามวันเพราะแทบจะต้อง download GNome ทั้งตัว สุดท้ายมาตายที่ X11 ของเครื่องมันเดี้ยงๆ ไม่สามารถเรียกกระทั่ง xterm ออกมาได้ โครงการเลยต้องพักไว้ก่อน วันนี้มาเจอ [XQuartz](http://xquartz.macosforge.org/trac/wiki) เลย download มาใช้แทน default X11.app หน้าตา icon แบบนี้ ![x11](/downloads/x11.png) พอเปิด GEdit หน้าตา GTK แบบไร้ Theme ดูอนาจเป็นยิ่งนัก ![x11](/downloads/gedit.png) ทุกขอบหนา 2 pixel หมด ถ้าแค่เค้าลดมาให้เหลือ 1 pixel กับใช้สี dark gray แทนสีดำ มันจะดูดีขึ้นมากเลยนะเนี่ย ภาษาไทยยังไม่รู้ว่า set ตรงไหนแต่ default ไม่สามารถพิมพ์ไทยได้ ต้องหาวิธีกันต่อไป เท่าที่อ่านดู กอปรกับมันอยู่บน macosforge.org ทำให้คาดเดาว่ามันก็คือ X11.org นี่เอง แต่อาจจะกลายพันธ์เล็กน้อย เหมือน Open Office กับ Star Office อ่านที่เค้าเขียนว่า > The Xquartz project is an open-source effort to develop a version of the X.org X Window System that runs on Mac OS X. Together with supporting libraries and applications, it forms the X11.app that Apple has shipped with OS X since version 10.5. ขั้นตอนต่อไปตามหมายกำหนดการคือการแต่ง [gedit](http://www.gnome.org/projects/gedit) ให้เหมือน [textmate](http://macromates.com/)

แปลง gedit บน leopard ให้คล้าย TextMate

ทำออกมาแล้วได้ประมาณนีครับ ![gedit](/downloads/gedit3.png) **อันดับแรก ติดตั้ง Official Plugin กันก่อนครับ** เนื่องจากเราไม่มี apt-get เหมือนบน linux เลยต้องใช้ Dawin Ports แทน cd /opt/local/bin/portslocation/dports/gedit-plugins % sudo port install gedit-plugins ใครสนใจ download มา compile เองเอาได้ที่นี้ครับ * Download ได้จาก [live.gnome.org/GeditPlugins](http://live.gnome.org/GeditPlugins) * Direct download [gedit-plugins-2.18.0.tar.gz](ftp://ftp.gnome.org/pub/gnome/sources/gedit-plugins/2.18/gedit-plugins-2.18.0.tar.gz) Plugin ที่เราต้อง enable คือ * Session Saver: you can save the status of the tabs/files opened * Snippets: use quicly the most useful piece of code * File Browser Pane: a mini file browser embedded in the editor * Code comment: a shortcut to comment your code. Many languages are supported * กด ctrl + m เพื่อ comment * กด ctrl + shift + m เพื่อ un comment **ทำตัว Snap open** เมื่อก่อนจะพยายามเปิดจากด้านข้าง พอผึก Snap open มานานๆ พอเริ่มจำได้ก็เริ่มติด นอกจากจะเร็วแล้วยังช่วยให้เราจำไฟล์ในโปรแกรมของเราได้อีกด้วย * Download ได้จาก [upperbound.net](http://www.upperbound.net/snapopen/) * Direct download [snapopen-1.1.4.tar.gz](http://www.upperbound.net/snapopen/snapopen-1.1.4.tar.gz) เมื่อ download มาแล้วให้ untar ไฟล์แล้วนำทั้ง folder และไฟล์ plugin ไปใส่ไว้ที่ ~/.gnome2/gedit/plugins จากนั้นเข้าไปเปิดใช้ plugin ที่ menu > Edit > Preferences > plugins > Snap Open วิธีใช้ให้กด ctrl + alt + o ในการใช้ Snap Open ปัญหาที่เจอคือเรากด alt ไม่ได้ครับ :( ทางแก้คือ สร้างไฟล์ .xmodmap ขึ้นมาแล้วใส่ code ข้างล่างลงไป clear Mod1 keycode 66 = Alt_L keycode 69 = Alt_R add Mod1 = Alt_L add Mod1 = Alt_R save แล้ว restart X11 เป็นอันเรียบร้อย **ติด plugin Class browser** plugin นี้สำหรับคนที่มีไฟล์ยาวโดยเฉพาะครับ * Download ได้จาก [stambouliote](http://www.stambouliote.de/projects/gedit_plugins.html) * Direct download [gedit_classbrowser-0.2.1.tar.gz](http://www.stambouliote.de/download/gedit_classbrowser-0.2.1.tar.gz) untar แล้วเอาไปไว้ที่เดิม ~/.gnome2/gedit/plugins เมื่อ enable ผ่าน menu > Edit > Preferences > plugins เป็นอันเรียบร้อย ปัญหาคือมันเปิดเป็นหน้าต่างทิ้งไว้แบบ netbean หรือ eclipse ไม่ได้ต้องคอย click อยู่เรื่อยๆ (ยังไม่รู้ short cut) ใส่ syntax highlight ของ .rhtml, .html.erv และไฟล์อื่นๆ ของ rails ด้วยสามคำสั่งครับ curl http://robzon.kapati.net/rails/rhtml.lang > rhtml.lang sudo mv rhtml.lang /opt/local/share/gtksourceview-2.0/language-specs curl http://robzon.kapati.net/rails/rails.xml > rails.xml sudo mv rails.xml /opt/local/share/mime/packages sudo update-mime-database /opt/local/share/mime สามคำสั่งนี้ไม่เหมือนของ linux ต้องเปลี่ยน /usr เป็น /opt/local/share ครับ กับ leopard ไม่ได้ลง wget มาให้ แต่มี curl มาแทน **ติดตั้ง Word Completion** * Download ได้จาก [elias.hiex.at](http://elias.hiex.at/gedit-plugins/) * Direct download [auto_completion.gedit-plugin](http://elias.hiex.at/gedit-plugins/auto_completion.gedit-plugin) * Direct download 2 [auto_completion.py](http://elias.hiex.at/gedit-plugins/auto_completion.py) ต้องเอามาทั้งสองไฟล์ครับ สำหรับไฟล์แรกตอน download มา leopard จะเติม .txt ให้ ต้องลบออกไปก่อนนะครับ untar แล้วเอาไปไว้ที่เดิม ~/.gnome2/gedit/plugins เมื่อ enable ผ่าน menu > Edit > Preferences > plugins เป็นอันเรียบร้อย **ถึงขั้นตอนสำคัญสุด การทำ themes ให้เหมือน textmate ครับ** 1. ติดตั้ง Dark scheme สามารถ Download ได้จาก [http://grigio.org](http://grigio.org/tag/darkmate), Direct download [darkmate.xml](http://grigio.org/files/darkmate.xml) การติดตั้งให้เข้าไปที่ menu > Edit > Preferences > Font & Color > "+ Add..." 2. เลือก font เป็น monaco ครับ ของ windows กับ linux ต้องไป download มา แต่ของ mac มีอยู่แล้น ส่วนของการทำ test ขอละไว้ก่อนนะครับ (มีปัญหากับ ruby-gnome2) ที่มา [grigio.org](http://grigio.org/pimp_my_gedit_was_textmate_linux) ปล. Plugin อื่นๆ ที่ผมเลือกใส่จะมี * Color Picker: เอาไว้ใช้ generate Hex code ของสีครับ * Tag list: เอาไว้ดูว่า ตัวอักษรประหลาดต้องเขียนแบบไหนใน HTML * Draw Spaces: เอาไว้เขียนรูป tab "->" และช่องว่าง "." ครับ เลือกเป็นสีเข้มๆ ซัก #313131 กำลังดี

18 ข้อที่ควรระวังในการออกแบบห้องครัว

สร้าง Homepage มาหลายหลัง วันนี้ได้สร้างบ้านจริงๆ หลังจากออกแบบโครงเสร็จก็ถึงคิวรายละเอียดภายในบ้าง เริ่มจาก M:Mouth ไปเจอในหนังสือ room มีอยู่ 20 ข้อครับ แต่ผมเอาออกมาแค่ 18 ข้อที่พอจะทำได้ในบ้าน

1. ในห้องครัวคนจะใจจดใจจ่ออยู่กับอาหารทำให้ตกใจง่าย ดังนั้นควรระวังการยืนทำครัวแบบหันหลังให้ประตู

2. ควรวางปลั๊กตู้เย็นให้ถอดง่าย ไม่ไปซ่อนอยู่หลังตู่เย็น

3. ควรมีพื้นที่เตรียมอาหารกว้าง 0.80 - 1 เมตร เผื่อวางของที่หยิบมาจากตู้เย็นด้วย ให้ตู้เย็นไว้ด้านขวา อ่างล้างจานไว้ด้านซ้าย

kitchen

4. พื้นที่เดินในครัวควรกว้าง 1.2 เมตร กันเดินชนกัน เพราะต้องเดินอยู่แล้ว

kitchen

5. ตู้เย็นไม่ควรวางใกล้เตาอบ และถ้า build in ก็ควรมีระบายอากาศด้วย

6. ก็อกน้ำควรเป็นแบบโยกเพราะปิดเปิดง่าย แม้ว่าจะใช้มือสองข้างถือหม้ออยู่ก็ตาม

7. เตาไฟไม่ควรวางใกล้หน้าต่าง เพราะจะเปลืองแก๊ส ถ้าเป็นครัวกลางแจ้งไม่ควรเอาไว้ทิศตะวันตก หรือทิศใต้เพราะลมจะพัดไฟเข้าหาตัว เข้าหน้า

8. อย่าลืมที่วาง น้ำปลา ซีอิ้ว น้ำมัน น้ำตาล และเกลือ เอาไว้ใกล้ๆ เตาไฟ อาจทำเป็นชั้นที่ไม่มีฝากั้นก็ได้

9. ไม่ควรใช้ครัวฝรั่งถ้าชอบอาหารไทย ควรแยกออกไปทำนอกบ้าน

10. อย่าใช้หินอ่อน เพราะจะเปื้อนเข้าไปถึงเนื้อในได้ง่าย

11. ความสูงของเคาน์เตอร์ไม่ควรประมาณ 85-90 cm แล้วทำขอบล่างเว้าเข้าไป 8 cm สูง 10 cm

kitchen

12. เผื่อที่ไว้สำหรับเก้าอี้ เอาไว้นั่งหรือหยิบของที่สูงๆ

13. อย่าวางแผนเก็บจานชามไว้ที่สูง นอกจากจะทำให้เราไม่ได้ใช้แล้ว ยังทำให้มีโอกาสแตกอีกด้วย

14. ครัวสวยต้องให้มีที่เก็บของด้วย

15. เตรียมที่สำหรับเครื่องกรองน้ำไว้แต่เนิ่นๆ เพราะจะทำให้สวยยาก ยิ่งมีพวกขวดไว้หลายๆ ใบด้วย

16. ระวังไม่ให้ครัวร้อน ต้องระบายอากาศให้ดี ถ้ามีพัดลมก็ดี พยายามอย่าให้พัดเข้าเตาไฟ

17. เตรียมถังขยะมีฝาไว้นอกบ้าน ใกล้ครัว กันมด หรือแมลงสาบเข้าบ้าน

18. ติดตั้งถังดักใขมัน กันท่อตัน

Quick look plugin (Zip & Tar & Tar.gz)

ไปเจอ Quicklook plugin มาตัวนึง เอาไว้ใช้เปิด zip ไฟล์ หน้าตาประมาณนี้



วิธีใช้ให้ download ไฟล์จาก xdd

direct download
Archive.qlgenerator01.zip]

Download เสร็จก็ unzip แล้ว copy "Archive.qlgenerator" ไปไว้ที่

/Library/QuickLook/
หรือเอาไว้ใช้ส่วนตัวที่
~/Library/QuickLook/

จากนั้นสั่ง re launch ตัว finder ด้วยคำสั่ง re-launch Finder.app เป็นอันเสร็จกระบวนการ install เวลาใช้ให้ click บน zip ไฟล์แล้วกด space bar อาจจะช้านิดหน่อยในการเปิดครั้งแรก แต่ก็ถือว่า ok สำหรับ Quick look ครับ

ที่มา xdd

วันเสาร์, มีนาคม 07, 2552

Sketch Application for Omnigraffle

เวลาเอางานที่ออกแบบไปให้ graphic designer ดู เค้ามักแยกไม่ออกระหว่าง concept ของงานกับสิ่งที่เค้าสามารถใส่ความคิดลงไปได้ ทางออกก็คืออย่าทำ mockup ให้เหมือนของจริง

หลังจากลองใช้ stunsil ของ Omnigraffle มาหลายตัว พบว่ามันจะมีปัญหาเล็กๆ น้อยๆ ในการปรับแต่ง บ่อ/ขยาย อุปกรณ์ต่างๆ ที่มีมาให้ สุดท้ายเลยลองทำเองดู (เหตุผลจริงๆ คือที่มีมาให้มันไม่ค่อยเรียบร้อย)

ถ้าใครใช้ Omnigraffle อยู่แล้วอยากได้ component เพิ่มเติมก็บอกได้นะครับ ตัวนี้เป็น version application สำหรับ version web กำลังตามมาติดๆ เพราะต้องใช้เองด้วย

Download ได้ที่ Graffletopia.com/stencils/446