OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Organizationsの設定をしたのでまとめました

# はじめに
仕事でAWS Organizationsの設定をしたのでまとめました

# 前提
- サービスコントロールポリシーは登録済み
- IAMの細かい設定は割愛

# AWS Organizations設定の流れ
1.アカウントの追加
2.アカウントの整理（OUの作成）
  ※サービスコントロールポリシーは前任者によって、設定済みでしたので、こちらの手順にはありません
3.IAMにてロールの設定
4.ロールの切り替え

# 設定してみた
## 1.アカウントの追加
<img width="1437" alt="img1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103774/b54e78f5-3b06-5b90-3c7f-55a8a4c4d700.png">

[AWS Organizations コンソール](https://console.aws.amazon.com/organizations/)にアクセスして、「アカウントの追加」ボタンをクリックします

<img width="1438" alt="img2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103774/f8994d53-e997-cf51-d55c-357ea85a5d7f.png">
「アカウントの作成」ボタンをクリックします

<img width="1435" alt="img3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103774/87ecfb0a-4ba9-dea2-6362-38e937d6b512.png">

以下を入力して、「作成」ボタンをクリックすると、一覧にアカウントが追加されます

- AWSアカウント名(必須）
- Eメール(必須）
- IAM ロール名（任意）
  - 未入力だと「OrganizationAccountAccessRole」になります
  - 後ほど、IAMの設定で使用するのでメモしておくのを忘れずに

## 2.アカウントの整理（OUの作成）
![img4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103774/ec7ae031-c16e-97b1-dbb2-f36da86ffe8c.png)

アカウントの管理（①）、新規組織単位（②）の順でクリック後、組織単位の名前を入力して、「組織単位の作成」ボタンをクリックします

>組織のマスターアカウントにサインインすると、組織のルートに OU を作成できます。OU は、最大 5 レベルの深さまでネストできます。OU を作成するには、次のステップを完了します。

>参考：[組織単位 (OU) の管理](https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_ous.html)

とあるので、5階層まで作成できるようです

![img5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103774/300d91ea-d6ac-c879-efb2-50a1816fa160.png)
「1.アカウントの追加」で追加したアカウントを選択（①）して、表示された「移動」のリンクをクリックします
移動する組織を選択（②）後、「移動」ボタンをクリックします
この操作でOUに組織アカウントが属するようになります

## 3.IAMにてロールの設定
グループを作成して、ロールを設定しました
グループのアクセス許可タブにある「グループポリシーの作成」をクリックして、以下のようにカスタムポリシーを指定します

- [Sid] : 任意の値を指定
- [ID] : 「1.アカウントの追加」で追加したアカウントIDを指定（アカウントの一覧に表示されています）
- [roleName] : 「1.アカウントの追加」で入力した「IAM ロール名」。未入力の場合は「OrganizationAccountAccessRole」を指定

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "[Sid]",
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": [
                "arn:aws:iam::[ID]:role/[roleName]"
            ]
        }
    ]
}
```

## 4.ロールの切り替え
AWSコンソールにログイン後、以下のURLで切り替えができます
[roleName]と[ID]（3.IAMにてロールの設定と同じもの）はお使いの環境のものを指定してください

https://signin.aws.amazon.com/switchrole?roleName=[roleName]&account=[ID]


# まとめ
ざっくりとなりますが、AWS Organizationsを簡単にまとめました
ロールの名称のメモは忘れずにしましょう


# 参考
[AWS Organizations](https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_introduction.html)
欠損値（NaN）がある列を列ごと置換したいとき

#概要
NaNの入っている列を抽出と書いてある記事はあるのですが、具体的に列ごと取ってきたり、その列をほかのリストで埋めたりしているものがなかったので今回まとめてみました。
解説に関しては初学者のため、あまり参考にならないかもしれませんが、こういう手法もあるんだ程度で見ていただければ幸いです。

#NaNが含まれているかの判定

行のどこかにNaNが含まれていた時、Trueを返すコードは以下の通りです。1行すべてNaNの時だけTrueを返してほしかったらanyをallに変えればよいです。
今回用意したデータでは2行目だけがNaNを含んでいます。

```Python
df_judge = df.isnull().any(axis=1)

"""
0     False
1     False
2      True
3     False
4     False
5     False
6     False
7     False
8     False
9     False
"""
```

#NaNの存在する列にリストを挿入する
まずTrueが存在するかはif文で調べることができ、リストの要素呼び出しとほぼ同じでした。

```Python
    for i in range(len(df)):
        if df_judge[i] == True:
            for j in range(len(df.columns)):
                #round処理は小数第1位にそろえる処理
                df.iloc[i,j] = average_list[j]
```
今回はNaNがある列にその他の列の平均値を挿入するのが目的でした。
列数、行数はlen(df),len(df.columns)で取得できるため、二重for文を使いました。if文でNaNがあると判定された後、指定の行に1つずつ列をずらして平均値を代入しています。DataFrameの要素を指定するときはdf.iloc[行,列]を使いました。
直接列ごと挿入できないのは残念ですが、この方法で対処できるのでぜひ参考にしてみてください。
XAMPPでApache起動出来ずにハマった話

※windows10、xamppのバージョン7.4.1で環境を作ってます。

WordPressの環境をローカルで作成しようと思いxamppをダウンロードしてApacheを起動したが動かない・・・。
error.logを確認すると以下エラーが。

`PHP Warning:  'vcruntime140.dll' 14.0 is not compatible with this PHP build linked with 14.16 in Unknown on line 0`

翻訳してみると、vcruntime140.dllがPHPと互換性がないと言われているように見える。

#vcruntime140.dllって何？

色々調べてみると、
https://www.php.net/manual/ja/install.windows.requirements.php

PHPを動かすためにはVisualCのランタイムが必要でvcruntime140.dllというのがランタイムにあたるようだが、今入ってるPHPのバージョンと互換性がないよ！と言われているっぽい。

#じゃあどうすれば良いの？

以下ページからVisualStudio2019のMicrosoft Visual C++ 再頒布可能パッケージをインストールして再度Apacheを起動したら起動出来た！
https://visualstudio.microsoft.com/ja/downloads/


Apache立ち上げるだけで結構時間がかかってしまった・・・( ;∀;)

エラー内容で調べても出てこなかったので備忘録として。
【AtCoder用】標準入力メモ

# モチベ
AtCoderの過去問埋めでいつも忘れてしまう標準入力の備忘録

## int2つ
```python
N,Q = map(int, input().split())
```
## 横多数　str
```python
l = [s for s in input().split()]
```

## 横多数　int
```python
l = list(map(int,input().split()))
```

## 縦N回 int
```python
i = [int(input()) for i in range(N)]
```

## N×M int
```python
l = [[int(i) for i in input().split()] for j in range(M)]
```

## 以下のようなgridとか
```
##.#
....
##.#
.#.#
```

```python

grid = np.array([list(input()) for _ in range(h)], dtype="U1") 
```
iTextSharpでPDFの綴じ方向を取得する方法

iTextSharpでPDFの綴じ方向を取得するには、ViewerPreferencesを取得します。
Java版のiTextも似たようなものだと思います。

```C#
using iTextSharp.text.pdf;

var pr = new PdfReader(stream);
var vp = iTextSharp.text.pdf.intern.PdfViewerPreferencesImp.GetViewerPreferences(pr.Catalog).GetViewerPreferences();
this.Direction = Directions.Default;
if (vp.Contains(PdfName.DIRECTION))
{
    var name = vp.GetAsName(PdfName.DIRECTION);
    if (name == PdfName.R2L)
    {
        this.Direction = Directions.R2L;
    }
    else if (name == PdfName.L2R)
    {
        this.Direction = Directions.L2R;
    }
}
pr.Close();
```
(参考元:http://itext.2136553.n4.nabble.com/Using-getSimpleViewerPreferences-td2167775.html)

Viewer Preferenceを取得する部分は、```iTextSharp.text.pdf.intern.PdfViewerPreferencesImp.GetViewerPreferences(pr.Catalog).GetViewerPreferences();```
なんだこれ…。

綴じ方向とは、Adobe ReaderのCtrl+Dで確認できる設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146467/8512cc88-8b7b-801b-58f2-85cad37e745e.png)
注意点として、

* ここで「綴じ方: 左」と表示されていても実際にはDirectionが設定されていない場合がある
* 実際には右綴じなのに「綴じ方: 左」と表示されるファイルが結構ある。

一方で取得ではなく設定したいならこんな感じです。

```C#
using iTextSharp.text.pdf;

