shinjuku.rs #2: ターミナル遊び

60b23f3de35058180807f35b623fcf83?s=47 コン
January 16, 2019

shinjuku.rs #2: ターミナル遊び

年末年始の暇つぶしにターミナルフレームバッファのcrateを作ってみました。

なお、ついでにできた学びや気付きをシェア。

ぜひ触ってみて下さい!(まだAPI確定されていないので多少注意をして下さい。)
https://gitlab.com/golddranks/term_fb

60b23f3de35058180807f35b623fcf83?s=128

コン

January 16, 2019
Tweet

Transcript

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

  2. 自己紹介 • コンティオ プル • Twitter: @GolDDranks • GitHub &

    GitLab: golddranks • 出身地はフィンランドのシポーという田舎町 • ソフトウェアエンジニア歴2年 • (昔休学してゲームプログラマーやった黒歴史もあるが) • Rust愛する歴n年 (0.11あたりから使っている) • 最近スーパマリオデッセイを始めた & 線形論理に興味津々
  3. 年末年始は暇!どうしようと? • 何かプログラミングしたい • でも仕事周りのものから開放されたい!

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

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

    インタラクティブなものを作るには?
  6. 極めて簡単なのを作りたい → ターミナルを導入

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

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

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

    ASCIIアートが描ける
  10. デモタイム

  11. 学び・気づき ANSIエスケープコード • ↑ ¥x1b[A • ↓ ¥x1b[B • などのCSIシーケンス

    • UNIXだから¥nで済むと思いきや…RAW MODEが違う! • カーソルの表示、非表示
  12. 学び・気づき TERMIOS & RAW MODE • エスケープコードでなんでもできちゃう…というわけでもない • 標準入出力で出来ることを超えるには、デバイスの設定を直接いじる •

    RAW MODE:バッファリングとエコーを無効に • termiosライブラリでもっと 高度な制御が出来る • POSIXなので、標準化されている(Windows以外は)
  13. 学び・気づき 全角の面倒くささ • 端末エミュレータの挙動も 微妙に違ったり orz • unicode-widthという crateを使っている

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

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

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

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