OmniAICreator/Qiita-1.07M huggingface dataset:
ICONIXについての本を読んだのでまとめてみた

注）これは、自分なりの理解です。

# ICONIXとは（ざっくりとした説明）
設計手法。
詳細なユースケースを記述することで、設計を駆動する。
ロバストネス分析を行うことでユースケースの具体化が可能になる。
オブジェクト指向的でドメイン駆動的な設計が可能になる。
予め詳細な設計を行うことで実装段階での予期せぬ考慮漏れが減り、手戻りが減る。
またより正確な工数の見積もりが可能になる。

# ICONIXプロセス
## ドメインモデル作成
ある程度要件がまとまった段階で、ユースケースを書く前に、ドメイン分析を行う。
ドメイン分析を行わずにユースケースを書いてしまうと、曖昧な表現を許してしまう。
ここでは単に各ドメインオブジェクトの関連を描くだけに留めておき、
多重度や属性などは考えない。
Has関係かIs関係でほとんど全ての関係性が表現できる。

Has関係
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1726071/ee076a05-cb31-21ea-bbd1-e5312f2671c0.png)
Is関係
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1726071/465cdf97-416b-6fa2-8c96-c1edba1c6bdf.png)

## ユースケース記述
ドメイン分析で洗い出されたオブジェクトの名詞を用いて、ユースケースを記述する。
指示的な表現にならないように注意。（「〜であること」のように）
ユーザとシステムの「対話」で構成する。（「ユーザが〜する。システムは〜する。」のように）
この段階で新たにドメインオブジェクトが見つかった場合は、ドメインモデル図を更新する。
文章だが、あとでロバストネス図やシーケンス図などを描く際に簡単に参照できるように、UMLのノート形式で描いておく。
それぞれのユースケースについて、基本コース（正常系）だけでなく代替コース（異常系）も記載する。

## ロバストネス図作成
ユースケース記述から、ロバストネス図を描き起こす。
バウンダリオブジェクト・コントローラ（MVCのコントローラーとは違うので注意）・エンティティと外部のアクターで構成する。
WEBアプリならバウンダリオブジェクトはビューやコントローラ、コントローラはインターフェースメソッド、エンティティはモデルに相当する。
したがってバウンダリオブジェクトやエンティティは直接それらと繋がってはならず、
必ずコントローラを介して繋げるというルールになっている。
基本コースと代替コースのどちらについても描画する。
（代替コースは色分けすると見やすくなる。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1726071/83168c8f-7f0b-c94f-68d5-d9f69147c558.png)
作成の過程で新たにエンティティオブジェクトが見つかった場合はドメインモデル図に追加する。
またユースケース記述に曖昧な箇所があった場合は更新する。
またこのタイミングでできる限りドメインに属性を割り当て、ドメインモデル図からクラス図へ昇格させる。

## アーキテクチャ設計
シーケンス図を描くにあたって、先にアーキテクチャを決定する必要がある。

## クラス図・シーケンス図作成
この段階ではシーケンス図を作成するのがメインの作業になる。
それは、クラスに振る舞いを割り当てる作業になり、クラス図におけるメソッドの割当も同時に行われる。
属性があるところに振る舞いを割り当てるように心がける。
可能な限り「プレファクタリング」し、実装時に「リファクタリング」をしなくても済むようにする。
具体的には、ロバストネス図からアクター・バウンダリオブジェクト・エンティティを抜き出し、まず空白のページに貼り付ける。
次にコントローラをバウンダリオブジェクトやエンティティを繋ぐメッセージとして配置する。

## テストコード作成
コントローラ単位で作成する。
（ICONIXでは1コントローラごとに1クラスを推奨している）
モックを使いすぎないように注意する。
個人的に思ったこととしては、repositoryなど依存関係を逆転する必要があるようなクラスだけモックを使う方針に
すればいいんじゃないかと思った（ていうかじゃないと静的型付けの場合はそもそもモックを使えないような）

## 実装
上記のプロセスでじっくりと設計を行えば、実装はそれをコードで表現するだけの単純作業になる。
ある意味で実装は一種の設計レビューとも言える。

# 参考文献
https://www.amazon.co.jp/gp/product/B01B5MX2TC/ref=ppx_yo_dt_b_d_asin_title_o01?ie=UTF8&psc=1
AWSでEC2起動しようとすると「You have requested more vCPU capacity than your current vCPU limit of ～」と出る

EC2でGPUインスタンスを起動しようとしたりすると、下記のようなメッセージが表示されて起動に失敗します。

```aws
You have requested more vCPU capacity than your current vCPU limit of 0 
allows for the instance bucket that the specified instance type belongs to. 
Please visit http://aws.amazon.com/contact-us/ec2-request to request an 
adjustment to this limit.
```

vCPUの制限に引っかかっているので、 http://aws.amazon.com/contact-us/ec2-request を訪れて制限を解除するように言われます。

素直に従ってそのページに行くと、「インスタンス上限」というパラメータの変更依頼ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103491/7de56b3a-5828-b6ea-f7a3-9aa684a256d9.png)

これは「インスタンス上限」ではなく、「vCPU」の制限解除依頼らしいです。
なのでここに値を入力して下の説明欄に説明を書いてしばらく待てばvCPU数が増えます。
G検定受験記録。こんな感じで受かりました。

# 背景
22年度、会社で AI 技術者を養成しようって流れがありました。
若手向けって話だったけど、手を挙げてみたら OK 貰えたんで、まずは G 検定を受けた際の記録

# 合格証

https://www.openbadge-global.com/api/v1.0/openBadge/v2/Wallet/Public/GetAssertionShare/TjVIVTV0OFcvQnVKdEdOaXlwYklqdz09

