เอา ScreenSave มาเป็น background

จริงๆ คงมีน้อยคนที่อยากเอา ScreenSaver มาแทน background image นอกจากจะเอาไว้อวดเพื่อน เพราะถ้าเอามาใช้จริงคงลายตาน่าดู แถมเปลือง CPU

screensaver bg

วิธีการคือ เปิด terminal ขึ้นมาแล้วพิมพ์

  1. /System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine -background

เป็นอันเสร็จพิธี ถ้าอยากเอา background เก่ากลับมาก็ให้กด ctrl+c ที่ terminal ตัว ScreenSaver ก็จะหายไป

ที่มา - tuaw

เขียน Helper ช่วยในการสร้าง form

วิธีการใส่ label ให้ text_field สามารถทำได้ดังนี้ครับ

สร้างไฟล์ form_tag_helper.rb ใส่ไว้ที่ app/helpers

  1. module FormTagHelper
  2.  
  3.   def label_text_field(object, method, options = {})
  4.     options[:temp_label] = method if method
  5.     begin_html, end_html = wrapping_html(options)
  6.     begin_html + text_field(object, method, options) + end_html
  7.   end
  8.  
  9.   private
  10.   def wrapping_html(options)
  11.     label = options[:label] ? options.delete(:label) :options[:temp_label].to_s.titlecase
  12.     options.delete(:temp_label)
  13.    
  14.     generated_html = ""
  15.     generated_html << "<div>"
  16.     generated_html << "<label>#{label}</label>"
  17.  
  18.     generated_end_html = ""
  19.     generated_end_html << "</div>"
  20.      
  21.     return generated_html, generated_end_html
  22.   end
  23. end

จากนั้นใส่ include ApplicationHelper ไว้ใน application.rb ด้วยครับ

เวลาเอาไปใช้เราแค่ใส่สั้นๆ ใน view แบบนี้ครับ

  1. <% label_text_field :quotation, :cname, :label => "creater name" %>

ถ้ามีให้ใส่หลาย field จะยิ่งคุ้มมากๆ และในกรณีที่เราตั้งชื่อ field ดีๆ เราสามารถเขียนแค่

  1. <% label_text_field :quotation, :creater_name %>

เป็นการลด code เพิ่มความเข้าใจ และลดความเสี่ยงที่จะเกิด bug ไปในตัว

ฟังก์ชัน wrapping_html สร้างไว้เพราะในการใช้งานจริงเราไม่ได้มี label_text_field แค่อันเดียว เราอาจจะต้องมี label_text_area label_live_search label_text_field_require ด้วย เวลาแก้ไขจะได้แก้ที่เดียว

สำหรับสร้างฟอร์มแบบนี้ใน rails 2.0 ( f.label_text_field ) ลองดูที่ customize text_field นะครับ

หมดสมัยของการย่อชื่อตัวแปร

เมื่อกี้พยายามแกะ xml ของ Lexitron เพื่อนำมาสร้าง HTML ให้กับโปรแกรม Dictinary.app แล้วพบตัวย่อหลายตัว อ่านแล้วงงๆ

  1. <Doc>
  2.   <esearch>able-bodied</esearch>
  3.   <eentry>able-bodied</eentry>
  4.   <tentry>แข็งแรง</tentry>
  5.   <ecat>ADJ</ecat>
  6.   <esyn>healthy; fit</esyn>
  7.   <id>76</id>
  8. </Doc>

พยายามแกะ แล้วได้ความว่า

ตัวย่อ ตัวเต็ม คำแปร
esearch english search ตัวอักษรที่ใช้อ้างอิงตอนค้นหา
eentry english entry คำนี้ในภาษาอังกฤษ
tentry thai entry คำนี้ในภาษาไทย
ecat english category ประเภทของคำ
esyn english synchronize คำเหมือนในภาษาอังกฤษ
ethai english thai คำเหมือนในภาษาไทย

