Windows 10 の開発環境イメージ(Hyper-V)のセットアップ

本記事では、可能な限りコンソールでセットアップする。Windows英語版を日本語化のGUI操作は以下のページが参考になった。

www.vwnet.jp

セットアップ

Hyper-V版をダウンロード

確認したアーカイブは WinDev2006Eval.HyperVGen1.zip

developer.microsoft.com

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

参考:

github.com

Rustのマクロで識別子(ident)を文字列に変換する

以前マクロの練習のためにHashMapやBTreeMapを生成するマクロを作った。

github.com

マクロ箇所だけ抽出するとこんな感じ

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を作るクレートは既存のものが存在する。

github.com

特別な事情がない限りこちらを使うべきでしょう。こちらのマクロはキャパシティを計算してくれるし。

PowerToysインストールしてみた

PowerToys Runが特に気になったのでインストールしてみる。

github.com

今回のインストールはchocolateyで行う。WinGetが安定してきたらchocolateyから移行したい。

choco install powertoys

特に何も問題なくインストール完了

FancyZones

今回は Priority Gridの 2カラムにしてみた。

f:id:masinc000:20200705155328p:plain

普段この配置を行うときは Win + 矢印で左右に配置した後にマウスで調整をしていたけれど、 Shift + ドラッグでお手軽に配置が可能になった。

f:id:masinc000:20200705155549p:plain

大画面モニターで利用すると真価を発揮するのかもしれない。

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の知見を深めるために読んでみた。

doc.rust-lang.org

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 トレイト実装にあたって、 fmtstd::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;

演算子についてはこちらを参照

doc.rust-lang.org

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 でタブの切り替えができる。

参考

code.visualstudio.com