# 試験日と会社の支援
- 2022/7/2 受験日　→　合格発表 7/16 メール受信
- [Cousera の AI for everyone](https://www.coursera.org/learn/ai-for-everyone-ja) 受講
    - てっきりこれだけで受かるのかと思ってたら、そうではなかった :laughing: 
    - AI プロジェクトを進める上での大切なことを学習出来ます。以下はコース説明
> - ニューラルネットワーク、機械学習、ディープラーニング、データサイエンスなど、⼀般的なAIに関する専⾨⽤語とその意味
> - 実際にAIができること、できないこと
> - 組織の課題解決のためにAIを適⽤できる可能性とその⽅法
> - 機械学習およびデータサイエンスプロジェクトの進め⽅
> - AIエンジニアチームと連携して社内でAI戦略を構築する⽅法
> - AIを取り巻く倫理的および社会的議論の概要

- [JDLA 推薦図書である　G 検定　公式テキスト](https://www.jdla.org/recommendedbook/) 支給<br>この本を読んで全部理解＆記憶してれば受かる筈？<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/53e8f02a-fff3-9462-7eff-35d2d511771a.png)


# 実際にやったこと
## 費やした時間と概要
６月に入ってから二週間程度で推薦図書を６章まで読破。
当初は、読みながら markdown でノート作り。日々１－２時間程度
７章を読まずに放置したら、試験に結構出て、検索＆回答で時間費やしてしまったので、７章も読むべきだったと後悔

本読むのに飽きたこともあり・・６月半ばからは仮想問題を解く事に
で「G検定チートシート」なるものを見つけ、なるほど、と思い、markdown で作ってたノートを Qiita 限定記事を利用した個人用チートシート作成へ舵を切る
毎日一時間強で50-70問程度を解いて、振り返り⇒チートシート更新って流れ
残り三日前？になって Dive into Exam の問題を見つけた
ということで、本番さながらに二時間かけ、チートシートも使って模擬試験実施し、90% 程度正解したのでちょっと安心
残りの時間は Dive into Exam の問題での間違えた内容でチートシートへ更新しつつ本番を迎えました

## 無料の仮想問題
- [Study AI さんの無料ベータ版](https://study-ai.com/generalist/) <br> これで約300問ぐらいを体験可能
- [Dive into Exam さんの無償模擬試験](https://diver.diveintocode.jp/dive_into_exam/3)<br> ここでも本番形式で実施可能

## チートシート作成
- Qiita の限定記事で作成
    - ブラウザの検索機能を利用：本番問題からのコピーは出来ないので、入力速度は重要 = タッチタイピング
    - ブラウザ閲覧チートシートなので、Edge でのサイドバー検索で、追加検索も簡単に (CTRL + SHIFT + E)
    - 画像も簡単に添付できるので、理解の助けにもなる
- 作成の基本
    - 本を読んで理解したことを章立てでまとめ。
        - 例）混同行列を図と共にまとめておくことで、正解率・再現率・適合率が混乱しなくなる
    - 仮想問題で間違った内容と、関連事象を、記録
    - 仮想問題で理解に自信が無かった事を、調べて関連図にして記録
    - 仮想問題で出てきた知らない単語を、関連用語との樹形図的に記録

# 本番を受けた感想
基本は以下の繰り返し・・
1. 順調に回答
1. 時間に余裕有
1. 正解率をあげる為にチートシート確認増加
1. 時間消費
1. やべーってなって、1．に戻る

残り30問で20分切ってて、やべーってなり、検索をほぼせず残りを回答し、最後10分で未回答＆チェックしておいた問題の再確認をしていたら120分経過で自動終了。

まとめると、
- 常に時間を意識しつつ、検索比重を自己調整
    - 30問強/20分、100問/60分、みたいな目安を意識しつつ
- 常に進んでる状態で行い、最後に必ず5分は残す。自分の場合は、未回答問題もありました :sweat: 
- 本番問題からのコピーは不可能なので、タッチタイピング苦手な人は訓練しておくのも吉
- モニターを二画面用意すると、問題画面を見ながら検索キーワードを入力できて便利
- 試験前には必ずログイン確認をしておくこと
    - 自分の場合、メールアドレスの大文字小文字違いで最初ログイン出来ずに焦りました。
    - 同僚は・・まさかのパスワードロックで受験出来なかったそうです

# あとがき
無事受かってよかった。
次は E資格・・・受かる気がしないけど :laughing:
CakePHPでリレーション 先のテーブルの条件検索

matchingを使う。

matchingの使い方。

```
$user_id = $this->request->user_id;


$query = $users->find()
    ->matching('relation', function ($q) use ($user_id) { //　useで定義した変数が使えるようになる。
                return $q
                ->where(['
                  relation.user_id => $user_id,
                  relation.created_at => '2022-07-15'
             })
    ->limit(10)->offset($offset);
```
RaspberryPiOSの動くDockerコンテナにgitサーバーを構築する

# やりたいこと

Dockerコンテナにgitサーバーを構築する。

まずは、RaspberryPiOSイメージを作る。

https://qiita.com/ryot0/items/3b40a0e5f227d97b7d3b

# 手順

### 1.構築用のコンテナを作る

```shell
docker create --name sshgitbuild01 -it raspios:0.0.1 /bin/bash
docker start sshgitbuild01
docker exec -it sshgitbuild01 /bin/bash
```


### 2.コンテナに入ってgit用のディレクトリを作る

```shell
mkdir /data
mkdir /data/app
```


### 3.コンテナに入ってgitをインストールする

```shell
apt update
apt install git
```


### 4.コンテナに入ってsshdが動くように設定

```shell
ssh-keygen -A
mkdir /run/sshd
chmod 755 /run/sshd
```

以下のファイルの行を修正
```text:/etc/ssh/sshd_config
Port 2222
```


### 5.ホスト側でgit用のディレクトリを作成

```shell
sudo mkdir /data/app/main/git
sudo chown pi /data/app/main/git
sudo chgrp pi /data/app/main/git
sudo mkdir /data/app/main/git/root
sudo chgrp users /data/app/main/git/root
sudo chmod 775 /data/app/main/git/root
```


### 6.ホスト側でホーム用ディレクトリを作成

```shell
mkdir /data/app/main/git/root/home
chown pi /data/app/main/git/root/home
chgrp pi /data/app/main/git/root/home
chmod 755 /data/app/main/git/root/home
```

※正しい権限でhomeを作ってあげないと、sshの公開鍵が認識されない。


### 7.コンテナに入って、公開鍵をホスト側で管理できるようにするためにコンテナ側のホームディレクトリを/data/app/root/homeにする

```shell
cp ~/* /data/app/root/home
sudo usermod pi -d /data/app/root/home
```


### 8.一旦コンテナを停止してimageとして保存

```shell
docker stop sshgitbuild01
docker commit sshgitbuild01 raspios_sshgit:0.0.1
```


### 9.上で作ったimageを起動

```shell
docker create --name sshgitcont01 -t -v /data/app/main/git:/data/app -p 2222:2222 \
    -e LANG=C.UTF-8 \
    -e TZ=Asia/Tokyo \
raspios_sshgit:0.0.1 /usr/sbin/sshd -D -e
```

※-Dオプションはデーモン化しない
※-eオプションはログを標準出力に出す


### 10.公開鍵を/data/app/root/home/.ssh/authorized_keysに保存する

```shell
ssh pi@192.178.10.220 -p 2222
mkdir ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
echo [公開鍵] >> ~/.ssh/authorized_keys
```

※正しい権限でディレクトリ／ファイルを作ってあげないとsshに認識されない。


### 11.再起動ポリシーを設定する

https://qiita.com/ryot0/items/41f1cc2907b375298328


### 12.gitリポジトリの作成

```shell
mkdir /data/app/root/repos
sudo chown root /data/app/root/repos
sudo chgrp users /data/app/root/repos
sudo chmod 775 /data/app/root/repos
mkdir /data/app/root/repos/playground.git
cd /data/app/root/repos/playground.git
git int --bare 
```
python 初心者向け　簡単にwebの画像をダウンロードするモジュール -urllib.request-

<H1>URL指定で画像をダウンロード</H1>

```python
import urllib.request

url = "https.画像URL.png"
savename = "test.png"

urllib.request.urlretrieve(url,savename)
print("保存しました")

```
【PHP初級㉛】for文応用3

[問題]　　　(参照：http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksPrimary.html)
整数値を入力させ、その個数だけ*を、5個おきに空白（スペース）を入れて表示するプログラムを作成せよ。入力値が0以下の値の場合は何も書かなくてよい。



# コード
```php
$a = intval(fgets(STDIN));
for($m = 1; $m <= $a; $m++){
    echo '*';
    if($m%5 == 0){
        echo ' ';
    }
}
```

↓「12」と入力

# 結果
```
***** ***** **
```
イテレータを一定個数ごとに分割する

## 目的

イテレータから値を取り出して順次処理する際に、一定個数ごとにバッチ的な処理を行うこと。

## 方法

表題の通り、元のイテレータを一定個数ごとのイテレータに分割する。
ただし、メモリ上に複数の値を保持しない方法で実装する。

タプルで例えるなら以下。
```python
# 元のイテレータ
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

# n個ごとのイテレータに分割し、それをラップしてイテレートする (以下はn=4の場合)
((0, 1, 2, 3), (4, 5, 6, 7), (8, 9))

```

## コード

```iter.py
"""イテレータから特定個数ずつに分けたイテレータをイテレートするサンプル."""

from typing import Iterator, TypeVar

T = TypeVar("T")


def iterate_iter(iter: Iterator[T], iter_size: int) -> Iterator[Iterator[T]]:
    """イテレータから特定個数ずつに分けたイテレータをイテレートする."""
    if iter_size < 1:
        raise ValueError("iter_size must be 1 or greater.")

    def inner(init: T) -> Iterator[T]:
        yield init
        for _, v in zip(range(iter_size - 1), iter):
            yield v

    while True:
        try:
            init = next(iter)
        except StopIteration:
            break
        yield inner(init)

```

## 使用例

```main.py
"""使用例."""

from iter import iterate_iter

if __name__ == "__main__":

    iters = iterate_iter((f"No.{i}" for i in range(10)), 4)

    for i, iter in enumerate(iters):
        print(f"inner iterator_{i} start.")
        for value in iter:
            print(value)

```

```terminal
$ python main.py 
inner iterator_0 start.
No.0
No.1
No.2
No.3
inner iterator_1 start.
No.4
No.5
No.6
No.7
inner iterator_2 start.
No.8
No.9
```
ps4コントローラーをros melodicで使用する

以下のps4コントローラーを使用する

> [ワイヤレスコントローラー(DUALSHOCK 4)](https://www.playstation.com/ja-jp/accessories/dualshock-4-wireless-controller/)

基本的には以下手順を参考にさせていただいた

> [ROS講座07 joyプログラム](https://qiita.com/srs/items/9114bb3c27a148e0b855)

# インストール

```
sudo apt-get install ros-melodic-joy
sudo apt-get install ros-melodic-joystick-drivers
sudo pip install ds4drv
```

# 優先で接続

PS4コントローラーを優先で接続するには、マイクロusbで直接pcとコントローラーを接続する。
（正しく接続するとpd4側のledが光り、`/dev/input/js0`デバイスが生えている。マイクロusbによっては繋がらないものがあるみたいなので注意）

別々のターミナルで実行する

```
roscore
```

```
rosrun joy joy_node
```

```
rostopic echo /joy
```

joyトピックが流れていたらとりあえず接続OK

# 無線で接続

マイクロUSBで接続しているPS4コントローラーを外して、以下を実行する

```
$ sudo ds4drv
[info][controller 1] Created devices /dev/input/js0 (joystick) /dev/input/event17 (evdev) 
[info][bluetooth] Scanning for devices
```

PS4側の「PS」「SHARE」の２つのボタンを押下し続けると、光が点滅して以下`Found device`ログが現れればOK
これで有線接続時と同様に、`/dev/input/js0`からコントローラーの入力を取得できる。

```
$ sudo ds4drv
[info][controller 1] Created devices /dev/input/js0 (joystick) /dev/input/event17 (evdev) 
[info][bluetooth] Scanning for devices
[info][bluetooth] Found device A4:53:85:49:05:B0
```

確認は、有線接続時と同じ手順で以下を実行する

```
roscore
```

```
rosrun joy joy_node
```

```
rostopic echo /joy
```

joyトピックが流れていたらとりあえず接続OK

# 備考

```
[error][bluetooth] Unable to connect to detected device: Failed to set operational mode: [Errno 107] Transport endpoint is not connected
```

調子が悪くて切断されたみたいだったので、PS4側の「PS」「SHARE」の２つのボタンを押下し続けると接続できた

```
[info][controller 1] Battery: 0%
[info][controller 1] Disconnected
```

コントローラ側のバッテリーがないので充電して下さい

# 参考
[ROS講座07 joyプログラム](https://qiita.com/srs/items/9114bb3c27a148e0b855)
.htaccessの設定について

業務内で.htaccessを作成することがあり、備忘録として残します。

# .htaccessとは
.htaccessファイル (「分散設定ファイル」)はディレクトリ毎に設定を変更する方法を提供します。ディレクティブの書かれたファイルをディレクトリに置くことで、そのディレクトリとそのサブディレクトリすべてにディレクティブを適用させることができます。
（https://httpd.apache.org/docs/2.4/ja/howto/htaccess.html より引用）

要約するとディレクトリを設定するファイルということですかね…。
さくらのレンタルサーバーのコンソールなどからBasic認証をかけた後、サーバーのディレクトリを確認するとこのファイルが生成されていると思います。
ApacheなどいくつかのWebサーバーに対応しています。レンタルサーバーによって、設置できない場合もあるようなので、使用するレンタルサーバー毎に確認が必要。

# ちなみにApacheとは
Webサーバーソフトのこと。
世界的に使用されている著名なWebサーバーソフトのうちの1つで、他だとMicrosoft社のIISやnignxがある。

# .htaccessを使う時
・リダイレクト
・BASIC認証
・IPアドレス制限
などを行いたい時。（他にもできることはたくさんあります）

# 今回行いたいこと：URLの正規化

```
http://www.sample.co.jp
http://sample.co.jp
https://sample.co.jp
```
この3つのURLは別のURLとして認識されるものの、実際に表示される内容は同じです。
そのため、
```
https://www.sample.co.jp
```
にURLを統一したいと思います。

# 最初のエラー


書いていたコード
```
RewriteEngine on
RewriteCond %{HTTP_HOST} ^sample\.co\.jp$
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://www.sample.co.jp/$1 [R=301,L]
```
上記でテストしたところ、TOPはSSL転送とwwwへの正規化が行えたのですが、下層ページで動作していませんでした。

# 次のエラー

```
RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^sample\.co\.jp$ [OR]
RewriteRule ^(.*)$ https://www.sample.co.jp/$1 [R=301,L]
```

[OR]の書き方が間違ってる例。

# [OR]の位置を修正 

```
RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^sample\.co\.jp$
RewriteRule ^(.*)$ https://www.sample/$1 [R=301,L]
```
上記で下層ページにも正しく反映される状態になりました！


サーバーによっても変わってくると思いますので、使用しているサーバーではどのように設定できるかを確認したほうが良いかもしれないです。

もし誤っている内容などあればご指摘いただけると大変うれしいです…！

# 参考にした記事・URL
https://httpd.apache.org/docs/2.4/ja/howto/htaccess.html
https://qiita.com/sanogemaru/items/7e5bd6e8dc9b04c9978e
https://murashun.jp/article/programming/htaccess/htaccess-sample_code.html#chapter-3
【TypeScript】typeof, keyofとその併用について

開発中のアプリで使用していて、型を安全に使用する点で非常に便利だと思ったので簡単にまとめました。

# typeof

typeofは**値を型に変換する**もので、**変数**に対して使用されます。

```ts
const evaluation = {
 good: 'Good',
 bad: 'Bad'
} as const;

const ngCase1: typeof evaluation = 'test'; // NG
// Type 'string' is not assignable to type '{ readonly good: "Good"; readonly bad: "Bad"; }'
const ngCase2: typeof evaluation = { good: 'Good' }; // NG
// Property 'bad' is missing in type '{ good: "Good"; }' but required in type '{ readonly good: "Good"; readonly bad: "Bad"; }'.

const okCase: typeof evaluation = { good: 'Good', bad: 'Bad' }; // OK
```

# keyof

keyofは**オブジェクト型のプロパティ名を取得**するもので、**型**に対して使用されます。

```ts
type evaluation = {
 good: string,
 bad: string
}

const ngCase1: keyof evaluaton = 'test'; // NG
// Type '"test"' is not assignable to type 'keyof evaluaton'.
const ngCase2: keyof evaluaton = {
 good: 'Good',
 bad: 'Bad'
}; //NG
// Type '{ good: string; bad: string; }' is not assignable to type 'keyof evaluaton'.

const okCase1: keyof evaluaton = 'good'; // OK
const okCase2: keyof evaluation = 'bad'; // OK
```

# typeof と keyof の併用

下記のように使用すると、あるオブジェクトのプロパティ名の文字しか代入できなくなり、安全な代入が可能となります。

```ts
const evaluation = {
 good: 'Good',
 bad: 'Bad'
} as const;

const okCase1: keyof typeof evaluation = 'good'; // OK
const okCase2: keyof typeof evaluation = 'bad'; // OK

const ngCase1: keyof typeof evaluation = 'Good'; // NG
// Type '"Good"' is not assignable to type '"good" | "bad"'. Did you mean '"good"'?

```

また、次のように使用することでオブジェクトのプロパティに設定されている値しか代入ができなくなります。

```ts
const evaluation = {
 good: 'Good',
 bad: 'Bad'
} as const;

const okCase1: typeof evaluation[keyof typeof evaluation] = 'Good'; // OK
const okCase2: typeof evaluation[keyof typeof evaluation] = 'Bad'; // OK

const ngCase1: typeof evaluation[keyof typeof evaluation] = 'bad'; // NG
// Type '"bad"' is not assignable to type '"Good" | "Bad"'. Did you mean '"Bad"'?
```

# 終わりに

これ以外にも新しいオブジェクトの型を生成する時などにも使えそうで、型安全を意識する上で非常に便利なので良かったら使ってみてください。

最後まで読んでくださりありがとうございました。
Powershell の使い方

最近、Windows で仕事をするのだけれど、いつものUbuntu Bash のような環境がなく、仕方なくpowershell を使うことがあります。何度も同じことを調べているので、メモをしておきます。


### 環境変数

何か変数尾見るとき。例えば PATH を

```
PS > $env:PATH
```

設定する。

```
PS $env:PYTHONPATH=pwd
```

### スクリプトを実行する

一度だけ、管理者権限で以下のコマンドを実行する。

```
PS > PowerShell Set-ExecutionPolicy RemoteSigned
```

### Python 仮想環境

virtualenv で生成されるスクリプトで *.psl というファイルがスクリプトらしく、それを実行すれば仮想環境に入れた。

```
PS > venv\Scripts\activate.ps1
```

以下を参考にしました。

https://qiita.com/teruto725/items/49b56c778c345170c157

# まとめ

とりあえず書いてみた。他にも出てきたら書こう。
(2022/07/15)
デザイン思考とは何ですか？

![EEC02338-4CFF-4CB3-BA86-DF9F7C023510.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406339/f049bb1a-8800-f6df-2628-98d405a4bee6.png)


https://learning.oreilly.com/library/view/what-is-design/9781491998786/

## この本を読んだ理由
- ビジネス系の本を読んでいるとちょくちょく「デザイン思考」というワードが目についたのですが、「アジャイルっぽいけどなんか違うなぁ」という印象で気になっていたからです
- あと、薄い本(書籍だと約20ページ程度)で読みやすそうだったというのもありま

## 読んだ感想
- デザイン思考を一言でいうと「顧客からニーズを引き出しプロトタイプとフィードバックで顧客満足度を改善するというユーザー中心設計のための取り組み」といったところでしょうか
- アジャイルなどと被る点は多いなぁと思いました
    - リーン／アジャイル／デザイン思考の違いは[この記事](https://blog.btrax.com/jp/validation-process/)がわかりやすかったです
        - 顧客のニーズを拾うという点を重視し、採算性やスケジュール管理の観点は優先度低めといった感じでしょうか
- 「どうやってプロトタイプを作るのか？」や「効果測定はどうするのか？」など、方法論があまり定まっていない箇所が多い印象を受けました
    - 本文中でリーンを組み合わせるなどの対策案は提示されていました

## 内容
### デザイン思考の基本
- 考え方
    - 共感
    - コラボレーション
    - アイデアをつぶさない
    - やって考える
    - イテレーション
    - 拡大と縮小を繰り返す
    - 複雑な状況を受け入れ解きほぐす
- 進め方
    - 以下の4ステップを繰り返す
    1. 観察(Needfinding)
        - 外に出て、ユーザーを観察してインタビューすることにより、何が起こっているのかを理解
    1. 洞察
        - 得た情報を基にブレインストーミングの種となる「どうすれば…」という質問を作成
        - [ジャーニーマッピング](https://u-site.jp/alertbox/journey-mapping-101)や[アフィニティ図](https://asana.com/ja/resources/affinity-diagram)を使うのがおすすめ
    1. コンセプト
        - ブレストでアイデアを出す
        - 出たアイデアから投票によりアイデアを絞りこむ
    1. プロトタイプ
        - プロトタイプを作成する
        - ユーザーテスト等を行いフィードバックを得る
        - 1. に戻る
- デザイン思考による改善効果の測定方法
    - 難しい😑
        - バタフライ効果のようにじわじわ影響が広がる感じ
### デザイン思考の始め方
- デザイン思考はサッカー⚽のようなもの。練習が必要
- チームに適用してみる
    - コーチングを適用し継続的に改善
    - ツールではなく文化を重視する
    - 小さく始めてじわじわ大きくする
        - サイクルは1ループ1週未満から始める
    - 実装の仕方が定まらずに頓挫することが多い。リーンなどの手法を組み合わせて確実に実装する
    - 心理的安全性を確保する
        - 失敗しても責められないことが重要
- その他
    - 何でもかんでもデザイン思考を適用するのは間違い
【JavaScript】タブメニューの作成

# 開発環境
Rails 6.1.4
ruby 2.6.3

# 目次
- 目標
- HTMLとCSSファイルの作成
- jQueryの設定

## 目標

下記のようなタブメニューを作成します。
タブは選択すると白くなるよう設定します。

![Tabbar-Lesson-Completion-img-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730324/ac770bb1-b687-7fc0-fdf3-d59cd33062e1.png)

## HTMLとCSSファイルの作成

まず、HTMLファイルとCSSファイルを作成します。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="stylesheet" href="style.css" />
  </head>
  <body>
  
    <div class="wrap">
      <ul id="tab-menu">
        <li><a href="#tab1" class="active">TAB1</a></li>
        <li><a href="#tab2" class="">TAB2</a></li>
        <li><a href="#tab3" class="">TAB3</a></li>
        <li><a href="#tab4" class="">TAB4</a></li>
      </ul>

      <div id="tab-contents">
        <div id="tab1" class="tab">
          <p>テキストが入ります。</p>
        </div>

        <div id="tab2" class="tab">
          <p>テキストが入ります。テキストが入ります。</p>
        </div>

        <div id="tab3" class="tab">
          <p>テキストが入ります。テキストが入ります。テキストが入ります。</p>
        </div>

        <div id="tab4" class="tab">
          <p>テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。</p>
        </div>
      </div>
    </div>
    <script src="js/jquery.min.js"></script>
    <script src="js/script.js"></script>
  </body>
</html>
```    

次に、CSSファイルを作成します。


```css:style.css
@charset "UTF-8";

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

h1 {
  text-align: center;
  margin: 50px 0;
}

.wrap {
  width: 90%;
  max-width: 800px;
  margin: 0 auto;
}

#tab-menu {
  display: flex;
}

#tab-menu li {
  list-style-type: none;
  width: 25%;
}

#tab-menu li a {
  color: #fff;
  text-decoration: none;
  display: block;
  padding: 20px;
  text-align: center;
  background: #000;
  border: 1px solid #000;
  border-bottom: none;
}

#tab-menu .active {
  background: #fff;
  color: #000;
}

#tab-contents {
  display: flex;
  flex-wrap: wrap;
}

#tab-contents .tab {
  width: 100%;
  padding: 30px;
  background: #fff;
  border: 1px solid #000;
  border-top: none;
}

#tab-contents p {
  color: #000;
  line-height: 2.5;
}
``` 

ここまで作成するとほぼタブはできているのですが、
HTMLとCSSだけでは4つのタブごとに表示したいコンテンツが
すべてTAB1に縦に並んで表示されてしまいます。

ここでjQueryを使って、クリックされたタブのコンテンツだけが
表示されるように設定していきましょう。

## jQueryの設定

jsフォルダを作成し、その中にscript.jsを作成します。
script.jsファイルに、以下のように記述します。

```js:js/script.js
$('#tab-contents .tab[id != "tab1"]').hide();

$('#tab-menu a').on('click', function(event) {
  $("#tab-contents .tab").hide();
  $("#tab-menu .active").removeClass("active");
  $(this).addClass("active");
  $($(this).attr("href")).show();
  event.preventDefault();
});
``` 

これで完成です！お疲れ様でした！
あくまで備忘録なので足りない説明等多々あるかと思います。
行き詰まった際の助けになれば幸いです。
【PowerShell】簡易ポートスキャナを作ってみた

# はじめに

業務で久々にPowerShellに触れることになったので、何か簡単なものを作ってみようと考えて、簡易的なポートスキャン用ツール（ポートスキャナ）を作ってみました。
※あくまでも学習用なので、「nmapを使わないのか？」というツッコミは無しで...

ベースとなるコマンドは、[こちらの記事](https://qiita.com/foxtail1979/items/1b017986a052bee1e0dc)に掲載されているものですが、これに少し味付けをしてWell-knownポートを一通り調査できるスクリプトにしてみました。

# コード

* 以下のコードでは1～1023番までのWell-knownポートを順番に調べていますが、`Test-NetConnection`は1つのポート番号あたり2秒程度かかるので、1023番ポートの処理が終わるまでにかなりの時間がかかります。
  * 調べたいポートが決まっているのであれば、そのポート番号だけを抜き出して配列にしておく方が良いかもしれません。
* 実行結果は、通信可能なポートが`True`で、通信不可能なポートが`False`と表示されます。
* `Test-NetConnection`を実行する度に警告が表示されるため、[こちらのページ](https://tech.guitarrapc.com/entry/2014/01/17/073338#7-Write-Warning-Cmdlet-%E3%81%A7%E8%AD%A6%E5%91%8A%E3%82%92%E3%83%9B%E3%82%B9%E3%83%88%E7%94%BB%E9%9D%A2%E3%81%B8%E3%81%AE%E3%81%BF%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B)を参考にして警告表示を一時的に停止させました。
* 一度定数を指定すると、スクリプトを繰り返し実行した時に「定数の上書きによるエラー」が発生してしまうため、[こちらのページ](https://teratail.com/questions/244975)の方法で「定数が設定されていない事を確認した上で定数を設定する」という処理にしました。

```powershell:portscan.ps1
# 「警告: TCP connect to (192.168.10.240 : 23) failed」などの警告を非表示にする。
$WarningPreference  = "silentlycontinue"

# 調査対象のIPアドレスを定数にセット
if ([System.String]::IsNullOrEmpty($IP_ADDR) -eq $TRUE) {
    Set-Variable -name IP_ADDR -value "192.168.10.240" -option Constant
}

# well-knownポートのスキャン
# ※Test-NetConnectionコマンドでは0番ポートはエラーとなるため、1番ポートからスキャンしている。
for ($i=1; $i -lt 1023; $i++){
    # -InformationLevel Quietオプションを指定して、通信結果をTrue/Falseで取得する。
    $result = Test-NetConnection -ComputerName $IP_ADDR -Port $i -InformationLevel Quiet
    Write-Host "$($i)番ポート：$($result)"
}

# 警告設定を元に戻す。
$WarningPreference  = "continue"
```

```text:実行結果
1番ポート：False
2番ポート：False
3番ポート：False
...
21番ポート：False
22番ポート：True
23番ポート：False
...
79番ポート：False
80番ポート：True
81番ポート：False
...
```


# 参考URL

* [PowerShellでポート状態確認](https://qiita.com/foxtail1979/items/1b017986a052bee1e0dc)
* [7. Write-Warning Cmdlet で警告をホスト画面へのみ出力する - PowerShell での文字列出力について考える](https://tech.guitarrapc.com/entry/2014/01/17/073338#7-Write-Warning-Cmdlet-%E3%81%A7%E8%AD%A6%E5%91%8A%E3%82%92%E3%83%9B%E3%82%B9%E3%83%88%E7%94%BB%E9%9D%A2%E3%81%B8%E3%81%AE%E3%81%BF%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B)
* [PowerShell実行時に定数の上書きエラーが発生する](https://teratail.com/questions/244975)
poetryで誤ったバージョンの仮想環境が作られる問題について

poetryで仮想環境を作成したはずの場所でpyproject.tomlで設定したpythonのバージョンが使われない問題があります。

```toml:pyproject.toml
[tool.poetry]
name = "test"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]

[tool.poetry.dependencies]
python = "3.8.2"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
```

```shell: shell
$ poetry -V
Poetry version 1.1.14

$ asdf local python 3.8.2 # pyenv local 3.8.2でも同じ
$ python -V
Python 3.8.2

$ poetry install
$ poetry run python -V
Python 3.10.5 #<- 3.8.2になっていない!
```

# 解決方法
poetryのissuesに解決方法が上がっていました。

https://github.com/python-poetry/poetry/issues/4101

## ① Poetryをversion 1.2にする
- poetryをβ版(version 1.2.0)にアップデート
- `virtualenvs.prefer-active-python = true`にする
```shell
poetry self update --preview && \
poetry config virtualenvs.prefer-active-python true
```
### 注意点
`poetry self update`をすると元のversion(1.1)に戻ってしまう

## ② .venvを手動で作成する
- 対象のディレクトリ(pyproject.tomlのあるディレクトリ)に移動
- 既に存在する場合、.venvとpoetry.lockを削除
    - poetry config virtualenvs.in-project trueの場合
    - そうでない場合、仮想環境はLinuxなら`~/.cache/pypoetry/virtualenvs/`、Macなら`~/Library/Caches/pypoetry/virtualenvs`にある
- localで使用するpythonのversionを指定(pyenv, asdfなど)
- 仮想環境(.venv)を作成
- 仮想環境に入る
- pipの更新
- poetry install

```shell
rm -rf .venv
rm poetry.lock
pyenv local 3.8.2 #<-pyproject.tomlのpython versionに合わせる
python -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
poetry install
```
①の方がより根本的な解決かなと思います。
仮想環境VirtualBox(Ubuntu20.04)でRails環境構築

# 概要
テキストを見ながらRails環境を構築しようとしたら
サーバー起動までの所で色々ハマってしまったので自分用に記録しておきます。
windows10　VirtualBox6.1　ubuntu 20.04 で構築しました。
windowsからubuntuへのコピペ機能を使える様にしてから始めると楽です。

# 参考にした書籍
[現場で使える Ruby on Rails 5速習実践ガイド](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227/ref=sr_1_6?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=217OVEDAHL3SK&keywords=rails&qid=1657893409&sprefix=rails%2Caps%2C189&sr=8-6)

#### ubuntuのインストールが終わりターミナルを起動した所からスタート↓
# パッケージを最新にする
>```
>sudo apt update
>```
>```
>sudo apt upgrade -y
>```

# rbenv をインストール
>```
>sudo apt install git
>```
>```
>git clone https://github.com/rbenv/ruby-build.git ~/.rbenv
>```

>rbenvのパス設定と初期化処理
>```
>echo 'eval "$(rbenv init -)"' >> ~/.bashrc
>```
>```
>echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
>```

>再起動します
>```
>reboot
>```

>rbenv バージョン確認
>```
>rbenv -v
>```

# Ruby と Rails のインストール
>ruby-buildをセットアップ
>```
>git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)/plugins/ruby-build"
>```

>Rubyのインストールに必要なパッケージのインストール
>```
>sudo apt install autoconf bison build-essential libssl-dev libyaml-dev libreadline-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm6 libgdbm-dev
>```

>Rubyのインストール (今回はversion 2.5.1 を指定)
>```
>rbenv install 2.5.1
>```

>システム全体で使用するRubyのバージョンをrbenvに設定
>```
>rbenv global 2.5.1
>```

>Rubyのバージョンを確認
>```
>ruby -v
>```

>gemのアップデート および バージョン確認
>```
>gem update --system
>```
>```
>gem -v
>```

>Bundlerのインストール
>```
>gem install bundler
>```

>Railsのインストール (今回はversion5.2.1を指定) および バージョン確認
>```
>gem install rails -v 5.2.1
>```
>```
>rails -v
>```

# Nodejsのインストール
>```
>sudo apt install curl
>```
>```
>curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
>```
>```
>sudo apt install nodejs
>```
# データベース(PostgreSQL)のインストールとセットアップ
>コードが長いのでコピペ推奨
>```
>sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
>```
>```
>wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
>```
>```
>sudo apt update
>```
>```
>sudo apt install postgresql
>```

>正常にインストールされているかバージョン確認
>```
>psql -V
>```

>Railsから利用できる様にPostgreSQLを起動
>```
>sudo service postgresql start
>```

>データベースユーザー名を設定 (Ubuntuのログインユーザー名と同じにしました)
>```
>sudo su postgres -c 'createuser -s ログインユーザー名'
>```

>試しにコンソールを起動、確認出来たら \q を入力して終了
>```
>psql postgres
>\q
>```

>gem「pg」が利用するパッケージをインストール
>```
>sudo apt install libpq-dev
>```

# 試しにscaffold_appを作る
>作業用ディレクトリで実行
>```
>rails new scaffold_app -d postgresql
>```

>作成された scaffold_app フォルダに移動
>```
>cd scaffold_app
>```

>データベース作成
>```
>bin/rails db:create
>```

>いざサーバー起動　(サーバーの終了は Ctrl+C )
>```
>bin/rails s
>```
ブラウザで http://localhost:3000 へアクセス
![rails_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1955736/61718410-d5a5-83c7-a495-2541f57cf964.jpeg)
お疲れ様でした。

# まとめ
初めて記事を書いてみました。
間違っている部分や読みにくい部分があればご指摘いただければと思います。
読んでくださってありがとうございました。
【#30 エンジニア転職学習】DB入門　オプティマイザ/インデックス

# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

DBの入門をざっくり学習していきます。

バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。


https://qiita.com/Chika110/items/ef54dddd565a0193ef44

# 本日の学習内容
本日はDBのパフォーマンスに関して続きとして、オプティマイザやインデックスの概要を学習しました。

* **オプティマイザ　←Topics!!**
* **インデックス　←Topics!!**

# オプティマイザ/インデックス
#### オプティマイザ
SQL文が必要とするデータに対して、実行計画を作成する内部DBのに内部プログラムのこと。
* 基本、実行計画はすべてオプティマイザに任せる（人間が考えることはしない）
* オプティマイザが計画を立てる際はテーブルの行数、サイズ等をサンプリング抽出した「統計情報」が使用される

#### インデックス
テーブル内の列に対応した索引で、rangeスキャンするときに必要。
B-Tree（平衡木）構造のため、どの値へも同じ探索時間でたどり着ける。
* インデックスの作成基準
    * サイズが大きいテーブルにだけ作る
    * 主キー制約等、自動生成される列には不要
    * カーディナリティが高い列に作る（1列で多種類の値を持っている）
* 不用意に作りすぎるとオプティマイザが迷ってパフォーマンスが落ちる、

使用している教材はこちら↓


https://www.amazon.co.jp/%E3%81%8A%E3%81%86%E3%81%A1%E3%81%A7%E5%AD%A6%E3%81%B9%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93-%E3%83%9F%E3%83%83%E3%82%AF-ebook/dp/B00TTRZFDC/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=1657112653&sr=8-1


# おわりに
最後までお読みいただきありがとうございました。
アドバイス・応援コメント等いただけますと幸いです。
pythonのsleep関数について

pythonのsleep関数について、
```python:doudemoii.py
import time
print("mitsuya")
time.sleep(1)
print("cider")
time.sleep(1)
print("LOVE!!!")
```
とまあこんな感じで書きます。
だがサイダー氏思った
timeモジュールってsieep以外ほぼ使わないじゃん！
たから、こうすればもっと効率的じゃね？
```python:doudemoii.py
from time import sleep
print("mitsuya")
sleep(1)
print("cider")
sleep(1)
print("LOVE!!!")
```
「time.」って打つの地味にめんどくない？
どうせtimeモジュールなんてsleep以外たいして使わんやろ
Docker上のMySQLで日本語入力をする方法

MySQLで日本語を入力しようとしても入力されない。そこで、

https://qiita.com/zongxiaojie/items/6b593ec4ce5e85bb342c
こちらの記事を参考にしたが、

/bin/sh: apt-get: command not found

と出てあえなく失敗。そのため、

Dockerfile
```
FROM mysql:5.7-debian
(以下略)
```

```docker-compose.yml

