3 คะแนน โดย GN⁺ 2024-01-15 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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 แล้วรายงานเป็นเว็บเพจ

1 ความคิดเห็น

 
GN⁺ 2024-01-15
ความคิดเห็นจาก 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 เป็นโจทย์ระบบกระจายที่ยอดเยี่ยม สนุกเหมือนแก้ปริศนา ถ้าเคยมีใครทำของคล้าย ๆ กันไว้ ผมอยากเห็นมาก

    • ผมคิดว่าการใช้ภาษา assembly + Linux kernel ABI อาจปลอดภัยกว่าสแต็ก C/C++ แบบดั้งเดิม เพราะสัมผัสกับ undefined behavior น้อยกว่ามาก
      signed arithmetic overflow และ underflow ทำงานตามที่คาดไว้ หน่วยความจำที่จัดสรรด้วย mmap + MAP_ANONYMOUS ก็ถูกกำหนดค่าเริ่มต้นเป็น 0 ตามที่คาดไว้
      หากเข้าถึงพื้นที่แอดเดรสที่ไม่ได้แมป รวมถึงแอดเดรส 0 ก็จะเกิด SIGSEGV ตามที่คาดไว้
      assembler ตั้งสมมติฐานน้อยกว่า C compiler มากและไม่ “ฉลาดเกินไป” เท่า จึงมีแนวโน้มจะระเบิดทันทีเมื่อเกิดข้อผิดพลาด มากกว่าจะทำลายความคาดหวังไปเงียบ ๆ
  • ถ้าดูจาก footer เวลาในการประมวลผล เร็วแบบเหลือเชื่อ แต่เอกสารใช้เวลา 500~1000ms กว่าจะส่งมาถึงเดนมาร์ก
    ในกรณีนี้ CDN ดูจะดีกว่าโค้ดประสิทธิภาพสูง แต่ก็ยังเป็นผลงานที่น่าประทับใจ

    • แม้อยู่ที่หมู่เกาะ Azores กลางมหาสมุทรแอตแลนติก ก็โหลดได้ภายใน 500ms
    • ในฐานะคนที่เคยนำการปรับปรุงเวลาตอบสนองในบริษัทเทคโนโลยีขนาดใหญ่ 1 วินาทีถือว่าค่อนข้างเจ็บ
      แน่นอนว่าเวลาในการส่งข้อมูลคงเป็นสัดส่วนใหญ่ แต่ถ้านั่นถูกมองว่า “ดี” ก็ดูจะลำบากอยู่
  • สงสัยว่าโค้ด assembly เชื่อมต่อกับฐานข้อมูลอย่างไร มีอะไรอย่าง ไลบรารี assembly หรือเปล่า?
    ตามทฤษฎีก็พอเข้าใจได้ แต่ความพยายามที่ต้องใช้ในการเขียนสิ่ง “ง่าย ๆ” แบบนั้นเองน่าจะมหาศาล

    • จริง ๆ ซับซ้อนน้อยกว่าที่คิด แค่เรียกฟังก์ชันของ SQLite C library ตาม C calling convention
      โค้ดที่เกี่ยวข้องอยู่ที่นี่: https://asm32.info/fossil/asmbb/file?name=source/sqlite3.asm...
    • โดยปกติ C ก็มักถูกคอมไพล์เป็น assembly ก่อนอยู่แล้ว
      การเขียนโปรแกรมด้วย assembly โดยพื้นฐานคือการทำสิ่งที่ compiler จะทำด้วยตัวเอง และสามารถเรียกฟังก์ชันไลบรารีเดียวกับที่โค้ด C เรียกได้
      เพียงแต่ต้องทำตาม calling convention ของสถาปัตยกรรมนั้น ๆ จึงจุกจิกและน่าเบื่อ แต่ไม่ใช่เรื่องที่แทบเป็นไปไม่ได้
      x64 ใช้รีจิสเตอร์ก่อน แล้วเมื่อใช้หมดจึงส่งผ่านสแตก ทำให้การเรียกฟังก์ชันยุ่งยากขึ้น ส่วน x32 ใช้สแตกอย่างเดียวจึงสะดวกกว่ามาก แต่ convention ของ x64 สามารถเก็บค่าไว้ในรีจิสเตอร์เพื่อสร้างโค้ดที่เร็วกว่าได้
    • เห็นว่าฐานข้อมูลเป็น SQLite ดังนั้นก็ดูเหมือนแค่ลิงก์กับ ไลบรารี SQLite
  • ไม่ได้เขียนด้วย assembly ล้วน ๆ เพราะเบื้องหลังมี SQLite อยู่ด้วย เช่นเดียวกับแอปพลิเคชันจำนวนมาก คอขวดน่าจะเป็น I/O มากกว่า CPU

    • หลายครั้งคนสมมติว่าภาษาเป็นคอขวด แต่จริง ๆ แล้ว I/O หรือการออกแบบฐานข้อมูลต่างหากที่เป็นคอขวด
      แน่นอนว่าพอนึกถึงโค้ด PHP ที่ผมเคยเห็น ก็เข้าใจว่าทำไมถึงรู้สึกแบบนั้น แต่เรื่องนั้นเป็นปัญหาวิธีใช้งานมากกว่าตัวภาษาเอง
    • RAM ก็เป็นปัจจัยเหมือนกัน ผมเคยเขียนโปรแกรมบางตัวด้วย C บน Arduino และมีโค้ดบางส่วนที่เหมาะกับ assembly เพราะสแตกกับ C calling convention เป็นการสิ้นเปลืองล้วน ๆ เช่น กรณีที่ไม่มีฟังก์ชัน recursive เลย
      ปัญหาคือความสามารถในการพอร์ต ผมชอบ AVR-8 แต่ถ้าความต้องการโตขึ้น AVR-8 ก็แทบไม่มีที่ไป นอกจากประมาณ FPGA soft core
      ถ้าเป็น C ก็ย้ายไปไมโครคอนโทรลเลอร์ ARM ได้ แม้โดยส่วนตัวจะสนุกน้อยกว่า แต่ได้ประสิทธิภาพดีกว่า
      ปัญหาของ AsmBB ก็อยู่ที่การผูกติดกับสถาปัตยกรรมเฉพาะเช่นกัน
    • แม้ใน WAL mode ที่ตั้ง PRAGMA synchronous เป็น NORMAL ก็ยังเป็นแบบนั้นหรือ? ผมไม่ใช่ผู้เชี่ยวชาญ SQLite เลย แค่กำลังดูเพื่อจะใช้กับโปรเจกต์หนึ่ง
  • มีเขียนไว้ว่า “ยิ่งไปกว่านั้น ยังรองรับอักขระ Unicode Emoji ในแบบเนทีฟจริง ๆ” แต่ตรงนี้อยากให้ช่วยอธิบายละเอียดกว่านี้หน่อย
    ไม่ค่อยแน่ใจว่า “เนทีฟจริง ๆ” หมายถึงอะไร และก็ไม่ชัดเจนว่าต่างจากวิธีที่ “เนทีฟเล็กน้อย” อย่างไร

    • ในโค้ดแอสเซมบลีของ AsmBB ดูเหมือนไม่มี การประมวลผลอีโมจิ เลย จึงน่าจะเป็นการปล่อยผ่านแทบจะตรง ๆ
      แต่แชตแบบเรียลไทม์มีการไฮไลต์อีโมจิในโค้ด 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...
    • เดาเอาว่า บางเว็บอย่าง Twitter ใช้ชุดอีโมจิของตัวเอง แต่ในที่นี้อาจหมายถึงไม่ทำแบบนั้น และปล่อยให้ การเรนเดอร์อีโมจิพื้นฐานของระบบปฏิบัติการ จัดการแทน
  • ในส่วนหัวมีปุ่มสำหรับปิด การแจ้งเตือนแบบเรียลไทม์
    เพิ่มเติมคือ การแสดงรายชื่อผู้ใช้ฟอรัมให้คนที่ไม่ได้ล็อกอินดู ไม่ค่อยดูดีนัก เป็นตัวเลือกที่ตั้งค่าได้ไหม?

    • บนมือถือหาปุ่มปิดการแจ้งเตือนแบบเรียลไทม์ไม่เจอ
    • ฟอรัมแต่ก่อนก็เป็นแบบนั้นอยู่แล้ว และก็น่าจะตั้งค่าได้ด้วย
  • คอนเซ็ปต์และการใช้งานจริงดีมาก เพียงแต่ การแจ้งเตือนแบบเรียลไทม์ เพิ่มจำนวนจนท่วมได้อย่างรวดเร็ว น่าจะต้องมีการจำกัดความถี่ในรูปแบบใดรูปแบบหนึ่ง

    • ข้อความอย่าง @User123 has entered the thread น่าจะเหมาะกับฟอรัมเล็ก ๆ ที่ทุกคนรู้จักกัน
      phpBB/vBulletin แสดงรายการ “ผู้ใช้ที่กำลังอ่านเธรดนี้: ...” ก็ด้วยเหตุผลแบบนั้น และยังมีปลั๊กอินยอดนิยมที่แสดงว่า @Foo กับ @Bar กำลังเขียนตอบในเธรดนี้อยู่
      โดยเฉพาะระหว่างการถกเถียงดุเดือด มันทำให้พื้นที่รู้สึกมีชีวิตชีวามากขึ้น และการรู้ว่าอีกฝ่ายกำลังเขียนโพสต์ยาวถัดไปเพื่อโต้แย้งข้อความของเราทีละย่อหน้าที่อ้างถึง ก็ถือว่าดีไปอีกแบบ
      แต่การได้รับแจ้งเตือนทุกครั้งที่แขกที่ไม่ได้ลงทะเบียนคลิกเข้าเธรด ดูไม่มีประโยชน์กับใครเลย
    • กด ไอคอนกระดิ่ง เพื่อปิดการแจ้งเตือนแบบเรียลไทม์ได้
  • จะทำสิ่งคล้าย ๆ กันด้วย C แล้ว เลิกใช้ไลบรารีมาตรฐาน ก็ได้ ทำให้ไม่มี dependency อื่นนอกจาก system call ได้
    นอกจากในแง่เป็นการฝึกทางปัญญาแล้ว ก็ไม่ค่อยเห็นเหตุผลหนักแน่นว่าทำไมต้องใช้แอสเซมบลี

  • ในชื่อเรื่องไม่ได้บอกว่าเป็นแอสเซมบลีแบบไหน หรือแม้แต่รันบนระบบปฏิบัติการอะไร
    รวม “x86 asm” กับ “on linux” ก็ยังไม่ยาวกว่า “assembly language”