t_wの輪郭

Rust

2022/2/18 20:22:00

プログラミング言語

あれあれFerrisBiomeあれsqlx循環参照は、メモリをリークすることもある『RustでWebバックエンドを書き始めてから1年くらい経った』シャドイングの嬉しさ「Rustでは、変数は標準で不変(immutable)」to_string()Displayprintlneprintlnsuper親モジュールから始まる相対パスは、superをつけることで構成できるmodRc<T>は、参照カウント方式のスマートポインタRc#strong_countRc#weak_countfn&Result<T, E>をテストで使うunwrap_or_elseis_errResult『Rust入門』演算子またはformatマクロで連結String可変参照は特定のスコープで、ある特定のデータに対しては、 一つしか可変な参照を持てないスコープを切れば同じ関数内で複数回の可変参照を使えるRefCellモジュール文字列リテラルcargo test -- --test-threads=1std::mem::dropで早期に値をドロップするあれstd::mem::drop「文字列リテラルは、高速で効率的」pubcollectトレイトはメソッド群の集合体iter()filterの試しiterpanicpretty-printcloneを使用する代償Rustの勉強RustでブラウザアドオンRustを勉強するあれStringの難しさgetResult<Hoge, &'static str>RUST_BACKTRACERustの整数型恐れるな!並行性『SeedでRust-onlyなポートフォリオサイトを作ってみた』src/lib.rsmutRustにて関数内で引数を変更する構造体を可変変数に入れてフィールドを書き換えるあれ#[test]あれ文字列スライスloop可変参照は1つしか存在してはいけない配列の各要素を取得するRust一家離散問題forargsArgs可変参照演算子&mutwasmでRustコンパイラーを動かすcargo-lambdaあれあれベクタ型ベクタの作成ベクタの変更ベクタの解放ベクタの要素を不変変数に借用した場合は、そのベクタの要素を変更・追加できなくなるベクタのgetと[]の要素取得の違いモジュールの中におけるものパッケージは1個までのライブラリクレートを持つことができるcargo test -- --nocapturecargo checkcargo testcargo new --lib {lib name}cargo docCargoCStr&strstrCargo.lock+演算子による文字列の結合push_strRustの文字列操作モジュールを複数のファイルに分割するcargo runRefCellを使うことは、内部可変性を得る方法の一つcargo buildformat#[should_panic]#[ignore]Rustでコマンドライン引数を受け取るベクタの走査に参照を使うのは所有権の移動対策ベクタの値を走査するstaticinto_iterの試しunionあれRustで作りたいものto_lowercaselines特質境界構文配列型Rustで遊んでたら疲れてきた参照渡しでは所有権の移動は発生しない参照渡しRc#cloneRc<T>をクローンすると、参照カウントが増えるSomeあれボックスで再帰的な型を可能にするBoxがスマートポインタなのは、Derefトレイトを実装しているからBoxString型文字列リテラルからString型を生成『所有権とは?』所有権の移動所有権tupdrop_ => ()_あれあれstd::rc::Rcstd::error::Errormatchの途中放棄(elseみたいなことをする)Box<Error>Boxはポインタぶら下がりポインタforあれexternパッケージはバイナリクレートをいくつでも持つことができるextern crateバイナリクレート戻り値String::new()Drop#drop+構文borrow of moved value戻り値による所有権の移動あれrandrand::thread_rngrand::thread_rng().gen_range(1, 101);モジュールツリーの要素を示すためのパスDropトレイトで片付け時にコードを走らせる借用#[derive(Display)]derive#[derive(Debug)]{:#?}#[derive(PartialEq, Debug)]Debug参照演算子?演算子あれ{:?}std::iofalsetruebool型if式の代入ifelse ifelsewhileRefCell<T>と内部可変性パターン『Linux 以外の OS への対応 - akaza-im / akaza』use super::*;*glob演算子use std::io;Rustの文字列リテラルをbyteとして走査useパッケージRustにはnullが存在しないDerefトレイトを実装して型を参照のように扱う『Rust製のngrok代替えツール「tunnelto」』Option<&V>HashMapに要素を追加HashMapの値を取得get_mutHashMapの値を変更HashMapを表示HashMapのキーに値がなかった時のみ値を挿入するentryor_insertHashMapOkErr『RustのLinux muslターゲット (その1:Linux向けのポータブルなバイナリを作る)』参照外し型強制は、 Derefを実装する型への参照をDerefが元の型を変換できる型への参照に変換しますFilevarcreatestd::time::Durationstd::collections::HashMapRustで指定した秒数停止するstd::fs::Filecontents&'staticstd::fsstd::timestd::memstdあれstd::cmp::Orderingstd::cmpcargo build --releaseenumの値は、その列挙子のいずれか一つにしかなり得ないNoneRustのNoneはenumの列挙子クレートはバイナリかライブラリのどちらかcrateクレートルートとは、Rustコンパイラの開始点となり、クレートのルートモジュールを作るソースファイルパッケージ はある機能群を提供する1つ以上のクレートクレート自動参照()structタプル構造体ユニット様構造体構造体更新記法enum「Rustには継承がない」トレイトRc<T>とRefCell<T>を組み合わせることで可変なデータに複数の所有者を持たせるライフタイム指定子ダングリング参照あれRustでの参照外し参照外しcmp自動参照および参照外しメソッド記法関連関数impl for特質を型に実装するimplあれ可変参照 (&mut) はCopy traitを実装していない関数に変数を渡すことによる所有権の移動コピーによる所有権の移動『多コピーの原罪』Copy特質のデフォルト実装mapの試しmaprustctrait引数の型として特質を使う戻り値の型が特質を実装していることを指定する引数の型が複数の特質を実装していることを指定するRustのクロージャはFn特質を実装しているDeref特質error[E0106]: missing lifetime specifierBox<dyn Foo>clone「Rustでは、 自動的にデータの"deep copy"が行われることは絶対にない」ぶら下がり参照rustc –explain E0106Rustでは関数で作成した変数への参照を戻り値で渡すことはできない&'生存期間指定子rustc --explain E0106 日本語訳Rustの勉強しながらいろいろ書いてるけど壮大に間違えてる気がするif letletあれwgpuあれburnElectronの代替を目指す軽量なRust製フレームワーク「Tauri」、リリース候補版に到達TauriOxlintRust から WebAssembly にコンパイルするRustからWebAssembly (wasm)を生成してJavaScriptとブリッジ通信してみるあれ一応 Rust の利を挙げるとすれば no_std のライブラリは一通り使える一方で AssemblyScript だと 既存の JS やら TS の資産は基本的に使えないということぐらいか『Fast and Portable Llama2 Inference on the Heterogeneous Edge』Rustでセル・オートマトンを作りたいPRRTTスタックpulldown-cmark不変変数の参照は不変スライス型strong_countRcborrow借用チェッカーあれRustの文字列リテラルを文字として走査std::env::args可変参照『Rustで書いたコードをAWS Lambdaにデプロイする』wingetでRustをインストール『Compilation to WASM?』『Wingetを利用してWindows11にRust/Rustupを導入する』Vecベクタは同じ型の値しか保持できないcargo doc --opencargo new {project_name} --bincargo new型注釈文字列リテラルは&strString::from#[cfg(test)]assert_eqDeref特質を実装することで、参照外し演算子の*の振る舞いを変更できるErrorあれ『参照と借用』『What #[derive(Display)] generates』特質を定義するRustの文字列リテラルは不変use std::collections::HashMap;sleepthread::spawn&'static strEnumを使うとベクタに複数の型を保持できるstd::envstd::errorstd::rcライブラリクレートクレートルートRustのループ構文selfユニット型『Rustがオブジェクト指向型言語ではないのとその理由』『Rustのトレイトはトレイトではない』参照外し演算子あれResult<(), Box<Error>>IteratorDroperror[E0782]: trait objects must include the dyn keywordRye『「Rust」「Tauri」などのモダン技術で開発されたWin/Mac/Linux対応ファイラー「Spacedrive」』Ferris Saysweak_countOrderingFile::createstd::vecstd::collectionsRustのenumとmatchmatchFnrustc –explain E0782 日本語訳あれクレートルートファイル

