2 पॉइंट द्वारा GN⁺ 4 시간 전 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • ymawky केवल ARM64 असेंबली में लिखा गया एक static file web server है, जो libc के बिना सिर्फ syscall का उपयोग करता है और हर connection पर fork करने वाली संरचना में काम करता है
  • इसका development target MacOS है और यह केवल Apple silicon arm64 पर चल सकता है, जबकि build के लिए Xcode Command Line Tools और make की आवश्यकता होती है
  • डिफ़ॉल्ट रूप से यह 127.0.0.1:8080 पर शुरू होता है; port निर्दिष्ट किया जा सकता है, लेकिन अभी custom address समर्थित नहीं है और यह केवल 127.0.0.1 पर काम करता है
  • document root डिफ़ॉल्ट रूप से www/ है, और GET / पर www/index.html खोजा जाता है; error page को err/(code).html से देने के लिए कॉन्फ़िगर किया गया है
  • समर्थित HTTP methods हैं GET, PUT, DELETE, OPTIONS, HEAD; server-side code execution या /search?query=term जैसी advanced URL parsing समर्थित नहीं है
  • PUT डिफ़ॉल्ट रूप से अधिकतम 1GiB upload का समर्थन करता है, और partial upload से मौजूदा फ़ाइल overwrite न हो इसके लिए पहले temporary file www/.ymawky_tmp_<pid> में लिखकर फिर rename किया जाता है
  • GET Range: bytes= request को support करता है और bytes=X-N, bytes=-N, bytes=X- फ़ॉर्मेट संभालता है; बताया गया है कि यह video seeking को भी अच्छी तरह support करता है
  • file extension के आधार पर MIME type का पता लगाकर Content-Type response header भेजा जाता है, और web files, images, fonts, documents, videos, audio, तथा compressed file extensions की बड़ी संख्या को पहचाना जाता है
  • path safety के लिए PATH_MAX से लंबे path अस्वीकार किए जाते हैं, .. आधारित path escape रोका जाता है, सभी request path पर www/ prefix लगाया जाता है, और O_NOFOLLOW_ANY से symlink शामिल path को अस्वीकार किया जाता है
  • slowloris जैसी DoS शमन के लिए यदि reads के बीच 10 सेकंड से ज़्यादा हो जाए या पूरा header प्राप्त करने में 10 सेकंड से अधिक लगें, तो connection बंद कर 408 Request Timeout लौटाया जाता है
  • HTTP/1.1 request में Host: header आवश्यक है; Host मान का वास्तव में उपयोग नहीं किया जाता, लेकिन RFC 9112 Section 3.2 के अनुसार header की उपस्थिति आवश्यक रखी गई है
  • config.S में document root, error page directory, default file, receive timeout, PUT speed और size limits, अधिकतम concurrent process count आदि समायोजित किए जा सकते हैं
  • इसे Linux या अन्य Unix पर port करने के लिए syscall call registers और svc, error return method, fork(), SO_NOSIGPIPE, O_NOFOLLOW_ANY, renameatx_np(), struct layout, Mach-O relocation syntax, signal handling आदि में बदलाव करने होंगे

