OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS7にcockpitをインストールする

# cockpitとは！
　LinuxをWebインターフェースで監視、管理することの出来るシステムです。
　初期段階ではCPUやメモリ使用量をグラフで可視化してくれたり、エラーログなどログを確認できたり、ネットワークの接続状況だとかファイアウォールの設定だとかを確認できたり、アカウント管理・サービス管理がGUI的に出来たりします。
　また、ここが一番面白かったところですが、sshの代わりにもなります。
　他追加機能はアドオンをインストールすることで出来ますし、何なら自分で作ることも出来たりします。

# 環境
**2022/05/07**
・Linux CentOS7
・cockpit 195.12.

# インストール方法
### cockpitのインストール

　インストールするために必要なコマンドはたった一つ！

```
sudo yum -y install cockpit
```

# 使い方

　cockpitのインストールは本当にさっきので終わりなので、cockpitを使えるようにしていきます。
　cockpitのサービスをスタートさせます。

```
sudo systemctl start cockpit
```

　サーバーが再起動してもcockpitが再起動できるよう恒久的な設定にします。

```
sudo systemctl enable cockpit.socket
```

　OSインストールした直後であればファイアウォールが起動していないことも。

```
sudo systemctl start firewalld
```

　cockpitのポートは9090なのでファイアウォールのポートを開けてリロード。

```
firewall-cmd --add-port=9090/tcp --permanent
firewall-cmd --reload
```

　サーバーのIPかドメイン名+ポートの9090でURLを書きます。

例

```
https://8.8.8.8:9090
```

　アクセスして次の画面が出てきたらcockpitはちゃんとインストールされているということですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/007fe62b-6219-37fd-38b4-40fdf6b35cf9.png)

　CentOS7に追加してるユーザーかrootをユーザー名に。
　パスワードはパスワード()。

　これでログイン出来れば完璧！
　あとは適当に触ってたらcockpitはマスターしたも同然ですね。

# sshなんていらねぇ…！
　VPSをsshでいじっている人は多いと思います。
　コマンドプロンプトからわざわざ毎回公開鍵暗号込みのなっがいコマンドを打ち込んでいるような人はまさかいないとは思いますが(自分は除く)、そういう人のためにcockpitを安全に運用するうえでsshなんていらねぇとファイアウォールからサービスを削除する流れを書いておこうと思います。

```
firewall-cmd --remove-service=ssh --zone=public --permanent
firewall-cmd --reload
```

　これでsshなんていらねぇ…！プロトコルを実行できます。

# 最後に
　cockpitという名前に惚れたからcockpitをもっと便利に使える方法を探りたいというわけでいろいろ調べていたのですが、いかんせんまだまだマイナーなシステムですので、日本語のドキュメントが少なくてシックハックしています。
　cockpitはアドオンでdockerを管理できるようになるのですが、docker-composeのように複数のdockerを管理できるようになったりはしません。
　またcockpitはコマンドプロンプト、ターミナルのようなCUIは出来るのですが、GUIのような便利なデザインはありません。
　今後のアップデートに期待するか…自分で作るかですね。
Ubuntu 22.04 (jammy) で Rstudio (2022.02.2) が動かない

Ubuntu 22.04 にしたら、Rstudioを起動してもフリーズして動作しない。
ぐぐると次の質問と回答を発見。

https://askubuntu.com/questions/1406423/how-to-make-r-studio-work-on-ubuntu-22-04

madredhatterさんという方が回答している通り、

```
rstudio --no-sandbox
```

とコマンドを打って起動すれば動く。

さらに調べると、正式には22.04をサポートしていないので、次の開発版を使ってくれというコメントも。

https://community.rstudio.com/t/rstudio-ide-desktop-2022-02-0-443-not-working-on-ubuntu-22-04-lts-some-gui-issue/135876/3

https://dailies.rstudio.com/rstudio/spotted-wakerobin/desktop/jammy/

Githubではここのissueが本スレみたい。

https://github.com/rstudio/rstudio/issues/9854

Rstudioの非公式APTリポジトリを提供している人もいる。

https://github.com/mwt/rstudio-apt-repo

よくわからん。
この記事は以上です。
[Chrome] アドレスバーから2クリックで翻訳

# 紹介したいこと
- Google Chromeの場合にアドレスバーから**2クリックで翻訳**できるのを知ってますか？
- 今まで翻訳Webページ開いてからCopy&Pasteして翻訳してました。この手間がなくなるので便利だと思いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/51c73196-ceb7-f404-d2f3-c1415fbcde51.png)
# 方法
- 英語(母国語以外の)のページを閲覧する。
- アドレスバーの右側の以下のアイコンをクリック(1クリック)する。このアイコンが表示されてない場合には、以下の設定を参照してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/1fbc931b-b6ee-68ef-9a2e-d318d850a513.png)
- 翻訳したい言語を選択(2クリック)すると、翻訳される。この場合だと日本語。

# 設定
- 設定 > 詳細設定 > 言語で設定します。
- 英語の設定で「この言語のページで翻訳ツールを表示する」を選択してます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/e3714493-2b00-0714-0291-abcc17548d21.png)

- この設定後に英語のページにアクセスすると、アドレスバーに翻訳ツールのアイコンがでてくるようになる。

# 参考

https://support.google.com/chrome/answer/173424?hl=ja&co=GENIE.Platform%3DDesktop

https://www.howtonote.jp/google-chrome/setting/index13.html
「良いコード/悪いコードで学ぶ設計入門」は設計テクニックを学べる自己啓発本だった

# はじめに

「良いコード/悪いコードで学ぶ設計入門」を読み終えたので、要点をまとめていきます。
具体的な設計テクニックは割愛しています。書籍を読んでみてください。

https://gihyo.jp/book/2022/978-4-297-12783-1

# 本書の特徴

「ソフトウェア開発に潜む悪魔を知覚し、退治できるようになるための設計技術書」となっており、
保守性に関係する設計、特に変更容易性の向上を目的にした設計手法を取り扱っている。

# 設計とは

設計とは、「課題を効率的に解決するしくみづくり」のこと。
画面設計書やビジネスロジック設計書といったドキュメントを作成することでもなく、
このテーブルからデータを取ってきて、あのテーブルへ登録して...といった処理の流れを定義することでもない点は注意。
経験上、大規模な業務システムに長年携わっていると、設計の定義を誤認すると感じた。

# 設計をないがしろにすると起こる弊害

* コードを読み解くのに時間がかかる
* バグを埋め込みやすくなる
* 悪しき構造がさらに悪しき構造を誘発する

# 弊害の代表例

## 意味不明な命名

技術駆動命名(Int, Memory, Flag...)や連番命名(001, 002, 003...)は意図がまったく読み取れない。
スプレッドシートなどを用いた対応表はメンテナンスされなくなっていく。

## 条件分岐のネスト

見通しが悪い

## データクラス
データ(インスタンス変数)を保持するだけのクラスで、ロジックは別のクラスに実装されることが多い。
ゆえに、重複コード、修正漏れ、可読性低下、未初期化状態(生焼けオブジェクト)、不正値の混入が生じる。

# 設計パターン
|  設計パターン  |  効果  |
| ---- | ---- |
|  完全コンストラクタ  |  不正状態から防護する  |
|  値オブジェクト  |  特定の値に関するロジックを高凝集にする  |
|  ストラテジ  |  条件分岐を削減し、ロジックを単純化する  |
|  ポリシー  |  条件分岐を単純化したり、カスタマイズできるようにする  |
|  ファーストクラスコレクション  |  値オブジェクトの亜種で、コレクションに関するロジックを高凝集にする  |
|  スプラウトクラス  |  既存のロジックを変更せずに安全に新機能を追加する  |

「値オブジェクト＋完全コンストラクタ」は、オブジェクト指向設計の最も基本形

# エンジニアの資産とは

エンジニアにとっての本質的な資産とは技術力にほかならない。
レガシーコード(変更が困難で壊れやすいコード)は資産の蓄積、すなわち技術力の成長を妨げてしまう。
主な理由は以下の通り。

* レガシーコードは、レガシーコードの書き手を育ててしまう。
* レガシーコードは、アンバランスでトリッキーな実装であることが多く、設計改善が非常に困難。
納期等の都合により、設計改善を諦めることになり、設計実装の経験を積めなくなる。
* レガシーコードは、理解に多大な時間を要する。
本来もっと価値の高い仕事に充てられるべき時間が目減りする。

# 設計スキルを高める学び方

インプットは２、アウトプットは８
設計効果を必ず意識すること

# 悪魔退治の旅に出かけよう

弊害を知る
　　↓
「何か対処しなければ」という意思が生まれる
　　↓
意思が、設計を良くするためのすべてのはじまり
Github Actionsの設定ファイル作成後にgit pushが失敗する時の対処方法

## 環境
macOS Monterey 12.3.1

## エラー内容
Github Actionsのワークフローファイルを作成後、
git pushすると以下のエラーが発生した。

```sh
 ! [remote rejected] HEAD -> (ブランチ名) (refusing to allow a Personal Access Token to create or update workflow `.github/workflows/(ファイル名).yml` without `workflow` scope)
```

