OmniAICreator/Qiita-1.07M huggingface dataset:
at coder beginner 006

B
トリボナッチ数列というものがあります。この数列は3つ前までの数字を足したものです。
厳密には、
a1=0, a2=0, a3=1 
an=an−1+an−2+an−3 
この数列の第 n 項、an を 10007 で割った余りを求めてください。

```
#include<iostream>
using namespace std;
int main() {
	int n;
	cin >> n;
	int dp[1000010];
	dp[0] = 0;
	dp[1] = 0;
	dp[2] = 1;
	for (int i = 3; i < n; ++i) {
		dp[i] = (dp[i - 1] + dp[i - 2] + dp[i - 3]) % 10007;
	}
	cout << dp[n-1]  << endl;
	return 0;
}
```
こういう系初めて出てきたな

C
新学期に向けて新たな気持ちで通学しているあなたの前に、スフィンクスが立ちふさがっています。
このスフィンクスは「なぞなぞ」を出すことで有名で、このなぞなぞに答えられない場合、留年します。 
なぞなぞは以下のとおりです。
「この街には人間が N 人いる。人間は、大人、老人、赤ちゃんの 3 通りだ。
この街にいる人間の、足の数の合計は M 本で、大人の足は 2 本、老人の足は 3 本、赤ちゃんの足は 4 本と仮定した場合、存在する人間の組み合わせとしてあり得るものを 1 つ答えよ。」 
新学期早々留年したくないあなたは、このなぞなぞに正解する必要があります。
なぞなぞの答えとなる「この街に存在する人間の組み合わせ」を 1 つ出力してください。
もし、そのような組み合わせが存在しない場合は-1 -1 -1と出力してください。 

```
#include<iostream>
using namespace std;
int main() {
	int N, M;
	cin >> N >> M;
	int resH = -1, resO = -1, resB = -1;
	for (int i = 0; i <= N; ++i) {
		for (int j = 0; i + j <= N; ++j) {
			int k = N - i - j;
			int total = i * 2 + j * 3 + k * 4;
			if (total == M) {
				resH = i;
				resO = j;
				resB = k;
			}
		}
	}
	cout << resH << " " << resO << " " << resB << endl;
	return 0;
}
```
これ前もやったなこれだと時間制限的に厳しいらしい

```
#include<iostream>
using namespace std;
int main() {
	int N, M;
	cin >> N >> M;
	int k = M - 2 * N;
	if (k < 0 || k>2 * N)cout << "-1 -1 -1";
	else {
		int b = 0;
		while (k > 1) {
			k -= 2, b++;
		}
		cout << N - b - k << " " << k << " " << b << endl;
	}
	return 0;
}
```
これなら時間的に大丈夫だった。老人の数は０か1ってことに着目するのが吉
D
数字が書かれたカードが N 枚あります。このカードの束（山札）に対して以下の操作が可能です。 
山札からカードを 1 枚抜き取り、任意の場所に挿入する。 
山札の上から下に向けて、カードを昇順に並べ替えるために必要な、最小の操作回数を求めてください。 

これは見方を変えれば最長増加部分列問題である。
lower_boundは指定した値以上の先頭の要素を指すイテレータを返す。upper_boundは指定した値より大きい先頭の要素を指すイテレータを返す。

```
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAX_N = 110000;
const int INF = 1e11;
int n;
int a[MAX_N];
int dp[MAX_N];
int solve() {
	fill(dp, dp + n, INF);
	for (int i = 0; i < n; ++i) {
		*lower_bound(dp, dp + n, a[i]) = a[i];
	}
	return lower_bound(dp, dp + n, INF) - dp;
}
int main() {
	cin >> n;
	for (int i = 0; i < n; ++i)cin >> a[i];
	cout << n - solve() << endl;
}
```
Go でシンプルな DI コンテナのライブラリを書いた

## tl;dr

* Go でシンプルな DI コンテナのライブラリを書いた
  * Dependency Injection の中でも Constructor Injection のみ
  * [go.uber.org/dig][dig] がどうしても受け入れられないミニマリスト向け
* [github.com/KoharaKazuya/conigo][conigo]

## Conigo の紹介

Conigo は Constructor Injection の実現をサポートするための DI コンテナを提供するライブラリ。インターフェースは [go.uber.go/dig][dig] に酷似していて、機能的にはほぼサブセット。

特徴は非常にシンプルであるということ。実装が 200 行程度、10 KB 未満しかなく、API が実質的に `Provide` と `Resolve` しかない。依存パッケージも `fmt` と `reflect` のみ。

Conigo は `reflect` を使っているため、煩わしさ感じずにコーディングできるわりには専用ツールによるプログラム生成などの通常のワークフローを壊すような仕組みは導入しなくて良い。

使い方は [GoDoc][] の Example を見てもらえれば割とすぐに分かると思う。
(自分の英語が伝わる気がしないので Example をいっぱい書いたつもり)

## 作った経緯

業務で Go を書くことになった。
HTTP サーバーを書くにあたり、サービスの生成の知識を分離するため DI パターンでコードを書いていた。以下のような感じのコードを書いていた。

```go
package hoge

type HogeImpl struct {
  ...
}

func New(fuga FugaServiceInterface) *HogeImpl {
  return &Hoge{fuga}
}

func (h *HogeImpl) Say() string {
  return h.fuga.String()
}
```

```go
package di

var (
  hogeSrv HogeServiceInterface
  ...
)

func InjectHoge() HogeServiceInterface {
  if hogeSrv == nil {
    hogeSrv = hoge.New(InjectFuga())
  }
  return hogeSrv
}

func InjectFuga() FugaServiceInterface {
  ...
}
```

愚直に Constructor Injection を手で書いていた。`InjectXXXX` が数多くできる感じ。似たようなコードを量産しないといけない煩わしさがあったが、サービスのインターフェースとサービスの実体を生成する泥臭い知識を分離できるので我慢していた。

が、いろいろ調べていると [github.com/facebookgo/inject][inject] やら [go.uber.go/dig][dig] などがスマートに DI を実現していて使いたくなった。ちなみに他の DI ツールも一応見てみたが、専用ツールで設定ファイルからコードを生成するものはどうしても受け入れられなかったので選択肢から外した。

それまで書いていたコードが Field Injection ではなく Constructor Injection で、今後も Field Injection を積極的に使うことはなさそうなので、[github.com/facebookgo/inject][inject] は一旦置いておき [go.uber.go/dig][dig] を導入しようと検討した。

dig の API を読んでいると、最も基本的な API でユースケースの大半をカバーできる気がしてきたので、自分で書いてみようと思い立った。また、ちょうど `reflect` 周りを触ってみたいと思っていたところだったのでタイミングが良かった。

経緯はそんな感じ。

## 作ってみた感想

Go の統合された便利さが素晴らしい。
godoc.org 良い。特に何も指示しなくても GitHub にコードを公開するだけでドキュメントが見れるようになる。
Testable Examples も良い。どの言語にもほしい。

Go の type と underlying type の関係が面白い。実行時の値の運用に互換性があるんだけど、型情報は定義したものがしっかり取れる。これのおかげで DI のために別名をサクッとつける、みたいなことができる。フワッとしか理解してないんだけど。

少ない実装量で「いい感じに」やってくれるものを作れて嬉しい。

自分で使ってバグを踏んでエラーメッセージが難しくて困ったので、メタプロ中心のライブラリはいかにエラー周りを難しないかに力入れたほうがいい気がした。言語開発者がつけてくれている補助輪を外すということなので。

---

作った愛着はあるから私は使うが、ミニマルだという点以外で dig に対して有利なところは発見してない。今後も、同様のものがほしい人にはまずは dig を勧めると思う。

Conigo はライブラリは全部読まないと信用できない、って人には刺さるんじゃないの (適当)

[conigo]: https://github.com/KoharaKazuya/conigo
[godoc]: https://godoc.org/github.com/KoharaKazuya/conigo
[dig]: https://github.com/uber-go/dig
[inject]: https://github.com/facebookgo/inject
Docker内でcreate-react-appしたdev-serverに繋がらない

# Docker内でcreate-react-appしたdev-serverに繋がらない

ということがありました。

__Docker for Mac__ を使用していました。

# ホスト名に `0.0.0.0` と指定したら繋がった

`create-react-app` の使用する環境変数 `HOST` に `0.0.0.0` と指定したら繋がった。
やったね。

# 経緯

### 設定

```yaml:docker-compose.yml
version: '3'
services:
  app:
    image: node:8
    ports:
      - 3000:3000
    volumes:
      - ./app:/app
    working_dir: /app
    tty: true
```

### 作成

`./app` に `npm i -g create-react-app` で __`Mac` に入れていた
`create-react-app` コマンドで__ プロジェクトを初期化しました。

### dev-server 起動

```bash
docker-compose exec app yarn start
```

ブラウザなどでアクセスしても繋がらない…。

## 修整

`./app` に `.env` を置いた。
（ `create-react-app` が読んでくれる。 ）

```bash:.env
HOST=0.0.0.0
```

## 試してないが別の方法で問題を起こさずに済むかもしれない

プロジェクトを初期化を下記のコマンドで行う。

```bash
docker-compose run --rm app yarn create react-app .
```

__Mac にインストールした `create-react-app` でなく__
ちゃんと内部でインストールして走らせれば上記の問題は __多分__ 起きないのでは。
GCP に CUDA 実験環境の準備

