世界を動かす技術を、日本語で。

ユニックスパイプカードゲーム

概要

UNIXコマンドをパイプで組み合わせる方法を学ぶ子供向けカードゲームの紹介。 親が基本的なUNIXコマンドを理解していることが前提。 ゲームの進行方法、ルール、タスク例を明確に解説。 拡張パックや他の関連カードゲームも案内。 印刷用PDFや作者情報、ライセンスも記載。

UNIXコマンド パイプ学習カードゲーム

  • UNIXコマンド (cat, grep, tail, head, wc, sort, uniq)を パイプ で組み合わせる学習カードゲーム
  • がコマンドの動作を 実際にPC上で見せながら 進行
  • UNIX環境がない場合は jslinux (ブラウザ上でUNIXが動作)を利用推奨
  • 印刷用PDF (unix-pipe-cards.pdf, unix-pipe-box.pdf)を自分で印刷して使用
  • 価格 :€5,00 EUR(現在はsoldout)
  • 作者 :github.com/jackdoe 共同作者 :Jackie 連絡先 :b0000@fastmail.com ライセンス :CC BY 4.0

拡張パック

  • Expansion pack :UNIX Pipe Game - Process Substitution
    • 新コマンド (paste, tr, cut, bc等)やプロセス置換の学習

ルール

  • 最年少のプレイヤー がゲーム形式を選択
    • 最短パイプチェーン でタスク達成を競う
    • 最長パイプチェーン でタスク達成を競う
  • 最年少プレイヤー がタスクカードから1つ選択(同じタスクは再選不可)
  • カードをシャッフル し、裏向きでテーブルに配置
  • 時計回り で各プレイヤーがカードを1枚引き、タスク達成を目指す
  • 最初にタスクを達成 したプレイヤーが1ポイント獲得
  • タスクがなくなればゲーム終了
  • ゲーム進行の流れ :1→2→3→4→5→6(タスク終了時は8へ)、8(GAME OVER)

タスク例

  • 2行目を出力
  • 最後から2行目を出力
  • 7行目を出力
  • 最も多く出現する行を出力
  • 最も少ない行を出力
  • "rises"を含む行数をカウント
  • Wを含む最初の行を出力
  • "in"を含む行数をカウント
  • ランダムな2行を表示
  • 最後の2行の単語数をカウント
  • 7行目と8行目を出力
  • "!"を含む行数をカウント
  • "!"を含まない行数をカウント
  • 何も出力しないコマンドチェーンを作成

ゲームの進行例

  • タスク :「ファイル内で最も多い行を出力」
    • 解答例 :cat 03.txt | sort | uniq -c | sort -n | tail -1

カードデッキの外観

  • カード にはコマンドやタスクが記載
  • は印刷用PDFで自作可能

関連カードゲームの紹介

  • Programming Time :Pythonとアルゴリズム学習用カードゲーム
  • The C Pointer Game :C言語のポインタ、配列、文字列を学ぶカードゲーム
  • 4917 :機械語とCPUの動作を学ぶカードゲーム
  • The Unix Pipes Game - Process Substitution :プロセス置換や新コマンドを学ぶ拡張パック
  • RunLength Encoding for Kids :ランレングス圧縮を学ぶ小型カードゲーム
  • PUNK0 - The Function Composition Card Game :関数合成をカードで学ぶゲーム
  • PROJEKT: OVERFLOW :RISCVアセンブラ学習ボードゲーム
  • Programming for kids :子供へのプログラミング教育記録

購入・利用方法

  • 印刷用PDF をダウンロードし、自宅で印刷
  • 公式リポジトリ (github.com/jackdoe)で詳細やアップデートを確認
  • ライセンス :CC BY 4.0(自由利用・改変可能、クレジット表記要)

このカードゲームで UNIXコマンドの理解パイプの組み合わせ を楽しく学習。親子で実際にコマンドを動かしながら、論理的思考力やプログラミング的発想を育成。

Hackerたちの意見

これ、いくつか買ってプレゼントしてるんだ。Unix Pipe、Expansion Pack、PUNK0が特にお気に入り。

