OmniAICreator/Qiita-1.07M huggingface dataset:
opensslの読み込み不具合でMySQLが起動しない時の対処【Homebrew】

## 状況
```
$ sudo mysql.server start                                                       15:08:37
dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
  Referenced from: /usr/local/Cellar/mysql/5.7.17/bin/my_print_defaults
  Reason: image not found
Starting MySQL
.dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
  Referenced from: /usr/local/Cellar/mysql/5.7.17/bin/my_print_defaults
  Reason: image not found
dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
  Referenced from: /usr/local/Cellar/mysql/5.7.17/bin/my_print_defaults
  Reason: image not found
/usr/local/Cellar/mysql/5.7.17/bin/mysqld_safe: line 193: 37626 Abort trap: 6           nohup /usr/local/Cellar/mysql/5.7.17/bin/mysqld --basedir=/usr/local/Cellar/mysql/5.7.17 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/Cellar/mysql/5.7.17/lib/plugin --user=mysql --log-error=/usr/local/var/mysql/xxx.local.err --pid-file=/usr/local/var/mysql/xxx.local.pid < /dev/null > /dev/null 2>&1
 ERROR! The server quit without updating PID file (/usr/local/var/mysql/xxx.local.pid).
```


## 解決策

brew経由でopensslを入れ直す。

```
brew update && brew upgrade
brew uninstall --ignore-dependencies openssl; brew install https://github.com/tebelorg/Tump/releases/download/v1.0.0/openssl.rb
```
Windows Terminalのキーバインドを設定する

まだプレビュー版なので今後変更される可能性があります。

参考：https://github.com/microsoft/terminal/blob/master/doc/cascadia/SettingsSchema.md

# 設定ファイルを開く

タブの右の矢印から「Settings」を開くか、ショートカット「Ctrl + ,」でprofiles.jsonを開く。

# profiles.jsonを編集する
```json
{
    // 略

    "keybindings":
    [
        {
            "command": "prevTab",
            "keys": ["ctrl+pgup"]
        },
        {
            "command": "nextTab",
            "keys": ["ctrl+pgdn"]
        },
        {
            "command": "copy",
            "keys": ["ctrl+insert"]
        },
        {
            "command": "paste",
            "keys": ["shift+insert"]
        },
        {
            "command": "newTab",
            "keys": ["ctrl+t"]
        },
        {
            "command": "closeTab",
            "keys": ["ctrl+w"]
        },
        {
            "command": "splitHorizontal",
            "keys": ["ctrl+shift+down"]
        },
        {
            "command": "splitVertical",
            "keys": ["ctrl+shift+right"]
        },
        {
            "command": "moveFocusDown",
            "keys": ["ctrl+down"]
        },
        {
            "command": "moveFocusLeft",
            "keys": ["ctrl+left"]
        },
        {
            "command": "moveFocusRight",
            "keys": ["ctrl+right"]
        },
        {
            "command": "moveFocusUp",
            "keys": ["ctrl+up"]
        },
        {
            "command": "closePane",
            "keys": ["ctrl+shift+w"]
        }
    ]
}

```
キーバインドの他にもいろいろ設定できる。

## 各項目の説明
- prevTab, nextTab
  - タブを移動する
- copy, paste
  - コピー、ペースト
- newTab, closeTab
  - タブを開く、タブを閉じる
- splitVertical
  - 画面を縦方向に分割する（右にできる）
- splitHorizontal
  - 画面を横方向に分割する（下にできる）
- moveFocus～
  - 分割した画面（ペイン）間でフォーカスを移動する
- closePane
  - 分割した画面（ペイン）を閉じる
ExcelファイルをJSONに一括変換【Python】

注意：Python初心者のメモです。

Pythonの `excel2json` というプラグインを使用して `xlsx` を `JSON` に変換した。

 `excel2json` の機能は限られていて、ただ Excel データを JSON に変換するだけ。ドキュメントには変換する方法しか書いてないので、設定も特になさそう。

参考サイト先にもあるとおり `Pandas` を使う方法もあったが、今回は変換方法をよしなにして欲しかったため `excel2json` を使ってみた。あと整数は浮動小数点数に変換されるらしい。ぜひ以下のサイトもご覧ください。

