Skip to content

Month: October 2012

หัดใช้ Mustache กันดีกว่า

Mustache คืออะไร?

Mustache เป็น template engine (บางทีก็เรียก render engine) ตัวหนึ่งในเว็บโครงการเขานิยาม lib ตัวนี้ว่า

Logic-less templates.

Mustache รองรับภาษาอื่นๆ เยอะมาก เช่น RubyJavaScriptPython,ErlangPHPPerlObjective-CJava.NET,AndroidC++GoLuaoocActionScript,ColdFusionScalaClojureFantom,CoffeeScriptD, และ node.js

หน้าที่ของมันคือ generate markup  (ถ้าเป็น web app ก็ HTML) ซึ่งเป็นส่วนหน้าของ app จาก data model (JSON) ที่เราออกแบบไว้ จะว่าไปมันก็เป็นเครื่องมือที่เกิดจากแนวคิด MVC ที่พยายามแยกการทำงานของโปรแกรมหรือ application ออกเป็นส่วนตามการทำงาน

รวมรายชื่อ PaaS ที่ใช้ได้ฟรี

คำเตือน: เนื่องจากผมเขียนไว้นานแล้ว PaaS บางที่อาจจะปิดให้บริการ, เปลี่ยนชื่อ, เปลี่ยน feature, เปลี่ยนเงื่อนไขการบริการ หรือมีการเก็บค่าบริการแล้ว เข้าไปอ่านเงื่อนไขในเว็บดีกว่าครับ

รวมรายชื่อ PaaS (Platform as a service) ที่ให้ใช้ได้ฟรีแต่ถ้าอยากได้ฟีเจอร์เพิ่มหรือปริมาณการใช้งานมากขึ้นต้องจ่ายเงินเพิ่ม (ของมันแน่อยู่แล้ว) ในรายละเอียดคงต้องลองใช้ดูเองครับ ผมรวบรวมมายังไม่ได้ลองทุกตัว

ทำไมต้อง Websocket ?

ทำไมต้อง Websocket ? ก่อนหาคำตอบของคำถามนี้คงต้องเล่าย้อนกลับไปถึงวิวัฒนาการของเว็บก่อน ถ้านับแล้วน่าจะมี 3 ยุค (ผมเดาเอง) คือ

  1. Static web เว็บยุคแรกๆ ยังทำอะไรไม่ได้มากนอกจากแสดงข้อมูลสร้างด้วย HTML, CSS เป็นหน้าๆ มีแต่ markup อย่างเดียว ผู้ใช้เข้ามาอ่านได้อย่างเดียวไม่มี interactive ระหว่าง client และ server
  2. Dynamic web มีภาษาโปรแกรมเข้ามาเกี่ยวข้องแรกๆ เป็น Javascript  ทำงานฝั่ง client ต่อมามีการใช้ CGI พวก Perl, PHP เขียนโปรแกรมทำงานฝั่ง server ด้วยทำให้มีการ interactive ระหว่าง client กับ server
  3. Real-time web ถ้าใช้การ interactive ระหว่าง client-server มันน่าจะอยู่กลุ่มเดียวกันกับข้อ 2 แต่ต่างกันนิดนึงคือมีการรับ-ส่งข้อมูลกันตลอดเวลาถ้า server มีการ PUSH ข้อมูลมาที่ client ก็จะแสดงผลทันทีไม่ต้อง request ไปที่ server ใหม่ การ request ไปที่ server ใหม่เช่นการ refresh หน้าเว็บต้อง request ข้อมูลที่ server ใหม่ทั้งหมดทำให้เกิด overhead ในการรับ-ส่งข้อมูล ถ้ายังนึกไม่ออกให้คิดถึงเฟซบุ๊กที่เวลาเพื่อนคอมเม้นต์ แล้วจะมีแจ้งเตือนเราเกือบจะทันที หรือ inbox ในหน้าเว็บ Gmail เวลามีอีเมลเข้าก็จะแจ้งเตือน unread เกือบจะทันทีเหมือนกัน

คำแนะนำการพัฒนา real-time app ด้วย Node.js และ Socket.io

ผมใช้ Node.js ร่วมกับ Socket.io มาได้ซักพักแล้ว เอาไปใช้ในแลปเล็กๆ ส่วนตัวของผมเองและเอาไปใช้จริงในงานที่ทำด้วย ก็พอเห็นปัญหาการในพัฒนาพอสมควรขอสรุปปัญหาและวิธีแก้ของผมดังนี้ครับ

1. สไตล์การเขียนโปรแกรมแบบ Asynchronous

Node.js มันคือ Javascript ถ้าคุ้นเคยมาก่อนจะดีมาก การเขียนโดยทั่วไปเขียนเหมือน procedural programming ทำงานจากบนลงล่างแต่ก็มีส่วนที่เป็น asynchronous API ของภาษามีการใช้ callback function เยอะมาก

ด้วยความที่ Node.js เป็น event-driven หรือ event-based รันด้วย thread เดียว เพื่อให้รองรับการทำงานพร้อมกันและลด overhead ระหว่าง thread การทำงานของโปรแกรมจะเป็นแบบ asynchronous หมายความว่า I/O จะไม่ถูกบล็อคการทำงาน ตัวอย่างเช่น การใช้งาน AJAX เมื่อเริ่มทำงานก็จะ request ข้อมูลออกไประหว่างที่รอ response ตอบกลับมาคำสั่งบรรทัดข้างล่างก็จะงานของมันไป (ถ้าทำเป็นแบบ sync ต้องรอให้มี response ตอบกลับมาก่อนจึงจะทำคำสั่งต่อไปได้) เมื่อมีการ response ข้อมูลกลับมาก็จะมีการส่ง event บอกว่าการตอบกลับมาแล้ว ซึ่ง event ตรงนี้เราสามารถเขียนโค้ดเพื่อจับ event แล้วนำข้อมูลไปประมวลผลต่อ เช่น เอาไปแสดงผลหน้าเว็บต่อได้

ปัญหาที่พบในการเขียน asynchronous programming คือการคุม control flow และ scope ของตัวแปรเพราะมีการใช้ callback function เยอะมาก บางครั้งต้องเขียน callback function ซ้อนกันหลายชั้นทำให้เกิดปัญหาที่เรียกว่า “callback pyramid”

Node.js มี lib สำหรับเขียน control flow ของโปรแกรมหลายตัวส่วนตัวผมใช้ Async เพราะครอบคลุมการทำงานหลายรูปแบบ ใช้ง่ายและ document ค่อนข้างดี คนใช้เยอะตัวอย่างเยอะด้วยอันนี้แนะนำครับ