services:
  mysql:
    (中略)
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
```
とすることで無事解決。
【Ubuntu】BlenderのPythonにpipでパッケージを追加する方法

# 方法

## 1. Blenderをダウンロード・インストール
以下のサイトからビルド済みのバイナリが入っているtar.xzをダウンロードし、任意の場所に展開。
- 今回は/opt/blenderに展開
- 記事執筆時のBlenderのバージョンは3.2
- ターミナルで`/opt/blender/bledner`を実行するとBlenderが起動する

https://www.blender.org/download/


## 2. pipの導入
```bash
cd /opt/blender/3.2/python/bin
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
./python3.10 get-pip.py
```

## 3. パッケージ追加
```bash
cd /opt/blender/3.2/python/bin
./python3.10 -m pip install h5py # h5pyパッケージを追加したい場合
```
Docker Desktopが「An unexpected error occurred」で起動できないときの対処方法

# 概要

Windows環境でDocker Desktopを起動するとき、以下のエラーが発生して起動できないことがあります。

```
Docker Desktop cannot start

An unexpected error occurred

Failed to deploy distro docker-desktop to C:\Users\(ユーザー名)\AppData\Local\Docker\wsl\distro::

Some WSL system related access rights are not set correctly.
This sometimes happens after walking the computer or not being connected to your domain/active directory.
Please try to reboot the computer.
If not sufficient, WSL may need to be reinstalled fully.
As a last resort, try to uninstall/reinstall Docker Desktop.
```

![DockerError.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278145/dc963e7d-ea7d-b4da-2f3f-a0520a4a123f.png)

エラーメッセージの一部が文字化けして読み取れませんが、WSLに関係するエラーのようです。  
このエラーは、マシンの再起動やDocker Desktopの再インストールを行っても改善しませんでしたが、起動のための対処方法が分かりましたので本記事にてご紹介します。

# 前提条件

- Windows 10 Pro 21H2 で Docker を利用している
- Docker Desktop 4.10.1 を利用している
- Docker の設定で Use the WSL 2 based engine を有効にしている
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278145/b4334e6f-1ada-e921-b535-b8b8ea9bf851.png)

# 原因

53番ポートの競合が原因です。53番ポートを使用しているプロセスを終了することでエラーが解消します。

参考記事：https://forums.docker.com/t/unable-to-open-docker/123771/9

# 対処方法

1. Windowsのスタートメニューで`リソース`と入力して`リソースモニター`を起動します。
1. リソースモニターが起動したら`ネットワーク`のタブをクリックします。
1. `リッスンポート`をクリックして展開します。
1. `ポート`の列をクリックしてポート番号の昇順に並べ替えます。
1. `53`番ポートを使用しているイメージの`PID`を確認します。（画像の例ではPIDは`3016`です）
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278145/ed4c5cb3-a749-d844-51e9-0921bb6ebd56.png)
1. リソースモニターの`概要`タブをクリックします。
1. `PID`の列をクリックしてPIDの昇順に並べ替えます。
1. 手順5で確認したPIDのイメージを探します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278145/7117bf2f-80bd-d381-1d80-06ddb80b8ad6.png)
1. 右クリックしてメニューの`プロセスの終了`をクリックします。
1. `svchost.exe (netsvcs -p)`のプロセスの終了の確認ダイアログが表示されるので`プロセスの終了`をクリックします。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278145/3eb14139-5891-ff37-b269-e45c6776a6d9.png)
1. イメージの状態が`終了済み`となります。
1. Docker Desktopを起動します。

エラーが解消してDocker Desktopが正常に起動するようになります。
在宅勤務で赤ちゃんのお昼寝を別室で見守るダブルテレワーク

:::note warn

子育ては実際に目の行き届くように行いましょう。

~~▼ 児童虐待防止対策 - 厚生労働省
https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kodomo/kodomo_kosodate/dv/index.html~~

▼ 令和５年４月１日に厚生労働省からこども家庭庁に移管しています
https://www.cfa.go.jp/policies/jidougyakutai/
:::

# はじめに

在宅勤務が一般的になり、自宅で子育てしながら業務を行う機会が増えました。
赤ちゃんがお昼寝してくれると、業務に集中できて助かります。でも、ベッドルームに寝かしつけて、少し離れたリビングルームで業務を行っていると赤ちゃんの様子が心配になります。

お昼寝から目が覚めて**ベッドから落ちた**なんてことになったら大変です。

そこで、動体検知機能カメラで寝起きを検出し、スマホ等に通知されるしくみを構築しました。

:::note alert
窓からの転落事故に注意！！

窓からの転落事故等に関しては、別の対策をしてください。
https://www.gov-online.go.jp/useful/article/202107/3.html
:::

## 見守りに必要なアレコレ
- パソコンまたはラズパイ
- パソコンまたはラズパイのインターネット環境
- Webカメラ
- motionEye
- googleアカウント(Googleドライブ、Google Apps Script、Google スプレッドシート)
- LINE WORKSアカウント（組織、管理者アカウント、Bot、ユーザーアカウント）
- スマホ（iPhone, Android）
- スマホのインターネット環境
- LINE WORKSアプリ

## しくみ

赤ちゃんの動きを`motionEye`が監視します。動きがあると、`motionEye`が`Google Apps Script`へ検出を通知すると同時に`Googleドライブ`へ画像データと動画データを保存します。`Google Apps Script`は、`motionEye`からの検出により、`LINE WORKS`へ`bot`からの`トーク`としてそれを通知します。スマホ等の`LINE WORKSアプリ`で、その`トーク`を受信し、赤ちゃんに動きがあったことを知ることができます。`トーク`に含まれるリンク先を参照すると`Googleドライブ`に保存されている画像データや動画データを参照することもできます。

![見守り.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/a1aab96d-83ca-ac2c-fb5d-856decbf05f2.png)

<details><summary>出典：使用した画像</summary>

- なん語を話す赤ちゃんのイラスト https://www.irasutoya.com/2015/07/blog-post_70.html
- Webカメラのアイコン https://icon-pit.com/pictogram/15485
- スマートフォン・スマホのイラスト https://www.irasutoya.com/2014/11/blog-post_362.html

</details>

# 導入方法

次のツールをインストールし、設定します。

- [motionEye - https://github.com/motioneye-project](https://github.com/motioneye-project)
- GoogleアカウントとGoogle Apps ScriptのAPI有効化
- [LINE WORKS](https://line.worksmobile.com/jp/) 組織と管理者アカウント（フリープラン可）
- [スマホ用 LINE WORKSアプリ](https://line.worksmobile.com/jp/download/)
- [Botアプリ - https://github.com/jp-96/motioneye-lineworks-bot](https://github.com/jp-96/motioneye-lineworks-bot)

# 使い方

motionEyeが動きを検出するとLINE WORKSのトークグループにBotからのトークが通知されます。トークの＃記号の数字をタップすると写真が表示され、動画ボタンでGoogleドライブの動画にジャンプします。
写真や動画を表示するには、Googleドライブのフォルダを共有してください。

# おわりに

motionEye、Google、LINE WORKSの３つを組み合わせて、見守りシステムを構築しました。何れも無料で利用できますので、ぜひ、お試しください。

:::note alert
[重要] LINE WORKS API 1.0 提供終了日のご案内
https://jp1-notice.worksmobile.com/view/#/detail-view/571

LINE WORKS API 1.0 は、2023年4月30日をもって提供を終了される計画です。
本記事では、2022年4月1日に正式リリースされた LINE WORKS API 2.0​ を使用しています。
:::
【初投稿】（ようやく💦）英語に触れる機会が増えたので、翻訳とメモを同時にやってくれるツールを作ってみた

___
こんにちは:grinning:
食品スーパーマーケット:rice_ball:で働いているanordinaryman28です。
初投稿します。

# 1、はじめに

この頃、何かと**見慣れない英語**を目にすることが多くなってきました:sweat:
理由・・・
* プロトタイピングを始めて、海外サイトを使用するようになりました
* スキンケアにはまっていて、輸入商品を買う機会が増えました
* (どんな効能があるのかわかりづらい)

上記2点は今後も継続して**トライ**!!していくので、
**LINEbot**と**Make**を活用して、トーク画面に英語を入力すると、
自動で日本語に翻訳してなおかつ、**Google Sheets**に記載してくれる（単語帳の作成）ツールが
あったら良いなと思い作ってみました！

# 2、準備

1. 前提として、**[LINE](https://zenn.dev/protoout/articles/16-line-bot-setup)アカウント登録**、**[Make](https://zenn.dev/protoout/articles/12-integromat-signup)アカウント登録**が必要です
(クリックでアカウント作成マニュアルに飛びます)
2. **Make**の**Scenarios**は下記の通りです
![スクリーンショット (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697340/5669e1a1-66a2-c95a-e410-80879bb499ea.png)
3. **モジュール**の設定は下記の通りです

![スクリーンショット (19).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697340/e0a2273a-786f-8140-1ae1-44fac98fab0e.png)

![スクリーンショット (21).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697340/20237935-890b-764d-7a38-488d463a6fee.png)

# 3、実装
**実際にラインで送ってみました！！**

https://twitter.com/i/status/1547896472494284800

**Google Sheetsはどうなったのでしょうか・・・**
![スクリーンショット (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697340/369a3aba-51c7-099c-bd15-57d33604be14.png)


**無事書き込みできていました！**:blush:
オリジナルの単語帳を作って復習します！

# 4．最後に
実際に出来た成果物を確認してみると新たな課題や現場での活用法が浮かんできました:cloud:
1. 翻訳する対象がトーク画面に書かれた文字だけなので、**写真で撮った文章を翻訳する機能**
2. 食品スーパーマーケットの現場ではベトナム実習生が増えてきている為、
日本語→ベトナム語に翻訳することと併せて、**単語を画像に変換する機能**
（Google Sheetsにも記載されるので、ベトナム実習生の日本語の勉強にも良いかと思います）

拙い文章でしたが、最後まで読んでいただき、ありがとうございました:bow_tone1:
サイバーセキュリティお嬢様「マルウェア...？スキーウェアのお仲間ですの？」

# ある日
サイバーセキュリティお嬢様（以下CSお嬢様）「ああ〜今日もいいお天気ですわ〜！」
CSお嬢様「ん...けほっけほっ」

じいや「お嬢様！お身体大丈夫ですか！」

CSお嬢様「けほっ...じいや、たぶん大丈夫ですわ」

じいや「ご無理は良くないですぞ、もしかしたら流行りの新型コロナ**ウイルス**やもしれません」
じいや「**ウイルス**と言えば」
じいや「お嬢様は**コンピュータウイルス**についてどれだけご存知ですかな」

CSお嬢様「じいや**導入が雑**でしてよ」
CSお嬢様「わたくしの心配は**３秒**くらいしかしてなかったですわ」
CSお嬢様「まあいいでしょう、わたくしピンピンしておりますから」
CSお嬢様「詳しく聞いてあげてもよろしくってよ？」

# マルウェアとは
じいや「ウイルスの前に」
じいや「マルウェアの話をする必要がありますぞい」

CSお嬢様「なんですのマルウェアって...**スキーウェアか何かの一種**ですの？」

じいや「**お嬢様がお元気そうでじいやは嬉しいですぞ**」

CSお嬢様「わたくし、**なんだかもの凄くバカにされた気分**でしてよ」

じいや「マルウェアとは」
じいや「悪意のあるプログラムの総称ですじゃ」
じいや「これから紹介する、ウイルス、ボット、ランサムウェアなどもマルウェアに含まれるのですぞ」

## ウイルスとは

CSお嬢様「**ウイルスはウイルスですわ**」

じいや「お嬢様、話し方が**なんとか構文**みたいになってしまっておりますぞ」

CSお嬢様「コンピュータも風邪を引きますの？」

じいや「まあそのように考えて差し支えないでしょう」
じいや「コンピュータ上のファイルに寄生して活動するタイプのものを、ウイルスと呼んでいるのですぞ」

CSお嬢様「では寄生して活動しないタイプもありますの？」

じいや「**お嬢様にしては冴えておりますな**」
じいや「『トロイの木馬』や『ワーム』は、独立型として活動をしますぞい」


## トロイの木馬とは
じいや「トロイの木馬は」
じいや「無害なプログラムを装ってユーザにインストールさせ」
じいや「他のマルウェアをインストールさせたり、不正な動作をさせるタイプのものですぞ」
じいや「ギリシャ神話のエピソードからその名がつけられておりますのじゃ」

CSお嬢様「贈り物の、巨大な木馬の中には敵の兵士が入っていた...というあのお話ですわね」

じいや「昔したお話を覚えていてくださって、じいやは涙が出そうですぞ」

## ワームとは
じいや「ワームとは」

CSお嬢様「**虫はいやですわあああああー！**」

じいや「そういえばお嬢様は小さい頃から虫が大の苦手でしたな」

じいや「話を戻すと」
じいや「自己増殖するタイプのものを指すのですぞ」

じいや「今までの話をまとめるとこうですじゃ」

| ウイルス  | トロイの木馬  | ワーム  |
|:-:|:-:|:-:|
| 寄生型  | 独立型  | 独立型  |
| 自己増殖型  | 非増殖型  | 自己増殖型  |

CSお嬢様「表になると一気に分かりやすくなりましてよ！」


## ボットとは
じいや「ボットとは」

CSお嬢様「**修造botとかのボットですの？**」

じいや「おや、これまたお懐かしいですな」
じいや「まあ大筋で意味合いは合っておりますぞ」
じいや「語源は**Robot**ですからな」

じいや「ここでは（悪意の）ボットと呼びますが」
じいや「これに感染すると攻撃者に乗っ取られ、別のコンピュータへの攻撃に使われてしまうのです」

CSお嬢様「まるでゾンビですわねー！」

## ランサムウェアとは
じいや「ランサムウェアとは」

CSお嬢様「これは皆目見当がつきませんわ」

じいや「Ransom（身代金）とSoftware（ソフトウェア）を合わせた造語で」
じいや「これに感染すると攻撃者はコンピュータ上のファイルを暗号化し、」
じいや「その暗号化を解く条件として攻撃者から身代金を要求されるのです」

CSお嬢様「大変ですわ！身代金を払いませんと」

じいや「お嬢様」
じいや「ドラマや映画と違って、身代金を払ったからといってデータ（人質）が返ってくる保証はどこにもないのですぞ」

CSお嬢様「あらそうなんですの」

じいや「ランサムウェアについてはまたどこかの機会で詳しくお話させていただきますぞい」

# おわりに
CSお嬢様「なんだか今回は易しかった気がしますわ」
CSお嬢様「これもわたくしが成長していっている証ですわね？」

じいや「お嬢様のその自己肯定感の高さ、見習いたいものですな」

じいや「これからも少しずつセキュリティの知識を身につけて」
じいや「**真のサイバーセキュリティお嬢様**を目指すのですぞ」

CSお嬢様「わたくし頑張りましてよー！」

# 参考文献
[インターネットの安全・安心ハンドブック](https://security-portal.nisc.go.jp/handbook/index.html)

### 前回までのあらすじ
[サイバーセキュリティお嬢様「CIAってなんですの？」](https://qiita.com/choco_py3/items/51c04bdc8bfe25fe84f3)
[サイバーセキュリティお嬢様「しんせいせい...ってなんですの？」](https://qiita.com/choco_py3/items/0d05409534f267e40001)
[サイバーセキュリティお嬢様「き...脆弱性ってなんですの？」](https://qiita.com/choco_py3/items/15479e37b011c34abf36)

### 次回以降
[サイバーセキュリティお嬢様「クラッカー？何それ食べられますの？」](https://qiita.com/choco_py3/items/40fe5a27af3722daa654)
[サイバーセキュリティお嬢様「ハクティビストってなんですの？」](https://qiita.com/choco_py3/items/262df8fc893cf7fd303f)
[サイバーセキュリティお嬢様「F5攻撃（アタック）ってなんですの？」](https://qiita.com/choco_py3/items/f0164dedc7e4b761b25d)
[サイバーセキュリティお嬢様「SQLいんじぇくしょん...ってなんですの？」](https://qiita.com/choco_py3/items/4a597f25f0c3dbbea437)
[サイバーセキュリティお嬢様「クロスサイトスクリプティング？...美味しそうですわぁ！」](https://qiita.com/choco_py3/items/f3bb70ecf819bb55ad80)

# 宣伝
[技術書典13](https://techbookfest.org/event/tbf13)にサークル参加予定です。
良かったら[Twitter](https://twitter.com/choco_py3)フォローしてください！
UAC (User account control）/ 旧 LUA を制御する。

# これは何？
UAC を制御するレジストリの位置のメモ書きです。

# 対象のレジストリ
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA
0 : 無効
1 : 有効 (未構成も有効とみなされる)

# そもそもUACとはなんぞや。
これ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/fd9e96ef-3692-7a8a-ad9a-954774f6d977.png)

Windows標準のセキュリティ機能の一つ。
ユーザーの意図しない操作が勝手に実行されたり、許可していないプログラムが起動するのを防ぐためのもの。

# 設定するとどうなるのか
上記ダイアログがでなくなる。

# 補遺 : UAC / LUA って何ぞや
UAC の旧名称が LUA、つまり同一のもの。なのでレジストリの名称はそのまま。

https://docs.microsoft.com/en-us/windows-hardware/customize/desktop/unattend/microsoft-windows-lua-settings-enablelua

-- 抜粋 --
EnableLUA specifies whether Windows User Account Controls (UAC) notifies the user 
when programs try to make changes to the computer. 
(EnableLUAは、プログラムがコンピューターに変更を加えようとしたときに、UAC がそのことをユーザーに通知するかどうかを指定します)

UAC was formerly known as Limited User Account (LUA).
(UAC は以前は LUA という名称でした)

# 書いといてなんですが
基本的にオフは推奨されません。
セキュリティだいじ。
macを最速で使うためのショートカット集（chrome付き）

# はじめに

Macをずっと使っていて個人的に超便利だな＆作業効率がかなり速くなったなと思ったショートカットを挙げています。

ショートカットを知っていた私は、eタイピングランク `S`~`Thnder` 程度ではありましたが、ランク `EddieVH` の友人（Microsoftの息がかかっている）よりもかつてプログラムコード写経系の大学講義で速く写経が終わっていました。

ITエンジニアに限らず、macで文章を書いたりする生業の皆さんにもお役に立つ気がします。

※ *個人的に超便利だな* と思ったショートカットのみ記載しているため、巷のショートカット集でよく見る `cmd + shift + K` → Finder「ネットワーク」を開く、みたいなものはありません。

本記事における装飾キーの対応は以下の通りです
・`cmd`： `⌘ command` キー
・`ctrl`：`⌃ control` キー
・`shift`：`⇧　shift` キー
・`opt`：`⌥ option` キー

# 基本のショートカット
|タグ| ショートカットキー |内容|
|---|---|---|
|大事。|esc|戻る / 解除 などなど。|
||return|確定 / 改行 / ファイル名変更選択 などなど。|
|移動系|ctrl + F|カーソルを1文字先へ移動|
||ctrl + B|カーソルを1文字前へ移動|
||ctrl + E|カーソルを行の末尾へ移動|
||ctrl + A|カーソルを行の先頭へ移動|
||ctrl + P|カーソルを1行上へ移動|
||ctrl + N|カーソルを1行下へ移動|
|文字編集系|ctrl + shift + F|カーソルの右1文字を選択|
||ctrl + shift + B|カーソルの左1文字を選択|
||ctrl + shift + E|カーソルの右〜行末までを選択|
||ctrl + shift + A|カーソルの左〜行頭までを選択|
||cmd + A|全選択|
||cmd + C|コピー|
||cmd + V|ペースト|
||cmd + X|カット（コピー＆削除）|
||cmd + Z|取り消し|
||cmd + shift + Z|取り消しを戻す|
||ctrl + H<br>または delete|カーソルの左1文字を削除|
||ctrl + D|カーソルの右1文字を削除|
||ctrl + K|カーソルの右〜行末までを削除|
||ctrl + O|カーソルの下の行に1行挿入|
||cmd + B|選択文字をボールド化|
||cmd + I|選択文字をイタリック化|
||cmd + U|選択文字にアンダーライン|
||fn + F7|全角カナ変換|
||fn + F8|半角カナ変換|
|アプリ終了系|cmd + W|タブを削除<br>※アプリによってはアプリを終了|
||cmd + Q|アプリを終了|
||cmd + M|dockに格納|
||cmd + opt + esc|アプリを強制終了<br>※フリーズ時等（多分あまり良くない）|
|遷移系|cmd + tab|アプリケーションを切り替え|
||ctrl + tab|タブを切り替え|
|画面制御系|cmd + Plus(+)|画面を拡大|
||cmd + Minus(-)|画面を縮小|
||cmd + shift + 3|スクリーンショット（画面全体）|
||cmd + shift + 4|スクリーンショット（範囲選択）|
||cmd + shift + 4<br>→ space|スクリーンショット（ウィンドウ）|
||cmd + shift + 5|画面録画|
|その他|ctrl + space|文字種（英数⇔かな 等）切り替え|
||cmd + S|保存|
||cmd + shift + S|名前を付けて保存|
||cmd + F|アプリケーション内検索|
||cmd + space|spotlight検索|
||Z → H|（かな）矢印左「←」|
||Z → J|（かな）矢印下「↓」|
||Z → K|（かな）矢印上「↑」|
||Z → L|（かな）矢印右「→」|
||ctrl + cmd + space|絵文字|

「移動系」のショートカットの一部は、Mac版Office製品（Word・PowerPoint 等）や VisualStudioCode 等、***Microsoft社の息のかかった製品で無効になっている場合有***

「アプリ終了系」等のショートカットでは、adobe社製を始めとしたいくつかのアプリケーションでは無効になっている場合有

# Finder やOS寄りのショートカット

|タグ| ショートカットキー |内容|
|---|---|---|
||cmd + shift + N|新規フォルダ作成|
||cmd + N|Finderを開く|
||cmd + opt + L|「ダウンロード」フォルダを開く|

以上のショートカットは、ただしブラウザ等のアプリケーション使用時に別の機能が発動する場合有


# chrome のショートカット

|タグ| ショートカットキー |内容|
|---|---|---|
|画面系|cmd + T|新しいタブ|
||cmd + N|新しいウィンドウ|
||cmd + shift + N|新しいシークレットウィンドウ|
||cmd + W|タブを閉じる|
||cmd + shift + W|ウィンドウを閉じる|
|遷移系|ctrl + tab|次のタブ|
||ctrl + shift + tab|前のタブ|
||cmd +「|前のページ|
||cmd +　」|前のページから戻る（上の逆）|
|検索系|cmd + opt + F|検索バー|
||cmd + F|ページ内検索（基本系と同一）|
||cmd + G|ページ内検索時：次へ|
||cmd + shift + G|ページ内検索時：前へ|
||esc|ページ内検索時：検索解除|
||cmd + R|リロード|
||cmd + shift + R|ホットリロード|
|ブックマーク系|cmd + D|ブックマークを追加|
||cmd + opt + B|ブックマークマネージャ|
|その他|cmd + opt + I|検証（デベロッパツール）|

# その他
① `shiftit` などサードパーティ製のアプリを入れると、画面をショートカットで全画面化や左右寄せなどできたりします。（アプリケーションの危険性等に関しましては責任を負いません。）

② USキーを使っていらっしゃる方は [システム環境設定] で `⇪ caps lock` キーを `⌃ control` に変更するとお得です。

**その他のその他**

- Windows 系OSを使ったことが皆無なので、Windows ⇔ Mac の互換性はよくわかりません。
- emacs で育ってきたので Vim のショートカットはよくわかりません。
- よく `cmd + ctrl + F` のフルスクリーンショートカットも便利とありますが、個人的にこのショートカットを覚えてしまうと、1画面で作業をする際にアプリ間遷移ショートカットが効かなくなるのに無意識的に使おうとして不便なので記載していません。
- 個人的に超便利だと思っているものだけをピックアップしています。macOSにはショートカットがもっとたくさんあります。
マイグレーションファイルを修正する方法

 - アプリ制作途中にマイグレーションファイルの修正が必要になった。なんとか修正することができたので忘備録として記事にします。
## 経緯
- `ログイン機能`を実装するため`devise`をインストール
- 不要な機能をコメントアウトし忘れ`rails db:migrate`を実施。
- 実施後に不要な機能を削るため`マイグレーションファイル`の修正に取り掛かる。

まずは`マイグレーションファイル`の修正について検索し、次のコマンドを実施
```:ターミナル
rails db:rollback
```
すると以下の様にエラーが発生
```
Running via Spring preloader in process 89570
== 20220715104214 AddDeviseToUsers: reverting =================================
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

