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
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
680
正規表現とReDoS.pdf
akatsukinewgrad
0
660
Unityで大量のオブジェクト_を吹き飛ばしたい.pdf
akatsukinewgrad
0
710
新卒2年目が思う1年目の学び.pdf
akatsukinewgrad
0
640
障害訓練の取り組みについて.pdf
akatsukinewgrad
0
820
7分でわかるアカツキゲームス
akatsukinewgrad
0
670
Bitcoinだけでスマートコントラクト.pdf
akatsukinewgrad
1
1.1k
Other Decks in Programming
See All in Programming
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
200
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
510
AIを紡ぐPMのお話
swdtkuy
0
110
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
19k
Google Apps Script で Ruby を動かす
kawahara
0
270
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
800
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
240
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
200
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.8k
FDEが実現するAI駆動経営の現在地
gonta
2
290
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.3k
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
250
Featured
See All Featured
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
2
3.8k
Discover your Explorer Soul
emna__ayadi
2
1.3k
We Have a Design System, Now What?
morganepeng
55
8.3k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
250
How to make the Groovebox
asonas
2
2.3k
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
The Curious Case for Waylosing
cassininazir
1
460
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
420
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
280
The Mindset for Success: Future Career Progression
greggifford
PRO
0
450
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
990
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の正しい使い⽅ではないので注意 ご清聴ありがとうございました