Rust

素数夜曲の本を買った。熱い、もとえ厚い本である。厚さが5cmもある。総ページ800ページを 超える本である。作者のこだわりで付録が充実してる。

こだわりは表紙の絵柄にも出てて、梟の画を日本画家に描いてもらったとの事。昔から、 ふくろうは『森の賢者』と言うそうですから。

ふくろうは、昼の鷹に対する、夜の覇者だそうだ。感度良好な目、音を3次元構成出来る耳 (そのために、左右の耳の位置が異なるとか)こちらも超高感度。地中を這う動物の音も 聞き分けるとか。そして、強靭なくちばしと足のつめ。羽の羽ばたき音を低減するために 消音機能が付いた羽。これで、獲物に気付かれる事なく、接近可能。まるで忍者ですよ。

ふくろうの目は、普通の鳥と違って、正面を向いている。人間の顔に似てるから、賢者と 言われるのかな。目が左右についてちゃ、化け物もとえ鳥ですから。目が正面に付いて いたら、視界が悪くなるんじゃ? いいえ、頭がほぼ真後ろまで回転出来るようになってて、 視界良好だそうです。

そして、目は、すりばち状の底の部分に付いている。このすりばちは伊達でそうなってる 訳じゃなく、音を集めるためのパラボラとして、耳感度向上に役立っているそうだ。進化の妙ですなあ。

付録では、Schemeとgnuplotを駆使して、手を動かしながら数の不思議を感じて欲しいとな。 数学好きにはうってつけ。

ryamadaのコンピュータ・数学メモ さんは、Racketを使って、素数夜曲に取り組んでおられる。また、付録でSchemeをバンバン つかっているので、生きたSchemeの例になってる。SchemeならSICPでしょ病 に警告を発しておられる方もおられるけど、その答えが夜曲本に有ると思うぞ。

オイラーは、Gaucheでしょうって事でいいんだけど、パソコンの前にこの厚い本を置いて ってのが、どうも具合が悪い。そもそも厚過ぎて、取り回しが大変。

ああ、厚い本の別な使い道をオイラーと女房がそれぞれ見つけた。オイラーは、この厚い本 を炬燵で読んでて眠くなったら、即この本を枕に昼寝。おーい枕って言わなくて済むので良い。

女房は、ipadを炬燵の上に置く時の台にしてますよ。今までは電話帳を下に敷いていたけど 高さが微妙だったとか。何でも、顔をずっと下に向けてると、ほうれい線(ひょっとして、皺の美容用語かな)が 深くならなくて良いとの事。

本の二次利用はさておき、 15年物のパソコンが載ってたのを片付けて、専用の書見台をしつらえたよ。これで本は読み易く なったんだけど、パソコンが無い。はて、どうする?

Gambit Repl

そうだ、ipadにgambitが入っていたな。 ipadなら小さいし取り回しも簡単。で、久しぶりに gambitを起動してみたよ。いつの間にか、ipad内蔵のキーボードがLisp用に拡張されてた。 これ、便利そうだな。

良く使うと思われる文字が、一つのキーに5文字分定義されてた。例えば、センターに、+ 4隅に時計回りで、^ _ % * が配置されてた。他のキーには憧れのλも有ったぞ。 数字は、0から9までを、偶数、奇数に分けて2つのキーに定義。目立つセンターの刻印は0と1。

どの数字も平等かと言うと、そんな事は無くて、世の中に出回る数字にはばらつきが有る なんて事を、何かの本で読んだ事がある。スーパーマーケットの価格タグをスキャンして、 どの数字が一番多かったか調べてみたら面白いぞ。オイラーがそんな事をやると、怪しい 人ってレッテルを貼られて出入り禁止にされそうなので、小学生の自由研究で、堂々と調べて 欲しい。

スーパーなら、8とか9が多いのかな? 99円とか、198円とか、主婦が喜びそうな数値だもの。 ああ、おいらの好きな100均は、100だから、超隔たりがあるな。この間、バンドエイドを 買いに行ったんだけど、80枚も入っていても100円で、呆れてしまったわい。

プログラミングで使う数字にも隔たりがある。0と1が大幅に多い。それを反映して、PowePCの 石はレジスターが32個あるけど、R0だけは特定な命令を実行する時、0しか読み出せないように なっている。(1しか読み出せない変な癖を持った石も有ったように思うけど、どうでっしゃろ? >熱血アセンブラの皆様)

