OmniAICreator/Qiita-1.07M huggingface dataset:
【地理空間データ】件付き自己回帰モデルの概要

# はじめに

地理空間データの勉強を始めようとして、村上大輔さんの<a href = "https://bookclub.kodansha.co.jp/title?code=1000042158">「Ｒではじめる地理空間データの統計解析入門」</a>(2022年4月6日発売)を読み初めました。**まだ全て読んでないですが、間違い無く良書**なので、本の中で紹介されていた手法を使い手を動かしてみました。なお、書いているコードの9割は本書に記載されている物を使います。前回は同時自己回帰モデル(Simultaneous Autoregressive; SAR)と呼ばれる空間相関をモデルを実装し、回帰係数の解釈までを行いました。今回は条件付き自己回帰 (Conditional Auto-regressive; CAR)と呼ばれる1つのエリアが周りのエリアの影響を受けているという仮定するモデルについてまとめてみます。（Rでの実装はSARモデルの場合とさほど変わらないので省略致します）

**前回**　　

https://qiita.com/Shu25/items/449fd4aba0d0365b78de

# 条件付き自己回帰 (Conditional Auto-regressive; CAR) model  

同時自己回帰モデル(Simultaneous Autoregressive; **SAR**)とはエリア間の空間相関関係を同時にモデル化するもので、同時多発的に各エリア同士が影響しあう空間相関性を仮定するものです。また、条件付き自己回帰モデル(Conditional Autoregressive; **CAR**)とは１エリアの観測値が周りのエリアの影響を受けていると仮定します。エリア同士の同時多発的相互作用は考慮されません。また、CARモデルは観測値が少ない（絶滅危惧種の分布パターンや疫病の感染者数）データに活用される事があります。

![統計力 (AIxデータ) (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044781/7e179118-d747-81d1-18c3-0412a74867d3.png)

また、CARモデルは観測値が少ない不確実（絶滅危惧種の分布パターンや疫病の感染者数など）なデータに活用される事があります。たとえば、以下の分布図では、右下端の3という観測値がたまたまなのか、それとも必然なのか、判断が難しい場合に活用されます。CARモデルはMCMCを始めとするベイズ推定が活用される事で、データの不確実性をカバーしています。

![qiita.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044781/e88502ce-49db-bd1a-8cb2-af14e4fb8652.jpeg)


# Intrinsic CAR モデル  

代表的なCARモデルで、以下の式で表されます $\dfrac{\sum_j w_{ij} z_{j}}{\sum_j w_{ij}}$ で近隣エリアの期待値を与え、空間相関を考慮しています。　　 
$\tau^2$は$z_i$の分散であり、大きいほどエリア間の差が説明され、0に近いほど一様に近い分布になります。  
$\sigma^2$は$\epsilon_i$の分散であり、大きいほどノイズが多くなり相関関係が説明されにくく、小さいほど空間相関が説明されます。  

$$
y_i = \sum^K_{k = 1} x_{i,k}\beta_{k}+z_i + \epsilon_i,  \qquad z_i|z_{j \ne i} \sim N\Big(\dfrac{\sum_jw_{ij} z_{j}}{\sum_j w_{ij}}, \dfrac{\tau^2}{\sum_jw_{ij}}\Big), \qquad \epsilon \sim N(0, \sigma^2)
$$


### 拡張版 Intrinsic CAR モデル 

ICARモデルは弱い空間相関を捉えられない弱点があります、そのため、ICARモデルを拡張したモデルがいくつか存在します。

#### Besag-York-Mollie(BYM)  モデル 
ノイズ$\theta_j$を加える事で弱い相関関係を捉えます。 


$$
z_i|z_{j \ne i} \sim N\Big(\dfrac{\sum_j c_{ij}(z_{j}+\theta_j)}{\sum_j c_{ij}}, \dfrac{\tau^2}{\sum_j c_{ij}}\Big), \qquad \theta_j \sim N(0, s^2)
$$


#### Leroux モデル 
相関の強さを表す$\rho$を加える事で空間相関を説明します。

$$
z_i|z_{j \ne i} \sim N\Big(\dfrac{\rho\sum_j c_{ij}z_j}{\rho\sum_j c_{ij}+1-\rho}, \dfrac{\tau^2}{\rho\sum_j c_{ij}+1-\rho}\Big), \qquad \theta_j \sim N(0, s^2)
$$. 


#### Stern and Cressie モデル 
Lerouxモデル同様、相関の強さを表す$\rho$を加える事で空間相関を説明します。

$$
z_i|z_{j \ne i} \sim N\Big(\rho\dfrac{\sum_j c_{ij}z_j}{\sum_j c_{ij}}, \dfrac{\tau^2}{\sum_j c_{ij}}\Big), \qquad \rho \sim Unif(0, 1)
$$




# おわりに
村上大輔さんの<a href = "https://bookclub.kodansha.co.jp/title?code=1000042158">「Ｒではじめる地理空間データの統計解析入門」</a>で紹介されている、空間相関モデルのひとつ、**条件付き自己回帰 (Conditional Auto-regressive; CAR)モデル**の概要について簡単にまとめました。詳しい実装方法が知りたい方は、ぜひ当本を手にとってみてください。



### 参考文献

https://bookclub.kodansha.co.jp/title?code=1000042158
Talend Open StudioでHyper Fileに出力する　その１

## 現状
Tableauのデータソースを作るために、PythonとHyper APIの組み合わせでHyper Fileを作成しています。一方でTalend Open Studio(TOS)を使うことがありますが、TOSはHyperに出力できないのであった。

## 目標
Hyper FileのJDBC Driverを書いてTOSに出力できるようにすることを目標にします。

## 今の私

Javaの開発経験なし。
TOSのtJava系コンポーネントでコーディングするぐらい。

## 開発環境作り

私のマシンはLubuntuです。
JDKとGradleを用意します。
```shell
sudo apt install openjdk-8-jdk
sudo snap install gralde --classic
```

## Hyper APIのインストール

これに従ってインストールします。

https://help.tableau.com/current/api/hyper_api/en-us/docs/hyper_api_installing.html#install-the-hyper-api-for-java

```shell
gradle build
gradle run
```

なんか最後まで動いたからOK
Swift 実行環境(develop, debug, release)分けしてみた

# 目的
- Swift スマホアプリ開発を行う際、『develop(作業用), debug(検証用), release(公開用)』 に環境を分けて実行する方法を紹介する
- 筆者の備忘録

# 流れ
下準備
プログラム実装
結果


# 下準備

**① : 実行環境の受け皿を用意する**
```PROJECT > Info > Configurations > + > Duplicate "Debug" Configuration```として、「Develop」を追加
<img width = 80% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/aef525a9-1a67-6fbf-631a-49364082ddf5.png">

<img width = 80% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/1fce3e30-d560-70e0-4e16-005619bd67bb.png">

**② : Apple Clang - Preprocessing を変更する**
右側の項目をダブルクリック
「$(inherited)」 を削除する
「DEBUG=1」→「Debug」 (各自作成したい実行環境名が入ります)
👇 2枚目のようにしてください
<img width = 80% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/4068a61f-25e9-bc16-d866-74e76d0a25ec.png">

<img width = 80% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/e6228f27-ea3e-ebe6-fa95-2afe4ad1f65f.png">

**③ : プログラムで変更可能にする**
```Build Setting > 「other swift」で検索 > Swift Compiler - Custom Flags > Other Swift Flags```
画像のように、「-D 環境名」に変更していく
<img width = 80% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/62fa17c7-cf6f-adf8-b691-7f2419bb429e.png">



**④ : 実行環境を作成する**
```Manage Schemes > 左下・・・ > Duplicate > 名前を指定``` を行い、👇 4枚目の画像のような状態にする
<img width = 60% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/5eb7c6d3-de97-1b41-91e6-7309a133ffe7.png">

<img width = 60% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/ab8e9eab-be31-fdcc-3f9e-36c1447a767e.png">

<img width = 80% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/d8538d72-6da1-c93b-476c-ce893e08b3f3.png">

<img width = 80% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/60958d1f-c4e1-e2e1-fb90-ad0fecbe91f0.png">

<img width = 80% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/d8d7deac-ef18-9811-1970-87a978aa8a13.png">


**⑤ : 実行環境を選択できるか確認**
👇 2枚目のようになっていれば成功です！
<img width = 60% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/afc4162e-b982-efc6-c25d-adb20b1a40df.png">

<img width = 60% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/c1aa9521-34c0-5f94-03bb-98403bf19e32.png">


# プログラム実装
コードを実装
```#if, #elseif, #else, #endif ``` +```実行環境名``` で、実行環境の切り替え確認 を行う
```ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // 実行環境の確認
        #if Develop
            print("🐵")
        #elseif Debug
            print("🐥")
        #else
            print("🐻")
        #endif
    }
}
```



# 結果
実行環境を指定して実行！
<img width = 80% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/232a9ac3-92e8-2aeb-73d8-bb371a878716.png">

<img width = 80% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/b36ffe87-e58d-2afd-f0e6-9213e14fe8cd.png">


# 参考サイト

https://zenn.dev/oimo_revolution/articles/17ab026cbef464
【PHP】【個人開発】エンジニアマッチングサービス

エンジニア同士がマッチできるサービスをリリースしました。

![match(全体マッチングの流れ)](https://user-images.githubusercontent.com/60878547/167395691-3b3b3651-f204-49d1-9002-f8849601db28.gif)

# URL
https://paircode.herokuapp.com/user_login/user_top.php

# マッチングの流れ
`マッチ画面`上で気になるエンジニアに`いいかも`を送ります。
送られた相手から`いいかも`がくれば、マッチング成立となります。

![match(マッチングの流れ_前編).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/bca4c90a-7761-a6da-22fe-dd44ec6b87f8.gif)

マッチしたユーザーとはメッセージでやり取りすることができます。

![match(マッチングの流れ_後編).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/60e1186f-d4ba-aab6-a42b-fed2b0b302b5.gif)

# 実装機能
### マッチ機能
気になるエンジニアとマッチできる機能です。

![match(マッチングの流れ_前編).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/bca4c90a-7761-a6da-22fe-dd44ec6b87f8.gif)

https://qiita.com/ryouya3948/items/fc41f87553b7569fd1f0

### タグ機能
プロフィールなどで、スキルや資格等を登録する際のタグ機能です。

![タグ機能.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/b895c879-160a-140f-84a6-6587a0190b63.gif)

https://qiita.com/ryouya3948/items/da1a53e32edbd16637a5

https://qiita.com/ryouya3948/items/f8a574bb900ba4fefecb

https://qiita.com/ryouya3948/items/ea839635de0818f280b4

### メッセージ機能
マッチしたユーザーとメッセージのやり取りをすることができます。
相手側からメッセージが送られてきたら、通知が表示されるになっています。

https://qiita.com/ryouya3948/items/3d471b24b9ff62c3ad0d

https://qiita.com/ryouya3948/items/13b9ee9fd7d436355d40

# 使用技術
・フロントエンド
- HTML
- CSS
- Javascript
・バックエンド
- PHP
- FWなし
・インフラ/開発環境
- heroku
- Mysql
- VScode
- Git/GitHub
Cloud Pak for Data4.0のハンズオン資料：データのショッピング（必要なデータの選択）（第５回）

## データのショッピング（必要なデータの選択）（第５回）

## 記事の内容
WKCの主要な機能を記載いたします。
• データユーザの作成（第１回）
• カタログ・プロジェクトを作成する(第２回)
• データアセットの探索、カタログ化する（第３回）
• データアセットの理解とソーシャル化（第４回）
**• データのショッピング（必要なデータの選択）（第５回）(当記事)**
• アナリティックスやAIで必要なデータの準備（第６回）
• 機微（センシティブ）なデータの保護（第７回）

##### 本記事は、上記の[データアセットの理解とソーシャル化（第４回）](https://qiita.com/Tiger-Kid/items/e85567122438ed031cb4) の続きです。
このタスクでは、カタログのインテリジェント機能であるShop for Data AI-poweredを活用して、推奨してくれた関連性の高い資産を確認します。カタログ内の資産として、資産タイプとタグのフィルター機能も活用します。タグ付けは、資産をカタログ化する際には不可欠なものです。データ利用者が目的の資産を簡単に検索できるようになります。

## 公式ドキュメント
IBM Cloud Pak for Dataの公式ドキュメントは[こちら](https://www.ibm.com/docs/en/cloud-paks/cp-data/4.0?topic=overview)をご参照ください。

## 本編
**提案を使用したショッピング**
 「Watsonの推奨」、「高評価」、「最新の追加」セクションを使用して、データを簡単に検索することができます。これらのカテゴリーには、カタログ、キュレーションなど豊富なデータ資産として自動的にデータが取り込まれます。

**検索を使用したショッピング**
このセクションでは、カタログ資産ブラウザーの検索エリアを使用して、検索条件を指定することにより、データを検索します。検索条件には、大文字/小文字の区別はありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/d1e2c879-72ff-0952-be26-daa8c713f728.png)
1.	検索エリアで、「ドキュメント」と入力します。
タグ/資産名/説明から検索条件に適合するデータ資産が表示されます。
2.	「x」を押して、検索条件を削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/4c5071e5-5ebf-1d2f-c2cb-9f6998151370.png)
3.	検索エリアで、「データウェア」と入力します。
タグ/資産名/説明から検索条件に適合するデータ資産が表示されます。ここでは、自動車保険DBが表示されます。
4.	「x」を押して、検索条件を削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/2dc233be-6017-9e5a-ccd2-71b5e1dd6fd8.png)
5.	検索エリアに「claim」と入力します。
タグ/カラム名/資産名/説明から検索条件claimに適合するデータ資産が表示されます。
自動車保険証書テーブルは、claim を含むカラム名、「LAST_CLAIM」、「DENIED_CLAIMS」、「CLAIMS_FILED」が検索条件に適合しているため表示されております。
6.	「x」をクリックして、検索条件を削除します。


