Archive for the 'วิธีแก้ปัญหาเขียนโปรแกรม' Category

10 ข้อแนะนำเวลาใช้ PHP MVC Framework

ห่างหายไปนานพอตัวแถมยังติดค้าง Barcamp Bangkok วันที่ 2 อีกถ้าว่างแล้วเดียวผมจะรีบเขียนเลยครับผม :) เอาละเข้าเรื่องกันเลยวันนี้ผมจะฝากข้อแนะนำง่ายๆไว้ละกันครับ 10 ข้อ

  1. แยก Business Logic ให้ออกจาก View อย่างชัดเจน เช่น ในโค้ดส่วนของ View ไม่ควรมีประมาณนี้ครับ
    if(user_login() && not_admin()) ควรจะเปลี่ยนให้เป็นตัวแปรแค่นี้พอ if($logged_in_and) เพื่อความง่ายในการอ่านและแยกส่วน Business Logic
  2. พยายามอย่าเขียนโค้ดซ้ำ ถ้ารู้ตัวว่ากำลังเขียนโค้ดซ้ำ ให้พยายามหาทางแก้ เช่น เขียน function is_login() ใน user class เพื่อถามว่า login รึยัง แต่ดันใช้ function นี้ในคลาสอื่นๆ ดังนั้นเราควรจะย้าย function is_login() ไปอยู่ภายใต้คลาสแม่ที่แต่ละ class อื่นๆของเราถูก implement ขึ้นมาเช่น Controller
  3. หลายๆ Framework จะไม่มีการกำหนดว่าเราต้องกำหนดชื่อในไฟล์และโฟลเดอร์ view อย่างไร และเวลาเรียกก็ต้องทำเอง ผมมีสิ่งที่ผมลองมาแล้ว รู้สึกว่าไม่ได้ผลคือการที่พยายามจะเรียก view ที่ประกอบกัน เช่นมี header footer จากภายใน Controller สรุปแล้วมันยุ่งเหยิงมาก ส่วนวิธีแก้ก็คือในไฟล์ view แต่ละหน้านั้นให้ include header footer ลงไปเลย แต่พยายามใช้เป็นแบบ function ทำเองจะได้ปรับแก้ไขสะดวกเพราะมันจะมีพวก parameter บางอย่างที่ต้องเปลี่ยนไปในแต่ละหน้าแต่ใช้ header ตัวเดียวกัน เช่น title
  4. เรื่องการ validation และเรื่องจัดการเวลาเกิด error เป็นสิ่งที่ไม่ควรละเลย เพราะเราต้องทำการ validation กันอยู่หลายๆหน้า ซึ่งมีลักษณะคล้ายกันดังนั้น ถ้าเขียนไม่ดีละก็เสียเวลาเขียนซ้ำบ่อยแน่
  5. ค่า Default เป็นเรื่องที่ไม่ควรละเลย เช่น ถ้าตัวแปรนี้ไม่ได้ถูก set มาควรมีค่าเป็นอะไรเพราะใช้บ่อยในพวก form
  6. ควรหา Editor ที่สามารถใช้กับ PHP Framework ของคุณได้ เพื่อประหยัดเวลาในการหา function ฯลฯ
  7. ก่อนลงมือเขียนจริง ควรสร้าง Class Diagram และ ER-Diagram ก่อน แต่ถ้าคุณไม่ถนัด เวลาทำงานเมื่อคุณสะกิดใจว่ามันผิดแปลก อย่าฝืนทำต่อแต่ต้องแก้ ให้เป็นไปอย่างที่มันควรจะเป็นซะ อย่าปล่อยปัญหาไว้
  8. ถ้า Framework ไม่มี Unit Test มาให้ควรใช้พวก Unit Test ของตัวอื่นมาใช้ซะ เพื่อระบบที่มีคุณภาพ เช่น Firephp เป็นตัวหนึ่งที่ใช้ได้
  9. หัดทำบ่อยๆจะได้ชิน และควรตั้งเป้าหมายให้มากขึ้น เช่น รองรับ i18n , การเปลี่ยน template ฯลฯ
  10. ค้นหา plugin ต่างๆก่อนที่คิดจะสร้างขึ้นมา ไม่แน่ว่าจะได้งานที่ดีกว่า และประหยัดเวลากว่า