var org = new PdfReader(file);
using (var outfile = new System.IO.FileStream(TemporaryFile, System.IO.FileMode.CreateNew))
{
    var st = new PdfStamper(org, outfile);
    st.AddViewerPreference(PdfName.DIRECTION, R2L ? PdfName.R2L : PdfName.L2R);
    st.Close();
}
org.Close();
```
(参考元:https://kiwanami.hatenadiary.org/entry/20101215/1292400269)

Viewer Preferencesに関しては[この辺り](https://manuals.setasign.com/setapdf-core-manual/viewer-preferences/)が参考になりそうです。
とりあえず綴じ方向以外はあまり有用そうには見えませんね。

ちなみに使っているのはLGPL版の4.1.6です。
AGPLに移行後の最新版は知りませんが、非ジェネリック版のCollectionを使っていたりAPIが直感的じゃなかったりで使いづらいですね。
上のとか、``PdfReader.ViewerPreferences``にgetアクセサ追加とかが順当ですよね。
実際の``PdfReader.ViewerPreferences``はsetアクセサしかない上、int型です。
まぁJava由来ですからね。PDFの仕様自体が難解ですし。

[ソースコード](https://github.com/kurema/BookViewerApp3/blob/master/BookViewerApp/Books/BookPdf.cs)は開発中の[BookViewer](https://www.microsoft.com/ja-jp/p/bookviewer/9nblggh5n200)後継アプリ[BookViewerApp3](https://github.com/kurema/BookViewerApp3)のものです。
setTimeout()を使ったループ処理





```javascript:qiita.js
'use strict';

{
function showTime() {
console.log(newDate());
setTimeout(showTime, 1000);//繰り返す値と、１０００ミリ秒（１秒）を引数に渡す
};

showTime();
}
```
結果として現在時刻を１秒毎に出力する。



上のコードだとループ処理になるため、指定した数字で止める処理は↓


```javascript:qiita.js
'use strict';

{
 let i = 0;
 function showTime() {
    console.log(newDate());
    const timeoutId = setTimeout(showTime, 1000);
    i++;
    if(i > 3){  //3より大きい値になるまで処理
      clearTimeout(timeoutId)//clearTimeoutにsetTimeoutの返り値を定数に入れる
    }
  };

showTime();
}
```
nodenv のインストール時に default-packages file not found と表示される問題

# 例

```bash
% nodenv install 10.19.0
nodenv: /Users/myname/.anyenv/envs/nodenv/versions/10.19.0 already exists
continue with installation? (y/N) y
Downloading node-v10.19.0-darwin-x64.tar.gz...
-> https://nodejs.org/dist/v10.19.0/node-v10.19.0-darwin-x64.tar.gz
Installing node-v10.19.0-darwin-x64...
Installed node-v10.19.0-darwin-x64 to /Users/myname/.anyenv/envs/nodenv/versions/10.19.0

nodenv: default-packages file not found
```

# 解決策

default-packages file を作成する

```bash
% touch $(nodenv root)/default-packages
```

# その他

anyenv を使って nodenv 環境を構築した際に遭遇した。
nodenv の nodenv-default-packages という拡張で使用されるファイルの様子。

nodenv/nodenv-default-packages: Install default packages every time you install a new version of Node
https://github.com/nodenv/nodenv-default-packages
VueやNuxtで自作コンポーネントをグローバルに呼び出す

Vueのコンポーネント便利ですよね！
これをいかにうまく作るかがVueの醍醐味だと思っております。
作ったコンポーネントを1度しか呼び出さないときは

```vue
<script>
 import MyButton from '~/components/buttons/MyButton'

 export default {
   components: {
     MyButton
   }
 }
</script>
```

で呼び出すようにすれば充分でしょう。
でも、至る箇所でコンポーネントを呼び出したい場合、いろいろな.vueファイルに記述を書くのは面倒です。
そういったのはグローバルで呼び出せるようにしてしまいましょう。

# グローバルに登録
例えばMyButtonというコンポーネントを作ったとします。
以下のような記述を書くとグローバルに登録でき、.vueファイル内でMyButtonを呼び出すことが出来ます。

```js
import Vue from 'vue'

import MyButton from '~/components/buttons/MyButton'
Vue.component('MyButton', MyButton)
```

ではこの記述をどこに書くのか・・・
僕はコンポーネントを種類別にディレクトリを分けます。
例えばボタンなら`components/buttons`の中に
チェックボックスやラジオボタンなら`components/forms`の中にといった具合です。
でこれらをグローバルに呼び出したいので、`components/buttons`の中に`index.js`、`components/forms`の中に`index.js`を作りその中に上記のようなグローバルに登録する記述を書きます。
そして`components/index.js`を用意してそこに以下のように記述します。

```js:components/index.js
import '~/components/buttons'
import '~/components/forms'
```

最後にこの`components/index.js`をどこかで呼び出せばOKです。
vue.jsの場合は、`main.js`内に

```js
import '~/components'
```
を追記しましょう。

nuxt.jsの場合は`nuxt.config.js`の中の`plugins`に登録しておけば、フレームワーク起動時に呼ばれるのでどのvueファイルでもコンポーネントを呼び出すことが出来ます。

```js
export default {
  plugins: [
    '~/components/index.js'
  ]
}
```
vCenterのREST API使用方法

個人的備忘録
vSphere Client バージョン 6.7.0.20000
## apiexplorer
- VMwareの`apiexplorer`にアクセスすることで、REST APIのリファレンスを確認することができる。
  - URL: `https://<vCenter IP or FQDN>/apiexplorer/`
- 例えばVM情報をGETするAPIは以下のように確認することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418880/c311717b-7b0a-3a82-9bf7-38e86adde1f5.png)
- `TRY  IT OUT!`をクリックすることで、実際にvCenterに対してAPIの実行を試すことができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418880/f1b6e294-ebc0-b891-9d98-375d18e1c5aa.png)

※上記はheader内の`session-id`がnullになっているため、認証エラーとなる。

## curlによるAPI実行
- vCenterとIPリーチャブルなマシンにログインする。
- 事前にsession-idを取得する。

```
$ curl --insecure -X POST -u <your-id>:<your-password> \
 https://<vCenter IP or FQDN>/rest/com/vmware/cis/session
{"value":"d8da17d7cba6677d67a271873666eecf"}
```

- session-idをheaderに追加して、任意のRESTリクエストを実行する。

```
$ curl -X GET --header "Accept: application/json" --header \
 "vmware-api-session-id: d8da17d7cba6677d67a271873666eecf" \
 "https://<vCenter IP or FQDN>/rest/vcenter/vm" -k
```

- ちなみにsession-idを環境変数にして実行すると便利。
  - もちろんjqでも可。

```
$ export session_id=`curl --insecure -X POST -u 'user:pass' https://<vCenter IP or FQDN>/rest/com/vmware/cis/session | python3 -c "import sys, json; print(json.load(sys.stdin)['value'])"`
$ curl -k -X GET --header "Accept: application/json" --header "vmware-api-session-id: $session_id" "https://<vCenter IP or FQDN>/rest/vcenter/vm" | python3 -m json.tool 
```

## 参考：vCenter REST-API一覧
- apiexplorerに記載されているAPIの一覧

|rest-api|
|---|
|cluster|
|datacenter|
|datastore|
|datastore/default_policy|
|deployment|
|deployment/import_history|
|deployment/install|
|deployment/install/initial_config/remote_psc/thumbprint|
|deployment/install/psc/replicated|
|deployment/install/psc/standalone|
|deployment/install/remote_psc|
|deployment/question|
|deployment/upgrade|
|folder|
|guest/customization_specs|
|host|
|inventory/datastore|
|inventory/network|
|iso/image|
|network|
|ovf/capability|
|ovf/export_flag|
|ovf/import_flag|
|ovf/library_item|
|resource_pool|
|services/service|
|storage/policies|
|storage/policies/compliance|
|storage/policies/compliance/VM|
|storage/policies/VM|
|system_config/deployment_type|
|system_config/psc_registration|
|vcha/capabilities|
|vcha/cluster|
|vcha/cluster/active|
|vcha/cluster/deployment_type|
|vcha/cluster/mode|
|vcha/cluster/passive|
|vcha/cluster/witness|
|vcha/operations|
|vcha/vc_credentials|
|VM|
|vm_template/library_items|
|vm/guest/identity|
|vm/guest/local_filesystem|
|vm/guest/power|
|vm/hardware|
|vm/hardware/adapter/sata|
|vm/hardware/adapter/scsi|
|vm/hardware/boot|
|vm/hardware/boot/device|
|vm/hardware/cdrom|
|vm/hardware/cpu|
|vm/hardware/disk|
|vm/hardware/ethernet|
|vm/hardware/floppy|
|vm/hardware/memory|
|vm/hardware/parallel|
|vm/hardware/serial|
|vm/power|
|vm/storage/policy|
|vm/storage/policy/compliance|
n番目のスタイルを変えたい時に便利な疑似クラスnth-child

# nth-childとは

ある要素の隣接している子要素を最初から数えて、n番目にあたる要素にスタイルを当てることができる！

## 擬似クラス :nth-child()の使い方まとめ
```
nth-child(n)　　n番目
```
```
nth-child(３n)　　３の倍数
```
```
nth-child(３n-1)　　３の倍数-1番目に適用
```
```
nth-child(n-４)　　４番目以降に適用
```
```
nth-child(even)，　 :nth-child(2n)　　偶数
```
```
nth-child(odd)， :nth-child(2n-1)　　奇数
```

## n番目

### :nth-child(n)
例えば、3の倍数の場合 **:nth-child(3)** になります。
以下の記述で３の倍数のリストの文字色だけ赤色に変えることができます。

```sample.css
li:nth-child(3n) {
  color: red;
  font-weight: bold;
}
```

## 3の倍数-1番目に適応

### :nth-child(3n-1)

```sample.css
li:nth-child(3n-1) {
  color: red;
  font-weight: bold;
}
```

例えば３つ横並びにしたとき、真ん中のみスタイルを適用したい時に便利!
<img width="814" alt="スクリーンショット 2020-02-13 17.22.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526620/6ff92c1f-6a3f-01d9-52bc-dca7efb6e398.png">

*********************************************************

nth-child(n)を使えばhamlのクラス名を変えて都度scssを書く必要がないので便利ですね！！！
桁,bit 

abc154 e
制約がクソデカくてN以下の~の条件を満たす数の個数を求めよ的な問題は桁dp

```c++

