続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring...

72
続・ 続・ ハロー・ワールド ハロー・ワールド 入門 入門 坂井弘亮 坂井弘亮 (KOZOSプロジェクト) (KOZOSプロジェクト) TwitterID:kozossakai TwitterID:kozossakai

Transcript of 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring...

Page 1: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

続・続・ハロー・ワールドハロー・ワールド

入門入門坂井弘亮坂井弘亮(KOZOSプロジェクト)(KOZOSプロジェクト)TwitterID:kozossakaiTwitterID:kozossakai

Page 2: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

毎年恒例毎年恒例

Page 3: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

バイナリカレンダーバイナリカレンダーありますあります

Page 4: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

バイナリカレンダーバイナリカレンダーとは何かとは何か

Page 5: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

(普通のカレンダー)(普通のカレンダー)風景や人物がテーマ風景や人物がテーマ

(バイナリカレンダー)(バイナリカレンダー)バイナリデータがテーマバイナリデータがテーマ

Page 6: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

こんな感じですこんな感じです

Page 7: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

(バイナリカレンダー2014) (バイナリカレンダー2014) (アーキテクチャカレンダー2015)(アーキテクチャカレンダー2015)

Page 8: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

そして今年そして今年

Page 9: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

乱数カレンダー乱数カレンダー

Page 10: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

乱数カレンダー乱数カレンダーとは何かとは何か

Page 11: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

乱数データをテーマとした 乱数データをテーマとした バイナリカレンダーの バイナリカレンダーの

一種です一種です

Page 12: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

こんな感じですこんな感じです

Page 13: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)
Page 14: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

乱数データの乱数データのダンプダンプ

Page 15: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

日付は16進数と日付は16進数と2進数を併記2進数を併記(さすがにここは(さすがにここは乱数ではない)乱数ではない)

Page 16: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

乱数一覧乱数一覧1月1月 /dev/urandom/dev/urandom 7月7月 bashの$RANDOMbashの$RANDOM

2月2月 rand()rand() 8月8月 PythonのPythonのrandom.randint()random.randint()

3月3月 ガウス分布ガウス分布 9月9月 random()random()

4月4月 旧rand()旧rand() 10月10月 NumpyのNumpyのrandom.randint()random.randint()

5月5月 M系列M系列 11月11月 Awkのrand()Awkのrand()

6月6月 Perlのrand()Perlのrand() 12月12月 openssl randopenssl rand

Page 17: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

特徴的な月特徴的な月

Page 18: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

4月4月(旧libcの(旧libcのrand()関数)rand()関数)

Page 19: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

4月4月(旧libcの(旧libcのrand()関数)rand()関数)

パターンがパターンが規則的規則的

Page 20: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

4月4月(旧libcの(旧libcのrand()関数)rand()関数)

パターンがパターンが規則的規則的

rv = rv * 1103515245 + 12345;rv = rv * 1103515245 + 12345;

Page 21: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

他にも他にも

Page 22: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

5月5月(M系列)(M系列)

Page 23: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

5月5月(M系列)(M系列)

先頭に先頭にゼロデータのゼロデータの連続連続

Page 24: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

5月5月(M系列)(M系列)

先頭に先頭にゼロデータのゼロデータの

連続連続

乱数の種を適切に選ばないと 乱数の種を適切に選ばないと 乱数性が低くなる 乱数性が低くなる

(この例では seed = 1)(この例では seed = 1)

Page 25: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

前置き終わり前置き終わり

Page 26: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

続・続・ハロー・ワールドハロー・ワールド

入門入門坂井弘亮坂井弘亮(KOZOSプロジェクト)(KOZOSプロジェクト)TwitterID:kozossakaiTwitterID:kozossakai

Page 27: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

「ハロー・ワールド入門」 「ハロー・ワールド入門」 とは何かとは何か

Page 28: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

1年前の1年前のOSC東京春のOSC東京春のLTでの発表LTでの発表

Page 29: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

「ハロー・ワールド入門」「ハロー・ワールド入門」

Page 30: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

C言語の入門時に C言語の入門時に 必ずと言っていいほど書く 必ずと言っていいほど書く

「ハロー・ワールド」「ハロー・ワールド」

Page 31: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

こんなのですこんなのです

Page 32: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

#include <stdio.h>#include <stdio.h>

int main()int main(){{ printf("Hello, World!\n"); printf("Hello, World!\n"); return 0; return 0;}}

Page 33: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

実行結果実行結果

Page 34: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

Hello, World!Hello, World!

Page 35: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

単に 単に 「Hello, World!」 「Hello, World!」 と出力するだけの と出力するだけの

プログラムプログラム

Page 36: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

たいていのプログラミング たいていのプログラミング 入門書はこれで始まる入門書はこれで始まる

Page 37: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

これを徹底的に これを徹底的に 解析する,という話解析する,という話

Page 38: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

1年前の1年前のOSC東京春のOSC東京春のLTで言ったことLTで言ったこと

Page 39: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

マニアックな技術書を マニアックな技術書を 書くのはもう卒業だ!書くのはもう卒業だ!

今年は入門書を書くぞ!今年は入門書を書くぞ!

Page 40: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

入門書と言えば入門書と言えばハロー・ワールドだろうハロー・ワールドだろう