**フィルターを使用した検索**
このセクションでは、フィルターを使用することで、データ資産が自動的に絞り込まれることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/bce51ca2-cf9e-2cf5-6ecf-f6a9b169da01.png)
始める前に、検索エリアがクリアになっていることを確認してください。また、Watsonの推奨などのエリアが省略されていることも確認してください。もし、表示されている場合は、省略をクリックしてください。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/c649d478-0169-efb2-f265-03ecbcff6369.png)
1.	任意のタイプと書かれているフィルターから、データ資産を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/e7f01667-3206-0014-419c-7ba1e0bf964d.png)
データ資産タイプの5つが表示されます。２つのファイルと３つの表が表示されています。カタログで管理できる他のタイプは、接続、モデル、ノートブックおよびダッシュボードになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/51a01023-300c-5fe1-2492-7d65317b9e35.png)
2.	すべてのタグのフィルターで、「ドキュメント」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/8c7d1214-0e6e-5b3f-3aec-676a27bcdc05.png)
ドキュメントタグが付いているデータ資産のみが表示されます。
3.	「すべてを消去」をクリックしてください。


## 次のハンズオン
次は、アナリティックスやAIで必要なデータの準備（第６回）です。
[備忘録] アノテーションツール labelImgの環境構築

## メニュー
* [はじめに](#はじめに)
* [Pythonの環境構築](#pythonの環境構築)
* [仮想環境の作成](#仮想環境の作成)
* [labelImgの導入](#labelimgの導入)

---
## はじめに
- 教師あり学習では、画像データにラベルを付与することで、初めて意味のある学習データになります。
- 本マニュアルでは、ラベリングツール```labelImg``` （Pythonのプログラム）によるラベリング手順を紹介します。

## Pythonの環境構築
### ```pyenv```の導入 (shellがzshの場合)
- pyenvはPythonの複数のバージョンを簡単に切り替えることができます。
1. GitHubのリポジトリをクローン （[https://github.com/pyenv/pyenv](https://github.com/pyenv/pyenv)）
   ~~~zsh
   $ git clone https://github.com/pyenv/pyenv
   ~~~
1. ```~/.zprofile```、```~/.profile```、```~/.zshrc```に下記のテキストを追記する
   ~~~zsh:~/.zprofile
   export PYENV_ROOT="$HOME/.pyenv"
   export PATH="$PYENV_ROOT/bin:$PATH"
   eval "$(pyenv init --path)"
   ~~~
   ~~~zsh:~/.profile
   export PYENV_ROOT="$HOME/.pyenv"
   export PATH="$PYENV_ROOT/bin:$PATH"
   eval "$(pyenv init --path)"
   ~~~
   ~~~zsh:~/.zshrc
   eval "$(pyenv init -)"
   ~~~

## 仮想環境の作成
1. 適当なディレクトリを作成
   ~~~zsh
   $ mkdir dataset
   $ cd dataset
   ~~~
1. 使いたいPythonのバージョンをインストールする
    - インストールできるPythonのバージョンを確認
      ~~~zsh
      $ pyenv install --list
      ~~~
    - バージョン```3.8.5```をインストールするとする
        - Pythonは```2系```と```3系```があります。今回は3系を使います。
      ~~~zsh
      $ pyenv install 3.8.5
      ~~~
    - 先ほど作成したディレクトリに反映（```.python-version```というファイルが作成される）
      ~~~zsh
      $ pyenv local 3.8.5 
      ~~~

1. ```venv```による仮想環境の作成
    - パッケージをプロジェクトごとに独立させることができます。（Python3の標準機能なので別途インストールは不要）
    - 新しい環境の作成 
        - ```newenvname```は好きな名前でいいです。（```venv```か```.venv```が一般的）
        - ```newenvname```下にパッケージが置かれます。
    ~~~zsh
    $ python -m venv [newenvname]
    ~~~
    - 有効化
    ~~~zsh
    $ source [newenvname]/bin/activate
    ~~~
    - 無効化
    ~~~zsh
    $ deactivate
    ~~~

## labelImgの導入
1. レポジトリのクローン （[https://github.com/tzutalin/labelImg](https://github.com/tzutalin/labelImg)）
   ~~~zsh
   $ git clone https://github.com/tzutalin/labelImg
   $ cd labelImg
   ~~~
1. ```pip```でパッケージのインストール
   ~~~zsh
   $ pip install -r requirements/requirements-linux-python3.txt
   $ make qt5py3
   ~~~

1. labelImgの起動
   ~~~zsh
   $ python labelImg.py [画像ファイルのパス] [分類クラスのテキストファイル]
   ~~~
Excel セル番地を動的に生成し参照する例

環境
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104697/6b79808f-14a0-2dd9-4eb8-576bc8558c1c.png)
数式 F2
```
=SUMPRODUCT((YEAR(INDIRECT("$A$2:$A$" & COUNTA($A$2:$A$5000) + 1))=YEAR(E2))
           *(MONTH(INDIRECT("$A$2:$A$" & COUNTA($A$2:$A$5000)+ 1))=MONTH(E2))
           *(INDIRECT("$B$2:$B$" & COUNTA($B$2:$B$5000) + 1) = "外食")
           , INDIRECT("$C$2:$C$" & COUNTA($C$2:$C$5000) + 1))
```
SUMPRODUCT内でYEAR、MONTH、INDIRECTを使い2022年1月の外食の合計を算出。その際、COUNTA(\\$A\\$2:\\$A\\$5000) + 1で最終行の番号を取得し(COUNTAは任意のセル範囲に入力されてるデータの個数を返す関数、その性質を利用しこの例では8を取得、1を加えて最終行の番号9を得る)、INDIRECT("\\$A\\$2:\\$A\\$" & COUNTA(\\$A\\$2:\\$A\\$5000) + 1で動的に番地を生成(\\$A\\$2:\\$A\\$9)・参照。

データ数が増えてくると計算処理中にExcelが重くなる可能性あり。

ワークシート関数[INDIRECT 関数] - Office TANAKA
http://officetanaka.net/excel/function/function/indirect.htm
git rebase master を使うのは止めようと思う

## 注意：この記事を参考にして何かをする前には、
- この記事の妥当性を疑って、別の記事でも確かめてください。
- 重要なリポジトリで作業を行なう前に、テスト用にリポジトリを作って、小規模に試してみてください。
---

## 主張：作業中のbranchにmasterでの変更を取り込むには, `git merge origin/master` を使おうと思う。

### git rebase の記事
>Gitで作業中のブランチにmasterの最新の変更を取り込むには、rebase を使います。
という内容の記事が多い。

そうして、conflict が生じたときに、その解決方法を示しているものが多い。

>コンフリクト部分の修正手順
>「コンフリクトが発生する」 → 「コンフリクトを修正する」→「git add .」 → 「git >rebase --continue」を繰り返す

そうして、このconflictを修正して git add , `git rebase --continue` を繰り返すのが、何度も生じてしまのだ。

どうやら、git rebase masterでは,自分の作業用のbranchでの履歴の変更の開始点を、現在のmasterの現在の位置にすり替えて、全ての履歴を作り変えようとするもののようだ。だからbranchでの全ての改変と、branch作成直後から現在のmasterの最新までの履歴の組み合わせで、`git rebase master` 後の改変後のbranchの履歴を作り上げようとするものようだ。そのためか、`git rebase --continue`に、何度も同じ変更点について問いかけられる羽目になる。

（私がしたいのは、masterの最新を取り込む前のつじつまのあった状態を確保しつつ、masterの最新を取り込んだ後のつじつまのあった状態を作ることだ。作業用のbranchの過去の状態とmasterのその間の履歴の状態には関心がないのだ。branchの開発結果が十分なものになったときには, squash mergeをするので、branch内での履歴は意味がない。）
　
## 代替方法
git mergeを使う。

## 実際の手順
以下の内容は参考記事からの引用

```
※ もし、作業途中のものでcommit出来るものがあればcommitしておく
# masterブランチへ移動
git checkout master
# git pullでmasterを最新に
git pull origin master
# 開発用ブランチへ移動
git checkout 開発用ブランチ
# mergeコマンドでmaserの内容を取り込む
git merge origin master
```

## 実際の手順(コメントでいただいた手法)
```
git fetch origin
git merge origin/master
```

参考記事：
https://bake0937.hatenablog.com/entry/2017/11/07/081616

https://zenn.dev/yumiyoshi/scraps/37723d020d4541
Audi A6 e-tron コンセプトのデザインがかっこいいので、車の将来を勝手に考えてみる。

Audiはここ数年でEVのレパートリーを増やしてきていて、現存の車種と同じ車格のEVを少しずつ増やしています。
少し前にコンセプトデザインが発表されたので、そこから将来の車のデザインがどうなっていきそうか勝手に考えてみます。

コンセプトカーはいくつかあるのでここからご覧ください。

https://www.audi.co.jp/jp/web/ja/brand/concept-cars.html

# ライトの役割

どのコンセプトモデルも、ヘッドライトの役割が変化しています。
例えばA6 Avant e-tronを見てみると

![](https://media.gqjapan.jp/photos/6233e340251620caf16af099/16:9/w_2560%2Cc_limit/audi-a6-e-tron-avant-1.jpg)

[GQの記事](https://www.gqjapan.jp/cars/article/20220318-audi-a6-e-tron-avant-news)

一見細くてLEDでデザインされた普通のライトに見えますが、このライトは前を照らすためのライトではなく、意匠としての存在になっています。前方を照らすライトはヘッドライト下のグリル端についており、ブラックアウトして目立たないようになっています。

Audiはどうもライトの役割を、車外に対して意思を伝えるためのものにしようとしているように思えます。

他のコンセプト-urbansphere-を見てみるとそれは顕著です。

![](https://d1uzk9o9cg136f.cloudfront.net/f/16783350/rc/2022/04/20/bdd044d85137ded35543e3b986ff36f68bb524c2_xlarge.jpg)

これもA6と同じくヘッドライトはただの意匠で、実のライトはグリルの端にあるのですが、グリル全体にLEDが散らされていて、YouTubeなどで動画を探すと光がうごめくように点灯させることができることを確認できます。

https://www.youtube.com/watch?v=9pQ9E4k8uck

テール部分も同じ思想でデザインされています。

![](https://d1uzk9o9cg136f.cloudfront.net/f/16783350/rc/2022/04/20/8988b75fd3da3fdba822db92cfbb07902631fca8_xlarge.jpg)

これだけの面積をLEDで埋め尽くして、それが一様に光るのではなく色を変えたりアニメーションをつけたりすることで、外の世界とのコミュニケーションを図っています。特にurbansphereはそのコンセプトが強いです。

# 前を照らすライトの小型化と隠蔽

Audiのコンセプトに見るように、周囲を明るく照らすためのライトは技術的にも小さくできるようになり、表から見えないように隠すこともできるようになりました。

今までのライトは、あれだけの面積がないと明るく照らせないという制約から、その形を工夫してカッコよく仕上げていましたが、その制約から自由になれるようになってきています。

すると何ができるかというと、Audiのようにライトを別の用途に使ったり、単純にライトの面積を小さくできるようになります。

Audiは今までのヘッドライト形状を残しながら新しい用途への変貌を遂げようとしていますが、個人的にはもっとシンプルな方向にデザインが進んでも面白いと思っています。

# ヘッドライトがないデザイン

僕はデザイナーでもなければ絵を描く道具を持っていないのでここに示せませんが、周囲を照らすライトを隠せるようになったのなら、思い切ってヘッドライトのないデザインの車が出てきても面白いなと思います。

EVは部品点数も少ないので、ヘッドライトを高い位置に置かなくてもいい(前方照射用のライトはある程度高い位置出なければいけない)ということになれば、ボンネット形状をより空力的に有利な形状にできるはずです。

# Appleの車が気になる

勝手な憶測ですが、こういうことをしてきそうな会社として思い浮かぶのはAppleじゃないでしょうか。

性能とか車の品質がどうかは置いといて、デザインがどうなるかは注目したいところです。
【基本情報技術者】RAID

基本情報技術者試験の分野「RAID」についてご紹介いたします。
## RAID
**RAID**（**R**edundant **A**rrays of **I**nexpensive **D**isks）は、

**R**edundant：冗長
**A**rrays：配列
**I**nexpensive **D**isks：安価なディスク

**複数の磁気ディスクを組み合わせ、1台の仮想的な磁気ディスクとして扱うことで、アクセスの高速化や高信頼性を実現する技術。**
サーバーに用いられる技術で、**ハードディスクを複数台用意し1台が故障してもサーバーの稼働を止めないようにする技術**。これによって、**システムの冗長性を向上させる。**

データの記録方法により**RAID0**から**RAID6**まで7種類が定義されている。基本情報技術者の出題範囲を考え、**RAID0、RAID1、RAID3、RAID5**の4種類について説明します。

## 主なRAIDレベル
### RAID0：ストライピング
データをブロック単位に**複数の磁気ディスクに分散**して書き込む。
アクセスを並列的に行うことで高速化を図る。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/b6e09eff-bfd5-4e0a-7a39-3d3c351c091d.png)

### RAID1：ミラーリング
**同じデータを2台以上の磁気ディスク**に書き込む。
信頼性が高いが、使用効率は低い。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/08568e89-717d-1211-5014-d9bddd3c0b3e.png)

### RAID3
**データをビット/バイト単位に複数の磁気ディスクに分散**して書き込む。
**1台の磁気ディスクに※パリティを書き込む。**
1台が故障しても、残ったデータとパリティからデータを復旧できる。
※パリティとは、磁気ディスクが故障したときに、データを修復するための情報(符号）。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/e1483140-2c39-c494-3117-eba00eada580.png)


### RAID5
**データをブロック単位に複数の磁気ディスクに分散して書き込む。**
さらに**複数の磁気ディスクにパリティを分散して書き込む。**
1台が故障しても、残ったデータとパリティからデータを復旧できる。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/d82d9b58-7f4d-94d2-c46f-aa47ac693e41.png)
例：上段ディスクが故障して、データAを復旧させるためには、中段ディスクのデータCや下段ディスクのパリティデータなどの情報を使ってデータを復旧させる。

### まとめ
RAID0は、**複数のディスクにデータを分散して書き込む（ストライピング）**
RAID1は、**磁気ディスク2台に同じデータを書き込む（ミラーリング）**
RAID3は、**データをストライピングし、パリティは1台に固定する。**
RAID5は、**データとパリティともにストライピングする。**
基本情報（論理演算とベン図）

## なぜ始めたか
元々、私が営業職に従事しており、非IT業界から転職してきました。
エンジニアに転職して業務をしている中で技術的スキルで伸び悩んでいることを職場の方に相談しました。

2点アドバイスをもらい

1. 基本情報の勉強した内容をアウトプットしてみると良いのではないか。
2. 情報をまとめて伝える能力（要件把握力）も強化した方が良いのではないか。

上記の理由から勉強内容をアウトプットをすることにしました。

## 何の本をやるか
キタミ式イラストIT塾　基本情報技術者

## 方針
* 1日半章〜1章の内容を投稿する予定（章の順番は順不同）
* 本だけではなくネットからも検索して自分なりにまとめる。
* 資格を目標に勉強するというよりも、知識を身につけることを目標に勉強する。

## 早速
題名の内容をまとめようと思います。

## 論理演算とは
論理演算とは1を真(true)、0を偽(false)と見なして1と0の値だけで行う演算です。
コンピュータの世界では計算のことを演算と呼ぶようです。

代表的な論理演算には、「論理積」（AND）、「論理和」（OR）、「否定」（NOT）などがあります。
論理演算はベン図で表示するとわかりやすく理解することができます。

## ベン図とは
「ベン図」は集合（グループ）同士の関係を図として視覚的に表したものです。
下記で実際に論理演算をベン図で表示してみようと思います。

## 論理積(AND)は「〇〇かつXX」の場合
P AND Q
![200px-Venn0001.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/f322391f-4045-6f19-248e-d4043cbcdd6b.png)
上記の図がベン図です。例えば
```javascript
const a = 1
const b = 1 

a && b ? 1 : 0
// 真のため1(true)
// aかbのどちらかが0の場合は偽のため0(false)
```
ベン図で赤くなっている箇所がaとbの条件が合致した部分ですね。

## 論理和(OR)は「〇〇またはXX」の場合
P OR Q
![200px-Venn0111.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/c4e0c225-0c15-9e18-62ea-94d64fbf0863.png)
```javascript
const a = 1
const b = 0 

a || b ? 1 : 0
// 真のため1　(true)
// aかbの片方が真(true)ならば1になる
```
aとbの両方とも0の場合は偽(false)になります。

## 否定(NOT)は「〇〇ではない」の場合
!P
![200px-Venn1010.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/d708daa6-83a9-96d6-1a4c-3507cf03d559.png)

```javascript
const a = 0

!a ? 1 : 0
// 真のため1　(true)
// aが1ならば偽(false)になる
```
ある条件の「合致しない」ものを真と見なします。
今回はaが0なので1を返却します。

## まとめ
ド・モルガンの法則や論理表は本には書いてありませんでしたが、ド・モルガンは他の記事でまとめてみます。
今回は簡潔にできる限りわかりやすく伝えるように意識しました。

引き続きアウトプットできるようにしていきます。

## 参考資料

この記事は主に以下の情報を参考にして執筆しました。

- [wikipediaのベン図](https://ja.wikipedia.org/wiki/%E3%83%99%E3%83%B3%E5%9B%B3#:~:text=%E3%83%99%E3%83%B3%E5%9B%B3%EF%BC%88%E3%83%99%E3%83%B3%E3%81%9A%E3%80%81%E3%82%82%E3%81%97%E3%81%8F%E3%81%AF%E3%83%B4%E3%82%A7%E3%83%B3,%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E8%80%83%E3%81%88%E5%87%BA%E3%81%95%E3%82%8C%E3%81%9F%E3%80%82)
- [キタミ式イラストIT塾　基本情報技術者](https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E4%BB%A4%E5%92%8C04%E5%B9%B4-%E3%81%8D%E3%81%9F%E3%81%BF-%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/4297124513)
お名前.comが利用制限中で困った

お名前.comからconoha wingにドメイン移行しようと思ったら躓いてしまった
お名前. com で自分のメールアドレスが利用制限中になっていたどうやらwhoisの情報が正確じゃなかったみたいだ

問い合わせようと思うにフォームが全然見つからない
今回探してる時に役立ったのがヤフー知恵袋。
同じ質問があった

以下のリンクからお名前. com の問い合わせに飛べました
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11238438496
「DNSの浸透」という表現がなぜ不適切なのかを説明する

## これは何
最近DNSの仕組みについて改めて勉強した上で、「DNSの浸透」という言葉がなぜ不適切なのかを自分の言葉で残しておきたくなったので書いたものです。
わかりやすさ重視で書くので、もしかしたら言葉足らずな部分や、説明不足な部分もあるかもしれません。編集リクエストやコメント等で補足など書いていただけるととても嬉しいです！

## DNSの浸透って？
DNSに新しい情報を設定したときなどに、実際に設定通りにDNSが振る舞うようになるまでを「DNSの浸透期間」と呼んだりします。しかし、この表現はしばしば「不適切である」ということが言われます。
なぜこの表現が不適切なのかを解説していきます。

## DNSの仕組み
DNSは以下の図のように

- スタブリゾルバー（ブラウザなど）
- フルリゾルバー（キャッシュサーバー）
- 権威サーバー

によって構成されています。ドメインの情報の解決は以下のような流れで行われます。
今回はexample.comを例にした流れを書きます。
より詳しく知りたい方は https://qiita.com/umesour/items/48d5358d92d7cf6ed922 などをご覧ください

- スタブリゾルバーからフルリゾルバーに名前解決要求を行う
- フルリゾルバーが名前解決要求を受け取る
    - フルリゾルバーにキャッシュがある時→キャッシュしている情報を結果として返す（終了）
    - フルリゾルバーにキャッシュがない時→権威サーバーに名前解決の問い合わせをcomの権威サーバーに行う
- comの権威サーバー（ルートサーバー）が問い合わせを受け取る→exampleの権威サーバーの権威サーバーへの委任情報を結果として返す
- フルリゾルバーが委任情報を受け取る→exampleの権威サーバーに問い合わせを行う
- exampleの権威サーバーが問い合わせを受け取る→キャッシュ時間を指定して結果を返す
- フルリゾルバーが結果を受け取る→指定された時間キャッシュを行い、結果をスタブリゾルバーに返す
- スタブリゾルバーがドメインに対応する結果を受け取る


![名称未設定ファイル.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158501/1766b8b9-274f-40af-0f62-433ae2b5abe6.png)


## DNSの浸透の何が問題なのか
簡単にDNSの仕組みを説明した上で、DNSの浸透という表現がなぜ不適切なのかを説明していきます。

### 浸透のイメージ
みなさんは「浸透」という言葉を聞いてどのようなイメージを持つでしょうか？
僕はどこかに設定した情報が、だんだんとさまざまなサーバーに伝搬していき、全てのサーバーに反映されるまでまだらに情報が更新されていくような、アンコントローラブルなイメージを持ちます。
図にすると以下のようなイメージです。

![伝搬.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158501/78aefc0a-7210-35ac-6072-161fb059ecaf.png)


### 実際の挙動
DNSは、あくまで

- スタブリゾルバー
- フルリゾルバー
- 権威サーバー

によって、先ほど解説したような処理で名前解決が行われていきます。フルリゾルバーは複数ありますが、そこもキャッシュを行っているだけであり、ブロックチェーンのような、各サーバーごとに情報を持っているような仕組みではありません。情報を持っているのは権威サーバーのみです。
またキャッシュ期間も権威サーバーから指定しているため、情報を更新する前にキャッシュ期間を短く設定して、キャッシュ期間が短くなってから権威サーバーに保存されている情報を更新することで、フルリゾルバーごとに古い情報と新しい情報が混在するような状態も限りなく短くすることが可能であり、コントローラブルに更新処理を行うことができます。

![名称未設定ファイル.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158501/0503c974-a057-a5f2-3280-d56f2bd1b64b.png)

このように、DNSは浸透という表現からはかなりギャップのある挙動をしています。これが「DNSの浸透」という表現が不適切である、といわれる所以です。


## まとめ
DNSの浸透、という表現が持つ言葉のイメージと、実際の挙動のギャップについて理解していただけたでしょうか？
今回の記事が読んでくださった方の学びになれば幸いです。

## 参考文献

https://www.geekpage.jp/blog/?id=2011-10-27/1
Power Query workout - PowerPlatform.Dataflows

Docs にないけどね。Excel でも試せるようになっていたので。

https://docs.microsoft.com/en-us/powerquery-m/accessing-data-functions

Excel では [Power BI Dataflows] となっているけど、PowerPlatform.Dataflows 関数(Power Query) を利用することになる。Excel の Power Query エディタ では [Dataflows]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/5458ffae-e9bd-4f70-e05f-c56bc99f094c.png)
たとえば、Power BI Desktop であれば [Dataflows]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/249aa596-c267-6128-2aa7-156f777c387e.png)


```text:PowerPlatform.Dataflows&#x20;(Power&#x20;Query)
PowerPlatform.Dataflows(optional options as nullable record) as table
```
>Import data from a dataflow
Connect to all the dataflows you have access to, and choose the entities you'd like to use

Power BI データフロー / Power Platform データフロー(分析) で準備されたデータにアクセスすることができる。

https://docs.microsoft.com/ja-jp/power-bi/transform-model/dataflows/dataflows-introduction-self-service

https://docs.microsoft.com/ja-jp/power-query/dataflows/overview-dataflows-across-power-platform-dynamics-365

データフローでどこまでデータを準備しておくかというはそれぞれだ。データマートのように使うこともできるので、特に Excel でも利用できるようになることはとても素晴らしいことだ。机並べて同じクエリを実行する必要なくなるでしょってことだし、組織やチームで利用するデータはあらかじめ準備しておけばいい。みんながみんな 超絶 Power Query 術が必須じゃぁなくなるってこと。安易にデータを複製することが減るわけだから、集計されたデータの信頼性が自然とよくなるはず。

# PowerPlatform.Dataflows 関数の動作
Power BI データフロー / Power Platform データフロー(分析) の出力先は Azure Data Lake Gen 2 の Blob ストレージ。 CDM (Common Data Model) フォルダになっていて、エンティティなどの定義が含まれる model.json と データ本体の csv で構成されている。

https://docs.microsoft.com/en-us/common-data-model/model-json

必要なエンティティ情報をAPI経由で取得し、データ本体である csv をダウンロードするのだけど、AzureStorage.BlobContents 関数(Power Query)を利用するので高速でダウンロードできる。BlockSize : 4MB / ConcurrentRequests : 16 既定値の動作なので、大量の行数で効果が大きい。また、Table.FirstN など先頭行からフィルタする行の操作は適切に動作する。

https://docs.microsoft.com/en-us/powerquery-m/azurestorage-blobcontents

Power BI データフローで、Enhanced compute engine settings : `ON` であるとき、Value.NativeQuery 関数(Power Query)を使用され、クエリフォールディング、DirectQuery がサポートされる。Excel からの接続したときには、AzureStorage.BlobContents のみ使用されるようだ。

https://docs.microsoft.com/en-us/powerquery-m/value-nativequery

なお、 `options` 引数により、Value.NativeQuery の使用を制御できる。

```text:PowerPlatform.Dataflows&#x20;(Power&#x20;Query)
PowerPlatform.Dataflows(
    [EnableFolding = false]
)
```



# その他
https://powerbi.connpass.com/

- [Power BI 勉強会 - connpass](https://powerbi.connpass.com/)
- [Power BI Desktop を使い始めるには](http://qiita.com/PowerBIxyz/items/6c4735cb5b5712e70981)
- [Excel で Power Query を使い始めるには](http://qiita.com/PowerBIxyz/items/52e563037b855a099ca9)
【Swift】isUppercaseとisLowercaseで大文字小文字を調べる

## はじめに
Character型のプロパティとして定義されている`isUppercase`と`isLowercase`を初めて使ったので備忘録として残します。

## 環境
- Swift: version 5.6
- Xcode: Version 13.3.1 (13E500a)
- macOS: 12.3.1 (21E258)

## 使い方

### 例題
> 文字列中に大文字と小文字の両方が含まれるかどうかを調べたい。

色々とやり方はあると思いますが、今回は下記の手順で実装してみます。

1. 文字列をfor-in文でCharacterとして取り出す。
2. `isUppercase`プロパティで大文字を含むかどうか判定。
3. `isLowercase`プロパティで小文字かどうかを判定。

### 実装
``` swift
func containUppercaseAndLowercase(_ string: String) -> Bool {
    var result = (uppercase: false, lowercase: false)
    for character in string {
        if character.isUppercase == true {
            result.uppercase = true
            break
        }
    }
    for character in string {
        if character.isLowercase == true {
            result.lowercase = true
            break
        }
    }
    if result == (true, true) {
        return true
    } else {
        return false
    }
}

containUppercaseAndLowercase("AB") //false
containUppercaseAndLowercase("Ab") //true
containUppercaseAndLowercase("aB") //true
containUppercaseAndLowercase("ab") //false
```

> 2022/05/11追記

コメントで`contains(where:)`を使ったやり方を教えていただいたので追記します。
コードがかなりスッキリします。
```swift
func containUppercaseAndLowercase(_ string: String) -> Bool {
    string.contains { $0.isUppercase } && string.contains { $0.isLowercase }
}
```

## さいごに
`isUppercase`と`isLowercase`の使い方として、
文字列中に大文字と小文字の両方が含まれるかどうかを判定する関数を実装してみました。
最後まで見ていただきありがとうございました。

## 参考記事

https://qiita.com/Hyperbolic_____/items/528477ccb55f6aed8112
[iOS] 複数モーダルを開いている場合、一気に一番初めの階層に戻りたい

複数モーダル（sheetやフルスクリーンなど）を開いている場合、一気に一番初めの階層に戻りたい時

![画面収録_2022-05-10_16_25_01_AdobeCreativeCloudExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1322570/2e3d5056-fc93-0551-2d28-52f2461dc349.gif)


以下二つのどっちか実行するだけで戻れる。
```
UIApplication.shared.windows.first?.rootViewController?.dismiss(animated: true)
```
または
```
let scenes = UIApplication.shared.connectedScenes
let windowScene = scenes.first as? UIWindowScene
let window = windowScene?.windows.first
window?.rootViewController?.dismiss(animated: true)
```


## Example
```swift
struct ContentView: View {
    
    @State var isPresented = false
    
    var body: some View {
        Button(action: {
            isPresented.toggle()
        }) {
            Text("ContentView")
                .font(.title3)
                .background(.gray)
                .padding()
        }
        .fullScreenCover(isPresented: $isPresented) {
            Sample2View()
        }
    }
}

struct Sample1View: View {
    
    @State var isPresented = false
    
    var body: some View {
        Button(action: {
            isPresented.toggle()
        }) {
            Text("Sample1View")
                .font(.title3)
                .background(.black)
                .padding()
        }
        .fullScreenCover(isPresented: $isPresented) {
            Sample2View()
        }
    }
}

struct Sample2View: View {
    
    @State var isPresented = false
    
    var body: some View {
        Button(action: {
            isPresented.toggle()
        }) {
            Text("Sample2View")
                .foregroundColor(.white)
                .font(.title3)
                .background(.green)
                .padding()
        }
        .fullScreenCover(isPresented: $isPresented) {
            Sample3View()
        }
    }
}

struct Sample3View: View {
    
    @State var isPresented = false
    
    var body: some View {
        Button(action: {
            isPresented.toggle()
        }) {
            Text("Sample3View")
                .foregroundColor(.white)
                .font(.title3)
                .background(.blue)
                .padding()
        }
        .fullScreenCover(isPresented: $isPresented) {
            Sample4View()
        }
    }
}

struct Sample4View: View {
    
    var body: some View {
        Button(action: {
            let scenes = UIApplication.shared.connectedScenes
            let windowScene = scenes.first as? UIWindowScene
            let window = windowScene?.windows.first
            window?.rootViewController?.dismiss(animated: true)
        }) {
            Text("Sample4View")
                .foregroundColor(.white)
                .font(.title3)
                .background(.red)
                .padding()
        }
    }
}
```

---

以下やと、iOS15でなんたらこんたらって警告でた。
```
UIApplication.shared.windows.first?.rootViewController?.dismiss(animated: true)
```

![スクリーンショット 2022-05-10 16.21.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1322570/3977611a-e96e-86ec-507a-a62957f93365.png)
LinuxのIntel x86のIntrinsic関数をIBM PowerやARM用にポートする(3)

では、テストフレームワークを構築する戦略について記述していこう。まずは、簡単なネットワークシミュレータをGo言語で作る。そして、Intelモジュール、IBM PowerモジュールをIntelのLinux PC上にGo言語で作る。IntelモジュールにはIntel Intrinsicのテストを、IBM PowerモジュールにはIntel Intrinsic関数の疑似ポートをそれぞれ内蔵する。
で、それでプロトコルが完成したら、実機にIntelモジュールとIBM Powerモジュールをデプロイして動かす。
これらはすべてオブジェクト指向で作られているので、切り分けすることが可能になる。Go言語はオブジェクト指向パラダイムをサポートしている。C言語でもオブジェクト指向プログラミングは可能であるが、かなり困難であることが予想される。よって、ここでもGo言語でテストフレームワークを作ることが支持される。

で、最初に考えるべきは、まずはどのプロトコルのネットワークシミュレータを作るかである。使うプロトコルは、当然のことであるが、暗号化をサポートしていなければならない。双方向である必要がある。一対多をサポートする必要がなく、一対一であればいい。安定している必要がある。
安定している必要があるため、P2P通信などは除外されることとなる。P2P通信は不安定であり、STUNサーバなども必要となる。また、P2P通信は要求する技術レベルも高い。P2P通信が除外されるため、IntelとIBM Powerの中間に中継サーバなどが必要となる可能性がある。中継サーバのソフトウェアもGo言語で記述されることとなる。
IntelとIBM Powerがクライアントとなり、中継サーバがサーバとなる、クライアントサーバアーキテクチャを取ることとなる。IntelとIBM PowerのスパコンがWebサーバの機能を持っているとは限らないからである。また、Akariシステム（このシステム）は後のことになるが、スマホなどにも使える可能性があるため、IntelとIBM PowerなどはWebサーバ機能を期待しないほうがいい。また、強力な認証機能を期待することとなる。

WebbSocket、SSHなどの候補がまず最初に思い浮かぶ。

（続く）
redocでREST API仕様書作成

## はじめに

業務では専らREST APIを実装しているのだが、仕様を書くのにWikiやSwaggerを利用していた。
ただ、WikiはAPI仕様書としてはやや書きづらい＆見栄えもよくない、Swaggerはプロジェクトが増えると有料になってしまう。。
ということがあり、いろいろと探し試した結果redocに落ち着いた。

## インストール

以下などを参考にしインストール。
[Using the Redoc CLI](https://redocly.com/docs/redoc/quickstart/cli/)

## 使い方

`redoc-cli serve hoge.yaml` でHTTPサーバーになってくれる。
うちでは、`redoc-cli bundle hoge.yaml -o hoge.html` などでHTMLファイルに出力し、HTMLをS3経由で参照している。

#### オプション

以下のオプションで使っている。
```
redoc-cli bundle hoge.yaml --options.pathInMiddlePanel=true --options.disableSearch=true --options.hideDownloadButton=true --options.jsonSampleExpandLevel=all -o hoge.html
````

オプション名|概要
---|---
options.pathInMiddlePanel|右側のパネルではなく、中央パネルにパスを表示する。
options.disableSearch|検索ボックスを無効にする。
options.hideDownloadButton|ダウンロードボタンを非表示にする。
options.jsonSampleExpandLevel|JSONペイロードサンプルのデフォルトの展開レベルを設定する。allは全て展開。

その他のオプションは以下を参照。
[redoc options object](https://github.com/Redocly/redoc#redoc-options-object)

## 書き方

記述はYAML。
"|"の後に改行して、Markdownで記述可能。
複数のファイルに分割してもOK。

```yaml:hoge.yaml
openapi: 3.0.0
info:
  version: '1'
  title: 'Hoge API'
  description: |
    ## HOGE用 API Version 1

    HOGEで使用するAPI仕様です。

    ### フロー

    <img src="hoge.png" />

tags:
  - name: User
    description: ユーザー

components:
  securitySchemes:
    bearer:
      type: http
      scheme: bearer
      description: Bearerスキーマのアクセストークン
  parameters:
    userAgentHeader:
      in: header
      name: User-Agent
      required: true
      schema: {type: string, enum: ['HOGE/1.0']}

paths:
  /hoge/user:
    $ref: ./hoge/user.yaml

servers:
  - description: Hoge Staging
    url: https://hoge-stg.example.com/v1
  - description: Hoge Production
    url: https://hoge.example.com/v1
```

```yaml:hoge/user.yaml
# /hoge/user:
    get:
      tags: [User]
      summary: ユーザーの方取得
      description: |
        ユーザー情報を取得する。

      parameters:
        - $ref: '../hoge.yaml#/components/parameters/userAgentHeader'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                required: [id, name, email]
                properties:
                  id: {title: ユーザーID, type: integer, example: 128}
                  name: {title: ユーザー名, type: string, example: '山田 太郎'}
                  email: {title: メールアドレス, type: string, format: email, example: 'taro@example.com'}
        '400':
          description: リクエストエラー
          content:
            application/json:
              schema: {type: object, required: [Error], properties: {Error: {title: エラーメッセージ, type: string}}}
```

## 最後に

YAMLをシコシコと書けばよく、Gitで管理することでバージョン管理が楽になった。
また、OpenAPIの仕様に則って記述することで、開発者間での共通化が図れ、誰が書いても同じような仕様書が出来上がる。
ただ、ラーニングコストが意外とかかる、細かい部分で融通がきかない（知見不足かもしれないが。。）というデメリットもある。

うちではGithubでバージョン管理しており、YAMLをPushした際にGithub Actionを用いて、HTML作成→S3にアップロードをやっている。
この話は次回にでも。。
Unity チュートリアル #0 ダウンロード＆スタート編


# #0 ダウンロード&スタート編

- **ダウンロード&スタート 　←今ここ**
- [オブジェクトとマテリアル](https://qiita.com/kikpond15/items/715fda048755406fdd73)
- [コンポーネントとスクリプト](https://qiita.com/kikpond15/items/b29373a0d84ef0ec36e5)
- [プレファブと当たり判定](https://qiita.com/kikpond15/items/5c65e289682cd4346e6b)
- [UI](https://qiita.com/kikpond15/items/80239c6c182c826f7436)
- [シーンの追加](https://qiita.com/kikpond15/items/c54647397724edbeb1b3)

## UnityHub＆Unityダウンロード

最近のUnityでは年毎にバージョンをあげてリリースをしています。
そのため、2018年バージョンでは動いていたプログラムが2022年バージョンでは動かないなんてことは頻繁にあります。

そのため、Unityをダウンロードする際は、バージョン管理ツールである**UnityHub**をダウンロードしUnityHubからUnityをダウンロードします。

[Unity Hub ダウンロードページ](https://unity3d.com/jp/get-unity/download)

上記リンクからUnity Hubと最新バージョンUnityのセットをダウンロードします。
ダウンロードには数分かかります。


![スクリーンショット 2022-05-06 0.39.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/cc744618-dbe6-d7ac-827c-c77e08936f36.png)

![スクリーンショット 2022-05-06 0.40.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/e5cd07d8-12b1-fb2f-7a45-e9e6454deff6.png)


## Visual Studioダウンロード
Unityのスクリプト(プログラム)を書く際に必要なエディタとして**Visual Studio**をダウンロードします。他のエディタでも代用は効くので、軽量な方がお好みであればVSCodeをお勧めします。

[Visual Studioダウンロードページ](https://visualstudio.microsoft.com/ja/downloads/)

上記リンクからMacまたはWIndowsを選びダウンロードします。

![スクリーンショット 2022-05-06 1.00.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/19b592c1-7e7b-9b10-3661-a63caf0665e4.png)


<font color="OrangeRed">

**Unity Hubもそうですが、Visual Studioでもアカウント認証を求められると思うので、適当なメールアドレスでUnityアカウントとMicrosoftアカウントを作成してログインしましょう。**

</font>

## Projectの新規作成とUnityエディタについて
UnityHubとVisual Studioをインストールしたら、UnityHubを開いてみましょう。  
**Installs**を見てみると最新バージョンのUnityがインストールされていると思われます。  
そうでない場合は**Install Editor**から最新バージョンをインストールしましょう。

インストールできている場合は、**Project**から**New Project**を押してプロジェクトを新規作成して見ましょう。
![スクリーンショット 2022-05-06 2.18.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/856a7644-9e69-dd13-2149-ac3fda957ecf.png)


作りたいゲームによって2Dや3Dなど選択できます。今回は3Dを選択して、プロジェクト名を決めて**Create Project**でプロジェクトを作成しましょう。

![スクリーンショット 2022-05-06 2.21.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/5589d4bc-0550-7e80-9caf-79f174228a41.png)

新規作成すると以下のようなUnityエディタが立ちあがります。
Unityエディタの画面は大まかに4つに分割することができます。

![スクリーンショット 2022-05-06 2.28.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/127e7c72-2ef0-6a61-9748-ee818797fa8f.png)

1. シーン画面：配置したオブジェクトやカメラの位置など確認、移動調整できる(神様視点)
2. ヒエラルキー：シーン画面に配置されているオブジェクトのリストが表示される。ここからオブジェクトの追加が可能
3. インスペクター：選択したオブジェクトが持つ機能の詳細情報を確認、変更、追加する事ができる
4. プロジェクト：プロジェクトのディレクトリが表示される。ここにスクリプトや素材(マテリアル、画像)などを置く事ができる

画面レイアウトは自由に変更できるので、操作に慣れてきたら変更しても良いでしょう。インスペクターの上にレイアウト変更タブがあるので、好みのレイアウトにしても良いでしょう。(慣れない内はデフォルトが良いと思う)

次のステップはこちら[＃1オブジェクトとマテリアル](https://qiita.com/kikpond15/items/715fda048755406fdd73)
初心者でもすぐに取り組めるエンジニアとして大切なこと２選

# はじめに

いつも読んでくださってありがとうございます。
今回はWEBエンジニア1年目の僕が新入社員研修で誰にでもできてかつエンジニアとして特に大切だと思った点を2つ紹介していこうと思います。
これを意識するだけでエンジニアとしての価値が確実に上がるので最後まで読んでもらえたら嬉しいです。

## 1.字下げを確実に行う

一つ目は自下げを確実に行うことです。
自分が書いたソースコードは自分以外の大多数のエンジニアが見ることがほとんどです。
その際に字下げが疎かになっていると全体の構成が掴みにくくエンジニアとしての信頼が失われてしまします。
下記に2つの全く同じ内容のソースコードがあります。違いは字下げをしているかしていないかのみです。
字下げをしている方のソースコードは全体の構成を簡単に理解することができます。
しかし自下げをしていないソースコードはどのような構成なのかを理解するのにとても苦労します。
今回の例は少し極端でしたがソースコードを書く際には字下げをして全体の構成を誰が見ても理解できるようにすることが重要です。

~~~ Practice.java
public class Practice {
	public static void main(String[] args) {
		for(int i = 1; i<10; i++) {
			for(int j = 1; j<10; j++) {
				System.out.print(i*j);
				System.out.print("");
			}
			System.out.println("");
		}
	}
}
~~~

~~~ Practice.java
public class Practice {
public static void main(String[] args) {
for(int i = 1; i<10; i++) {
for(int j = 1; j<10; j++) {
System.out.print(i*j);
System.out.print("");
}
System.out.println("");
}
}
}
~~~





## 2.変数名は慎重に考える

2つ目は変数名は慎重に考えることです。
これが大事な理由も1つ目と同じでソースコードを自分以外が見た際にこの変数は何を表してるか理解できるようにしなくてはなりません。
そのためにも様々な立場の人が変数名を見ただけでどのような機能を持っているかがわかるよう変数名は慎重に考えることが大切です。

# まとめ

以上の2つはほとんどの人がすぐに取り組むことができてエンジニアとしての価値を上げることができます。とは言いつつも僕自身も完璧にはできていないのでこれからの研修でも意識して行っていこうと思います。
最後まで読んでいただきありがとうございました。
iPhoneのスリープ設定を一瞬で切り替える

普段はスリープさせておきたい。でもスマホを長時間見る時など一時的にスリープさせないよう、その時々に応じてスリープさせるかさせないかを一瞬で切り替えたい。

<br><br>

iPhoneのスリープを一瞬で解除、そして一瞬で再びスリープ設定に切り替える方法を紹介します。

普段はスリープを機能させておいて、スマホ上で長時間画像を表示したくなった時などその時だけスリープ解除ができます。

電源の消費を抑えられながら好きな時にスリープが解除できるのでとても便利です。

# ２ステップの手順

## （Step.1 ） まずはスリープ機能を解除する

まずiPhoneをスリープをさせないように設定します。

設定 > 画面と明るさ > 自動ロック

と進み、一番下にある ”なし” を選択します。

<img width="50%" alt="nashi.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/94a96a21-cfa7-eb4b-2bc5-4bca9906a012.jpeg">

これでiPhoneがスリープしなくなります。

## （Step.2） 低電力モードにする

次にiPhoneの ”低電力モード” をONにします。

iPhoneの画面右上の部分から下へスライドするとバッテリーマークがあるはずです。

それを押せば低電力モードになります。

（このスライドして出てくる画面を”コントロールセンター”と呼びます。）

<img width="50%" alt="ctrlcenter.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/133baf02-30e3-a051-ab16-33b21096eb87.jpeg">

設定からもできます。

設定 > バッテリー

と進み、低電力モードをONにします。

<img width="50%" alt="low_power_mode.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/b85b509b-af50-0ae7-bc8b-fadb80e5e571.jpeg">

低電力モードである印として、**バッテリーマークが黄色**になります。

このバッテリーマークの色で、今の状態が低電力モードなのか否かを確認してください。

以上で低電力モードの設定は完了です。

# 状況を整理する

ここまでの２ステップを終えると、スリープ設定の切り替えが一瞬でできるようになっています。

今は低電力モードですよね（右上のバッテリーマークが黄色）？

Step.1でスリープさせないように設定をしましたが、それでも低電力モードではスリープします。

普段はこのまま低電力モードにしておき、スリープさせたくないタイミングで低電力モードを解除すればいいのです。

そうするとStep.1のスリープさせない設定が反映されてスリープしなくなります。

その後、またスリープするように戻すには、低電力モードをONにすればいいのです。

低電力モードのON / OFF切り替えは、iPhoneの画面右上の部分を下へスライドして、コントロールセンターのバッテリーマークを押すだけ。

これで一瞬にしてスリープ設定を切り替えることができます。

<br><br>

「画面の右上からスライドしても、バッテリーマークが無い、だから低電力モードののON / OFFが切り替えられないんだけど...」

という場合は、次に説明する方法でバッテリーマークを表示させてください。
 
# コントロールセンターにバッテリーマークを表示させる

設定 > コントロールセンター

と進み、下にある**低電力モード**のプラスマークを押します。

<img width="50%" alt="ctl_senter.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/1f2a41a5-03e1-9a5a-7f38-779aabd30f9e.jpeg">

これでコントロールセンターに低電力モードのON / OFFボタンが表示されます。

# 最後に

まとめます。

普段はスリープの状態にある（何もしなければスリープが機能している状態）。

- スリープを解除したい ⇒ 低電力モードをコントロールセンターでOFFにする
- スリープするように戻したい ⇒ 低電力モードをONにする

ちなみに、上の画像内でに書かれているように、低電力モードだと「一部のバックラウンド機能が抑えられる」みたいなことが書かれています。

私個人は常時低電力モードにしていますがなんの問題もありません。

もし低電力モードに躊躇している方がいたら安心してください。
[C# WindowsForm] 例外によって落ちないアプリにする。

メモです。
とりあえずユーザーフレンドリーでない強制終了を回避するための方法です。
ただ、適切に対応しなければ例外を握りつぶすことになるので要注意です。

実装前
```Program.cs
 internal static class Program
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }

```

実装後
```cs
  internal static class Program
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.ThreadException += Application_ThreadException;//追加
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        /// <summary>
        /// 追加
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {
          //どこにもキャッチされなかった例外があったときここが実行される
        }
    }
```
<?php ?> と <?= ?> の違い

#  <?= ?>
```php
<?= ?>
```
は　```<?php echoを省略したもの```です。
```php
<?php ?>
```
はただPHPを定義しただけです。



# 資料
https://teratail.com/questions/68737

https://www.php.net/manual/ja/language.basic-syntax.phptags.php
余ったスマートフォンをIoTデバイスとして活用してみた


# 概要
AI Dynamics Japanは、エッジデバイス向けアプリ開発に注力するスタートアップです。

AI Dynamics Japanは、2022年4月にCYBERDYNE Omni Networks社「Acty-G3+」向けに __「滞在人数カウント」__ をリリースしました。この「滞在人数カウント」、アンドロイドで動くアプリで、ファイル形式も.apk 形式です。

機種変更で使わなくなったスマホのIoTデバイス化を目指し、__「滞在人数カウント」__ をアンドロイドスマホにインストールしてみました。

# 前提

### システム構成
 __「滞在人数カウント」__ は、カメラ画像中の人物数をクラウドにアップロードするアプリです。会議室、フードコートなど人が集まる場所での混雑度推定に用いられることが多く、2022年5月時点、[SORACOM社のS+ Camera向け](https://aidynamics.jp/services/package20/people_counter)、アンドロイド端末向けの2種類があります。

今回は、①Oppo R15 NEOに 「滞在人数カウント」 アプリをインストール、②人物カウント結果をソラコム社クラウドサービス「SORACOM Harvest」にアップロード、③「SORACOM Lagoon」と、時系列で表示してみます。![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3932373535362f64643762363336302d623161662d663332662d3839393.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2589602/4b500661-615a-b180-8893-5f236cbab171.png)

### 必要機材・サービス
* 古いAndroidスマホ (Android 9以降であれば大丈夫です）
* SORACOM Air IoT SIM　（plan-Dであれば、初期費用902円、月額330円）
* SORACOM Harvest Data
* SORACOM Lagoon

# 手順
### SIM挿入・SORACOMネットワークに接続
スマホにSORACOM Air IoT SIMを挿します。

:::note
SORACOM Airは、ドコモ回線、KDDI回線SIMが選べます。SIMロック端末を選ぶ場合は注意しましょう。
:::
:::note
SORACOM Airは、Nano SIMでの提供なので、Nano SIM非対応スマホの場合、SIM変換アダプタが必要です。
::: 

SIM挿入し、電源を入れたのち、APNの設定しました。
* APN: soracom.io
* ユーザー名：  sora
* パスワード： sora
* PDP Type： IP
* 認証タイプ: CHAPまたはPAP

WiFiは切っておきましょう。yahoo.co.jp などが見えれば、接続完了です。

### 「滞在人数カウント」アプリのインストール
 __「滞在人数カウント」__ は、Android Store未掲載なので、弊社サイトから[ダウンロード](https://aidynamics.jp/wp-content/uploads/2022/05/AID-congestion-monitor.zip)・スマホへインストールします。インストール後、スマホ画面にアプリアイコンが出来上がるので、立ち上げましょう。

こんな感じ。スマホ画面の左上に「count 4」と表示されています。
![IMG_1473.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2589602/8cd87e8b-13f0-4011-4654-8563bc5e555e.jpeg)

古めのOppo R15 Neoでも、200ms程度で人物カウント処理ができています。Galaxy S10で100ms程度、Galaxy S20だと25ms程度で処理できています。スマホは優秀ですね！

### クラウドアップロード設定・ダッシュボード表示設定
クラウドアップロード設定・ダッシュボード表示設定の手順は、[こちら](https://qiita.com/michelle0915/items/889bfe2c60c96cde20c4#%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A) 。

# まとめ
機種変更で使わなくなったスマートフォン、もったいないですよね。IoTの事前検証において、使わなくなったスマホは、最適な検証デバイスだと思います。

AI Dynamics Japanは、[色々なIoTアプリケーション開発](https://aidynamics.jp/services)を進めています。アンドロイド向けの無料版もどんどんリリースしていくので、楽しみにしてください。

ここまで読んでいただき、ありがとうございました！
AWS Fault Injection Simulator触ってみる

# 概要
https://aws.amazon.com/jp/fis/

意図的に障害を起こすことで、事前の予防策や復旧について学ぶことが目的のサービス
カオスエンジニアリングというらしい
これをAWSサービスに対してテンプレートを組んで行えるようにしたサービス
楽しそうなので触ってみる

# 準備
FIS経由で各サービスを動かすので必要なポリシーをアタッチしたIAMロールを作成する

##### ポリシー作成
https://docs.aws.amazon.com/fis/latest/userguide/getting-started-iam-service-role.html

とりあえず、ドキュメントに記載がある触りたいサービスの許可ポリシーをJSON形式で作成
また、後ほど実験テンプレートのログをcloudwatchに送信するためにcloudwatchLogsへのフルアクセスも追加

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowFISExperimentRoleEC2Actions",
            "Effect": "Allow",
            "Action": [
                "ec2:RebootInstances",
                "ec2:StopInstances",
                "ec2:StartInstances",
                "ec2:TerminateInstances"
            ],
            "Resource": "arn:aws:ec2:*:*:instance/*"
        },
        {
            "Sid": "AllowFISExperimentRoleSpotInstanceActions",
            "Effect": "Allow",
            "Action": [
                "ec2:SendSpotInstanceInterruptions"
            ],
            "Resource": "arn:aws:ec2:*:*:instance/*"
        },
        {
            "Sid": "AllowFISExperimentRoleECSUpdateState",
            "Effect": "Allow",
            "Action": [
                "ecs:UpdateContainerInstancesState"
            ],
            "Resource": "arn:aws:ecs:*:*:container-instance/*"
        },
        {
            "Sid": "AllowFISExperimentRoleECSStopTask",
            "Effect": "Allow",
            "Action": [
                "ecs:StopTask"
            ],
            "Resource": "arn:aws:ecs:*:*:task/*"
        },
        {
            "Sid": "AllowFISExperimentRoleRDSReboot",
            "Effect": "Allow",
            "Action": [
                "rds:RebootDBInstance"
            ],
            "Resource": "arn:aws:rds:*:*:db:*"
        },
        {
            "Sid": "AllowFISExperimentRoleRDSFailOver",
            "Effect": "Allow",
            "Action": [
                "rds:FailoverDBCluster"
            ],
            "Resource": "arn:aws:rds:*:*:cluster:*"
        },
        {
            "Action": [
                "logs:*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
```

##### ロール作成
カスタム信頼ポリシーを自前で入力してロールを作成 (ポリシーはさっき作ったものをアタッチ

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                  "fis.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

# FISの実験テンプレートを作成

今回はRDSのフェイルオーバを試してみるので、アクションタイプは「aws:rds:failover-db-cluster」を指定
他にもEC2やECSなどに対して実行できる

# 実行

先ほど作成したテンプレートの「実験の開始」で即座に実行される
フェイルオーバが走り、cloudwatchに実行ログが送信されればok

# 雑記
他にもEC2にCPU/IO負荷をかけたり、スポットの強制回収ができたりする模様
テストしたいけど、どうやってテストしたら良いかわからないときにFISを覗いてみればうまくテストできるかもしれない

テストの終了条件にcloudwatchアラームを設定など汎用性も高いので、具体的なテストプランを構築して負荷/障害試験を行うなど色々と楽しめそう
MacでGithub向けXcode用SSHキーを作成する

## Githubで使用するSSHキーについて
GitHubでは、Xcodeで使用できない**ed25519**暗号化方式を作成するように記載されています。
GitHubからプルされたSwiftパッケージを使用している場合は、GitHubのアカウントを使用する必要があります。

## SSHキーの4つのアルゴリズムについて
| アルゴリズム | 説明 |
|:-|:-|
| **DSA**  | サポートされなくなった古いアルゴリズム  |
| **RSA**  | このアルゴリズムは改善されましたが、現在では古いアルゴリズムとなっており、より最新の方法を使用する必要があります  |
| **ECDSA**  | 使用するコンピューター能力に依存するランダムな数値を生成する別の改善されたアルゴリズム  |
| **Ed25519**  | GitHubで使用する必要がある今日最も推奨されるアルゴリズム  |

## Github向けXcode用SSHキーの作成
**Ed25519**の代わりに、Xcodeが受け入れる**ECDSA**を使用することで解決します。 
以下のコマンドでid_githubという名前の新しいキーをECDSAアルゴリズムを使用して作成します。
なお、このキーにはメールアドレスを使用します。
```
ssh-keygen -o -a 100 -t ecdsa -f ~/.ssh/id_github -C "your_email@yourdomain"
```

キーが作成されたら、ssh-agentを実行します。
```
eval "$(ssh-agent -s)"
```

以下のコマンドでキーチェーンにキーを追加します
```
ssh-add --apple-use-keychain ~/.ssh/id_github
```

## 設定手順
新しいキーの準備ができたら、次の手順に従って使用します。

1. [GitHubの設定](https://github.com/settings)から[SSH and GPG keys](https://github.com/settings/keys)へ移動します
1. 使用しなくなったキーをすべて削除します
1. 次のコマンドを使用して、新しい公開鍵の内容をクリップボードにコピーします。`pbcopy < ~/.ssh/id_github.pub `
1. [Developer settings](https://github.com/settings/apps)から[Personal Access Tokens](https://github.com/settings/tokens)へ移動します
1. 未使用のトークンを削除します
1. 新しいトークンをクリップボードからペーストし追加します
1. Xcodeを開き、Preferencesを開きます
1. accountsに移動し、GitHuアカウントを削除します
1. ユーザー名とコピーしたばかりのトークンを使用してGitHubアカウントを追加し直します
1. SSHキーとして`id_github`を選択します
1. Xcodeが新しいキーを受け入れ、GitHubでチェックすることを確認します

これらの手順が完了すると、XcodeでGitHubが使用できるようになります

## 参考
https://gist.github.com/brennanMKE/8e09593ca4064deab59da807077d8f53