int main() {
	string N; cin >> N;
	int n = N.size();
	int K; cin >> K;
	ll dp[110][2][4];
	REP(i, 110) {
		REP(j, 2) {
			REP(k, 4) {
				dp[i][j][k] = 0;
			}
		}
	}
	dp[0][0][0] = 1;
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < 2; ++j) {
			for (int k = 0; k <= K; ++k) {
				int x;
				x = j ? 9 : N[i] - '0';
				for (int d = 0; d <= x; ++d) {
					if (d != 0) {
						if (k < K) {
							dp[i + 1][j || (d < x)][k + 1] += dp[i][j][k];
						}
					}
					else {
						dp[i + 1][j||(d<x)][k] += dp[i][j][k];
					}
				}
			}
		}
	}
	cout << dp[n][0][K] + dp[n][1][K] << endl;
	return 0;
}
```
例題 typicaldp 数
code festival 2014予選a 壊れた電卓

逆にnがめっちゃ小さいやつはbit dpで解ける
abc 142 e

```
データ分析でのメタデータ

データレイクを管理、利用していく上で、データがどんなに綺麗に処理されても、「それはどういうデータなのか」、「どこにあるのか」を把握できなければ、データの真価は見出せません。
小さい組織であれば、隣の人に聞けば済むことなので、それほど大事じゃないですが、規模が大きくなるとデータの意味を知ることが難しくてなってくるので、メタデータ管理が重要になってきます。メタデータを管理することで、データレイクの沼化も防ぐことができます。

##メタデータとは
データを説明するためのデータ

##メタデータが提供しなければ行けないもの
データの場所をユーザに提示する
ユーザがデータの理解するための手かがりを提示する

##メタデータで収集しておきたいもの
|メタデータ|説明 |例  |
|---|---|---|
|技術面　　|どのように定義されているのかを示すもの。データがデータレイクに収集された段階で収集が可能。 |データのタイプ（csv,text,json,Avroなど）、CREATE TABLE文にあるもの |
|運用面　　| データのプロファイル、データの出処を示すもの。データに障害が発生したときに影響範囲の調査で役立つ|リネージュ、データの大きさ、データの行数   |
|ビジネス面　　|ビジネス文脈での意味を示すもの  |区別の説明において、0が男性、1が女性のような説明文。今と昔では意味が変わってることを説明文。データ辞書とも言ってたりします。|

その他
データオーナー：そのデータは誰によって作られ管理されているのか
データセキュリティー：そのデータは誰が見ていいのか

## メタデータの開示
メタデータの公開はツールの利用もしくは、Webサイトなどを作って公開する手法が一般的です。こうしたサイトを「データカタログ」と呼びます。メタデータはユーザが頻繁に調べる情報なので、ユーザが簡単に検索できるものが良く、データ利用者が内容を編集できるようなレビュー機能もあると良いです。
　商用のデータカタログ製品もいろいろあり、Infomatica、Denodo、Talendあたりが有名です。OSSだと、CKANとういうソフトがよく使われます。クラウド環境だと、Azure Data Catalog, AWSのGlueがカタログとして利用できます。ただし、AWSのGlueのカタログはあくまでETLサービスの一つの機能で、Glueが作成するデータはAWSサービス間のデータの物理定義を管理するものなので、ビジネスでのメタデータの登録には不向き。
｢MountainSort｣でスパイクソーティングをする


スパイクソーティング（spike sorting）は電気生理学の細胞外電位計測で行われるもので、電極から得られた電気信号から、神経細胞ごとの活動を取り出すものです。
１つの電極には、たいていは近くに複数の神経細胞が存在し、複数の神経細胞からの電気活動(スパイク)が取れます。そのため、細胞ごとに分離すればより詳細な解析が行えます。

![400px-QQ_Fig1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521288/1ebbcac0-94d5-1f84-5be3-eb7cbd146dbd.jpeg)
（Rodrigo Quian Quiroga (2007), Scholarpedia, 2(12):3583.より画像を引用
http://www.scholarpedia.org/article/Spike_sorting）

手動で行うのはとても労力がかかるため、自動化が望まれます。
基本的な方法論としては、まず信号からスパイクを取り出し、その波形の特徴を元にしてクラスタリングを行います。同じようなスパイクの波形なら、同じ細胞の活動とみなすということです。
波形自体はとても情報量が多いため、そこから特徴量を取り出して教師なしクラスタリングを行う、などが主な方法です。

