rustをやっていきたい
導入
自分が苦手意識を持っている言語は、いくつかあります。
と言っても特に使ったこともないんだけど、何故か苦手意識を持っています。
私が苦手な言語は、例えば、lisp, haskell, rustなどになるのですが、rust
に関しては、やっておいたほうがいいだろうということで、やっていきます。
ここで、私がなぜrustに苦手意識を持っているのかというと、多分、mdbookを使ってたことが起因していると思います。
mdbookというのは、gitbookをrustで書いたものなんですが、そこですごくハマったことがあったんですよね。依存パッケージのbuildとかも相当な時間がかかったりで、とにかく大変だった印象があるのです。
そんなこともあり、なんとなくrust
はなー…とか思ってたんですが、rust
を急にやってみたくなったので、やってみたいなーということで。
rust
c++の代替みたいな感じですかね。速いことで有名。single coreを余すことなく使うらしい。
基本的には、cargo
でinstallしたりbuildしたり。cargo.toml
を作ります。rocket
というフレームワークが便利そう。dbとの接続はdiesel
を使う感じ。
とりあえず、rocketから触ってみることに。
https://github.com/SergioBenitez/Rocket/tree/master/examples/json
api server立てるっぽいやつを動かしてみる。ここでコードの内容も見ていく。
$ rustc -V
$ cargo -V
$ git clone https://github.com/SergioBenitez/Rocket
$ cd Rocket/example/json
$ rustup override set nightly
$ cat Cargo.toml
$ cargo build
$ cargo run
$ cat src/main.rs
# check
$ curl localhost:8000/message/1
# post
$ curl -H 'Content-Type:application/json' -d '{ "contents": "Hello, world!" }' localhost:8000/message/1
# get
$ curl localhost:8000/message/1
次は、dbを組み合わせた感じのものを見ていきます。
$ heroku create $APP_NAME
$ heroku addons:create heroku-postgresql:hobby-dev -a $APP_NAME
$ heroku config -a $APP_NAME
$ git clone https://github.com/ghotiphud/rust-web-starter
$ cd !$:t
$ docker-compose up
$ curl localhost:3000/api
or
$ wrk -t12 -c400 -d30s http://localhost:3000/api
この場合は、./web
がfrontendで./api_server
がbackendになります。つまり、./api_server
がrustで書かれています。herokuなどにdeployする場合は、Procfileに以下のように記述すればいいでしょう。frontendはnpmするだけのものが多いので、特にありません。react使ってる人が多い印象。
$ cargo build --release
$ echo "ROCKET_ENV=prod target/release/api_server" >> Procfile
重要なのはreadmeにも書いてますけど、diesel
になります。大抵、repoに./migrations
が用意されてますので、diesel migration run
すればpreviewはできます。
$ cargo install diesel_cli
$ echo "DATABASE_URL=postgres://user:pass@localhost/name" > .env
$ diesel migration generate name
$ diesel migration run
コードの内容については、こちらが参考になりそうな感じだった。
感想
rustは、依存パッケージでハマると、ものすごく時間を浪費してしまう感じで、その点はつらいですね。
その分、api serverとかをrustで選択するのは、やりやすそうな感じでした。書けると選択肢広がりそうな言語です。