北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

今日はRustのLT会 Shinjuku.rs #6 @FORCIAの日です

ブログ枠で RustのLT会 Shinjuku.rs #6 @FORCIA に来ています。ブログ枠が何をすればいいのかあまりわかってませんが、とりあえずブログにメモを残しておきます。

開会

  • 会場、懇親会はフォルシア株式会社さんが提供(ありがとうございます!)
  • 次回 11/19 で一周年

Rust初心者がRay Tracer書いてみた / keisukefukudaさん

  • 前回も初心者、相変わらず初心者
  • Ray Tracer は楽しいので、新しい言語を練習するときに良い
  • Ray Tracing とは?
    • 3Dのオブジェクトを平面に描画する
    • ちゃんと計算する
    • オフラインで時間をかけて
    • アルゴリズム、プログラムは以外に簡単。コアのロジックは数行
    • 線形代数は知っている必要がある
  • なぜ Ray Tracing ?
    • 最初のプログラムが複雑だと無理
    • 数値をはけばいいだけ
    • こり始めるといくらでもこれる
    • 絵が出るので楽しい
  • Ray Tracing in One Weekend
    • C++のコードをrustで写経する
    • 3次元ベクトルを定義し、内積などのメソッドを定義
  • ハマりどころ
    • 演算子オーバロード。C++だと簡単
      • std::ops::Add トレイトを実装
      • + だが、参照を取らなければならない
    • 添字演算子
      • std::ops::Index トレイトを実装
      • c++ の const / non-const の実装の分け方がわからない
  • 今後の展望
    • 特殊な Ray Tracer 、 SIMD 化、 WASM で動かす

ネタが無いので盛り上がるプログラムを作った / てくのたのしーさん

  • タイトルを100倍にすると盛り上がる
  • Filmarks さんから映画タイトルをスクレイピング
  • scraper reqwest クレートを利用
  • 8万5千タイトル
  • うち、数字っぽいもの 6500タイトル
    • 漢数字は未対応
  • 第5位「Tokyo 200100/1000/2100 2200:3200-2200:4100」
  • 第4位「貞子300D 200」次元の暴力
    • 次元系は他にたくさんある
  • 第3位「青鬼 ver.200.0」
  • 第2位「裁判長!ここは懲役400年でどうすか」
  • 第1位「永遠の0」 0には何をかけても0でした
  • まとめ
    • 6,000 タイトルに目を通すのは大変
    • ネタがないのにLTに申し込んではいけない
  • 番外編: マイナス2100度、5200Hzのラヴソング
  • Q). このプログラムはどこかに公開されますか
    • A). PR投げつけられそうで怖いが、公開します

最近お仕事で使ったcrateの話 / yukiさん

  • crateとは?
    • rustは標準ライブラリが少なめで、それを補完するもの
  • Rust をどこで使った? → ツール
    • 普段から Scala / Rust / C++ で作る
    • Scalaコンパイル遅い、Macでも動く、小さいと所有権とかではまらない
    • ツールはメンテ不要なので、導入しやすい
  • ansi_term
    • 修飾付きの文字を表示できるクレート
    • 斜体、256色
  • itertools
    • Scala にあるけど rust になかったやつ
    • イテレータに機能を追加するもの
    • chunks 決められた個数ずつに分割する
    • enumerate 添字をつける
    • cartesian_product デカルト
  • scraper reqwest
    • reqwest で HTML を拾って、 scraper で解析
  • chrono
  • 10/26 Rust Tokyo があるので来てね
  • Q). itertools は並列実行は?
    • A). ぱっと見なさそうだったが、あるかも
  • Q). Jst は自分で定義しないと駄目?
    • A). FixedOffset でおーけー
  • Q). 誰かがメンテしているタイムゾーンは?
    • A). なさそう
  • Q). タイムゾーンは相互変換できるから木にしなくていいのでは?
    • A). はい
  • Q). DateTime<Local>DateTime<Jst> の相互変換は?
    • A). 無理
  • Q). クレートはどう探しますか?
    • A). Awesome Rust を探す。更新が1年以内ならO.K.

