会社でRust dojoをはじめた

先週宣言した通り、Rust dojoの始まり。

 

kdnakt.hatenablog.com

 

 

[きっかけ]

先のブログにも書いた通り、Kotlinの教材を一通りやってみたので、昨年冬にt_wadaさんが弊社での講演でおっしゃっていた「毎年少なくとも一つの言語を学習する」を実践するべく、Rustに取り組んでいくことになった。

kdnakt.hatenablog.com

 

 

前身のKotlin dojoは1年半71回開催して、最後1年くらいは3-6人程度でこぢんまりと演習問題やハンズオンに取り組んでいた。

Rust dojoも、普段仕事でJavaJavaScriptを触っている人たちだからそんなに興味ないかな、と思っていた。しかし、いざ始まってみると、口コミで広まったのか第1回に参加してくれたメンバーは自分を含めて16人もいた。ありがたや🙏

Kotlin dojo(開始当初の名前はKotlin勉強会)は初回こそ3人と少なかったものの、最初の3ヶ月ほどは5~11人程度で開催していたので、それと比べるとなんと多いことか。そんなにみんなRustに興味あるのかしら?

 

kdnakt.hatenablog.com

そしてよくよくKotlin dojoの開催経緯を見直してみると、Rustを布教しようとしていたメンバーがいた。彼はRust dojoにも参加してくれていて、いろいろ教えてくれるのでとてもありがたい🙏

 

[第1回の様子]

というわけで、2021/07/14に第1回を開催した。

 

 

教材はRust By Example 日本語版を利用することに。個人的に、2年前に一度英語版のRust By Exampleを最後まで写経したのだが、全く忘れてしまっているので新鮮な気持ちで取り組んでいく。

doc.rust-jp.rs

 

初回なので僭越ながら主催者としてドライバーをやらせていただいた。先日までのMacBook不調は、MacBookからは画面共有のみとし、カメラはスマホを利用することで事なきを得た。最近はスマホGoogle Meetでも背景を変えられるようになったので、汚い部屋を見せなくて済んだ。

 

16人もいるのでナビゲータうまくいくかな、とやや不安はあったものの、既にRustやその他の言語に詳しい方々は熱い解説を挟んでくださるし、黙っていた他のナビゲータの方々も自分のPCで実際にRustをインストールしたりRustのコードを動かしてみたりと、やりたいようにやれていたようだった。

 

開催前後のSlackでのRust関連のやりとりも活発だったのでとても良かった。

1週間前の開催予告に反応してくれる人がいたり。

f:id:kidani_a:20210715010157p:plain

 

Rust専用チャンネルではツールの紹介をしてくれる人がいたり。

f:id:kidani_a:20210714235237p:plain

 

参加後に分報で感想を言ってくれる人がいたり。

f:id:kidani_a:20210714235446p:plain

f:id:kidani_a:20210714235027p:plain

f:id:kidani_a:20210715005848p:plain

 

参加できずに残念がってくれる人がいたり。

f:id:kidani_a:20210715000047p:plain

f:id:kidani_a:20210715005745p:plain

 

Rust専用チャンネルで分からなかったところを質問したり、それに答えたり。

f:id:kidani_a:20210714235744p:plain

 

終わってからブログ書いてくれたり。

 

この盛り上がりがしばらく続くといいな!

 

[学んだこと]

  • まずはRustをインストール

www.rust-lang.org

    • 指示されたコマンドを実行するだけ。途中でインストール方法を聞かれたがデフォルトで良いとのこと。
% curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
info: downloading installer

Welcome to Rust!

This will download and install the official compiler for the Rust
programming language, and its package manager, Cargo.

Rustup metadata and toolchains will be installed into the Rustup
home directory, located at:

  /Users/xxxxx/.rustup

This can be modified with the RUSTUP_HOME environment variable.

The Cargo home directory located at:

  /Users/xxxxx/.cargo

This can be modified with the CARGO_HOME environment variable.

The cargo, rustc, rustup and other commands will be added to
Cargo's bin directory, located at:

  /Users/xxxxx/.cargo/bin

This path will then be added to your PATH environment variable by
modifying the profile files located at:

  /Users/xxxxx/.profile
  /Users/xxxxx/.zshenv

You can uninstall at any time with rustup self uninstall and
these changes will be reverted.

Current installation options:


   default host triple: x86_64-apple-darwin
     default toolchain: stable (default)
               profile: default
  modify PATH variable: yes

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>1

info: profile set to 'default'
info: default host triple is x86_64-apple-darwin
info: syncing channel updates for 'stable-x86_64-apple-darwin'
info: latest update on 2021-06-17, rust version 1.53.0 (53cb7b09b 2021-06-17)
info: downloading component 'cargo'
info: downloading component 'clippy'
info: downloading component 'rust-docs'
info: downloading component 'rust-std'
 24.4 MiB /  24.4 MiB (100 %)  20.5 MiB/s in  1s ETA:  0s
