clap v3 のdriveベースのパースのサンプル

Rustの定番コマンドラインパーサー clap が2022-01-01にバージョン3になり、deriveベースのコマンドラインのパースが正式実装された。 この機能は、従来は structopt が提供していた構造体を用いたコマンドライン引数の定義や、列挙型を用いたサブコマンドの定義を行う機能である。 この記事では、この derive ベースのパースのうち、よく使うであろうものを紹介する。

なお、すべての機能については clapのGitHub上のリポジトリにあるexamples を参照してほしい。

続きを読む

2021年末 CPUワットパフォーマンス簡易調査

まえがき

2021年11月4日に、Intelの12世代Coreシリーズが発売された。 これにより、近年はAMDRyzenシリーズが優位になっていたマルチスレッド性能においても、処理の種類によればCoreシリーズが上回るということで話題になっている。

一方で、12世代Coreシリーズの最上位であるCore i9-12900Kの最大消費電力は基本的に241Wに設定されており、これは対抗のRyzen 9 5950Xシリーズの142Wに比べて100Wほど大きい設定になっている。 このため、発熱も多くなり、「爆熱」や「電力大食いでワットパフォーマンスは悪い」などの評判が出回っている。

しかし、CPUの性能は消費電力の設定値によって変動するものである。 最近のデスクトップ向けCPUは省電力性より性能を優先している。 このため、ワットパフォーマンスが最良の設定に比べてかなり高めの電力設定が行われており、デフォルト設定でのワットパフォーマンスはワットパフォーマンスの評価に適さない。

そこで、この記事では主にCore i9-12900KとRyzen 9 5950Xに注目して、CPUの最大消費電力を制限しつつベンチマークを行うことで、電力設定ごとのベンチマークスコアを比較する。

続きを読む

Rustのプロジェクトを一括でcleanするツールを作った

Rustのパッケージ管理ツールCargoのプラグインとして、指定ディレクトリ以下の全てのプロジェクトを探して cargo clean するツール、 cargo-clean-recursiveと作成したという話。

動機

CargoはRustの標準のパッケージ管理ツール兼ビルドツールであり、RubyにおけるRubyGemsJavaScript系言語におけるnpmと同等の機能を提供するツールである。

Cargoでは、依存するクレート(Cargoおけるパッケージ)については共通のディレクト~/.cargo/registry に、コンパイル後のバイナリや生成したドキュメントについてはプロジェクトのディレクトリ下の target ディレクトリに保存している。 これは、クレートがソースコードの形態で配布され変化することがない一方で、コンパイル後のバイナリやドキュメントはビルド時のフラグや環境変数によって変化するためである。 したがって、ビルド結果として生成されるファイルは、依存クレートのものを含めプロジェクトごとに管理する必要がある。 そして、このバイナリファイルやドキュメントはファイル数が多く、ディスク容量を消費する。 サンプルとして、自作のAWS S3とCloudFrontへの静的ホームページの同期ツールをビルドしてみると、合計で200の依存クレートが存在した。 デバッグビルド・リリースビルド・ドキュメントを合わせると消費しているディスク容量は2.09 GiB、ファイル数は81496個であった。

ビルド結果のファイルは再生成できるものであり、長期間使わないなら削除しておきたい。 しかし、標準の cargo のコマンドでは指定ディレクトリ以下の全てのプロジェクトを一括でcleanする方法がないため、サブコマンドとして実装した。

使用法

このツールをインストールするには、 cargo install cargo-clean-recursive を実行すれば良い。

  • cargo clean-recursive を実行すると、カレントディレクトリ以下の全てのプロジェクトを探し、 cargo clean を呼び出す。
  • cargo clean-recursive --release の場合、 cargo clean --release を呼び出し、リリースビルドの出力のみを削除する。
  • cargo clean-recursive --doc の場合、 cargo clean --doc を呼び出し、リリースビルドの出力のみを削除する。

同時に --doc (-d) と --release (-r) を指定することもできる。 この場合、 cargo clean --releasecargo clean --doc をそれぞれ呼び出している。

Rustの所有権(ownership)を語義から理解する

所有権(ownership)と借用(borrowing)とライフタイム(lifetime)はRust特有の言語仕様として有名である。

RustではガベージコレクションGC)を使用せずにメモリ安全性を確保するために所有権と借用とライフタイムの仕様を採用している。 この機構によって、Rustではプログラマが変数の値が有効である範囲を意識する必要がある代わりに、GCに関する実行時のオーバーヘッドがなくともメモリ安全でありスレッドセーフであるプログラムを記述することができる。

一方で、所有権は「『変数が値の所有権を持っている』というのは結局何のことなのかわからない」という混乱を生む要因でもある。 単純に考えると、変数に値が入っているのだから、変数が値を持っているのは当然のことのように思える。 そうすると、「値の所有権を持つ」とは一体何のことを言っているのかがはっきりとしなくなってしまう。 この混乱や理解の困難さの原因の一つは、原語である英語と日本語の間で所有権(ownership)という単語のニュアンスが違うことである。 この記事では、ownershipの英語の語義から、Rustの所有権という用語が何を表しているのかを説明する。

続きを読む

パスワードの強度を考察する

概要

パスワードが攻撃者に知られてしまうパターンには、漏洩したパスワードが使い回されるパターンと、パスワード自体が突き止められるパターンがある。

サービスからの漏洩自体をユーザー側で防止することは難しいため、ユーザーに可能な対策はサービスごとに全く異なるパスワードを使用する程度である。

パスワード自体が直接突き止められることを防止するには、取りうるパスワードのパターン数が非常に多い必要がある。 単語の変形などによるパスワードは推測しやすすぎるため、パスワードはランダムに生成されるべきである。 パスワードのパターン数を評価するには、エントロピーを計算すればよい。

続きを読む

serdeの機能で様々な形態のJSONを列挙型として扱う

JSONREST API呼び出し、データ保存、多言語との連携などに数多く使用されている。 一方で、JSONは言語でサポートされる表現が整数と浮動小数点数・文字列・配列・オブジェクト・そしてnull程度しかなく、それ以上に複雑な表現はこれらの基本機能を組み合わせて表現することになる。 機能の組み合わせ方には複数の方法があり、特に複数の型の構造体やクラスが混在する時の表現形式は複数ある。

Rustでは、表現したいデータ型が既知であれば、複数の型のうちどれかであることを表現するために列挙型が使える。 そして、Rustのシリアライザ・デシリアライザのライブラリであるserdeを用いて、列挙型とJSONの相互変換をすることができる。

続きを読む

新ランチャー・Minecraft 1.6.4で効果音が出ない問題の解決法

発端

MinecraftのPC版(現:Java Edition)のランチャーが新バージョンになったのは結構前のことである。

f:id:igagurimk2:20180611155800p:plain

Minecraft Java Editionのランチャー画面

それよりしばらく後、PCの故障に伴ってOSを再インストールし、マインクラフトの環境も再構築したところ、1.7.10環境では効果音が出るのにもかかわらず、1.6.4環境ではMODで追加される効果音以外が出ないという症状が出る。

このバグはMCL-6280として登録されている。
[MCL-6280] No sound in older versions on native launcher, despite working in the Java launcher - JIRA

続きを読む