2021-05-19

アーリアへようこそ!!

【今後の計画】
Rust/Bevyの基本的な情報を整備
Bevyによるゲーム開発と公開

【最新記事】

[Aaria.exe] 検索用リンクに移動機能も追加

 Aaria.exeの久々の機能追加になります。純粋に機能を追加しただけなので、それまでのDBとの互換性は完全に保たれています。

 元々 <k,検索文字列>表示指定(略可)> は、オンマウスすることにより全文検索(DBによっては項目名の前一致検索)機能が使える機能文字という扱いでした。
 オンマウスしただけで該当項目が羅列されるため、便利な一覧表示機能としての位置づけでした。加えて省略できる「表示指定」により、全文検索に使われる文字列と表示される文字列を別々に指定することもできました。

 今回追加したのは、この機能文字をクリックすると、「検索文字列」に一致する項目へ移動できる機能です(これまではクリックしても何も起きませんでした)。
 これにより「表示される文字列」と「リンク先の項目名」を別々に設定したリンクが使えるようになります。これまではこの手の機能は便利な反面、リンク先の項目がリンク文字と一致しないことによる混乱も生じうるため、あえて避けていたのですが、元々色分けで区別されている機能文字でもあるため、この手の機能はあっても良いのではと考え、実装に至りました。

 現在の最新バージョンはv1.1.2となります。
 閲覧版のバージョンはv1.1.0相当です。ほぼ機能は変わりませんが、閲覧版に関してはここでバージョンアップは止めておこうと考えております。

2021-04-16

[Rust] rls

Rust

Rust Language Server

 IDEにコード補完とインラインのエラーメッセージの機能を付加。

2021-04-14

[書籍] 「エビデンス」の落とし穴

ニュース
   
 時に命にも関わる「健康」に関する情報は、油断しているとついつい信頼性の低い情報まで鵜呑みにしてしまいがち。この本ではそんな鵜呑みにしてはならない情報の見分け方や考え方を分かりやすく解説しています。
 「健康情報」に振り回され、貴重なお金や時間を無駄にしないために……最低限必要な情報がまとめられている良書だと思います。

2021-04-05

[書籍] 今がわかる 時代がわかる 世界地図 2021年版

ニュース
 世界情勢を効率よく把握できる資料です。普段忙しく、あまり世界のニュースに目を向ける時間のない人は、この本で年に一度、世界のことをチェックしておくだけでも大分違ってくると思います。買いためておけば各年の世界のことを振り返るのに使える資料となりますし、図書館で借りて毎年軽く目を通す手もあります。
 後半は従来の世界地図が掲載されています。

2021-04-02

[書籍] 自律神経を整えて免疫力を上げるヨガ

ニュース

 ヨガニードラという、寝ながら行えるヨガ(瞑想法)です。3種類の音声ガイダンスで行え、初心者でも簡単にストレス解消することができます。特に睡眠関係の悩みを抱えている方には効果的です。

2021-03-30

[書籍] クラシックゲーム大博覧会 1972-1985

ニュース

 ファミリーコンピューター前後に発売された72種類に及ぶ個性豊かなゲーム機を、豊富な写真と共に紹介している本です。この時期のゲーム機はファミコンしかない、と思っていた人にとっては新鮮な図鑑となるはずです。
 今では何でもスマホやパソコンで出来てしまうので、10本にも満たないシンプルなゲームをやるために1万円を超えるゲーム機を買っていた時代を思うと、随分技術も進歩したものだと感じてしまいます。

2021-03-21

[Rust] iced

Rusticed
 シンプルさと型安全性にフォーカスしたクロスプラットフォームのGUIライブラリ。

・特徴:全てRustで実装 Windows/macOS/Linux/wasmでWeb環境にもビルド可能 Vulkan/Metal/DirectX11,12など描画システムをサポート
・Cargo.toml:features = ["async-std"] # async-std用のExecutorを使えるようにする
・軽快に動作し非同期処理への対応も行われ、注目度は非常に高い(CE2020-09)

【構成】
State:アプリケーション内の状態を管理
Message:イベントが発生すると送信される
Viewロジック:Stateに基づいて表示内容を決定
Updateロジック:受け取ったMessageに従ってStateの内容を更新
非同期処理
| Command:単発的な処理を非同期で実行 結果やイベントをMessageで送信
| Subscription:常に非同期処理を動作させ、定期的に結果やイベントをMessageで送信
| ヴィジェット:Button Checkbox Image ProgressBar Radio Slider Space Svg Text TextInput Canvas
| レイアウト調整用:Column Container PaneGrid Row Scrollable

[Rust] crates.io

Rustcrates.io(Rustのクレート集)

[Rust] キーワード別処理

Rust

[Rust] マクロ

Rust
 呼び出し時!が付く。

【括弧の慣例】
():関数呼び出し的マクロ
{}:コードブロックを引数にとるマクロ

【様々なマクロ】
deriveマクロ:#[derive(MACRO_NAME)]という形式でstructやenumを修飾できるマクロ
アトリビュートマクロ:#[macro_name]といったアトリビュート形式で修飾できるマクロ

[Rust] cargo-edit

Rust/crates.iocargo-edit

【コマンド】
cargo add --help:addに関するヘルプを表示
cargo add A:A(crates.ioのクレート)をCargo.tomlに設定(アルファベット順にソートもする)
cargo add A@V:AのV(バージョン)を指定しCargo.tomlに設定
cargo list:依存パッケージの一覧を出力
cargo rm A:AをCargo.tomlから削除

[Rust] build.rs

Rust/フォルダ構造
 cargoがビルド時に実行するコードを記載できる

・ビルド時にコード生成したりC言語のライブラリをコンパイルするようなケースで活用できる
・ここでのprintln!はcargoへオプションを渡す機能を持つ

