+++ date = "2018-08-22" tags = ["rust"] title = "rustをやっていきたい" slug = "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立てるっぽいやつを動かしてみる。ここでコードの内容も見ていく。 ```sh $ 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を組み合わせた感じのものを見ていきます。 ```sh $ 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使ってる人が多い印象。 ```sh $ cargo build --release $ echo "ROCKET_ENV=prod target/release/api_server" >> Procfile ``` 重要なのはreadmeにも書いてますけど、`diesel`になります。大抵、repoに`./migrations`が用意されてますので、`diesel migration run`すればpreviewはできます。 ```sh $ cargo install diesel_cli $ echo "DATABASE_URL=postgres://user:pass@localhost/name" > .env $ diesel migration generate name $ diesel migration run ``` コードの内容については、[こちら](https://medium.com/p/1867308352d8/)が参考になりそうな感じだった。 ## 感想 rustは、依存パッケージでハマると、ものすごく時間を浪費してしまう感じで、その点はつらいですね。 その分、api serverとかをrustで選択するのは、やりやすそうな感じでした。書けると選択肢広がりそうな言語です。