Slide 1

Slide 1 text

phperだって パンチカードでコーディングしたい PHPカンファレンス愛媛2026 Hideki Kinjyo GitHub: o0h / X: @o0h_ [発表用] v1.2.15

Slide 2

Slide 2 text

2 質問

Slide 3

Slide 3 text

3 「PHPに触れたことがあるよ」 という人〜?

Slide 4

Slide 4 text

4 PSR-20: ClockInterface

Slide 5

Slide 5 text

5 触れる(物理)PSR-20になる予定だったもの

Slide 6

Slide 6 text

6 ※ シミュレータあります https://punch.nichiyou.be/

Slide 7

Slide 7 text

7 -LIVE PUNCHINGPHPプログラムを実行する

Slide 8

Slide 8 text

8 -LIVE PUNCHINGPHPプログラムを実行する

Slide 9

Slide 9 text

おしながき 1.そもそも、パンチカードって・・? 2.どうやって、↑をプログラミングに使うの? 3.phperだって パンチカードでコーディングしたい

Slide 10

Slide 10 text

10 #とは • 紙です • 所定位置に穴を開けて使います • 12段(行)✕80桁(列)の フォーマットが一般的 • 他の規格も存在する リアルなパンチカードな奴らの写真をどうぞ 展示: 統計博物館(総務省)

Slide 11

Slide 11 text

11 イメージ画像

Slide 12

Slide 12 text

12 イメージ画像 穴あり 行番号に合わせて 穴を開けていく

Slide 13

Slide 13 text

13 イメージ画像 0〜9番のエリアがあって

Slide 14

Slide 14 text

14 イメージ画像 11,12番は 特殊な位置にある XやYと 呼ばれることも

Slide 15

Slide 15 text

15 パンチカードはデータ媒体 • 「どこに穴があるか」でデータを表現する • 物理的な穴を利用して、電気的/光学的に読み取る • IBM 711、IBM 1442などで検索してみてください

Slide 16

Slide 16 text

おしながき 1.そもそも、パンチカードって・・? 2.どうやって、↑をプログラミングに使うの? 3.phperだって パンチカードでコーディングしたい

Slide 17

Slide 17 text

パンチカードには 何が記録されているのか

Slide 18

Slide 18 text

18 記録方法 • パンチカードに記録されているのは、シンプルに文字情報 • 縦1列で1データ(1文字)となり、カード1枚で1行分のデータとなる • 穴の組み合わせと、対応する文字を定義して運用する

Slide 19

Slide 19 text