まあ、そんな無駄話はどうでも良くて、一つのキーに5個の文字が割り振られてる時、 どうやってそれを入力する?

携帯のキーみたいに、何回か同一キーを叩くと、それにつれて、あ->い->うって切り替わって 行くかと思ったら、違った。じゃ、シフトキーを押して、例えば右上を押すと、そのキーの 右上刻印文字が入力されると想像。違った。じゃ、キーを長押ししたら4方向に文字が出現するかと思ったら、 それも違ったぞ。えーん、このキーボード腐ってる。

まてまて、Gambitのソースが公開されてるんだから、それを読めば何か分かるんじゃなかろうか? 得意のソース嫁だな。

ipad用のは寄贈ソフトになってた。寄贈部分はipad特有なインターフェースを実装してる だけ。htmlとjavascriptが大活躍してたぞ。結局それしか分からなかった。

で、後は、メーリングリストに登録して、"How to use ipad software keyboard ?" って、 聞いてみるかなあ。まてまて、普通に考えるんだ。お前、昔カッコ付けて、Inside MAC なんて資料を取り寄せて見てたじゃん。

その方面に注目して、ぐぐる先生に聞いてみましたよ。そしたら、指を跳ね上げて(下げて) 指定する方法もあるとな。左下に刻印のある文字を入力したいなら、そのキーに触れてから、 指を左下に払う。ちょっと慣れが必要だけどすぐに習得出来たよ。キーは真っ直ぐに押し下げるもの とばかり思っていたけど、こういう二次元的な方法もあるのね。

ipad歴2年にして、こんな斬新な キー入力方法が有るなんて初めて知りましたよ。キーボードを分割してフリック入力も 出来るなんてのもついでに知ったぞ。

数は数直線の上に載るものとばかり思っていたら、オイラーさんが、数は平面に有るってんで、 複素数面を発明した。分かってしまえば何て事ないけど、分かるまでが大変だな。

Install Rust

Rustは長い年月をかけて進化している 。そして遂に、 Rustの1.0ベータ版に向けたロードマップ が、公開されるに至った。 Linux業界も注目してるみたいですよ。 LinuxコミュニティはRustを受け入れた

早速、フレッシュな所を頂いてこよう。 取り寄せ先はこちらだ。 まだ、アルファー版なので、こうやるのが正解らしいけど、

curl -s https://static.rust-lang.org/rustup.sh | sh -s -- --prefix=$HOME/local/opt/rust 

面倒なので、Webに載ってる方法で行く。どうせ、/usr/localの下もオイラーの庭ですから。

[sakae@fedora ~]$ curl -s https://static.rust-lang.org/rustup.sh | sudo sh
  :
rustup: Downloading https://static.rust-lang.org/dist/rust-nightly-i686-unknown-linux-gnu.tar.gz to /tmp/tmp.Bw44B0Eyek/rust-nightly-i686-unknown-linux-gnu.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  5  117M    5 6684k    0     0   277k      0  0:07:06  0:00:24  0:06:42  293k
       :
/bin/tar: rust-nightly-i686-unknown-linux-gnu/manifest-rust-docs.in: write 不能: デバイスに空き領域がありません
/bin/tar: rust-nightly-i686-unknown-linux-gnu/LICENSE-APACHE: write 不能: デバイスに空き領域がありません
/bin/tar: rust-nightly-i686-unknown-linux-gnu/manifest-rustc.in: write 不能: デ バイスに空き領域がありません
/bin/tar: 前のエラーにより失敗ステータスで終了します
rustup: error: failed to unpack installer

回線が細いので随分DLに時間がかかった。それはいいんだけど、上の結果は非常に宜しく無い。 一体、空き領域が無いとはどういう事や? 出鼻をくじかれましたなあ。

DL先が/tmpの下、続いてそれを展開。DLするサイズが117Mでそれを展開すると、多分3倍以上に 膨らむだろう。そうすると、117M X 4 で、470M以上は/tmpに必要。えと、/tmpはどれぐらい 割り当ててるかな?

