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セクションを追加します。 ...

2023年8月5日 · にあえん

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 きちんとインストールされますね! ...

2023年8月5日 · にあえん

【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. ...

2023年8月3日 · にあえん

PrismaでGraphQLに入門する

Prismaを使うとGraphQLが簡単にできるようなので、やってみました。 前回書いた、Prismaとdbdocsを組み合わせて使ってみたという記事の実質続きみたいな感じです。 ジェネレーターを実装する GraphQLを扱うためにはリゾルバという実装が必要なようですが、これをスキーマ定義から作成するようにします。 既に構築済みのprismaプロジェクトがある場合、typegraphql-prismaを追加するだけです。 https://prisma.typegraphql.com/docs/intro yarn add -D typegraphql typegraphql-prisma 追加したら、schema.prismaに以下のgeneratorセクションを追加します。 generator typegraphql { provider = "typegraphql-prisma" } 追加したら以下のコマンドでリゾルバが作成されます。 npx prisma generate 作成されたリゾルバは、デフォルトではnode_modules/@generated/type-graphqlにあります。 GraphQLのサーバーを構築する 本題です。 Apolloを使用してGraphQLサーバーを構築しました。 実装はこちらを参考にしつつ行いました。 https://prisma.typegraphql.com/docs/basics/usage import { PrismaClient } from "@prisma/client"; import { ApolloServer, BaseContext } from "@apollo/server"; import { startStandaloneServer } from "@apollo/server/standalone"; import { resolvers } from "@generated/type-graphql"; import { buildSchema } from "type-graphql"; (async () => { const schema = await buildSchema({ resolvers, validate: false, }); const prisma = new PrismaClient(); interface Context { prisma: PrismaClient; } const server = new ApolloServer<Context>({ schema, }); const { url } = await startStandaloneServer(server, { context: async () => ({ prisma }), listen: { port: 4000 }, }); })(); 最新のApolloだと、contextの関数がasyncになっているので注意が必要です。 ...

2023年7月30日 · にあえん

prisma + dbdocsで楽しくデータベース設計する

つい先日dbdocsに入門したという記事を書きましたが、dbdocsではDBマイグレーションの管理などはできないので、ちょっとそこが不満でした。 今回はPrismaに入門して、dbdocsと組み合わせることでGUIでも Prismaとは DBクライアント、DBマイグレーション、GUI出力といった機能が一体となったツールです。 Node.jsとTypeScriptを使用しています。 Prisma | Agent Infrastructure for TypeScript DBクライアントやDBマイグレーションのプレイグラウンドも用意してあります。親切。 Prisma | Agent Infrastructure for TypeScript とりあえずマイグレーションを体験してみる QuickStartに沿ってやっていきましょう。 Quickstart: Prisma ORM with Prisma Postgres (5 min) | Prisma Documentation TypeScriptのプロジェクトは既に作成した前提で、関連するモジュールを追加していきます。 npm install prisma --save-dev 次にprismaの初期化処理を行います。 あんまり凝った構成にすると疲れるので、とりあえずSQLiteを使います。 npx prisma init --datasource-provider sqlite すると、プロジェクトにprisma/schema.prismaというファイルが作成されます。 // This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema generator client { provider = "prisma-client-js" } datasource db { provider = "sqlite" url = env("DATABASE_URL") } このファイルに以下のモデルを追加していきます。 ...

2023年7月30日 · にあえん

nodenvのnpmでインストールしたyarnからglobal addで追加したパッケージが使用できなかったときの対策

グローバルに追加したいパッケージがどうもうまく動いてくれなかったときの対応策を備忘録として残します。 このありがたい記事のおかげで助かりました。 nodenv管理下の npm で yarn を install した時に yarn の PATH が通らなかった時の対処メモ #YARN - Qiita 結論 yarn global add ...やnpm install -g ...の実行後、以下のコマンドを実行します。 nodenv rehash これで使えるようになりました。 めでたしめでたし。

2023年7月29日 · にあえん

dbdocsでDBML管理入門してみる、あわよくばCI/CDもやる