ActiveRecord::IrreversibleMigration
/Users/kuramotokansei/Desktop/sumple_app/db/migrate/20220715104214_add_devise_to_users.rb:49:in `down'
<internal:/Users/kuramotokansei/.rbenv/versions/3.0.3/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
<internal:/Users/kuramotokansei/.rbenv/versions/3.0.3/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
-e:1:in `<main>'

Caused by:
ActiveRecord::IrreversibleMigration: ActiveRecord::IrreversibleMigration
/Users/kuramotokansei/Desktop/sumple_app/db/migrate/20220715104214_add_devise_to_users.rb:49:in `down'
<internal:/Users/kuramotokansei/.rbenv/versions/3.0.3/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
<internal:/Users/kuramotokansei/.rbenv/versions/3.0.3/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
-e:1:in `<main>'
Tasks: TOP => db:rollback
(See full trace by running task with --trace)
```
## 翻訳してみた
_標準的なエラー：エラーが起こりました。これ以降の全ての`マイグレーション`は中止されました。
中止された`マイグレーションファイル`の場所
不可逆な`ActiveRecord`の内容
`--trace`を実行して完全な痕跡を参照してください。_
## 解決方法
どうやら一度`rails db:migrate`を実行すると`rails db:rollback`が実行出来ない`ActiveRecord`があるらしい。
今回はローカルのみでチーム開発でないこと、とくに`データベース`に保存している`データ`などもないことから以下の方法を試した。ただし、前提として`マイグレーションファイル`は __修正済み__ とする。
```
rails db:drop  #データベースを削除
        ↓