[sakae@fedora ~]$ df -h
Filesystem                              Size  Used Avail Use% Mounted on
/dev/mapper/fedora--server_fedora-root   14G  2.9G   10G  23% /
devtmpfs                                369M     0  369M   0% /dev
tmpfs                                   375M     0  375M   0% /dev/shm
tmpfs                                   375M  516K  374M   1% /run
tmpfs                                   375M     0  375M   0% /sys/fs/cgroup
tmpfs                                   375M  4.0K  375M   1% /tmp
/dev/sda1                               477M  109M  339M  25% /boot
tmpfs                                    75M     0   75M   0% /run/user/1000

これじゃ、空き領域が無いと言われるのも当然だな。しゃーない。rustup.shとやらを 落としてきて、眺めてみるか。ひょっとしたら、作業場を変更出来るような作りに なってるかも知れんからな。

[sakae@fedora ~]$ curl -L https://static.rust-lang.org/rustup.sh -O
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 13083  100 13083    0     0   6908      0  0:00:01  0:00:01 --:--:--  6914

フムフムと見てくと、発生場所が分かった。

[sakae@fedora ~]$ diff -u rustup.sh.org rustup.sh
--- rustup.sh.org       2015-01-18 06:10:29.670020398 +0900
+++ rustup.sh   2015-01-18 06:22:07.612020037 +0900
@@ -429,7 +429,7 @@
     CFG_INSTALL_FLAGS="${CFG_INSTALL_FLAGS} --prefix=${CFG_PREFIX}"
 fi

