wasmに入門してみる【2】

前回からの続きです。 wasmに入門してみる【1】 wasmに入門してみる【3】 wasmに入門してみる【4】 作成したCargoパッケージをnpmパッケージから使う さて、前回までの状態だとhello-wasm-packを使っているので、せっかくRustで作ったwasmを使えていません。 使用できるようにするため、まずは前回wasm-pack buildで作成したpkgディレクトリに移動し、npm linkというコマンドを実行します。 このコマンドを使うと、npmパッケージをパブリッシュせずに相互に参照することが可能になるそうです。へー。 {{ url_title “https://qiita.com/k_kind/items/b3d04bd5a47ee26b6e2d" }} さっそく実行してみます。 % npm link added 1 package, and audited 3 packages in 713ms found 0 vulnerabilities 実行すると、npm install --globalで指定した際のディレクトリにシンボリックリンクが作成されます。 % ls -l /home/username/.anyenv/envs/nodenv/versions/17.9.0/lib/node_modules lrwxrwxrwx 1 username username 59 8月 8 22:56 wasm-game-of-life -> ../../../../../../../Project/personal/wasm-game-of-life/pkg nodenvを使っているのでこのようなディレクトリになっています。 nodenvはバージョンごとにグローバルなパッケージがインストールされるディレクトリが変わるので、もしnodenvで開発する場合はnodeのバージョンはpkgとwwwの両方のディレクトリで合わせる必要があります。 .node-versionの配置を忘れないようにしないといけませんね! では続けて、wwwディレクトリに移動して、先程作成したリンクへの依存を追加していきます。 npm link wasm-game-of-life このコマンドを実行すると、node_modulesの中にwasm-game-of-lifeへのシンボリックリンクが作成され、先程作成したシンボリックリンクと紐付きます。 つまり、pkgへのシンボリックリンクを持つことになります。 # wwwディレクトリで実行 % ls -l node_modules | grep wasm-game-of-life lrwxrwxrwx 1 username username 9 8月 8 23:06 wasm-game-of-life -> ../../pkg 最後に、www/index.jsのインポートをwasm-game-of-lifeモジュールを参照するようにしてあげれば完成です! ...

8月 8, 2023 · にあえん

wasmに入門してみる【1】

社内でwasmを触っているプロジェクトの人と話して、羨ましかったので入門してみる。 wasmに入門してみる【2】 wasmに入門してみる【3】 wasmに入門してみる【4】 wasmとは ブラウザ上で高速に動作するバイナリファイルのことです。 WebAssemblyとは?何ができるのか?できないことやユースケースをわかりやすく解説 |パーソルクロステクノロジー 主にC++やRustで実装されています。 2023-08-07のwasmの対応状況はこんな感じです。 safariやモバイル版operaを除いて、ほぼほぼ対応していますね。 WebAssembly | Can I use... Support tables for HTML5, CSS3, etc Cargoプロジェクトを作成する とにかく実装したかったので、Rustで実装してみます。 公式にチュートリアルが用意してあったので、これをなぞる形でやっていこうと思います。 チュートリアル - Rust and WebAssembly チュートリアルを実施するに際して、以下の3つのツールが必要なのでインストールしておきます。 私の場合はcargo-generateとwasm-packがなかったのでインストールしておきました。 wasm-pack cargo-generate npm cargo-generateを使用して、以下のgithubリポジトリをベースにパッケージを作成します。 cargo generate --git https://github.com/rustwasm/wasm-pack-template 名前は以下のようにしておきます。 wasm-game-of-life これでwasmのチュートリアルパッケージが生成されました。 Cargo.tomlの中身は以下のようになっています。 [package] name = "wasm-game-of-life" version = "0.1.0" edition = "2018" [lib] crate-type = ["cdylib", "rlib"] [features] default = ["console_error_panic_hook"] [dependencies] wasm-bindgen = "0.2.84" # The `console_error_panic_hook` crate provides better debugging of panics by # logging them with `console.error`. This is great for development, but requires # all the `std::fmt` and `std::panicking` infrastructure, so isn't great for # code size when deploying. console_error_panic_hook = { version = "0.1.7", optional = true } [dev-dependencies] wasm-bindgen-test = "0.3.34" [profile.release] # Tell `rustc` to optimize for small code size. opt-level = "s" 見てみると、crate-typeというセクションがありますね。 ...

8月 7, 2023 · にあえん

prisma-client-rust + actix-webで簡単RESTクライアント実装

以前、prisma-clientでGraphQLに入門しました。 せっかくRustを触りだしたので、prismaでRustクライアントを出力できるprisma-client-rustを使用してRESTアプリケーションを構築してみたいと思います。 GitHub - Brendonovich/prisma-client-rust: Type-safe database access for Rust Cargoパッケージの初期化 まずは元になるパッケージを作成します。 % cargo new prisma-for-rest Created binary (application) `prisma-for-rest` package せっかくこの前学んだので、このパッケージに移動して安定版の最新バージョンを参照するrust-toolchain.tomlを作っておきます。 [toolchain] channel = "stable-2023-07-12" 続けてデータベース用のパッケージを作成します。 cargo new database データベース用のパッケージに移動し、prisma-client-rustを依存関係に追加します。 [dependencies] prisma-client-rust = { git = "https://github.com/Brendonovich/prisma-client-rust", tag = "0.6.8" } prisma-client-rust-cli = { git = "https://github.com/Brendonovich/prisma-client-rust", tag = "0.6.8" } database/src/main.rsに、prisma-client-rust用のCLIを操作するための実装を追記します。 fn main() { prisma_client_rust_cli::run(); } prisma-client-rust-cliの呼び出しを簡素化するため、.cargo/config.tomlというファイルを作成して以下のような設定を追記します。 [alias] prisma = "run --" これにより、cargo prismaでprisma-client-rust-cliの呼び出しが可能になりました。 % cargo prisma --help Finished dev [unoptimized + debuginfo] target(s) in 0.49s Running `target/debug/database --help` ◭ Prisma is a modern DB toolkit to query, migrate and model your database (https://prisma.io) Usage $ prisma [command] Commands init Set up Prisma for your app generate Generate artifacts (e.g. Prisma Client) db Manage your database schema and lifecycle migrate Migrate your database studio Browse your data with Prisma Studio validate Validate your Prisma schema format Format your Prisma schema Flags --preview-feature Run Preview Prisma commands Examples Set up a new Prisma project $ prisma init Generate artifacts (e.g. Prisma Client) $ prisma generate Browse your data $ prisma studio Create migrations from your Prisma schema, apply them to the database, generate artifacts (e.g. Prisma Client) $ prisma migrate dev Pull the schema from an existing database, updating the Prisma schema $ prisma db pull Push the Prisma schema state to the database $ prisma db push Validate your Prisma schema $ prisma validate Format your Prisma schema $ prisma format prismaスキーマの初期化 Prisma CLIが使えるようになったので、CLIからPrismaの初期化を行います。 ...

8月 5, 2023 · にあえん

Rustのworkspaceの使い方

またまたRustについてです。 今回はworkspace機能についてよくわからなかったので勉強がてら書いていこうと思います。 Rustのワークスペースとは 大元であるCargoパッケージ内に複数パッケージがある場合に、相互にパッケージを扱うための機能です。 大きくなってきたプロジェクトで使用します。 Cargoのワークスペース - The Rust Programming Language 日本語版 公式のチュートリアルをなぞる形になりますが、やってみます。 まずはワークスペース機能のチュートリアルを行うCargoパッケージを作成します。 cargo new rust-workspace-playground 作成したパッケージに移動し、更にadderというパッケージを作成します。 cargo new adder この時点でcargo buildしても、adderの依存性をrust-workspace-playgroundには記述していないため、targetに出力されるのはrust-workspace-playgroundにあるhello worldプログラムのみです。 # cargo build実行後のtargetディレクトリの中身 target ├── CACHEDIR.TAG └── debug ├── build ├── deps │ ├── librust_workspace_playground-25fa51ac7f690b9a.rmeta │ ├── librust_workspace_playground-5cbc2718815bd853.rmeta │ ├── librust_workspace_playground-9f7880f2efd546b2.rmeta │ ├── rust_workspace_playground-01238b030f757f04 │ ├── rust_workspace_playground-01238b030f757f04.d │ ├── rust_workspace_playground-25fa51ac7f690b9a.d │ ├── rust_workspace_playground-5cbc2718815bd853.d │ └── rust_workspace_playground-9f7880f2efd546b2.d ├── examples ├── incremental │ ├── rust_workspace_playground-1xmwk187vqtbq │ ├── rust_workspace_playground-3oehp425tljca │ ├── rust_workspace_playground-3tb4u1zdv4nwu ├── rust-workspace-playground └── rust-workspace-playground.d ここで、rust-workspace-playgroundのCargo.tomlに以下のworkspaceセクションを追加します。 ...

8月 5, 2023 · にあえん

Rustのrust-toolchain.tomlについて

Rustが楽しくてAWS SAAの資格勉強が全然捗りません。かなしい(自業自得) 前回のブログで軽く触れた、プロジェクトでRustを動かす際に役立つrust-toolchainファイルについて勉強がてら紹介していこうと思います。 Rustのバージョン管理について プロジェクトのバージョン管理はそれぞれの言語で違います。 (nodeであればnodenv、pythonであればpyenvなど…) Rustの場合、使用するバージョンをプロジェクトごとに決める際は、rust-toolchain.tomlが役に立ちます。 Overrides - The rustup book これにより、各プロジェクトごとにRustのバージョンを切り替える必要がなくなります。 使用するためにはrustupのバージョンを1.23.0以上にしてあげる必要があります。 rust-toolchain.tomlの形式は以下のとおりです。 [toolchain] channel = "nightly-2023-08-03" components = [ "rustfmt", "rustc-dev" ] targets = [ "wasm32-unknown-unknown", "thumbv2-none-eabi" ] profile = "minimal" バージョンだけ指定するならchannelだけ指定してあげればいいです。 [toolchain] channel = "nightly-2023-08-03" これをCargoパッケージ配下に配置することで、バージョンの指定が可能になります。 もしインストールされていないバージョンが指定されていた場合、cargo buildなどを行うと以下のように自動でバージョンのインストールを行ってくれます。 以下はnightly-2023-08-03をインストールしていない状態でchannelにnightly-2023-08-03を指定し、cargo testを実行した際の出力です。 % cargo test info: syncing channel updates for 'nightly-2023-08-03-x86_64-unknown-linux-gnu' info: latest update on 2023-08-03, rust version 1.73.0-nightly (8131b9774 2023-08-02) info: downloading component 'cargo' info: downloading component 'clippy' info: downloading component 'rust-docs' info: downloading component 'rust-std' info: downloading component 'rustc' info: downloading component 'rustfmt' info: installing component 'cargo' info: installing component 'clippy' info: installing component 'rust-docs' info: installing component 'rust-std' info: installing component 'rustc' info: installing component 'rustfmt' Compiling helper v0.1.0 (/home/username/Project/study/rust-lib-and-bin-playground/helper) Finished test [unoptimized + debuginfo] target(s) in 0.72s Running unittests src/lib.rs (target/debug/deps/helper-bf168264d06a5721) running 2 tests test test::bench_add_two ... ok test test::test_add ... ok test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests helper running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s きちんとインストールされますね! ...

8月 5, 2023 · にあえん

【Rust】Cargoターゲットの使い分け方

やっと…仕事でRustを触れるようになりました!!! 嬉しい!! とはいえ、Rustでたまに実装しているものの、基本pythonでしか実装していない日々だったので、どういうルールがあったのかを忘れてしまいました。。 まずはCargoターゲットについて学習していきたいと思い、その備忘録になります。 CargoパッケージとCargoターゲットとは Rustでプロジェクトを作るときはまずcargo new [プロジェクト名]のように、cargoを利用してプロジェクトの基盤をまず作ると思います。 ここで作られたプロジェクトのことは「Cargoパッケージ」と言います。 Cargoパッケージには以下に分類されるコードを含めることができます。 library binary example test benchmark Cargo Targets - The Cargo Book library ライブラリは、Cargoパッケージから参照される想定のコードのことです。 CLIのようなバイナリとして実行するアプリケーションではなく、他のRustライブラリが参照することを想定して実装する場合はこちらを使います。 binary 文字通りバイナリとしてビルドし実行する想定のコードのことです。 こちらはライブラリのように他のRustライブラリが参照するというよりは、単体で動作するソフトウェアを作るのに役立ちます。 example 主にライブラリの使用例を表すコードのことです。 cargoの各コマンドで使用例を使うためのサポートがされています。 You can run individual executable examples with the cargo run command with the –example option. Library examples can be built with cargo build with the –example option. cargo install with the –example option can be used to copy executable binaries to a common location. ...

8月 3, 2023 · にあえん