いいアイデアだね。サイトでオンライン版があるか見つけられなかったけど、物理版は売り切れっぽいから特に気になる。

https://openbsd.amsterdam/cards.html

ずっと前にMapQuestのデータグループで働いてた人がいて、彼がawkやsedだけでサクサクやってたことは本当にすごかった。

以前の議論はこちら;2024年 - https://news.ycombinator.com/item?id=41047110 (41コメント) 2022年 - https://news.ycombinator.com/item?id=33222687 (59コメント)

科学の先生で元ソフトウェア開発者として、これがすごく可愛いと思うし、クリエイターが物理カードゲームにした理由もよくわかる。ただ、物理カードゲームにすることで、子供たちがデジタルでやってたら得られる実験やほぼ即時のフィードバックが得られないと思う。子供が「勝つ」ためには、すでに知っているか、言葉で明確に教えられないといけないんだよね。それから親が解決策を分析して、どこが間違ってたかを教えてあげる必要がある。でも、オンラインで違うゲームを想像してみて。子供が「sort」が何をするか全然わからないけど、その「sort」コマンドをテキストの塊にリンクさせたら、すべての行が順番に並ぶ。誰もこのコマンドが何をするか教えてないけど、子供はそれを発見したんだ。科学者としてこれらのコマンドを発見する役割を果たすことで、直感的に理解できるかもしれない。ボードゲーム「ロボットタートル」を思い出すんだけど、子供たちはタートルをゴールに移動させるために「プログラム」を作る必要があった。そうすると、ほぼ即時のフィードバックが得られる:親がタートルを動かすから。もし子供がロボットの左と自分の左を間違えたら、失敗が明らかになる。でも、ボードがない形で、親と子供がタートルが実際に7歩前に進んで3歩左に行くかどうかを話し合うだけだったら、そんなに強力じゃなかったと思う。だから、これを否定するつもりはないけど、コマンドをつなげるのを学ぶのに最適な方法だとは思えないな。

若いLinuxユーザーとして、実験するのが嫌いだった。だいたい、コマンドを5回間違えてからmanページを読もうとして、manページの意味を理解したと思ってまた5回試して、結局諦めるって感じだったから。この実験して即時フィードバックを得るっていうのは、特定のタイプの人にとっての生存バイアスであって、「Unixシェルを教えるべき方法」じゃないと思う。この見解は、Felienne Hermansの「プログラマーの脳」にまとめられた研究でも裏付けられてる。

リビングの大きなテレビに接続したUnixボックスで遊べるか気になるな。パイプにコマンドを追加するたびに結果が見える感じで。それが直感的にやりたいことなんだけど、やっぱり一度だけ遊ぶタイプのゲームって感じもする。

でも、コマンドをパイプでつなげる最良の方法を想像するのが難しいな。正直言うと、プログラミングの概念を教えるのがこんなに難しいのは変だよね。ほとんどの人がコンピュータを使ってるのに、プログラムできるのは0.1%くらいだし。コンピュータ関連のことを教える「最良の方法」があるかどうかもわからない。人は物理の世界モデルを早いうちに発展させるけど、ロープで引くことはわかっても、押すことはわからない。直感を得るし、投げたものは落ちるってことも理解できる。それを数学に転換できるのは、数学が現実だから。でも、コードに関してはそれが難しいんだよね。人は何年も勉強した後でも、ロープで押そうとし続ける。追記:今、彼女にニューラルネットワークを教えようとしてて、"スクエア"ドラゴンと戦うためのこのRNNボードゲームを作ってるんだ。彼女がニューラルネットワークの良い世界モデルを発展させて、ChatGPTが何かを理解できるようにしたいんだ。実験を続けてるけど、うまくいくこともあれば、そうでないこともある。

ねえ、君のコメントをエージェントにコピー&ペーストしちゃったけど、気にしないでね。一発結果はこちら: https://wonderful.exe.xyz 同じことをやってもいいし、もしよければこれにアクセスできるようにするよ。

遠くからカードをスキャンして、いろいろ計算するアプリを作れるかもね。ブレット・ビクター風に。