ปัญหาคือผมไม่รู้ว่าตัวเองเดาถูกหรือเปล่า ผมเข้าใจว่าคนออกแบบน่าจะคิดถึงเรื่องการเก็บข้อมูลถ้ามีซ้ำกันมากๆ จะทำให้ขนาดของไฟล์ใหญ่ จึงย่อคำให้เล็กลง แต่ยังไม่อยากย่อให้เหลือแค่ตัวอักษรเดียวเพราะอยากให้อ่านเข้าใจด้วย แต่สวนตัวผมคิดว่าถ้าจะย่อควรจะย่อให้เหลือตัวอักษรเดียวไปเลยครับ ถ้ากลัวอ่านไม่เขาใจ ให้ใส่ comment ที่หัวของ xml แทน หรือทางที่ดีกว่านี้คือใส่ตัวเต็มแล้ว compress file เอาอาจจะใช้ gzip ซึ่งทำให้ไฟล์มีขนาดเล็กลง และถ้า gzip มันฉลาดพอ มันน่าจะรวบคำพวกนี้ให้เหลือแค่ไม่กี่ bit ให้เราด้วยเลย จากนั้นก็ยกเป็นหน้าที่ของโปรแกรมอ่าน xml ที่จะต้องแตก zip ออกมาก่อนหรือแปลงไฟล์ไฟล์เป็นรูปแบบที่ต้องการก่อนนำไปใช้จริง

อีกตัวอย่างหนึ่งในเรื่องการตั้งชื่อ field ใน table เป็นตัวย่อ เช่น appdate, cname, no เป็นต้น ผมเข้าใจว่าการย่อชื่อ field มีประโยชน์ตอนที่เราเขียน SQL จะได้เขียนสั้นๆ ยิ่งต้องเขียน SQL ยาวๆ และ มากมายใน code การย่อตัวแปลยิ่งดูมีเหตุมีผลมากขึ้น แต่ในปัจจุบันเรามี ORM เข้ามาแทนที่การเขียน SQL ดังนั้นการย่อชื่อใน table นอกจากจะไม่จำเป็นแล้ว ยั่งทำให้สับสนอีกด้วย

ขอยกตัวอย่างของ Active Record การ query ข้อมูลจาก database เช่น การค้นหา quotation ที่สร้างโดยนาย A แบบที่สร้างชื่อ field แบบย่อ

  1. quotations = Quotation.find_all_by_cname(A)

หรือ

  1. quotations = Quotation.find_all_by_creatname(A)

เทียบกับ การใช้ชื่อ field แบบเต็ม

  1. quotations = Quotation.find_all_by_creater_name(A)

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

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

เขียน Helper แบบ Block

หลังจาก extend ตัว form_for มาได้ซักพัก ตอนนี้เจอโจทย์ว่าต้องสร้าง helper ที่มีตัวเปิดหัวปิดท้ายประมาณว่า

  1. <div class="label">
  2.   <p>
  3.      ....
  4.   </p>
  5. </div>

ส่วนที่อยู่ตรงกลางเราให้คนใช้ ใส่กันเอง ประมาณนี้

  1. <% label_wrapping do %>
  2.    ....
  3. <% end %>

ถ้าเรามี code ที่ต้องเขียนแบบนี้ซ้ำๆ โดยเฉพาะพวกหน้า form การเขียนย่อได้แบบนี้จะช่วยลด code ได้มาก และช่วยให้การแก้ไขในภายหลังทำได้จากจุดเดียวด้วย

