Forum

เหมือนว่า Facebook เราจะกลายเป็น Blog ไปแล้ว (แต่อันไหนมีสาระมากๆ ก็จะพยายามไปใส่ใน [Google+](https://plus.google.com/108003073552145737788/posts) ด้วย)

ช่วงปิดเทอมนี้กำลังจะพยายามเขียนเว็บบอร์ดใน [menome](http://menome.sunburn.in.th) อยู่ มันเป็นความคิดชั่ววูบว่าน่าจะเขียนบอร์ดเองและใส่แนวคิดแปลกใหม่ลงไปบ้าง

ผมเองเห็นบอร์ดที่ไอเดียดีมากๆ มาจาก Pantip3G เป็นตัวแรก ตอนนี้มันยังไม่ออก แต่ผมชอบไอเดียของเขาที่ว่ากระทู้ไม่ได้มีแค่กระทู้ไล่ลงมา แต่มันมีกระทู้รายงานสด กระทู้โพสต์รูป ฯลฯ อีก แต่ละแบบการแสดงผลหัวข้อ และโพสต์คำตอบมันต่างกันออกไป

ตอนผมทำ bd2.in.th ก็เคยได้โจทย์นี้ อยากทำ gallery ผมว่ามันเกะกะเลยไม่ทำแล้วทำเป็น gallery tag ไปในบอร์ดแทน ซึ่งจะมีการแสดงที่สวยกว่าเอา img tag เรียงๆ กันทั่วไป แต่นั่นคือสิ่งที่เราทำได้ในเว็บบอร์ดแบบทั่วๆ ไป (traditional forum software)

ต่อมาผมเปลี่ยน bd2.in.th ไปใช้ Vanilla Forum ซึ่งผมเห็นไอ้นี่มานานแล้ว แต่ตอนได้ลองเอง มันเป็นบอร์ดที่ความคิดสดใหม่มาก คือมันเหมือนเฟสบุ๊คในรูปแบบของบอร์ด

– หน้ารวมกระทู้ อันนี้บอร์ดทั่วไปไม่ค่อยมี คือแสดงทุกหมวดรวมกัน
– Profile มี Wall
– ระบบ Messaging มันสุดยอด! เวลา PM มันจะจัดกลุ่มเป็น thread แล้ว thread นึงมีมากกว่า 2 คนได้ สามารถลากคนเพิ่มเข้าไปได้ด้วย
– Notification มันก็เด็ด เหมือนเฟสบุ๊ค เวลามีอะไรมันจะเด้งด้านล่าง หรือจะกดไปดูย้อนหลังก็ได้ สามารถตั้งได้ว่าเด้งแค่ไหน เช่นกระทู้นี้มีคนตอบให้เด้ง อันนี้ผมเอาไปต่อยอดใน bd2.in.th ทำ site wide notification ([บล็อคเก่า](/node/876))
– ระบบ user ยืดหยุ่นมาก LDAP ก็ได้ แต่ที่เจ๋งคือ Facebook/Twitter ก็ได้ แล้วก็ยังมีแบบ Connect plugin ให้ระบบอื่นเป็น auth source เลยก็ได้ (เราใช้กับ WordPress)
– Wall ของเว็บ มีคนเปลี่ยน avatar มีกระทู้ก็จะขึ้น หรือจะไปเขียนเองก็ได้
– Wall comment เป็นแบบเฟส คือ threaded ชั้นเดียว

ผมว่าไอ้นี่อะมันคือชุมชนขนาดย่อมได้เลย โดยเฉพาะ wall ที่ทำให้ชุมชนมันใกล้ขึ้น แต่เสียงส่วนมากจากผุ้ใช้ที่ผมได้ยินคือมันใช้ยาก อันนี้ผมเถียงตายเลย มันไม่ใช่บอร์ดที่คุณชินในฟอร์แมตที่คุณเคยใช้ แต่ผมว่ามันใช้ง่ายกว่าเยอะมาก

ทีนี้มาถึง menome ผมนึกไปถีง Google Wave แล้วว่าเออ ไอ้นี่มันเจ๋ง เหมาะมาทำบอร์ด แต่จะทำแบบนั้นก็ยากไป ผมก็ไม่ไหว (Wave ใช้เวลาเขียนสองปีนะครับ และมันคือเวลาอิสระ 40% ของ Full-time engineer ส่วนผมตอนทำงานชอบคิดว่ามีเวลาแบบนั้นทั้งๆ ที่ไม่มี) ก็เมื่อกี้ผมก็เลยไปสำรวจบอร์ดอนิเมะที่ดังๆ อย่าง tirkx แล้วผมเห็นดังนี้

– หัวกระทู้มักจะยาวและมีสาระ (แต่จากประสบการณ์บางกระทู้หัวกระทู้มีแค่คำว่า “เหมือนหัวข้อ”)
– comment 60% จะเข้ามาโฮกกกกกกแล้วก็จากไป หรือเป็น comment ที่แบบว่าไม่อ่านก็ได้
– comment ที่เหลือจะไม่ค่อยมีสาระเท่าหัวข้อกระทู้
– “คิดว่า” การตอบกระทู้ใช้แค่ @mention พอแล้ว ไม่ต้องขนาด quote
– คนจะตอบกระทู้กันประมาณ 2-4 บรรทัด แต่จริงๆ แล้วคิดว่าเอามารวมกันก็อ่านได้ เพียงแต่ที่เขาเหลือเยอะ เลยกดให้มันอ่านง่าย
– category ที่มีสาระกว่าอนิเมะหน่อยอย่างห้องไอทีจะต่างจากนี้สิ้นเชิง comment น้อยแต่สาระเยอะ

ปัญหาที่ผมเห็นชัดๆ คือทำไมเข้ามาโฮกกกกกซายากะะะะะแค่นี้ทำไมต้องแสดงโพสต์ขนาด 400px ทั้งๆ ที่ใช้เวลาอ่านประมาณ 500ms ฉะนั้น ผมเลยได้ spec บอร์ดตัวเองแบบนี้

– หัวกระทู้เป็นแบบ traditional (แบบชาวบ้านเขาใช้กัน)
– comment ผมใช้ระบบ quick reply ถ้าใช้ quick ตอบต้องจบใน 1 บรรทัด ความยาวอาจจะสัก 500 ตัว และจะแสดงเป็น comment เล็กๆ แบบใน stackoverflow
– upvote comment ได้ และต่อไปอาจจะมีการตั้ง threshold
– comment มีโหมดพิมพ์ยาว 10k ตัว comment ที่เขียนในโหมดนี้จะแสดงผลแบบปกติ คือมีชื่อคนโพสต์ avatar และใช้ที่แสดงผลมากกว่า

ทีนี้เลยคิดว่าอีกจุดขายนึงของ Wave คือ realtime ฉะนั้นผมกำลังชอบ ก็เลยจัด socket.io server มาตัวแล้วทำให้ comment รับส่งกันแบบ realtime ไปเลย! ระบบ quick reply ก็จะกลายเป็น chat ไปในตัว ช่วยให้การสนทนาน่าสนใจไปอีก

พอมาเป็น chat ปัญหาที่จะเกิดคือ

– message มันจะเก็บไว้ถาวร เพราะมันคือ comment ในกระทู้ ไม่ใช่ห้องแชทที่เขียนแล้วหายไป ฉะนั้นมันจะรกมาก อันนี้กำลังคิดว่าจะดูจาก upvote ถ้าไม่ถึงก็ hide แต่ comment ในสตรีมให้มันไหลไปเลยไม่มี filter
– message ใหม่มันมาข้างล่าง ซึ่งมันคือหน้าสุดท้าย แต่ถ้าจะอ่านหน้าแรกของกระทู้สิบหน้าต้องกด load more เก้าครั้ง อันนี้คงไม่ใช่ วิธีที่คิดออกตอนนี้คือ unread อยู่ไหนก็โหลดจากหน้านั้นไป ถ้าไม่ถึงหน้าล่าสุดสตรีมจะยังไม่โหลด
– reply แบบเต็มอาจจะไม่ซ่อน
– flooding อันนี้คิดว่า rate limit อาจจะคิดตามความยาวของ post เพราะแน่นอนว่าโพสต์ยาวก็ต้องใช้เวลาพิมพ์มาก ถ้าคุณจะ copy paste ยาวๆ มาฟลัดมันจะติดลิมิตแต่คนทั่วไปถ้าไม่พิมพ์เร็วมากก็ไม่ควรติด
– เมื่อกี้ทดสอบแชทมา พบว่าพอเป็น realtime สิ่งต่อมาที่ต้องมีคือ “user online”

ไม่รู้จะจบโพสต์นี้ยังไงดี เอาเป็นว่าจบห้วนๆ แบบนี้แล้วกัน เพราะบอร์ดเองก็ยังไม่เสร็จ ไว้เขียนแล้วเจออะไรจะเก็บมาเล่าอีกแล้วกันนะครับ

ปล. unread ยังคิดไม่ออกเลยว่าเก็บยังไงดี คือเก็บอะได้ แต่ยังไงให้ efficient

Real Time Web: Next generation website

เคยทวิตไว้นานแล้วครับ เกี่ยวกับเรื่อง Real Time Web เลยขอเก็บมาเขียนบล็อคเดี๋ยวจะกลายเป็นบล็อคอนิเมะไปซะได้ (ที่ BG เป็นรูปอนิเมะเนื่องจากผมต้องการผูก [menome profile](http://menome.sunburn.in.th/whs)​ โปรเจกท์ใหม่ของผม เข้ากับบล็อคครับ สักพักคงจะกลับมาเป็นแบบธรรมดาๆ)

Web 2.0 คงจะได้นิยามเป็น Web+Social ครับ เราผลัดจากการเป็นผู้ผลิตเนื้อหา เป็นผู้ผลิตแพลตฟอร์มสำหรับเนื้อหา ผมเองก็ใช้แนวคิดนี้กับ menome “Social+anime” เรามี Wiki ให้ผู้ใช้สามารถจัดการอัพเดตได้ (แต่ต้องอนุมัติก่อนอยู่ดี) แต่บางจุดพื้นฐานอย่างการเพิ่มอนิเมะก็ต้องมีแอดมินที่ทำหน้าที่ตรงนี้ เพื่อไม่ให้เกิดปัญหาเน่าเสียแบบ foursquare แต่เว็บทุกวันนี้เราก้าวไปด้วย HTML5 แล้ว อะไรละคือยุคถัดไป?

คำตอบของผมคงจะเป็น Real-time web ครับ อาจจะว่า เอ๊ะ มันมีคนใช้หรอ? ที่เราเห็นชัดเจนคงเป็น Twitter นั่นแหละครับ วันแรกที่ผมสัมผัส user stream มันว้าวววมาก (ผมเขียน client เองเลยได้ใช้ก่อนคนอื่นหลายเดือน) จากที่เราต้องรอตอบเมนชั่นสามนาที ห้านาที สิบนาที นั่งกดรีเฟรชรอคำตอบ เราสามารถจะตอบสนองกันได้ทันที ทุกวันนี้เราก็คงเคยชินกับ real-time web ใน notification ของเฟสบุ๊คแล้ว ไม่ต้องนั่งรีเฟรชแค่เปิดเว็บทิ้งไว้ก็ไม่พลาดอัพเดต

ถามว่า เอ๊ะ แล้วเว็บไซต์ทั่วไปจะได้ใช้หรอ? ผมว่าถ้าเว็บที่เป็น 2.0 อยู่แล้วได้ใช้อยู่แล้วครับ การเคลื่อนไหวมันเร็ว น่าจะต้องกระจายออกไปให้ผู้ใช้เร็วขึ้น

หรืออย่างบล็อคผมเนี่ยครับ ก็ใช้ [pubsubhubbub](https://code.google.com/p/pubsubhubbub/) protocol (ลองอ่านชื่อเร็วๆ สิบรอบดู) ถ้า feed reader ใครรองรับก็จะพบว่าพอผมอัพบล็อคจะขึ้นอัพเดตในทันทีเลย ซึ่งใน menome ผมก็ implement pubsubhubbub ไว้ อย่างบล็อคผมนี้เวลาอัพแล้วใน menome ก็จะขึ้นอัพเดตในทันที ทำให้คนอ่านไม่ต้องมานั่งเข้าบล็อคผมทุกวันๆ เพื่อหาข่าว และยังประหยัดเวลา polling ด้วย​ (menome poll blog 30 นาทีครับ)

สำหรับใน HTML5 เองก็มี WebSocket ที่มาตอบโจทย์นี้ครับ เซิร์ฟเวอร์สามารถพุช event เข้ามาหาผู้ใช้ได้ในทันที และแน่นอนคำว่าทันทีคือทันทีจริงๆ ครับ ไม่มี delay จาก polling interval ต่างๆ เลย ใน [live.bd2.in.th](http://live.bd2.in.th) ก็ใช้ websocket ในการอัพเดตข่าว DJ ครับ เมื่อ DJ กด enter แทบจะเรียกได้ว่าวินาทีเดียวกับที่ดีเจได้รับข้อความว่าอัพเดตเรียบร้อยแล้ว ฝั่งคนฟังก็สามารถเห็นข้อความนั้นได้ทันทีแล้วครับ

ปัญหาของ Realtime Web ตอนนี้คือการ implement ไม่ง่ายครับ Apache แสดงอายุมันออกมาแล้วโดยเฉพาะ connection นานๆ แบบนี้ถ้าไม่ใช่ event based คงไม่รอด ฝั่ง nginx เองก็มี plugin ที่ทำงานนี้ครับ (รู้สึกว่าจะไม่ใช่ WebSocket อยู่ดี) แต่ที่มาแรงตอนนี้เลยคือ [nodejs](http://nodejs.org) ครับ ใน bd2.in.th ก็ใช้

แน่นอน nodejs ไม่ใช่ภาษาที่คุ้นเคยแบบ PHP ครับ มันเป็น JavaScript แถมเป็น Async อีก (ลองหา mongodb driver ใน nodejs driver สิครับ แล้วจะรู้ว่า async นรกมาก) ฉะนั้นคนใช้เลยน้อย ของ menome ผมเองยังบอกเลยว่าไม่ทำ websocket ใช้ poll 60 วิแทนเพราะไม่ได้ไหลเร็วขนาดนั้น และก็ขี้เกียจเขียนหลายตัว ขี้เกียจเปิดพอร์ตเพิ่ม

อีกอย่างนึงคือผมเห็นใจคนที่ใช้แชร์โฮสต์ด้วยแหละครับ ในอดีตเรามีฟรีโฮสต์ เอา HTML ไปฝากก็พอ ใครใช้ CMS นั่นกระแดะ ยุคต่อมาใน 2.0 PHP เป็นสิ่งสำคัญที่ขาดไม่ได้ และนั่นคือแชร์โฮสต์ แต่ในยุค 3.0 แบบนี้ nodejs ไม่ใช่จะจัดการง่ายแบบ Apache PHP แล้วครับ คงต้องเพิ่มไปถึงขั้น VPS และ VPS เองก็เป็นปัญหาการจัดการทั้งผู้ดูแล (ที่ต้องเรียนวิธีใช้ลินุกซ์ แถมจ่ายแพงกว่าแชร์โฮสต์อีก) จนไปถึงผู้ให้บริการ (เพราะก็ต้องหาเครื่องมาทำ VPS ที่กินทรัพยากรมากขึ้น) ซึ่งแชร์โฮสต์เองมีมานานแล้ว แต่ VPS นี่ก็เพิ่งได้รับความนิยมครับ

(จริงๆ แล้วโฮสต์ node จริงๆ จังๆ ก็มีเช่น heroku/Joyent แต่พวกนี้ใช้ระบบของตัวเองครับ ใครจะเปิดก็ต้องไปลงทุน R&D มาทำให้ราคามันยังแพง)