t_wの輪郭

Feedlyでフォローするボタン
プログラミング言語『この技術が分からん2020』Cloudflare workersの対応言語

Rust

2022/2/18 20:22:00

プログラミング言語

PRRTTスタック『「Rust」「Tauri」などのモダン技術で開発されたWin/Mac/Linux対応ファイラー「Spacedrive」』Tauri『この技術が分からん2020』『多コピーの原罪』String『Fast and Portable Llama2 Inference on the Heterogeneous Edge』一応 Rust の利を挙げるとすれば no_std のライブラリは一通り使える一方で AssemblyScript だと 既存の JS やら TS の資産は基本的に使えないということぐらいかあれRust から WebAssembly にコンパイルするElectronの代替を目指す軽量なRust製フレームワーク「Tauri」、リリース候補版に到達Cloudflare workersの対応言語burnRyeあれクレートルートファイルクレートルート+演算子による文字列の結合RustからWebAssembly (wasm)を生成してJavaScriptとブリッジ通信してみるOxlintRustでセル・オートマトンを作りたいwgpuあれRustの勉強あれif letifHashMapの値を変更Rustの文字列リテラルを文字として走査ベクタの値を走査するformatpush_strRustの勉強しながらいろいろ書いてるけど壮大に間違えてる気がするRustの文字列リテラルをbyteとして走査HashMapの値を取得let関連関数RefCell<T>と内部可変性パターンrustc --explain E0106 日本語訳&'ライフタイム指定子Rustでは関数で作成した変数への参照を戻り値で渡すことはできない&'staticあれぶら下がり参照戻り値rustc –explain E0106生存期間指定子error[E0106]: missing lifetime specifierrustcerror[E0782]: trait objects must include the dyn keywordBoxrustc –explain E0782 日本語訳「Rustでは、 自動的にデータの"deep copy"が行われることは絶対にない」clone『所有権とは?』Rc<T>をクローンすると、参照カウントが増えるcloneを使用する代償借用Rustにて関数内で引数を変更するBox<dyn Foo>Result<(), Box<Error>>特質トレイトDropDerefIteratorRustのクロージャはFn特質を実装しているFn戻り値の型が特質を実装していることを指定する参照外し型強制は、 Derefを実装する型への参照をDerefが元の型を変換できる型への参照に変換しますDerefトレイトを実装して型を参照のように扱うDeref特質を実装することで、参照外し演算子の*の振る舞いを変更できるcollectmapあれあれあれ特質境界構文impltrait特質のデフォルト実装特質を定義するCopyダングリング参照引数の型として特質を使う引数の型が複数の特質を実装していることを指定するあれDropトレイトで片付け時にコードを走らせるiter+構文fnDrop#dropBoxがスマートポインタなのは、Derefトレイトを実装しているから特質を型に実装するBox<Error>Resultmapの試しVecforimpl for関数に変数を渡すことによる所有権の移動可変参照 (&mut) はCopy traitを実装していないborrow of moved value戻り値による所有権の移動参照渡しでは所有権の移動は発生しない&mut可変参照メソッド記法selfHashMapに要素を追加自動参照および参照外しcmp自動参照参照外しstd::cmp::OrderingRustでの参照外し参照外し演算子あれRustで作りたいもの所有権の移動structあれコピーによる所有権の移動あれRc<T>とRefCell<T>を組み合わせることで可変なデータに複数の所有者を持たせる『Rustのトレイトはトレイトではない』『Rustがオブジェクト指向型言語ではないのとその理由』「Rustには継承がない」enummatchの途中放棄(elseみたいなことをする)Enumを使うとベクタに複数の型を保持できるRustのenumとmatchenumの値は、その列挙子のいずれか一つにしかなり得ない構造体更新記法ユニット様構造体タプル構造体ユニット型構造体を可変変数に入れてフィールドを書き換えるRefCellRcトレイトはメソッド群の集合体RustでブラウザアドオンRustのNoneはenumの列挙子()_ => ()あれRustのループ構文forwhileloop「Rustでは、変数は標準で不変(immutable)」クレートモジュールパッケージ はある機能群を提供する1つ以上のクレートクレートはバイナリかライブラリのどちらかrandバイナリクレートライブラリクレートクレートルートとは、Rustコンパイラの開始点となり、クレートのルートモジュールを作るソースファイルパッケージcrateextern crateパッケージは1個までのライブラリクレートを持つことができる型注釈NoneCargocargo builddropmutRustにはnullが存在しないcargo build --releaseあれmatchstd::cmpOrderingstdあれstd::rcstd::memstd::timestd::errorstd::fsstd::envstd::collectionsstd::vecthread::spawnsleepstd::error::Errorstd::fs::Filevarstd::env::argsstd::collections::HashMapuse std::collections::HashMap;static&'static str文字列リテラルResult<Hoge, &'static str>contents&strFile::createFileRustで指定した秒数停止するErrOk『RustのLinux muslターゲット (その1:Linux向けのポータブルなバイナリを作る)』or_insertentryHashMapを表示get_mut{:#?}{:?}SomeOption<&V>getstd::rc::Rcstd::time::DurationcreateHashMapHashMapのキーに値がなかった時のみ値を挿入する&std::mem::drop『Rust製のngrok代替えツール「tunnelto」』パッケージはバイナリクレートをいくつでも持つことができるuseuse super::*;glob演算子use std::io;Rustの文字列リテラルは不変std::io*pub『Linux 以外の OS への対応 - akaza-im / akaza』else iftrueif式の代入superelsefalsebool型参照演算子あれ演算子またはformatマクロで連結#[derive(PartialEq, Debug)]pretty-printDebug?演算子#[derive(Debug)]derive『What #[derive(Display)] generates』Displayborrowベクタの要素を不変変数に借用した場合は、そのベクタの要素を変更・追加できなくなる不変変数の参照は不変『参照と借用』借用チェッカーrand::thread_rng().gen_range(1, 101);#[derive(Display)]モジュールツリーの要素を示すためのパスrand::thread_rngString::new()externBoxはポインタError_ぶら下がりポインタRc<T>は、参照カウント方式のスマートポインタ所有権ベクタの解放tupベクタの走査に参照を使うのは所有権の移動対策文字列リテラルからString型を生成あれ循環参照は、メモリをリークすることもあるString型assert_eqRustで遊んでたら疲れてきたベクタは同じ型の値しか保持できないRc#clone参照渡し配列型ボックスで再帰的な型を可能にする『SeedでRust-onlyなポートフォリオサイトを作ってみた』あれlinesto_lowercaseunion恐れるな!並行性into_iterの試しBiomecargo-lambda「文字列リテラルは、高速で効率的」『Rustで書いたコードをAWS Lambdaにデプロイする』あれStringの難しさcargo run#[cfg(test)]cargo checkCargo.lockfilterの試しRustでコマンドライン引数を受け取るベクタのgetと[]の要素取得の違いRust一家離散問題配列の各要素を取得するあれFerris Saysあれsqlxpulldown-cmark『RustでWebバックエンドを書き始めてから1年くらい経った』『Compilation to WASM?』cargo doccargo new --lib {lib name}cargo testcargo newcargo doc --opencargo test -- --test-threads=1String::fromRustの文字列操作ベクタの変更ベクタの作成Ferriscargo new {project_name} --bincargo test -- --nocapturestrベクタ型rotate_right文字列スライス文字列リテラルは&strRc#weak_countRc#strong_countweak_countstrong_countRefCellを使うことは、内部可変性を得る方法の一つモジュールを複数のファイルに分割する親モジュールから始まる相対パスは、superをつけることで構成できるモジュールの中におけるものResult<T, E>をテストで使う#[test]eprintlnあれスライス型可変参照は特定のスコープで、ある特定のデータに対しては、 一つしか可変な参照を持てない可変参照演算子可変参照は1つしか存在してはいけないprintlnCStrスコープを切れば同じ関数内で複数回の可変参照を使えるRUST_BACKTRACE『Rust入門』args#[ignore]#[should_panic]to_string()『Wingetを利用してWindows11にRust/Rustupを導入する』is_errunwrap_or_elseあれあれRustを勉強するiter()src/lib.rsRustの整数型wasmでRustコンパイラーを動かすあれwingetでRustをインストールmodLinderapanicシャドイングの嬉しさArgsあれstd::mem::dropで早期に値をドロップするpolars『コンセプトから理解するRust』uvRuffCircomoxcRustの機械学習ライブラリDioxus『Effective Rust ―Rustコードを改善し、エコシステムを最大限に活用するための35項目』『Google Online Security Blog: Eliminating Memory Safety Vulnerabilities at the Source』「Google provided a $1,000,000 grant to the Rust Foundation」Rust Foundation『Rust vs. Zig in Reality: A (Somewhat) Friendly Debate  - The New Stack』Effective RustAxumNova『RustによるWebアプリケーション開発 設計からリリース・運用まで』Rust製『RustでWeb開発コソコソ噂話 - Speaker Deck』

