เกมไพ่ Unix Pipe
(punkx.org)- เป็นเกมที่ให้เด็กๆ เรียนรู้การ ต่อคำสั่งผ่าน pipe โดยนำคำสั่ง UNIX พื้นฐานอย่าง
cat,grep,tail,head,wc,sort,uniqมาเรียงต่อกันเป็นการ์ด - แนวทางนี้ตั้งอยู่บนสมมติฐานว่าผู้ปกครองรู้จักคำสั่งพื้นฐานและสาธิตการรันจริงให้ดูได้ และหากไม่มีสภาพแวดล้อม UNIX ก็สามารถใช้ jslinux บนเบราว์เซอร์ได้
- ผู้เล่นจะสร้างสายคำสั่งให้ตรงกับเป้าหมายของการ์ดงาน โดยมีตัวอย่างไปป์ไลน์อย่าง
cat 03.txt | sort | uniq -c | sort -n | tail -1 - ในแต่ละรอบ ผู้เล่นที่อายุน้อยที่สุดจะเลือกกติกาว่าแบบ สายคำสั่งสั้นที่สุด หรือ สายคำสั่งยาวที่สุด เป็นผู้ชนะ และผู้เล่นที่ทำงานสำเร็จก่อนจะได้คะแนน
- มีการเผยแพร่ทั้งไฟล์ PDF ของการ์ดและโค้ดเพื่อพิมพ์ใช้งานเองได้ และยังมีภาคเสริมที่ยากขึ้นคือ Process Substitution ให้ด้วย
จุดประสงค์ของเกมไพ่และสิ่งที่ต้องเตรียม
- UNIX Pipe Card Game เป็น เกมไพ่ ที่สอนเด็กๆ ให้รู้จักวิธีเชื่อมคำสั่ง UNIX ด้วย pipe
- คำสั่งที่ใช้ในเกมพื้นฐานคือ
cat,grep,tail,head,wc,sort,uniq - ผู้ปกครองควรสาธิตการรันคำสั่งบนคอมพิวเตอร์จริง และถ้าไม่มีระบบ UNIX ก็สามารถใช้ jslinux บนเบราว์เซอร์ได้
- มีการเปิดเผยสื่อสำหรับพิมพ์ใช้เองและโค้ดไว้แล้ว
- unix-pipe-cards.pdf: PDF การ์ด
- unix-pipe-box.pdf: PDF กล่อง
- unix-pipe-game: โค้ด
- ภาคเสริมเวอร์ชันที่ยากขึ้น UNIX Pipe Game - Process Substitution ครอบคลุม process substitution และ
paste,tr,cut,bc
ตัวอย่างลำดับรอบและสายคำสั่ง
- เป้าหมายของรอบตัวอย่างคือการแสดง บรรทัดที่พบบ่อยที่สุดในไฟล์
- ใช้
catเพื่ออ่านไฟล์ - ใช้
sortเพื่อเรียงบรรทัด - ใช้
uniq -cเพื่อนับจำนวนบรรทัดที่ซ้ำกัน - ใช้
sort -nเพื่อเรียงตามค่าตัวเลข - ใช้
tail -1เพื่อแสดงบรรทัดสุดท้าย
- ใช้
- ตัวอย่างสายคำสั่งสำหรับแก้โจทย์นี้มีดังนี้
cat 03.txt | sort | uniq -c | sort -n | tail -1
- ลำดับการเล่นพื้นฐานเป็นดังนี้
- ผู้เล่นที่อายุน้อยที่สุดจะเลือกรูปแบบของรอบ
- คนที่สร้าง สาย pipe ที่สั้นที่สุด และทำงานสำเร็จเป็นผู้ชนะ
- คนที่สร้าง สาย pipe ที่ยาวที่สุด และทำงานสำเร็จเป็นผู้ชนะ
- ผู้เล่นที่อายุน้อยที่สุดเลือกงานหนึ่งอย่างจากการ์ดงาน และงานเดิมห้ามเลือกซ้ำ
- สับไพ่แล้ววางคว่ำไว้บนโต๊ะ
- ผู้เล่นแต่ละคนจั่วไพ่ใบบนสุดตามเข็มนาฬิกา แล้วพยายามทำงานให้สำเร็จ
- ผู้เล่นคนแรกที่ทำงานสำเร็จจะได้คะแนน
- เมื่อไม่มีงานเหลือแล้ว เกมจะจบลง
- ผู้เล่นที่อายุน้อยที่สุดจะเลือกรูปแบบของรอบ
โจทย์ที่การ์ดงานต้องการ
- ตัวอย่างงานประกอบด้วยเป้าหมายที่แก้ได้ด้วยการผสมคำสั่ง UNIX เช่น การเลือกบรรทัด การค้นหาสตริง การนับจำนวน และการควบคุมผลลัพธ์
- แสดงบรรทัดที่สอง
- แสดงบรรทัดรองสุดท้าย
- แสดงบรรทัดที่ 7
- แสดงบรรทัดที่พบบ่อยที่สุด
- แสดงบรรทัดที่พบน้อยที่สุด
- นับจำนวนบรรทัดที่มี
"rises" - แสดงบรรทัดแรกที่มี
W - นับจำนวนบรรทัดที่มี
"in" - แสดงสองบรรทัดแบบสุ่ม
- นับจำนวนคำในสองบรรทัดสุดท้าย
- แสดงบรรทัดที่ 7 และ 8
- นับจำนวนบรรทัดที่มี
! - นับจำนวนบรรทัดที่ไม่มี
! - สร้างสายคำสั่งที่ไม่แสดงผลอะไรเลย
2 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ผมทำสำรับการ์ดเหล่านี้ (https://punkx.org/) เพื่อสอนลูกสาว และจนถึงตอนนี้ก็ได้ผลค่อนข้างดี
โดยเฉพาะ Unix pipes, 4917 machine code (https://punkx.org/4917/), สำรับ pointers (https://punkx.org/c-pointer-game/) ดีมาก ส่วนสำรับ Python ใช้อยู่ราว ๆ 10 ใบ
น่าจะชอบบอร์ดเกมจัดการ buffer overflow ด้วย RISC-V assembly https://punkx.org/overflow/ ด้วย และถ้าระดับของเด็กเหมาะ ก็ยังมีเกมงูกับบันไดแบบ goto https://punkx.org/overflow/build/snakes-and-ladders.pdf ได้เหมือนกัน
ถ้ามีลูก แนะนำให้ลองพิมพ์ https://punkx.org/panic/ ด้วย ในนั้นมีลูกเล่นที่ยัดลงไปในการ์ดโป๊กเกอร์หนึ่งใบได้ เช่น กด backspace หรือ space แบบสุ่มทุก 30 วินาที หรือถ้าเปิด Minecraft อยู่ก็จะสุ่มกด W
ผมกำลังบริจาคหลายสำรับให้ครูและโรงเรียนอยู่ ถ้าสนใจก็ส่งอีเมลมาได้
ป.ล. ผมจะอยู่ London อีก 1 สัปดาห์ ดังนั้นถ้าสั่งตอนนี้การจัดส่งจะช้าหน่อย แต่ผมจะใส่สำรับเพิ่มให้ในแพ็กเกจอีก 1-2 ชุดแทน
เพิ่มเติมคือสำรับขยาย Unix pipes เป็นเรื่อง process substitution ล้วน ๆ ซึ่งผมไม่คิดว่าจะมีประโยชน์กับเด็กนัก แต่ปริศนาก็ถือว่าโอเค
มีอย่างหนึ่งที่สังเกตเห็นคือ ในเกมมีโจทย์อย่าง “พิมพ์บรรทัดที่สอง”, “พิมพ์บรรทัดที่เจ็ด” แต่ทั้งสองบรรทัดว่างอยู่ ดังนั้นพูดอย่างเคร่งครัดแล้ว
grepที่ไม่แมตช์อะไรเลยก็อาจถือเป็นคำตอบที่ถูกต้องได้แต่อยากรู้ว่าเรื่อง การพิมพ์ จัดการยังไง ทำเอง, พิมพ์ตามสั่ง, หรือสั่งล็อตใหญ่แล้วจัดส่งเอง ผมสนใจเสมอว่าการขายสินค้าที่จับต้องได้ขนาดเล็กเขาดำเนินงานกันยังไง
ตอนนี้ลูกสาวยังเล็กเกินกว่าจะใช้ แต่ผมว่าสำรับพวกนี้ยอดเยี่ยมมาก และรอวันที่จะหยิบออกมาใช้ในอีกราว 8 ปีข้างหน้าอย่างตื่นเต้น
สงสัยว่าเดี๋ยวนี้เด็ก ๆ จะเข้าใจอะไรแบบนี้ได้จริงไหม
ผมไม่มีลูกและก็ไม่ค่อยได้อยู่ใกล้เด็ก ๆ เลย อยากให้รับคำถามนี้ว่าเป็นคำถามจริงใจ
ความยากคือเราต้องแข่งขันแย่งความสนใจของลูกสาวกับ Snapchat และ Google/Meta ทุกวัน โรงเรียนก็ทำให้เหนื่อยพอสมควร และ streaks ของ Snapchat น่ารำคาญจริง ๆ ยิ่งมีเพื่อนมากก็ยิ่งต้องรักษา streak มากขึ้น จนต้องส่งข้อความวันละประมาณ 400 ข้อความแบบไม่รู้จบ
ผมสอนลูกสาวว่ามีนักพัฒนา นักจิตวิทยา เจ้าของผลิตภัณฑ์ ฯลฯ กว่า 100,000 คนที่ตื่นมาทำงานทุกวันเพื่อคิดว่าจะดึงคุณค่าจากความสนใจของเธอให้ได้มากที่สุดยังไง ดังนั้นเธอต้องคอยตระหนักว่า “อัลกอริทึม” กำลังทำให้เธอทำอะไรอยู่
เธอเข้าใจ Unix pipes ได้ค่อนข้างเร็ว แม้จะไม่ได้ใช้บ่อย แต่ก็จับแนวคิดได้ว่าโปรแกรมหนึ่งอ่านผลลัพธ์ของอีกโปรแกรมหนึ่ง และการทำความเข้าใจ command line ก็ไม่ได้ยากขนาดนั้น
แต่ผมก็ใช้กลเม็ดหลายอย่าง เช่น บนพีซี Windows ของลูกสาว ผมเปลี่ยน shell ให้บูตเข้า
cmd.exeแทนexplorerเพื่อให้ขึ้น command prompt มาเลย แล้วให้เธอสำรวจและแก้กลับเอง ผมยังทำเกมล่าสมบัติในไฟล์ซิสเต็มให้เธอหาไฟล์ด้วยdir,cdฯลฯ และให้รางวัลเป็น Robux สำหรับเกม Bandit ของ https://overthewire.org/wargames/bandit/ ทุกครั้งที่ผ่านด่านผมอยากสอนว่าคอมพิวเตอร์ทำงานยังไง และจะทำให้คอมพิวเตอร์ทำสิ่งที่เราต้องการได้ยังไง ตั้งแต่รีจิสเตอร์คืออะไร คำสั่งคืออะไร โปรแกรมและโปรเซสคืออะไร เรียกได้ว่าเป็นพื้นฐานที่สุดของพื้นฐาน
ระหว่างทางก็สอนเรื่องการแบ่งปัญหา วิธีคิด และที่สำคัญที่สุดคือวิธีเรียนรู้ไปด้วย ผมอยากสอนแก่นของสิ่งต่าง ๆ ให้ไม่มีอะไรเป็นเรื่องลึกลับ ไม่ว่าจะเป็นกระบวนการที่กดคีย์บอร์ดแล้วตัวอักษรขึ้นบนจอ หรือวิธีที่ ChatGPT ทำนายคำถัดไป ตอนนี้ผมกำลังทำบอร์ดเกม recurrent neural network ที่มีนิวรอน 3 ตัว เพื่อสอนให้นับเลข: https://punkx.org/move-37/rnn.pdf
สุดท้ายแล้ว ผมก็ไม่แน่ใจนักว่าการสอนอะไรให้เด็กนั้นสำคัญมากขนาดไหน
ในห้องเรียน เพื่อนร่วมชั้นต้องอธิบายกันตั้งแต่แนวคิดอย่าง ไฟล์ และโฟลเดอร์
พูดตรง ๆ ผมไม่คิดว่ามันแย่ขนาดนั้น คอมพิวเตอร์ก็น่าจะเดินไปในทางเดียวกับรถยนต์ คนส่วนใหญ่จะรู้แค่พื้นฐานที่สุดที่จำเป็นต่อการใช้งาน ส่วนความรู้ลึกกว่านั้นจะเหลือไว้ให้พวกผู้หลงใหลและผู้เชี่ยวชาญ
เพราะฉะนั้น ต่อให้ภายในคอมพิวเตอร์จะซับซ้อนขึ้นเรื่อย ๆ รูปแบบการใช้งานทั่วไปก็ดูจะยิ่งลดลง
ถ้าจะเล่นเกม ต้องไปแก้ pipe handling ที่ https://exaequos.com ให้เรียบร้อยก่อน
ถ้าเล่นเกมนับจำนวน pipe ให้น้อยที่สุดกับคนที่โตมากับการใช้
awk,perlและอื่น ๆ ความยากจะพุ่งขึ้นทันทีหรือถ้าจะให้ตรงกับเจตนาของเกม ก็เล่นไปพร้อมกับเรียนรู้แต่ละเครื่องมือตามวัตถุประสงค์ดั้งเดิมของมัน
สำหรับงานแบบครั้งเดียวจบที่ต้องทำเร็ว มักจะใช้
awk/sedกันเยอะ และโดยทั่วไปก็ใช้โมเดลความคิดคล้าย ๆ กัน คือสร้าง input stream ขึ้นมา ใช้sedจัดข้อมูลให้อยู่ในรูป record ใช้awkประมวลผล record แล้วค่อยเกลาผลลัพธ์ด้วยsort/uniqอะไรทำนองนั้นในหลายกรณี
sedกับawkใช้แทนกันได้ แต่ถ้าทำแบบนั้นจะใช้เวลาวาดภาพในหัวนานขึ้น และนำกลับมาใช้ซ้ำได้ยากขึ้นในกติกาบอกว่าผู้เล่นที่ทำโจทย์เสร็จก่อนเป็นผู้ชนะของรอบ แต่ก็สงสัยว่าโหมด สาย pipe ที่ยาวที่สุด ทำงานอย่างไร
คนที่จะมาตำหนิเรื่อง
uuocคงใกล้มาถึงแล้วการใส่
catไว้ข้างหน้าทำให้เพิ่มอะไรบางอย่างเข้าไปที่ต้น pipeline ได้ง่ายขึ้นชอบมากที่สามารถพิมพ์ออกมาเองได้
ตอนนี้กำลังคิดอยู่ว่าจะพิมพ์ด้วยเครื่องพิมพ์ที่ออฟฟิศเลยดีไหม
ข้อดีของเกมนี้คือคนที่รู้จัก UUoC จะเป็นฝ่ายชนะ
cat file.txt | tr a-z A-Z | sortคือฝ่ายแพ้ ส่วนtr < file.txt a-z A-Z | sortคือฝ่ายชนะค่าจัดส่งไป Canada $19 ดูแรงไปหน่อย
ไม่แน่ใจว่ามีใครใน Greater Vancouver อยากสั่งรวมกันไหม
แต่ทุกสำรับมี PDF ให้ ดังนั้นสามารถพิมพ์เองที่ร้านพิมพ์แถวบ้านได้ ถ้าไม่พิมพ์กล่องก็น่าจะถูกลงอีก
พิมพ์ลงกระดาษ A4 ธรรมดาแล้วใช้กรรไกรตัดก็ไม่ได้มีปัญหาใหญ่ อันที่จริงยังช่วยได้เวลาจะอธิบายให้ใครสักคนด้วยปากกาและกระดาษ
ในกรณีนั้น กล่องคือ https://punkx.org/unix-pipe-game/unix-pipe-box.pdf และไพ่คือ https://punkx.org/unix-pipe-game/unix-pipe-cards.pdf
ราคา 8,000₩ นะครับ/ค่ะ ถ้าใครมีฉบับสำเนา รบกวนช่วยรีวิวหน่อยครับ/ค่ะ