2 คะแนน โดย GN⁺ 2024-02-12 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Aho คือ Git ที่พัฒนาด้วย AWK เป็นโปรเจกต์ของเล่นเพื่อสำรวจโครงสร้างภายในของ Git และฟีเจอร์ใหม่ ๆ ของ GNU AWK
  • จุดประสงค์ไม่ใช่การใช้งานจริง แต่เพื่อ ความบันเทิงและการเรียนรู้ และไม่ใช่โปรเจกต์ที่ตั้งใจให้ใช้แทน Git
  • การรันต้องใช้ gawk 5.0 ขึ้นไป และปัจจุบันใช้ pigz สำหรับการบีบอัด zlib ส่วนที่เหลือสมมติว่าอยู่ในสภาพแวดล้อมที่มี GNU coreutils
  • สามารถรันได้บน Linux ส่วนใหญ่ แต่ไม่ค่อยเหมาะกับสภาพแวดล้อม BSD/Mac
  • ฟีเจอร์ที่พัฒนาแล้วมี init, add/rm, status, commit, config แบบอ่านอย่างเดียว, cat-file และไม่มีแผนเพิ่มฟีเจอร์เครือข่ายอย่าง clone และ push

วัตถุประสงค์และขอบเขตของ Aho

  • Aho เป็นโปรเจกต์ที่มุ่งทำ “Git ที่พัฒนาด้วย AWK”
  • เป็นโปรเจกต์ของเล่นเพื่อแสดงให้เห็นว่า Modern AWK ทำอะไรได้มากกว่าสคริปต์บรรทัดเดียว
  • โฟกัสอยู่ที่การสำรวจโครงสร้างภายในของ Git และฟีเจอร์ใหม่ ๆ ของ GNU AWK
  • เป็นโปรเจกต์เพื่อ ความบันเทิงและการเรียนรู้ มากกว่าการใช้งานจริง

สภาพแวดล้อมสำหรับรัน

  • สภาพแวดล้อมที่ต้องใช้มีดังนี้
    • gawk 5.0 ขึ้นไป
    • pigz สำหรับการบีบอัด zlib
    • GNU coreutils
  • สามารถรันได้บน Linux ส่วนใหญ่ แต่ไม่เหมาะกับสภาพแวดล้อม BSD หรือ Mac

