OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studio Codeでhtml + bootstrap4の書き方

# Visual Studio Codeでhtml + bootstrap4の書き方
今回の記事でVSCodeを利用してhtmlテンプレート、bootstrap4デザインの組み合わせを快速編集できる方法について説明します。
手順は以下の通りです。

## １、拡張機能インストール
まずはVSCodeを開き、以下の二つの拡張機能をインストールする

- 1、HTML Preview
- 2、Bootstrap 4

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/74bf034c-d5bb-3b0b-ed2e-d23bbaa0d700.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/74d332df-05f7-f1bc-23c9-ab15197b335f.png)

## ２、HTMLファイル作成
ファイル -> 新規ファイルで新規ファイルを作成する
ショートカットキー：Ctrl+N
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/4d318a71-9b04-3ae4-e11e-d9d06fe4bb59.png)

新規作ったファイルをhtml形式で保存する
方法１：右下の「プレーンテキスト」を押下する
方法２：`Ctrl+K -> M`の順番で操作する
言語モード選択に「h」で書いて一覧から`html`を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/948f5f33-edc9-176f-d4aa-b0169fa25817.png)

右下の「プレーンテキスト」は`HTML`になっていれば成功

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/69a50d78-0164-2d3c-3d8f-e523df16f8fd.png)


## ３、HTML快速編集
１、`b4`と入力して　`Enter`キーをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/46ff0db9-a9cc-985d-2d20-5cb37772bb46.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/f214682f-e44b-4176-4530-feacdc5dbd8b.png)
bootstrap4のcssとjsファイルをインポート済みのhtmlのひな形ソースが生成される
２、`<body>`の中に`b4-form-group`と入力して　`Enter`キーをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/516dbd9a-1fb5-b6a5-ebbe-382d154bb05f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/0d646bde-d86f-553f-2646-4e7e13c4d59c.png)

以下のフォームグループのソースが生成させる

     <div class="form-group">
        <label for=""></label>
        <input type="text" name="" id="" class="form-control" placeholder="" aria-describedby="helpId">
        <small id="helpId" class="text-muted">Help text</small>
      </div>
３、その他自動補充機能もたくさんある、当記事で割愛　
## ４、プレビュー方法
`Ctrl+K -> V`の順番で操作する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/5842b894-8949-95aa-29f9-4ec3c8d2dbd6.png)

プレビューできていますよね、これで完了。
Visual Studio CodeでJavaプログラム開発環境構築

# Visual Studio CodeでJavaプログラム開発環境構築
今回の記事で　VSCodeを利用してJavaプログラム開発環境構築について説明します。
手順は以下の通りです。

## １、JDKインストール
端末に既にJDKが入っている方、２へ
上記以外の方以下の記事通りJDKインストールしてから２へ

- [WindowsへのJDKインストール方法](https://qiita.com/ko2a/items/69fa8a5366d7449500ca)

## ２、拡張機能インストール
`Ctrl+Shift+x`で拡張機能検索画面を開き、`Java Extension Pack`拡張機能を検索してインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/f932ff0e-1251-00d1-ca37-c9fa0579353d.png)

## ３、VSCodeでJavaのパス通す
`Ctrl+,`の組合キーでVScodeの設定画面を開き、`Java.home`と入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/e257bcd6-7dc2-ba75-dd7f-febb5bd2b867.png)

`Settings.json`をクリックして設定ファイルを展開
`java.home`:JDKのインストール先を指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/2264d48a-429c-dce9-209c-90fec7f19d7a.png)
保存して閉じる

## ４、Javaプロジェクト作成
VSCodeで`表示` -> `コマンドパレット`の順番でコマンドパレットを開く
ショートカットキー：Ctrl+Shift+P
`java:`と入力して`java:Create Java Project`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/258378c9-36ff-1040-14a7-b7a28263d2ac.png)
`No build tools`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/efec2ee6-d2b9-1a54-7e3e-8f110dd6da86.png)
プロジェクト保存先を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/eae4051b-4862-ebc8-78ce-8eb646cd7d19.png)
プロジェクトの名前(ここで`HelloWorld`)を入力する -> `Enter`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/9c882cfb-a93f-e577-548c-34b33312e4e2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/352a04cf-440e-daec-8e3a-9713533a5bd0.png)

`HelloWorld`という名前のプロジェクトが作成される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/6c13d1e8-e270-ef70-a1f3-f6a2e772ba80.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/19f5a453-13b5-93b3-552a-063ccf734f99.png)
## ５、プロジェクト実行
左のエクスプローラーから`App.java`を開く
これは自動生成されているmainメソッド記載されているクラス
`実行` -> `デバックなしで実行`を選択してプロジェクトをコンパイルする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/45a18850-ce25-08ee-19f3-d6e59088e0dd.png)


コンソールにはHello, World!で出力されていますよね、

これでJava開発環境構築完了！
Visual Studio CodeでPython開発環境構築

# Visual Studio CodeでPython開発環境構築
今回の記事でVSCodeを利用してPython開発環境構築について説明します。
手順は以下の通りです。

# 1、Anacondaインストール
実はAnacondaの中でもpythonコーディングできるツールはたくさん入っていますが
今回はAnacondaをベースとしてVisual Studio Codeでpython開発方法を説明します。

- Anacondaとインストール方法について以下の記事を参照してください。

 - [より効率よく開発できる！AnacondaでPythonの環境を構築する方法](https://www.creativevillage.ne.jp/72837)

# 2、Visual Studio Codeでpythoｎ開発

## 2.1、普通のpython開発方法

VSCodeを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/b9d27fa9-2a20-4b8f-1cea-400dd9120d07.png)


`ctrl+N`で新規ファイルする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/48a3326b-17fb-6655-a63b-d4ec629f92de.png)
`ctrl+K`-> `M`でpythoｎを選択して、pyファイルを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/0ff105f7-9101-f480-90f1-7dc374633ea0.png)

`ctrl+S`でファイルを保存する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/a98d37a8-7642-c069-e4f1-f7bb115f5e58.png)
以下の例のようにコードを書き、
`メニュー` -> `実行` -> `デバックなしで実行` を選択して実行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/e584ba15-5d78-8e40-d6b6-35482a0f3e1f.png)
`Hello World`が画面にプリントされあればpython実行成功!

## 2.2、Jupyter+python開発方法

上記のように新規ファイルを作成して`ctrl+K`-> `M`でJupyterを選択して、ファイルを保存する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/93cc7343-5894-8a31-911f-f8145e41bc4c.png)
以下の例のようにコードを書き、`緑色の実行ボタン` 押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/f5650165-fbbf-8ffb-b51f-bb1c8cbb050e.png)
`Hello World`が画面にプリントされあればpython実行成功!
CUDA (9.2 ->11)へアップグレード【Windows 10】

##Windows10マシンのCUDA入れ替え備忘録
CUDA10.2のつもりが11になった。

###バックアップ
ProgramFine内のNVIDIA GPUComputing Toolkitフォルダ

### アンインストール
Win10のシステム→アプリと機能　
CUDAの関連アプリだけ削除

###インストール
NVIDIAのサイトからToolKitインストーラをDL（下記サイト）
https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exelocal

推奨DLを実行
###CuDNNのインストール（上書き）
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0
フォルダに
bin
include
lib
を上書き。

####DLサイト
https://developer.nvidia.com/rdp/cudnn-download

###環境変数の設定確認
エクスプローラー「PC」を右クリック
プロパティ→システムの詳細設定→環境変数
すべてｖ11に変更されていることを確認。

##チェック
`$ nvidia-smi`

```
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 451.22       Driver Version: 451.22       CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce RTX 2070   WDDM  | 00000000:01:00.0  On |                  N/A |
|  0%   45C    P8    11W / 175W |    427MiB /  8192MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+
```
`CUDA Version: 11.0`であることを確認。
`nvcc -V`
`Cuda compilation tools, release 11.0, V11.0.167`であることを確認。
## GPU認識チェック
```
$python
>>>from tensorflow.python.client import device_lib
>>>device_lib.list_local_devices()
実行後↓↓↓
physical_device_desc: "device: XLA_CPU device"
, name: "/device:XLA_GPU:0"
device_type: "XLA_GPU"
memory_limit: 17179869184
locality {
}
incarnation: 6902340853559895985
physical_device_desc: "device: XLA_GPU device"
```
ちゃんと認識してました。
CUDA11.0はまた後日チェックしたいと思います。