面白いコンセプトだけど、今のフォーマットだと特定のグループ(あるいは予想外の子供)と一度だけ出して遊ぶゲームって感じ。10〜15分遊んで、自分だけニヤニヤして、その後はこういうゲームが置いてあるところにしまっちゃう。もし同じグループで再度出そうとしたら、「また?もうやったじゃん?」っていう反応が返ってきそうで、ちょっと残念な気持ちになると思う。せめて5ドルだったから良かったけど、Unixターミナルを使って何かキャッチ・ザ・フラッグみたいなゲームをする方が1000%楽しいと思う。

Unix Pipesは「一度だけ遊ぶ」ゲームみたいなもので、アイデアを試してみるためのものだね。それからコンピュータで試す感じ。娘のノートパソコンでHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon Shellをcmd.exeにランダムに設定して、そこからプログラムを実行できるようにしてたんだ。例えば、Discordのディレクトリに行って、そこからDiscordを起動したりね。それで、https://overthewire.org/wargames/bandit/を手伝うためにUnix Pipesを作ったり、どうやって「使い方がわからないプログラム」を作るかを話し合ったりしたんだ。例えば、「sort」のプログラマーはそれがどう使われるか知らないし、カードを使って面白いパイプチェーンを作ることもできる。もちろん、他にもランダムなタスクを作ったりして、ランダムな本を取って「cat」や「grep」を始めたりもした。https://punkx.orgで作ったゲームのほとんどはそんな感じで、彼女に何かを教えようとしてるんだ。ちょっと物理的な助けが必要で「コンピュータから出る」ためにね。唯一の本格的なカードゲームはhttp://punkx.org/punk0で、これはUNOみたいな感じで、友達とよく遊んでる。それと、https://punkx.org/overflow/は、誰と遊ぶかによってすごく盛り上がるよ。

パイプが再解析を避けるために、テキスト以上のものを転送してくれたらいいのに。

公平に言うと、実際にはバイトを転送してるから、好きなデータ形式を使えるよ。

いいですか、https://www.nushell.sh/を紹介してもいいですか?去年から使い始めたんだけど、「ls | sort-by modified -r | take 5」って打てるのがすごく解放感があっていいんだよね。

パイプはテキストを転送するんじゃなくて、フォーマットされてないバイトストリームを転送するんだ。ただ、コマンドは特定のフォーマットを期待してるから、フォーマットに関わらずシリアライズやパースは必ず行われるよ。内部オブジェクトフォーマットでも、PowerShellのコマンドみたいにね。

これ、めっちゃシェアされてるけど、4:56から10:52までの古いベル研究所の動画が、パイプの説明としては今まで見た中で一番わかりやすいよね:https://www.youtube.com/watch?v=tc4ROCJYbm0

ほぼ50年前に考えられたアイデアが、今の新しいコンピュータユーザーにも役立ってるのはすごいね。計画がどれだけしっかりしてたかがわかる。

ニット:動画の特定の時間へのリンクは、「シェア」ボタンをクリックして「開始時刻を設定」にチェックを入れることで取得できるよ:https://youtu.be/tc4ROCJYbm0?&t=296

いい動画だった!最初に見たとき、「*nixってなんでこんなに使いにくいんだろう」って思ってたのが、実はユーザーを考えて作られてるんだって理解するようになった。"*nixのやり方"を学ぶことが大事なんだなって。

大人向けのSELinuxのやつが必要だね。これがあれば、SELinuxを学ぶ時間を取ってない人たちも、恐れずに使えるようになると思う。

すべてを知ってるLLMでも、ファイルのセットが親ディレクトリと合わないラベルで自動的にラベリングされる理由を説明できないのを見て、ちょっと安心した。

そういえば、SELinuxの塗り絵本があるよ。若いうちにSELinuxから始めないと! https://people.redhat.com/duffy/selinux/selinux-coloring-boo...

これ大好き!一度(2017年だったかな)、MS-DOSをベースにしたカードゲームを作ったんだけど、Crazy Eightsの要素を取り入れて「Crazy DOS」って名付けたんだ。でも全然注目されなくて、次に進んじゃった。これ、やってみようかな。こういうの大好きなんだよね。