Convention over configuration (Coc)

สมัยก่อนเวลาเขียนโปรแกรมทีนึงต้องฝังทุกอย่างไว้ใน source code เปลี่ยนแปลงอะไรที ต้อง compile และ deploy ใหม่ สร้างความน่าสะพรึงกลัวให้กับทีมพัฒนาและผู้เกี่ยวข้องว่า deploy แล้วมันพังจะทำยังไง เพราะปกติถ้าระบบมันทำงานได้อยู่ก็ไม่มีใครอยากไปแตะมัน

ต่อมาก็มีคนมีความคิดว่าเอาสิ่งที่สามารถเปลี่ยแปลงได้ ออกมาไว้ใน configuration file ทำให้การใช้งานโปรแกรมทำได้ง่ายขึ้น ผู้ดูแลระบบสบายใจมากขึ้น พอมาถึงยุค XML เราก็เอา XML มาใช้เป็น configuration file เพื่องจากมันทำอะไรได้มากกว่า configuration file แบบเดิม ทั้งในแง่ของโครงสร้างที่ซับซ้อน และการเขียน Parser เรื่องนี้ผมซึ้งมากๆตอนแก้ Parser ของ Squid เพื่อจะเพิ่มจำนวน IP ของ router แต่คนที่เป็น admin และไม่ชำนาญกับ xml ก็จะบอกว่าเกลียด xml ทั้งๆที่มันดีจริงๆนะ 😉

มายุคนี้เรากลับมาบ่นอีกแล้วว่ามันเยอะเกินไป ทำอะไรทีเขียน configuration file มากกว่า code อีก แต่ลืมมองไปว่ามันเกิดมาจากความต้องการความยืดหยุ่นในการใช้งาน (ซึ่งบางทีเราก็ไม่ได้ต้องการมันเท่าไหร่) ทางเลือกมีหลายทางถ้าผมเก่งหน่อยก็จะเขียน framework ใหม่ หรือลดลอนจากของเดิมให้มันเหมาะกับสิ่งที่ผมจะใช้ หรือไปใช้พวก Annotation ซึ่งส่วนตัวไม่ได้ชอบเท่าไหร่ เพราะดันเอา configuration กับไปฝังไว้ใน code อีกแล้ว แต่ก็ไม่ผิดหรอกถ้าเรามั่นใจว่ามันจะไม่เปลี่ยนบ่อยๆ

Convention over configuration (CoC) เป็นรูปแบบของการพัฒนา software ที่จะช่วยลดจำนวนของการตัดสินใจที่นักพัฒนาจะต้องทำใน configuration file ก่อนที่ software จะทำงานได้ โดยที่ยังคงความยืดหยุ่นของตัว software นั้นไว้ ถ้าพูดให้ง่ายเข้าก็คือ มันจะมีค่า default ของงานบางอย่างไว้ให้เราแล้ว ถ้าเราไม่แก้ไข มันก็ใช้ค่า default นั้นๆ

Framework ที่มีรูปแบบตาม Coc ได้แก่ Ruby on Rails Grails และ CakePHP เป็นต้น

Ad Hoc Data Analysis From The Unix Command Line

มีโครงการใหญ่ของรัฐฯโครงการหนึ่ง ซึ่งเราต้องเอาข้อมูลมา process เดิมที ข้อมูลเก็บอยู่ในฐานข้อมูล ซึ่งมี record ประมาณแสน record งานเข้ามาแล้วต้องเสร็จภายในไม่กี่ชั่วโมง ตัวผมเองคงทำไม่ทัน เนื่องจากไม่ได้นอนมาแล้วหนึ่งคืน เลยขอความช่วยเหลือจากสุดยอดฝีมือของแผนก ไม่ผิดหวังครับ เสร็จทันกำหนดพอดี แต่ก็ทำเอาไม่ได้หลับไม่ได้นอนไปตามๆกัน รู้สึกผิดจริงๆ (_/\_)

ข้อมูลที่ได้มาต้องถูกนำมา pre-process เพื่อความง่ายในการประมาลผลทีหลัง command ที่ใช้ก็เป็น unix command ธรรมดาๆ (แต่ไม่เคยใช้) ได้แก่ sort cut uniq ลองไปหาจาก Google ดูได้ link น่าสนใจมาหลาย link ใช้ของให้ถูกกับงานอะไรๆมันก็ดูง่ายไปหมด

Ad Hoc Data Analysis From The Unix Command Line

mysqldump to CSV