rails db:create #データベースを作成
        ↓
rails db:migrate  #マイグレーションを実行
```
`マイグレーション`が正常に適用されているか確認
```
rails db:migrate:status

#上記実行結果

Running via Spring preloader in process 90546

database: sumple_app_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20220714065607  Create presents
   up     20220714080540  Create users
   up     20220715104214  Add devise to users
```
`status`が`up`だと`データベース`に反映されている状態らしい

とりあえず今回は理解できていないがなんとか突破できた。今後理解を深め修正していきます。
効果絶大、Windows10の高速化

Windows7のころ，デフォルトで無効だったので気にしてなかったけど，いつの間にかデフォルトで有効になっていました。

気づかなかった。ひどいよ Microsoft。


レジストリエディタで`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem`の`NtfsDisableLastAccessUpdate`を`80000002`から`80000003`に変更して再起動。

どうかな？おや？何にも変わらん。`80000002`に戻ってる。


それならコマンドで

```powershell
fsutil behavior set disablelastaccess 0x3
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/78b2044e-efbd-cc92-3f93-6c2c700ab545.png)

再起動。今度はOK。しかも速い。

<h1>
効果は絶大です。
</h1>
Bakery を使って、別の PC の GPU にベイクさせる

# はじめに
どうも。「バーチャルためにならない改変お姉さん」の水無月せきなです。
Bakery でライトベイクをする際、別の PC の GPU にベイクをさせたいと思ったことはありませんか？ ありますよね？ そう、あるんですよ。
ということで、Bakery でベイクをする際に、別の GPU にベイクをさせる方法です。

