2 คะแนน โดย GN⁺ 4 시간 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ymawky เป็นเว็บเซิร์ฟเวอร์สำหรับไฟล์แบบสแตติกที่เขียนด้วย ARM64 แอสเซมบลีล้วน ใช้เพียง syscall โดยไม่มี libc และทำงานด้วยโครงสร้างที่ fork แยกต่อหนึ่งการเชื่อมต่อ
  • เป้าหมายการพัฒนาคือ MacOS และสามารถรันได้เฉพาะบน Apple silicon arm64 เท่านั้น โดยการบิลด์ต้องใช้ Xcode Command Line Tools และ make
  • การรันค่าเริ่มต้นเริ่มที่ 127.0.0.1:8080 และสามารถระบุพอร์ตได้ แต่ขณะนี้ยังไม่รองรับการกำหนดที่อยู่เองและทำงานได้เฉพาะบน 127.0.0.1
  • document root คือ www/ ตามค่าเริ่มต้น โดย GET / จะค้นหา www/index.html และหน้าข้อผิดพลาดถูกตั้งค่าให้ให้บริการจาก err/(code).html
  • HTTP methods ที่รองรับคือ GET, PUT, DELETE, OPTIONS, HEAD และไม่รองรับการรันโค้ดฝั่งเซิร์ฟเวอร์หรือการพาร์เซ URL ขั้นสูงอย่าง /search?query=term
  • PUT รองรับการอัปโหลดสูงสุด 1GiB ตามค่าเริ่มต้น โดยจะเขียนลงไฟล์ชั่วคราว www/.ymawky_tmp_<pid> ก่อนแล้วค่อย rename เพื่อไม่ให้การอัปโหลดที่ไม่สมบูรณ์ไปทับไฟล์เดิม
  • GET รองรับคำขอ Range: bytes= และจัดการรูปแบบ bytes=X-N, bytes=-N, bytes=X- ได้ โดยระบุว่ารองรับการ seek วิดีโอได้ดีด้วย
  • ตรวจจับ MIME type ตามนามสกุลไฟล์และส่ง response header Content-Type โดยรู้จักนามสกุลของไฟล์เว็บ, รูปภาพ, ฟอนต์, เอกสาร, วิดีโอ, เสียง และไฟล์บีบอัดจำนวนมาก
  • มีกลไกป้องกันเส้นทางด้วยการปฏิเสธ path ที่ยาวเกิน PATH_MAX, บล็อกการหลุดออกนอกเส้นทางด้วย .., เติมคำนำหน้า www/ ให้ทุก request path และใช้ O_NOFOLLOW_ANY เพื่อปฏิเสธ path ที่มี symlink รวมอยู่ด้วย
  • เพื่อบรรเทา DoS แบบ slowloris หากช่วงห่างระหว่างการอ่านเกิน 10 วินาที หรือใช้เวลารับ header ทั้งหมดเกิน 10 วินาที จะปิดการเชื่อมต่อและส่งกลับ 408 Request Timeout
  • คำขอ HTTP/1.1 ต้องมี header Host: แม้จะไม่ได้ใช้งานค่า Host จริง แต่บังคับให้มี header นี้ตาม RFC 9112 Section 3.2
  • สามารถปรับ document root, ไดเรกทอรีหน้าข้อผิดพลาด, ไฟล์ค่าเริ่มต้น, timeout การรับข้อมูล, ขีดจำกัดความเร็วและขนาดของ PUT, จำนวนโปรเซสพร้อมกันสูงสุด ฯลฯ ได้ใน config.S
  • หากต้องการพอร์ตไปยัง Linux หรือ Unix อื่น ๆ ต้องแก้ไขรีจิสเตอร์ที่ใช้เรียก syscall และ svc, วิธีคืนค่าข้อผิดพลาด, fork(), SO_NOSIGPIPE, O_NOFOLLOW_ANY, renameatx_np(), เลย์เอาต์ของสตรักต์, ไวยากรณ์การรีโลเคตของ Mach-O, signal handling เป็นต้น

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

 
GN⁺ 4 시간 전
ความเห็นจาก Hacker News
  • ถ้าได้ลองเขียนโปรแกรมขนาดใหญ่ด้วย แอสเซมบลี จริง ๆ โดยเฉพาะ macro assembler จะพบอย่างรวดเร็วว่ามันแค่ยืดยาวกว่า แต่โดยพื้นฐานแล้วไม่ได้ต่างจากการเขียนโปรแกรมระดับสูงนัก
    สุดท้ายก็แค่ต้องคุ้นเคยกับการสร้าง abstraction ด้วย procedure และ macro และบ่อยครั้งการอ่านแอสเซมบลีให้มีประสิทธิภาพกลับยากกว่าการเขียนเสียอีก

    • ระหว่างทำงานนี้ผมก็ได้ข้อสรุปเดียวกัน ต้องเขียนให้ชัดเจนกว่ามากก็จริง แต่ตัววิธีที่แต่ละฟังก์ชันทำงานนั้นไม่ได้ต่างกันในระดับพื้นฐาน
      strlen ไม่ว่าจะใน C, Rust, Assembly หรือภาษาอื่น ๆ สุดท้ายก็แค่วนดูสตริงเพื่อหา NULL byte เท่านั้นเอง เพราะมันเป็นการคลี่ออกมาตรง ๆ ว่า CPU ต้องทำอะไรและทำตามลำดับไหน จึงมีบางครั้งที่รู้สึกว่ามันเข้าใจง่ายกว่าภาษาอื่นด้วยซ้ำ
  • เป็นโปรเจ็กต์ที่สวยมากและทำออกมาได้ดีมาก ถ้าจะต่อจากความเห็นอื่น ๆ สำหรับผมโปรเจ็กต์แบบนี้ใกล้เคียงกับ แผนที่ Minecraft
    มีทั้งแผนที่ขนาดมหึมาที่น่าทึ่ง มีทั้งแผนที่ survival เล็ก ๆ มีทั้งแผนที่ที่เปิดเล่นกันในเครื่องกับเพื่อน ๆ และมีทั้งเซิร์ฟเวอร์ที่หวังขยายเชิงพาณิชย์ในระดับใหญ่ AI ทำให้การสร้างบ้านบนเซิร์ฟเวอร์หรือออกแบบถนนใหม่เป็นเรื่องง่ายมากแล้ว แต่คุณค่าที่เกิดขึ้นในโลกนั้นขึ้นอยู่กับจุดประสงค์ดั้งเดิมของเซิร์ฟเวอร์ และการสร้างบ้านกับถนนเพิ่มนั้นมีความหมายจริงหรือไม่
    เซิร์ฟเวอร์เชิงพาณิชย์จะเติบโตได้เร็วขึ้นและมีบ้านกับถนนมากขึ้นก็ยอดเยี่ยมอยู่แล้ว แต่ ความรักที่งานศิลปะสร้างขึ้น เทียบกันไม่ได้เลย

  • ยังให้ความรู้สึกอบอุ่นที่ได้รู้ว่ายังมีคนอยากทำอะไรแบบนี้ ด้วยมือตัวเอง อยู่ ผมไม่ได้เป็นคนเดียว

    • ผมหมกมุ่นกับไอเดียนี้อยู่พักหนึ่งก่อนจะเริ่มลงมือจริง และจากนั้นก็ทุ่มอยู่กับมันเต็มที่หลายสัปดาห์
      ถ้ามีโปรเจ็กต์คล้าย ๆ กันก็อยากเห็นนะ และดีใจที่ไม่ได้มีแค่ผมคนเดียว ผมคิดว่าถ้าโปรแกรมเมอร์ส่วนใหญ่ลองเรียนแอสเซมบลีสักไม่กี่สัปดาห์หรือไม่กี่เดือน ความรู้สึกลึกลับเกี่ยวกับการทำงานของ CPU และภาษาที่ถูกคอมไพล์ จะหายไปมากทีเดียว
  • โปรเจ็กต์น่าสนุกดี ผมมี เวอร์ชันที่มินิมอลกว่ามาก สำหรับ x86 Linux อยู่ตัวหนึ่ง ถ้าอยากดูว่าเป็นยังไง ดูได้ที่นี่: https://github.com/jcalvinowens/asmhttpd

    • ว้าว โปรเจ็กต์นั้นเป็นแรงบันดาลใจสำคัญให้ผมจริง ๆ เคยอ่านเมื่อก่อนแล้วประทับใจมาก
      อยากถามว่าผมขอเพิ่มลิงก์ไปยังรีโปของคุณใน README ของผมได้ไหม
  • ปกหนังสือ O'Reilly ปลอม อันนั้นยอดเยี่ยมจริง ๆ

    • หนังสือเล่มนั้นนี่แหละคือเหตุผลตรง ๆ ที่ทำให้เริ่มทำสิ่งนี้ตั้งแต่แรก คำโปรยรองของหนังสือให้ตัวย่อของชื่อโปรเจ็กต์มาพอดี
  • แม้จะเป็นการเปรียบเทียบที่อาจไม่ค่อยมีความหมาย แต่ก็สงสัยว่าเมื่อเทียบกับเว็บเซิร์ฟเวอร์ที่ฟีเจอร์ครบแล้ว ประสิทธิภาพ อยู่ประมาณไหน อยากเห็นตัวชี้วัดอย่างจำนวนคำขอต่อวินาทีสูงสุด

    • พูดตามตรงคือยังไม่ได้ benchmark เลย แต่ผมเดาว่า ymawky น่าจะช้ากว่าเว็บเซิร์ฟเวอร์ที่ฟีเจอร์ครบส่วนใหญ่อยู่พอสมควร
      ymawky ใช้โครงสร้างที่ fork ต่อหนึ่งการเชื่อมต่อ ดังนั้นจึงช้ากว่าโดยพื้นฐานเมื่อเทียบกับเซิร์ฟเวอร์สำหรับ production อย่าง nginx หรือ Apache nginx ใช้ I/O แบบ event-driven ด้วย kqueue/epoll จึงรับการเชื่อมต่อพร้อมกันได้หลายพันรายการโดยไม่มี overhead จากการ fork process ต่อหนึ่งคำขอ ส่วน Apache ใช้ thread pool เพื่อรองรับหลายการเชื่อมต่อโดยไม่ต้องสร้างใหม่ทุกครั้ง
      ถ้าเอาไปเทียบตรง ๆ กับเว็บเซิร์ฟเวอร์อื่น สิ่งที่วัดได้ส่วนใหญ่ก็คงเป็นความต่างระหว่าง fork ต่อการเชื่อมต่อ กับ event loop/thread pool มากกว่าจะเกี่ยวกับแอสเซมบลีเอง
      ถ้าเทียบกับเซิร์ฟเวอร์ที่ fork ต่อการเชื่อมต่อเหมือนกันแต่เขียนด้วย C ผมคิดว่า throughput คงแทบไม่ต่างกัน เพราะคอขวดของโมเดลนี้ไม่ใช่โค้ดจริง ๆ แต่เป็น fork() เอง น่าจะส่งผลกับขนาดไบนารีและเวลาเริ่มต้นมากกว่าจำนวนคำขอต่อวินาที ถึงอย่างนั้นลอง benchmark จริงก็คงน่าสนุกดี
  • ทำได้ดีมาก ผมเองก็กำลังทำโปรเจ็กต์คล้าย ๆ กันแต่เล็กกว่านี้ด้วย RISC-V อันนี้ยอดเยี่ยมเลย

    • เจ๋งมาก ถ้ามีที่เผยแพร่ไว้ที่ไหนอยากดูมาก
  • ผมอยากสวนทางกับทิศที่โลกของ vibe coding กำลังไป และอยากได้ความรู้สึกว่าตัวเองถูกท้าทายอีกครั้ง เลยกำลังจะลองเขียน WebAssembly software renderer
    ไม่รู้ว่าจะทำจนจบได้ไหม มันอาจจะบ้าดีเดือดและอาจเรียกว่ามีประโยชน์ไม่ได้เลย แต่รู้สึกดีมากจริง ๆ
    ขอแสดงความยินดีกับความสำเร็จของผู้เขียนต้นฉบับ

    • ผมก็เคยทำแบบเดียวกันเป๊ะและสนุกมาก มันไม่ใช่การทำเพื่อปล่อยของใหม่ออกสู่โลก แต่เป็นความท้าทายสนุก ๆ ให้ตัวเองล้วน ๆ
      หลังจากทำเสร็จแล้วผมก็กำลังทำเกมด้วยมันอยู่ แต่ตอนนี้แรงสนุกจากความท้าทายหายไปแล้ว ฝั่งนั้นเลยคืบหน้าน้อย ไม่เป็นไรอยู่ดี เพราะมันสนุกไปแล้ว ถ้าทำด้วย vibe coding ก็คงไม่ได้ความสนุกหรือความพึงพอใจแบบนั้น
    • หมายถึง 3D software renderer ใช่ไหม? ตอนเป็นวัยรุ่นกับช่วงต้นอาชีพผมเรียนรู้จากการทำของแบบนั้นเยอะมากด้วย x86 และ C
      ผมอยากรู้ว่า LLM จะเขียนเรนเดอเรอร์สำหรับ CGA ด้วย 8088 แอสเซมบลี ล้วนได้ดีแค่ไหน เลยลองให้มันทำดู แล้วมันก็สร้างเดโมที่ใช้ได้ค่อนข้างดีตั้งแต่ครั้งแรกเลย ในพรอมต์ผมใส่เวกเตอร์ของยานจาก Elite ไปด้วย
      https://imgur.com/a/Dy5rUku
  • หนึ่งในโปรเจ็กต์แอสเซมบลีชิ้นแรก ๆ ของผมคือ CGI script ที่เขียนด้วย x86 แอสเซมบลี 100%
    แน่นอนว่าเว็บเซิร์ฟเวอร์เต็มรูปแบบนั้นน่าประทับใจกว่าอยู่แล้ว แต่ถ้าเป็นมือใหม่ ผมอยากแนะนำให้ไปดู CGI ของ Apache กับ mod_cgi ก่อน

    • ว้าว พูดตรง ๆ ว่าสำหรับผมการเขียน CGI script ด้วยแอสเซมบลีน่ากลัวกว่าการเขียนเซิร์ฟเวอร์ด้วยแอสเซมบลีอีก
      ผมคิดเรื่องรองรับ CGI มาตั้งแต่หลายสัปดาห์ก่อนแล้ว แต่ยังไม่ได้ลงลึกจริงจัง ถ้ามีที่โฮสต์ไว้ที่ไหนก็อยากดู และน่าจะเป็นข้อมูลอ้างอิงที่ดีตอนผมมาทำต่อทีหลัง
  • เรากำลังย้ายไปหา AI จนเลิกเขียนโค้ดเองและเลิกปวดหัวกันไปแล้ว แต่ที่นี่กลับมีคนเขียน เว็บเซิร์ฟเวอร์ด้วยแอสเซมบลี อยู่
    ทำให้รู้สึกถ่อมตัวเลย

    • ก็ทำให้ถ่อมตัวลงจริง และผมก็ชัดเจนว่าชอบทางไหนมากกว่า
    • “เรา” ที่ว่านี่ใคร? ผมยังมี ศักดิ์ศรี พอที่จะไม่ส่งโค้ดที่เครื่องปั่นขึ้นมาแบบหยาบ ๆ แทนการทำงานของตัวเองอย่างจริงจัง