ลำดับการใช้งานพื้นฐาน

  • หลังเตรียมสภาพแวดล้อมด้วย source ./modpath แล้วรัน aho init จะเริ่มต้น Git repository ว่างในไดเรกทอรี .aho
  • aho add -v . จะเพิ่มไฟล์พร้อมแสดงรายการอย่าง .gitignore, LICENSE, README.md, aho, aho.awk, include/*.awk
  • หลังสร้างไฟล์ใหม่แล้วรัน aho add -v . อีกครั้ง ไฟล์นั้นก็จะถูกเพิ่มด้วย
  • ภายใต้ .aho/ จะสร้างโครงสร้างที่คล้ายกับ Git
    • branches
    • config
    • description
    • HEAD
    • index
    • objects
    • refs/heads
    • refs/tags
  • มีตัวอย่างการใช้ GIT_DIR=.aho git ls-files --stage เพื่อให้เครื่องมือ Git อ่านรายการใน index ของ repository .aho

ฟีเจอร์ที่พัฒนาแล้วและงานที่เหลือ

  • ฟีเจอร์ที่ทำเสร็จแล้ว
    • init
    • add/rm
    • status
    • commit
    • config แบบอ่านอย่างเดียว
    • cat-file
  • ฟีเจอร์ที่ยังไม่เสร็จ
    • reset
    • branch
    • switch
    • ls-files

ไม่รวมฟีเจอร์เครือข่าย

  • ไม่มีแผนเพิ่มฟีเจอร์เครือข่าย
  • แม้จะสามารถพัฒนาฟีเจอร์เครือข่ายด้วย GNU AWK ได้ แต่ไม่มีแผนใส่ clone หรือ push ใน Aho
  • ยินดีรับการมีส่วนร่วมที่ช่วยปรับปรุงความรู้เกี่ยวกับ AWK หรือ Git

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

 
GN⁺ 2024-02-12
ความคิดเห็นจาก Hacker News
  • Awk เจ๋งมาก เป็น ภาษาโปรแกรมมิงเต็มรูปแบบ ที่แทบจะมีอยู่ทุกที่บนระบบตระกูลยูนิกซ์ แต่ในทางปฏิบัติดูเหมือนจะถูกใช้เป็นคำสั่งบรรทัดเดียวสำหรับดึงชิ้นส่วนข้อความจากเอาต์พุตมาตรฐานที่ถูก pipe เข้ามาเป็นหลัก
    แต่ Awk ก็ใช้เป็นภาษาสคริปต์อเนกประสงค์ได้เช่นกัน และสำหรับการใช้งานแบบนี้ ในหลายแง่มุมมันดีกว่า Bash ด้วยซ้ำ สงสัยว่าทำไมในโลกจริงถึงไม่ค่อยเห็นสคริปต์ Awk บ่อยกว่านี้ อาจเป็นเพราะ Perl เคยพยายามรวมข้อดีของ shell, Awk และ sed ไว้ในภาษาเดียว แล้วต่อมาผู้คนมอง Perl ในแง่ลบและย้ายออกไปก็ได้
    [1] ตัวอย่างที่สุ่มตัดมาจากซอร์สโค้ด NetBSD: https://github.com/NetBSD/src/blob/trunk/sys/dev/eisa/devlis...

    • เห็นด้วย Perl เข้ามาแทน Awk แต่ในหลายกรณีกลับเป็น ผลเสีย เพราะไม่มีวิธีเขียนโค้ด Perl แบบเรียบง่ายและเป็นที่เข้าใจกันแพร่หลาย ที่โปรแกรมเมอร์คนอื่นอ่านง่ายและขยายไปเป็นโปรแกรมขนาดกลางถึงใหญ่ได้
      ไม่ได้หมายความว่าไม่มีใครทำได้ดีเลย แต่โดยรวมทั้งอุตสาหกรรมอัตราความสำเร็จต่ำ ทำให้ Perl มีชื่อเสียงค่อนข้างแย่
      อยากเห็น Awk กลับมาอีกครั้ง Awk ขยายให้ใหญ่ได้ไม่ง่ายนัก จึงมีความเสี่ยงน้อยที่โปรเจกต์ซึ่งเริ่มจาก Awk เล็ก ๆ จะถูกส่งต่อให้คนถัดไปเป็น codebase Awk หลายพันบรรทัด แทนที่จะเป็นแบบนั้น มักจะถูกเขียนใหม่ด้วยภาษาที่ขยายต่อได้และดูแลรักษาง่ายกว่าในช่วงค่อนข้างต้น
    • ไม่สนว่าคนอื่นจะคิดยังไง และพบว่าตัวเองชอบ Perl สิ่งที่เพิ่งทำล่าสุดคือ ตัวแก้ไขพาร์ทิชันที่โปรแกรมได้ คล้ายกับการล้างพาร์ทิชันด้วย sfdisk แต่ผมอยากทำมากกว่าการลบแบบง่าย ๆ และอยากรวมตารางพาร์ทิชัน MBR กับ GPT เพื่อทำเป็นไฮบริด
      สนุกดี และจะกลับไปใช้ Perl อีก เห็นแล้วว่า Awk ก็เจ๋งขนาดนี้ สักวันอาจได้ใช้เหมือนกัน
      [1] https://github.com/csdvrx/hdisk/
    • Awk มีประโยชน์มาก สัปดาห์นี้เขียนสคริปต์เพื่อพาร์ส ล็อก Postgres จำนวนหลาย GB เพื่อตอบคำถามว่า “ใครเป็นผู้ใช้ที่ยิงคิวรีมากที่สุดในช่วงไม่กี่นาทีหลังต้นชั่วโมงของทุกชั่วโมง?”
      ใช้แค่ฟังก์ชันไม่กี่ตัว โค้ดรวมราว ๆ 20 บรรทัดนิด ๆ และ pipe ผ่าน sort กับ uniq ไม่กี่ชุด ก็พอแล้ว และเร็วพอสมควร โดยเฉพาะถ้าเติม LC_ALL=C ไว้ข้างหน้า จะเร็วขึ้นอีก
      [0]: ถ้าถามว่าทำไมไม่มี observability ที่ดีพอจนไม่ต้องทำงานแบบนี้ ก็ไม่ได้ผิดหรอก แต่บางครั้งก็ต้องอยู่กับความเป็นจริงที่มี
      [1]: รู้ว่า gawk ทำ unique sort ระหว่างสร้างรายการได้ ตอนนั้นอยู่ท้าย ๆ ของการรับมือ incident และเหนื่อยแล้ว | sort | uniq -c | sort -rn จำง่ายกว่ามาก
      [1].a: รู้เหมือนกันว่า sort มีอาร์กิวเมนต์ -u แต่มันไม่ให้ count และการทำ unique ก็ช้ากว่า implementation ของ uniq อยู่พอสมควร
    • การตัดสินว่า Perl แย่เป็นแรงขับสำคัญของยุคฟื้นฟู Awk นักพัฒนาที่ไม่ได้เรียน Perl มาตั้งแต่แรกต้องการอะไรสักอย่างมาเติมช่องว่างระหว่าง shell กับ Python และก็มีนักพัฒนาแบบผมที่จำใจทิ้ง Perl ไปด้วย
      เพราะคนรสนิยมแบบ HN มองว่า Perl “ไม่คูล” ตอนนี้ Perl และโค้ดทั้งหมดที่เขียนด้วย Perl จึงเหมือนถูกติด วันหมดอายุ ไว้แล้ว แต่ Awk เป็นมาตรฐาน POSIX คนพวกนั้นจึงกำจัดมันไม่ได้
    • ชอบ AWK มาก ความเป็นระบบชนิดข้อมูลที่เน้นสตริงทำให้โปรแกรมเมอร์ Javascript ยังต้องหน้าแดง 0, "" และการไม่มีอะไรอยู่จริง ๆ ล้วนเป็นค่าเท็จเหมือนกัน
      ตัวเลขก็ไม่ต่างจากสตริงที่แทนตัวเลข คล้าย Lua แต่แปลกที่มันไม่รบกวนใจ ถ้าจำเป็นต้องรักษาให้ตัวเลขเป็นตัวเลข และสตริงเป็นสตริงจริง ๆ ก็ใส่เครื่องหมายอย่าง # หรือ $ นำหน้าค่าไว้ แล้วค่อยใช้ substr() ตัดออกทีหลังได้
  • The AWK Programming Language, Second Edition ออกมาเมื่อเดือนกันยายน 2023
    https://awk.dev
    ฉบับพิมพ์ครั้งแรกตีพิมพ์ในปี 1988 และดูได้ที่นี่: https://archive.org/details/pdfy-MgN0H1joIoDVoIC7
    อภิปราย: https://news.ycombinator.com/item?id=13451454

    • ช่วงห่าง 35 ปี นี้เป็นเรื่องเล่าดี ๆ ไว้บอกบรรณาธิการเวลาถามว่า “แล้วฉบับพิมพ์ครั้งที่ 2 ไปถึงไหนแล้ว?”
    • Brian Kernighan ก็ร่วมด้วย เขาคือ “K” ใน K&R C และเป็นบุคคลในตำนานของยูนิกซ์อีกหลายเรื่อง
  • ถ้าดูโค้ดอย่าง function read_objfile(obj, objpath, bytes, end_of_header, header, end_of_type, type, size, bytes_after_header) พารามิเตอร์หลังช่องว่างยาว ๆ ในนี้คือ ตัวแปรโลคัล จะส่งค่าเข้าไปก็ได้ แต่ไม่ได้ถูกออกแบบมาให้ใช้แบบนั้น
    ผมเคยเขียนแพตช์เพิ่มคำสั่ง let ให้ GNU Awk เพื่อ bind ตัวแปรแบบ lexical จริง ๆ ทำให้เขียนได้ประมาณ function read_objfile(obj, objpath) { @let (bytes, end_of_header, header, end_of_type, type, size, bytes_after_header) { } }
    น่าเสียดายที่โปรเจกต์ปฏิเสธ และแนะนำให้ทำ fork ของ GNU Awk พร้อมเปลี่ยนชื่อ ผมก็เลยทำตามนั้น
    https://www.kylheku.com/cgit/egawk/about/

    • ผมว่าการตัดสินใจของฝั่งนั้นก็มีเหตุผล gawk ต่างจาก awk มากอยู่แล้ว ถ้าจะเพิ่มไวยากรณ์ที่ทำให้แตกต่างยิ่งขึ้น ก็ fork แล้วตั้งชื่ออื่นไปเลยน่าจะดีกว่า
  • หากถามว่าทำไมถึงบอกว่าบรรทัดคำสั่งของลินุกซ์คือสภาพแวดล้อมพัฒนาที่ดีที่สุด หนึ่งในเครื่องมือที่มักถูกยกขึ้นมาคือ Awk แค่รู้ Awk พื้นฐานก็ทำอะไรได้มากด้วยของเพียงเล็กน้อย และ IDE ก็เริ่มรู้สึกอืดอาดขึ้นมาแทน
    ถ้าอยากเรียน Awk และเหมาะกับการเรียนแบบบรรยาย ผมเคยอัดวิดีโอนำเสนอที่ทำไว้สำหรับ Linux Fest Northwest เมื่อหลายปีก่อนไว้บน YouTube: https://youtu.be/E5aQxIdjT0M

    • ขณะเดียวกัน การรองรับ Unicode ก็เพิ่งถูกเพิ่มเข้ามาช้ามาก น่าจะราว ๆ 2 ปีก่อนเท่านั้นเอง และเวลาไพป์เนื้อหาเข้า Awk เหมือนเครื่องมือเชลล์อื่น ๆ ก็มี edge case อยู่
      ลำดับคีย์คล้าย CTRL+D อาจตัดอินพุตทิ้งได้ และคงมี edge case อื่น ๆ อีกเป็นสิบที่ผมไม่รู้ ซึ่งจะมากัดเอาในจังหวะที่แย่ที่สุด
      Awk เป็นเครื่องมือที่น่าประทับใจ แต่ถ้ายกขึ้นหิ้งก็จะกลบจุดอ่อนของมันไว้ งานที่จริงจังอาจดีกว่าถ้าย้ายไปใช้เครื่องมือที่เฉพาะทางกว่าและทันสมัยกว่า ซึ่งเหมาะกับงานนั้น ๆ
    • Awk ไปแทน IDE ได้อย่างไร? ผมชอบ Awk และรู้ว่าถ้าใช้เวลาเรียนมันก็ทรงพลัง แต่ถ้าไม่มี IDE ผลิตภาพของผมคงลดลงมาก
      สิ่งที่ IDE ทำส่วนใหญ่ไม่ใช่งานแก้ไขข้อความ แต่คือ ช่วยให้เข้าใจและแก้ไขโค้ด ไม่ได้จะบอกว่าผิดนะ แค่อยากรู้มุมมองของคำพูดนั้น
  • ตอนแรกคิดว่าชื่อนี้มาจาก aho (アホ) ซึ่งเป็นสแลงภาษาญี่ปุ่นแปลว่า “คนโง่” แต่ก็นึกขึ้นได้ว่า Alfred Aho คือ a ใน awk บางทีอาจจะเป็นทั้งสองอย่าง?

    • น่าจะทั้งสองอย่างนะ “Git” เองก็เป็นสแลงที่แปลว่า “คนโง่” อยู่แล้ว ชื่อนี้เลยมีไหวพริบดี
    • ครั้งล่าสุดที่ได้ยินคือใน Reservation Dogs: https://en.wiktionary.org/wiki/aho#Navajo
    • น่าจะทั้งสองอย่าง เป็นการเล่นคำที่ฉลาดจริง ๆ
  • เป็นโปรเจกต์ที่ยอดเยี่ยมและเป็นไอเดียที่ดี การเข้าใจพื้นฐาน ทำให้ได้มุมมองอีกแบบในการมองโปรเจกต์และปัญหาอื่น ๆ
    เมื่อก่อนผมเคยทำวิกิบนเว็บด้วย Awk เหตุผลคือใช้เราเตอร์ Linksys ที่มีหน่วยความจำน้อยมาก
    มันดีมากสำหรับการเรียนรู้ทั้งว่าวิกิทำงานอย่างไร และ Awk ทำอะไรได้บ้าง เพราะไม่มีไลบรารีให้พึ่งพา จึงต้องลงมือทำส่วนพื้นฐานเอง และนั่นทำให้เข้าใจมันจริง ๆ

  • เขาบอกว่า “ไม่มีแผนจะเพิ่มฟีเจอร์เครือข่ายตรงนี้ แน่นอนว่าทำได้ แต่จะไม่มี clone หรือ push” แต่จริง ๆ แล้วแม้แต่กับรีโพซิทอรีที่อยู่คนละไดเรกทอรีบนคอมพิวเตอร์เครื่องเดียวกัน ก็สามารถทำ git clone และ push ได้

    • ใช่ แต่ถ้ามี branch ความจำเป็นในการทำ local clone ก็ลดลงไปพอสมควร ในทางปฏิบัติผมใช้ rsync เพื่อทำสำเนา local git repository อยู่ ประเด็นคืออะไรดีที่สุดต่างหาก
    • เป็นเรื่องที่ชัดเจนมาก แต่ใช้ git มา 10 ปี ไม่เคยนึกจะลองเลย
  • ผมยังมีความคิดค้างอยู่ว่า ด้วย GNU utility กับโปรแกรมไม่กี่ตัว และอาจแทบไม่ต้องมีอะไรเกินนั้น เราน่าจะสร้าง ฐานข้อมูลและเครื่องมือประมวลผลแบบครอบจักรวาล ที่เหนือกว่าเครื่องมือเฉพาะทางทั้งด้านประสิทธิภาพและฟังก์ชันได้ไหมนะ มีแค่ผมที่รู้สึกแบบนี้หรือเปล่า?

  • อาจเกี่ยวข้องกัน
    sed-chess: https://news.ycombinator.com/item?id=37896854
    awk-raycaster: https://github.com/TheMozg/awk-raycaster

  • ถ้าใช้ cppawk ซึ่งยังไม่มีตอนพัฒนาสิ่งนี้ ก็คงใช้ #include ได้ มันทำงานได้ดีโดยใช้พาธสัมพัทธ์จากไฟล์ และไม่ต้องใช้ AWKPATH
    ยังสามารถ “build” โปรแกรมที่ผ่านการ preprocess แล้วให้เป็นไฟล์เดี่ยวได้ด้วย หลังจากนั้นก็ไม่จำเป็นต้องมี cppawk แล้ว
    https://www.kylheku.com/cgit/cppawk/about/