OmniAICreator/Qiita-1.07M huggingface dataset:
tempfile.mkstempのPermissionErrorが発生した時の対処法

基本的な事ですけど、ちょっと嵌ったので備忘録として記録
※ PermissionErrorが発生する原因は他にもありますので、この記事の対処法で治るとは限りません。

テスト書く時などに一時的なファイルが必要なら[tempfile](https://docs.python.org/ja/3/library/tempfile.html
)がおススメです。

`tempfile.mkstemp()`は一時ファイルを作成してくれますが、ファイル削除はユーザ自身が行う必要があります。
ファイル操作の後に`os.remove()`すればいいかなと思い、書いて実行した結果、`PermissionError: [WinError 32] プロセスはファイルにアクセスできません。別のプロセスが使用中です。: 'C:\\...[一時ファイルのパス]`' のエラーが発生しました。

with構文は抜けてるけどなぁ…と思いながらも色々試した結果、`tempfile.mkstemp()`実行時のプロセスがファイルを掴んだままらしいので、`os.close()`してあげる必要がありました。

以下、上手く動作したテストの例

```python
class MyFileController():
    def __init__(self, path):
        self.path = path
    
    def output(self, data):
        with open(self.path, "a", newline='', encoding='utf_8_sig', errors='ignore') as f:
            f.write(data)   

class TestMyFileController(unittest.TestCase):
    def test_output(self):
        fd, path  = tempfile.mkstemp()
        mcc = MyFileController(path)
        try:
            mcc.output("test")

            with open(path, encoding='utf_8_sig') as f:
                test_data = f.read()
                self.assertEqual(headers, "test")

        finally:
            os.close(fd)          # <-- ここね。
            os.remove(path)
```
【Corda】CordaのCLIでListを渡したいときは[]を使おう

# はじめに

どーも、のぶこふです。

今回は、Cordaのノードで操作している時に、Listを使いたい場合の方法です。
備忘録も兼ねてですので、内容はあっさりです。

## どーゆーこと？

例えば、下記のようなFlowがあるとします。

```kotlin
// *********
// * Flows *
// *********
@InitiatingFlow
@StartableByRPC
class SendParies(private val data: String, private val parties: List<Party>) : FlowLogic<Unit>() {

    @Suspendable
    override fun call() {
        val set = mutableSetOf<FlowSession>()
        for (party in parties){
            set.add(initiateFlow(party))
        }
// ・・・・・・・・・・略・・・・・・・・・・
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/3202561d-4816-0160-cca5-9498d9dbc114.png)


このとき、どうやって、CLI上からFlowを呼び出せば良いのでしょうか？

## けつろん

単純です。
`[]`で囲んであげれば良いです。

コマンド例としては、次の通り。
`start SendParies data: 10, parties: ["PartyB", "PartyC"]
`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/391d3e55-646d-dab4-90fa-4815f109bca3.png)


簡単ですね。


## おわりに

今回は、内容が内容だったので、あっさりと書いてみました。
いつもはダラダラと長く書きがちなので、たまにはこういう記事も良いですね。
※読み手も書き手も

今回は以上です。
ありがとうございました。
Migrate to AndroidXしたら"No tests found"と言われてハマった

Android Studioの“Refactor -> Migrate to AndroidX”を使ってて、何度かハマったパターン。

自動のmigrationが終わって、テスト走らせてみたら

```
No tests found. This usually means that your test classes are not in the form that your test runner expects (e.g. don’t inherit from TestCase or lack @Test annotations).
```


とだけ言われて、「@Test annotationちゃんとついてるしなー… `build.gradle`で`androidx.test.runner.AndroidJUnitRunner`も指定してあるし… :frowning2:」としばらくハマる。

...

...

結局

```
androidTestImplementation 'androidx.test:runner:1.2.0'
```
の追加忘れ。自動では追加してくれないみたい。

「androidx.test.runner.AndroidJUnitRunnerなんて見つからないよ」とか言ってくれればいいのに :sweat_smile:
【備忘録】VSCodeとWindows TerminalでBashを普通に使うには (ヒストリー保存, etc...)

VSCodeで自動設定されるまま、WSLではない __ローカルのbash__ (git-bash)を使うと、**プロンプト設定が反映されていな**かったり、**ヒストリーが保存されな**かったりします。
今回はVSCodeのターミナル設定を直すとともに、Windows Terminal・Console Window Hostでも、ローカルのbashを普通に使えるようにします。

# インストールするもの
- Git for Windows
- Visual Studio Code
- Windows Terminal

# 設定
## Bash (git-bash)

.bash_profile

```bash:.bash_profile
GIT_PS1_SHOWDIRTYSTATE=1
GIT_PS1_SHOWUPSTREAM=1
GIT_PS1_SHOWUNTRACKEDFILES=1
GIT_PS1_SHOWSTASHSTATE=1

# プロンプトのカスタマイズ (リポジトリのブランチと状態を表示)
export PS1='\[\033[1;32m\]\u\[\033[00m\]:\[\033[1;34m\]\w\[\033[1;31m\]$(__git_ps1)\[\033[00m\] \$ '

# 【追記します】ヒストリーを保存するのに必要
PROMPT_COMMAND='history -a'
```

## VSCode (ユーザー設定)

コマンドパレットから `Open Settings (JSON)`

```json
{
    ...
    "terminal.integrated.shell.windows": "C:\\Program Files\\Git\\bin\\bash.exe",
    "terminal.integrated.shellArgs.windows": [
        "--login"
    ],
    ...
}
```

## Windows Terminal

```json:settings.json![conswinhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185253/db5e6dd3-91fc-f96d-68a6-724fa04550dd.png)

{
    ...
    "profiles" : [
        ...
        {
            "acrylicOpacity" : 0.75,
            "background" : "#011e1e",
            "closeOnExit" : true,
            "colorScheme" : "Campbell",
            "commandline" : "C:\\Program Files\\Git\\bin\\bash.exe --login",
            "cursorColor" : "#FFFFFF",
            "cursorShape" : "bar",
            "fontFace" : "Migu 1M",
            "fontSize" : 11,
            "guid" : "{74e1050a-042a-47e7-af93-f1c8ec54d5eb}",
            "historySize" : 9001,
            "icon" : "ms-appx:///ProfileIcons/{0caa0dad-35be-5f56-a8ff-afceeeaa6101}.png",
            "name" : "Bash (MinGW)",
            "padding" : "0, 0, 0, 0",
            "snapOnInput" : true,
            "startingDirectory" : "%USERPROFILE%",
            "useAcrylic" : true
        },
        ...
    ],
    ....
}
```

## 【おまけ】Console Window Host (bash.exeへのショートカット)

minttyはコマンドのプログレス表示が上手くされないことがあるのでこちらを使用。
![conswinhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185253/d6052fe4-649e-a869-ae49-d7201c525aa4.png)
Laravel - phpでの日付の扱い方（date(), strtotime(), Carbonライブラリ）

Laravelで日記アプリを作っているときに、よく日付を扱ったので、備忘録としてまとめておく。

僕は、`date()`と`strtotime()`を使用して、日付を操作した。

### phpでの日付操作に関する関数、クラス
- `date()`←指定したUnixタイムスタンプ（第2引数。nowの場合は省略可）フォーマット（第1引数）で指定した値を返す。
- `strtotime()`←英文記法の時間をUnixタイムスタンプで値を返す。時間操作可能。
- `Carbon`←DateTimeを継承したCarbonクラス。どうやらLaravel7では`now()`だけで現在日時を表すことが可能。日時操作には便利らしいが、今回の日記アプリ作成には使わなかった。今後使ってみよう。

### 今日

```php
echo date('Y年m月d日'); //2020年8月21日
echo now()->format('Y年m月d日'); //2020年8月21日
```

### 日時を前後させる
#### date関数を使う
```php:date
$d = '2020-07-20'; //指定日時
echo date('Y年m月d日', strtotime($d . '-1 year')); //2019年7月20日
echo date('Y年m月d日', strtotime($d . '+1 day')); //2020年7月21日

//下のようにstrtotime()は第1, 2引数に分けて指定しても操作できる。
echo date('Y年m月d日', strtotime('+1 day', $d)); //2020年7月21日
```

#### Carbonライブラリを使う
```php:carbon
$d = now(); 
echo $d; //2020-08-21 10:34:20
echo $d->addDay(); // 2020-08-22 10:34:20
echo $d->subDay(); // 2020-08-21 10:34:20
echo $d->addDay(3)->format('Y-m-d'); //2020-08-24
```

### 雑感
date()とstrtotime()でほとんどの日付操作ができた。
ただ、他の記事を読むとCarbonライブラリは直感的に操作できて便利とのこと。
まだCarbonライブラリはほとんど使っていないので、次のプロジェクト作成のときは使ってみたい。

### 参考記事
- [PHP - date](https://www.php.net/manual/ja/function.date.php)
- [PHP - strtotime](http://php.net/manual/ja/function.strtotime.php)
- [エンジニアの入り口 - PHPでの日付取得方法！ 詳細まとめました](https://eng-entrance.com/php-date)
- [Qiita - PHPで日付時刻処理を書くならCarbonを使うべき](https://qiita.com/yudsuzuk/items/ff894bd0b76d4657741d)
CakePHPで孫データを取得する方法

# やりたいこと
Aテーブルのキーを外部キーとして持つBテーブル（子テーブル）のキーを外部キーとして持つCテーブル（孫テーブル）のデータを、Aテーブルのデータと一緒に取得したい。
（言葉だとわかりづらい）

# 実装

containメソッドにて`.`区切りで子テーブル、孫テーブルをつなぐ。

```
$query = $this
    ->find()
    ->contain(
        [
            '子テーブル.孫テーブル',
            '他の子テーブル'
        ])
    ->all();
