rust-books

実践Rustプログラミング入門

前回、たまたま書籍のサンプルを見付てしまったので、DLして、楽しんでみる。本の案内は、 実践Rustプログラミング入門

5-3

  :
   Compiling todo v0.1.0 (/tmp/rustbook/ch05/5-3)
    Finished dev [unoptimized + debuginfo] target(s) in 12m 48s
warning: the following packages contain code that will be rejected by a future version of Rust: time-macros-impl v0.1.1
note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 1`
sakae@deb:/tmp/rustbook/ch05/5-3$ sqlite3 todo.db
sqlite> .schema
CREATE TABLE todo (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            text TEXT NOT NULL
        );
CREATE TABLE sqlite_sequence(name,seq);
HttpServer::new(move || App::new().service(index).data(pool.clone()))
    .bind("0.0.0.0:8080")?
    .run()
    .await?;
Ok(())

webからアクセスするとaddボタンつきの入力欄が出て来る。何か入力するとページが見えなくなるなあ。何か対策をしろって亊なんだろうね。本を購入しなさいか。

まて、次の節では完成させてるから、今のは実験施設なんだな。また、コンパイルしてもいいんだけど、こやつ巨大につき取扱注意。haskell並にコンパイルに時間がかかる。特にWeb系は、色々なものの寄せ集めだからなあ。

    HttpServer::new(move || {
        App::new()
            .service(index)
            .service(add_todo)
            .service(delete_todo)
            .data(pool.clone())
    })
    .bind("0.0.0.0:8080")?
    .run()
    .await?;
    Ok(())
}

答は、これっぽいな。

GUI

GUIはicedとな。Elmに刺激されて作ったとな。こちらが本拠地 iced

RustのIcedを使って簡単な画像ビューア を作った方がおられた。

Rust・GUIフレームワークicedでランチャーを作った こういう亊も出来るとな。

試しに7-2の基本をやってみる。用意に20分もかかるってGUIは大変だな。

WARNING: lavapipe is not a conformant vulkan implementation, testing use only.
wgpu error: Validation Error

Caused by:
    In a RenderPass
      note: encoder = `iced_wgpu encoder`
    In a set_scissor_rect command
    Invalid ScissorRect parameters

貧乏マシンは動かない定めです。みんな金持ちなんか。

で、かの本の目次を眺めていると、前回見付たcargo-fuzzなんてのが出てた。どうやら、オイラーは周回遅れである。ってか、何か本を買えよ。

実践Rust入門

『実践Rust入門』のサンプルプログラム

basicな入門書籍だ。ざっとrustで何が出来るか知るには良い本と思う。

今や、標準入出力装置になってるWebは、絶対に外せない話題。しっかりと解説されてるな。 当然の亊ながら、データベースも一緒に採り上げられている。

CI/CD なんて単語から、 Rustのビルドを高速化する方法 こんなのが出てきたぞ。CIってのは、継続的なインテグレーション。要するに、コード書いたらテストしての繰返しをしなさい。そこで、rustのコンパイルの遅さが足枷になってくるってやつだ。だから、まじに、裏技が検討されるんだな。

すぐやる課で、前回やったsqlite3のアプリのコンパイル状況を図にしてみた。

sakae@deb:/tmp/sql$ cargo +nightly build -p sql --release --timings
   Compiling pkg-config v0.3.24
   Compiling cc v1.0.73
   Compiling libc v0.2.121
   Compiling sqlite3-src v0.3.0
   Compiling sqlite3-sys v0.13.0
   Compiling sqlite v0.26.0
   Compiling sql v0.1.0 (/tmp/sql)
      Timing report saved to /tmp/sql/target/cargo-timings/cargo-timing-20220405T220856Z.html
    Finished release [optimized] target(s) in 1m 41s

htmlファイルが作成されるんで、それを眺めればよい。sqlite3のコンパイルに膨大な時間がかかっているってのがよく分る。一応、表も出て来るんでw3mな人も安心だ。

                    Unit                  Total  Codegen         Features
1.  sqlite3-src v0.3.0 build script (run) 81.5s
2.  cc v1.0.73                            5.7s  3.9s (69%)
3.  libc v0.2.121                         3.3s  0.6s (18%) default, std
4.  pkg-config v0.3.24                    2.6s  1.8s (69%)
5.  sqlite v0.26.0                        2.1s  1.5s (70%) default, linkage
6.  sql v0.1.0 bin "sql"                  1.4s
7.  libc v0.2.121 build script            1.3s             default, std
8.  sqlite3-src v0.3.0 build script       0.9s
9.  sqlite3-src v0.3.0                    0.6s  0.0s (2%)
10. sqlite3-sys v0.13.0                   0.5s  0.0s (3%)  linkage, sqlite3-src
11. libc v0.2.121 build script (run)      0.2s             default, std

Codegenってのは、マクロ展開してますって案内なのかな?

面倒なオプションを省いて、下記のようでもいける。

sakae@deb:/tmp/sql$ cargo +nightly b  --timings

上で、-p オプションとか知らないのが出てきたので調査。パッケージの指定なのね。想像でプロファイルかと思ってたぞ。謹んで訂正致します。それから、夜の部専用のオプションは、

sakae@pen:/tmp$ cargo -Z hel
 :
    -Z terminal-width          -- Provide a terminal width to rustc for error truncation
    -Z timings                 -- Display concurrency information

なんて風にして確認出来る。timingsに関しては、-Z が不要になったみたい。

Rustを実践的に学ぶには 勉強戦略も見付た。なる程ね。

go to rust

尼寺へ行けじゃなくて、rustへ行けじゃなくて、golangで書かれたやつをrustで表現しろという趣旨のやつ。こうして、一挙両得を目ざすんだね。以前にも似たようなのを見た記憶がある。 親類なんだな。

learning-systems-programming-in-rust

free-programming-books rust-pdfがあった。Webで読むより落ち着いてていいか。 それに、検索も一挙に出来るので有り難い。

こうして、あちこちを彷徨うと、お宝が出てくるものだ。このフリーな色々な言語の書籍は、年金生活者には、天からの贈り物と思えるぞ。

WebAssembly

RustでWebAssembly入門のためのまとめ

Software Design 2021年3月号 WebAssembly特集「WebAssembly入門」

1年たったから、そろそろほとぼりが醒めて、特集が組まれるかな。ソファーに寝転がって軽く読んでみたいものだ。

まて、今Hotなgolangが先だろう。前回書いたように、golangにジェネリックが来たんで、それの特集の方が先だろうね。営業戦略上、ブームに乗るのが鉄則ですから。

Command-Line Rust

Command-Line Rust: A Project-Based Primer for Writing Rust CLIs

つい最近の本みたい。内容は

01_hello/    05_wcr/      09_grepr/    13_calr/     rust.jpg
02_echor/    06_uniqr/    10_commr/    14_lsr/      test.sh*
03_catr/     07_findr/    11_tailr/    LICENSE      util/
04_headr/    08_cutr/     12_fortuner/ README.md

各章の後ろについている、r を省けば、コマンド名が出て来る。これは、名探偵 浅見光彦じゃなくても凡人でも気付く亊だ。ああ、たまたま、内田康夫さんの短編集を読んでいたものですから。

簡単なechoで試してみる。

vbox$ cargo r -- hello rust
    Finished dev [unoptimized + debuginfo] target(s) in 0.10s
     Running `target/debug/echor hello rust`
hello rust

2021年式になってるんで注意。それからCLIなんで、引数はcargoのそれと間違われないように、– で区切る亊。

どんな動作をすべきかは、mk-outs.shが付属してるんで、それを見ればよい。

#!/usr/bin/env bash

OUTDIR="tests/expected"
[[ ! -d "$OUTDIR" ]] && mkdir -p "$OUTDIR"

echo "Hello there" > $OUTDIR/hello1.txt
echo "Hello"  "there" > $OUTDIR/hello2.txt
echo -n "Hello  there" > $OUTDIR/hello1.n.txt
echo -n "Hello"  "there" > $OUTDIR/hello2.n.txt

これしきのshell scriptにbasshが登場するなんて、作者さん勘違いしてないか?

vbox$ cargo t

     Running tests/cli.rs (target/debug/deps/cli-127b6478e8043898)

running 5 tests
test dies_no_args ... ok
test hello1 ... ok
test hello1_no_newline ... ok
test hello2 ... ok
test hello2_no_newline ... ok

test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.12s
vbox$ cargo r -- --help
    Finished dev [unoptimized + debuginfo] target(s) in 0.09s
     Running `target/debug/echor --help`
echor 0.1.0
Ken Youens-Clark <kyclark@gmail.com>
Rust echo

USAGE:
    echor [FLAGS] <TEXT>...

FLAGS:
    -h, --help       Prints help information
    -n               Do not print newline
    -V, --version    Prints version information

ARGS:
    <TEXT>...    Input text

CLIの肝は、引数の処理がまずは簡単に出来るかだ。デファクト・スタンダードっぽいclapが使われている。

Command-line interface に色々と列挙されてる。cursive なんてのもセミGUIっぽくて面白いな。 clapは、巨大過ぎると、個人的感想。ならば対案をださんかい。そうしないと、取り敢えず反対しますの野党と看做されるぞ。ならば、pico-argsはどうよ。比較表が出てた。

cursive

FreeBSDのports設定の時やDebianの設定の時に出て来る あれ を再現してくれる。 取り敢えず、動くかFreeBSDで確認。

use cursive::views::{Dialog, TextView};

fn main() {
    // Creates the cursive root - required for every application.
    let mut siv = cursive::default();

    // Creates a dialog with a single "Quit" button
    siv.add_layer(Dialog::around(TextView::new("Hello Dialog!"))
                         .title("Cursive")
                         .button("Quit", |s| s.quit()));

    // Starts the event loop.
    siv.run();
}

なんか、Tcl/Tkな雰囲気だな。これだけ出すにも73ヶもの箱が必要ってのが、ちと玉に傷っぽいけど、楽しいからいいや。

[sakae@fb /tmp/cur]$ cargo tree
cur v0.1.0 (/tmp/cur)
└── cursive v0.17.0
    ├── cursive_core v0.3.1
    │   ├── ahash v0.7.6 (*)
    :
    │   ├── num v0.4.0
    │   │   ├── num-complex v0.4.0
    │   │   │   └── num-traits v0.2.14

こんな古いnumも使われていた。でも、複素数なんて必要なの? ひょっとしてマンデルブローを描画するために入れたんじゃないだろうな?

結構資料が豊富なのもありがたい。そんな資料の中で 描きくん - kakikun なんてのがあった。これも楽しい試みだ。GUIが無くてもへっちゃらだい。

OpenBSDでも動くかと思ったら、エラーになる木箱が有った。

   Compiling enum-map v2.1.0
error[E0599]: no method named `try_into` found for type `usize` in the current s
cope
   --> /home/sakae/.cargo/registry/src/github.com-1285ae84e5963aae/enum-map-2.1.0/src/internal.rs:85:15
    |
85  |         value.try_into().unwrap()
    |               ^^^^^^^^ method not found in `usize`
    |
    = help: items from traits can only be used if the trait is in scope
    = note: the following trait is implemented but not in scope; perhaps add a `use` for it:
            `use core::convert::TryInto;`

OpenBSD用のrustは年式が2018年バージョン。対してenum-mapは2021式。Cargo.tomlを変更したけど、まだこういう所で引っ掛るのね。多分、開発者は悪気があった訳ではないだろうけど、こういう端境期には要注意です。

そろそろOpenBSDも新しい版が出るはずなんで、2021式になるかな?


This year's Index

Home