[Rust] .cargo/config

Rust/フォルダ構造

【内容】
[build]
target = "cargo buildのデフォルトターゲット指定"

[Rust] 歴史

Rust

CE2018-1216:2018エディションリリース(v1.31~)
CE2015-0515:2015エディションリリース(v1.0~1.30.0)

[Rust] エディション

Rust
 2-3年周期で予定される互換性のない大規模アップデート

Cargo.tomlの設定で、クレート単位で異なるエディションを同時に扱える

[Rust] ビルトインマクロ

Rust
 rustcに組み込まれる形で実装されているマクロ
 主にプログラム外のリソースにアクセスするなど、プログラム内の関数からは実現できない処理を実現するためにコンパイラ側で実装されている

cfg!
env!
・macro_rules!:マクロを定義するマクロ

[Rust] 基礎事項

Rust
 Rustの基本事項の一覧

・インデント:半角4スペース
・命名規則
 snake_case:プロジェクト名 ファイル名

[Rust] コメント

Rust
// 行コメント
/// ドキュメントコメント

/// ``` で囲まれた行がテストされる fn_main(){..}が自動で挿入される(実際のコードとドキュメントの内容のズレを検査できる)

[Rust] static

RustKeyword static
 グローバル変数(変更可)の定義、またはプログラム全体に渡るライフタイム。

・値の変更時はunsafeで囲む必要あり
・値はバイナリファイルの特定のセクションに配置される

[Rust] unsafe

RustKeyword unsafe

【使用ケース】
・Cライブラリのバインディングを書く
・OSやCPUに依存する特殊な処理を書く
・Rustコンパイラ+標準ライブラリだけではできない特殊なメモリ処理が必要な場合

[Rust] panic

Rust
 主にプログラムが"自身がバグを含んでいる"と判断した場合に実行させる処理。

・処理手順(デフォルト):パニックの発生を標準エラー出力に表示 リソースを解放しながらスタックトレースを巻き戻す スレッド/プロセスを終了

[Rust] Send

RustTrait std::marker::Send
 スレッド境界を超えて所有権を転送できることを示す。

・Rcなど一部を除くほとんどの型に実装されている
・その型を構成する全ての型がSendなら自動で適用される

2021-03-20

[Rust] まず最初にRustの全体を把握する

Rust
 プログラミング言語Rustについて、まず最初に把握しておきたい情報を一通りまとめてみました。主に公式サイト(日本語版)のほぼ全ての情報が把握できます(一部当サイトの別ページに分散)。一度公式サイトに目を通した後、当ページでその概要を再確認する際にご利用されると便利です。

Rust公式(日本語版)

 まずは公式トップページでRustの全体像をざっくり理解。加えて以下の各ページでは各分野に言及しています。

ネットワーク(関連クレート:reequest Rocket)

 公式のソーシャルメディアやサイト
セキュリティメーリングリスト:全てのセキュリティアナウンスを受け取る

 その他、様々な情報ページです。
行動規範Aariaの行動規範の参考にもしています
メディアガイド:商標などの利用に関しての情報
プロダクション:Rustがどのように使われているかに関して
セキュリティポリシー:Rustのセキュリティバグの報告などに関して
プライバシー通知に関する情報
旧バージョンのRust公式(The book旧ver):懐かしき旧バージョンの公式サイト
よくある質問:旧公式サイトより

はじめに

 Rustの世界に入っていく前準備として目を通してみましょう。

Rust Playground:ブラウザでRustコードを実行できます。
Rustをインストール:手順に従えば簡単にインストールできます。
 Microsoft C++ Build Tools:Windowsでは必要になります。

 関連情報の一覧

プログラミング言語Rust(日本語版)

 Rustに関する詳細なマニュアル(リポジトリ)。まず一通り読むことで、基本的な技術全般が身につきます。以下は代替、あるいは上級版のドキュメントです。

rust-learning:Rust学習向けのリソース集
rustlings:コマンドライン上でRustのツールチェインのダウンロードとセットアップ方法を確認しながら、Rustの構文の基本的な読み書きを学べる
Rust by Example(GitHub):たくさんのコード例を示し、説明は最小限 練習問題もある
The Rust Reference:より詳細で包括的な情報
Rust 裏本(The Rustonomicon):アンセーフなRustへの手引書
The Rust Unstable Book:nightly版のみで使える不安定な機能に関する記述

ドキュメント一覧

 より専門的に各分野について詳細に学習したい場合の資料です。

エディションガイド:Rustのエディションに関する手引き
The rustdoc book:優れたドキュメントを用意する方法について
Command line apps in Rust:コマンドラインに関するRustの学習
Rust 🦀 and WebAssembly 🕸:WebAssemblyに関するRustの学習
WebAssembly:WebAssembly自体についての学習
wasm-bindgen:wasm-bindgenについてのRust学習
Asynchronous Programming in Rust:非同期プログラムについて
Guide to Rustc Development:rustc開発貢献者向けのマニュアル
Rust Forge:貢献者向けドキュメント
Rust APIガイドライン:Rustライブラリの設計者向け APIのデザイン上の推奨事項のまとめ

資料一覧

Rust Blog:メインのRustブログ
Inside Rust Blog:Rustの開発をフォローしたい人を対象としたブログ
This Week in Rust:Rustコミュニティの最新情報
リリースノート:各リリース毎の変更点の記録
・ロードマップ:2021年
Qiita:Rust関連の記事集

コミュニティ

ユーザーフォーラム:Rustに関するあらゆることを話し合うための場所(質問他)
内部フォーラム:Rustそのものの開発に関する議論の場(コンパイラ他、言語設計や標準ライブラリの開発の議論、セキュリティ関連の報告など)
・掲示板:stack overflow reddit
・チャットプラットフォーム:Discord Zulip
イベント(Rustユーザグループ):イベントの開催関連の情報
Rustbridge:他の言語をバックグラウンドとして持つRustに馴染みのない人々を対象とした、Rustを学びコミュニティに参加して頂くためのワークショップ
Request for Comments:Rustの重要な決定事項についての議論の場

