Upgrade to Pro — share decks privately, control downloads, hide ads and more …

phperだってパンチカードでコーディングしたい

 phperだってパンチカードでコーディングしたい

PHPカンファレンス愛媛2026 で発表資料です(5分)
https://fortee.jp/phpconehime-2026/proposal/cae48e48-b5a2-4cde-a4a5-8d1912e8a7c8

Avatar for hideki kinjyo

hideki kinjyo PRO

October 02, 2026

More Decks by hideki kinjyo

Other Decks in Programming

Transcript

  1. 10 #とは • 紙です • 所定位置に穴を開けて使います • 12段(行)✕80桁(列)の フォーマットが一般的 •

    他の規格も存在する リアルなパンチカードな奴らの写真をどうぞ 展示: 統計博物館(総務省)
  2. 21 例: IBM 704/FORTRAN発明当時(1956-)の対応表 <表の読み方> 見出し行・見出し列の数字を組み合わせると そこの欄にある文字になる • 同じ列で1だけに穴を開けたら「1」に •

    同じ列で12と4に穴を開けたら「D」に <https://archive.computerhistory.org/resources/text/Fortran/102649787.05.01.acc.pdf> を元に作成 N/A 12 N/A SP + 1 1 A 2 2 B 3 3 C 4 4 D 5 5 E 6 6 F 7 7 G 8 8 H 9 9 I 8-3 = . 8-4 — ) 11 J K L M N O P Q R $ * 0 0 — S T U V W X Y Z (
  3. 22 例: IBM 704/FORTRAN発明当時(1956-)の対応表 <表の読み方> 見出し行・見出し列の数字を組み合わせると そこの欄にある文字になる • 同じ列で1だけに穴を開けたら「1」に •

    同じ列で12と4に穴を開けたら「D」に • 同じ列で11と8と3に穴を開けたら「$」に <https://archive.computerhistory.org/resources/text/Fortran/102649787.05.01.acc.pdf> を元に作成 N/A 12 N/A SP + 1 1 A 2 2 B 3 3 C 4 4 D 5 5 E 6 6 F 7 7 G 8 8 H 9 9 I 8-3 = . 8-4 — ) 11 J K L M N O P Q R 0 0 — S T U V W X Y Z $ * (
  4. 23 補足 • この時代には、 人間が「対応する穴」を打ち込んでいた訳では無い • パンチライター風のインターフェイスを利用する • 1901年(The Tabulating

    Machine Co."Type 001")は「12ボタン」だが、 1933年("IBM 032")にはAlphanumの打鍵盤がある • https://en.wikipedia.org/wiki/Keypunch • (IBM 026の写真を拡大すると、パンチャーの様子が分かる)
  5. 29 ステップ③: 数値→文字 {数値 : 文字}の対応表 を作る 256 穴 0

    1 2 3 4 ビット列 整数 文字 001000000000 512 0 000100000000 256 1 000010000000 128 2 000001000000 64 3 000000100000 32 4 2304 穴 ビット列 整数 文字 12- 100100000000 2304 A 12-2 100010000000 2176 B 12-3 100001000000 2112 C 12-4 100000100000 2080 D 12-5 100000010000 2064 E
  6. 32 悪いニュースと良いニュース • 再掲: 先程の表です • お気づきですか <https://archive.computerhistory.org/resources/text/Fortran/102649787.05.01.acc.pdf> を元に作成 N/A

    12 N/A SP + 1 1 A 2 2 B 3 3 C 4 4 D 5 5 E 6 6 F 7 7 G 8 8 H 9 9 I 8-3 = . 8-4 — ) 11 J K L M N O P Q R $ * 0 0 — S T U V W X Y Z (
  7. 37 ANSI X3.26-1970 • 1970年に、米国国家規格協会(ANSI)が制定した規格 • 1980年に改定 → 1992年に廃止勧告 •

    ASCIIに含まれる128文字を表現できるようにする さっきの表だと、定義されているのは48文字 • 当時よく使われていた対応表を拡張するアプローチ(後方互換性) •
  8. 38 ANSI X3.26の表 N/A 1 2 3 4 5 6

    7 8 9 8-1 8-2 8-3 8-4 8-5 8-6 8-7 N/A SP 1 2 3 4 5 6 7 8 9 ` : # @ = " 12 + A B C D E F G H I 11 J K L M N O P Q R 0 0 — S T U V W X Y Z [ . < ( + ! ] $ * ) ; ^ \ , % _ > ? 12-11 12-0 | { j a k b l c m d n e o f p g q h r i 11-0 } ~ s t u v w x y z
  9. 39 ここら辺は 変えずに N/A 1 2 3 4 5 6

    7 8 9 8-1 8-2 8-3 8-4 8-5 8-6 8-7 N/A SP 1 2 3 4 5 6 7 8 9 ` : # @ = " 12 + A B C D E F G H I 11 J K L M N O P Q R 0 0 — S T U V W X Y Z [ . < ( + ! ] $ * ) ; ^ \ , % _ > ? 12-11 12-0 | { j a k b l c m d n e o f p g q h r i 11-0 } ~ s t u v w x y z
  10. 40 ここら辺を 拡張 N/A 1 2 3 4 5 6

    7 8 9 8-1 8-2 8-3 8-4 8-5 8-6 8-7 N/A SP 1 2 3 4 5 6 7 8 9 ` : # @ = " 12 + A B C D E F G H I 11 J K L M N O P Q R 0 0 — S T U V W X Y Z [ . < ( + ! ] $ * ) ; ^ \ , % _ > ? 12-11 12-0 | { j a k b l c m d n e o f p g q h r i 11-0 } ~ s t u v w x y z
  11. 45 自己紹介 • 金城秀樹 / きんじょうひでき • GitHub: @o0h /

    : @o0h_ • アイコンは美味しい鮭親子丼の写真です • 東京でPHPを使っています • 最近はPodcastをやっています ハッシュタグ: #readlinefm 𝕏 •
  12. 46 自己紹介 • 金城秀樹 / きんじょうひでき • GitHub: @o0h /

    : @o0h_ • アイコンは美味しい鮭親子丼の写真です 懇親会で! • 東京でPHPを使っています • 最近はPodcastをやっています ハッシュタグ: #readlinefm 𝕏 •
  13. 57 得体が知れない程の充実度を誇るサイト • The Virtual Keypunch – Make Your Personal

    Punch Card https://www.masswerk.at/keypunch/ • Tristan Davey's Punch Card Archive https://punchcards.tristandavey.com/
  14. 58 IBM • The punched card | IBM https://www.ibm.com/history/punched-card •

    IBM Key Punches https://www.columbia.edu/cu/computinghistory/keypunch.html
  15. 59 大学・公的機関、規格など • https://nvlpubs.nist.gov/nistpubs/Legacy/FIPS/ fipspub14.pdf ※NISTのPDF直リン注意 • RFC 183: EBCDIC

    Codes and Their Mapping to ASCII | RFC Editor https://www.rfc-editor.org/info/rfc183/ • Early Card Punch Machines https://www.columbia.edu/cu/computinghistory/oldpunch.html
  16. 60 動画(実際の機材の紹介やインタビューなど) • Basic Operation of the IBM 029 Card

    Punch (1967) - YouTube https://www.youtube.com/watch?v=kaQmAybWn-w • IBM 026 Key Punch - YouTube https://www.youtube.com/watch?v=Y0GurDnBK8E • Bubbles Whiting - Using Punch Cards - Hollerith and IBM YouTube https://www.youtube.com/watch?v=L7jAOcc9kBU
  17. 61 博物館・資料館(国内)の記事 • 統計局ホームページ/統計博物館 https://www.stat.go.jp/museum/ • 理工電子資料館: 計算機・コンピュータ https://www.kahaku.go.jp/exhibitions/vm/past_parmanent/rikou/computer/ computer-index.html

    • フローチャート,パンチカード,紙テープ-コンピュータ博物館 https://museum.ipsj.or.jp/computer/device/paper/words.html • 1985/昭和60/パンチカード/ホレリスカード/カセットテープやフロッピーディスク 以前のコンピューターの記録媒体/ : Extinct Media Museum Tokyo https://extinct-media-museum.blog.jp/archives/25851364.html
  18. 65 対応する表を作る(概念) • {数値 : 文字}を対応させた表データを作る • ・・・とはいえ、全てを列挙するのもダルい! 穴 ビット列

    整数 文字 穴 ビット列 0 001000000000 512 1 000100000000 2 整数 文字 0 12-1 100100000000 2304 A 256 1 12-2 100010000000 2176 B 000010000000 128 2 12-3 100001000000 2112 C 3 000001000000 64 3 12-4 100000100000 2080 D 4 000000100000 32 4 12-5 100000010000 2064 E
  19. 66 対応する表を作る(概念) • 規則的に指定できるとこは、ルールベースで量産する [0-9] : キーの内容に一致 • [A-I] :

    「12」 + 「1」〜「9」 • [J-R] : 「11」 + 「1」〜「9」 • [S-Z] : 「0」 + 「2」〜「9」 • • それ以外は、対応するキーの組み合わせを具体的に書く • $ : 「11」-「8」-「3」
  20. 67 対応する表を作る(コード例) final class BasicTable implements CodeTable { public array

    $rules { get => [ new Rule\Offset('0', '9'), new Rule\Range('A', 'I', [Row::N12], Row::N1), new Rule\Range('J', 'R', [Row::N11], Row::N1), new Rule\Range('S', 'Z', [Row::N0], Row::N2), new Rule\Exact('$', Row::N11, Row::N8, Row::N3), ]; }
  21. 68 対応する表を作る(コード例) final class BasicTable implements CodeTable { 数字を、同じ番号のビットに紐づける public

    array $rules { get => [ new Rule\Offset('0', '9'), new Rule\Range('A', new Rule\Range('J', new Rule\Range('S', new Rule\Exact('$', ]; } N/A 1 1 2 2 3 3 'I', [Row::N12], Row::N1), 4 4 'R', [Row::N11], Row::N1), 5 5 'Z', [Row::N0], Row::N2), 6 6 7 7 Row::N11, Row::N8, Row::N3), 8 8 9 9
  22. 69 対応する表を作る(コード例) final class BasicTable implements CodeTable { 文字範囲を、 public

    array $rules { 「メタキー」「連番の開始」で get => [ 指定して紐づける new Rule\Offset('0', '9'), new Rule\Range('A', 'I', [Row::N12], Row::N1), new Rule\Range('J', 'R', [Row::N11], Row::N1), new Rule\Range('S', 'Z', [Row::N0], Row::N2), 12 1 A 2 B 3 C 4 D 5 E 6 F 7 G new Rule\Exact('$', Row::N11, Row::N8, Row::N3), ]; } 8 H 9 I
  23. 70 対応する表を作る(コード例) final class BasicTable implements CodeTable { public array

    $rules { get => [ new Rule\Offset('0', '9'), 1文字だけ決め打ちで、 11 8-3 $ new Rule\Range('A', 'I', [Row::N12], Row::N1), ビットを引数リストに入れて new Rule\Range('J', 'R', [Row::N11], Row::N1), 紐づける new Rule\Range('S', 'Z', [Row::N0], Row::N2), new Rule\Exact('$', Row::N11, Row::N8, Row::N3), ]; }
  24. 71 対応する表を作る(コード例) public function __construct(CodeTable $table) { $this->id = $table->id;

    $this->index = RuleCompiler::compile( ...$table->rules ); } 使う側(デコーダー)で 良い感じにルール集をコンパイルして使う
  25. 73

  26. 74

  27. 75