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