Rust.Tokyo 2019参加レポート

# Rust.Tokyo 2019参加レポート

Rustのone-day conferenceに参加した時の情報をお送りします。ここに書いているのは私個人のメモレベルなので、詳細は講演者の方々が公開して下さっているスライドなどをご参照ください。

[Rust.Tokyo 2019](https://rust.tokyo/)

## 追記 2019/10/31

公式サイトのほうで発表資料を公開できるよう準備してくださっているようです。すでにアクセスできる資料を探すには下記のTogetterが役立つかもしれません。
https://togetter.com/li/1422930

## 開催のきっかけ

2018/11/26に@dorayaki_kunさんがTwitterでつぶやいたことがきっかけとなり、その約1年後に開催にいたった。中心メンバーは先のつぶやきにすぐに賛同した@chikoskiさん、@T5ku5shiさん、@helloyuki_さんの4人だったそうです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">RustのTechカンファ、日本で開きたいですよね！と言われて<br>確かに〜となった</p>&mdash; どらやき (@dorayaki_kun) <a href="https://twitter.com/dorayaki_kun/status/1067051099150966784?ref_src=twsrc%5Etfw">November 26, 2018</a></blockquote>

## Conferenceの目的

* もっとRustを盛り上げたい
* Rustを好きな人をつなげたい

## 日時/場所

* 開催日時: 2019年10月26日 10:00~18:00
* 場所: グラントウキョウサウスタワー41F

## 要約

Rustはゼロコストの抽象化を実現するシステム用の言語であり、言語の仕様レベルでマルチスレッドの安全性が保障されています。その応用範囲は非常に広く、組込みからWebフロントエンドにおいて活用され始めています。

このone-day Cunferenceでは、組み込みの画像認識に関するシステム開発や数値計算での採用事例や、WebAssemblyへのコンパイルを通したWeb appにおける開発のティップスなどが紹介されていました。講演資料を公開してくれている方が多くいらっしゃいましたので、興味のあるテーマがありましたらぜひそちらをご参照ください。

### 目次

* Seminor 1 : Visualization of mechanical CAD drawings using WebAssembly and WebGL
* Seminor 2 : エッジMLシステムをC/C++からRustへ移行した事例
* Seminor 3 : Rustによる数値計算の現状と課題
* Seminor 4 : Web-based Data Visualization with Rust and WebAssembly
* Seminor 5 : Porting Rust libstd to NuttX/Cortex-M4F and prototyping a simple web server
* Seminor 6 : Webフレームワークを作成してみた話

## Seminor 1 : Visualization of mechanical CAD drawings using WebAssembly and WebGL

### 発表者

* 小橋 昭文さん
* CADDi (Gold Sponsor) CTO

CADソフトの開発にWebAssemblyとWebGL使った事例紹介

Webアプリの可能性に挑戦している印象でした。

#### WebAssemblyへの注目

Webアプリのフロントエンドの役割が年々大きくなる中で、より小さく高速な実行環境が必要とされてきた。そのような背景の下で誕生したのがWebAssemblyである。

WebAssemblyの採用例としては次のようなものがある。

* [Figma](https://www.figma.com/)
  * [WebAssembly cut Figma's load time by 3x](https://www.figma.com/blog/webassembly-cut-figmas-load-time-by-3x/)
* [Unity](https://unity.com/)
  * [WebAssembly is here!](https://blogs.unity3d.com/2018/08/15/webassembly-is-here/)
* [ebay](https://www.ebay.com)
  * [WebAssembly at eBay: A Real-World Use Case](https://tech.ebayinc.com/engineering/webassembly-at-ebay-a-real-world-use-case/)
* [1Password]
  * [1Password X: May 2019 update](https://blog.1password.com/1password-x-may-2019-update/)

#### WebAssemblyでの開発にRustを使うメリット

* Rustそのものが持つメモリ等の安全性と、WebAssemblyへのコンパイルの容易さを享受できる
* RustとJavaScriptの相互呼び出しが用意
  * [wasm-bindgen](https://rustwasm.github.io/docs/wasm-bindgen/introduction.html)
* WebGLの利用のしやすさ
  * [kiss3d](https://docs.rs/kiss3d)
* DXF等のCADファイルへの対応
  * [dfx](https://docs.rs/dxf)

## Seminor 2 : エッジMLシステムをC/C++からRustへ移行した事例

* 加藤 倫弘さん
* DeNA
* 講演資料
  * [https://docs.google.com/presentation/d/1HOL9jheJnKkh2q7w3hU_px-je1qL7lxrSXV-0P1hces/edit#slide=id.p1](https://docs.google.com/presentation/d/1HOL9jheJnKkh2q7w3hU_px-je1qL7lxrSXV-0P1hces/edit#slide=id.p1)

ドライブレコーダにDeep Learningを用いたコンピュータビジョン技術を実装するためにRustを利用。もともとC/C++を利用していたが、次のような課題を抱えていた。

* R&DではPythonで作ってそれを組み込みに移植に時間がかかる
* 高速な行列演算を作りこむのに時間がかかる
* 仕様変更や追加開発に対応するための大規模な修正が難しい

### Rustへの移行の決め手

* C/C++と同等の性能を示すベンチマーク
* クロスコンパイルのサポート
  * 標準ライブラリ(std)が使える
  * 発表者はターゲットの名言を避けたが、おそらく[Rust Platform Support](https://forge.rust-lang.org/release/platform-support.html)のTier2レベルのどれかかと思われる。
* テストやビルド、ドキュメントなどのシステムが言語として十分にサポートされている
  * 開発チームごとのオレオレフレームワークが生じにくい
* Pythonのパッケージとしてビルドすることも容易
  * [PyO3](https://pyo3.rs)

## Seminor 3 : Rustによる数値計算の現状と課題

* Toshiki Teramuraさん
* 株式会社科学総合研究所
* 講演資料
  * [https://docs.google.com/presentation/d/1iujcfg2y3CMMgEO8BvX2__w_dbl4zQWQrK3ULaStD4E/edit#slide=id.p](https://docs.google.com/presentation/d/1iujcfg2y3CMMgEO8BvX2__w_dbl4zQWQrK3ULaStD4E/edit#slide=id.p)

### 数値計算とRustの言語仕様

* LLVMを通した最適化でCと同程度に高速化できる
* Traitを用いた抽象化が可能
  * 同様のことはC++のconceptでも実現できるが、C++20への対応が必須となる
  * 参考: [Constraints and Concepts](https://en.cppreference.com/w/cpp/language/constraints)

### 数値計算に便利なcrateの例

* [rayon](https://docs.rs/rayon)
  * work stealingによるデータ並列ライブラリ
* [num-traits](https://docs.rs/num-traits)
* [ndarray](https://docs.rs/ndarray)
  * NumPyに似た行列演算をRustで同じように利用できる

## Seminor 4 : Web-based Data Visualization with Rust and WebAssembly

* 尾上洋介さん
* 日本大学文理学部情報科学科准教授
* 講演資料
  * [https://speakerdeck.com/likr/web-based-data-visualization-with-rust-and-webassembly](https://speakerdeck.com/likr/web-based-data-visualization-with-rust-and-webassembly)

### データの可視化をもっと手軽に

Seminort 1でもあったが、専用のアプリとしてではなく、ブラウザがあればどこでもデータを可視化できるツールを作りたいのが動機。

### wasm-packのティップス

* wasm-packでのビルド
  * `wasm-pack build`
* npmパッケージとして公開
  * `wasm-pack publish`
* Google Chromeを実行環境としたテストの実行
  * `wasm-pack test --chrome`

### wasmの今後

wasmのパフォーマンスを向上させるために、今後も下記のような機能が追加されていくらしい。

* pthread likeなスレッドのサポート
* SIMDのサポート

## Seminor 5 : Porting Rust libstd to NuttX/Cortex-M4F and prototyping a simple web server

* Yoshinori Suginoさん
* Sony Home Entertainment & Sound Products Inc.

Posix対応のreal-time OSであるNuttXをターゲットにRustを使ってどうにかこうにかクロスコンパイルした経験談。

## Seminor 6 : Webフレームワークを作成してみた話

* 原 将己さん
* WANTEDLY

Rust 1.39でasync/awaitの安定化が予定されているが、それに伴ってWebのバックエンドとしても使いやすくなることが期待されている。講演者それを勝機と狙ってRustの機能を利用しながら、RustらしいWebフレームワークの構築([nails](https://github.com/qnighy/nails))に取り組んだ事例の紹介でした。

## その他(資料のみ)

* [Secure Coding Practice in Rust](https://speakerdeck.com/osuke/secure-coding-practice-in-rust)
* [Rust製テキストエディタでFuzzingする話](https://speakerdeck.com/rhysd/fuzzing-rust-text-editor)
* kenkooooさんのRust製ウェブアプリ [kenkoooo/AtCoderProblems](https://github.com/kenkoooo/AtCoderProblems/)