วันนี้ก็ลากับ 10 ข้อง่ายๆสำหรับคนใช้ PHP MVC Framework นะครับ แต่ใช้ได้กับ Framework ตัวอื่นๆด้วยนะครับ โดยนี้คือความเห็นส่วนตัวของผมและงานที่ผมทำคือ Web Application ซึ่งมีอะไรมากมายจริงๆ

เข้าใจกับ jQuery Ajax Cross Domain

หลังจากที่ผมใช้ jQuery เป็น Javascript Framework หลักมาตลอดตอนนี้ ผมพึงได้ทำอะไรใหม่ๆ มากกว่าที่ผมทำอยู่เป็นประจำเช่น การทำ Web Service ที่ Javascript จะต้องเป็นคนเรียก วันนี้ผมก็พึุงได้รู้ว่าจริงๆแล้ว jQuery Ajax ไม่ได้โหลด Cross Domain ได้ทุก function หลังจากลอง Search ดูก็พึุงรู้ว่าจริงๆแล้วตอนนี้มีแค่

  • getJSON
  • getScript
  • $.ajax

เท่านั้นที่ทำได้ โดย $.ajax ก็คือการ setup ให้ datatype เป็น JSONP  หรือไม่ก็ Script เท่านั้นถึงทำได้ ดังนั้นเวลาเรียกให้ควร check เรื่องพวกนี้เป็นพิเศษ เพราะการทำภายใต้ domain เดียวกันนั้น คุณสามารถใช้พวก $.get , $.post ได้ตามสะดวก แต่พอจะทำ cross domain แล้วนั้นกลับทำไม่ได้ ดังนั้น ถ้าคิดจะทำ Web Service ที่ Javascript สามารถเรียกได้ ควรทดสอบด้วย getJSON หรือ getScript เท่านั้นครับ

ส่วนถ้าใช้กับพวก Server Side Script จะมีวิธีที่เรียกว่า Proxy ซึ่งทำให้สะดวกในการทำงาน ซึ่งเราสามารถใช้ได้ทุก Ajax เช่น $.get $.post ก็ใช้ได้หมด โดยมีตัวอย่างที่ทำเข้าใจอย่างมากของฝรั่งเขา ดูได้ที่นี้เลยครับ
http://jquery-howto.blogspot.com/2009/04/cross-domain-ajax-querying-with-jquery.html

ปล. สำหรับลิงค์ที่้ให้ไป อ่าน comment ด้วยจะได้เห็นทางเลือกที่เจ๋งๆอีกนิดหน่อย

การขึ้นบรรทัดใหม่ของไฟล์ด้วย Ruby บน Windows

วันนี้ด้วยการจะทำการจัดการกับ Textfile แต่ก็ติดปัญหาเล็กน้อยว่า ทำไมใช้ myfile.puts แล้วไม่มีการขึ้นบรรทัดใหม่ให้บน Windows ก็งงไปพักใหญ่ ใช้ print หรือ write ก็แล้วโดยใส่ \n แล้วก็ไม่ติด จนกระทั่งลองทำไฟล์ปกติขึ้นมาอันหนึ่งแล้ว ลองเอาไปเปิดดูใน Ruby ก็เห็นว่าเขาเขียนด้วย \r\n โดย \n จริงๆคือการขึ้นบรรทัดใหม่ ส่วน \r ก็คือ carriage return ซึ่งเป็นตัวอักษรตัวหนึ่งใน ASCII ซึ่งใน windows คงหมายถึงกด “enter” ดังนั้นวิธีแก้ปัญหาก็ค้นพบแล้วก็คือการใส่ \r\n เพื่อการขึ้นบรรทัดใหม่ โดยใช้กับคำสั่ง write หรือ print ก็ได้ (แต่ใช้กะ puts มะได้นะ)

ตัวอย่างเช่น
myfile = File.new(”test.txt”,”w”)
3.times { myfile.write(”hello\r\n”) }
myfile.close

ประมาณนี้เป็นต้น ลองทำดูครับ :)

JRuby on Rails บน Google App Engine