19 例: IBM 704/FORTRAN発明当時(1956-)の対応表 <表の読み方> 見出し行・見出し列の数字を組み合わせると そこの欄にある文字になる を元に作成 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 (

Slide 20

Slide 20 text

20 例: IBM 704/FORTRAN発明当時(1956-)の対応表 <表の読み方> 見出し行・見出し列の数字を組み合わせると そこの欄にある文字になる • 同じ列で1だけに穴を開けたら「1」に を元に作成 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 (

Slide 21

Slide 21 text

21 例: IBM 704/FORTRAN発明当時(1956-)の対応表 <表の読み方> 見出し行・見出し列の数字を組み合わせると そこの欄にある文字になる • 同じ列で1だけに穴を開けたら「1」に • 同じ列で12と4に穴を開けたら「D」に を元に作成 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 (

Slide 22

Slide 22 text

22 例: IBM 704/FORTRAN発明当時(1956-)の対応表 <表の読み方> 見出し行・見出し列の数字を組み合わせると そこの欄にある文字になる • 同じ列で1だけに穴を開けたら「1」に • 同じ列で12と4に穴を開けたら「D」に • 同じ列で11と8と3に穴を開けたら「$」に を元に作成 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 $ * (

Slide 23

Slide 23 text

23 補足 • この時代には、 人間が「対応する穴」を打ち込んでいた訳では無い • パンチライター風のインターフェイスを利用する • 1901年(The Tabulating Machine Co."Type 001")は「12ボタン」だが、 1933年("IBM 032")にはAlphanumの打鍵盤がある • https://en.wikipedia.org/wiki/Keypunch • (IBM 026の写真を拡大すると、パンチャーの様子が分かる)

Slide 24

Slide 24 text

カードリーダー・アプリケーションは、 読み取った穴を、どう処理するか ※ あくまで今回の実装方式の紹介です

Slide 25

Slide 25 text

ステップ①: 穴→ビット 穴を固定長(12)のビット列に変換する • 全部が開いていたら `111111111111` • 全部が閉じていたら `000000000000`

Slide 26

Slide 26 text

ステップ①: 穴→ビット 「1」に穴が開いている => `000100000000`

Slide 27

Slide 27 text

ステップ①: 穴→ビット 「1」に穴が開いている => `000100000000` 「12」「1」に穴が開いている => `100100000000`

Slide 28

Slide 28 text

28 ステップ②: ビット→数値 受け取ったビット列を 整数の値として扱う bindec( '000100000000' ) 256 bindec( '100100000000' ) 2304

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

30 全体像: 穴→ビット列→数値→文字 穴 ビット列 1 000100000000 整数 文字 256 1 12-1 100100000000 2304 A 11-1 010100000000 1280 J 1 A J

Slide 31

Slide 31 text

おしながき 1.そもそも、パンチカードって・・? 2.どうやって、↑をプログラミングに使うの? 3.phperだって パンチカードでコーディングしたい

Slide 32

Slide 32 text

32 悪いニュースと良いニュース • 再掲: 先程の表です • お気づきですか を元に作成 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 (

Slide 33

Slide 33 text

33 悪いニュースと良いニュース 文字が足りない!!!!

Slide 34

Slide 34 text

34 悪いニュースと良いニュース 文字が足りない!!!! 俺達には{}や\が必要!!

Slide 35

Slide 35 text

35 良いニュース、あります

Slide 36

Slide 36 text

36 悪いニュースと良いニュース 穴の配置・サイズが同じままでも 対応表を変えるだけで 文字を増やせる!

Slide 37

Slide 37 text

37 ANSI X3.26-1970 • 1970年に、米国国家規格協会(ANSI)が制定した規格 • 1980年に改定 → 1992年に廃止勧告 • ASCIIに含まれる128文字を表現できるようにする さっきの表だと、定義されているのは48文字 • 当時よく使われていた対応表を拡張するアプローチ(後方互換性) •

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

41 オッケー、じゃあPHP書いちゃうぞ〜

Slide 42

Slide 42 text

42 -LIVE PUNCHINGhello worldを実装する

Slide 43

Slide 43 text

43 -LIVE PUNCHINGhello worldを実装する

Slide 44

Slide 44 text

まとめ

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

47 今日お話したこと 穴は読める

Slide 48

Slide 48 text

48 Q. パンチカードで、どうやってプログラムを作れるの? A. 波・粒子→穴→ビット→文字→論理 電気 〜〜〜 〜〜〜 〜〜〜 光 ◯ ● ● ◯ 0110010 ABCDE⋯

Slide 49

Slide 49 text

49 論理穴 デジタル穴でも

Slide 50

Slide 50 text

50 ターミナル穴 CLIの世界でも

Slide 51

Slide 51 text

51 物理穴 物理穴も 開ければ開くし

Slide 52

Slide 52 text

52 今日を境に、私たちは そこにPHPを見出せてしまう

Slide 53

Slide 53 text

53 できる💪

Slide 54

Slide 54 text

54 めでたし、めでたし。

Slide 55

Slide 55 text

おしまい! お付き合いいただき ありがとうございました!! 愛用

Slide 56

Slide 56 text

Appendix-Ⅰ: 参考文献など

Slide 57

Slide 57 text

57 得体が知れない程の充実度を誇るサイト • The Virtual Keypunch – Make Your Personal Punch Card https://www.masswerk.at/keypunch/ • Tristan Davey's Punch Card Archive https://punchcards.tristandavey.com/

Slide 58

Slide 58 text

58 IBM • The punched card | IBM https://www.ibm.com/history/punched-card • IBM Key Punches https://www.columbia.edu/cu/computinghistory/keypunch.html

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

62 ブログ記事など • 1960年代のメインフレームに使用された「カードリーダー」を修 復する作業とは? - GIGAZINE https://gigazine.net/news/20180210-60s-card-reader-repair/ • パンチカードでプログラミングする方法 / How to program on the punch card https://fukuno.jig.jp/1760

Slide 63

Slide 63 text

63 書籍 • 「我ら、プログラマー AdaからAIまで、コーダーたちの年代記」 RobertC.Martin [PC・理工科学書] - KADOKAWA https://www.kadokawa.co.jp/product/302605002959/ • パンチカード時代や、その前・その後のプログラミング言語の発展に ついて

Slide 64

Slide 64 text

Appendix-Ⅱ: アプリ実装面(もう少し具体的に)

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

66 対応する表を作る(概念) • 規則的に指定できるとこは、ルールベースで量産する [0-9] : キーの内容に一致 • [A-I] : 「12」 + 「1」〜「9」 • [J-R] : 「11」 + 「1」〜「9」 • [S-Z] : 「0」 + 「2」〜「9」 • • それ以外は、対応するキーの組み合わせを具体的に書く • $ : 「11」-「8」-「3」

Slide 67

Slide 67 text

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), ]; }

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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), ]; }

Slide 71

Slide 71 text

71 対応する表を作る(コード例) public function __construct(CodeTable $table) { $this->id = $table->id; $this->index = RuleCompiler::compile( ...$table->rules ); } 使う側(デコーダー)で 良い感じにルール集をコンパイルして使う

Slide 72

Slide 72 text

Design Doc雰囲気チラ見せ

Slide 73

Slide 73 text

73

Slide 74

Slide 74 text

74

Slide 75

Slide 75 text

75