Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
2048作ってみた
Search
akatsukinewgrad
March 05, 2021
Programming
0
1.9k
2048作ってみた
akatsukinewgrad
March 05, 2021
Tweet
Share
More Decks by akatsukinewgrad
See All by akatsukinewgrad
2023/1/25_QAテスター meet up!
akatsukinewgrad
0
100
成果発表資料.pdf
akatsukinewgrad
0
1.9k
広大なフィールドを気持ちよく駆け抜けるための技術.pdf
akatsukinewgrad
0
460
正規表現とReDoS.pdf
akatsukinewgrad
0
470
Unityで大量のオブジェクト_を吹き飛ばしたい.pdf
akatsukinewgrad
0
490
新卒2年目が思う1年目の学び.pdf
akatsukinewgrad
0
440
障害訓練の取り組みについて.pdf
akatsukinewgrad
0
560
7分でわかるアカツキゲームス
akatsukinewgrad
0
480
Bitcoinだけでスマートコントラクト.pdf
akatsukinewgrad
1
740
Other Decks in Programming
See All in Programming
Pinia Colada が実現するスマートな非同期処理
naokihaba
4
230
Why Jakarta EE Matters to Spring - and Vice Versa
ivargrimstad
0
1.1k
Kaigi on Rails 2024 〜運営の裏側〜
krpk1900
1
230
Snowflake x dbtで作るセキュアでアジャイルなデータ基盤
tsoshiro
2
520
subpath importsで始めるモック生活
10tera
0
310
ヤプリ新卒SREの オンボーディング
masaki12
0
130
TypeScript Graph でコードレビューの心理的障壁を乗り越える
ysk8hori
2
1.1k
cmp.Or に感動した
otakakot
3
200
エンジニアとして関わる要件と仕様(公開用)
murabayashi
0
300
flutterkaigi_2024.pdf
kyoheig3
0
150
みんなでプロポーザルを書いてみた
yuriko1211
0
280
『ドメイン駆動設計をはじめよう』のモデリングアプローチ
masuda220
PRO
8
540
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
Site-Speed That Sticks
csswizardry
0
28
Designing on Purpose - Digital PM Summit 2013
jponch
115
7k
Happy Clients
brianwarren
98
6.7k
How to train your dragon (web standard)
notwaldorf
88
5.7k
Building a Scalable Design System with Sketch
lauravandoore
459
33k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
GitHub's CSS Performance
jonrohan
1030
460k
Navigating Team Friction
lara
183
14k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Git: the NoSQL Database
bkeepers
PRO
427
64k
Transcript
Akatsuki サーバサイドエンジニア 柴原 2048作ってみた
1/5 ⾃⼰紹介 • 名前:柴原 • 職種: 20新卒サーバエンジニア • 趣味:アイマス,コーヒー •
年齢:25歳(調査平均約34歳) • ブーム:お酒を飲みながら 友⼈とアイマスライブBD観戦
2/5 2 4 4 8 2 16 32 2 2
16 2048って? • 4×4のマス • 数字のタイル • 同じ数字同⼠が重なると ⾜し算される
2/5 2 4 4 8 2 16 32 2 2
16 2048って? • 4×4のマス • 数字のタイル • 同じ数字同⼠が重なると ⾜し算される
2 4 4 8 2 16 32 4 16 2/5
2048って? • 4×4のマス • 数字のタイル • 同じ数字同⼠が重なると ⾜し算される 2+ 2 = 4
2/5 2 4 4 8 2 16 32 4 2048
2048って? • 4×4のマス • 数字のタイル • 同じ数字同⼠が重なると ⾜し算される • ⾜し算を繰り返し 2048を作る
ということで 3/5
4/5 作りました!
終わり 5/5
6/18 ここで終わる 訳はない
キーワードは 「bpftrace」 7/18
キーワードは 「bpftrace」 7/18 このbpftraceで 2048を作成しました
キーワードは 「bpftrace」 7/18
8/18 BPFとは • BPF = Berkeley Packet Filter • UNIXでパケットキャプチャ・フィルタリング
を効率的にするために開発されたソフトウェア • Linux kernelにも移植されてます
9/18 BPFプ ログラム バイト コード bpf(2) 検証器 (Verifier) BPF sockets
tracepoints kprobes uprobes BPF map ユーザ プログラム read(2) bpfの全体像 ユーザ空間 カーネル空間
9/18 BPFプ ログラム バイト コード bpf(2) 検証器 (Verifier) BPF sockets
tracepoints kprobes uprobes BPF map ユーザ プログラム read(2) bpfの全体像 コンパイル ユーザ空間 カーネル空間
9/18 BPFプ ログラム バイト コード bpf(2) 検証器 (Verifier) BPF sockets
tracepoints kprobes uprobes BPF map ユーザ プログラム read(2) bpfの全体像 bpfシステムコール を利⽤してカーネル にロード ユーザ空間 カーネル空間
9/18 BPFプ ログラム バイト コード bpf(2) 検証器 (Verifier) BPF sockets
tracepoints kprobes uprobes BPF map ユーザ プログラム read(2) bpfの全体像 ・無限ループがないこと ・未初期化のレジスタを利⽤しないこと など安全性を検証している 検証器でプログラム の安全性を確認して ロード完了 ユーザ空間 カーネル空間
9/18 BPFプ ログラム バイト コード bpf(2) 検証器 (Verifier) BPF sockets
tracepoints kprobes uprobes BPF map ユーザ プログラム read(2) bpfの全体像 BPFプログラムとやりとりが必要な場合, BPFマップを作成し,BPFマップにアク セ スしてデータを読み書きして保存 ユーザ空間 カーネル空間
9/18 BPFプ ログラム バイト コード bpf(2) 検証器 (Verifier) BPF sockets
tracepoints kprobes uprobes BPF map ユーザ プログラム read(2) bpfの全体像 必要な場合はユーザ空間で取得 ユーザ空間 カーネル空間
検証器 (Verifier) BPF sockets tracepoints kprobes uprobes BPF map 9/18
BPFプ ログラム バイト コード bpf(2) ユーザ プログラム read(2) bpfの全体像 BPFプログラムをこれらのイベン トソースを使ってアタッチする ユーザ空間 カーネル空間
検証器 (Verifier) BPF sockets tracepoints kprobes uprobes BPF map 9/18
BPFプ ログラム バイト コード bpf(2) ユーザ プログラム read(2) bpfの全体像 イベントが発⽣すると,BPFプログ ラムが呼び出され,処理を実⾏する ユーザ空間 カーネル空間
10/18 ではbpftraceとは • BPFを利⽤したトレーシングツール • トレーシング処理を専⽤の⾔語で記述 • 主要トレーシング機能をサポート • カーネルトレーシング
• tracepoints, kprobes, kfuncs, perf event • ユーザプログラムトレーシング • uprobes, Userland Statically Defined Tracing
11/18 Bpftraceの⽤途 • Linuxカーネル内で何か問題起きた時 解析に有⽤で強⼒なデバッグツール • printfデバッグ的に使ったり • データを処理するコードを組み込んで, 統計を取るなど⾼度な分析が可能
12/18 bpftrace2048 • ゲーム操作の⼊⼒
12/18 bpftrace2048 • ゲーム操作の⼊⼒ • 盤⾯の表⽰
12/18 bpftrace2048 • ゲーム操作の⼊⼒ • 盤⾯の表⽰ • 盤⾯の値
13/18 ゲーム操作の⼊⼒ • キーボードドライバのイベント関数(kbd_event) • 本体に接続されたPS/2やUSBキーボード でないと動作しない
13/18 ゲーム操作の⼊⼒ • キーボードドライバのイベント関数(kbd_event) • 本体に接続されたPS/2やUSBキーボード でないと動作しない ssh環境でも動作させるために • kprobes(カーネル空間の動的トレース)を使って
pty_write関数(擬似端末への書き込み) にフックして⼊⼒を受け付けるようにした
14/18 盤⾯の表⽰ • 操作がされると盤⾯の状態が変わるため 変わる度に盤⾯を表⽰しなおす必要がある
14/18 盤⾯の表⽰ • 操作がされると盤⾯の状態が変わるため 変わる度に盤⾯を表⽰しなおす必要がある • perf(Linuxの性能解析ツール)のcpu clockの software eventにプログラムをアタッチし,
⼀定間隔で再描画している
15/18 盤⾯の値 • 毎回呼び出すためBPF mapに盤⾯の値を保存 • 再描画される時にBPFプログラム側から perf_event_outputでメッセージを出⼒ • メッセージを受け取ったbpftaraceプログラムが
ANSIエスケープシーケンス を利⽤して描画
16/18 デモ • 実際にお⾒せしよう!
17/18 実装についての感想(⾟い点) • 関数に分割できないの⾟すぎ • ループ回数の決まってないループは書けないの で⼯夫が必要になる • また,LOGのサイズをオーバーするためビルド しなおしたりする必要が出てくる
18/18 まとめ • 今回はカーネルで動作する2048を作ってみた • 制約はあるが,カーネルで動作するゲームは作 る事ができる • 他にも,遊び要素を含むものを作る事ができる (wi-fi強度を⽤いた楽器をbpftraceで作った⼈も
いる) • bpftraceの正しい使い⽅ではないので注意 ご清聴ありがとうございました