##参考にさせていただいたサイト
https://dev.infohub.cc/install-cuda-toolkit-10/
https://thr3a.hatenablog.com/entry/20180113/1515820265
Visual Studio CodeでC#プログラム開発環境構築【Mac】

# Visual Studio CodeでC#プログラム開発環境構築

今回の記事でVSCodeを利用してC#アプリケーション開発環境構築について説明します。
手順は以下の通りです。

- １、dotnetフレームワークをインストール
- ２、dotnetプロジェクト作成
- ３、dotnet実行
- ４、VSCodeでC#拡張機能インストール
- ５、VSCode dotnetを実行

## １、dotnetフレームワークをインストール
[ここ](https://dotnet.microsoft.com/download)からdotnetフレームワークをダウンロードしてインストールする
`dotnet -v`コマンドでインストールしたdotnetのバージョンを確認する、
バージョン情報が画面にプリントされあればインストール完了
## ２、dotnet プロジェクト作成
コマンドライン(macはターミナル)で以下のコマンドを実行してdotnetプロジェクトを作成する

     $ mkdir sample
     $ cd sample
     $ dotnet new console

## ３、dotnet プロジェクト実行
次は、以下のコマンドで作成したプロジェクトを実行する
     
     $ dotnet run
     Hello World!
 `Hello World!`が画面にプリントされあればC#プロジェクト実行成功!


## ４、VSCodeでC#拡張機能インストール
VSCode画面から`Ctrl+Shift+x`で拡張機能検索画面を開き、`C#`拡張機能を検索してインストールする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/598a5d01-a50b-f75b-0baa-69610c64f369.png)
インストール完了したら拡張機能が有効になっているかを確認してください

VSCodeから先ほど作成した`sample`フォルダを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/cebf3b6b-ab49-d342-cad6-a844be62c5df.png)

C#のプロジェクトが作られているよね

## ５、VSCodeから dotnetプロジェクトを実行
`メニュー` -> `実行` -> `デバックなしで実行` を選択してプロジェクトを実行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/c3cd08ed-66ad-73b1-42e6-8915cdef181c.png)
`.NET Core` を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/b2ff6deb-cc9c-13b3-e44a-251996e0fa34.png)
ターミナル起動され、
`Hello World!`が画面にプリントされあればC#プロジェクト実行成功!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/96e084d4-2ebd-9c03-aa2a-2e4ccaa658f8.png)
上記でC#プロジェクトの実行構成が構築され
今後のプロジェクト実行では左側の虫のアイコンから実行することができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148710/b677d957-e767-6064-4f31-5266e0288e30.png)

# 終わりに
VSCodeでC#開発環境構築について紹介しました
Matplotlibで指数関数グラフ

#Pythonで指数関数グラフを描画してみた
###　■　a>1の指数関数（１）
<img width="65" alt="スクリーンショット 2020-06-14 12.33.04.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/5487d08a-f157-ca0d-b595-a8af9ce5760d.jpeg">の指数関数を表示するソースコードを作成してみました。
<img width="628" alt="スクリーンショット 2020-06-14 12.25.55.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/c81090a1-b241-528b-0ec0-30432ed225e9.jpeg">

NumpyとMatplotlibを使用してのサンプルを以下に掲載します。

- サンプルPython１

```Python:ExponentialGraph.py
import numpy as np  # numpy の読み込み
import matplotlib.pyplot as plt # Matplotlib の読み込み

# x座標を-10 から 10 まで 0.1 きざみに設定
x = np.arange(-10, 10, 0.1)
# y座標を 指数関数(2の x 乗)として計算
y = 2 ** x

# y座標の範囲を -1 から 20 までに設定
plt.ylim([-1, 25])
# x軸のラベル表示
plt.xlabel('x')
# y軸のラベル表示
plt.ylabel('y', rotation=0)
# x軸とy軸のスケールを揃える
plt.gca().set_aspect('equal')
# グリッド（目盛軸）の表示
plt.grid()
# x, y をプロット
plt.plot(x, y)
# グラフ表示
plt.show()

```
###　■　a>1の指数関数（２）
<img width="77" alt="スクリーンショット 2020-06-14 13.11.44.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/df2a36e9-2d8d-2d2e-5da1-b53235cf24b4.jpeg">の表示も同様に可能です。
<img width="560" alt="スクリーンショット 2020-06-14 13.13.14.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/b775a168-cbe8-3765-2944-d072716c59a1.jpeg">

###　■　0 < a < 1 の指数関数
次の関数もトライしてみたので掲載します。
<img width="80" alt="スクリーンショット 2020-06-14 12.38.09.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/bb1a539d-0d6e-55fa-91ab-a772feb907f3.jpeg">のグラフ
<img width="516" alt="スクリーンショット 2020-06-14 13.28.07.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/981b0301-a9b7-1df3-7e37-97c007421171.jpeg">

- サンプルPython2

```Python:ExponentialGraph_05.py
import numpy as np  # numpy の読み込み
import matplotlib.pyplot as plt # Matplotlib の読み込み

# x座標を-10 から 10 まで 0.1 きざみに設定
x = np.arange(-10, 10, 0.1)
# y座標を 指数関数(0.5の x 乗)として計算
y = (1/2) ** x

# y座標の範囲を -1 から 20 までに設定
plt.ylim([-1, 25])
# x軸のラベル表示
plt.xlabel('x')
# y軸のラベル表示
plt.ylabel('y', rotation=0)
# x軸とy軸のスケールを揃える
plt.gca().set_aspect('equal')
# グリッド（目盛軸）の表示
plt.grid()
# x, y をプロット
plt.plot(x, y)
# グラフ表示
plt.show()
```
#まとめ
MatplotlibとNumpyは数学計算でとても役立つことがわかりました。
いろいろ試してみたいと思います。

- リンク
[指数関数のわかりやすい解説ページ](https://juken-mikata.net/how-to/mathematics/shisuukansuu.html)
【備忘録】NPOIでExcelのシートにパスワード保護を掛ける

# やりたかったこと
とある案件でExcelが改竄されていないか、簡易的にわかるような方策を講じなければなりませんでした。
「それならブックにパスワードを掛ければいいじゃないか！」
と思い立ち、調べ始めたのがきっかけです。

## 結論
…と思って調べ始めたものの、**ブックにパスワードを掛ける方法はわかりませんでした。**
ただし、シートを保護する方法は分かったので、備忘録として残しておきます。

# Apache POI 4.1.2の場合
JavaからPOIを扱ってみたところ、Worksheet、Workbookともにロックを掛けることができました。

```Java:filename.java
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Sample");

WriteCell(sheet, 0, 0, "Hello"); // 参考記事：【C#】NPOIを使ってExcelファイルを作成・編集する

// ワークシートの保護
sheet.protectSheet("password");

// ワークブックの保護
workbook.lockStructure();
workbook.setWorkbookPassword("password", HashAlgorithm.sha256);

// ワークブックの書き出し
var out = new FileOutputStream("C:\\hogehoge.xlsx");
workbook.write(out);
workbook.close();
out.close();
```

生成されたExcelファイル"hogehoge.xlsx"を開けると、確かにロックがかかっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71369/c06be8cd-10a6-461b-8265-2e8368644ffa.png)

# NPOI 2.5.1の場合
Worksheetはロックを掛けることができましたが、Workbookにロックを掛ける方法が見つかりませんでした。
※どなたかご存じの方がいらっしゃいましたら、方法をご教示いただけますと幸いです。

## ワークシートを保護するサンプルコード
POIの場合とほぼ同じです。

```C#:filename.cs
var workbook = new XSSFWorkBook();
ISheet worksheet = workBook.CreateSheet("testSheet1");

worksheet.ProtectSheet("password");  //シートのパスワードを設定
workbook.LockStructure();            //ワークブックの構造を保護(ただしパスワードはかからない)

string srcFileName = @"C:\hogehoge.xlsx";
FileStream stream = (File.Exists(srcFileName))
      ? File.OpenWrite(srcFileName)
      : File.Create(srcFileName)
);
workbook.Write(stream);
```

#

# 課題
そもそもWorkbookの保護を外すソフトが存在している以上、仮にパスワード保護できたとしても完全に改竄を防げるわけではないことに留意が必要です。あくまで簡易的な保護、と考える必要があります。

