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
2k
2048作ってみた
akatsukinewgrad
March 05, 2021
Tweet
Share
More Decks by akatsukinewgrad
See All by akatsukinewgrad
2023/1/25_QAテスター meet up!
akatsukinewgrad
0
140
成果発表資料.pdf
akatsukinewgrad
0
2.1k
広大なフィールドを気持ちよく駆け抜けるための技術.pdf
akatsukinewgrad
0
580
正規表現とReDoS.pdf
akatsukinewgrad
0
570
Unityで大量のオブジェクト_を吹き飛ばしたい.pdf
akatsukinewgrad
0
620
新卒2年目が思う1年目の学び.pdf
akatsukinewgrad
0
540
障害訓練の取り組みについて.pdf
akatsukinewgrad
0
720
7分でわかるアカツキゲームス
akatsukinewgrad
0
580
Bitcoinだけでスマートコントラクト.pdf
akatsukinewgrad
1
950
Other Decks in Programming
See All in Programming
Software Architecture
hschwentner
6
2.3k
Leading Effective Engineering Teams in the AI Era
addyosmani
6
440
私はどうやって技術力を上げたのか
yusukebe
43
19k
実践Claude Code:20の失敗から学ぶAIペアプログラミング
takedatakashi
1
140
Foundation Modelsを実装日本語学習アプリを作ってみた!
hypebeans
0
110
NixOS + Kubernetesで構築する自宅サーバーのすべて
ichi_h3
0
870
エンジニアインターン「Treasure」とHonoの2年、そして未来へ / Our Journey with Hono Two Years at Treasure and Beyond
carta_engineering
0
140
Introducing ReActionView: A new ActionView-Compatible ERB Engine @ Kaigi on Rails 2025, Tokyo, Japan
marcoroth
3
1k
CSC509 Lecture 04
javiergs
PRO
0
300
All About Angular's New Signal Forms
manfredsteyer
PRO
0
160
CSC509 Lecture 05
javiergs
PRO
0
300
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
360
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1032
470k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
KATA
mclloyd
32
15k
4 Signs Your Business is Dying
shpigford
185
22k
We Have a Design System, Now What?
morganepeng
53
7.8k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
31
2.7k
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
35
6.1k
A Tale of Four Properties
chriscoyier
161
23k
Keith and Marios Guide to Fast Websites
keithpitt
411
23k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Making the Leap to Tech Lead
cromwellryan
135
9.6k
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の正しい使い⽅ではないので注意 ご清聴ありがとうございました