Rust 環境構築 + Hello, World + Cargo 基本

安全性、並列性、速度の3つにフォーカスしたシステムプログラミング言語である Rust に興味を持ったので、 まずは環境構築から始めてみます。

Rust 環境構築

  • Rust コンパイラは様々なプラットフォームをサポートしていますが、サポートのレベルが3つに分けられています。

    • 第1級: ビルドでき、かつ動作を保証する
    • 第2級: ビルドを保証する
    • 第3級: テストやビルドは保証していない
  • この中で 64-bit OSX (10.7+, Lion+) は第1級サポートに位置付けられています。

Mac OS での Rust 環境構築

  • 筆者の環境は以下の通りです。
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14
BuildVersion:   18A391
  • 環境構築は以下のワンコマンドですみます。
$ curl https://sh.rustup.rs -sSf | sh

info: downloading installer

Welcome to Rust!

This will download and install the official compiler for the Rust programming
language, and its package manager, Cargo.

It will add the cargo, rustc, rustup and other commands to Cargo's bin
directory, located at:

  /Users/htamakos/.cargo/bin

This path will then be added to your PATH environment variable by modifying the
profile files located at:

  /Users/htamakos/.profile
  /Users/htamakos/.zprofile

You can uninstall at any time with rustup self uninstall and these changes will
be reverted.

Current installation options:

   default host triple: x86_64-apple-darwin
     default toolchain: stable
  modify PATH variable: yes

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>1

info: syncing channel updates for 'stable-x86_64-apple-darwin'
info: latest update on 2019-01-17, rust version 1.32.0 (9fda7c223 2019-01-16)
info: downloading component 'rustc'
64.5 MiB /  64.5 MiB (100 %)   4.5 MiB/s ETA:   0 s
info: downloading component 'rust-std'
 49.2 MiB /  49.2 MiB (100 %)   6.1 MiB/s ETA:   0 s
info: downloading component 'cargo'
info: downloading component 'rust-docs'
  8.5 MiB /   8.5 MiB (100 %)   7.6 MiB/s ETA:   0 s
info: installing component 'rustc'
info: installing component 'rust-std'
info: installing component 'cargo'
info: installing component 'rust-docs'
info: default toolchain set to 'stable'

  stable installed - rustc 1.32.0 (9fda7c223 2019-01-16)


Rust is installed now. Great!

To get started you need Cargo's bin directory ($HOME/.cargo/bin) in your PATH
environment variable. Next time you log in this will be done automatically.

To configure your current shell run source $HOME/.cargo/env
  • この後 $HOME/.cargo/bin を PATHに追加するか source $HOME/.cargo/env で rust 関連のコマンドが実行できます。2019/2時点で最新の安定バージョンは 1.32.0のようです。
$ source $HOME/.cargo/env
$ rustc --version                                                                                                                                             
rustc 1.32.0 (9fda7c223 2019-01-16)

Hello, Rust!

  • 何はともあれ Rust で Hello, World してみます。関数定義を fn で、標準出力をprintln関数で実行する、行末コロンがある、等の特徴がわかります。
fn main(){
  println!("Hello, World");
}
$ rustc main.rs
$ ls -lah
total 560
drwxr-xr-x  4 htamakos  staff   128B  2 15 00:35 .
drwxr-xr-x  3 htamakos  staff    96B  2 15 00:25 ..
-rwxr-xr-x  1 htamakos  staff   274K  2 15 00:35 main
-rw-r--r--  1 htamakos  staff    41B  2 15 00:34 main.rs

$ ./main
Hello, World

できた!

Hello, World 解説

  • C言語に近いシンタックス

    • {} で関数ブロックを記述
    • 行末にコロンが必須
    • main 関数は特別扱いで、すべての rust プログラムのエントリーポイントになる
  • println! はRustのマクロ呼び出し

    • println は関数で、それに対して!をつけるとマクロ呼び出しになるらしい

Cargo Introduction

  • Rust のビルドシステム兼パッケージマネージャーが Cargoです。
  • 上記のインストール手順を踏むと勝手にインストールされています。
$ cargo --version
cargo 1.32.0 (8610973aa 2019-01-02)
  • cargo でプロジェクトを作成するには以下のようなコマンドを実行します。
$ cargo new hello_rust --bin
  • するとnewの後に指定した名前のディレクトリが作成され、その下に、Cargo.tomlファイルと src/main.rs が作成されます。ついでにgitリポジトリの初期化も行ってくれるようです。
$ ls -lah hello_rust
total 16
drwxr-xr-x  6 htamakos  staff   192B  2 15 00:48 .
drwxr-xr-x  5 htamakos  staff   160B  2 15 00:48 ..
drwxr-xr-x  9 htamakos  staff   288B  2 15 00:51 .git
-rw-r--r--  1 htamakos  staff    19B  2 15 00:48 .gitignore
-rw-r--r--  1 htamakos  staff   125B  2 15 00:48 Cargo.toml
drwxr-xr-x  3 htamakos  staff    96B  2 15 00:48 src
  • Cargo.toml の中身は以下のようになっています。TOMLファイル形式が設定ファイルのフォーマットとして採用されているようです。