DBML、便利ですよね。 https://dbml.dbdiagram.io/home/ 開発初期の段階でER図の共有やSQLのエクスポートなどで非常に役立つツールです。 しかし、それは開発初期の話。 開発が進むにつれて実装とDBMLに齟齬が生じてしまうため、メンテナンスがされなくなっていってしまいます。。 今回は、DBMLの管理をローカルから行うことが可能なdbdocsというツールを見つけたので、紹介したいと思います。 dbdocs.io - Database Documentation and Catalog Tool 使い方 早速インストールしてみます。 npm install -g dbdocs (余談ですが、僕の環境ではnodenvを使用していたんですが、この-gオプションでインストールしたパッケージがうまく動かなかったので直したときの記事もあるので良ければこちらもどうぞ↓) nodenvのnpmでインストールしたyarnからglobal addで追加したパッケージが使用できなかったときの対策 無事インストールできたら、まずはdbdocsにログインしましょう。 dbdocs login Choose a login methodと表示されたので、Githubを選択するとWebブラウザに遷移するので、そこでログインを行うとトークンが発行されます。 発行されたトークンをターミナルに貼り付ければログイン完了です。 では次にdbmlファイルを実装します。 今回は簡易的にDBエンジンとしてPostgresを使用し、ユーザーテーブルのみがあるデータベースを設計しました。 Project social_blogging_site { database_type: 'PostgreSQL' } Table user { id uuid [pk] name varchar [not null] create_time timestamp [not null] update_time timestamp [not null] archive_time timestamp } これをdatabase.dbmlとして保存し、以下のコマンドを実行します。 dbdocs build database.dbml --project=test 無事作成が完了すると、以下のような画面が表示されます。 Visitに書かれているURLに遷移すると、プロジェクトページに遷移することができます。 また、画面上部のRelationをクリックすると各テーブルの依存関係を見ることができます。 これだけだと分かりづらいので、テーブルを増やしてみます。 ...

2023年7月29日 · にあえん

AWSのAppSync is 何

SAAの模試で、DynamoDBを使用してリアルタイムデータ処理を行うWebアプリケーションの構築方法という問題で間違えてしまいました。 AppSyncを使うのが正解らしいのですが、AppSyncってなんぞ!?となったので調べました。 AppSyncとは AWS AppSync は、サーバーレスの GraphQL および Pub/Sub API を作成し、単一のエンドポイントを通じて安全にデータの照会、更新、公開を行うことで、アプリケーションの開発を簡素化します。 サーバーレス GraphQL および Pub/Sub APIs – AWS AppSync – アマゾン ウェブ サービス な、なんか凄そう。 AWSAppSync開発者は、安全でサーバーレスの高性能なGraphQLおよびPub/Sub APIを使用して、アプリケーションやサービスをデータやイベントに接続できます。以下を実行すると、AWSAppSync次の操作を実行できます。 1 つの GraphQL API エンドポイントから 1 つ以上のデータソースのデータにアクセスする。 複数のソースの GraphQL API を 1 つの統合された GraphQL API に結合します。 リアルタイムのデータ更新をアプリケーションに公開します。 組み込みのセキュリティ、モニタリング、ロギング、トレースを活用し、オプションのキャッシュにより低レイテンシを実現できます。 お支払いいただくのは、API リクエストと配信されたリアルタイムメッセージに対してのみです。 AWS AppSync とは - AWS AppSync GraphQL つまり、AppSyncとは「フルマネージドなGraphQLのためのサービス」と言えるでしょう。 (Pub/Sub APIというのはGraphQL WebSocketのことを言っているようです) しかしDynamoDBとAppSyncだけでGraphQLかPub/SubAPIの作成ができるのは結構すごいですね。 (DynamoDB + API Gateway + LambdaでAPI組むより遥かに楽そう) お値段は次の要素で決まるようです。 クエリとデータ変更操作 4.00USD/クエリおよびデータ変更操作 100 万回 リアルタイム更新 2.00USD/リアルタイムアップデート 100 万回 0.08USD/AWS AppSync サービスへの接続 100 万分 キャッシュ データ処理速度を更に加速させる 次の表の通り キャッシュで使用するインスタンスタイプの料金表 料金例は一ヶ月21.29USDとなっており、結構お手頃価格です。 ...

2023年7月27日 · にあえん

EC2インスタンス削除時にEBSボリュームを削除させないようにする

SAA勉強中の備忘録。 EC2インスタンスの削除時にEBSボリュームの削除を行わないようにする EC2の「DeleteOnTermination」というオプションをオフにすればよいです。(デフォルトではオン) Amazon EC2 インスタンスの終了時に EBS ルートボリュームを保持する | AWS re:Post EC2の作成画面では、ボリューム設定の「終了時に削除」という項目がそれに当たります。 ボリュームの設定 感想 むしろデフォルトでオフにしてほしいが、重要なEC2インスタンスを作成する場合などは注意して設定しましょう。

2023年7月27日 · にあえん

成功と幸福は両立しないのか