いつも AWS だったので、 GCP でもやってみる。
$300分お試し無料らしい


### GCP の環境構築手順

1. インスタンスを作成する（スペックとか適当）
2. ssh鍵の登録。VM落としている状態で、インスタンスを表示して編集、[ssh鍵がn個あります]のところの[表示して編集する]。テキストボックスにssh公開鍵をコピペ。買って認識される
3. 最後に[保存]
4. インスタンスを再度起動すると登録したssh鍵のユーザ名でアカウントができていてsloginできる
5. UDPが開いていないのでmoshでloginできない。そこでダッシュボードメニューの下の方に[VPCネットワーク]というのが隠れていて、そこの[ファイアウォール ルール]
6. [ファイアウォールルールを作成]で適当な名前で[トラフィックの方向]上り、[ターゲット]は全てのインスタンス（どうせ他でも使う）、[source IP]を0.0.0.0/0、[指定したport]でudpに60000-65535とか入れて[作成]
7. mosh loginすると```The locale requested by LC_CTYPE=ja_JP.UTF-8 isn't available here.```とか怒られて```sudo locale-gen ja_JP.UTF-8```する

LTSなので対してすることないが、apt-get update/upgrade/dist-upgradeするとか、普段使いのdot files転送するとか（.screenrc, .zsh{env,rc}, .zlog{in,out}）、chshしようとするとパスワードがわからないので```sudo env EDITOR=vi vipw```してlogin shellを/bin/zshに変える。


### GCP での GPU 利用環境構築手順

インスタンス作成でGPUありのインスタンスを作ればいい。
ただし、リージョンによってGPUの種類・有無がいろいろある。

身近な（？）主だったところだとこんな感じ

|region|利用できるGPU|
|------|-----------|
|us-east1| Tesla P100|
|asia-east1| Tesla K80, P100|
|asia-northeast1| なし|
|そのほかasia|なし|
|us-west1| Tesla K80, P100|

tokyoであるところのasia-northeast1だとそもそもGPU使えない。
しかしasia-east1（台湾）なら使えるんでここでいいじゃん。
特にP100じゃないとダメな使い方をするわけではない。

以下手順

1. GCPダッシュボードから、[Comute Engine]の[VMインスタンス]
2. [インスタンスを作成]
3. [リージョン]で[asia-east1]を選んで
4. [マシンタイプ]を[カスタマイズ]
5. [GPUの数]で1を選んで
6. [ブートディスク]を[変更]
7. CUDAを手で入れようと思うが、CUDAのサポートしているのがubuntuだと16.04か17.10（そろそろ18.10じゃないのか？）。一方GCP側で用意されているのは16.04LTSか18.04LTSなので[ubuntu 16.04LTS]を選んで
8. 念のため、ブートディスクの[サイズ(GB)]を[30]にして[選択]
9. [管理、セキュリティ、ディスク、ネットワーク、単一テナンシー]を選んで、[セキュリティー]タブを選んでテキストボックスに[ssh 公開鍵をコピペ]
10. [作成]を押すとインスタンスの作成と起動が始まる（はず）

起動したらssh loginして、cudaの通常のインストール

↓これ
1. `sudo dpkg -i cuda-repo-ubuntu1604_9.2.148-1_amd64.deb`
2. `sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub`
3. `sudo apt-get update`
4. `sudo apt-get install cuda`

インストールできた nvcc で、昔の自分のcudaコードコンパイルして見たが、
アカウントのアップグレードとか、クォータの申請とかやらずに特に何事もなく動いている
gloud sdkとやらはまだ一度も使っていない
rsyncの安全な使い方

最近rsyncの使い方を間違え、ローカルのホームディレクトリ全部消えちゃった！
みたいな恐ろしい事件が身近で起きました。自分も間違えないために復習がてら安全な使い方をまとめます。

# リモート先サーバーでrsyncできているか確認する

rsyncはsshで接続しているので、リモート先サーバーでtail -f secureしてちゃんと繋がっているか確認する。

```
sudo tail -f /var/log/secure
```

そしてrsyncする時にはnをつけてドライランする。

```
rsync -avzn コピー元ドメイン又はIP:フォルダのパス コピー先ドメインまたはIP:フォルダのパス
```

リモート先サーバーのsecureでログが流れたら繋がっている。
逆に流れなかったらIPが違ったり別のサーバーに流れていってるかもしれないので確認する。
また、ドライランでエラーも確認できるのでエラーが発生していないか確認。
問題なければnを外す。

```
rsync -avz コピー元ドメイン又はIP:フォルダのパス コピー先ドメインまたはIP:フォルダのパス
```

また、大量のデータを送る場合、サーバーに負荷がかかるのは不安なので、帯域制限をかけるため—bwlimitオプションをつける。
単位はkB/sec。

```
rsync -avzn —bwlimit=1024 コピー元ドメイン又はIP:フォルダのパス コピー先ドメインまたはIP:フォルダのパス
```

# 最後に

rsyncは一つ間違えると大変なことになるのでとにかく確認して気をつけよう。。
PyPlotでグラフ描いてみる

今度のセミナーの予習として、PyPlotでグラフを描いてみる。
メモとして残す。

まずは、python3用のmatplotlibをインストール。グラフ描画のライブラリと思われるgi-cairoも入れるらしい。
(当方の環境はxubuntu 32bit。Pentium Mでもちゃんと動いたよ)
> sudo apt-get install python3-matplotlib python3-gi-cairo


