OmniAICreator/Qiita-1.07M huggingface dataset:
休憩時間だからこそ、テンションをあげたい時に押すボタンを作った

## 「疲れた！」という言葉を何かのエネルギーに変えたい
リモワ中、誰もいないのをいいことについ「疲れたー！！！」と叫んだりしたことはないだろうか？私はある。実際は「つっっっっっっかれたー……」という、心の底から絞り出した渾身の「疲れた」。
この言葉を **何かのエネルギーに変換することはできないだろうか？** そう、例えば **テンションをあげる何かに……**

## テンションをあげるものと言えば
テンションが上がるものは何か？ **氷川きよし**でしょ。
完成したのがこちら。
※音声は流れません

https://twitter.com/nnmshita/status/1499321438276259843?s=20&t=T_i4Q8WUTGLGhkHqhizLeA


## アプリ
https://condescending-bassi-b0ab17.netlify.app/


**＜使い方＞**
* マイク認証をONにして、ボタンを押す。
* 心の底から「疲れたー！」と言う。（「めっちゃ疲れた」「ちょー疲れた」でも可）
* 氷川きよしさんが煽り散らしてくれるので、こぶしを振り上げる。
※隠しコマンドとして「マツケン」と言うと、例のあの曲が流れます。


## コード
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="QWOzVBR" data-user="morishitanana" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/morishitanana/pen/QWOzVBR">
  休憩時間だからこそ、テンションをあげたい時に押すボタン２</a> by mshita (<a href="https://codepen.io/morishitanana">@morishitanana</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

### 音声認識（認識後、判定あり）
```js:JS
    // 音声を認識できたら
    this.recog.onresult = (event) => {
      // 認識されしだい、this.resultにその文字をいれる
      // Vueなので、文字をいれただけで画面表示も更新される
      this.result = event.results[0][0].transcript;

      //アクション1
      if(this.result.indexOf('疲れた') > -1){
        window.location.href = 'https://www.youtube.com/watch?v=2fmucSKJXxQ&t=53s';
      };
    
      //アクション2
      if(this.result.indexOf('マツケン') > -1){
        window.location.href = 'https://www.youtube.com/watch?v=XazyhnymUQo&t=64s';
      };
    };
    
    // 音声認識が終了したら
    this.recog.onspeechend = () => {
      this.recog.stop();
      this.recogButton = '停止（クリックして再開）';
    };
    
    // 認識できなかったら
    this.recog.onerror = () => {
      this.result = '（認識できませんでした）';
      this.recog.stop();
      this.recogButton = '停止（クリックして再開）';
    };
    
  },
```
音声認識した結果、『疲れた』『マツケン』という単語を含んでいた場合のみ指定のURLにジャンプする。
単語は完全一致ではなく、部分一致で判定している。

**＜完全一致させたい場合＞**
`if(this.result.indexOf('疲れた') > -1){`　を、`if(this.result === '疲れた'){` に変更する。

### Youtube動画の、再生開始箇所を指定したい場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2122226/4b0de74d-d5fe-c0a8-d839-c0573cd0ba06.png)
流したい動画の **ここから！** というところで右クリックをして『現時点の動画のURLをコピー』を選択する。その箇所から再生されるURLが保存される。

## まとめ
理想を言えば、仕事を開始したと同時に起動して「疲れたー」と言ったタイミングで、きよしを流したい。
が、Web Speech APIは基本的に数秒で切れてしまう。起動したままにするには、HTTPSサーバーが必要とのこと。
（参考）https://monomonotech.jp/kurage/iot/webspeechapi_voice_recognition.html
それほど時間をかけずにお手軽に作りたかったというのもあるので、今回は断念。
[Flutter]ビルドエラー「Invalid depfile」の解消法

## エラー内容

```
Invalid depfile: C:\Users\...\flutter_practice\.dart_tool\flutter_build\49d8ab87ff629688917c92475373e2cc\kernel_snapshot.d
```

## 対処方法
1. main.dartファイルの`import 'dart:html';`を削除 (未使用の場合)
1. コンソールから`flutter clean`を実行

## 補足
`Invalid depfile`のエラー自体は`flutter clean`で解決します。
しかし、その後`Not found: 'dart:html'`のエラーが出ました。
その対策として`import 'dart:html';`を削除したところ、再び`Invalid depfile`のエラーが出ました。
結論として、対処方法に上げたような内容が適切そうです。
RDS内のデータベースやユーザーをterraformで管理する

## Mysql Provider
とういうものがあって便利


## ポートフォワード

```bash
ssh -i develop.key ec2-user@i-aaaaaaaaaaaaaaa -L 33061:aiuo.cluster-xxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306
```

## terraform

```tf
# Configure the MySQL provider
provider "mysql" {
  endpoint = "127.0.0.1:33061"
  username = "admin"
  password = "password"
}

# Create a Database
resource "mysql_database" "app" {
  name = "my_awesome_app"
}

# Create user
resource "mysql_user" "sample" {
  user  = "sample"
  host  = "%"
  plaintext_password = "password"
}

# Grant User
resource "mysql_grant" "sample" {
  user       = mysql_user.sample.user
  host       = mysql_user.sample.host
  database   = "sample"
  table      = "*"
  privileges = ["SELECT", "INSERT", "UPDATE", "DELETE"]
}

terraform {
  required_providers {
    mysql = {
      source = "terraform-providers/mysql"
      version = "1.9.0"
    }
  }
}
```

## 参考
https://tech.studyplus.co.jp/entry/2020/08/10/070000
npmのグローバルインストールがうまくできず詰んだ話

## 概要
- `npm install [パッケージ]`コマンドでグローバルインストールを行う際、グローバルインストールはできているが、なぜかその[パッケージ]コマンドが効かない時の対処方法。
- 事前準備として`Homebrew` `Node.js` `npm`のインストールをする。
## 環境
- MacBookPro(M1Pro)
- OS:Monterey
- Homebrewのバージョン：3.3.16
- nodeのバージョン：16.14.0
- npmのバージョン：8.3.1

## グローバルインストールをするコマンド
> expoCLIのグローバルインストール

```terminal:Terminal
% npm install expo-cli --global
```

> Create-React-Appのインストール
```terminal:Terminal
% npm i -g create-react-app
```
など

よし、エラーもなくこれで無事インストール完了！と、思ったら・・・

## 結果
```terminal:Terminal
zsh: command not found:[パッケージ]
```

グローバルインストールしたはずなのにこれはおかしい・・・
ちゃんとグローバルインストールできているか確認作業をしてみる。

## 試したこと

> まずはグローバルインストールができているかの確認

```terminal:Terminal
% npm list -g --depth=0

// 出力結果
/Users/ユーザー名/.npm-global/lib
├── expo-cli@5.2.0
```
グローバルインストールはできている。
となるとPATHが通っていないことが原因かな・・・

## 解決方法
> ホームディレクトリで【code .】コマンドを実行し、vscodeを開く。
もしくは【open ~/.zshrc】で.zshrcを開く。

以下の記述を追加する。

```terminal:Terminal
export PATH=~/.npm-global/bin:$PATH
```
vscodeであれば、command＋Sなどで上書き保存をする。
最後にターミナル上でコマンドを実行する。
```terminal:Terminal
% source .zshrc
```
これ忘れがちなので注意。
コマンドを実行したら念の為Terminalを一度再起動する。
最後にグローバルインストールしたパッケージが実行できるか確認する。
今回であれば・・・

> expoのバージョンを確認

```terminal:Terminal
% expo --version

// 出力結果
5.2.0
```

> create-react-appのバージョンを確認

```terminal:Terminal
% create-react-app --version

// 出力結果
5.0.0
```

無事バージョンが確認できればあとはアプリ開発するだけです！

お疲れ様でした！
fluentdとは

## 勉強前イメージ

よく聞く・・・けどわからん・・・

## 調査

### fluentdとは

フルエントディー と読みます。
アプリケーションなどからのログデータ収集管理ツール(データコレクタ)です。
システムに管理されているログファイルを収集して解析、保存を行うことが出来ます。
また、各種データをMongoDBやs3などに出力したり、Elasticsearchやkibanaなどと連携してログの可視化が可能です。

fluentdは安定版のtd-agentとしても提供されています。

### fluentdの機能

- input

各種データソースから必要なデータを収集します。
ログの取り込みや、転送データの取り込みがこれにあたります。

- buffer

データの紛失を管理します。
オンメモリに載せたりファイルでの管理を行います。

- output

各種データを出力します。
DBに書き込んだり、上記に記載しているようにs3に置いたりすることが出来ます。

### fluentdの特徴

- マルチプラットフォーム

rubyの動作環境があればlinuxでもwindowsでも動くので
OSの制限はありません。

- データの信頼性

上記のbufferに当たる箇所ですが、データバッファに蓄積するので
ログの欠損を防ぐことが出来ます。

- 様々なモジュールが有る

イベント送信のためのモジュールが様々な言語に向けたモジュールが提供されているので、
独自のアプリケーションログを簡単に記録させることが出来ます。

## 勉強前イメージ

ログに関わることは知ってたけど、収集するやつなんか
あと、色んな所にログ出力できるのいいね

## 参考

- [Fluentd とは？](https://openstandia.jp/oss_info/fluentd/)
- [柔軟なログ収集を可能にする「fluentd」入門](https://knowledge.sakura.ad.jp/1336/)
JavaScript let constについての備忘録

# 改善点

会社でもコメントでも御指摘あった通り殆ど日記と大差なくQiitaで書く様な物では無かったのと自分が思ってるよりか説明下手なのもあったので今回からはよりエンジニア向け且つ分かり易く纏める事を意識したいと思います、御指摘して下さった方々本当にありがとうございます。

## そんな訳で本日の学習内容

午前中　主に`HTML`の学習
`HTML`の基本文法から、`HTML`の始まりを表す`<!DOCTYPE html>`タグや見出しの`<h>タグ`、段落を表す`<p>タグ`と箇条書きに用いる`<li>`タグにその`<li>`タグを囲む`<ul>`と兎に角タグ、タグ、タグと出て来ますが基本的にはタグとタグで挟むイメージと各タグの要素を少しでも覚えておけば案外混乱無くコーディング出来るのでしょうか？一先ずは`<body>`タグの間に本文を書き込むって事を頭に入れて今後の学習を進めてみましょうか。

午後　`JavaScript`の学習
`let`では無く`var`が出て来てそれでいて使い方は同じ？取り敢えず調べて見て分かった事は

- `var`は再代入、再宣言が可能な事

```js
var a　= 1
var a　= 2

// みたいな感じに使える
```


- `let`は再宣言が`var`みたいに出来ない

```js
let a = 1
let a = 2
// が出来ない、再代入は出来るので間違えない様にしたい所。
```

グローバル変数、ローカル変数？これまた知らない単語が出て来たので調べました。

グローバル変数
関数の外側にある変数でプログラムが終わるまで値は保持される。

ローカル変数
関数の内側にある変数で関数が実行される度に初期値になる

この辺は事前にプログラムの基礎知識を学習していれば使い方はスンナリ理解出来るかも。

そして`innerHTML`、これは取得した`HTML`の中身を書き換える命令との事。
例えば事前に`HTML`側の`id`に画像1を入れてJavaScript側の操作で`getElementById`で`id`を取得した後にこの`innerHTML`を使って画像2に書き換える処理を実装出来る訳で。
相変わらず分かりづらいとは思いますが大きく間違ってはいないはず。

はい、本日の学習は以上となります。
今後ももっと分かり易くエンジニア向けに纏められる様に改善致しますので宜しくお願いします。
git status使ったら、ファイル名がエスケープ文字に

# git statusでファイル名が文字コードに

使用OS: Windows10

Gitを使用していたら、git statusを叩いたら、ファイル名がエスケープ文字(文字化けではない)で表示された。

こんな感じで
\123\456\789.txt

ドキュメントによると、
0x80より大きな値のバイトの文字だとエスケープされるらしい。

その場合下記で解決できる。

```
git config --global core.quotepath false
```

- 参考
[git-config document](https://git-scm.com/docs/git-config)
AWS S3バケットの作成

# 概要

- AWSにてS3でバケットを作成する

# ご注意！！！

- AWSは従量課金です。
- 本作業で料金が発生する可能性があります。
- 筆者は本作業で発生するいかなる料金も負担する事ができません。
- ご自身の責任の下作業をお願いいたします。

# 作るものの情報

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| バケット名 | dev-bucket-example | バケット名がかぶらないために苦し紛れの命名 |
| リージョン | ap-northeast-1 |  |
| オブジェクト所有者 | ACL無効（推奨）を選択 | デフォルト |
| このバケットのブロックパブリック・アクセス設定 | 「パブリックアクセスをすべてブロック」のチェックを外す |  |
| バケットのバージョニング | 無効にする | デフォルト |
| タグ | 追加無し | デフォルト |
| デフォルトの暗号化 | 無効にする | デフォルト |

# 作成

1. AWSにログインしてS3の画面に移動する。
1. 「バケットを作成」をクリックする。
1. 「作るものの情報」に記載した内容に沿って入力を行う。
1. 完了すると下記の様になる。

    ![S3_bucket.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/57d3963a-5199-8038-f49a-4366a03e679f.png)
    ![S3_bucket.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/9ba06533-9e65-faf3-26a3-53a068758e72.png)
    ![S3_bucket.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/8bb5df81-7f6f-f91f-94a0-17e2bdf895e5.png)

1. 問題なさそうなら「バケットを作成」をクリックする。
1. バケットが作成され、一覧に作成したものが追加される。
AWS DBサーバー用のセキュリティグループを作成

# 概要

- AWSにてWebサーバー用の基本的なセキュリティグループを作成する

# ご注意！！！

- AWSは従量課金です。
- 本作業で料金が発生する可能性があります。
- 筆者は本作業で発生するいかなる料金も負担する事ができません。
- ご自身の責任の下作業をお願いいたします。

# 作るものの情報

- 作成するセキュリティグループに別記事で作成したdev-vpcを割り当てる。
    - [AWS VPCの作成](https://qiita.com/miriwo/items/b28a4395264c08d183c6)
- ソースには別記事で作成したdev-webセキュリティグループを割り当てる。
    - [AWS Webサーバー用のセキュリティグループを作成](https://qiita.com/miriwo/items/65e8e7f9f65617d02746)
- 下記のセキュリティグループを作成する。

    | 項目 | 情報 | 備考 |
    | --- | ---- | --- |
    | セキュリティグループ名 | dev-db |  |
    | 説明 | dev-db |  |
    | セキュリティグループを割り当てるVPC | dev-vpc |  |
    | タイプ | MYSQL/Aurora | インバウンドにルール追加 |
    | プロトコル | TCP | インバウンドにルール追加 |
    | ポート範囲 | 3306 | インバウンドにルール追加 |
    | ソース | dev-web | ソースの隣の欄の虫眼鏡マークをクリック<br>セキュリティグループ（web用）のセキュリティグループを指定 |

# 作成

1. AWSにログインしてEC2の画面に移動する。
1. サイドバーの「セキュリティグループ」をクリックする。
1. 画面上の「セキュリティグループを作成」をクリックする。
1. 「作るものの情報」に記載した内容に沿って入力を行う。
1. 入力完了すると下記の様になる。

    ![EC2_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/37e523fe-1f79-40dc-787d-c142c35e8327.png)

1. 問題なさそうなら「セキュリティグループを作成」をクリックする。
1. セキュリティグループが作成され、一覧に作成したものが追加される。
AWS Webサーバー用のセキュリティグループを作成

# 概要

- AWSにてWebサーバー用の基本的なセキュリティグループを作成する

# ご注意！！！

- AWSは従量課金です。
- 本作業で料金が発生する可能性があります。
- 筆者は本作業で発生するいかなる料金も負担する事ができません。
- ご自身の責任の下作業をお願いいたします。

# 作るものの情報

- 作成するセキュリティグループに別記事で作成したdev-vpcを割り当てる。
    - [AWS VPCの作成](https://qiita.com/miriwo/items/b28a4395264c08d183c6)
- 下記のセキュリティグループを作成する。

    | 項目 | 情報 | 備考 |
    | --- | ---- | --- |
    | セキュリティグループ名 | dev-web |  |
    | 説明 | dev-web |  |
    | セキュリティグループを割り当てるVPC | dev-vpc |  |

- 追加するインバウンドルール

    | No | タイプ | プロトコル | ソース | 備考 |
    | :-: | --- | --- | --- | --- |
    | 1 | SSH | TCP | 22 | Anywhere-IPv4 0.0.0.0/0 |  |
    | 2 | HTTP | TCP | 80 | Anywhere-IPv4 0.0.0.0/0 |  |
    | 3 | HTTPS | TCP | 443 | Anywhere-IPv4 0.0.0.0/0 |  |

# 作成

1. AWSにログインしてEC2の画面に移動する。
1. サイドバーの「セキュリティグループ」をクリックする。
1. 画面上の「セキュリティグループを作成」をクリックする。
1. 「作るものの情報」に記載した内容に沿って入力を行う。
1. 入力完了すると下記の様になる。

    ![EC2_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b15cb3df-3004-8fce-d76e-82b21c83400d.png)

1. 問題なさそうなら「セキュリティグループを作成」をクリックする。
1. セキュリティグループが作成され、一覧に作成したものが追加される。
1. 一覧で作成されたセキュリティグループを選択し、下部の「インバウンドルール」のタブを選択し、「インバウンドのルールを編集」をクリックする。（※こちらの作業の手順が抜けていたのでこれ以降は後から追記）

    ![EC2_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/05a9c0eb-0767-9eea-605d-1e999ba5683d.png)

1. 「ルールを追加」をクリックする。
1. 「作るものの情報」に記載した内容に沿って入力を行う。
1. 入力完了すると下記の様になる。

    ![EC2_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/078fc6ae-ace4-39f2-288b-05cf83115746.png)

1. 問題なさそうなら「ルールを保存」をクリックする。
1. セキュリティグループdev-webにインバウンドルールが追加される。
1. これだけだとまだ22番ポートを使ってssh接続するインバウンドルールしか存在しないので、80番ポートを使ってhttp、443番ポートを使ってhttpsの通信をするルールを記載する。
1. 一覧で作成されたセキュリティグループを選択し、下部の「インバウンドルール」のタブを選択し、「インバウンドのルールを編集」をクリックする。
1. 「ルールを追加」をクリックする。
1. 「作るものの情報」に記載したインバウンドルールのHTTPとHTTPSの内容に沿って入力を行う。
1. 入力完了すると下記の様になる。

    ![EC2_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/cc59cacc-a09d-54c1-bfdd-9eacd42fba1f.png)

1. 問題なさそうなら「ルールを保存」をクリックする。
1. セキュリティグループdev-webにインバウンドルールが追加される。
linuxやmacosでファイルとディレクトリを操作について、よく使うコマンド

# 概要
今回,日常の仕事中にlinux OSやmacosでよく使われたファイルやディレクトリの操作コマンドについて、簡単に紹介させて戴きます。

## コマンド
- ls:ファイルやディレクトリの情報を表示します。
- cd:作業ディレクトリを移します。
- pwd:現在ディレクトリを確認します。
- mkdir:新しいディレクトリを作成します。
- rmdir:空ディレクトリを削除します。
- cp:ファイルやディレクトリのコピーします。
- rm:ファイルやディレクトリを削除します。
- mv:ファイルやディレクトリの移動、またファイル名、ディレクトリ名の変更を行います。

## 環境

macOS Monterey 12.2.1

### ls

```
youyonghua@youyonghuadeMacBook-Pro test % ls
a.txt		b.txt		test_directory
youyonghua@youyonghuadeMacBook-Pro test % 

```
testディレクトリにa.txt,b.txtがファイルです。
test_directoryがディレクトリです。

### cd

```
youyonghua@youyonghuadeMacBook-Pro test % cd test_directory 
youyonghua@youyonghuadeMacBook-Pro test_directory % 
```
test_directoryディレクトリに移します。

### pwd

```
youyonghua@youyonghuadeMacBook-Pro test % pwd
/Users/youyonghua/Desktop/test
youyonghua@youyonghuadeMacBook-Pro test % 
```
現在ディレクトリを確認できます。

### mkdir
```
youyonghua@youyonghuadeMacBook-Pro test % mkdir test2_directory
youyonghua@youyonghuadeMacBook-Pro test % ls
a.txt		b.txt		test2_directory	test_directory
youyonghua@youyonghuadeMacBook-Pro test % 
```
test2_directoryというディレクトリを作成します。

### rmdir
```
youyonghua@youyonghuadeMacBook-Pro test % rmdir test2_directory 
youyonghua@youyonghuadeMacBook-Pro test % ls
a.txt		b.txt		test_directory
youyonghua@youyonghuadeMacBook-Pro test % 
```

test2_directoryというディレクトリを削除します。

### cp
```
youyonghua@youyonghuadeMacBook-Pro test % cp a.txt ./test_directory/a.txt
youyonghua@youyonghuadeMacBook-Pro test % cd test_directory 
youyonghua@youyonghuadeMacBook-Pro test_directory % ls
a.txt
youyonghua@youyonghuadeMacBook-Pro test_directory % 

```
a.txtをtest_directoryディレクトリにコピーします。


#### rm
```
youyonghua@youyonghuadeMacBook-Pro test % ls                
a.txt		b.txt		test2_directory	test_directory
youyonghua@youyonghuadeMacBook-Pro test % rm b.txt 
youyonghua@youyonghuadeMacBook-Pro test % ls
a.txt		test2_directory	test_directory
youyonghua@youyonghuadeMacBook-Pro test % 
```
b.txtファイルを削除します。

### mv
```
youyonghua@youyonghuadeMacBook-Pro test % ls
a.txt		test2_directory	test_directory
youyonghua@youyonghuadeMacBook-Pro test % mv a.txt c.txt
youyonghua@youyonghuadeMacBook-Pro test % ls
c.txt		test2_directory	test_directory
youyonghua@youyonghuadeMacBook-Pro test % 
```
a.txtをc.txtに改名します。
【Salesforce】Sandboxを作成する

# 1.はじめに
どうも、ARIの名古屋支社に勤務している愛知県民です♪
(/・ω・)/

Salesforceにて、Apexクラスを作成しようとしたのですが、
**Salesforceの仕様で、いきなり本番環境にApexクラスを作ることはできず、
Sandboxで作成・テストをし、本番環境へアップロードすることが必要でした。**

そこで、今回はSandboxを作成する手順をまとめてみました。
次回は、Sandboxで作成したApexクラスを本番環境にアップロードする手順について投稿する予定です！

最後に、この記事がSalesforceを勉強中の方の参考になれば幸いです♪
(*^^)v

参考URL：[Sandboxの作成](https://help.salesforce.com/s/articleView?id=sf.data_sandbox_create.htm&type=5)

# 2.用語の説明
## 2.1.Sandboxとは
Sandboxとは本番環境にアップロードするApexクラスやApexトリガを作成・テストするための環境のことです。
ちなみに、外部サービス（AWSのLambda等）との連携を試すことはできないため、
外部サービスの代わりにレスポンスを返すMockというコンポーネントを使用してテストをします。
（この辺りについてもいつか、記事投稿したいと考えてます・・・）

# 3.Sandboxの作成
3.1.Salesforceの管理画面の右上の歯車マークを選択し、「設定」を選択します。

|![010_設定を選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/e2ad15f2-6893-9582-4c15-b3e3ff882206.png)|
|:--|

3.2.左側の検索欄に「sandbox」と入力し、「Sandbox」を選択します。

|![020_sandboxを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/9abc2b28-038c-c1f3-9c58-4788d16cbc04.png)|
|:--|

3.3.「新規sandbox」を選択します。

|![030_新規sandboxを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/be81f095-e94c-c8aa-411d-6b65af31223a.png)|
|:--|

3.4.表の内容を入力し、使用するライセンスの下にある「次へ」を選択します。

|項目|設定内容|
|---|---|
|名前 | 任意（例では「TestSand」としました。） |
|説明 |任意 |
|作成元 | 本番 |

|![040_sandboxの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/938a2ae5-27e9-dab5-0170-7b4956d83ec1.png)|
|:--|

3.5.「作成」を選択します。

|![050_sandboxの作成_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/11a23c5f-ff5b-fec7-c7ea-5d92fb837865.png)|
|:--|


3.6.Sandboxが作成されるまで待機します。
（環境によって作成される時間が変わりますが、自分がやったときは約20分で作成されました。）

|![060_sandboxの作成完了を待機.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/e990e073-4e8c-e1c8-f96b-1032ccae27f7.png)|
|:--|

3.7.状況が「完了」になったのを確認したら、「ログイン」を選択します。

|![070_sandbox作成完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/6bd2e7b3-f197-fdde-f345-ffc729155194.png)|
|:--|

3.8.ユーザ名とパスワードを入力し、「Sandboxにログイン」を選択します。

|項目|設定内容|
|---|---|
|ユーザ名 | （本番環境のユーザ名）.（Sandbox名を小文字にしたもの）<br><br>ユーザ名：aiueo.XXX-jp.com<br>Sandbox名：TestSand<br>⇒「aiueo.XXX-jp.com.testsand」 |
|パスワード |本番環境のパスワードと同じ |


|![080_sandboxにログイン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/4f5f0316-a113-334f-ecb8-8635bbb87c79.png)|
|:--|

3.9.Sandboxへのログインが完了します。画面上部にはSandbox名が表示されています。
**※作業時には本番環境とSandboxを間違えないように注意してください。**

|![081_sandboxにログイン後の画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/ef3a7a9d-4a3b-1949-339e-168f7e3c0d69.png)|
|:--|


# 4.おわりに
ここまで読んで下さり、ありがとうございます！！！
(^^)

今回はSandboxの作り方について投稿したので、
次回はいよいよApexトリガの作成について投稿したいと思います♪
(:3_ヽ)_
IEx上でコマンドを実行する（Elixir）

**あまつ風雲のかよひ路吹きとぢよをとめの姿しばしとどめむ**

Advent Calendar 2022 61日目[^1]の記事です。
I'm looking forward to 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
私の[Advent Calendar 2022 一覧](https://docs.google.com/spreadsheets/d/1HQvFjagQLRPjOYAjDVzWp9S4b8dKixxvvaz_TtbZWto/edit#gid=1723448955)。

[^1]: @kaizen_nagoya さんの「[「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 １日目　Most Breakthrough Generator](https://qiita.com/kaizen_nagoya/items/49ebebee3a0377f3b59b)」から着想を得て、模倣いたしました。 

---

# はじめに

[Elixir](https://elixir-lang.org/)を楽しんでいますか:bangbang::bangbang::bangbang:

**[IEx](https://hexdocs.pm/iex/1.13/IEx.html)立ち上げた〜 > コマンド使いたい > もう一丁ターミナル立ち上げるか**
となることありませんか。
私はしょっちゅうあります。

そんなときにそのまま`IEx`上でコマンドを実行する方法をご紹介します。
`macOS Catalina 10.15.7`と`macOS Monterey 12.2.1`で確かめました。

[Elixir](https://elixir-lang.org/)でコマンドを実行する関数を使うわけです。

# What's [IEx](https://hexdocs.pm/iex/1.13/IEx.html)?

[IEx](https://hexdocs.pm/iex/1.13/IEx.html)というのは、

> Elixir's interactive shell.

です。

[Elixir](https://elixir-lang.org/)のプロジェクトのルートで、`iex -S mix`という形でよく使います。


# `mix format`したい

```elixir
iex> :os.cmd('mix format')
```

もしくは

```elixir
iex> System.cmd("mix", ["format"])
```

です。
ちなみに、私は前者のほうをよく使っています。

ドキュメントはここです。

- [:os.cmd](https://www.erlang.org/doc/man/os.html#cmd-1)
- [System.cmd/3](https://hexdocs.pm/elixir/System.html#cmd/3)

あとは同じ要領です。
その他、例をいくつか紹介しておきます。

# Finderを開きたい

```elixir
iex> :os.cmd('open .')  
```

もしくは

```elixir
iex> System.cmd("open", ["."])
```

# VS Codeを開きたい

```elixir
iex> :os.cmd('code .')  
```

もしくは

```elixir
iex> System.cmd("code", ["."])
```

参考: https://code.visualstudio.com/docs/setup/mac#_launching-from-the-command-line

ここに書いてあることをやって、`code`コマンドが使えるようにしています。


---

# Wrapping up :lgtm::lgtm::lgtm::lgtm::lgtm:

Enjoy [Elixir](https://elixir-lang.org/):bangbang::bangbang::bangbang:
<font color="purple">$\huge{Enjoy\ Elixir🚀}$</font>

今回は[IEx](https://hexdocs.pm/iex/1.13/IEx.html)上で、コマンドを実行する方法をご紹介しました。
ただ、[:os.cmd](https://www.erlang.org/doc/man/os.html#cmd-1)や[System.cmd/3](https://hexdocs.pm/elixir/System.html#cmd/3)を使っているだけのことです。

以上です。



---

I organize [autoracex](https://autoracex.connpass.com/).
And I take part in [NervesJP](https://nerves-jp.connpass.com/), [fukuoka.ex](https://fukuokaex.connpass.com/), [EDI](https://fukuokaex.connpass.com/), [tokyo.ex](https://beam-lang.connpass.com/), [Pelemay](https://pelemay.connpass.com/).
I hope someday you'll join us.

[We Are The Alchemists, my friends!](https://www.youtube.com/watch?v=04854XqcfCY)

---
AWS EC2 → S3接続用のIAMユーザーの作成

# 概要

- EC2 → S3の接続に必要な権限を持ったIAMユーザーを作成する方法をまとめる

# ご注意

- AWSは従量課金です。
- 本作業で料金が発生する可能性があります。
- 筆者は本作業で発生するいかなる料金も負担する事ができません。
- ご自身の責任の下作業をお願いいたします。

# 作るものの情報

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| 名前 | dev-admin |  |
| AWSアクセスの種類 | プログラムによるアクセス |  |
| アクセス許可の設定 | 既存のポリシーを直接アタッチ → AmazonS3FullAccess |  |

# 作成

1. AWSにログインしてIAMの画面に移動する。
1. サイドバーの「ユーザー」をクリックする。
1. 画面上の「ユーザーを追加」をクリックする。
1. 「作るものの情報」に記載した内容に従って入力を行う。
1. 1ページ目の入力は下記の様になる。

    ![IAM_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/82a36cef-3fc0-6156-9102-421c6a903e5a.png)

1. 2ページ目の入力は下記の様になる。

    ![IAM_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/65043f8d-1964-c24d-4411-a24edd5d69db.png)

1. 確認画面は下記の様になる。（タグは特に設定しなかった）

    ![IAM_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/1f6b7cf5-cfd0-a934-fb27-2e4d4aa2f891.png)

1. 問題なさそうなら「ユーザーの作成」をクリックする。
1. 最後のページでcsvのダウンロードが行えるのでダウンロードし、大切に保管する。
40 代おっさんPythonでExcelのデータを活用してみる

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## 参考資料

<https://www.udemy.com/course/python-kaizen/learn/lecture/26849736#overview>

## 環境

以前はCloud9を使用していましたが
Windows 10
Jupyter Notebook
そのため構文に少し違いがあります。
気を付けてください

## 目的

Excelのデータを活用してみる

## Excelのデータを活用してみる

pcr_tested_daily.csv(厚生労働省からダウンロードしました）
これを使ってデータを分析したいと思います。

### pandasのインストール

pandasとは
データの統計量を表示したり、グラフ化するなど、データ分析（データサイエンス）や機械学習で必要となる作業を簡単に行うことができるようになります

自分のはまだ入れていなかったので入れて見ます

```python
!pip install pandas
```

上記はJupyter上でインストールしているので、コンソール上で行う場合は！は取り除いてください。

### pandasのインポート

```python
import pandas as pd
```

別名としてpdとして扱われることが多いみたいです

### csvを読み込む

```python
df=pd.read_csv("C:\\Users\\toaik\\OneDrive\\デスクトップ\\python\\6章\\pcr_tested_daily.csv")
```

dfの中身を見ますと

```python
df
```

データが出たと思いますが、これをデータフレームと言うみたいです

### 合計を取ってみる

データフレームから項目欄を取ってきてこのように記述

```python
df["PCR 検査実施人数(単日)"].sum()
```

結果が返ってきました
ちなみに3/3現在で37629310.0でした…
これなら保健所パンクするわ～～

### 各パラメータの取り方

#### 平均値

```python
df["PCR 検査実施人数(単日)"].mean()
```

#### 最大値

```python
df["PCR 検査実施人数(単日)"].max()
```

#### 最大値の行数

```python
df["PCR 検査実施人数(単日)"].idxmax()
```

#### 行、列からの値を取る

```python
df.iloc[733,0]
```

ちなみに自分は最大値の行数、０を入れて見ました。
＊1行目は０

### データをグラフ化

＊Jupyterを使っているため簡単にできましたが、使うものによっては色々な設定が必要かも

#### matplotlibインストール

```python
!pip install matplotlib
```

#### matplotlib.pyplotインポート

```python
import matplotlib.pyplot as plt
```

%matplotlib inlineが必要になるかも

%matplotlib inlineを指定したときの挙動：

グラフがアウトプット行に出力される
plt.show()を省略してもグラフが出力される
plt.show()でアウトプット行に２つ以上のグラフ表示可能

#### グラフを表示

```python
plt.bar(df.index,df["PCR 検査実施人数(単日)"])
```

グラフが出ました～
すごいな！
AWS ルートテーブルの作成とルートの追加

# 概要

- AWSでルートテーブルを作成しインバウンドルールを追加する

# ご注意！！！

- AWSは従量課金です。
- 本作業で料金が発生する可能性があります。
- 筆者は本作業で発生するいかなる料金も負担する事ができません。
- ご自身の責任の下作業をお願いいたします。

# 作るものの情報

- 下記の情報でルートテーブルを作成し、0.0.0.0/0のアクセスを別記事で作成したインターネットゲートウェイに紐付けるルールを定義する。
    - [AWS インターネットゲートウェイの作成](https://qiita.com/miriwo/items/20f05f40a3f2d5314a1d)

    | 項目 | 情報 | 備考 |
    | --- | --- | --- |
    | 名前 | dev-route |  |
    | 関連付けするパブリックサブネット | dev-public-subnet-1a |  |
    | タグ | 入力する | キー → Name<br>値 → dev-public-route |
    | ルートとigwの紐付け | 0.0.0.0/0 → dev-igw |  |

# 作成

1. AWSにログインしてVPCの画面に移動する。
1. サイドバーの「ルートテーブル」をクリックする。
1. 画面上の「ルートテーブルを作成」をクリックする。
1. 「作るものの情報」に記載した内容に従って入力を行う（0.0.0.0/0とインターネットゲートウェイの通信の紐付けはルートテーブル作成後に実施）
1. 入力完了すると下記の様になる。（下記スクショのタグ部分の値が「dev-route」となっていますが、誤りです。「dev-public-route」が正しいです。）

    ![VPC_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/eac83793-73b8-3e16-9277-421aaa9c9254.png)

1. 問題なさそうなら「ルートテーブルを作成」をクリックする。
1. ルートテーブルが作成されルートテーブル一覧に作成したものが追加される。
1. 一覧で只今作成したルートテーブルを選択し、下部の「ルート」タブをクリックし、「ルートを編集」をクリックする。（下記スクショのルートテーブル名が「dev-route」となっていますが、誤りです。「dev-public-route」が正しいです。）

    ![VPC_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ee2d3713-fd18-55a7-c3ac-efa96daa1bb8.png)

1. 「ルートを追加」をクリックする。
1. 送信先を「0.0.0.0/0」を選択、ターゲットを別記事で作成したdev-igwを選択、「変更を保存」をクリックする。

    ![VPC_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b59922a4-adc0-109e-ab55-7550728848c4.png)

1. ルートの追加後下記の様になっていればOK

    ![ルートテーブル___VPC_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/3a223b9d-a0db-63c9-dd65-4f6ce3ff4c7f.png)

1. 一覧で只今作成したルートテーブルを選択し、下部の「サブネットの関連付け」タブをクリックし、「サブネットの関連付けを編集」をクリックする。

![ルートテーブル___VPC_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/7ea7c627-f57b-b6c5-7075-9bbf93aebe3c.png)

1. 「dev-public-subnet-1a」にチェックを入れて「関連付けを保存」をクリックする。

    ![VPC_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/681fd0b0-6c20-c3c8-0413-02d9ab7324ba.png)

1. 下記の様に作成したルートテーブルとサブネットの関連付けができていればOK

    ![ルートテーブル___VPC_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/4e777188-42f3-70c0-511f-15a78278d829.png)
AWSのManagedPolicyを列挙する方法

CDKとかCloudFormation使うときにたまに使いますが、いちいち調べに行くのも面倒なので、調べ方＋現時点におけるManagedPolicyのリストを載せて起きます。


## リストアップするコマンド

```bash
aws iam list-policies --only-attached |\
jq -r '.Policies[] | 
select(.Arn | startswith("arn:aws:iam::aws:policy") ) | 
.PolicyName'
```

jqでPolicyNameのみとりだしてるので、全情報ほしければ

```bash
aws iam list-policies --only-attached |\
jq -r '.Policies[] | 
select(.Arn | startswith("arn:aws:iam::aws:policy") )'
```

特定の名前のものだけフィルターしたければ

```bash
aws iam list-policies --only-attached |\
jq -r '.Policies[] | 
select(.Arn | startswith("arn:aws:iam::aws:policy")) | 
select(.PolicyName | contains("S3"))'
```

PolicyNameとArnのみ残したJson化
```bash
aws iam list-policies --only-attached |\
jq -r '[
  .Policies[] |
  select(.Arn | startswith("arn:aws:iam::aws:policy")) |
  { PolicyName: .PolicyName, Arn: .Arn}
]' \
> policies.json 
```

## 現時点のManagedPolicyの一覧

[2022/3/3時点のManagedPolicy](https://gist.github.com/takezoux2/f98c0aa73f1147a8d73beee6e6aee650)


## 補足

ManagedPolicyのNameを指定するときに、ARNのpolicy/の後が、`arn:aws:iam::aws:policy/aws-service-role/XXX`や`arn:aws:iam::aws:policy/service-role/YYY`
となっている場合は、`aws-service-role/XXX`や`service-role/YYY`と指定する必要があります。名前だけを渡すとそんなManagedPolicy存在しないと怒られるので、AWS Consoleとかからコピペって来た場合は、ARNの前部分を確認してみてください。
未経験からインフラエンジニアを目指して②

## フリースペース(好きに書かせて貰いますのコーナー)
いきなり学習記録から書き始めようと思ったのですが、まだ慣れないマークダウン記法を
サクサク使えるようにしたいので、少しでも入力する機会を増やそうとすべく
この項目を設けました。
ここは毎回投稿する度に色々と自由に書いてみたり、無理矢理こじつけてマークダウン記法を使いまくったりしたいと思います。
<font color="blue">(と書きながら、煙が出そうな脳みそをクールダウンさせたいのが本音だったりします)</font>

また、当面の目標についても目的意識がブレないように、毎回記載しておこうと思います。
無事達成して次の目標を定める時には随時更新していきます。
## 取り組み内容(当面の目標)
- ネットワークについての知識を会得し、理解を深める
- 頭で覚えただけでなく、きちんと専門用語を用いて説明出来るようになる
- 資格取得(CCNA)する

**<font color="Red">資格取得はスタートライン！実際の作業で滞りなく行えるようになる！！</font>**
## 今回行った学習
**1. ルーティングについて**
｢ルーティングってルーター使ってやる通信でしょ｣｢通信の通り道の事がルーティングでしょ｣と考えていました。
前者は浅はかな私の思考、後者はちょっと意味合い勘違いしていますね、反省です。

｢送信元から受信先(IPアドレス)までの最適ルートを探して送り届ける仕組み(経路の制御)｣との解説がありましたがイメージが湧かず。
しかしながら、もう一度よく解説を見ながらイメージを試みてみました。私なりに考えた結果は以下の通り。
<font color="blue">※Jリーグチームのサポーター歴が長い為、これが一番イメージしやすいので深くツッコまないで下さいね。</font>

- **送信元　＝　出発地　＝　自宅**
- **受信先　＝　目的地　＝　埼玉スタジアム**
- **最適ルートを探して送り届ける仕組み
　　　　＝自宅から埼玉スタジアムまでの最短経路を探して案内するツール(アプリ)**

最適は｢早く着く｣｢安全に着く｣等色々ありますが、ネットワークでは速度は重要な点ですので｢最短経路｣で考えてみました。
おぉ、これならよくわかる！！と言いますか、普段自分で行っている事と同じ事を
ネットワーク上でも行っているのかと理解が深まりました。

その後も私に襲い掛かる用語たちには上記のような脳内変換を参考に、なんとかひとつずつ
理解出来たかなと思います。
私なりに理解しようと幾分こじつけも入っているところは、何卒ご容赦下さい。
- **ルーター＝**最寄り駅
- **ルーティングテーブル＝**駅の乗り換え案内
- **ネクストホップ＝**次の駅
- **デフォルトゲートウェイ＝**駅の場所
- **スタティックルーティング＝**書籍型の時刻表
　　　　　　　　　　　　(定期購入しないと情報更新できない＝不測の事態は対応不可)
- **ダイナミックルーティング＝**乗換案内アプリ
　　　　　　　　　　　　(適時情報更新される⇒運行状況や快速運転を考慮した経路案内)
- **ルーティングプロトコル＝**到着が早い、運賃が安い、乗り換えが少ない等の判断基準
- **RIP　＝**目的地までの経由する駅(ホップ数)が少ない方を選択して進む
- **OSPF＝**目的地までに掛かる時間(コスト)が少ない方を選択して進む
- **エリア分割＝**JR全体の情報を案内板にあると確認に時間がかかる
　　　　　　その駅管轄（例:JR東日本）の情報だけ表示するように分割する
- **経路集約＝**｢A駅からB駅、C駅、D駅まで｣ならば｢A駅からD駅まで｣と行き先を纏めて考える

続いて学習したのはL2スイッチ・L3スイッチの構成についてです。
エッジスイッチやコアスイッチといった用語が出てきましたが、構成図の一例を見て
｢なんか会社の組織図のようだな｣と捉える事が出来たからか、平社員(PC)を束ねるリーダー
(エッジスイッチ)がいて、更にリーダーを束ねる課長(フロアスイッチ)がいてとイメージ出来
比較的スムーズに理解出来たと思います。

WAN、広域イーサネット、IP-VPNについても学習しました。
｢北海道・沖縄間のような遠距離・長距離のLAN同士を繋ぐ仕組み｣と理解しましたが
合っているでしょうか。
もうちょっと理解を深めるべく、更に色々調べようと思います。

**2.トランスポート層について**
｢データにフィットするアプリへ誘導する為の識別を行ったり、データの正確性を確認したり
高速でデータを通信する役割｣の事ですね。
これも私なりに落とし込めるよう、脳内変換してみました。

- **送信元ポート番号＝**観戦チケット(座席番号123/入場ゲートはAゲートだよと記載)
- **受信先ポート番号＝**埼玉スタジアムに記載されている入場ゲート
- **ウェルノウンポート＝**ホーム側はAゲート、アウェイ側はＢゲートと決まっている
　　　　　　　　　　(試合毎に変動しない)
- **ダイナミックポート＝**スタジアムの座席番号(同じ日時の試合で同じ番号は無い)
- **トランスポート層＝**入場ゲートを案内誘導する人
- **TCP＝**自分｢ユニフォームが買いたいです｣
　　　店員｢ユニフォームですね｣
　　　自分｢いくらですか｣
　　　店員｢2万円ですね｣というやりとり
- **UDP＝**自分｢ユニフォームが買いたいです｣
　　　店員｢2万円です｣
　　　自分｢ちょうどあります｣
　　　店員｢ありがとうございました！｣というやりとり
- **3ウェイハンドシェイク＝**自分｢選手との写真撮ってください｣
　　　              　　　　　　　　 他の人｢OKです！私も撮って貰っていいですか｣
　　　              　　　　　　　　 自分｢OKです！｣というやりとり

**また明日も学習した事を書いていきたいと思います。**
AWS インターネットゲートウェイの作成

# 概要

- AWSでインターネットゲートウェイを作成する

# ご注意！！！

- AWSは従量課金です。
- 本作業で料金が発生する可能性があります。
- 筆者は本作業で発生するいかなる料金も負担する事ができません。
- ご自身の責任の下作業をお願いいたします。

# 作るものの情報

- 別記事で作成したdev-vpc用にインターネットゲートウェイを作成する。
    - [AWS VPCの作成](https://qiita.com/miriwo/items/b28a4395264c08d183c6)
- 下記のインターネットゲートウェイを作成する。

    | 項目 | 情報 | 備考 |
    | --- | --- | --- |
    | 名前 | dev-igw |  |
    | タグ | 入力する | キー → Name<br>値 → dev-igw |
    | アタッチするVPC | dev-vpc |  |

# 作成

1. AWSにログインしてVPCの画面に移動する。
1. サイドバーの「インターネットゲートウェイ」をクリックする。
1. 画面上の「インターネットゲートウェイの作成」をクリックする。
1. 「作るものの情報」に記載した内容に沿って入力を行う（VPCとのアタッチはインターネットゲートウェイ作成後に実施）
1. 入力完了すると下記の様になる。

    ![インターネットゲートウェイの作成___VPC_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/086cdb75-0459-2fcb-5bf2-e63f9ee4868f.png)

1. 問題なさそうなら「インターネットゲートウェイの作成」をクリックする。
1. インターネットゲートウェイが作成され、インターネットゲートウェイ一覧に作成したものが追加される。
1. 一覧で只今作成したインターネットゲートウェイを選択し、右上の「アクション」をクリックし「VPCにアタッチ」をクリックする。

    ![インターネットゲートウェイ___VPC_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/1bf15ab6-717c-1600-5e4d-900fcd9f1eb4.png)

1. 「dev-vpc」を選択して「インターネットゲートウェイのアタッチ」をクリックする。

    ![インターネットゲートウェイのアタッチ___VPC_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/111fa6b3-0738-8528-6dcf-caf79f1d39a5.png)

1. dev-vpcにアタッチされた。

    ![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3330363431372f30363033653666382d313561392d643564352d373831342d3934646334386134373562352e706e67__1218×175_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a570e159-8733-2e9d-d32e-b5ecb72b30f2.png)
AWS VPCの中にサブネットを作成する

# 概要

- AWSにてVPCの中にパブリックサブネットとプライベートサブネットを作成する

# ご注意!!!

- AWSは従量課金です。
- 本作業で料金が発生する可能性があります。
- 筆者は本作業で発生するいかなる料金も負担する事ができません。
- ご自身の責任の下作業をお願いいたします。

# 作るものの情報

- 別記事で作成したdev-vpcの中にパブリックサブネット1つとプライベートサブネット2つを作成する。
    - [AWS VPCの作成](https://qiita.com/miriwo/items/b28a4395264c08d183c6)
- パブリックサブネット

    | 項目 | 情報 | 備考 |
    | --- | --- | --- |
    | VPC ID（所属VPC） | dev-vpc |  |
    | サブネット名 | dev-public-subnet-1a |  |
    | アベイラビリティゾーン | ap-northeast-1a |  |
    | IPv4 CIDRブロック（IPアドレスの範囲） | 10.0.10.0/24 |  |
    | タグ | 入力する | キー → Name<br>値 → dev-public-subnet-1a |

- プライベートサブネット_1

    | 項目 | 情報 | 備考 |
    | --- | --- | --- |
    | VPC ID（所属VPC） | dev-vpc |  |
    | サブネット名 | dev-private-subnet-1a |  |
    | アベイラビリティゾーン | ap-northeast-1a |  |
    | IPv4 CIDRブロック（IPアドレスの範囲） | 10.0.20.0/24 |  |
    | タグ | 入力する | キー → Name<br>値 → dev-private-subnet-1a |

- プライベートサブネット_2

    | 項目 | 情報 | 備考 |
    | --- | --- | --- |
    | VPC ID（所属VPC） | dev-vpc |  |
    | サブネット名 | dev-private-subnet-1c |  |
    | アベイラビリティゾーン | ap-northeast-1c |  |
    | IPv4 CIDRブロック（IPアドレスの範囲） | 10.0.21.0/24 |  |
    | タグ | 入力する | キー → Name<br>値 → dev-private-subnet-1c |

# 作成

1. AWSにログインしてVPCの画面に移動する。
1. サイドバーの「サブネット」をクリックする。
1. 画面上の「サブネットを作成」をクリックする。
1. 「作るものの情報」に記載した内容に沿って入力を行う。
1. 入力完了すると下記の様になる。
    1. パブリックサブネット

        ![VPC_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ab3baded-f187-a946-b346-0ba3becd4014.png)

    1. プライベートサブネット_1

        ![VPC_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/d0a08981-b0f8-9e94-fe28-5018b79e0347.png)

    1. プライベートサブネット_2

        ![VPC_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/c877a819-ec5a-4227-9f59-bf5e32a619d2.png)

1. 問題なさそうなら「サブネットを作成」をクリックする。
1. 合計3つのサブネットが作成され、サブネット一覧に作成した各サブネットが追加される。
ページング

仮想アドレスと物理アドレスをマップするアドレス変換は理解したが、実際にどのようにマップされているのかを解説。

## ページング
メモリアドレス空間を固定長の領域（ページ）に分け、ページごとにアドレスをマップする方式。
x86-64の64ビットモードではページの大きさは4KiB、2MiB、1GiBから選択できる。

:::note info
※実際にアドレス変換を行うハードウェアをMMU（memory management unit）と呼ぶ。MMUはCPUに内蔵されており、アドレス変換とメモリ権限のチェックを行う。
:::

![IMG_9097.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543427/49a80a0a-fe1b-db55-e034-d7558da555ce.jpeg)

重要なのは、仮想アドレスは連続値である必要があるが、物理アドレスはバラバラの位置にあって良い。
※そもそも仮想アドレスを連続的に取るための方式なので当たり前。

仮想アドレスを新規に割り当てる時は、アプリケーションが使用できるメモリ領域にiページ分（2MiB程度）の連続した領域を確保できるかを全探索する。できれば割り当てるし、できないのであればどこかをfree()させる。


### 階層ページング
仮想アドレス→物理アドレスに変換するためには複数のテーブルを経由する構造。

**例**
仮想アドレス：oxffff800000003120

↓

実際の値（2進数）
1...1 **|** 1 0000 0000 **|** 0 0000 0000 **|** 0 0000 0011 **|** 0001 0010 0000 **|**
ビット数（64ビット）
64~48|47~39|38~30|29~21|20~12|11~0|

↓

- 64~48 は固定（47ビット目と同じ値に設定する）
- 47~39：256
- 38~30：0
- 29~21：0
- 20~12:0
- 11~0:120（オフセット）

CR3→PML4[256]→PDP[0]→PD[0]→PT[0]→+オフセット(120)→ 0x150120

このように仮想アドレスが階層的に物理アドレスに変換される

### リニアアドレス
通常はソフトウェアは論理アドレスを指定する。その後セグメンテーションにより論理アドレス→リニアアドレスに変換される。しかし、64ビットモードではセグメンテーションによるアドレス変換は行われないので、論理アドレス＝リニアアドレスとなる。


## 参考文献
- ゼロからのOS自作入門 (http://zero.osdev.jp/)
OpenCV(C++)で透過PNGを重ねる

[void 	copyTo (OutputArray m, InputArray mask) const](https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a626fe5f96d02525e2604d2ad46dd574f) を使って、透過PNGを重ねる方法

```cpp
void putTranspPng(cv::Mat &_frame, cv::Mat &_png, int _x, int _y)
{
    vector<cv::Mat> layers;
    cv::split(_png, layers);
    // 下記の処理は_pngがRGBAの4チャンネルMatである必要がある
    if (4 != layers.size())
        cerr << "putTranspPng() invalid input" << endl;
    // 貼り付ける画像（3チャンネル）
    cv::Mat rgb;
    cv::merge(layers.data(), 3, rgb);
    // copyToに使うmask（1チャンネル）
    cv::Mat mask = layers[3];
    // copyToに使うroi
    cv::Mat roi = _frame(cv::Rect(_x, _y, rgb.cols, rgb.rows));
    rgb.copyTo(roi, mask);
}

// frameの真ん中に小さい画像imgを重ねる場合
cv::Mat img = cv::imread("test.png", -1);
int x = frame.cols/2 - img.cols/2;
int y = frame.rows/2 - img.rows/2;
putTranspPng(frame, img, x, y);
```
s3 バージョンニング確認

# 目的
- s3 のバージョニング有効化後の見え方を確認

# バケット新規作成
1. S3 トップ画面から "バケット作成" を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/6db4ee80-9ee1-caf3-65c0-13f6b06739c1.png)

2. バケット名と AWS リージョンを指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/8e66fe65-f026-d41d-8983-ac76a317cf14.png)

3. オブジェクト所有者はそのまま
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/65e47854-3969-222a-4ac0-2a0487ffcaa1.png)

4. パブリックアクセスをすべてブロックを有効(デフォルト)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/380f9fde-de63-74d3-296b-5a1111395810.png)

5. バージョニングを有効化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/c0033c8a-4859-b27c-8a43-235e4100cdcd.png)

6. タグは適宜
6. サーバ側の暗号化(テストなので無効)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/f9c05856-dc23-3c87-03c5-51be7d466829.png)

7. オブジェクトロック(オブジェクトを誤って上書き防止する機能)もそのまま
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/7d08b9f8-3cd8-c7b9-e5be-7c473c352902.png)

8. 設定値を確認して "バケットを作成" を選択
9. 数秒待って作成完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/12709fac-b157-90f6-cb06-f9eb8e1979eb.png)

10. フォルダ作成後、ファイルをアップする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/b2d639da-5253-dc13-08db-345f60a4b0d3.png)

11. すぐ削除するのでスタンダートクラスでアップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/043643ed-3b47-03b9-96a3-11095d156d32.png)

12. 対象ファイルを更新してアップロード。その後バージョン確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/36532cb7-7add-c1da-62ca-8e357b93c292.png)

13. ファイル保存後、複数の操作が可能
    - ストレージクラス編集
    - その他メタデータやタグ編集
    - クエリ生成など

14. 最後のバケット削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/8d9d72ad-7308-197e-44d3-19d621bf73f6.png)
※ パケットは空でないと削除不可

15. バケットを空にしてから削除実施
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/5ba0fe2a-cd56-1271-2784-d91f62271a6e.png)

# おしまい
s3 ストレージクラスの特徴はもう少し理解する必要がある
AWS VPCの作成

## 概要

- AWSにてVPCを作成する

## ご注意！！！

- AWSは従量課金です。
- 本作業で料金が発生する可能性があります。
- 筆者は本作業で発生するいかなる料金も負担する事ができません。
- ご自身の責任の下作業をお願いいたします。

## 作るものの情報

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| リージョン | ap-northeast-1 |  |
| 名前 | dev-vpc |  |
| IPアドレスの範囲 | 10.0.0.0/16 |  |
| IPv6の紐付け | 無し |  |
| テナンシーの設定 | デフォルト |  |

## 作成

1. AWSにログインしてVPCの画面に移動する。
1. 現在のリージョンが東京リージョンになっている事を確認する。
1. 画面上の「VPCを作成」をクリックする。
1. 下記のように設定する。

    | 項目 | 情報 | 備考 |
    | --- | --- | --- |
    | リージョン | ap-northeast-1 |  |
    | 作成するリソース | 「VPCのみ」を選択 | デフォルト |
    | 名前タグ | dev-vpc |  |
    | IPv4 CIDRブロック | 「IPv4 CIDR ブロックの手動入力」を選択 | デフォルト |
    | IPv4 CIDRブロック（IPアドレスの範囲） | 10.0.0.0/16 |  |
    | IPv6 CIDRブロック（IPv6の紐付け） | 無し |  |
    | テナンシーの設定 | デフォルト |  |
    | タグ | 入力する | キー → Name<br>値 → dev-vpc |

1. 下記の様になる。

    ![VPC_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/c2d8f2dc-b2f0-88f8-3b98-76a4e84f1925.png)

1. 問題なさそうなら「VPCを作成」をクリックする。
1. VPCが作成され、VPC一覧に作成したVPCが追加される。
Wordleの実力を試したくない？Wordleの対戦ゲームを一晩で作りました

# 追加(2022/04/23)
URLを非公開にしました😭

# 本記事で言いたいこと
* Wordleをひとりで毎日やるの飽きてないですか？一緒に対戦しようよ！
* 思いつきで何か作るときは「開発コスト」と「維持コスト」を最小限にしよう

# 作ったもの
ターンバトル性のWordleバトルゲームを作りました！
ゲーム性を高めるために以下のような機能を実装しました😄

* 時間制限
* 辞書にない文字を３回かくとスキップされる
* 対戦者がいなくなってしまった時のAIモード

## プレイ動画

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">毎日Wordleやって上達してきた人へ！<br>他の人と対戦したくないですか？<br>Wordle Battle Onlineという対戦ができるゲームを作りました〜！<br>ぜひプレイしてね<a href="https://t.co/Ifhn1Xp7AQ">https://t.co/Ifhn1Xp7AQ</a> <a href="https://t.co/KkIYTf9Wy7">pic.twitter.com/KkIYTf9Wy7</a></p>&mdash; ちぇん (@yuno_miyako2) <a href="https://twitter.com/yuno_miyako2/status/1499034194227646468?ref_src=twsrc%5Etfw">March 2, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 作成工程

1. 深夜12:30 作りたくなる
2. 深夜1:07 UIをまず作る
3. 深夜3:47 MVP完成！
4. 朝8:18 FBをもらい改善

「作りたくなったから作ったもの」はできるだけ工数をかけずに、休日１日を潰すくらいの時間で作ると失敗した時のダメージが少ないです！
またリアルタイムで作っていく過程をTwitterに載せることで少なからず興味を持ってくれた人がいて、MVPをプレイしてFBをたくさんいただけました。

# どうやってこのスピード感を出すか

環境面、メンタル面で以下のことを気をつけています。

## 環境面
何かを思いついた時に５秒後にデプロイできているような環境を用意しておくと心地が良いです。

* AWSアカウント
* コマンド１つでデプロイ可能なテンプレート
* 使いまわせるコンポーネントはOSS化もしくはすぐにコピペ可能な状態でストック
* サブドメインが切れるような汎用的なドメイン(オプション)

自分の場合は、フロントエンドはNext.jsでServerless Framewrokのコマンドでデプロイ可能なテンプレートを用意しています。バックエンドはHasura Cloudで一つのDBにスキーマを変えて相乗りさせています。

個人開発における技術採用は以下で判断すると良いと思います。

* 自分が使っていて最も快適でスピード感が出る
* 使われなくなっても運用コストがほぼ０円で維持できる
* アプリを作る必要がありそうならマルチプラットフォーム

## メンタル面
賛否ありそうですが、自分の場合は以下のメンタルで個人開発をやっています。

* 個人開発は99%失敗する
* 拡張性とか保守性とかセキュリティとか考えても、どうせすぐに誰も使わなくなる
* だからMVPは１日で書き捨てる勢いでやる
* 何よりも優先するのは動くMVPを作ること
* 需要があることがわかったらその時丁寧に作り直そう

９９%失敗するので、なるべく１つあたりにかけるコストは小さい方が良くて、1~3日で完成するスコープでものを作ります。
当然質が低いものができますし、今回のWordle Battleもはっきり言ってしまえばズルができる抜け穴が残っています。
ただそういう粗の多いMVPでもユーザに使ってもらえますし、その中で需要の有無を測ったり有益なFBが得られます。

# まとめ

ぜひ、[Wordle Battle Online](https://english.yunomy.com/wordle/rooms)やってみて感想ください！
感想は[Twitter](https://twitter.com/yuno_miyako2)でお願いします〜！
Ready Player Meを使って顔写真から作成したアバターをPlayCanvasで動かす。



#### この記事について
Wolf3Dが提供している「[Ready Player Me」](https://readyplayer.me/)を使って自分の顔写真からアバターを生成してPlayCanvasで動かす方法を紹介します。「Ready Player Me」では写真からアバターを生成することができます。また作成したアバターは同じボーン構造のアバターで多くの種類のアバターが作れるので一度、対応するアニメーションを使い回すことが出来ます。


### 完成プロジェクト
![](https://i.imgur.com/4IAd9RI.gif)
プロジェクトURL:https://playcanv.as/p/UG59NNgq/

### アバターを作成
 
<img src="https://i.imgur.com/WRQ9i6f.png" width="400" />

こちらのページにアクセスをして自分のアバターを作成していきます。

#### 1. Ready Player Meへアクセス

今回は全身のfbxファイルを作成するのでこちらのURLから生成します。
https://vrchat.readyplayer.me/avatar

#### 2. アバターの種類を選択
`body type`を選択します。
![](https://i.imgur.com/Vr2Ukvf.png)

#### 3. 顔写真をアップロード
次にアバターの元となる3Dモデルをアップロードします。
![](https://i.imgur.com/7VjNEBn.png)

#### 4. アバター生成
アップロードした画像を元にアバターが生成されます。
![](https://i.imgur.com/9tPjSYB.png)

この画面アバターの調整が出来ます。
調整ができたら「Next」を押しましょう。

#### 5. 作成したアバターをダウンロード

![](https://i.imgur.com/BFKqOYI.png)
ダウンロードURLが表示されますので「Download the Avatar」の下のURLをコピーしてください。ファイルは`.fbx`形式でファイルのダウンロードができます。
![](https://i.imgur.com/loC6U71.png)


### アバターを動かす
<img src="https://i.imgur.com/WRQ9i6f.png" width="400" />

今回の記事ではPlayCanvasを利用してアバターを動かしていきます。予め移動などのアニメーションが入っているプロジェクトを利用して作成していきます。アニメーションは「[mixamo](https://www.mixamo.com/#/)」を利用して作成しています。


#### PlayCanvasについて
[PlayCanvas](https://playcanvas.com/)はJavaScriptで記述されたWebGLのエンジンで、最近GitHubのスター数が7000を超えました。SaaS型のエディターを兼ね備えているゲームエンジンです。engineについては主にSnapのメンバーWill Eastcottを中心にOSSとして公開及び継続的に開発が進められています。Engine単体として利用する場合には、Three.js, Babylon.jsなどのWebGLライブラリと似た使い方を使用することができます。またビジュアルエディターとコードエディターが存在しており。エディターはクラウド上でプロジェクトの作成から公開までが出来ます。FBXやOBJといった3Dモデルの素材については、ブラウザへドラッグアンドドロップをすることでGUIから操作・配置ができるエディターがあります。

### プロジェクトの準備
PlayCanvasで3Dモデルを利用するためにプロジェクトの準備をします。PlayCanvasのアカウントが無い場合は「[公式サイト](https://playcanvas.jp/)」からアカウントの作成をします。プロジェクト自体は新規で作成をしても問題ありませんが、移動に関するスクリプトが入ったテンプレートを用意しておりますのでそちらを利用して作成します。

#### 1.テンプレート用プロジェクトにアクセス
![](https://i.imgur.com/gkePs0S.png)

[こちらのプロジェクト](https://playcanvas.com/project/890649/)にアクセスをしてください。

#### 2. プロジェクトをフォーク
![](https://i.imgur.com/OUBccqS.png)
プロジェクト名を入力してください。（好きな名前で大丈夫です）

#### 3. エディタを起動
![](https://i.imgur.com/A01rnV9.png)
プロジェクトページの中にある、EditorボタンをクリックしPlayCanvas Editorを開きます。

### テンプレートのモデルを入れ替える
次に、モデルを先程作成したモデルに置き換えます。

#### 1.モデルをアップロード
![](https://i.imgur.com/bLQwbbv.png)
次に先程作成したモデルをPlayCanvasにモデルをインポートします。
`fbx`ファイルをドラックアンドドロップをして、3Dモデルをアップロードします。


#### 2. スターターキットのモデルを入れ替える
![](https://i.imgur.com/yC65W72.jpg)

スターターキットはReady Player　Meで作成したモデルが入っておりますのでこちらのモデルを入れ替えます。ヒエラルキー上に新しいモデルを配置して古いモデルを消します。


#### 3. 起動
![](https://i.imgur.com/4IAd9RI.gif)

これで自分の作成した３DモデルをPlayCanvas上で三人称視点で動かすことが出来ます。


#### 追加情報

##### 移動方法について
移動方法のサンプルプロジェクトについては「[Third Person Controller](https://developer.playcanvas.com/ja/tutorials/third-person-controller/)」をご覧ください。

##### その他プロジェクトについて
また、他の使い方としては、プロジェクト内で生成することも出来ます。
Saad Haiderさん作成の「[Playcanvas X Ready Player Me TPC](https://playcanvas.com/project/845238/)」のプロジェクトがありますので興味がある方はこちらもご参照ください。
Databricks SQLにおけるワークスペースの色の変更

[Workspace colors \| Databricks on AWS](https://docs.databricks.com/sql/admin/colors.html) [2022/2/10時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

ワークスペース管理者は、ワークスペースに対するカスタムカラーパレットを作成することができます。作成すると、ダッシューボードの作成者は任意でこのパレットをインポートし、ダッシュボードに適用することが可能となります。ダッシュボードの作成者は、ダッシュボードにおけるビジュアライゼーションに対して、[ダッシュボード固有のカラーパレットを使う](https://qiita.com/taka_yayoi/items/834bef9aa784e1a045d8#%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AE%E8%89%B2%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA)か、全くパレットを適用しないかを決めることができます。カラーパレットが適用されない場合、ビジュアライゼーションはSQLエディターで設定された色を使用します。

# カスタムカラーパレットの作成

1. サイドバーの![](https://docs.databricks.com/_images/user-settings-icon.png)**Settings**をクリックし、**SQL Admin Console**を選択します。
1. **General**タブをクリックします。
1. **Workspace Colors**の隣の**Create**をクリックします。
    カラーパレットが作成済みの場合には、編集あるいはクリアするために**Edit**をクリックします。
1. 既存の色を編集するには以下のいずれかを行います。
    - 四角をクリックし、カラーセレクターをクリックするかスポイトを使用して新たな色を選択します。
    - 四角の隣のテキストボックスをクリックし、16進数を入力します。
1. 色を削除するには**X**をクリックします。
1. 色を追加するには**Add**をクリックします。既存の色の変更手順に従います。
1. **Save**をクリックします。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
Streamlitで文字色を自由に変えるhtml記法

Streamlitでhtml記法を実現するには以下のように書けば良いわけだが（`text`部分は任意のraw html）、
```python
st.write(text, unsafe_allow_html=True)
```
例えば条件によって文字の色を変えたい！でも改行とかは入れたくない！という時は、ここの`text`にf-string表記を入れればよい。

数字のリストがあったとして、偶数はオレンジ、奇数はグレーで表示したい時の例
```python:app.py
import streamlit as st

numbers = [1,2,3,4,5,6,7,8,9]
text = ""
for i in numbers:
  if i%2==0:
    text += f'<span style="color:coral">{i}</span>'
  else:
    text += f'<span style="color:darkgray">{i}</span>'        

st.markdown('**color change example:**\n') #太字
st.markdown("---") #区切り線
st.write(text, unsafe_allow_html=True)
```

出力結果
![スクリーンショット 2022-03-03 17.12.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641587/cc62e728-950a-be20-7ada-2c2385b87d45.png)
【iOS】Storyboardを使わずUIを作成するために必要なXCodeの初期設定

# 目的
Storyboardを使わずにUIを作成する場合、必要となるXCodeの初期設定について説明


# 流れ
①: プロジェクトを作成し、実行できることを確認(Storyboardあり)
②: Main.storyboard を削除
③: SceneDelegate.swift のコードを全てコメントアウト
④: MainInterface の設定を変更
⑤: info.plist の Storyboard Name を削除
⑥: ViewController のプログラム変更
⑦: 実行結果


# ①: プロジェクトを作成し、実行できることを確認(Storyboardあり)
新規でプロジェクトを作成し、「▶︎」ボタンを押して実行可能なことを確認する


# ②: Main.storyboard を削除
Main.storyboard上で右クリック → 「Delete」 → 「Move To Trash」


# ③: SceneDelegate.swift のコードを全てコメントアウト
SceneDelegate.swift のコードを全て選択して、「Command + /」 でコメントアウト

# AppDelegate.swift のコードを変更

```AppDelegate.swift 
import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?   // アプリ起動時に表示する View を格納する変数
    
    // 起動時に実行
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.makeKeyAndVisible()
        
        window?.rootViewController = ViewController()   // アプリ起動時に表示するViewを指定
        return true
    }

    // MARK: UISceneSession Lifecycle
//
//    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
//        // Called when a new scene session is being created.
//        // Use this method to select a configuration to create the new scene with.
//        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
//    }
//
//    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
//        // Called when the user discards a scene session.
//        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
//        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
//    }

}
```


# ④: MainInterface の設定を変更
画面左上にある「"アプリ名"」 → 「Target」 → 「General」 → Deployment Info の 「Main Interface」 → Main を削除(空欄にする)


# ⑤: info.plist の編集
「info.plist」 → 「Application Scene Manifest」 → 「Application Session Role」 → 「item 0(Default Configuration)」 → 「-」(項目にカーソルを合わせると出てくる)

※ SceneDelegate で画面を呼び出す時は、「item 0(Default Configuration)」を消すのではなく、「item 0(Default Configuration)」でいらないものを消す。いらないもの については今回省略します！


# ⑥: ViewController のプログラム変更

```ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.backgroundColor = .green
    }
}
```


## ⑦: 実行結果
見事、StoryboardなしでUI作成を行えました！

<img width = 300 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/8c1f4c49-619e-e1b3-130c-8d897e699712.png">


# 参考サイト

https://www.youtube.com/watch?v=CAzFB7RPhvU&list=PLJGQf09UDweJPR74G4p8bjQ1nglif4NBZ&index=2