บันทึกการย้าย Web Hosting ครั้งยิ่งใหญ่ที่สุดในชีวิต

January 5th, 2010

สองสามวันมานี้อดหลับอดนอนเพราะเรื่องการย้าย Web Hosting นี่แหละครับ ขอจดไว้หน่อยว่าทำอะไรไปบ้าง (ผม admin มือสมัครเล่นครับ)

- ถ้าเว็บมี maintenance mode จงเปิดมันก่อนเลย

- เปลี่ยน NAME SERVER ทันที เพราะบางที DNS มันก็อัพเดทกันช้าเหลือเกิน

- การ load dump ของ MySQL นั้น ถ้าไม่ใหญ่มากก็ใช้ phpMyAdmin ได้ แต่ถ้าใหญ่มากๆควรใข้ BigDump แทน หรือถ้าจะเอาเป็นเรื่องเป็นราวเลยก็ต้อง MySQLDumper

- เรื่องภาษาไทย ที่ไม่ว่า Programmer/Developer รุ่นไหนๆก็ต้องเจอ ฮา…
ถ้า default charset ของ mysql (ซึ่งส่วนมากจะเป็น utf8) ไม่ได้เป็นตัวเดียวกับที่เราใช้ก็ต้องเพิ่ม code นี้

mysql_query(“SET NAMES tis620″, $connect);

- การ load dump file ที่เป็น tis620 หรือ utf8 ผ่าน BigDump อย่าลืมกำหนด charset ด้วยที่ config ชื่อ $db_connection_charset

- dump file ถ้าเป็น tis620 ตรวจดูให้แน่ใจว่า file save เป็น ANSI แล้ว (ปกติจะเป็น utf8) ไม่งั้น BigDump มันจะอ่านไม่ออก

- ถ้าเป็นไปได้ให้แก้ code ที่เป็น full path แล้วแทนที่ด้วย relative path แทน

- File/Folder Permission ลอกของเก่ามาเลย ใช้ ls -rl ช่วย แล้วดูเฉพาะตัวที่พิเศษๆเช่น 777

- ถ้าย้ายหลายเว็บจงอดทนทำทีละเว็บ ไม่งั้นอาจสับสนได้…

ปัญหาภาษาไทย TIS-620 กับ AJAX

December 23rd, 2009

พอดีเมื่อวานนี้มีเพื่อนถามมาทาง MSN ว่าเว็บมีปัญหาใช้ภาษาไทยกับ AJAX ไม่ได้ คือส่งภาษาไทยไปแล้ว อ่านไม่ออกใน MySQL
ส่วนตัวนั้นมีประสบการณ์เกี่ยวกับปัญหาภาษาไทยมาบ้าง ถึงจะไม่มาก แต่ก็พอจะมั่นใจได้ว่า AJAX ไม่น่ามีปัญหากับภาษาไทย แต่มันไม่ใช่กับกรณีนี้

มาดูกันที่ส่วนประกอบต่างๆกันก่อน

Web Page (TIS-620) + AJAX (TIS-620) <–> PHP(TIS-620) <–> MySQL (TIS-620)

ดูๆจากข้างต้นก็ไม่น่าจะมีปัญหาอะไร

อย่างแรกผมเอา FireBug จับ XHR ดูก่อนเลย เป็น HTTP Post และพบว่าอ่านไทยไม่ออกครับ ผมแปลกใจมากๆ ทั้งๆที่ Header บอกว่า charset เป็น TIS-620
ลองถาม Google ดูจึงพบว่า AJAX มีปัญหากับ TIS-620 จริงๆด้วย เพราะมันส่งเป็น UTF-8 (จริงๆมีวิธีเปลี่ยนแต่ค่อนข้างยุ่งยาก)

ดังนั้นภาพข้างบนจึงผิด จริงๆต้องเป็นแบบนี้

Web Page (TIS-620) + AJAX (UTF-8) <–> PHP(UTF-8) <–> MySQL (TIS-620)

และสิ่งที่เราต้องแก้ก็คือแปลง UTF-8 ให้เป็น TIS-620 ที่ Server Side Script ซึ่งในที่นี้คือ PHP โดยการเพิ่ม code นี้เพื่อแปลงข้อความก่อน save ลง MySQL

$msg= iconv(‘UTF-8′, ‘TIS-620′, $msg);

สรุป

- ปัญหานี้จะเกิดต่อเมื่อใช้ Post Method เพราะส่วน Body จะถูก Encode เป็น UTF-8 ส่วน Get ไม่มีปัญหาเพราะข้อความต่อท้ายไปกับ URL แทน

- ถ้าไม่มีความจำเป็นต้องใช้ TIS-620 จริงๆ ผมขอแนะนำเหมือนทุกครั้ง คือใช้ UTF-8 จะดีกว่า ใช้ได้กับหลายภาษา ไม่ใช่แค่ภาษาไทย และ open source script ส่วนใหญ่เขียนมา support UTF-8 อยู่แล้ว

Playing with Google App Engine (Java API)

December 15th, 2009

