百鬼夜行

素性を知られぬままエンジニアになることを目指します

「The Book」で Rust 入門 2 前半

前回のあらすじ

yagyosan.hatenablog.com

数当てゲームをプログラムする

Rustの基礎となる要素について学ぶ。同じようにCargoでプロジェクトを生成した後、まずは自分が入力した数値を出力するプログラムを書く。

予測を処理する

use std::io;

fn main() {
    println!("Guess the number!");

    println!("Please input your guess.");

    let mut guress = String::new();

    io::stdin().read_line(&mut guess)
        .expect("Failed to read line");

    println!("your gessed: {}", guess);
}
  • use std::io; : 標準ライブラリstdのio(入/出力)ライブラリをスコープに導入する
  • デフォルトでは、preludeに存在するいくつかの型のみ使える
    • 使用したい型がpreludeにない場合は、use文で明示的にその型をスコープに導入する必要がある
  • let: 変数の作成(変数は標準でイミュータブル)
  • mut: 可変変数にするための装飾子
  • String::new: Stringを返す関数で、::は関連関数であることを示す
    • 関連関数: 特定のオブジェクトよりも型(この場合はString)に対して実装された関数のことで、静的メソッドと呼ばれる言語もある
  • io::stdin(): std::io::Stdin オブジェクト(=標準入力へのハンドル)を返す関数で、この記述ができるのは行頭でライブラリをスコープに導入したため
  • .read_line(&mut guess): ユーザが標準入力したものすべてを取り出して、文字列に格納する(格納する文字列を引数にとる)
    • io::Result型を返す
    • &mut guess: 格納する時に文字列を変更できるよう可変変数にする
    • &: 引数が参照であることを表し、データを複数回メモリにコピーせずとも、 コードの複数箇所で同じデータにアクセスできる(これもいミュータブル)
  • Result型: 固定された種類の値を持つ型(enum
    • 型のvariant(取りうる値は)がOk列挙子とErr列挙子
  • .expect("Failed to read line");: Err値だった場合プログラムをクラッシュさせ、 引数として渡されたメッセージを表示する
    • 警告を抑制する正しい手段は後で
  • println!("You guessed: {}", guess);: {}は値を所定の場所に保持するもので、一つ以上の値を出力できる

ひとまずこれで出力までできるようになった。

秘密の数字を生成する

ゲームを実行するたびにランダムで秘密の数字が生成されるようにする。

  • クレート: Rustコードのパッケージ、バイナリークレートとライブラリクレートがある
    • バイナリークレート: 実行可能ファイル
    • ライブラリクレート: 他のプログラムで使用するためのコード

まずはCargo.toml[dependencies]randクレートを追加し、ビルドする。

$ cargo build
   Updating registry `https://github.com/rust-lang/crates.io-index`
   Compiling libc v0.2.43                                                       
   Compiling rand v0.4.3
   Compiling rand v0.3.22
   Compiling guessing_game v0.1.0 (file:///Users/yagyosan/Develop/rust_study/guessing_game)
   Finished dev [unoptimized + debuginfo] target(s) in 1m 09s
  • SemVer: バージョンナンバー記述の標準規格
  • Creates.ioにRustのOSSプロジェクトがあり、リポジトリからクレートを引っ張ってこれる
  • Cargo.lock: 明示的にクレートの記述を変更しない限り、 プロジェクトが使用するバージョンを保ってくれる
  • cargo update: クレートのバージョンを更新するが、標準で0.4.0未満のものだけを検索するようになっている

これでクレートが使えるようになったので、ランダムな数値の生成を試みる。

extern crate rand;

use std::io;
use rand::Rng;

fn main() {
    println!("Guess the number!");

    let secret_number = rand::thread_rng().gen_range(1, 101);

    println!("The secret number is: {}", secret_number);

    println!("Please input your guess.");

    let mut guess = String::new();

    io::stdin().read_line(&mut guess)
        .expect("Failed to read line");

    println!("your gessed: {}", guess);
}
  • extern crate rand;: 外部依存として使用することを知らせる行(use randと同じ効果)
  • use rand::Rng;: Rngトレイト(後ほど解説)は乱数生成器が実装するメソッドを定義していて、 このトレイトがスコープにないと、メソッドを使用できない
  • rand::thread_rng(): これから使う特定の乱数生成器を返す
    • .gen_range(1, 101);: 二つの数字を引数間の乱数を生成してくれる
  • cargo doc --open 依存するクレートのマニュアルをビルドしてくれる

続きはまた今度。

「The Book」で Rust 入門 1

前回nannouをインストールしたにもかかわらずろくに触れないので「The Book」を読み込んでみる。2nd Editionです。

まえがき - The Rust Programming Language

yagyosan.hatenablog.com

前書き

  • Rustの根本原理は「エンパワーメント」
  • 難解な低レイヤーのプログラミングがよりやりやすい
  • Rustは低レイヤーだけでなくWebアプリなど他の範囲に適用できる

事始め

インストール

インストール - The Rust Programming Language

$ curl https://sh.rustup.rs -sSf | sh
...
$ export PATH="$HOME/.cargo/bin:$PATH"

インストールして、僕はzsh使っているので ~/.zprofile にPATHを追加。 アップデートとアンインストールは rustup を使う。docも開ける。 rustc --version したら rustc 1.29.1 (b801ae664 2018-09-20) だった。

  • リンカー とは...?
  • フォーラムとIRCもチェックする

Hello, World!

github.com

今回はrust_studyディレクトリを作って、その中でやることにした。 書いたコードはこちらに全て置いてある。

  • 末尾は.rs
  • rustcコンパイルし、実行可能ファイルが生成されるので、ターミナルから実行する
  • fn main() は常にすべての実行可能なRustプログラムで走る最初のコードになり、引数がない
  • rustfmtという自動整形ツールは開発中
  • 4つのスペースでインデント
  • ;を行末につける
  • 簡単なプログラムならrustcで十分だが、肥大化してきたらCargoツールを使う

Hello, Cargo!

cargoを使って新しいプロジェクトを作成できる。

$ cargo new hello_cargo --bin
$ cd hello_cargo
  • --binはバイナリの実行可能ファイルを作る
  • Cargo.tomlファイル、Gitファイル群、main.rsが入ったsrcディレクトリが生成される
  • Cargo.tomlの中身は[package][dependencies]のセクションヘッダーがある
    • [package]: 後の文がパッケージを設定することを示す
    • [dependencies]: プロジェクトの依存を列挙する
    • パッケージのコードはクレート?(多分後で出てくる)として参照される
  • Cargoを使う場合はファイルがsrc内にあることを期待する
  • 最上位ディレクトリはCargoと、READMEなど他のコードに関連しないもの

次にビルドをする。

$ cargo build
$ ./target/debug/hello_cargo
Hello, world!
  • ビルドした時にCargo.locktargetフォルダができる
  • cargo runでビルドと実行を同時にできる
  • runした時、ファイル変更を検知しなかった場合はコンパイルをスキップする
  • cargo checkは実行可能ファイルをつくらずコンパイルできるかをチェックする

OKだったらリリースビルドをする。

$ cargo build --release
   Compiling hello_cargo v0.1.0 (file:///Users/yagyosan/Develop/rust_study/hello_cargo)
    Finished release [optimized] target(s) in 1.57s
  • target/releaseに実行可能ファイルが作成される
  • 再ビルドをかける開発用はdebug、再ビルドせず高速に動くユーザー用はrelease

同一端末で異なるGithubアカウントのリポジトリにpushする

仕事で使っているGithubアカウントとは別のアカウントにpushしたかった。 git config --local だけいじってもできなかったのでやり方を調べた。

qiita.com

こちらを参考にしました。

キーを作ってGithubに登録するまで

$ cd ~/.ssh 
$ ssh-keygen -f test -t rsa -b 4096 -C "user@example.test" 
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in test.
Your public key has been saved in test.pub.
The key fingerprint is:
SHA256:qroLmktztqEO9MNKky8ZMjEjEiiHQNMAjiyiFU+VXrs user@example.test
The key's randomart image is:
+---[RSA 4096]----+
|B=+ ....         |
|O o=  . .        |
|==. .. . .       |
|X.    . .        |
|+=      S.       |
|+.+    .E        |
|+BoB  .          |
|==O +.           |
|===*.            |
+----[SHA256]-----+

で、ここで出てきた test.pubGithubのSettingsから追加する。-fの後はファイル名なので自分の好きな名前で、あとアドレスも自分が使いたいアドレスを入れる。

~/.ssh/configに接続先を設定するまで

~.ssh/config を作成して、下記のコードを入れる

#  user github
Host github-user
  HostName github.com
  User git
  Port 22
  TCPKeepAlive yes
  IdentitiesOnly yes
  IdentityFile ~/.ssh/test

ここで気をつけることは以下のとおり

  • userの部分はなんでもいいので自分が使いたいアカウント名とかつけておくといいかも
  • Identityfile は先ほど名前をつけたシークレットキーの方を指定する

git push するまで

ここに関しては参考リンクをそのまま見てもらった方がわかりやすいので、そちらを見てください。 Hostとアカウント名を間違えないようにだけ注意。

以上です。これで合法的にサボりながら趣味の開発できます。

ギターの独学リペア&メンテナンス日記 5

前回のあらすじ

yagyosan.hatenablog.com

やったこと

新しく導入したものたち

  • 六角レンチ(センチサイズ)

はじめての合板

f:id:yagyosan:20180924004134j:plain

これまで単板のものしか触ったことなかったけど、合板は重いですね...。それとめちゃくちゃ粉っぽい感じがする。作りが雑な箇所がいくつか見られるんですが、ただなんとも言えない音の籠り具合はおもしろい。

ナットの接着

f:id:yagyosan:20180924004438j:plain

フレットを磨いているときにぽろっとナットが落ちて戦慄が走った。即座にyoutubeでナットの付け方を見てやり方を確認した。やすりと接着材買っておいてよかった...。

組み立て

f:id:yagyosan:20180924005344j:plain

しっかり磨き上げた後組み立てをした。今回もサーキット周りはいじってないので、清掃メイン。家にきたときよりもピカピカしてる。

ハイハネ対応

f:id:yagyosan:20180924005053j:plain

ネックのジョイント部分に近づくにつれ謎のビビリが発生していた。対応になるかわからなかったが、ひとまずジョイント上部に薄い木を挟んで接合したり、弦高を変えたりしてようやくビビリをなくすことができた。うーんここは対応策がわからなかった...。

今回の反省と気づき

  • ジャンク直すのも考えもん(トラスロッド周り...)
  • ハムはフロントとリアでカバーのサイズが違う
  • エスカッションプレートにも前後がある?
  • TOMのサドルの向きが覚えられん
  • ネジ穴は作れる(無理やり)
  • ハイハネは事前に確認できたかもしれないのでチェックの仕方を知ろう
  • トラスロッドの回る向き覚えて

ギターの独学リペア&メンテナンス日記 4

前回のあらすじ

yagyosan.hatenablog.com

  • YAMAHA PAC312 をさらに分解した
  • とりあえずネックだけ磨いた

やったこと

新しく導入したものたち

  • サビ取り洗剤?
  • KURE 5-56
  • 六角レンチ
  • 精密ドライバー
  • 瞬間接着剤
  • ダイヤモンドやすり
  • 赤ちゃん用綿棒

サビ取り

f:id:yagyosan:20180922222336j:plain

このギターのネジ、全体的にサビついてるのでサビ取りをした。 サビ取り用の液体を吹きかけると、還元して紫になった。細かい赤さびは落ちたようだったが、だいたいが黒サビに変化していた。サビ取りは限界があるのかもしれない。

内部をのぞいてみる

f:id:yagyosan:20180922223039j:plain

1ボリューム1トーンなので回線自体はシンプル。分解の前に写真を撮ってふむふむと眺めていた。ピックアップセレクタあたりがちょっとどういう理屈かわかりづらい。

組み立て

f:id:yagyosan:20180922223444j:plain

音が出るのを確認してどんどん組み立てていった。ペグのワッシャーやバックパネルにヒビが入っていたので気をつけながら取り付けた。ネックとボディをつける時が一番ドキドキする。

ナット削り

tf:id:yagyosan:20180922223345j:plain

このギターがジャンクで売られていた原因がわかった...。6弦の溝がひどく深掘りされていて、弦を張った時にめちゃくちゃ音がビビっていた。よくみると5弦も少し浮き気味。これは前オーナーの仕業やな。ナットを自力で変えるのはまだハードルが高いし、リペアに出すのもお金がかかるので、5弦の溝はやすりで軽く削り、6弦の溝は応急手当として瞬間接着剤で底上げをした。乾くのを待って調整してみる。

別のギターを分解

f:id:yagyosan:20180922224300j:plain

Barclayのレスポールを購入した。カタログがないのでわからないが多分ビンテージだと思う。こいつもなかなかなの問題児っぽい感じがするので、今やってるやつが終わったらサクッとメンテしてみたいと思う。

今回の反省と気づき

  • 赤ちゃん用綿棒が細くて便利
  • ピックアップにちゃんとマステしてわかるようにした
  • YAMAHAは日本製なのでイモネジの六角レンチのサイズはセンチの方を使う
  • 目利きの時はナットの溝もちゃんと見る
  • ペグのネジは締めすぎない
  • ネジ穴の掃除の仕方をもうちょっと調べる
  • ナットの入れ替えグッズを揃える
  • ストリングガイドはペグをつけた後にする
  • ピックアップの高さも覚えておく
  • 金メッキの金属パーツは強く磨かない
  • トラスロッドカバーのネジは強く締めない
  • 組み立てる前に出力チェックをする
  • サーキットの中もできたら掃除する
  • はんだを早く入手する
  • 回路図はどっかでメモして貯めておく

ギターの独学リペア&メンテナンス日記 3

前回のあらすじ

  • SGのクリーニング終わった
  • YAMAHA PAC312 を分解

yagyosan.hatenablog.com

やったこと

新しく導入したものたち

ESPのいろいろを買ってきた

  • ESP MS-10 マルチスパナ PROツール
  • ピックカバービス
  • ボルトオンネックビス
  • エンドピン

とはいえマルチスパナしか今回は使ってない。

サーキット以外を分解

f:id:yagyosan:20180916185850j:plain

前回ボディとネックを分離した時に全体的に汚れていたのを確認していたので、ひとまずできるとこまで外してみた。半田ごてがいま手元にないので、それに関わるもの以外は100均のケースに入れておいた。

ネックは大丈夫だったのだけどボディのネジ類は満遍なくサビていて、どうしようかなと悩んでる。サンポールに漬け込んでサビ取りする案も思い浮かんだが、金メッキ取れるんじゃないか?疑惑がある。流石にパーツ全とっかえはまだやりたくないな。あとネジ穴のクリーニングはどうやってやるのだろうか。

f:id:yagyosan:20180916190839j:plain

分解している最中に新たな破損を見つけた。バックプレートとペグのワッシャーにヒビが入っていた。これもどうしようかな...。ペグのワッシャーって売っているのだっけ...?

とまあ、分解することでいろいろな気づきがあったのでそれはそれでよかった。

ネック全体の磨き上げ

f:id:yagyosan:20180916191250j:plain

現時点でちゃんとケアできそうだったところがネックしかなかったので、前回と同じくピカールとレモンオイルで掃除。それが終わったらポリッシュで磨き上げ。ペグがロトマチックタイプでこれ以上分解できなさそうだったので、ネックに関してはパーツを拭いてから装着して終わりにしたいと思う。

今回の反省と気づき

  • 分解作業をする前に写真を撮っておこう
  • ワッシャーは丸っこい方が基本的に外側を向いている?
  • ペグのボルトとストリングガイドは締めすぎない方が良さそう
  • シンクロナイズド・トレモロブリッジを外すときは先にボディ裏のネジを緩めておく
  • ボディ裏のネジはサーキットを取り始めるまでくっつけておいたほうが良さそう
  • マルチスパナ便利だけど力を入れるとどっちかが壊れそう
  • ネックのテープは短めにした方が一気に剥がせそう
  • サビだらけになってしまったのでもっと掃除しやすい場所でやる

次回はペグの取り付けかボディに挑みます。

ペグの取り外しとかまずしてみたい人はマルチスパナ使ってみよう。

ESP MS-10 マルチスパナ PROツール

ESP MS-10 マルチスパナ PROツール

ギターの独学リペア&メンテナンス日記 2

前回のあらすじ

  • 趣味でリペアとメンテナンスしてます
  • Epiphone の G-310 を磨いてます

前回の記事はこちら

yagyosan.hatenablog.com

やったこと

今回もSGのメンテナンスの続き。

ボンドは有効打ではない

前回サビ取りのためネジにボンドを盛ってみたのだけど、全然取れてなくて笑った。 いや、正確には磨いて落ちるような軽いサビは取れていたんだけど、大きいやつはそのままだった。 ネジ変えようかと思ったけど、キリないので今回は放置した。

今回新たに導入したものたち

  • 工具入れ
  • パーツ分け用の仕切り付きケース
  • 電動ドライバー
  • 大量の綿棒
  • コンビレンチ 4.5-7mm

ネックとボディを分解して接合部を掃除

このSGのネックはボルトオンです。 IKEAの電動ドライバーを持っていたのを思い出し、おもむろに分解してみた。 この接合部に木屑が溜まっていることが良くあるので、そこの掃除とネックプレートも磨いた。 締め直しも問題なかった。

ペグの磨き上げ

ペグを外して磨こうと思ったのだけど、買ったレンチとナットのサイズが合わなかった...。 今回の一番大きな反省点。ちゃんとボックスレンチを買いに行こう。 しょうがないので見える部分だけを磨き上げた。 そしてGLOVERタイプだったことを初めて知る。

全体のポリッシュがけ

中身はいじる気なかったので、あとは全体を磨き上げた。 ここで気づいてたのだけど、PUのノブのひとつがレフティー用になってた。なんでや。 新品で買ったのに...さすが2nd品。

弦高調整とオクターブチューニング

あとは弦を張って弦高調整とオクターブチューニングを久しぶりにやった。 以前持ってたレスポールはどちらも固すぎてハイパーめんどくさかったのだけど、 このSGはスルスルできた。あれはなんだったのか。1弦が1.5mm、4弦が2mmに調整。

今回はひとまずこれで完成とする。

おまけ

中古で買ったYAMAHAのPAC312もネックとボディを分解してみた。

f:id:yagyosan:20180916012957j:plain

PACシリーズってネックは同じなんだという気づき。 LHはなに?レフトハンド? そしてこいつのネジは全部中までサビていた...うーん売っちゃう予定だから変えるかどうか迷う。

今回の反省と気づき

  • ペグのナットのサイズはあらかじめ確認しておきましょう
  • オクターブチューニング用にマイナスドライバー買っておいたほうがいい
  • トラスロッドレンチ買い忘れた
  • ネジの規格ってどのメーカーもだいたい同じなんだな
  • 金メッキのネジも案外安い
  • 同じシリーズであればネックとボディ別で買ってもくっつけられるのかな
  • ネジ穴にピカールを入れると後が大変
  • ピカールと歯ブラシの相性は良くない
  • 作業台が欲しい