Page 41: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

じゃあハロー・ワールドだけに じゃあハロー・ワールドだけに ついて解説する本を書けば, ついて解説する本を書けば,

入門書の前に読むべき 入門書の前に読むべき スーパー入門書になるのでは?スーパー入門書になるのでは?

Page 42: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

そして今年そして今年

Page 43: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

続・続・ハロー・ワールドハロー・ワールド

入門入門坂井弘亮坂井弘亮(KOZOSプロジェクト)(KOZOSプロジェクト)TwitterID:kozossakaiTwitterID:kozossakai

Page 44: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

そもそものそもそものきっかけきっかけ

Page 45: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

こんなことをこんなことを言われたことが言われたことが

あるある

Page 46: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

「ハロー・ワールド」について 「ハロー・ワールド」について レポートを書けという レポートを書けという

課題が出れば, 課題が出れば, 5枚でも6枚でも書ける! 5枚でも6枚でも書ける!

(要するにそれほど奥が深い)(要するにそれほど奥が深い)

Page 47: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

これを聞いたときの これを聞いたときの 正直な感想正直な感想

Page 48: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

いやいやいやいや無理でしょ無理でしょ

Page 49: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

足りないでしょ足りないでしょ

Page 50: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

50枚は必要でしょ50枚は必要でしょ

Page 51: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

ということで ということで 書いてみた書いてみた

Page 52: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

「ハロー "Hello, World"」「ハロー "Hello, World"」

Page 53: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)
Page 54: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

(当初の予定)(当初の予定)

ハロー・ワールドについて ハロー・ワールドについて いろんな視点から説明した いろんな視点から説明した 150ページくらいの薄い本150ページくらいの薄い本

Page 55: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

(できあがったもの)(できあがったもの)

ハロー・ワールドについて ハロー・ワールドについて 徹底的に解析した 徹底的に解析した 450ページくらいの450ページくらいの薄くない本(またか)薄くない本(またか)

Page 56: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

注意注意

Page 57: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

C言語によるハロー・ワールドC言語によるハロー・ワールドの入門ですの入門です

ハロー・ワールドによるC言語ハロー・ワールドによるC言語の入門ではありませんの入門ではありません

Page 58: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

つまり つまり K&Rの前に読むべき K&Rの前に読むべき

スーパー入門書スーパー入門書

Page 59: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

ハロー・ワールドの ハロー・ワールドの 入門書なので入門書なので

Page 60: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

この本には この本には リスト1しか リスト1しか ありませんありません

Page 61: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

利用しているOSS 利用しているOSS (たいへんありがたい)(たいへんありがたい)

Linuxカーネル glibc Linuxカーネル glibc FreeBSD Newlib FreeBSD Newlib

GDB GCC binutils GDB GCC binutils CentOSCentOS

Page 62: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

内容内容

Page 63: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

(第1章)(第1章)

CentOS環境でハロー・ワーCentOS環境でハロー・ワールドをビルドして 逆アセンブルドをビルドして 逆アセンブル結果や実行ファイルの解析ル結果や実行ファイルの解析

結果を眺めてみたりする結果を眺めてみたりする

Page 64: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

(第2章)(第2章)

printf()の動作を知るためにprintf()の動作を知るためにデバッガで動的解析して シデバッガで動的解析して シ

ステムコールの呼出しまでをステムコールの呼出しまでを追う追う

Page 65: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

(第3章)(第3章)

LinuxカーネルのソースコーLinuxカーネルのソースコードを読んで,Linuxのシステムドを読んで,Linuxのシステム

コール処理を探るコール処理を探る

Page 66: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

(第4章)(第4章)

標準ライブラリのソースコー標準ライブラリのソースコードを読んでシステムコールのドを読んでシステムコールの呼出し処理を知る. ついでに呼出し処理を知る. ついでにビルドして動的解析で処理をビルドして動的解析で処理を

追う追う

Page 67: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

(第5章)(第5章)

main()関数が呼ばれる前のmain()関数が呼ばれる前のスタートアップの処理と,スタートアップの処理と,main()関数から戻った後のmain()関数から戻った後の

終了処理を探る終了処理を探る

Page 68: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

(第6章)(第6章)

標準ライブラリのソースコー標準ライブラリのソースコードを読んでprintf()の実装をドを読んでprintf()の実装を知る. FreeBSDやNewlibの知る. FreeBSDやNewlibの

実装も見てみる実装も見てみる

Page 69: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

こんなのが延々と続く, こんなのが延々と続く, (自己評価で)最高に面白い本(自己評価で)最高に面白い本

Page 70: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

他にも実行ファイル解析 他にも実行ファイル解析 共有ライブラリ 共有ライブラリ

最適化 最適化 可変長引数などの話もあり可変長引数などの話もあり

Page 71: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

Linux/x86だけでなく Linux/x86だけでなく FreeBSDやARMなど FreeBSDやARMなど

他実装/アーキの話題もあり 他実装/アーキの話題もあり (このへんが特色)(このへんが特色)

Page 72: 続・ハロー・ワールド入門(オープンソースカンファレンス2016 Tokyo/Spring ライトニングトーク)

どうもありがとうどうもありがとうございましたございました