OmniAICreator/Qiita-1.07M huggingface dataset:
【memo】MySQL操作コマンド 

# 起動・停止
## MySQLの起動
```
brew services start mysql
```
## ログイン
ユーザー`root`としてログイン

```
mysql --user=root --password
```
入力後、`Enter password:`と表示されるので、パスワードを入力しログイン。
ターミナルでは`mysql>`と表示される。
## ログアウト 
```
exit;
```
`Bye`と表示され、ログアウト完了。

# データベースの操作
ログイン後の操作。
## データベース一覧表示
```
SHOW databases;
```
## データベース作成
`database1`というデータベースを作成。

```
CREATE DATABASE database1;
```

## データベース削除
`database1`というデータベースを削除。

```
DROP DATABASE database1;
```

## データベース選択
`database1`というデータベースを選択。

```
USE datacase1;
```
`Database changed`と表示され、データベースの選択が完了。

## データベース内のテーブル一覧表示
```
SHOW tables;
```

テーブルが存在しない場合、`Empty set (0.00 sec)`と表示される。

## テーブルの作成
`table1`というテーブルを作成。

```
CREATE TABLE table1 ([カラム名1] [データ型] [オプション], [カラム名2] [データ型] [オプション],... , PRIMARY KEY (プライマリーキーとするカラム名));
```
ここでは`CREATE TABLE table1 (id INT AUTO_INCREMENT, name TEXT, PRIMARY KEY (id));`と設定。

##　テーブル構造の表示
```
DESCRIBE table1;
```
備忘：JSONPでサーバへアクセス時に、タイムアウト検知する

# 備忘です

# わたしの使用用途

（追記）
フロントエンドのHTML,JS等を適当なホスティングサービスにおいて、GAS（Google App Script）からJSONでデータをもらいたい。（ドメインを揃えれば良いじゃない、という指摘は我慢してください）

# 特徴

JSON **P** のためドメインの違うサイトからデータを取得できます。

- タイムアウト検知処理
 - 一定時間、サーバから応答が無い場合を検知できる

# コード



```javascript

// JSONPでアクセスする関数
function accessByJSONP(url, errfunc) {
    var key = createUniqueStr();
    console.log(" key created by AccessSuccessCheckList [" + key + "]");

    var script = document.createElement("script");
    script.src = url + "&key=" + key; //一意となるkeyを勝手に追加
    document.head.appendChild(script);

    AccessSuccessCheckList[key] = url;

    script.onerror = function (e) {
        console.log(" Error on accessByJSONP");
        errfunc();
    };
    //呼び出しタイムアウトした場合の処理
    window.setTimeout(function (e) {
        if (accessSuccessCheck(key)) {
            console.log(" access Timeout key is cleared. " + key);
        }
        else {
            console.log(" Err access Timeout key [" + key + "]");
            var url_1 = accessSuccessURL(key);
            console.log(" URL " + url_1);
            //errfunc();
        }
    }, 30000); //タイムアウト待ち３０秒

    //↓関数である必要はない。。。
    function accessSuccessURL(key) {
        return AccessSuccessCheckList[key];
    }
    function accessSuccessCheck(key) {
        if (AccessSuccessCheckList[key]) {
            return false;
        }
        else {
            return true;
        }
    }
    function createUniqueStr(myStrong) {
        //let strong = 1000;//copy元
        var strong = 100;
        if (myStrong)
            strong = myStrong;
        return ("k" + new Date().getTime().toString(16) +
            Math.floor(strong * Math.random()).toString(16));
    }
}

```

グローバル変数で、タイムアウト待ちリストを保持

```javascript
// JSONPでアクセス中のリスト
// レスポンスタイムアウトをチェックする
var AccessSuccessCheckList = {};
```


コールバック関数で、タイムアウト待ちを解除する

```javascript
// keyはcallbackとしてサーバから返してもらうこと
function callback(data, key) {
    AccessSuccessCheckList[key] = null;
}
```


# github

https://github.com/sktn3/accessByJSONP
LINQ All() の挙動について

LINQにはラムダで条件式を渡し、要素全てがその条件を満たしているかを判定してboolを返す、
`All()`という便利なメソッドがあります。

```csharp
List<int> list1 = new List<int> { 1, 2, 3 };

if (list1.All(n => n > 0)) // ← 要素が全て0より大きいのでtrue
{
    Console.WriteLine("正の整数です");
}

// 出力: 正の整数です
```

空のリストに対してこのメソッドを実行すると、直感とは異なる挙動になります。
（「全てが満たす」だからfalseになると思っていた）

```csharp
List<int> list2 = new List<int>();

if (list2.All(n => n > 0)) // ← true
{
    Console.WriteLine("正の整数です");
}

// 出力: 正の整数です
```


`All()`の実装を見てみると、リストの要素が空の場合は必ずtrueが返るようになっていました。
`Any()`等を組み合わせて判定するのが安全そうです。

```csharp
// https://github.com/microsoft/referencesource/blob/master/System.Core/System/Linq/Enumerable.cs#L1305

public static bool All<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
    if (source == null) throw Error.ArgumentNull("source");
    if (predicate == null) throw Error.ArgumentNull("predicate");
    foreach (TSource element in source) { // ← sourceの要素が0なのでループが回らない
        if (!predicate(element)) return false;
    }
    return true; // ← ので、必ずtrueが返る
}
```



```csharp
List<int> list2 = new List<int>();

if (list2.Any() && list2.All(n => n > 0)) // ← false
{
    Console.WriteLine("正の整数です");
}
```
macでpermission deniedが出た時、ファイルの権限を一括変換する方法。

#結論（コマンドの打ち間違い注意！）

```
find /絶対パスで指定 -type f -exec chmod 三桁の数字 {} +
```

#原因
調べてみるとアクセス拒否とのことで、権限がないからその行為は出来ないようになっているとのこと。


#解決策
権限を渡す。簡単。

ターミナルでエラーが出ている階層まで行き、下記のコマンドを入力すると英語と数字がいっぱい出てくる。

```
$ls -la
drwxr-xr-x  10 tada tada    320  6  7 00:00 app
```

左から順番に、

| 表示 | 意味 |
|:--|:--|
| d | ファイルタイプ |
| rwxr-xr-x | パーミッション |
| 10 | ハードリンクの数 |
| tada | ファイルの所有者（オーナー名） |
| tada | ファイルの所属グループ名 |
| 320 | サイズ |
| 6　7　00:00 | タイムスタンプ |
| app | ファイル名 |

エラー名にも出ていたパーミッションが出てきた。
謎の英語の羅列を少し調べてみる。

アルファベットの意味は、

| 表示 | 意味 |
|:--|:--|
| r | 読み込み可能 |
| w | 書き込み可能 |
| x | 実行可能 |
| - | 不可 |

羅列の意味は、順番が重要とのことでアルファベットを三つずつ管理をしている。
左からオーナー(u)、グループ(g)、その他のユーザー(o)。
今回の場合は、
1.　オーナーは　読み書き実行可能
2.　グループは　書き込みと実行可能
3.　その他ユーザーは　書き込みと実行可能

今回はその他ユーザーが書き込みできなかったので、書き込みの権限を渡せばいいのだなと推定。
コマンドを調べてみると、

```
$ chmod o+w app
```

または、

```
$ chmod 775 app
```

ただ、このコードではそのディレクトリのみ権限を変更しかしてくれないので、
今回はapp配下のファイルを一括で変更したい。

```
find /絶対パスで指定 -type f -exec chmod 三桁の数字 {} +
```

これで指定の配下のファイルが一括で権限の変更がされていると思います。
数字の打ち間違いは本当に注意が必要ですね。




結論
権限周りは上司に確認を取りながら進めよう。
PowerShellでls -lRみたいなことしない

#Get-ChildItem

結論から言うと以下のコマンドで解決

```
Get-ChildItem -Recurse
```

## 解説

Get-ChildItemはファイルの一覧を表示するコマンドで
Linuxコマンドの「ls」と類似したことができます。

オプションの「-Recurse」は、子ディレクトリの中も表示します。
「ls」の「-lR」的な存在ですね。


### 蛇足

因みにMS-DOSでこれをやろうとすると以下のようなコマンドで実現できます。

```
dir /s/d/a:-d
```

Windows7以降から標準搭載されているPowerShellのがコマンドの意味が分かりやすく好みですね。
正直ここは賛否両論あるかと思いますので使いやすい方をどうぞ。
Microsoft Power Automateを使ってOutlookのスケジュールで入力した内容をGoogleカレンダーに反映させる。