String

2022/2/18 21:34:00

Rustの文字列オブジェクト
文字のコレクション

String&strの結合

fn main() {
    let s1 = String::from("Hello, ");
    let s2:&str = "world!";
    let s3 = s1 + &s2;      // s1はs3へ所有権が移動し、使用できなくなる
    println!("{}", s3);     // Hello, world!
}

https://forest.watch.impress.co.jp/docs/review/1542623.html

  • Spacedriveでは既存のファイルシステムを抽象化した独自のファイルシステムが搭載
  • Spacedriveのファイルシステムは、ファイルの内容から一意のキー(ID)を作成し、それをもとに識別する
    • この仕組みはVDFS(virtual distributed filesystem:仮想分散ファイルシステム)と呼ばれている

『多コピーの原罪』

2022/3/26 16:27:00

https://blog.ojisan.io/many-copies-original-sin/


目次

  • Rust は GC を持たない
    • GC とは
    • Rust には GC がない
  • Clone と Copy とヒープについて
    • コピーできるもの・できないもの
    • ヒープに入るものは Copy しない
    • ヒープにあるものを Clone するとどうなるか
  • Rust における文字の種類
    • スライス
    • char
    • バイト列
    • String
    • &str
  • Rust で文字列を扱うためのプラクティス
    • イージーなやり方: すべて String
    • よくやるやり方: 戻り値だけ String
    • 入力を汎用的にする: Into
    • 理想的なやり方: 戻り値も &str
    • ライフタイム付きの参照で zero-copy の実現
    • いい感じに抽象化できるスマートポインタ、CoW
  • まとめ、感想、お気持ち

あれ

2022/3/12 15:00:00

RustWebAssemblyを勉強しているのだけれど、console.logするのにもひと手間必要で、JavaScriptを全部置き換えるぜみたいなことをしようとすると苦労しそうだということが分かった。

//Rustwasmからconsole.logするコード
web_sys::console::log_1(&format!("Hello, {}!", name).into());

結局、負荷が高い処理を抜き出して、そこだけWebassemblyにするのが楽そう