วิธีการคือสร้าง Helper ประมาณนี้ครับ

  1.   def label_wrapping(options, &block)
  2.     begin_html = %{<div class="label"><p>}
  3.     end_html = %{</p></div>
  4.      
  5.     content = capture(&block)
  6.     concat(begin_html, block.binding)
  7.     concat(content, block.binding)
  8.     concat(end_html,block.binding)
  9.   end

สิ่งที่ return ออกมาคือ HTML ที่ถูก code ของเราครอบไว้แล้ว

โปรแกรม Leximac เพื่อ OS X Leopard

โปรแกรม Leximac version ค. ทำเป็น plugin กับโปรแกรม Dictionary.app ของ Leopard ไปเลยครับ

leximac edit

การใช้งานให้ download ไฟล์ข้อมูลมา unzip

จากนั้น copy ไปไว้ที่ ~/Library/Dictionaries หรือไม่ก็ /Library/Dictionaries ก็ได้ ถ้าเอาไว้ที่ home ของเราจะต้องสร้าง folder Dictionaries เอง ถ้าเอาไว้ตรงกลางก็ไม่ต้องสร้างครับ เมื่อวางเสร็จแล้วให้ restart Dictionary.app เป็นอันเสร็จพิธี

การใช้งานให้เปิดโปรแกรม /Application/Dictionary.app แล้ว search ตามปกติเราจะห็นคำแปลภาษาไทยอยู่ด้านล่าง ถ้าต้องการให้ขึ้นเฉพาะของ leximac ให้เลือก tab leximac ได้เลยครับ

Dictionary Thai-English on Leopard

สองสามวันนี้ลองเอาข้อมูล Dictionary ของ lexitron มาทำเป็น plugin dictionary ของ Leopard "Dictionary.app"

leximac

ตอนนี้ยังมีปัญหาอยู่หลายจุด เรียงตามลำดับความเลวร้าย ได้ดังนี้

  • อักษร "ก" หายไป ไม่รู้หายไปตอนไหน ต้องลองศึกษา utf-8 อีกทีว่าจะต้องแปลง ก.ไก่ ยังไง
  • มีแต่ dictionaty english -> thai เพราะยังไม่ได้แปลง thai -> english รอแก้ปัญหาแรกได้ก่อน
  • ตัว HTML ไม่สวย เพราะออกแบบ css แบบคร่าวๆ เท่านั้น
  • ยังไม่ได้ทำปกหน้า ปกหลัง
  • อยากทดลองแยกออกมาเป็น applicaiton สำเร็จรูปอีกตัว
  • อยากให้ dictionary ของเราใส่รูปได้ด้วย สุดท้ายอาจจะต้องทำ พจนานุกรมเสรี ให้ทุกคนเข้ามาแก้ไขได้เอง เหมือน wikitinary (ไม่รู้ว่า จริงๆ เราดูด xml ออกมาจาก wiki ได้หรือเปล่า)

ใครสนใจเอาไปทดลองใช้ชั่วคราว สามารถ download ได้ที่นี้ครับ Leximac_dictionary.zip หลังจาก unzip แล้วให้เอาไปไว้ที่ ~/Library/Dictionaries/ แล้ว restart โปรแกรม Dictionary.app จะเห็น tab Leximac ขึ้นมา

ทดลอง search ดูจะเห็นคำแปลภาษาไทยออกมาครับ

รบกวนผู้รู้ด้าน xml+utf-8 ฝาก comment ไว้ด้วยนะครับ ตอนนี้ยังไม่รู้จะทำยังไงให้ ก.ไก่ กลับมา

วาดครัวด้วย SketchUp

พักงาน dictionary มาวาดครัว ได้ออกมาประมาณนี้ครับ

kitchen

อันนี้ครัวฝรั่ง ส่วนครัวไทยอยู่นอกบ้านครับ

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

สร้าง Homepage มาหลายหลัง วันนี้ได้สร้างบ้านจริงๆ หลังจากออกแบบโครงเสร็จก็ถึงคิวรายละเอียดภายในบ้าง เริ่มจาก M:Mouth

ไปเจอในหนังสือ room มีอยู่ 20 ข้อครับ แต่ผมเอาออกมาแค่ 18 ข้อที่พอจะทำได้ในบ้าน

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

    kitchen

4. ยังมีต่อครับ >

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

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

Quick look 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

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

ทำออกมาแล้วได้ประมาณนีครับ

gedit

อันดับแรก ติดตั้ง Official Plugin กันก่อนครับ

เนื่องจากเราไม่มี apt-get เหมือนบน linux เลยต้องใช้ Dawin Ports แทน

cd /opt/local/bin/portslocation/dports/gedit-plugins % sudo port install gedit-plugins

ใครสนใจ download มา compile เองเอาได้ที่นี้ครับ

Plugin ที่เราต้อง enable คือ ยังมีต่อครับ >

Syndicate content