Rustで10日でwebサービスつくった話 / ryusukefudaさん

  • 開発合宿で、未使用の技術でプロダクトを作っている
    • 去年は Go + Vue.js → プロダクトをリリース
    • 今年は Rust + web component を 4 名で
  • フレームワーク選定
    • actix-web VS rocket
    • HTTP2 のためにactix-web
  • DB選定
    • 使えるもの。MySQL
  • フロントバックエンドの通信
  • 他、 マイグレーションdiesel 、パッケージ管理に cargo
    • 選択肢がない
    • KVSはRedis
    • docker-compose で環境構築
  • 辛かったこと
    • 詰まる。詰まったときに救いがない
    • actix-web の API が苦しい。型指定など
    • actix と actix-web の棲み分けが不明
    • 通信処理。 future を使ったが、 tokio
    • Ruby/Goなら瞬殺できる実装を3hかかって性格が歪んだり
  • actix-cors actix-session actix-redis などを利用
  • 良かったこと
  • フロントの担当者は、WYSIWYG部分を作っていた
  • 予告: 次回はデプロイ編
    • デプロイに 50 分かかっている。ビルドが時間かかりすぎ
    • Cargo.toml をいじると時間がかかる
  • Q). 10日でfutureまで理解できるもの??
    • A). 人間にはちょっと早い。コンパイルを通す作戦に出た。途中から理解を辞めた
  • Q). デプロイ時間がGoだと?
    • A). 5分か10分。Rustはキャッシュ使っても35分。安いプランなので。
      • ローカルの Docker for Mac--release ビルドで6分くらい

What is std::sync::atomicについて / matsu7874

  • シングルスレッドではデータの更新は問題がない
  • マルチスレッドでは、書いている途中に読まれると、何が読まれるのか不明
  • 不可分にする、または、操作する数を 1 つにする
  • Atomic とは?
    • 書き込み途中に読まれない、読み込み途中に書かれない
  • std::sync::atomic Atomic型を提供する
    • Sync トレイトが実装されており、スレッド間共有が可能
    • Arc でラップして使う
  • Atomic 以外の方法
    • Mutex、 RWLock
    • 速度は "perormace comparison of mutex rwlock and atomic types in rust" というスライドを参照
    • Atomic が爆速
  • AtomicUsize 同士の比較をしたい
    • std::cmp::PartialEq トレイトを impl する必要がある
    • 自分で定義したトレイトまたは型しか impl できない
  • newtype パターンを使えば良い
    • struct Bar(Foo)
  • まとめ
    • スレッドでデータ共有するのであれば、専用の型が必要
    • Atomic が高速
    • new type パターンは便利

WebSocketで人生アガります / 宇宙ツイッタラーXさん

  • 最終的にはビットコインで人生がアガる予定(ライブコーディング)
  • main 関数を作る
  • bitFlyer API に rust サンプルがあるが、コンパイル通らない
  • struct Client
  • ws クレートの Handler トレイトを実装
  • on_open on_message を実装
  • connect 関数を利用。 Client 型で Sender 型を受け取って利用
  • 取引情報が欲しいので、 bord というチャネルを使う
  • on_open"lightning_board_BTC_JPY" チャネルを "subscribe" するメッセージを send する
  • on_messageMessage::Text を受け取った場合のみ定義する
  • 「皆さん、日常的にデシリアライズくらい毎日やってるわって感じでしょう」
  • serde::DeserializeJSON をパース
    • JSONからコードを自動生成するサイトがあるらしい
  • 変なJSONも来ていてエラー
    • 「怒りの unwrap をしていたけど辞めましょう」
    • シリアライズに成功したときのみ表示 → 成功
  • まとめ
    • リアルタイム取引は早いのがいい、 C++ は無理でしょう、 rust は適している