วันนี้ผมทำได้ตั้งแต่บ่ายๆละแต่พึงมีเวลาพอจะมาเขียน Blog ต่อในเรื่องของ Google App Engine ผมมีตัวที่ทำเสร็จแล้วให้ทุกท่านสามารถลองไป Deploy บน GAE ได้เลยโดยดาวโหลดได้เลยจากไฟล์นี้ HelloRails ได้เลยครับ ผมขอสรุปวิธีทำดังนี้ครับ

โดยก่อนเริ่มเราต้องมี gem ดังนี้ก่อน

  • Rails
  • Rake
  • Warbler

เสร็จแล้วทำตามขั้นตอนดังนี้

  1. เราก็สร้าง project Rails ตามปกติ
  2. เข้าไปใน folder project rails จาก command-line พิมพ์ warble pluginize
  3. เสร็จแล้วตามด้วย warble config ครับ
  4. ใน vendor/rails ให้เราลบโฟลเดอร์ activerecord ออก
  5. ตามด้วยลบโฟลเดอร์ test ที่ิอยู่ในโฟลเดอร์ดังนี้ actionmailer , actionpack , activeresource , activesupport , railties
  6. เสร็จแล้วให้โหลด 4 ไฟล์ jar หลักเหมือนเมื่อวานคือ JRuby-GAE-Jar
  7. เสร็จแล้วโหลดไฟล์ Gae-Ruby-lib.zip นี้มาแตก zip ใส่ใน lib ครับ
  8. คราวนี้เราก็สร้างไฟล์ และแก้ไขไฟล์ตามไฟล์นี้ครับ google_app_engine.rb
  9. โดยดูจากคำว่า file แล้วก็ตัวอักษรภายในนั้นและที่จะอยู่ในไฟล์แต่ละไฟล์ ถ้าไฟล์ไหนมีข้อมูลอยู่แล้วให้ลบทิ้งหมด แล้วคัดลอกไฟล์ google_app_engine ใส่ไปเลย
  10. เสร็จแล้วก็เข้า command-line พิมพ์ warble ในโฟลเดอร์ project Rails ของเรา

ส่วนถ้าไม่ใช้ Windows เราสามารถที่จะทำแบบนี้ได้เลย

  • rails ชื่อโปรเจคrails -m google_app_engine.rb

แล้วทุกอย่างก็จะเสร็จพร้อมลุย แต่อันนี้ต้องมี JRuby นะสำหรับคนที่จะใช้ script นี้ แต่ด้านบนตามขั้นตอนผมใช้ ruby ธรรมดา แต่การใช้ script จะไม่มีไฟล์ big_table_servlet_store.rb ครับ ไม่รู้ว่าจำเป็นไหมแต่ตอนผมทำเป็นขั้นตอนพอเอาไฟล์นี้มาใส่ก็หาย เลยคิดว่าน่าจะเกี่ยวแต่คนเขียน script อาจจะลืม

(J)Ruby บน Google App Engine

หลังจากใช้ความพยายามมา 2 วันในการพยายามทำ Hello World JRuby ขึ้น Google App Engine ให้ได้ซึ่งจากหลายๆแหล่งผมพยายามทำตาม เสร็จแล้วก็ติดปัญหาจุกจิกมากมาย ซึ่งผมก็เชื่อเขาว่าให้ใช้ JRuby แต่สุดท้ายวิธีที่ผมได้ผลก็คือ Ruby ธรรมดาเนี้ยและ ได้แบบไม่มีปัญหาเลยด้วยครับผม วันนี้ผมเอาวิธีทำ Sinatra บน Google App Engine มาฝากครับ

http://blog.bigcurl.de/2009/04/running-sinatra-apps-on-google.html