Axum

2024/10/21 9:53:00

Nova

2024/10/15 6:33:00

oxc

2024/9/1 10:20:00

Ruff

2024/8/8 10:11:00

uv

2024/8/1 10:52:00

Ferris Says

2024/3/31 13:38:00

Ferris SaysはRustのマスコットであるFerrisがAAで話すコマンド
https://github.com/rust-lang/ferris-says

 __________________________
< Hello fellow Rustaceans! >
 --------------------------
        \
         \
            _~^~^~_
        \) /  o o  \ (/
          '_   -   _'
          / '-----' \

sqlx

2024/3/25 23:36:00

polars

2024/3/14 7:37:00

pandasより速いらしい

あれ

2024/2/18 15:03:00

wasmerでRustをコンパイルしてwasmerで動かす!????!?

さすがにwasmerのpackageにRustのコンパイラーは無いな。
もしあったらブラウザ上でRustのコンパイルができてしまうところだった。


wasmerでbashを動かしてその上でRustをコンパイル?!?!?!???
いや、bashはあるけどcurlが入ってないから無理だな。


探したらGithub Issue(『Compilation to WASM?』)が立っているのを見つけた。考えることは同じだな。


Pythonは結構早くからwasmで動くようになってるから、Rustもそんなに時間がかからんのじゃなかろうか。

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

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

Rye

2023/9/1 0:27:00

あれ

2023/7/17 22:55:00

goから越境してrustやるの嫌じゃな~~~。

そもそも、wgpuのレポジトリ見てても動かし方がよくわからん。

なんとなくIssueをcompute shaderで検索して眺めてみる。すでにIssueが出てれば幸甚。

なかったわ。一般的には巨大シェーダーを動かす動機がないらしい。


wgpuのレポジトリにExampleを発見したので動かしてみる。

wgpuでboidsが動いた。やったねたえちゃん!


巨大シェーダー実証の元としてhello-computeが良さそう。コードが簡単。見覚えもある。

サクッとシェーダーを書き換えてみたら動いた。いいぞ。


条件分岐が1万行の巨大シェーダーを試してみた結果、wgpuにおいてはそんなに時間がかからない。500msとかそんなもん。じゃあRustでwgpu使って遺伝的プログラミングすればええやんという判断が浮かび上がってくるが、Rust難しすぎてあれなのであれ。覚悟を決めるのに1週間ぐらいかかるやつ。

とはいえ現状は wgpu → wgpu-native → go-webgpu という依存をしており、wgpuを直接ぶったたくよりも隔靴搔痒となる。依存しているコードがどこでどう変わるかもわからない。wgpuはブラウザでも使われているらしいので、多分大丈夫だろう。

本丸の遺伝的プログラミングのコードは2000行程度なので、1週間もあれば行ける気がする。Rustを理解できれば。

その前にgo-webgpuをアップデートすべく、go get -uを叩く。よし、最新版でも直ってない。wgpuに乗り換えだ。

遺伝的プログラミングのコード全部を書き換えるのは骨が折れる。泣く。なので、wgpuを叩く部分だけRustで書けばええんちゃうんかという判断が生えてくる。『wgpu-go』や。

念のためにgoでもrustで動かしたのとまったく同じシェーダーを実行してみる。いや、普通に動く。先生……!これは……!条件分岐の数がCreateComputePipelineの処理時間に影響していると思われていたが、実はそうではなかった可能性が高い。Rustのwgpuで行った検証も不十分だった可能性が高い。

配列アクセスが悪いのではないかと思い至り、配列利用型巨大WGSLシェーダーを動かしてみたが普通に動く。機序がわからん。キショい。

関数実行が悪いのではないかと思い至り、配列及関数利用型巨大WGSLシェーダーを動かしてみたが普通に動く。静的だと最適化してないかこいつ。


関数がインライン展開されている気がしてきた。多分。わからんけど。そう考えると、関数の再起呼び出しができないのも、配列の添え字に変数が使えないのもしっくりくる。


「気晴らしにcompute.toysとか言うので遊んでみるかぁ」つって、何気なく配列の添え字に変数を入れてみたところ、なんと動いた。はぁ?じゃあっつって、最新版のgo-webgpuだとどうなんのよって試したら配列の添え字に変数を入れても動く。CreatePipelineも300ms以内に終わる。はぁ???今までの苦労は何だったんだ。3日返してほしい。

なお、最新版が出てきたのは5 days agoである。タイムリー。

あれ

2023/7/17 13:57:00
Rust Visual C++ prerequisites

Rust requires a linker and Windows API libraries but they don't seem to be
available.

These components can be acquired through a Visual Studio installer.

1) Quick install via the Visual Studio Community installer
   (free for individuals, academic uses, and open source).