```test_pyplot.py
import matplotlib.pyplot as plt
import numpy as np

'''ランダムデータ作成'''
x = np.linspace(0, 10, 20)
y = x + np.random.randn(20)

'''プロット'''
plt.plot(x, y)
plt.show()
```
こんな感じ。かんたんだね！
![スクリーンショット_2018-09-10_23-27-18.png](https://qiita-image-store.s3.amazonaws.com/0/283529/150a0f7a-38a8-4c9a-e69b-7923a4624dea.png)
tornado >= 5以上がインストールされたjupyter-notebook上でevent_loopを扱うとRuntimeError: This event loop is already runningになる

# 問題

`jupyte-notebook` を動かしているサーバではフレームワークに `tornado` を使っている。

`tornado　>= 5` のバージョンがインストールされた `jupyter-notebook` 上では、 `asyncio` モジュールの `event_loop` を扱うと `RuntimeError` となる。

[GitHub | jupyter/notebook | Can't invoke asyncio event_loop after tornado 5.0 update #3397](https://github.com/jupyter/notebook/issues/3397)

### 動かなかったサンプル

`pyppeteer` を試そうとしたら遭遇した。。普通のREPL上では動くけど`jupyter-notebook` 上では動かない。

```python
import asyncio
from pyppeteer import launch

loop = asyncio.get_event_loop()

async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.goto('http://example.com')
    await page.screenshot({'path': 'example.png'})
    await browser.close()


loop.run_until_complete(main())
```

### 結果

```python
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-16-b0a5d64b1fb0> in <module>()
----> 1 loop.run_until_complete(main())

~/.anyenv/envs/pyenv/versions/3.6.4/lib/python3.6/asyncio/base_events.py in run_until_complete(self, future)
    452         future.add_done_callback(_run_until_complete_cb)
    453         try:
--> 454             self.run_forever()
    455         except:
    456             if new_task and future.done() and not future.cancelled():

~/.anyenv/envs/pyenv/versions/3.6.4/lib/python3.6/asyncio/base_events.py in run_forever(self)
    406         self._check_closed()
    407         if self.is_running():
--> 408             raise RuntimeError('This event loop is already running')
    409         if events._get_running_loop() is not None:
    410             raise RuntimeError(

RuntimeError: This event loop is already running
```

# 解決策

> If I specify tornado==4.5.3 before pip install jupyter, it works fine

とのこと

```sh
$ pip install tornado<=4.5.3
$ pip install jupyter
```

`jupyter` の `requirements.txt`ではtornadoのバージョンは4以上であればよい、となっているので、更新はかからない。

# 原因

issue見る限り以下が原因だけど、よく分かっていないです。誰かご解説を。。

[What’s new in Tornado 5.0 | backwards-compatibility-notes](http://www.tornadoweb.org/en/stable/releases/v5.0.0.html#backwards-compatibility-notes)

> "On Python 3, IOLoop is always a wrapper around the asyncio event loop."
Safariで日付の処理がうまくいかない件について（JavaScript）

# SafariでJavaScriptがうまく動かないんですけど
どうやらみんな苦労しているらしい。

# 何が起きるか
データの時刻を現在時刻と比較して、後続処理に渡すものをJavaScriptで書いてたりする。
new Date()するときに各ブラウザによってきちんとDateが生成できる引数と、そうでない引数があるらしい。

あと、ブラウザによって、JSTだったりUTCだったりする。

→よって、時間が9時間ずれたり、日付型にならなかったりする。

#どうするか
モノによるけど、こいつに合わせるのが一番無難っぽい

```Javascript
let date = new Date(“YYYY-MM-DDTHH:mm:ss+09:00”) // YYYY~は任意の日付
```

日付を生成するときの共通関数を作って
それに渡すようにすれば楽かな？


参考
http://artteknika.hatenablog.com/entry/2016/10/02/163609
【swift】 タプルの配列で指定した要素のindexを取得する。

【swift】 タプルの配列で指定した要素のindexを取得します。
("学級", "名前", テストの点数)のタプル配列を testScores とします。
下記では「3年B組の田中さん」のindexを検出し、その点数(score)を40点から90点に変更します。

```swift
        typealias TestScore = (room: String, name: String, score: Int)
        var testScores = [TestScore]()
            testScores = [
            ("3年A組","佐藤",92),
            ("3年A組","田中",67),
            ("3年A組","吉田",88),
            ("3年B組","井上",45),
            ("3年B組","田中",40),
            ("3年C組","鈴木",72),
            ("3年C組","田村",61),
            ("3年C組","吉田",53)
        ]
        if let index = testScores.firstIndex(where: {$0.room == "3年B組" && $0.name == "田中"}){
            testScores[index].score = 90
            print(testScores[index])
        }
        else{
            print("該当なし")
        }
```
コンソールには、
(room: "3年B組", name: "田中", score: 90)
と表示され、点数が変更されていることがわかります。
「パスが通ってない問題だと思ったらターミナル再起動で解決」のしくみの初心者メモ

##環境変数はいつ呼ばれているか

[rbenvでrubyをインストールした時にそのままログイン状態ではバージョン確認できず、再ログインしたらバージョン確認できた](https://qiita.com/HelloJTokyo/items/5d50db2b06a184c866f4#rbenv%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%AEruby%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
)　のはなんでか。

ターミナルを起動した時には.bashなんちゃらとかが呼ばれて実行されており、

例えば
.bash_profile
とかがプロンプト出す前にもう呼ばれている。

試しにホームディレクトリで
`$ vim .bash_profile` する。

```
echo 'aaa'
```
を書き込んでターミナル再起動してみる（Command+Nでok)。
すると

```
Last login: Mon Sep 10 21:24:47 on ttys001
aaa
HelloJTokyo:~ xxxxxx$ 
```
こんな感じでプロンプト出る前に　aaa が出力されてる。

つまり、ログインしてるターミナルで環境変数いじっても、そのままではそのターミナルには反映されない。
ログインし直すと変更が反映されて読み込まれる。

`$ rbenv global`　で環境変数が変わったけど、変わった環境変数がまだ読み込まれてないターミナルでは反映されていない。だから再ログインする。

ログインしながらに新しい環境変数ロードするには（どこに当該環境変数が書かれてるか分かってたら、例えばそれが.bash_profileだったら）`$ source .bash_profile` する。そうすると直ちに読み込まれる。
ちなみに 　`$ . .bash_profile`　でも意味は同じ。


##余談
###.bash_historyに書かれていること
今まで打ったコマンドラインが記録されてる。
↑↓で出てくるヒストリはこれを順番に出力してるだけ。

###ファイルにechoを書いて目印にする
今これが呼ばれて実行されたよ。を知るために、ファイルに　

```
echo 'このファイル名'
```
を書いとく。便利。確認したら消すの忘れず。

###「分からない」という状態に慣れよう
「分からない」状態を受け入れるマインドを持っとかないとハードモード。

###コマンドラインの気づき
`$ ls -a -l`
は、シンプルに
`$ ls -al`
で良い。
灯りと鏡 (Crystal/C++)


多言語でやるべしという圧を感じましてorz ( https://twitter.com/Nabetani/status/1038998668248895488 )

```crystal:tyama_henae27pre.cr
#!/usr/bin/env crystal
#http://nabetani.sakura.ne.jp/hena/orde27ligmir/
#https://qiita.com/Nabetani/items/0b2f459ec128c89948f4

#x,y
D={
	'.'=>{
		[0,-1]=>[0,-1],  #N
		[1,0]=>[1,0],   #E
		[0,1]=>[0,1],   #S
		[-1,0]=>[-1,0], #W
	},
	'1'=>{
		[0,-1]=>[1,0],  
		[1,0]=>[0,-1],
		[0,1]=>[-1,0],
		[-1,0]=>[0,1],
	},
	'0'=>{
		[0,-1]=>[-1,0],  
		[1,0]=>[0,1],
		[0,1]=>[1,0],
		[-1,0]=>[0,-1],
	},
}
H=5;W=5

while line=gets
	m=line.chomp.split('/').map(&.chars)
	x,y=[0,0]
	H.times{|h|W.times{|w|
		if m[h][w]=='Y'
			x,y=w,h
			m[h][w]='.'
		end
	}}
	r=Array(Tuple(Int32,Int32)).new
	dx,dy=[0,-1]
	visited={[x,y,dx,dy]=>1}
	while 0<=x&&x<W && 0<=y&&y<H && m[y][x]!='x'
		r<<{x,y}
		dx,dy=D[m[y][x]][[dx,dy]]
		x+=dx
		y+=dy
		k=[x,y,dx,dy]
		break if visited.has_key?(k)
		visited[k]=1
	end
	puts r.map{|x,y|(x+y*W+97).chr}.uniq.sort.join("")
	STDOUT.flush
end
```

```cpp:tyama_henae27pre.cpp
//http://nabetani.sakura.ne.jp/hena/orde27ligmir/
//https://qiita.com/Nabetani/items/0b2f459ec128c89948f4

#include <iostream>
#include <string>
#include <map>
#include <set>
#include <vector>
#include <cstdio>
using namespace std;

//x,y
map<
	char,map<
		pair<int,int>,pair<int,int>
	>
>D={
	{'.',{
		{{0,-1},{0,-1}},  //N
		{{1,0},{1,0}},   //E
		{{0,1},{0,1}},   //S
		{{-1,0},{-1,0}}, //W
	}},
	{'1',{
		{{0,-1},{1,0}},  
		{{1,0},{0,-1}},
		{{0,1},{-1,0}},
		{{-1,0},{0,1}},
	}},
	{'0',{
		{{0,-1},{-1,0}},  
		{{1,0},{0,1}},
		{{0,1},{1,0}},
		{{-1,0},{0,-1}},
	}},
};
const int H=5,W=5;

vector<string> split(string &str, const char *delim){
	vector<string> result;
	int cutAt;
	while( (cutAt = str.find_first_of(delim)) != str.npos ){
		if(cutAt > 0){
			result.push_back(str.substr(0, cutAt));
		}
		str = str.substr(cutAt + 1);
	}
	if(str.length() > 0){
		result.push_back(str);
	}
	return result;
}

int main(){
	string line;
	for(;getline(cin,line);){
		vector<string>m=split(line,"/");
		int x=0,y=0;
		for(int h=0;h<H;h++)for(int w=0;w<W;w++){
			if(m[h][w]=='Y'){
				x=w,y=h;
				m[h][w]='.';
			}
		}
		set<char>r;
		int dx=0,dy=-1;
		set<vector<int>>visited={{x,y,dx,dy}};
		for(;0<=x&&x<W && 0<=y&&y<H && m[y][x]!='x';){
			r.insert(x+y*W+97);
			int ndx,ndy;
			tie(ndx,ndy)=D[m[y][x]][{dx,dy}];
			dx=ndx,dy=ndy;
			x+=dx;
			y+=dy;
			vector<int>k={x,y,dx,dy};
			if(visited.find(k)!=visited.end())break;
			visited.insert(k);
		}
		for(auto &e:r)putchar(e);
		puts("");
		fflush(stdout);
	}
}
```
ActiveYamlでmodelをyamlファイルで管理する

# ユースケース

基本的に参照しか行わず、DBで管理する必要がないデータ、定数の集合をyamlしRailsのmodelにインポートして使用する
ex)都道府県、地方など

## 使い方

### 1.`app/model`配下に`ActiveYaml`ディレクトリを作成

```ruby:app/models/ActiveYaml
app
 |- models
    |- ActiveYaml
       |- prefectures.yml
       |- region.yml
```

### 2.作成した`ActiveYaml`にymlファイルを作成していく

```yaml:app/models/ActiveYaml/prefectures.yml
- id: 1
  name: tokyo
  region_id: 1
```

### 3.yamlで定義したデータを使用したいモデルに読み込む

```ruby:app/models/user.rb
class Area < ActiveYaml::Base  
  set_root_path Rails.root.join('app/models/ActiveYaml')
  use_multiple_files
  set_filenames "active_yaml1","active_yaml2"
end
```

ActiveRecodeも使用できます。

```ruby
Area.find(1).name
#=> "tokyo"
```
よく使うgitコマンド

よく使用するgitコマンドを備忘録がてらまとめます。
随時更新予定

#ブランチ関連#
**ブランチの一覧を見る**

```
git branch -a
```

**ブランチを作成**

```
git checkout -b 【作成するブランチ名】
```


**ブランチを切り替える(コマンド例は別ブランチからmasterに切り替える)**

```
git checkout master
```

**現在のブランチ確認**

```
git branch --contains
```

**ブランチ削除**

```
git branch --delete 【ブランチ名】
```

**ローカルブランチ名を指定して、リモートブランチをチェックアウト**

```
git checkout -b 【ローカルブランチ名】 origin/【リモートブランチ名】
```

**ローカルブランチ名変更**

```
git branch -m 【古いブランチ名】 【新しいブランチ名】
```

#追加、登録関連#

**前回のコミットと比較してどのファイルが変更されたかを表示**

```
git status
```

**ファイルやディレクトリをインデックスに登録**

```
git add 【修正ファイル名】
```

**すべての修正をインデックスに登録**

```
git add -A
```

**ファイルやディレクトリのadd取消**

```
git reset HEAD 【ファイル名】
```

**インデックスに追加されたファイルをコミットする**

```
git commit
```

**直前コミットのコメント修正**

```
git commit --amend -m "コメント"
```


#変更関係#

**ディレクトリの変更**

```
git mv 【ファイル名】 【ディレクトリ】
```

#取消関係#

**ファイルの変更取り消し**

```
git checkout 【ファイル名】
```

**特定のコミットまで戻す**

```
git reset --hard 【ログのハッシュ値】
```

#Push関連#

**ブランチをリモートに登録**

```
git push -u origin 【作成したブランチ名】
```

**リモートリポジトリに変更を書き込む**

```
git push 【リモートリボジトリ】 【ブランチ名】
```

**リモートリポジトリ確認**

```
git remote -v
```

**リモートリポジトリ追加**

```
git remote add 【追加するリモートリポジトリ名】【追加したいリポジトリ】
```

**リモートリポジトリ削除**

```
git remote rm 【削除したいリモートリポジトリ名】
```

**URL変更**

```
git remote set-url origin [変更先のURL]
```

**リモートリボジトリ名変更**

```
git remote rename [変更前リポジトリ名] [変更後リポジトリ名]
```

#pull関連#

```
git pull 【リモートリボジトリ】 【ブランチ名】
```

#merge#
**ブランチの変更を取り込む**

```
git merge 【ブランチ名】
```

#ログ関連#
**履歴を確認**

```
git log
```

**直前にコミットしたログを修正**

```
git commit --amend
```

**過去コミットを改変してコミットも直す**

```
git rebase -i 【コミットハッシュ】
```
エディタが開くので、「pick」を「edit」に修正

```
git commit --amend --author="example <example@example.com>"
git rebase --continue
```

#差分関連#
**前回コミット(HEAD)からの差分**

```
git diff 【コミットID】
```

**変更内容差分**

```
git log -p
git log -p --ignore-space-change (スペースや改行で差分を除く)
```

#clone関連#
**git clone (サーバにSSHで接続。/opt/git配下にリモートリポジトリある想定)**

```
git clone ssh://git@【サーバIP】/opt/git/【リモートリポジトリ】.git
```

#stash関連#

**作業の一時退避**

```
git stash save
```

**作業に名前を付けて一時退避**

```
git stash save "名前をここに入力"
```

**退避した作業の一覧**

```
git stash list
```

**退避した作業を戻す**

```
$git stash apply stash@{0}    // stash@{0}は戻したいstash名(listで確認)
```

**退避した作業の削除**

```
git stash drop // 最新の退避した作業を削除
git stash drop stash@{0} // 0番目の退避した作業を削除。stash@{0}は削除したいstash名(listで確認)
```

#config関連#

**名前設定**

```
git config --global user.name 【名前】
```

**メールアドレス設定**

```
git config --global user.email 【メールアドレス】
```

#tag関連#

**タグ作成(コメントなし)**

```
git tag 【タグ名前】
```

**タグ作成(コメントあり)**

```
git tag -a 【タグ名前】 -m 'タグのコメント'
```

**タグをリモートブランチにpush**

```
git push origin 【タグ名前】
```

**タグ削除**

```
git tag -d 【タグ名前】
```
DockerでIPv6を有効にする

## 概要
Dockerでは、defaultでIPv6が無効になっています。
以下の設定で、有効にします。

- [CentOS7の場合](#CentOS7の場合)
- [macの場合](#macの場合)

## CentOS7の場合
/etc/docker/daemon.jsonをなければ作成して、以下を記述します。


```json:/etc/docker/daemon.json
{
  "ipv6": true,
  "fixed-cidr-v6": "2001:db8:1::/64"
}
```

dockerをreloadします。

```shell-session
$ sudo systemctl reload docker
```

## macの場合
Docker for Macの「Preferences(設定)」 -> 「daemonタブ」 -> その中の「Advanced」タブで、
以下のようにCentOS7のものと同じものを追記して、「Apply & Restart」をクリックします。
<img width="584" alt="Screen Shot 2018-09-08 at 16.19.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/105936/f618def1-9d77-3088-1535-79677e173969.png">

## 参考
- https://docs.docker.com/config/daemon/ipv6/
AWS VPN トラブルシュート

作業メモ

* トラブルシューティング
https://aws.amazon.com/jp/premiumsupport/knowledge-center/vpn-tunnel-troubleshooting/

* トンネルステータスの確認
https://aws.amazon.com/jp/premiumsupport/knowledge-center/check-vpn-tunnel-status/

* BGPルートがアドバタイズされない
https://www.cisco.com/c/ja_jp/support/docs/ip/border-gateway-protocol-bgp/19345-bgp-noad.html
Ubuntu18.04LTS にSwift導入

業務でiOS開発をすることになったので、自宅でもSwiftを触れるように最低限の環境を整える。

必要なパッケージのインストール

```bash:update&install
$ sudo apt update
$ sudo apt install clang libicu-dev libcurl4-openssl-dev libssl-dev libblocksruntime-dev
```

Swiftのダウンロード -> [ここから](https://swift.org/download/)

解凍

```
$ tar xzvf swift-DEVELOPMENT-SNAPSHOT-2018-09-08-a-ubuntu18.04.tar.gz
$ export PATH=$PATH:(Swiftをダウンロードしたパス)/swift-DEVELOPMENT-SNAPSHOT-2018-09-08/usr/bin
```

作業ディレクトリを作って移動

```
$ mkdir swiftWorkspace
$ cd swiftWorkspace
```

パッケージ初期化

```
$ swift package init --type executable
```

ソースファイル

```swift:Source/swiftWorkspace/main.swift
print("Hello, world!")
```

ビルド
`swift build`

実行

```
$ .build/x86_64-unknown-linux/debug/swiftWorkspace
Hello, world!
```
【Java】今さらだけど拡張for文はList専用じゃないよ？

こないだソースレビューしてたら、「拡張for文ってList専用だと思ってました！」って言われたので、改めて「そんなことないよ」ってことをここに記します。

# Listをループしてみる
どちらの方法でも同じ結果が出力されます。

```Java
    List<String> strList = new ArrayList<String>();  // list要素への代入処理は省略。

    // listを普通のfor文でループする。
    for ( int i = 0 ; i < strList.size() ; i++) {
      System.out.println(strList.get(i));
    }
    
    // listを拡張for文でループする。
    for (String string : strList) {
      System.out.println(string);
    }
```

# 配列をループしてみる
こちらも、同じ結果が出力されます。

```Java
    String[] strArray = new String[5];  // 配列要素への代入処理は省略。

    // 配列を普通のfor文でループする。
    for ( int i = 0 ; i < strArray.length ; i++) {
      System.out.println(strArray[i]);
    }
    
    // 配列を拡張for文でループする。
    for (String string : strArray) {
      System.out.println(string);
    }
```

# 私なりの使い分け方
indexの値が欲しいかどうかで使い分けてます。

- indexの値が欲しい時:point_right:普通のforループ。
- indexの値はいらないから、とにかくぐるぐるまわしたい時:point_right:拡張for文。

個人的には、indexを使うとソースが読みにくいなぁと思うタイプです。
業務で長めの変数名が出てくると、たいていは可読性を考慮して ```strList.get(i)```みたいに１回変数に取り出すんですよね。
上記のサンプルレベルだと、一度変数に取り出しても気にならないのですが、業務だとちょっとウザいと感じることも（私は）あります。

# まとめ

- Listのループは普通のfor文でも書けるし、拡張for文でも書ける。
- 配列も拡張for文が使えるし、普通のfor文でもOK :ok_hand:
- （個人的には）indexの値が欲しいかどうかで使い分けている。
Chainerで画像分類するためのデータセットを自作して読み込む方法

## 概要

Chainer入門者向けの記事です。チュートリアルから一歩進んで、世に公開されている画像データや自分で集めた画像などから画像分類の学習用データセットを作る方法をまとめました。

いざ自分でChainerで画像分類に取り掛かろうとした際に、最初に躓いたところであり、調べるのにも時間が掛かったので、備忘録のようなものになります。



## 環境

- macOS High Sierra 10.13.6
- python 3.6.5
- Chainer 4.3.1



## 実行例

[DeepLearningLab](https://dllab.connpass.com/)さんがGitHubに以前ハッカソンにて使用していた画像データを公開してくれていますので、そのデータをサンプルにしてChainer用のデータセットを作成していきます。[データセットはこちら。](https://github.com/DeepLearningLab/PotatoChips-Classification)

かなりのデータ量なので試す方はご注意ください。とは言っても3GBちょいですけどね。



フォルダ構成は以下のとおりです。

```
data
|-- train
|   |-- images
|   |   |-- XXXXXXXXX.jpg
|   |   |-- XXXXXXXXX.jpg
|   |   `-- ...
|   `-- train_labels.txt
|-- valid
|   |-- images
|   |   |-- XXXXXXXXX.jpg
|   |   `-- ...
|   `-- valid_labels.txt
`-- test
    |-- images
    |   |-- XXXXXXXXX.jpg
    |   `-- ...
    `-- test_labels.txt
```



このデータでは、それぞれの`images`フォルダの中に画像が入っており、同階層の`.txt`ファイルに画像のファイル名と、対応するクラスIDがスペース区切りで入っています。

イメージはこんな感じです。

```txt
XXXXXXXXX01.jpg 0
XXXXXXXXX02.jpg 1
XXXXXXXXX03.jpg 2
```



では、これを読み込むにはどうすれば良いのでしょうか。

Chainerには非常に便利な`LabeledImageDataset`というクラスがあり、これを使用します。コードはこの２行だけ。とっても簡単ですね。

```python
from chainer.datasets import LabeledImageDataset

train = LabeledImageDataset('data/train/train_labels.txt', 'data/train/images')
```



ただし、これだけだと元々の画像のサイズがバラバラだとChainerにはそのまま突っ込めません。画像をリサイズするひと手間が必要になります。こちらも`TransformDataset`クラスを使えば簡単にリサイズ出来ちゃいます。



```python
from chainercv.transforms import resize
from chainer.datasets import TransformDataset

def transform(in_data):
    img, label = in_data
    img = resize(img, (224, 224))
    return img, label

train = TransformDataset(train, transform)
```



トレーニングデータと同様にバリデーションデータも作成します。



```python
valid = LabeledImageDataset('data/valid/valid_labels.txt', 'data/valid/images')
valid = TransformDataset(valid, transform)
```



これで最低限の前処理は完了です。

実際にはここでグレースケールに変換したり、傾けてみたりなど色々と工夫をすることも可能ですが、それはまたの機会にまとめてみます。



## ご参考

#### ChainerCVを使用しない方法

上記では画像のリサイズにChainerCVを使用しましたが、他にも方法はあります。代表的なものとしては`Pillow`ライブラリを使用したものがあります。

以下のように`transform`クラスを書き換えます。

```python
from PIL import Image

width, height = 224, 224 #ここは好きなサイズで構いません。

def transform(data):
    img, label = data
    img = img.astype(np.uint8)
    img = Image.fromarray(img.transpose(1, 2, 0))
    img = img.resize((width, height))
    img = np.asarray(img).transpose(2, 0, 1).astype(np.float32) / 255.
    return img, label
```



#### OpenCVを使用する方法

OpenCVを使い慣れていて、前処理もOpenCVでしてしまいたい方は、以下のようにすれば良いです。

```python
import cv2

with open('data/train/train_labels.txt', 'r', encoding='utf-8') as f:
    train_labels = ''.join(f.readlines()).split('\n')[:-1]
    
x, t = [], []

for train_label in train_labels:
    filename, label = train_label.split(' ')
    filepath = 'data/train/images/{}'.format(filename)
    img = cv2.imread(filepath)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    img = np.transpose(img, (2, 0, 1))
    
    label = np.array(label, 'i')
    
    x.append(img)
    t.append(label)
    
train = chainer.datasets.tuple_dataset.TupleDataset(x, t)
```



## 終わりに

普段コードを書き続けていないと、こういう読み込みなどのお作法はすぐに忘れてしまう。ライブラリが充実してきて、この辺りの処理が簡略化されていくことは大歓迎です。
Azure App Serviceの.NET Frameworkバージョンを確認する方法

#まもなくAzure App Serviceは.NET Framework 4.7.2に

Azure App Serviceに .Net Framework 4.7.2が適用間近となっています。
[.NET Framework 4.7.2 update coming to Azure App Service apps]
https://azure.microsoft.com/ja-jp/updates/net-framework-4-7-2-update-coming-to-azure-app-service-apps/

しかし、実際に適用されているかどうか確認できなければ当然アップデートできないので、
Kuduを使用して確認する必要があります。

#.NET Framework　バージョンを確認する方法(powershell)

アップデート対象のApp Serviceを選択→高度なツール(Kudu)へ移動

![image.png](https://qiita-image-store.s3.amazonaws.com/0/161516/ac052b85-7f1e-4fa5-cc95-b974108f50f7.png)

続いで、Debug Console→PowerShellを選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/161516/225049b1-9fdb-c3ad-4d75-bb41a1d4bd33.png)

Powershell画面が表示されたら、下記のコマンドを入力。

```powershell
Get-ChildItem "D:\Program Files (x86)\Reference Assemblies\Microsoft\framework\.NETFramework" 
```

↓この場合、4.7.1までがインストールされています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/161516/7f4e8ee3-7c22-0ebe-9bed-dee578568090.png)

#.NET Framework　バージョンを確認する方法(コンソール)

より簡単な方法として、下記でも可能。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/161516/06f67d4e-4076-cc0f-16d9-fbfedf214aa5.png)


```bat
dir  "D:\Program Files (x86)\Reference Assemblies\Microsoft\framework\.NETFramework" 
```
Microsoft Flow で Google Calendar のデータを出力して JavaScript で使用するときのハマりどころ

Microsoft Flow で Google Calendar の予定を JSON 化し、JavaScript で使用するときにハマったのでメモ。

発動条件

- Google Calendar で予定を終日で作成する
- JavaScript でその予定の開始時刻を Date Object にする

## 結果

時刻が 9時になります。

終日の予定の場合、開始時刻のフォーマットが`yyyy-MM-dd`で出力されます。

それを JavaScript で`new Date(dateString)`すると、UTC の 0:00 として認識されて、結果日本のタイムゾーンで 9:00 になると。

Flow の出力フォーマットもどうかと思うけど、JavaScript の Date もなかなかの曲者ですね。。。

## 解決策

終日の予定を使わないことくらいでしょうか。。。
Elasticsearchでindexを再作成しながらfieldを変更する手順

### バージョン
Elasticsearch 6.4

### 手順

再作成したいindex（ここではold）のmappingを取得
pythonを導入している場合は、パイプラインを使って結果を整形

```bash
curl -XGET "http://localhost:9200/old/_mapping" | python -m json.tool > old.json
```

old.jsonファイルを編集し、index名を削除しておく。
そうしないと次のコマンドを実行すると、index名がnew.oldになってしまう。

indexを再作成（ここではnew）、このときfieldの名称などを変更したい場合は、
old.jsonファイルを編集しておく

```bash
curl -XPUT "http://localhost:9200/new" --data-binary @old.json
```

oldからnewにデータをコピー。このときfield名を変更している場合は、
scriptを使ってfield名を置換しながらコピー。
複数のfieldを置換する場合は　；　を使って区切る。

```bash
curl -XPOST localhost:9200/_reindex?pretty -d'{
  "source": {
    "index": "old"
  },
  "dest": {
    "index": "new"
  },
  "script": {
    "source": "ctx._source.newのfield名 = ctx._source.remove(\"oldのfield名\"); ctx._source.newのfield名 = ctx._source.remove(\"oldのfield名\")"
  }
}'
```

### 参考
https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html
http://mmzk512.hatenablog.com/entry/2017/09/19/163225
2018年度版: TISwitcher(スクリプト切り替え)をOFFにする

#TL;DR

Appleの今世紀最悪の発明品であるTISwitcher絶対殺すマン

# TISwitcherって何？

TISwitcherをご存知だろうか。俗に言うスクリプト切り替え。

![TISwitcher.png](https://qiita-image-store.s3.amazonaws.com/0/7161/347a28e3-ffee-c7d2-27e5-33ae220899b4.png)

こいつだ。個人的にこのスクリプト切り替えはApple史上、一番最悪な発明であると断言したい。何故なら文章の入力中にこいつに出られると邪魔くさいことこの上ない。そしてリズムを失う。やる気も失う。

先程、Macを再起度したら今まで殺していたこいつが唐突に動き出した。何か再起動がやたらと長かったので自己修復またはAppleが何かを配布した可能性はあるものの、こいつだけは速攻に殺さなければならんというわけで、なおそうと思ったら、方法を忘れた。

そしてネットには古い情報が結構溢れているのでメモも兼ねてQiitaに投稿しようと思う


# TISwitcherを殺す方法

- Macを再起動。再起動中に**Command+R**でOSのリカバリー領域を立ち上げる
- メニューバーからターミナルを選択して以下のコマンドを実行する
  - # csrutil disable
- 再起動が完了したら以下のコマンドをターミナルで実行する
  - sudo defaults write /System/Library/LaunchAgents/com.apple.tiswitcher Disabled -bool yes
  - killall TISwitcher
  - 言語を切り替えて、やつが死んだことを確認する
- 再度リカバリーモードで再起動し、ターミナルを立ち上げて以下のコマンドを実行
  - csrutil enable

以上で完了。

# 注意点

SIPを一時的に無効化するので何が起きても自己責任でお願いします。(SIPの意味がわからない人は実行しないようにしたほうが良いと思います。)
[Ruby on railsメモ]config.time_zone = 'Asia/Tokyo'が全く機能しねーぞって方へ。

dbに記録された時間をイギリス時間から東京時間に変えたいときにやったことをまとめました。
# 1. 書いた場所の確認をする。
rails5.0以上の人はconfig/application.rbに書くそう。

こんなかんじで、

```ruby:application.rb
...
module AnswerBoxApp
  class Application < Rails::Application
    ...
    config.time_zone = 'Asia/Tokyo'
  end
```

Applicationと書かれたclassのところの中にかく。

うん、だいたいはこれでいけるそう。ていうかほとんどかな。

これでも俺のは直せず、困り果てていたのだが、


#2. 一回サーバーを切ってrails serverする。

はい、直りました。ちゅんでした。

コード書き直しても、すぐに反映できるのと反映できないのがあるのね。なるほど。
Item 62: Avoid strings where other types are more appropriate 

# 62.他の型が適している場合にはStringを避けるべし
## Stringが適していない場面でもStringが使われがち
本章では、Stringを使うべきではない場面について述べる。

### 他の型の代替として使うべきでない
ファイル、ネットワーク、キーボードからくるデータをStringとして扱うことが多いが、本当にStringとして扱う場合のみにとどめるべきである。
入ってくるデータが数字なのであれば、int、float、BigIntegerなどが、真偽値であればenumやbooleanが適切である。
より一般的には、値の適切な型があるのであれば、それを使うべきで、適切な型がないのであれば、作成すべきである。
このアドバイスは当たり前のようであるが、よくおこるミスである。

### enumの代替として使うべきでない
Item34で述べられているが、Stringで定数の列挙を行うべきでない。enumを使うべし。

### 要素を集結させるもの（aggregate type）として使うべきでない
複数の要素を持つものがあったとして、それをStringで表現するのはbadアイデアだ。以下がそれにあたる。

```java
// Inappropriate use of string as aggregate type
String compoundKey = className + "#" + i.next();
```
この方法には複数の悪い点がある。
* 区切り文字として使われている文字が要素に入ってくると面倒なことになる。
* 個々の要素を取り出すために、パースをしなければならないため、遅く、エラーを生み出しやすい。
* equals、toString、compareToといったメソッドを提供できないが、Stringが提供するメソッドは受け入れることを強制される。（？）

ベターな方法としては、単純に、要素をまとめるクラスを書くことだ。よくprivate staticなメンバークラスが作られる（Item24）。

### 偽造不可能なキー（capability）として使うべきでない
Stringは何らかの機能へのアクセス手段として使われることがある。
例として、ThreadLocalの変数格納機能を考えてみる。
ThreadLocalはそれぞれのスレッドの固有の値を格納できるものとして機能する。この機能は、Java1.2以降にJavaライブラリに現れたが、それ以前にこういった機能を設計しようとしたら、以下のようにStringを使って実現してしまうかもしれない。

```java
// Broken - inappropriate use of string as capability!
public class ThreadLocal {
    private ThreadLocal() { } // Noninstantiable
 // Sets the current thread's value for the named variable.
    public static void set(String key, Object value);
 // Returns the current thread's value for the named variable.
    public static Object get(String key);
}
```
上記のようにしたときの問題点は、Stringのキーがグローバルな名前空間として共有されてしまうことにある。
そのため、意図せず別々のユーザーが1つの変数を共有してしまうかもしれず、エラーを生むことになる。

また、セキュリティの観点からも良くない。
悪意のあるユーザーがわざと他のユーザーのキーと同じ値でThreadLocalから値を取得する可能性があるからだ。

上記を代替不可能なキー（unforgeable key または、capability）を使って書き換えると以下のようになる。

```java
public class ThreadLocal {
    private ThreadLocal() { }    // Noninstantiable
 public static class Key {    // (Capability)
        Key() { }
    }
 // Generates a unique, unforgeable key
    public static Key getKey() {
        return new Key();
    }
 public static void set(Key key, Object value);
    public static Object get(Key key);
}
```
上記でStringのキーを使った場合の問題は解消されているが、さらに良い方法がある。
staticなメソッドはもう必要なく、インスタンスメソッドがキーとなる（？）。
その時点でキーはスレッドローカルな変数を指し示すキーではなく、キー自体がスレッドローカルな変数となっている（？）。
APIとしては以下のよう。

```java
public final class ThreadLocal {
    public ThreadLocal();
    public void set(Object value);
    public Object get();
}
```
上記のAPIから値を取り出すときはキャストをしなければならないので、このAPIはタイプセーフではない。
元のStringをキーとしたAPIや、Keyを使ったAPIでもタイプセーフにするのは難しいが、上記のAPIは以下のように、容易にタイプセーフにできる。

```java
public final class ThreadLocal<T> {
    public ThreadLocal();
    public void set(T value);
    public T get();
}
```
javaライブラリのThreadLocalもざっくりいうと上のようになっている。
axiosでPOSTでRequestしているつもりがOPTIONSで送信している

# 問題
```javascript
axios.post('/api/fuga', {
        'hoge': hoge
      })
      .then(response => console.log(response))
      .catch(err => console.log(err));
```

あれ。。。これであってるはずなのに　MethodがOPTIONSになってる。。

<img width="327" alt="DevTools_-_localhost_8080_.png" src="https://qiita-image-store.s3.amazonaws.com/0/242013/3028f08f-0462-1c70-8578-8fc781f7d979.png">

# 解決
https://github.com/axios/axios#using-applicationx-www-form-urlencoded-format
これ使えば解決しました。

```javascript
const params = new URLSearchParams();
      params.append('hoge', hoge);
      axios.post('/api/fuga', params)
        .then(response => console.log(response))
        .catch(err => console.log(err));
```
C++のよくわからない記法

レビューで見たC++のよくわからない記法。

クラス名::を何個書いてもコンパイルが通る。

```C++:test.cpp
#include <iostream>

class A
{
public:
    static const int a = 0;
};

int main(void)
{
    std::cout << A::A::a << std::endl;
    // 何個も書ける
    std::cout << A::A::A::A::A::A::A::A::A::A::A::A::A::A::A::A::A::A::A::A::A::A::A::A::A::A::A::A::A::A::a << std::endl;
    return 0;
}
```

いろいろ試してみたけど、だいたいコンパイルが通らなくて、
この記述方法ができて嬉しいことが見つからなかった。
C＋＋とRubyの割り算は違う

C++のテストデータをRubyで作っていたら1時間ぐらいハマったのでメモ

マイナスの値の割り算結果がC++とRubyでは違う。

```C++:divmod.cpp
#include <iostream>

int main(void)
{
    std::cout << "10 / 3 = " << 10 / 3 << ", 10 % 3 = " << 10 % 3 << std::endl;
    std::cout << "-10 / 3 = " << -10 / 3 << ", -10 % 3 = " << -10 % 3 << std::endl;
    std::cout << "10 / -3 = " << 10 / -3 << ", 10 % -3 = " << 10 % -3 << std::endl;
    std::cout << "-10 / -3 = " << -10 / -3 << ", -10 % -3 = " << -10 % -3 << std::endl;
    std::cout << "11 / 3 = " << 11 / 3 << ", 11 % 3 = " << 11 % 3 << std::endl;
    std::cout << "-11 / 3 = " << -11 / 3 << ", -11 % 3 = " << -11 % 3 << std::endl;
    std::cout << "11 / -3 = " << 11 / -3 << ", 11 % -3 = " << 11 % -3 << std::endl;
    std::cout << "-11 / -3 = " << -11 / -3 << ", -11 % -3 = " << -11 % -3 << std::endl;
    return 0;
}
```

実行結果

```
10 / 3 = 3, 10 % 3 = 1
-10 / 3 = -3, -10 % 3 = -1
10 / -3 = -3, 10 % -3 = 1
-10 / -3 = 3, -10 % -3 = -1
11 / 3 = 3, 11 % 3 = 2
-11 / 3 = -3, -11 % 3 = -2
11 / -3 = -3, 11 % -3 = 2
-11 / -3 = 3, -11 % -3 = -2
```

```ruby:divmod.rb
puts '10 / 3 = %d, 10 %% 3 = %d' % [ 10 / 3, 10 % 3, ]
puts '-10 / 3 = %d, -10 %% 3 = %d' % [ -10 / 3, -10 % 3, ]
puts '10 / -3 = %d, 10 %% -3 = %d' % [ 10 / -3, 10 % -3, ]
puts '-10 / -3 = %d, -10 %% -3 = %d' % [ -10 / -3, -10 % -3, ]
puts '11 / 3 = %d, 11 %% 3 = %d' % [ 11 / 3, 11 % 3, ]
puts '-11 / 3 = %d, -11 %% 3 = %d' % [ -11 / 3, -11 % 3, ]
puts '11 / -3 = %d, 11 %% -3 = %d' % [ 11 / -3, 11 % -3, ]
puts '-11 / -3 = %d, -11 %% -3 = %d' % [ -11 / -3, -11 % -3, ]
```

実行結果

```
10 / 3 = 3, 10 % 3 = 1
-10 / 3 = -4, -10 % 3 = 2
10 / -3 = -4, 10 % -3 = -2
-10 / -3 = 3, -10 % -3 = -1
11 / 3 = 3, 11 % 3 = 2
-11 / 3 = -4, -11 % 3 = 1
11 / -3 = -4, 11 % -3 = -1
-11 / -3 = 3, -11 % -3 = -2
```

C++は結果がマイナスになる割り算は0に近づくのに対して、
Rubyは反対方向に丸められる。

どちらも

```
a / b * b + (a % b) == a
```

はtrue。

```
(-a / b) * -1 == a / b
```

はRubyで割り算の結果が割り切れないときはfalse。
C++とRubyで割り算の結果が割り切れるときはtrue。

この違いが何によるものなのかは少し調べた限りでは分からなかった…
Pythonでの辞書の分割代入

`JavaScript` の __オブジェクトの分割代入__ 便利ですよね。

```javascript:JavaScript
const obj = { b: 14, a: 12 }
const { a, b, c } = obj
console.log(a, b, c) // 12 14 undefined
```

# Pythonでの辞書の分割代入の例

```python:Python
dct = { "b": 14, "a": 12 }
a, b, c = (dct.get(k) for k in ("a", "b", "c"))
print("%s %s %s" % (a, b, c)) # 12 14 None
```

```python:Python
dct = { "b": 14, "a": 12 }
a, b, c = (lambda a=None, b=None, c=None: locals().values())(**dct)
print("%s %s %s" % (a, b, c)) # 12 14 None
```

複雑な代入を行う場合はどのようにするのが適切なのでしょうかね…？

# 他の言語の例

```ruby:Ruby
hash = { b: 14, a: 12 }
a, b, c = hash.values_at :a, :b, :c
p a, b, c
=begin
12
14
nil
=end
```


```php:PHP
<?php

$assoc = ["b" => 14, "a" => 12];
list("a" => $a, "b" => $b, "c" => $c) = $assoc;
var_dump($a, $b, $c);
/*
int(12)
int(14)
NULL
*/
```
Qiitaでテーブルを使う時のベストプラクティスを見つけた

#はじめに
Qiitaのマークダウンエディタって便利ですよね。
htmlみたいに開始タグと終了タグを2回書く必要もなく楽ですし、リアルタイムにプレビューが出るので、表示の具合をすぐに把握することができます。

ただ唯一許せない記法があります。それがテーブル。

```md:
| Left align       |       Right align |    Center align    |
|:-----------------|------------------:|:------------------:|
| This             |              This |        This        |
| column           |            column |       column       |
| will             |              will |        will        |
| be               |                be |         be         |
| left             |             right |       center       |
| aligned          |           aligned |      aligned       |
```

非エンジニアであれば一生使う事が無いであろう「|」を何回もタイプさせ、連続ハイフン/半角スペースのコンボで記載を難しくする悪魔の術です。:imp:

これは人間が使うような代物じゃありません。

#解決法
つ[Markdown Tables generator](http://www.tablesgenerator.com/markdown_tables)

ブラウザ上でCSVファイルをマークダウン形式のテキストに変換してくれるWEBサービスです。
テーブルの元データとなるのはCSVの場合が多いかと思うので、CSV→マークダウンの変換ができればなんとかなりそうです。

使い方は簡単。File→Import CSV file...をクリック。
![tableg.png](https://qiita-image-store.s3.amazonaws.com/0/104983/57ff9e35-fd51-272c-de74-a7b427ce6348.png)

変換するCSVを選択。
（これtypoで「Select CVS File」になっていますね…）
![tableg2.png](https://qiita-image-store.s3.amazonaws.com/0/104983/3c89af72-696b-f6a4-8ce3-28339c459493.png)

あとは生成されたマークダウン形式のテキストを、「Copy to clipboard」でコピーして、貼り付けるだけです。
![tableg3.png](https://qiita-image-store.s3.amazonaws.com/0/104983/312ad4d1-540f-01d4-9291-8cf0c013f282.png)

なおこちらは、米津玄師さんの歌詞をMecabで分析して、単語を頻出度で並べた表になります。
最近似たような手法で、[「サザン vs TUBE 真の夏うた王はどっちだ!?　MeCabで歌詞分析をしてみた - Qiita」](https://qiita.com/Sinhalite/items/f61a100e42496dc986a6)という記事を書いて、「絶対バズるやろ！」と思ってたのですが、ほとんど反響が無いまま夏が終わりました…。

#おわりに
正直タイトルは釣り気味でした。すみません:bow_tone4:
ただ他の方がどうやって記述しているのか、純粋に気になってます。
もっと良い方法があればコメントいただけると幸いです！
VuexのmapXxxで動的な名前空間を使う

Vueコンポーネントで`mapActions`とか使うときに、名前空間を`props`や`data`から取得したかった。
で、以下のように書いても`this`は存在しないのでエラー。

```vue

<script>
export default {
  props: ['path'],

  // エラー
  computed: mapState(this.path, ['someState']),

  // エラー
  methods: mapActions(this.path, ['someAction'])
}
</script>
```

そんなときはオブジェクトを渡してやればOK。

```vue
<script>
export default {
  props: ['path'],

  computed: mapState({
    someState (state) {
      return state[this.path]['someState'];
    }
  }),

  methods: mapActions({
    someAction (dispatch) {
      dispatch(this.path + '/someAction');
    }
  })
}
</script>
```


## 参考
https://github.com/vuejs/vuex/issues/863#issuecomment-329510765
Ubuntuでログインループに陥った時の対処

解像度が急におかしくなり、かつUbuntuにログインできなくなってしまいました。具体的な症状としては、ログインしてもまたログインページに戻るという症状。調べたところ皆さんよく遭遇しているそうで、原因はほとんどがNvidiaのドライバーの不適合だそうです。基本的にはドライバーを再インストールすれば治るのですが、私の環境ではapt-getのインストールではデバイスがドライバを認識してくれませんでした。また、最新のドライバーでは治らず、古いドライバーをインストールすることで治りましたので、やったことのメモ。

## 0. 準備
PCに装着されているグラフィックカードの種類を調べておく。後ほどどラーバをダウンロードする際に必要になる。

```
dpkg -l | grep nvidia
```
## 1. ドライバをダウンロード
Nvidiaのサイトから旧バージョンのドライバーをダウンロード  
https://www.nvidia.co.jp/Download/Find.aspx?lang=jp

## 2. パーミッション変更
適当なフォルダーに格納し、ダウンロードした .run (私の場合はNVIDIA-Linux-x86_64-384.90.run)をchmodで755にパーミッション設定.  

```
sudo chmod 755 NVIDIA-Linux-x86_64-384.90.run
```

## 3. CUI切り替え
 ctrl + alt + F1でGUIからCUIに切り替え

## 4. 現在インストールされているドライバーを削除
ドライバーを重複してインストールすると競合して不具合が起きる可能性があるため、現在インストールされているドライバは削除する

```
sudo apt-get --purge remove nvidia-*
```

### 5. ドライバーに必要なパッケージを事前にインストールしておく
私の場合、`linux-headers-3.13.0-153-generic`が無いと怒られたので、事前にインストールしておく

```
sudo apt-get install -y linux-headers-`uname -r`
```

### 6. ドライバーをインストール
先ほどダウンロードしたドライーバーをインストールする。その際、openglはインストールしない（openglが原因で起動しないケースがあるらしいので）
青い画面が立ち上がる。エラーが出ない限り、インストール続行で進めていくとドライバーがインストールされる。

```
sudo ./NVIDIA-Linux-x86_64-384.90.run --no-opengl-files
```

### 7. ドライバーが正しくインストールされたか確認する

書き込コマンドを打って、情報が表示されればインストールOK.

```
linux-headers-3.13.0-153-generic

Mon Sep 10 20:50:48 2018       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.90                 Driver Version: 384.90                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Quadro M5000        Off  | 00000000:02:00.0  On |                  Off |
| 38%   36C    P8    14W / 150W |    144MiB /  8118MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1779      G   /usr/bin/X                                   142MiB |
+-----------------------------------------------------------------------------+

```
連絡先を知らない人同士をLINEで通信させる方法（前回 グランプリ受賞 Botの仕組み）


# 今回の目的
LINE BOT AWARDS （2017年開催）にてグランプリをいただいた「アンドハンド」が実現している「連絡先を知らない人同士をLINEで通信させる方法」について解説する（[【9/3】LINE BOOT AWARDS公式夏期講習 ～Messaging API + Pay編～](https://linedev.connpass.com/event/98262/) での一般社団法人PLAYERSのセッションにて発表させていただいた内容に加筆）。　

## 解説するBot（AWARDS応募時点）の概要
![&HAND_仕組み_キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/157737/227032a7-9b7b-96f5-5370-3b4b41272f0b.jpeg "&HAND_仕組み_キャプチャ.JPG")

* 手助けを必要とする人と、それをサポートする人をつなげる。
* 手助けを必要とする人とサポートする人は連絡先を交換することなく、やり取りを行うことができる。
 

# 利用技術
### **LINE Beacon**　[LINE Developers　該当ページ](https://developers.line.me/ja/docs/messaging-api/using-beacons/)
  * 自分が友達登録をしてあるチャンネルに紐づいたBeaconに近づくと自分のスマホからサーバに通知がいく。
  * メッセージの中にBeaconを特定できるIDと自分のユーザーIDが入っている。
      * Beaconを特定できるID：beacon.hwid
      * 自分のユーザーID：source.userId  　 　 
  
  ```json:BeaconEventサンプル 
{  
   "replyToken":"nHuyWiB7yP5Zw52FIkcQobQuGDX...",
   "type":"beacon",
   "timestamp":1462629479859,
   "source":{  
      "type":"user",
      "userId":"U4af4980629..."
   },
   "beacon":{  
      "hwid":"d41d8cd...",
      "type":"enter"
   }
}
  ```


### **PUSH API**　[LINE Developers　該当ページ](https://developers.line.me/ja/reference/messaging-api/#anchor-0c00cb0f42b970892f7c3382f92620dca5a110fc)
  * ユーザーIDを指定してメッセージを送信することができる（似た用途のIDがあるため混同しないよう注意）。
      * ユーザーID　=  [Webhookイベントオブジェクト](https://developers.line.me/ja/reference/messaging-api/#common-properties)で返されるuserId　
      * ユーザーID　≠  REPLY TOKEN
      * ユーザーID　≠  LINE ID

  * 選んだLINE@のプランによっては利用できないので注意。



# 実現方法
* 事前に手助けを必要とする人のユーザーIDと、所持しているBeaconのIDを紐づけてサーバーにて管理。
* 手助けを必要とする人がBeaconをONすると付近にいるユーザーのユーザーIDがサーバーに通知される。
* サーバーは「手助けを必要とする人のユーザーID」、「付近にいるユーザー」双方のユーザーIDを持っているため、PushAPIで双方にメッセージを送信することができる。

# 最後に
LINE　Beaconの活用はそこまで進んでいないが、利用方法によっては一味違ったボットを実現することが可能となる。
是非、活用していただきたい。
GCPを使い始めて気づいたAWSとの違いをメモしていく その1

# GCPを使い始めて気づいたAWSとの違いをメモしていく その1

今までAWSを使ってきたけど、GCPも使うことになった。


公式ドキュメント AWS プロフェッショナルのための Google Cloud Platform 
https://cloud.google.com/docs/compare/aws/?hl=ja
もあるけど、やっぱり使うと色々と気づきがあるので、使い始めて気になったことをメモしていく


## IAM

### 用語・概念がAWSとぜんぜん違う


- エンドユーザー : ユーザーアカウント。Googleアカウントを使う
- システムユーザー : サービス アカウント。いわゆるアクセスキーが発行できる（GCP内利用なら不要）
- Role : 権限セット。基本的に用意されているものを使う
- Policy : リソースに対して、UserとRoleの紐づけをおこなう

リソースに対して、このユーザーはこの権限セット(role)をもつ、を指定する。


### 階層の概念がある

ポイントは、親は神ってこと https://cloud.google.com/iam/docs/overview?hl=ja#policy_hierarchy

> 親のポリシーで付与されたアクセス権を子のポリシーで制限することはできません。たとえば、プロジェクトで編集者の役割をユーザーに付与し、その子リソースで閲覧者の役割を同じユーザーに付与した場合、そのユーザーは子リソースでも編集者の役割を持つことになります。


## 監査ログ

AWSのCloudTrailに相当
はじめから、操作系はロギングされていて無効にできない。閲覧系・データー読み書きも対象にできる（要設定）
Stackdriver Loggingに出力される。保管期間は固定 https://cloud.google.com/logging/quotas?hl=ja#logs_retention_periods
CloudTrailの証跡機能(S3に保管したり、そのhashつくったり)は見当たらない（Stackdriver LoggingからCloud Storageへエクスポートし続ける、は簡単にできる）



## ネットワーク

### VPC
グローバルでネットワークが構成される
サブネット名はリージョン内で一意である必要あり（VPC違ってもかぶっちゃだめ）


### Firewall Rule

AWSのSecurityGroupとは全く違う作り


ACLの作り

- AWSの、SecurityGroupは、deny->allowで穴を開けていく方式だが、
- GCPのFirewall Ruleは優先度順にマッチしたところで決まる方式（ネットワークのACLで一般的な方式）


アタッチ

- AWSのSecurityGroupはインスタンス(厳密にはENI)にアタッチする
- GCPのFirewall RuleはVPC固有（VPCに一つ）
   - 個別のルールでターゲット（適用されるインスタンス）を限定したルールが作れる。タグとか、サービス アカウントとかで指定できる



### VPCフローログ

- AWSとだいたい同じ、Stackdriver loggingに吐いてくれる。
- Firewall RuleでDenyされた通信は出力されないっぽい



## Log

- Stackdriver Loggingが、CloudWatch Logsに相当
- CloudWatch Logsと違って概念的にログは一つでフィルターで全部絞る
- Exportは、設定すればずっとシンクし続けてくれるので、CloudWatchLogsみたいに自力で定期実行したり、Kinesisとか用意しなくてもExportし続けてくれる。
- Agentはfluentd base https://cloud.google.com/logging/docs/agent/?hl=ja
- 保管期間は固定 https://cloud.google.com/logging/quotas?hl=ja#logs_retention_periods





## Compute インスタンス

### SSHログイン

- `gcloud compute ssh` すると、自動で自分のユーザーアカウントと、SSH鍵を生成して、SSHログインできる
- ec2-userみたいな共有アカウントにならないし、共有鍵管理もしなくてOK
- `roles/compute.instanceAdmin.v1` Roleをもっていれば、↑のSSHログインができる - https://cloud.google.com/compute/docs/access/iam?hl=ja#connectinginstanceadmin



## おしまい

- とりあえず今日はここまで
- Deployment Managerがどんなものなのか気になるので、はやめに試してみる
Node.jsのインストール

MACではとても簡単にインストールできたのに、開発用Ubuntuではパッケージの依存関係でnpmをapt-getでインストールできなく苦労したので備忘録的にメモ。結局、npmからnode.jsをインストールすることで対処した。

## npmのインストール

```
git clone https://github.com/creationix/nvm.git ~/.nvm
source =/.nvm/nvm.sh
```
gitからcloneしてきて、bashファイルを実行して完了。簡単。

### Node.jsのインストール

```
nvm ls-remote  ## node.jsのバージョン確認。最新の安定版は下記のようにコメントがつく

        v8.11.2   (LTS: Carbon)
        v8.11.3   (LTS: Carbon)
->      v8.11.4   (Latest LTS: Carbon)
         v9.0.0
         v9.1.0
         v9.2.0

nvm install 8.11.4
```
これで終了。簡単。ここまで来るのに結構苦労した。。。なぜかGPUのドライバーが削除され、ログインできなくなったり、さらにCUIの解像度が合わなくなってしまって真っ黒になってしまったり。余計なことで時間を使ってしまった。
systemdタイマーのスケジューリング

Linuxでタイマーを設定する際はcrontabが手軽で好きだったのだけど、systemdでやる必要が生じた。systemd？誰それ……。
やれやれ、僕は検索した。

**[systemd/タイマー](https://wiki.archlinux.jp/index.php/Systemd/%E3%82%BF%E3%82%A4%E3%83%9E%E3%83%BC)**

実行内容を`.service`形式ファイルに記述して登録し、`.timer`形式ファイルで実行方式をコントロールするもののようだ。
機能を網羅的に調べることは時間の都合上できなかったが、とりあえず肝心の実行間隔についてメモしておく。
`.timer`ファイルには`[Timer]`セクションがあり、`OnCalendar`プロパティで実行タイミングを設定できる。

**毎日午後10時**

```properties
OnCalendar=*-*-* 22:00:00
```


**毎週金曜午前0時**

```properties
OnCalendar=Fri *-*-* 00:00:00
```

**毎月第一月曜午前1時**

```properties
OnCalendar=Mon *-*-1,2,3,4,5,6,7 01:00:00
```

**5分間隔**

```properties
OnCalendar=*:0/5
```

設定値は色々あって最初は取っつきにくいものの、実行ユーザやグループ、前処理とか止め方みたいな細かい制御も色々できそうなので、こなれてくると非常に強力な使い方もできそうだなあという感想。
いやそんなバッキバキに制御するような構成は別に望んではいないのですが。
MASM32でdllを作る

新しい記事はこちらです。

https://qiita.com/Stosstruppe/items/f0be3a9cededf3e8a62a

参考：[Iczelion's Win32 Assembly Tutorial 17: Dynamic Link Libraries](http://www.interq.or.jp/chubu/r6/masm32/tute/tute017_Jp.html)

```dlltest.asm
comment *
MASM32 SDK / Win32
ml /c /coff dlltest.asm
link /dll /def:dlltest.def dlltest.obj
*

.386
.model flat, stdcall
option casemap:none

include <windows.inc>

.code

DllEntry	proc hinstDLL:HINSTANCE, fdwReason:DWORD, lpReserved:LPVOID
		mov	eax, TRUE
		ret
DllEntry	endp

myadd		proc a:DWORD, b:DWORD
		mov	eax, a
		add	eax, b
		ret
myadd		endp

mysub		proc a:DWORD, b:DWORD
		mov	eax, a
		sub	eax, b
		ret
mysub		endp

end DllEntry
```

```dlltest.def
EXPORTS
	myadd
	mysub
```

```dev.bat
@echo off
path %path%;C:\masm32\bin
set INCLUDE=C:\masm32\include
set LIB=C:\masm32\lib
cmd
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257554/a7a659e2-e2ae-43a3-fbd7-69df507ebe97.png)

```addsub.cs
// csc /platform:x86 addsub.cs

using System;
using System.Runtime.InteropServices;

class Program {
	[DllImport("dlltest.dll")]
	static extern int myadd(int a, int b);
	[DllImport("dlltest.dll")]
	static extern int mysub(int a, int b);

	static void Main() {
		Console.WriteLine("add = {0}", myadd(1, 2));
		Console.WriteLine("sub = {0}", mysub(1, 2));
	}
}
```

```c#.bat
@echo off
path %path%;C:\Windows\Microsoft.NET\Framework\v4.0.30319
cmd
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257554/0514e573-a759-533f-5ff8-49f6cb34a8f2.png)