OmniAICreator/Qiita-1.07M huggingface dataset:
サクラエディタで数独を解く

# 環境
サクラエディタ   Ver. 2.2.0.1
Windows 10

# 数独ソルバーマクロ

動機は謎。

業務で数独を解く必要に迫られた場合にどうぞ。
※一応言っておくと私は業務時間中に数独を解いたりはしていない。

前に普通にJavaScriptで書いたのをサクラエディタのマクロで使えるJScriptに移植。
JScriptだと文字列の添え字アクセス出来ないんだろうか…？(charAt()で代用した)

長いので、実用の項目をクリックしてスキップ。

```javascript:sudoku_solver.js

function idxToBlock(c, r) {
  return (r / 3 | 0) * 3 + (c / 3 | 0);
};

function check(arr) {
    var chist = [], rhist = [], bhist = [];
    for (var i = 0; i < 9; ++i) {
        //chist[i] = new Array(9).fill(0);
        //rhist[i] = new Array(9).fill(0);
        //bhist[i] = new Array(9).fill(0);
        chist[i] = new Array(9);
        rhist[i] = new Array(9);
        bhist[i] = new Array(9);
        for (var j = 0; j < 9; ++j) {
            chist[i][j] = 0;
            bhist[i][j] = 0;
            rhist[i][j] = 0;
        }
    }
    var maxcnt = 0;
    for (var r = 0; r < 9; ++r) {
        for (var c = 0; c < 9; ++c) {
            var val = arr[r * 9 + c] - 1;
            if (val >= 0) {
                maxcnt = Math.max(++chist[c][val], maxcnt);
                maxcnt = Math.max(++rhist[r][val], maxcnt);
                maxcnt = Math.max(++bhist[idxToBlock(c, r)][val], maxcnt);
            }
        }
    }
    var ret = {
        chist: chist,
        rhist: rhist,
        bhist: bhist,
        valid: (maxcnt >= 2) ? false : true
    };
    return ret;
};

function solve(inArr){
  var Q = [], ans = null;
  Q.push(inArr.concat());
  while ( Q.length > 0 ) {
    var arr = Q.pop(), i = 0;
    if ( false == check(arr).valid ){
      continue;
    }
    for (i = 0; i < 9 * 9; ++i) {
      if ( 0 === arr[i] ) {
        for (var j = 1; j <= 9; ++j) {
          arr[i] = j;
          Q.push(arr.concat());
        }
        break;
      }
    }
    if ( 9 * 9 === i ) {
      ans = arr;
      break;
    }
  }
  if( ans ){
    return ans;
  }
  else {
    return null;
  }
}

// ここからエディタマクロ
var text = Editor.GetSelectedString(0);
lines = text.split("\n");

var arr = [];
for( var i = 0; i < lines.length && i < 9; ++i ) {
  for( var j = 0; j < lines[i].length && j < 9; ++j ) {
    var num = parseInt(lines[i].charAt(j));
    if( "?" === lines[i].charAt(j) ){
      arr[ i * 9 + j ] = 0;
    }
    else if( 0 <= num && num <= 9 ){
      arr[ i * 9 + j ] = num;
    }
    else{
      arr[ i * 9 + j ] = 0;
    }
  }
}

var ans = solve(arr);

var outText = "";
for(var i = 0; i < 9; ++i){
  for(var j = 0; j < 9; ++j){
    outText += ans[ i * 9 + j ]
  }
  outText += "\n"
}

Editor.InsText( outText );

```

# 実用

数独の問題の数字を入力し、以下のように文字列選択する。

(コードを見ればわかるが、parseIntで0に変換される文字列なら"?"じゃなく、"_"とかでも良い。)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28988/02a849a7-ccb2-09f6-2119-9cb77dc11254.png)


マクロ実行。(「共通設定」→「マクロ」から登録でも良い)

**変な入力でマクロが暴走しても責任持てないので実行は自己責任で**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28988/68fd6623-6f22-6c27-bc09-05c8bf502332.png)

10秒ぐらい掛かるので待つ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/28988/8545594f-3124-9a18-99ad-cbf4a2fd7b65.png)

自動で問題が解ける。

なお、アルゴリズム上、入力ミスとかで複数の解があるような入力をすると最初に見つけた解が出る。
rails Basic認証

作成しているアプリケーションでbasic認証を使ってたので、備忘録として記載

##gemのinstall
gemfileに下記を追加

```
gem 'dotenv-rails'
```

追加したら、bundle installを行う

##環境変数の追加
gemfileやappなどがあるディレクトリに.envファイルを作成

```.env

BASIC_AUTH_USER='user名'
BASIC_AUTH_PASSWORD='password'
```

##controllerの設定

```controller.rb
before_action :basic_auth

	private
	def basic_auth
		authenticate_or_request_with_http_basic do |username, password|
			username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"]
		end
	end
```

##確認
以上のことが終了したらrails sで起動すると、下記のような認証を求めるものが出てくる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/309490/40f1111a-9dc0-39d9-bf0b-9e10d828c523.png)
Laravelのhas()で詰まった

# はじめに
ログインしている user に、 group とのリレーションが存在するか確認したい。
`$user->has('groups')->exists()` でうまく動くかと思ったが期待する挙動ではなかった。
has()の挙動がよくわからない。どのような場合に自分が期待する挙動になるのか調べてみた。

