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
2k
広大なフィールドを気持ちよく駆け抜けるための技術.pdf
akatsukinewgrad
0
570
正規表現とReDoS.pdf
akatsukinewgrad
0
560
Unityで大量のオブジェクト_を吹き飛ばしたい.pdf
akatsukinewgrad
0
610
新卒2年目が思う1年目の学び.pdf
akatsukinewgrad
0
530
障害訓練の取り組みについて.pdf
akatsukinewgrad
0
700
7分でわかるアカツキゲームス
akatsukinewgrad
0
570
Bitcoinだけでスマートコントラクト.pdf
akatsukinewgrad
1
920
Other Decks in Programming
See All in Programming
RDoc meets YARD
okuramasafumi
4
170
Android端末で実現するオンデバイスLLM 2025
masayukisuda
1
150
テストコードはもう書かない:JetBrains AI Assistantに委ねる非同期処理のテスト自動設計・生成
makun
0
300
HTMLの品質ってなんだっけ? “HTMLクライテリア”の設計と実践
unachang113
4
2.9k
機能追加とリーダー業務の類似性
rinchoku
2
1.3k
Oracle Database Technology Night 92 Database Connection control FAN-AC
oracle4engineer
PRO
1
440
AI Coding Agentのセキュリティリスク:PRの自己承認とメルカリの対策
s3h
0
230
Reading Rails 1.0 Source Code
okuramasafumi
0
220
testingを眺める
matumoto
1
140
Vue・React マルチプロダクト開発を支える Vite
andpad
0
110
[FEConf 2025] 모노레포 절망편, 14개 레포로 부활하기까지 걸린 1년
mmmaxkim
0
1.6k
旅行プランAIエージェント開発の裏側
ippo012
2
910
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
A designer walks into a library…
pauljervisheath
207
24k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Typedesign – Prime Four
hannesfritz
42
2.8k
Side Projects
sachag
455
43k
RailsConf 2023
tenderlove
30
1.2k
Agile that works and the tools we love
rasmusluckow
330
21k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
131
19k
Balancing Empowerment & Direction
lara
3
620
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
51
5.6k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
30
9.7k
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の正しい使い⽅ではないので注意 ご清聴ありがとうございました