```

前提として、親テーブル及び子テーブルのTableクラスに自分の子供に対するアソシエーションが設定されていること。
ここら辺がbakeで自動生成されるように外部キーは規約通りに`親テーブル名_id`にしておくと便利。

```XxxsTable.php
$this->hasMany('子テーブル', [
            'foreignKey' => 'xxx_id',
        ]);
```

# 参考
マニュアルにそのまま書いてあります。
https://book.cakephp.org/3/ja/orm/retrieving-data-and-resultsets.html#contain

こちらもわかりやすかった。ありがとうございます。
https://teratail.com/questions/30360
FirebaseをReact アプリにつなげる方法 1

### Firebase Console にログイン
Google Accountがあれば、誰でもログインできます。

https://console.firebase.google.com/u/0/project/_/hosting


![Screen Shot 2020-08-21 at 10.22.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430087/4a113fb0-509e-3178-bfa4-04bb8d3aba0c.png)

`Add project`
をクリック


#### Step 1
プロジェクトの名前を入力して、"Continue"
![Screen Shot 2020-08-21 at 10.25.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430087/4b5da41e-f835-05ee-cf14-327bc69fc913.png)

#### Step 2
![Screen Shot 2020-08-21 at 10.27.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430087/4696f9d7-3f51-61f9-d3bd-769f10d12cf7.png)

#### Step 3
`Create project`
をクリックして、完了。
![Screen Shot 2020-08-21 at 10.27.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430087/5c551003-071f-c54f-945e-cd0addf4940c.png)

`Continue`
をクリック
![Screen Shot 2020-08-21 at 10.28.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430087/de61e5e7-a5d0-b663-7ec0-bf30a2f53075.png)

すると、プロジェクトが作成される。
![Screen Shot 2020-08-21 at 10.30.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430087/a6af12a6-e1c3-60d5-aff9-441ff07e9231.png)


### App を追加する。
`Web` iconをクリック (添付画像の女性イラストの左側に iOS, Android, </>とあり、</>をクリック)
をクリック

1. AppのNicknameをつけて、チェックボックスをチェックして、

`Register app`
をクリック
![Screen Shot 2020-08-21 at 10.33.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430087/a3501f8c-42d7-3949-7969-05d7b19ce757.png)

2. Add Firebase SDKはそのままにしておき、
`Next`
をクリック
![Screen Shot 2020-08-21 at 10.35.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430087/35a04a41-5698-374a-6182-755b94ba208a.png)

3. Install Firebase CLI

`npm install -g firebase-tools`
(これはもしこれまでにinstallしていなかったら、しておく必要あり。)

`Next`
をクリック

![Screen Shot 2020-08-21 at 10.37.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430087/ae8f2710-0fbd-87da-1b41-3057af76765a.png)


4. Deploy to Firebase Hosting

ここは、今は何もしなくても良い。(作成したAppを実際にDeployするときに必要な作業)
`Continue to console`
をクリック
![Screen Shot 2020-08-21 at 10.38.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430087/67ecdeb6-1f11-ad99-6234-b6043c18aa11.png)

さっきの画面で、amazon-cloneの下に、
`</> amazon-clone`が作成されていれば、完了
![Screen Shot 2020-08-21 at 10.39.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430087/b575d3e0-7020-898a-6395-bbe26891753a.png)


以上です^^
初めてのオリジナルアプリ作成[環境構築編]

Laravelを学習し始めて、3ヶ月経ちそろそろオリジナルアプリを作成してみようかと。
今まで投稿アプリ、ECサイト、タスク管理などのアプリを参考書を活用し、作成してきたが遂にこの時が。

これを期にQiitaにオリジナルアプリ開発の手順や苦戦したところ等、様々な内容を記録として残していきます。

作成するプロダクトとしまして、

- 旅行日記アプリ

を題材に作成していきます。

## まず最初に

### プロダクト作成目的

- 旅行をするが、時間が経つと忘れてしまう。
- 写真を見返して行った思い出が蘇るが、行った内容が分からない。
- いろんな人の旅行を見れるようなものが作りたい。

### ペルソナ

- 旅行好き
- 旅行日記としてまとめたい
- 訪れた都道府県を記録したい

### 機能一覧

- アカウント作成機能
- ログイン、ログアウト機能
- 記事投稿のCRUD機能
- 投稿へのいいね機能
- 投稿へのコメント機能
- 投稿へのハッシュタグ機能
- 写真付き投稿機能
- 記事の検索機能
- Googleログイン、アカウント作成機能
- 余裕があればフォロー機能
開発ディレクトリを作成

### プロダクト設計

- ガントチャート「タスクマネジメント」
- ワイヤーフレーム「画面遷移」
- ER図「テーブル管理」

## 開発へ

### 環境構築「laradock」

開発ディレクトリを作成

```
$ mkdir trip-diary
```

対象ディレクトリへ移動

```
$ cd trip-diary
```

laradockをgitからクローン(末尾のversionは任意に指定できる)

```
$ git clone https://github.com/Laradock/laradock.git -b v9.6
```

laradockディレクトリへ移動し、環境変数.envをenv-exampleからコピーする

```
$ cd laradock
$ cp env-example .env
```

.envの編集

```
.
└──trip-diary
    └── laradock
        └── .env
```

.envをエディタで開いたら下記のように編集する
**変更前**

```
APP_CODE_PATH_HOST=../
DATA_PATH_HOST=~/.laradock/data
COMPOSE_PROJECT_NAME=laradock
```

**変更後**

```
APP_CODE_PATH_HOST=../laravel
DATA_PATH_HOST=../data
COMPOSE_PROJECT_NAME=trip-diary
```
### dockerを使って開発環境を起動する

次にDockerを使って開発環境を起動します。

ここでは、以下4つのコンテナを起動します。

- workspace
- php-fpm
- nginx
- postgres

今回、PostgreSQLはバージョン11.6を使うことにします。

laradock/postgresディレクトリにあるDockerfileの1行目を以下のように修正する

```
FROM postgres:11.6
```

laradockディレクトリに戻った後に、

```
$ docker-compose up -d workspace php-fpm nginx postgres
```

上記のコマンドでdockerの指定したコンテナを立ち上げることができる

localhostを立ち上げるとlaravelのwelcomeページが確認できたら完了！！
組織の進化と退化

以前に現場の定例ミーティングで話した時のメモ。雑ですが、自分の記録として残しておこうかなと。

# きっかけ
- この記事を読んで、前に勉強会で聞いた話を思い出した
    - https://note.com/jumos5/n/nbde782ee4d21
        - マネージャーに求められるスキルは抽象度高め
            - が、マネージャの持つ答えにはジュニアメンバーの行動が密接に関係している
                - 例えば組織にどんなメンバーがフィットするか？という問いには
                    - 既存メンバーの性格
                    - 既存メンバーのスキルセット
                        - これは今後獲得できるものも含む
                    - 既存メンバーが作り上げてきた組織文化
                    - などが関連するため、マネージャの考えだけで決まるものじゃなくね？という

# 「組織」に求められることと「メンバー」に求められることは違うのか？
- 社会からの要求(ニーズ、フィードバック)に対して事業としてアウトプットを示すのが会社組織
    - 組織としてのアウトプットを生み出すのは個々のメンバー
        - ということは、理想的には全てのメンバーが組織に求められるアウトプットを全て実現できる方がいい
            - まあ実際には難しい
                - が、これを(多少エクスキューズをつけながらも)実現する組織形態というのが話題を集めた

# ティール組織
- https://www.amazon.co.jp/dp/B078YJV9ZW/
- すっごい雑にまとめると
    - 一人一人が組織と同一である (個は全、全は個)
    - 組織は自己管理、自己修復が可能
    - 組織の目的自体が進化し続ける
- これができることによって、VUCAな時代においても柔軟に適応し、利益を出し続け、死なない組織になれる、的な

# 組織はティールな状態に進化するのではなく、ティールな状態から退化していくという見解
- 埼玉大学の経営学者、宇多川先生の勉強会での発言
    - 著書: https://www.amazon.co.jp/dp/4910063013
    - ティール組織は既存のレガシーな組織構造を抜け出し、全員がフラットで変化し続ける状態へと進化する、という説明がなされるが、実は組織や経営学としては結構前にこの考え方はあった（インテグラル理論。それをうまいこと編集し直して名前変えたりして新たなものとして売り出したところに著者フレデリック・ラルーの凄さ？がある）
    - で、実際の状況を見てみると、生まれたての会社組織はみんなで仕事を分け合ってなんでもやるというのが当たり前で 、これこそまさにティール組織が状態である。
        - ここから、組織が階層化し部署ごとの壁ができていく中で組織はどんどんとグリーン -> オレンジ -> アンバーと退化していくのである
            - この説明は非常に納得感があった。

# 昨今の状況にも現れる「失敗の本質」
- https://www.amazon.co.jp/dp/4122018331
- コロナへの対応がインパール作戦そのもの
    - アベノマスク
        - 不良品、そもそも配布数がたりてない、予算の横抜き
    - GoToキャンペーン
        - やることで感染拡大必至
        - その状況で本来の目的は達成されない
            - けど引き返せない
- 組織のトップに対してものを言えない、組織のトップも冷静な判断ができない、組織が現在の状況をきちんと認識できない（情報が正しく取れていない）ことによる負のスパイラル
    - この辺はOODAループの本を読んでみるのもおすすめ

# 我々はどこに向かうのか？
- 組織とは必然的にトップがどのような組織を志向するかによって決まる
- が、そのトップが何を志向するかはボトムアップの影響を受けている
- 相互に会話することによって健全な組織になっていきたいなあと個人的には思います。
範囲指定のスクリーンショット（Windows10）

# 範囲指定のスクリーンショット（Windows10）

Windows10でのスクリーンショットの取り方は3種類存在する。
指定範囲、アクティブウィンドウ、画面全体の3種。
指定範囲のスクリーンショットはWindows10で実装されたようです。

## 指定範囲のスクリーンショット

「Windows」+ 「Shift」+「S」キーで、範囲指定モードに切り替わるので、切り取りたい範囲をドラッグで囲うとクリップボードに保存される。

## アクティブウィンドウのスクリーンショット

「Alt」+「PrintScreen（PrtScn）キー」

## 画面全体のスクリーンショット

「PrintScreen（PrtScn）キー」
CentOS7 Apacheを使ったWebサーバを立てる

# 目的

- Apacheを用いてCentOS7のPCにWebサーバを立ち上げる方法をまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | CentOS 7 (7.8.2003) |
| ハードウェア | Dell Studio 1537 |
| プロセッサ | Intel(R) Core(TM)2 Duo CPU     P8400  @ 2.26GHz |
| メモリ | 4 GB DDR3 |
| グラフィックス | 不明 |

# 前提条件

- 下記、または下記に準ずる方法でCentOS7のマシンが構築されていること。
    - []()

# 前提情報

- 今回ご紹介する作業はCentOS7のPCのターミナルでコマンドを実行して実施する。
- ブラウザを用いた確認もCnetOS7のPC上で確認するものとする。

# 読後感

- CentOS7のPCにApacheをインストールして`http://localhost`にアクセスすることでドキュメントルートに存在するhtmlファイルをブラウザで表示することができる。

