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