บันทึกไว้ซะหน่อยว่าเล่นอะไรไปกับ Google App Engine ในส่วนของ Java API บ้าง

1. URL Fetch Service

มีข้อจำกัดว่า timeout นั้นสูงสุดที่ 10 seconds และต้อง set ค่าทุกครั้ง เพราะ default คือ 5 seconds

2. JDO

รายละเอียดเยอะ แต่เอกสารของ Google ทำได้ดีในระดับหนึ่ง และดูเหมือนว่า Google แนะนำให้ใช้ JDO มากกว่า JPA

3. Local Admin Console

ถ้าอยากดูว่าใน Local Datastore มีอะไรอยู่บ้างให้เปิดไปที่ http://localhost:8080/_ah/admin โดยสามารถแสดงรายการ กับลบ entities ได้เท่านั้น ไม่สามารถ เพิ่ม, แก้ไข, หรือแม้แต่ search ได้

ถ้าอยากได้ความสามารถเพิ่มต้องลง 3rd party ที่ชื่อ gae-data-viewer

ส่วนไฟล์จะเก็บอยู่ที่ \war\WEB-INF\appengine-generated\local_db.bin ถ้าบางครั้งเกิดอาการ start web app ไม่ได้เพราะ datastore พัง ให้ delete ไฟล์นี้ทิ้งซะ


กทพ. เลื่อนเปิดให้บริการระบบเก็บค่าผ่านทางอัตโนมัติ (Easy Pass) ไปต้นปี 2553

November 16th, 2009

ระบบก็ไม่ได้คิดค้นพัฒนาอะไรขึ้นมาใหม่ ซื้อเทคโนโลยีเขามา implement ทั้งนั้น

ยังไม่สามารถทำให้ตรงตามกำหนดเวลาได้ สุดท้ายก็อ้างขัดข้องทางเทคนิคอีกเช่นเคย

ถ้าไม่พร้อมแล้วคุณจะรีบเก็บเงินประชาชนไปดองเอาไว้ทำไมมิทราบครับ…

16112009028

How to implement Licensing in Flex and AIR

November 4th, 2009

There are a lot of questions about how to implement Licensing in Flex and AIR.

I cannot explain you 100% how it works but below is list of libraries/functions for my solution.

  1. codegenas3 – AS3 library for generating system/machine id.
  2. as3crypto – AS3 library for encryption/decryption.
  3. Local Shared Object – AS3 Class for storing license information (similar to Windows Registry).
  4. Mcrypt – PHP functions for encryption/decryption.

Liverpool Bounce Back!

October 26th, 2009

Liverpool Bounce Back

How to show/hide SWF in Firefox without reloading

October 8th, 2009

It’s a bug in Firefox that when you hide and then show SWF (Flex or Flash) again, it will be reloaded.

So, this is workaround.

Firstly, do not use “display: none” CSS to hide the div that contains Flash. Use “visibility: hidden ” instead.

What about layout? Yes, it may be a problem due to “visibility: hidden” just hide the div but still reserve space for it.

Therefore, we will fix it by additional CSS which is “width: 0px; height: 0px;”.

There is one side effect, the browser scroll bar will be longer than content  (I’m not sure why, but you may fix it by JavaScript. It’s out of my scope, so please let me know if any).

Conclusion, in case of we have to show/hide SWF and serious about reloading, we will use “visibility: hidden; width: 0px; height: 0px;” instead of “display: none”

In my case, I use jQuery Tabs.  So, I will fix CSS class from

.ui-tabs .ui-tabs-hide { display: none !important; }

to be

.ui-tabs .ui-tabs-hide { visibility: hidden; width: 0px; height: 0px; }

References:
http://pipwerks.com/lab/swfobject/hide-swf/2.0/index.html
http://stackoverflow.com/questions/298342/firefox-restarts-flash-movie-if-enclosing-div-properties-change

Thanks @tvchampion and @dogdoy for help.

Que Sera, Sera (Whatever Will Be, Will Be)

October 4th, 2009

มาอีกแล้วกับ Features ที่รอกันมานาน Sports Schedule on Google Calendar

September 3rd, 2009

ถ้ายังจำ Post เก่าของผมที่เกี่ยวกับ English Premier League บน Google Calendar

มาวันนี้ Google ทำเองแล้วครับ ไม่ต้องไป Add Public Calendar อื่นแล้ว

โดยสามารถเลือกได้ถึงระดับว่าจะใช้ Schedule เฉพาะทีมไหน ลีกไหนได้ด้วย เช่น Liverpool ก็จะมีทั้ง EPL, UCL, FA Cup, League Cup

หรือแม้แต่ทีมชาติก็มีนะครับ แต่น่าเสียดายไทยลีกยังไม่มี

ถ้าสนใจก็เปิดไปที่หน้านี้ของ Google Calendar

google-calendar-sports

ใครว่า Liverpool ไม่สนใจเสียงแฟนบอล

August 31st, 2009

สงสัยต่อไปนี้ต้องเวลาดูบอลไปทวีตไปต้องเป็น in english ซะแล้ว

lfc_follow_earguay