このspike sortingの技術はまだベストな方法が分かっておらず、調べてみると新しいソフトが毎年発表されているようです。
日本人の方が開発したものではEToSがあります。私も以前に使用したことがあります。
(https://www.frontiersin.org/articles/10.3389/fninf.2012.00005/full)
また最近だとVISSORというソフトもあるようです。
(https://omictools.com/vissor-tool)

そんな中でNeuronで発表された「MountainSort」というソフトを見つけました。
(https://www.sciencedirect.com/science/article/pii/S0896627317307456)
特徴はスパイクの重なりや低周波のノイズ(ドリフト)に強く、そしてパラメータ無しで完全自動であることのようです。
現在は「MountainLab」というソフトの一部になったようです。
実際にインストールして使用してみました。

GitHubページ：https://github.com/flatironinstitute/mountainsort_examples
マニュアル：https://mountainsort.readthedocs.io/en/latest/mountainlab/mountainlab.html

##インストール
使用できるOSはMacかLinuxです。
私はUbuntu 16を使用しました。
Anacondaからcondaコマンドでインストール出来るようです。
ターミナルから以下のコマンドを打ちます。

```
conda create -n mountainlab
conda activate mountainlab
conda install -c flatiron -c conda-forge \
			mountainlab \
			mountainlab_pytools \
			ml_ephys \
			ml_ms3 \
			ml_ms4alg \
			ml_pyms
```
インストールしたら動作を確認しましょう。

```
ml-config
ml-list-processors
```
他にも可視化用のパッケージをインストールします。

```
conda install -c flatiron -c conda-forge ephys-viz
conda install -c flatiron -c conda-forge qt-mountainview
```
これでインストール出来ました。
もしJupyterを使用したい場合は、jupyterlabもインストールしましょう。

##デモを動かす
GitHubページの中に、いくつかのデモコードが入っているので、ダウンロードします。

```
git clone https://github.com/flatironinstitute/mountainsort_examples.git
```
この中のbash exampleにはランダムでデータを生成してデモをしてくれるコードがあるのでそれを使いましょう。

```
cd mountainsort_examples/bash_examples/001_ms4_bash_example
./synthesize_dataset.sh
```
データを生成されました。
次にデータを可視化します。

```
ev-dataset dataset
```
ephys-vizのエラーになりました。

スパイクソーティングを行います。

```
./ms4_sort_bash.sh
```

結果は以下のコマンドで可視化できます。

```
ev-templates output/templates.mda.prv
ev-timeseries dataset/raw.mda.prv --firings output/firings.mda.prv --samplerate=30000
qt-mountainview --raw dataset/raw.mda.prv --filt output/filt.mda.prv --pre output/pre.mda.prv --samplerate 30000 --firings output/firings.mda
```
evのコマンドはephys-vizのエラーになりましたが、
最後のコマンドのqt-mountainviewは正常に動いて、GUIツールが表示されました。
![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521288/6c5a36f4-b355-8064-88e3-aee1ef74cc01.jpeg)

色んなコマンドで可視化が出来て便利そうです。

ephys-vizの方はエラーが解決したら、更新する予定です。


##感想など
電気活動のデータは実験環境によって様々あり、それがspike sortingの難しさの要因としてあるようです。
最近だとDeep Learningを使用したアルゴリズムもあるようです。
また、spikeforestというベンチマークソフトも出てくるようです。
いつか完全なspike sortingソフトが出てくるのを期待したいです。

MountainLabはspike sorting以外のデータにも使えるようなので、他の時系列データにも活用していきたいです。

また電気生理学実験を包括的に行うオープソースとしてOpen Ephysというソフトもあるようです。
これも非常に興味深いですね。
https://iopscience.iop.org/article/10.1088/1741-2552/aa5eea
softmax関数になぜexpを使うのか

ソフトマックス関数とは以下の関数である。分類問題の活性化関数によく用いられる。
$y_k = \frac{exp(a_k)}{\sum_{i=1}^{n}exp(a_i)}$

## 疑問
expはなんで必要なんだろう？普通に元々の入力$a_i$の和を使うことで、同様の確率を出せるのではないか？

## expが必要な理由
理由は下の二つ。
1. $a_i$が負の値の時でも0〜1の値に変換することができる
2. 全ての出力結果が単調増加する形で使用できる
3. expは微分がしやすいため逆伝搬する際都合が良い



## 参考
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13188217003
YWTとKPTをやってみた感想

こんにちは、[MYLOPS](https://mylops.jp/?utm_source=qiita&utm_medium=social&utm_campaign=200213&utm_content=q_tr)のエンジニアの後河内です。
MYLOPSでは、金曜日に、その週の業務の振り返りを行います。
振り返りをする事で、日々の業務の中の問題点を見つけ共有し、業務の改善をおこなっています。

さて去年の年末ですが、１週間の振り返りではなく、個人の半期の振り返りとしてYWT、半期でおこなった各PJの振り返りとしてKPTを行いました。

KPTですが、こちらは比較的昔から普及している振り返りの手法だと思います。
下記のそれぞれの頭文字をとってKPTとなります。

K：Keep ＝ 良かったこと（今後も続けること）
P：Problem＝ 悪かったこと（今後はやめること）
T：Try ＝ 次に挑戦すること

やり方としては、振り返り対象のKeepとProblemをだし、そこから次のPJでのTryするものをだします。
MYLOPSでやった方法ですが、下のような表をGoogleスプレッドシートに作り、社内で共有して各PJの参加者に振り返り会の当日までに書いてもらいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99689/ca3226e7-f133-bbbb-9016-045dd03b301d.png)

KPTをやってみた感想ですが、半期のあるPJで起きたProblemを反省し別のPJでは、すでに改善できてるものもあれば、ずっと同じようなProblemを起こしてるものもあったので、もっと早い段階でKPTを行い、改善できる点はどんどん改善していた方が良いなと思いました。
また、終わってから、時間がたつと忘れていることもあるので、KPTはPJ終わりごとにやるのが良いなと思いました。PJの最後にはKPTをするように社内のワークフローに入れたいなと思ってます。

次にYWTですが以下の頭文字をとったものです。

Y：やったこと（Yattakoto）
W：わかったこと(Wakattakoto)
T：次にやること(TuginiYarukoto)

”やったこと”から、”わかったこと”をだし、そこから”次にやること”を導く手法になります。
基本的にはKPTに似てるものなのですが、KPTの問題点としてProblemが、他者攻撃になりやすい、またProblemの部分には、自己嫌悪や内罰的な表現が並ぶことになりやすいので一歩間違えると建設的な議論ができないということから、”やったこと”から”わかったこと”として”次にやること”の議論がしやすくするための日本発祥のフレームワークとなります。

以下がMYLOPSで使用したもののテンプレートの例になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99689/bd798c41-0923-d67b-45b7-d8f10e8379dc.png)


実はYWTについては以前一度、半期の振り返りでやってみたのですが、その時には、フォーマットが統一されず、振り返りの粒度がバラバラになってしまうという問題が起こったのでした。
YWTそのものというよりは、こういう振り返りの時は一度テンプレートを作り同じ粒度で話をする方が統一感のある振り返りができると思います。
MYLOPSのYWTの現在の課題は、”次にやること”をだしてもそれをずっと意識できるような仕組みを作ってないことです。
せっかく次にやることをだしているので、それらを意識できるような仕組みというものを今後作っていきたいなと思っております。
WSLでPandoc使ってmarkdownをPDFに変換する

# WSLでPandoc使ってmarkdownをPDFに変換する

WSLで環境を作りたくなったので一通り手順をメモ

## 流れ

- Texはtexliveをaptからインストール
- 補助的なパッケージをインストール
- pandocは公式のdebianパッケージからインストール

## TexLiveをインストール

texliveは普通にaptからインストールする。
推奨パッケージが表示されたらそれもインストールしておく。

```sh:texliveをインストール
$ sudo apt-get install texlive
```

## texliveの日本語パッケージインストール

日本語パッケージはデフォルトに含まれていない？ようなので後から手動でインストールする。

```sh:日本語パッケージのインストール
$ sudo apt-get install texlive-lang-japanese
```

## pandocをインストール

pandocはaptパッケージのバージョンが古いので公式から最新版をインストールする

```sh:pandocをインストール
$ wget https://github.com/jgm/pandoc/releases/download/2.9.1.1/pandoc-2.9.1.1-1-amd64.deb
$ sudo dpkg -i pandoc-2.9.1.1-1-amd64.deb
```

最新のパッケージは公式[Releases · jgm/pandoc](https://github.com/jgm/pandoc/releases)を
参照してそれにあわせる。

## 動作確認

テスト用のmarkdownファイルを適当に用意。
文字コードはUTF-8

```md:book.md
# タイトル1
## タイトル2

本文OK
```

PDFに変換するコマンドを実行

```sh:動作確認
$ pandoc book.md -o book.pdf -V documentclass=ltjarticle --pdf-engine=l
ualatex
```
jpgのqualityを確認する方法 [ImageMagick]

## 目的

手元にあるjpgファイルが、qualityいくつで圧縮されたのかが知りたい！

## 環境

- macOS High Sierra
- homebrew がインストールされていること

## 手順
#### ImageMagick のインストール
```shell
$ brew install imagemagick
```

#### quality の確認
```shell
$ identify -format '%f:%Q\n' hoge.jpg
```

以下のように出力されます

```shell
hoge.jpg:85
```
**%f** (ファイルネーム), **%Q**  (quality)以外に指定できるものは[こちら](https://imagemagick.org/script/escape.php)を参照

## 参考

[imagemagick 公式](https://imagemagick.org/)
Data Lake Storage Gen 2 ファイルシステム情報確認方法 【Azure Databricks 接続用】

## はじめに
Data Lake Storage Gen 2 で作成したファイルシステムを Azure Databricks に接続する際には、以下の情報が必要になります。

- アプリケーションID
- ディレクトリID
- クライアントシークレット
- ストレージアカウント名
- ファイルシステム名

どたばたしていると控えておくのを忘れてしまうこともしばしば。
クライアントシークレットは一度しか発行されませんが、その他については再確認が可能です。
Azure コンソールからの確認手順を記しておきます。

## ストレージアカウントとファイルシステム名の確認
コンソールのトップ画面から Azure Databricks を選択。(最新のリソースからアクセスしたほうが早いことも)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/e0c632df-3dcf-d7f3-03df-1155f6fb3bde.png)

接続対象の Azure Databricks を選択。
![2020-02-13_16h19_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/02799e86-57f9-6564-5483-19765db16bd0.png)

リソースグループをクリック。
![2020-02-13_16h21_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/d5091fd4-6ecd-ac04-e204-e488ef3492ab.png)

ここで**ストレージアカウント名** を確認できます。対象のストレージアカウントをクリック。
![2020-02-13_16h23_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/d3459f9d-aae8-2db8-d5c6-6313714b7394.png)

コンテナを選択。
![2020-02-13_15h31_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/a8ad69cc-c4e5-5d0d-b1a7-31dc6bd4c551.png)

こちらが**ファイルシステム名**です。
![2020-02-13_16h32_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/0f584847-6581-4947-6998-8acf6a2bff67.png)

## アプリケーションID と ディレクトリID の確認

トップ画面より、Active Directory を選択
![2020-02-13_16h33_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/35d2b7d0-33b2-c667-f70d-3f589a27fa14.png)


アプリの起動から、登録した内容ををクリック。
![2020-02-13_15h37_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/ec16c93f-2d82-9dac-2641-d74042b1b3ed.png)

アプリケーションID と ディレクトリID が確認できました。
![2020-02-13_15h38_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/673f31d7-b2d1-1267-1ad5-75669d29dc3e.png)
新しく Ubuntu 環境を構築するときの備忘録

# 環境
Ubuntu 18.04 LTS

# フォントのインストール

```bash:font
$ sudo apt-get install fonts-roboto fonts-noto fonts-ricty-diminished
$ fc-list # インストールの確認
```

# exfat 形式の外部メモリのマウントができない

```bash:error
$ sudo mount /dev/sdb1 /media
mount: /media: unknown filesystem type 'exfat'.
```

```bash:how_to_solve
$ sudo apt-get install exfat-fuse exfat-utils
```

# 外部メモリのマウントができない (Unable to Access drive-Not authorized to perform operation.)
外部メモリにアクセスしようとすると、'Unable to Access drive-Not authorized to perform operation.' というエラーが出る。複数の原因が考えられるが [chrome-remote-desktop が悪さをする場合](https://askubuntu.com/questions/1199116/unable-to-access-external-hard-drive-not-authorized-to-perform-operation-u)があるらしい。

```bash:how_to_solve
$ sudo gpasswd -d ${USER} chrome-remote-desktop
```

# cuDNN インストール後に ldconfig でエラー
```bash:error
$ sudo ldconfig
 /sbin/ldconfig.real: /usr/local/cuda/lib64/libcudnn.so.7 is not a symbolic link
```
libcudnn.so.7.x.x から適宜リンクを貼り直す。(下記では libcudnn.so.7.0.5 から貼り直している。)


```bash:how_to_solve
$ sudo rm libcudnn.so # 壊れたリンクを削除
$ sudo rm libcudnn.so.7 # 壊れたリンクを削除
$ sudo ln libcudnn.so.7.0.5 libcudnn.so.7 # リンクを貼り直す
$ sudo ln libcudnn.so.7 libcudnn.so # リンクを貼り直す
$ sudo ldconfig
```

# サーバー設定
[別投稿](https://qiita.com/YoshihiroFukuhara/items/9ff5554fd6a7a7d15863)を参照。
LaravelとVue.jsで画像プレビュー

プロフィール画像登録時のファイルプレビューを実装してみます。

##CDN読み込み

```
<body>

・・・

<!-- vue.js -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</body>
```

##view用意
```
<div id="file-preview">
　　<div class="form-group">
　　　　<label class="form-label" for="photo_id">プロフィール画像</label>
　　　　<input class="form-input" type="file" name="photo_id" accept="image/*" v-on:change="onFileChange">
　　</div>
　　<img class="userInfo__icon" v-bind:src="imageData" v-if="imageData">
</div>
```

`v-on:change="onFileChange"`
以下でjsに記述するonFileChangeメソッドを呼び出します。画像が登録されたら発火。
`v-on:`は`@change`として書けるようですが、省略せず書きたいと思います。


`<img class="userInfo__icon" v-bind:src="imageData" v-if="imageData">`
imageDataに画像が入って入れば表示。


##js
```
<!-- vue.js -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    new Vue({
        el: '#file-preview',
        data: {
            imageData: '' //画像格納用変数
        },
        methods: {
            onFileChange(e) {
                const files = e.target.files;

                if(files.length > 0) {

                    const file = files[0];
                    const reader = new FileReader();

                    reader.onload = (e) => {
                        this.imageData = e.target.result;

                    };
                    reader.readAsDataURL(file);
                }
            }
        }
    });

</script>
</body>
```

el=element
data=viewへ渡す変数
methodsに先ほどviewで指定したonFileChangeを定義

fileが登録された段階でFileReaderの呼び出しとimageDataへ画像を格納し、viewにて表示



##参考
[たった2ステップ！Vue.js で選択画像をプレビューする方法（サンプルDL可）](https://blog.capilano-fw.com/?p=1189#bootstrap)
[FileReader.readAsDataURL() - Data URIとして読み込む](https://lab.syncer.jp/Web/API_Interface/Reference/IDL/FileReader/readAsDataURL/)
VSCodeにてSOURCE CONTROL からGITが消えてしまった時

There is no active source control providers.
または
ソース管理プロバイダーが登録されていません

って出てる場合は以下記事をチェックで直せる。
http://7081.hatenablog.com/entry/2018/03/02/081044
https://blog.janjan.net/2019/10/15/vsc-not-found-source-manage-provider/

ただ、
・上記のメッセージが出ず、
・VSCodeをつかって他のリポジトリを表示してるときはうまく表示される
・SOURCE CONTROL　にGITと表示されない
という場合は、SOURCE CONTROLの下で右クリックするとリポジトリが選択肢がでてくるので選択すると表示されるようになる。
超簡単なんだけど、小一時間困ったのでいつか誰かの助けになれば。
Pandasの平均処理・リスト化

#Pandasの平均処理
列の平均処理は

```Python
average = df.mean()
```
でよいのですが、これをlist化するとindexが外れて数値だけをリスト化することができます。

```Python
df_average = list(df.mean())
print(df.mean())
print(df_average)

"""
人気        8.326087
着          8.022222
タイム     84.191111
着差        1.653333
馬体重    442.130435
dtype: float64
"""

"""
[8.326086956521738, 8.022222222222222, 84.19111111111113, 1.653333333333333, 442.1304347826087]
"""
```
数値微分って？解析的微分と何が違うの！？？

#微分とは
深層学習において，損失関数を学習させるパラメータ(重みやバイアス)で微分した値は，パラメータの値を微少に変化させた時，損失関数の値がどう変化するのかを示しています．一般的に深層学習では多くのパラメータをニューラルネットワークにより更新させていくことで学習モデルの精度を上げていく．この時，推測データが正解データにどれだけ近いのかを測るための尺度として，損失関数の値を用います．この損失関数の値が小さいほど，推測したデータが正解のデータに近いことを表します．つまり学習とは，損失関数の値を最小にするパラメータを求めることでもあります．損失関数の最小値（厳密にはできるだけ小さい値）を求める際に微分を使い，パラメータを更新していきます．

#数値的と解析的
違いを6面サイコロの1の目が出る確率の求め方から考えてみます．
**数値的**：例えば，サイコロを10000回振ったら，1の目が1600回でた．すると，1の目が出る確率は1600/10000=0.16となる．
もう一度サイコロを10000回振り直したら，1の目が出る回数は高い確率で1600回にはならないでしょう．つまり，数値的に求める値には誤差が含まれます．
**解析的**：サイコロは1~6の目があるので，1の目が出る確率は1/6=0.166666...となる．
実際にサイコロを振っているわけではないので，解析的に求めた値に誤差は含まれません．

#数値微分
まず，数値微分の公式は以下のようになります．y=f(x)において，yをxで微分します．
**dy/dx = { f(x+h) - f(x) } / h [h→0]**
hの極限を取ることによって微分値を求めます．実際はhは0に限りなく近い値ではなく，1e-4(0.0001)程度の値とします．これは，0.000...001のように小さすぎる値は0.0として認識されてしまうからです．
例えば，y=x^2をxで微分すると
dy/dx = { (x+0.0001)^2 - x^2 } / 0.0001
ここで，x=1とすると，
dy/dx = 2.0001
となる．
このように，極限を用いて微分値を求めことを数値微分という．
数値微分は計算結果に誤差を含むので，真の微分値ではありません．

#解析的な微分
数値微分の例で説明すると，y=x^2をxで微分すると2xになる．極限を取ることなく微分値を求める方法．
x=1とすると，
dy/dx = 2*1 = 2
となる．
解析的な微分は計算結果に誤差を含まない．つまり真の微分値となります．

#まとめ
深層学習において，数値微分により損失関数の勾配を求めることは計算に膨大な時間がかかってしまい不向きです．一方で，解析的な微分を用いることで効率的に微分値を求め，誤差逆伝播法によりパラメータを更新することができます．
##数値微分は使う機会があるのか？
誤差逆伝播法の実装は複雑でミスが起きやすいことから，実装の正しさを確認するために，数値微分を用いることがあります．

##参考文献
ゼロから作るDeepLearning
PYthon3で線形探索＆二分探索書いてみた

#線形探索
Pythonの***enumerate()関数***を使うと、forループの中でリスト（配列）などのイテラブルオブジェクトの要素と同時に***インデックス番号（カウント、順番）***を取得できる。
計算時間 ***O（n）***

```python
def linear_search(li,ans):
    print(str(ans) + "を検索します")
    for i,data in enumerate(li):
        if data == ans:
            print(str(i)+ "番目にありました")
            break
        else:
            print("入力した要素は存在しませんでした")
            
if __name__ == '__main__':
    li=[1,4,5,6,8,9,14,19]
    print("調べるリスト")
    print(li)
    search_num = int(input("上のリストから調べたい要素を入力してください"))
    linear_search(li, search_num)
```

#二分探索
計算時間　***O ( log₂n )***

```py
def binary_search(li, ans):
    low = 0
    high = len(li) - 1 

    # 探索の下限のlowが上限のhighになるまで探索します。
    while low <= high:
        mid = (low + high) // 2 # 中央値
        guess = li[mid]
        if guess == ans:
            return mid
        if guess > ans:
            high = mid - 1
        else:
            low = mid + 1
    return None

li = [i for i in range(1,101)]
print(binary_search(li, 3))
print(binary_search(li, -1))
```
[読書] リーダブルコード 


良い本とされる本や名著には繰り返し読まれれる理由があるものだ。改めてひたすら本を読んでいき、何が学ぶべきことなのか振り返りたい。第一弾はリーダブルコードである。

どうやったら可読性があがるのかという点についてはすでにたくさんの記事で紹介されているのでそこを参照してもらうとして、読みやすいという意識をもって書くということは、lint や OOP 、 Archtecture を導入したりすることとは独立した事象であるという事が重要である。
さらに言えば、リーダブルコードで用いられるコードスニペットは C / C++ / Java / Javascript / PHP など多岐にわたる。だからといって、恐れる必要はまったくない。そして、「この言語だから読みやすい・わかりやすいということは存在しない」ということも理解できるであろう。

★★★★★ 5/5

https://amzn.to/2uybg05
<a href="https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655/ref=as_li_ss_il?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89&qid=1581578925&sr=8-1&linkCode=li2&tag=mabotsblog-22&linkId=5639557c3a2c6532bfe8c625811ad74c&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4873115655&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=mabotsblog-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=mabotsblog-22&language=ja_JP&l=li2&o=9&a=4873115655" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
GCSにアップロードされているCSVファイルを扱う

# csvファイルを読み込む
blob.getContentでファイルの中身が取得できるが、ファイルサイズが大きい場合は困ってしまう

```
Bucket bucket = getBucket(bucketName);
Storage.BlobListOption option = Storage.BlobListOption.prefix(directory);

Page<Blob> blobs = bucket.list(option);
Iterator<Blob> iterator = blobs.iterateAll().iterator();

List<String> csvList = new ArrayList<>();
while (iterator.hasNext()) {
    Blob blob = iterator.next();
    byte[] content = blob.getContent(Blob.BlobSourceOption.generationMatch());
    csvList.add(new String(content));
}

for (String csv : csvList) {
    // process...
}
```


# csvファイルを1行ずつ読み込む
getContentの代わりに、以下のようにすれば1行ずつ読みこんで処理できる

```
ReadChannel readChannel = blob.reader();
BufferedReader br = new BufferedReader(Channels.newReader(readChannel, "UTF-8"));

String line;
while((line = br.readLine()) != null){
    // process...
}
```
Typescriptでinterfaceのpropertyに対して、複数のinterfaceを適用したい時

```
interface Questions {
  TYPE: string;
  SETTING: Food | Travel;
}

interface Food {
  name: string;
  price: string;
}

interface Travel {
  place: string;
  transportation: string;
}
```
上記のように`|`でインターフェイスを繋げる。

参考：[https://www.typescriptlang.org/docs/handbook/interfaces.html](https://www.typescriptlang.org/docs/handbook/interfaces.html)
【Excel VBA】任意の列の値変更をイベントハンドリングする。

メモとして残します。

Sheetモジュールに下記を追記

#■やり方
```vb
Private Sub Worksheet_Change(ByVal Target As Range)
    ' I列以外のchangeは以降処理しないようにする。
    If Intersect(Target, Range("I1:I" & Rows.Count)) Is Nothing Then
        Exit Sub
    End If

    '処理・・・・・・・・
    'Target.Cells.Item(1) '変更されたセルのオブジェクト

End Sub
```
#■さいごに

あくまでシート全体での検知を第一段階でやる必要があるため、複数列やる場合は `Worksheet_Change` 内でさらに分岐してやる必要があります。
なので、疑似的なハンドリングになりますね。
Use GPU and TPU on google colab

![gpu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85760/3991569b-927a-9755-0b00-850732a45833.png)

![gpu2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85760/b5919f20-c35f-ce6d-5596-3e7375b3e9df.png)
【Rails】パーシャルまとめ

##パーシャルを使う目的
viewの一部を別ファイルに切り出し、可読性と再利用性を上げる。

##基本の使い方
・パーシャルファイルの名前は`_`から始まる(`_graph.html.erb`など)
・パーシャルが同じディレクトリにある時は`render '{ファイル名}'`で呼びだす。（拡張子不要）

```erb
<%= render 'graph' %>
```
・違うディレクトリの時は`render '{ディレクトリ名/ファイル名}'`で呼びだす。

```erb
<%= render 'shared/error_messages' %>
```

##変数を渡す
```erb
<%= render partial: 'graph', locals: { id: 1, name: '棒グラフ'} %>
または
<%= render 'graph', id: 1, name: '棒グラフ' %>
```
```erb:_graph.html.erb
ID：<%= id %>
名前：<%= name %>
```

##collectionオプション(応用)
collectionオプションに複数形のインスタンス変数を渡すと、渡されたインスタンスの要素分そのテンプレートを繰り返し表示します。

```erb
<%= render partial: 'book_detail', collection: @books, as: 'book' %>
```
この場合、
・`@books`に格納されているインスタンス分だけ`_book_detail.html.erb`が繰り返し表示されます。
・呼び出されたパーシャル内では`book`という名前のインスタンスを利用することができます。
・`book_counter`という名前のindexの変数が自動で作られます。(0から始まる)

[Railsのpartialでcollectionを渡すときにはindexの変数が自動的に作られる](https://qiita.com/otakumesi/items/74a75cd6ebff7eba5c63)

##参考
[【Rails基礎】ややこしい部分テンプレートの省略形について簡単にまとめてみた](https://techtechmedia.com/partial-template-rails/)
[【Rails】部分テンプレートの使い方を徹底解説！](https://pikawaka.com/rails/partial_template#collection%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3)
CODE FESTIVAL 2016 qual C-D Friction 解説

[CODE FESTIVAL 2016 qual C-D Friction](https://atcoder.jp/contests/code-festival-2016-qualc/tasks/codefestival_2016_qualC_d)の解説です。

# 問題概要
$H*W$ のグリッドがあり、これを列ごとに下に沈めていって全部消すことを考える。
1つの列は1つずつしか下に沈めることはできず、沈めるときは、左右で同じ要素が隣り合っている場所の数と同じコストがかかる。
すべてを沈め終わるまでのコストの総和を最小化せよ。

# 考察
- 制約が $H,W$ ともに小さめなので、DPで解けそう。
- 状態を全部場合分けすると $(H+1)^W$ 個の状態数があるので、考察をして減らしたい。
- それでも、これだけの量の状態数を問題ない量にエンコードするのは実質無理そう
- 1つの列を下げるとき、気にしなければいけないのは隣り合った列の状態だけ
- 隣り合った列だけ見てどうにかできないか？
- よくよく考えると、隣り合っているある2つの列に対して、相対的な順番だけを考えればその2つの間での最適解を、他の列を一切考えずに達成できることが分かる
- 考えていない列の操作は、考えているところとは全く関係ないので、それぞれ都合のいいところに突っ込めばいい
- これで隣り合っている $W-1$ 箇所についてDPをして足し合わせれば答えが出る
- $dp[i][j]=$ 左に $i$ 個、右に $j$ 個残っているときのコストの総和の最小値　としてDPをしたいが、遷移の計算に毎回 $O(H)$ かかるので、全体で $O(H^3W)$ となり、破滅してしまう
- $cost[i][j]=$ 左に $i$ 個、右に $j$ 個残っているときの次の操作にかかるコスト　とすると、$cost$ もDPを用いて $(H^2)$ で求められ、これで遷移が $O(1)$ にできた
- これで全体計算量が $O(H^2W)$ となって、大勝利

# おわりに
この問題めちゃくちゃ好きです。とてもすき。（すぐ解けたので）
innerからの脱獄

## innerとはなんぞ
Webサイトでよく使われるinnerは横幅が1920とか4kとかある大型ディスプレイでサイトを開いてもページが横にびろーんと伸びすぎないようにするためのものです。
名前はwrapとかcontainer等のバリエーションもありますが目的は同じです。

```
.inner {
  width: 980px;
  margin: 0 auto;
}
```
幅はサイトによってまちまちですがだいたいこんな感じのことが書いてあります。

## どうすればいいのか
元の状態
<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="css,result" data-user="sphenisc" data-slug-hash="BaNjaZe" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="BaNjaZe">
  <span>See the Pen <a href="https://codepen.io/sphenisc/pen/BaNjaZe">
  BaNjaZe</a> by sphenisc (<a href="https://codepen.io/sphenisc">@sphenisc</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

例えば「これをinnerの外にはみ出させたい」の部分をinnerから出して幅1200pxで表示したいとします。
しかし普通に幅1200px ＆ margin:0 auto;を指定すると右にだけはみ出すので以下のようにします。

<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="css,result" data-user="sphenisc" data-slug-hash="GRJoRvz" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="GRJoRvz">
  <span>See the Pen <a href="https://codepen.io/sphenisc/pen/GRJoRvz">
  GRJoRvz</a> by sphenisc (<a href="https://codepen.io/sphenisc">@sphenisc</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

```
margin: 0 calc((980px - 1200px)/2);
```
の部分がわかりにくいと思いますが左右に 1200pxと980pxの差の半分である110pxのマイナスマージンをとっています。
【MySQL】外部キー制約を追加したり確認したり【ふ〜ん】



laravelを勉強していて、マイグレーションファイルから外部キー制約を付けていたのですが、後から付けたい〜！ってなったときにMySQLの方で付ける方法知りたかったのでメモ

---

`ALTER TABLE テーブル名 ADD FOREIGN KEY (カラム名) REFERENCES テーブル名(カラム名);`

これでつく！！！

例えば、userとtwitterの関係が1対多だとすると、
twittersテーブルのuser_idと、usersテーブルのidを紐付ける必要があるので、

`ALTER TABLE twitters ADD FOREIGN KEY (user_id) REFERENCES users(id);`

これでいいはず。

外部キー制約を確認する方法は、


`show create table twitters;`

これを実行すると、

```
| twitters | CREATE TABLE `twitters` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `content` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
  `user_id` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  CONSTRAINT `tasks_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
```

こんなのが出てくるので、確認できるよ〜！！！！！

初心者すぎてぴえん。
Find your key from inside Windows

# Windows 10
## Check
cmd
```
wmic path softwarelicensingservice get OA3xOriginalProductKey
```
QDY4R-PDNB9-VM8WR-VXXFJ-HMH82
![windows key.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85760/0498875d-40d9-25d9-050e-84691fd47831.png)

powershell
```
(Get-WmiObject -query ‘select * from SoftwareLicensingService’).OA3xOriginalProductKey
```
## Download
[Microsoft Offical Link](https://www.microsoft.com/ja-jp/software-download/windows10)

## Install
[KMS client setup keys](https://docs.microsoft.com/en-us/windows-server/get-started/kmsclientkeys)  
Windows 10 Pro:	W269N-WFGWX-YVC9B-4J6C9-T83GX




# Office
## Check
find **ospp.vbs** file
![office.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85760/cd3ef70e-33db-6320-9d67-c7f1d6c2d46f.png)
## Download
https://officecdn.microsoft.com/db/492350F6-3A01-4F97-B9C0-C7C6DDF67D60/media/en-US/ProPlus2019Retail.img

## Install
GitHub Flowのまとめ

#概要
GitHub Flowを自分のメモ用にまとめました。

#GitHub Flowとは？
GitHubの開発で使用されているワークフローのことです。次の６つのルールによって運用されています。

>
1. masterブランチのものは何であれデプロイ可能である
2. 新しい何かに取り組む際は、説明的な名前のブランチをmasterから作成する（例: new-oauth2-scopes）
3. 作成したブランチにローカルでコミットし、サーバー上の同じ名前のブランチにも定期的に作業内容をpushする
4. フィードバックや助言が欲しい時、ブランチをマージしてもよいと思ったときは、 プルリクエスト を作成する
5. 他の誰かがレビューをして機能にOKを出してくれたら、あなたはコードをmasterへマージすることができる
6. マージをしてmasterへpushしたら、直ちにデプロイをする

https://gist.github.com/Gab-km/3705015

#実際の流れ
##概要

1. masterブランチから作業用ブランチを作成
2. 作業用ブランチでコミットする
3. 定期的に作業用ブランチをプッシュする
4. GitHubでプルリクエストを送る
5. masterブランチにマージ
6. masterブランチをデプロイ

##詳細

##1.masterブランチから作業用ブランチを作成

###現在のブランチがmasterブランチであることを確認する
ローカルリポジトリの現在いるブランチがmasterブランチであることを確認する。masterブランチじゃない場合は切り替える。また、masterブランチに変更がないかどうかも確認する。

```
// ブランチの一覧を表示する
$ git branch

// masterブランチに切り替える
$ git checkout master

// masterブランチの変更状況を確認する
$ git status
```

###ローカルリポジトリのmasterブランチを最新の状態にする
ローカルリモートリポジトリのmasterブランチを最新の状態にするために、リモートリポジトリから情報を取得してマージする。

```
$ git pull origin master
```

※pullは現在いるブランチにマージされるため、pullするリモートリポジトリのブランチと、現在いるローカルのブランチを必ず合わせる。


###作業用のブランチを作成する
ローカルリモートリポジトリのmasterから作業用のブランチを新たに作成する。ブランチの名前は、作業の内容を説明するようなわかりやすい名前にする。
例）user-content-cache-keyなど

```
$ git checkout -b 作業用ブランチ名
```

##2.作業用ブランチでコミットする
新しいブランチで作業を行い、変更をステージングエリアに追加してコミットする。

```
// 変更をステージに追加する
$ git add .

// 変更を記録する
$ git commit -v

// ファイルの削除を記録する
$ git rm ファイル名
$ git rm -r ディレクトリ名

// ファイルの削除を記録する（ファイルは残す）
$ git rm --cached ファイル名
```

##3.定期的に作業用ブランチをプッシュする
GitHub（リモートリポジトリ）に作業用ブランチを定期的にプッシュする。

```
git push origin 作業用ブランチ名
```

##4.GitHubでプルリクエストを送る
GitHubでプルリクエストを送る。

【自分】
GitHubを開く
Pull rewuests → New pull request → compare:ブランチ名を選択 → Create pull request → タイトルなどを入力 → Create pull request → Reviewers → レビュワーを選択する

【レビューワー】
通知を受け取る
GitHubを開く
Pull requests → Files changed
・問題がある場合
 コード上の＋をクリック コメントなどを書く
・OKの場合
Review changes → Approve

##5.masterブランチにマージ
コードレビューがOKだったら、masterブランチへ作業用ブランチをマージする。マージ後、作業用ブランチは削除する。

GitHubを開く
Conversation → Merge pull request → Confirm merge → Delete branch

###ローカルリポジトリを最新の状態にする
ローカルリモートリポジトリのmasterブランチを最新の状態にするために、リモートリポジトリから情報を取得してマージする。ローカルリポジトリのマージ済みの作業用ブランチを削除する。

```
// masterブランチに切り替える
$ git checkout master

// リモートリポジトリから情報を取得してマージする
$ git pull origin master

// マージ済みの作業用ブランチを削除する
$ git branch -d 作業用ブランチ名
```

#参考
https://www.atmarkit.co.jp/ait/articles/1708/01/news015.html
OpenCL を使って　ガウスぼかしをする(その２)

[OpenCL を使って　ガウスぼかしをする(その１)](https://qiita.com/ohwada/items/34ca5175ad5aa146d680)
の続きです。

### 概要

ガウスぼかしは、重みづけ平滑化の１つである。

[wikipedia : ガウシアンぼかし](https://ja.wikipedia.org/wiki/%E3%82%AC%E3%82%A6%E3%82%B7%E3%82%A2%E3%83%B3%E3%81%BC%E3%81%8B%E3%81%97)

前回は、重みの値をプログラムファイルにハードコーディングした。
今回は、重みの値を計算によって求め、デバイス側プログラムに引数として渡す。

### ガウスカーネルを計算する

２次元のガウス関数は、下記の関数で表現される。
この関数を単にガウシアン(Gaussian) とも呼ぶ。

```math
G\left( x, y \right) = \dfrac {1}{ 2 \pi \sigma} \mathrm{e}^{ - \dfrac {x^{2} + y^{2}}{ 2 \sigma^{2} } }
```

 図示すると 円対称の釣鐘型になる。
![gauss_3d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/4817cc0e-7377-e0df-3368-771cb5ef82bf.png)

図は下記より引用。

[Gaussian Smoothing](https://homepages.inf.ed.ac.uk/rbf/HIPR2/gsmooth.htm)

ネット検索したら、下記の記事を見つけた。
ガウスカーネルの２つのパラメータ大きさ(Kernel Size)と標準偏差(sigma) から、ガウスカーネルを計算するもの。
パラメータを変えると、ぼかしの効果がどう変わるのかは、多くの人の関心ごとのようだ。

[Gaussian Kernel Calculator](http://dev.theomader.com/gaussian-kernel-calculator/)

C ++でのプログラム例も見つかった。

[stackoverflow : Implementing Gaussian Blur - How to calculate convolution matrix (kernel)](https://stackoverflow.com/questions/8204645/implementing-gaussian-blur-how-to-calculate-convolution-matrix-kernel)

これを参考に前回のコードを修正する。

コマンドラインから大きさと標準偏差を与えて、ガウスカーネルを計算する。

> Usage:  GaussianFilter  <inputImageFile> <radius> <sigma> 

計算したガウスカーネルの値をデバイス側プログラムに引数として渡す。

```GaussianFilter.cpp

    memObjects[2] = createWeightBuffer(context, kernel2d,  radius);

    clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObjects[2]);
```


```gaussian_filter.cl

__kernel void gaussian_filter(
        __read_only image2d_t srcImg,
        __write_only image2d_t dstImg,
        __constant float * weights,
                    sampler_t sampler,
                     int width, 
                    int height, 
                    int radius)
```

サンプルコードを Github に公開した。
https://github.com/ohwada/MAC_cpp_Samples/tree/master/OpenCL-GaussianFilter

### ガウスカーネルのパラメータとぼかしの効果

どのくらいのパラメータからぼかしの効果が現れるか試した。
サンプル画像は OpenCL のロゴとした。
![OpenCL_Logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/2fc58077-56d3-23be-e49f-fc6f96a8e700.png)

大きさ 11x11　標準偏差 3.0 となった。

標準偏差 3.0 にして大きさを変えた例
![size.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/766b11dc-0972-4bd5-9945-777af44a5866.png)


大きさ 11x11 にして標準偏差を変えた例
![sigma.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/c97edf36-8a2e-6705-2b7f-a6536ad25ee4.png)

標準偏差により、重みは下記のように変化する。
![plot_sigma.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/30530fc9-4472-b80f-a309-af61d36b16e5.png)

標準偏差が大きくなると、相対的に中心の重みが小さくなり、周辺の重みが大きくなる。
準偏差はばらつきの度合いを示す指標なので、当然の結果ですが。
図示することで、理解しやすくなる。

### おまけ OpenCV を使ってガウスぼかしをする

OpenCVの GaussianBlur　API　を使う例を紹介する。

[cv::GaussianBlur](http://opencv.jp/opencv-2svn/cpp/image_filtering.html#cv-gaussianblur)

```
    Mat img = imread(input);

    GaussianBlur(img, dst, Size(ksize, ksize), sigma, sigma);

    imwrite(output, dst);
```

サンプルコードはこちら。
https://github.com/ohwada/MAC_cpp_Samples/tree/master/OpenCV-GaussianBlur
【JS】インクリメント/デクリメントでつまずいたところ

無限ループにハマったので調べました...

```js

// 普通に足してみる
let n = 5
console.log(n)
// 5
console.log(n + 1)
// 6　元の値には影響しない
console.log(n)
// 5
```

```js

// 後述の場合
let n = 5
console.log(n)
// 5
console.log(n++)
// 5　nの値を返した後に、1プラスする
console.log(n)
// 6
```

```js
// 前述の場合
let n = 5
console.log(n)
// 5
console.log(++n)
// 6　nの値をプラス1した後に、その値を返す
console.log(n)
// 6
```
自動デプロイ時エラー発生

エラー記述

2020年2月　AWS Capistano　自動デプロイエラー解決内容
------------
ローカルディレクトリでbundle exec cap production deployを実行

SSHKit::::ExecuteError: Exception while executing as ec2-user@**.***.***: No such file or directory @ rb_file_s_stat - config/secrets.yml
Caused by:
Errno::ENOENT: No such file or directory @ rb_file_s_stat - config/secrets.yml

------------
ruby ver 2.5.1
Capistano 3.12.0
AWSサーバー
EC2

エラーが解決しません。
bundle install 実行済み　本番　ローカル
PC再起動済み
インスタンス再起動済み
nameなどの記述ミスも確認済み
本番環境のサーバー立ち上げ、ディレクトリ確認OK
kill作業→確認済み
push済み

現在解決してません。
どなたか解決に繋がる作業やヒント頂ければ幸いです。
必要な情報ファイル名指定頂ければ記述内容載せます。

解決できれば記述しておきます。
　　
---------
解決策できました

そもそもスクールの学習カリキュラムの記述を参考にしたことにより
ymlのファイルをひっパテ来れなかったからと思われます。


  # set :linked_files, %w{ config/secrets.yml }

  # desc 'upload secrets.yml'
  # task :upload do
  #   on roles(:app) do |host|
  #     if test "[ ! -d #{shared_path}/config ]"
  #       execute "mkdir -p #{shared_path}/config"
  #     end
  #     upload!('config/secrets.yml', "#{shared_path}/config/secrets.yml")
  #   end
  # end
  # before :starting, 'deploy:upload'
  # after :finishing, 'deploy:cleanup'

指定のymlファイルをコメントアウト

これで自動デプロイできました。
AWS CLI v2 がGAになったのでをアップグレードしました。

# はじめに
aws-cliのv2がGAになりました。
>[AWS CLI v2 is now generally available](https://aws.amazon.com/jp/blogs/developer/aws-cli-v2-is-now-generally-available)

ということで早速アップグレードしてみたいと思います。

# アップグレード
まずは現在のaws-cliのバージョンを確認します。

```bash:バージョン確認
$ aws --version
aws-cli/1.16.183 Python/3.6.2 Darwin/19.3.0 botocore/1.12.173
```

それではインストールです。

```bash:パッケージダウンロード
$ curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 19.9M  100 19.9M    0     0  5939k      0  0:00:03  0:00:03 --:--:-- 5939k
```


```bash:インストール
$ sudo installer -pkg AWSCLIV2.pkg -target /
Password:
installer: Package name is AWS Command Line Interface
installer: Installing at base path /
installer: The install was successful.
```

インストールができたのでバージョンを確認します。

```bash:バージョン確認
$ aws --version
aws-cli/1.16.183 Python/3.6.2 Darwin/19.3.0 botocore/1.12.173
```

あれ？なぜかアップグレードできてないです。。。
とりあえずパスを確認してみます。

```bash:パス確認
$ which aws
/Users/hoge/.pyenv/shims/aws
```

今回のインストール先は`/usr/local/bin/aws`になるはず。。。

```bash:バージョン確認
$ /usr/local/bin/aws --version
aws-cli/2.0.0 Python/3.7.4 Darwin/19.3.0 botocore/2.0.0dev4
```

直接指定して確認するとやはりv2がインストールされています。
原因は`.bash_profile`でした。

```bash:確認
$ grep aws ~/.bash_profile
complete -C '/Users/hoge/.pyenv/shims/aws_completer' aws
```

これを以下のように書き換えます。

```bash:修正
$ grep aws ~/.bash_profile
complete -C '/usr/local/bin/aws_completer' aws
```

修正したら改めて読み込みます。

```bash:読み込み
$ source .bash_profile
```

改めてパス確認です。

```bash:パス確認
$ which aws
/usr/local/bin/aws
```

パスが修正されたので改めてバージョンの確認をします。

```bash:バージョン確認
$ aws --version
aws-cli/2.0.0 Python/3.7.4 Darwin/19.3.0 botocore/2.0.0dev4
```

ということで無事アップグレード完了です。


# おわりに
今回、v1をpyenvで設定し、かつ`aws_completer`も設定していたのを忘れていため、`.bash_profile`になかなか気づけずアップグレードするのに時間がかかってしまいました。


---
[参考URL]
・Installing the AWS CLI version 2 on macOS
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-mac.html
・AWS Command Line Interface - コマンド補完
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-completion.html