昨日妻に「成功と幸福は両立しないから、あなたは成功を捨てて家庭の幸せを取ってほしい」と言われた。 本当に両立しないのか…?と思って眠れなかったので、調べたり考えたりしました。えらい。 以下の記事が参考になりました。 「成功=幸福と考える人」が知らない本当の幸福 幸福と幸福感は違うものだという事実 | キャリア・教育 | 東洋経済オンライン 成功と幸福とは 成功という言葉の意味について、辞書にはこうある。 1 物事を目的どおりに成し遂げること。「失敗は―の母」「新規事業が―をおさめる」「実験に―する」 2 物事をうまく成し遂げて、社会的地位や名声などを得ること。「写真家として―する」 https://dictionary.goo.ne.jp/word/%E6%88%90%E5%8A%9F_%28%E3%81%9B%E3%81%84%E3%81%93%E3%81%86%29/ (ここで幸福と対比すべき説明は2のほうですね。) また、幸福は辞書ではこのように記載されている。 満ち足りていること。不平や不満がなく、たのしいこと。また、そのさま。しあわせ。「―を祈る」「―な人生」「―に暮らす」 https://dictionary.goo.ne.jp/word/%E5%B9%B8%E7%A6%8F/ また、先の記事内では「幸福は貢献感」と言っている。 それでは、どんな時に人は幸福であると感じられるのでしょうか。(…中略…)自分が貢献していると感じられる時です。何らかの仕方で「人の役に立てている」と感じられる時に、人は幸福でいられます。 (…中略…) たとえば、病気になって身体の自由が利かなくなることがあります。病気で身体が自由に動かせなくなった時でも、自分がなお人の役に立てていると感じられるかが問題です。そう感じられるには、何かをしないと役に立てないという考え方から離れなければなりません。 「成功=幸福と考える人」が知らない本当の幸福 幸福と幸福感は違うものだという事実 4ページ目 | キャリア・教育 | 東洋経済オンライン 定義からこの記事のタイトルを少し修正すると、「社会的地位や名声などを得ることと、貢献感は両立しない」となる。 まぁ確かに一理ある。 社会的な地位は、何もしないでは得られない。 何もできなくなったら、その人の社会的な地位しか見ていない人にとっては所謂「オワコン」認定されてしまう。 一方で、どんなことがあっても「生きているだけでめっけもん」と言ってくれる存在が近くにいると、それだけで幸福を感じることができる。 また、貢献を受け入れてくれる存在は自分自身でもいい。 言い換えれば、自己肯定するということだ。 つまり、成功と認定するのは自己ではなく他者であり、幸福を認定するのは他者ではなく自己なのだ。 「あなたは成功していますか?」という問に対しては、「これだけの人が評価しています!」という実績を見せればすぐに相手は理解してくれるだろう。 「あなたは幸福ですか?」という問の答えは、自分自身の中にしか無いので、答えたところで相手に伝わるかどうかは分からない。 なので、幸福について理解していればそもそもそんなことを聞く気にもならないだろう。 (大体、そんなことを聞いてくるやつはカルトか哲学者を気取ったクソ野郎なので、話す価値もないが) 自分を幸福だと認定する難しさ 「成功はしていないけど自分は幸福だ」と、言葉に出すのは簡単だろう。 ただし実際に、本当の意味で自分が幸福だと思えるかどうかとは別の話だ。 だから、趣味や好きなもので他の人と繋がりをもとうとするのだろう。 「生きていて偉い」と認めてほしいから。 それでもやはり、自分を幸福だと認められるのは自分しかいないので、少しづつでも自分を認める努力が必要だ。 ちなみに、私は以前「寝る前に自分を3つ褒める」という試みを行って自己肯定感を上げていました。 ぐっすり眠れるようになる…自己肯定感が低すぎて生き辛いOLが教える「自分で自分を褒めるコツ」 寝る前に自分を褒めると記憶に残りやすい (2ページ目) | PRESIDENT Online(プレジデントオンライン) 成功と幸福は両立しないのか では「成功と幸福は本当に両立しないのか」と言われれば、そんなこともないと思う。 まず前提として、成功と幸福はイコールではない。 ただ、分けて考えられるほど2つに相関性がないというわけでもない。 簡易的に図にしてみるとこうなるんじゃないかなと思う。 幸福は地面、成功は花 (恐ろしく下手なのはご愛嬌) これは、幸福の中に成功があるという仮説を図に表したものだ。 花には水と日光をやらねば育たないが、地面は水だけで潤う。 ...

2023年7月27日 · にあえん