# ERD
[![alt](http://www.plantuml.com/plantuml/png/SoWkIImgAStDuSh8J4bLICqjAAbKo4tDJKejAkPApIl917ALIek1F2M5QYu58D3EJE6gXKkb5-MN5c388RJ5WnN0vS529Ob9EQdncIaG8R02g1XOUrv-IQf2JcfQYPN2anrhNqwR_BYvxN7pdiVDqnuthuORNf1VN89iBvY668ym2kPoXTeQNTty6XGdSS7SZaqIeRC695aDiu_B8JKl1HXQ0000)](http://www.plantuml.com/plantuml/uml/SoWkIImgAStDuSh8J4bLICqjAAbKo4tDJKejAkPApIl917ALIek1F2M5QYu58D3EJE6gXKkb5-MN5c388RJ5WnN0vS529Ob9EQdncIaG8R02g1XOUrv-IQf2JcfQYPN2anrhNqwR_BYvxN7pdiVDqnuthuORNf1VN89iBvY668ym2kPoXTeQNTty6XGdSS7SZaqIeRC695aDiu_B8JKl1HXQ0000)

# 試したこと
#### 1. Modelからhasメソッドを呼び出す
`\Auth::user()->has('groups')->exists()`
前述した通り、期待する挙動をしない。
sqlを確認すると、Auth::user()のidを考慮していない。
そのため、いずれかのuserレコードにgroupsとのリレーションが存在すればtrueを返してしまう。

```sql
select exists(
    select * from `users` where exists (
        select * from `groups` inner join `user_group` on `groups`.`id` = `user_group`.`group_table_id` 
        where `users`.`id` = `user_group`.`user_table_id`
    )
) as `exists`
```

#### 2. 中間テーブルを使用しないリレーションで試す
`\Auth::user()->has('gmbLocations')->exists();`
期待する挙動をしない。
1と同様にModelからhasメソッドを呼び出す。
中間テーブルを挟んでいるのがよくないのかと思って試してみたが1と同じくAuth::user()のidが考慮されない。

```sql
select exists(
    select * from `users` where exists (
        select * from `posts`
        where `users`.`id` = `posts`.`user_table_id`
    )
) as `exists`
```

#### 3. QueryBuilderからhas()メソッドを呼び出す
`UserModel::where('id', \Auth::id())->has('groups')->exists()`
期待通りの挙動をする。
sqlは1にAuth::user()のidを考慮するための `where users.id = ?` を追加したものになっている。
Modelのhas()とQueryBuilderのhas()では挙動が異なっていそう。

```sql
select exists(
    select * from `users` where `users`.`id` = ? and exists (
        select * from `groups` inner join `user_group` on `groups`.`id` = `user_group`.`group_table_id` 
        where `users`.`id` = `user_group`.`user_table_id`
    )
) as `exists`
```

#### 4. hasメソッドを使わずにリレーションメソッドを利用する
`\Auth::user()->groups()->exists()`
期待通りの挙動をする。
コードもsqlもシンプルでわかりやすい。

```sql
select exists(
    select * from `groups` inner join `user_group` on `groups`.`id` = `user_group`.`group_table_id` 
    where `user_group`.`user_table_id` = ?
) as `exists`
```

# まとめ
- QueryBuilderとModelのhas()は挙動が異なるよう
- Modelにリレーションが存在するか確かめるには`Model->relationTable()->exists()`
- QueryBuilderにリレーションが存在するか確かめるには`Builder->has('relationTable')->exists()`
Pumaって結局何？

# きっかけ
RailsでWEBアプリケーションを開発してリリースする際、PumaやUnicornを使ってNginxやらApachと組み合わせればいいということは調べてわかったけど、結局こういったコンポーネントはどういった役割を持っているのかはっきりわかっていなかったので、調べてみることにした

# ウェブサーバー/アプリケーションサーバー
## PumaやNginxは結局何なのか
まず、PumaとNginxが具体的にどういったものかという点について。Pumaはアプリケーションサーバー(app server)、Nginxはウェブサーバーといわれます。
### アプリケーションサーバー
アプリケーションサーバーは実際に開発したアプリケーションを実行するソフトウェアです。基本的にはウェブサーバーからのリクエストを受け取りそれに対しレスポンスを返す働きをします。このとき、アプリケーションサーバーのみによってアプリケーションを動かすことも原理的には可能です。development環境で実行するときにはこのアプリケーションサーバーのみによって実行していることになります。

### ウェブサーバー
ウェブサーバーはウェブサイトに対するリクエストに対する何らかの処理を行う働きをします。Railsを運用するときは、リクエストをアプリケーションサーバーに伝え、そのレスポンスをリクエストを送ってきたユーザーに返します。ただしウェブサーバーもそれ自身で動かないということはなく、静的なファイルを表示するだけであればウェブサーバーだけでも可能ですし、その方が表示速度が速くなります。また、SSL通信(httpsというプロトコルを用いて通信するとき)やリバースプロキシを用いる際にも必要になってくるソフトウェアです。

## 全体の流れ
最終的にどういうことかというと、ユーザからウェブサイトにリクエストが送られたとき、まずウェブサーバーがそのリクエストに応じてアプリケーションサーバーに対してこういうリクエストが来たよーと伝えます。このときに様々な処理をすることによってリクエストに対する処理を最適化することができるわけです。そしてアプリケーションサーバーが実際に処理を行ったものをウェブサーバーに伝え、それをウェブサーバーがユーザーに返すことによってユーザーの画面にウェブサイトが表示されるのでした。

# 参考リンク
https://www.justinweiss.com/articles/a-web-server-vs-an-app-server/
【VSCode導入】VSCodeの魅力と最低限すべき拡張・設定

今までエディタはAtomを使っていたのですが、最近よく聞くVSCodeを使ってみたら、
かなり使い勝手がよかったので、もしまだ使ったことない人へ向けに良さを発信したいと思います。

[VSCodeインストール（Mac向け）](https://code.visualstudio.com/)


#1.Visual Studio Code (VSCode)がオススメの理由

理由は2つ。

**①エディタの中で速度が早い点**
起動時間や、大量の文字列置換などが早いです。

|**検証内容**    | *Atom* | *VSCode* |
|----------|-------|-----|
|**起動時間**  | 2.84 | 1.96 |
※単位は全て秒
[参照記事](https://ryuta46.com/379)

**②プラグインがたくさんあり、カスタマイズの幅が広い**

これは、次の見出しで解説していきます。

#2.ターミナルからVSCodeを起動するやり方

1.Cmd + Shift + P でコマンドパレット開く。
2.Shellと検索する
3.インストールする

<img width="1274" alt="スクリーンショット 2019-03-05 20.30.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/196382/eb643597-4150-7eda-2665-8deb7127f761.png">

#3.オススメの拡張機能

拡張機能は、この左にあるボタンをクリックして１つずつinstallしてください。
Show Popular Extensionsは人気な拡張機能のリストが表示されます。

<img width="563" alt="pic.png" src="https://qiita-image-store.s3.amazonaws.com/0/196382/b8c1640f-df64-a89b-5075-173e7413bc6c.png">

こちらの記事が.gif付きでわかりやすかったので参照させてもらいます。
[参照記事](https://qiita.com/sensuikan1973/items/74cf5383c02dbcd82234#%E8%A8%AD%E5%AE%9A%E3%81%AA%E3%81%A9%E3%81%AEtips)

その中で個人的に入れるべきというものを記述しておきます。
もし、リンク飛ぶのが面倒だったら、こちらの文字をコピーして拡張機能を導入してください。
1. vscode-icons
2. GitLens
4. Git History
5. Bracket Pair Colorizer
8. Bookmarks
11. Japanese Language Pack
12. Path Autocomplete
13. Rainbow CSV
15. Duplicate action
16. GitHub Pull Requests
19. Output Colorizer
22. Trailing Spaces
23. Regex Previewer

そのほか、個人的にオススメの拡張機能
・Color Highlight
・Auto Rename Tag
・Auto Close Tag
・Fresh Dark Theme (Codeが見やすいように色をつけてくれる。)

#4.おすすめのショートカットキー
cmd + 「,」 =>　設定
cmd opt → / ←　=>　ファイルを=右や左に移動する。

#5.備考
その他、オススメがあったら随時共有します。

[公式ドキュメント](https://code.visualstudio.com/docs)
PWA: Workbox Precaching 和訳 (その１)

# プリキャッシング

参照元ページ: https://developers.google.com/web/tools/workbox/modules/workbox-precaching

## プリキャッシングとは何か？

サービスワーカーには、ファイル一式をキャッシュに保存する機能があります。サービスワーカーが実際に使われる前(インストール時)にコンテンツをキャッシュすることから、この機能は「プリキャッシング」と呼ばれます。(補足: ここで重要なのは***インストール時***です。install時のキャッシュはプリキャッシュ、fetch時のキャッシュはランタイムキャッシュと呼ばれます)


プリキャッシングによって、ディベロッパーはキャッシュをコントロールできます。つまり、ファイルのキャッシュ有効期間の設定や非ネットワーク経由からファイルを提供することを可能にします。これによりオフラインで動くウェブアプリを作ることができます。(補足: オフラインで最低限必要なファイル、htmlやフォールバック画像やページの見た目を担保するcssやjsファイルをプリキャッシュするのが一つの使い方としてありそうです。)

WorkboxはAPIを簡易化し、ファイル一式のダウンロードを効率的に行えるようにすることで、手間のかかるプリキャッシングの設定をよしなに行なってくれます。


## workbox-precachingの仕組み

ウェブアプリケーションが初めて読み込まれた時、`workbox-precaching`はあなたが読み込みたいすべてのファイルを見にいきます。関連するサービスワーカーイベントを発火し、ファイルを重複なくダウンロードそして保存し、変更情報をIndexedDBのリビジョン*に保存します。

*補足1: リビジョンとはキャッシュされたファイル各々に紐づけられたバージョン（状態の単位）のようなものです。

*補足2: プリキャッシュの情報は配列で管理されます。

<br>

あるユーザーがあなたのサイトに再訪問し、サービスワーカーとプリキャッシュされたファイル一式が前回訪問時から異なっている場合を考えてみます。このとき`workbox-precaching`は新しいプリキャッシュの配列（リスト）を見て、`revision`と照らし合わせながらどのファイルが新しいもの、更新されたものかを判断します。サービスワーカーのインストール時にキャッシュファイルは更新され、IndexedDBに新しいrevisionが記録されます。

---
*補足
プリキャッシュの流れ

*1. サービスワーカーがプリキャッシュに指定されているリストを見にいく*

```js

[
	{
		url: '/css/styles.css',
		revision: '12345678'
	},
	{
		url: '/js/script.js',
		revision: '23456789'
	},
	{
		url: '/img/image.jpg',
		revision: '34567890'
	}
]

```

*2. IndexedDB内の情報を見にいく。revisionが変更されているか見にいく*

```js

[
	{
		url: '/css/styles.css',
		revision: '45678901' // revisionの値が変わっているので、ネットワークからダウンロードする
	},
	{
		url: '/js/script.js',
		revision: '56789012' // revisionの値が変わっているので、ネットワークからダウンロードする
    },
	{
		url: '/img/image.jpg',
		revision: '34567890' // 変更がない 
	},
	{
		url: '/img/image2.jpg',
		revision: '67890123' // このファイルは存在しないので削除
	}
]

```

実際にDevtoolのApplicationタブでIndexedDBを見るとこのような感じでキャッシュ情報が保存されているのがわかります。

![Screen-Shot-2019-03-05-at-8.24.19-PM.png](https://qiita-image-store.s3.amazonaws.com/0/230009/02842990-7d92-86d5-99d7-b6ceed849276.png)


// 補足ここまで

-

新しいサービスワーカーはactivateイベントがトリガーされ、activated（日本語厳しくなってきたのでここは英語にします）状態になるまで利用されることはありません。activateイベント中に`workbox-precaching`は古いキャッシュファイルを見にいき、キャッシュとIndexedDBから削除します。
Sass　map eachを使って色を指定する

以外と知らない人が多そうなので出力します。
各要素に応じて色を定義している場合があると思います。
例えば信号の状態を表現する以下のようなcssがあります。

``` .scss

.signal-stop {
  color: #dd0000;
}

.signal-caution {
  color: #f4e542;
}

.signal-go {
  color: #5ce053;
}

```

これをmapを使うと以下のように記述することができます。

``` .scss
$map: (stop: #dd0000, caution: #f4e542, go: #5ce053);

@each $state, $color in $map {
    signal-#{$state} {
        color: $color;
    }
}

```

例えば、これに信号が停電するような場合を追加する場合は

``` .scss
$map: (stop: #dd0000, caution: #f4e542, go: #5ce053, blackout: #000000 );
```

とすれば済みそうです。実際のコードでは状態が８つあったので大分スッキリさせることができました。

https://sass-lang.com/documentation/file.SASS_REFERENCE.html#each-multi-assign
https://sass-lang.com/documentation/file.SASS_REFERENCE.html#lists
https://www.sassmeister.com/
Flowで困ったことを書き連ねていく

MS Flowを使っていくうえで困ったことを書いていきます。
困り事があったときにこの記事を覚えていたら更新します。

間違った記載があればご指摘おねがいします。m(_ _)m

# 関数（式）周り

### 「動的なコンテンツの追加」で式を入力→更新するときにうまく反映されないんだけど？
動的なコンテンツの追加で式の更新をするとちゃんと反映されていない事がよくありました。
そういうときは、式の更新後、入力フォームからフォーカスを外したうえで「OK」をクリックするようにしましょう。
じゃないと反映されないみたいです。

---

### 式の入力で動的な値を指定したい
Apply to eachの「現在のアイテム」のような動的なコンテンツを扱うときは、

```text
items('ループ名')
```
ではなく、

```text
@items('ループ名')
```
のように頭に`@`をつけるみたいです。
もしくは自分で入れずに、GUIで選択してから式を編集すれば良いかもです。

---

### flowのアクション名に含まれるブランクは`_`に置き換える
例えば、Apply to eachのアクションを追加するとデフォルトで、

```text
Apply to each
```

という名前がつけられますが、式でこのような名前を扱うときは

```text
Apply_to_each
```

のように、ブランクをアンダースコアに置き換える必要があります。
でないと、正しくそのアクションを認識してくれません。（知らなくてかなりハマった）

ex.
NG ： `items('Apply to each')`
OK ： `items('Apply_to_each')`

---

### JSONオブジェクトを生成する際、パラメータに変数の値を使いたい
json() 関数に文字列（ex. ```'{"hoge":"hoge"}'```）を渡すと、JSONオブジェクトとして返してくれます。
このパラメータに事前に格納しておいた変数値を利用したいときは値の渡し方に少し注意する必要があります。

変数の値を返せればいいので、```variables()```で変数値を引っ張ってこればいいじゃんと思い、以下のようにしてみましたがダメでした。（式が不正です。的な感じで怒られる）

```text
json('{"Name":variables('varName'),"Id":variables('varId')}')
```

json() はあくまでも**文字列**を受け取るので明示的にキャスト＋結合して返してあげる必要があるみたいです。

```text
json(concat('{"Name":"',string(variables('varName')),'","Id":"',string(variables('varId')),'"}'))
```
もともとString型の変数の場合はキャストは要らないかもしれないです。
M-Pesa概要

主にケニアで使われている決済手段「[M-Pesa](https://www.mpesa.in/portal/)」(エムペサ)の概要。

- ケニアの[サファリコム社](https://www.safaricom.co.ke/)が提供
- 銀行口座が無くても送金できる
- [2018年にPayPalと連携できるようになった](https://forbesjapan.com/articles/detail/24167)
- キャリア決済サービスの一つぽい。携帯電話のキャリア会社を経由して行う。
- まず本人確認の後で、現金を携帯電話にチャージ(預け入れ手数料が0.14$かかる)
- 送金には、USSD?を送る？/送金相手の携帯電話番号と金額を、送金サーバに？送る。
- 受け取りは、サファリコムの窓口や代理店で行う(引き出し手数料が0.21$かかる)。金額、取扱店番号、暗証番号を(店の？)画面で入力し、身分確認をすると、現金を受け取れる。(携帯電話に直接チャージはできない？)
- 専用メニュー？から操作する。インタフェースがあるぽい。
- 電気代や学費の支払いもできる
- 決済や貸付といった金融サービスもある
[小ネタ] railsでサーバー接続時にエラーが発生する

完全に小ネタです!
ただ、経験したことある方もいるかと思います。
結論から言うとパスには気を付けましょうということですね。はい....

####今回起こった事象####

cloud9でGithubからクローンしたリポジトリで開発を行おうとしていました。
とりあえずクローンしてサーバーに接続してみようと思うと下記エラーが発生しました

```
aws-test:~/clone_article $ rails server -b 0.0.0.0
Usage:
  rails new APP_PATH [options]

Options:
      [--skip-namespace], [--no-skip-namespace]            # Skip namespace (affects only isolated applications)
  -r, [--ruby=PATH]                                        # Path to the Ruby binary of your choice
                                                           # Default: /usr/local/rvm/rubies/ruby-2.4.1/bin/ruby
  -m, [--template=TEMPLATE]                                # Path to some application template (can be a filesystem path or URL)
  -d, [--database=DATABASE]                                # Preconfigure for selected database (options: mysql/postgresql/sqlite3/oracle/frontbase/ibm_db/sqlserver/jdbcmysql/jdbcsqlite3/jdbcpostgresql/jdbc)
                                                           # Default: sqlite3
      [--skip-yarn], [--no-skip-yarn]                      # Don't use Yarn for managing JavaScript dependencies
      [--skip-gemfile], [--no-skip-gemfile]                # Don't create a Gemfile
  -G, [--skip-git], [--no-skip-git]                        # Skip .gitignore file
      [--skip-keeps], [--no-skip-keeps]                    # Skip source control .keep files
  -M, [--skip-action-mailer], [--no-skip-action-mailer]    # Skip Action Mailer files
  -O, [--skip-active-record], [--no-skip-active-record]    # Skip Active Record files
      [--skip-active-storage], [--no-skip-active-storage]  # Skip Active Storage files
  -P, [--skip-puma], [--no-skip-puma]                      # Skip Puma related files
  -C, [--skip-action-cable], [--no-skip-action-cable]      # Skip Action Cable files.....
```

rails new APP_PATH [options]を初めて見たときは何だこれと思い、少し焦りました。
2、3回試し、同じエラーが発生したので、やり方が悪いのかと思い、少し調べました。

####原因####

今いるディレクトリーが Rails アプリのルートディレクトリーでないことが原因でした。
clone_article配下にrails-articleRecord/ があり、そこがRails アプリのルートディレクトリーでした。
ディレクトリを移動させるとうまくいきました。

```
aws-test:~/clone_article $ cd rails-record/
aws-test:~/clone_article/rails-record (master) $ rails server -b 0.0.0.0
=> Booting Puma
=> Rails 5.2.2 application starting in development 
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.0 (ruby 2.4.1-p111), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:8080
Use Ctrl-C to stop
```

パス間違いはRailsに限らず、起こりえることなので、よく確認してみると、エラーを確認する時間を短縮できるかもしれません。
SwiftからPHPへファイルをPOSTする

## iOS側のコード
```swift
//アップロードしたいファイルのパスを取得
let path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("test").appendingPathExtension("csv")

var req = URLRequest(url: URL(string: "http://{ホストのアドレス}/upload.php")!)
req.httpMethod = "POST"
URLSession.shared.uploadTask(with: req, fromFile: path) { (data, res, err) in
     print(data, res, err)
}.resume()
```

## PHP側のコード
```php
<?php
    date_default_timezone_set('Asia/Tokyo'); //タイムゾーンを設定する
    $date = date("YmdHis");   //時刻の取得
    $file = file_get_contents("php://input");  //RequestのBodyを取得
    $fileName = "./${date}.csv";  //保存する名前を取得
    file_put_contents($fileName,$file);  //保存
?>
```
Swift、PHPともにエラーハンドリングなどは全て省略されていますのでプロダクションとして使う場合はもう少し手を加えてあげる必要がありますのでご注意を！！
初めて使ったSQLiteで躓いたこと

#ことの始まり
今現在自身が公開していたサービスの再開発をしており、Laravel+Vue+Vuerouterでやっているのですが、開発の途中でテストを行ったところ躓きました。

#躓いた箇所
APIの作成をして`artisan`でテストをしたところ以下のようなエラーが出ました

```console:console
$ ./vendor/bin/phpunit --testdox
PHPUnit 7.5.6 by Sebastian Bergmann and contributors.

Unit\Example
 ✔ Basic test

Feature\Example
 ✔ Basic test

Feature\RegisterApi
 ✘ Should 新しいユーザーを作成して返却する
/*中略*/
 Caused by
   │ PDOException: could not find driver
/*中略*/
ERRORS!
Tests: 3, Assertions: 2, Errors: 1.
```

ん？
ドライバが入ってない・・・
そりゃ初めてSQLiteを使ったんで入ってないですよね(^_^;)
ずっとMySQLを使っていて久しぶりに新しいDBMSを入れたので失念していました。

#解決法
ドライバを入れましょう！

```console:console
$ sudo apt install php-pdo-sqlite // SQLiteのPDOドライバをインストール
```
TypeScriptでDate型に曜日を返すメソッドを追加した with GAS



## 概要

clasp使ってGASをtsで書いていたのですが、Date型に日本語の曜日を返却するメソッドがなかったので、拡張メソッド(厳密にはモンキーパッチ)で実装してみました

## そもそも拡張メソッド(モンキーパッチ)とは？

拡張メソッドはC#、Swift、Kotlinなどで使える、既存のクラスのメソッドを拡張する機能です。内部的にはstaticメソッドとしてコンパイルされます。

モンキーパッチも既存のクラスのメソッドを拡張するという意味では変わりませんが、クラス(jsの場合はprototype)に直接メソッドを追加している点が違います。

- [モンキーパッチ - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%82%AD%E3%83%BC%E3%83%91%E3%83%83%E3%83%81)

[Effective JavaScript](https://www.amazon.co.jp/Effective-JavaScript-David-Herman/dp/4798131113)にやみくもなモンキーパッチを避けると書いてあったので使うのを避けていましたが、今回はほぼ趣味で書いてるようなもんだし規模が小さいし別にいいかな…って思ったので実装してみました



## 実装

```ts
type Week = "日" | "月" | "火" | "水" | "木" | "金" | "土"

const WEEKS: Array<Week> = ["日", "月", "火", "水", "木", "金", "土"]

interface Date {
  getWeek(): Week
}

Date.prototype.getWeek = function() {
  return WEEKS[this.getDay()]
}

```



jsならば以下で動きます

```js
const WEEKS = ["日", "月", "火", "水", "木", "金", "土"]

Date.prototype.getWeek = function() {
  return WEEKS[this.getDay()]
}
```

## 解説

以下のように、既存のクラスをinterfaceとして書くことで、クラスにメソッドの情報を登録することができます。

```ts

interface Date {
  getWeek(): Week
}
```

ただしこの状態だとjsとしての実装がないため、`Date.prototype`に`getWeek`を代入してやります。

```ts
type Week = "日" | "月" | "火" | "水" | "木" | "金" | "土"

const WEEKS: Array<Week> = ["日", "月", "火", "水", "木", "金", "土"]

Date.prototype.getWeek = function() {
  return WEEKS[this.getDay()]
}
```

これでスプレッドシートのGAS書くときに多少は楽できるかなーって思います

## 余談

てかGASでもモンキーパッチできるんだね🤔
半年間自動テストを利用して開発してみた感想

# はじめに

以前自動テストの記事（[自動テストの意義について考える](https://qiita.com/tmpyn/items/d43d54369af786445849)）を投稿しました。
それから半年以上、自動テストを利用した開発を進めてきたため、今、どう思っているのかについて書いてみようと思います。

# 自動テストは必要か否か

自信を持って必要だと言い切ることができると感じています。
失うことより得ることが圧倒的に多いと感じているため、特にプロジェクトのスタートアップ時期において自動テストを利用しないという選択肢を取ることはほぼないのではないかなと。
ただ、既に運用・保守を開始しているようなプロジェクトなど、一部のケースではそこまで有用ではない可能性もあると感じています。

## スタートアップ時期において有用と考える理由

1. 積極的にロジックの変更を行うことができる
2. 言語バージョンアップによる影響の検証を簡単に行うことができる

スタートアップ時期においては、特にプログラムや言語バージョンアップに対する変更リスクと戦っていくことになると考えています。
いかに柔軟に変更可能であるか、言語バージョンアップによる影響を簡単に把握できるか、という部分が最終的な開発スピードに大きく影響を及ぼしてくる。
自動テストを書いておくだけで、これらの影響の把握が簡単に行えるということは、非常に大きなメリットであると考えています。

## 運用・保守を開始しているサービスにおいて有用でない可能性がある理由

1. 変更が入る可能性が低い部分に対してかけるコスト

運用・保守を開始しているサービスにおいては、上記のコストをどうみるか？が非常に重要になってくると思います。
サービスの８割の機能に変更が入らないものについて、すべての機能に対する自動テストを書く必要があるのか？という点においては、今後のサービスの展開などを考えて慎重に判断したほうが良いと思います。
`変更が多い箇所のみに絞ってテストを記載する`という方法もあると思うので、まずは`なんのために自動テストを書くのか？`という部分をしっかり意識しながら行うと良いかなと。
もちろん、時間をかけて全機能に対するテストを書く価値があると判断できるのであれば、書くに越したことはないと考えてます。

# おわりに

思っていた以上に、自動テストによる恩恵は大きく、個人的にはもう自動テストを書かないという選択肢はないぐらいになっています。
どのレベルまでテストを書くのか？など、まだまだ課題は多くあるので、そのあたりに関しては今後も模索していければと思っています。
Docker イメージから Singularity のイメージを作るときに、気をつけること

# 概要

（最新のSingularityでは、いけるのかもしれないが）

既存のdockerイメージから、[Singularity Documentation - Sylabs.io](https://www.sylabs.io/docs/)  のイメージを作るときに気をつけること

# 結論

## docker save ではダメで、 docker export

以下のコマンドから作ってはダメなようで、

```
docker save YOURCONTAINER > with_save.tar
```

きちんと export しないといけないようだ

```
docker create --name for_export YOURCONTAINER
docker export for_export > for_export.tar
```

## Docker Private Registry をつかう

その他の方法としては、 Docker の private registry を使う方法があるようだ。



# 参考情報

## 本家がそろそろ移動するようです (2019-03-05)

[Singularity](https://singularity.lbl.gov/)
は、以下のサイトに移動するとのこと
[Singularity Documentation - Sylabs.io](https://www.sylabs.io/docs/) 



## 本家での議論

[why is a valid Docker image not good for Singularity? · Issue #429 · sylabs/singularity](https://github.com/sylabs/singularity/issues/429) 

## docker save と docker export の違い

[Dockerでsaveとexportを使用した環境のバックアップと再作成 - YoshinoriN's Memento](https://yoshinorin.net/2017/07/04/docker-save-load-export-import/)
（個人的に）よく使うLinq拡張

# 概要

よく使うLinq拡張をまとめました

https://github.com/kuroshio-ice/Linq.Expansion

# コード

## Index付きforeach

```csharp
var hoge = new List<int>() { 1, 3, 5 };
foreach (var (index, value) in hoge.WithIndex())
{
    Console.WriteLine($"index: {index}, value: {value}");
}
```

```:結果
index: 0, value: 1
index: 1, value: 3
index: 2, value: 5
```

## 項目の文字列結合

```csharp
var hoge = new List<int>() { 1, 3, 5 };
var str1 = hoge.JoinString(":");
Console.WriteLine($"str1: {str1}")
var str2 = hoge.JoinComma();
Console.WriteLine($"str2: {str2}")
```

```:結果
str1: 1:3:5
str2: 1,3,5
```

## 要素分割foreach

```csharp
var hoge = new List<int>() { 1, 3, 5 };
foreach (var h in hoge.Chunk(2))
{
    Console.WriteLine($"hoge: {h.JoinComma()}");
}
```

```:結果
hoge: 1,3
hoge: 5
```

## 要素のランダム取得

```csharp
var hoge = new List<int>() { 1, 3, 5 };
var rand = new Random();
var h = hoge.Sample(rand);
Console.WriteLine($"h: {h}");
```

```:結果例
h: 5
```
CIDetectorでAmazonPrimeのドキュメンタルを正確に判定する

#はじめに
こんにちは、drama(@1901drama)です！

Amazon Prime Videoの [ドキュメンタル](https://www.amazon.co.jp/dp/B01N677USQ/ref=dvm_jp_pv_sl_go_004_023_315795494626_mk_HRriSPQq-dc_sd_&tag=pv-ps-gdni-pv-004_22) が好きなのですが、
シーズン1から「フジモンの判定甘いんじゃないか」問題が評価を下げる要因として話されています。。。

場回し的な人がいないと展開が少なくなったりしますし、ある程度仕方ないかな とは思うのですが、
 **そもそも 本当に笑っているのでしょうか？　** この問題をARで解決しました。


# 出来たもの
**DOCU-JUDGE**
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Documental HELP その1 <a href="https://t.co/C5NppqChsm">pic.twitter.com/C5NppqChsm</a></p>&mdash; drama(ARエンジニア) (@1901drama) <a href="https://twitter.com/1901drama/status/1102872920144064513?ref_src=twsrc%5Etfw">2019年3月5日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

・カメラ画像から顔検出をする
・笑顔かどうかを判定する
・笑ってたらアウトにする（顔をドキュメンタルのロゴに変える/画面のふちに赤っぽいフレームを追加する）
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Documental HELP その2 <a href="https://t.co/q3UKT4qxbB">pic.twitter.com/q3UKT4qxbB</a></p>&mdash; drama(ARエンジニア) (@1901drama) <a href="https://twitter.com/1901drama/status/1102873095331704832?ref_src=twsrc%5Etfw">2019年3月5日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

これでどこでもドキュメンタルが出来ます。
やってみてわかったのですが、他の人も結構笑顔判定されます。
※1/30 フレーム単位なのでジャッジは厳しめです。

# 仕様
**以下の流れでドキュメンタルをしています。**

１．カメラで取得した動画リアルタイムで、バッファに入れます。
２．バッファに入った動画を、フレーム(1/30)単位で画像に変換します。
３．画像ごとに顔検出を行います。
４．顔検出された場合、顔の特徴点から笑顔か否かを判定します。
５．笑顔と判定された場合、顔の位置と大きさを、描写用のコントローラに受け渡します。
６．定められた位置と顔の大きさのアウトマークを画面に追加（表示）します。
７．0.1秒後に追加したアウトマークを削除します。
８．上記１～７をループ

▼因みに、顔検出＆笑顔判定はとても簡単でした。

```swift  
//顔検出
let detector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: [CIDetectorAccuracy: CIDetectorAccuracyHigh])

// 取得するパラメーター（笑顔判定）を指定する
let options = [CIDetectorSmile : true]
// 画像からパラメーター（笑顔判定）を抽出する ※ciimage = フレーム単位で取得した画像
let features = detector.featuresInImage(ciImage, options: options)
```



そして、それ以上に驚いたのが、
![documental-cpu.jpg](https://qiita-image-store.s3.amazonaws.com/0/222377/e5501cf1-91ce-ee07-8c63-cf91ab8afa7b.jpeg)
CPU使用率がすごい。
デバイスがiPhone SEというのもありますが、検出精度をlowにしていても、基本100%以上でした。
これを6時間見続ける審査員って相当疲れるんだろうなっと思いました。


# 難しかった点
**１．ARAnchor->画面位置への変換**
当初は遠近を把握する為に、[ARFaceAnchor](https://developer.apple.com/documentation/arkit/arfaceanchor)を利用して顔判別をしようと思ってました。

```swift
class ARFaceAnchor : ARAnchor
```
しかしフレーム単位では処理が重過ぎたので、アウトマークの画像サイズと場所を高速で更新する方法に変えました。
因みにiPhoneX以上の機種であればARKit2の顔に自動でマスクをつける機能が使えます。
顔を猫に変えるとか、アウトマーク以外の追加であれば、その方が簡単に導入出来ると思います。

>参考：[Creating Face-Based AR Experiences](https://developer.apple.com/documentation/arkit/creating_face-based_ar_experiences)

**２．カメラの向き（横か縦）を、cgimageに引継げない。**
UIimageは、撮影時のデバイス向きを保持しているのですが、
動画から取り出したimageの cgimage は、向き情報を持ってなかったです。
顔検出や笑顔判定には向き情報が必要な為、ここを解決出来ず縦でしか使え無いアプリとなってしまいました...。

一般的には画面の向きも 別変数で取得して一緒に利用しているのでしょうか？
このあたりご存知の方いれば教えて欲しいです。


# まとめ
ドキュメンタルの結論
**「笑ってるけど、皆 まあまあ 笑ってる」**　でした。なので楽しく見ましょう。

ここまで読んで頂きありがとうございました！

>動画：[ドキュメンタル シーズン5](https://www.amazon.co.jp/dp/B01N677USQ/ref=dvm_jp_pv_sl_go_004_023_315795494626_mk_HRriSPQq-dc_sd_&tag=pv-ps-gdni-pv-004_22)
>引用中の動画は他のものに置き換えるかも知れません
rubyでのハッシュと配列の違いについて

#ハッシュと配列の違いは確実に理解しよう！
ハッシュと配列は非常に形が似ていて、なおかつよく使うものなのでしっかりと覚えておきましょう！
##ハッシュとは
ハッシュはキーとバリューがセットで格納できるのが特徴です。
また複数オブジェクト格納することができます。

```
hash{}
・hashの表記
Items={"キー":"バリュー",....}
・呼び出し方
puts Items
--Itemsに格納されているキーとバリューの両方がセットで出力される。
puts Items[:キー]
--指定したキーとセットのバリューが出力される
```


##配列とは
ハッシュと似ていて、複数のオブジェクトを格納することができる。
しかし、ハッシュのようにキーとバリューといった関係性はないので理解はしやすい。

```
hairetu = []
・配列の表記
hairetu=["a""b""c""d"]
・呼び出し方
hairetu[0]-"a"が出力される。
hairetu[1]-"b"が出力される。

配列を呼び出すときはインデックスという番号を使って呼び出します。
ちなみに、始まりは必ず0スタート。
```
自分が欲しかった、コードの処理時間を調べるVBAのテンプレート



```VBA:テンプレート
Sub 印刷用()
’目的のコードが正常に動作することを確認したらすぐ下の行を非コメントブロック
'Application.ScreenUpdating = False

Dim a, b As Double
Application.DisplayAlerts = False
    a = Timer

'目的のコードを開始

'目的のコードを終了
    b = Timer
    
    Debug.Print b - a
    
End Sub

```
scpコマンドでファイルをリモートから取る際に詰まった際の解決策

##状況
本番のDBサーバーから必要データをcsvファイルに抽出後、ローカルにファイルを持ってくるのに詰まりました。
(mysqlにてデータをcsvに抽出する方法は参考記事にて記載。)

### 【サーバー構成】
◆本番DBサーバー (CSVファイルはここにあります)

　　↑ SSH

◆踏み台サーバー

　　↑ SSH

◆ローカル (ここまで移動させたい）

今回は

 1. 本番DBから踏み台サーバー
 2. 踏み台サーバーからローカルサーバー

の2ステップで移動させています。

##エラー内容など

下記のコマンドを本番DBサーバーにて行っていたのですが、
ひたすらpermission denied(puclickey)で弾かれていました。

```
// ssh ユーザー名@ホスト名:ファイルパス(移動元) ユーザー名@ホスト名:ファイルパス(移動先)
ssh ec2-user@xx.xxx.xxxxxx:/tmp/hogehoge.csv ec2-user@xx.xxx.xxx.xxx:/tmp/
Permission denied (publickey).
```

##試したこと
・該当ファイルおよびディレクトリーのpermissionやユーザー設定変更
→効果はいまひとつのようだ...

##解決策
https://qiita.com/shuuhei/items/e435762017c11f71d07d
上記の記事を読んで、scpコマンドの実行場所がおかしかったことが判明

```
// 移動先のサーバー(今回だと踏み台サーバー)にて実行
// scp 本番サーバーの情報:ファイルパス 移動先のディレクトリパス(/がないとうまく通らない)
scp ec2-user@xx.xxx.xxxxxx:/tmp/hogehoge.csv /tmp/
```

##本筋ではないが詰まったところ
・サーバーの情報は~/.sshのconfigにて短縮名を設定している場合、短縮名を使うと成功した
(今回だとローカルサーバー)

```
【例】
scp サーバーの短縮名:ファイルパス 移動先のディレクトリパス
```
・ec2で、プライベートIPでの接続が指定されている場合、ホスト名はプライベートIPを使用する(今回だと本番DBサーバーがそうでした)

```
【例】
scp ec2-user@ip-xx-x-x-xx:/hogeohoge.csv /tmp/
```

移動一つに結構時間がかかってしまったので、もっとスマートにしたいものですね。

##参考記事
[scpコマンドでファイル送る、とってくる](https://qiita.com/shuuhei/items/e435762017c11f71d07d)
[scpコマンド チートシート](https://qiita.com/rock619/items/2bbbe379ae0fdd2ae00f)
[MySQLのSELECT文でcsvを出力する](https://qiita.com/catatsuy/items/9fdf4423d5f4885b9bf9)
LISTAGG関数の戻り値がUNICODE文字列となる問題とその対応


OracleのLISTAGG関数の戻り値が、以下のように半角スペースが含まれるように見える文字列、あるいはUNICODE文字列（エンコーディングされた文字列）となる場合があります。

```
SELECT LISTAGG(HOGEFIELD, ',') WITHIN GROUP (ORDER BY HOGEFIELD)
FROM HOGETBL
WHERE HOGEGRPID = 1;
```

```
 山 田 , 佐 藤 , 田 中
```


## 原因
NVARCHAR2型のフィールドでLISTAGG関数を使用すると当該問題が発生します。
（LISTAGG関数の戻り値はVARCHAR2型であるため）


## 対応
LISTAGG関数の第1引数を次のようにセットし、AL16UTF16 -> UTF8へ文字コードを変換します。

```
SELECT LISTAGG(convert(HOGEFIELD,'UTF8', 'AL16UTF16'), ',') WITHIN GROUP (ORDER BY HOGEFIELD)
FROM HOGETBL
WHERE HOGEGRPID = 1;
```

## 参考
- listagg data to useable format?
 - https://stackoverflow.com/questions/28812445/listagg-data-to-useable-format
PHPのコード解析「Psalm」の使い方

本稿ではPHPのコード解析ツール[Psalm]\(サーム /sάːm/)について紹介する。

## 本稿の内容

本稿では次の内容を説明する。

* Psalmがしてくれること
* Psalmの導入手順
* Psalmの設定
* Psalmの実行方法

## Psalmがしてくれること

PsalmはPHPの静的コード解析(static code analysis)ツールで、PHPコードを解析して問題点をあぶり出してくれる。Psalmで発見できる問題は主に次のものがある:

* 廃止予定(deprecated)の関数、メソッド、クラスの利用。
* 配列キーの重複。
* 型の不整合。戻り値の型宣言と異なる型の`return`など。
* アクセスできないメンバ変数やメソッドへのアクセス。`private`や`@internal`など。

コンパイル型言語であれば、こうした解析はコンパイラの仕事だったりするが、PHPはスクリプト言語なのでコンパイラが存在しない。こうした開発ツールの欠如を補うのがPsalmの役割と考えられる。

Psalmで見つけた問題点はPsalterというツールで自動修正できるものもあるが、Psalterの説明は本稿では取り上げない。

なお、このツールはvimeoが作っている。

## Psalmの導入手順

PsalmはComposerでインストールする:

```
composer require --dev vimeo/psalm
```

インストールできたら設定ファイルpsalm.xmlを作るために初期化コマンドを実行する:

```
./vendor/bin/psalm --init src 3
```

srcは解析対象のコードがあるディレクトリ、3は設定レベル。1〜8の値を渡す。1は最も厳密な解析を行う。8は最もゆるい。

解析を実行する:

```
./vendor/bin/psalm
```

## Psalmの設定

Psalmはデフォルトの設定でもさまざまな問題を検出してくれるが、設定ファイル`psalm.xml`に設定を加えることで検査の厳密さを上げたり、振る舞いを変えたりすることができる。

### `<psalm />`の設定

#### totallyTyped

`totallyTyped`に`true`をセットすると、Psalmが型を推測できないコードをエラーとして扱うようになる。

```xml:psalm.xml
<psalm
  totallyTyped="true"
/>
```

#### strictBinaryOperands

文字列結合と数値の足し算を厳密にチェックする。つまり、文字列に対する`+`と、数値に対する`.`の使用をエラーとして扱うようになる。

```xml:psalm.xml
<psalm
  strictBinaryOperands="true"
>
```

#### allowPhpStormGenerics

PhpStormのために配列の型の情報をdocblockに`ArrayIterator|string[]`などと書くことがあるが、`allowPhpStormGenerics`を`true`にするとその情報を尊重するようになる。

```xml:psalm.xml
<psalm
  allowPhpStormGenerics="true"
>
```

## まとめ

本稿では、PHPのコード解析ツールについて紹介した。

* PsalmはPHPコードを解析して問題点をあぶり出す。
* 設定することでより厳格にチェックすることができる。

質問があればコメントください。

[Psalm]: https://psalm.dev
AWS CLIでDynamoDBのScanをやりたいが、ドキュメント読んでもよくわからない。

前々から思っているんだけど、AWSの日本語ドキュメントってわかりにくいよね…。
AWS CLIを利用してたDynamoDBのfilterexpressionの使い方探してたんだけど、これでわかるのかな。
> 次の AWS CLI の例では Thread テーブルをスキャンして、特定のユーザーによって最後に投稿された項目のみを返します。

```
aws dynamodb scan \
     --table-name Thread \
     --filter-expression "LastPostedBy = :name" \
     --expression-attribute-values '{":name":{"S":"User A"}}'
```
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Scan.html

こんなこと言われてもねえ。TBL定義もわかんないし、何が何やら。勿論、英語版読めばいいんだろうけど。
それでもパッと検索して出てくる英語版ページでわかるかといわれるとやっぱりわからない。

```
[root@~]$ aws dynamodb scan --table-name server \
{
    "Count": 20, 
    "Items": [
        {
            "ID": {
                "N": "1"
            }, 
            "ip_address": {
                "S": "192.168.1.2"
            }, 
            "start_time": {
                "S": "2018-12-14 01:20:37"
            }, 
            "server_type": {
                "S": "online"
            }
        }, 
(省略)
```

例えば、↑のようなTBLでserver_typeをベースにfilterかけたいということであれば、↓だよね。

```
[root@~]$ aws dynamodb scan --table-name server \
>     --filter-expression "server_type = :name" \
>      --expression-attribute-values '{":name":{"S":"online"}}'
```

`--filter-expression` で`server_type`を定義。
`:name`として、別名を割り当て、それを`--expression-attribute-values`で引く、みたいな感じと思えばよい(はず)。

で、例えば、これをip_addressでフィルタリングかけたいとかであれば、jq使った方が楽なはず。応答項目をCLIでフィルタリングする方法がどうしてもわからなかった。

```
[root@~]$ aws dynamodb scan --table-name server \
>     --filter-expression "server_type = :name" \
>      --expression-attribute-values '{":name":{"S":"online"}}' \
>     | jq ".Items[].ip_address"
{
  "S": "192.168.1.2"
}
{
  "S": "192.168.1.5"
}
{
  "S": "192.168.11.1"
}
{
  "S": "192.168.11.10"
}
```
HTTPリクエスト、レスポンスにはどんな情報が入っているのか

HTTPで送られるリクエスト、レスポンスの内容について理解したいと思い、勉強してみた。

# HTTPメッセージ
HTTP通信では、**HTTPメッセージ**を使用して通信を行う。   

## HTTPメッセージの構成
複数行のデータで構成される。

- 開始行(リクエスト行, ステータス行)
  - リクエストのときは「リクエスト行」
  - レスポンスのときは「ステータス行」
- メッセージヘッダ
- (空行)
- メッセージボディ

## HTTPリクエスト
「Webブラウザ→Webサーバ」に送られるHTTPメッセージ。   

- リクエスト行
  - 「Webサーバに対して依頼する処理」に関する情報が記述されている
    - HTTPメソッド(GET/POST...など)
    - パス名(リクエスト対象のデータ)
    - HTTPのバージョン(HTTP/1.1...など)
- メッセージヘッダ(HTTPヘッダ)
  - Webブラウザの種類や言語などの情報を伝える
    - User-Agentはここに含まれる
- 空白行
  - メッセージヘッダの終わりを示す
- メッセージボディ
  - Webサーバにデータを送るために使われる

## HTTPレスポンス
「Webサーバ→Webブラウザ」に送られるHTTPメッセージ。
HTTPリクエストに対する応答。

- ステータス行
  - Webサーバでの処理の結果
    - HTTPバージョン
    - HTTPステータスコード
      - 200：正常、403：アクセス権限なし、404：ページがない、500：プログラムでエラー、503：サービス利用不可
- メッセージヘッダ(HTTPヘッダ)
  - 返信するデータのタイプや、データの圧縮方法など
  - Content-type: text/html
  - char-set=UTF-8
- 空白行
  - メッセージヘッダの終わりを示す
- メッセージボディ
  - HTMLや画像などのデータを格納する場所

# HTTPリクエストをより詳しく...
## HTTPメソッド
だいたい利用するのは**GET**か**POST**。   

### GETメソッド
主に、HTMLファイルなど**コンテンツを取得したい場合**に使われる。
リクエスト時に送るデータは、**URLの後ろに付与**して送る。

### POSTメソッド
**データをWebサーバに対して送信する場合**に使われる。   
リクエスト時に送るデータは、**HTTPリクエスト内のメッセージボディに含めて**送る。

# HTTPレスポンスをより詳しく...
## ステータスコード
Webサーバ内での処理結果として、**HTTPレスポンスのステータス行にはステータスコード**が含まれている。

- 主なステータスコード
  - 200：正常
  - 403：アクセス権限なし
  - 404：ページがない
  - 500：プログラムでエラー
  - 503：サービス利用不可

# メッセージヘッダ
HTTPリクエスト、HTTPレスポンスそれぞれに存在している。
HTTPメッセージに関する詳細な情報が含まれているため、主要なものは認識しておく。

## User-Agent
HTTPリクエストに含まれる情報。
クライアントのWebブラウザやOSの情報など、**どんな環境からアクセスされたか**がわかる。

- 参考
  - [UserAgent調べる君](https://www.baka-ke.com/lab/useragent.php)
    - 自分のUser-Agentを知ることができる
  - [Parse User Agent](https://developers.whatismybrowser.com/useragents/parse/#parse-useragent)
    - User-Agentから、WebブラウザやOSなどを調べることができる

## Content-Type
**送信するコンテンツの種類(MIMEタイプ)**を指定する項目。

- 主なContent-Type
  - text/plain　→　テキストファイル
  - text/html　→　HTMLファイル
  - image/jpeg　→　JPEGファイル
  - application/zip　→　ZIPファイル
  - audio/mp4　→　mp4ファイル

- 参考
  - [コンテンツタイプ (Content-Type)](https://wa3.i-3-i.info/word15787.html)
  - [MIMEタイプ(マイムタイプ)](https://wa3.i-3-i.info/word15786.html)
  - [Content-Typeの一覧](https://qiita.com/AkihiroTakamura/items/b93fbe511465f52bffaa)

# HTTPS(HTTP over SSL/TLS)
**SSL(Secure Sockets Layer)**や**TLS(Transport Layer Security)**を利用した、暗号化された安全な通信方式。
具体的に、どのような安全性があるのか。

## 盗聴防止(暗号化通信)
データを暗号化して通信するため、通信内容を傍受して盗聴することを防ぐ。

## 改ざん防止
**メッセージダイジェスト**を利用することで、データが改ざんされることを防いでいる。
メッセージダイジェストとは、あるデータから一意の短いデータ(ハッシュ値)を取り出す計算のことで、
データを送受信する際にこのハッシュ値を比較することで、改ざんを検知している。

## なりすまし防止(Webサイト運用元の確認)
Webサーバに**SSLサーバ証明書**を配置し、接続時に検証することで、Webサイト運営者の身元を確認できる。
SSLサーバ証明書は**認証局**による認証作業が行われているため、安全性が担保できる。

# あとがき
いくつかまた調べたいことがでてきた。

- SSLサーバ証明書の配置方法
- セッションとCookie
- curlコマンド
  - HTTPリクエストを送ったり、データ転送を行うことができるコマンド...らしい
- MIMEタイプの１つ「multipart/form-data」
  - 形式がよくわからない

# リンク
- [「HTTPリクエスト」と「HTTPレスポンス」](https://itsakura.com/network-http-get-post)
- [curlコマンドでapiを叩く](https://qiita.com/bunty/items/758425773b2239feb9a7)
- [curlコマンドを使ってHTTPSのAPIを叩く](https://qiita.com/fuwamaki/items/53bca48416030ed2c599)
- [【PHP超入門】HTTP（GET・POST）について](https://qiita.com/7968/items/4bf4d6f28284146c288f)
Rails5で複数テーブルを更新する際にform_withでハマったエラーの対策

##状況
field_forで複数テーブルに一度に保存したいけど、Unpermitted parameterとなってしまいました。

fields_forで、一度に複数のテーブルに保存したいと考えていました。フォーム内の各入力項目はブラウザ上で確認できる状態で、ページ遷移時にエラーも起こらないのですが子のテーブルにデータが保存されない状態でした。

```ruby:inquiry.rb
<%= form_with scope: :inquiry, local: true do |f| %>

  <div class="field">
    <%= f.label :full_name, "名前(必須)" %>
    <%= f.text_field :full_name %>
  </div>

  <div class="field">
    <%= f.label :mail_address, "メールアドレス(必須)" %>
    <%= f.text_field :mail_address %>
  </div>

  <%= f.fields_for :inquiry_message do |mes| %>

    <div class="field">
      <%= mes.label :message, "お問い合わせ内容(必須)" %>
      <%= mes.text_area :message %>
    </div>

  <% end %>

  <div class="actions">
    <%= f.submit "確認画面へ" %>
  </div>

<% end %>
```

##やったこと
```
<%= form_with scope: :inquiry, local: true do |f| %>
```
を下記に変更！

```
<%= form_with model: @inquiry, url: inquiry_path, local: true do |f| %>
```
理由はわからないのですが、これでエラーから抜け出せました。
もし理由がわかる方がいらっしゃいましたら、ぜひ教えてください。

自分の理解だと、scopeの場合でもmodelの場合でも、同じフォームが作成されるはずだったのですが不思議です。

もし同じようなエラーでハマった方がいらっしゃたら一度試してみてください。
GO言語　Macインストールメモ

# 参考URL
公式サイト：https://golang.org


# 環境
macOS High Sierra バージョン10.13.6
GO 1.12



# インストール

```
$ brew install go
==> Downloading https://homebrew.bintray.com/bottles/go-1.12.high_sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring go-1.12.high_sierra.bottle.tar.gz
�  /usr/local/Cellar/go/1.12: 9,787 files, 449.7MB
brew install go  35.23s user 41.35s system 53% cpu 2:23.62 total

$ go version
go version go1.12 darwin/amd64
```

# 動作確認
公式サイトのソースを動かしてみる

```
$vi hello.go
// You can edit this code!
// Click here and start typing.
package main
import "fmt"

func main() {
    fmt.Println("Hello, 世界")
}

$go run hello.go
Hello, 世界
```

# ビルド

```
$go build hello.go
$ls
hello         hello.go
$./hello
Hello, 世界
```
Laravel HomesteadがVBoxHeadlessで重い

# 状況
作業中Macがやたら重いと思ってアクティビティモニタを確認。
`VBoxHeadless`というプロセスがCPUの限界を超して`101%`もCPUを使用している。
笑えない

# 解決方法
[こちら](https://stackoverflow.com/questions/28293238/why-does-virtual-box-vboxheadless-process-using-vagrant-use-100-of-my-cpu)の方法で解決。

1. `vagrant halt`で仮想マシンを停止
2. `vagrant plugin install vagrant-vbguest`でプラグインをインストール
3. `vagrant plugin update vagrant-vbguest`でプラグインをアップデート

拡張機能のバージョンの食い違いで遅くなるらしい。
ゲストプラグインをインストールすると治る。

再び`vagrant up`でマシンを起動し、アクティビティモニタを確認すると`VBoxHeadless`のCPU使用率が`6%`ほどになっていた。
良かった
API Gatewayのマッピングテンプレートの設定例

# 🔶概要

API Gatewayの統合レスポンスで設定する、マッピングテンプレートを使えば、バックエンドから受け取ったレスポンスを、ある程度加工する事ができます。

以下は、[VTL](http://velocity.apache.org/engine/1.7/vtl-reference.html)で記述する、テンプレートの設定例です。

<img width="638" alt="スクリーンショット 2019-03-05 17.06.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/38099/2560b153-12f7-8476-27ab-32d6289594e1.png">



# 🔶設定例

## 🔷プロパティ名の置き換え

以下の「name」と「data」のプロパティ名を、「NAMAE」、「DEETA」に置き換える例。

**変換前レスポンス**

```json

{
  "name": "hoge",
  "data": {
    "param1": 10,
    "param2": 20
  }
}
```

**テンプレート例**
`$input.json('$')`で、バックエンドからのレスポンスのJSONデータを呼び出せます。
`'$'`はJSONデータ全体を指し、`$input.json('$.data.param1')`のようにプロパティ名を指定します。

```java
## プロパティ名の置き換え
{
  "NAMAE": $input.json('$.name'),
  "DEETA": $input.json('$.data')
}
```

**変換後レスポンス**

```json

{
  "NAMAE": "hoge",
  "DEETA": {
    "param1": 10,
    "param2": 20
  }
}
```

## 🔷if文による分岐

**変換前レスポンス**

```json

{
  "name": "hoge",
  "data": {
    "param1": 10,
    "param2": 20
  }
}
```

**テンプレート例**
`#if(評価式)` `#else` `#end`の基本形で、if文が使えます。
また、以下の例のように`#elseif`も使えます。
以下では`#{elseif}`と書いていますが、`{}`は`#elseif`が文の前後の文字列によって読めなくなるのを防ぐための括り文字です。

1つ注意するのが、値を評価する際に、レスポンスをデータのオブジェクトとして呼び出す、`$input.path('$')`を使う点です。
`$input.json('$')`はJSONデータを呼び出す書き方で、JSONデータではif文で評価できません。

```java
## if文分岐
{
  "result": #if($input.path('$.name') == "hoge")
              "ほげでした"
            #{elseif}($input.path('$.name') == "fuga")
              "ふがでした"
            #else
              "ぴよかも"
            #end,
  "data": $input.json('$.data')
}
```

**変換後レスポンス**

```json

{
  "result": "ほげでした",
  "data": {
    "param1": 10,
    "param2": 20
  }
}
```

## 🔷レスポンスのHTTPステータスの上書き

テンプレートに`#set($context.responseOverride.status = (ステータスコード))`を記述する事で、リクエスト元へのレスポンスの、HTTPステータスの値を任意の値に上書きできます。

**テンプレート例**

```json
#set($context.responseOverride.status = 200)
{
  "result": "error",
  "message": "エラーだけど、ステータス200で返します"
}
```

## 🔷ステージ変数の利用

テンプレートに`${stageVariables.（設定したステージ変数名）}`を記述する事で、ステージ変数で設定した値をセットする事ができます。

**テンプレート例**

```json
## ステージ変数に「hensu=ｈｏｇｅ」を設定している場合
{
  "result": "ステージ変数も呼べます",
  "value": "値は${stageVariables.hensu}"
}

```


**変換後レスポンス**

```json

{
  "result": "ステージ変数も呼べます",
  "value": "値はhoge"
}
```


# 🔶制限

## 🔷テンプレート内で、HTTPステータスを呼び出せない
テンプレート内の記述だけで、「バックエンドからのレスポンスのステータスが200だったら、○○と返す」という処理はできません。
統合レスポンスの、HTTPステータスの正規表現で、「バックエンドからのレスポンスのステータスが200の時のレスポンスは〜」のように設定する必要があります。

2019/03/05時点で、HTTPステータスを呼び出す方法がありません。

# 🔶参考

マッピングテンプレートを使用して、API のリクエストおよびレスポンスパラメータとステータスコードをオーバーライドする
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-override-request-response-parameters.html
インタプリタ方式について


rubyの特徴を調べてたらインタプリタ方式という単語が出てきて？？？となったので調べて見た

### 前提
プログラミング言語はコンピューターは理解することができません
そのために一度機械語に変換する必要があります
その変換するタイミングの違いでインタプリタ方式とコンパイル方式という二つの方式があります。


### インタプリタ方式とは

プログラミング言語を一つずつ解釈しながら機械語に変換して実行する方式
プログラムを実行時に変更するのがポイント


### コンパイル方式

プログラミング言語を事前にまとめて変換をする方式
事前に変換するのがポイント


### インタプリタ方式のメリット
・コンパイルなしに手軽に実行できる
・インタープリタは実行が上手くいかなかった時点でデバック作業ができる

### インタプリタ方式のデメリット
・実行する度に変換するので、コンパイル方式に比べると実行速度が遅い
Rails 5.1.6 で Specified 'sqlite3' for database adapter, but the gem is not loaded. Add `gem 'sqlite3'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord). (Gem::LoadError) というエラーが出たら

## TL;DR

`sqlite3` gem のバージョンが新しすぎる可能性が高いです。バージョンを落とします。


```:Gemfile
gem 'sqlite3'
```

↓

```:Gemfile
gem 'sqlite3', '~> 1.3.0'
```

に書き換えて、 `bundle install` を実行


## 具体的な症状と解決方法

Rails 5.1.6 で新しいアプリケーションを作成、つまり `rails _5.1.6_ new test_app` した後に、 Scaffold で CRUD な処理を作ろうとすると、

```
/Users/i.norifumi.homma/RailsApps/test_app% bin/rails g scaffold User email:string last_name:string first_name:string password:string
/Users/i.norifumi.homma/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activerecord-5.1.6.1/lib/active_record/connection_adapters/connection_specification.rb:188:in `rescue in spec': Specified 'sqlite3' for database adapter, but the gem is not loaded. Add `gem 'sqlite3'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord). (Gem::LoadError)
```

のようなエラーが出ることがあります。
`bundle install` 時にはエラーは出ませんし、ちゃんと Gemfile にも Gemfile.lock にも `sqlite3` が記載されています。

そんな時は、 Gemfile を開いて、 `sqlite3` のバージョンを `1.3` 系に落として、再度 `bundle install` します。
そうすると、今度は正しく実行できます。

```
/Users/i.norifumi.homma/RailsApps/test_app% bin/rails g scaffold User email:string last_name:string first_name:string password:string
Running via Spring preloader in process 17420
      invoke  active_record
      create    db/migrate/20190305084938_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
      invoke  resource_route
       route    resources :users
      invoke  scaffold_controller
      create    app/controllers/users_controller.rb
      invoke    erb
      create      app/views/users
      create      app/views/users/index.html.erb
      create      app/views/users/edit.html.erb
      create      app/views/users/show.html.erb
      create      app/views/users/new.html.erb
      create      app/views/users/_form.html.erb
      invoke    test_unit
      create      test/controllers/users_controller_test.rb
      invoke    helper
      create      app/helpers/users_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/users/index.json.jbuilder
      create      app/views/users/show.json.jbuilder
      create      app/views/users/_user.json.jbuilder
      invoke  test_unit
      create    test/system/users_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/users.coffee
      invoke    scss
      create      app/assets/stylesheets/users.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss
```

Rails 5.1.6 では `sqlite3` のバージョン 1.4 系に対応していないようです。
.Net Coreでアプリケーション構成ファイルを使う

ASP.NET Core WebアプリケーションにはデフォルトでWeb.configが存在しません。

今までのようにアプリケーションの構成要素をファイルに格納したい場合は、
次の2通りのやり方が存在します。
1. appsettings.jsonを使う
2. configファイルを新規追加する

# 1.appsettings.jsonを使う

appsettings.jsonに[AppSettings]Keyを追加します。

```c#:appsettings.json
{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
    "AllowedHosts": "*",
    //新規追加
    "AppSettings": {
        "ApiEndPoint": "http;//hoge",
        "DefaultTimeOut_Minitue": "120"
    }
}
```

Startupクラスにappsettings.jsonに追加したAppsettingsを取得するDictionary型のプロパティを用意して、
ConfigureServicesメソッドで代入します。
（AppSettingsプロパティと取得処理はこのクラス以外でもかまいません。）

```c#:Startup.cs
public static Dictionary<string, string> AppSettings{get; private set;}

 public void ConfigureServices(IServiceCollection services)
{
    AppSettings = Configuration.GetSection("AppSettings").GetChildren().ToDictionary(x => x.Key, x => x.Value);
}

```

AppSettingsプロパティはStartUpクラスの静的メンバなので、後は使い箇所で使いまわしてください。

```c#
    var endPoint = Startup.AppSettings["ApiEndPoint"];
```


# 2.configファイルを新規追加する

プロジェクト右クリック>追加で構成ファイルを追加します。
名称はapp.configにしておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/77473/ef332052-f92b-49f2-9484-06172cb4276e.png)


```c#:app.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="test" value="123"/>
  </appSettings>
</configuration>

```


ConfigurationManagerをNugetで取得します。
ツールバーの[ツール]>[NuGetパッケージマネージャー]>[パッケージマネージャーコンソール]で
パッケージマネージャーコンソールを開いたら、次のコマンドを実行します。
※既定のプロジェクトが、ConfigurationManagerを追加したいプロジェクトになっているか確認して下さい。

>Install-Package System.Configuration.ConfigurationManager -Version 4.5.0

appSettingsの値を取得したいクラスにusingを追加したら、
ConfigurationManagerクラスを使って値を取得します。

>using System.Configuration;

```c#
var app = ConfigurationManager.AppSettings["test"];
```
Mac(Mojave)でRails起動すると Sorry, you can't use byebug without Readline エラー

# 背景
ローカルMac(Mojave)でRails4.6系。rubyを2.3系 -> 2.6系にあげて起動したところ以下のエラー発生。

```
   Sorry, you can't use byebug without Readline. To solve this, you need to
    rebuild Ruby with Readline support. If using Ubuntu, try `sudo apt-get
    install libreadline-dev` and then reinstall your Ruby.
```

# やったこと
brewで入れたreadlineのバージョンが8.0になっているのがだめみたいだった。7.05にスイッチしたら動いた。

参考: https://github.com/deivid-rodriguez/byebug/issues/289#issuecomment-455963200


## brewのバージョンの下げ方
この記事めっちゃわかりやすかった↓
[Homebrewで旧バージョンのパッケージをインストールしたい](https://qiita.com/KyoheiG3/items/912bcc27462871487845)
brewで入れたanyenvでpyenv installがcommand not foundになる

タイトルの通りanyenv環境下で `pyenv install` できずに少し詰まったのでメモ

# 環境
macOS Mojave 10.14.3
[anyenv](https://github.com/anyenv/anyenv) 1.0.1
pyenv 1.2.9

# 現象

```shell
$ pyenv
pyenv 1.2.9-16-g9baa6efe
Usage: pyenv <command> [<args>]

Some useful pyenv commands are:
   commands    List all available pyenv commands
   local       Set or show the local application-specific Python version
   global      Set or show the global Python version
   shell       Set or show the shell-specific Python version
   rehash      Rehash pyenv shims (run this after installing executables)
   version     Show the current Python version and its origin
   versions    List all Python versions available to pyenv
   which       Display the full path to an executable
   whence      List all Python versions that contain the given executable

$ pyenv install -l
pyenv: no such command `install'
```

上記の通りinstall, uninstallコマンドが使えない状態に

# 解決策

`anyenv install pyenv` 時に `python-build` が実行されていなかったため、以下を実行

```shell
$ ~/.anyenv/envs/pyenv/plugins/python-build/install.sh
```

# 結果

正常に使えるようになりました。

```shell
$ pyenv
pyenv 1.2.9-16-g9baa6efe
Usage: pyenv <command> [<args>]

Some useful pyenv commands are:
   commands    List all available pyenv commands
   local       Set or show the local application-specific Python version
   global      Set or show the global Python version
   shell       Set or show the shell-specific Python version
   install     Install a Python version using python-build
   uninstall   Uninstall a specific Python version
   rehash      Rehash pyenv shims (run this after installing executables)
   version     Show the current Python version and its origin
   versions    List all Python versions available to pyenv
   which       Display the full path to an executable
   whence      List all Python versions that contain the given executable

$ pyenv install -l
Available versions:
  2.1.3
  2.2.3
  2.3.7
  ...
```

他に同じような症状の方を見かけなかったので謎です。。
macOSのコマンドラインでphpからMAMPのMySQLに接続しようとすると[2002] No such file or directory


[NetCommos3をcomposerでインストール · NetCommons3/NetCommons3 Wiki](https://github.com/NetCommons3/NetCommons3/wiki/NetCommos3%E3%82%92composer%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) を参考にしながら macOS のコマンドライン上でNetCommons3をインストールしてたら、DB作成の時点で

```
Error: SQLSTATE[HY000] [2002] No such file or directory
Error: データベースが作成できませんでした。
```

となってしまいました。

なぜこうなるかというとMAMPを入れてるとはいっても、コマンドラインで動くのは macOSにデフォルトで入ってるPHPだから。

MAMPのMySQLのソケットの場所は ```/Application/MAMP/tmp/mysql/mysql.sock```

それに対して macOS のPHPが参照する MySQLソケットの位置は ```/var/mysql/mysql.sock```

それで ```/var/mysql/mysql.sock``` が見つからないということで "No such file or directory" になってたわけです。

というわけで下記を実行してシンボリックリンクをつくることで解決できました。

```
sudo mkdir /var/mysql
sudo ln -s /Application/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock
```
Docker for Windows でコンテナからlocalのドライブにアクセスできない時に試すこと

**Docker は 全ての環境依存の問題を解決する！**

.
.
.

そう思っていた時期もほんのちょっぴりありました。
常用していれば、なんだかんだで、for Macならでは、そして多数の for Windowsならではの問題にぶちあたりますよね。
特にファイルシステムまわり。


今回踏んだ地雷は、Docker for Windowsで **どうしてもdocker-compose.ymlに書いたvolumesの通りにlocalのドライブがマウントされていない** ように見えること。

実際、コンテナにdocker exec -it bashして確認しても、マウントされているはずの箇所は空です。

Dockerをリスタートしたり、Windowsをリスタートしたりと散々試したあげく辿り着いた答えが、なんであるのかよくわからない設定項目のアレ


![docker.resized.png](https://qiita-image-store.s3.amazonaws.com/0/74328/4c3a4090-07b5-c0e4-9261-963013efa0c1.png)



もちろんちゃんと**✓**されている状態なのですが、

Shared Drivesの**✓**を一度外して Apply
もう一度**✓**をつけて Apply

でした。

そんなんわかるかー！

というわけで参考まで。