Slide 1

Slide 1 text

ターミナル遊び コンティオ プル @GolDDranks Shinjuku.rs #2 2019/1/16

Slide 2

Slide 2 text

自己紹介 • コンティオ プル • Twitter: @GolDDranks • GitHub & GitLab: golddranks • 出身地はフィンランドのシポーという田舎町 • ソフトウェアエンジニア歴2年 • (昔休学してゲームプログラマーやった黒歴史もあるが) • Rust愛する歴n年 (0.11あたりから使っている) • 最近スーパマリオデッセイを始めた & 線形論理に興味津々

Slide 3

Slide 3 text

年末年始は暇!どうしようと? • 何かプログラミングしたい • でも仕事周りのものから開放されたい!

Slide 4

Slide 4 text

SANDSPIEL • すなめ世界(WORLD OF SAND) のクローン • Rust製 • 似たようなものを作りたくなる

Slide 5

Slide 5 text

• Sandspielと同様にWASMで?丸パクリになるやんけ! • Amethyst? • ggez? • 単純にSDLを使う? • 日本企業の休みは短い!こんなの覚える暇なんてあるかボケ! インタラクティブなものを作るには?

Slide 6

Slide 6 text

極めて簡単なのを作りたい → ターミナルを導入

Slide 7

Slide 7 text

NCURSESを使う? • 一番まっとうなチョイスかも • Windowsも対応できそう? • Rust製ではない • もっと…楽しみに柄勉強になる経験はないか?

Slide 8

Slide 8 text

作ってみたライブラリ:TERM_FB •TERM = ターミナル •FB = フレームバッファ

Slide 9

Slide 9 text

ポイント • イベントループがある • 入力を文字として 受け取って、 「ボタン押しイベント」 のイテレータに変換 • バッファにcharを書くだけで ASCIIアートが描ける

Slide 10

Slide 10 text

デモタイム

Slide 11

Slide 11 text

学び・気づき ANSIエスケープコード • ↑ ¥x1b[A • ↓ ¥x1b[B • などのCSIシーケンス • UNIXだから¥nで済むと思いきや…RAW MODEが違う! • カーソルの表示、非表示

Slide 12

Slide 12 text

学び・気づき TERMIOS & RAW MODE • エスケープコードでなんでもできちゃう…というわけでもない • 標準入出力で出来ることを超えるには、デバイスの設定を直接いじる • RAW MODE:バッファリングとエコーを無効に • termiosライブラリでもっと 高度な制御が出来る • POSIXなので、標準化されている(Windows以外は)

Slide 13

Slide 13 text

学び・気づき 全角の面倒くささ • 端末エミュレータの挙動も 微妙に違ったり orz • unicode-widthという crateを使っている

Slide 14

Slide 14 text

共有したいパターン ダブルバッファリング •グラフィックプログラミングから •今使用中のバッファを変えるならアトミックにswap! •CrossbeamのAtomicCellが便利

Slide 15

Slide 15 text

共有したいパターン スピンスリープ •std::thread::sleepの精度が雑!寝坊しちゃうかも! •少なめにスリープして、後は時計を見ながら待つ → 精度が上がる •spin_sleepというcrateで簡単!

Slide 16

Slide 16 text

TERM_FBの0.0.1を今日公開しました! •https://gitlab.com/golddranks/term_fb •これからの課題:端末からの開放 & 色

Slide 17

Slide 17 text

ご清聴ありがとうございました! (結局砂ゲームまでやってない…) • Twitter: @GolDDranks • GitHub / GitLab: golddranks