# 概要

1. yumの更新
1. httpd(Apache)のインストールと設定
1. httpdの設定変更
1. htmlファイルの設置
1. 確認

# 詳細

1. yumの更新
    1. 下記コマンドを実行してyumの更新を行う。

        ```terminal
        $ sudo yum update
        ```
1. httpd(Apache)のインストールと設定
    1. 下記コマンドを実行してhttpdをインストールする。

        ```terminal
        $ sudo yum install httpd
        ```
1. httpdの起動と設定変更
    1. 下記コマンドを実行してhttpdを起動する。

        ```terminal
        $ sudo service httpd start
        ```
    1. 下記コマンドを実行してhttpdのステータスを確認する。

        ```terminal
        $ systemctl status httpd
        ```
    1. 下記に先コマンドの出力例を記載する。

        ```
        ● httpd.service - The Apache HTTP Server
           Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
           Active: active (running) since 金 2020-07-24 16:08:02 JST; 1min 31s ago
             Docs: man:httpd(8)
                   man:apachectl(8)
         Main PID: 5520 (httpd)
           Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
            Tasks: 6
           CGroup: /system.slice/httpd.service
                   ├─5520 /usr/sbin/httpd -DFOREGROUND
                   ├─5524 /usr/sbin/httpd -DFOREGROUND
                   ├─5525 /usr/sbin/httpd -DFOREGROUND
                   ├─5526 /usr/sbin/httpd -DFOREGROUND
                   ├─5527 /usr/sbin/httpd -DFOREGROUND
                   └─5528 /usr/sbin/httpd -DFOREGROUND
        
         7月 24 16:08:02 localhost.localdomain systemd[1]: Starting The Apache HTTP ...
         7月 24 16:08:02 localhost.localdomain httpd[5520]: AH00558: httpd: Could no...
         7月 24 16:08:02 localhost.localdomain systemd[1]: Started The Apache HTTP S...
        Hint: Some lines were ellipsized, use -l to show in full.
        ```
    1. 下記コマンドを実行してCentOS7のPCが起動した時にhttpdも一緒に起動する設定にする。

        ```terminal
        $ sudo chkconfig httpd on
        ```
1. htmlファイルの設置
    1. 下記コマンドを実行して表示するhtmlファイルを開く。

        ```terminal
        $ sudo vi /var/www/html/index.html
        ```
    1. 開いたファイルに下記の内容を記載する。

        ```/var/www/html/index.html
        <html>
            <h1>hello Japan!!</h1>
        </html>
        ```
    1. 保存して閉じる。
    1. 下記コマンドを実行してhttpdを再起動する。

        ```terminal
        $ sudo service httpd restart 
        ```
1. 確認
    1. CentOS7のPCのブラウザにて[http://localhost](http://localhost)にアクセスして下記のページが表示されれば本記事の作業は完了である。

        ![Screenshot from 2020-07-24 16-40-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/1a120491-e5a5-e306-ddde-e9e0e6f9a4f8.png)
【自動テスト】Airtestでランタイム中の自動テスト作りの始め方

アプリケーション自動テストツールAirtestの始め方備忘録です。

## 本記事を読んで得られる事

Airtestを使ったことがない人が、環境構築からアプリケーションの簡単なランタイムテストを作れるようになります。
(プログラムはほぼ書きません)

## 手順

1. Airtest IDEのインストール
2. Airtest IDEにAndroid実機を接続
3. 簡単なテスト処理を書いてみる
4. テストを実行

## 1.Airtest IDeのインストール

[Airtest Project](http://airtest.netease.com/index.html)
こちらの公式サイトからダウンロードして、インストールしておきます。

## 2.Airtest IDEにAndroid実機を接続

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/5f30a657-3a8f-c745-8875-644dcffeb47f.png" width=500 />
Airtest IDE起動した直後の状態です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/181d1b05-3ea6-23ce-1a85-80efa90897a8.png" width=500 />



PCにUSBケーブルで実機を接続した状態で `Refresh ADB`をクリックします。
すると`Devices > Mobile Phone Connection`に実機がリストアップします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/2a59574f-ac4a-d673-b494-0e998b6e2410.png" width=500 />
`connect`辺りをクリックします。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/3f55db7a-8183-e21c-079f-ddfbd26af465.png" width=450 />


このように接続したAndroid実機の画面が同期されて表示されます。

## 3.簡単なテスト処理を書いてみる

「指定のボタンが見つかったら、タッチする」というテストを書いてみます。

```python
if(exists(button)):
    touch(button)
```
ソースコード的にはとても簡単ですが、この`button`をどう定義するかがポイントになります。

### 画像認識で定義
![kentei.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/ae63b750-aa3b-b789-3dfe-364156994987.gif)
動画の通り`button`変数を画像で定義します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/bb53e035-42cf-f984-84f7-a86567a6d6a9.png" width=450 />
ソースコードはこのようになりました。

## 4.テストを実行
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/4da1807e-34f0-d3d1-0061-784a139d2035.png" width=450 />
再生ボタンを押してテストを実行してみます。

![kentei_sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/899c3300-c8ff-eff9-f777-179851cde03d.gif)

このように指定のボタンが存在したので、タッチ処理が走って想定通り画面が遷移しました。

## 最後に

プログラムをほぼほぼ書かずにテストを作ることが出来ました。
僕もこの記事を書きながらインストールからテストを書くところまでを初めてやりましたが、迷うことはありませんでした。

今回は「ボタンを見つけたらタッチする」というとても簡単なケースでしたが、もっと長いストーリーを書いて、チュートリアル突破テストやゲームのメインループの通しテスト、アプリの遷移テストなど色々と応用できます(ググればたくさん出てきます)。

ちなみに今回のテストで使用したアプリはUnity1Weekで作った[減色検定](https://unityroom.com/games/genshoku)というゲームです。



## 環境

- Pixel3XL Android10
- Airtest IDE v1.2.5
住所データをPostgreSQLに取り込む方法例

オープンデータとして公開されている [Geolonia 住所データ](https://geolonia.github.io/japanese-addresses/) を PostgreSQL に取り込む方法の一例を紹介します。

① 住所データを格納するテーブルを作成します。

```sql
CREATE TABLE "住所データ" (
  "都道府県コード" text,
  "都道府県名" text,
  "都道府県名カナ" text,
  "都道府県名ローマ字" text,
  "市区町村コード" text,
  "市区町村名" text,
  "市区町村名カナ" text,
  "市区町村名ローマ字" text,
  "大字町丁目コード" text,
  "大字町丁目名" text,
  "緯度" numeric,
  "経度" numeric
);
```
※テーブル名や列名、データ型などは適宜適切なものに変更してください。

② ```\copy ... program``` コマンドで住所データをテーブルにロードします。

```sql
\copy "住所データ" from program 'curl -s https://raw.githubusercontent.com/geolonia/japanese-addresses/master/data/latest.csv' with (format csv, header on);
```

③ 住所データが取り込まれたのを確認します。

```sql
SELECT count(*) FROM "住所データ";
 count  
--------
 189539
(1 row)

SELECT "都道府県名", count(*) FROM "住所データ" GROUP BY "都道府県名" ORDER BY count DESC LIMIT 5;
 都道府県名 | count 
------------+-------
 北海道     | 25914
 愛知県     | 14507
 兵庫県     |  8967
 大阪府     |  8603
 京都府     |  7631
(5 rows)
```
K近傍法（NearestNeighbors）のPython実装メモ

#0 はじめに
本記事はsklearnでK近傍法を実装する際の自分用メモとして記載した内容です。他の記事を読んで理解した点や、記憶しておきたい点を図を用いてまとめています。

#1 準備
以下の通り、numpyとsklearnからK近傍法で使う`NearestNeighbors`を読み込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584974/4f071971-8ffb-3602-5b89-e9a8b947b929.png)

今回データセットとして、`y=x`の1次元関数を定義しデータセットを作成します。なお、今回用意をするデータイメージは以下の感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584974/1c76d8f3-33ed-64a5-9c78-44f9b5c27761.png)

訓練データセットは9個ずつで構成し[1,9,2]の次元で与えます。また10番目のデータを試験データとして与えます。今回確認する点として、訓練データセット9個に対し、試験データはどの点に最も近いのかを予測するさせます。1次関数でデータを作っているので結果は自明で、訓練データセットの9番目が最も近くなりますが、このシンプルな問題に対し、`NearestNeighbors`の動作を確認します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584974/e7ceced9-7b5b-4a25-4158-f5e2d5488a7b.png)

実行結果は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584974/678f0f9e-4dd2-b5b7-92b6-abd29d04cadf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584974/1eaea5da-67d1-b7d5-89bb-3fde477e86f0.png)

