OmniAICreator/Qiita-1.07M huggingface dataset:
Mac初心者が覚えるべき操作方法

Windowsで開発していたエンジニアが、ある日突然MacBookを渡され、あたふたしながら開発を始め、「これは知っておかないといけない」と思った操作方法です。
プログラミングとは関係ないかもしれませんが、プログラミングをするためには、Macを使いこなせないといけません。
「最低限、この操作はこれで実現できる！」「これを最初から知っておけばよかった！」というものを記します。

## 右クリック相当は指二本タップ
これは最初から知っておくべきでした！！！
Macに右クリックがないのは知ってましたが、では右クリックのメニューってどうやって出すの？　そんなのないの？　と思ったら、指二本をトラックパッドに置くと出てきます。
分かったら色々捗る！
あと、二本指で上下にスワイプで画面スクロールです。
Chromeでは右に滑らせれば戻る、左だと進む。

## command + →　で文末へ移動
WindowsのキーボードだとEndキーがあるので、それで文末へ移動できるけど、Macにはない。
これに相当するのがcommandキー押しながら、矢印キーを押す。
文頭は←すればOK。

## Deleteキーに相当するのはcommand + ✖️キー
右上にある✖️のキーボード、WindowsのBack Spaceキーの動きに相当します。
ならDeleteキーは？　というと、commandキーを押しながら✖️キーになります。
これでフォルダにあるファイルをトラックして選択、まとめてゴミ箱にいれる、が実現できる。

### 指三本を置いて上に滑らせると、使用しているアプリが画面に出てくる
やってみれば分かります。
狭い画面で、あのアプリがどっか行った！　って時に三本の指を置いて上にスワイプ。

以上、今までMacを触ったことがない人が「これは知っておかないと開発できない」という挙動でした。
また思い出したら追加していきますが、「これも覚えておくべき」というのがあったら、コメントから教えていただけると嬉しいです。
オブジェクト指向　メンバ関数にメンバ変数を代入する方法

#はじめに
メンバ関数にそのクラス内で作成したメンバ変数を引数にしようとした時に構文エラーがでたため、どのようにしたらいいのかを考えた。

#したこと
TodoValidationクラスでcheckメソッドを作成し、そのメソッドをcontrollerで呼び出そうとしたコードが以下である。

```php
public function check($this->str)
    {
        // 空文字チェック
        if (empty($this->str)) {
            return   $_SESSION['err_msg'] = '入力してください';
        }
    }
```

このメソッドをcontroller側で呼び出そうと以下のコードを書いた。

```
$toDoValidation->check($this->product_name);
```

が、フィールドに値を入力してPOST送信してもセッション変数のエラーメッセージは空になっていた。

#原因
メンバ関数の引数にメンバ変数は代入できない決まりがある。
なので、

```php
public function check($str)
    {
        // 空文字チェック
        if (empty($str)) {
            return $_SESSION['err_msg'] = '入力してください';
        } else {
            return true;
        }
    }
```


というようにメンバ関数の引数に変数を入れることによって正しくバリデーションを行うことができた。

#どうしてもメンバ変数を使用したい場合

以下のように記述する。

```php
public function check($str)
    {
        $this->str = $str;
        // 空文字チェック
        if (empty($this->str)) {
            return   $_SESSION['err_msg'] = '入力してください';
        }
    }
```
CentOS7にDockerをインストールして起動する

# 前提

* CentOS7にrootでSSHログインできること。


# Dockerをインストールする

root権限で下記を実行する。

```
yum update -y
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce -y
```

# Dockerを起動する

```
systemctl start docker
systemctl enable docker
```
PostgreSQLのコマンド その2

# PostgreSQLのコマンド その2
## テーブル
### テーブルの一覧表示(view、sequenceも含む)

```
# \d
```

### テーブルの一覧表示

```
# \dt
```

### テーブルのスキーマ詳細表示

```
# \d <tablename>
```

### テーブルのアクセス権限表示

```
# \z <tablename>
```

### viewの一覧表示

```
# \dv
```

### viewの定義表示

```SQL
# SELECT definition FROM pg_views WHERE viewname = '<viewname>';
```

### テーブル名変更

```SQL
# ALTER TABLE current_tablename RENAME TO <new_tablename>;
```

### テーブルの削除

```SQL
# DROP TABLE <tablename>;
```
PostgreSQLのコマンド その1

# PostgreSQLのコマンド その1
## データベース
### データベース接続

```
$ psql <dbname>
```

ユーザーを指定して接続する場合

```
$ psql -U <username> <dbnane>
```

### データベース切断

```
# \q
```

### データベース一覧表示

```
$ psql -l
```

```
# \l
```

### データベースの切り替え

```
# \c <dbname>
```

```
# \connect <dbname>
```

### データベースの削除

```SQL
# drop database <dbname>;
```
PostgreSQL備忘録(Mac版)

MacにPostgreSQLを入れた時のメモです。