1 टिप्पणियां

 
GN⁺ 4 시간 전
Hacker News की राय
  • अगर आप वास्तव में assembly, खासकर macro assembler में बड़े प्रोग्राम लिखें, तो जल्दी समझ आ जाता है कि यह बस ज़्यादा verbose है, ऊँचे स्तर की programming से बुनियादी रूप से अलग नहीं
    आखिरकार procedures और macros के ज़रिए abstraction बनाना सीख लेना काफी होता है, और assembly को प्रभावी ढंग से पढ़ना अक्सर उसे लिखने से कहीं ज़्यादा कठिन होता है

    • इस काम को करते हुए मैंने भी यही महसूस किया। चीज़ों को कहीं ज़्यादा explicitly लिखना पड़ता है, लेकिन individual functions के काम करने का तरीका खुद में बुनियादी रूप से अलग नहीं होता
      strlen चाहे C में हो, Rust में, Assembly में या किसी और भाषा में, आखिरकार string को traverse करके NULL byte ढूंढता है। क्योंकि इसमें ठीक-ठीक लिखा होता है कि CPU को क्या और किस क्रम में करना है, इसलिए कभी-कभी यह दूसरी भाषाओं से भी ज़्यादा intuitive लगता है
  • यह सचमुच एक खूबसूरत और अच्छी तरह बनाया गया project है। बाकी comments की बात आगे बढ़ाऊँ तो, मेरे लिए ऐसे projects Minecraft map जैसे हैं
    कुछ maps विशाल और चौंका देने वाले होते हैं, कुछ छोटे survival maps, कुछ सिर्फ दोस्तों और अपने लिए local में खोले गए maps, और कुछ commercial scale का लक्ष्य रखने वाले servers होते हैं। AI की वजह से server पर घर बनाना या नई सड़कें design करना बहुत आसान हो गया है, लेकिन उस दुनिया में बनने वाली value इस बात पर निर्भर करती है कि server का मूल उद्देश्य क्या है और घरों व सड़कों को और बढ़ाना वास्तव में मायने रखता है या नहीं
    commercial servers का तेज़ी से बढ़ना और ज़्यादा घर व सड़कें होना शानदार है, लेकिन art project से पैदा होने वाला लगाव उसकी तुलना में नहीं आता

  • यह जानकर अच्छा और गर्मजोशी भरा लगा कि आज भी कोई ऐसी चीज़ हाथ से खुद करने की कोशिश करता है। मैं अकेला नहीं था

    • मैं कुछ समय से इस विचार के पीछे पड़ा हुआ था, फिर आखिरकार शुरू किया और कई हफ्तों तक पूरी तरह डूबा रहा
      अगर ऐसे मिलते-जुलते projects हों तो मैं उन्हें देखना चाहूँगा, और यह जानकर अच्छा लगा कि मैं अकेला नहीं हूँ। मुझे लगता है कि ज़्यादातर programmers अगर कुछ हफ्ते या कुछ महीने assembly सीखें, तो CPU और compiled languages के काम करने के तरीके को लेकर बहुत-सा रहस्य दूर हो जाएगा
  • मज़ेदार project है। मैंने x86 Linux के लिए इसका कहीं ज़्यादा minimal version बना रखा है, अगर देखना चाहें कि वह कैसा दिखता है, तो यह रहा: https://github.com/jcalvinowens/asmhttpd

    • वाह, उस project ने वास्तव में मुझे बहुत प्रेरणा दी थी। मैंने इसे पहले पढ़ा था और यह सचमुच प्रभावशाली लगा
      मैं सोच रहा था कि क्या अपने README में आपके repository का link जोड़ना ठीक रहेगा
  • वह नकली O'Reilly book cover सच में कमाल का है

    • वही किताब असल में इसे बनाने की सीधी वजह थी। किताब के subtitle ने project के नाम का acronym दे दिया
  • तुलना शायद बहुत मायने न रखे, लेकिन यह जानने की जिज्ञासा है कि पूरी सुविधाओं वाले web servers के मुकाबले इसकी performance कैसी है। मैं requests per second जैसे metrics देखना चाहूँगा

    • ईमानदारी से कहूँ तो मैंने अभी तक benchmark नहीं किया, लेकिन ymawky शायद ज़्यादातर full-featured web servers से काफ़ी धीमा होगा
      ymawky हर connection पर fork करता है, इसलिए यह बुनियादी रूप से उन production servers से धीमा है जैसे nginx या Apache। nginx event-driven I/O जैसे kqueue/epoll का इस्तेमाल करता है, जिससे वह हर request पर process fork करने के overhead के बिना हज़ारों concurrent connections संभाल सकता है। Apache thread pool का इस्तेमाल करता है, ताकि हर request के लिए नया thread बनाने के बजाय कई connections संभाले जा सकें
      दूसरे web servers से सीधी तुलना करने पर असल में ज़्यादातर per-connection fork बनाम event loop/thread pool का फ़र्क ही मापा जाएगा, assembly का नहीं
      अगर इसकी तुलना किसी ऐसे server से करें जो C में लिखा गया हो और वही per-connection fork model अपनाता हो, तो throughput लगभग समान होगा। इस model की bottleneck असली code नहीं, बल्कि fork() itself है। requests per second से ज़्यादा असर शायद binary size और startup time पर दिखे। फिर भी सच में benchmark करना मज़ेदार होगा
  • बढ़िया बनाया है। मैं भी RISC-V पर इससे मिलता-जुलता लेकिन छोटा project कर रहा हूँ, और यह शानदार है

    • बहुत बढ़िया। अगर आपने इसे कहीं public किया है तो मैं ज़रूर देखना चाहूँगा
  • इस vibe coding वाली दुनिया जिस दिशा में जा रही है, उसके उलट थोड़ा जाना चाहता हूँ और फिर से चुनौती महसूस करना चाहता हूँ, इसलिए मैं WebAssembly software renderer लिखने की कोशिश कर रहा हूँ
    पता नहीं इसे पूरा कर पाऊँगा या नहीं, यह पागलपन है, और इसे उपयोगी भी नहीं कह सकते। फिर भी यह बहुत अच्छा महसूस होता है
    मूल लेखक की उपलब्धि पर बधाई

    • मैंने भी बिल्कुल यही किया था और यह सच में बहुत मज़ेदार था। यह दुनिया में कुछ नया डालने के लिए नहीं था, बस अपने लिए एक मज़ेदार चुनौती थी
      इसे पूरा करने के बाद मैं उसी से एक game बना रहा हूँ, लेकिन अब चुनौती वाली खुशी खत्म हो चुकी है, इसलिए उस तरफ़ ज़्यादा प्रगति नहीं हो रही। फिर भी कोई बात नहीं, क्योंकि मज़ा आया। अगर मैंने इसे vibe coding से किया होता, तो यह मज़ा या संतोष नहीं मिलता
    • क्या आप 3D software renderer की बात कर रहे हैं? मैंने किशोरावस्था और करियर के शुरुआती दौर में x86 और C में ऐसी बहुत-सी चीज़ें बनाकर सीखा था
      मैं देखना चाहता था कि LLM शुद्ध 8088 assembler में CGA के लिए renderer कितना अच्छा लिख सकता है, इसलिए मैंने उसे यह काम दिया, और उसने एक ही बार में काफ़ी अच्छा demo बना दिया। Prompt में मैंने Elite spaceship के vectors दिए थे
      https://imgur.com/a/Dy5rUku
  • मेरे शुरुआती assembly projects में से एक 100% x86 assembly में लिखा गया CGI script था
    पूरा web server निश्चित रूप से ज़्यादा प्रभावशाली है। फिर भी अगर कोई beginner हो, तो मैं पहले Apache के CGI और mod_cgi को देखने की सलाह दूँगा

    • वाह, सच कहूँ तो server को assembly में लिखने से ज़्यादा डरावना मुझे CGI script को assembly में लिखना लगता है
      CGI support के बारे में मैं कुछ हफ्तों से सोच रहा था, लेकिन अभी तक ठीक से गहराई में नहीं गया। अगर यह कहीं hosted है तो मैं देखना चाहूँगा, बाद में काम करते समय यह अच्छा reference बन सकता है
  • हम AI की तरफ़ बढ़ते हुए code लिखना और सिर खपाना बंद कर रहे हैं, और यहाँ कोई assembly में web server लिख रहा है
    विनम्र बना देता है

    • विनम्र तो बनाता है। मुझे साफ़ है कि मैं किस रास्ते को ज़्यादा पसंद करता हूँ
    • यहाँ “हम” कौन हैं? मेरे अंदर इतनी भी self-respect की कमी नहीं कि खुद ठीक से काम करने के बजाय घटिया machine-generated code submit कर दूँ