プログラミング言語Rust 3.1. 数当てゲーム つぶやきまとめ
数当てゲーム 写経時のつぶやき
!が付くとマクロ
— ちゃまぐ (@tyamaguc07) 2018年12月3日
変数束縛
関連関数 → スタティックメソッドと呼ぶ言語もある
io::Resultを使っていないと警告を出す
標準ライブラリには乱数の機能がまだない
「クレート」はRustのコードのパッケージ
--binで出来るのはバイナリクレート
Cargoはバージョン記述の標準、セマンティックバージョニングを理解する
— ちゃまぐ (@tyamaguc07) 2018年12月3日
rand="0.3.0"はrand="^0.3.0" の略記で、「0.3.0と互換性のあるもの」という意味
正確に 0.3.0 だけを使いたいなら rand="=0.3.0"と記す
Cargoはそれぞれの最新版をレジストリ—https://t.co/5P9nqOVeTUのコピー—から取得
https://t.co/5P9nqOVeTUはオープンソースのRustプロジェクトを投稿する場所
— ちゃまぐ (@tyamaguc07) 2018年12月3日
Cargoは基準を満たす全てのバージョンを探索し、 Cargo.lock ファイルに書き出す
その後のビルドではCargoはまず Cargo.lock ファイルがあるか確認し、再度バージョンを探索することなく、そこで指定されたバージョンを使う
cargo updateはロックを無視して、指定したバージョンを満たす全ての最新版を探し、出来たらそれをロックファイルに書き出す
— ちゃまぐ (@tyamaguc07) 2018年12月3日
0.3.0が指定されている場合、デフォルトでは0.3.0より大きく、0.4.0より小さいバージョンを探す
0.4.xより大きなバージョンを使いたいなら直接Cargo.tomlを更新する必要がある
extern crateでdependenciesで指定したクレートを使うことを宣言
— ちゃまぐ (@tyamaguc07) 2018年12月5日
extern crate rand; で内部的にはuser rand; まで行われる
メソッドは「トレイト」に定義される
メソッドが動作するには、対象となるトレイトがスコープに入っている必要がある
use rand::Rng; はRngトレイトをスコープに入れる宣言
thread_rng()はrandに定義されている関数
— ちゃまぐ (@tyamaguc07) 2018年12月5日
gen_range() は Rngトレイトに定義されているメソッド
cmp() は比較可能なものに対しならなんでも呼べて、引数に比較したい対象の参照を取る
cmp()は先程 use した Ordering を返す
match文を使って正確に Ordering のどれであるかを判断する
Ordering はenum
Ordering enum は3つのバリアントを持つ。 Less 、 Equal そして Greater。
— ちゃまぐ (@tyamaguc07) 2018年12月5日
バリアント=variant。単語の意味として「わずかに異なるもの」
match 文ではある型の値を取って、それぞれの可能な値に対する「腕」を作れる
Ordering には3種類あるので、3つの腕を作る
Rustには強い静的な型システムがある
— ちゃまぐ (@tyamaguc07) 2018年12月5日
Rustは型推論も持つ
let guess = String::new() と書いた時、guess が文字列である筈だと推論出来るのでわざわざ型を書かなくてもよい
数字の型は色々ある(数値型、32bit数のi32、符号なし32bit数のu32、64bit不動小数点数のf64などなど)
Rustでは以前の guess の定義を新しいもので「隠す」ことが出来る。
— ちゃまぐ (@tyamaguc07) 2018年12月5日
このように隠すことをシャドーイングという。
最初 String であった guess を u32 に変換したい、というような状況でよく使われる
シャドーイングのおかげで 別々の名前を考える必要はなくなり、 guess の名前を再利用出来る
Stringのtrim()メソッドは文字列の最初と最後にある空白を取り除く
— ちゃまぐ (@tyamaguc07) 2018年12月6日
Stringのparse()メソッドは文字列を何かの数値へとパースする、その際にどの型の数値が欲しいのかを伝える必要がある
サンプルでは、let guess: u32で型を伝えている
Rustはエラーの可能性があるのに処理していないことを教えてくれる
— ちゃまぐ (@tyamaguc07) 2018年12月6日
expect()は、エラーがあったらpanic!を呼び出しクラッシュする
parse()はResultを返す
ResultはenumでOkとErrのvariantsを持つ
— ちゃまぐ (@tyamaguc07) 2018年12月6日
Ok(num)と表現するとき、Ok に内包された値を num という名前に設定している
Err(_)と表現するときは、エラーの内容を気にしないので名前ではなく _ を使っている
Rust開発環境 on Docker で Cargo new で "could not determine the current user, please set $USER" エラー
root@7e6ba33a449a:/projects# cargo new hogehoge error: Failed to create project `hogehoge` at `/projects/hogehoge` Caused by: could not determine the current user, please set $USER root@7e6ba33a449a:/projects# ls -al total 4 drwxr-xr-x 5 root root 160 Dec 2 05:22 . drwxr-xr-x 1 root root 4096 Dec 2 05:21 .. drwxr-xr-x 6 root root 192 Dec 2 04:58 helloworld drwxr-xr-x 4 root root 128 Dec 2 05:22 hogehoge drwxr-xr-x 6 root root 192 Dec 2 05:20 new_hello_world
エラーになる。(ディレクトリは作成される) メッセージの通り、現在のユーザが特定出来ないというもの。
解決方法はいくつかある。
- docker run 時に --env USER=ユーザ名 をつける
- DockerfileにENV USER=ユーザ名をつける
Rust Tutorialをやっていくにあたっては、2の手段が楽だと思ったので採用。
Rust開発環境作成 with docker
- github にリポジトリ作成
- https://hub.docker.com/_/rust/ からDockerfileを取得
- 現時点では1.30.1のDockerfile https://github.com/rust-lang-nursery/docker-rust/blob/c34d6993e8f9403c18f348de85787f1585fd3375/1.30.1/stretch/Dockerfile
curl -LO https://raw.githubusercontent.com/rust-lang-nursery/docker-rust/c34d6993e8f9403c18f348de85787f1585fd3375/1.30.1/stretch/Dockerfile
- イメージビルド
build -t learn-rust .
- エラー
failed to dial gRPC: unable to upgrade to h2c, received 502
- Docker Version 18.06.1-ce-mac73 から 2.0.0.0-mac81 (29211) にアップグレードして解決
- エラー
- docker run
- docker run -it learn-rust
- 各種バージョン確認
root@5bb70de85a33:/# rustup --version
rustup 1.14.0 (1e51b07cc 2018-10-04)
root@5bb70de85a33:/# cargo --version
cargo 1.30.0 (a1a4ad372 2018-11-02)
root@5bb70de85a33:/# rustc --version
rustc 1.30.1 (1433507eb 2018-11-07)
- Hello World
mkdir src
vi src/helloworld.rs
fn main() {
println!("Hello, world!");
}- srcのマウントしてdocker run
docker run -itv $PWD:/project learn-rust
- コンパイル
cd project/src
rustc helloworld.rs
- 実行
./helloworld
Hello, world!
参考
サブタスクなコードレビュー考察
他チームのコードレビューを依頼された場合の考察。
他チームのコードレビュー依頼がある状況と対応方法
該当チームのリードエンジニアのリソースが足りていない
一時的なリソース貸出に当たると思われるので、期日やレビュー範囲などの合意が取れればOKだと考える。
該当チームにリードエンジニア( が存在しない || の実力不足 )
ある一定以上の品質達成が該当チームだけでは成し得ない状況だと思われる。
この状態でのレビューは想像以上に高いコストとなることもあり、
最悪、何度も発生する差し戻しなどで、プロジェクト全体の進捗が滞ってしまう事もありえる。
そうならないように、品質的にはNGでもレビューOKとするルールを設定する必要があると考る。
例えば、以下のルールを設定する。
- 一定の差し戻し回数を超えたものに関してはレビューOKとする
- レビューは行うが、修正は行わないものとする
- 今後の開発時に意識してほしい観点を伝えることを目的としたレビュー
まとめ
他チームのコードレビューは、レビューに関するルールの合意をとって実施するべき。
1月に読んだ本
2月も5日になってしまいましたが、1月に読んだ本を記す。
ひとりでも部下のいる人のための世界一シンプルなマネジメント術 3分間コーチ
- 作者: 伊藤守
- 出版社/メーカー: ディスカヴァー・トゥエンティワン
- 発売日: 2008/03/13
- メディア: 単行本
- 購入: 11人 クリック: 212回
- この商品を含むブログ (34件) を見る
後輩が読むと言っていたので、読んだ本。
すごく読みやすい本で、後輩がいる人にオススメしたい本でした。
自身の普段の行動を振り返ることもできよかった。
チームが機能するとはどういうことか――「学習力」と「実行力」を高める実践アプローチ
- 作者: エイミー・C・エドモンドソン,Amy C. Edmondson,野津智子
- 出版社/メーカー: 英治出版
- 発売日: 2014/05/24
- メディア: 単行本
- この商品を含むブログ (3件) を見る
読了まで20日かかった本。
エピソードや事例紹介などが多く、分量が単純に多かったが、
なにより、自身の読書週間がついていなかったことが原因。
本から学ぶことも多かったが、何よりも、読書週間について見直せたことが大きかった。
- 作者: 飯田泰之
- 出版社/メーカー: 朝日新聞出版
- 発売日: 2013/04/01
- メディア: Kindle版
- この商品を含むブログを見る
自分の思考を効率的に出来ないかなと思い読み始めたが、
思っていた内容とは少し違った。
だが、学ぶことは多かったので読んでよかった。
定期的に読みなおして型を身に着けたい。
- 作者: 松尾豊
- 出版社/メーカー: KADOKAWA / 中経出版
- 発売日: 2015/03/10
- メディア: Kindle版
- この商品を含むブログ (26件) を見る
あんちぽちゃんさんがお勧めしていた、かつ、購入済みだったので読んでみた。
すると、ものすごく、ものすごく面白く。なんでもっと早く読まなかったんだと思える本だった。
ディープラーニングの理解への第一歩にもなるので、ほんとオススメです。
- 作者: 飯田泰之
- 出版社/メーカー: 筑摩書房
- 発売日: 2006/11
- メディア: 新書
- 購入: 23人 クリック: 1,054回
- この商品を含むブログ (176件) を見る
1月中にもう1冊読みたいなと思って、読み始めた本。
思っていた内容ではなく、ちょっと肩透かし感。
業務にも使えるな内容ではあるものの、どちらかというと、世の中の情報の取捨選択の方法論。
http://gihyo.jp/dev/feature/01/functional-prog/0003 の正誤表
下の記事をやっていたら、説明が間違っていると思われる箇所や、うまく動かないサンプルコードがあったので正誤表を書いてみた。
Haskell歴2日なので、至らない点があるのであればご教授いただけると助かります。
図3の正誤表
mapに関数渡してなかった。
-- '1'にisDigitが適用され,残りのリストにコンスされる - isDigit '1' : map ['a'] + isDigit '1' : map isDigit ['a'] -- ↓ -- isDigit '1'がTrueになる - True : map ['a'] + True : map isDigit ['a']
リスト1の正誤表
そのままだと動かなかった。
maxDupStrの定義に関しては、こうしたら動いたというだけなのでなんとも。
makePairの方は、単純に第一引数が抜け落ちてた。
--最長重複文字列を計算する maxDupStr :: [Char] -> [Char] -maxDupStr = extract . chooseMax . calcLen . makePair . sort . tails +maxDupStr xs = extract(chooseMax(calcLen(makePair(sort(tails xs))))) --隣り合う要素を組にする -makePair :: -> [([Char], [Char])] +makePair :: [[Char]] -> [([Char], [Char])] makePair xs = zip xs (tail xs)