# 環境構築
## Homebrewのインストール
MacOS用のパッケージマネージャー[Homebrew](https://brew.sh/index_ja)をインストールします。
※インストール方法はリンク先に書かれているので省略。

## PostgreSQLのインストール
ターミナルを起動して、以下のコマンドを実行します。

```
$ brew install postgresql
```

## インストールの確認
以下のコマンドを実行して、PostgreSQLがインストールされているか確認します。

```
$ psql --version
psql (PostgreSQL) 12.1
```

## データベースの初期化
以下のコマンドを実行して、データベースを文字コードUTF-8で初期化します。

```
initdb /usr/local/var/postgres -E utf8
```

## PostgreSQLの起動、停止、再起動
以下のコマンドを実行して、PostgreSQLを起動します。

```
$ brew services start postgresql
```

停止する際は以下のコマンドを実行します。

```
$ brew services stop postgresql
```

再起動を行う際は以下のコマンドを実行します。

```
$ brew services restart postgresql
```

## ユーザーの追加
ユーザーを追加する際は以下のコマンドを実行します。
※PostgreSQLインストール時にはデフォルトでMacのユーザー名が作成されます。

```
$ createuser -s -P <username>
```

## データベースの作成
以下のコマンドを実行してデータベースを作成します。

```
$ createdb <dbname>
```

データベースを削除する際は以下のコマンドを実行します。

```
$ dropdb <dbname>
```

作成したデータベースの一覧を見たい場合は以下のコマンドを実行します。

```
$ psql -l
```
ページ遷移時にオブジェクトを自動送信する

JavaScriptで次のようなことをやりたい。

1. サーバーからオブジェクト(状態)を取得する。認証付き
2. ページ遷移時、オブジェクトは自動的にサーバーに投げられ保存される

コードで表すと

```js
const state = await autosave_state(url, id, password)
```

## 実装コード

JavaScript側。IE非対応
``beforeunload``イベント時に``navigator.sendBeacon()``を実行するのが正着

```js
async function autosave_state(url, id, password){
    const r = new FormData()
    r.append('r', JSON.stringify({id, password}))
    const http  = await fetch(url, {method:'POST', mode:'cors', credentials:'include', body:r})
    const state = await http.json()

    window.addEventListener('beforeunload', function(){
        const w = new FormData()
        w.append('w', JSON.stringify({id, password, state}))
        navigator.sendBeacon(url, w)
    })

    return state
}
```


サーバ側。サンプルコードをPHPで。


```php
<?php
if(isset($_POST['r'])){ //取得動作
    $r = json_decode($_POST['r']);

    // 認証。$r->id、$r->password を確認する
    // 取得。$state に送信したいオブジェクト

    header('Content-Type: application/json');
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');
    print json_encode($state);
}
else if(isset($_POST['w'])){ //保存動作
    $w = json_decode($_POST['w']);

    // 認証。$w->id、$w->password を確認する
    // 保存。$w->state を保存する

    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');
    http_response_code(204);
}
```

## sendBeacon 以外の方法

fetchのオプションで``keepalive:true``とすると、sendBeaconと同等の機能になるらしい。送信可能な容量は64KB。
https://ja.javascript.info/fetch-api
Java

```java:Test.java
class Test {
  public static void main(String[] args) {
    System.out.println("Test");
  }
}
```
```bash:bash
>javac Test.java
>java Test
Test
```


```java:Index.java
package test;

public class Index {
  public static void main(String[] args) { 
    TokyoService tokyo = new TokyoService();

    for (String city : tokyo.getCities()) {
      System.out.println(city);
    }

    OsakaService osaka = new OsakaService();
    System.out.println(osaka.getCity(0));
  }
}
```
```java:IPrefecture
package test;

public interface IPrefecture {
  String[] getCities();
  // オーバーロード
  String getCity(int id);
}
```

```java:TokyoService

package test;

public class TokyoService implements IPrefecture {
  static final String[] cities = {"中央区", "浪速区"};
	public TokyoService() {
    System.out.println("Osaka");
	}

	@Override
	public String[] getCities() {
		return cities;
	}

	@Override
	public String getCity(int id) {
		return cities[id];
	}
}
```
```java:OsakaService
package test;

public class OsakaService implements IPrefecture {
  static final String[] cities = {"渋谷区", "新宿区"};
  public OsakaService() {
    System.out.println("Osaka");
  }

  @Override
  public String[] getCities() {
    return cities;
  }

  @Override
  public String getCity(int id) {
    return cities[id];
  }
}
```
モーダルウィンドウ作成の考え方

# モーダルウィンドウを構成する要素

- モーダルを開くためのボタン(#open)
- モーダルウィンドウ(#modal)
    - モーダルを閉じるためのボタン(#close)
- モーダル部分以外を覆うマスク(#mask)

# Step1 javascript無しでモーダルが開いているときを表現する

- モーダル部分以外のマスクを画面いっぱいに広げる
    - **画面の決まった位置に固定するため、positionをfixedにする**
    - top, right, left,bottomからの距離を全て0にすれば画面いっぱいに広がる
- モーダルウィンドウを固定の位置で表示
    - **モーダルウィンドウは、マスクの上に重なる必要があるため、z-indexをマスクより上の値にしつつ、positionをabsoluteにする**

# Step2 マスクとモーダルは初期状態では見えない状態にする

- マスクとモーダルにdisplayがnoneのcss(.hidden)を割り当てる
    - モーダルを上から表示されるようにしたい場合は位置を画面より上に配置させればよい
    - `transform: translate(0,-100px);`

# Step3 javascript実装

- モーダルを開くためのボタン(#open)にイベントを設定する
    - hiddenクラスを消す
- モーダルを閉じるためのボタン(#close)にイベントを設定する
    - hiddenクラスを付与する
- モーダルにアニメーションを付与する場合
    - 動的だが、javascriptではなくcssで表現できる。
    - `transition 0.4s;`
Github Actions で手動で job を実行してデプロイをする方法

# 概要
例えば master ブランチへのマージをトリガーにデプロイジョブを動かすことは簡単にできますが、特定のブランチに対して手動でデプロイジョブを実行したいときには一工夫必要なのでやり方を共有です。

# コード

手動でジョブを実行するときに、何をトリガーにするかですが、 curl で repository_dispatch イベントを実行させることでジョブを実行させます。

任意のブランチにチェックアウトするために client_payload に target_brunch キーを作成しています。

```
curl -vv \
-H "Authorization: token パーソナルトークン" \
-H "Accept: application/vnd.github.everest-preview+json" \
"https://api.github.com/repos/オーナー名/リポジトリ名/dispatches" \
-d '{"event_type": "build", "client_payload": {"target_brunch": "feature_branch"}}'

```

以下、action の yml です。
on で repository_dispatch を指定します。
また、手動実行用のジョブを用意し、それ以外のジョブでは repository_dispatch イベントで発火させないようにします。

ブランチのチェックアウトのために、`github.event.client_payload.target_brunch` で curl で送ったブランチ名を参照しています。


```
on:
  push: # master にマージされたときにトリガーされる用
    branches:
      - master
  repository_dispatch:
    types: [build]

jobs:
  manual_deploy:
    runs-on: ubuntu-latest
    if: github.event_name == 'repository_dispatch'
    steps:
      - name: Execute git checkout
        uses: actions/checkout@v2
        with:
          ref: ${{ github.event.client_payload.target_brunch }}
    # 任意の処理を続けてください

normal_deploy:
    runs-on: ubuntu-latest
    if: github.event_name == 'push'
    steps:
      - name: Execute git checkout
        uses: actions/checkout@v2
    # 任意の処理を続けてください
```

下記記事を大変参考にさせてもらいました。

Github Actions を API から実行する
https://qiita.com/okitan/items/88994a36c996f2397a07
ディープコピーとシャローコピーについての備忘録

簡単な備忘録

```javascript:copy.js
import { cloneDeep } from 'lodash';

let shallowCopied = Object.assign({}, source);
let deepCopied = cloneDeep(source);
```

シャローコピーの場合はオブジェクトのプロパティ値が
プリミティブ型の場合はコピーできますが
オブジェクトの場合、インスタンスが共有されてしまいます。
（参照先がコピー元のまま）

lodashライブラリを利用することで
ディープコピーができます。

なお、import文をただ書いただけの場合、
webpackでのバンドル時に不必要なモジュールまでバンドルして
ファイルサイズが肥大化してしまうようです。

lodash-webpack-pluginを利用することで
必要なモジュールのみのバンドルが可能なようです。


参考
---
[javascriptでlodashを使ってディープコピーを簡単に行う](https://qiita.com/t-motoki/items/5685d302e2e242f561b4)
[[webpack] バンドルされるLodashのサイズを減らす方法](https://b.0218.jp/20180521003425)
docker for macでgitlab-ceのコンテナを作るときにハマった話

### 概要
Dockerのgitlab-ce公式イメージを使ってローカルにgitlabサーバを立てた際にハマった話です
公式サイトの`docker-compose`の項目の通りに進めたが、環境特有の問題が発生していました。
https://docs.gitlab.com/omnibus/docker/#install-gitlab-using-docker-compose

### 環境
* OS:MacOS 10.14.6(Mojave)
* Docker ver:19.03.5, build 633a0ea
* gitlab-ce Image:gitlab/gitlab-ce:12.6.4-ce.0

## 起きたこと１
コンテナを起動した後、ブラウザからlocalhostで当たってみても502エラー画面になって先に進めません。
導入系の記事はだいたい特に設定変えなくても普通に使えるみたいなこと書いてあるのに。。

<img width="787" alt="スクリーンショット 2020-02-21 1.37.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86185/b7113b82-2ff9-785f-e2e8-661653726169.png">

#### 原因
結局、MacOSかつファイルシステムがHFS+かつdocker-composeで立ち上げたときだけ、gitlabコンテナ内のunicornで必要なソケットファイルを作れなかったという不思議な現象でした。
https://gitlab.com/gitlab-org/omnibus-gitlab/issues/3196

unicornはrailsで一般的なhttpサーバ用のミドルウェア的のようです。（gitlabがrails製と初めて知った。。）

#### 対処法
https://gitlab.com/gitlab-org/omnibus-gitlab/issues/3444#note_76084668
このissueの通り、コンテナ内`/etc/gitlab/gitlab.rb`の`unicorn['socket']`を独自の短いパスにして`gitlab-ctl reconfigure`したら無事にアクセスできるようになりました
※docker-compose.ymlで指定してコンテナ作り直してもOKです

<img width="954" alt="スクリーンショット 2020-02-21 1.51.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86185/19166528-ed3b-caa9-e2c7-c6bb37033c2e.png">
(最初はrootユーザのパスワード設定画面)


## 起きたこと２
その後ユーザ作成してログインし、プロジェクトを作成しようとしたところ、今度はプロジェクトの作成実行時に503エラーになってプロジェクトを作れませんでした。

<img width="699" alt="スクリーンショット 2020-02-21 1.43.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86185/316b369b-b407-1a9d-5203-271e2ba9223f.png">


#### 原因
今回も`gitlab-ctl tail`でエラーを見ていたら、今度はgitalyのソケットファイル名が長すぎるとな。

```bash
time="2020-01-25T15:36:17Z" level=fatal msg="load config" config_path=/var/opt/gitlab/gitaly/config.toml error="socket could not be created in /var/opt/gitlab/gitaly/internal_sockets: listen unix /var/opt/gitlab/gitaly/internal_sockets/test-53d27540.sock: bind: file name too long"
```

#### 対処法
gitla.rbの`gitaly['internal_socket_dir']`を適当に短く変えてまた`gitlab-ctl reconfigure`したらプロジェクト作れるようになりました。
エラーに記載のある`/var/opt/gitlab/gitaly/config.toml`を変えてもreconfigureしたときにgitlab.rb側が優先されるので意味ないみたいです。

<img width="1226" alt="スクリーンショット 2020-02-21 1.57.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86185/3ff41c25-a563-5030-2de7-c9463381dae0.png">

## 起きたこと３
作成したプロジェクトをcloneしようとしたら、ドメインが`gitlab.example.com`になっており、それではcloneができません。（何かが「起きた」訳ではない）
これは`docker-cimpose.yml`に記載した`external_url`が反映されている訳ですが、ホストOSの`/etc/hosts`にIPとドメインを書けば解決するはず、と思っていました。

#### 原因
どうやらdocker for macはホストOSからコンテナへのIPアドレスでのアクセスが不可能らしいです。
公式が「The docker (Linux) bridge network is not reachable from the macOS host.」って宣言してます。
https://docs.docker.com/docker-for-mac/networking/#known-limitations-use-cases-and-workarounds

#### 対処法
公式は不可能と言っているもののsock proxyをうまく使えば回避ができるようです。
https://github.com/docker/for-mac/issues/2670
ただ、貼ってあるdocker imageのパスが404になっていて、個人的に最優先ではなかったのでまだ試せていません。
この筋で調べると色々と出てくるので多分解決できるんだと思う。
ネットワーク周り知識不足で怖いので、複数のコンテナを同時に立ち上げて色々したくなったら検討します。

## 参考サイト
* https://obel.hatenablog.jp/entry/20161116/1479242090
 - 一番下に困ったときのエラーの見方が書いてあり、最初どうやって調べていいかもわからなかったので助かった。
SwiftUIでアニメーションが効かなくなるパターン

## 結論
いくつかパターンを試してみたところ、以下のような結果になることがわかりました。

「アニメーション対象のViewをAnyViewで型消去を行なった場合、
そのAnyViewインスタンスに対してなんらかのModifierを指定しない限りアニメーションが効かない。」


## 実装パターンと挙動の詳細

### 基本の実装

- 実装の全体はこんな感じです
- 以降はアニメーションの設定をしている箇所のみを抜粋します

```swift
struct ContentView: View {
    @State private var showsRectangle: Bool = false
    
    var body: some View {
        VStack {
            if showsRectangle {
                // ここから
                Rectangle()
                    .frame(width: 100, height: 100)
                    .transition(.opacity)
                // ここをフォーカス
            }
            
            Button(action: {
                withAnimation {
                    self.showsRectangle.toggle()
                }
            }) {
                Text("Button")
            }
        }
    }
}
```

### パターン1

- 通常のtransitionアニメーションを効かせる実装
- アニメーション対象のViewに関して、AnyViewによる型消去なし

```swift
// 型消去なし
Rectangle()
    .frame(width: 100, height: 100)
    .transition(.opacity)
```

アニメーションが効く :thumbsup:

<img width="200" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41486/8aff73c0-0ae9-f923-8421-b9c5a8aa408c.gif"/>

### パターン2

- transitionアニメーションを効かせたいViewを、AnyViewで型消去する実装
- この時、transition modifierは **AnyViewに対して実行** する

```swift
// 型消去
AnyView(
    Rectangle()
        .frame(width: 100, height: 100)
).transition(.opacity) // AnyViewに対してtransitionの指定
```

アニメーションが効く :thumbsup: 

<img width="200" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41486/902e0153-7287-c814-5b3b-f5acaefb74a5.gif"/>

### パターン3

- transitionアニメーションを効かせたいViewを、AnyViewで型消去する実装
- この時、transition modifierは **型消去される前のViewに対して実行** する

```swift
// 型消去
AnyView(
    Rectangle()
        .frame(width: 100, height: 100)
        .transition(.opacity) // 型消去前のViewに対してtransitionの指定
)
```

アニメーションが効かない :thumbsdown:

<img width="200" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41486/b8b94956-0f7e-bb97-ab93-62eb29463f8b.gif"/>

### パターン4

- transitionアニメーションを効かせたいViewを、AnyViewで型消去する実装
- この時、transition modifierは **型消去される前のViewに対して実行** する
- ただし、 **AnyViewに対してもなんらかのModifierの指定を行う**

```swift
// 型消去
AnyView(
    Rectangle()
        .frame(width: 100, height: 100)
        .transition(.opacity) // 型消去前のViewに対してtransitionの指定
).padding() // AnyViewになんらかのModifierを指定
```

アニメーションが効く :thinking:

<img width="200" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41486/4fc14edd-5ebd-1e07-c6e0-ff89336ae0b4.gif"/>
ほしゆきトゥーンシェーダーv0.7を公開しました!

# ほしゆきトゥーンシェーダーv0.7を公開しました!

![sc12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512142/f691b065-7879-56a1-848f-c24b46803a08.jpeg)


以前のアップデートから1年半…、沈黙を破り、令和初の、20年代の更新です！
(サボっていたことは秘密)

ほしゆきトゥーンシェーダーは、グローバルイルミネーションに特化しHDRレンダリングとの相性もよい、Unity向けトゥーンシェーダーアセットです。
そのv0.7の公開です!

なお、ほしゆきトゥーンシェーダー自体の解説は別の記事で近いうちに行う予定です。  
↓  
公開しました : https://qiita.com/Masterexa/items/f822a8b38589fb564d9d

#### ダウンロード

[https://github.com/Masterexa/HoshiyukiToonShader/releases](https://github.com/Masterexa/HoshiyukiToonShader/releases)


## 新機能

### 反射機能の追加

![sc13a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512142/89b121d1-aaa2-cf85-4b8f-3d486aabc92b.jpeg)

とうとうハイライトが付くようになりました。

物理ベースマテリアルでおなじみの[リフレクションプローブ][ref_ReflectionProbe]によってステージのセットアップを行い、面倒な手順を必要としません。またマテリアルも簡単に設定できます。

### オプション「オクルージョンをアルベドに適用」の追加

![sc14a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512142/6bae5fae-c826-0469-9878-a5cda50b4490.png)

細部の影を表現する[オクルージョンマップ][ref_OcclusionMap]を常に表示することができるようになりました。

これで光が当たってのっぺりした見た目になることがなくなります！


## 今後の方針

可能であればレンダリングパイプライン化や、ShaderGraphの対応、他エンジンへの移植とかもやりたい。


## お借りしたもの

- アリシア・ソリッドちゃん by 雨刻：[https://3d.nicovideo.jp/works/td32797](https://3d.nicovideo.jp/works/td32797)
- 書斎 by kemilia：[http://kemilia.ninja-web.net/](http://kemilia.ninja-web.net/)

[ref_ReflectionProbe]:https://docs.unity3d.com/ja/2018.4/Manual/class-ReflectionProbe.html
[ref_OcclusionMap]:https://docs.unity3d.com/ja/2018.4/Manual/StandardShaderMaterialParameterOcclusionMap.html
MetalShaderをPythonistaで遊ぶ

## 概要
[Pythonista](https://apps.apple.com/jp/app/pythonista-3/id1085978097)上でMetalShaderを動かすためのツールを書きました
https://github.com/watosar/MetalEditor
<img src="https://raw.githubusercontent.com/watosar/MetalEditor/images/1CE28F69-5F01-43C4-8F33-6AA880E2E345.jpeg" width="170px">


## 動機
ふとShaderの勉強がしたくなったのですがiPhoneではよい環境が見つかりませんでした
pythonistaでは元からGLSLは簡単に動かせるようになっていますが、非推奨になりましたし、折角なのでMetalShaderを動かせる様にしました


## 詳細
エディタ画面を透過してシェーダーの動作が後ろで見える様にPythonistaのUIに変更を加えるスクリプトです
キーボードを閉じると透過率が上がります
flagmentの引数でbuffer 0番にresolution、1番にtimeを設定してあります  
個人的に欲しかったのでtime変数を操作出来るシークバーを作りました
ファイル先頭のコメントブロックで各種設定を行えます
具体例はsampleShaderのファイルを参照してください


## 今後
今後の更新として以下のものを予定しています

- シェーダーのエラー表示
- スクリプト起動時のクラッシュ対策
- 文字背景色の設定  


## 宣伝
Discordでpythonistaファンコミュニティやってます
https://discord.gg/xa9kaF9
Bitrise Ship機能（Open Beta)でDeployを!

Bitriseから移動する必要なくアプリをテスターに​​送信するか、メタデータを編集して、One Clickで**Google Play**または**App Store**に直接デプロイできます。

 

本日から、Bitriseユーザー全員がBitrise Shipにアクセス、使用できるようになりました。これは、[Deploy to Bitrise](https://www.bitrise.io/integrations/steps/deploy-to-bitrise-io)ステップの進化であり、Bitriseに統合された本格的なモバイルアプリ開発プラットフォームをもたらす最初のステップです。

今年の初めにクローズドベータに参加した開発者の皆さまの助けがなければ達成できませんでした。大いに感謝します。ありがとうございます！

 
#On to the actual release:
本日リリースされたShipのバージョンでは、アプリの配布、バージョン履歴、すべての重要なメタデータを1か所で完全に制御できます。今後数か月にわたり、Shipを継続的に繰り返し改善て行く予定です。また、すでに大きなV2バージョンが計画されています。

Shipによるデプロイには、以前のバージョンの自動再署名や保存など、Deploy to Bitrise エクスペリエンスへ寄せられていた改善要求が含まれます。 Shipから簡単に、アプリのメタデータに編集、マーケティングコピーの追加、スクリーンショットを編集できます。 ShipはBitrise.ioの一部ですが、個別のUIを介してアクセスできるため、マーケティング担当者、製品マネージャー、その他の技術的な知識を持っていない方にも理想的な場所です(Bitrise上のアプリに彼らを追加次第）。

 

![ship_benefits.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567122/cfc1c7f7-926f-5502-2f59-bd4607aae248.jpeg)


 

Other **things you can do today** using Ship:

アプリの以前のビルドバージョンをすべて表示。
特定のビルドバージョンの詳細（説明、スクリーンショット、およびアプリのサイズやサポートされているデバイスタイプなどの最も重要なパラメーター）を表示および編集。
アプリのパブリックインストールページへのリンクを使用して、アプリをテスターに​​直接送信。
公開を設定したら、特定のビルドバージョンをApp Store ConnectやGoogle Play Consoleにデプロイ。
クロスプラットフォームアプリをビルドする場合は、[Version History]ページでプラットフォームの切り替え。
#Getting started with Ship
**Version1.9.0**以降の**Deploy to Bitrise.io**ステップを持つワークフローを実行すると、使い始めた時点でワークフローによって生成されたビルドに対してShipが自動的にプロビジョニングされます。 iOSビルドの場合、[Xcode Archive & Export for iOS](https://www.bitrise.io/integrations/steps/xcode-archive)ステップは**Version2.6.0**以降である必要があります。

ビルドページの[Ship Add-on]ボタンをクリックしてShipにアクセス:

![Screenshot 2019-11-13 at 16.23.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567122/8020bc20-3405-a820-bc84-f7bbe62c1633.png)

または、アプリページの[Add-ons]タブから[Go to Add-on]ボタンをクリック:
![Screenshot 2019-11-13 at 16.26.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567122/cdc26934-7e9f-8fc3-ce59-0ea8de077b18.png)

何を、どのように使用できるかをを詳しく知りたい場合は、[Ship guide in our Devcenter](https://devcenter.bitrise.io/jp/deploy/ship/)（日本語）をご覧ください。

 

#And now, we ship 🛳
Shipのリリースは、 [AppCenter](https://www.bitrise.io/integrations/steps?query=appcenter)や[Firebase App Distribution](https://www.bitrise.io/integrations/steps/firebase-app-distribution)のようなインテグレーションがなくなるわけではありません。Shipおよび同様にある今後のフィーチャーは、使用している多くのサービスやツールの一部に対する簡単で緊密に統合された代替手段として提供することを目的としていますが、[mobile DevOps](https://www.bitrise.io/mobile-devops)プロセスで使用するサービスにBitriseをいつでも接続することができます。

お気軽に[our discuss](https://discuss.bitrise.io/), [public Slack](https://chat.bitrise.io/), [Bitrise on Twitter](https://twitter.com/bitrise)にフィードバックや機能リクエストをご連絡ください。

 

Happy building! 🚀
ClickHouseにmysqlコマンドでアクセスする

ClickHosue v20.1.2.4(2020-01-22)でmysqlコマンドがクライアントとして使用できるようになっていたので使ってみます。

## 準備
mysqlコマンドを使用するには、設定ファイルにポート設定(`mysql_port`)を入れてやる必要があります。ここでは公式に従い`9004`ポートを使用することにします。設定を反映させるにはサーバの再起動が必要になります。

```xml:config.xml
<yandex>
  :
  <http_port>8123</http_port>
  <tcp_port>9000</tcp_port>
  <mysql_port>9004</mysql_port> <!-- このへんに追加 -->
  :
</yandex>
```

必要なのはこれだけです。

## 実行
使ってみます。Dockerの起動時にポートフォワード設定は入れてください。

```
$ mysql -h 127.0.0.1 -P 9004 -u default

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 20.1.2.4-ClickHouse

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW databases;

+---------+
| name    |
+---------+
| default |
| system  |
+---------+
2 rows in set (0.01 sec)
Read 2 rows, 239.00 B in 0.001 sec., 1743 rows/sec., 203.49 KiB/sec.
```

接続できました。何が嬉しいかと言われると、クライアントのDocker立ち上げなくてもいいとかその程度ですが、人に勧めるときちょっと叩いてみてもらうのにちょうどいいのかなとか思ったり。。。あと、mysqlクライアントベースのアプリ（あるのかは知らない）でも使えるようになったのかな。

`INSERT ~ FORMAT`とかClickHouse独自の構文には対応できていないようですが、まあ仕方ないかなと思います。`SELECT`はできるので、簡単に集計を試すのには使えると思います。
HTMLはまるでゴキブリの如く最強。

###まずはゴキブリのご紹介。

#####1.　Wikipediaに拠れば、個体数は推定14兆匹。
　　　人類の200倍だから、総体積、総体重では人類に劣るかも知れない。でも総身長はゴキブリが勝っている。
　　　もしも人類とゴキブリが全面戦争になったら、一人で200匹のゴキブリを相手にしなければならない。( *´艸｀)ﾏｼﾞﾑﾘ

#####2.　ライバルはネズミ、ニワトリ、コウヨウチョウ。
　　　他に人類より多いとされているのはネズミ（数千億？）、ニワトリ（280億？）、コウヨウチョウ（140億？）。
　　　コウヨウチョウはアフリカに生息するスズメの一種だとか。
　　　深海に住むオニハダカという魚は推定ウン百兆匹とも言われているらしい（上には上がいる...）が、地上でゴキブリに勝る生物はなさそう。

#####3.　1秒で体長の50倍を移動する。
　　　ゴキブリと言えばそのスピード。その初速を人間の体長に換算すると時速300kmだそう。（ボルトは45km/h）

#####4.　3億年の歴史を持つ。
　　　中国（4千年）よりもすごい。

###...そんなゴキブリとHTMLの共通点。

#####1.　単体では無力。
　　　ゴキブリは人類と雑菌、HTMLはCSSとJSの力を借りて勢力を拡大している。

#####2.　小学生でもやつけられる。
　　　ただし、個人差も大きい。伸るか反るかはその子次第。補助輪が取れて、ひらがなを覚えたら、次はHTMLかゴキブリ退治を。

#####3.　どこにでも住み着く。
　　　パプアの熱帯雨林にも、デトロイトの自動車整備工場にも（おそらく東京スカイツリーにも）いるゴキブリ。一方のHTMLは『ハイブリッドアプリ』が今まさにトレンド。

#####4.　身近な割に、関心が持たれていない。
　　　①ゴキブリは甲虫（クワガタやコガネムシの仲間）ではない。
　　　②ゴキブリは人の髪の毛も食べる。
　　　③日本最古の昆虫化石はゴキブリ（ちょっと悲しい）。
　　　④href=やid=の後ろに『"』（ダブルクォーテーション）は要らない。
　　　⑤liタグに閉じタグは要らない。
　　　⑥style=のベタ書きは可読性を殺す。

　　　これらの事実（？）は世間に全く浸透していない。逆に言えば、誰よりもHTML（またはゴキブリ）に詳しい奴に、今からでもなれる。
　
　　　...そんな『ゴキブリみたいな』HTMLを、
###取り敢えず始めてみよう。

```
<!doctype html>
aloha~~~
```
　　　1.　メモ張（ちょう）を開（ひら）いて↑をコピペ。
　　　2.　『.txt』ではなく『aloha.html』で保存（ほぞん）。
　　　3.　キッズスマホで書（か）いてみよう！
　　　４.　...１行目（ぎょうめ）がナンだかむずかしい？
##じゃあ2行目だけでいいよ。
Azure Data Factory Data FlowでMSI認証が利用可能になりました

#はじめに

以下の記事の続編にあたります
[Azure Data Factory が信頼されたサービスリストに登録されました。](https://qiita.com/ryoma-nagata/items/5d227cbebc8cbf6f3cbb)

ついにAzure Data Factory(以下、ADF)の Data FlowがMSI認証が利用できるようになりました。
https://azure.microsoft.com/en-us/updates/data-factory-adds-managed-identity-support-to-data-flows/

##Data FlowにおけるMSI認証
以前はDataFlowを利用してStorageに接続しようとすると下記のようにErrorが出ていたので、MSI認証での接続はCopyActivityやその他のData Flow以外での利用に限られていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/d7abb184-fe3c-69da-bb4d-29099281972e.png)


#今回の変更でできるようになったこと
キーを利用せずにIDベースの認証で、Storage,SQLなどのデータソースに対して、GUIで作成可能なSpark処理ETL機能である、DataFlowが利用可能になりました。
[DataFlow](https://docs.microsoft.com/ja-jp/azure/data-factory/concepts-data-flow-overview)
また信頼されたサービスとの組み合わせにより、ファイアウォールをかけたStorageに対しても同機能が利用できることになります。


#確認
Azure Data Lake Storage Gen2（以下、ADLS）でチェックします。
##手順
 - ADLSの設定
 - ADFのリンクドサービス設定
 - ADFのMapping Data Flowのチェック
 - 実行確認

##ADLSの設定
###IAM設定
ADFは既定でManaged IDが付与されるので、下記のようにADLSのBLOBデータ共同作成者ロールに割り当てができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/25bcae91-dc8d-95c1-312e-9f43deeb82db.png)

###FireWall
信頼されたサービスにはADFが入っていますので、上記のように権限付与されたADFに限りFiewWallをパススルーします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/e019029a-e750-b92d-306e-d49470cb4f7c.png)

##ADFのリンクドサービス設定
MSI認証できちんと接続テストできています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/71b7f742-b8d1-31b0-eaa9-bc994d1332c1.png)

##ADFのMapping Data Flowのチェック
適当なcsvファイルをADLSからADLSにコピーしてみます。

適当なcsvファイルのデータセット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/eb97d6b5-e574-cdc9-2784-6d89e4ba72d6.png)


以前まではエラーがでていましたが列情報が取得できており、接続できています！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/78d40c31-dcae-c76a-aa47-042257cb8220.png)


超単純なData Flowを実行してみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0339f204-50d0-6cc2-f4e3-509bb1ba459b.png)

##実行確認
成功！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5ee41358-401d-12c0-968a-b1d63aef382a.png)


一応内容をみます
※Sparkクラスタの立ち上げに4分くらいかかっています。処理時間に厳しい要求がある場合などは立ち上げ時間のオーバヘッドを考慮してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/dd4a2d71-a9d0-2346-29d4-028bfadfcbcc.png)

#おわりに
ストレージのFirewall設定がある場合DataFlowの利用ができなかったのでなかなか実用が難しい面のある機能でしたが、これで利用が進みますね
SwiftUIでもR.swiftを使いたい人のために

R.swiftはSwiftUIに直接対応していません。
ですが、extensionを生やすことで間接的に対応させることができそうです。

※随時更新していきます

# 2022/12/4更新
R.swift 7からSwiftUIに対応しました。
ただ未対応のものもあるため分けて記載し直しました。

# 7.0以降不要なもの
## String編
```swift:Rswift+SwiftUI.swift
extension Text {
    init(_ resource: StringResourceType) {
        self.init(.init(resource.key), tableName: resource.tableName, bundle: resource.bundle)
    }
}
```

```swift:ContentView.swift
Text(R.string.localizable.hoge)
```

## Image編

```swift:Rswift+SwiftUI.swift
extension Image {
    init(_ resource: ImageResourceType) {
        self.init(resource.name, bundle: resource.bundle)
    }
}
```

```swift:ContentView.swift
Image(R.image.ic_launcher)
```

# 7.2.0現在で未対応のもの
## NavigationBar編
```swift:Rswift+SwiftUI.swift
extension View {
    @available(OSX, unavailable)
    public func navigationBarTitle(_ resource: StringResourceType) -> some View {
        navigationBarTitle(Text(resource))
    }

    @available(OSX, unavailable)
    @available(tvOS, unavailable)
    @available(watchOS, unavailable)
    public func navigationBarTitle(_ resource: StringResourceType,
                                   displayMode: NavigationBarItem.TitleDisplayMode) -> some View {
        navigationBarTitle(Text(resource), displayMode: displayMode)
    }
}
```

```swift:ContentView.swift
VStack {
    ~
}
.navigationBarTitle(R.string.localizable.title, displayMode: .inline)
```
Cudaインストール

1.環境
Windows 10
Visual Studio 2017 (必須ではないかも)
Anaconda 3 (Python 3.7.4)

2.各種ソフトウェアのインストール
各パッケージのバージョンの対応は要注意
2020年1月31日現在、tensorflowのページには下記のように記載されている
https://www.tensorflow.org/install/gpu

Software requirements
The following NVIDIA® software must be installed on your system:

NVIDIA® GPU drivers —CUDA 10.1 requires 418.x or higher.
　※インストールしていたのは、ver.441.87
CUDA® Toolkit —TensorFlow supports CUDA 10.1 (TensorFlow >= 2.1.0)
　※https://developer.nvidia.com/cuda-toolkit-archive
CUPTI ships with the CUDA Toolkit.
　※CUDA Toolkitの中に入っている
cuDNN SDK (>= 7.6)
(Optional) TensorRT 6.0 to improve latency and throughput for inference on some models.

※Visual Studio Redistribution v14.0が必要(?)で、もともとVisual Studio 2017は入れていたが、念のためVisual Studio 2015,2017,2019のランタイムをインストール
　https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads

インストール後のPATHの設定
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\CUPTI\lib64
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include
C:\SoftTool\cuDNN\cuda\bin
※cudnn64_7.dllがあるフォルダを指す

3.Tensorflowのインストール

Pip package
See the pip install guide for available packages, systems requirements, and instructions. To pip install a TensorFlow package with GPU support, choose a stable or development package:

pip install tensorflow-gpu
※Tensorflowの“ver.1.14以下はCPUとGPUで分かれているが、1.15以降は一体”というように記載されているが、pip install tensorflowだけでは、pythonからgpuを認識できなかった。tensorflow-gpuと入力したらpythonから認識された。※上述の通りTensorflowのバージョンは2.1。

確認コマンド
参考
https://nigimitama.hatenablog.jp/entry/2018/12/24/022756
[Laravel] 外部キーを明示的に指定しなくても外部キーが設定される

## 環境
Laravel Framework 5.6.26
 
## 状況
参考書を見ながら作業しているのですが、
マイグレーションで作成したテーブルです。

```php:PersonRequest.php
    public function up()
    {
        //第一引数はテーブル名、第二引数ではクロージャでフィールドを設定している。
        Schema::create('boards', function (Blueprint $table) {
            $table->increments('id');//プライマリキー「id」の指定です。オートインクリメントを指定して設定
            $table->integer('person_id');//関連するpoepleテーブルのレコードIDを保管するため。関連するレコードは一つだから、peopleではなく単数形のpersonという名前にしておいた。
            $table->string('title');//タイトルとなるフィールドを用意
            $table->string('message');//メッセージとなるフィールドを用意
            $table->timestamps();//作成日時と更新日時であるcccreated_atとupdated_atフィールドは自動生成される。これら二つのフィールドはlarabelにより自動生成され、値の保存も自動で行ってくれる
        });
    }
```

```php:PersonRequest.php
    public function rules()
    {
        return [
            'age'=>'ageSizeLimit', //先ほど作った独自のルールを指定
        ];
    }

    public function messages()
    {
        return [
        'age.ageSizeLimit'=>'年齢は100歳までの値で入力してください',
        ];
    }
```

まあ上記のバリデーションならLaravelがあらかじめ用意してる『max:100』だけでも可能です。
この独自ルールを作る際、「validate」の後の最初の部分を小文字にしたものを使えるということは知っていた。
例) 「validateHello」なら、「hello」という名前でルールが使える。

なので、上記の「PersonValidator.java」での「validateAgeSizeLimit」
という名前なら「ageSizeLimit」という名前で使えると思って使ってみたら、
バリデーションエラーメッセージに「validation.age_size_limit」
となり、本当は「100以下の数値で入力してね」と表示したかったのだが、、、

<img width="266" alt="スクリーンショット 2019-07-11 17.44.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179803/31a4f800-ff15-d93f-f8dc-95b326bf45f3.png">


## 解決方法
ん？関数名がスネークケースになったものが表示されているな？
もしかしてキャメルケースではなくスネークケースにしなきゃいけないってことなのか？と名推理が働きました。

```java:PersonRequest.java
    public function messages()
    {
        return [
        'age.age_size_limit'=>'年齢は100歳までの値で入力してください'
        ];
    }
```

<img width="352" alt="スクリーンショット 2019-07-11 17.45.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179803/5524f596-355b-59af-badc-eb1809e5ea5b.png">

直った！！
正しい書き方をさりげなく出力してくれていたんですね。。。

##結論
オリジナルバリデータを作る際、ルール名となる関数名を使う場合は、
rules関数ではキャメルケースでよくて、messages関数ではスネークケースにする。
Gulpを使って画像のリサイズと圧縮の方法を学ぶ


#はじめに
###:point_up:なぜ画像をリサイズ、圧縮する必要があるのか?
・リサイズしてファイルサイズの軽量化
・圧縮することで「ページ読み込み速度」を速められるので、SEO的にも有利になる。


##インストール準備
開発環境：Mac(ターミナルを使用)

画像の操作を行うにはGulpだけではできないのでGraphicsMagickというソフトウェアをインストールします。

参考　[https://www.npmjs.com/]( https://www.npmjs.com/"")


![screencapture-npmjs-package-gulp-gm-2020-01-30-13_56_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451241/000382bc-60fe-d9ba-18dd-0128456474ef.png)


1.ターミナルでGraphicsMagickをインストール

```terminal:Taminal
brew install graphicsmagick
```

私の場合はこれだけだとcommand not foundとエラーになってしまったので、こちらのサイトを参考、無事にインストールできました。
[http://macappstore.org/graphicsmagick/]( http://macappstore.org/graphicsmagick/"")


2.モジュールをインストール
画像のサイズ変換
[gulp-image-resize]( https://www.npmjs.com/package/gulp-image-resize"")


画像の圧縮
[gulp-imagemin　]( https://github.com/gulpjs/gulp"")



```terminal:Taminal
yarn add gulp-image-resize gulp-imagemin --dev
```
3.モージュールのプラグインが増えると可読性が悪くなるので一括でロードしてくれるプラグインをインポートする



```terminal:Taminal
yarn add gulp-load-plugins --dev
```

4.gulp-load-pluginsをインストール、gulpfile.jpの内容を変更
＄の変数に格納してpipeのプロパティとして関数が使えるようになる。

```javascript:gulpfile.jp
const{src, dest} = require('gulp');
const loadPlugins = require('gulp-load-plugins');
const $ = loadPlugins();


function copyFiles(){
      return src('./src/*')
      .pipe($.rename({
      }))
      .pipe(dest('./dest'));
}

exports.copyFiles = copyFiles;
```
##画像サイズ変更と圧縮
1.変更する画像をデレクトリ内に用意してimages、iconのフォルダ作成

<img width="489" alt="スクリーンショット 2020-01-30 17.06.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451241/73a1ab85-58ad-392f-c92c-63da0a08b217.png">


2.gulpfile.jpの内容を変更
・分かりやすいように変数名をiconの名前に変える
・imageResize,imageminを指定

```javascript:gulpfile.jp
const{src, dest} = require('gulp');
const loadPlugins = require('gulp-load-plugins');
const $ = loadPlugins();


function icon(){
      return src('./favicon.JPG')
      .pipe($.imageResize({
        width: 100,
        height: 100,
        crop:true,//切りとる（縦横比が合わなくなる場合）
        upscale:false //拡大して画像をアップするか
      }))
　　　 .pipe($.imagemin({
      }))
      .pipe($.rename({
      }))
      .pipe(dest('./dist/images/icon'));
}

exports.icon = icon;
```

3.ターミナルで実行

```terminal:Taminal
　gulp icon
```
<img width="451" alt="スクリーンショット 2020-01-30 17.30.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451241/4e0bdbf8-1585-96a3-133f-8389e9717757.png">

完了した画面が表示されたらOK。

##最後に

無事に画像のサイズ変更と圧縮ができました。
次は、Google PageSpeed Insightsを使ってサイトページの表示速度を測定して改善してみようと思います:smiley:
CatalystのmacOS用アプリでウィンドウサイズを変更できないようにする

個人的なメモです。

Xcode 11.3.1
Swift 5
Catalystを使用したmacOS用アプリ開発でウィンドウサイズを変更できないようにしたかった。
下記のコードで実現。

 
```AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        //Window Size の固定
        UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.forEach { windowScene in
            windowScene.sizeRestrictions?.minimumSize = CGSize(width: 1000, height: 800)
            windowScene.sizeRestrictions?.maximumSize = CGSize(width: 1000, height: 800) 
          } 
        return true
    }
```

経緯としては、Catalystを使用してMac上でアプリを起動したところ

```
UIScreen.main.bounds.size
```
から期待通りのHeightとWidthを取得できなかったから。
【HTML】フォントの高さを取得する【JavaScript】

フォントの高さを取得する関数です。
measureTextHeight("24px メイリオ")のようにお使いください。指定フォントの高さをpx単位で返します。

"24px メイリオ"を渡すと36を返します。
"1em メイリオ"を渡すと24を返します。

```js
function measureTextHeight(font) {
    
    var div = document.createElement('div');
    div.innerHTML = 'M';
    div.style.margin = '0 !important';
    div.style.padding = '0 !important';
    div.style.position = 'absolute !important';
    div.style.left = '-99999px !important';
    div.style.font = font;
    document.body.appendChild(div);
    height = div.offsetHeight;
    document.body.removeChild(div);
    
    return height;
}
```
「プログラムはなぜ動くのか」を読んでみたので解釈と要点まとめ

# はじめに

「プログラムはなぜ動くのか」の第2版を読んでみたので自分なりの解釈と要点をまとめてみた。

# どんな本なのか

「プログラムを実行しているときにコンピュータの中はどう動いているのか」がざっくり分かる本である。（まんまですね）
自分はプログラミング歴1年くらいだが、そんな自分でもかなり分かりやすく書いてあるので難易度的にはそこまで高くはないと思われる。

# 覚えておきたいこと

## CPU、メモリ、ディスクの関係性について
**CPU**：プログラムを実行しているもの。実体はレジスタの集合体
**メモリ**：ディスクに保存されているプログラムを読み出す。
**ディスク**：プログラムの実体を保存しておく

レジスタとは処理対象となる命令やデータを格納する領域でメモリみたいなもの

メモリは1バイトずつに**アドレス**がついている。
CPUはこのアドレスを指定して、メモリに格納された命令やデータを読み出したり、書き込んだりしている。

## ソースコードがCPUで解釈されるようになるまで

アプリケーションを構築している**ソースコード**はOSによって**ネイティブコード**に変換(コンパイル)されてCPUで解釈される。
ソースコードとはCやJavaなどのプログラミング言語のこと
ネイティブコードとはCPUが理解できるコードのこと

CPUの種類によって対応するネイティブコードがある。
この辺の変換はOSがよしなに対応しているコードに変換してくれる

また、Javaの場合はコンパイルすると**バイトコード**と呼ばれるものに変換される。
バイトコードはJVMでネイティブコードに変換することができる。
なので対応するOSのJVMがあれば同じバイトコードをどの環境でも使うことができる。

また、ネイティブコードはソースコードに変換することはできない。
CPUにしか読めないネイティブコードを読みたいときは**アセンブリ言語**に変換する必要がある。
アセンブリ言語はネイティブコードと1対1に対応しており、人間でも読めるような記述で書かれている。

# 各章まとめ
## 1.プログラマにとってCPUとはなにか
CPUはレジスタ、制御装置、演算装置、クロックの4つの部品で構成されている。
ただ、プログラマが意識する必要があるのは**レジスタ**だけで良い。
それは、プログラムはレジスタを対象として記述されるからである。

CPUは様々な役割を持ったレジスタの集合体である。
その中の一つのプログラム・カウンタは、プログラムをメモリに保存したあと、そのメモリのアドレスを順に設定してプログラムの流れを決めている
アキュムレータは値の比較に使ったりしている。
いろんなレジスタを使ってプログラムを処理している

## 2.データを2進数でイメージしよう
コンピュータの内部を構成している**IC**はピン1本で2つの状態しか表せないのでコンピュータは情報を2進数で取り扱う。

2進数のシフト演算は桁を左にシフトすることで2倍、4倍、8倍...となっていく。（逆もしかり）

2進数はマイナスの値を**補数**で表す。
例えば−1を8桁の2進数であらわすと、
1は「00000001」なので、−1は「11111111」（繰り上げて「(1)00000000」にするイメージ）

## 3.コンピュータが小数点の計算を間違える理由
2進数は「0.5」、「0．25」、「0．125」、「0．0625」でしか小数点を表せない
整数で計算してあとで小数に変換してあげる。

## 4.四角いメモリーを丸く使う
データ型とはメモリを保有するサイズのこと。
例えばcharは1バイト、shortは2バイト、longは4バイト

メモリを効率的に使うには**配列**を利用する
配列の変形手法には様々なものがある
**スタック**はLIFO(Last In First Out)、**キュー**はFIFO(First In First Out)でメモリ内のデータを一時的に読み書きする。
スタックからデータを書き込む関数をPush、読み込む関数をPop
キューからデータを書き込む関数をEnQueue、読み込む関数をDeQueueという
他にも**リスト**や**二分探索木**などもある

## 5.メモリーとディスクの親密な関係
仮想記憶：ディスクの一部を仮想的にメモリとして使う。
ディスク・キャッシュ：メモリの領域にディスクからのデータを保存しておき、高速に読み出す。

メモリを節約するには、
・ DLLファイルで関数を共有する
・ スタックのクリーンアップ処理を関数の呼び出される側で行う(処理を少なくする)

ファイルはディスクの**クラスタ**と呼ばれるところに保存される
どんなにファイルサイズが小さくても1クラスタ分子容される。
1つのファイルを2クラスタに保存するみたいにまたぐことはできない

## 6.自分でデータを圧縮してみよう
ランレングス：文字×連続する文字数で表現して圧縮する
ハフマン：1文字1バイトではなく、ビットで表現して圧縮する

## 7.プログラムはどんな環境で動くのか
上の方に書いてある[「ソースコードがCPUで解釈されるようになるまで」](# ソースコードがCPUで解釈されるようになるまで)とほぼ同じ

## 8.ソース・ファイルから実行可能ファイルができるまで
EXEファイルの内容は、再配置情報、変数のグループ、関数のグループに分けられている。
ただし、プログラムがロードされたメモリ領域にはこれらの他に、スタックとヒープのグループが作られる。
スタック：ローカル変数や関数呼び出しの引数を格納するメモリ領域
ヒープ：プログラム実行時に任意のデータやオブジェクトを管理するためのメモリ領域
スタックのデータは自動でデータの格納と破棄(クリーンアップ)される
ただし、ヒープはプログラムで明示的に解放しないとメモリ・リークする

## 9.OSとアプリケーションの関係
**システムコール**とはプログラムでOSの機能を呼び出すこと。
timeやprintfなどがそうである。

アプリケーションはOSの操作、OSはメモリの操作を行う

## 10． アセンブリ言語からプログラムの本当の姿を知る
アセンブリ言語は3つのセグメントに分かれる
_TEXT：命令
_DATA：初期化されたデータ
_BSS：初期化されていないデータ

アセンブリ言語の構文は「オペコード＋オペランド」である
オペコード：命令の動作
オペランド：命令の対象

## 11.ハードウェアを制御する方法
I/Oコントローラ：周辺機器とコンピュータをつなげるIC。このICのメモリをポートと呼ぶ

## 12.コンピュータに「考え」させるためには
ハンズオンぽくコードを書いていく章だったため割愛
基本情報技術者　テクノロジ系　第8章 システム開発技術②



# プロセス中心設計とデータ中心設計

## プロセス中心設計
基本DFD作成して設計を進めます。

### 1,業務処理分析
DFD(データフローダイヤグラム)などを用いて
業務やシステムにおける格機能の関係を処理する。

### 2,機能分析
機能を分割し、詳細化していく

### 3,機能設計
各機能の仕様を定義する

### 4,プログラミング
仕様にしたがって実装する

### 5,テスト

## DFD(データフローダイヤグラム),コンテキストダイヤグラム
プロセス間のデータの流れに注目して
システムや業務を分析し、全体像を図式化する方法です。

最初に作成する、大雑把な形をコンテキストダイヤグラムといいます。


使用する、オブジェクトは以下のようにあります、

### ターミネータ(源泉/吸収)
データの発生源、行先

### プロセス
データに加える処理

### データフロー
データの流れ

### データストア
データの蓄積

## プロセスフロー図
処理の順序を表す流れ図です。

具体的な処理手順(アルゴリズム)は表現しません。

## データ中心設計, カプセル化
データベースへ登録したデータにアクセスするための処理を
標準プロセスとして用意します。

また標準プロセスを介してデータにアクセスする仕組みにすることを
カプセル化といいます、

### 1,データ分析
ER図などを用いてデータを洗い出す。

### 2,データベースの設計
データ分析の結果をもとにデータベースを設計する。

### 3,処理の分析
データベースに対して行う処理を洗い出す。

### 4,処理の設計
洗い出した処理内容を設計する、

### 5,プログラミング
データベース及び処理を実装する

### 6,テスト
テストを行う。
【C#】Xlsxで取り込んだ日付が表示と違う数字になっている

# 概要
- Excelに記載がある日付がEPPlusで読み取った時と別の値になっている

# 使用バージョン
- .netframwork 4.6.1
- EPPlus 4.5.3.3

# 実際のデータ
- 拡張子[xlsx]で以下の表記になっています。

 ![2020-01-30_23h48_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245167/61fe5a2f-4f64-5937-c739-58209a42b9c4.png)

- セルの内容は2020/2/20となっている。
- EPPlusで読み取ると「43881」

# 原因
- OLEオートメーション日付だったため

# わかった方法
- 「xlsx」は「Zip」形式のため、7zip等で解凍できる。
- 辿っていくと表記が以下のようになっていた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245167/e74a3a62-510a-dc3b-bf53-70a9cfd2e265.png)
- たしかに「43881」と記載がある。

# 対策
- [DateTime.FromOAData(double)](https://docs.microsoft.com/ja-jp/dotnet/api/system.datetime.fromoadate?view=netframework-4.8)をつかって変換することで「2020/02/20」と処理ができる。
エクセルマクロ(Excel VBA)でエクセルのデータを別のエクセルに転記する

エクセルファイルのセルの値を別のエクセルファイルのセルにコピーするマクロを組んだのでシェアします。
使いどころは多いのに意外とネット上にサンプルソースが無くて困るんですよね。
コピペしてすぐに使えます。後はファイル一覧を取得してループ処理を組めば立派なシステムになるはずです。
サンプルでは、D:\Document\hogehoge.xlsxのSheet1のA1セルをコピーし、D:\Document\piyopiyo.xlsxのSheet1のB2セルに貼り付けしています。

```vb
Sub Execute()
    ' コピー元ファイルのパス
    Dim SourceFilePath As String
    SourceFilePath = "D:\Document\piyopiyo.xlsx"

    ' コピー先ファイルのパス
    Dim DestinationFilePath As String
    DestinationFilePath = "D:\Document\hogehoge.xlsx"

    ' コピー元のファイルを開く
    OpenOrActiveWorkBook (SourceFilePath)

    ' コピー先のファイルを開く
    OpenOrActiveWorkBook (DestinationFilePath)

    ' コピー元セル.Copy コピー先セル
    Workbooks(PathToFileName(SourceFilePath)).Worksheets("Sheet1").Range("A1").Copy _
    Workbooks(PathToFileName(DestinationFilePath)).Worksheets("Sheet1").Range("B2")

    ' コピー元のブックを閉じる
    Workbooks(PathToFileName(SourceFilePath)).Close

End Sub
```

```vb
' ファイルパスからファイル名を抜き出す
Function PathToFileName(Path As String)
    Dim PathName As String, FileName As String, pos As Long
    pos = InStrRev(Path, "\")
    PathName = Left(Path, pos)
    FileName = Mid(Path, pos + 1)
    PathToFileName = FileName
End Function
```

OpenOrActiveWorkBook関数はこちらの記事を参照してください
[エクセルマクロ(Excel VBA)でExcelブックを開きアクティブにする](https://qiita.com/Aki_mintproject/items/db2177b226082af6923a)
【PHP】getimagesize()、シカトされたPDF。 ～GetImage画像男size～

# PDFがアップロードされない、、、

:poop:

**なんでや！**

画像のアップロードのシステムのバグを調査中。
画像のデータが上手くアップロードされない。
この手のバグは画像ファイルの格納場所の指定ミスが怪しいが問題なさそう。。。

よく確認するとサイズとかが入った画像データの配列の中身が、


:shipit: 「**false**やで」

```php:getImgData.php
$data = getimagesize(PDFの皆様);
echo $data; // false ＼(^o^)／
```


**getimagesize()**で画像データ取得に失敗していました。

取得しようとしていたのはデータの拡張子は.pdf。

**getimagesize()**では**PDFは読み込めないのです。**
(画像ではないからそうですよね)

PDFのデータは**file_get_contents**で取得しましょう:shipit:
Power AutomateでOneNoteの議事録をファイル化する~その２

#おさらいと今回の範囲
投稿はこちら→https://qiita.com/h-nagao/items/e3d590e0ea4992f14fb2

前回は処理の大まかな流れをご紹介しました。
今回は処理の前半、Approvalを利用して、出力するページを指定するところまでを紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/2c4a3108-4283-6835-8dc8-2d475d22b002.png)

# Automateの処理詳細

## 1.トリガー
ここは特に入力なしで進めます。ページタイトルを入力するようにしてもいいのですが、入力誤りを防ぐ目的と、Flow botとの対話で進めたいというのもあります。

## 2.Get Minutes
名前を変えてしまっているのですが、元のアクションは「Get pages for a specific section」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/41028b9b-7a53-2363-255c-e5e1735dd8c1.png)
ここでは議事録の入っているノートとセクションを指定します。
今回はTeamsに対応するSharePointサイトのOneNoteを指定しました。

## 3.Initialize Array
あとでApprovalでページのタイトルを選択して後続処理を実行させたいので、ここでは2.のステップでとれたページの一覧から、タイトルだけを抜き出すための配列を先に用意しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/6a8c32a2-c84e-6796-e8d4-40397ac4c085.png)

## 4. Apply to each
2.で取れた結果は複数のページを含む配列になっています。ここからタイトルだけを抜き出すので、自動的にApply to eachの繰り返し処理が発生します。「Append to array variable」の引数にPageのタイトルを指定するだけで、自動でAppy to eachになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/fa4a9896-901f-9647-2cc3-0fa179535f65.png)

これによって生成される配列は **["12/28議事録","1/29議事録"]** のような、単純な文字列配列です。配列操作のSelectでTitleだけを抽出としてみたのですが、それだとApprovalの選択肢(ドロップダウン)が構成できなかったので、あきらめて自前の配列にしました。

## 5.Create an Approval
今回「ひらめいた！」って思ったポイントがここです。（結構皆さん使っているようでした）
Flowには、上長や担当者の承認を要求するような目的で承認のアクションがあります。
ここではこの「承認者」を自分に設定することで、疑似対話的なFlowの実行を実現しています。

承認時にはYes/Noのほかに、カスタム選択肢から選択という種類も選べます。この選択肢に、OneNoteのページ一覧を入れることで、ファイル化する対象を選ばせることが可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/86c0b49e-fecc-6eb6-e378-f2a41909850d.png)

## 6.Wait for an Approval
つくったApprovalを待つアクションです。
Approval IDは前のステップで作成されたものを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/7807cfc0-20ab-511d-3ec9-85d0cda29eb7.png)

以上で前半部分、出力対象のページ指定が完成しました。

# 実際動かしてみる
動画でお見せできずすみません。
Flowを実行すると、下図のようにApprovalが届きます。その回答はドロップダウンになっていて、中にはページ一覧が表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/2fc1746a-a884-9e0e-09c3-da4abd1ce0c8.png)

また、ここで選択したページタイトルは、Wait for an approvalの結果（Outcome）として、取得できています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/5dc8f48c-7c38-b5c4-8c8e-e220fcaee490.png)

ここまでで、出力したいページの指定ができました。次回はいよいよ、ページのコンテンツ取得から、ゴリゴリっとHTMLにしていく処理を紹介します。

# 次回
ここにリンク追加します。
「ホールドアウト法」と「交差検証法」の違い 

間違いやすいポイントとして、「ホールドアウト法」と「交差検証法」の違いについてまとめてみる。

##ホールドアウト法、交差検証法とは
「ホールドアウト法」「交差検証法」はともに機械学習におけるデータのテスト方法の１つ。
それぞれの違いは以下の通り。

|種別|内容|
|:-----|:------|
|ホールドアウト法|機械学習におけるデータのテスト方法の1種。教師データ（訓練データ）を「学習用」「評価用」に7対3などに割合で2分割して、学習済みモデルの精度を測定する方法|
|交差検証法|教師データ（訓練データ）を3分割以上して、学習済みモデルの精度を測定する方法|

[学習参考:【機械学習入門】アルゴリズム＆プログラミング](https://algorithm.joho.info/machine-learning/tutorial-ml/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357717/fa534812-2f51-e961-73b5-57c22e404540.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357717/a6af47ec-06b0-9ebc-86a5-5e585352e22b.png)

次は、次元削減の目的で共通している自己符号化器（オートエンコーダ）と主成分分析との関係をまとめたいですね。
[(参考)自己符号化器（オートエンコーダ）と主成分分析との関係]
(https://www.hellocybernetics.tech/entry/2016/11/21/041607#主成分分析の復習)

それと、紛らわしい最適化手法の違いも。

[(参考)CNNの学習に最高の性能を示す最適化手法はどれか](https://www.iandprogram.net/entry/2016/02/11/181322)

[(参考)Optimizer : 深層学習における勾配法について](https://qiita.com/tokkuman/items/1944c00415d129ca0ee9)
クラスについて

早く記事に書かないと忘れてしまいそうなので、殴るように書きました。

```ruby

class User
  def initialize
    puts 'initializeメソッドが呼び出されました'
  end
end
User.new
# => 'initializeメソッドが呼び出されました'

```
initializeメソッドは、**クラスからオブジェクトを作成した瞬間**に呼ばれるメソッド。
この場合、Userクラスから、newメソッドを使って、オブジェクトを作成した。
initialize(country,greet)という風に、引数を付けることもできる。

## attr_accessorメソッド
インスタンス変数の値を、**読み書き両方**できるようにしてあげるメソッド。

- attr_readerで、**読み込むだけ**
- attr_writerで、**書き込むだけ**
- attr_accessorで、**読み書き両方できるようにする**

読みがゲッターで、書きがセッター。 **GET（読む）** と　**SET（書く）**で勝手に覚えました。

```ruby
class User
   
    attr_accessor :name

    def initialize(name)
        @name = name
    end

end

user = User.new('jim')
#@nameを変更する
user.name = 'boby'

user.name # =>boby
```
##解説

```ruby
attr_accessor :name
```
で、```@name```を読み書きできるように設定した。

```ruby
user = User.new('jim')
```
で、Userクラスから、userオブジェクトを作成した。（jimという値を隠し持っている)



流れ的には、
1. Userクラスを作成する
2. Userクラスから、userというオブジェクトを作成する。（userには、jimというメッセージが送られている状態。)
3. その瞬間、initializeメソッドが呼び出され、(name)の部分に、「jim」という値が渡される
4. ```@name```に、「jim」という値を代入する
5. userオブジェクトのnameを「boby」に書き換える。
6. user.nameで、userオブジェクトのnameを呼び出す。

##疑問

```@name = name``` で、```@name``` に、nameを代入したのに、なぜ、user.nameで呼び出すのか??
→```@name```は、インスタンス変数なので、クラスの外では呼び出せないから。

普通の人がつまづかない変なとこでつまづいてる感があります（泣）
文系が計算捨てて3割から2019年ITパスポートに受かった話


使用教材
・初めの方の演習用
全問解答付　ITパスポート　一問一答問題集（途中から有料になるアプリ）

https://00m.in/Ik6ut


・最初の実力チェック、6割超えてからのメイン演習
ITパスポート過去問道場
（サイトにシラバス4.0の内容もあるためテキストにない人は要チェック）
IPA公式の擬似体験ソフトウェアの過去問（実際と操作が同じなので必須）
https://www3.jitec.ipa.go.jp/JitesCbt/html/guidance/trial_examapp.html

・メインテキスト
https://www.amazon.co.jp/平成31-01年-イメージ-クレバー方式でよくわかる-栢木先生のITパスポート教室/dp/4297101815（キタミとお好みで)

YouTube ITパスポート講座（ささら先生)

どちらもお世話になりました。

※どちらにもシラバス4.0の内容がなかった場合必ず過去問道場のシラバス4.0チェックしてください
めちゃめちゃでます


以下体験談

・どんな状態？
パソコンの仕組みしらんし文系だから計算わからないし終わった…解いたら過去問3割とかワロタ絶対受からんでしょwww

・どうやって受かった？
1ヶ月勉強
隙間時間でスマホで勉強してた
家で勉強したくない！というモチベで動いていた

・計算がとても苦手なのをカバー
なしで7割超えるまでとにかく隙間時間は勉強。
ただ、隙間時間頑張ったご褒美にうちに帰ったら一切やらないでひたすらゲームするというメリハリをつけた。

点数変遷
3割〜4割
体感的には隙間時間にITパスポート過去問道場をやろうとしたが難しく感じるレベル
それまではITパスポートのアプリ（道場と比べて易し目の問題が多い)をひたすら回してた
暗記系や、計算要らない系を先に覚えて好きなものからしてくスタイル（メンタルに負担かけないため）

6割超える
体感的には道場の問題がわかってきたか…？ってなるレベル
少し苦手な問題もトライして覚えた
こっから急に分かるようになって楽しかった

1ヶ月くらいで7割後半（計算問題抜き機能使用)
体感的にはこのころになると合格を確信し始めた
ただ、過去問が実際の問題より易しい（受験した時も実際にそうおもった）と聞いてたので多めに取れるように心がけた。
ちょっとペース落として隙間時間にちょこちょこ過去問道場して思い出してく感じ。
IPAの公式の過去問で実際やる形式でやるのを回して何点取れるかチェックしながら進めていた。

(ちなみに実際の受験も7割後半で合格してます
計算も解いたかもしれないけど正解してるかは不明)

・受験前の自分に今言いたいこと
怖がらずとりあえず一回ググって過去問道場回して何点取れるかみてみようよ
3〜4割からスタートする人→アプリ使用
その他の人→YouTubeのささら先生の動画で理解➕過去問道場で演習
不安ならテキスト見て理解するといいかも。
計算苦手？大丈夫まじで捨てても受かるから他の分野頑張ろう！
怖がらず1ヶ月だけの気持ちでやってみたら案外できるかもしれない、トライあるのみ

3割からでも受かるんだとか、計算苦手でも受かるんだな…と一人でもいいから思ってくれたらとても嬉しいです

蛇足
・お金を削って受験したかったら（自分はしてないので可能性としてだけ）
自分はテキストとして柏木先生のITパスポート教室を使っていたけどささら先生の動画の内容とほぼ被ってるからいらなかったかも…という感想。もしも削りたければいけるかもしれない？？
また、アプリは易し目の問題が多いので過去問道場が解ける人なら不要だと感じた。
Deploy戦略

マイクロサービスが主流になってきている今の時Deploy戦略をおさらいしておきたくて調べてまとめます。

今回は代表的なDeploy戦略としてRolling、Blue/Green、Canaryについて書きます。

## Rolling
Rolling Deployは１つずつ旧バージョンを新バージョンへ交換していく戦略！
サービス中のサーバー１台を除き、そのサーバー以外に新しいサーバーを追加すます。
その間旧バージョンから新しいバージョンへトラフィックを移していきます。この戦略はサーバー数に制約がある場合有効だが、Deploy中にはインスタンス数が減るのでサーバー処理要領を考慮する必要があります。


## Blue/Green
Blue/Green Deployentは旧バージョンから新バージョンへ一気に変換する戦略！
旧バージョンと新バージョンのサーバーを同時に並列で構成し、deploy時点になるとトラフィックを新バージョンへ向けます。一つのバージョンのみ本番になるのでバージョン管理問題を防げるのと、早いロールバックが可能となりメリットがあります。また他のメリットとしては運用環境に影響を与えずに実際のサービス環境で新バージョンのテストが可能になります。でもサーバーの台数が倍になるのでコストがかかるのと、新環境へのテストが必要になるのでテストに必要な時間も増えるデメリットがあります。

## Canary
'Canary（カナリア）'の用語の語源を知ることで理解しやすいです。カナリアという鳥は体に悪いガスなどに敏感で、過去鉱山の労働者はこのカナリアを隣に置いてカナリアの具合が悪くなることで危機を検知し退避したと言われています。

カナリアデプロイは危機を早く検知するデプロイ戦略！
旧バージョンの新バージョンのサーバーを構成し、一部のトラフィックを新バージョンへ分散しエラーを検知します。この方法ではA/Bテストも可能で、エラー率や性能のもイーターにも有用です。分散後結果によって新バージョンの運用環境を変えれるし、また旧バージョンへ戻すことも可能です。