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

ก็เลยเป็นที่มาของเว็บ http://linerangers-krisachai.rhcloud.com/

พัฒนาด้วย Java EE7 บน openshift ซึ่งเป็น cloud แบบ Platform as a serivice (Paas) เจ้า Openshift นี้ตั้งอยู่บน AWS โดยรัน RHEL ทั้งหมด แล้วผมเดาว่าเราคงรันอยู่บน LXC อีกทีหนึ่งแน่ๆ

infrastructure

ลักษณะการทำงานของ openshift ก็คือ application แต่ละตัวจะทำงานอยู่บน gear (1 gear = 1 server) โดยแต่ละ gear จะมีขนาดใหญ่เล็กต่างกันไป (resource ของ server)  เราสามารถรัน application บน gear หลายๆชิ้นได้ แล้วทำการ load balance ผ่าน haproxy (openshift ทำให้โดยอัตโนมัติ)

ในแต่ละ gear จะมีได้หลาย cartridge เช่นถ้า gear ของเราเป็น platform java เราก็สามารถใส่ mysql, mongodb, postgresql,jenkins ลงไปใน gear ได้ ซึ่ง application เหล่านี้ก็คือ cartridge นั่นเอง

development

openshift ใช้งาน git เป็นหลัก โดยเราจะต้อง clone git repository หลังจากที่เราสร้าง application บน openshift เพื่อที่จะนำมาทำการแก้ไขให้เป็น app ของเราต่อไป

ยกตัวอย่าง java

openshift จะสร้าง project แบบ maven ไว้ให้ เราก็แค่ git clone แล้ว import เข้ามาใน ide ของเรา ทำการพัฒนาแก้ไขอะไรให้เสร็จ หลังจากนั้นก็ให้ทำการ commit แล้วก็ push กลับขึ้น openshift ไป โดย openshift จะทำการ build และ deploy application ของเราให้เองโดยอัตโนมัติ ง่ายมากๆ

Facebook OAuth

ผมมีแนวคิดที่จะไม่มีระบบสมัครสมาชิก ให้ใช้ facebook เป็นหลักแทน น่าจะสะดวกกับผู้ใช้มากกว่า โดยการเชื่อมต่อกับ facebook นั้นผมทำตามตัวอย่างในเว็บนี้ http://www.richardnichols.net/2010/06/implementing-facebook-oauth-2-0-authentication-in-java/

โดยสรุปก็คือ

User Click Login with facebook -> facebookś permission page -> redirect back to ourś servlet -> servlet send request to facebook with given parameter -> extract access token from response.

– ทำการส่ง request ไปยัง facebook ด้วย url ของ facebook เองโดยมีข้อมูลจำพวก app id และ url ที่จะให้ facebook เรียก (Redirect)

– ผู้ใช้จะถูกส่งไปหน้า login/confirm app ของ facebook เมื่อกดแล้ว ผู้ใช้จะถูกส่งกลับมาที่หน้าเว็บของเรา จาก url ที่กำหนดไว้

– เราทำการ extract request key ออกมาจาก แล้วเอา key นี้ส่งกลับไปยืนยันกับ facebook อีกทีหนึง

– ถ้ายืนยันสำเร็จ facebook จะส่ง access token ของ user คนนั้นกลับมาให้เรา แล้วเราก็เอา token นี้ไปเรียก graph api ต่อไป

Java

ใช้ servlet กับ jsp ธรรมดา ไม่ได้มีอะไรซับซ้อน เนื่องจากเป็นเว็บเล็กๆ และขี้เกียจจะเรียนรู้อะไรใหม่ๆ แต่อาศัย URL rewrite ให้ดูทันสมัยแทนที่จะเป็นแบบนี้ http://linerangers-krisachai.rhcloud.com/walkthrough.jsp?level=108 ก็เปลี่ยนเป็นแบบนี้ซะ http://linerangers-krisachai.rhcloud.com/walkthrough/level/108 โดยอาศัย urlRewriteFilter

<from>/walkthrough/level/([0-9]+)</from>
<to>/walkthrough.jsp?level=$1</to>

โดยเรากำหนด rule เข้าไปใน file xml ง่ายๆแบบนี้ ก็เป็นอันเสร็จแล้ว

ส่วนที่ใช้เวลาในการทำนานที่สุดคือภาษาไทย มีปัญหามันตั้งแต่ต้นน้ำยันปลายน้ำ แต่สรุปออกมาเป็น trick ง่ายๆดังนี้

– edit file ให้เป็น utf-8 (ide น่าจะเป็นหมดแล้ว)

– servlet ให้ใส่ utf-8 ตอนรับ request มาด้วย

– database connection ให้ใส่ parameter utf8 กับ unicode เข้าไปด้วย

– database ให้สร้างแบบ utf-8 ทั้ง table และ schema

เดี๋ยวจะมาต่อเรื่อง Search Engine Optimization ว่าจะทำสำเร็จโดยไม่ต้องเอาเว็บไปโฆษณาได้หรือไม่