- AsmBB เป็นเอนจินเว็บฟอรัมที่รวดเร็วและน้ำหนักเบาสร้างโดย JohnFound ช่วยให้รันฟอรัมได้แม้บนเซิร์ฟเวอร์ขนาดเล็ก ด้วยโครงสร้างที่ใช้ภาษาแอสเซมบลีและ SQLite
- รองรับทั้ง 32 บิตและ 64 บิตบน เซิร์ฟเวอร์ x86 Linux และรันได้บน VPS หรือ shared hosting ที่รองรับ FastCGI โดยไม่ต้องติดตั้งไลบรารีเพิ่มเติมล่วงหน้า
- ด้านความปลอดภัยเน้น dependency ที่น้อยและการออกแบบภายใน ต่อเนื่องมาถึงฐานข้อมูลเข้ารหัส SQLeet ใน v2.7 และการรองรับ SQLite3MultipleCiphers ใน v3.0
- ฟีเจอร์ขยายครอบคลุมธีม การปรับแต่งเทมเพลต, MiniMag·BBCode, ไฟล์แนบ, เธรดจำกัดสิทธิ์เข้าถึง, แชตแบบเรียลไทม์, Atom/RSS, การแจ้งเตือน SSE, UI หลายภาษา, การฝัง YouTube และการจัดอันดับเธรด
- v3.0 มี การเปลี่ยนแปลงที่ไม่เข้ากันย้อนหลัง ในโครงสร้างฐานข้อมูลและเทมเพลต ดังนั้นเมื่ออัปเกรดจาก v2.9.1 ต้องถอดรหัส สำรองข้อมูล เปลี่ยน schema และแทนที่ไบนารีกับ
templates/
โครงสร้างและสภาพแวดล้อมการรันของ AsmBB
- AsmBB เป็นเอนจินเว็บฟอรัม และฟอรัม AsmBB.org ก็ทำงานอยู่บน AsmBB เช่นกัน
- เขียนทั้งหมดด้วย ภาษาแอสเซมบลี และใช้ SQLite เป็น backend ฐานข้อมูล
- ชูจุดเด่นว่าสามารถรองรับผู้เยี่ยมชมจำนวนมากได้โดยไม่มีความหน่วง แม้ในสภาพแวดล้อมโฮสติ้งที่มีทรัพยากรน้อย
- ความต้องการในการรันค่อนข้างต่ำ
- ต้องมี เซิร์ฟเวอร์ x86 Linux
- รองรับทั้ง 32 บิตและ 64 บิต
- ไม่ต้องมีไลบรารีที่ติดตั้งไว้ล่วงหน้าเป็นพิเศษ
- ใช้งานได้แม้บน VPS ขนาดเล็กที่สุดหรือราคาถูกที่สุด
- หากรองรับ FastCGI ก็ใช้งานบน shared hosting ได้ด้วย
- ต้องมีเว็บเซิร์ฟเวอร์ที่รองรับอินเทอร์เฟซ FastCGI
- เว็บเซิร์ฟเวอร์ที่ทดสอบแล้วคือ Nginx, Apache, Lighttpd, Hiawatha, RWASA
ความปลอดภัยและฐานข้อมูลเข้ารหัส
- AsmBB มุ่งเป็นเว็บแอปพลิเคชันที่มีความปลอดภัยสูง โดยอาศัยการออกแบบภายในและ dependency ที่น้อย
- เพื่อความปลอดภัยที่สูงขึ้น รองรับ ฐานข้อมูลเข้ารหัส เป็นตัวเลือก
- การเปลี่ยนแปลงหลักของ v2.7 คือการรองรับฐานข้อมูลฟอรัมแบบเข้ารหัส
- ใช้ปลั๊กอิน SQLite SQLeet
- ตามสเปกรองรับการ derive key แบบ PBKDF2-HMAC-SHA256, salt 16 ไบต์ และการวนซ้ำ 12345 ครั้ง
- ใช้รหัสลับสตรีม ChaCha20 และคีย์แบบใช้ครั้งเดียว
- ใช้แท็กยืนยันตัวตน Poly1305
- สามารถเปิดและปิดการเข้ารหัสได้จากแท็บ Encryption ใหม่ในแผงตั้งค่าผู้ดูแล
- คีย์เข้ารหัสจะไม่ถูกบันทึกลงดิสก์ แต่เก็บชั่วคราวใน RAM เท่านั้น
- ตั้งเป้าให้เป็นโครงสร้างที่ป้องกันการเปิดเผยฐานข้อมูลฟอรัม คุณสมบัติบัญชี และข้อมูลส่วนตัว แม้เว็บเซิร์ฟเวอร์ เซิร์ฟเวอร์สำรอง หรือสื่อสำรองข้อมูลจะถูกเจาะอย่างร้ายแรง
- ข้อจำกัดที่ทราบคือทุกครั้งที่เอนจินรีสตาร์ต ต้องป้อนคีย์เข้ารหัสใหม่ผ่านเว็บอินเทอร์เฟซ
- หากเซิร์ฟเวอร์รีสตาร์ตโดยไม่ตั้งใจ การเข้าถึงฟอรัมอาจถูกปิดกั้นอยู่ช่วงหนึ่ง
- AsmBB อธิบายว่าเนื่องจากเป็นแอปพลิเคชันที่รันต่อเนื่องได้นานและเสถียร สถานการณ์แบบนี้จึงเกิดในระดับหนึ่งครั้งต่อหลายเดือนหรือหลายปี
- เมื่อใช้ฐานข้อมูลเข้ารหัส จำเป็นต้องใช้ SSL/TLS
การปรับแต่งและช่องทางติดตั้ง
- AsmBB ช่วยให้ปรับแต่งฟอรัมได้โดยไม่ต้องแก้โค้ดโดยตรง ผ่าน ระบบเทมเพลต
- แพ็กเกจไบนารีดาวน์โหลดได้จาก asmbb.tar.gz โดยลิงก์ดังกล่าวชี้ไปยังแพ็กเกจไบนารีล่าสุด
- การติดตามความคืบหน้า รายงานบั๊ก และ clone ซอร์สทำได้ที่ AsmBB source repository
- เอกสารติดตั้งบนเซิร์ฟเวอร์ของตนเองมีให้ใน บทแนะนำการติดตั้งด้วย NGINX และ systemd
- หากใช้ RWASA สามารถติดตั้งได้ภายในไม่ถึง 2 นาที และมี วิดีโอสอน กับ วิดีโอ YouTube ให้ดู
การเปลี่ยนแปลงล่าสุดของฟอรัม
- ฟอรัมปัจจุบันเพิ่มธีม Glass, Neumor, Poly, Brutal, Joly, Tailwind, Snes แล้ว
- การแทรก URL ด้วยปุ่ม MiniMag จะใช้ข้อความที่เลือกเป็น anchor text
- การยืนยันอีเมลจะส่งตามการตั้งค่าภาษาหลัก
- มีการแก้ไขที่เกี่ยวกับ MiniMag
- มีการ implement ฟีเจอร์ page สำหรับใช้กับหน้าติดต่อหรือ TOS เป็นต้น
- มีการ implement API แล้ว
การเปลี่ยนแปลงหลักของ v3.0 และข้อควรระวังในการอัปเกรด
- v3.0 เพิ่มฟีเจอร์ใหม่หลายอย่าง
- วางรูปภาพโดยตรงเพื่อเพิ่มเป็นไฟล์แนบได้
- รองรับการฝังวิดีโอ YouTube
- นำ editor สำหรับโพสต์/เธรดแบบรวมมาใช้ เพื่อลดความซับซ้อนของโค้ดและเทมเพลต
- เพิ่มการจัดอันดับเธรด
- สกิน Modern ถูกนำออกจากโปรเจกต์เนื่องจากคุณภาพต่ำ
- v3.0 มี การเปลี่ยนแปลงที่ไม่เข้ากันย้อนหลัง กับเวอร์ชันก่อนหน้า
- เปลี่ยนโครงสร้างฐานข้อมูล
- เปลี่ยนโครงสร้างเทมเพลต
- เนื่องจากโปรเจกต์ SQLeet หยุดพัฒนา จึงเพิ่มการรองรับส่วนขยายเข้ารหัส SQLite3MultipleCiphers
- แพ็กเกจไบนารี release ถูกคอมไพล์มาพร้อมส่วนขยายนี้
- แก้ไขบั๊กและช่องโหว่ที่พบ
- บั๊กหลายรายการถูกพบจากผลของ hxp CTF event
- เมื่อต้องอัปเดตฐานข้อมูลจาก v2.9.1 เป็น v3.0 ลำดับขั้นตอนมีความสำคัญ
- ต้องถอดรหัสก่อนแก้ไขฐานข้อมูลเดิม
- ไลบรารี SQLite3MultipleCiphers ใหม่ถูกใช้ในโหมดที่ไม่เข้ากันกับไลบรารี SQLeet เดิม
- ก่อน migrate เป็น v3.0 สามารถถอดรหัสฐานข้อมูล แล้วหลังจากนั้นเข้ารหัสใหม่ด้วยไลบรารีใหม่ได้
- ต้องสำรองข้อมูลไว้เผื่อเกิดปัญหา
- ต้องรัน SQL เปลี่ยน schema ที่ให้มาใน SQLite console
- หลังเปลี่ยน database schema แล้ว ต้องหยุดเอนจินและแทนที่ไฟล์ไบนารี
engine,ld-musl-i386.so,libsqlite3.so - ระหว่างที่เอนจินหยุดทำงาน ต้องแทนที่ไดเรกทอรี
templates/ทั้งหมดด้วยของใหม่ - หลังเริ่มเอนจินใหม่ ต้องตรวจสอบว่าฟอรัมที่อัปเดตแล้วไม่มีปัญหา
- หากทุกอย่างปกติ สามารถเข้ารหัสฐานข้อมูลอีกครั้งได้จากหน้าตั้งค่า AsmBB
ลำดับ release ของ v2.x
-
v2.9: Urban Sunrise และการปรับปรุงประสบการณ์การแก้ไข
- เพิ่มธีม responsive ใหม่ Urban Sunrise
- มุ่งปรับปรุงรูปลักษณ์ของฟอรัม
- มีคำแนะนำการจัดรูปแบบฝังอยู่ใน editor เขียนโพสต์
- รองรับ Unicode Emoji แบบ native ใน editor เขียนโพสต์และแชตแบบเรียลไทม์
- รองรับการทำ syntax highlighting ของซอร์สโค้ดผ่านไลบรารี JS
- แชตแบบเรียลไทม์รับข้อความหลายบรรทัดรวมถึงซอร์สโค้ดได้
- แก้ไขบั๊กที่มีรายงานของเอนจิน AsmBB และไลบรารี FreshLib
-
v2.8: แก้บั๊กและฟีเจอร์ป้องกัน
- แก้บั๊กหลายรายการ โดยบางรายการเป็นบั๊กร้ายแรง
- เพิ่มธีมใหม่ Modern
- implement การป้องกัน DDOS สำหรับกรณีหายากที่ AsmBB รับอัตราคำขอไม่ไหว
- เพิ่ม URL analyzer สำหรับ parser ของ MiniMag และ BBCode เพื่อป้องกันการโจมตี XSS ผ่านลิงก์ของผู้ใช้
-
v2.6: UI ภาษาเยอรมันและการขยาย SSE
- เป็นเวอร์ชันทางการแรกที่รวมคำแปล UI ภาษาเยอรมัน
- คำแปลอื่น ๆ ก็ได้รับการปรับปรุงด้วยความช่วยเหลือจากชุมชน
- สามารถสมัครรับฟอรัมทั้งหมด แท็กเฉพาะ หรือธีมเฉพาะผ่านฟีด Atom/RSS ได้
- การประมวลผล Server-Sent Events (SSE) ถูกเขียนใหม่ตั้งแต่ต้น
- SSE ไม่ได้ใช้เฉพาะกับแชตแบบเรียลไทม์ แต่ยังใช้แจ้งเตือนอีเวนต์ต่าง ๆ ของฟอรัม เช่น โพสต์ใหม่และกิจกรรมผู้ใช้ได้ด้วย
- จัดการไคลเอนต์ทั้งหมดในเธรดเดียว ทำให้รองรับผู้เยี่ยมชมจำนวนมากพร้อมกันโดยมีภาระบนเซิร์ฟเวอร์ต่ำ
- แพ็กเกจไบนารีรวม SQLite และไลบรารี MUSL เวอร์ชันล่าสุดไว้ด้วย
-
v2.5: UI หลายภาษาและ BBCode
- มีการนำ internationalization ของ user interface มาใช้
- ผู้ใช้เลือกภาษาของ UI ฟอรัมได้
- ภาษาที่ให้มาคือ English, Bulgarian, Russian, French
- เพิ่ม parser BBCode เป็นภาษามาร์กอัปที่สอง ทำให้เข้าใจได้ทั้ง MiniMag และ BBCode
- BBCode ช่วยเมื่อสร้างสคริปต์สำหรับ migrate จากเอนจินฟอรัมอื่น
- สามารถส่งอีเมลผ่านโปรแกรมภายนอก เช่น
sendmailได้
-
v2.4: ไฟล์แนบ การจำกัดสิทธิ์เข้าถึง และประสิทธิภาพแชต
- แนบไฟล์กับโพสต์ได้ และสิทธิ์แนบไฟล์ถูกจัดการแยกตามผู้ใช้
- Limited access threads ช่วยให้เจ้าของเธรดกำหนดรายชื่อผู้ใช้ที่เข้าถึงได้
- แก้ไขสิทธิ์ผู้ใช้ได้จากหน้าผู้ดูแล
- ตั้งค่าสิทธิ์ของผู้ใช้นิรนามแยกต่างหากได้ ทำให้สร้างฟอรัมแบบปิดที่มีเฉพาะผู้ใช้ลงทะเบียนเท่านั้นที่อ่านได้
- บริการแชตแบบเรียลไทม์ถูก refactor ให้จัดการทุก connection ในเธรดเดียว
- หลัง optimize เอนจินเรนเดอร์เทมเพลต, database schema และ SQL request แล้ว เร็วกว่าเวอร์ชันก่อนหน้าประมาณ 20%
-
v2.3: การบำรุงรักษาและ accessibility
- เป็น maintenance release ที่แก้บั๊กร้ายแรง 2 รายการ
- เพื่อ accessibility ได้แทนที่ภาพพื้นหลังด้วยแท็ก
<img>ที่มีข้อความalt - แม้ปิดรูปภาพไว้ก็ยังใช้งานฟอรัมได้
- โค้ด JS สำหรับแชตถูกจัดระเบียบและเร็วขึ้นเล็กน้อย
-
v2.2 และ v2.1: ล็อกอิน กู้คืน และ navigation
- รวมการล็อกอินคงสถานะ การรีเซ็ตรหัสผ่าน รายชื่อผู้ใช้ และการปรับปรุงแชต
- การล็อกอินคงสถานะถูกปิดไว้โดยค่าเริ่มต้น
- การรีเซ็ตรหัสผ่านต้องใช้อีเมลที่ถูกต้อง และเข้าถึงได้จากลิงก์ในฟอร์มล็อกอิน
- v2.2 เพิ่ม navigation แบบ Categories ที่อิงระบบแท็ก
- เพิ่มการเก็บประวัติการแก้ไข/ลบโพสต์และฟีเจอร์กู้คืน
-
v2.0: ประสิทธิภาพและความปลอดภัยของโค้ด
- template renderer
render.asmถูกแทนที่ด้วยrender2.asm - implementation ใหม่ใช้อัลกอริทึมที่มีสไตล์แบบแอสเซมบลีมากขึ้น ทำให้เร็วกว่าและใช้หน่วยความจำน้อยลง
- การเปรียบเทียบสตริงแบบต่อเนื่องในการ parsing URL ถูกแทนที่ด้วย hash table
- ความเร็วของ AsmBB เพิ่มขึ้นประมาณสองเท่า
- แก้ไขช่องโหว่ที่พบด้วยเครื่องมือทดสอบ รวมถึง OWASP ZAP และ Tinfoil security
- แก้ resource leak และ memory leak ที่พบระหว่างการ fuzzing อย่างหนักและการทดสอบโหลดกึ่ง DDOS
- implement เครื่องมือ debug ที่รวบรวมการ allocate/free resource และ memory แล้วรายงานเป็นเว็บเพจ
- template renderer
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
นี่เจ๋งมากจริง ๆ แต่ประโยคต่อไปนี้น่าสงสัยมาก:
“AsmBB เป็นเว็บแอปพลิเคชันที่ปลอดภัยมาก ด้วยการออกแบบภายในและ dependency ที่ลดลง”
การใช้ dependency ที่ผ่านการตรวจสอบมาอย่างดีก็มีคุณค่ามากเช่นกัน และต่อให้เป็น Chuck Norris ถ้าเขียนซอฟต์แวร์ที่ซับซ้อนด้วย assembly ก็เลี่ยงไม่ได้ที่จะสร้างบั๊ก
ยิ่งโดยเฉพาะกรณีที่ต้องทำ การประมวลผลสตริง เยอะเหมือนโปรเจกต์นี้ก็ยิ่งเป็นเช่นนั้น
ตอนที่โปรเจกต์นี้เคยออกมาเป็น โจทย์ CTF ที่โฮสต์เวอร์ชันล่าสุดของโปรเจกต์ไว้ตามเดิม ก็รู้สึกแบบเดียวกัน และระหว่างการแข่งขันพบช่องโหว่อย่างน้อย 8 รายการ
https://ctftime.org/task/24399
เช่น ถ้าเขียนประมาณว่า “AsmBB ให้ความสำคัญกับความปลอดภัยในการออกแบบ และพึ่งพา dependency น้อยลง” ก็น่าจะดีกว่า
ชอบนะ และน่าทึ่งที่เลือกเดินหน้าด้วย ภาษา assembly การลด dependency ทำให้พื้นผิวโจมตีลดลงจริง แต่แค่นั้นยังบอกว่า “ปลอดภัย” ไม่ได้
ในเชิงความน่าจะเป็นอาจลดโอกาสถูก exploit ได้ แต่ภาษา assembly ไม่มี memory safety หรือการรับประกันอื่นใดเลย จึงอาจเพิ่มความเสี่ยงด้วย
บอกไม่ได้ว่าฝั่งไหนมีผลมากกว่า แต่แอปพลิเคชันที่เขียนด้วย assembly ก็ยังน่าสนใจอยู่ดี แถมถ้า transpile ไปเป็น aarch64 ก็น่าจะเอา Pi-Zero หรือ Pi-W เสียบกับอะแดปเตอร์ติดผนังแล้วรันได้ด้วย
อีกด้านหนึ่ง ผมก็เคยศึกษาฟอรัมแบบกระจายศูนย์เป็นระยะ ๆ หลังจาก Usenet ถูกเบียดออกไป ฟอรัมแบบนี้ก็กลายเป็นกระแสหลัก แต่ถ้าจะเป็นสิ่งทดแทน ผมคิดว่าควรมีทั้งฟีเจอร์การกระจาย/ทำสำเนาของ Usenet และประสบการณ์ผู้ใช้แบบ phpBB
การทำให้มันกระจายศูนย์และมี eventual consistency เป็นโจทย์ระบบกระจายที่ยอดเยี่ยม สนุกเหมือนแก้ปริศนา ถ้าเคยมีใครทำของคล้าย ๆ กันไว้ ผมอยากเห็นมาก
signed arithmetic overflow และ underflow ทำงานตามที่คาดไว้ หน่วยความจำที่จัดสรรด้วย
mmap + MAP_ANONYMOUSก็ถูกกำหนดค่าเริ่มต้นเป็น 0 ตามที่คาดไว้หากเข้าถึงพื้นที่แอดเดรสที่ไม่ได้แมป รวมถึงแอดเดรส 0 ก็จะเกิด
SIGSEGVตามที่คาดไว้assembler ตั้งสมมติฐานน้อยกว่า C compiler มากและไม่ “ฉลาดเกินไป” เท่า จึงมีแนวโน้มจะระเบิดทันทีเมื่อเกิดข้อผิดพลาด มากกว่าจะทำลายความคาดหวังไปเงียบ ๆ
ถ้าดูจาก footer เวลาในการประมวลผล เร็วแบบเหลือเชื่อ แต่เอกสารใช้เวลา 500~1000ms กว่าจะส่งมาถึงเดนมาร์ก
ในกรณีนี้ CDN ดูจะดีกว่าโค้ดประสิทธิภาพสูง แต่ก็ยังเป็นผลงานที่น่าประทับใจ
แน่นอนว่าเวลาในการส่งข้อมูลคงเป็นสัดส่วนใหญ่ แต่ถ้านั่นถูกมองว่า “ดี” ก็ดูจะลำบากอยู่
สงสัยว่าโค้ด assembly เชื่อมต่อกับฐานข้อมูลอย่างไร มีอะไรอย่าง ไลบรารี assembly หรือเปล่า?
ตามทฤษฎีก็พอเข้าใจได้ แต่ความพยายามที่ต้องใช้ในการเขียนสิ่ง “ง่าย ๆ” แบบนั้นเองน่าจะมหาศาล
โค้ดที่เกี่ยวข้องอยู่ที่นี่: https://asm32.info/fossil/asmbb/file?name=source/sqlite3.asm...
การเขียนโปรแกรมด้วย assembly โดยพื้นฐานคือการทำสิ่งที่ compiler จะทำด้วยตัวเอง และสามารถเรียกฟังก์ชันไลบรารีเดียวกับที่โค้ด C เรียกได้
เพียงแต่ต้องทำตาม calling convention ของสถาปัตยกรรมนั้น ๆ จึงจุกจิกและน่าเบื่อ แต่ไม่ใช่เรื่องที่แทบเป็นไปไม่ได้
x64 ใช้รีจิสเตอร์ก่อน แล้วเมื่อใช้หมดจึงส่งผ่านสแตก ทำให้การเรียกฟังก์ชันยุ่งยากขึ้น ส่วน x32 ใช้สแตกอย่างเดียวจึงสะดวกกว่ามาก แต่ convention ของ x64 สามารถเก็บค่าไว้ในรีจิสเตอร์เพื่อสร้างโค้ดที่เร็วกว่าได้
ไม่ได้เขียนด้วย assembly ล้วน ๆ เพราะเบื้องหลังมี SQLite อยู่ด้วย เช่นเดียวกับแอปพลิเคชันจำนวนมาก คอขวดน่าจะเป็น I/O มากกว่า CPU
แน่นอนว่าพอนึกถึงโค้ด PHP ที่ผมเคยเห็น ก็เข้าใจว่าทำไมถึงรู้สึกแบบนั้น แต่เรื่องนั้นเป็นปัญหาวิธีใช้งานมากกว่าตัวภาษาเอง
ปัญหาคือความสามารถในการพอร์ต ผมชอบ AVR-8 แต่ถ้าความต้องการโตขึ้น AVR-8 ก็แทบไม่มีที่ไป นอกจากประมาณ FPGA soft core
ถ้าเป็น C ก็ย้ายไปไมโครคอนโทรลเลอร์ ARM ได้ แม้โดยส่วนตัวจะสนุกน้อยกว่า แต่ได้ประสิทธิภาพดีกว่า
ปัญหาของ AsmBB ก็อยู่ที่การผูกติดกับสถาปัตยกรรมเฉพาะเช่นกัน
PRAGMA synchronousเป็นNORMALก็ยังเป็นแบบนั้นหรือ? ผมไม่ใช่ผู้เชี่ยวชาญ SQLite เลย แค่กำลังดูเพื่อจะใช้กับโปรเจกต์หนึ่งมีเขียนไว้ว่า “ยิ่งไปกว่านั้น ยังรองรับอักขระ Unicode Emoji ในแบบเนทีฟจริง ๆ” แต่ตรงนี้อยากให้ช่วยอธิบายละเอียดกว่านี้หน่อย
ไม่ค่อยแน่ใจว่า “เนทีฟจริง ๆ” หมายถึงอะไร และก็ไม่ชัดเจนว่าต่างจากวิธีที่ “เนทีฟเล็กน้อย” อย่างไร
แต่แชตแบบเรียลไทม์มีการไฮไลต์อีโมจิในโค้ด JS ซึ่งเป็นส่วนหนึ่งของเทมเพลต:
function formatEmoji(text) {var emojiRegEx = /(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])/g;return text.replace(emojiRegEx, '$1');}น่าจะตั้งใจจับ U+00A9, U+00AE, U+2000..3300, U+1F000..1FBFF แต่แม้ตัวมันเองก็ยังกว้างเกินไป และ regex ก็ไม่ได้แปลงอย่างครบถ้วนถูกต้อง
ถ้าอยากรู้วิธีแก้ที่ถูกต้อง ใช้
emoji-regex[1] หรือแพตเทิร์นที่ใหม่กว่า/\p{RGI_Emoji}/v[2] ก็ได้[1] https://unpkg.com/browse/emoji-regex/index.js
[2] https://caniuse.com/mdn-javascript_builtins_regexp_unicodese...
ในส่วนหัวมีปุ่มสำหรับปิด การแจ้งเตือนแบบเรียลไทม์
เพิ่มเติมคือ การแสดงรายชื่อผู้ใช้ฟอรัมให้คนที่ไม่ได้ล็อกอินดู ไม่ค่อยดูดีนัก เป็นตัวเลือกที่ตั้งค่าได้ไหม?
คอนเซ็ปต์และการใช้งานจริงดีมาก เพียงแต่ การแจ้งเตือนแบบเรียลไทม์ เพิ่มจำนวนจนท่วมได้อย่างรวดเร็ว น่าจะต้องมีการจำกัดความถี่ในรูปแบบใดรูปแบบหนึ่ง
@User123 has entered the threadน่าจะเหมาะกับฟอรัมเล็ก ๆ ที่ทุกคนรู้จักกันphpBB/vBulletin แสดงรายการ “ผู้ใช้ที่กำลังอ่านเธรดนี้: ...” ก็ด้วยเหตุผลแบบนั้น และยังมีปลั๊กอินยอดนิยมที่แสดงว่า
@Fooกับ@Barกำลังเขียนตอบในเธรดนี้อยู่โดยเฉพาะระหว่างการถกเถียงดุเดือด มันทำให้พื้นที่รู้สึกมีชีวิตชีวามากขึ้น และการรู้ว่าอีกฝ่ายกำลังเขียนโพสต์ยาวถัดไปเพื่อโต้แย้งข้อความของเราทีละย่อหน้าที่อ้างถึง ก็ถือว่าดีไปอีกแบบ
แต่การได้รับแจ้งเตือนทุกครั้งที่แขกที่ไม่ได้ลงทะเบียนคลิกเข้าเธรด ดูไม่มีประโยชน์กับใครเลย
จะทำสิ่งคล้าย ๆ กันด้วย C แล้ว เลิกใช้ไลบรารีมาตรฐาน ก็ได้ ทำให้ไม่มี dependency อื่นนอกจาก system call ได้
นอกจากในแง่เป็นการฝึกทางปัญญาแล้ว ก็ไม่ค่อยเห็นเหตุผลหนักแน่นว่าทำไมต้องใช้แอสเซมบลี
ในชื่อเรื่องไม่ได้บอกว่าเป็นแอสเซมบลีแบบไหน หรือแม้แต่รันบนระบบปฏิบัติการอะไร
รวม “x86 asm” กับ “on linux” ก็ยังไม่ยาวกว่า “assembly language”