ซึ่งจริงๆแล้วผมก็ทำตามจากที่นี้ทั้งหมดครับ เพียงแต่ว่ามันไม่ได้ตามเปะๆเจอปัญหาต่างๆนานา ที่ค้นหาใน Google ก็ไม่เจอ แต่ผมพอมีความคุ้นกับ Java/Servlet อยู่บ้างเลยพอเข้าใจว่าต้องทำอะไร พอคล่ำๆไปสักพักก็เลยมาถูกทาง ดังนั้นผมจะสรุปจากบทความด้านบนนะครับผม มีขั้นตอนทำดังนี้ครับ อาจจะยาวหน่อย โดยอันนี้ผมทำแบบ Version Windows ที่ผมทำได้จริงนะครับ แต่ก่อนทำคุณต้องมี Account Google App Engine ก่อนนะครับ แล้วก็สร้าง App-id สักตัวหนึ่ง

  1. ใช้ Ruby 1.8.6 One-Click-Installer
  2. พอลงเสร็จ ก็เข้า Command-line จาก run -> cmd
  3. พิมพ์ gem install rake sinatra warbler
  4. ทำการสร้าง folder ใน drive C: เป็น sinatra-app
  5. ภายใน folder sinatra-app ให้สร้าง folder ดังนี้เพิ่มไป views public config lib
  6. พอสร้าง folder เสร็จก็สร้างไฟล์ดังนี้ครับ config.ru , app.rb , appengine-web.xml
  7. เสร็จแล้วไป copy โค้ดใส่แต่ละไฟล์ที่นี้ http://gist.github.com/91801
  8. จะสังเกตว่ามีไฟล์ warble.rb ด้วยอีกไฟล์ให้สร้างใน folder config ดังนั้นไฟล์นี้จะอยู่ config/warble.rb
  9. ขั้นตอนนี้เป็นขั้นตอนลัดนะครับ เพราะมีบางตัว run ใน windows ไม่ผ่านผมเลยทำการรวมไฟล์ lib ที่จำเป็นไว้ให้เรียบร้อยแล้ว โหลดได้เลย
  10. พอโหลดเสร็จก็นำไปแตก zip ที่ folder ใน sinatra-app/lib นะครับ
  11. เสร็จแล้วก็เข้า command-line แล้วไปที่ folder sinatra-app โดยพิมพ์ c: ตามด้วย cd\ ตามด้วย cd sinatra-app
  12. พอเข้ามาถึงพิมพ์ warble เฉยๆเลยมันก็จะทำการจัดการให้เสร็จ
  13. เปิดไฟล์ sinatra-app/tmp/war/WEB-INF/gems/gems/sinatra-0.9.1.1/lib/sinatra.rb
  14. ทำการ comment (ใช้สัญลักษณ์ #) ที่บรรทัดสุดท้ายที่เขียนว่า use_in_file_templates!
  15. แล้วไปเรียก warble ใน folder sinatra-app เหมือนเดิมอีกที
  16. เสร็จแล้วให้ไปโหลด Google App Engine SDK
  17. เอาไปแตกอยู่ drive C: เหมือนกัน (เพื่อความง่าย) และเปลี่ยนชื่อโฟลเดอร์เป็น appengine-java-sdk
  18. เสร็จแล้วก็เข้า command-line และไปอยู่ใน drive C: root (C:\)
  19. ทดลอง app ด้วยการพิมพ์ appengine-java-sdk\bin\appcfg.cmd sinatra-app\tmp\war
  20. ถ้าไม่มีอะไรผิดพลาดมันจะขึ้นบอกว่า app ถูก run อยู่ที่ http://localhost:8080 เราลองเข้าไปดูว่าขึ้น Hello ไหม
  21. ถ้าขึ้นละก็เตรียม upload ขึ้น app กันได้เลยแต่ต้องแก้นิดหน่อย
  22. เปิดไฟล์ใน sinatra-app/appengine-web.xml
  23. เปลี่ยนจาก YOUR-APPLICATION-ID เป็น app-id ของคุณ (app-id คือชื่อ app ที่ตั้งใน Google App Engine)
  24. เสร็จแล้วก็ warble
  25. เข้าไป drive C: พิมพ์ appengine-java-sdk\bin\appcfg.cmd update sinatra-app\tmp\war (แบบนี้เท่านั้นห้ามพิมพ์ / แทน \)
  26. ถ้าถูกต้องมันจะถาม email กับ password เราก็ใส่ไปแล้วก็รอๆๆ
  27. พอเสร็จเราก็เข้าไปดูได้เลยที่ app-id-ของคุณ.appspot.com
  28. ครั้งแรกจะนานพอดูเลย แล้วพอครั้งหลังๆก็จะเร็วขึ้น (รอ compile นะและ)

เสร็จแล้วววว คำสั่ง appcfg.cmd นั้นใช้ใน windows นะครับถ้าใช้ linux หรือ mac osx จะใช้ appcfg.sh แทนนะครับ หวังว่าคงชอบ Ruby คงมีเฮกันแล้วคราวนี้

Next Page »