$ cat Cargo.toml
[package]
name = "hello_rust"
version = "0.1.0"
authors = ["htamakos <xxxxxx@gmail.com>"]
edition = "2018"

[dependencies]
  • Cargo で build する
$ cargo build
   Compiling hello_rust v0.1.0 (/Users/htamakos/project/learning_rust/01_hello_world/hello_rust)
    Finished dev [unoptimized + debuginfo] target(s) in 3.18s
  • cargo でビルドしたプログラムを実行する
$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.08s
     Running `target/debug/hello_rust`
Hello, world!
$ cargo check
    Checking hello_rust v0.1.0 (/Users/htamakos/project/learning_rust/01_hello_world/hello_rust)
    Finished dev [unoptimized + debuginfo] target(s) in 0.18s
  • cargo でリリースビルドを作成する
$ cargo build --release

# target ディレクトリ以下にreleaseディレクトリが作成され、そこに実行バイナリ等が作成されます。
$ ls -lah target/release
total 552
drwxr-xr-x@ 11 htamakos  staff   352B  2 15 00:59 .
drwxr-xr-x   5 htamakos  staff   160B  2 15 00:59 ..
-rw-r--r--   1 htamakos  staff     0B  2 15 00:59 .cargo-lock
drwxr-xr-x   3 htamakos  staff    96B  2 15 00:59 .fingerprint
drwxr-xr-x   2 htamakos  staff    64B  2 15 00:59 build
drwxr-xr-x   4 htamakos  staff   128B  2 15 00:59 deps
drwxr-xr-x   2 htamakos  staff    64B  2 15 00:59 examples
-rwxr-xr-x   2 htamakos  staff   270K  2 15 00:59 hello_rust
-rw-r--r--   1 htamakos  staff   172B  2 15 00:59 hello_rust.d
drwxr-xr-x   2 htamakos  staff    64B  2 15 00:59 incremental
drwxr-xr-x   2 htamakos  staff    64B  2 15 00:59 native

自動整形ツール rustfmt のインストール

  • Rust のツールチェインには、自動フォーマットツールである rustfmt があります。これは以下のコマンドでインストールできます。
$ rustup component add rustfmt
info: downloading component 'rustfmt'
  1.6 MiB /   1.6 MiB (100 %)   1.3 MiB/s ETA:   0 s
info: installing component 'rustfmt'
  • 使い方は以下の通り
# 以下のようにインデントがおかしい.rsファイルに対して、
$ cat main.rs                                                                                                                                    
fn main() {

println!("Hello, World");
}

# rustfmt をかけると...
$ rustfmt main.rs

# 自動的にフォーマットされます。
$ cat main.rs
fn main() {
    println!("Hello, World");
}

参考: https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/getting-started.htmlhttps://doc.rust-jp.rs/book/second-edition/ch01-01-installation.html

PDBの起動状態のオープンモードの保持・破棄

概要

  • CDB 再起動時の 1つ以上の PDB のオープン状態を保持できる

方法

オープンモードを保持するように設定する

  • 特定の PDB を設定する場合
SQL> ALTER PLUGGABLE DATABASE pdb1 SAVE STATE;
  • 複数の PDB を設定する場合
SQL> ALTER PLUGGABLE DATABASE pdb1, pdb2 SAVE STATE;
  • すべての PDB を設定する場合
SQL> ALTER PLUGGABLE DATABASE ALL SAVE STATE;
  • 特定の PDB 以外の全てを設定する場合
SQL> ALTER PLUGGABLE DATABASE ALL EXCEPT pdb1 SAVE STATE;

オープンモードの破棄

  • 特定の PDB を破棄する場合
SQL> ALTER PLUGGABLE DATABASE pdb1 DISCARD STATE;
  • 複数の PDB を破棄する場合
SQL> ALTER PLUGGABLE DATABASE pdb1, pdb2 DISCARD STATE;
  • すべての PDB を破棄する場合
SQL> ALTER PLUGGABLE DATABASE ALL DISCARD STATE;
  • 特定の PDB 以外の全てを破棄する場合
SQL> ALTER PLUGGABLE DATABASE ALL EXCEPT pdb1 DISCARD STATE;

オープンモードの保持状態を確認する方法

  • DBA_PDB_SAVED_STATES を参照する
SQL> desc DBA_PDB_SAVED_STATES
 名前                                                NULL?    型
 ----------------------------------------------------- -------- ------------------------------------
 CON_ID                            NOT NULL NUMBER
 CON_NAME                          NOT NULL VARCHAR2(128)
 INSTANCE_NAME                         NOT NULL VARCHAR2(128)
 CON_UID                           NOT NULL NUMBER
 GUID                               RAW(16)
 STATE                              VARCHAR2(14)
 RESTRICTED                         VARCHAR2(3)

SQL> select con_id, con_name, instance_name, state from dba_pdb_saved_states;

    CON_ID CON_NAME   INSTANCE_N STATE