ถ้าหากเคยใช้ MySQL กันมาบ้าง อาจจะเคยใช้คำสั่ง mysqldump ซึ่งเป็นคำสั่งที่ช่วยเอาข้อมูลจากฐานข้อมูลมาเก็บอยู่ในรูปของไฟล์ ปกติแล้วการ dump ข้อมูลออกมาจะนิยมเก็บในรูปของ sql statement เนื่องจากเอาไปใช้ต่อได้ง่าย เช่น การ backup หรือ การคัดลอกฐานข้อมูล

แต่ถ้าหากต้องการข้อมูลในรูปแบบอื่นที่ไม่ใช่ SQL statement เช่นในรูปแบบ CSV file เพื่อสามารถนำไป import เข้า excel หรือฐานข้อมูลอื่นที่ไม่ใช่ MySQL หรือให้คนอ่านได้ง่าย เราสามารถทำได้ดังนี้

mysqldump -u<username> -p -t -T ./<dir> <database>
<table> --fields-enclosed-by=\" --fields-terminated-by=,
<username>

คือ username ที่ใช้เชื่อมต่อกับฐานข้อมูล

<dir>

คือชื่อ directory ที่จะใช้เก็บข้อมูล

<database>

คือชื่อ database ที่ต้องการ dump

<table>

คือชื่อ table ที่ต้องการ dump

slow ssh response

ช่วงนี้เจอแต่อะไรช้าๆ สาเหตุน่าจะมาจาก reverse hostname lookup ที่เขียนไว้ใน blog ด้านล่างก็เจอปัญหานี้ ตอนนี้มาถึงคิวของ ssh กันบ้าง หลายคนคงเคยเจอว่า ssh ไปที่ host ใกล้ๆแล้วมัน response ช้ามากกว่าจขึ้นให้ใส่ username/password วิธีแก้ให้ไป เพิ่มคำสั่ง

UseDNS no

ใน /etc/ssh/sshd_config

เพิ่มเสร็จแล้วอย่าลืมสั่ง /etc/init.d/ssh reload

Ultra slow MySQL query

หลังจากทดสอบ benchmark MySQL ใน Debian ไม่พบสิ่งผิดปกติอะไร นึกว่าจะรอดตัว แต่พอลองของจริงเข้าการ Query ธรรมดาๆ กลับช้ามากๆ จะว่า tune MySQL ผิดก็ไม่น่าจะใช่ เพราะทำ benchmark มาแล้ว ผลก็ไม่ได้ทิ้งจากชาวบ้านชาวเมื่องสักเท่าไหร่ แต่ผลของการทดสอบวันนี้ต้องบอกว่าเน่ามากๆ หนึ่ง page ใช้เวลาเกือบ 10 วินาที หลังจากพยายามหาสาเหตุอยู่นานก็เจอ

ใส่ skip-name-resolve เข้าไปใน my.cnf ปั๊บ Query เร็วปุ๊บ

MySQL benchmark

ลองทำ MySQL benchmark ด้วยโปรแกรม sysbench มี 3 version ซึ่งใช้ patch ต่างกัน มีของ Google Percona และของเดิมๆจาก Gentoo portage โดยทำการทดสอบบน Intel Quad core (Q6600) 2.4GHz Ram 4GB version ของ MySQL ต่างกันนิดหน่อย เพราะ patch ที่ออกมาไม่เท่ากัน แต่ใช้ MySQL configuration เดียวกัน ไม่ได้ tune อะไรเป็นพิเศษ เท่าที่ดูจากกราฟของเดิมๆจาก Gentoo ดูดีที่สุด กราฟสีแดงเป็นของแถม ซึ่งเป็น MySQL ที่ติดตั้งบน Xeon Quad (X3320) server Ram 4GB ลง Debian ตัว MySQL ใช้ configuration เดิมๆ ของ Debian แต่เดิมเครื่องนี้มีปัญหากับ Gentoo ซึ่งก็ยังหาสาเหตุไม่ได้ (เขียนไว้ใน blog ก่อนหน้านี้) เอาไว้มีเวลาจะกลับมาค้นดูใหม่ว่าเกิดอะไรขึ้น bench-mysql1 ดูเหมือนว่า version หลังๆ bug หลายอย่างได้ถูกแก้ไขไปแล้ว อย่าง smp patch ของ google ก็ไม่จำเป็นอีกต่อไป ไม่รู้ว่าถ้า tune ให้เข้ทีเข้าทางแล้ว มันจะรีดความสามารถของ MySQL ได้ขนาดไหน