2) Manually install the prerequisites
   (for enterprise and advanced users).

3) Don't install the prerequisites
   (if you're targeting the GNU ABI).

>

Visual Studioに依存しててキショいな。Windowsやめたい。

MSYS2が入った状態で3)を選んだらインストールまでは行けた

rustup set default-host x86_64-pc-windows-gnuをしたうえでcargo runしたら動いた

wgpu

2023/7/11 23:01:00

WebGPUのRust実装

あれ

2023/6/11 22:30:00

くそー
AI界隈は早くRustか何かに移ってくれ

あれ

2023/1/8 20:26:00

Denoで書いたけど、Rustに移植したくなってきた。

『多コピーの原罪』

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にするのが楽そう

あれ

2022/3/10 20:51:00

Rustでプログラムを書いてみているのだけれど、静的型付け言語良いなってなってる。コンパイラ、というかエディタのコード検査に従って書いて、コード検査上の問題(コンパイルエラー)がなくなればいい感じに動くことが多い。

あれ

2022/3/9 12:50:00

 Rustのコンパイル時間は決して短いものではないのだけど(1秒で終わらない)、コンパイルエラーで不具合を発見できることによる時間的な効果は高そう。これがインタープリタで動作する言語だと動作確認して初めてバグに気づくみたいなことが多い。
 動作確認に要する時間 > コンパイル時間 と捉えられる。
 コンパイル時間が短縮されるよりも検査で発見される不具合が増える方が嬉しい。