---------- ---------- ---------- --------------
     3 PDB1       orcl   OPEN

参考

やっくしぇいびんぐ

目的とすることを成し遂げる前の本質的でない事に時間をかけてしまう、またはかかってしまう様のこと。

IT業界ではよく使われる言葉。

例えば、 Tensorflow でディープラーニングしよう!!と思って、インストールしてみたらGPU版をインストールできず、調査したらglibのバージョンが低い → Glibってどうやったらアップデートできるか調べる → あれ?使ってるOSに提供されてるパーゲージなくね? → ビルド方法調べる → ビルドに必要なライブラリなくね? → ビルドに必要なライブラリ調べる → あれ?ライブラリ提供してるパッケージなくね? → ライブラリのビルド方法調べる → あry.. → 結局別OSバージョンでやる

みたいなケース。

 

これあるあるだと思ってたんだけど、よく考えたら防げることも多い。

そして人のメンタリティによる部分も大きい。実現したい事に対してまっすぐ進め、諦める事の決断が早い人は陥りにくい気がする。

自分の場合にはこれが本当に苦手で特に機械学習周りでよく起きる。アルゴリズムの原理が気になって先に進まない、もっといい方法がないか考えて先に進まない、先進的なライブラリがないか探して進まない。

これは本当に直さないといけない。

エクセルだって何だって実現方法なんて何でもよくて、目的をいかに素早く達成できるかのみを考えて決断して行動しないと、、、

 

ひとまず以下のことをする。

どんなコンテキストで、何を実現するために今何をすべきで、行った結果はどんなもので、その結果をもとに何するべきかの予想を立てて、出た結果をもとに次のアクションプランを立てる

 

すごく基本的なことだけど意識しないと出来ない

 

 

vagrantでboxファイル圧縮 [ProviderがVirtualBoxの場合]

1. 仮想マシン上で以下を実行

$ sudo su -
# umount /vagrant
# yum clean all
# dd if=/dev/zero of=/EMPTY bs=1M
# rm -f /EMPTY

2. 仮想マシンをシャットダウン

$ vagrant halt

3. VirutalBoxのファイルを形式をvmdk から vdiに変更したり諸々

# VirtualBoxのHDDファイルがある場所を探す.
$ vboxmanage list vms
$ vboxmanage showvminfo 

# HDDファイルがある場所へ移動する
$ cd ~/VirtualBox VMs/test-app

# vmdk -> vdi
$ vboxmanage clonehd test-app.vmdk test-app.vdi --format vdi

# vdi形式のファイルを圧縮
$ vboxmanage modifyhd test-app.vdi compact

# 作成したvdiをvmdkに変換する
## ファイル名を前のvmdkファイルと別にする必要性がある。
$ vboxmanage clonehd test-app.vdi test-app-compact.vmdk --format vmdk

# 前のvmdkファイルを取り外し、圧縮したvmdkファイルを接続する。
# VirtualBoxのGUIでやるのが簡単なため割愛。

4. vagrant の boxファイルを作成 (これより前に圧縮したvmdkで動作するかどうか確認するほうが無難)

# vagrant package --out test-app.box

Windows でファイル結合

分割されたファイルを結合するためには、コマンドプロンプトで以下のように実行する。

# テキストファイルの場合
copy hoge01.txt + hoge02.txt + hoge03.txt hogehoge.txt

# zipのようなバイナリファイルの場合
copy /b hoge.zip01 + hoge.zip02 + hoge.zip03 hoge.zip

mecabで記号が名詞, サ変接続とされてしまう問題の解消

概要

  • MeCabのデフォルトでは半角記号が名詞、サ変接続とされてしまう。
$ mecab
;
;       名詞,サ変接続,*,*,*,*,*
EOS
  • この問題を解消するために未定義語の辞書を編集して、半角記号が記号として取り扱うことができるようにする

前提環境

ステップ

  1. unk.def の編集
  2. 辞書の再インストール

1. unk.def の編集

$ cat unk.def | grep SYMBOL
SYMBOL,1283,1283,17585,名詞,サ変接続,*,*,*,*,*
$ sed -i unk.def -e '/^SYMBOL,/s/名詞,サ変接続,\*,\*,\*,\*,\*/記号,一般,\*,\*,\*,\*,\*/' 
$ cat unk.def | grep SYMBOL
SYMBOL,1283,1283,17585,記号,一般,*,*,*,*,*

2. 辞書の再インストール

$ sudo /usr/local/libexec/mecab/mecab-dict-index
$ sudo make install
$ mecab
;
;       記号,一般,*,*,*,*,*
EOS

CentOS7でnkfを使う

インストール方法

$ sudo yum localinstall -y http://mirror.centos.org/centos/6/os/x86_64/Packages/nkf-2.0.8b-6.2.el6.x86 _64.rpm

nkfEUC-JPなファイルをUTF8に変換し、変換元を書き換える

$ nkf -g hoge.csv
EUC-JP (LF)
$ nkf -w --overwrite hoge.csv
$ nkf -g hoge.csv
UTF-8 (LF)