# 環境
Windows10 Home 21H2
Unity 2019.4.31f1
Bakery 1.9.0

# 手順
公式の手順書はこちら ⇒ https://geom.io/bakery/wiki/index.php?title=Network_baking
### １．実際にベイクさせる PC の IP を調べる
実際にベイクさせる PC の IP を調べてください。
コマンドプロンプトで `ipconfig` と打つなどして調べてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843472/7deea1b8-d30f-5c7e-3266-8c665bb334f2.png)
![cmd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843472/57f3cb64-5804-1d57-7c07-ec9a1416a643.png)

### ２．必要なファイル一式を、実際にベイクする PC にコピーする
`Assets/x64/Editor/Bakery` を丸ごと、実際にベイクを行う PC にコピーしてください。
__実際にベイクを行う PC に Unity をインストールする必要はありません。__

### ３．`ftServer.exe` を起動する
コピーしたフォルダの中に、`ftServer.exe` があるはずですので、ダブルクリックなどで起動してください。
黒い画面が立ち上がるはずです。下の画像のようになっていれば、別 PC 側の準備は終了です。
![ftserver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843472/aa0e57f8-76e3-b368-2094-1b9d98952bec.png)

### ４．Bakery で Network Baking を設定する
ベイクしたいプロジェクトを開き、Bakery のパネルを表示してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843472/c064c5f4-8f3a-1884-f10c-1b9e40af0cbb.png)
Settings の項目を `Experimental` にしてください。
ここを変えないと、必要な項目がパネルに表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843472/6543b22b-fcab-164b-66c2-9ee5aecc5bff.png)
必要な項目こと `Network baking` の左にある矢印をクリック後、`Bake on remote server` にチェックしてください。
`IP address` の欄に、１．で調べた IP を入力し、 `Connect Server` を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843472/99213b28-db82-eae1-ed9e-3272870f313d.png)
上記のように `Server: Idle` になっていれば準備完了です。
`Render` を押すと指定した IP の PC でベイクが始まります。

ベイク中は `Server: Busy` のようになりますが、ベイクが終わると先ほどの画像の状態に戻ります。
ベイクが終わったら、`Get data` を押して、ベイクしたデータを受け取るだけです。

# 注意点
Bakery の設定は、実際にベイクを行う GPU に合わせてください。
特に、 __RTX シリーズの GPU にベイクをさせる場合は、Bakery の `RTX mode` にチェックを入れてください。__
Unity を起動している PC の GPU が、 GTX シリーズだとしてでもです。十中八九エラーになります。

あと、同一 LAN 内とは言え、データの送受信がうまくいかずにエラーになる場合があります。
その場合は、仕切り直して再ベイクしましょう。