#手順

Microsoft Power Automateのタブにある、テンプレートを開く

![スクリーンショット 2020-06-29 8.53.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641577/0a7798d7-8ff9-7948-1b05-811d1776048d.png)

テンプレートを開くと、Microsoftが作成したフローがたくさん出てきますが、
その中の「上司からメールを受信したら通知を受け取る」を選択。




![スクリーンショット 2020-06-29 11.01.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641577/945d56b2-8a25-264e-01ef-c58f620e7cf0.png)

↑赤枠「上司からメールを受信したら通知を受け取る」をクリック



![スクリーンショット 2020-06-29 9.04.59.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641577/d5ee082f-086f-3090-1047-e91bbbc195c7.jpeg)

↑フロー作成を選択

これで完了です。

セットでNotification（通知）が入っていますが、
管理画面にて、接続の編集から削除することが可能です。

###注意点

今回の設定は、OutlookからGoogleカレンダーに予定を一方的に同期するものなので、相互でやり取りする場合はフローを追加する必要があります。



#最後に
僕はOutlookを社用Googleを私用と分けていたのですが、相互でやり取りする設定をしてしまい、私用が筒抜けになることが発生した経験がありますので、その点だけご注意ください。


他にも、経営分析に役立つフローや、Trello、ツイッターのようなタスク管理やSNS等幅広い用途で作成できるので、時間があるときにいろいろと触ってみようかと思ってます。
私なりに変数を解釈した話

およそ2年前からRPAのロボット作成に携わっております。
会社の各部門から、業務理解の深いメンバーを1人ずつ収集し、精鋭部隊を作りましたが、
ほとんどのスタッフが、開発経験が無いため、一からの出発でした。

##RPAプロジェクトメンバーに「変数」を説明したい
RPAツールを使ってロボット作成をする上で、1番最初に苦労した点が「変数」の理解でした。
私なりに、まずはイメージで理解できるよう、考えていた例を紹介させていただきます。
あくまでイメージなので、細かいところは説明できておりませんし、厳密には違うという点があるかと思いますが、ご容赦ください。

**1.箱**
こちらは最もスタンダードな説明方法だと思います。
今回は段ボールの箱と発泡スチロール製の箱と仮定して、説明してみました。

農家さんが、りんごとみかんとぶどうを作っており、出荷作業のために段ボールの空箱を1つ用意した。
この箱にりんごを入れようと、みかんを入れようと、これは農家さん次第。
ちょっとりんごの見た目が良くないから、やっぱりぶどうにしようというのでも問題なし。
なぜなら、段ボールに入るから。

しかし、ここに漁師さんがやってきて、箱が足りないから、これをくれと言われても、
段ボールでは水への耐性がないので、難しい…発泡スチロール製の空箱が必要になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568493/9319e5aa-eb5d-d3b2-d49d-b6d03849e4bb.png)


これでいう空箱が「変数」です。
段ボール箱であったり、発泡スチロール製の箱であったりしますが、入れ物としては同じです。
梱包されるものに合わせて箱の素材を選ぶ点が変数の「型」にあたります。

**2.数学の公式**
こちらはよく使いました。時間をかけずに説明できます。

学生時代、「y=ax」という公式を習ったことがあると思うが、
この「a」の部分に、数字を入れると計算ができるという、便利な表現方法である。

この「a」にあたる部分が、いわゆる「変数」であり、
そして、数字が入ってくるという認識自体が型である。
まさか「a」に「あ」という文字が入ってくるとは思っていない。
※色々と細かい部分はすべて省略いたします…

**3.たいやきとたこ焼き**
変数の「型」について話したいときは、よくこの例を用いました。
ロボット作成においても、「型」を理解しておくと◎です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568493/5cc674c1-ee65-4904-df89-41104bb5a9aa.png)

M君は、たこ焼き屋さんを開店しようと思い、たこ焼きプレートをア〇ゾンで購入した。
5年の修行を経て、ようやく開店できることになり、プレートの到着を心待ちにしていた。

しかし、到着したプレートは、なんとたい焼きの形をしていた。
「このままでは、開店できない…」
M君は急ぎドン・〇ホーテでたこ焼きプレートを購入し、無事開店した。

ここでの着目ポイントは、
M君は丸形のたこ焼きを作りたいのに、たい焼きの形になってしまうこと、
つまり「型」が間違っていた、ということです。
最初に出来上がる形を想定して用意することが大事になってくると思います。


##おわりに
私自身、変数の理解に苦しむ時期がありました。
少しでも誰かのお役に立てればと思います。
最後までご覧いただき、ありがとうございました。
GCP アップデート (6/19-6/25 2020)

### Functions: [Jun 19, 2020](https://cloud.google.com/functions/docs/release-notes#June_19_2020)
- australia-southeast1とnorthamerica-northeast1でFunctionsが使えるようになったよ！

