Windows 10 の開発環境イメージ(Hyper-V)のセットアップ
本記事では、可能な限りコンソールでセットアップする。Windows英語版を日本語化のGUI操作は以下のページが参考になった。
セットアップ
Hyper-V版をダウンロード
確認したアーカイブは WinDev2006Eval.HyperVGen1.zip
Hyper-Vマネージャからダウンロードしたイメージをインポート
Hyper-Vマネージャを開き『仮想マシンのインポート』を行う。1. でダウンロードしたファイルを解凍したディレクトリを選択
インポートの種類の選択画面は以下の選択肢があるがお好みで。
仮想マシンをインプレースで登録(既存の一意なIDを使用する)
選択したディレクトリをそのまま利用する。IDは既存の一意なID
仮想マシンを復元する(既存の一意なIDを利用する)
選択したディレクトリからHyper-Vのデフォルトのディレクトリにコピーする。IDは既存の一意なID
仮想マシンをコピー(新しい一意なIDを作成する)
選択したディレクトリからHyper-Vのデフォルトのディレクトリにコピーする。IDは新しいの一意なID
ちなみに本操作をPowerShellで行うことも可能。*1インプレースで登録であれば比較的容易にコマンドでもできる。復元、コピーもコマンドライン操作が可能だがコピー先ディレクトリを指定するのが面倒なのでGUIで操作したほうがよさそう。
Hyper-Vの設定
初期の設定は仮想プロセッサ数1とメモリ2048MBと、設定が低すぎて起動やWindowsの動作がもたついているのでスペックに余裕があれば変更する。
PowerShellで設定する場合は以下のコマンドで可能(要管理者権限)
# VM名称: WinDev2006Eval # 仮想プロセッサ数: 2 Set-VMProcessor -VMName WinDev2006Eval -Count 2 # メモリ: 4096MB Set-VMMemory -VMName WinDev2006Eval -StartupBytes 4096MB
参考までに、Core i 5 9440Fで仮想プロセッサ数2、メモリ4096MBで起動であればほぼストレスなく起動することができた。
VMの起動、設定
Hyper-Vマネージャから該当VMの起動する。ログイン後管理者権限でPowerShellを起動
# ロケールを変更 Set-WinSystemLocale ja-JP Set-Culture -cultureInfo ja-JP Set-TimeZone "Tokyo Standard Time" # キーボードレイアウトを変更 Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters\ -Name "LayerDriver JPN" -Value "kbd106.dll" Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters\ -Name "OverrideKeyboardIdentifier" -Value "PCAT_106KEY" Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters\ -Name "OverrideKeyboardSubtype" -Value 2 # 再起動 Restart-Computer
再起動、ログイン後に検索バーから『Language Setting』を開く → Preferred languages内の『Japaneseを選択』→『Options』選択 → Language Packの Downloadを選択
Add-WindowPackage
コマンドレットでできそうだが肝心のアーカイブが見つからなかった。
ダウンロード後管理者権限でPowerShellを起動
Set-WinUserLanguageList ja-JP -Force Restart-Computer
以下操作は必要かどうか不明だがメモ
Control Panel → Clock and Region → Change date, time or number formats を開く
Administrative タブ → Copy settings
Copy your current settings to: の両方にチェックをつける
個人的WSL1の初期設定(Ubuntu 20.04)
私的WSLの初期設定(Ubuntu18.04) - if __name__ == '__blog__': から更新
Widnows 10 My 2020 update を適用していないのでWSL1の初期設定。 WSL2でもほぼ同様で動作すると思う。
インストール
WSL
Windows 10 にて 『プログラムと機能』→『Windowsの機能の有効化または無効化』→『Windows Subsystem for Linux』にチェックを入れます。
Ubuntu 20.04
WSLインストール後に『Microsoft Store』を開き 、検索ボックスから『Ubuntu』で検索して、表示されたものをインストールします。(7/22現在 Ubuntuバージョンは 20.04であることを確認済み)
バージョンを指定する場合は『Ubuntu 20.04 LTS』や『Ubuntu 18.04 LTS』などをインストール
初期化・終了
WSL Ubuntuの初期化をする場合は、タスクバーの検索ボックスから 『Ubuntu』アプリを右クリック→『アプリの設定』→『リセット』
WSLプロセスを終了したい場合も『アプリの設定』から終了できます。
WSLの設定
root昇格時のパスワードを無効化
公開用途で利用しないため、パス無しでroot昇格を行えるようにする。
sudo sh -c "echo '${USER} ALL=NOPASSWD: ALL' > /etc/sudoers.d/${USER}"
aptの利用リポジトリを日本サーバーにする
/etc/apt/source.list.bakにバックアップを取ります。
security.ubuntu.com ドメイン関連は変更しない。
sudo sed -i.bak -E 's%^(deb\s+http://)(archive.ubuntu.com/ubuntu/.+)$%\1jp.\2%g' /etc/apt/sources.list
アップデート & アップグレード
sudo apt -y update && sudo apt -y upgrade
日本語化
日本語パックのインストール
sudo apt -y install language-pack-ja
システムの文字セットを日本語に変更
sudo update-locale LANG=ja_JP.UTF-8
タイムゾーンをJSTに変更
sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
日本語マニュアルのインストール
sudo apt -y install manpages-ja manpages-ja-dev
Beep音を消す
echo "set bell-style none" >> ~/.inputrc
rustup self update に失敗するとき
rustup self-update
info: checking for self-updates info: downloading self-update info: rustup updated successfully to 1.22.1 error: could not remove 'rustup-bin' file: '...\rustup.exe' : permission denied
VSCode がプロセスを掴んでいたので全て終了 + タスクマネージャから VSCodeのプロセスを終了する。
rustup self-update
info: checking for self-updates info: downloading self-update info: rustup updated successfully to 1.22.1
参考:
Rustのマクロで識別子(ident)を文字列に変換する
以前マクロの練習のためにHashMapやBTreeMapを生成するマクロを作った。
マクロ箇所だけ抽出するとこんな感じ
macro_rules! hash_map { ($($k:expr => $v:expr),*) => {{ let mut _m = std::collections::HashMap::new(); $(_m.insert($k, $v);)* _m }}; }
JavaScriptのオブジェクトリテラルのように キーはダブルクォートで囲わない記法ができると格好良い。
let m = hash_map!(a => 1, b => 2, c => 3); println!("{:#?}", m);
{ "b": 2, "c": 3, "a": 1, }
これを行うにはmacro_rulesで識別子を文字列に変換する必要あり。 結論としては stringifyマクロを使えばOK。C#のnameof式に近い動きをしてくれそう。
macro_rules! hash_map { ($($ik:ident=> $v:expr),*) => {{ let mut _m = std::collections::HashMap::new(); $(_m.insert(stringify!($ik), $v);)* _m }}; }
キーが文字列でも識別子でも動くようにしたバージョン
macro_rules! hash_map { ($($ik:ident => $v:expr),*) => { hash_map!($(stringify!($ik) => $v),*) }; ($($k:expr => $v:expr),*) => {{ let mut _m = std::collections::HashMap::new(); $(_m.insert($k, $v);)* _m }}; }
exprのほうを上に持ってくると動作しなくて少しハマった。多分識別子で指定したマクロはexprのほうにもマッチするからだと思う。
参考までにHashMapやBTreeMapを作るクレートは既存のものが存在する。
特別な事情がない限りこちらを使うべきでしょう。こちらのマクロはキャパシティを計算してくれるし。
PowerToysインストールしてみた
PowerToys Runが特に気になったのでインストールしてみる。
今回のインストールはchocolateyで行う。WinGetが安定してきたらchocolateyから移行したい。
choco install powertoys
特に何も問題なくインストール完了
FancyZones
今回は Priority Gridの 2カラムにしてみた。
普段この配置を行うときは Win + 矢印で左右に配置した後にマウスで調整をしていたけれど、 Shift + ドラッグでお手軽に配置が可能になった。
大画面モニターで利用すると真価を発揮するのかもしれない。
Keyboard Manager
キーマップの変更
これ系のソフトは細かくカスタマイズしたいので無効化
Shortcut Guid
Windowsキーを押しているとショートカットキーのガイドを表示
動かなかった。他のソフトウェアとコンフリクトしているのかもしれない。
PowerToys Run
コマンドラインランチャー。今回一番の期待
Alt + Space(変更可能)でランチャーを開く。IME変更は使わないので Win + Spaceに変更した。
キー操作は以下となる
ショートカットキー | アクション | 対象アイテム |
---|---|---|
Enter | 選択アイテムを開く | 全て |
Ctrl + Shift + Enter | 管理者権限で開く | アプリケーション |
Ctrl + Shift + E | フォルダを開く | アプリケーション, ファイル |
Ctrl + C | パスをコピー | アプリケーション, ファイル, フォルダ |
Tab | アイテムのサブメニューに移動 | 全て |
Esc | ランチャーを閉じる | 全て |
管理者権限で開くがあるのは便利
その他
File Explorer Preview エクスプローラにプレビューパネルを追加
Image Resizer コンテキストメニューに画像のリサイズ機能を追加
Power Rename コンテキストメニューにリネーム機能を追加 フォルダは複数ファイルを対象にできたり正規表現を利用できたり。
下二つは便利そうだ。
Rust by Example読んだ
Rustの知見を深めるために読んでみた。
1章, 2章
1. Hello World
1.1 Comments
コメントの書き方
ブロックコメントはネストできる。
/* /* /* print!("1"); */ print!("2"); */ print!("3"); */ print!("4");
1.2 Formatted print
マクロの主なものとしては以下となる。
マクロ | 説明 |
---|---|
format! | 結果を String として返す |
print! | 標準出力に出力 |
println! | 標準出力に出力(改行あり) |
eprint! | 標準エラーに出力 |
eprintln! | 標準エラーに出力(改行あり) |
マクロの詳細な使い方はstd::fmt モジュールのUsageを参照。
1.2.1 Debug
マクロのフォーマット文字列に {:?}
マーカーを利用する。
カスタム実装をする場合は std::fmt::Debug
トレイトを実装する必要がある。
以下のように derive
属性を利用することによって構造体に Debug
トレイトを自動で実装してくれる。
#[derive(Debug)] struct Point {x: i32, y: i32}
またマクロのフォーマット文字列に {:#?}
マーカーを利用すると整形して出力することができる。
1.2.2 Display
マクロのフォーマット文字列に {}
マーカーを利用する。
カスタム実装する場合は std::fmt::Display
トレイトを実装する必要がある。
Display
トレイトを実装すると型を文字列に変換する std::string::ToString
トレイトが自動で実装される。
1.2.2.1 Testcase: List
Display
トレイトの実装例
Display
トレイト実装にあたって、 fmt
は std::fmt::Result
を利用するため ?
演算子を利用するとよい。
1.2.3 Fortmatting
整形出力のオプションについて
std::fmtのFormatting Parametersを参照するのがよさそう。
2. Primitives
プリミティブ型について
- スカラー型
- 符号付き数値型: i8, i16, i32, i64, i128, isize(ポインタサイズ)
- 符号なし数値型: u8, u16, u32, u64, u128, usize(ポインタサイズ)
- 実数型: f32, f64
- 文字型: char (4バイト)
- 真偽値型: bool
- ユニット型: ()
- 複合型
- 配列
- タプル
2.1 Literals and operators
リテラルと演算子
型 | 例 |
---|---|
整数 | 1 |
実数 | 1.2 |
文字 | 'a' |
文字列 | "abc" |
真偽値 | true |
ユニット型 | () |
整数は以下の進数で表すことができる。
進数 | プレフィクス |
---|---|
16 | 0x |
8 | 0o |
2 | 0b |
数値リテラルは以下のように_
を間に入れて読みやすくすることができる。
// 同じ let n = 1_000; let n = 1000; // 同じ let f = 0.000_000_1; let f = 0.000_000_1;
演算子についてはこちらを参照
2.2 Tuples
タプルは丸括弧を利用して、複数の様々な型を持つ型を作れる。
//型推論されるため実際は型は書かなくてもよい let a :(i32, &str) = (123, "abc"); //上と同じ let a = (123, "abc");
2.3 Arrays and Slices
配列は複数の同じ型の持つ型であり、連続したメモリに格納される。 角括弧を利用して作成する。サイズはコンパイル時に決定する。
//型、サイズともに推論されるため、型は書かなくてもよい。 let a :[i32; 3] = [1, 2, 3]; //上と同じ let a = [1, 2, 3]; // 100個の5を持つ配列を定義 let b :[i32; 100] = [5; 100]; // 同様に型は書かなくてもよい。 let b = [5; 100];
スライスは配列と似ているが、コンパイル時にサイズは不明。
let a = [1, 2, 3]; // スライスを定義 let b: &[i32] = &a; // 型はなくても良い。 let b = &a;
VSCode 1.45からタブの切り替えをマウスホイールで行えるようになった。
settings.jsonに以下の設定を追加する。
"workbench.editor.scrollToSwitchTabs": true,
この設定を入れない場合でも、Shift+WheelUp/WheelDown でタブの切り替えができる。
参考