ARTICLES

令和元年より Rust の勉強を開始

2019-05-01

2018年元旦、 Julia を頑張ってみようと思い、学習を始めました。しかし、何故かフィットせず、Go 言語にはげむことになりました。

そもそも、そこまで時間をかけていなかったのもありますが、情熱が不足していました。仕事は今までほとんど関わってこなかったインフラ周りのポジションを担当することになったものの、徐々にフロントエンドの熱が増していく自分がいたのです。

さて、年が明けて 2019年。人生初の就職先であった Amazon を退職している中でごたごたして学習がはかどっていなく今に至ったのですが、令和になった今こそ、改めて今年の学習を決めていくことにしました。

タイトルにもあるように令和元年に仕事以外のプロジェクトとして学んでいきたいものとして Rust を選びました。Rust は以前少し学んだきり、よくわからないまま放置したので、ちゃんと挑戦してみます。

Rust programming language

Mozilla がブラウザのレンダリングエンジンを Rust で書き直したという話に以前から興味があり、ブラウザのレンダリング部分をより深く理解することで、フロントエンド力の強化につながるであろうという目標があります。WASM もチャレンジしていきたい。

ただし、目下のところ、言語や文化に慣れていくために、もう十年以上言語を変えつつ作り続けているキャプチャクローラーを Rust でリニューアルしてみようというマイプロジェクトから取り組んでいきます。自分のプロジェクトだから失敗しても誰にも迷惑がかからないのが魅力です。

Rocket という Web アプリケーションフレームワーク

さて、Rust に取り組んでいくにあたって、まずは、Web ベースで動いているキャプチャクローラーをリニューアルしていくという方向性は決まりました。手っ取り早く雑なものでもいいので、一通り作ってみるのがいいというのが僕の学習スタイルです。

さて、作ると決めたはいいものの、どのように作っていけばいいのか不明なので、既成の Web アプリケーションフレームワークで少しずつ作りつつ、学習していこうと考えました。

Web アプリケーションフレームワークを選ぶにあたり参考になったのは、以下の記事です。

その後、いろいろ調べて選んだのが Rocket です。

Rocket - Simple, Fast, Type -Safe Web Framework for Rust

思い立ったが吉日、すぐやります。

まず、自分の PC に入っている Rust のバージョンを調べてみます。以前 Rust を入れて遊んだ記憶があるのです。

$ cargo -V
cargo 0.23.0 (61fa02415 2017-11-22)

$ rustc -V
rustc 1.22.1 (05e2e1c41 2017-11-22)

$ rustup -V
rustup 1.7.0 (813f7b7a8 2017-10-30)

2017 年に遊んだきりだったことが確認できました。

続いて、rustup をアップデートし、アップデートします。

$ rustup self update
info: checking for self-updates
info: downloading self-update
info: rustup updated successfully to 1.18.1

$ rustup update

...
  stable-x86_64-apple-darwin updated - rustc 1.34.1 (fc50f328b 2019-04-24)

$ rustc -V          
rustc 1.34.1 (fc50f328b 2019-04-24)

$ cargo -V          
cargo 1.34.0 (6789d8a0a 2019-04-01)

バージョンが最新になりました!

Getting Started に沿って、進めてみます。

依存関係の記述やソースを記述すれば、すぐにスタートできるはずです。

Cargo.toml に以下を追記

[dependencies]
rocket = "0.4.0"

src/main.rs を以下のように記述

#![feature(proc_macro_hygiene, decl_macro)]

#[macro_use] extern crate rocket;

#[get("/")]
fn index() -> &'static str {
    "Hello, world!"
}

fn main() {
    rocket::ignite().mount("/", routes![index]).launch();
}

Getting Started の通りにしているので、何も新しいことはありません。

実行してみましょう。

error: failed to run custom build command for `pear_codegen v0.1.2`
...
--- stderr
Error: Pear requires a nightly or dev version of Rust.
Installed version is: 1.34.1 (2019-04-24). Minimum required: 1.31.0-nightly (2018-10-05).

...

warning: build failed, waiting for other jobs to finish...
error: build failed

最初からエラーですね。うん、まあ、新しいフレームワークとかに挑戦するといきなりコケるものです。そんなことではメゲません。

ちょっと調査をすると、Rocket は、nightly バージョンの Rust に依存した機能を使っているらしく、nightly でインストールする必要があるとのこと。

$ rustup default nightly

info: syncing channel updates for 'nightly-x86_64-apple-darwin'
info: latest update on 2019-05-01, rust version 1.36.0-nightly (7c71bc320 2019-04-30)
info: downloading component 'rustc'
 82.1 MiB /  82.1 MiB (100 %)  10.4 MiB/s ETA:   0 s
info: downloading component 'rust-std'
 55.2 MiB /  55.2 MiB (100 %)  10.1 MiB/s ETA:   0 s
info: downloading component 'cargo'
info: downloading component 'rust-docs'
 11.0 MiB /  11.0 MiB (100 %)   9.6 MiB/s ETA:   0 s
info: installing component 'rustc'
 82.1 MiB /  82.1 MiB (100 %)  10.9 MiB/s ETA:   0 s
info: installing component 'rust-std'
 55.2 MiB /  55.2 MiB (100 %)  14.4 MiB/s ETA:   0 s
info: installing component 'cargo'
info: installing component 'rust-docs'
 11.0 MiB /  11.0 MiB (100 %) 833.6 KiB/s ETA:   0 s
info: default toolchain set to 'nightly-x86_64-apple-darwin'

  nightly-x86_64-apple-darwin installed - rustc 1.36.0-nightly (7c71bc320 2019-04-30)

$ rustup override set nightly
info: using existing install for 'nightly-x86_64-apple-darwin'
info: override toolchain for '***/hello-rocket' set to 'nightly-x86_64-apple-darwin'

  nightly-x86_64-apple-darwin unchanged - rustc 1.36.0-nightly (7c71bc320 2019-04-30)

上記のようにインストールします。すると、

$ rustc -V                    
rustc 1.36.0-nightly (7c71bc320 2019-04-30)

$ cargo -V                    
cargo 1.36.0-nightly (6be12653d 2019-04-19)

nightly バージョンでインストールできました。

ということで実行してみます。

$ cargo run
...
    Finished dev [unoptimized + debuginfo] target(s) in 1m 45s
     Running `***/hello_world`
🔧 Configured for development.
    => address: localhost
    => port: 8000
    => log: normal
    => workers: 8
    => secret key: generated
    => limits: forms = 32KiB
    => keep-alive: 5s
    => tls: disabled
🛰  Mounting /:
    => GET / (hello)
🚀 Rocket has launched from http://localhost:8000

実行時に、絵文字が使われたり賑やかなターミナルになるのは魅力ですね。

ということで、KANSOCK.INDUSTRIES のサイドプロジェクトだけど大事なキャプチャクローラーのリニューアルプロジェクト、開始です。


ARTICLES


    AUTHOR

    原 一浩 の顔写真

    (はら) 一浩(かずひろ)

    カンソクインダストリーズ代表 / グレーティブ合同会社代表

    1998年に独立し、同年、ウェブデザイン専門のメールメディア DesignWedgeの発行を開始。Webデザイン業の傍ら、海外のWebデザインに関する情報発信を行う。
    雑誌への寄稿多数。主な著書に『はじめてのフロントエンド開発』『プロセスオブウェブデザイン』、『Play framework徹底入門』、『ウェブデザインコーディネートカタログ』など。自社製のWebデザインのクロール&キャプチャシステムvaqumをベースに、様々なリサーチを行っている。Web 検定プロジェクトメンバー

    著作一覧はこちら