#参考にした記事や資料
 - [Protect workbook for structure](http://apache-poi.1045710.n5.nabble.com/Protect-workbook-for-structure-td2308447.html) ※結局、未解決のまま終わってますが…
 - [Java POI Documentation XSSFWorkBook](https://poi.apache.org/apidocs/dev/org/apache/poi/xssf/usermodel/XSSFWorkbook.html#validateWorkbookPassword-java.lang.String-)
 - [【C#】NPOIを使ってExcelファイルを作成・編集する](https://qiita.com/hukatama024e/items/37427f2578a8987645dd)

# 編集履歴
(2020.06.20) FileInfoでの暗号化について書いていましたが、当該情報の精査が必要なため、削除しました。
Ubuntu 24.04/20.04 にリモートデスクトップで接続する

# Ubuntu 24.04/20.04 にリモートデスクトップで接続する

## リモートデスクトップ用のソフトのインストール

```
sudo apt -y install xrdp tigervnc-standalone-server
sudo systemctl enable xrdp
sudo systemctl start xrdp
```

## リモートデスクトップを許可する

###  firewalld による方法

```
sudo apt install -y firewalld
sudo firewall-cmd --add-port=3389/tcp  --permanent
sudo firewall-cmd --reload
```

### ufw による方法

```
sudo apt install -y ufw
sudo ufw allow 3389/tcp
sudo ufw enable
sudo ufw status
```

## 参考にしたリンク

https://www.server-world.info/query?os=Ubuntu_20.04&p=desktop&f=6
VCSA7.0のDeploy(インストール)に失敗する

# 事象
ESXi7.0の無償版にVCSA7.0をインストールしようとしましたが、WindowからのDepoyが80パーセントで止まります
どうやら、VCSA6.xで事象をくらった方もいるようで。。
対処として、評価期間中のESXiを用意した模様ですが。。
すでに無償版環境にVMがいたので、再インストールは回避したいかな。。。と。

# 対処
一旦、ESXi7.0の無償版のライセンスを一旦削除すると、VCSA7.0のDeployは成功しました。

# その後
VCSA7.0のDeployとESXiのクラスタ動作を確認後、再度、無償版のライセンスを付与しようとすると「このホストのライセンスは vcenter server で管理されています」のエラーとなります。
無償版のESXiを一旦vCenter serverの配下から登録削除すれば、再度、無償版のライセンスは付与可能となりました。

以上です。
GANの難しさはどこにあるのか

#①　GANの性能評価の難しさ

GANには明示的な損失関数が存在しない。じゃあ一体どうやってGANの性能のよさを評価すればいいのだろうか。

生成されたサンプルの質を統計的に評価できる、二つの性能評価尺度を紹介します。

###1. Inception Score(IS)

この方の[記事](https://drumato.hatenablog.com/entry/2019/03/19/095907)がわかりやすいです。あとこの方が用いてる[具体例](https://www.ams.giti.waseda.ac.jp/data/pdf-files/2017_FIT_H-038.pdf)も。
以下では、この方の[記事](https://qiita.com/kzykmyzw/items/5c4a6c2ee19ddd59e810)が簡潔に纏まっていたので引用させていただきました。

---以下引用---
ISは、GANの性能をどのような観点から測っているかというと、
1. 画像識別器が識別しやすいかどうか
2. 識別先のクラスのバリエーションが多様化どうか
の二つの観点である。

x<sub>i</sub> を生成した画像（iは画像のインデックスで総数は Nとする）、y をラベル（クラス）とすると、上の1. は条件付き分布 p(y|x<sub>i</sub>)のエントロピーが小さくなることを意味する。一方で 2. は、p(y|x<sub>i</sub>)を i について積分した周辺分布 p(y)のエントロピーが大きくなることを意味する。そこで、両分布間の距離を測るためにKLダイバージェンスを用い、これを i について平均化したうえでexpを取ったものがinception scoreである。
![スクリーンショット 2020-06-14 2.06.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/20407a8a-f3eb-8b15-a1e9-3229527fcee6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/55faada5-e75f-a210-2bff-2f9675076330.png)

---引用終了---

ただこのISだと、生成される画像のバリエーションが少ない場合でも、生成期が高性能と判断されてしまう可能性があります。

###2. Frechet Inception Distance(FID)

こちらもGANを評価する際に使用される評価指標である。GANで生成した画像の分布をA<sub>1</sub>、GANで生成したい画像の分布A<sub>2</sub>の距離を計算したのがFID。FIDは値が小さいほど生成画像が良い画像と評価される。

画像の分布A<sub>1</sub>、A<sub>2</sub>の平均ベクトルをμ<sub>1</sub>、μ<sub>2</sub>、共分散行列をΣ<sub>1</sub>、Σ<sub>2</sub>とするとFIDは以下で表される。
![スクリーンショット 2020-06-14 2.42.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/3e2ab1df-09be-c627-823f-63822a1bac4e.png)

#②　訓練の難しさ

[参考記事](https://daiki-yosky.hatenablog.com/entry/2019/04/24/GAN%E3%81%8B%E3%82%89Wasserstein_GAN%E3%81%B8)

GANは明確な目的関数がないので、でのように訓練すればいいかが難しい。
以下では、３つの目的関数を紹介する。

####・MinMax GAN
<img width="718" alt="スクリーンショット 2020-06-14 20.08.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404591/1f240699-69f6-9f16-8f69-b12d0a233e79.png">
形式的に定められたものであり、実際にはうまく動かない

####・NS GAN
数学的な保証はないが実用的なパフォーマンスを発揮する

####・Wasserstein GAN
数学的な根拠もあり、パフォーマンスも優れている
JSD違い、パラメータの最適点付近でも勾配が消失しない。
GANの損失関数を設計し直して、JSダイバージェンスを使っていたところをWasserstein距離に変更することで、学習を高速化及び安定させることができた
こちらの[記事](https://qiita.com/triwave33/items/5c95db572b0e4d0df4f0)がわかりやすいです。

#③訓練での工夫

### 1. 入力の正規化
### 2. バッチ正規化
生成器に用いた場合、時折悪影響を及ぼす
###3. 識別器をより多く訓練する
生成期が何も生成しないうちに、識別器をよく訓練しておく
訓練サイクル内で識別器をより多く訓練する
###4. ReLUではなくLeaky ReLU、max poolingよりave pooling
情報損失を最小限に抑え、情報の流れは正しくし、おかしな誤差逆伝播は避ける。
Dartで空白を除去する方法

phpで例えるならtrimのように空白を除去してくれる関数はないのかとdocumentを見たら、あった。
[api.dart - trim](https://api.dart.dev/stable/2.8.4/dart-core/String/trim.html)

動作確認は
[dartpadでしてる](https://dartpad.dev/)

前後の空白を除去

```dart
void main() {
  const String email = '　example@hoge　';
  print(email.trim());
}

//結果
//「example@hoge」
```

末尾の空白を除去

```dart
void main() {
  const String email = '　example@hoge　';
  print(email.trimRight());
}

//結果
//「　example@hoge」
```

先頭の空白を除去

```dart
void main() {
  const String email = '　example@hoge　';
  print(email.trimLeft());
}

//結果
//「example@hoge　」
```


んで今回はログイン時にメールアドレスを入力するが、その時に入った空白を除去するといったようにしたかったのでこう書いた。

```dart

children: <Widget>[
TextFormField(
  decoration: const InputDecoration(labelText: 'メールアドレス'),
  onChanged: (String value) {
    setState(() {
      email = value.trim();
     });
    },
 ),

```
(解決済み)codeigniterでコマンドライン(cli)やcronだけログ出力されなくてハマった件

# codeigniter3 で のに、log_message()でログ出力されなくてハマった。

### apache経由のアクセスは log_message('error','test')でログ出力OK

### しかし、shellなどコマンドラインcliやcronだと、log_message('error','test')でログ出力NG

## 設定ファイル config.php の ログ関連設定をチェック
`$config['log_threshold'] = 1; // 'error'だけ表示される
$config['log_path'] = ''; // application/logsに出力される
$config['log_file_permissions'] = 0644;`

## ログ出力ディレクトリ application/logs の パーミッションチェック
777 ok

## エラー設定もチェック
`ini_set('display_errors', 1);
error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT & ~E_USER_NOTICE & ~E_USER_DEPRECATED);`

## おわかりだろうか？（原因判明）

###ちゃんと出力されているサイトと比較してみたら、
###shellなどコマンドラインcliやcronのログ出力
NGサイト
`$config['log_file_permissions'] = 0644;`
OKサイト
`$config['log_file_permissions'] = 0666;`

## ログ出力時のパーミッションがトラブル原因だった。

### apache 経由でその日に初回アクセスしたら、apacheでしか追記できないログになってた。

### shell実行したユーザやcronユーザでその日に初回実行したら、apacheで追記できないではないか

昔は気にしてたけど、フレームワーク使うようになって忘れてた。てへ。

# 結論 設定ファイルでログ出力時のパーミッションを全員書き込み可能にしよう`$config['log_file_permissions'] = 0666;`

こんなので何日もハマるんだよな。このサイト開発３年目だったのにずっと気づかなかった。。。
誰かに届けっ
railsでチェックボックス作成時にはまったエラー

# railsでアプリを作成時に下記のエラーが出た
`ActiveRecord::NotNullViolation: Mysql2::Error: Field ‘place’ doesn’t have a default value: INSERT INTO 'categories'`

検索機能を実装しようとした際に出たエラーである。
中間テーブルを作成し、チェックボックス実装のためにseedファイルに初期データを記述し、rails db:seedでDBにデータを投入しようとしたところ出現した。

categoryテーブルに「kind」と「place」の２個の値を設定し、それぞれに`null: false`を記述していたのが原因だった。(下記参考)
https://wa3.i-3-i.info/word16591.html

`null: false`を削除し、下記のコマンド(DBのリセットと再投入)を実行したところ解決した
`$./bin/rails db:migrate:reset`



追記
下記のエラーも同時に発生していた。
`ActiveRecord::RecordInvalid: バリデーションに失敗しました: メールアドレスはすでに存在します。`
seedファイルに書いたuserのサンプルデータを投入するためのコードが再度実行され、それ以降のコードがデータがに反映されていなかったようだ。
サンプルユーザー投入用のコードを最後尾に移動したらえらーは発生しなくなった。
【α版】Selenium4のEdgeDriverでChromium版MicrosoftEdgeを動かす


<font color='red'>**2021/11/07 Selenium4が正式リリースされたので新たに記事を書きました**</font>
<font color='red'>こちらの記事を参考にしてください：</font>
[【正式版】Selenium4のEdgeDriverでChromium版MicrosoftEdgeを動かす（IEモードもできるよ♪）](https://qiita.com/yk109/items/f16cabb9be7064f49f94)

以下、Selenium4のα版という前提の下お楽しみください。
#はじめに
以前こんな記事を書きました：
>[【SeleniumのChromeDriverでChromium版MicrosoftEdgeを動かす】](https://qiita.com/yk109/items/3054cae9591f7fee8c2b)
ブラウザ自動テストのデファクトスタンダードである`Selenium`
そして正式リリースされた`Chromium版MicrosoftEdge`
はたして`ChromeDriver`を使ってChromium版MicrosoftEdgeを操作することができるのか？

が、色々と状況が変わったので改めて整理しなおしてみました！

※動かせた時の感動は省略
変わったポイントは以下：

* `Selenium 4` を使いましょう ※`NuGet`で取得可能（2020/06/14 時点で`4.0.0-alpha05`）
* `Selenium.WebDriver.MSEdgeDriver` を使いましょう ※`NuGet`で取得可能（2020/06/14 時点で`83.0.478.37`）
* コーディングも自然な感じに実装できるようになりました！ ※後述

参考文献：[Use WebDriver (Chromium) for test automation](https://docs.microsoft.com/en-us/microsoft-edge/webdriver-chromium?tabs=c-sharp)

##ちなみに
以前書いた記事のやり方だと、こんな例外が出るようになってしまいました：
>System.InvalidOperationException: session not created: No matching capabilities found (SessionNotCreated)

#やったこと
##`Chromium版MicrosoftEdge`の取得
[こちら](https://www.microsoft.com/en-us/edge?icid=SMC-IA-4501095)からダウンロード＆インストール

##NuGet
`Selenium`系の参照
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432322/d6b322b3-ce88-ffb6-0d7f-822940584d27.png)

###注意
+ `Selenium 4`はα版なので、Visual Studio の場合「✅プレリリースを含める」にチェック入れる必要があります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432322/45dac4ca-70e7-aab1-79da-f6c0a62a0d3c.png)

+ お手元の `Edge` のバージョンに対応した `driver` を取得する必要があります。
 - MsEdgeでこのURLを叩けばOK：[edge://settings/help](edge://settings/help)
 - より高いバージョンのEdge（β版など）を動かしたい場合は[こちら](https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/)から`msedgedriver`をダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432322/b8bb51fe-2a19-6091-cbb6-0dd53bef4873.png)

##ソース
ポイントは2つ

* `EdgeDriver` クラスを使用する
* `EdgeOptions` で、`UseChromium = true` とする

[以前書いた記事](https://qiita.com/yk109/items/3054cae9591f7fee8c2b#%E3%82%BD%E3%83%BC%E3%82%B9)と比較すると、より自然な実装ができるようになりました。嬉しい！
ヘッドレスモードも画面ショットも問題ないですよ！

```csharp
var options = new EdgeOptions
{
    UseChromium = true
};

// Headlessモードはこんな感じ：
//options.AddArgument("--headless");

using (var driver = new EdgeDriver(options))
{
    var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 5));

    driver.Navigate().GoToUrl("https://www.google.com");

    var q = driver.FindElementByName("q");
    q.SendKeys("Chromium");
    q.Submit();

    wait.Until(ExpectedConditions.TitleIs("Chromium - Google 検索"));
    ((ITakesScreenshot)driver).GetScreenshot().SaveAsFile($"{DateTime.Now:yyyyMMddHHmmss}.png");
}
```

#おわりに
* `Selenium 4` がんばれ！早く正式版になってくれ～！
bundle installでmysql2がインストール失敗する

色々調べてもすぐに出てこなかったので、残しておきます。

# 環境
|環境|バージョン|
|--:|--:|
|Mac|10.15.5|
|Ruby|2.6.3p62|
|Mysql|5.7.29|

# エラー
```
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2
```

# やった事
```
bundle config --global build.mysql2 --with-opt-dir="$(brew --prefix openssl)"
```
Java Silver 勉強1日目



はじめまして。snbmsn03です。

目下目標：Java SE8 Silver 合格
実務経験：C# 1年



### 勉強方法

こちらの問題集を購入しました。
> text徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応   志賀 澄人 
https://www.amazon.co.jp/dp/4844339931/ref=cm_sw_r_tw_dp_U_x_N3y5EbAHQYKDT @amazonJPより 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470434/8e2843d7-627a-8d94-9983-5c9fedf08daf.png)

自分の理解度の確認、アウトプット目的のため、
どんな人が読むかは特に決めずに書いていきます。
同じようにJava Silverを勉強している人が見つけて参考にしてもらえたら嬉しいな、程度です。

もし間違い等ございましたら、お手数ですがご指摘いただけますと幸いです。


###Javaのfinal修飾子
- 付けられる箇所：クラス、メソッド、変数すべて
 - クラスの場合：継承の禁止
 - メソッドの場合：オーバーライドの禁止
 - 変数の場合：再代入の禁止
<br>
<br>

- 理解したこと
 - 変数だけじゃなくクラスやメソッドにも使える
 - C#でいうconstと似ている
 - C#でいうconstとは若干違う？(まだ理解しきれていないので引用元張り付けるだけ)
(https://seesaawiki.jp/w/noboru2004/d/Java%20%A4%CE%20final%20%A4%C8%20C%20%A4%CE%20const%20%A4%CE%B0%E3%A4%A4%A1%A3)

###switch - case文でcaseに入れられる型の制限
- 入れられない型がある
 - float,double,boolean



###if文の条件の後の{}中かっこは省くことができる
- 省いたら次の1文だけ条件式trueだった時の処理、という扱い
- 可読性が低くなるので{}中かっこは入れるべき
【Grails】設定領域とapplication.ymlの設定項目について

最近、仕事でGrailsを使う機会があって、公式ドキュメント読んでいたのでConfig関係について、書く（自分用の備忘録も含めて・・・）
#Grailsの設定領域
主にビルドの設定とランタイムの設定の2つの領域に分かれている

ビルド設定は一般的にGradleとbuild.gradleで行う。
ランタイム設定は、デフォルトでは grails-app/conf/application.yml ファイル内で行われる

※Grails 2.0スタイルの設定を使用したい場合は、GroovyのConfigSlurper構文を使用して設定する。
なおGrails 2.0スタイルには2つの設定ファイルが用意されている
・grails-app/conf/application.groovy 
・grails-app/conf/runtime.groovy
アプリケーションクラスに依存しない設定は、application.groovy、
アプリケーションクラスに依存する設定は、runtime.groovyを使用。

#application.ymlの設定項目

###grails.enable.native2ascii 
Grails i18nプロパティファイルのnative2ascii変換を必要としない場合は、これをfalseに設定（デフォルト：true）。

###grails.views.default.codec 
GSPのデフォルトのエンコーディング体制を設定
'none'、'html'、または'base64'（デフォルト：'none'）のいずれか。XSS 攻撃のリスクを減らすためには、これを 'html' に設定。

###grails.views.gsp.encoding 
GSP ソース ファイルに使用されるファイル エンコーディング (既定値: 'utf-8')。

###grails.mime.file.extensions 
Content Negotiation で MIME タイプの判定にファイル拡張子を使うかどうか（デフォルトは true）。

###grails.mime.types
コンテンツネゴシエーションで使用する、サポートする MIME タイプのマップの設定。

###grails.serverURL 
絶対リンクのサーバーURL 部分を指定する文字列で、サーバー名を含む。
この設定はリダイレクトでも使用される。
[詳細はドキュメント参照](http://gsp.grails.org/latest/ref/Tags/createLink.html)

###grails.views.gsp.sitemesh.preprocess 
SiteMesh の前処理を行うかどうか。
無効にするとページのレンダリングが遅くなるが、GSP ビューから生成された HTML を SiteMesh でパースする必要がある場合は、これを無効にする。

###grails.reload.excludes と grails.reload.include 
これらのディレクティブを設定することで、プロジェクト固有のソースファイルのリロード動作を決定する。
それぞれのディレクティブは、開発中のアプリケーションを run-app コマンドで実行する際に、リロード動作から除外するか、または含めるべきプロジェクトのソースファイルのクラス名を表す文字列のリストを受け取る。
例えばgrails.reload.include ディレクティブが設定されている場合は、そのリストに含まれるクラスのみがリロードされる。
（grails.reload.excludesは逆に、含まているクラスを除いて、その他をリロードする）

#おまけ
###application.ymlの設定の読み込み
実行時の設定、つまりapplication.ymlで定義されている設定を読みたい場合は、コントローラやタグライブラリで変数として利用できるgrailsApplicationオブジェクトを使用する。
grailsApplicationオブジェクトのconfigプロパティは、Configインターフェースのインスタンスであり、
設定を読み取る多くのメソッドを提供している。
例えば、getPropertyメソッドは、プロパティ・タイプ(デフォルトのタイプはString)を指定したり、デフォルトのフォールバック値を提供したりしながら、コンフィギュレーション・プロパティを効率的に取得するのに便利。

実行時に動的に設定にアクセスすることは、アプリケーションのパフォーマンスにわずかな影響を与える可能性がある。
別のアプローチとしては、GrailsConfigurationAwareインターフェースを実装する方法がある。
こっちについては気が向いたら追記 or 記事投稿します。。。
天気電光掲示板にギミック追加

# どんな内容か？
@103yen さんが、WioTerminal用の素敵なプログラム（[WioTerminalで天気予報電光掲示板を作った](https://y99.hateblo.jp/entry/2020/05/22/211736)）を公開してくださったので、少しギミックを加えてみた話です。少し私の環境では上手く行かなかった部分や、他のハマった内容などもあったので記事にしています。
<img width="640" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143415/3031066a-17de-7620-20a4-d057a2e21919.png">

# 加えたギミックとは？
横浜相鉄線沿線にお住まいの方で、通勤・通学でご利用された経験のあるかたは、この電光掲示板を何度も目にされたことがあると思います。私もお世話になっておりますが、最近はその役割も終えつつあるようです。昔ながらの電球を使っているタイプのようで、電球の寿命が短くてドット落ちが頻繁に発生します。こちらの「[はまれぽ](https://hamarepo.com/story.php?page_no=1&story_id=859)」という地方誌で詳しく説明されています。
ということで、@103yenさんのコードをベースにこの電球欠けのギミックを追加しました。どんどん欠けていくと訳が分からなくなるので、電球交換も簡単にできるようにしています。
<img width="640" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143415/150b7ea4-d1cd-1172-eb9a-7e22428e1f0f.png">
こちらの写真で、少しドットが欠けているのが分かると思います。右はそろそろ電球交換ですね。

簡単な動画を作成しました。（８倍速で欠ける様子が分かるかと思います。）
[![動画がみつかりません](http://img.youtube.com/vi/e7SsDv8b-qU/0.jpg)](http://www.youtube.com/watch?v=e7SsDv8b-qU)

# 内容
加えた内容は３つです。
・通信がHttp1.0だと上手く動かなかったのでHttp1.1に変更した
・ディスプレイに画像を表示する都度、ランダムにどこか一点が欠けていく。
・Aボタンを押すと復活する。

コードは、[Github](https://github.com/carcon999/WioTerminal-WeatherSign)からダウンロードが可能です。

# ハマった内容１（無線モジュールの更新が必要）
ハマったって程ではありませんが、手間だっただけです。
WioTerminalの説明にも記載はされていますが、最初にWiFi機能を利用するためには、内蔵無線モジュールRealtek RTL8720のファームを最新に変更する必要があります。
やり方は、@jksoft さんが日本語で解説してくれています。[Wio TerminalをWi-Fiに繋ぐ](https://qiita.com/jksoft/items/cb11eb171002c0ed1f25)
本家のサイトは、[こちら](https://wiki.seeedstudio.com/Wio-Terminal-Network-Overview/)にあるのですが、ファームウェアのVersionが更新されていますので、最新版を使うようにします。詳細な手順はそちらを参照ください。

簡単な手順としては、
- USB経由でRTL8720が書き換えられるようにWioTerminalのプログラムを変更する。
- 外部ツール（Image Tool）を使い、RTL8720のファームを更新する。（一度削除してから、書き込みする）
- Wi-Fiを利用するためのライブラリ６個を入れる。

# ハマった内容２（無線接続が上手く行かない？）
上記で、ファームの更新などを行っているので、上手く更新できてるのか気になります。
ネットワークに接続して、接続確認するとDHCPでIPアドレスが割り当てられるはずなのですが、そのIPが不正なアドレスを返却するように見えます。
IPだけでなく、Macアドレスも上手く見れないようなので、ライブラリに不具合がありそうです。

```c
 //print the local IP address
  ip = WiFi.localIP();
  Serial.println(ip);
```

ただ、このlocalIPで値が取得できないだけで、内部ではIPアドレスが割り当てられて動作しているようなので、気にしなければ大丈夫です。私は、DHCPが悪い？とかいろいろ調べて時間がかかりました。

# ハマった内容３（Http1.0 → Http1.1）
通信する際に、天気の情報をライブドアの[WeatherHacks](http://weather.livedoor.com/weather_hacks/)を利用していますが、Http1.0で情報取得すると無視されるようで、Http1.1を指定することで安定した通信ができるようになりました。ファームの問題とHTTPの問題と切り分けを行うのに時間がかかってしまいました。

```c
  tft.println("Request " API_RESOURCE);
  // Make a HTTP request:
  client.println("GET " API_RESOURCE " HTTP/1.1"); // HTTP/1.0だと応答が来ないようだった。
  client.println("Host: " API_SERVER);
  client.println("User-Agent: WioTerminal/1.0");
  client.println();

```

# 最後に
これで、無線接続もWioTerminalでできそうなことが分かりましたが、無線通信にはまだ不具合もあるようなので安定動作にはもう少し時間がかかるかもしれませんね。
@103yen さん素敵な作品ありがとうございます！

以上です。
Python3: coreserver で mysql  を使う

coreserver は共用サーバーなので、色々と制約があります。root は使えません。

ライブラリーのインストール

```bash
mkdir my-space
python3 -m pip install mysql-connector  --target ~/my-space
Collecting mysql-connector
```

サンプルプログラム

```py:server_version.py
#! /usr/bin/python3
#
import sys
#
sys.path.append('/virtual/example/my-space')
import  mysql.connector
print ("*** start ***")
#
host_aa='localhost'
user_aa ='scott'
password_aa = 'tiger'
data_base = 'city'
conn = mysql.connector.connect(user=user_aa, password=password_aa, \
                              host=host_aa,database=data_base)
#
cursor = conn.cursor()
#
cursor.execute("SELECT VERSION ()")
#
row = cursor.fetchone()
print(row[0])
#
cursor.close()
conn.close()
#
print("*** end ***")
```

実行結果

```text
$ ./server_version.py 
*** start ***
5.7.29-log
*** end ***
```
【AzureAD】AIPを利用して転送防止の設定を試してみた

Azure Information Protectionを利用して、メール転送防止の設定を試してみました

会社の機密文章とか大事なメールを
転送防止させないように出来るのか試してみたいと思います

#AIPの設定
AIPはデフォルトでは実装されてないので、作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/2738e71f-fa80-8766-7cc5-d46917873862.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/7e56f06d-1152-c816-f652-d4d7eb2b6f9c.png)

AIPの画面でポリシーを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/68588678-8098-67fd-c28c-7db68cd80b30.png)

ポリシー名とポリシーの説明を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/02b4103e-d296-ba69-ba4f-a409069a8f9a.png)

転送不可を"オン"にします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/c8f826b9-3954-cb4b-ccdd-90f721d91dca.png)

ポリシーが作成されました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/8baae3cc-49c7-1219-da64-9e07bd5c12e4.png)

#テスト

メールを見てみると転送不可が増えています。
本当に転送できないのか試してみます

"転送不可"を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/f774d12a-d4b4-1aab-a248-b7e0198cfbf2.png)

おおっ転送不可と表示されました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/81262f3f-d151-4d50-1d21-0fc1dee55cba.png)

メールを送信してみると。。。。
んー何か想像しているのと違う結果になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/7f6d3389-a1ea-9903-133c-80613f691a4d.png)


色々調べてたらそういえばAIPの保護をアクティブ化してなかったみたいです。。
アクティブ化しないとAIPは利用できないみたいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/0f1fe044-7151-a472-93e6-48d703101336.png)

アクティブ化しました。再チャレンジです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/f78db3b9-8f88-dc89-54d3-d8ef12f54b63.png)


outlookのデスクトップアプリで送信されたメールが転送できないのか転送ボタンを押してみると以下のメッセージが表示されブロックされました。
画像キャプチャを取ろうとしたんですが、転送防止しているメールは画像取れませんでした。
これも制御なのかな。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/ddad3209-a5be-c4c7-f4dc-5eca31f9b356.png)

OWAはどうでしょう。
転送マークを選択できないようになってますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/e62790fd-9531-bfe3-1dec-67c70bd94ca6.png)

gmailだとどうなるのか見てましたがGmailでも制御できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/9a410dba-0a45-f705-d797-f83627a0c61f.png)


なんとなく動きが分かりました。

AIPは色々制御できそうなので、もうちょっといじってみようと思います。
同一と同値について

今回はJavaにおいて「同じ」という概念についての話です。

# 同じという言葉の2つの異なる意味
- 同じインスタンスを参照していること
- インスタンスは異なるけれど、値は同じであること

前者を「同一」であると呼び、後者を「同値」であると呼びます。

# 同一について
```java
Object hoge = new Object();
Object huga = hoge; //hogeの参照をコピーしてhugaに代入
```
このとき、hogeとhugaは同一である、と言います。
同一性の判定は ==演算子で判定します。

例えば、

```java
Object hoge = new Object();
Object huga = new Object();
huga = hoge;
```
としても、hogeとhugaは同一ではありません（異なるインスタンスだから）。

# 同値について
```java
public class Cat{
  private String name;
  public Cat(String name) {
    this.name = name;
  }
}
```
というクラスを使って、同じnameの値を持った2つのインスタンスを作成します。

```java
    Cat hoge = new Cat("neko");
    Cat huga = new Cat("neko");
```
前項で述べたようにこの2つのインスタンスは参照先が異なるので同一ではありません。しかし、それぞれの参照先は同じ値を持っています。
このような状態をhogeとhugaは同値である、と言います。

**同値性の判定は ==ではできません。**hoge==hugaとするとfalseが返ってきます。
# 同値性の判定
同値性の判定にはequalsメソッドを使います。**ただし、Objectクラスに定義されているequalsメソッドは同一性を確認する実装になっています。**

```java
public boolean equals(Object obj){
  return (this == obj);
}
```
したがって、異なるインスタンスどうしが同じ値を持っているかどうか（同値かどうか）は、**equalメソッドをオーバーライドすることで判定します。**

```java
public static class Cat {
    private String name;
    public Cat(String name) {
      this.name = name;
    }
    public boolean equals(Object obj) {
      if (obj == null){
        return false;
      }
      if (obj instanceof Cat){
        Cat cat = (Cat) obj;
        return cat.name == this.name;
      }
      return false;
    }
  }
```
とすれば、hoge.equals(huga)などとすれば同値性を判定できます。
ちなみに、equalメソッドのオーバーライドの書き方によって、複数の値を持つクラスで、どちらか片方の値が一致すれば同値とみなす、という判定もできます。

#文字列リテラルの同一、同値について
String型は参照型のデータ型ですが、インスタンスは文字列リテラル（""で囲む）だけで作ることができます。
**この文字列リテラルで作られたインスタンスは例外で==演算子で同値性の判定をすることができます。**

```java
public static void main(String[] args) {
    String a= "neko";
    String b = "neko";
    System.out.println(a == b); //trueで返ってくる
  }
```

これは文字列リテラルが定数値としてインスタンスとは異なる定数用のメモリ空間に作られ、参照を使い回しするための「コンスタントプール」という仕組みがあるためです。

ただし、これは文字列リテラルを使用した時のみなので、Sring型の変数をnew演算子で作った場合は==演算子で同値性の判定はできません。

#参考文献

徹底攻略Java SE11 Silver問題集
AWSにファイルをアップロード＆ダウンロード

![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) 　AWSとローカルPCで今すぐファイルをやりとりしたい
##やること

AWS(Lightsail)の中にあるファイルを手元のPCへダウンロード、
逆に手元のファイルをAWSにアップロードします。

##環境

- AWS Lightsail
- Macのターミナル

### PCからAWSへのアップロード


```Console:
scp -i ＜プライベートキーのパス＞ -r ＜AWSのログイン名＞@＜AWSのパブリックIP＞:＜AWS上のファイルのパス＞ ＜ダウンロードファイルを格納するPC上のディレクトリのパス＞

例）
scp -i ~/.ssh/LightsailDefaultKey-XX-XXXXXXXX.pem -r bitnami@X.XXX.XXX.XXX:/home/bitnami/XXXX/xxxxxx.xxx /Users/XXXXXX/XXXXX/
```

### AWSからPCへダウンロード

```Console:
scp -i ＜プライベートキーキーのパス＞ -r ＜アップロードしたいファイルのPC上のパス＞ ＜AWSのログイン名＞@＜AWSのパブリックIP＞:＜ファイルを格納したいAWS上のディレクトリのパス＞ 

例）
scp -i ~/.ssh/LightsailDefaultKey-XX-XXXXXXXX.pem -r /Users/XXXXXX/XXXXX/bitnami@X.XXX.XXX.XXX:/home/bitnami/XXXX/xxxxxx.xxx
```

### AWSのIPアドレスの調べ方
AWSのサービスにログインして、インスタンスを選び、「ネットワーキング」を選択。

### プライベートキーの調べ方
AWSにSSHで接続していればすでに取得しているはず。
AWSのサービスにログインして、インスタンスを選び、「接続」の項目のページの下の方に「デフォルトのプライベートキーは、アカウントページ からダウンロードできます。」と書いてあるのでその文章をクリック。
【エラー備忘録・ターミナル原因】vscodeターミナルのbundle installでハマった

##環境

mac
vscode
rbenv

##エラーの状況
vscodeのターミナルで`rails  new`したときの`bundle install`でエラーが発生。エラーが表示されたターミナルを閉じたため正確なエラー全文は分からないが以下のようなエラー。

```
ArgumentError: user .rbenv doesn't exist

rakeがinstallできない

Gemfileにgem 〇〇がありませんよ
↑〇〇は、Gemfileのrails下にあるgemが表示された。
個別にそのgemをinstallしてbundle installし直すと、
その次にあるgemがないと表示されループに。
```

##原因

以下の写真のようにvscodeのチェックを外せば直った。

<img width="1016" alt="スクリーンショット 2020-06-14 10.40.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344711/c8a41737-c62d-8788-7330-2c1c12bdc686.png">

##経緯

rbenvの何かがおかしいのか？
→`which ruby`や`which bundle`で実行しているファイルを確認しても、rbenv内で実行しているのでおかしな点はない。

pathは？
→`echo $PATH`で確認。pathもおかしなところはなさそう。

ググる。
→文字コードが原因の引数エラーはあっても、`user .rbenv doesn't exist`という内容のエラーは見当たらない。公式見ても関係のある物は見当たらない。

bundleのエラー箇所のソースを確認

```ruby:bundler.rb
def which(executable)
 if File.file?(executable) && File.executable?(executable)
   executable
 elsif paths = ENV["PATH"]
   quote = '"'.freeze
   paths.split(File::PATH_SEPARATOR).find do |path|
   path = path[1..-2] if path.start_with?(quote) && path.end_with?(quote)
→  executable_path = File.expand_path(executable, path)
   return executable_path if File.file?(executable_path) && File.executable?(executable_path)
  end
end
```

>expand_path(path, default_dir = '.') -> String[permalink][rdoc]
path を絶対パスに展開した文字列を返します。 path が相対パスであれば default_dir を基準にします。
先頭の ~ はホームディレクトリ(環境変数 HOME が使われます)に、 ~USER はそのユーザのホームディレクトリに展開されます。
ruby2.7.0リファレンスマニュアルより

やっぱりpathがおかしい？
もしかして.rbenvがユーザーだと思われているからおかしくなっている？
もう一度pathを確認
→よく見ると、同じpathが形を変えていくつもある（絶対pathだったり~で示していたり）。`~.rbenv`と、~の後に/がついていないものがあったので、試しに付けてみる。`~.zshrc`を修正し、`source .zshrc`で読み込んで`echo $PATH`で確認。同じpathがいくつか増えてる。なんで？試しに何もしないでもう一度`source .zshrc`。また増えてる。するたびに増えるものなの？

何となくmacのターミナルを使用してpath確認
→重複を除いたpathだけが表示される。vscodeのターミナルと設定が環境が違う？試しにmacターミナルから`rails new`。普通にできた。

vscodeでできないの？ググる
→https://yuki.world/vscode-terminal-python/
vscode設定いじればできそう。

できました。
im2colのy:y_max:Sとx:x_max:Sの図示

「ゼロから作るDeep Learning」にim2colという画像形式を行列形式に変換する関数があります。
4次元の画像形式imgを6次元の形式colに変換して後にcolをreshapeして行列形式にしています。
col[:, :, y, x, :, :] = img[:, :, y:y_max_S, x:x_max:S]を理解するために図を描きました。

なお、記号の意味と用いたソースコードを以下に示します。画像数はN=1、チャネル数はC=2、フィルタは3×3(FH=FW=3)、フィルタが重なるようにストライドは2(S=2)、画面は縦と横が異なるH=5、W=7、パディングはなし(P=0)としました。出力は2×3(OH=2、OW=3)となりました。

![TT20002-a01p20(20200614)凡例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374192/be3a604e-ba0c-f060-280c-212c69628c98.png)
![TT20002-a01p21(20200614)コード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374192/a4b4244a-93af-f788-0aea-b3e68b7122fd.png)


以下の図は、forループの最後であるx=2、y=2におけるimgからcolへの変換を示します。
x_max = x + S*OW = 2 + 2*3 = 8
y_max = y + S*OH = 2 + 2*2 = 6  
x:x_maxとy:y_maxでimgを囲んだ範囲を黄色で示します。ストライドS=2のため、imgから取り出す要素は、赤字および緑字で示すx=2,4,6とy=2,4であり、colのy=2、x=2に対応した黄色で示す範囲にコピーします。
なお、x_max=8とy_max=6は、imgのx側の範囲[0:7]、y側の範囲[0:5]を超えていますが、colにコビーする対象として参照していないため、問題にはなりません。
![TT20002-a01p22(20200614)代表例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374192/7e24cdf0-c49e-d4d9-0666-856507e1c6d5.png)

参考までに全体を以下に示します。  
・ y=0の部分
![TT20002-a01p23(20200614)全体1of3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374192/473d615b-72f1-60ed-abea-40e51da710e9.png)
・ y=1の部分
![TT20002-a01p24(20200614)全体2of3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374192/9be619a5-12ff-5e75-a98c-a2abfecc5e6f.png)
・ y=2の部分
![TT20002-a01p25(20200614)全体3of3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374192/fa223247-f2f4-db3a-9c98-e292644c4fd5.png)
以 上
【試験合格記】認定Kubernetes管理者（CKA-JP）

お疲れさまです。
表題の試験に合格したため記録として残したいと思います。

# 結果
合格

# スコア
77% / 74%

# 出題範囲

|分野|名称|割合|
|:-----------------|:-------------------|:-------------------|
|1|アプリケーションライフサイクル管理|8%|
|2|インストール、構成、および検証|12%|
|3|コアコンセプト|19%|
|4|ネットワーキング|11%|
|5|スケジューリング|5%|
|6|セキュリティ|12%|
|7|クラスターのメンテナンス|11%|
|8|ロギング/モニタリング|5%|
|9|ストレージ|7%|
|10|トラブルシューティング-|10%|

# 事前知識
GCP上でGKE(Google Kubernetes Engine)の構築、保守、CI/CD、HPA、監視、トラブルシューティングをしていました。
また、ローカルマシン上でMinikubeを用いたハンズオンをいくつかクリアしています。
今回の試験学習にかけた時間はおおよそ1.5ヶ月ほどだと思います。

# 所感
試験概要は他の方々が詳細な記事を書いているので割愛します。
試験当日までの準備や雰囲気はこちらの方の記事が非常に参考になりました。
https://reboooot.net/post/cka/

以下個人的な感想です。
まず、試験に合格したことは嬉しいんですがスコアの通りギリギリでした。
それもCKAにおいてコアとなるクラスタ関連の問題に全滅したにも関わらず、この結果なので納得はしていません。
正直、今の出題傾向であれば合格ラインは85%あたりが妥当ではないかと感じました。
※CKAは Version.2020 が今年の9月頃にリリースされる予定なので改善されるはず

試験対策としては「[Candidate Handbook](https://training.linuxfoundation.org/wp-content/uploads/2020/02/Hyperledger-Fabric-Candidate-Handbook-v1.9.pdf)」「[Curriculum](https://github.com/cncf/curriculum)」を熟読した上で、Udemyの「[Certified Kubernetes Administrator (CKA) with Practice Tests](https://www.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/)」をカンペ無しで完走できるまで繰り返しました。
上述した通り、ただ合格するだけならUdemy頼りでもなんとかなると思いますが、管理者としての力量に自信を持ちたいのであれば、クラスタ構築とトラブルシューティングに関する造詣を深めておくほうがより安全だったと反省しています。

加えて、実際の試験で「CKA-JP」を選択すると日本語で出題されますが、例のごとく読解能力を要する文章でしたので、下手に焦って問題を解こうとすると足元をすくわれる可能性があると思います。

# 受験者に向けたアドバイス
- まずはUdemyを完走してみる(HintやAnswerがあるので知識がなくてもなんとかなる)
- わけがわからない問題やコマンドは本やウェブサイトで理解できるまで調べる
- Udemyを周回する前に、各トピックに関連する「[kubernetes.io](https://kubernetes.io/docs/home/)」のページをブックマークし、整理する
- 問題の内容とブックマークしたページやコマンドを頼りに問題解決できるようにする
- 「[Kubernetes The Hard Way](https://github.com/kelseyhightower/kubernetes-the-hard-way)」は面倒でも必ず何度かやって、特定の不具合を解消するための選択肢を頭に入れておく(重要)(戒め)
- PodやDeploymentをコマンドだけで迷わず作成することができれば時間にはだいぶ余裕が生まれるはず
- 身分証明書にパスポートを用意する必要はなく、免許証だけでも問題なかった
- 試験開始までのやり取りは英語だが、直前まではGoogle翻訳などを開いてやり取りしても何も言われない

# まとめ
合格記事なのに自分への反省に終始した内容となっています。
この反省は、合格という結果を意識せず再学習することで払拭して次のCKAD試験に望みたいと思います。

良かった点としては、実運用では限られたパラメータのみでもKubernetesの運用までは進めますが、細かいパラメータやリソースの挙動を手を動かして理解できたのは今後に役立つと確信しています。
でもやっぱりGKEやEKSのようにマネージドではないKubernetesの管理はやりたくないなぁと強く思いました。(難易度が跳ね上がる)
[React] useStateをどう使うか(配列、オブジェクト)


## オブジェクトや配列に対して、useStateをどう使うか

Objectの分割代入を使う。
[MDN:分割代入](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Object_destructuring)

#### オブジェクトの場合

```react

const [member, setMember] = useState({ name: "", part: "" });

//オブジェクトを分解して、nameの値を更新する(分割代入)
setMember({ ...member, name: e.target.value });

//こう書くと、その時の他の値を消してしまう。この場合だと、partが消えてしまう
setMember({ name: e.target.value });
```

```react
import React, { useState } from "react";

const Member = () => {
  const [member, setMember] = useState({ name: "", part: "" });

  return (
    <>
      <p>My name is {member.name}</p>
      <p>My part is {member.part}</p>
      <form action="">
        <div>
          <input
            type="text"
            value={member.name}
            onChange={(e) => {
              // オブジェクトを分解して、nameの部分だけ新しい値をセットする
              setMember({ ...member, name: e.target.value });
            }}
          />
        </div>
        <div>
          <input
            type="text"
            value={member.part}
            onChange={(e) => {
              // オブジェクトを分解して、partの部分だけ新しい値をセットする
              setMember({ ...member, part: e.target.value });
            }}
          />
        </div>
      </form>
    </>
  );
};

const App = () => {
  return (
    <>
      <Member />
    </>
  );
};
```

####配列の場合
同様に分割代入を利用する

```react
const Members = () => {
  const [members, setMembers] = useState([]);

  const newMember = () => {
    setMembers([
      ...members,
      {
        id: members.length,
        name: Math.random() > 0.5 ? "猫派" : "犬派",
      },
    ]);
  };

  const deleteMember = (id) => {
    setMembers(members.filter((_, i) => i !== id))
  }

  return (
    <>
      <button onClick={newMember}>JoinMember</button>
      <ul>
        {members.map((member) => (
          <li key={member.id}>
            {member.name}
            <button onClick={() => deleteMember(member.id)}>削除</button>  
          </li>
        ))}
      </ul>
    </>
  );
};

const App = () => {
  return (
    <>
      <Members />
    </>
  );
};
```
docker-composeでreact環境構築(更新版)


## 概要
[docker-composeでReact環境構築](https://qiita.com/kerochelo/items/1063da8893026de5ebbf)のnodejs更新版です

ちょっと古いので他の記事参考にした方がいいかもです
更新版までお待ちをです:bow:(2022/12月)

## 環境
> Docker version 19.03.8
> docker-compose version 1.25.4

## 構築作業

### Dockerfile作成

```Dockerfile:Dockerfile
FROM node:12.18.0-alpine
WORKDIR /usr/src/app
```

### docker-compose.yml作成

```yaml:docker-compose.yml
version: '3'
services:
  react:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
     - ./:/usr/src/app
    command: sh -c "cd workplace && yarn start"
    ports:
     - "3000:3000"
    tty: true
```

### イメージをビルド

```
$ docker-compose build
```

### React と create-react-app をインストール + アプリ作成

```
$ docker-compose run --rm react sh -c "npm install -g create-react-app && create-react-app workplace"
```

↓作成ディレクトリ

```
- Dockerfile
- docker-compose.yml
- workplace
	|- node_module/
	|- public/
	|- src/
	|- package.json
	|- yarn.lock
```

### 起動
前の記事参照でお願いします:bow:

## 最後に
docker-compose.ymlの内容変えたい...

## 参考
- [Docker Hub - Node](https://hub.docker.com/_/node)
「【超便利】HTML・CSS・JSのコード共有サービス「CodePen」が素晴らしい件」

以下の記事にまとめたので、ぜひご覧ください！

「【超便利】HTML・CSS・JSのコード共有サービス「CodePen」が素晴らしい件」
https://newmtube07.com/code-codepen/
プログラマー失格

##プロローグ
バグの多い生涯を送って来ました。
自分には、プログラミングというものが、見当つかないのです。
それゆえ、人に教えることができるグッドノウハウなど持ち合わせておりませんが、バッドノウハウならば誰よりも持ち合わせております。人に堂々と話せるような事柄ではないのですが、こうして筆をとったのは、プログラマーを目指す諸兄のために、恥を晒すことは、反面教師として役に立つのではないかと考えた所存であります。

##入社3ヶ月目〜フレームワークとは何でございましょう？〜
未経験から入社をし、研修を終えた自分は、とあるシステムのエンハンス開発案件へとつきました。
入社する前にはプログラミングに関して全く無知なものでありましたから、研修を終えて、コードもそれなりに読めるようになった自分に出来ぬことなどないだろうと、意気揚々と仕事に取り組み始めた事を鮮明に覚えております。

しかし、いざソースコードを読み始めたらどうでしょう。
何をしているのかさっぱり分からぬのです。
それはもう、純粋な津軽人である自分がヒエログラフを読むのと同じくらい意味が分からないのです。

初めて人の書いたソースコードというものに触れた自分が、その数々のクラス・メソッドから感じる事が出来たのはエジプトの風。
まるで、ツタンカーメン王の死の秘密に挑む考古学者のような状態だったのです。

丁寧な研修を受けたにも関わらず、右も左も分からなかった理由。
それはフレームワークにありました。
無知な自分は、MVCモデルの存在すら知らなかったのであります。

コードとは1つのファイルに描かれていることを上から下に向かって読むだけではならないのです。
MVCを知らなければ、まともにコードを読むことも出来ぬのです。

自分がこの事実に気がつく事が出来たのは、案件開始から1週間という時間がたった後でした。
当然の事ながらスケジュールは炎上。
墓荒らしに盗まれたエジプトの数々の秘宝のごとく、自分の工数はどこかに消えてしまったのです。

この経験をへて自分は、フレームワークの仕様を知るという事がとても大事だと知りました。

##入社5ヶ月〜単体テストとは何でございましょう？〜
テストというものがこの世に存在している事は、無知な自分でも存じ上げておりました。
しかし、過去のドキュメントに目を通した所、単体テストと結合テストと、テストが2種類あったのです。

はてさてこれは何のことやらとGoogle先生に尋ねて見るまで、自分はテストに複数の種類があることを知らなかったのです。
さらにテストには正常系、異常系。
ブラックボックスとホワイトボックスなど知らなくてはならぬ事が沢山あったのです。

コードを書く事にばかり目を取られ、テストというものは、ケーキにくっついている銀紙のようなものだろう、と捉えていた自分は、仏様より神罰を受けることとなりました。
テストケースがきちんと作れず、スケジュールがさらに遅延する事となるのです。

##入社6ヶ月〜完璧な要件などこの世に存在しないのです〜
要件資料とはこの世の真理を書いた聖書のようなもの。
自分はそのように考えておりました。
しかし、それは大きな間違いでした。

要件資料通りに作っておいたら問題ないだろうと思っていると痛い目に合うのです。
要件資料とはあくまでも方針を示すコンパスのようなものと捉えるのが正解なのでないかと今の自分は考えております。

要件の詳細部分は製造をしながら詰めていく方が良いのです。
実装上の問題というのは、後から発見する事の方が多く、お客様にきちんと確認を取りながら、要件の詳細を詰めていくという過程を経ないとスケジュールは金閣寺のごとく燃え上がってしまうのです。

##入社1年〜チームの慣習を学ぶ学習コストを低く見積もり過ぎてはならぬのです〜
チーム開発の現場に入ると、様々な環境が初めから整備されていることがあります。
開発を進めやすくするよう、先人達が道を歩きやすいよう整備してくれているのです。

先人達が通った道を通れば、楽に開発を進める事が出来ます。
しかし、その道を進むための学習コストを低く見積もってはいけないのです。

ルール化、手順化されたものを初めて行う時は、思ったより時間がかかるものなのです。思いもよらぬエラーに時間を取られ、ダイソンに吸い取られる塵芥のごとく、工数が吸い取られてしまう事があるのです。

効率化されているし大丈夫だろう、とバッファを無駄にしてはなりません。
何事も初めてやる時は、謙虚な心持ちで、失敗する事を前提に時間を見積もるべきだったのです。
SwiftUIのキャンバス(プレビュー)を消してしまった時は

# SwiftUIのキャンバス(プレビュー)を消してしまった時は
コードが表示されるウィンドウを広くしたらプレビューがどこかに行ってしましった...そんな時は、
![IMG_0255.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156708/d84649df-0782-3fd8-16e8-fcc584ce0298.jpeg)



Xcodeメニューバー > Editor > Canvas
<img width="242" alt="スクリーンショット 2020-06-14 10.11.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156708/da765deb-9c57-c346-fc2c-c59f96a0da6f.png">

か、

Xcode > editor area > editor options > Canvas
<img width="513" alt="スクリーンショット 2020-06-14 10.18.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156708/0c09bb06-16f5-7007-f96f-fbee0f6651fd.png">

か、
Macの場合はoption+command+returnキーを押すことで再度表示できます:joy:

![IMG_0257.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156708/943d8926-9c57-69a0-4a29-a754aee8abe9.jpeg)