Rustのチーム一覧

コアチーム:プロジェクトの指揮/サブチームのリーダーシップ/横断的な事項の取扱いを行う
コミュニティチーム:イベントの調整やサポート/コンテンツの作成/RustBridgeプログラムの実行/調査の実施を行う
コンパイラチーム:コンパイラ内部と最適化を扱う
Crates.ioチームcrates.ioの運用、開発、ポリシーの管理を行う
開発ツールチーム:Rust向け開発ツールを作成
インフラストラクチャチーム:Rustプロジェクトをサポートするインフラストラクチャを管理
言語チーム:新しい言語機能の設計を行う
ライブラリチーム:Rust標準ライブラリ rust-langのクレート/規約/エコシステムのサポート
リリースチーム:リグレッションと安定化の追跡や、Rustのリリースを行う
Rustチームalmuni:ゆったりとした引退生活を楽しんでいます

Rustのワーキンググループ一覧

Async基盤ワーキンググループ:async-awaitの基本となる言語/ライブラリの実装をサポート
CLIワーキンググループ:Rustで大小様々なCLIアプリを書くという、エンドツーエンドの体験に焦点を絞る
組込み機器ワーキンググループ:リソースに制約のある環境や従来とは異なるプラットフォームでの、Rustを使用するエンドツーエンドの体験に焦点を絞る
ゲーム開発ワーキンググループ:Rustをゲーム開発のデフォルトの選択肢にすることに焦点を置く
セキュアコードワーキンググループ:Rustで安全なコードを簡単に書けるようにする
セキュリティレスポンスワーキンググループ:受け取った脆弱性レポートのトリアージと対応を行う
WebAssemblyワーキンググループ:WebAssemblyを通してJSライブラリやアプリケーションにRustコードを組み込む、エンドツーエンドの体験に焦点を絞る

[Rust] リリースチャネル

Rust

リリースチャネル

 6週間に1度のリリースを行う


【種類】
・stable:安定版 基本的に破壊的な変更はない
・beta(ドキュメント):評価版 安定版に向けリグレッションテストと重大な不具合の修正を行う
・nightly(ドキュメント):開発用 毎晩新しい修正がマージされる 不安定なAPIを含むこともあるが、nightlyにしか対応していないクレートも存在

[Rust] Future

 これを実装した型を戻り値とすることで、非同期ランタイムに渡った時点で処理タイミングが制御されるようになる

・ゼロコスト抽象化:各タスクに対し決まったメモリサイズで一箇所にしか割り当てしないため、余計なメモリ割り当てのコストがかからない

[Rust] アサーション

Rust

【関連マクロ】

Rust製ゲームエンジン - bevy

bevy公式(GitHub)

2021-03-19

[Rust] アトリビュート

Rust
 定義の前の行に付与し、該当定義を拡張する表現。

・該当:Clone Copy Debug Default Eq PartialEq PartialOrd
・条件:struct/enumが内包する全ての型がそのトレイトを実装している必要がある

【記述】
#[allow] // clippyのチェックを緩和
#[cfg(test)] // cargo test時にのみ実行するモジュールに指定
#[derive(A)] // Aを実装 複数(A, B)可
#[ignore] // #[test]の下行に記述 通常のcargo_testでは実行されない
#![no_main] // 通常の環境におけるmain関数を使用しない
#![no_std] // Rustの標準ライブラリを使用しない
#[should_panic] // #[test]の下行に記述 panicした場合にテスト成功とする
#[test] // cargo test時にのみ実行する関数に指定

[Rust] 用語集

Rust

Rustの用語集

executor:ポーリングを繰り返しながら実行する非同期ランタイム
NaN:不正な値を示す 該当(0.0/0.0) 性質(NaN!=NaN 任意の値と不一致)
Rustacean:Rustプログラマの自称(crustacean:甲殻類に由来)
依存:コードが必要とするライブラリ
関連関数型自体に実装された関数
クレート:Rustプログラムのパッケージのこと
健全性unsafeを使わないコードは未定義動作を起こさないという性質
コアライブラリ:最も根幹にあるもので、他のシステムライブラリやプラットフォームに依存しない最小限の機能を備えたライブラリ
サブモジュール:モジュール配下のモジュール
 mod_a.rs   // モジュール(ここにmod mod_b;と記載/複数可)
 mod_a/     // 上ファイルと同名のフォルダ
 | mod_b.rs // mod_aのサブモジュール(複数可)
 | 同様にしてサブモジュールのサブモジュールも作成可能