Rc

2022/3/2 20:41:00

あれ

2022/3/2 20:40:00
    #[test]
    fn test_mem_drop() {
        struct CustomSmartPointer {
            data: String,
        }
        
        impl Drop for CustomSmartPointer {
            fn drop(&mut self) {
                println!("Dropping CustomSmartPointer with data `{}`!", self.data);
            }
        }
        
        let c = CustomSmartPointer {data: String::from("my stuff")};
        let d = CustomSmartPointer {data: String::from("other stuff")};
        println!("CustomSmartPointers created.");

        drop(c);

        println!("exit function!");

        //関数を抜ける際:
        //Dropping CustomSmartPointer with data `other stuff`!
        //Dropping CustomSmartPointer with data `my stuff`!
    }

あれ

2022/3/2 20:37:00
    #[test]
    fn test_CustomSmartPointer() {
        struct CustomSmartPointer {
            data: String,
        }
        
        impl Drop for CustomSmartPointer {
            fn drop(&mut self) {
                println!("Dropping CustomSmartPointer with data `{}`!", self.data);
            }
        }
        
        let c = CustomSmartPointer {data: String::from("my stuff")};
        let d = CustomSmartPointer {data: String::from("other stuff")};
        println!("CustomSmartPointers created.");

        //関数を抜ける際:
        //Dropping CustomSmartPointer with data `other stuff`!
        //Dropping CustomSmartPointer with data `my stuff`!
    }

Drop

2022/3/2 20:29:00

あれ

2022/3/2 20:20:00
fn hello(text:&str) {
    println!("Hello, {}!", &text);
}
let m = Box::new(String::from("Rust"));
hello(&m);    //Hello, Rust!

あれ

2022/3/2 20:05:00
let x=5;
let y=Box::new(x);

assert_eq!(5, x);
assert_eq!(5, *y);
//assert_eq!(5, y); //can't compare `{integer}` with `Box<{integer}>`

あれ

2022/3/2 19:38:00

Boxに値を入れると、スタックではなくヒープにデータを格納することができる

cargo doc

2022/2/26 21:57:00

HTMLドキュメントを生成