## 原因
Githubのパーソナルトークン設定で'workfrow'を許可していなかった。

## 対処方法
#### 1. トークンを再生成する
Github → Settings → Developer Settings → Personal Access Tokens 
→ Generate new token

'workflow'、その他必要な項目にチェックを入れて再生成する。
(既存のトークンに追加も出来ると思います)
公式docs: https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token

#### 2. 既存の認証情報を削除する
キーチェーンアクセス → "github.com"を削除

#### 3. 再度 git push する
Githubユーザー名とトークンを求められるので入力
→ 無事にpush出来ました。

## 参考記事
https://qiita.com/kter/items/84f3ece9a41a2bec535f
既存Flutterプロジェクトにデスクトップ(Windows)サポート追加時 "No option specified for the output directory" エラーの対処法

# 前提
flutter doctor 診断の通過。
言い換えると、必要なVisual Stodioのコンポーネントが揃っていること。

# エラー
```
> cd path/to/flutter
> flutter create --platform=windows

No option specified for the output directory.
Create a new Flutter project.
(以下省略)
```

# 対処法：createコマンドの"出力パス"パラメータを追加
```diff
  > cd path/to/flutter
- > flutter create --platform=windows
+ > flutter create . --platform=windows
```
※「.」：カレントパス（Flutterプロジェクトのパス）

これでWindows版のビルドと起動ができるようになった。
めでたしめでたし(≧∇≦)b

# その他
必要かは分からないが、試行錯誤している時、下記のコマンドも１回実行した。
```
flutter config --enable-windows-desktop
```
出処：https://protocoderspoint.com/how-to-add-create-desktop-windows-support-for-existing-flutter-project/
MP3ファイルのメタ情報をデータベースに入れると文字化けする

MP3ファイルのアーティスト名やアルバム情報などのメタ情報をデータベースに格納していたところ、以下のような文字化けが発生しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526299/e4dccc8f-8ba3-4ff5-33f0-c5e0da2eb938.png)

データベースで文字化けと言えばデータベースの文字コードがLatin1などになっていることが考えられますが、今回はちゃんとUTF-8に設定していました。

# 原因
MP3ファイルのメタ情報がUnicodeになっていなかったことが原因でした。
MP3のメタ情報はID3という形式なのですが、ID3がUnicodeに対応するようになったのはv2以降で、ID3v1を使用しているMP3ファイルのメタ情報をそのままUTF-8のデータベースに格納すると文字化けしてしまいます。

なお、ID3v1はファイルの末尾に、ID3v2はファイルの先頭に書かれるため、両方を一つのMP3ファイルに付けることも出来るそうです。UnicodeのID3v2が付いているMP3ファイルで文字化けが起こる場合は、ID3v1も一緒に付いており、そちらを読んでしまっている可能性があります。(僕の場合はそうでした)

# 対処法
システム側で対処するよりもタグ情報自体を修正してしまった方が取り回しが楽だと思います。
なお、以下の操作でタグ情報を編集していますが、誤ってタグを全消去する可能性などがありますのでバックアップを取っておくことをオススメします。

私はWindowsで[MP3tag](https://www.mp3tag.de/en/) (v3.12)というフリーソフトを使用してタグの編集をしています。

インストールしたら、編集したいMP3ファイルを右クリック、もしくはディレクトリを右クリックし、MP3tagを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526299/6c262382-0e86-f2ba-0030-40ce403075d0.png)

タグという欄にそのMP3ファイルに書き込まれているタグのバージョンが記載されています。下画像の場合はID3v1とID3v2.3がどちらも書き込まれています。僕の知る限りだとCD音源はこの形になっていることが多いような気がします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526299/0d9e3e27-4972-a94d-c8e8-df7209d7b49c.png)



画面上部のツール(O)→オプション(O)から設定画面を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526299/863c05d2-a73e-3c3d-f9af-ecbc767d5feb.png)

タグ→Mpegを以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526299/dcd70590-9b31-63ff-4a0a-71c9ada8169e.png)

ID3v2以降はUnicodeに対応していますがUTF-8に対応しているのはv2.4以降からですので、UTF-8にしたい場合はv2.4を選んでください。
また、ID3v1とID3v2が混在しているファイルをv2のみにしたい場合は「削除」の項目でID3v1にチェックを必ず入れてください。

設定が完了したら、タグを編集したいファイルを選ぶ、もしくはCtrl+Aで全てのファイルを選択し、行いたい操作に応じて次のどちらかを行います。

### v1タグを削除したい

左上の×ボタンをクリックし、選択した全てのファイルからタグの削除を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526299/0b9f55f9-462c-d258-36af-62bf6c135128.png)

以下のようにv1のタグが消えています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526299/554eb162-4ed7-87c3-00e9-130439f0ccf3.png)


### v2.4タグを書き込みたい

左上のフロッピーボタンをクリックし、選択した全てのファイルにv2.4のタグを書き込みます。ID3v1が存在していても無視してID3v2の部分だけを上書きする形になります。ID3v2.4のみにしたい場合はv1タグの削除も合わせて行ってください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526299/c7eaed2c-5f80-6236-6f47-c6e75f1fc4dc.png)

# 参考