#2 NearestNeighbors用のデータ定義
`knn_vector_n`は訓練データセットを格納する箱で、`knn_vector_n1`が試験データセットを格納する箱です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584974/0e2a3d34-998b-4ed2-0365-fb1b02dc76ab.png)

`for i in tqdm(range(0,len(test_data)-9)):`
これはデータセットを作成するためのforループです。

`knn_vector_n = test_data.iloc[i:i+9,0:2].values.reshape(-1,2)`
これは1セット9個の訓練データを作成するためのスライスです。xとyのデータセットをpandasで与えたので、`value`で取り出し、`reshape(-1,2)`で9行2列のnumpy配列に整形しています。

`knn_vector_n1 = test_data.iloc[i+9,0:2].values.reshape(-1,2)`
これは試験データを抽出するためのコードで、`i+9`で10番目のデータを抽出しています。

`KNN=NearestNeighbors(n_neighbors=1,lgorithm='ball_tree').fit(knn_vector_n)`
この行で各訓練データを`NearestNeighbors`に読み込ませています。`n_neighbors=1`は試験データに対し最も近い1つの試験データを探すというものです。実際に試験データに対しどの訓練データが近いのかを探す処理は以下で実施します。
`distance, indices = KNN.kneighbors(knn_vector_n1)`
第一引数が距離（ユークリッド距離）で、第二引数が何番目の訓練データかを返します。

`dist_vec.append(distance)`
`indi_vec.append(indices)`
この2行は、各試験データから計算された最近傍点の距離とデータの場所をforループごとに追加格納している内容です。

#3 結果表示
```
print(dist_vec)
```

まず、`dist_vec`ですがこれは以下三平方の定理で計算ができる通りの結果が表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584974/aa7a98f8-030a-1264-f1eb-ceed3868aefd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584974/3ff3f9d1-0ee7-7832-ad8c-7df39a455d1f.png)

もし
'KNN=NearestNeighbors(n_neighbors=2,algorithm='ball_tree').fit(knn_vector_n)`
の'n_neighbor=2'として宣言をした場合、テストデータから最も近い2点を返します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584974/62c7f9ef-fefe-bdbd-31dd-b87109df4305.png)
GAEでNode.jsを使ってHello Worldをするまで

GAEを使って、Node.jsのHello Worldを行った際の備忘録。

と言っても、Googleの公式ドキュメント通りに行えば大体大丈夫でした。
たまに詰まっても、ググれば出てきたって感じでした。

ではさっそく。

#GAEとは
Google App Engine の略。
Google Cloud Platform の一部。
Google のサーバーを借りてwebアプリ等を公開できる。


#公式ドキュメントを参考にやってみる
まずは、こちらの手順に従う。
スタンダード環境で Node.js を使用するためのクイックスタート
https://cloud.google.com/appengine/docs/standard/nodejs/quickstart#local-machine_1

以下、躓いたところの対処法を残しておく。

``3.リージョンを選択``
東京なら asia-northeast1 だ。
https://cloud.google.com/about/locations?hl=ja#locations

![スクリーンショット_081920_084150_PM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640981/f4ad70a1-b54f-3b8c-ecba-125f431bc72f.jpeg)


