1
0
hugo/old/2018-08-22-rust.md
2024-12-21 21:03:10 +09:00

96 lines
3.6 KiB
Markdown

+++
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で選択するのは、やりやすそうな感じでした。書けると選択肢広がりそうな言語です。