Rust実践講座 16:async・awaitと通信の期限
到達点は、非同期処理を動かす仕組みと、待ちを制限する場所を理解することです。前提は第07・15回です。 Futureだけでは進まない async関数はFutureを作り、実行を進めるにはポーリングするランタイムが必要です。awaitは待ちが必要なときに他の仕事へ進む機会を与えます。ここではTokioを使い、ローカルのTCP通信を一往復させます。 新しいプロジ
18 件の記事
到達点は、非同期処理を動かす仕組みと、待ちを制限する場所を理解することです。前提は第07・15回です。 Futureだけでは進まない async関数はFutureを作り、実行を進めるにはポーリングするランタイムが必要です。awaitは待ちが必要なときに他の仕事へ進む機会を与えます。ここではTokioを使い、ローカルのTCP通信を一往復させます。 新しいプロジ
到達点は、データを渡す方法と共有する方法を選び、完了を待つことです。前提は第14回です。 共有しないことで単純にする 別スレッドへ仕事を渡し、結果だけをチャネルで戻すと、共有状態への同時更新を減らせます。moveクロージャは必要な所有物をスレッドへ渡すためによく使います。 コードブロック。 src/main.rsで120と1が表示されます。結果が届く順番は保
到達点は、共有や内部変更が必要な理由を説明して型を選ぶことです。前提は第05・09回です。 所有権の道具を目的で選ぶ Boxはヒープ上の値を単独所有する道具、Rcは単一スレッドで参照カウントにより共有所有する道具です。RefCellは借用規則の一部を実行時に確認し、共有参照の内側から変更する「内部可変性」を提供します。 コードブロック。 src/main.r
到達点は、外部データを型へ変換した後も、値の妥当性を調べることです。前提は第07・11回です。 文法、型、業務ルールの三段階 JSONの文法が正しくても、必要な項目があるとは限りません。型が合っていても、学習時間が一日を超えるなど業務上の不正があり得ます。Serdeはシリアライズとデシリアライズを支援しますが、アプリ独自のルールまですべて自動で知っているわけ
到達点は、型チェックでは分からない業務ルールをテストすることです。前提は第07・11回です。 コンパイル成功は仕様の正しさではない Rustは多くのメモリ上の誤りをコンパイル時に防ぎますが、送料無料の境界を5001円にしても型としては正しいままです。具体的な入力と期待結果をテストへ記録します。 cargo new test-practice --lib --
到達点は、公開するAPIと内部実装を分けることです。前提は第09回です。 ファイルと名前空間を対応させる クレートはコンパイルの単位で、ライブラリにも実行プログラムにもなります。パッケージはCargo.tomlで管理され、複数のクレートを含む場合があります。モジュールはクレート内の名前空間と公開範囲を整理します。 cargo new module-pract
到達点は、問題のある場所を測り、入力の境界で不正な値を止めることです。前提は第11〜15回です。 最適化の前に処理量を確認する 遅いからといって、すぐに並列化する必要はありません。全件比較を辞書検索へ変えるだけで、処理量が大幅に減る場合があります。cProfileで関数ごとの時間を調べ、timeitで小さな処理を繰り返し比較します。計測前後で入力と実行環境を
到達点は、共通処理を関数へ付け加え、資源の利用範囲を明示することです。前提は第06・09回です。 関数も値として渡せる デコレータは関数を受け取り、別の関数などを返して振る舞いを包みます。ログや計測に便利ですが、何が起きるか読めないほど重ねると保守が難しくなります。まず手動で包む処理を理解します。 コードブロック。 main.pyでは、集計へ入る、total
到達点は、待ち時間と計算時間を分け、並行処理の方法を選ぶことです。前提は第09・13回です。TaskGroupの例にはPython 3.11以降を使います。 awaitは待ちを他の仕事へ譲る async defで定義した関数を呼ぶとコルーチンができます。呼んだだけでは通常、処理は最後まで進みません。イベントループで実行し、awaitで他の仕事へ進む機会を渡し
到達点は、通信期限、ステータス、本文、型を順に確認することです。前提は第07・10回です。 ネットワークには部分的な失敗がある 接続できない場合、接続できたがエラー応答の場合、成功応答だが本文が不正な場合は別です。すべてを「データなし」と扱うと障害に気付けません。次の例は外部サービスなしで、ローカルのJSON応答を確認します。 コードブロック。 main.p
到達点は、SQLの値を安全に渡し、失敗した更新を取り消すことです。前提は第06・11回です。 検索できる形で保存する SQLiteは単一ファイルなどにデータを保存できるデータベースです。Python標準ライブラリのsqlite3から使えます。テーブルに型や制約を定義し、SELECTで取得、INSERTで追加、UPDATEで変更、DELETEで削除します。 コ
到達点は、正常系だけでなく境界と失敗を再現するテストを書くことです。前提は第06・10回です。 期待結果は仕様から選ぶ テストは実装をなぞるためでなく、利用者との契約を守るために書きます。「5000円以上なら送料無料」なら、4999と5000が重要です。実装と同じ式で期待値を計算すると、同じ誤りを見逃す場合があります。 次をtestfees.pyに保存します
到達点は、勘で直す前に再現条件と証拠を集めることです。前提は第11〜15回です。 小さな再現例から始める 不具合の報告には、期待した結果、実際の結果、入力、実行手順、環境を記録します。例外のスタックトレースでは、自分のコードが最初に現れる行を確認します。必要ならIDEのブレークポイントで、入力値と変化する直前の状態を観察します。 次のMain.javaは入力
到達点は、変更が広がりにくいデータ構造と境界を選ぶことです。前提は第05・06・14回です。 変更できない値は推論しやすい 他の場所から勝手に書き換えられる値は、読む時点ごとに状態を考える必要があります。小さな値を不変にすると、比較、共有、テストが単純になります。ただしrecordを使うだけでは、内部にある可変のオブジェクトまで守れません。 コードブロック。
到達点は、並行処理の必要性と競合の原因を説明することです。前提は第08・13回です。 同時進行と同時実行 並行とは複数の作業を進める構造、並列とは複数の計算を実際に同時実行することです。ネットワーク待ちの多い処理では、待っている間に別の仕事を進める価値があります。Java 21の仮想スレッドは、このような多数の待ちを伴う仕事で候補になります。CPUそのものを
到達点は、通信の成功を複数段階で確認することです。前提は第08・10回です。 接続できたことと成功したことは違う HTTPのリクエストにはメソッド、宛先、ヘッダ、必要に応じた本文があります。レスポンスにはステータス、ヘッダ、本文があります。接続できても404や500は返ります。さらに200でも、本文が想定した形式とは限りません。 次のMain.javaは外部
到達点は、値をSQLへ安全に渡し、複数の更新をまとめることです。前提は第08・11回です。 データベースにもルールを置く テーブルは同じ項目を持つ行の集まりです。主キーは行を識別し、NOT NULLやCHECKは保存できる値を制限します。アプリ側だけの検査では、別の書き込み経路から不正な値が入る可能性があります。 実習では第11回のpom.xmlのdepen
到達点は、必要なライブラリとテスト手順をプロジェクトに記録することです。前提は第08回です。 手作業を再現可能にする ファイルが増えたら、ビルド手順を人の記憶へ置かずMavenへ渡します。Mavenはpom.xmlに依存関係やプラグインを記録し、決まったディレクトリからソースをコンパイルします。本実習はJDK 21とMaven 3.9系を前提とし、依存は教材