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入門
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
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式になるかな?