Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
2048作ってみた
Search
akatsukinewgrad
March 05, 2021
Programming
2.1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
2048作ってみた
akatsukinewgrad
March 05, 2021
More Decks by akatsukinewgrad
See All by akatsukinewgrad
2023/1/25_QAテスター meet up!
akatsukinewgrad
0
180
成果発表資料.pdf
akatsukinewgrad
0
2.2k
広大なフィールドを気持ちよく駆け抜けるための技術.pdf
akatsukinewgrad
0
690
正規表現とReDoS.pdf
akatsukinewgrad
0
670
Unityで大量のオブジェクト_を吹き飛ばしたい.pdf
akatsukinewgrad
0
720
新卒2年目が思う1年目の学び.pdf
akatsukinewgrad
0
650
障害訓練の取り組みについて.pdf
akatsukinewgrad
0
830
7分でわかるアカツキゲームス
akatsukinewgrad
0
680
Bitcoinだけでスマートコントラクト.pdf
akatsukinewgrad
1
1.2k
Other Decks in Programming
See All in Programming
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
130
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
110
Webの地図
yosuke_furukawa
PRO
6
4.1k
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
150
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
600
What We Talk About When We Talk About XP
m_seki
2
490
WebMCP Challenge に星空観察アプリで参加した話
okajun35
0
140
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
280
Deep dive into the select statement (GopherCon UK)
jespino
0
170
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
210
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
250
XHTMLが残したもの
yosuke_furukawa
PRO
2
690
Featured
See All Featured
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.9k
The Spectacular Lies of Maps
axbom
PRO
1
990
Designing for humans not robots
tammielis
254
26k
The Curious Case for Waylosing
cassininazir
1
500
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
830
Optimising Largest Contentful Paint
csswizardry
37
3.9k
Building a Scalable Design System with Sketch
lauravandoore
464
34k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
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の正しい使い⽅ではないので注意 ご清聴ありがとうございました