-CFG_TMP_DIR=$(mktemp -d 2>/dev/null \
+CFG_TMP_DIR=$(mktemp -p /home/sakae 2>/dev/null \
            || mktemp -d -t 'rustup-tmp-install' 2>/dev/null \
            || create_tmp_dir)

空き容量がたっぷりとある自分の家を指定したよ。で、再度インストールを試みると

   :
install: copying directory /usr/local/share/doc/rust/html
install: running ldconfig

    Note: please ensure '/usr/local/lib' is added to LD_LIBRARY_PATH

    Rust is ready to roll

ひょっとして、ready to rollって、ready to roleの間違いかと思ったけど、 アルファー版を鑑みるとroleの意味、役割にはちょっとおぼつかないだろうから、rollの 転がり回す(誰が)七転八倒ってのが正解かな? 日本風に言うと、人柱とか地雷とか、そんな意味なんだろうな。 決して、優雅にロールケーキで紅茶って雰囲気では無いでしょう。

雪国で転がると雪達磨、こんな事を言ってられるのは小供の時だけ。大人には雪かきと言う 強制労働が待っていますよ。たまには雪に巻かれて、、、ってのもありますが、そりゃ辛い。 せめて恵方巻ぐらいじゃないと。。。まてまて、あれはコンビニの陰謀だから乗せられては いけませんぞ。

で、走らせると、

[sakae@fedora ~]$ rustc --help
rustc: error while loading shared libraries: librustc_driver-4e7c5e5c.so: cannot open shared object file: No such file or directory

ははは、早速の地雷炸裂? かな。言ってきた事を素直に解釈すれば、そんなのねぇって事。 lsで調べると有る。となると、ローダーはドウダー。。

[sakae@fedora ~]$ ldd /usr/local/bin/rustc
        linux-gate.so.1 =>  (0xb77bb000)
        librustc_driver-4e7c5e5c.so => not found
        libstd-4e7c5e5c.so => not found
        libc.so.6 => /lib/libc.so.6 (0xb75e0000)
        /lib/ld-linux.so.2 (0xb77bc000)

LD_LIBRARY_PATHを設定しろなんて、昔のSolarisを思い出しちゃったぞ。指示に従って Solaris風にやるか。まてまて、世は Linuxの時代Fedora様々だぞ。えと、/etcの下で設定すればFedora風。

[root@fedora ld.so.conf.d]# cat local.conf
/usr/local/lib

[root@fedora ld.so.conf.d]# ldconfig

こういう事をやって逃れましょ。やれやれ世話が焼けるなあ。

[sakae@fedora ~]$ ldd /usr/local/bin/rustc | wc -l
28

こんなにいろいろな物を従えているよ。

rustの試運転

早速試運転。何はなくてもハロワを訪れるのが世の決まりです。資料は、Bookを見れば いいんだけど、ちと古い版のやつが日本語化されてた。

The Rust Guide (Japanese Translation):前篇 §01-14

The Rust Guide (Japanese Translation):後篇 §15-§27

これによると、cargoって言う、便利ツールが有るようだ。

[sakae@fedora src]$ cargo new hoge --bin
[sakae@fedora src]$ cd hoge/
[sakae@fedora hoge]$ cargo run
   Compiling hoge v0.0.1 (file:///home/sakae/src/hoge)
     Running `target/hoge`
Hello, world!
[sakae@fedora hoge]$ cat src/main.rs
fn main() {
    println!("Hello, world!");
}

最近はハロワも自動化されてんのね。便利な世の中になったなあ。

早速、コピペから始める新言語の観光をしたいんだけど、その前の儀式、開発環境の整備が あるな。

rust語を書く時のemacs支援は、勿論有るよ。elpaからrust-modeを入れればよい。でもちょいと機能貧弱。 まだ補完も効かないし、、。新しい言語を勉強するなら教師が必要。そう、教師付き学習ね。 その為の教師が2人居た。flymakeとflycheck。リアルタイムに入力されたコードを分析して、 文法違反を犯すと真っ赤になって怒ってくれる人。ただ怒るだけじゃなくて、こうしたらええんで ないかいってアドバイスもしてくれる。(エラーは赤字になり、そこにカーソルを持って行くと、 ミニバッファーに、アドバイスが出る。)

はて、どちらが便利?評判を聞いてみると、flycheckの方が設定が楽そう。

;; flycheck
(add-hook 'after-init-hook #'global-flycheck-mode)

flycheck-rustを入れて、上記を設定するだけで、けなげに働き出すよ。家庭教師代は、 なんとゼロ円です。よかったね。

で、出来たコードを簡単に実行したい。そこで、コピペ文化の発動ですよ。Kadokawaのインターネット コースシリーズに、『ネットが生んだ文化』なんて本がある。その本に、日本は伝統的な コピペ文化が存在するって論が出てた。

本歌取。元になる歌から表現の一部を切り取って別の歌を作る技法。鎌倉時代に藤原定家が これを完成させたそうだ。他にも連歌という道もあるとか。歌を尻取りのように繋げて行く 貴族の遊び。一番最初の句を発句と言うとか。

おいらも貴族だな。発句をgo-modeにあったgodocに取り、それをコピペしてgo-runを作った。 今度は、それを繋げて、rust-runを作った。

(defun rust-run (query)
  "rust run on buffer *rust-run-output*"
  (interactive (list (buffer-file-name)))
  (unless (string= query "")
    (save-buffer)
    (start-process-shell-command "rust-run" "*rust-run-output*"
                                 (concat "cargo run "
                                         (read-from-minibuffer "args: ")))
    (switch-to-buffer "*rust-run-output*")
    nil))

(defun rust-clear-screen ()
  (interactive)
  (erase-buffer))

(define-key rust-mode-map (kbd "\C-c\C-r") 'rust-run)

内部は、cargoを使ってる。歌を詠むのに30秒のお手軽バージョンです。

[sakae@fedora hoge]$ emacs src/main.rs

で、起動すれば、取り合えずshellに戻ってくる必要無し。家庭教師の力を借りながら、 ひたすらコード書き。出来たら、C-c C-r で、実行と言うサイクルを回せば良い。

rustの配布物

とまあ、試運転を終えて、回りをうろうろしてみる。どんな物がやって来たの? /usr/local/binの下

-rwxr-xr-x. 1 root  root       893  1月 18 06:35 rust-gdb
-rwxr-xr-x. 1 root  root      6596  1月 18 06:35 rustc
-rwxr-xr-x. 1 root  root      6596  1月 18 06:35 rustdoc
-rwxr-xr-x. 1 root  root  10558440  1月 18 06:35 cargo

rustcってのがコンパイラーで、rustdocってのがソースに埋め込まれたコメントから 説明文書を作るアプリ。(普通のコメントは、// なんだけど、/// とした後に 書いたコメントは、rustdocの力を借りて、htmlとかの文書に変換出来るそうな) 後は、cargoだな。先ほど使った。

残りはrust-gdb 手回しよく、Bug出しに協力してねってのの支援ツールかな? 口を開けて、おいしい物が落ちてくるのを待ってるだけじゃなくて、製作にも エキストラで協力してねって事だな。

[sakae@fedora ~]$ cat /usr/local/bin/rust-gdb
#!/bin/sh
  :
# Find out where the pretty printer Python module is
RUSTC_SYSROOT=`rustc --print=sysroot`
GDB_PYTHON_MODULE_DIRECTORY="$RUSTC_SYSROOT/lib/rustlib/etc"

# Run GDB with the additional arguments that load the pretty printers
PYTHONPATH="$PYTHONPATH:$GDB_PYTHON_MODULE_DIRECTORY" gdb \
  -d "$GDB_PYTHON_MODULE_DIRECTORY" \
  -iex "add-auto-load-safe-path $GDB_PYTHON_MODULE_DIRECTORY" \
  "$@"

示されたgdbスクリプトをちょいと覗いてみると、こんな定義が出てきた。

STRUCT_KIND_REGULAR_STRUCT  = 0
STRUCT_KIND_TUPLE_STRUCT    = 1
STRUCT_KIND_TUPLE           = 2
STRUCT_KIND_TUPLE_VARIANT   = 3
STRUCT_KIND_STRUCT_VARIANT  = 4
STRUCT_KIND_CSTYLE_VARIANT  = 5
STRUCT_KIND_STR_SLICE       = 6

これらは、きっと綺麗に表示してくれるんだろうね。そのうちにご厄介になるかも。

ドキュメントはrustのWebへ行って眺めれば済む事なんだけど、同じ物が同梱されてた。 それはそれでいいんだけど、検索の為にjavascriptが使われていたりして、w3mでは 正しく表示されない。250Mも容量を喰ってるよ。

fedoraにfirefoxなりを入れる積もりはさらさら無いので、このhtml群をWindows7側に 移住させたよ。

APIの説明の所で、検索が使えるので観光には非常に便利です。iphone持って観光地に 出かける気分。(持ってないけどね。たとえ持ってても使わないだろうけどね。)

観光地で道案内とかを請う時は、 若い人より年寄りに聞くのが正解。服装は普段着の人、かつ持ち物に注意して選ぶべし。この見極めを 間違うと、観光客が観光客に案内を請うと言う笑えぬ事態になるぞ。 向こうから親切そうに 話かけて来る輩には注意。やつらは親切心じゃなくて、あんたの財布を欲しいだけですから。

ちょいと検索してみる。どうやってコマンドライン引数をプログラム内に取り込むか? 引数なら、きっとARGでしょうって事で、検索ワードに指定。

Results for ARG

std::io::process::Command::arg	Add an argument to pass to the program. 
std::rt::args	Global storage for command line arguments 
std::os::args	Returns the arguments which this program was started with (normally passed via the command line). 
std::io::process::Command::args	Add multiple arguments to pass to the program. 
  :

色々出てきたな。こういうのはOS依存してるだろうからってんで、2番目に焦点を当てる。


Function std::os::args Unstable [-]  [+] [src]

pub fn args() -> Vec<String>


Returns the arguments which this program was started with 
(normally passed via the command line).
The first element is traditionally the path to the executable,
 but it can be set to arbitrary text, and it may not even exist, 
so this property should not be relied upon for security purposes.
The arguments are interpreted as utf-8, with invalid bytes replaced 
with \uFFFD. See String::from_utf8_lossy for details.

Example

use std::os;

// Prints each argument on a separate line
for argument in os::args().iter() {
    println!("{}", argument);
}

おお、使用例まで出てきた。こういう風に充実してくれていると、現地でおろおろ しなくてよさげですよ。それから、[src]をクリックすると、文字通り、ソースを 参照出来る。これを読むのが一番の勉強になるかな。

ああ、脳科学者の茂木先生によると、声を出して読んで、手を動かして書いてって 具合に、5感をフルに使うのが脳記憶には有効だそうですよ。

コピペするんじゃなくて、写経するんだ。声を出せ!

・ ・ ・ おーえす ころころ アーグス かっこ こっか どっと イター かっこ こっか

ってな具合かな。家でやる分にはOKだろうけど、決して、図書館とかスタバとかマクドでは やるなよ。怪しい人って通報されますから。。。