### DLP: [Jun 19, 2020](https://cloud.google.com/release-notes#June_19_2020)
- DLPの処理をするロケーションを設定できるようになったよ！
  - 指定できるリージョンは[ここ](https://cloud.google.com/dlp/docs/locations#regions)(東京、大阪はありますね:)

### Compute: [Jun 22, 2020](https://cloud.google.com/compute/docs/release-notes#June_22_2020)
- N2Dがeurope-west1の全3ゾーンで使えるようになったよ！

### Build: [Jun 22, 2020](https://cloud.google.com/cloud-build/release-notes#June_22_2020)
- 変数の置換が、他の置換された変数を参照できるようになったよ！
  - 詳細は[ここ](http://cloud.google.com/cloud-build/docs/configuring-builds/use-bash-and-bindings-in-substitutions)

### KMS: [Jun 22, 2020](https://cloud.google.com/kms/docs/release-notes#June_22_2020)
- [Thales](https://thalesdocs.com/dpod/services/key_management_services/ekms/ekms_setup_guide/)でホスティングされた鍵がEKM(External Key Manager)で対応したよ！

### IAM: [Jun 22, 2020](https://cloud.google.com/iam/docs/release-notes#June_22_2020)
- IAM APIでJWTやバイナリblobをサイニングする機能がdeprecatedになったよ！
  - IAM APIやクライアントライブラリを利用している場合は7/1/2021までに[Service Account Credentials API](https://cloud.google.com/iam/docs/migrating-to-credentials-api)へ移行してね。
  - 上記同様、gcloudコマンド利用している場合も7/1/2021までに[ここ](https://cloud.google.com/iam/docs/migrating-to-credentials-api#gcloud)を参照。

### AI Platform: [Jun 23, 2020](https://cloud.google.com/ai-platform/deep-learning-vm/docs/release-notes#June_23_2020)
- M50リリース！
  - 内容は複数のバグフィックス。

### Billing: [Jun 23, 2020](https://cloud.google.com/billing/docs/release-notes#June_23_2020)
- コミテッドユースディスカウントがCloud SQLでも使えるようになったよ！
  - 割引率が高いので、Cloud SQLを1年以上使う場合はお得になる！

### Anthos Service Mesh: [Jun 22, 2020](https://cloud.google.com/service-mesh/docs/release-notes#June_22_2020)
- 1.5.6-asm.0 and 1.4.10.asm.2リリース！
  - OSS Istio 1.5.6のクリティカルではない、マイナーな改善がバックポートされたよ。詳細は[ここ](https://istio.io/latest/news/releases/1.5.x/announcing-1.5.6/)

### Dataproc: [Jun 24, 2020](https://cloud.google.com/dataproc/docs/release-notes#June_24_2020)
- 新しいサブマイナバージョンリリースのお知らせ
  - 1.2.100-debian9, 1.3.60-debian9, 1.4.31-debian9, 1.3.60-debian10, 1.4.31-debian10, 1.5.6-debian10, 1.3.60-ubuntu18, 1.4.31-ubuntu18, 1.5.6-ubuntu18, preview 2.0.0-RC2-debian10, and preview 2.0.0-RC2-ubuntu18
- Image 2.0プレビュー
  - [SPARK-22404](https://issues.apache.org/jira/browse/SPARK-22404)対応
  - R3.6にアップデート
- Image 1.5
  - R3.6にアップデート
- クォータ確認のバグ修正
  - リクエストの数が2乗されてたらしい。。

### Composer: [Jun 24, 2020](https://cloud.google.com/release-notes#June_24_2020)
- 新しいバージョンのお知らせ！
  - composer-1.10.5-airflow-1.10.2, composer-1.10.5-airflow-1.10.3, composer-1.10.5-airflow-1.10.6
  - デフォルトがcomposer-1.10.5-airflow-1.10.3に。
- ComposerがKubernetes v1 APIを使うようになってGKE1.16コンパチになったよ。
- haproxyの更新で最大2000コネクション使えて、LBがコネクション数でロードバランスするようになったよ。変更は環境変数で。
- その他改善と修正が複数。

### 


### ディスクレーマ
- アップデートの内容はあくまでも個人の理解していることを書いています。正しい内容はリリースノート等を確認下さい。
- リリース内容できるだけ拾うようにしているのですが、抜けていそうなリリースノートが追加するのでぜひ教えて下さい！(一覧[ここ](https://qiita.com/kenzkenz/items/ac18a359b803dbb6b490)で更新してます。)
Redash v8 から v9 (beta) にバージョンアップ


Redash v9 (beta) がリリースされた。v8からのバージョンアップ手順についてメモ。
[Release v9.0.0-beta · getredash/redash](https://github.com/getredash/redash/releases/tag/v9.0.0-beta)

```sh
$ cd /opt/redash
$ docker-compose stop
$ cat docker-compose.yml
version: "2"
x-redash-service: &redash-service
  image: redash/redash:8.0.0.b32245
  depends_on:
    - postgres
    - redis
  env_file: /opt/redash/env
  restart: always
services:
  server:
    <<: *redash-service
    command: server
    ports:
      - "5000:5000"
    environment:
      REDASH_WEB_WORKERS: 4
  scheduler:
    <<: *redash-service
    command: scheduler
    environment:
      QUEUES: "celery"
      WORKERS_COUNT: 1
  scheduled_worker:
    <<: *redash-service
    command: worker
    environment:
      QUEUES: "scheduled_queries,schemas"
      WORKERS_COUNT: 1
  adhoc_worker:
    <<: *redash-service
    command: worker
    environment:
      QUEUES: "queries"
      WORKERS_COUNT: 2
  redis:
    image: redis:5.0-alpine
    restart: always
  postgres:
    image: postgres:9.6-alpine
    env_file: /opt/redash/env
    volumes:
      - /opt/redash/postgres-data:/var/lib/postgresql/data
    restart: always
  nginx:
    image: redash/nginx:latest
    ports:
      - "80:80"
    depends_on:
      - server
    links:
      - server:redash
    restart: always

# services/scheduler の environment を削除
# services 配下に worker を追加
$ vi docker-compose.yml

$ cat docker-compose.yml
version: '2'
x-redash-service: &redash-service
  image: redash/redash:9.0.0-beta.b42121
  depends_on:
    - postgres
    - redis
  env_file: /opt/redash/env
  restart: always
services:
  worker:
    <<: *redash-service
    command: worker
    environment:
      QUEUES: "periodic emails default"
      WORKERS_COUNT: 1
  server:
    <<: *redash-service
    command: server
    ports:
      - "5000:5000"
    environment:
      REDASH_WEB_WORKERS: 4
  scheduler:
    <<: *redash-service
    command: scheduler
  scheduled_worker:
    <<: *redash-service
    command: worker
    environment:
      QUEUES: "scheduled_queries,schemas"
      WORKERS_COUNT: 1
  adhoc_worker:
    <<: *redash-service
    command: worker
    environment:
      QUEUES: "queries"
      WORKERS_COUNT: 2
  redis:
    image: redis:5.0-alpine
    restart: always
  postgres:
    image: postgres:9.5-alpine
    env_file: /opt/redash/env
    volumes:
      - /opt/redash/postgres-data:/var/lib/postgresql/data
    restart: always
  nginx:
    image: redash/nginx:latest
    ports:
      - "80:80"
    depends_on:
      - server
    links:
      - server:redash
    restart: always

# コンテナを再作成
$ docker-compose up --force-recreate --build -d
Recreating redash_redis_1    ... done
Recreating redash_postgres_1 ... done
Recreating redash_scheduled_worker_1 ... done
Recreating redash_server_1           ... done
Recreating redash_worker_1           ... done
Recreating redash_scheduler_1        ... done
Recreating redash_adhoc_worker_1     ... done
Recreating redash_nginx_1            ... done
```

ブラウザからアクセスし、画面右上のユーザー名をクリックして、
`Version: 9.0.0-beta (2641562b)`が表示されればOK。
Progate学習 中級編メモ

#HTML&CSS　中級編#

■プロパティ、タグ等まとめ

※機能の詳細が何かは省略しています

学習過程でプロパティ等は暗記する必要はないと考えていますが（その都度ぐぐる）中級編道場をスムーズに進めるためにまとめました。

・background-image: url(画像のURL);
・background-size: cover;
・margin:0 auto; (widthとセット)
・opacity: 0.7;
・letter-spacing: 10px;
・display: inline-block;
・div class="btn blue"（複数指定）
・div: hover{
   background-color: red;
}
・border-radius
・text-aligin: center;　（margin: 0 auto;との違い）
・＜span class="fa fa-facebook"＞＜/span＞（CSSでシート読み取る必要あり）
・opacityとrgbaの違い
background-coor: rgba(84,190,238,0.5);
・transition: all 1s;
・line-height: 10px;
・font-weight: bold;
・width: 50%;
・position: absolute;
top:50px; left: 70px;
・position: relative;
・box-shadow: 0px 10px #0000;
・cursor: pointer; （text）
・div:active{
 background-color:red
}
・box-shadow:none ;
・btn.active{
position: relative;
top: 6px;
box-shadow: none;
}
・position: fixed;
top: 10px; left: 40px;
・z-index: 1; （potisionと併用）
UnityにおけるInvokeとCoroutineの精度比較

###環境
windows10
Unity 2019.3.15f1

#指定時間後に動作する処理を書きたい
⇒高精度を求めるならCoroutine一択！※
理由は下記の記事になります。

※2020/06/30 FPSに依存するようです。高精度ではなく、Updateと同じ精度と考えるのが良さそうです。

## InvokeとCoroutine
「Unity 指定時間後」で調べるとこの二つが出てきます。

[【Unity】スクリプトの処理の実行タイミングを操作する](https://qiita.com/toRisouP/items/e402b15b36a8f9097ee9)
↑こちらの記事がわかりやすいです。

## 精度はどうなの？
**「BPM200の16分音符を鳴らしたい=音を出してから75ms後に音を止めたい」**
これが私にとっての課題です。InvokeもしくはCoroutineはこの課題を解決してくれるのでしょうか。

#測定をする
測定にはStopwatchクラスを使用します。今回の測定を行うには十分に高精度です。
どちらも「スペースキー」が押されるとタイマースタート、
一定時間後にタイマーストップをするプログラムです。

##Invokeのテストソース
Invoke(xxx, Time); の第二引数で時間を決めます。

```cs:InvokeTest.cs
public class InvokeTimerTest : MonoBehaviour
{
    [SerializeField, Range(0.01f, 1.0f)] float Time;
    List<long> results = new List<long>();

    Stopwatch sw = new Stopwatch();

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            sw.Start(); //計測開始
            Invoke("TestInvoke", Time);
        }
    }

    void TestInvoke()
    {
        sw.Stop();
        UnityEngine.Debug.Log($"TestInvoke()[{results.Count + 1}]:{sw.ElapsedMilliseconds}ms");
        results.Add(sw.ElapsedMilliseconds);
        sw.Reset();
    }
}
```

##Coroutineのテストソース
yield return new WaitForSecondsRealtime(Time);の第一引数で時間を決めます。

```cs:Coroutine.cs
public class CoroutineTimerTest : MonoBehaviour
{
    [SerializeField, Range(0.01f, 1.0f)] float Time;
    List<long> results = new List<long>();
    Stopwatch sw = new Stopwatch();

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            sw.Start(); //計測開始
            StartCoroutine(TestCoroutine());
        }
    }

    IEnumerator TestCoroutine()
    {
        yield return new WaitForSecondsRealtime(Time);
        sw.Stop();
        UnityEngine.Debug.Log($"TestCoroutine()[{results.Count + 1}]:{sw.ElapsedMilliseconds}ms");
        results.Add(sw.ElapsedMilliseconds);
        sw.Reset();
    }
}
```

#結果
Timeの値を変えて、各条件で100回実行した結果になります。
##条件1.Time=100msの場合
||最大値|最小値|平均|標準偏差|
|---|---|---|---|---|---|
|Invoke|104|83|93.79|6.02|
|Coroutine|108|100|102.50|1.67|

##条件2.Time=50msの場合
||最大値|最小値|平均|標準偏差|
|---|---|---|---|---|---|
|Invoke|57|34|44.28|7.06|
|Coroutine|57|52|55.8|0.89|

##条件3.Time=10msの場合
||最大値|最小値|平均|標準偏差|
|---|---|---|---|---|---|
|Invoke|18|0|4.03|5.13|
|Coroutine|25|10|17.54|2.24|

##条件4.Time=500msの場合
||最大値|最小値|平均|標準偏差|
|---|---|---|---|---|---|
|Invoke|506|480|494.23|6.28|
|Coroutine|509|500|503.58|2.97|

#考察
##1. 誤差
　Invokeの誤差は、＋に8ms, －に20msが最大です。
　Coroutineの誤差は、＋に15ms, -に0msが最大です。
　偏差を比べてもCoroutineの方が小さい傾向にあります。
　1ms単位とは言いませんが、±10ms程度のタイマーとしては有効ではないでしょうか。

##2. 最小値
　Coroutineでは最小値が設定値を下回る事がありません。タイマーの時間が過ぎたら実行するプログラムと考えると納得がいきます。しかし、Invokeの最小値は設定値を下回っています。おおよそ60Hzの1フレーム分くらい早めに判定される事があるようです。(理由はよくわからないので、詳しい方補足をお願いします。)

##3. Timeの限界値
　Time=10msではInvokeの最小値が0になる、Coroutineの誤差も最大+15ms(つまり、目標値の2.5倍)となり、正確な値が取れているとは言い難い状況です。Coroutineの方が精度が良いとはいえ、Time=50msでも約15%の誤差がありますので、過信は禁物です。どちらの誤差も総時間によらない固定値にも思えますので、長時間になればなるほど誤差率は下がりそうです。

#まとめ
　Invokeでもシビアじゃない環境では十分に使える精度で動作しますが、Coroutineの方が精度よく引数も使えると利点があります。私の課題「75ms音を出す」は「誤差+10ms以内」で達成出来そうです。「この精度で十分かどうか」、それはもちろん使う用途によりますが、このデータが判断の手助けになれば幸いです。
Netlify

#Netlifyを用いて本番環境にデプロイ（vue.js）


`npm run build`　distフォルダー作成

Netlify静的ファイルのデプロイ

Netlifyのサイトを開き、サインイン

distフォルダーをFinderで開き、サイトにdistをドロップアンドドラッグして完了

*このままでは、エラーが出てしまう*

[![Image from Gyazo](https://i.gyazo.com/ef25774de4c3a000e3b9e023dabf7ac9.png)](https://gyazo.com/ef25774de4c3a000e3b9e023dabf7ac9)

どんなURLがきても、index.htmlファイルを返す設定をしなくてはいけない


###_redilectsを作成

publicフォルダーに_redilectsファイルを作成

`/* /index.html 200`　を記述

[![Image from Gyazo](https://i.gyazo.com/c8f5ca02d854ca22e7f6513d79f4ef03.png)](https://gyazo.com/c8f5ca02d854ca22e7f6513d79f4ef03)

`npm run build`　distフォルダーを再作成

_redilectsファイルがdistフォルダーに反映


また、distフォルダーをFinderで開き、サイトにdistをドロップアンドドラッグして完了
OAuth 2.0 Web サーバフロー（Identity And Access Management デザイナー）

# OAuthフロー多すぎ問題

Identity and Access Managementデザイナーの受験で資料を読んでいると
OAuthフローの種類がやけに多いなぁと困った件。
フローの中身もざっくりしている物が多く、並べて若干の違いがあり
むむ・・・と途方に暮れたわ。

SalesforceのOAuth認証フローは内容が一緒でもRFCの名称と異なる用語なので注意。
用語が多すぎて、別の事を言っているのかと混乱したわ・・・。
あとSalesforceの説明しているフローがざっくしており大まかにはそーなんでしょうが、
詳細な説明を照らし合わせるとうーーーん・・・という所もあり、自分なりにかみ砕いて
フローを起こしてみた。

# OAuth 2.0 Web サーバフロー
- Trailheadでは[Web アプリケーションインテグレーション (OAuth 2.0 Web サーバフロー)](https://trailhead.salesforce.com/ja/content/learn/modules/connected-app-basics/connected-app-basics-api-integration)と呼んでいる。
- Salesforce Helpでは[WebサーバOAuth認証フロー](https://developer.salesforce.com/docs/atlas.ja-jp.api_rest.meta/api_rest/intro_understanding_web_server_oauth_flow.htm)と呼んでいる。
- [RFC6749 4.1 Authorization Code](https://tools.ietf.org/html/rfc6749#section-4.1)に該当する。

ざっくり、**利用者があるWebアプリケーション経由（A）で別のWebサービスやWebアプリケーション（B）に接続する際にOAuthを利用して認可するフロー。**
事前にAとBの信頼関係が構築できる際に使用する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577032/44443ff2-8e8e-54d7-d9a7-e53772741366.png)

- クライアントアプリケーション：Webアプリケーションが認可サーバ：Salesforceから認証コード（code）を取得してから、**認証コード（code）と引き換えにアクセストークン（access_token）を取得する**のがポイント。
 - 認証コードを引換券、アクセストークンが入場チケットみたいな感じ。 
- リソースにアクセス出来るアクセストークン（access_token）をリソースオーナやユーザエージェントまで開示しない事でセキュリティリスクを軽減している。

#### 利用するシナリオ
- この認証フローを利用すパターンは、**WebアプリケーションからSalesforce APIに統合する**場合に利用するフロー。
- 事前に接続アプリケーションから発行される**コンシューマ鍵（client_id)**と**コンシューマの秘密（client_secret）**をWebサーバに設定しておく必要があり、Salesforce（認可サーバ）とWebサーバ（クライアント）の信頼関係が前提に成り立つ。

#### リンク
- https://developer.salesforce.com/index.php?title=JP:Digging_Deeper_into_OAuth_2.0_at_Salesforce.com&oldid=37785
Windows で wget できないときの解決方法

## 事象
Ansible で Windowsを管理するために、WindowsにWinRMの接続を受け付けるための初期設定スクリプトを
実行しようとwgetしようとしたら失敗したので、その解決方法をまとめました。

```PowerShell
PS C:\Users\Administrator> wget https://github.com/ansible/ansible/raw/devel/examples/scripts/ConfigureRemotingForAnsi
wget : 要求は中止されました: SSL/TLS のセキュリティで保護されているチャネルを作成できませんでした
発生場所 行:1 文字:1
+ wget https://github.com/ansible/ansible/raw/devel/examples/scripts/Co ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest]、WebExc
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
```

## エラー内容
wget : 要求は中止されました: SSL/TLS のセキュリティで保護されているチャネルを作成できませんでした


## 原因
 TLS 1.2 には対応しておらず、エラーとなっていました。

```PowerShell
PS C:\Users\Administrator> [Net.ServicePointManager]::SecurityProtocol
Ssl3, Tls
PS C:\Users\Administrator>
```

## 対策
下記を実行してTLS1.2に対応させる
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12;

```PowerShell
PS C:\Users\Administrator> [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12;
PS C:\Users\Administrator> [Net.ServicePointManager]::SecurityProtocol
Tls12
PS C:\Users\Administrator>
```

## おまけ
OSが対応しているSSL/TSLのバージョン確認

```PowerShell
PS C:\Users\Administrator> [enum]::GetNames([Net.SecurityProtocolType])
Ssl3
Tls
Tls11
Tls12
PS C:\Users\Administrator>
```

TSL1.1とTSL1.2に対応させる場合は下記の様に実行

```PowerShell
PS C:\Users\Administrator> [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12
PS C:\Users\Administrator> [Net.ServicePointManager]::SecurityProtocol
Tls11, Tls12
PS C:\Users\Administrator>
```
App Clipsをざっくり理解する

WWDC20で発表された、App Clipsをざっくり理解するために要点をまとめています。

### 仕様・特徴
- ユーザーはアプリをインストールする必要なく、ネイティブアプリの一部を使用できる
- App Clipによって処理されるURLを使用する（ユニバーサルリンクに似ている）
- NFCタグ、QRコード、Smart App Banner、iMessageのリンク、Mapsから開くことができる
- App Clip URLはApp Store Connectを使用して登録する
- アプリとApp Clipの両方を含むビルドをApp Store Connectに配信すると、App Clip Configurationセクションが表示される
- 異なるエクスペリエンスには個別のURLを使用する
- URLはprefixの一致に基づいているため、すべての可能なApp Clip URLを登録する必要はない（クエリストリングやパスパラメータで柔軟に出来る）
- アプリがインストールされている場合アプリが優先、アプリがインストールされていない場合は、App Clipがダウンロードされる
- 使用されない場合、iOSはApp Clipとそのデータを削除する

### 制限・注意点 
- App Clipは追加機能であり、App Clip単体では提供できない
- App Clipでのインタラクションは、迅速かつ集中的に行う必要がある
- XcodeでApp Clip用のターゲットを作成する必要がある
- App Clipは10メガバイト未満にする必要がある
- App Clipからの機密情報へのアクセスは制限されている
- タイトル、サブタイトルの長さ、画像サイズ、アスペクト比、およびフォーマットの要件がある
- ユーザーが一貫した体験を得られるように、App Clipにはアプリと同じ名前とアイコンを使用する

### その他出来ること
- App Clipからアプリへデータ移行するには、[App Group](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_application-groups)を利用する
- [SKOverlay](https://developer.apple.com/documentation/storekit/skoverlay)を使用してアプリをインストールするよう促すことができる
- XcodeでApp ClipのURL処理コードをテストするには、テストURLを指定できる
- App Clipsは、カメラ、マイク、およびBluetoothの許可を要求することができる
- App Clipの通知では、毎回の起動後、最大8時間まで許可を得ることができる


### 関連リンク

https://developer.apple.com/videos/play/wwdc2020/10174
https://developer.apple.com/videos/play/wwdc2020/10146
https://developer.apple.com/videos/play/wwdc2020/10120
https://developer.apple.com/videos/play/wwdc2020/10172
https://developer.apple.com/app-clips/
https://developer.apple.com/design/human-interface-guidelines/app-clips/overview/
https://developer.apple.com/documentation/app_clips/developing_a_great_app_clip
https://developer.apple.com/documentation/app_clips/creating_an_app_clip
https://developer.apple.com/documentation/swiftui/fruta_building_a_feature-rich_app_with_swiftui
spring修正点

```
@Bean
	@Override
	public UserDetailsService userDetailsService() {
		UserDetails user =
			 User.withDefaultPasswordEncoder()
				.username("user")
				.password("password")
				.roles("USER")
				.build();

		return new InMemoryUserDetailsManager(user);
	}


を下記に変更



	@Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        // パスワード
        String password = passwordEncoder().encode("password");

        // インメモリの認証を行うための設定
        auth.inMemoryAuthentication()
                .passwordEncoder(passwordEncoder())
                .withUser("user").password(password).roles("USER");
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
```


```
                photoUpload.setVersion(new Long((Integer) version));    
>>
                photoUpload.setVersion(Long.valueOf((Integer) version));    



        Map uploadResult = null;
>> 
        Map<?, ?> uploadResult = null;


new Transformation()
>>
new Transformation<>()


```

```

トップページを設定しようを追加
		registry.addViewController("/").setViewName("forward:ideas");

```



```
# h2-consoleの使い方(SQL文の書き方)

* 一個一個実行して確かめてみよう。

# 2.1 一覧の表示
select * from idea;
select * from comment;

# 2.2. 紐付いたレコードの表示
select * from comment where idea_id = 1;

# 2.3. レコードの作成
insert into idea(name, description) values ('名前', '説明');

# 2.4. レコードの削除
delete from idea where id=3;

** 子レコードが紐付いたデータは削除出来ません。

# 2.5. レコードのアップデート
update idea set name='名前2', description='説明 xxx' where id=1;
```
CleanArchitectureとドメイン駆動設計の違い

#なんかドメイン駆動設計ってよく聞くけど似たようなやつなんかな？
###
社内の輪読会にて、CleanArchitectureを読了
[CleanArchitecture 達人に学ぶソフトウェアの構造と設計 (日本語)](https://www.amazon.co.jp/Clean-Architecture-%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E6%A7%8B%E9%80%A0%E3%81%A8%E8%A8%AD%E8%A8%88-Robert-C-Martin/dp/4048930656)　
著：Robert C.Martin 


**「なんかドメイン駆動設計ってよく聞くけど似たようなやつなんかな？」**
と思いいくつか資料を読んだので、備忘録としてまとめます。（ご指摘、感想があればお待ちしております。）

##CleanArchitectureは設計思想 vs DDDは開発手法
* CleanAritectureはSOLID原則を元にして、
（ビジネスロジックなど）安定度の高いコンポーネントに依存するように依存ルールを決めた設計思想。

* DDDはお客さん（業務内容の知見者）と共にどうやってビジネスロジックを表したモデルを作るか。ビジネスロジックであるエンティティ(ドメイン層)・ユースケース層の具体的な開発手法

##DDDに出てくる用語の具体的な違い
###「ドメインエキスパート」「境界づけされたドメイン」「ユビキタス言語」
DDDは業務内容に詳しい人（ドメインエキスパート）と
決定されたスコープ内（境界づけされたドメイン）で、
表記ゆれ・誤解がないよう言語を統一させる（ユビキタス言語を作成する）ことから始まる。
CleanArchitectureと違いコンポーネントの依存ルールだけに話が留まらない。

###Entityの概念が異なる。
双方にEntityという用語があるが、
CleanArchitectureでは、Entityはアプリケーションに依存しない最重要ビジネスルール。
一方、DDDでは、同様の概念にドメインがあり、ドメインは（Entity・値オブジェクト・サービスなどで）構成されている。ドメインも同様に最重要ビジネスルールであるが、クリーンアーキテクチャよりは具体的にルールが決まっている。

###集約・リポジトリ
CleanArchitectureではEntityは、最重要ビジネスルールとしか書かれていない。例えば、ユーザオブジェクト・ユーザ詳細情報オブジェクト・タスクオブジェクトの3つがあったときに、その関連性についての記述方法はない。
DDDでは、集約という単位でオブジェクトをまとめる。
具体的には、オブジェクトをまとめる＝オブジェクトを変更するタイミングが同じと考え、集約の単位で、集約を一括で変更するリポジトリを作成する。
つまり、リポジトリの単位＝集約の単位である。

###ドメイン貧血症
DDDではドメインにビジネスルールを強く書くことが大切であり、
ビジネスルールが抜けたドメインをドメイン貧血症という

##参考資料
*「わかる！ドメイン駆動設計 ～もちこちゃんの大冒険～」
https://booth.pm/ja/items/392260
*「ドメイン駆動設計 モデリング/実装ガイド」
https://booth.pm/ja/items/1835632

ゆくゆくはエリック・エヴァンスのDDDも読まなくては。。。
（レポート）Scrum Fest Osaka 2020 Day2 "で、結局 "誰に" 価値を届けるの？〜大企業のアジャイル開発で失敗に成功した話〜" #scrumosaka.mkw

# はじめに

[Scrum Fest Osaka 2020](https://www.scrumosaka.org/)は、6/26-27に開催された、オンラインでの大規模カンファレンスです。

この記事では、2日目の14:00～14:30 #scrumosaka.mkw（三河）で行われた「[で、結局 "誰に" 価値を届けるの？〜大企業のアジャイル開発で失敗に成功した話〜](https://confengine.com/scrum-fest-osaka-2020/proposal/13728)」のレポートです。

今回、NRI asleadのチームメンバー3人全員で参加しています！

スライドは2020/06/29現在、未公開のようです。

# 登壇の経緯

- 「@TAKAKING22 （及部）さんのせい」で登壇することに
- 自分もあんなふうに楽しく活動したいと思った

# 何をやっている人か

- 松原さん：デンソーでスクラムマスター
    - 失敗に成功したい
    - 開発プロジェクトやってるけどプログラム書けない
- チームの成長の話をメインにしていきます

# アジャイル開発の経験と浮かんできた疑問

- 開発期間6ヶ月で開発したときの話
    - 開発3名、SM1名（松原）
- 疑問：価値の届け先とは？
    - 本来はユーザのはず
    - ただ、大企業だと単純ではない
    - **市場（ユーザ）までの距離が遠い**
    - 目的が「事業部長や営業マンを納得させること」になってる
    - チーム内部でも距離がある
        - POと開発チームで距離がある

# チームに起こったトラブル

- トラブルが発生
    - 価値の衝突
    - 品質観点の総意
- 当初予定の半分も開発できなかった
    - メンバーそれぞれで向き先が違っていた
        - ステークホルダー
            - ユーザビリティ、作業効率化
            - オペレーション
        - PO
            - 技術開発、サービス創出
            - イノベーション
        - 開発チーム
            - 個のスキルアップ、自分のことで精一杯
            - モチベーション

# 「みんなでアジャイル」から学んだ3つのポイント

- 顧客から始める
    - ユーザーの仕事場で一緒にインセプションデッキ、ユーザーストーリーマッピング
- 早期から頻繁に協力する
    - 向かう先を日々修正する
    - アクション→同じ場所でともに働く
- 不確実性を計画する
    - 向かう先へ到達し続ける
        - 実験と発見、学びや成長を実感
        - 相互感謝、持続可能
    - KPT
        - 変化を楽しむふりかえり、互いに感謝

# 誰に価値を届けるか？～失敗から学んだこととわたしからの提案～

- 届ける価値の共通認識を持つ
    - ユーザの困りごと、嬉しさを直接聞く
        - **三現主義＋１**
            - 現場
            - 現物
            - 現実
            - **現人**
    - 品質の共通認識を持つ、優先順位付け
        - SQuaREという国際基準の品質の観点でトレードオフスライダーを作成
    - 価値はパートな関係のもとに造られ育まれる
        - POの上司を巻き込んだふりかえり
            - 現場の困りごとを感じてもらう。効果を一緒に見たい気持ちを伝える
        - 人材育成にはモブワーク
            - 特に開発スキルが未熟なチーム
            - 互いに補完しあい、技量の差を縮める
            - 安心しながらできる
        - 失敗はチームへ届けられる最大の価値
            - **「ありがとう」は魔法の言葉**
            - WHYとFUNに目を向ける
                - FUNを意識させるグランドルール
                - K：ありがとうを伝える
                    - お互い嬉しいもの
                - P：失敗を称え合う
                    - 前向きにトライする
                - T:実験と発見を楽しむ
            - 文字に隠れた背景や感情に目を向ける
                - 意識的に問いを投げかける
                - なぜうまくいった、いかなかったのか
                - 本質に目を向ける

# で、結局"誰に"価値を届けるの？

- 現場で困っている人
    - Not上司
- スクラムチーム
    - アジャイルは無限の愛の源泉
    - 愛という価値を届け続けるチームを作る

# 今後の展望

- ソフト開発職場以外にもアジャイルを普及したい
    - エンゲージメントサーベイ×ふりかえり　を組織に普及し始めた（100名規模）
    - 毎週　We Doをチーム間で共有、多く得られたいいね！をまとめて展開

# 感想

（森）

- POといかに近いか、って大事。POと近ければ近いほど、よいチーム・プロダクトになるのは私も実感している。
- ステークホルダーとPOとチームの価値観がずれまくってるとしんどいのを思い出した。ステークホルダーが複数社いるとさらに辛い。
- 価値の届け先は常に意識しなきゃいけない、と再認識（PO・アジャイルコーチとして）
    - 届け先には「チーム」も含まれるというのはよい学びだった

（チームメンバー）

- 「価値の届け先」に共感した
- 自分の上長やリーダーに納得させるものを作ることになりがち。
- 現場の人を見に行くっていうのも大切なんだろうな。と共感
- 互いに感謝、というのがいい
- 変化を楽しむふりかえりって大事そう
- 感謝の意思を表示する、というのが大事
- 凝り固まるのを防ぐ、柔軟性をもつ。
- 今は3人チームでロールも混ざっているが、ロールをがっちり設定すると、誰に何を届けるのか、ロールごとに別々の考え方が生まれそう
viエディタ～カーソルの場所からのコマンドの話

今日は、viエディタの話。特にカーソルの場所からのコマンドについて

①最初の画面にxを入力して確認

<img width="181" alt="viエディタ_001_20200629.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421663/aacc0825-d9c0-0c39-4cb5-c437435af55d.png">

②i カーソルの左から入力開始
<img width="190" alt="viエディタ_004_20200629.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421663/9ea257fb-983c-76b2-a29b-d3f6af14a4e7.png">

③I カーソルの右から入力開始
<img width="186" alt="viエディタ_003_20200629.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421663/7b40fbc8-11c3-7283-c7d3-c209e98d6ecb.png">


④a カーソルのある行の先頭から入力開始
<img width="183" alt="viエディタ_002_20200629.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421663/0d9e2b22-cbd8-457f-dd24-1b53d6d30bde.png">

⑤A カーソルのある行の末尾から入力開始
<img width="182" alt="viエディタ_005_20200629.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421663/295d7a90-7608-229a-d458-f8c8e9920138.png">


⑥o カーソルのある行の下に空白行を挿入し、その行から入力開始
<img width="185" alt="viエディタ_006_20200629.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421663/a14269bf-9981-9766-20ee-82e09f97bb86.png">

⑦O カーソルのある行の上に空白行を挿入し、その行から入力開始
<img width="181" alt="viエディタ_007_20200629.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421663/cadea62c-6152-933e-3138-ab4c36fe8258.png">

写真があると見やすいけどリンク長すぎ、、
次は見る人のために書けたら良いな
psql コマンドは Docker コンテナとして実行しよう

ターミナルから `psql` コマンドを使って外部の PostgreSQL サーバに接続したいが、 `psql` コマンドを使うためには作業マシンに PostgreSQL をインストールしなければならない。

作業マシンに PostgreSQL をインストールすると何が起きるかというと、 `createuser` のような「PostgreSQL っぽくない名前のコマンド[^postgresql_cli]」がインストールされてしまう。これがあまり好きではなく、この理由のため自分は作業マシンに PostgreSQL をインストールしたくない。

[^postgresql_cli]: [PostgreSQLクライアントアプリケーション | PostgreSQL 12.0 ドキュメント](https://www.postgresql.jp/document/12/html/reference-client.html)

しかし、外部の PostgreSQL サーバと接続するために `psql` コマンドだけは使いたい。

こういうときは、**Docker の出番**である。

``` bash:~/.bashrc
alias psql="docker run --rm -it --net=host postgres:12 psql"
```

`psql` コマンドは Docker コンテナの中で動かすことにして、シェルの alias で普通の `psql` コマンドとして使えるようにしている。

※ `--net=host` はなくても構わないのだけど、これがあると同じ端末内の別の Docker コンテナで PostgreSQL サーバが動いていてポートがマッピングされている場合に「ホスト名 `localhost`」としてアクセスできるようになる。

コンテナ内に環境を閉じ込めることで `psql` 以外のコマンドはホスト側に露出することがなくなり、いい感じなった。

AWS CLI もそう [^awscli] だけど、コマンドを Docker コンテナの中に閉じ込めて実行するというスタイルは当たり前になっていくのかもしれない。

[^awscli]: [AWS CLI v2 Docker image | AWS Developer Blog](https://aws.amazon.com/jp/blogs/developer/aws-cli-v2-docker-image/)

## [追記] `pg_dump` や `pg_restore` が欲しくなった場合
`pg_dump` や `pg_restore` が欲しくなった場合も同様に alias を追加すれば良い。

``` console
$ alias pg_dump='docker run --rm -it -v $(pwd):/tmp -w /tmp --net=host postgres:12 pg_dump'
$ alias pg_restore='docker run --rm -it -v $(pwd):/tmp -w /tmp --net=host postgres:12 pg_restore'
```

使うときはこう。

``` console
$ pg_dump -Fc --no-acl --no-owner -U <username> -h <host> <database> -f data.dump
$ pg_restore -Fc -U <username> -h <host> -d <database> data.dump
```

ただし注意点として、 `pg_dump` を Docker コンテナで動かす場合は標準出力を使わずに `-f` オプションでファイルに書き出す必要がある。どうやら `-t` オプションでコンテナに擬似 TTY を割り当てた状態で標準出力でホストに直接ファイルを書き出すと改行コード周りがおかしくなってしまうらしく、リストア時に `pg_restore: error: could not read from input file: end of file` というエラーが出てしまう。かといって `-t` を外すと今度はパスワードプロンプトに入力することができなくなってしまう。

## [追記] 結果をファイルに出力したい場合
クエリ実行結果をファイルに出力したい場合、上記の alias だと `-t` が付いているせいでリダイレクトがうまくいかない。

alias を使わずに以下のようにすると出力できる。

``` console
$ PGPASSWORD=<password> docker run --rm postgres:12 psql -h <host> -U <username> <database> -c "SELECT ..." -A -F $'\t' > out.tsv
```
safariでWebP(うぇっぴー)が使えるようになるので改めて使い方を調べてみた

WebPは、Chrome、Firefox、Microsoft Edgeなどのブラウザでサポートされていますが、Safariでサポートされていませんでした。しかしAppleが今秋に発表を予定しているiOS 14や、macOS Big Surに搭載される「Safari 14」に、WebP形式の画像フォーマットをサポートするとの発表がありましたので、
これを機にWebPの需要が高くなるだろうなと思いましたので改めて使い方を調べてみました。

##WebPとは
まずは読み方はWebP(うぇっぴー)と読むようです。
WebPはgoogleが手動となって開発した新しい画像形式です。新しいとはいっても2010年から仕様が公表され、各種ツールと共に提供が開始されたみたいです。
非可逆圧縮で、拡張子は.webp、同じ非可逆圧縮のJPEGとは違い、非可逆圧縮でありながらアルファチャンネルを扱えます。
Googleの示した事例では、JPEGと比較して25-34%ファイルサイズが小さくなり、pngと比較しても28%小さくなります。

##WepP画像の作り方
Google が提供する画像軽量化サービス[squoosh](http://...)を利用してWebPに変換することができます。

またはデザイナーならphotoshopで変換したいと思うのでしょうが、photoshopだけではWebPに変換することができません。しかし専用のプラグインをインストールすれば可能です。
WebPの開発チームによるphotoshopのプラグインがGitHub上に公開されていますので、そこからダウンロードすることができます。
ダウンロードやインストール方法につきましては下記のリンクに書いてあります。
[https://developers.google.com/speed/webp/docs/webpshop](https://developers.google.com/speed/webp/docs/webpshop) - WebPShop


##WebPをブラウザ対応させる

WebPが対応できないブラウザに対しては、picture 要素を使ってpngを表示するようにします。
IEではpicture要素が使えないので [picturefill.js](http://...) などを利用して表示させることができます。

```html:sample.html
<picture>
    <source type="image/webp" srcset="sample.webp"></source>
    <img src="sample.png">
</picture>
```

##さいごに
safariも対応すると言っても新しいバージョンになっていない人もいるだろうし、最新のiOSのバージョンにしてない人もいると思います。
また、未だにieを使っている人もいるでしょうし、まだまだ悩まされるところはあるとは思いますが、どんどん軽量のWebPが使われていくといいですよね。
MS-Windows 10 でロケール変更

通常の日本語 Windows のコードページは CP932。
システムレベルで変更する方法の備忘録。

# 現在のロケールの確認

コマンドプロンプトで chcp で確認できます。

```

C:\>chcp
Active code page: 932
```

# システムロケールの変更

コントロールパネルの「地域」→「管理」に「システムロケールの変更」があります。

「地域」メニュー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e66d0438-31ee-9087-252e-00b6f85c8a4e.png)
「システムロケールの変更」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/c65137b6-d752-9d69-425e-10b82ff39922.png)

で「現在のシステムロケール」を変更します。

# 「地域」メニューを出すには

「コントロールパネル」→「時計と地域」→「地域」

または

「時刻と言語」→「地域」（「言語」じゃないよ！）→「日付、時刻、地域の追加設定」

# おまけ1

US な方が 日本語ロケールを設定するには

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/281cf08e-d09d-b3ad-7cea-60e4fdfab06c.png)

# おまけ2

「日本語(日本)」のままで 「ワールドワイド言語サポートで Unicode UTF-8 を使用」をしてみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/53dafb8f-cbcf-06ec-25fe-99beffaa6739.png)


```

C:\>chcp
Active code page: 65001

```
Laravel  S3で複数の画像をアップロードする

## LaravelでAWS S3へ画像をアップロードする

### 前提条件
AWS S3でユーザ登録とバケットの作成ができていること。
[まだ作成してない方はこちらが参考になります](https://qiita.com/nobu0717/items/4425c02157bc5e88d7b6)

### S3パッケージインストール
パッケージはflysystem-aws-s3-v3を使用します。
以下を実行してインストールしてください。

```
composer require league/flysystem-aws-s3-v3
```
### ファイルシステム設定
/config/filesystems.phpを以下のように編集します。

```
  'default' => env('FILESYSTEM_DRIVER', 'local'),

  // 追記
  'cloud' => env('FILESYSTEM_CLOUD', 's3'),

  // 〜 略 〜

  'disks' => [
    'local' => [
      // 〜 略 〜
    ],
    'public' => [
      // 〜 略 〜
    ],

    // 以下を追記
    's3' => [
      'driver' => 's3',
      'key' => env('AWS_ACCESS_KEY_ID'),
      'secret' => env('AWS_SECRET_ACCESS_KEY'),
      'region' => env('AWS_DEFAULT_REGION'),
      'bucket' => env('AWS_BUCKET'),
    ],
```

### 環境変数設定
プロジェクト直下にある.envファイルを以下のように編集します。

```
AWS_ACCESS_KEY_ID='AWSで作成したAccess key ID'
AWS_SECRET_ACCESS_KEY='AWSで作成したSecret access key'
AWS_DEFAULT_REGION=ap-northeast-1
AWS_BUCKET='作成したバケット名'
```

### Laravelの実装
実際にS3に保存していきます。
最低限のコードは次節以降になります。

### viewの実装
今回は複数枚アップロードできるようにしていきます。

```
          <div class="name-filed width">
            <div class="first-name-box">
              <div class="text-label">
                <p class="name">希望画像<span class="red">✳︎必須(5枚まで可)</span></p>
              </div>
              <div>
              {!! Form::file('item_url[]', ['multiple' => 'multiple']) !!}
              </div>
              @if ($errors->has('item_url') || $errors->has('item_url.*') )
                <div class="alert alert-danger">{{ $errors->first('item_url') . $errors->first('item_url.*') }}</div>
              @endif
            </div>
          </div>
```

**point 1**

formに'multiple' => 'multiple'をつけることで複数選択が可能になる。（Ctrl キーなどを押しながら写真を選択する）

**point 2**

Form::file()メソッドを利用します。
今回は複数枚になるので第一引数は配列で取得できるようにします。

```
'item_url[]'
```

**余談**

配列にフォームリクエストでバリデーションする場合は下記のように、 .* というプレースホルダーが使用する。

```
item_url.*
```

### controllerの実装
formから送られてきた値をS3に保存していきます。
laravelには簡単にS3を扱えるようにするファイルストレージ機能があります。
[簡単なのでぜひ目を通してくださいね！](https://readouble.com/laravel/5.5/ja/filesystem.html)

    
```
public function store(ItemRequest $request)
    {
        $disk = Storage::disk('s3');
        $images = $request->file('item_url');
        foreach ( $images as $image) {
            $path = $disk->putFile('itemImages', $image, 'public');
            $url[] = $disk->url($path);
        }

        return view('item.top');
    }
```
 **流れの解説**
$disk変数にlaravelが用意してくれている Storage::disk('s3');を代入。


$imageにはformから送られてきた写真をfile()を使用して取得する。　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
※$imageにはURLではなく、UploadedFile クラスが入ってる。
↓
foreachを使用して画像一枚ずつS3に保存していく。
putfile()メソッドの第一引数はバケット内の保存するフォルダを指定している。第二引数は保存する値。第三引数でpublicにすることでどのユーザーでもweb上で画像を見ることが可能になる。※指定しないとweb上に画像が表示されない。
$pathの中身は"バケットの保存先のフォルダ/画像"のpathになっています。
ここまででS3への保存は完了になります！


最後の$urlにはurl()を使用してS3からのURLを作成しています。

以上でS3への複数枚画像アップロードは完了になります！
minikube が WSL2 で動くようになったらしい

# TL;DR
minikube v1.12.0-beta.0 以降を使うと、`--vm-driver=docker` が WSL2 環境に対応している

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992/903958a9-9071-9d64-922a-fe6faf692c1f.png)


# 背景

Windows で minikube を使おうとすると(minikube.exe)、下記のように切ない感じになりがちだったんですが

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992/8ef45c01-0123-6b6e-3f76-44655f3167df.png)

minikube の [issue #5392](https://github.com/kubernetes/minikube/issues/5392) が close され、その後のビルドがリリースされたので WSL2 上で minikube が立ち上がるようになりました 🎉

# 試してみる

Ubuntu 20.04, docker 19.03.11(WSL2) が動いている環境です。

インストールは Linux 版の minikube バイナリを落としてこれば ok.

```bash
$ wget https://github.com/kubernetes/minikube/releases/download/v1.12.0-beta.0/minikube-linux-amd64
$ chmod +x ./minikube-linux-amd64
$ mv ./minikube-linux-amd64 minikube 
$ sudo install minikube /usr/local/bin/ 
```

起動時に `--vm-driver=docker` を指定すれば楽しい時間の始まり.

```bash
$ minikube start --vm-driver=docker                                                
😄  minikube v1.12.0-beta.0 on Ubuntu 20.04
✨  Using the docker driver based on user configuration
👍  Starting control plane node minikube in cluster minikube
🚜  Pulling base image ...
💾  Downloading Kubernetes v1.18.3 preload ...
    > preloaded-images-k8s-v3-v1.18.3-docker-overlay2-amd64.tar.lz4: 526.01 MiB
🔥  Creating docker container (CPUs=2, Memory=6300MB) ...
❗  This container is having trouble accessing https://k8s.gcr.io
💡  To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/
🐳  Preparing Kubernetes v1.18.3 on Docker 19.03.2 ...
    ▪ kubeadm.pod-network-cidr=10.244.0.0/16
🔎  Verifying Kubernetes components...
🌟  Enabled addons: default-storageclass, storage-provisioner
🏄  Done! kubectl is now configured to use "minikube"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992/8758068d-fbc1-813f-349e-6493abc576c5.png)

アイコンがかわいいね😄
KotlinでTCP/IP送信

#はじめに
AndroidでTCP/IP通信をしようとするとうまくいかないので、その対応方法の記録です。
2018年ごろに作られているTCP/IPのサンプルがまったく動作しないのでその原因を調査しました。
#サンプル1
MainActivityのボタンクリックイベント内に

```sample1.kt
        var socket : Socket? = null
        try {
            val socket = Socket("localhost", 12345)
            val writer : PrintWriter  = PrintWriter(socket.getOutputStream(), true)
            writer.println("serial test")
        }
        if (socket != null) {
            socket.close()
        }
```

と代表的なサンプルを書いて動作させてみましょう。
**コメントの方にすばらしく簡潔なサンプルがありますのでそちらも参考にして下さい。**
これは動作しません。動作しないと言うより接続に行きません。
エラー内容を見ると**パーミッション**を指定して下さいと表示されるのでAndroidManifest.xmlを修正します。

```AndroidManifest.xml
    <application
        中略
        android:usesCleartextTraffic="true"
        中略
    </application>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
```

INTERNETの指定がインターネットへ接続可能にする設定
ACCESS_NETWORK_STATEはネットワークの様々なやりとりを有効にする設定
android:usesCleartextTraffic="true"は暗号化無しの通信を許可する設定です。

INTERNET以外の設定は不要と思いますが今後のバージョンアップでまた悩むのが嫌なのであらかじめ付けてます。

そして実行すると今度はアプリが落ちます。
エラーメッセージに若干のヒントはあるのですが要は「ボタンクリックイベントから呼ぶな」と言っているようです。
#サンプル2
じゃあ簡単なスレッドを作ってその中で動作させてみます。
**コメントの方にすばらしく簡潔なサンプルがありますのでそちらも参考にして下さい。**

```sample.kt
        val runnable = object : Runnable {
            override fun run() {
                var socket : Socket? = null
                try {
                    socket = Socket("localhost", 12345)
                    val writer : PrintWriter  = PrintWriter(socket.getOutputStream(), true)
                    writer.println("serial test")
                } finally {
                    if (socket != null) {
                        socket.close()
                    }
                }
            }
        }
        val thread = Thread(runnable)
        thread.start()
```

今度は動作します。

#まとめ
元々接続処理を行うと指定しても一定時間処理が返ってこないのでメインで処理する物ではありませんが、だからといってアプリごと落とさなくても・・・
NavigationControllerの下の色を変える方法

NavigationContronContllerの下(TabBar)の色を変えるのに苦労したので記録を残します。

**NavigationContronContllerの下(TabBar)はデフォルトで白と青**
<img width="373" alt="IMG_CC1004CB8DBE-1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549093/ef81f4c2-0a04-7ed8-8fb3-e5631f4c79be.jpeg">



```Swift
import UIKit

class TabBarViewController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
UITabBar.appearance().barTintColor = UIColor(red: 174/255, green: 238/255, blue: 226/255, alpha: 1)//下の色(デフォルトで白)


        UITabBar.appearance().tintColor = UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 1)//上の色(デフォルトで青)
        
    }
}
```
scaffold laravel php エラーがでる件

```
composer require laralib/l5scaffold --dev
```
を行うと、could not findなどいろんなエラーがでてくる。さまざまな解決サイトがあり試したが、変わらず。
下記サイトで解決。
https://awesome-linus.com/2019/05/17/laravel-l5scaffold-install-how-to-use/

もともとapp.phpでproviderに入れろと言われていたが、

``` 
// 開発環境でのみ必要なプロバイダー
    'dev-providers' => [
        Laralib\L5scaffold\GeneratorsServiceProvider::class,
    ],
```
という形でいれる。理由は上記サイトを参照。
何で君が上にいるの…？Z-indexをscssで整理してみた

## 何で君が上にいるの…？問題が多発
毎回なんとなくz-indexの値を決めていると、modalが隠れてしまったり、tooltpがどこからともなく現れたり…日が経つにつれ様々なアクシデントが起こります。

直す際にも解明まで時間がかかる上に、全然関係の無い箇所の重なりがおかしくなったりしてしまいます。
<img width="902" alt="スクリーンショット 2020-06-29 12.26.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457046/e4b0ee11-4de7-9926-53f0-edf779bd3069.png">


## 変数を用意し、必ず変数を使う
予めz-indexが必要になりそうな要素を変数で用意しておきます。
大きい単位で用意し、細かい値の調整は 変数 + 1 などで対応します。

``` scss

//Variables.scss

//変数例
$z-modal: 100;
$z-overlay: 90;
$z-header: 50;
$z-footer: 20;
$z-floating-btn: 20; 
$z-base: 1; 

```

## 実際に使うとこんな感じ

``` scss
.header {
  z-index: $header; //50
}

.modal {
  z-index: $z-modal; //100
}

.modal__overlay {
  z-index: $z-overlay; //90
}

//afterの記事要素をbeforeよりも更に上にしたい時
.checkbox {
  &::before {
    z-index: $z-base; //1
  }
  &::after {
    z-index: $z-base + 1; //2
  }
}
```

## 所感
- 上記の粒度くらいであれば変数が覚えやすく、イメージもしやすく感覚的に設定できます
- 変数を増やし過ぎると逆に複雑になるので、不変の大きい単位で用意するのがおすすめです

## おまけ
ページ内で使われているz-ndexの値を、開発ツール上で一覧表示してくれる神プラグインがあります！
https://ginpen.com/2018/06/20/devtools-z-index/
<img width="583" alt="スクリーンショット 2020-06-29 12.55.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457046/7fee61c4-8e89-bd3a-0111-c964462ea747.png">
Webアプリケーションとは何か

スクールで学習したことの備忘録として残します。
# 概要
Webアプリケーションとは、端的に言うと「データが登録できるWebサイト」になります。

具体的には、

- Webブラウザ（SafariやGoogle Chromeなど）から利用できて
- データを登録できる

サービスをWebアプリケーションと言えます。

例：Twitter、Facebook、メルカリ、クックパッドなど

※スマートフォンなどにダウンロード・インストールして使用するアプリケーションは、「ネイティブアプリケーション」と呼ばれ、Webアプリケーションとは異なるものです。

クライアント（Webブラウザを扱う人）がサーバーに「トップページが見たい」とリクエストを送るとレスポンスが返ってきます。クライアントが望んだ操作がレスポンスされるように仕組み化していく必要があります。
この仕組み化をサーバーで設定していくことが、サーバーサイドエンジニアとして行うことになっていきます。
CocoaPodsで外部のライブラリの導入方法

多くのプロジュエクトが外部のライブラリを使っています。
Githubからプロジェクトをダウンロードして、ライブラリの導入したり、インストールしたりする必要です。

#### 必要のライブラリの導入方法
1.ターミナルでpodバージョンを確認
```pod --version```
バージョンが1.7.5より古い、またはpodがインストールしていない場合は下記のコマンドで更新またインストールします。

```
gem sources --remove https://rubygems.org/
gem sources --add https://gems.ruby-china.com/
//pod install
sudo gem install cocoapods -n /usr/local/bin
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
//update pod local library
pod setup
```
2.プロジェクト関連のライブラリを追加します。
プロジュエクトが必要なラブラリの定義はPodfileで記載します。

```
//cd 実際のxiaozhiboのフォルダのパス 例えば： 
cd ~/iOs/XiaoZhiBo
// Podfileから必要なラブラリをインストール
pod install
```
### 参考資料
- 初心者向け CocoaPods の使い方 [導入編] http://developers.goalist.co.jp/entry/2017/04/20/180931