参照:条件(所有権より寿命が短いこと 不変参照は複数可 可変参照は1つのみ:同時に不変も不可)
ジェネリクス:実行時、関数を要求される型の組み合わせ分だけ複製し、高速に動作させる
識別子:該当(関数名 変数名 引数名 構造体のフィールド名 モジュール名 クレート名 定数名 マクロ名 静的な値の名前 属性名 型名 トレイト名 ライフタイム名)
借用:所有権ではなく、参照する権利だけを与えること
シャドーイング:同名の変数を重ねて宣言することで、覆い隠すこと
所有権:各値の所有者は1つだけという規則(スコープから外れたら値は破棄される)
トレイト:共通の振る舞いを取り出して名前を付けたもの
生識別子:普段は使うことが許されないキーワードを使わせてくれる構文(直前にr#を付ける) fn r#match(){..} 使用ケース(2015 editionではキーワードでなかったtryが関数として使われている場合など、r#tryを使う)
発散する関数:戻り値の型が(存在しない)!の関数
フィーチャ:クレートにオプションの機能を提供させるための仕組み
フィーチャゲート:Rustがコンパイラ、言語、標準ライブラリのフィーチャを安定化させるために使う仕組み
フェリス(Ferris):Rustコミュニティの非公式マスコット(ferrous:鉄に由来)
マーカトレイト:メソッドのない、それぞれの持つ意味や役割をしるしのように付与するトレイト データを含まないため実行時にもメモリ内にデータが存在しないが、コンパイラが安全性の検査や最適化をする際に使用する 該当(Copy Send Sized Sync)
未定義動作:アプリがライブラリやコンパイラの規約を守らなかったため、どのような動作結果も保証されない状態
モジュール:クレートより一段階小さな構成要素/modで定義(Rustでは基本的に1つのソースコード/ファイルが1つのモジュールとして扱われる)
ライフタイム:安全に値を利用できる期間のこと(寿命はレキシカルスコープではなく、値が使われている範囲で考慮される)

記号

:::関連関数
; :式の終わりを示す
? :Result? // Ok(T)時はTを、Err時はそれをreturn(主に関数内で使用/エラー委譲)

[Rust] フォルダ構造

Rust

Rustプロジェクトのフォルダ構造

ルートフォルダ:README ライセンス情報 設定ファイル コードに関係しないもの などが置かれる最上位のフォルダ

.cargo/
benches/ ベンチマーク用の、ソースコードを配置するためのフォルダ
examples/ 使用例を配置するためのフォルダ
target/ ビルドで生成されるデータの置き場所
| debug/ cargo build/runで生成される実行ファイルが置かれる
| doc/ cargo docで生成されたドキュメント置き場
| release/ cargo build/run --releaseで生成される実行ファイルが置かれる
| src/ ソースファイルのフォルダ
  | lib.rs:クレートにおいて中心的役割を果たすソースファイル
  | main.rs:Rustが最初に実行するファイル
    | main():Rustが最初に実行する関数
  | bin/ 追加のバイナリを生成する場合に使用(ここにa.rsを配置するとa.exeも同時に生成される b/main.rsを配置すればb.exeが生成される)
| tests/ (主にプロジェクト全体の結合)テストを配置するためのフォルダ

[Rust] Cargo.toml

Rust/cargo/フォルダ構造
 TOML形式の、メタデータや依存関係を記録

・◆はcargo publishでクレート紹介ページに反映される項目
・[[二重括弧]]のセクションは複数回書け、複数のバイナリファイルを作れる

[package]

name = "実行バイナリのファイル名/パッケージ名"
version = "0.1.0"
authors = ["◆作者 <mail@example.com>"]
edition = "2018"
description = "◆短い解説"
documentation = "◆ドキュメントのURL/空にすると自動でDocs.rsへのリンクを張ることになる"
readme = "◆READMEファイルへのパス"
homepage = "◆HPのURL"
repository = "◆ソースコードレポジトリのURL"
license = "◆ライセンス情報"
license-file = "◆ライセンスファイルへのパス"
keywords = "パッケージのキーワード"
categories = "パッケージのカテゴリー"
workspace = "パッケージのワークスペースの設定"
build = "ビルドスクリプトへのパス"
links = "パッケージが利用するネイティブライブラリへのリンク"
exclude = "publish時に除外するファイル"
include = "publish時に含めるファイル"
publish = "publishのコントロール"
metadata = "外部ツールのための設定"
default-run = "cargo runによって動作するバイナリファイル"

[dependencies]

 以下に依存するクレートとバージョンを記載(表記例)

tokio = { version = "1.0.2", features = ["macros"] } # featuresを追加する場合

[dev-dependencies]

 examples/tests/benchmarksのための依存関係

[build-dependencies]

 ビルドスクリプトの依存関係

[target]

 プラットフォーム特有の依存関係

[profile.release]

lto = true # 複数のクレートで同じコードが使用されていた際、重複を除去してサイズを削減
opt-level = "z" # 最適化レベルの変更
codegen-units = 1 # 並列度を下げるとサイズを削減できる可能性がある
panic = "abort" # panic発生時にプログラムを即終了させる(巻き戻しコードを削除する)ことでバイナリサイズを削減

[features]

default = ["A" , "B"] # デフォルトで有効になるフィーチャ

[lib]

・設定対象:ライブラリ形式のバイナリファイル
・以下設定はターゲット関連セクション共通

name = "ターゲットの名前"
path = "ターゲットのソースファイル"
test = "デフォルトでテストさせる"
doctest = "デフォルトでドキュメントをテストさせる"
bench = "デフォルトでベンチマークを実施させる"
doc = "デフォルトでドキュメントを作成させる"
plugin = "コンパイルプラグインとして利用する(非推奨)"
proc-macro = "手続きマクロのための設定"
harness = "libtestハーネスを使う"
edition = "Rustのエディション"
crate-type = "生成するクレートの種類"
required-features = "このターゲットを作成するのに必要なfeature"

[[bin]]

・設定対象:実行形式のバイナリファイル

[[example]]

・設定対象:exampleのバイナリファイル

[[test]]

・設定対象:testのバイナリファイル

[[bench]]

・設定対象:benchのバイナリファイル

[Rust] Cargo.lock

Rust/cargo/フォルダ構造

Cargo.lock

 依存関係の厳密なバージョンを記録(手動での書き換えは一切不要)
 Cargoはこのファイルを基に再度バージョンの計算を行うのではなく、そこに指定されているバージョンを使用する

[Rust] rustup

Rust

rustup

 rustupはRustをインストール/管理するツールです。

The rustup book(ドキュメント) GitHub

コマンド一覧

rustup default nightly(stable/beta)リリースチャネルを切り替える
rustup doc公式のドキュメントページをローカルで表示
rustup docs --bookthe bookをローカルで表示
rustup override set nightly(stable/beta):現在のプロジェクトでのみnightly他を使用
rustup self uninstall:Rustとrustupをアンインストール
rustup target add A:クロスコンパイルを行うための追加のターゲットAをインストール
rustup update:Rustを最新版に更新

[Rust] cargo

Rust

cargo

 cargoは、Rustのパッケージマネージャ兼ビルドツールです。

The Cargo Book(ドキュメント)

コマンド一覧

cargo --version(-V):バージョン表示 例:cargo 1.50.0-nightly (75d5d8cff 2020-12-22)
cargo bench --bench abenches/a.rsかa/のベンチマークを実行
cargo build:現プロジェクトをデバッグビルドする(debug/)
 --release最適化ビルド(release/)
 --target A:ビルドターゲットにAを指定(→サポートプラットフォーム)
 -j/--jobs n:使うCPU数nを指定
cargo check:現プロジェクトのコンパイルが通るかの検査のみ行う
cargo cleantarget/のビルド生成物を削除
 --releaserelease/のみ削除
 --docdoc/のみ削除
 -p/--package SPEC:指定したSPECの生成物のみ削除
cargo clippy:コードの改善部分を提示
cargo doc:現プロジェクト(依存含む/非公開要素は省く)のドキュメントをdoc/にビルド
 --open:表示も行う
 --no-deps:依存のドキュメント生成は省く
 --document-private-items:非公開要素もドキュメント化
cargo fix:cargo check後コードの修正を行う(未使用変数に_ 未使用useを削除 不要mutを削除など)
cargo install A:公開されているパッケージAをインストール
cargo fmtrustfmtを実行しコードを自動で整形
 -- --check:整形部分を一覧表示
cargo new A:現フォルダにプロジェクトAを作成
 --lib:クレートAを作成
 --help:newでの利用可能なオプションを一覧表示
cargo publish:ライブラリをcrates.ioに公開 ドキュメントはDocs.rsに公開 ログインかパスワードが必要
cargo run:ビルド(--releaseも可)し実行
 -- A B:引数A,B(さらに可)を指定して実行(--はオプションとの区別用で--releaseを使う場合は不要)
 --bin Asrc/bin/のA.rs(実行プログラム)をビルドし実行
 --example aexamples/のa.rsかa/を実行
cargo search Acrates.io内のクレートをAで検索 Cargo.tomlにコピペできる形式で一覧表示
cargo test:テストコードを実行 #[test]アトリビュートの付いた全関数を実行
 -- --ignored:#[ignore]アトリビュートの付いたテストを実行
 --test atests/のa.rsかa/のテストを実行
 testname:特定のテストのみ実行
cargo tree:依存クレートを木構造で一覧表示
cargo uninstall A:Aをアンインストール 削除場所指定は--root DIRを使う
cargo updateCargo.tomlのバージョン制約を満たす最新までアップデートしたCargo.lockを再生成

[Rust] rustfmt

Rust

rustfmt

 自動的にRustコードをフォーマットし、読み書きしやすく保守しやすいものにする。

[Rust] cargo install

Rust/cargo

cargo install

・ダウンロード元:デフォルト(crate.io) --git/--path/--registryなどで変更可
・インストール先:デフォルト(~/.cargo) --root DIRで指定可
・変数での指定:CARGO_INSTALL_ROOT/CARGO_HOME(環境変数) install.root(Cargo.toml)

[Rust] clippy

Rust

clippy

 コード規約を守ったRustらしいコードを書くことができるようサポートする。

[Rust] サポートプラットフォーム

Rust

Rustのサポートプラットフォーム


種類

Tier1:動作保証
Tier2:ビルドが通ることを保証
Tier3:サポートはするが公式バイナリは配布されていない

[Rust] 最適化

Rust
 コンパイル速度(開発時)と実効速度(配布時)とのバランスを調整する機能。

種類

0:最適化なし(通常build)
1:基本的な最適化
2:追加の最適化
3:全ての最適化(releaseビルド)
"s":バイナリサイズ最適化
"z":バイナリサイズ最適化(ループのベクトル化を行わない)

[Rust] rustc

Rust

rustc

 rustcはRustのコンパイラです。

The rustc book(ドキュメント)

コマンド一覧

rustc --version(-V):Rustのバージョンを表示 例:rustc 1.51.0-nightly (44e3daf5e 2020-12-31)

2021-03-18

[Rust] Rust 2021エディションに向けて

Rust
 今年は3年に1度の、Rustの2021年版が登場する年。新しいエディションが出てから当サイトでもRustの日本語情報を充実させていこうとも計画していたのですが、2021エディションの登場は今年の後半、しかも安定するのは10月以降とのことで、Bevyの進展のこともあるので、今から積極的にRustの情報を記事にしていくことにしました。


 Google翻訳の性能も日々向上しているようで、ページまるごとブラウザで翻訳し、そのまま読んでも大体の内容をスムーズにつかむことができました。
 大雑把な内容でよいのであれば、Rust標準ライブラリの翻訳も必要なかったかも知れません。

 また、Rust 2021エディションはそれほど大きな変更点がある感じでもなかったため、2018エディションの情報を用意し、必要に応じて更新していく形をとりたいと考えています。

2021-03-17

プログラミング言語 - Rust


【Rustの重要情報】


【Rust関連ツール一覧】
crate.io:Rustのクレート集
Docs.rs:crates.ioに登録されている全てのクレートのドキュメント
awesome-rust:Rustコードの厳選リスト


【std】

【Keyword】

[Rust] 翻訳に関して

Rust

翻訳について

 直訳をしている箇所もありますが、意訳している部分も少なくありません。日本語として普通に読めることを意識してはいますが、元の文が意味しようとしている内容がいまいちはっきりしない場合は直訳に近いものになっています。
 一度読んだ英文を再度英語で読むハメにならないよう、日本語にしたものを残しておこうというのが動機です。これが少しでもRustが日本に広まる手助けになればとも願っていますが、原文と完全に内容が一致するという保証もできないため、その点はご了承ください。

 情報は徐々に充実していけたらと考えてはいますが、標準ライブラリの資料だけでも膨大で、しかも今後もRustはバージョンアップしていくため、全てを翻訳する予定はありません。故に非公式としてやっていこうと思います。
 これはもともと当サイトの方針でもあるのですが、情報の更新や修正などはサイレント修正です(通知した方がよいと思われるほどの大きな何かがある場合は別ですが)。

 リンクも元々のページから張られているものに従っていますが、その対象ページを当サイトで翻訳した場合は、当サイトのページへのリンクを挟む予定でいます。

 元々はAaria.exe(Aaria.db)に組み込むつもりだったのですが、プログラミングは情報の性質的に非常に閉じられたものであるため、Rust.db(あるいは当サイトやGitHubなど)に分離する予定もありました。
 特にCrate stdなどの資料は情報量も多いため、翻訳情報などは当サイトで公開することにしました。

[Rust] Crate std(標準ライブラリ:日本語)

【Rust】
※当記事はCrate std(rust-lang / rust)を翻訳したものです(→翻訳に関して)
※Version 1.50.0 (cb75ad5db 2021-02-10)

Rust標準ライブラリ

 Rust標準ライブラリは、手軽なRustソフトウェアの土台であり、ミニマルなプログラムの一式であり、選びぬかれた(より広範囲をカバーする)Rustエコシステムのための抽象的なプログラム群です。また、Vec<T>Option<T>、ライブラリが定義した言語のプリミティブな部分を操作するコードのようなコアの型、標準マクロインプット/アウトプットマルチスレッドその他諸々などを提供します。

 標準ライブラリは初期状態から全てのRustクレートで使用できます。そしてそれは、useを「use std::env」のようにパスを指定することでアクセスできるようになります。

この文書の読み方

 もし探している項目の名が分かるなら、ページトップの検索枠を使うのが手っ取り早いでしょう。

 そうでないなら、以下の有益な方法もあります

std::* modules:モジュール一覧から探す
Primitive types:プリミティブ型の一覧から探す
Standard macros:標準マクロの一覧から探す
The Rust Prelude:Rustが自動で予め読み込むモジュール群の一覧から探す

 もし今回が初めてなら、この文書を気楽に熟読してみるのがよいでしょう。興味のあるリンクをクリックすれば、自然と興味のあるページへ向かえます。ただし、知っておかなければならない幾つかの重要なポイントがあります。それを以下で記します。

 一度標準ライブラリの内容に慣れれば、説明文が少し煩わしくなるかも知れません。その段階まで来たら、ページトップ付近にある[-]ボタンを押し、文章を折りたたんでみましょう。

 その際、[src]ボタンの存在にも気づくでしょう。RustのAPI文書はソースコードも含んでいるので、読むことをおすすめします。標準ライブラリのコードは一般的に高品質で、啓発されることも少なくないでしょう。

標準ライブラリの文書には何が書かれている?

 まず最初に、Rustの標準ライブラリは多くの焦点を持ったモジュールに分かれています(全てのリストはこちら)。これらのモジュールは全てのRustの土台であり、std::slicestd::cmpなどの確固たる名前が与えられています。モジュールの文書は一般的にコード例付きの概要を含むため、ライブラリに慣れる上での賢い選択になります。

 次に、ここにはプリミティブ型の暗黙のメソッドについての説明もあります。しかし以下の2つの理由で、混乱を招くこともあるため注意が必要です。

1.プリミティブ型はコンパイラによって実装されているのに対し、標準ライブラリはメソッドを直接プリミティブ型(文書の一覧はこちら)に実装しています(このような方法をとる唯一のライブラリでもあります)。
2.標準ライブラリには、多くのプリミティブ型と同名のモジュールがあります。これらはプリミティブ型に関係する追加機能を定義しますが、どれも重要なメソッドとは言えません。

 例えばi32型のページには32bit整数型に対して呼べる全てのメソッドの一覧があり、とても有用ですが、std::i32のページにあるMINMAXの値はあまり使うことがありません。

 プリミティブ型のstr[T](スライスとも)の資料に関して、StringVec<T>で呼ばれる多くのメソッドは実際deref強制により、それぞれstr[T]のものが呼ばれます。

 第3に標準ライブラリでは、全てのクレートの全てのモジュールにインポートされているRustプレリュード(小さなコード群、ほとんどがトレイトです)が定義されています。

 そして最後に、標準ライブラリは多くの標準マクロ(リストはこちら)をエクスポートしています(技術的に、全ての標準マクロが標準ライブラリで定義されているわけではありません-コンパイラによって定義されているものもあります-が同様に資料はここにあります)。プレリュードのように、標準マクロは初期状態で全てのクレートにインポートされています。

資料の更新に貢献する

 Rustへの貢献に関するガイドラインはこちらです。資料の情報源はGitHubにあります。更新への貢献の際は、まずガイダンスをお読み下さい。そして更新の提案では、プルリクエストを投げて下さい。

 貢献に感謝します! もし問題箇所を見つけたら、プルリクエストを投げるかDiscordの#docsで我々にまず知らせて下さい。

Rust標準ライブラリの旅

 この資料の残りは、Rustの標準ライブラリの注目に値する特徴の指摘に捧げます。

コンテナとコレクション

 optionresultモジュールは、オプションとエラー処理型(Option<T>Result<T, E>)を定義します。iterモジュールはRustのイテレータトレイト(Iterator)を定義します(これはコレクションにアクセスする際、forループと共に使います)。

 標準ライブラリは連続したメモリ領域を扱う3つの共通の方法を用意しています。

Vec<T>:プログラム実行時にサイズを変えられるヒープ割当のベクター型
[T; n]:コンパイル時にサイズが固定な埋め込み配列
[T]:ヒープ割当に限らない、連続したストレージへのサイズ可変な配列

 スライスはいくつかの種類のポインタを介してのみ処理できます。それには次のようなものがあります。

・&[T]:共有(参照)スライス
・&mut [T]:可変参照スライス
Box<T>:ヒープ割当のスライス(配列)

 str(UTF-8の文字列)はプリミティブ型で、標準ライブラリで多くのメソッドが定義されています。Rustのstrには一般的に不変参照(&str)としてアクセスします。文字列の組み立てと変更には所有権のあるString型を使って下さい。

 文字列への変換はformat!マクロを使います。そして文字列からの変換はFromStrトレイトを使います。

 データは参照カウントボックスか、Rc型に配置することで共有できます。さらにCellRefCellに含まれている場合、可変データのシェアもできます。並列処理において同様の効果を得るには、原始的な参照カウントボックスのArcMutexのペアを用いるのが一般的です。

 collectionsは、Maps,Sets,LinkedList他、一般的なHashMap<K, V>を含む典型的なコレクション型を定義します。

プラットフォーム抽象化とI/O

 基本的なデータ型に加え、標準ライブラリは一般的なプラットフォームの違い(最も顕著なのはWindowsとUnixの派生物)を抽象化することに大きく関係しています。

 files,TCP,UDPを含むI/Oの一般的な型は、io,fs,netで定義されています。

 threadはRustのスレッド抽象化を含みます。syncはさらにプリミティブなatomicmpscと言ったメモリ共有型を含みます。これらにはメッセージ通信のためのチャネル型があります。

再エクスポート

pub use core::arch;

プリミティブ型

never       【実験的】!型 またneverとも呼ばれる
array        [T; N](T=要素の型/N=コンパイル時不変の自然数)で示される固定サイズの配列
bool         ブール型
char         文字型
f32         32bit浮動小数点型(特にbinary32型はIEEE 754-2008で定義されている)
f64         64bit浮動小数点型(特にbinary64型はIEEE 754-2008で定義されている)
fn          関数ポインタ 例:fn(usize) -> bool
i8          8bit整数型
i16         16bit整数型
i32         32bit整数型
i64         64bit整数型
i128        128bit整数型
isize       ポインタサイズの整数型
pointer     生で安全でないポインタ(*const T と *mut T)
reference   共有と可変の参照
slice       [T](可変サイズの連続した値のビュー) ここでの隣接は等間隔に要素が並んでいることを意味する
str         文字列のスライス
tuple       定形の、異なる型を内包できるデータの並び (T, U, ..)
u8          8bit自然数型
u16         16bit自然数型
u32         32bit自然数型
u64         64bit自然数型
u128        128bit自然数型
unit        ()型 ユニットとも呼ばれる
usize       ポインタサイズの自然数型

モジュール

backtrace  【実験的】OSスレッドのスタックバックトレースのキャプチャのサポート
intrinsics 【実験的】コンパイラの組み込み関数
lazy       【実験的】遅延値と、静的データの一度きりの初期化
raw        【実験的】コンパイラ組み込み型のレイアウトの構造体定義を含む
alloc       メモリ割当API
any         Anyトレイトを実装(ランタイムリフレクションを通して任意の'static型の動的型付けが可能になる)
array       特定の長さまでの固定長配列の実装 最終的にはあらゆる長さに対し一般化できるはずです
ascii       ASCII文字と文字の操作
borrow      借用したデータを処理
boxed       ヒープ割当のポインタ型
cell        共有可能な可変コンテナ
char        文字型
clone       暗黙的にコピーできない型のトレイト
cmp         並び替えと比較のための機能
collections コレクション型
convert     型間の変換のためのトレイト
default     意味あるデフォルト値を持つ型のためのトレイト
env         プロセスの環境の検査と操作
error       エラー処理用のトレイト
f32         32bit浮動小数点型の実装に固有の定数を提供
f64         64bit浮動小数点型の実装に固有の定数を提供
ffi         FFIバインド関連のユーティリティ
fmt         文字列のフォーマットと出力のためのユーティリティ
fs          ファイルシステムの処理を行う
future      非同期値
hash        一般的なハッシュをサポート
hint        コンパイラへの、コードの発行や最適化に影響するヒント(コンパイル時か実行時)
i8          8bitの整数型
i16         16bitの整数型
i32         32bitの整数型
i64         64bitの整数型
i128        128bitの整数型
io          コアI/O機能のためのトレイト、ヘルパー、型定義
isize       ポインタサイズの整数型
iter        構成可能な外部反復
marker      型の基本プロパティ表すプリミティブなトレイトと型
mem         メモリを扱うための基本機能
net         TCP/UDP通信用のネットワークプリミティブ
num         数値のための追加機能
ops         オーバーロード可能な演算子
option      オプション値
os          OS固有の機能
panic       標準ライブラリでのpanicのサポート
path        クロスプラットフォームなパスの操作
pin         メモリ内の特定の場所にデータをピン留めする型
prelude     Rustプレリュード
primitive   プリミティブ型を再読み込みし、他の型宣言でシャドーイングされる可能性を回避
process     プロセスを操作
ptr         生ポインタを介してメモリを手動操作
rc          シングルスレッドの参照カウント(Reference Counted)ポインタ
result      Result型によるエラー処理
slice       連続した値への動的サイズのビュー [T]
str         Unicode文字列型
string      UTF-8でエンコードされた拡張可能な文字列
sync        有益な同期プリミティブ
task        非同期タスクを処理する型とトレイト
thread      ネイティブスレッド
time        時間の定量化
u8          8bitの自然数型
u16         16bitの自然数型
u32         32bitの自然数型
u64         64bitの自然数型
u128        128bitの自然数型
usize       ポインタサイズの自然数型
vec         ヒープ割当の、連続した拡張可能な配列 Vec<T>と表記

マクロ

asm            【実験的】インラインアセンブリ
concat_idents  【実験的】識別子を1つに連結する
format_args_nl 【実験的】format_argsと同じだが最後に改行を追加
global_asm     【実験的】モジュールレベルのインラインアセンブリ
is_aarch64_feature_detected【実験的】aarch64ターゲット以外でis_aarch64_feature_detectedが使われていた場合にコンパイルを停止
is_arm_feature_detected【実験的】ARMターゲット以外でis_arm_feature_detectedが使われていた場合にコンパイルを停止
is_mips64_feature_detected【実験的】MIPS64ターゲット以外でis_mips64_feature_detectedが使われていた場合にコンパイルを停止
is_mips_feature_detected【実験的】MIPSターゲット以外でis_mips_feature_detectedが使われていた場合にコンパイルを停止
is_powerpc64_feature_detected【実験的】PowerPC64ターゲット以外でis_powerpc64_feature_detectedが使われていた場合にコンパイルを停止
is_powerpc_feature_detected【実験的】PowerPCターゲット以外でis_powerpc_feature_detectedが使われていた場合にコンパイルを停止
llvm_asm       【実験的】LLVMスタイルのインラインアセンブリ
log_syntax     【実験的】渡されたトークンを標準出力に出力
trace_macros   【実験的】他のマクロのデバッグに使用されるトレース機能のon/off
assert          実行時にブール値が真であるこを表明する
assert_eq       2つの式が互いに等しいことを表明する(PartialEqを使用)
assert_ne       2つの式が互いに等しくないことを表明する(PartialEqを使用)
cfg             コンパイル時に設定フラグのブール値の組み合わせを評価する
column          呼び出された列番号に展開する
compile_error   発生すると、与えられたエラーメッセージと共にコンパイルが失敗する
concat          リテラルを静的な文字列スライスに連結する
dbg             迅速でダーティーなデバッグのため、与えられた式の値を出力し返す
debug_assert    実行時にブール式が真であることを表明する
debug_assert_eq 2つの式が互いに等しいことを表明する
debug_assert_ne 2つの式が互いに等しくないことを表明する
env             コンパイル時に環境変数を検査する
eprint          標準エラーに出力する
eprintln        標準エラーに出力する(最後に改行を加える)
file            呼び出されたファイル名に展開する
format          fmtに応じて文字列を生成する
format_args     他の文字列フォーマットマクロのパラメータを作成
include         コンテキストに従い、ファイルを式または項目として解析する
include_bytes   バイト配列への参照としてファイルを含める
include_str     UTF-8でエンコードされたファイルを文字列として含める
is_x86_feature_detected CPU機能がx86/x86-64上で使えるか実行時にテストする
line            呼び出された行番号に展開される
matches         与えられた式が与えられたいずれかのパターンに一致するかを返す
module_path     現在のモジュールパスを表す文字列に展開する
option_env      オプションで、コンパイル時に環境変数を検査する
panic           現在のスレッドをpanicさせる
print           標準出力に出力する
println         標準出力に出力する(最後に改行を加える)
stringify       引数を文字列化する
thread_local    LocalKey型の新しいローカルスレッドストレージキーを宣言する
todo            未完成のコードを示す
try            【非推奨】結果をアンラップするか、エラーを伝播させる
unimplemented   "not implemented"(メッセージ)と共にpanicさせ、未実装を示す
unreachable   到達できないコードを示す
vec             引数を含むVecを生成する
write           フォーマットされたデータをバッファに書き込む
writeln         フォーマットされたデータをバッファに書き込む(最後に改行を追加する)

キーワード

Self     traitimplブロック内の実装型、または型定義内の現在の型
as       型間でキャストするか、インポート名を変更する
async    現在のスレッドをブロックする代わりにFutureを返す
await    Futureの結果を準備できるまで、実行を一時停止する
break    ループを早期に終了する
const    コンパイル時の定数と、コンパイル時に評価可能な関数
continue ループの次の反復へスキップする
crate    Rustバイナリ、あるいはライブラリ
dyn      トレイトオブジェクトの型のプレフィックス
else     ifの条件式がfalseに評価された際に評価する式
enum     いくつかのバリアントのいずれかになる型
extern   外部コードにリンクするか、インポートする
false    偽を表すbool型の値
fn       関数または関数ポインタ
for      inを使ったイテレーション、implを使ったトレイト実装、または上位のトレイト境界(for<'a>)
if       条件が成立した際にブロックを評価する
impl     型にいくつかの機能を実装
in       forを使い、一連の値を繰り返し処理する
let      値を変数に束縛する
loop     無限ループ
match    パターンマッチングに基づき、フローを制御する
mod      コードをモジュールにまとめる
move     クロージャの環境を値でキャプチャする
mut      可変の変数、参照、またはポインタ
pub      項目を他から見えるようにする
ref      パターンマッチングの際、参照により束縛する
return   関数から値を返す
self     メソッドのレシーバー、または現在のモジュール
static   静的な項目は、プログラムの全期間('static)において有効な値
struct   他の型から構成する型
super    現在のモジュールの親
trait    型のグループに共通のインターフェース
true     真を表すbool型の値
type     既存の型のエイリアスを定義
unsafe   型システムで、メモリの安全性を検証できないコードまたはインターフェース
use      他のクレートやモジュールから、項目をインポートまたは名前変更する
where    項目を使用するために維持する必要のある制約を追加
while    条件が満たされている間、ループ処理を続ける