``5.Node.js環境準備``
・node.js 環境を整える際に、NVM という、node.jsのバージョン管理コマンドをインストールする際に、node.jsをアンインストールする必要がある。（すでにnode.jsインストール済みの場合）
・npm install --save express をする前にnpm init をして、package.jsonを作る必要がある。
（これは、僕がNode.jsをちゃんと理解していなかったからですね(^^;）


``既存のNode.jsアンインストール``
こちらを参考に。
https://funacchi.qrunch.io/entries/vsnfmdk3bYvnsUhn
の「3. Node.jsのアンインストール」

https://github.com/coreybutler/nvm-windows#uninstall-existing-node
の「Uninstall existing node」、「Uninstall existing npm」


``NVMのインストール``
こちらを参考に。
https://github.com/coreybutler/nvm-windows

最初どうすればいいか分からなかったが、
下記の手順でできた。
１．下記のサイトから使いたいVersionの「nvm-setup.zip」をダウンロード
（筆者の場合「1.1.7 - Maintenance Release」を選択した）
https://github.com/coreybutler/nvm-windows/releases
２．「nvm-setup.zip」を解凍。
３．「nvm-setup.exe」を起動。指示に従う。

※「nvm install xxx」や「npm install xxx」を実行すると、処理が完了しているのに途中で画面が止まることがあるから、その際は「Enter」を押すこと。（処理が止まるのは、僕のPCだけかな？）

あとは、「Hello World をローカルで実行する」に従うだけ。
[Hello World をローカルで実行する](https://cloud.google.com/appengine/docs/standard/nodejs/quickstart#run_hello_world_locally)

日をまたいでの作業になったため、一度CMDを閉じていた。
CMDを閉じると、もう一度 gcloud init を実行しないといけない。
参考：https://qiita.com/koshi_an/items/472659f89ef3e472b896

#GAEめちゃ良い
使ってみてGAEが便利なことに気づきました。
個人的には下記のことが大変ありがたかったです。
・公開サーバーにデプロイする際にわざわざsshログインする必要がない。（x-serverでは必要）
「gcloud app deploy」をすればデプロイできる。
・ドメインを取得する必要はない。
　→一つまでなら無料で使えるらしい。これは、アプリ系の開発勉強中の方にはうれしいですね。
　　ローカルと本番環境で挙動が違うことはたくさんありますから。
・ケータイからでも編集が可能
　→「Cloud Console」っていうアプリをダウンロードすれば、画面は小さいがスマホからでもファイルの編集、本番デプロイが可能。
　ちょっとした旅先にPCをもっていっていないけど、どうしても直ぐに試したいっていう状況の時に便利

AWSも似たような感じなのかな？
いずれ勉強してみようと思います。
対応するかっこのインデックスを返す

# 対応するかっこのインデックスを返す

[Brainfuck](https://ja.wikipedia.org/wiki/Brainfuck) のインタプリタを作ろうかと思って。

## これはなに

かっこ (`[` と `]`) の対応を調べる。
対応するかっこがあればそのインデクスを返す。
なければ `-1` を返す。
そもそもかっこでなければ自分のインデクスを返す。

例:

```javascript
let str = '++[>++[>++<-]<-]>>';
let foo = bracket(str, 2);	// 15
let bar = bracket(str, 12);	// 6
let baz = bracket(str, 7);	// 7
let err = '[[[][][]][][]';
let qux = bracket(err, 0);	// -1
```

```javascript
function bracket(s, p) {
	if (!/\]|\[/.test(s[p])) {
		return p;
	}
	let nest = 1;
	if (s[p] === '[') {
		for (p++; nest; p++) {
			if (p >= s.length) { return -1; }
			s[p] === '[' && nest++;
			s[p] === ']' && nest--;
		}
		p--;
	}
	else {
		for (p--; nest; p--) {
			if (p < 0) { return -1; }
			s[p] === ']' && nest++;
			s[p] === '[' && nest--;
		}
		p++;
	}
	return p;
}
```
フロントエンドとバックエンドのリアルタイム通信の選択肢を教えて下さい

これは「コードを書いていて困ったときに、suinがチャットで質問に答えたり相談に乗る[suinのプログラミング相談室(仮)](https://help.suin.io/)」で頂いた質問と僕の回答の要約です。

## 質問

フロントエンドとバックエンドのリアルタイム通信の選択肢を教えて下さい。その長所短所も知りたいです。

## 僕の回答

こんにちは。

フロントエンドとバックエンドのリアルタイム通信の選択肢についての質問ですね。

通信方法の選択肢についてご回答します。

### 1. AJAXポーリング

この方式は、GETリクエストなどをAJAXで数秒間隔などでバックエンドに投げ、もしレスポンスのデータに変化があったら、それをフロントエンドに反映するという手法です。

ポーリングの長所は、AJAXが分かれば他に学ぶことがないという点です。実装もかんたんです。また、バックエンドのサーバやプログラミング言語の選択肢も広いです。

短所は、無駄な通信が発生しうるということです。更新があろうが無かろうがリクエストを投げ続けるからです。また、リアルタイム性を上げれば上げるほど通信頻度が増すので、ユーザ数が多い場合はサーバへの負荷が大きくなります。

### 2. WebSocket

この方式は、WebSocketという双方向リアルタイム通信を可能にするための一般的な方式です。チャットアプリやオンラインゲームなど、リアルタイム性が極めて重要なところに向いています。

長所は、リアルタイム性です。ひとたびフロントエンドとサーバサイドでWebSocketが接続されてしまえば、サーバが能動的にブラウザにデータを送信できます。また、多数のユーザ接続に対してもサーバへの負荷が少なくスケールしやすいです。

短所は、WebSocketの学習コストがあることです。WebSocketの開発経験がない場合、実装方法や認証方法、セキュリティなどを一から学ぶ必要があります。また、WebSocketに対応しているサーバやプログラミング言語を選ぶ必要があります。Apache+PHPではWebSocketはできず、Node.jsやJavaなどは対応しています。

### 3. Server-sent events(SSE)

この方式は、サーバからブラウザへデータをストリーミング配信する一方通行の通信方式です。WebSocketと同じくらいリアルタイム性があります。

長所は、リアルタイム性と実装のしやすさのバランスにあると思います。
学習コストはポーリングより高いですが、WebSocketよりは低いです。
SSEはWebSocketのように全く新しい概念ではなく、馴染み深いHTTP GETリクエストを利用して実装できるので、学びは最低限で済みます。
大抵のプログラミング言語で実装できます。サーバの選択肢もAJAX同様に広めです。

短所は、スケーラビリティです。HTTPコネクションを1つ以上専有することになりますが、ブラウザが同一ドメインに対して同時に保持できるコネクション数は数個と意外と少なく、SSEのコネクションを張りすぎると、ブラウザがサーバに一切リクエストが送れなくなるという問題が起きます。これを避けるためにSSE専用のサブドメインを作るといった解決策はあります。

また、短所として、SSEのライブラリがWebSocketと比べて少ないという点もあります。

以前に関連した記事を書いたことがあるのでご参考までにご覧ください:
[サーバサイドpush技術としてのWebsocketとServer-sent eventsの特徴比較 - Qiita](https://qiita.com/suin/items/e33af700ceb678d40a67)

・・・

いずれも一長一短なので、自分やチームのレベルに合ったものはどれか、プロダクトの要件として適合するのはどれか、という観点でサンプルコードを書いてみて検討してみることをおすすめします。


---

最後までお読みくださりありがとうございました。Twitterでは、Qiitaに書かない技術ネタなどもツイートしているので、よかったらフォローお願いします:relieved:→[Twitter@suin](https://twitter.com/suin)
チーム開発におけるGit操作手順

業務でGitの扱いを学んだのでまとめました！


１. リモートリポジトリからローカルリポジトリへpull

```
git pull origin master
```

２. masterから、新しいブランチを作成

```
git checkout -b ブランチ名
```

３. 作成したブランチをリモートへ反映

```
git push origin ブランチ名
```

４. 修正したファイルをステージングへ移動

```
git add  -A
```

５. 修正したファイルを確認

```
git status
```

６. 修正したファイルが問題なければコミット

```
git commit -m “メッセージ” 
```

７. リモートリポジトリへpush

```
git push origin ブランチ名
```
イラストレーターでアピアランス を利用した文字の背景を設定した場合、文字を長方形の縦の中心に来るように設定

https://webrandum.net/illustrator-text-vertical-center/

上に書いてある方法で原則いけたが、少し考えないといけないところがあったのでメモ


長方形のアピアランスの形状オプションで高さと幅を0mm追加した状態で、上の操作を行うと
長方形の大きさが文字ピタピタになってしまった。

なので、長方形の高さと幅を追加しようとして、後から幅に追加というところと高さに追加というところを変更しても、長方形の大きさが変化しなかった。


上の操作をする前に長方形の大きさを変更した上で、上のオブジェクトのアウトラインを追加するとうまくいった。


アピアランスとかの深い仕組みとかあんまりわかっていないから、なんかよくわかっていない気がする
【PHP】数字と分解で覚えるclass（簡単）



#はじめに
実務でphpに触れる事が多くなってきました。
その中で、「class」の動きがいまいち分からなかったので、自分の理解度チェックの意味も込めて記事にしたいと思います。

#class
先ずは簡単なclassを使用したソースを見てみましょう！

```php


<?php

//①クラスを定義
Class Animal{
  //④タローが代入される
  //プロパティ
  public $name;

  //⑤名前を出力させる関数を定義
  public function animalName(){
     echo $this->name;
  }
}

//②インスタンス生成
$dog = new Animal();

//③クラス内のプロパティに渡す値
$dog->name = "タロー";

//⑥関数を発動
$dog->animalName();

//⑦
//出力結果　タロー
?>
```

このソースを分解して見ていきましょう。

```php
//①クラスを定義
class Animal{
}
```
①
今回のメインですね。
classを定義する事で、まとまった処理（関数、変数など）を作成する事ができます。
classはあくまでも「処理」のまとまりなので、classだけではプログラムは動作しません。

```php

//②インスタンス生成
$dog = new Animal();
```
②
Animalクラスの処理に値（実態）を投げるため、インスタンスを生成します。

```php
//③クラス内のプロパティに渡す値
$dog->name = "タロー";
```
③
実際に渡す値を代入します。
ここのnameは④の$nameへ->を使用して値を渡す感じです。

```php
  //④タローが代入される
  //プロパティ
  public $name;
```
④プロパティまたはメンバ変数と呼ばれる変数です。
ここにインスタンスで生成した値が入ってきます

```php
  //⑤名前を出力させる関数を定義
  public function animalName(){
     echo $this->name;
```
⑤
ここのnameは④のnameとなります。
注意として$を付けないようにしましょう。
また、なぜ$thisが必要なのかというと、変数はグローバル変数とローカル変数があります。
ただの$nameにしてしまうと、グローバル変数を指してしまうので、このclassで使用する
変数だと分かるように、$thisを付けます。

```php
//⑥関数を発動
$dog->animalName();
```
⑥
最後に関数を発動させて、nameを出力させます。

自分的に最初は$this->の意味や、インスタンスってなんやねんって感じでしたけど
使っていくうちになんとなく理解できました。
[備忘録] データベースについて軽く勉強してみた

## はじめに
これはデータベース勉強する上の超個人用メモです。笑笑

## データベース
excelの表みたいな感じの大量データを管理するもの。
以下のような感じ笑笑

**個人テーブル**

|個人識別ID|名前|出身地|
|:--:|:--:|:--:|
|1|星野みなみ|千葉県|
|2|堀未央奈|岐阜県|
|3|齋藤飛鳥|東京都|
|4|寺田蘭世|東京都|

**所属テーブル**

|個人識別ID|所属|
|:--:|:--:|
|1|乃木坂1期生|
|2|乃木坂2期生|
|3|乃木坂1期生|
|4|乃木坂2期生|

### カラム
各テーブルの各項目にあたる列のこと。(列は縦だよ)

例: 個人識別ID、名前、出身地、所属

### レコード
各テーブルの1件分のデータにあたる行のこと。(行は横だよ)

例: (1 星野みなみ 千葉県)、(1 乃木坂1期生)

### 主キー
テーブルのデータを必ず1件特定できるカラム。
主キーに設定したカラムは、重複した値は設定不可。

例: 個人識別ID

### 外部キー
複数テーブルを連携させる時、テーブル同士で共通しているカラム。

例: 個人識別ID

### ユニークキー
意味合い的には主キーと同じ。
しかし、主キーは1つのカラムのみしか設定できないのに対して、ユニークキーは複数のカラムを設定可能。

## RDB (Relational DataBase)
RDBとは、複数テーブルでデータを管理する方式。
この方式により、データの重複をなくすことができ、データ検索能力が高くなる。

## SQL (Structured Query Language)
RDB等でデータ操作(データの挿入・選択・更新・削除)を行うために使用する言語。
いわば、**データベース専用プログラミング言語**となる。

## 正規化
データの重複や繰り返し項目をなくしていき、よりデータの取り扱いがしやすいようにデータベースを設計すること。

### 非正規形
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685853/71f46cb2-ecf8-4f0a-3028-4d1369bdf5b5.png)

### 第1正規形

|個人識別ID|名前|出身地|所属|
|:--:|:--:|:--:|:--:|
|1|星野みなみ|千葉県|乃木坂1期生|
|2|齋藤飛鳥|東京都|乃木坂1期生|
|3|寺田蘭世|東京都|乃木坂2期生|
|4|堀未央奈|岐阜県|乃木坂2期生|

### 第2, 3正規形

**個人テーブル**

|個人識別ID|名前|
|:--:|:--:|
|1|星野みなみ|
|2|堀未央奈|
|3|齋藤飛鳥|
|4|寺田蘭世|

**出身テーブル**

|個人識別ID|出身地|
|:--:|:--:|
|1|千葉県|
|2|岐阜県|
|3|東京都|
|4|東京都|

**所属テーブル**

|個人識別ID|所属|
|:--:|:--:|
|1|乃木坂1期生|
|2|乃木坂2期生|
|3|乃木坂1期生|
|4|乃木坂2期生|

## トランザクション
トランザクションとは、データベースでの一連の処理をひとまとまりにした処理単位。

### コミット
トランザクションの処理でエラーが出ずに無事完了すること。

![プレゼンテーション1-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685853/ede90227-f6e0-3201-95ee-b7c99d1269f7.jpeg)


### ロールバック
もし、トランザクションの処理途中でエラーが出た場合、トランザクションのその処理が行われる前の状態まで戻ること。
その処理はいかにも最初からなかったような感じになる。

![プレゼンテーション1-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685853/4eb8fa5b-c80b-bebd-b88c-cf1cae416d0a.jpeg)


ロールバックの反対で、**ロールフォワード**というのもある。

### トランザクションACID特性
#### 原子性 (ATOMICITY)
トランザクションは、処理が完全に実行されるか、全く実行されないかのどちらかしかないという性質。

#### 一貫性 (CONSISTENCY)
トランザクションの処理の実行前後で整合性を持ち、一貫したデータであるという性質。

#### 独立性 (ISOLATION)
あるトランザクションが別のトランザクションに影響を及ぼすことはないという性質。

#### 耐久性 (DURABILITY)
一度データベースにデータが格納されたら、データは失われることはないという性質。

## 排他的制御

### 共有ロック
**データを参照する**時にかけるロックのこと。
共有ロックをかけている時は、他のトランザクションはデータ参照は可能だが、データ更新は不可である。

### 占有ロック
**データを更新する**時にかけるロックのこと。
占有ロックをかけている時は、他のトランザクションはデータ参照・更新は不可である。
つまり、占有ロックをかけているトランザクションのみデータに触れることが可能。

### デッドロック
複数のトランザクションの処理が、同じデータベースの同じ場所にアクセスしようとして、お互いの処理を妨げてしまい、どちらのトランザクションの処理も膠着してしまうこと。

例: あるトランザクションAが「データAを使用する処理➡データBを使用する処理」で処理したいと考えていて、別のトランザクションBが「データBを使用する処理➡データAを使用する処理」で処理したいと考えていると仮定する。
また、2つのトランザクション処理は同タイミングで行うと仮定する。

![プレゼンテーション２-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685853/ec97132e-1d5a-1b45-fdb7-3ee6faa6ab7f.jpeg)

## おわりに
ネットワーク編
https://qiita.com/N46_myHearter/items/9f1b75d2432063dc11e7

情報セキュリティ編
https://qiita.com/N46_myHearter/items/421e214bb58e7108c9a9

努力・感謝・笑顔、うちらは乃木坂上り坂 46。笑笑
今さら聞けないことを書く会：コンテナ技術②

今さら聞けないことをできるだけ分かりやすく書く試みです。
※本稿に記載した内容は個人の感想なので、間違っていても怒らないでください。

# 前回までのあらすじ
コンテナって何？
https://qiita.com/yuki7/items/7e454f9cebb2088a0e9b

前回はコンテナというものが何かという基本的なことに触れた。
今回は具体的にコンテナにどのようなメリットがあるのか。
コンテナを使うことで開発者・運用者はどのようなメリットが出るのか。
という点について調べてみたい。

# １．コンテナのメリット
コンテナの分かりやすいメリットは
・同じ環境をたくさん用意することができる
・同じ環境を素早く用意することができる
の2点が大きい。

## １．１．同じ環境をたくさん用意することができる
アプリケーションを開発する際、
・開発環境
・ステージング環境
・本番環境
というような環境でアプリケーションを開発していくことになる。

ここでよくある問題として、環境ごとにOSやMWの設定が異なり、
動作に違いが生まれるという点だ。

通常のハイパーバイザー型の環境であれば、
それぞれOSが用意されている形となるため、
独自の設定が存在したり、導入時期による環境の違いが生まれてくることになる。

とくに「開発環境」というのは開発者の「PC内」「専用端末内」であることが多く、
環境の違いが起きやすいものとなる。

これが、コンテナの場合となると、
前回の記事でも記載したようにOSは同一の、複数の環境を用意することができる。

1.ハードウェア > 2.ホストOS > 3.仮想マシン > 4.OS/カーネル <font color="Red">> 5.コンテナ</font> > 6.アプリケーション
　　　　　　　　　　　　　　　　　　　　　　　　　　　　<font color="Red">> 5.コンテナ</font> > 6.アプリケーション
　　　　　　　　　　　　　　　　　　　　　　　　　　　　<font color="Red">> 5.コンテナ</font> > 6.アプリケーション
　　　　　　　　　　　　　　　　　　　　　　　　　　　　<font color="Red">> 5.コンテナ</font> > 6.アプリケーション
　　　　　　　　　　　 　　　　　　　　　　　　　　　　　 ：
　 　　　　　　　　　　　　　　　　　　　　　　　　　　　 ：

こういう環境を用意することにより、アプリケーション開発をスムーズに行わせることができるというのが、コンテナのメリットの1つと言える。

## １．２．同じ環境を素早く用意することができる
もう1つのコンテナのメリットとしていえるのが、
その展開の速さ、可搬性、という点と言える。

先述したようにコンテナ環境はOSは1つであるので、
新しく環境を用意する際にコンテナを追加するだけで良い。
コンテナ以前であれば、OSを導入し、MWを導入し、という作業が必要だったが、
コンテナの場合それらをすっ飛ばして環境を用意できるため、
素早く環境を用意できるという点もメリットとなる。

また、コンテナはサイズが小さいというのも1つのメリットである。
具体的には開発環境を配布する際にそのメリットが活きてくる。

開発は開発者のPCなどで行われることもあるが、
例えば通常の仮想マシンでは小さくても数GBの容量がる。
この容量のものを配布するとなると事だが、
コンテナ環境は容量が数百MBであるということで、
環境の配布という意味でもメリットがある。

# まとめ
今回はボリュームが少なかったが、コンテナのメリットについて調べてみた。
いくつかのサイトで勉強してみた限り、コンテナのメリットとしては
・同じ環境をたくさん用意することができる
・同じ環境を素早く用意することができる
という２つが大きいといえる。
もちろん他にもあるだろうし、デメリットもある。

次回はデメリットについてまとめていきたい。

# 参考文献
https://www.ashisuto.co.jp/tech-note/article/20171206_system.html#:~:text=%E3%81%93%E3%82%8C%E3%81%BE%E3%81%A7%E3%81%AE%E3%80%8C%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%90%E3%82%A4%E3%82%B6%E3%83%BC,%E5%89%8A%E6%B8%9B%E3%80%81%E4%BD%9C%E6%A5%AD%E8%B2%A0%E8%8D%B7%E3%81%AE%E8%BB%BD%E6%B8%9B%E3%80%82&text=%E9%9A%9C%E5%AE%B3%E6%99%82%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E4%BB%A3%E6%9B%BF%E7%92%B0%E5%A2%83,%E3%81%8A%E3%82%88%E3%81%B3%E4%BD%9C%E6%A5%AD%E8%B2%A0%E8%8D%B7%E3%81%AE%E8%BB%BD%E6%B8%9B%E3%80%82
https://news.mynavi.jp/article/zerocontena-5/
ヒアドキュメントを使ってコマンドに値を渡す(バッチファイル)

# はじめに
バッチファイルでヒアドキュメントを使ってコマンドに値を渡す方法

# bash スクリプト

Linux で以下のようなコマンドを実行していたものを Windows のバッチファイルで実現する方法を探していたらできたので記載しておく

```bash
＜コマンド＞  ＜コマンド引数＞ <<EOF
＜ユーザ名＞
＜パスワード＞
＜その他＞
EOF
```

# バッチファイル
以下のようにするとヒアドキュメントっぽくコマンドに値を渡すことができる

```batch
(
echo ＜ユーザ名＞
echo ＜パスワード＞
echo ＜その他＞
) | ＜コマンド＞ ＜コマンド引数＞
```
【Unity】NWPathMonitorを使ったネイティブプラグインUniNWPathMonitorを作ってみた

Unityにはネットワーク接続確認の機能`Application.internetReachability`が存在しますが、あえて**NWPathMonitor**を使ったSwiftのネイティブプラグインを作ってみました。

[iOSのネットワーク接続状態の検出にはReachabilityよりシンプルなNWPathMonitorを使いましょう。 - Qiita](https://qiita.com/meSummery/items/9d096162a351e2e922c5)
Swift周りの処理はコチラの記事を参考にさせて頂きました。


## Swift側

```UniNWPathMonitor.swift
monitor.pathUpdateHandler = { path in
    if path.status == .satisfied {
        // connected
        self._onCallback("1")
    } else {
        // No connected
        self._onCallback("0")
    }
}
```
NWPathMonitorインスタンス(monitor)を使って接続中であれば`"1"`、切断中であれば`"0"`を予めセットしておいたコールバックで返却します。


## Objective-C++側

```c++
API_AVAILABLE(ios(12.0))
UniNWPathMonitor *_monitor;
```
今回NWPathMonitorを使うにあたって、iOS12以降が必須となるため、`API_AVAILABLE`でiOS12以降が必須であることを宣言します。


```UniNWPathMonitorBridge.mm
[_monitor setCallbackOnCallback:^(NSString * value) {
    UnitySendMessage("UniNWPathMonitor", "Noti", [value UTF8String]);
}];
```
UniNWPathMonitorに対しコールバックをセットします。
コールバックが返ってきたら`UnitySendMessage`を使ってUnity側のに接続情報を返却します。

Objective-C++の記述は以前執筆したコチラの記事を参考にして頂ければと思います。
[【Unity】最近のUnityでC#からSwiftを実行する最短実装 - Qiita](https://qiita.com/ohbashunsuke/items/8f3b7c733fc70a180941)

## Unity側

Unity側ではこのような使い方になります。
UniNWPathMonitorにStartMonitorを実行しコールバックをセットするだけです。

```Sample.cs
void Start()
{
    UniNWPathMonitor.StartMonitor();
    UniNWPathMonitor.onChangeNetworkStatus += status =>
    {
        if (status == UniNWPathMonitor.NetworkStatus.satisfied)
            // 接続中
        else
            // 切断中
    };
}
```

![anim.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/6e1fe76a-e3f0-2bf0-2de9-1a900bb2355f.gif)
実際作ったものはコチラ。WifiのオンオフをしてUnity側でコールバックを受け取っています。切り替えてUnityにコールバックが返るまで少しラグが発生するようです。


## 最後に

冒頭で申し上げたとおり、ぶっちゃけUnityの場合は**Application.internetReachability**が存在するため本プラグインは不要です。※筆者が作ってみたかったから作ってみたというやつです。

自分にとっては、実際に作ってみて学びは多かったです。初めて出てきたSwiftのコールバック文法や、iOS12以降を必須にする方法など、現在勉強中のSwiftの事を知る機会が出来て良かったです。

<br />

以下に全ソースアップしているので、ご参考にどうぞ。
https://github.com/baobao/UniNWPathMonitor


## 開発環境

- Unity2019.4.4f1
- Xcode11.6
- iPhone6S iOS13.6
即時関数の書き方　初心者向け

## 即時関数とは
関数定義と同時に一度だけ実行される関数。

### 即時じゃない関数
普通の関数

```js
function a() {
	console.log('called');
}

a();
//log >>> called
```

### 関数宣言での即時関数
関数宣言 ＝「say function!」

```js
(function('仮引数') {
	console.log('called');
})('実引数');
//log >>> called
```

### 関数式での即時関数
returnで呼び出し元に実行結果が返却される。  
下記の場合、変数aに変数bが入る。

```js
const a = function('仮引数') {
	let b = 'hi!';
    return b;
}('実引数');

//関数式の場合functionの前後に()つけなくても動く、つけても動く

console.log(a);
//log >>> hi!

```
HTML勉強まとめ

今回の記事について、自分でわかりやすくアウトプットのためのメモになります

HTMLを書く上で必ず先頭に書く必要がある宣言は何？
DOCTYPEタイプ宣言　``<！DOCTYPE html>``

HTMLの文章であることを宣言するタグといえば何
HTMLタグ　``＜html lnag="ja"></html>``

タブやヘッダ情報を表すタグといえば何
HEADタグ　``<head＞</head>``


サイトに使われてる文字コード情報タグといえば何
METAタグ　``<meta char="utf-8">``

タブ上に表示させる名前のタグといえば何
TITLEタグ ``<title></title>``

ホームページの中身の纏まりを表すタグといえば何
BODYタグ　``<body></body>``

見出しを表すタグといば何
Hタグ（１〜６）丸の部分には何番目の見出しの数字　``<h○></h○>``

段落を表すタグといえば何
Pタグ　``<p></p>``

画像を表示させるタグといえば何
IMGタグ altは画像が表示されなかった時に分かりやすいように名前を表示　``<img src="画像のファイル名" width height alt="画像の名前">``

問題1 画像の幅と高さ共に100にして、表示されなかった時に表す文字を画像のファイル名と一緒にせよ　＊画像のファイル名　kwaii.png

問題2　プログラムの間違いを直してください
``<!DOCTYPE>
<html>
 <meta lnag="ja">
 <title>問題練習</Title>
</head>
<body>
 <h1>いざ！新天地へ、出発！！</h1>
 <p> 新し冒険の世界へようこそ</p>
</body>
</html>``
クロージャーとは

## クロージャーとは
> レキシカルスコープの変数を関数が使用している状態。

... えっ、なに？(汗
### まず、レキシカルスコープとは
> コードを書く場所によって参照できる変数が変わるスコープのこと。

うむ。｛こういう状態とか｝でスコープが変わることを言っているんだな。きっと。

### 個人的なクロージャーのイメージ
`クロージャーじゃない状態 → { グローバル｛関数A｝ }`
`クロージャーな状態 → { グローバル｛関数B｛関数A｝} }`  
「この変数の値を簡単に触られたくない！」という場合、その変数を使う関数Aを関数Bで囲い、その変数を関数Bに置き、関数Aから関数Bの変数を参照できる状態にした上でグローバルからは触れないようにした状態!

勢いで言い切ってみましたが！
ちょっと違うかも...

ま、まぁとりあえず、上記のイメージを踏まえて実際のコードを見ていきたいと思います。自身でイメージを掴み、言語化できることが重要です。

### 呼ぶたびに変数numの値を１ずつ増やしていく処理をつくりたいが変数numは外から触られたくない　→　クロージャーを考える

下記の状態だと変数numは外部からアクセスできないものの、increment()を呼ぶ度に０で初期化されてしまう為、期待する結果を得られない...

```js
function increment() {
let num = 0;
//ここでnumが常に０になる
  num ++;
//そして＋１される
  console.log(num);
//当然logは１
} 
increment();
increment();
increment();
increment();
//何度呼ぼうが... ↓
// log >>> 1
// log >>> 1
// log >>> 1
// log >>> 1
```
下記のようにすると期待する結果は得られるものの、変数numがグローバルにあるため触られ放題...

```js
let num = 0;
function increment() {
  num ++;
  console.log(num);
}
increment();
increment();
increment();
increment();

// log >>> 1
// log >>> 2
// log >>> 3
// log >>> 4
```


### 上記２つの望みを叶えるものがクロージャー！  
関数incrementを関数incrementFactoryで囲い、関数increment自体を関数incrementFactoryにreturnすることでグローバルから実行できるようしつつ、変数numの値はグローバルからは触られない！

```js
//関数incrementの外側にその関数を覆うように関数を作成する
function incrementFactory() {
//ひとつ前の例でいうグローバル空間が今は関数に覆われていて非グローバル状態に
  let num = 0;
  function increment() {
//この関数内から「レキシカルスコープ」である変数numを参照しにいっている状態　
    num ++;
    console.log(num);
  }
//incrementFactoryに関数incrementを返すことでグローバルからincrementFactoryを通して実行できるようにする
  return increment;
}

//ここの変数に関数incrementFactory内にある関数incrementが入る
//ここの変数名は何でも良い
const increment = incrementFactory();

increment();
increment();
increment();
increment();

// log >>> 1
// log >>> 2
// log >>> 3
// log >>> 4
```
なんとなく理解できたでしょうか？
わたしもなんとなく理解できた気がしますのでここにまとめてみました。

引き続き勉強していきます。

## まとめ
クロージャーとは...

- ある関数の内側で定義されている関数が外側の関数が保持する変数（レキシカルスコープ）への参照を保持している状態！
- グローバルからひとつ中へ閉じられたスコープ空間を作るぜ！みたいな状態！
Chinese & Japanese Note




|     中文     |            English             |           日本語      |
| :----------------------------: | :----------------------------------------------------------: | ------------------------------------------------------------ |
|     武士     |            samurai             |                           サムライ                           |
| 乞力马扎罗山 |       Mount kilimanjaro        |                       キリマンジャロ山                       |
|   面向对象   |        Object Oriented         |              $オブジェクト\overset{しこ}{指向}$              |
|    初学者    |            beginner            |               $\overset{しょしんしゃ}{初心者}$               |
|     基础     |              base/foundation           |                   $\overset{きそ }{基礎}$                    |
| 地理信息科学 | Geographic Information Science | $\overset{ちり}{地理}\overset{じょうほう}{情報}\overset{かがく}{科学}$ |
|     数据     |              data              |                            データ                            |
|  空间自相关  |    spatial autocorrelation     |                        空間的自己相関                        |
|   莫兰指数   |         Moran's Index          |                         Moranの測度I                         |
| 二次型 | quadratic form | $\overset{にじけいしき}{二次形式}$ |
| 线性代数 | linear algebra |$\overset{せんけいだいすうがく}{線型代数学}$	|
Ubuntuで#MaixPy をカスタマイズする

#概要
MaixduinoやM5StickVのファームウェアをカスタマイズします。

Maixボードでメモリを節約する場合や便利なモジュールを使いたい場合に、MaixPyファームウェアをカスタマイズする必要があります。
Ubuntuがない場合には、クラウドサービスのMaixHub Online CompileでMaixPyをカスタマイズする方法があります。
https://qiita.com/nnn112358/items/1575206bda278235774f


##環境
以下の作業はUbuntu(Linux)が必要です。
Ubuntu18.04 (5.0.0-36-generic)

##ファームウェアのコンパイル

### Maixpyのダウンロード
Maixpyのファームウェアをソースコードからビルドします

```
$ git clone https://github.com/sipeed/MaixPy-v1.git
$ git submodule update --recursive --init
```

### Pythonのインストール
Miniconda をインストールして、 Python の環境を作ります。 
Miniconda のインストーラは、 Miniconda のウェブサイトからダウンロードして取得し
ます。

Miniconda : https://docs.conda.io/en/latest/miniconda.html

```
$ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
$ sh https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
```

conda を起動します。

```
$ conda create -n ml python=3.6
$ conda activate ml
```

pyserialをpipでインストールします。

```
$ pip3 install -r requirements.txt
```


### kendryte-toolchainのインストール

kendryteのtoolchainを、/opt/kendryte-toolchain/にインストールします。

```
$ wget https://github.com/kendryte/kendryte-gnu-toolchain/releases/download/v8.2.0-20190409/kendryte-toolchain-ubuntu-amd64-8.2.0-20190409.tar.xz
$ sudo tar -Jxvf kendryte-toolchain-ubuntu-amd64-8.2.0-20190409.tar.xz -C /opt
$ ls /opt/kendryte-toolchain/bin
```
https://github.com/kendryte/kendryte-gnu-toolchain/releases

### MaixPyのFirmwareのライブラリを増やしたり、減らしたりする。

MaixPyのFirmwareのライブラリを減らすことでシステムヒープメモリの容量をあけることができます。
また、ライブラリを追加することで、機能を拡充することができます。

```
$ cd MaixPy
$ cd projects/maixpy_m5stickv/ 
```

```
$ python3 project.py menuconfig
```

Conponent Configrationを選びます。
![Screenshot from 2019-12-08 15-04-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/294a01c3-a7bc-baa5-d698-b49fa8ff5023.png)

MicroPython Configrationを選びます。
![Screenshot from 2019-12-08 15-04-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/6c643b76-5d70-56a4-062b-bf869ef6f981.png)

Module Configrationを選びます。
![Screenshot from 2019-12-08 15-04-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/91e588ed-9a95-a444-d3d6-279a0102047d.png)

使わないライブラリをOFFにします。
![Screenshot from 2019-12-08 15-05-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/b49d7c61-6324-3acf-18b4-bf0b81943686.png)

今回は、MaixPy IDE Supportを残して他をOFFにしました。
![Screenshot from 2019-12-08 15-05-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/ce583596-6dcf-7084-1bb4-e3b914ae62e3.png)

MaixPyをビルドします。maixpy.binというファイルが生成されれば完了です。

```
python3 project.py build
```

生成されたMaixPyバイナリと学習モデルをKfashで書き込んでみましょう。

![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/a857ceb6-f600-e1a5-4e61-7db19800f4cb.jpeg)



#参考サイト



SIPEED BLOG
http://blog.sipeed.com/p/1338.html

SIPEED maixhub
https://www.maixhub.com/
PHPでアクセスカウンターを作る + CGIとして実行

# 本記事の内容

- PHPで簡素なアクセスカウンターを作る
- html内からCGIとして実行

# 背景

以前[Hugoで黒歴史サイトを作成した．](https://qiita.com/niwashi/items/59fb864f81230a06140c)
その際，アクセスカウンターとして[npc.cgi](http://www2.biglobe.ne.jp/~nir/npc/)を使ったのだが

- 明らかに古そう
- 画像で表示される

といった問題が有り，常々なんとかしたいと思っていた．
がんばって勉強した結果，CGI機能を使えばHTMLファイル内から自由にプログラムを実行できることを知り，勉強がてらアクセスカウンターを作ろうとした次第である．

## なんでPHP?

サーバーのコマンドを自由に実行できるならPythonやRubyでも良いじゃんと思われるかもしれない．
ていうか自分もそう思っていた．しかし，さくらのレンタルサーバーだと

- Pythonが2.7しか無い
- Rubyのバージョンもメンテナンス終了ギリギリ

という環境なので断念した．一方でPHPは最新のものが入っていたため，PHPでアクセスカウンターを作ることにした．

# 結果

## 作ったもの

長々と中身のない話をしてもしょうがないので早速制作物を示す．

```
#!/usr/local/bin/php

<?php

header('Content-type: text/html; charset=utf-8');

$lock = './counter.lock';
$counter = './counter.json';

if (!$lockfile = fopen($lock, "a")) {
    die("ロックファイルが開けません");
}

flock($lockfile, LOCK_EX);

if(!file_exists($counter)){
    die("カウンターが開けません");
}

$json = file_get_contents($counter);
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
$arr = json_decode($json,true);

$num = $arr["counter"];

echo $num;

$arr["counter"] = $num + 1;

if (!$counterfile = fopen($counter, "w")) {
    die("カウンターが開けません");
}

fwrite($counterfile, json_encode($arr));

fclose($counterfile);

flock($lockfile, LOCK_UN);

fclose($lockfile);

?>
```
これをcgiファイルとして保存する．
次に同じディレクトリにcounter.lock(空ファイルでいい)と
counter.json({ "counter" : 0})を作る．
## ポイント

### ロックファイルを使い競合を防ぐ

私のサイトは1日10人も見ないような（多分アクセスしてるのもbot）サイトだが，
万が一同時に複数人がアクセスするとファイルが破損する恐れがある．
そのため，lockファイルを作り，同時に1プロセスずつしか実行できないようにした．

### JSONでデータを管理

アクセス数を保存するだけなのにJSONを使うのは仰々しいが，ややこしい処理をしなくても
簡単にファイル内の変数にアクセス，編集できるためJSONファイルにアクセス数を保存した．

## HTMLファイルから呼び出す

HTMLファイルからCGIファイルを呼び出す方法はいくつか有るが，ここではSSI機能を使った．
SSIとはServer Side Includesの略で，所定の形式でコメントを挿入すると，サーバーが適宜
コマンドの実行結果に置き換えてくれる機能である．

今回は以下の形で挿入した．

```
<!--#include virtual="/hoge/counter/counter.cgi"-->
```

##　注意点

さくらのレンタルサーバーでSSI機能を使うには，CGIを呼び出すhtmlファイルの拡張子をshtmlにする必要がある．
Swiftで同じ図形を違う色で描く方法

### はじめに
下の図のように、UIBezierPathを使ってSwiftで図形を作り、各四角を指定した色で画面に描きたいと思ったのですが、最後の色が全てに適応されたり、四角が一個しか描画されないなど、結構苦戦したので記事にしてみました。

![スクリーンショット 2020-08-21 3.19.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501835/800a96b9-3a0b-5436-7d7a-5e7b5fd1217b.png)

### やり方
```ViewController.swift

import UIKit

let category = ["赤", "青", "赤", "青", "赤"]

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        for i in 0..<category.count {
            let rectangleLayer = CAShapeLayer.init()
　　　　　　　// 図形を描く画面の大きさ
            let rectangleFrame = CGRect.init(x: 0, y: 0, width: 414, height: 896)
            rectangleLayer.frame = rectangleFrame
        　　// 四角の位置と大きさを指定
            let rectangle = UIBezierPath(rect: CGRect(x: 100 + i * 50, y: 100 , width: 50, height: 50))
　　　　　　　// 配列に入っている色に合わせて四角の色を指定する
            if category[i] == "赤" {
                rectangleLayer.fillColor = UIColor.red.cgColor
            }
            else if category[i] == "青" {
                rectangleLayer.fillColor = UIColor.blue.cgColor
            }
            rectangle.fill()
            // 線の太さの指定
            rectangle.lineWidth = 0
            // 描画する
            rectangleLayer.path = rectangle.cgPath
            self.view.layer.addSublayer(rectangleLayer)
        }
            
    }


}

```

参考Web
https://uruly.xyz/【swift3】uibezierpathで卵型を書こう【cashapelayer】/
http://tokyo.supersoftware.co.jp/technology/8011
https://program-life.com/648