info: downloading component 'rustc'
 58.6 MiB /  58.6 MiB (100 %)  19.5 MiB/s in  3s ETA:  0s
info: downloading component 'rustfmt'
info: installing component 'cargo'
info: installing component 'clippy'
info: installing component 'rust-docs'
 16.1 MiB /  16.1 MiB (100 %)   3.3 MiB/s in  3s ETA:  0s
info: installing component 'rust-std'
 24.4 MiB /  24.4 MiB (100 %)  10.1 MiB/s in  2s ETA:  0s
info: installing component 'rustc'
 58.6 MiB /  58.6 MiB (100 %)  12.5 MiB/s in  4s ETA:  0s
info: installing component 'rustfmt'
info: default toolchain set to 'stable-x86_64-apple-darwin'

  stable-x86_64-apple-darwin installed - rustc 1.53.0 (53cb7b09b 2021-06-17)


Rust is installed now. Great!

To get started you may need to restart your current shell.
This would reload your PATH environment variable to include
Cargo's bin directory ($HOME/.cargo/bin).

To configure your current shell, run:
source $HOME/.cargo/env
    • そのままRustを使おうとしたがコマンドが見つからずエラーになったので、インストール時の最後のメッセージにしたがってsource $HOME/.cargo/envを実行した
  • ようやく本編、まずは目次を眺める
    • Rustはシステムプログラミング用の言語
    • システムプログラミングって?となったのでWikipediaを参照。ハードウェアを操作したり、アプリケーションのプラットフォームを提供するものらしい。ふむふむ
    • 全体の流れとしては、Hello Worldにはじまり、型、制御フロー、関数などと進んでいく様子。
  • さっそくHello World
    • 関数を宣言するときにはfn main() { ... }のようにするらしい。なんとなく思い出してきた。
    • Hello Worldはこんな感じになる
fn main() {
    println!("Hello World!"); // Hello World!
}
    • println!はマクロというらしい。難しいからとりあえずそういうものだと思っておけばよい、とのアドバイスをいただいた。
    • とりあえずブラウザ上でRunボタンを押して実行してみる。無事出力された。
    • 今度はRustをインストールしたばかりの自分のMacBookで動かしてみる:rustc hello.rsを実行する
% rustc hello.rs
error: cannot find macro `pritnln` in this scope
  --> hello.rs:2:5
   |
2  |       pritnln!("Hello World");
   |       ^^^^^^^ help: a macro with a similar name exists: `println`

error: aborting due to previous error
    • 1度目はタイポがあったためコンパイルエラーとなった。
    • ちゃんと親切に修正方法も教えてくれているので修正して再実行:今度はうまく動作した!やったー!
% rustc hello.rs
% ./hello
Hello World
    • 演習問題としてもう1行printlnを追加してみようというのがあったので、以下のように修正し、無事に動作した
fn main() {
    println!("Hello World");
    println!("I'm a Rustacean!");
}
    • ここで面白い情報を教えてもらった。関数の最後の行のセミコロンはなくても動くとのこと。
    • たしかに、以下のように修正してコンパイルしても動作した。
fn main() {
    println!("Hello World"); // セミコロンあり
    println!("I'm a Rustacean!") // セミコロンなし
}
    • OCamlとかいくつかの言語ではこういう仕組みらしい。returnの代わりにセミコロンなしで表現できるとのこと。だから最後の行だけなのか。なるほど。
  • 続いて、コメント
    • 通常のコメントは// 〜または/* 〜 */と書くらしい。このへんはJavaと一緒で安心
    • ドキュメンテーションコメントは/// 〜または//! 〜と書く。
    • テキストの日本語には訳されていなかったが、英語の部分を読むと、ブロックコメント(/* 〜 */)はネストさせることができるらしい。Javaなんかだとそれはできなかった気がするとか、パーサーががんばらないといけないとか、この話題でひとしきり盛り上がった。
    • 個人的には、ブロックコメントがデバッグに役立つかどうかはあまり理解できず
  • 最後に、フォーマットしてプリント
    • プリント関係のマクロは5つくらいある
format!("{} days", 31); // 31 daysのようにフォーマットしてくれる
print!("Hello"); // 標準出力
println!("Hello"); // 標準出力改行つき
eprint!("Hello"); // 標準エラー出力
eprintln!("Hello"); // 標準エラー出力改行つき
    • 31のように数値を書くと、i32型(32ビット整数)として扱われるらしい。31i64とすると64ビット。たしかにJavaでも31Lとか書くのでなんとなくこれは分かる。
    • 時間の関係でフォーマットの途中でおしまい。

 

[まとめ]

モブプログラミングスタイルでRust dojoをはじめた!

Hello Worldがローカルで動いて初めての「やったー!」ができた。来週は何回できるかな? 

 

今週のプルリクエストはこちら。

github.com