[ID3タグ(Wikipedia)](https://ja.wikipedia.org/wiki/ID3%E3%82%BF%E3%82%B0)
「リーダブルコード」第10章 無関係の下位問題を抽出する

## はじめに

「リーダブルコード」第10章 無関係の下位問題を抽出する

で、紹介されていた関数（`findClosestLocation`）をTypeScriptにしたので、そのメモです。

## コード

### Before

```ts
const radians = (degree: number) => degree * (Math.PI / 180);

interface Place {
  lat: number;
  lng: number;
}

// 与えられた緯度経度に最も近い 配列 "placeList" の要素を返す
const findClosestLocation = (lat: number, lng: number, placeList: Place[]) => {
  let closestDist = Number.MAX_VALUE;
  let closestPlace;
  placeList.forEach((place: Place) => {
    const latRad = radians(lat);
    const lngRad = radians(lng);
    const lat2Rad = radians(place.lat);
    const lng2Rad = radians(place.lng);
    const dist = Math.acos(
      Math.sin(latRad) * Math.sin(lat2Rad) +
        Math.cos(latRad) * Math.cos(lat2Rad) * Math.cos(lng2Rad - lngRad)
    );
    // 算出した距離が他の一番近い距離より近ければ更新
    if (dist < closestDist) {
      closestPlace = place;
      closestDist = dist;
    }
  });
  return closestPlace;
};

// ちなみに返り値は名古屋駅の緯度経度
console.log(
  // 第一第二引数は福岡駅の緯度経度
  findClosestLocation(33.590188, 130.420685, [
    { lat: 35.1706431, lng: 136.8816945 }, // 名古屋駅の緯度経度
    { lat: 35.6809591, lng: 139.7673068 } // 東京駅の緯度経度
  ])
);
```

> Number.MAX_VALUE プロパティは、 JavaScript において表すことが可能な最大の数値です。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_VALUE

### After（リファクタ後）

下位問題として切り出された関数（`sphericalDistance`）の幾何学計算は、球面余弦定理で球面上の距離を計算しています。

参考

https://qiita.com/port-development/items/eea3a0a225be47db0fd4#%E7%90%83%E9%9D%A2%E8%B7%9D%E9%9B%A2%E8%A8%88%E7%AE%97

```ts
const radians = (degree: number) => degree * (Math.PI / 180);

interface Place {
  lat: number;
  lng: number;
}

const sphericalDistance = (
  lat1: number,
  lng1: number,
  lat2: number,
  lng2: number
) => {
  const lat1Rad = radians(lat1);
  const lng1Rad = radians(lng1);
  const lat2Rad = radians(lat2);
  const lng2Rad = radians(lng2);
  const dist = Math.acos(
    Math.sin(lat1Rad) * Math.sin(lat2Rad) +
      Math.cos(lat1Rad) * Math.cos(lat2Rad) * Math.cos(lng2Rad - lng1Rad)
  );
  return dist;
};

// 与えられた緯度経度に最も近い 配列 "placeList" の要素を返す
const findClosestLocation = (lat: number, lng: number, placeList: Place[]) => {
  let closestDist = Number.MAX_VALUE;
  let closestPlace;
  placeList.forEach((place: Place) => {
    const dist = sphericalDistance(lat, lng, place.lat, place.lng);
    // 算出した距離が他の一番近い距離より近ければ更新
    if (dist < closestDist) {
      closestPlace = place;
      closestDist = dist;
    }
  });
  return closestPlace;
};

// ちなみに返り値は名古屋駅の緯度経度
console.log(
  // 第一第二引数は福岡駅の緯度経度
  findClosestLocation(33.590188, 130.420685, [
    { lat: 35.1706431, lng: 136.8816945 }, // 名古屋駅の緯度経度
    { lat: 35.6809591, lng: 139.7673068 } // 東京駅の緯度経度
  ])
);
```

## 感想

つまり、「関数に直接関係ない部分を別の関数にする」ということですね。

そうすることで、可読性が上がり、再利用もでき、単体テストもできるのでメンテナンスしやすいですね。

共通部品を作る時は、「こんな引数を受け取るのもあったら他にも別件で誰かが使うかも」と考えて作れるとより汎用性が上がるなと思いました。

無関係の下位問題を汎用的な関数として切り出して残ったのが、その機能固有の本質的なコード、上位問題です。なので、上位問題と下位問題を切り分けてコードを書き分けるようになりたい。

## 要約版

https://twitter.com/ryosuketter/status/1522852614353960960?s=20&t=YoFLR3ccEaOGdketVOsq6w

## 参考

https://www.amazon.co.jp/dp/4873115655

これの第10章
よく使う Kubernetes 関連コマンド

# 背景

最近業務で Kubernetes を扱う機会があったので、その過程で使ったコマンド群をメモしておく。

# コマンド一覧

- `kubectl get pods`
    - すべての pod のリストを表示する。
- `kubectl describe pods <pod-name>`
    - pod の詳細な情報を表示する
- `kubectl apply -f <file-name>`
    - ファイルを使って、リソースの設定を変更する
- `kubectl exec -ti <mysql-pod-name> -- bash`
    - MySQL の pod にログインする
- `kubectl logs -f <pod-name>`
    - pod のエラー内容を確認する。
- `kubectl rollout restart deploy <Container-name>`
    - pod を再起動する
JsonNetが正式にUnity公式パッケージになったのでそちらを使おう

# 想定環境
Unity2021.3.0f1 LTS Windows Editorで動作確認を実施してます。
実ビルドは一旦WebGLビルドでの挙動確認のみしています。

# 要約
今までJsonNetの導入は[Newtonsoft.Json for Unity](https://github.com/jilleJr/Newtonsoft.Json-for-Unity)や[JSON .NET For Unity](https://assetstore.unity.com/packages/tools/input-management/json-net-for-unity-11347?locale=ja-JP)あたりを使っていることが多かったと思いますがUnity公式のJsonNet導入パッケージが正式リリースとなったので紹介します！🎉

# 何があったのか

というのもNewtonsoft.Json for Unityの作者が `Since late February 2022, Unity has now published an updated version of their package: com.unity.nuget.newtonsoft-json@3.0` と言っており今後はUnity公式チームによってパッケージがメンテされるのでそっちを使ってほしいとリポジトリで告知されました。

といっても中身はNewtonsoft.json for Unityのフォーク版らしく[This project vs com.unity.nuget.newtonsoft-json](https://github.com/jilleJr/Newtonsoft.Json-for-Unity/issues/145) にて ある程度説明されていますがUnityの開発者からフォークさせてほしいという話が事前にあったようです。
# 留意事項
- 既存のNewtonsoft JsonNetパッケージとの競合
    - 同じ名前のNetAssemblyが複数あるとエラーになるので競合する場合はどちらかを優先する必要があります
    - またフォーク元も一緒なので `.meta`なども競合します
    - 特に結構色々なassetと依存関係があることが多いライブラリなので新規でなんか追加する際にはmanifest.jsonの差分を確認するようにしたほうがいいかもしれません

 
# 公式サイト
https://docs.unity3d.com/Packages/com.unity.nuget.newtonsoft-json@3.0/manual/index.html
なんか現状導入手順とかもあんまりちゃんと書かれてるように見えないのでドキュメント周りは今後充実させていくのかな？といったところ


# 手順
かなり簡単でUnityPackageManagerの`Add package from git URL`に `com.unity.nuget.newtonsoft-json@3.0` と入れるだけで導入は可能（ただプラットフォームによってはAOT対応などやらないとダメかもしれない）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232732/bfa3240c-baae-01d9-9647-a5b51d29d633.png)

## 動作確認用コード

```C#
using UnityEngine;
using Newtonsoft.Json;

public class JsonNetTest : MonoBehaviour
{
    private JsonType jsonType = new JsonType();

    private void Awake()
    {
        jsonType.Key1 = "test01";
        jsonType.Key2 = "test02";
    }

    private void Start()
    {
        var jsonBody = JsonConvert.SerializeObject(jsonType);

        Debug.Log(jsonBody);

       JsonType outPut = JsonConvert.DeserializeObject<JsonType>(jsonBody);
       Debug.Log(outPut.Key1);
       Debug.Log(outPut.Key2);
    }
}

[JsonObject]
public class JsonType
{
    [JsonProperty("Key1")]
    public string Key1 { get; set; }

    [JsonProperty("Key2")]
    public string Key2 { get; set; }
}
```
## 出力

```
{"Key1":"test01","Key2":"test02"}
```

```
test01
test02
```

基本的な使い方は今までと一緒です。
【必読】現役外国語大生が教えたい技術書、エラー文が読めるようになる英単語集

# はじめに
初めまして。外国語大学四年生のジャックと申します！

エンジニアにとって英語は切り離せないものですよね、、
私はプログラミングを独学で学んでいるのですが、勉強している時に英語を勉強しておいてよかったなと思う時が何度もありました(ちなみにTOEIC820点持ってます)。
技術書を学んでいる時に出てくるifやthenなどの意味を知っていることで理解がしやすかったり、エラーを解決する際に英語の記事を読むことで解決できたり。
英語力がなければもしかしたら挫折してやめていたかもしれません。

この記事ではエンジニアが覚えておきたい英単語についてまとめてあります。
少しでも英語を理解できるように役立てたら嬉しいです！

## 動詞編
| 単語       |       意味 |
|:-----------------|:------------------|
| merge           |            合併する、合わせる |
| conflict            |             ぶつかる、衝突する |
| deploy             |                配置する |
| create            |            生成する |
| allow          |           許す、許可する |
| fix            |              直す、修正する |
| modify          |           修正する |
| verify            |             認証する |
| confirm            |             確認する|
| edit           |          修正する |
|  register      |           登録する |
|insert         |             挿入する|
| import        |           輸入する|
| export           |             輸出する |
| require           |                求める  |
| find          |            見つける、発見する |
| expire     |           (期限が)切れる  |
| refer          |              参照する|
| activate         |            有効にする |
| duplicate         |             複製する |
| replace         |       取り替える|
| exist      |            存在する |
| define      |          定義する |
| destroy       |         破壊する|
| fail       |          失敗する|
| hide       |          隠す、隠れる |
| ignore      |          無視する |
| occur      |          (エラー等が)発生する |
| remove      |          削除する、取り除く |


## 名詞編
| 単語       |       意味 |
|:-----------------|:------------------|
|environment     |            環境 |
| method    |          方法、方式|
| feature        |         機能、特徴  |
| admin |    管理者 (adminという単語はなく、administratorの略) |
| problem       |       問題  |
| function      |  機能 |
| behavior      |         挙動、振る舞い |
| author      |         作成者、著者|
| component      |          部品、コンポーネント|
| length     |          長さ |
|result      |          結果 |

## 形容詞編
| 単語       |       意味 |
|:-----------------|:------------------|
|public       |           公の |
| valid      |            有効な|
| invalid         |           無効な  |
| available           |             利用可能な|
| correct        |        正しい、正確な |
| incorrect       |         間違った  |
| existing       |          存在している、既存の |
| blank      |          空白の |
| empty      |          空の|
| including       |         〜を含めて |
| specific  |          特定の |
| unable      |          不可能な |


## その他(接続詞、副詞等)
| 単語       |       意味 |
|:-----------------|:------------------|
|if     |         もし  |
|else   |          他の |
|then    |         それから  |
| already       |          既に  |
| still       |             まだ|
| maybe/probably       |     多分、おそらく |
| except      |         〜を除く |

## 最後に
いかがでしたでしょうか？
今回は頻出の単語をまとめました。
上記の単語を覚えておけば理解が早かったり、英語の文法がわからなくてもエラー文をなんとなく理解できると思います。
必要な時に随時見直していただけると嬉しいです！

参考になったという方は[Twitter](https://twitter.com/home "Twitter")をやっているのでフォローしていただけると嬉しいです〜〜:grinning:
PowerShellでFindコマンドが上手く動かない

## 背景・目的・読み手
　別記事でFindコマンドしたら上手く動かず、原因調査に一番時間がかかったので、今後も忘れないようにメモ。
　読み手は主に自分と、同現象でハマってしまった方。
　結論はこちら：[上手く動く例](https://qiita.com/yoshi_iwa/items/f4a19bc1a37ced40cf74#%E4%B8%8A%E6%89%8B%E3%81%8F%E5%8B%95%E3%81%8F%E4%BE%8B)


## 現象

 コマンドプロンプトでは以下のようにFindコマンドが機能するのですが…。

```CMD:コマンドプロンプトでは上手く動く
C:\> systeminfo | find "Hyper"
                        [06]: Hyper-V Virtual Ethernet Adapter
Hyper-V の要件:         ハイパーバイザーが検出されました。Hyper-V に必要な機能は表示されません。
```

　何も考えずにPowerShellでこのコマンドを入力すると、以下のようにうまくいきません。

```PowerShell:PowerShell上でFindコマンドが効かない
PS> systeminfo | find "Hyper"
FIND: パラメーターの書式が違います
```


## 原因

　上手く動かない原因は2個あります。

### 1. 引用符 (") が消えてしまう

　Findには引用符込みの引数を渡す必要がありますが、PowerShellにてコマンドに引用符を用いると展開可能な文字列として解釈されるらしく、結果引用符 (") が消えてしまうようです。

　従って ```Find "Hyper"``` は ```Find Hyper``` のように解釈されます。Findは引用符で囲んだ文字列を検索文字列として必要とするため、ここでエラーとなります。

　これを回避するために、```Find '"Hyper"'``` のようにシングルクォーテーションで両側を囲んでおくと ```Find "Hyper"``` と解釈されます。


### 2. コンソールの文字コードと出力の文字コードの違い

　上記の罠を突破したあとで、コマンドを入力すると出力結果が文字化けします。

```PowerShell:PowerShell上でFindコマンドが文字化け
PS> systeminfo | find '"Hyper"'
                        [06]: Hyper-V Virtual Ethernet Adapter
Hyper-V ???:         ?????????????????Hyper-V ???????????????
```

　これはパイプでデータを渡す際、デフォルトの設定がUS-ASCIIとなっていることが原因です[^1]。これを回避するため、Findコマンドを実行する前に  ```$OutputEncoding = [Text.Encoding]::Default``` としておきます。

　```$OutputEncoding = [Text.Encoding]::Default``` による設定変更はPowerShell実行の度にリセットされます。また、複数のPowerShellウィンドウを開いている場合は、それぞれで設定変更をする必要があります。


## 上手く動く例

　上記2つの罠を回避するコマンド例はこちら：

```PowerShell:Findコマンドが上手く動く例
PS> $OutputEncoding = [Text.Encoding]::Default
PS> systeminfo | find '"Hyper"'
                        [06]: Hyper-V Virtual Ethernet Adapter
Hyper-V の要件:         ハイパーバイザーが検出されました。Hyper-V に必要な機能は表示されません。
```


## 余談

　引数に半角スペースが含まれる場合は引用符が消えず、Findコマンドが上手く動くようです。なんでだろう…？
　
```PowerShell:引数に半角スペースが含まれる場合は上手く解釈される。
PS> $OutputEncoding = [Text.Encoding]::Default
PS> systeminfo | find "Hyper-V "
                        [06]: Hyper-V Virtual Ethernet Adapter
Hyper-V の要件:         ハイパーバイザーが検出されました。Hyper-V に必要な機能は表示されません。
```

　英語のみの環境で


## 参考文献・注釈

- [引用ルールについて \- PowerShell \| Microsoft Docs](https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_quoting_rules?view=powershell-7.2)

[^1]:[Powershell上で、パイプで渡すと文字化けする。](https://qiita.com/EmEpsilon/items/7e8f72b9c58576b4c5a5)
Numbers.app で VBA のように、行番号・列番号でセルを走査したい

　Excel VBA の `Cells(2, 3).Value = "foobar..."` のように、行番号、列番号を指定して、Numbers.app 上のセルを走査したい場合のスニペットです。

　実行してみると、すこぶる遅い...。

## AppleScript の場合

```applescript
tell application "Numbers"
    tell front document
        tell active sheet
            set theTable to first table
            repeat with r from 1 to 5
                repeat with c from 1 to 3
                    set theCell to item c of cells of item r of rows of theTable
                    set value of theCell to "hello"
                end repeat
            end repeat
        end tell
    end tell
end tell
```

## JavaScript（JXA） の場合

　うーん。もうちょっとキレイに書けないでしょうか...。

```js
var Numbers = Application("Numbers");
var Document = Numbers.documents[0];
var WorkSheet = Document.sheets[0];
var Table = WorkSheet.tables[0];

function Cells(r, c)
{
	return Table.rows[r - 1].cells[c - 1];
}

for (let r = 1; r <= 5; r++)
{
	for (let c = 1; c <= 3; c++)
	{
		Cells(r, c).value = "hello";
	}
}
```
【番外編】TOEIC860が語る、『インフラエンジニアにとって英語力は必要なのか？』について

# はじめに
ひと昔の翻訳機能と比較して、最近のGoogle翻訳やDeeplは機械学習の影響もあり飛躍的に進歩しましたね！
今や大体の公式ドキュメントなんかは翻訳を使えば理解できてしまいますよね... それでも、エンジニア英語必須説を唱える人がまだ多いのも事実です。
そんなわけで、去年の7月に自身の英語力を知るために受けたTOEICの結果も踏まえ、インフラエンジニア二年目の目線から、英語力の必要性について考察してみたいと思います!

## この記事を見て欲しい人
#### ・エンジニアとして英語の勉強している人
#### ・キャリアアップのため、これから英語を勉強しようと考えているエンジニア
#### ・英語がエンジニア業務にどう貢献するか知りたい人

## 現在のTOIECスコア
私が受けたのは2021年7月で結構時間が経過してしまっていますが、スコアは当時『**865点**』でした。
そもそもTOEICを受けた理由は、最後に受けたのが大学4年の時、就活に使えるという先輩のアドバイスもあり、イヤイヤながら受けてみたのですが、それ以来受ける機会もなく、ふと、今の自分の英語力ってどのくらいなんだろうと思ったのがきっかけでした。試験の1ヶ月前に予約をして、そこから過去問を仕事の休憩中と休日に時間を見つけながらやりました。

## 本題
結論から言うと、***英語力はあったほうがいいけど必須ではない***、と言うのが私の見解です。
理由は以下です。

#### 1. 翻訳機能が近年かなり飛躍的に進歩している
#### 2. 語学を学ぶより技術を学ぶ方を優先するべき
#### 3. 国内であればコミュニケーションの大半は日本語でやり取りされるから


## 1. 翻訳機能が近年かなり飛躍的に進歩している

個人的にこれが一番の理由です。
私はサーバの構築・運用でエラーが出た時、とりあえずエラー文をコピってGoogle翻訳を使います。
もしくはエラー文をそのまま検索かけるとqiitaなどで大体同じ問題にぶつかっている人がいますし、解決策も丁寧に説明してくれています。
もちろん、エラーやベンダーのドキュメントを原文のまま読めたらいいのかもしれませんが、便利なツールを使ってその能力をカバーできてしまうのであればそれで問題ないと私は思うのです。
本来の目的はエラーを解決することなのに、無駄に頑張って英語で読もうとしては本末転倒ですよね？それなら自分に足りないスキルをカバーできるのであればそっちの方が効率的でゴールへの近道になるのです。


## 2. 語学を学ぶより技術を学ぶ方を優先するべき

特に未経験者や駆け出しエンジニアに向けてですが、ITエンジニアなのであれば何より『技術』が大事だということです。
私がまだこの業界に入る前、何も未経験として何社か面接をしたのですが、履歴書にTOIECのスコアを書いても英語力について問われることはほとんどなかったですし、むしろ「なんでインフラエンジニアになりたいのか？」とか「どんな技術に興味があるのか？」、「この分野について普段はどんな勉強をしているのか？」といった技術的な質問が大半でした。
なので、語学はあるレベルまで技術を身につけてからでも遅くない、というのが私の見解です。

## 3. 国内であればコミュニケーションの大半は日本語でやり取りされるから

リスニングやスピーキングに関して言えば、そもそも日本に住んでいてそこまで必要なのか？という疑問があります。
中には英語の案件に携われるチャンスが増える、とか言うエンジニアもいますが、日本に住んでいる限り英語を使う案件自体が少ないと各求人サイトを調べて思いました。どうしても英語を使って仕事がしたいという人ならリスニングやスピーキングにも力を入れてもいいとは思いますが、そもそもそういう人たちは海外で仕事を探したほうが早いのではないでしょうか。
それよりも上述したように、様々な技術を勉強して、他エンジニアと差別化できる技術を身につけたほうがやりたい仕事の幅も広がりますし、何より技術者としてかっこいいですよね！


# さいごに

今回は番外編で英語力について個人的な見解を述べてきましたが、私自身、洋楽や洋画に大きく影響されて学生時代は英語を勉強するのが好きでした。
ただ、その当時から思っていたのは英語はあくまで『手段』であって『目的』ではないということです。言語というのは相手に何かを伝えるためのツールであって、そもそも伝えたいことがなければ大した力を発揮しないのです。極端な言い方をすれば、英語力はネイティブ並みだけど駆け出しエンジニアと、英語力は中学生レベルだけどエンジニアとしては一流であれば後者の方が重宝されるのではないでしょうか。
私はまだまだ新米エンジニアなのでこれからもいろんな技術や知識を勉強して、その副次的な要素として英語が今後活かさればいいなと思います。
React Router v6 でページ遷移で props を渡す

# 初めに

react router v6 で props の渡し方について調べました。

以下に記載があります。

https://reactrouter.com/docs/en/v6/faq

# 例

例を作りました。

![Qiita-gif用 (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/caf09ef5-cbaa-89e0-9a70-86b4a0cff79b.gif)


```React:App.js
import "./styles.css";
import { useState } from "react";
import { BrowserRouter, Routes, Route, useNavigate } from "react-router-dom";

const Count = (props) => {
  // props を受け取る
  const { count, setCount } = props;
  return (
    <div>
      <h3>Click this button</h3>
      <button onClick={() => setCount(count + 1)}>Click</button>
      <h6>COUNT is {count}</h6>
    </div>
  );
};

const Home = () => {
  const navigate = useNavigate();

  return (
    <div>
      <h1>Home</h1>
      <button onClick={() => navigate("countpage")}>Go to count page</button>
    </div>
  );
};

export default function App() {
  const [count, setCount] = useState(0);

  return (
    <div className="App">
      <BrowserRouter>
        <Routes>
          <Route path="/" element={<Home />} />
          <Route
            path="/countpage"
            // prors を渡す
            element={<Count count={count} setCount={setCount} />}
          />
        </Routes>
      </BrowserRouter>
    </div>
  );
}
```

# 参考記事

https://reactrouter.com/docs/en/v6/faq
UI/UXデザイン入門編

画面設計、ワイヤーフレームなども業務で担当したり、Google認定のUXデザインコース受けたり、本を読ん得た知識を箇条書きではありますが備忘録としてまとめました。

### UXデザインとは
- ユーザーが快適に製品（サービス、プロダクト）を利用できること
- 心地よい操作体験を提供し、ポジティブな感情を抱いてもらうこと

上記を実現するために、考え、設計することが**UXデザイン**


### UIとUXの違いは？
- 良いUXを実現する為の画面、フローを設計して見える様に、使える様にすること
- ユーザがUIに触れた経験から抱く感情、反応をより良いものにすること

上記を実現するために、考え、設計することが**UIデザイン**

UIは、UXを構成する要素の代表的なものですが、UXの傘の下に位置する。
なので、企業によっては**UX/UIデザイン**と呼んでいるケースも多々あります。

また、UXは`プランニング`(サービスをユーザーにどう使ってもらうかを設計)で、UIは`デザインシステム`(ユーザーとの接点、目に見えている部分の設計)という区分けもできます。


### なぜUXデザインが必要なのか？UXデザインの使命は？
ユーザーが製品やサービスに触れて、
- 好きになってもらう為
- ポジティブな感情を持ってもらう為
- 繰り返し使ってもらう為
- 繰り返し買ってもらう為
- 繰り返し来てもらう為

つまり、ユーザーの行動、習慣を変えることがUXデザインの使命といえます。

製品やサービスを使いやすい、楽しいと思ってもらえれば、口コミで勝手に広まってビジネスへの貢献にも繋がる。


### ユーザー体験の「体験」とは？
**体験**はサービス利用中だけではなく、前と後も含む！
- 予期的（利用前）
- 一時的（利用中）
- エピソード的（利用後）
- 累積的（利用時間全体）

の４段階のストーリーになる。

### ペルソナとは？
サービスの典型的なユーザー像のことで、マーケティングにおいて活用される概念。

実際にその人物が実在しているかのように、年齢、性別、居住地、職業、役職、年収、趣味、特技、価値観、家族構成、生い立ち、休日の過ごし方、ライフスタイル……などリアリティのある詳細な情報を設定する。

### ユーザーフロー
ユーザーがアプリの中でどういう流れで操作をして、目的を果たすのか？を設計する
例：ECサイトで買い物する場合
1. ECサイトページを開く
1. 欲しい商品をさがsカゴに入れる
1. お会計ページへ進む
1. カゴに入れた商品の内容を表示して、間違いないかを確認、あれば修正
1. 住所、クレジットカード情報を入力して支払い確定
1. 買い物完了

### UXデザイナーの役割
- `ユーザー`、`ユーザーがどう製品を使うか`に興味を持つ事が一番大事
- ユーザーの`使いやすい`、`使いにくい`をしっかりと言語化できる


### アクセシビリティ
近づきやすさ、利用しやすさ、などの意味を持つ英単語。
ITの分野では機器やソフトウェア、システム、情報などが身体の状態や能力の違いによらず様々な人から同じように利用できる状態やその度合いのこと。

これを意識したデザインを**accessible design アクセシブルデザイン**と呼ぶ

ソフトウェア開発では健常者のユーザー向けではなく、障害者でも使える様にしないといけない。障害者でも使える様に作ることが結果として健常者にもメリットとなる。
>例：タイプライターはかつて目の見えない人が文書を書くのに役立ち、健常者は使ってなかったが、結果として健常者も使う様になった。

#### 類似で、ユニバーサルデザインがある
文化・言語・国籍や年齢・性別・能力などの違いにかかわらず、出来るだけ多くの人が利用できることを目指した建築（設備）・製品・情報などの設計（デザイン）のこと
>例：デフォルトのアイコンを女性、男性で分ける、顔文字の肌の色を人種別に分ける、多言語対応するとか、

#### 支援技術：Assistive Technology
障害者が機器を操作するために手助けする技術
>例：手が使えない人向けのアイトラッキング操作のコンピューター、声で操作できるVUIとか、目が目ない人のための声での道案内、足が不自由な人でも運転できる車など、


### プロダクト開発ライフサイクル５段階
- Brainstorm（リサーチ）
- Define（ターゲットユーザーを決める）
- Design（ストーリーボード、スケッチ、ワイヤー、などで可視化）
- Test（ユーザーに見てもらう）
- Launch（これで終わりではない、世の中に出して反応をみる）

この全てを一人のUXデザイナーが担当するケースも小規模のベンチャーではあるかもしれないが、大体は担当が分かれる。

### UXデザインの3大フレームワーク
- 人間中心設計
- ５段階モデリング
- デザイン思考

の３つがある。それぞれとても深いので詳細は割愛します。

### 良いUXデザインを設計するのはソフトウェアの世界だけではない

- ビル、駅の中のサイン
- 駅の乗り換え案内
- 空港のチェックイン
- 使いやすいフライパン
- 持ちやすいペットボトル

などなどソフトウェア以外でも優れたUXデザインの設計例は沢山ある。

ソフトウェアに限定せず、色々なユーザー体験から考察して、自分のサービスに転用していく力も必要。

### 優れたUIUXデザインの特徴
- ユーザーが考えなくても直感的に使える
- ユーザーファーストで使い心地を考え抜かれている
- アプリ内の居心地がいい
- 飽きない、長時間使ってしまう


### まとめ
どんな業種・職業でもUXデザインのフレームワークや思考は役に立つと言われていますし、ITに問わずデザイン思考を導入する企業が増えています。

フロントエンドエンジニアはユーザー体験を提供するプロであり、ユーザーが触るUIの実装（最後の部分）を担うプロ。
このプロとして、実装だけではなくその上流工程も含めて、担当領域を広げてUIUXデザイナーの肩書きも持ちたいと思います。
駆け出しデザイナー・エンジニアにこそ見ていただきたいWordPressの脆弱性とセキュリティ

WordPressは世界で1番使用されているCMSかつオープンソースであるが故に、悪意のある第三者やプログラムから世界で1番攻撃されやすいCMSと言われています。

私自身も何度か攻撃を受けていて、実害に及ばなかったものから及んだものまで様々でした。クライアントの稼働しているWEBサイトに実害があった場合は、原因究明や報告、一次対応から恒久的対策までを行い、安全性を確保した上で再度稼働させる必要があり、その作業は簡単なものではありません。
被害があるのはクライアントだけではなく、そのサイトにアクセスしたユーザーに及びます。たとえ納品後の保守契約を結んでいなかったとしても、実装者の責任としてクライアント、ユーザーに安心して利用できるWEBサイトを目指さなければいけません。

私はセキュリティの専門家ではないもののWordPressを10年以上触っている中で様々な問題に当たり、対応してきました。その経験で得た知識や経験を皆さまに共有することで、同じことで失敗ないでもらえたら幸いです。
ここで紹介する対策は初めてWordPressの実装をする人でも出来るものを多く紹介していますので、参考にしていただけたらと思います。

この記事の続き・全文は下記URLに移設しました。
https://web-dukuri.studiodansyaku.com/?p=171
Windows10 に Docker Desktop をインストールして遊ぶ

## 背景・目的・読み手

　手軽な動作環境が欲しかったので、手元のPCにDocker Desktopを導入したときのまとめ。非常に簡単にLinux環境が用意できるようになっています。


## 導入手順

　基本[Windows に Docker Desktop をインストール — Docker\-docs\-ja 19\.03 ドキュメント](https://docs.docker.jp/docker-for-windows/install.html)の手順通り実施することで手軽にDocker利用環境が整います。


### インストーラーの入手と実行

　上記手順に沿ってインストーラーをダウンロードしダブルクリックで実行。インストールに20分ぐらいかかるのと、インストールし終わった後再起動が入るため注意。


### WSL2の導入。
　再起動後Dockerが起動してくるのを待つ。起動させた後以下ポップアップが出たので、WSL2を導入する。
※このポップアップのRestartボタンはDocker Desktopの再起動となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/b4d02f80-a7a3-8e72-4758-cdc64e197057.png)

　WSL2の導入手順はこちら：[以前のバージョンの WSL の手動インストール手順 \| Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package)

　上記手順の5.まで実施すればDockerが利用可能となる。

　システムの確認方法（x64かARM64かの確認）についてはコマンドプロンプトで実施するのが楽。PowerShellで確認する場合は出力エンコーディングをシフトJISにし、Findコマンドのキーワードをシングルクォーテーションで囲む点に注意。
```PowerShell:PowerShell上でのシステムの種類確認方法
PS> $OutputEncoding = [Text.Encoding]::Default
PS> systeminfo | Find '"システムの種類"'
システムの種類:         x64-based PC
```

　今回はLinux カーネル更新プログラム パッケージをダウンロードし、インストール。その後以下コマンドを実行。
```
> wsl --set-default-version 2
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
この操作を正しく終了しました。
```

ここまで実施するとDocker Desktopが使えるようになるので、以下チュートリアルを試してみる。

- [Docker for Windows を始めよう — Docker\-docs\-ja 19\.03 ドキュメント](https://docs.docker.jp/docker-for-windows/index.html)
- [Part 1：概要説明とセットアップ — Docker\-docs\-ja 20\.10 ドキュメント](https://docs.docker.jp/get-started/index.html)


## 試してみたこと

　特に何もしなくてもコンテナは外部と通信可能・コンテナ同士の通信も可能。IPアドレスは172.17.x.xが割り当てられた。

　コンテナ⇔ローカルのデータの受け渡しは```docker cp```コマンドで可能。



## 参考文献

- [初心者による初心者のためのDocker入門 その１ dockerコマンド編 \- Qiita](https://qiita.com/k5n/items/2212b87feac5ebc33ecb#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92%E7%94%9F%E6%88%90%E3%81%97%E3%81%A6%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B)
- [Dockerコンテナでpingコマンドを使いたい【トラブルシュート対応】 \| SyachikuLOG](https://syachiku.net/docker-install-ping/)
    - 素でUbuntuコンテナ立ち上げるとping入っていないので…。
- [dockerコンテナにファイルを転送する \- Qiita](https://qiita.com/buntafujikawa/items/04c3bdd93ac3520c53eb)
技術者倫理が基本だ！　反論は許さない！

　始めにお断りしておきます。大きく掲げたタイトルは世間を欺く表向きのもの。本当に言いたい裏のタイトルは「**技術者倫理くそくらえ**」です。なお、本記事に「いいね」して身バレし、勤務先から危険思想社員の烙印を押されても、当方は一切責任を負いません。逆に、冷静な反論コメントをすれば、あなたの評価は上がるかもしれません。

---
　**人間は信用第一**。そのためには**強い倫理感を持った行動が基本**です。Qiitaの会員の皆さんは、まさか、チョンボでの不具合を指摘されているのに平然と「それは仕様です」と嘯いたり、仕事とはいえ、誤クリックを誘う Amazon Prime入会サイト や Windows11インストール誘導サイト のようなものを作ったりはしていないですよね。

・・・と、心にもない綺麗ごとを言ってみました。

　しかし、現実は、命令とあらば逆らわずにやるのが被雇用者の基本です。善悪に関わらず会社と命運をともにすることは忠誠心を示す美談でもあります。しかも、命令は、普通は外堀を埋めた形で行われます。倫理的に疑念があっても、拒否はできないように細工したうえで命令が下されます。倫理観を持つべきは、命令権のある管理職であって、下働きの技術者ではありません。「**技術者倫理くそくらえ**」です。

　倫理の話題が出ると良く言われるのは「管理者への進言の重要性」です。これが技術者の義務のようにも言われます。しかし、管理者は進言などされなくても、それが非倫理的であることは百も承知です。そのへんの技術者よりも人生経験は豊富です。経験不足の部下技術者から、鬼の首をとったように指摘されれば腹が立つだけです。私の昔の勤務先がブラック企業だったせいか、「報連相」の教えにしたがって問題点を御注進に及んだものの、返答は、不快感を滲ませながらの「**聞きたくなかった！ 自分で解決を済ませてから報告せよ！**」（by 〇と〇〇〇）でした。

　一般の技術者向け雑誌で、技術者倫理を説く文書を見ても、文字数が多いにも拘わらず要領を得ないとりとめのない記述ばかりです。綺麗ごとばかりの歯が浮くような論調です。しかし、これらに反論することは憚られるような社会環境なのでどうしようもありません。

　この厳しい世の間を、命永らえて渡り歩いてきていれば、脛に傷の一つや二つは持つのが当たり前です。墓場まで持っていかなければならない隠し事も沢山あるでしょう。これらの文書の著者も、それに触れないように、腫れ物にさわらないように、当たり障りのないことを書かざるを得ないのでしょう。　懺悔録でも書いて、反面教師として役立つ方がどれほど良いことか・・・。

　倫理規範など、その時々の為政者の思想や時代の経過とともに流動的に変わるものです。真の正解などありません。今の技術者倫理教育は末端の技術者にその正解を求めています。これでは、管理者が技術者を飼い慣らし、いざというときは最終責任を「倫理意識が足りない末端の技術者」に押し付けようとする下心にしか見えません。

　なお、技術者倫理に真摯に向き合おうとしている下記の投稿に水を差すつもりはありません。世の中には、長崎の住人でありながら、このように非常識な人も居るんだと受け取っていただくだけで結構です。
[技術者倫理の本を開発者目線で読んでみる -Qiita](https://qiita.com/ti_aiuto/items/f02ff3e41c3df9fdbf90)
[【技術者倫理】長崎原爆から学んだユーザ視点で開発することの大切さ -Qiita](
https://qiita.com/Noah_tech/items/adf78f6ef57dd6249592)
Laravelでデータ削除時に子供テーブルも削除する

以下を使えば自動で子供テーブルを削除したり、追加のロジックを実行できる。

https://readouble.com/laravel/8.x/ja/eloquent.html
> オブザーバーを登録するには、監視するモデルでobserveメソッドを呼び出す必要があります。アプリケーションのApp\Providers\EventServiceProviderサービスプロバイダのbootメソッドにオブザーバーを登録できます。
> オブザーバーがリッスンできる他のイベントには、savingやretrievedなどがあります。

```xxx.php
    protected static function boot()
    {
        parent::boot();

        static::deleting(function ($xxx) {
            $xxx->user->delete();
            $xxx->aaa()->delete();
            //他にやりたいことがあれば
        });
    }
```
pythonでゲーム作成 pygame基礎

## 仮想環境作成
```
python -m venv game
.\game\Scripts\activate
```
## ライブラリインストール
```
pip install pygame
```

## 初期化
```python
import pygame
pygame.init()
```
ライブラリインポートし、初期化する。

## 画面を表示
```python
import sys
import pygame
from pygame.locals import QUIT

pygame.init()
screen = pygame.display.set_mode((600, 400))

def main():
    while True:
        pygame.display.update() 
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

if __name__ == '__main__':
    main()
```
スクリーンサイズを設定し、画面表示。
閉じる(QUIT)ボタンが押されたら、pygameを終了し、プログラムが終了する。
以下実行時の表示画面。
![sample0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2465378/58925e15-f050-aa3a-5e22-5b827b871394.png)

<iframe width="560" height="315" src="https://www.youtube.com/embed/9AezFta7ZX8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 基礎練習
背景を白に設定し、中心に円を描画する。
```python
import sys
import pygame
from pygame.locals import QUIT

pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("国旗")

white = (255,255,255)
red = (255,0,0)

def main():
    while True:
        screen.fill(white)
        pygame.draw.circle(screen, red, (300,200), 100)
        pygame.display.update() 
        for event in pygame.event.get():
            if event.type == QUIT: 
                pygame.quit()
                sys.exit() 

if __name__ == '__main__':
    main()
```
set_captionを利用することで、タイトルを編集可能。
sreen.fillで背景色を設定する。
draw.circle関数で円を描画する。第3引数は円の描画中心座標、第4引数は半径を示している。
以下実行時の表示画面。
![sample1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2465378/f4b7858e-da87-e87d-c4d7-ed7596657e40.png)
FirefoxにISRGの証明書をインストール

雪豹のFirefoxでページを見ていると、かなり開けないページがあります。

私がよく書き込んでいるNYC*BUGのdmesgdもSEC_ERROR_EXPIRED_ISSUER_CERTIFICATEで開けません。

https://dmesgd.nycbug.org/index.cgi

![スクリーンショット（2022-05-08 6.04.35）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/05253502-603f-629a-27bb-7b400af2f96b.png)


ネットで調べるとPCの時間合わせろとか、ブラウザをアップデートしろとか的外れなページがほとんどです。雪豹のFirefoxはサポートが終了しているのでアップデートできません。自分でどうにかするしかありません。

CAがまずいのかと思われ、とりあえずopensslで確認してみます。

```
$ openssl s_client -connect dmesgd.nycbug.org:443 -showcerts
CONNECTED(0000000C)
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = R3
verify return:1
depth=0 CN = dmesgd.nycbug.org
verify return:1
---
Certificate chain
 0 s:CN = dmesgd.nycbug.org
   i:C = US, O = Let's Encrypt, CN = R3
```

Let's Encryptの証明書のようです。これを調べたら、CAの証明書が期限切れになったようです。新しい証明書は

https://letsencrypt.org/certs/isrgrootx1.pem.txt

にあるようですが、そもそもそこにFirefoxでアクセスすると

![スクリーンショット（2022-05-07 15.13.57）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/bc468304-b743-470d-bcaa-63718b1cea79.png)

になります。仕方が無いので自力でビルドしたcurlで拾います。

```
$ curl https://letsencrypt.org/certs/isrgrootx1.pem.txt > ~/isrgrootx1.pem.txt
```

通常は新しいマシンでファイルをダウンロードして、USBメモリなどでコピーするのが良いです。

これを「設定」->「詳細」->「証明書」で読み込みすると見れるようになります。

![スクリーンショット（2022-05-07 15.10.57）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/a79b1733-d419-8ab3-66ff-c4d3378e5deb.png)

![スクリーンショット（2022-05-07 15.10.31）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/224051d5-82ae-82d7-7b1f-3d2703e235ac.png)

これで、もりもりdmesgがアップできます。まだまだ雪豹は現役です。:)
CloudFrontのカスタムエラーレスポンスではカスタムエラーページを200で返す必要があった

## 結論

CloudFrontのカスタムエラーレスポンスを使おうと思って設定をしたが、意図したとおりに動かなかった。

結論、カスタムエラーページに設定するページは正常なステータスコードで返す必要があることがわかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/6fbc6153-fa88-31d9-5049-b4cf52ea8fc1.png)
（オリジンサーバーからの404レスポンスをCloudFrontから503でカスタムエラーページを返す例）

## やっていたこと

503を返すページをつくりたくて、とりあえず既にに用意している404ページを流用してCloudFrontのカスタムエラーレスポンスで503に変えて配信しようと思っていた。

イメージは以下の図。（これは意図したとおりに動かない）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/72947dcc-3d07-36e4-bb46-8071a7f9aa15.png)

だが、何度設定しても意図したとおりに動かず、CloudFrontから404が帰ってきていた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/e2cb87fa-560f-dc1f-2ef9-f3cb25ef8aba.png)


試しに200を返すページをカスタムエラーページに設定したところ動いた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/6fbc6153-fa88-31d9-5049-b4cf52ea8fc1.png)

ドキュメントを読むと、

> https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/GeneratingCustomErrorResponses.html
> HTTP ステータスコードの代わりにカスタムエラーページを返すように CloudFront を構成していても、カスタムエラーページが利用できない場合には、CloudFront は、カスタムエラーページを持つオリジンから受信したステータスコードをビューワーに返します。

とあり、カスタムエラーページからのレスポンスのステータスコードが正常でなければ、そのステータスコードをそのまま返すようになっている様。

そのため、カスタムエラーページとして設定するページは正常なステータスコードを返す必要があることがわかった。

## Refs

- [カスタムエラーレスポンスの生成 - Amazon CloudFront](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/GeneratingCustomErrorResponses.html)
【Debian】 aptでtrusted.gpgのdeprecationが出た際の対処

# これは何？

Debian系のLinuxでaptを使い、サードパーティーのリポジトリを追加してる場合に警告が出た際の対処方。

# 原因

こちらの記事が詳しい。

https://gihyo.jp/admin/serial/01/ubuntu-recipe/0675?page=2

# 対応

## はじめに

最近Ubuntuを22.04にアップグレードしたところ以下のような警告が表示されるようになりました。

```
W: https://storage.googleapis.com/download.dartlang.org/linux/debian/dists/stable/Release.gpg: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
```

どういう事かと調べると先述のURLの記事の通りでした。

## やること

先述の記事の通り、keyringに追加してやれば良さそう。
スクリプト作ってしまおう。

```bash
#!/bin/bash

if [ $# -ne 2 ]; then
  echo "$(basename $0) KEY_URL ID"
  exit 1
fi

KEY_FILE="/dev/shm/${$}.key"
GPG_FILE="/dev/shm/${$}.gpg"
KEYRING="${2}.gpg"

wget -q -O "$KEY_FILE" "$1" || exit 2

gpg --no-default-keyring --keyring "$GPG_FILE" --import "$KEY_FILE" || exit 3
gpg --no-default-keyring --keyring "$GPG_FILE" --export --output "$KEYRING" || exit 4

rm "$KEY_FILE"
rm "$GPG_FILE"

sudo mv "$KEYRING" /usr/share/keyrings/ || exit 5
echo "sources.listに以下のオプションを追記してください"
echo
echo "[signed-by=/usr/share/keyrings/${KEYRING}]"
echo
```

自分用なのでまぁ雑ですが、これでやりたいことはやれるようになりました。

さっそく実行してみます。

```
apt-key-import https://dl-ssl.google.com/linux/linux_signing_key.pub dart
```

上書きするかどうか聞かれたので上書きを選択しました。
最後にオプション入れろと出るので(自分で出してるやつ)sources.listを編集します。

```
vim /etc/apt/sources.list.d/dart_stable.list
```

元
```
deb [arch=amd64] https://storage.googleapis.com/download.dartlang.org/linux/debian stable main
```

最初から `[arch=amd64]` のオプションが入っていたので、スペースで区切って追記します。

```
deb [arch=amd64 signed-by=/usr/share/keyrings/dart.gpg] https://storage.googleapis.com/download.dartlang.org/linux/debian stable main
```

あとはおなじみの `apt update` で糸冬了。

# 結果

これで無事により安全な形で鍵を追加し、 `apt upgrade -y` 等を行えるようになりました。

余談ですがUbuntuならdartはsnapで入れるのが手軽かと思います……

---

それでは良いLinuxライフを。
Next.jsチュートリアル備忘録：Dynamic Routes

https://nextjs.org/learn/basics/dynamic-routes/implement-getstaticpaths
# Dynamic Routes
pages/配下のファイル名を`[name].js`のように角かっこで囲むことでURLのパスの値を取得して、ページの内容を変更することができます。(url slugs, pretty urls等とも呼ばれるらしい)

## getStaticPaths()
```getStaticPath()```を使うことでパスのリストを事前に定義しておくことができます。
ここで定義されたURLのページはビルド時に静的レンダリングが行われます。
```JavaScript:[name].js
...
export async function getStaticPaths() {
  return {
    paths: [
      { params: { name: 'taro' } },
      { params: { name: 'hanako' } }
    ],
    fallback: true // false or 'blocking'
  };
}
...
```
`getStaticPath()`では`params`キーとパスの情報をもつオブジェクトを持つオブジェクトの配列(`paths`)を返す必要があります。
この例だと`/taro`や`/hanako`のパスでそれぞれに対応したページを表示することができます。

また、`fallback`プロパティでは`getStaticPath()`で定義されていないパスへのリクエストがあった場合の処理を指定します
* true: 初回のリクエストでは、fallbackページを表示します。その間、サーバーサイドではリクエストパスに基づいたページの生成が行われます。そして、2回目以降のリクエストでは1回目のリクエスト時に生成されたページを表示します。fallbackページは下記の例のように`router.isFallback`で判定し、表示します
* false:404を返す
* blocking:trueの場合と似ていますが、こちらはfallbackページを表示しません。初回のリクエスト時からサーバーサイドでレンダリングしてページを表示します。そのため、初回リクエスト時のレスポンスはtrueの場合に比べて遅くなります。
```JavaScript:fallback
// pages/posts/[id].js
import { useRouter } from 'next/router'

function Post({ post }) {
  const router = useRouter()

  // If the page is not yet generated, this will be displayed
  // initially until getStaticProps() finishes running
  if (router.isFallback) {
    return <div>Loading...</div>
  }

  // Render post...
}
// This function gets called at build time
export async function getStaticPaths() {
  return {
    paths: [{ params:{}}],
    fallback: true,
  }
}
```

## getStaticProps()
`getStaticPaths()`は必ず`getStaticProps()`と共に使用します。
※`getServerSideProps()`と共に使用することはできません。(`getStaticPaths()`は静的レンダリングのための関数のため)
`getStaticProps()`は引数として`getStaticPaths()`で定義したパス(`params`)を受け取ります。
またコンポーネントの`props`を返します。
```JavaScript
export async function getStaticProps({ params }) {
  return {
    props: {
      data,
    },
}
```
B - Exponential  AtCoder

## 問題
https://atcoder.jp/contests/abc097/tasks/abc097_b


## 回答

```Python
n = int(input())
ans = []

for i in range(1,1001):
    for j in range(2,101):
        if i ** j <= n:
            ans.append(i**j)
 
print(max(ans))
```

## ポイント

冪乗の概念が理解できなかった。

1 →1の9乗
2 →2の4乗
3 →3の2乗
4 →2の2乗
5 →5の1乗　→冪乗数ではない
6 →6の1乗　→冪乗数ではない
7 →7の1乗　→冪乗数ではない
8 →2の3乗
9 →3の2乗
10 →10の1乗　→冪乗数ではない
4.20 (易) 階層モデル2 ガンマ・ポアソン分布

## 方針

4.19と同じ．

## 答案

![4.-29.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/731321a2-473c-9b0f-c3f6-3f9b7b59cd84.jpeg)


## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
4.11 (易) 階層モデル1 ベータ・二項モデル

## 方針

繰り返し期待値・分散の公式を使って平均，分散を計算する．

## 答案

![4.-28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/3bbba0de-955f-52ae-a8b3-5ae6f5bdced7.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
[Xcode] The value for key CFBundleShortVersionString [hoge] in the Info.plist file…に対する処方箋

## 初めに
iOSアプリをAppStoreに新しいバージョンをリリースする際にこんなエラーに当たったので解決方法を載せておきます。

今回のエラーはアプリをアーカイブし、その後Validate Appをした際に発生しました。

![スクリーンショット 2022-05-07 14.43.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552896/f68d4653-ec6b-9bb6-1d00-677813e4a9e4.png)


## 原因
今リリースしている（アーカイブした）バージョンよりも低いまたは同じ数値を設定しているために発生していると思われます。
例えば、バージョン1.1.0で公開しているものをバージョン1.0.1などでアーカイブしようとした場合です。

## 解決方法
メニューバーより＞Product>Archiveから今回リリースしたいアプリを選択し、バージョンを確認しましょう。
今回審査に提出したいバージョンが1.0と前回提出したバージョンより低い数値にになっています。
（（）ないのバージョンも前回より高くすると良いでしょう。）
![スクリーンショット 2022-05-07 14.44.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552896/38230051-09bd-30af-53e2-4105cbf05814.png)


プロジェクトフォルダからTARGETS>GeneralからVersionを設定しましょう。
![スクリーンショット 2022-05-07 14.49.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552896/9aa7be36-5327-50e7-73ee-7c30eab6a09a.png)
これでもう一度アーカイブしてValidateAppしてみると無事解決できました。
Route53でCAAレコードは設定してますか？？

## はじめに

Route53のCAAレコードって何？？という感じだったので調査した話です。

## CAAレコードとは？
>ドメイン名の登録者が、登録されたドメイン名に対応する証明書の発行を許可する認証局（Certification >Authority：CA）を指定するリソースレコードです。CAAは、Certification Authority Authorizationを意味します。ドメイン名登録者は、CAAリソースレコードを設定することで　
・証明書の誤発行を防止
・不正な証明書発行要求の検知
が期待できます。

引用：[CAAリソースレコード【JPRS用語辞典】](https://jprs.jp/glossary/index.php?ID=0218)

普段AWSのACMでしか証明書を作成したことがなく、認証局（CA）は意識してませんでしたが、
要するに、ドメインのCAAレコードでACM以外の認証局を設定している場合は、証明書の作成がエラーになるということです。
ちなみに、AWSのRoute53では、2017年からサポートが開始されたレコードです。

https://aws.amazon.com/jp/about-aws/whats-new/2017/08/amazon-route-53-now-supports-caa-records/

## 実際に試してみる
認証局をグローバルサインに限定するように、CAAレコードを設定してみました。
![Route_53_Console_Hosted_Zones.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/7fda37a5-aac7-aef9-56a8-6ebc345a00c5.png)
```
~> dig CAA [ドメイン名] +short
0 issue "globalsign.com"
~>
```
この設定で、ACMにて証明書を作成すると。。。
![AWS_Certificate_Manager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/140a4394-9d05-3290-b1c5-64e0ff108109.png)
ACMの認証局は認可されてないので証明書作成に失敗しました。
ステータスの詳細を見ると確かにCAAエラーになっています。
![AWS_Certificate_Manager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/ae3d3621-c4ab-1a1c-1c03-3949ee0a7151.png)
下記のようにACMの認証局を追加する、もしくはCAAレコードを削除することで解決できます。
![Route_53_Console_Hosted_Zones.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/ad6b8c65-61eb-2cd2-e14f-ea86306cb364.png)
```
~> dig CAA [ドメイン名] +short
0 issue "amazon.com"
0 issue "globalsign.com"
~>
```
証明書はエラーなく作成されます。
![AWS_Certificate_Manager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/ea70f2f1-09c4-b69f-a6e9-6165215063fb.png)


:::note info
認証局(CA)例
ACM "amazon.com"
Let's Encrypt　"letsencrypt.org"
グローバルサイン　"globalsign.com"
セコムトラストシステムズ　"secomtrust.net"
サイバートラスト　"cybertrust.ne.jp"
JPRS　"jprs.jp"
・
・
:::

証明書発行の流れは以下の図がわかりやすいので、JPRSから引用します。
図の③手順でCAAレコードが設定されていない場合は、そもそも発行制御がされていないと判断され、どの認証局からでも証明書を発行できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/1cecf06c-4098-78df-bd87-2c7136e5bfa5.png" width=70%>

参照元：[DNSを用いたサーバー証明書の発行制御_～CAAリソースレコードの概要と現状～](https://jprs.jp/related-info/guide/024.pdf)


## 最後に
CAAレコードは設定しなくても、それ自体がサービス影響のあるものではありませんが、証明書の発行制御の設定を行うことでセキュリティレベルが上がることがわかりました。
証明書作成の際にCAAエラーが発生した際は、証明書の発行制御が行われてるのでご注意ください。
正規表現

正規表現で使われる特殊文字

^文字 → 行頭の文字は何かを表す
$文字 → 行末の文字は何かを表す
. → 任意の1文字があることを表す
* → 直前の文字を0回以上繰り返すことを表す
[文字] →[]の中に入っている文字のどれかがあることを表す
[^文字] → []の中に入っている以外の文字を表す
¥ → 正規表現で使われている記号をふつうの文字として使う
() → 正規表現適用範囲のグループ化
※grepにおいて正規表現を使うには-Eオプションを付与します。

例：sample.txtの中身で最初の文字がaかbの行を探したいとき
```
grep ^[ab] sample.txt
```

例：カレントディレクトリにあるmainという名前のgoとjavaのファイルを探したいとき
```
ls | grep -E '^main\.[(go$)(java$)]'
```
VirtualBoxをWindowsで使う場合Hyper-Vを止める。

最近VirtualBox内のDebianがカーネルパニックになって起動しなくなった。結局のところHyper-Vが原因だったのが、なにかの拍子にHyper-Vが有効になってしまったようだ。この記事では、起動しなくなった事象の紹介とHyper-Vのオフの仕方を紹介する。

## カーネルパニック
カーネルパニックとはOSが致命的なエラーで停止してしまう状況の一つだ。Linuxは最後の力を振り絞り状況を記録に残そうとする。この記事ではこれらの記録の分析方法については深入りしない。

- 既存環境（Debian11)
GRUBから起動シーケンスが動作するものの起動できずにカーネルパニックになってしまった。この環境は3か月前までは起動していたし、それまでPCの調子が悪かったこともない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171932/d495eea3-fc36-6338-35df-6fedec60afd5.png)

- 新規インストール（Debian11)
インストールは進むが、Installing the base systemで停止してしまう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171932/bcc561a5-e97e-10df-6a96-479bc2321dbb.png)

ALT-F4でVirtural console 4を表示する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171932/d9b441cd-ce0e-1150-1ce2-6b1d25657542.png)

Hash Sum mismatchとあるので、インストーラやメディアを当初疑ったが関係がなかった。

## Hyper-Vを制御する
事象の改善にはHyper-Vをオフにすればいいのだが、オンにする方法ともに現在の状況を確認する方法も紹介する。
- Powershellを起動する
Cortanaの検索ボックスにpowershellと入力し、一番上のWindows PowerShellを管理者として実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171932/b3ae0cc1-2db2-d9db-3dd7-7c19d5f00065.png)

- コマンドを入力と再起動
プロンプトが出てきたら、つぎのコマンドを入力する。

**Hyper-Vをオフにするコマンド**
```bcdedit /set hypervisorlaunchtype off ```

次のように表示できれば成功しているので、PCを再起動する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171932/7c3b5d68-ea11-5565-1459-7b8506d2e9db.png)


再度Hyper-Vをオンにするコマンドと確認するコマンドは以下の通り。

**Hyper-Vをオンにするコマンド**
(設定値はonではなくautoになることに注意)
```bcdedit /set hypervisorlaunchtype auto ```


**Hyper-Vを確認するコマンド**
```bcdedit ```

次の起動時の設定が一覧で表示される。Hyper-Vについては最下行のhypervisorlaunchtypeにある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171932/d52d9d4b-9f9a-b40d-103e-f07d719d734e.png)


## 動作確認

無事起動するようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171932/1cf8a2ba-3a70-466b-b467-d7f799a4a826.png)

画面は省略するが、Debianのインストールも最後まで進めることができた。

同様の現象に悩まされている人の参考になればと思います。