参考：
- [Python Excel to JSON Conversion - JournalDev](https://www.journaldev.com/33335/python-excel-to-json-conversion)
- [excel2json-3 · PyPI（Excel to JSON Converter）](https://pypi.org/project/excel2json-3/)

```python
import excel2json

xlsx_path = 'C:/Users/username/Documents/xlsx_files/hoge.xlsx'
excel2json.convert_from_file(xlsx_path)
# -->  C:/Users/username/Documents/xlsx_files/Sheet1.json が出力される
```

Excel のシート名がそのまま出力ファイル名になる。出力ファイル名指定は正直欲しかった。この仕様は限られた用途にしか使えないかも……

## ファイル群を一括変換!!
Tobiiっていう視線解析ソフトからExcelファイルを書き出せて、視線データを自分のプログラムで解析したかった。なのでソフトから出力した複数の Excel ファイル群を一斉に JSON に変換したかった。一応、一斉変換のコードも置いておく。

ループさせて複数のファイルを変換するとき、作成された JSON ファイルを常に上書きしようとするので（名前が同じ）、毎回 Rename する必要がある。シートが複数ある場合は `Sheet2.json` とかが出てくるので対策が必要。
私の場合、 `Data` という名前のシートが1つだけだったので仕様としては十分。

```python
import excel2json
import pathlib
import os
from halo import Halo
from shutil import move

spinner = Halo(spinner='dots')  # loading画面のぐるぐる

path = 'C:/Users/username/Documents/xlsx_files'    # xlsxファイル群が入ってるpath
xlsx_files = list(pathlib.Path(path).glob('*.xlsx'))  # xlsxファイル群のリストを作る

for i in xlsx_files:
  xlsx_path = '%s/%s' % (path, i.name)  # xlsxファイルのpathと名前
  json_path = '%s/output/%s.json' % (path, i.name[:-5])  # jsonファイルの出力先path

  if os.path.exists(json_path):  # 既にjsonファイルがあればスキップ
    print('Skip to %s' % i.name)
  else:
    try:
      spinner.start('Converting: %s' % i.name)
      excel2json.convert_from_file(xlsx_path)  # jsonに変換
    except Exception as inst:  # 変換失敗
      spinner.fail(inst)
    else:  # 変換成功
      move('%s/Data.json' % path, json_path)  #Data.jsonをRenameして移動
      spinner.succeed('Success: %s.json' % i.name[:-5])
```
※ 出力先のフォルダ（outputフォルダ）は先に作っておかないと怒られる（それはそう）。
※ TobiiのソフトからExcelを出力すると、シート名は `Data` 固定になる。


参考：
- [pythonでフォルダ内のファイル名のみ取得する方法](https://qiita.com/d_desuyon/items/94eb52394a8152143f63)
- [Pythonメモ : haloでターミナルにスピナー（処理中）を表示](https://wonderwall.hatenablog.com/entry/2017/10/10/220000)
Emacs つかっている時に Macbook の TouchPad にイラッとする

Macbook 系で emacs つかっている時にたまたまのタップや見て親指の腹がタッチパッドに触れてカーソルが飛んでイラッとしてたんだけど、
`option + command + f5`
で Accessbility の今の状況が見れることを知って、そこの `Enable Mouse Keys` の on/off(tab ジャンプとスペースバーとリターンキーで操作可能) でタッチパッドを disable することができました。

`System Preferences > Accessibility > Pointer Control > Alternate Control Methods > Enable Mouse Keys > Options... > Ignore built-in trackpad when Mouse Keys is on`のチェックボックスにチェックつけておくことが前提です。

on にすると TouchPad が動作しない状態になるので、慌てず騒がず上記の逆を行って off にするか、マウスをなんとかしてつなげるかしないと焦ることになるかもしれません。

検索キーワード用
How to disable touchpad 
emacs use
mac macbook
paginator->sortでのラベルの日本語表示

今回CakePHP４のbakeから生成されたpaginator->sortでのラベルの日本語化を調べた時に、上位に表示された記事がかなり古いものだったので、CakePHP４に対応したものを書いていきたいと思います。

CakePHP4でbakeをすると、ページング処理と項目ごとのソート処理が自動的に実装される。また一覧表のラベルとして下記のコードが生成されます。


```php5:templates/Hoges/index.php
<thead>
       <tr>
            <th><?= $this->Paginator->sort('id') ?></th>
            <th><?= $this->Paginator->sort('name') ?></th>
            <th><?= $this->Paginator->sort('hoge') ?></th>   
       </tr>
</thead>
```

ここで本題に入ります。生成されたラベルを日本語表記に変えるためには下記のようにします。

```php5:templates/Hoges/index.php
<th><?= $this->Paginator->sort('name','名前') ?></th>
```

これでpaginator->sortでのラベルの日本語表示が出来ました。

Cake2.10ですと、第一引数にラベルに設定したい文字列を挿入してラベルの日本語表示をしていたようです。

Cake4で第一引数にラベルにしたい日本語を入れると、`strtolower() expects parameter 1 to be string, bool given`と怒られてしまいます。

以上です。
gitコマンド　覚書

# この記事の概要
- gitコマンドでパッと打てなかったものの覚書
- 随時更新

# Commit

空コミット

```bash
git commit -m "empty" --allow-empty
```

# Tag

## リモートTag削除

一件削除

```bash
git tag -d <tag_name>
git push origin :<tag_name>
```

一括削除

```bash
-- リモート
git tag | xargs -I{} git push origin :{}

-- ローカル
git tag | xargs -I{} git tag -d {}
```
#Ruby で配列の添字・順序を文字列から探す ( find_index )

```rb
["A","B","C","C","D"].find_index("A")
# => 0

["A","B","C","C","D"].find_index("B")
# => 1

# 複数見つかる場合も最初のものが返る
["A","B","C","C","D"].find_index("C")
# => 2

["A","B","C","C","D"].find_index("D")
# => 4

["A","B","C","C","D"].find_index("E")
# => nil
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2956








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
macOS CatalinaにVirtualboxをインストールする時めも

https://livethere.net/web_design/catalina-virtualbox-error
https://blog.takekoshi.net/virtualbox6-0-linux-vmsvga/
https://jade.alt-area.jp/archives/769
https://superuser.com/questions/973414/shared-folders-not-working-on-virtualbox-with-os-x-host-and-windows-guest
Laravelでブログの本文の続きを「...」にする方法

### {!! nl2br(e(str_limit(変数, 制限文字数))) !!}
で制限文字数から先の文章は「...」になります。
### 解説
#### nl2br
PHPの改行コードになります。（htmlで言う`<br>`）
https://www.php.net/manual/ja/function.nl2br.php
#### e()
()内をエスケープさせます。
> e関数は、PHPのhtmlspecialchars関数をdouble_encodeオプションにデフォルトでtrueを指定し、実行します。

https://readouble.com/laravel/5.7/ja/helpers.html (「e()」で文字検索してください。)

> htmlspecialchars — 特殊文字を HTML エンティティに変換する


https://www.php.net/manual/ja/function.htmlspecialchars.php

エスケープ処理に関してはこちらを参照
https://qiita.com/n_hirai/items/df0a21d2409ee47973e5

まあ要は記号を特殊文字に変換させることです。そうすることによってユーザーが意図せず内部のプログラミングをいじってしまうことを防ぐことができます。
例えば、phpで `$this->hensuu` の値を取得する処理が書かれている場合、フォームでユーザーが「あああ<<<超えられない壁<<<いいい」とか打ってしまったら内部のプログラミングが`<`に反応してバグったらやばいからこの処理を使うのです。（もっと良い例えありませんか・・・？）

#### str_limit(変数、制限文字)
`Str::limit`でも行けます。繰り返しになってしまいますが、制限文字数から先の文章は「...」になります。
なんか最初からこうなってるみたいです。

> str_limit関数は、指定した長さへ文字列を切り詰めます。

https://readouble.com/laravel/5.7/ja/helpers.html (「str_limit」で文字検索してください。)

#### {!! !!}
これでエスケープから逃れることができます。
通常Laravelで使われるblade構文の `{}` はhtmlからエスケープしてphp処理を行う際に使われるものでした。
それを「！！」にすることで否定系にしているのでhtmlとして処理されます。
中の処理が終了したらhtmlとして出力させようとしています。

### 個人的に
なにこれ解説むっず。本当に合ってんのかこれ。
でも使ってみると結構便利なので使ってみてください。何かあればコメントお願いします＞＜
条件付き書式で別シートと比較する方法【Google Spreadsheet】

# 概要
値の差分だけ背景色を変えるために、別シートの同位置と比較したい。

<img width="373" alt="Screen Shot 2563-01-23 at 14.48.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74964/78016169-d406-4d81-d6d7-233fee98f8f3.png">

# やり方
## 条件付き書式
背景色の変更は、条件付き書式から設定することができます。
なので、まず範囲を指定し右クリックメニューから条件付き書式を選択します。
<img width="350" alt="Screen Shot 2563-01-23 at 14.49.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74964/01e288b3-f73d-f516-672b-52b6c987513b.png">

## カスタム書式の設定
書式ルールに別シートとの比較式を入れる必要があるため、カスタム書式を選択します。
<img width="198" alt="Screen Shot 2563-01-23 at 14.50.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74964/cff87320-53aa-f57b-f2fd-c4fcaccbb355.png">

やりたいことはこれなんですが、カスタム書式では別シートをそのまま指定することができません。

```
=A1<>'比較用マスタ'!A1
```

別シートを指定する場合は、INDIRECT関数を通す必要があります。

```
=A1<>INDIRECT("比較用マスタ!A1")
```

ただこれだとA1が文字列で指定されてしまってるため、全てのセルがA1と比較されてしまいます。
動的に参照するセルを変えるためには、A1は文字列でなく、セルで指定する必要があります。

```
=A1<>INDIRECT("比較用マスタ!"&CELL("address", A1))
```

そのためにCELL関数を通して、セル指定からその文字列に変換します。

## 完成！
これで別シートとの差分だけ背景色を変えることができました！
差分以外でも、INDIRECTとCELLを組み合わせることで自由に別シートを条件付き書式で利用することができますね。

<img width="373" alt="Screen Shot 2563-01-23 at 14.48.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74964/78016169-d406-4d81-d6d7-233fee98f8f3.png">
JQueryの代わりに MutationObserver を使って子要素の追加を検知したい

## 書いてみたコード

```javascript
function printEl(el, indent = "") {
	console.error(indent + "tag=" + el.tagName + " ,id=" + el.id + " ,class="+ el.className);
	el.childNodes.forEach((child) => {
		printEl(child, indent + "  ");
	});
}

function watchChildElementAdditions(target){
	if ( target == null || typeof(target) == "undefined") {
		console.error("監視するノードが指定されていません");
		return;
	}

	// オブザーバインスタンスを作成
	const observer = new MutationObserver((mutations) => {
		mutations.forEach((mutation) => {
			if ( mutation.type != "childList" ) {
				return;
			}
			mutation.addedNodes.forEach( el => {
				printEl(el);
			});
		});
	});

	// 対象ノードとオブザーバの設定を渡す
	observer.observe(target, {
		attributes: false,
		characterData: false,
		childList: true,
		subtree: true,
	});
}

watchChildElementAdditions(document.getElementById('target-id'));

```

## やっていること
[MutationObserver](https://developer.mozilla.org/ja/docs/Web/API/MutationObserver) で対象ノードの子孫も含めて監視します。子孫のノードが追加されると、 `MutationObserver` のコンストラクタに指定したコールバックが呼ばれ、 [MutationRecord](https://developer.mozilla.org/ja/docs/Web/API/MutationRecord)が引数で渡されます。これの `addedNodes` プロパティに追加された子ノードがあるので、`childNodes` で子孫を探していきます。

`addedNodes` 追加されたノードの最上位の親が渡されます。
centOS 7でapacheのページが表示されない

## 概要
httpdのインストールをして、`sudo systemctl start httpd`でapacheを起動し、`sudo systemctl status httpd`で`active`になるとともに、80番portも空いていることを確認したのにも関わらず、グローバルIPにアクセスしてもページが表示されない。



## 開発環境
- apache 2.4.6
- CentOS Linux release 7.7.1908 (Core)

## 解決方法
defaultでは、firewallにより外部からアクセスできないようになっているため、httpアクセスを許容するように設定する。

```shell
$ sudo firewall-cmd --add-service=http --zone=public --permanent
$ sudo firewall-cmd --reload
```

![スクリーンショット 2020-01-23 14.54.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264708/715c86ed-6a16-e04d-d027-16d5d1680e4f.png)

正常にアクセスできました。
Tello Eduを子機にしてwifiアクセスポイントに接続する【python】

#1 Telloを起動し、PCをTelloに接続する
この段階では、Tello（親機）、PC（子機）となっている

#2 プログラムを実行しTelloをwifiに接続する

```python:tello_wifi_access.py

import socket

tello_ip = '192.168.10.1'
tello_port = 8889

socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
tello_address = (tello_ip , tello_port)

socket.sendto('command'.encode('utf-8'),tello_address)
socket.sendto('ap SSID PASSWORD'.encode('utf-8'),tello_address)


```

SSIDとPASSWORDは接続するwifiのものに変更してください。

そうするとTelloは子機モードになり、SSIDのwifiに接続します。
一度設定すると設定は保存され、次回Telloが起動したときも自動的にwifiに接続します。
Microsoft Ignite Osaka 1/23 APPS30

# APPS30 コンテナーを使用したアプリケーションの最新化

MicrosoftIgniteOsaka

1/23 session3 APPS30 コンテナーを使用したアプリケーションの最新化のメモです。

- Docker、コンテナー、レジストリなど
- コンテナーを使ったアプリのモダナイぜーション
- 移行に使用可能なAzureサービスの検討
- デモ

## アプリはどこにあるか

- オンプレ
- IaaS(VM)

### データセンターでホストされるアプリケーションの欠点

- コスト（初期コスト）
- 想定されるスケール（増設コスト、調達期間）
- コンプライアンスと規制（自前でチェックを受ける必要がある）

### 仮想マシンは素晴らしいが全てが必要か？

- OSの管理
- より長い起動時間（コンテナに比べて）
- より多くの監視項目（コンテナに比べて）

なんでもできるが、やらないといけないことも多い。

## コンテナを使ったモダナイぜーション

アプリケーションの境界を明確にすることで、どのアセットがどのアプリケーションに属し、誰がそのアプリケーションを所有しているのかを把握可能になる。

#### コンテナを使う理由

- 自分のマシンで操作（しているものがどこでも同じように動く）
- あらゆる環境が同じように見える
- ベロシティの向上（DevOps）
- どこでも実行可能（Linux,Windows,クラウド,ドローン,RaspberryPi,IoT）

#### コンテナはどのように動作するのか

- OSのプロセスとして動作
- カーネルの機能を活用してプロセスを分離
- cgroupsは利用できるリソースを制御
- 名前空間はプロセスから見えるもの（ネットワーク、マウントポイント、プロセスID、ユーザー、IPC）を制御
- イメージ形式はコンテナイメージでプロセスが参照するルートディレクトリを移動するために使用

#### Docker

最も人気の高いコンテナランタイム

##### Dockerfile

Dockerイメージのビルド方法を説明するテキストファイル。

```
FROM python2.7-slim
WORKDIR ...
COPY ...
RUN ...
EXPOSE ...
ENV ...
CMD["python","app,py"]
```

Dockerfileがあるフォルダでビルド

```
docker build -t <タグ> .
```

### リポジトリとはなにか？

イメージのバージョンを示すタグがつけられた関連するDockerイメージのコレクション
パブリックにはDockerHubがある

### Dockerマニフェストとはなにか？

メモできず

### AzureContainerRegistory

AzureでDockerイメージとそのコンポーネントを操作するためのパブリックリソース
AzureADで権限を与えることができる

### AzureContainerInstances

- オンデマンドのコンテナ
- 秒単位課金
- 他のAzureサービスとの統合
- VMやクラスターをプロビジョニングしなくて良い
- ハイパーバイザーレベルの分離
- パブリックIP
- 永続ストレージ
- Linux,Windows両方サポート

```
az group create --name ... --location ...
az container create -n ... --image ... -g ... --ip-address ...
```

## 移行

買収によりシステム移行する例

- エラスティックなソリューションに移行する
- チームの責務を軽減し、サービスへの負荷を軽減する
- コンテナを使ってより迅速なデプロイ

複数VM

- MongoDB
- SQLServer
- .NETCore
- React

### AzureAppService

- フルマネージドのアプリケーションプラットフォーム
- ネイティブまたはコンテナでデプロイ（Node.js、PHP、.NET、Python）
- カスタムドメイン,SSL,シングルサインオン
- Azureの幅広いサービスに接続（負荷分散、CI/CD、マネージドサービス）

### MongoDB

MongoDBはCosmosDBに移行する

### SQLServer

AzureSQLDatabaseに移行する
フルマネージド、スケーラブル、自動チューニング、100TBまで利用可能

### 移行パス

- アプリをコンテナ化
- イメージを作成し、AzureContainerRegistoryにアップロード
- AppServiceにデプロイ

+データベースの移行

### デモ

- AzurePipelinesを使ってDBを移行（CosmosDB,SQLDatabase）
- az acr buildを使って、ACR側でコンテナビルド
- AppSerivceにコンテナをデプロイ
Tensorflowの用語集

tensorflowの関数は説明してもわかりにくいので、使用例のみで解説します。
##tf.Variable()

```
import tensorflow as tf
x = tf.Variable(10 , name="x")
y = x * 5
print(y)
```
出力
Tensor("mul_1:0", shape=(), dtype=int32)

上記のコードを見ると、出力が50のように思えますが、テンソルが出力されます。
では、次に、50が出力されるにはどのようにすればよいでしょうか。

```
x = tf.Variable(10 , name="x")
y = x * 5
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
sess.run(y)
```
出力50
tensorflowでは、tf.sessionを通じて計算グラフを構築して実行しなければいけません。tf.global_variables_initializer()は、計算グラフ内の変数の初期化の役割を果たします

##tf.placeholder()
tf.placeholder(dtype, shape=None, name=None)

dtype: 変数に代入される型を代入します。
shape: 割り当てる変数のshape
name: 変数の名前

返り値
直接評価されない、feedされる変数のTensor

プログラム例

```
x = tf.placeholder(tf.int32)
y = tf.constant(1)
z = x + y
with tf.Session() as sess:
  print(sess.run(z, feed_dict={x: 2}))
```
出力
3
x=2を実行時に定義
次に、、tf.placeholderに配列を渡します。

```
x = tf.placeholder(tf.int32, shape=[2])
y = tf.placeholder(tf.int32, shape=[2])
z = x*y
with tf.Session() as sess:
  print(sess.run(z, feed_dict={x: [2, 1], y: [1, 2]}))
```
出力
[2 2]

##tf.placeholder_with_default
tf.placeholder_with_defaultを使うことで、初期値を決められる、かつ、実行時に変更もできます。

```
x = tf.placeholder_with_default(1, shape=[])
y = tf.constant(1)
with tf.Session() as sess:
  print(sess.run(x + y))
```
出力
0

```
x = tf.placeholder_with_default(1, shape=[])
y = tf.constant(1)
with tf.Session() as sess:
  print(sess.run(x + y, feed_dict={x: -1}))
````
出力
2

##tf.shape
tf.shapeは動的に変更されうるshapeに使用します。

```
x = tf.placeholder(tf.int32, shape=[None, 3])
size = tf.shape(x)[0]
sess = tf.Session()
sess.run(size, feed_dict={x: [[1, 2, 3], [1, 2, 3]]})
```
出力
2

##.get_shape
.get_shapeは変更されないshapeに使用します。

```
x = tf.constant(1, shape=[2, 3, 4])
x.get_shape()[1]
```
出力
Dimension(3)

参考文献
Tensorflowで学ぶディープラーニング入門
Pythonで前月を計算する

意外とめんどくさかったのでメモしておきます。
サードパーティのpython-dateutilというモジュールを使います。datetime.timedeltaで計算できるかと思いましたが、月の計算には対応していないようでした。

```shell
pip install python-dateutil
```
```Python
from datetime import datetime, date, timedelta

from dateutil.relativedelta import relativedelta


today = datetime.today()
previous_month = today - relativedelta(months=1)
print(previous_month.month)
```
```
12
```
Laravel で バリデーションエラー時にJSで動的に増やしたinputの値を保持する

#やりたいこと

jsで下記のようなinputをボタンを押したら追加していくというような可変な入力欄のとき
バリデーションエラーが起きたら、行が増えた状態で、それぞれに値が保持されていてほしい

```html:test.blade.php
<div>
    <input type="text" name="hoge[]">
</div>
```

#やりかた
Laravel 6.6で確認しています

バリデーションエラーが起こった時 `old('hoge.0')`とやれば、一番初めの入力値がとれます。
つまり、indexを指定してあげればその値が、指定しなければ配列そのものが取れます。

```php
old('hoge.0');
old('hoge.1');
// hoge
// hoge2
old('hoge');
// [0 => hoge, 1 => hoge2]
```

なので、blade側でエラー時にループしてあげれば増えた状態で
入力値を保持できます

```html:test.blade.php
@empty(old('hoge'))
<div>
    <input type="text" name="hoge[]">
</div>
@else
@foreach(old('hoge') as $value)
<div>
    <input type="text" name="hoge[]" value="{{$value}}">
</div>
@endforeach
// ↑↓　どっちでも($loop->indexでも)
@foreach(old('hoge') as $key => $value)
<div>
    <input type="text" name="hoge[]" value="{{old('hoge.{$key}')}}">
</div>
@endforeach
@endempty

```
Object[key] を使うと発生する、Element implicitly has an 'any' type because type 'typeof *****' has no index signature. を回避する方法

# はじめに
TypeScript使ってて、任意のオブジェクトが持つ、キーでループさせたいときがあります。
すると、どうしてもブラケット使わなくちゃならない。Object[key]みたいな。
そういうことするとTypeScriptはえらいから、

```
Element implicitly has an 'any' type because type 'typeof *****' has no index signature.
```

なんて言って、注意してくれるわけですよ、これを回避したい。

# サンプルコード

```typescript
  const Foo = {
    one: 1,
    two: 2,
    three: 3,
    four: 4,
    five: 5,
  };

  const bar: object = Object.keys(Foo).reduce((acc: any, key: any) => {
    acc[key] = Foo[key];
    return acc;
  }, {});
```

コンパイルすると、

```
Element implicitly has an 'any' type because type 'typeof Foo' has no index signature.
```

って言う。あーうぜえ。

# 回避する方法

```typescript
  const Foo = {
    one: 1,
    two: 2,
    three: 3,
    four: 4,
    five: 5,
  };

  const bar: object = Object.keys(Foo).reduce((acc: any, key: any) => {
    acc[key] = Foo[key as keyof typeof Foo];
    return acc;
  }, {});
```

keyを"keyof typeof Foo"でasしてやる。
ここでのkeyはFooの要素だよってコンパイラに教えてやるってことらしい。
なんかキモイけどしょうがない。

# 参考
https://github.com/microsoft/TypeScript/issues/19137
https://typescript-jp.gitbook.io/deep-dive/type-system/moving-types#knokyapucha
https://qiita.com/gonta/items/fb7b9e6d0f12060c27d6
https://qiita.com/Nossa/items/e01d0bce67b760c0bcb9

↓ここにもあった
https://qiita.com/SoraKumo/items/67a967bff996c3efb091#3-%E3%82%A4%E3%82%AD%E3%81%A3%E3%81%A6strict%E3%82%92true%E3%81%AB%E3%81%97%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E8%A8%AA%E3%82%8C%E3%82%8B%E8%A9%A6%E7%B7%B4%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E3%82%AD%E3%83%BC
フルカラーLED64配列 WS2812B-64をarduinoで使う

この記事は、arduinoでフルカラーLED64配列（WS2812B-64）を使うためのものです。WS2812BはテープLEDなどで見かけるフルカラーLEDです。5VとGNDと信号線の３端子で制御可能です。これが8x8=64個並んだものが2000円弱で売られています。使い方はテープLEDと同じです。
![gifmagazinLED64.GIF](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/a9214975-4623-8a94-68be-eb58eb18d608.gif)

#接続方法
基板にはINとOUTがあり、IN側の3端子をつなぎます。
OUT端子は、数珠繋ぎに拡張するための端子です。
基板<->arduino
V+ <-> 5V
V- <-> GND
IN <-> D6
![led64s.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/6904df06-ad4d-76b8-45e7-99dbdb6177c3.jpeg)

#消費電力
64個のLEDを(255,255,255)で光らせると、推定値2000mA以上必要となり、USBの規格が500mAで設計されているのでなにかが壊れるかもしれません。
実測値は以下の通りです。
64個のLEDを(64,64,64)で光らせると600mAでした。
64個のLEDを(32,32,32)で光らせると360mAでした。
これにはarduinoの消費電力も含まれています。
色は光の三原色でつくられており、白が一番消費電力が高く、白以外の色であれば消費電力は下がることから、(64,64,64)以内で使っていれば、実用上問題ないのかなと思います。

#プログラム
「ライブラリの管理」メニューから「Adafruit NeoPixel」を検索し、インストールします。
以下、適当に光らせるプログラムです。

```java:led64.ino
#include <Adafruit_NeoPixel.h>

Adafruit_NeoPixel pixels(64, 6, NEO_GRB + NEO_KHZ800);
int counter = 0;

void setup() {
  pixels.begin();
}

void loop() {
  for (int i = 0; i < 64; i++) {
    int r = i;
    int g = (i*8)%64;
    int b = sin(counter/50.0)*32+32;
    pixels.setPixelColor(i, pixels.Color(r,g,b));
  }
  pixels.show();
  delay(10);

  counter++;
}
```
Mojave以降Xcodeのキャッシュがセーフモードでもだいぶ残るらしい

#はじめに

###対象
Macでシステム容量が以上に多く、セーフモードを行ったりいろいろ調べたが治らなかった人

###結論
多分、最新のOSアップデートでセーフモードでも消えなくなったXcodeのキャッシュが原因です。
それの場所特定方法を以下に記します。

##方法
**1**
システム環境設定　-　セキュリティとプライバシー　-　プライバシータブ　-　フルディスクアクセス　
にターミナルを追加する
（わからない場合、全く同じ作業ではないですが参考資料を下につけてますのでご確認ください）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195953/8a8b14f5-55cc-4ffc-8b36-0a1241e904ea.png)


**2**
ターミナルを開き

```
 sudo du -g -x -d 6 / | awk '$1 >= 5{print}'
```
を入力し実行する。
実行完了には少し時間がかかります。

**3**
2が成功すると、6階層以内かつ５GB以上ファイル容量を含むフォルダ名がずらっと並べられます。
多分その中の
/private/var/folders/？？（アルファベット２文字）/自動生成されるきアルファベットの羅列/C
これが異常にでかいです。
もしデカくなかったら救えないです。他の記事探してください。すいません。

＊＊＊＊＊＊＊＊＊＊＊
3/16日更新
・左の数字の単位がGBです
・not parmit的な文（容量が見れないエラー）が出た場合はMacの管理者権限がないと言うことなので、深い階層まで権限持っている方に報告ください。
確認方法は、Finderで見れないフォルダーまで移動（Shift＋Command+G）⇨右クリック⇨情報を見る⇨共有とアクセス権　に権限を持つユーザーが書いています。
＊＊＊＊＊＊＊＊＊＊＊


ちなみに
/private/var/folders/xx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/0 不明
/private/var/folders/xx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/C 再起動しても保持されるキャッシュ
/private/var/folders/xx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/T 再起動すると消去されるキャッシュ

らしいです。

**4**
３で発見したフォルダの下にある
〜〜/com.apple.DeveloperTools/All/Xcode/EmbeddedAppDeltas
を削除
ただし自分はこれが何のファイルであるか特定できていません。僕の場合、これの削除で何事もありませんでしたが、それは自己判断にお任せします。

以上です。



##理由
個人的理由としては、Unity開発でXcode用ビルドした分全部のキャッシュが溜まっていたぽいです。
他のでそれができるかは検証してませんが、いろいろみてる感じではできるてるぽいです。

昔のOSであれば、セーフモードでさっぱりしてくれていたらしいですが、Mojave,Catalinaではしてくれないらしいです。
僕は400GB弱溜まってました。


##参考文献
#####XcodeのEmbeddedAppDeltasフォルダーとは何ですか？安全に削除できますか？
https://stackoverflow.com/questions/37955049/what-is-the-embeddedappdeltas-folder-in-xcode-and-can-i-delete-it-safely

#####フルディスクアクセス
https://support.intego.com/hc/ja/articles/360016683471-macOS-10-14-Mojave-%E3%81%A7%E3%83%95%E3%83%AB%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B

#####macにある大容量ファイルの削除について
https://discussionsjapan.apple.com/thread/110198584
clspv(OpenCL カーネル記述 -> SPIR-V -> Vulkan 実行) で C++17 言語機能を使う

漢なら, C++17 で Vulkan compute kernel 書いて機械学習やらレイトレーシングやりたいですよね!

clspv https://github.com/google/clspv が最近(2020 年 1 月 23 日時点), clang/llvm 最新(https://github.com/google/clspv/commit/50e3cd23a763372a0ccf5c9bbfc21b6c5e2df57d 現状では version 11?)に対応したので C++ for OpenCL により C++17 言語機能が使えるようになりました.

clang 9 C++ for OpenCL のメモ
https://qiita.com/syoyo/items/5350e2dc5cc5dc33c12a

STL などは使えないですが, 構造化束縛の構文など使えます(現状, C++17 以前のコードと互換性がないという warning が出る). Metal Shading Language(C++14(?) ベース)っぽい感じでシェーダやら compute kernel やらかけるようになります. 

## 使い方

`clspv -cl-std=CLC++ -inline-entry-points input.cl -o bora.csv`

と, `-cl-std=CLC++` を指定します(大文字小文字区別します). `-inline-entry-points` も必要です. デフォルトで C++17 言語モードになります.

コンパイルはそこそこ時間かかります(clang/llvm を Release ビルドすれば早くなるか?) 

これで Vulkan で機械学習, レイトレーシングの開発が捗りますね!

## TODO

* [ ] Vulkan 1.2 をバックエンドにすることで, Vulkan 1.2 の改善されたメモリモデルで, より CPU/CUDA 言語などの汎用 compute カーネルが記述ができるか調べる. 
* [ ] cppast https://github.com/foonathan/cppast を使って, Metal シェーディング言語のように attribute, qualifier やアノテーション(e.g. `[[texture(0)]],`) を抜き出してランタイムへ情報を渡すことができないか調べる.
* [ ] 優秀な OpenCL, Vulkan 若人さまが, **clspv で C++17 言語機能をお極めになられることで人類史上最速で優秀な C++17 Vulkan 若人さまへと昇華なされるスキーム**を確立する旅に出たい.
MagicaVoxelからインポートしたオブジェクトに当たり判定をつける(コライダー)

MagicaVoxelからインポートしたオブジェクトは、親子になっているので、親にはRigidbody
<img width="208" alt="d01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/2b675467-28f5-7358-fa1b-1455f1b77ca5.png">

<img width="390" alt="d02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/47278f3f-ebed-416f-116f-c40bcb66e887.png">

<img width="388" alt="d03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/60f13a40-cc13-4144-ce1a-91748fb4592c.png">

子にはコライダーを設定する
<img width="189" alt="d04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/9a714b0f-3e52-55eb-034c-ec98eda64a76.png">
<img width="386" alt="d05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/e4b1848c-c2e0-5173-79da-fe0b6a48fd4d.png">

<img width="390" alt="d06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/a6739fea-bacf-7705-4f87-77c6d066e0c2.png">
個人メモ - Loglyのオーディエンスの嗜好をCookieに基づかずに識別する広告配信サーバーの技術に関するメモ

「インターネット広告配信においてCookieなどのユーザーを一意に特定する技術を使用せずに、ユーザーの属性を推定する技術」とはどんなものなのか特許をチェックしたメモ。この記事にちゃんとした情報をまとめるためではなく、読解の練習として、特許のドキュメント自体を自分がちゃんと読めるようにするという位置づけ
https://www.j-platpat.inpit.go.jp/

#前提
2019年05月10日 プレスリリース [Cookieを使用せずにユーザー属性を推定する技術を確立し、特許を取得](https://corp.logly.co.jp/news/20190510/000095)
>ログリー株式会社（本社：東京都渋谷区、代表取締役：吉永浩和、証券コード：6579、以下：ログリー）は、インターネット広告配信においてCookieなどのユーザーを一意に特定する技術を使用せずに、ユーザーの属性を推定する技術を確立し、特許を取得いたしました。（特許：第6511186号）

2020/1/8 [＜マザーズ＞ログリーが大幅高　「ネット広告、クッキー離れ」報道で思惑](https://www.nikkei.com/article/DGXLASFL08HMZ_Y0A100C2000000/?n_cid=SPTMG002)
>8日付の日本経済新聞朝刊は、ネット広告の「『クッキー』と呼ばれる閲覧履歴データを巡り、広告主企業の間で利用を見直す動きが広がっている」と報じた。ログリーはクッキーを使用せずにユーザー属性を推定する技術を保有しており、利用者拡大の思惑から買いが入っている。

#サマリ
##オーディエンスの嗜好をCookie(オーディエンスID)に基づかず識別する技術
≫特許第6511186号 のドキュメント
【登録日】平成31年4月12日(2019.4.12)

後述の[オーディエンスの嗜好をCookieに基づいて識別する技術](https://qiita.com/MasatoEmata/items/44f0a327748c826b28a1#%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%A8%E3%83%B3%E3%82%B9%E3%81%AE%E5%97%9C%E5%A5%BD%E3%82%92cookie%E3%81%AB%E5%9F%BA%E3%81%A5%E3%81%84%E3%81%A6%E8%AD%98%E5%88%A5%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93)を補完する機能。

>【課題】匿名識別情報を有しないオーディエンスの属性を推定することにより、匿名識別情報を有しないオーディエンスに対して適切な広告を配信することが可能な広告配信システムを提供する。
>【解決手段】広告配信サーバは、既知オーディエンス(Cookieを許可しているオーディエンス)のアクセス情報を所定のパターンに分解してから、ナイーブベイズアルゴリズムを用いた学習処理を行う。そして、未知オーディエンス(Cookieを許可していないオーディエンス)のアクセス情報を所定のパターンに分解してから、ナイーブベイズアルゴリズムを用いた推定処理を行う。


①まず、（「オーディエンスアクセス情報取得部」は）既知オーディエンスが使用する端末、及び未知オーディエンスが使用する端末から、アクセス情報を取得する。このアクセス情報は、「オーディエンス行動履歴データ」に記録される。(【００３８】)

②(「学習処理部」は)「オーディエンス行動履歴データ」に基づき、既知オーディエンスに属性情報を付与したりパターンテーブルを作成したりする。(【００４１】)

※「パターン」とは、既知オーディエンスが使用する情報端末、及び未知オーディエンスが使用する情報端末から得られるアクセス情報の構成要素を部分的に抜粋し、正規化を施すことによって、アクセス情報を再構築した情報である(【００４４】)


③（「基本判定処理部」は）未知オーディエンスのアクセス情報を手がかりに、パターンテーブルを参照し、既知オーディエンスのアクセス情報と属性情報から未知オーディエンスの属性情報をナイーブベイズアルゴリズムに基づいて推定する。(【００３８】～【００４０】、【００５１】)

④(「広告配信サーバ」は)これに基づいて広告のオークションおよび配信を行う。(【００２０】、【００２１】)


##オーディエンスの嗜好をCookieに基づいて識別する技術
≫特許第6329015号 のドキュメント
【登録日】平成30年4月27日(2018.4.27)

①あるデバイス(ブラウザ)が広告主サイト及びポータルサイトにアクセスしたとき、アクセス情報を取得するためのJavascriptが処理される。これにより、広告サーバーにCookieを含むHTTPリクエストが送信される。

②このCookieは広告サーバーが発行するもので、オーディエンスが使用するブラウザを一意に識別するための「オーディエンスID」が含まれる。これにより、それを受信する広告サーバーでは日時、オーディエンスID、URLなどのログテーブルを生成できる

③広告サーバは、URLからアクセスできるHTML情報から主要なキーワードを抽出し、URLリストに紐づける。またそれが広告主サイトであればセグメントID(広告主の企業名)を紐づける。これによりオーディエンスId,キーワード,セグメントIDが紐づけられる。これらキーワード、セグメントを元にクラスタリング(嗜好の分類)を実施。

④広告主が所望のクラスタを指定すると、広告配信サーバは、当該クラスタに属するオーディエンスIDを特定し、広告オークションに基づいて広告の配信対象とするか否かを決定する。

⑤ブラウザがページを読み込んだ時、(①のスクリプトとは別の)広告を要求するためのスクリプトが処理され、④により広告が表示される


---
何かあればお手数ですが、本記事か以下アカウントでお知らせください！

**\ *Follow Me!* /**
**[*Qiitaアカウント*](https://qiita.com/MasatoEmata)**
**[*Twitterアカウント*](https://twitter.com/masatoemata)**
SendGridでは親ユーザーだけでなくサブユーザーを使おう（＆サブユーザーに成り代わってAPIリクエストする）

SendGrid のマーケティングキャンペーンの利用料を定期的に監視する必要があった。

ここでは、親ユーザーで発行したAPI KEYを使ってサブユーザーに成り代わってリクエストする方法を紹介する。

# SendGridを親ユーザーのみで利用する場合の注意点
SendGridは、サブユーザーを使わずに親ユーザーのみで運用することができる。しかし以下の問題があるためサブユーザーを切って運用したほうが良い。

- IPアドレスがSPAMトラップなどに見舞われたとき、メールが届かなくなる
- IP Reputationが落ちてSendGrid側からユーザーを停止されると、メールが送れなくなる

> IPアドレスがSPAMトラップなどに見舞われたとき、メールが届かなくなる

こちらについては、サブユーザーごとに利用するIPアドレスを分散して利用するで対処できる

> IP Reputationが落ちてSendGrid側からユーザーを停止されると、メールが送れなくなる

IP Reputation とはメール配信の健全性を表す一つの指標。 [80%以上だとGood](https://sendgrid.com/docs/glossary/reputation-monitoring/)

ユーザー停止のリスクを減らすには、サブユーザーごとにIPアドレスを分けてIP Reputationを分散させておく対処が効く。

# 親ユーザーはサブユーザーに成り代われるが、データはほとんど独立している
親ユーザーは「Switch User」（下図）を利用することで、サブユーザーとしてログインすることができる。親ユーザーとサブユーザーがほぼ切り離されていて、サブユーザーを新規に作成するとほとんどの情報は引き継がれない。

親ユーザーからサブユーザーの統計情報やマーケティングキャンペーンの情報を閲覧するには、一度サブユーザーとしてログインする必要がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38967/6a56dc92-a380-d26e-2327-9ec1084f7e21.png)

# 親ユーザーで発行した API KEY でサブユーザーの情報を取得する
私は上述の問題点から、 SendGrid のサブユーザーは独立したチームや部署ごとに割り当てることをおすすめしている。一方で、サブユーザーごとの利用状況をモニタリングしたいという要求も出てくる。

親ユーザーで発行した API KEY を用いてサブユーザーごとの情報を取得したいと思って、 SendGrid のドキュメントを眺めてみた。

> サブユーザの代理で要求を行う
> on-behalf-ofヘッダを利用することで、親アカウントが特定サブユーザの代理で要求を発行できるようになります。この方法は、サブユーザの権限にスイッチすることなく、一括でサブユーザの設定を変更したり、管理したりする際に利用できます。このヘッダを利用する場合、シンプルに On-Behalf-Of: サブユーザのユーザ名 と指定するだけです。

出典: https://sendgrid.kke.co.jp/docs/API_Reference/Web_API_v3/How_To_Use_The_Web_API_v3/authentication.html#--

# SDK で成り代わる
REST API では **on-behalf-of を使えばいい** ということがわかった。 SDK でも対応していることを願って探してみると……。

SendGridAPIClientクラスの中に、impersonate_subuserというキーワード引数を見つけた。

https://github.com/sendgrid/sendgrid-python/blob/v6.1.0/sendgrid/sendgrid.py#L49-L54

以上をまとめてコードを書くと次のようになる。 これで `sg` はサブユーザーとして振る舞うことができる

```python

from sendgrid import SendGridAPIClient
import os

API_KEY = os.environ.get('SENDGRID_API_KEY')
subuser_username = 'SAMPLE_SUBUSER'

sg = SendGridAPIClient(API_KEY, impersonate_subuser=subuser_username)
```
Elastic BeanstalkでEC2インスタンスの拡張モニタリングを行う方法

`.ebextensions`のカスタムリソース機能で対応可能です

```:.ebextensions/Enhanced.config
Resources:
  AWSEBAutoScalingLaunchConfiguration:
    Type: AWS::AutoScaling::LaunchConfiguration
    Properties:
      InstanceMonitoring: true
```

似たような名前で拡張ヘルスモニタリングというものがありますが、こちらはEB環境のヘルスチェック用です

# 関連する記事
- [Elastic BeanstalkでALB固定レスポンスを扱う方法](https://qiita.com/yoshi-taka/items/9daa9ff979e0511bb013)
ReactNative(Expo)でオススメしたいライブラリ

ReactNativeを開発していて、しばらくしてからにこんなライブラリあったんだ！！
ということがしばしばあったので、ReactNativeの開発を始めようと思っている方向けに、オススメのライブラリを紹介していこうと思います。

# 採用したライブラリ

### native-base

当初、react-native-elementを導入していたが、
styleを書く手間を省けない。
アクションシートやツールチップなど、OS間の差分を吸収してくれるUIがなかっためにnative-baseに移行した。
githubのスターではreact-native-elementが上回っているが、
工数削減を目的とした場合は、native-baseの方が良いと思う。

### react-native-swiper

intro系のライブラリと比較してもswiperで事足りそうなので実装が手軽な点が魅 a了。


そのほかにも紹介予定のライブラリー・・・

#### lottie-react-native
#### react-navigation-redux-helpers
#### sentry-expo
#### expo-analytics-amplitude
#### expo-analytics
RubyでLeetCodeを解いてみた Palindrome Number

https://leetcode.com/problems/palindrome-number/

>Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward.

```ruby
# @param {Integer} x
# @return {Boolean}
def is_palindrome(x)
  return false if x.negative?
  if x.positive?
    arr = x.to_s.chars
    size = arr.size
    arr.each_with_index do |ele, idx|
      return false if ele != arr[size - idx - 1]
    end
    return true
  end
  return true if x.zero?
end
```

>Coud you solve it without converting the integer to a string?

文字列に変換しないパターンは思いつかなかった🙃
ReactNative(Expo)でイベントトラッキング　〜expo-analyticsの使い方をざっくりまとめる〜

ReactNativeでイベントトラッキングする時に候補に上がるのは、

1. firebase
2. amplitude 
3. expo-analytics

の３つだと思います。
今回は、そのうちの１つexpo-analyticsの紹介です。

expo-analyticsはWeb版GoogleAnalyticsのイベントトラッキングをReactNativeで簡単に利用できるようにしてくれているライブラリです。
正直、WebサイトでGAのイベントトラッキングをしたことがある人は、
使い方がほぼ同じなのでこの記事を見る必要はないです笑

リポジトリURL
https://github.com/ryanvanderpol/expo-analytics

# Events [イベント]
GoogleAnalyticsでの説明
https://developers.google.com/analytics/devguides/collection/analyticsjs/events?hl=ja

```js
analytics.event(new Event('eventCategory', 'eventAction', 'eventLabel', ‘eventValue’))

例）
analytics.event(new Event('Video', 'Play', 'The Big Lebowski', 123))
 .then(() => console.log("success"))
 .catch(e => console.log(e.message));
```

引数の対応表

|引数| フィールド名 | 値の型 | 必須 | 説明 |
|:--|:--|:--|:--|:--|
|第1引数| eventCategory | テキスト | はい | 通常はインタラクションに使用されたオブジェクト（例: 'Video'） |
|第２引数| eventAction | テキスト | はい | インタラクションの種類（例: 'play'） |
|第３引数| eventLabel | テキスト | いいえ | イベントを分類する際に使用（例: 'Fall Campaign'） |
|第４引数| eventValue | 整数 | いいえ | イベントに関連する数値（例: 42） |


# Custom Dimensions [カスタムディメンション]
GoogleAnalyticsでの説明
https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#cd_

ログイン状態や有料ユーザーなど独自で分析軸を定義したい時に使用する。
※最大２０個までなのでトラッキングクラスでインデックスを管理する必要がある
Google analytics版の解説
https://webtan.impress.co.jp/e/2017/09/21/26869

### GooleAnalytics管理画面の設定手順
GA管理画面で管理→プロパティ→カスタム定義にて、カスタムディメンションを作成。
「ユーザー」「セッション」「ヒット」「商品」のどれに紐づくかを設定。

### 実装
```js
analytics.addCustomDimension(1（作成したディメンションのインデックス番号）, 'Comedy’（ディメンション名）)

使いところわからないけど、削除も可能。
analytics.removeCustomDimension(1);
```

# Custom Metrics [カスタム指標]
GoogleAnalyticsでの説明
https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#cm_



数値の独自定義をしたい時に使用する、
こちらも最大２０個までなのでトラッキングクラスでインデックスを管理する必要がある

想定イメージ

- 電話のコール数
- アプリの起動回数
- 表示時間

フォーマット

- 整数
- 通過
- 時間

### 実装例

```js
analytics.addCustomMetric(1, 15);
analytics.removeCustomMetric(1);
```

# デバックモード
デバックモードをtrueにするとconsole.logに表示される。

```js
const analytics = new Analytics('UA-XXXXXX-Y', null, { debug: true })
```
Googleスプレッドシートで過去日付の行をグレーアウトする

#Googleスプレッドシートで過去日付の行をグレーアウトする

以下のような表を使って、過去日付の行をグレーアウトする方法をやってみます。
<img width="361" alt="スクリーンショット 2020-02-23 14.52.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530421/45d7da55-9ab2-eae4-26e7-686392c49ff7.png">


###1. 「表示形式」タブから「条件付き書式」をクリックする
<img width="497" alt="スクリーンショット 2020-02-23 14.56.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530421/5ad8ceb9-54eb-e0b0-8229-cb8008f545e6.png">




→以下のような条件式書式の設定画面が現れる
<img width="305" alt="スクリーンショット 2020-01-25 17.16.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530421/0129cdab-9a47-92de-88d8-f8d869f9f41f.png">


###2. 「範囲に適用」にグレーアウトする適用範囲を決定

```
A4:C17
```

###3. セルの書式設定の条件に「カスタム数式」を選択
###4. 条件を入力

```
=IF($C4="","",$C4<TODAY())
```


###5. 「完了」を押下

過去日付の行がグレーアウトされました！！　おけ！！
<img width="397" alt="スクリーンショット 2020-02-23 14.52.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530421/c20eece7-10be-ece9-1f9f-80087c43b828.png">
Elastic BeanstalkでALB固定レスポンスを扱う方法

Elastic Beanstalkでは直接ALB固定レスポンスを扱う方法はありません。
Beanstalkで利用しているALB側で設定しても、例えば環境をクローンすると消えてしまいます。

そういう時は`.ebextensions`のconfigファイルを使ってCloud Formationを実行しましょう。

特定のパスで`{"message":"fixed"}`を返却するサンプル

```:.ebextensions/fixed-response.config
Resources:
  fixedResponseRequestListenerRule:
    Type: AWS::ElasticLoadBalancingV2::ListenerRule
    Properties: 
      Actions: 
        -   Type: fixed-response
            FixedResponseConfig:
              StatusCode: 200
              ContentType: "application/json"
              MessageBody: '{"message": "fixed"}'
      Conditions: 
        -   Field: path-pattern
            PathPatternConfig:
              Values: 
                - "/api/fixedresponse"
      ListenerArn: { "Ref" : "AWSEBV2LoadBalancerListener" }
      Priority: 1000
```

以下は任意です
- `fixedResponseRequestListenerRule`という名前
- `priority`の値
- `MessageBody`の値

# 関連する記事
- [Elastic BeanstalkでEC2インスタンスの拡張モニタリングを行う方法](https://qiita.com/yoshi-taka/items/bd39c6138aed291502b5)
JetBrains DataGrip + WSL + SQLiteで快適なSQL開発環境をお手軽に構築する

# はじめに

所用でお手軽なSQL開発環境が欲しいな～と思って構築した環境に関する記録です。

PhpStormなどのIntelliJのIDEには、データベースを色々と操作できるDatabase Tool Windowという機能が付いています。（参考：[IntelliJ IDEA の Database Tool Windowはいいぞ](https://qiita.com/masudakz/items/d792f1d65b66a6d4554f)）

このDatabase Tool Windowがコード補完や便利な機能を持っており非常に使いやすいのですが、今回のようなSQLのみを使う場面でわざわざPhpStorm等のIDEを使うのは色々と面倒です。そこでSQLのみに特化したJetBrains製品を探したところ、[DataGrip](https://www.jetbrains.com/datagrip/)というエディタがあるのを見つけたため、それを使うことにしました。

しかし、DataGripからアクセスできるデータソースをお手軽に用意するための情報が少なく、多少手こずったので、この記事を執筆することにしました。

# 動作環境・使用ツール

- Windows 10
- WSL (Ubuntu 18.04 LTS)
- DataGrip 2019.3.2

DataGripのインストールは省略します。
またWSLそのもののセットアップに関しても、以下の記事などを参照してください。

[「Windows Subsystem for Linux(WSL)」セットアップガイド【スクリーンショットつき解説】](https://linuxfan.info/wsl-setup-guide)

# 手順

結論から言ってしまうと、Windowsのソフトウェア（DataGrip）から見えるディレクトリに、WSLでSQLiteのデータソースを作ってしまうのが一番お手軽だと思います。

まずWSLでSQLite3をインストールします。

```|bash|
$ sudo apt -y install sqlite3
```

次に`/mnt/c/develop/sqlite/`みたいなディレクトリに移動（作成）し、以下のように仮のテーブルを作るとデータソースを作ることができます。

```|bash|
$ pwd
/mnt/c/develop/sqlite

$ sqlite3 mysource.sqlite
sqlite> create table sample(id int, name text);
sqlite> .exit

$ ls
mysource.sqlite
```

作成したデータソースはWindowsだと`C:\develop\sqlite\mysource.sqlite`みたいに見ることができるので、DataGripのデータソースとして選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222054/47a464f0-f646-4a60-62e1-c457d5a33f84.png)
**Test Connection**ボタンを押せば、写真のように接続が成功することを確認できます。

あとは問題なくIDEの力を借りてDBを取り扱えるようになると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222054/683eda0a-f9e3-ed99-5800-7af1aff89056.png)

# あとがき

今回はSQLiteを使ったのでDataGripからはファイルを直接指定するだけでしたが、WSLにMySQLとかを入れた時には、DataGripなどのJetBrains製品からデータベースへのアクセスは可能なのでしょうか...

# 参考

- [PycharmのデータベースツールでリモートホストのSQLiteに接続出来ない](https://teratail.com/questions/160809)
python-aptについて

Ubuntuユーザーならわけもわからず使っているであろう`apt`コマンド。実はタイトルの`python-apt`が深く関わっている。以下、アップデートマネージャーの説明から引用しました。

#python-aptとは
>apt_pkg Python インターフェースは、Python プログラムから以下に示す様々な機 能の実行を簡単に行うことを可能とするために、内部の
libapt-pkg 機構への完全 なアクセスを提供します。
.
- Access to the APT configuration system
- Access to the APT package information database
- Parsing of Debian package control files, and other files with a
similar structure
.
同梱される 'aptsources' Python インターフェースは、sources.list ファイルの
設定を、リポジトリやディストリビューションのレベルで抽象化する機能を提供します。

#まとめ
pyenvいれたしシステム(/usr/bin/)のpythonは使わないから削除しちゃえ！と軽い気持ちで` apt remove --force-depends python`とかやらないように。大変な事態になります。
Ciscoスイッチやルータの中のライセンスファイルをFTP経由でコピー(copy license files via FTP)

Windows10のPCで、FTPサービスを起動
-------
コントロール パネル－プログラム
Windowsの機能の有効化または無効化
インターネット インフォメーション サービス以下の
［FTP サーバー］→［FTP Service］
［Web 管理ツール］→［IIS 管理コンソール］
を有効にする

ユーザーを作成
-------
［コンピュータの管理］－［ローカルユーザとグループ］－［ユーザー］

FTPサイトの作成
-------
［コンピュータの管理］－［サービスとアプリケーション］－［インターネットインフォメーションサービス（IIS）マネージャー］
ウィンドウ中央の接続の一覧の空欄を右クリックし、［FTPサイトの追加］
［FTPサイト名］に適当な名前を入れる
［コンテンツディレクトリ］にFTPとして使用するディレクトリを選択する
次へ
［SSL］を無し
次へ
［認証］の［基本］にチェックを入れ、［承認欄］の［アクセスの許可］に［指定されたユーザー］を選択し、先程作成したユーザー名を入れる
［アクセス許可］の［読み取り］と［書き込み］にチェックを入れる

ファイアウォールの設定
-------
［コントロールパネル］－［システムとセキュリティ］－［Windowsファイアウォール］
［Windowsファイアウォールを介したアプリまたは機能を許可］
［設定の変更］－［FTPサーバー］－［プライベート］にチェックを入れる

-----
==Cisco側==
-------
CONSOLEケーブルとネットワークケーブルをつないだ後に、電源を入れる
Terateamでつなぐ(パスワードがある場合は先にリセットしておく)

en
conf term
ip ftp username ciscon
ip ftp password ciscon
end
sh ver
license save FXXXXXXXXXX(システムシリアルナンバー).lic
copy flash:FXXXXXXXXXX.lic ftp:
192.168.1.75 (FTPサーバーのアドレス)


...That's all. ☆ Knowledge of zealous young🌙🐰
Microsoft Ignite Osaka 1/23 APPS20

# APPS20 クラウド内のデータ格納に関するオプション

MicrosoftIgniteOsaka

1/23 session2 APPS20 クラウド内のデータ格納に関するオプションのメモです。

## Tailwind Tradersが重視していること

- 迅速なプロビジョニング
- 新規サービスによる既存環境への影響を回避
- 可能な限り開発者へ管理を移譲
- 運用の手間なくストレージを動的にスケール
- 適切なツールで作業を実施

### データ格納戦略の重要性

旧来の運用プロセスからのスムーズなアップグレード（リフトアンドシフト）
製品やサービス、昨日の迅速な作成・構築（チューニングとかに時間を取られない）
サービスや機能を分割し、管理しやすい粒度に構成
コンテンツの保護、セキュリティの維持

### ツールの選定基準

#### データの構造

- 非構造化データ（Storage）
- 構造化データ（RDB）
- 半構造化データ（NoSQL）

#### データの特性

- 量
- スピード
- 多様性

### Storage

#### Azure Storage Service

- IaaS
  - Disks
  - Files
- PaaS
  - Blobs
  - Tables
  - Queues

#### Blob Storage Service

非構造化データの格納向き

- アプリやWebスケールのデータ
- バックアップ、アーカイブ
- IoT、ゲノム解析などで生成されるビッグデータ

複製可能
暗号化されている（AES256）

証憑保全のために、一度追加したファイルを変更させない。（領収書など変更してはいけないデータの保全）

- Immutable storage（不変ストレージ）を利用する。

### RDB

- SQLDatabase
- Azure Synapse Analytics
- MySQL
- PostgreSQL
- MariaDB

#### SQLDatabase

- Single
- ElasticPool（マルチテナントなど）
- ManagedInstance（リフトアンドシフトなど）

#### アプリケーションシークレットの管理

- AzureKeyVault

→これはAPPS10にもでてきた

AzureFunctionsやAppServiceからシークレットにアクセスしたい
→KeyVaultは環境変数設定ができる。アプリからは環境変数を読むようにする。

AKSからシークレットにアクセスしたい
→FlexVolumeを利用する

### Azure CosmosDB

- MongoDBやCassandraのワイヤープロトコルでアクセス可能（クライアントの接続文字列を変えれば接続できる）
- インデックスは全フィールドに自動設定
- 指定したパーティショニンキーで自動パーティショニング
- 地理冗長（シングルマスター、マルチマスターとも）

注意点として、MongoDBの最新バージョンと必ずしも互換性があるわけではない。
移行する場合、バージョンに問題がないかは確認が必要。

複数リージョンの書き込みを有効にするをチェックすると、マルチリージョンの書き込み/読み込みができるようになる。

#### 見積り

Cosmos RU Calculator
https://cosmos.azure.com/capacitycalculator/

### Key takeaways

データ格納戦略の重要性
戦略に基づいた適切なツールの利用

- データ構造や特性
- 増大するデータへの対応
xfce4ターミナルのthemeを追加

https://github.com/chriskempson/base16-xfce4-terminal

```
$ git clone https://github.com/chriskempson/base16-xfce4-terminal
$ cd base16-xfce4-terminal
$ ./convert2themes
$ sudo cp themes/*.theme /usr/share/xfce4/terminal/colorschemes/
```
Microsoft Ignite Osaka 1/23 APPS10

# APPS10 クラウドでアプリをビルドして実行するためのオプション

MicrosoftIgniteOsaka

1/23 session1 APPS10 クラウドないのデータ格納に関するオプションのメモです。

APPSの学習にはAPPS10〜APPS50まである。このセッションは入り口のAPPS10。

### 本セッションの内容

- デプロイメントツール
- 展開オプション
- 基本的なセキュリティの機能

## デプロイメントツール

### VisualStudio

- マルチプラットフォーム
- ワークロードによってカスタマイズ可能
- 多言語（C++,C#,Node,Python,JS,TS etc...）
- 多数の拡張機能（言語パック、単体テスト、データベース）
- ライブシェア（リモートでのペアプロなどができる）

### VisualStudioCode

- 組み込みのGitコマンド
- 拡張性とカスタマイズ性（最近Javaが入ったのが大きい）
- 全てのプラットフォームでの完全なサポート（Linuxもサポートしている）
- RemoteDevelopmentプラグインで、リモートホストへのSSH接続ができる

### Azure Portal

Azureのリソース管理を画面でぽちぽちやるやつ。

### ターミナルとCLI

- AzureCLI (azコマンド）
- AzurePowerShell
- クラウドシェル

Windowsになれてる人はPowerShell、LinuxやMacの人はazコマンドの方が親和性がある。

### ARMテンプレート

リソース管理をjsonテンプレートとして管理するもの。
AWSのCloudformationと同じ感じ。

https://aka.ms/azArm

## 展開オプション

### AzureBlob静的Webサイト

- 非常に低コスト
- 非常に高速ですが、
- 静的です。

React/Angular/Vue.js/Blazorのようなjsフレームワークのデプロイ。

### Webアプリ

- クライアントとしてもサーバーとしても利用可能
- PaaSの全機能（バックアップ、監視など）
- WindowsとLinux
- コンテナにも対応

### コンテナ

- Azureコンテナインスタンス(ACI)
- Azure Kubernetes(AKS)

ACSは1/30で終わるので間違っても使わない。

### 仮想マシン

- よく知られた技術
- ほとんどのテクノロジのサポート
- スケールセットにデプロイする場合、非常に柔軟性が上がります。
- 共有イメージギャラリーにテンプレートを置いておいたらすぐに増産できる。

VirtualMachineScaleSet

スケールするVM、publicIP、ネットワーク、LBなどが作られる。

## 基本的なセキュリティの機能

人が増えてきたらパスワードがわからなくなる人が出てくる

### KeyVault

暗号鍵、証明書、パスワード、SQL接続文字列、ストレージアカウントキーなどを管理

- セキュア
- 全部１箇所
- 有効/無効
- 世代管理
- RBAC

KeyVaultへのアクセス権限はAzureADで管理している。
WebAPPに権限付与しなければ、見れなくもできる。

### モバイル

Xamarinの紹介
Vuetify2.xでサウンド再生した

## 概要

外部でなく、自前（ローカル）にあるファイルをぺろっとVuetifyのプロジェクトで音再生したかった。
そのあたりのメモ。

## こまったこと

ぐぐったかんじwebpack.config.jsとかでwavファイルとかmp3ファイルをローディングできるように設定する例があった。
しかしvuetifyの標準プロジェクトだと、設定ファイルとしてplugins/vuetify.jsとvue.config.jsがあるが、webpack用なるファイルはない。

[Vue + Nuxtでボードゲームを6時間で作ってみた](https://qiita.com/dorarep/items/b9783ea6cd18308a06a0)という記事ではnuxtの設定ファイルで拡張子ルールを追記してる...

sassとかのローディングもおなじような設定したことが昔はあったなと、ググると次の記事をみつけた。
→ [Vuetify v1.3で追加されたvuetify-loaderが便利だった](https://qiita.com/d-yosh/items/4740c25daf634d483425)

:thinking: これはimportすれば自動で解決してくれるってこと?


## 解決編

コンポーネントでimportすれば勝手に解決してくれた。
再生部分については、[こちらの記事](https://tutorialmore.com/questions-847191.htm)を参考にした。

```:main.js
Vue.prototype.$playSound = (path, volume = 1) => {
  var audio = new Audio(path);
  audio.volume = volume
  audio.play();
}
```


```:Hoge.vue
<template lang="pug">
  v-btn(@click="playSound") ほげー
(中略)
<script>
    import sndHoge from '../assets/sounds/hoge.wav'
(中略)

        methods: {
            playSound() {
                this.$playSound(sndHoge, 10)
            },
(以下略)
```

### まとめ

うごいてるからヨシ！ (buildしたときにデカくなるとか何か影響はでそうだが、未確認)
sorted

```py:点数の低い順
ranking = {
    'A':100,
    'B':80,
    'C':95
}

print(sorted(ranking, key=ranking.get))
```

```:実行結果
['B', 'C', 'A']
```

```py:点数の高い順
ranking = {
    'A':100,
    'B':80,
    'C':95
}

print(sorted(ranking, key=ranking.get, reverse=True))
```

```:実行結果
['A', 'C', 'B']
```
オブジェクトを出して、サイズを変えたりする

<img width="317" alt="y.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/eb5a1a37-3b29-8f22-193b-a3896cf076b4.png">
<img width="209" alt="z.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/064d4a73-79be-70dc-137d-dd8bb84cc8ea.png">
<img width="389" alt="a01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/d0a4a6ff-f12d-8099-fb5e-a16069a43919.png">
位置...置いてある場所
回転...xyz軸を中心に回転
拡大/縮小...xyz軸で大きくなったり小さくなったり

回転は、各軸を見立てた竹串を、オブジェクトに差して回転と考えればわかりやすい
下図では、y軸である緑の竹串がキューブの真ん中に刺さっている様子
<img width="209" alt="a02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/f0b10160-eacf-c304-f405-e5d38c8b756d.png">
<img width="376" alt="a04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/bbcce8c5-1972-3c29-785b-23c36cb33149.png">
<img width="150" alt="a03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/e74749b3-5339-e43c-5e4f-2cac6e33e10e.png">
Ubuntu17.10以降でConoHaの追加IPを設定する

[ConoHa](https://conoha.jp/)の追加IPアドレスを使う場合、自分でVPSにルーティングの設定をする必要があります。

[追加IPアドレスを使う｜ConoHa VPSサポート](https://support.conoha.jp/v/setipv4/)

Ubuntuは17.10あたりからネットワークの設定に `netplan` が使われていて、最新のLTSであるUbuntu 18.04 LTSでも使われています。ConoHaの公式ドキュメントにはnetplanを使った設定は無かったので、以下にメモとして残しておきます。

## 設定

### コンパネの設定

[公式ドキュメント](https://support.conoha.jp/v/setipv4/)にある

* 追加IPアドレスの申し込みと、VPSへの割り当て
* ネットワークインターフェイスの確認

の2つををあらかじめ済ませておきます。最後の「VPSの設定」はCentOS向けなので不要です。

### IPルーティングテーブルの追加
追加IPアドレス向けのルーティングテーブルを追加します。conoha-additionalの部分は何でも良いです。

```shell
# vim /etc/iproute2/rt_tables.d/conoha.conf
201     conoha-additional  # ←conoha.confを作成してこの行を追加する
```

### netplanの設定

netplanの設定ファイルは `/etc/netplan/10-gmovps.yaml` にあります。このファイルを編集します。

* eth0 の部分は変更不要です。`eth1:` から下の部分を追加してください
* [追加IPアドレス]や[ゲートウェイ」の情報は、コントロールパネルの「ネットワーク設定」にあります
* このサンプルはeth1となっていますが、これは環境依存です。コマンド`ip a`などを実行して、追加IPアドレスが使うネットワークインターフェイスを確認してください

```yaml
network:
    ethernets:
        eth0:
            addresses: []
            dhcp4: true
            dhcp6: false
            accept-ra: false
            optional: true
        eth1:
            addresses: ["[追加IPアドレス]/[サブネットマスク]"]
            dhcp4: false
            dhcp6: false
            accept-ra: false
            optional: true

            routes:
                    - to: "0.0.0.0/0"
                      from: "[追加IPアドレス]"
                      via: "[ゲートウェイ]"
                      table: 201
            routing-policy:
                    - from: "[追加IPアドレス]"
                      table: 201
    version: 2
```

そしてnetplanの更新を反映させます。

```shell
netplan apply
```

これで追加IPアドレスが設定されていればOKです。

```shell
ip a
```
docker-composeでs3 bucketをつくる


s3を使ったアプリケーションの開発用にローカルでlocalstackやminio等を使う場合に
docker-compose内でs3 bucketをつくる

## 最終

localstackの場合

```yml
services:
  storage_init:
    image: maruware/awscli-wait-for-it
    environment:
      - AWS_DEFAULT_REGION=ap-northeast-1
      - AWS_DEFAULT_OUTPUT=json
      - AWS_ACCESS_KEY_ID=access
      - AWS_SECRET_ACCESS_KEY=secretsecret
    depends_on:
      - localstack
    entrypoint: >
      /wait-for-it.sh localstack:4572 -- 
        bash -c "aws --endpoint-url=http://localstack:4572 s3api head-bucket --bucket bucket || 
        aws --endpoint-url=http://localstack:4572 s3 mb s3://bucket/"
```

## 経過

>[localstackでS3をモックした - 勉強日記](https://wand-ta.hatenablog.com/entry/2019/03/10/215639)

今までアプリケーション内で分岐してBucketをつくっていたけど、上記で見かけて良さそうだったので参考に。
volumeのマウントとかめんどくさいので[image内にwait-for-it.shも入れた](https://hub.docker.com/repository/docker/maruware/awscli-wait-for-it)。

Bucketがないときだけ登録したいのでhead-bucketをはさむようにした。
オブジェクトの出し方

ヒエラルキーウィンドウの　作成　をクリックする
<img width="344" alt="t.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/7d72bbe6-d4be-13a7-fdc7-b2006f4d6f9e.png">
<img width="173" alt="u.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/0b6affdf-5dd8-471e-bb30-2a9ef4918509.png">
キューブを出したいときは、
　3Dオブジェクト　→　キューブ　をクリックする
<img width="316" alt="v.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/3fa90b2c-df8c-07cf-d473-af98866f24ad.png">
このように出てくる
<img width="110" alt="w.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/923ace32-46b1-8c2a-5345-35648cadfa1c.png">
キューブ...立方体
スフィア...球体
カプセル...鼻炎カプセルみたいなやつ
シリンダー...円柱
<img width="408" alt="x.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/da3d83ac-580f-f6cc-5464-e5c61345c7e2.png">