OmniAICreator/Qiita-1.07M huggingface dataset:
【Houdini】vexのinclude文の挙動

Houdini の Wrangle ノードに記述する vex コードには `include` 文で外部ファイルに記述してあるコードを読み込ませることができます。あまりサンプルを見ませんし、自分個人としては include を多用する事にはやや否定的なのですが、実際便利なこともありますし、そもそもまとまっている情報を見かけないので、ざっと挙動を調べてみました。環境は、Windows10 PRO + Houdini7.5 Indieです。


## 書式

とりあえず、`my_snippet.vfl` という外部ファイルを用意します。配置場所は後述します。内容は適当に文字列をprintする関数のコードとしました。

```cpp
void test(string s)
{
	printf("Hello %s!\n", s);
}
```

このファイルを wrangle SOP で読み込むには、（ノード内のコードとして）下記のような記述をします。

```cpp
#include "my_snippet.vfl"
```

外部ファイル名の拡張子としては `.vfl` もしくは `.h` がよく使われるようです。が、`.txt` としても動作したのでなんでも良いようです。この投稿では、ファイル各位調子を `.vfl` で統一します。(.hのほうが意味的に適切かもしれませんが、VSCodeなどへの紐づけが楽なのでそうしています。）

```cpp
#include <my_snippet.vfl>
```

このような書き方でも動作します。この投稿では前者の書き方で統一します。

## 外部ファイルの保存場所

`$HOUDINI_VEX_PATH` や `$HOME/vex/include` におくと良いという情報があったのですが、それっぽい場所にファイルを置いてみたり、`Houdini.env` やマシンの環境変数にフォルダパスを設定してみてもうまく include できませんでした。（パスの解決順序などをきちんと理解しなければいけなそうです。。）

現在 include 動作が確認できているのは、

* includeを絶対パスで書く
* hipファイルの横に 'vex/include' フォルダを作りそこに外部ファイルを置く

の2パターンです。

絶対パスでは

```c++
#include "C:\MyHoudini\vex\my_snippet_abs.vfl"
```

または

```c++
#include "C:/MyHoudini/vex/my_snippet_abs.vfl"
```

のように書きます。Mac上での動作などまだ確認していませんが、後者のようにスラッシュをパスの区切り文字に使った方が汎用性が高そうです。とはいえ、実際には絶対パスを使うことは少ないかと思います。

hipファイル横に vex/include フォルダを掘った場合は

```c++
#include "my_snippet.vfl"
```

のように簡潔に書けます。これがよさそうです。

```c++
#include "hoge/my_snippet.vfl"
```

のように、さらにサブフォルダを掘って外部ファイルを保存することもできました。

## 有効スコープと複雑な include

* あるノードで読み込んだ外部ファイル定義は後続の別ノードでは無効でした。まあ当然な感じです。必要であれば別ノードで再度 include します。
* 外部ファイルから別外部ファイルを読み込むことが可能です。vfl ファイル内に include文を記述します。
* 別外部ファイルのパス解決は、ファイルの真横もしくは元々の基準パス（今回の例では $HIP/vex/include）を基準として解決されるようです。
* この時、両者で同じ関数を設定していると多重定義エラーになります。
* 複雑なファイルの依存関係をつくると１つのファイルを何度も読み込んでしまい、多重定義を作ってしまいえます。これをさけるには、C言語でおなじみの `ifdef` 命令を使います。以下は先ほどの関数に対応を入れた例です。

```c++
#ifndef __test_func__
#define __test_func__

void test(string s)
{
	printf("Hello %s!\n", s);
}

#endif
```

## 外部ファイルに記述できる内容

* 関数定義
* マクロ定義
* 構造体定義

などです。マクロ定義は下記のように設定でき

```c++
#define HOGE "HOGE"
#define MOGE 1
#define println(message) printf("%s\n", message)
```

読み込んだ wrangle側で利用できます。

```c++
#include "my_snippet.vfl"
setprimgroup(0, HOGE, @primnum, 1);
i@hoge = MOGE;
println("hogehoge");
```

この辺りは、C言語での記述をそのまま参考とすればよいようです。アトリビュートを変更するスニペットのようなコードをいきなり書くとエラーになります。関数もしくはマクロで処理させます。

## 外部ファイル更新時の注意点

外部ファイルを更新しても、それを察知してHoudini側で変更が走ったりはしません。空白や改行を加えるなど、wrangle のvexコードになにか変更を加えて保存してやると外部ファイルも読み込みなおされます。（pythonなどで機能拡張してやるとこの辺りのわずらわしさが解決できるかもしれません。なにやら高機能なwrangleノードを自作してらっしゃる方を海外のどこかのサイトで見かけましたが、URLを失念しました。）

## 参考
Houdini のインストールフォルダの中にたくさんの include用 `.h`ファイルが存在します。自分の環境では `C:\Program Files\Side Effects Software\Houdini 17.5.293\houdini\vex\include` にありました。あとは公式のヘルプではこのページが参考になります。 http://www.sidefx.com/ja/docs/houdini/vex/lang.html
日本語情報はあまりみませんが、海外のフォーラムを覗いているといろいろ書いてあります。

## 考察
自分が明るくない方面なのでまとめましたが、特に後半はC系の言語やシェーダーに詳しい方から見るとあたりまえの内容かとは思います。（ちなみに vexは実際にシェーダー言語だという事です。）そういう事で自分メモ用ではありますが、この記事が誰かの役に立てば幸いです。
Xcodeで「Couldn't load project」と「Could not locate device support files」[Swift][iOS13]

# Couldn`t load project
![couldnt load project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427937/3924179e-ebdc-28f3-880d-7bc000f618f3.png)
### 原因
xcodeの`TARGET`の`Identity`と`Signing`の変更部分がconflictしていたことらしい
→テキストで見るとconflictしてるのがわかります
(`sourceTree`でダメならメモ帳とかコンソールでコマンド打てば見れると思います)
![couldnt load project-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427937/f855ac49-6913-9855-ca25-e5feb9ae7bd4.png)
### 対策
**`TARGET`の`Identity`と`Signing`の変更を取り消す**
(↑の画像でいうと左側の変更履歴をリセットすればOK(削除はNG))
→自分の場合は違うブランチにチェックアウトする前に`Identity`と`Signing`の変更部分だけstashしており(チーム開発なので個々のアカウントを登録したままにはできない)
その変更をチェックアウトした後に適用した時にこのエラーが出たり出なかったりしました、はっきりした理由はわかりません、、

#### 参考
**・[ios - Xcode 7.3 Couldn't load project - Stack Overflow](https://stackoverflow.com/questions/37073610/xcode-7-3-couldnt-load-project)**

# Could not locate device support files
iPhoneだけiOS13のbeta版を入れた時に起こりました
![could not locate device support files.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427937/eb21cd69-7039-1b4a-704c-ceb5b537265c.png)

# 原因
xcodeは`iOS13`に対応したものではない(macOS Catalinaのbeta版入れてない)のに
接続したiPhoneだけ`iOS13`だったから

# 対策
・xcodeを`iOS13`に対応させるため
https://github.com/filsv/iPhoneOSDeviceSupport/blob/master/13.0.zip
から`iOS13`のサポートファイルをダウンロードする
・`/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/`に移動して(Finderなら`command + shift + g`でアドレスバー出してコピペで移動)その中に入れる
・**xcode再起動**すればいけるはず

#### 参考
**・[filsv/iPhoneOSDeviceSupport: Xcode iPhoneOS DeviceSupport (6.0 - 13.0 Beta)](https://github.com/filsv/iPhoneOSDeviceSupport)**
**・[【Swift】エラー「Could not locate device support files（iOS 12.2）」の対処方法｜ぴっぴproject](https://pippi-pro.com/swift-error-could-not-locate-device-support-files-12-2#1)**
Vue CLIの初期設定について

#Vue CLIで始めるVue.js

##Vue CLIとは
Vue.jsはCDNで簡単に導入することもできますが、本格的に開発をする場合はnpmでvue CLIをインストールして環境を整えると色々なメリットを享受できるようです。Vue CLIはVue.jsでアプリケーションをつくるための、**コマンドラインインタフェース(CLI)**というもので、これをインストールすることでwebpackやファイルのホットリロード、ルーティングなど様々な機能が使えるようになります。

※以下の設定はnode.jsがインストールされていたらおおよそ10分もあれば完了します。

##インストール
```
$npm install -g vue-cli
```

##プロジェクトの作成
プロジェクト名と使用するテンプレートを指定します。
下記ではwebpackを使用するように指定してありますが、他にも機能が限定されたwebpack-simpleなども用意されています。プロジェクトの開発規模によって選択すると良いでしょう。

```
$vue init webpack my-project
```

上記コマンドを叩いたあと色々聞かれますがとりあえずエンターキー連打ですべてYesでプロジェクトを生成します。

```
? Project name my-project
? Project description A Vue.js project
? Author 
? Vue build standalone
? Install vue-router? Yes
? Use ESLint to lint your code? Yes
? Pick an ESLint preset Standard
? Set up unit tests Yes
? Pick a test runner jest
? Setup e2e tests with Nightwatch? Yes
? Should we run `npm install` for you after the project has been created? (recom
mended) npm
   vue-cli · Generated "my-project".
```


#ディレクトリを移動してサーバー起動
作成したプロジェクトの中に移動して、```npm run dev```コマンドを実行するとサーバーが立ち上がります。

```
$ cd my-project/
$ npm run dev
```

![vuejs-webpack-simple-add-vue-router.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10793/4919cd40-be84-feac-4928-2b6bb15f2f44.png)

```Your application is running here: http://localhost:8080```というメッセージが表示されるので、http://localhost:8080 にアクセスしてみると、上記のような、初期画面が表示されるのでこの状態から作業を開始していきます。

```
> my-project@1.0.0 dev /path-to/my-project
> webpack-dev-server --inline --progress --config build/webpack.dev.conf.js

 13% building modules 28/33 modules 5 active ...project/src/components/HelloWorld.vue{ parser: "babylon" } is deprecated; we now treat it as { parser: "babel" }.
 95% emitting                                                                 b      
 DONE  Compiled successfully in 11050ms                                  0:08:23

 I  Your application is running here: http://localhost:8080
```

##ディレクトリ構成
ちなみにディレクトリ構成は以下のようになっています。
実際に編集するファイルはほぼsrc以下にまとまっているようです。

```
my-project
	├─ build ・・・webpackの設定など
	│	├─ build.js
	│	├─ check-versions.js
	│	├─ dev-client.js
	│	├─ dev-server.js
	│	├─ utils.js
	│	├─ vue-loader.conf.js
	│	├─ webpack.base.conf.js
	│	├─ webpack.dev.conf.js
	│	└─ webpack.prod.conf.js
	│
	├─ config ・・・設定ファイル関係
	│	├─ dev.env.js
	│	├─ index.js ・・・ ポートを変更するときはこのファイルを編集する
	│	└─ prod.env.js
	│
	├─ src ・・・ 実際に編集するファイルはsrc以下のファイル
	│	├─ assets
	│	│	└─ logo.png
	│	├─ components
	│	│	└─ Hello.vue
	│	├─ router
	│	│	└─ index.js
	│	├─ main.js
	│	└─ App.vue
	│
	└─ index.html ・・・ 最初に読み込まれるHTMLファイル

```

ここまでの作業をGitHubに一旦pushしたのでここからSPAとか作っていこうと思います。
https://github.com/ysk/vue_spa

Vue CLIで始めるVue.jsの初期設定は以上です。
WindowsのMinGWでlapackを使う

# Windowsでlapackは使える???

数値計算の世界で欠かせない存在であるFortranとBLAS、LAPACK。
これらはLinuxやMacOSなら結構簡単に導入ができます。
しかしながら、WindowsにおいてはCygwinやWSLを使った方法が主となっており、コマンドプロンプトなどでは使えない状況です。

そこで今回は、MinGWを用いてgfortranやgccを導入したマシンにおいて、lapackを使えるように設定します。

# 参考にしたサイト
[LAPACK for Windows](http://icl.cs.utk.edu/lapack-for-windows/lapack/)
こちらのサイトにすべて設定の方法が載っております。今回はこちらを参考にして実際の画面をもとに説明していきます。

# Windowsへのインストール方法

1. [lapack.tar.gz](http://netlib.org/lapack/lapack.tgz)からファイルをダウンロードします.

2. [CMAKE](https://cmake.org/download/)の *.msi* のインストーラーをダウンロードします.

3. CMAKEをインストールする. この際PATHを通しておくと楽./

4. 管理者としてコマンドプロンプトを開き, ダウンロードしてきた *lapack-3.~* のフォルダに移動します.

5. *build*, *build_space* という二つの新しいフォルダを作成します.
``` C:¥Users~> mkdir build build_space ```

6. cmake-guiを開きます. 次のコマンドを打ってください.
``` C:¥Users~> cmake-gui```

7. Browse Source... というボタンを押して,  *lapack-3.~* のフォルダを選択する.

8. Browse Build... というボタンを押して, 先程作成した *build_space* をさがして選択してください.

9. Configure を押してください.

10. 次のようなウインドウが出てくるので, *MinGW Makefiles* を選択して, *Specify native compilers* を選び, Next を押してください.
  ![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269455/3060a00d-bb78-a636-6513-95c8fb8a45ff.png)

11. 次のようなウインドウが出てくるので, 画像に書いてある通りにコンパイラの名前を入力して, Finish を押してください.
  ![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269455/ad779b9f-9c1f-4559-d21e-1b25ca57279c.png)

12. もう一度 Configure を押してください. すると次のような赤いウインドウが出てくると思います.
  ![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269455/a076f788-def3-129c-fcbb-3040a2e3b9ea.png)

13. 図のようにチェックを入れてください. *CMAKE_INSTALL_PREFIX* の Value を押して, 先程作成した *build* を探して選んでください.

14. 再び Configure を押してください.

15. 画面が白くなったら, Generate を押してください.

16. 開いていたコマンドプロンプトで *build_space* に移動し, 次のコマンドを入力してください.
``` C:¥Users~> mingw32-make ```

17. 終了したら, 同じ場所で次のようにコマンドを入力してください.
``` C:¥Users~> mingw32-make install ```

18. *build* に新しく **lib**, **bin** ができたら成功です.

19. MinGWの中(gfortranとかがあるところ)にある **lib**, **bin** に, 先程出来上がった *build* の中身をコピーしてください.

# サンプルコード

最後にサンプルコードを用意いたしました。
逆行列を求めて行列積を行うプログラムです。
確認のためにコピペして試してみてください。

```
  gfortran test_lapack.f90 -lm -lblas -llapack
```



```fortran:test_lapack.f90
program inverse
  implicit none
  integer, parameter :: N=2
  double precision A(N,N), A_inv(N,N), C(N,N), work(N)
  integer :: lda=N, ipiv(N), info, lwork=N


  print *,"A="
    call random_number(A)   ! ランダムで2x2行列を生成
  call print_matrix(A,N)    !行列の表示のためのサブルーチン

  print *,"A_inv"
    A_inv = A   !行列を保存するために, A_invにAを代入しておいた
    call dgetrf(N, N, A_inv, lda, ipiv, info)
    call dgetri(N, A_inv, lda, ipiv, work, lwork, info)
  call print_matrix(A_inv,N)

  print *,"C"
    call dgemm('N', 'N', N, N, N, 1.d0, A, N, A_inv, N, 0.d0, C, N)
  call print_matrix(C,N)

end program inverse




!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
!::: 行列表示のためのサブルーチン
!::: 引数はprint_matrix(_表示したい正方行列の配列_, _正方行列の行数_)
subroutine print_matrix(X,N)
  integer i, j, N
  double precision X(N,N)
  do i=1,n
    do j=1,n
      write(*,fmt='(f15.8)',advance='no') X(i,j)
    end do
    write(*,*)
  end do
  print *, "==============================="
end subroutine

```
MacでUSBに接続したデバイスが認識しないとき

# SMCリセット
**・[Mac の SMC (システム管理コントローラ) をリセットする方法 - Apple サポート](https://support.apple.com/ja-jp/HT201295)**
このリンクの`SMCをリセットする前に`からやれば大抵治る
→僕は3回なりましたが**強制再起動したらうまくいきました**

# NVRAMリセット
↑でもダメならこいつでいきましょう
**・[Mac で NVRAM または PRAM をリセットする - Apple サポート](https://support.apple.com/ja-jp/HT204063)**

# 結論
サポートのいうこと聞けば大体なんとかなる
開発中にiPhone読み込まなくなると本当に焦ります。。。
スターリンソートでガチャの結果を操作する。

# 概要

スターリンソートなるものが流行っていると職場で聞き、どんなものか見ていた。

```
[1, 2, 1, 1, 4, 3, 9]
→[1, 2, 4, 9]
```

なるほど、ソートされていないものを粛正するらしい。
上の例だと第3、4項の1と第6項の3が粛清された。
内容は簡潔だが、職場で具体的に何使うのかを考えるという話になった。
結果としては使えないということになった。
だが使い道がないものに、使い道を見出してこそ楽しいものだ。
というわけで、スターリンソートの有用な使い方を模索してみた。

# 本文
## 前書き
これを見たときに、まず思いついたのはのガチャだった。
ガチャの結果がだんだんよくなれば嬉しいことこの上ない。
よくない結果など粛清してしまえばいいのだ。
まずは、ソシャゲのガチャで考えてみた。
ソシャゲのガチャにスターリンソートを適用すると、下記の通りになる。

```
[N, R, N, N, R, SR, R, N, N, UR]
→[N, R, SR, UR]

※ レア度：N < R < SR < UR
```

なるほど、1、2、6、10回目に引けばいいのか。
しかし、粛清するには引かずに次の結果に行かねばならないが、
そんなことは出来ない。
いや何かしらの方法で出来たとしても、出る順番が変わってしまうかもしれない。
そもそも出る順番が決まっていなければ意味がない。
従って、ソシャゲのガチャではスターリンソートは使えなさそうだ。

## 課題
ソートとはデータの集合をある規則に従って並べることである。
スターリンソートはデータの集合を与えられたときに、
並び替えるのではなく規則に従わないものを粛正している。
つまり、スターリンソートを使うための条件は

- データの集合が存在すること
- 規則が存在すること
- 粛正する手段が存在すること

である。
これをガチャに当てはめてみると

- データの集合が存在すること
→ガチャの結果をデータの集合とする。
- 規則が存在すること
→レア度を規則とする。
- 粛正する手段が存在すること
→ガチャを引かない。

となる。
しかし、前書きの通りガチャの結果は分からないし、
引かずに次の手に行く手段もない。
ということは課題はこの二つだ。

- ガチャの結果を用意する
- ガチャを引かずに次の結果に行く手段を用意する

## 実験
### 課題を受けて
いや無理だろ。
結果が分かるならそもそも当たりまで引く。
[某魔眼](https://www.google.com/search?q=%E3%82%AA%E3%83%95%E3%82%A7%E3%83%AA%E3%82%A2+%E9%AD%94%E7%9C%BC&rlz=1C1GGRV_enJP753JP753&oq=%E3%82%AA%E3%83%95%E3%82%A7%E3%83%AA%E3%82%A2%E3%80%80%E9%AD%94%E7%9C%BC&aqs=chrome..69i57.14329j0j1&sourceid=chrome&ie=UTF-8)でもあればその結果を視ないとか出来るが、現実にそんなものはない。
ここで諦めようと思ったが、一つだけガチャの結果が分かる（らしい）ものを思い出した。
MHWにおける装飾品のマカ錬金だ。
私はやったことがないのだが、マカ錬金は3個ずつのセットで出る順番があらかじめ決まっているらしい。
つまり課題の1つ目のガチャの結果を用意するは解決した。
さらに、この順番はクエストに行くことでスキップも出来るらしい。
なんと課題の2つ目も解決した。
MHWのマカ錬金にはスターリンソートが使えそうだ。

### 実施
実際にマカ錬金でスターリンソートを使ってみる。
まず条件を定義する。

- マカ錬金の結果を用意する
- 3個のセット中でレア度の高いものが多くなる順番にソートする（レア5 < レア6 < レア7 < レア8）
- 粛正対象が現れたらクエストに行く

まずは結果を用意する。
1回目：体力珠、持続珠、雷光珠
2回目：耐痺珠、采配珠、耐毒珠
3回目：防御珠、耐属珠、氷結珠
4回目：爆師珠、滑走珠、飛燕珠
5回目：防風珠、無撃珠、耐眠珠
6回目：KO珠、達人珠、毒瓶珠

次にレア度を振る。
1回目：体力珠（6）、持続珠（6）、雷光珠（6）→合計18
2回目：耐痺珠（5）、采配珠（5）、耐毒珠（5）→合計15
3回目：防御珠（6）、耐属珠（6）、氷結珠（6）→合計18
4回目：爆師珠（6）、滑走珠（6）、飛燕珠（5）→合計17
5回目：防風珠（6）、無撃珠（6）、耐眠珠（5）→合計17
6回目：KO珠（6）、達人珠（6）、毒瓶珠（6）→合計18

最後に粛正する。
1回目：体力珠（6）、持続珠（6）	雷光珠（6）→合計18

## 考察
実験の結果1回目しか残らなかった。
こうなるとそもそも1回だけやればいいということになる。
今回は簡単にするために規則をレア度の合計値としたが、
実際はレア度が低くても貴重な装飾品がある。
レア度に加えて個人的な重みを付けるなど規則を変えれば、
自分が望む装飾品を手に入れるスターリンソートが出来るだろう。

# 感想
完全に夜勤中の深夜テンションで考えているので、
穴だらけの理論だと思います。
ツッコミどころ満載の記事でしょう。
ですが、スターリンソートの使い道はないわけではないと言いたいです。
そもそもどこかで使われいるのかもしれませんが、その時は申し訳ございません。
皆さんが少しでも楽にマカ錬金できますように。

# 参考
スターリンソートについて

- [計算量O(n)の画期的なソートアルゴリズムであるスターリンソートをHaskell で実装してみた #Haskell](https://qiita.com/Tatsuki-I/items/380d6bd06515b872b2b2)

[マカ錬金や装飾品について](https://gamy.jp/mh-w/mhw-soushokuhin)
OAuth2.0認可エンドポイントの実装を調べてみる（Micorosoft Azure編）

# はじめに

以下の記事でも言っているようにOAuth2.0の認可サーバーを作ろうとしています。
[OAuth2.0の認可サーバーを理解する〜動作理解編〜](https://qiita.com/rocinante-ein/items/54f345f798ae4a8070cb "OAuth2.0の認可サーバーを理解する〜動作理解編〜")

OAuth2.0の認可サーバーを作るにあたって、世の中のOAuth2.0の認可サーバーはどのような動きをしているのかを調査するため、認可エンドポイントがどのようになっているか考察してみようと思います。

今回はMicrosoft Azureにサインインする際に使用するOAuth2.0実装を見ていきたいと思います。
とは言ってもほとんどOAuth2.0フレームワーク上で実装されるOpenID Connectの仕様に紐づく箇所が多いので、関連仕様も出しながら考察していきたいと思います。

# 認可エンドポイントのパス

RFC6749の例とMicrosoft Azureのパスを比べてみましょう。

|認可サーバー|パス|
|---|---|
|RFC6749の例|/authorize|
|Microsoft Azure|/common/oauth2/authorize|

Microsoft Azure側のパスは「/authorize」までの間にいくらかパスがあるみたいです。
「/common」はログインするテナント先が独立したテナント（共通テナント）であることを表すようですね。[参考](https://docs.microsoft.com/ja-jp/azure/active-directory/develop/v1-protocols-openid-connect-code "OpenID Connect と Azure Active Directory を使用する Web アプリケーションへのアクセスの承認")
「/oauth2」はOAuth2.0のアプリケーションを表すパスなのだと推測できます。
そう考えると例とほぼ同じ内容だと言えると思います。

# リクエストパラメータ

次はリクエストパラメータを見ていきましょう。

|パラメータ|値|
|---|---|
|client_id|23523755-3a2b-41ca-9315-f81f3f566a95|
|response_mode|form_post|
|response_type|id_token+code|
|scope|openid email profile|
|state|OpenIdConnect.AuthenticationProperties=英数字記号混合ランダム文字列|
|nonce|数字.英数字混合ランダム文字列|
|redirect_uri|https://azure.microsoft.com/|
|post_logout_redirect_uri|https://azure.microsoft.com|

パラメータを１つずつ見てきます。

* **client_id**はRFC6749で定義されているパラメータで、クライアントアプリケーションを一意に特定するIDです。今回の例ではMicrosoft Azure（具体的にはAzure Portal）がMicrosoftが提供するOAuth2.0認可サーバーの１クライアントとして動いていると想定できます。

* **response_mode**は「OpenID Foundation」の「OAuth 2.0 Multiple Response Type Encoding Practices」で定義された、認可エンドポイントからクライアントアプリケーションへ値を渡す方法を指定するものです。「form_post」の値は、同団体が策定した「OAuth 2.0 Form Post Response Mode」の中で定義されており、「redirect_uri」にPOSTメソッドで値を渡すことを表します。今回はAzure Portalのトップページである https://azure.microsoft.com/ にPOSTメソッドで情報を渡すようです。

* **response_type**はRFC6749で定義されているパラメータで、認可エンドポイントからクライアントアプリケーションに渡す情報が変わります。ちょっとしたところですが、「OpenID Connect Core 1.0」では複数のresponse_typeを指定する際は「 」（半角スペース）で値を区切るところを、Microsoftさんは「+」で区切っているようです。

* **scope**はRFC6749で定義されているパラメータで、クライアントアプリケーションがアクセスするリソースサーバー上のリソースを示すものです。指定されている値は「OpenID Connect Core 1.0」で指定している値で、メールアドレスとプロフィールにアクセスできるすることを表す値です。

* **state**はRFC6749で定義されているパラメータで、クロスサイトリクエストフォージェリを防ぐためのリクエストごとに一意になる値です。他の値とは違ってこれ自体が情報を持っているわけではなく、セキュリティを強化する用途で使用されます。Azure Portalにログインする時の値だとプレフィックスとして「OpenIdConnect.AuthenticationProperties=」がつくように見えます。

* **nonce**は「OpenID Connect Core 1.0」で定義されているリプレイアタックを防ぐための値のようです。この値もstateと同じようにセキュリティを強化する用途で使用されます。stateは通信自体の整合性を担保するのに対し、nonceはID Tokenの偽造に対して効果を発揮します。

* **redirect_uri**はRFC6749で定義されているパラメータで、認可エンドポイントによる処理が終わった後にクライアントアプリケーションに操作を返すのに使用されます。

* **post_logout_redirect_uri**は今のところドラフト段階の値みたいですね。「OpenID Connect Session Management 1.0」で定義されていて、認可サーバからログアウト時に遷移するURLを指定できるものみたいです。

# まとめ
基本的には仕様から大きく外れているような箇所はありませんでした。
むしろほぼ仕様どおり実装されているのを見るとさすがOpenID Foundationのスポンサーさんだなあと思いました。

そして実際に実装されている例を見るととても理解が進んで面白かったです。
本当は値のValidationやエラーのハンドラにも触れたかったのですが、パワーがとても必要だったのでやめちゃいました。

nonceの検証方法などまだ具体的に把握しきれていない箇所があったりするので、実装するにあたっては理解を深めていきたいです。

# 参考文献
OpenID Foundation https://openid.net/developers/specs/
Logicool G ステアリングコントローラー を 単体でPCに接続してみた

ロジクールのシフターを単体でPCに接続して使ってみたいのだ！

結果としてはなかなか簡単にできた！

##必要なもの
- Logicool ステアリングコントローラー
- Arduino LEONARDO
- ジャンパーワイヤー

これだけでできちゃいます

#手順

この動画が非常にわかりやすいです↓
https://www.youtube.com/watch?v=dLpWEu8kCec

これでなぜか僕はできませんでした。
3と4が5と6に誤認識されてしまいました。

で。githubのコードはこっちを使った方がいいです↓
https://github.com/armandoiglesias/g29Shifter/blob/master/g29shifter.ino

これで高いハンコン買わなくてもシフターが使えるぜ！
Songle Syncで音楽とLINEメッセージを同期しつつシンセサイザーで自動伴奏する

# はじめに
Songle Syncを使って色々なものを音楽と同期させてみました。

## Songle Syncとは?
http://api.songle.jp/sync
産総研が開発した、[能動的音楽鑑賞サービスSongle(ソングル)](http://songle.jp/)で使われている技術を利用したAPI。
楽曲を自動解析した情報をもとに、楽曲再生に合わせて様々なイベント（リズム、コード、サビinなど)を発生させる。
これを利用して、複数のデバイスを楽曲再生に合わせて制御することができる。

今回注目したのは「コード(Chord)」。
Songle Syncは、曲に合わせてChord Changeのイベントを発生させてくれます。
これをうまく利用すれば、自動伴奏をつけることもできますね。

## 同期したもの

* LINEメッセージ(LINE Things 自動通信機能)
* シンセサイザーによる自動伴奏

# デモ
<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">音楽に合わせてLINEメッセージとシンセサイザーの自動伴奏を同期させるデモ<br>使ったもの<br>同期システム: Songle Sync<br>LINEメッセージ: LINE Things 自動通信機能<br>自動伴奏: Chord-Translator + Web MIDI API <a href="https://t.co/Cr2NnucoSb">pic.twitter.com/Cr2NnucoSb</a></p>&mdash; 武志 (@takeaship) <a href="https://twitter.com/takeaship/status/1156584566162886658?ref_src=twsrc%5Etfw">July 31, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 概念図
<img src="https://docs.google.com/drawings/d/e/2PACX-1vTeaVSCc64wSZH71QOTB0IACOESef10HrWafLVFk6AgSF1ko3FSYZZ8Z5FysSKvY8uKIIX88b83oiJB/pub?w=960&amp;h=720">

# しくみ
## Master
音楽を再生します。
Masterの画面に設置したボタンで動画の再生開始や停止を行います。
各Slaveは、Masterの再生に合わせてイベントを受け取ることができます。

### ソースコード
https://github.com/TakeshiMasukawa/songle-sync-master-browser

[Songle Sync ブラウザ向けプロジェクト](https://github.com/SongleJp/songle-sync-app-browser)を元に、masterに必要な機能以外を削除して実装しました。

## Slave(LINEメッセージ)
### 使用したもの
* Obniz
* LINE Things 自動通信機能

### 概要
ObnizをLINE Thingsデバイス化し、スマートフォンにBLE接続します。
ObnizはSongle SyncからChordイベントを受け取り、LINE Things自動通信機能を利用してコードが変わったことをLINEメッセージで通知します。

LINE Thingsでやる必要がないと思いますよね？
実はLINE Things 自動通信機能は、見た目はLINE Botのプッシュメッセージですが、内部的にはリプライメッセージとして扱われます。
つまり、プッシュメッセージ(1000件/月まで無料)の制限を気にせず、リプライメッセージ(何件でも無料)として一方通行のメッセージを送り続けることができます。
本来意図された用途から外れた、ある意味悪用とも言える使い方です。
参考: [さおりからのLINEがヤバイ](https://speakerdeck.com/n0bisuke/saorikarafalselinegayabai-number-iotlt-vol51)

### 工夫したところ
LINE Things自動通信機能では、デバイスがnotifyを送信してからメッセージが届くまでラグがあり、そのままではChord Changeからメッセージが届くまで間隔が空いてしまいます。
Songle Syncでは、イベント発生時刻にoffsetをつけることができるので、マイナスのoffsetをつけることで、音楽再生に先駆けてnotifyを送信しています。

```viz.js 
player.addPlugin(new SW.Plugin.Chord({ offset: -1800 }));
```

### ソースコード
https://github.com/TakeshiMasukawa/songle-sync-slave-obniz

## Slave(自動伴奏)
### 使用したもの
* Web MIDI API
* KORG KROSS(シンセサイザー)
* [Chord-Translator](https://qiita.com/comorebi_notes/items/c8b4dde0f6bd91666a5c)

### 概要
Songle Syncから受け取ったChord情報をもとに、Web MIDI APIでMIDI信号を送信し、シンセサイザーを鳴らします。
Songle Syncは、C, CmなどのChord nameを教えてくれますが、このままでは構成音が分からないためMIDI信号に変換できません。
そこで、Chord nameを単音に分解するライブラリChord-Translatorを利用し、C -> [C, E, G]といった具合に構成音に分解しています

デモ動画では、MIDI信号をもとにストリングス(Octave Strings)の音色を鳴らしています。

### 工夫したところ
Chord-Translatorはnpmライブラリで、一方Web MIDI APIはブラウザ上で動作します。
Chord-Translatorをブラウザ上で動作させるために、Webpackを利用してビルドしています。
参考: [ブラウザでnpmモジュールを使いたい](https://qiita.com/kuronat/items/193f8f3f74b28d06434d)

# 今後の展望
* デモ動画ではまだまだラグを感じる。Offsetを調整し、より厳密に同期させる。
* 同期させるものをさらに増やす。例えば楽曲再生に合わせてテープLEDを光らせれば、視覚的にもインパクトのあるものができる。
秘密鍵接続を使ってWindowsのGit Bashでcloneする【conoha ssh】

## 前提

1. WindowsにGitとGit bashがインストールされていること。
2. conohaにLinuxサーバを立てていること。
3. Linuxサーバにgitがインストールされており、アクセス可能な場所にリポジトリがあること。

## 手順

1. conohaの管理ページにログインする。
2. conohaの管理ページからsshポートを開放する。
3. conohaのゲストOS側のsshポートを開放する（firewall-cmdなどを使う）。
3. conohaで公開鍵（パブリックキー）を作成する。同時に作成される秘密鍵をダウンロードしておく。
4. conohaのゲストOSにログインする。gitリポジトリにログインするユーザの`~/.ssh/authorized_keys`を vi などで開き、先ほどconohaで作成したパブリックキーの長い文字列を転記する。
5. conohaのゲストOSの設定ファイルを管理者権限（sudoなど）で編集する。
  これでルートログインとパスワード入力を不可にする。

    ```conf:/etc/ssh/sshd_config
    #PermitRootLogim yes
    PermitRootLogim no
    #PasswordAuthentication yes
    PasswordAuthentication no
    ```
6. sshd を再起動し、設定を有効にする。

    ```
    sudo systemctl restart sshd
    ```
7. conohaからダウンロードした秘密鍵ファイルを、Windowsの`C:\Users\<ユーザ名>\.ssh\id_rsa`ファイルとして名前変更し、移動する。

以上の手続きでGit Bashから`git clone`できました。
PuTTYのplink.exeを使おうとしてハマった…
Watson Speech to Text (STT) 挙動確認編

# カスタムモデルの挙動確認について
カスタムモデルを作ってみたはいいが、どうやって挙動確認しようかと思ったと人へ
[watson-developer-cloudのspeech-to-text-nodejs](https://github.com/watson-developer-cloud/speech-to-text-nodejs)というサンプルを使用しましょう。
![スクリーンショット 2019-07-11 18.01.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130492/ede690df-4327-7bae-fa71-6c7c63ad15fb.png)

```Bash:
 git clone https://github.com/watson-developer-cloud/speech-to-text-nodejs.git
```
(以下README.mdと同じなのですが)

```Bash:
cp .env.example .env
```
```Bash:
 vi .env
```
apikeyの確認はこのページから、サービス資格情報>資格情報の表示>apikey
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130492/acf65963-7ea4-61eb-5723-b0635c7fbf6d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130492/2ee67e18-2686-a84f-9ebb-9aa8f5aa1d65.png)

demo.jsxのオプションを指定する箇所でカスタム言語モデルのIDを指定して下さい。
(音響モデルを指定する場合は、
acoustic_customization_id:"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",)

```Bash:speech-to-text-nodejs>views>demo.jsx
customization_id:"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130492/b24b7a1c-b90c-343b-5cdf-024fc6d5d40e.png)

```Bash:
npm install
npm start
```

あとはブラウザでlocalhost:3000にアクセスすればローカル挙動確認ができますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130492/13e3d900-7fb8-2610-e745-232e4744a7f1.png)

#関連記事
[Watson Speech to Text (STT) 概要編](https://qiita.com/Kchan/items/9e24e5b0074bfe5f6bf2)
[Watson Speech to Text (STT) 基本操作curl編](https://qiita.com/Kchan/items/5b9231d3e93d75d4a021)
[音声認識の精度測定、単語誤り率(WER)と文字誤り率(CER)](https://qiita.com/Kchan/items/7bba1f066234ba24898b)
【初心者が初心者に教える】 Javaの基礎 条件分岐編

＜If文＞
もし〜ならば（条件指定・1択） If

もし〜その他なら（違う分岐の条件指定・2択目） else if

そうでないなら（当てはまらない残り全てが同じ分岐の条件指定・2択目or3択目） else

If(条件式) {
処理
}else if(条件式) {
処理
}else(条件式) {
処理
}
php-master-changes 2019-07-31

今日は pdo_sqlite の不要なビルドオプションの削除があった！

あとチラ裏だけど、この php-master-changes というの、[去年に今日だけと言って始めて](https://qiita.com/sj-i/items/8d716a389057d041623f)からちょうど 1 年くらいたつ。たまに 1 日とか 2 日とかサボって貯めたりしつつも、わりと毎日気味に続いてるので、自分で思ってたよりは根性あったらしい。

# 2019-07-31
## petk: Fix [#78348](https://bugs.php.net/bug.php?id=78348): Remove -lrt from pdo_sqlite.so
- https://github.com/php/php-src/commit/09b108246a8c1277d37b3d6c0ac6e5544f88d317
- [7.4~]
- ext/pdo_sqlite で、Solaris 用の不要な -lrt を config.m4 から削除

## petk: Update NEWS
- https://github.com/php/php-src/commit/3e8774e57a4bdc877e52bcefa1e6c4e9f4058486
- [7.4~]
- ↑の NEWS への追記
if で配列の中身のtrue/falseを返す場合に便利なsomeメソッド[ES2015]

## はじめに

某プログラミングスクールで、メルカリのコピーサイトを作りました。
その中でカテゴリのサイズを表示する部分の条件分岐の簡略化について考察しましたので、記事にします。

## 仕様
- カテゴリは三段構造。孫、親、祖父（gem:ancestry使用）
- 祖父を選んだら、子カテゴリが出現。子カテゴリを選んだら、孫カテゴリが出現。子カテゴリのジャンルによってサイズの出現分岐は決定する
- 完成図
![bed286abe491c4edff00db716e370600.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384347/f88b6e45-57c5-24ef-dd70-8e8212c170f9.gif)

＊カテゴリの出現についての説明は割愛させていただきますのでよろしくお願いします。

## some

someは配列が条件を一つ満たしていればtrueを返す
forEach(）のように配列の一つ一つを見ることができる。全てを調べて、trueを返す。


```javascript:someでtrue/falseチェック
     //子カテゴリで選ばれたcategory_id
　　 let childId = $("#child_category option:selected").data("category")

　　//　someメソッド部分
    const size =[15,16,17,18,20,21,29,30,33,34,35,38,43,44,45]//サイズカテゴリが必要なcategory_id
    sizeTrue = size.some(function(s){//書き方はforEachと同じ
        return s == childId //例：childId = 20であれば、配列の中に20が存在するので、sizeTrueは trueとなる
    })
// sizeTrue = trueなら、サイズカテゴリを出現させる
 if(sizeTrue){
    $(".category-size").show();
  }

```
配列の中を検証した後、sizeTrue がtrue/falseか判別してくれる。forEach()だと配列の中身が出てくるので、似て非なる。便利。

## ifの場合

```javascript

meでtrue/falseチェック
     //子カテゴリで選ばれたcategory_id
let childId = $("#child_category option:selected").data("category")

　　//　someメソッド部分の代わり
 if(childId == 15){
    $(".category-size").show();
  }else if(childId == 16){
    $(".category-size").show();
  }else if(childId == 17){
    $(".category-size").show();
  }else if(childId == 18){
    $(".category-size").show();
  }else if(childId == 20){
    $(".category-size").show();
  }else if(childId == 21){
    $(".category-size").show();
  }else if(childId == 29){
    $(".category-size").show();
  }else if(childId == 30){
    $(".category-size").show();
  }
(中略）
}else if(childId == 45){
    $(".category-size").show();
  }
```

不可能ではないがDRYの概念からずれているし、非常に面倒であるので、やはりsome推奨

## switchの場合

some以外の方法だと、switch文も便利

```javascript

 //子カテゴリで選ばれたcategory_id
　　 let childId = $("#child_category option:selected").data("category")

switch( childId ) {
    case 16:
        // 処理を書く
        $(".category-size").show();
        break;
    case 17:
        // 処理を書く
        $(".category-size").show();
        break;  
    case 18: //必要なだけcaseを追加していく…
}
(略)

```

同じ条件式に対して,値のみが違う時には使いやすい。

## まとめ
初めてQiitaに投稿してみました。
あまり細かく書きすぎても、本筋からズレてわかりづらくなるし
、かといってメソッドの使い方だけ書いても、使いどころがわかりづらい...
記述のバランス調整が難しいと思いました。
PowerShellのShell変数メモ

## PowerShellとは

そろそろ知名度はコマンドプロンプトぐらいにはなってきたでしょうか？
コマンドプロンプトに替わるWindowsの新しいシェルです。
新しいとはいっても、Windows7から実装されてそろそろ10年ほど経過しています。
今ではWindowsだけではなく、MacOSやLinuxでも使えます。
特に、

* ActiveDirectory
* office365
* Azure

等をコマンドで操作できるところにPowerShellの独自性と強みがあります。

## シェル変数

シェル変数を忘れることが多いため、メモとして記録


|シェル変数|説明|
|:---|:---|
|$_|スクリプトブロックないし現在のパイプラインオブジェクト|
|$Args|引数|
|$foreach|foreachループ内で処理されるオブジェクト|
|$PSCulture|システム言語|
|$PWD|カレントディレクトリ|
|$true|TRUE|
|$false|FALSE|
|$null|NULL|
|$PSVersionTable|PowerShellのバージョン情報等|
migrationファイルの削除

# 状況
マイグレーションステータスにNO FILEが存在しているので、消したい。

```
$ bundle exec rake db:migrate:status

database: ***/development.sqlite3

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20150708134153  ********** NO FILE **********
  down    20150722185435  Devise create users
  down    20150722190233  Add columns to users
```

[railsのrakeのmigrationファイルを削除しNO FILEとstatusに出た時の対処](http://joppot.info/2014/10/16/2104)を参考に対応する。

# マイグレーションファイルを復活させる
上記のstatusコマンドで確認したIDを元に、以下のファイルを作成する。

```
$ vim db/migrate/(migration_file_id)_tmp.rb
class Tmp < ActiveRecord::Migration
  def change
  end
end
```

statusコマンドを再確認し、NO FILEが消えていることを確認する。

```
$ bundle exec rake db:migrate:status

database: ***/development.sqlite3

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20150708134153  Tmp
  down    20150722185435  Devise create users
  down    20150722190233  Add columns to users
```

# マイグレーションファイルをdown statusに変更する

downに変更

```
$ bundle exec rake db:migrate:down VERSION=(migration_file_id)
```

ステータスがdownになっていることを確認する

```
$ bundle exec rake db:migrate:status

database: ***/development.sqlite3

 Status   Migration ID    Migration Name
--------------------------------------------------
  down    20150708134153  Tmp
  down    20150722185435  Devise create users
  down    20150722190233  Add columns to users
```

# マイグレーションファイルを削除する
削除

```
$ rm -rf db/migrate/20150708134153_tmp.rb 
```

ステータスを確認

```
$ bundle exec rake db:migrate:status

database: ***/development.sqlite3

 Status   Migration ID    Migration Name
--------------------------------------------------
  down    20150722185435  Devise create users
  down    20150722190233  Add columns to users
```
履歴が消えた！
dockerhub-development-flowを考えたけどボツった

眠くてテンション上がってこんなツイートしてしまったので

> npm-installしたbranchをmasterにmergeして、タグv0.1.1つける。dockerhubがタグv[0-9](\.[0-9){0-2}をgithubから拾ってきてbuildして組織内reposにpushする。んで開発メンバーは組織内reposからpullしてくる。んでworkspaceマウントしてnode_moduleを上書きマウントして開発。完璧では！？ [引用](https://twitter.com/hikaruna/status/1156572603479482370)

> masterに取り込まれてからdockerhubにimage上がるまでのラグはどうするか。
Dockerfileはdockerhub上げ用、開発メンバーはdocker-composeを使ってもらい、compose.ymlののimageに組織/repos:具体的なバージョンを指定すれば、上がるまでは環境アップできないからなんの問題もない。完璧では！? [引用](https://twitter.com/hikaruna/status/1156573248022372355)

脳内フローを書いてみようとした。

Dockerfile -> for Dockerhubにstoreする用
docker-compose.yml -> for 開発メンバーの開発環境用

```dockerfile:Dockerfile
FROM node:xxx-stretch
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm install && npm cache clean --force
COPY . /usr/src/app
```

```yaml:docker-compose.yml
services:
  app:
    image: myOrganizer/myImage:v0.1.1
    volumes:
      - .:/usr/src/app
      - node_modules # container内のdirをマウントで消さないためのトリック
```

[![](http://www.plantuml.com/plantuml/svg/VP5DRi8m48NtFiM85Io2oZOYY50gsbKHFO59Hec5Vu8zWN24Rdl4dgJvSQ86gYvdtkVdcNbhHznIgIJZ2HaB-nqhk2MHY89hWabHIXbOF4-0EsYA0vuz-dxLQ4VqvMc-c2zWkIIUhLOZAHEKbyTQ-lxy0iKTeRqZufBCfXGoHLjZMvESqDPFxgW3Ek78sDi_p4JTtXJFCEpcQKVtBSOIYvnmM6M_Ws3LLo5qAlFrIDA50W711rHLzGlepX3MWrq4NcFdHAPPstiGk_R8D4uIB6WG_9b2K6Wpd7fiziV3PsaS0jSfR54YuSPodUGiHKVMt7hER-k36MnytQyxDTf70gylyNRsE4vHkXo2W7ZcMDThr26nPiNScDEqyvtrt_P77y3EjOy7qZP0E3RIFJG4xNyNhLCKWSQA8CKBIbCer0HHnDQeqrB97m00)](http://www.plantuml.com/plantuml/uml/VP5DRi8m48NtFiM85Io2oZOYY50gsbKHFO59Hec5Vu8zWN24Rdl4dgJvSQ86gYvdtkVdcNbhHznIgIJZ2HaB-nqhk2MHY89hWabHIXbOF4-0EsYA0vuz-dxLQ4VqvMc-c2zWkIIUhLOZAHEKbyTQ-lxy0iKTeRqZufBCfXGoHLjZMvESqDPFxgW3Ek78sDi_p4JTtXJFCEpcQKVtBSOIYvnmM6M_Ws3LLo5qAlFrIDA50W711rHLzGlepX3MWrq4NcFdHAPPstiGk_R8D4uIB6WG_9b2K6Wpd7fiziV3PsaS0jSfR54YuSPodUGiHKVMt7hER-k36MnytQyxDTf70gylyNRsE4vHkXo2W7ZcMDThr26nPiNScDEqyvtrt_P77y3EjOy7qZP0E3RIFJG4xNyNhLCKWSQA8CKBIbCer0HHnDQeqrB97m00)

ここで筆を止めたんですよ。
これだとpull-req上で、docker-compose.ymlのimageに.を指定するわけにもmyImage:v0.1.1(まだ存在しない)を指定するわけにも行かない。
テストできなーい。

だめだこれ。ボツ　ボーツ。

最終的には、dockerhubにstoreしたimageを開発メンバーには使ってもらって、build時間をほぼゼロにしてもらうつもりだったんだけど、開発者自信がimageを更新していくわけだから因果律ほうかいしてるやね。

package.jsonにdiffあったらおとなしくbuildしてもらおう。
依存環境の完全なfreezeは開発フェーズでは諦めて、dockerhubへのstoreを以て達成するかー。
【EC-CUBE4】①EC-CUBE本体の開発環境を整える（インストール編）

## 前提条件

- Mac
- PHP7.2がローカル環境にインストール済み
- gitがローカル環境にインストール済み
- composerがローカル環境にインストール済み

## 方針

- データベースはsqlite3を利用。
- webサーバーはビルドインウェブサーバーを利用。


## 構築手順


### EC-CUBE4のフォーク

EC-CUBEの本家リポジトリよりforkします。
https://github.com/EC-CUBE/ec-cube

<img width="1302" alt="スクリーンショット_2019-07-31_12_59_31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166768/9083d839-308a-705f-14fc-d399dd8e5863.png">

forkボタンを押してください。

プロジェクトを作成したいフォルダに移動します。

```sh

$ cd [適当なディレクトリ]
```

forkしたリポジトリよりクローンします。

```sh
$ git clone https://github.com/[GitHubUser(ご自身のアカウント)]/ec-cube.git
cd eccube/
```
### ライブラリのインストール

composerでライブラリをインストールします。

```sh

$ composer install
```

### EC-CUBE4のインストール

eccubeのインストールコマンドを実行します。

```sh
$ bin/console eccube:install
```

### ブラウザで動作確認

ビルドインウェブサーバーを立てます。

```sh
$ php -S localhost:8000
PHP 7.2.8 Development Server started at Wed Jul 31 23:49:22 2019
Listening on http://localhost:8000
Document root is /Users/jun/Downloads/ec-cube
Press Ctrl-C to quit.
```

ブラウザで`http://localhost:8000`にアクセスします。

<img width="1378" alt="スクリーンショット 2019-08-01 0.02.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166768/edc39ab0-8e7c-a661-7667-73fd93db26f4.png">

トップ画面が表示されればインストール完了です。

http://localhost:8000/admin/
でログイン画面にアクセスします。

<img width="1191" alt="スクリーンショット 2019-08-01 0.06.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166768/67b36e11-1e80-1034-3a1c-1004cc705c09.png">


ログインIDがadmin
パスワードがpassword
で管理画面にログインできます。
<img width="1599" alt="スクリーンショット 2019-08-01 0.07.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166768/8a0ae676-d353-a457-a683-c57fe1633325.png">

長くなりそうなので、続きは<a href="現在のブランチを確認し。EC-CUBEでは4.0ブランチがmasterブランチに相当します。">【EC-CUBE4】EC-CUBE本体の開発環境を整える（GitHub Flow編）</a>に書きました。
次回は、Github Flowの本体開発環境を整えます。
コンテナで定期処理させるときに上手くいった例のメモ書き【alpine linux + crond】

## コンテナでプログラムを定期処理させたい
- 定期処理させるだけならcronを利用すればいいのですが、せっかくなのでコンテナで実行するプログラムの定期処理をしたいと思いました...

## 参考にしたリンク
以下のリンクを参考にさせてもらいました。

- [alpine linuxでcron用コンテナを作る](https://qiita.com/shufo/items/9def5e9a6f44996312b8)
- [Dockerを用いたcronでの定時処理](https://qiita.com/midoribi/items/496dcb6f8307ce7e2af0)

## Dockerfileの書き方
- Go言語を実行したかったので以下のように記述しました

```dockerfile
FROM golang:1.12 AS build

RUN mkdir -p /home/wkspace/program
RUN go get github.com/PuerkitoBio/goquery
RUN go get github.com/parnurzeal/gorequest 
RUN go get github.com/sclevine/agouti 
COPY my-image-crawler.go /home/wkspace/program

WORKDIR /home/wkspace/program
RUN CGO_ENABLED=0 go build -o my-image-crawler my-image-crawler.go


FROM alpine:3.10

RUN apk add --update --no-cache tzdata && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    echo "Asia/Tokyo" > /etc/timezone && \
    apk del tzdata

COPY --from=build /home/wkspace/program/my-image-crawler /usr/local/bin/
RUN chmod +x /usr/local/bin/my-image-crawler
RUN echo '45 22 * * * /usr/local/bin/my-image-crawler' > /var/spool/cron/crontabs/root
CMD ["crond", "-l", "2", "-f"]
```

## docker-compose.yaml
- はじめはcronが指定された時間に実行されずに悩みましたが、Dockerfileとdocker-compose.yamlの両方にタイムゾーンの指定をしてしまうと設定がおかしくなるみたいでした
- 今回、dockerfileのほうにタイムゾーンの指定をしました

```yaml
version: '3'
services:
  my-image-crawler:
    build: ./1.app/my-image-crawler
    container_name: 'my-image-crawler'
    tty: true
    volumes:
     - /home/users/wkspace/program:/home/wkspace/program:rw
    working_dir: /home/wkspace/program

networks:
    default:
```

## 感想
- ひとまずやりたいことができたので満足です(>_<)
Node.jsで画像ファイルをアップロードする

#はじめに
　Node.jsでアプリ制作を始めようと思った矢先に画像ファイルのアップロードでつまづいたので書き残しておきます。

　ExpressにはForm送信のためのモジュール「body-parser」が用意されていますが、これはメディアタイプ：multipart/form-dataに対応しておらず、ファイルをアップロードすることができないようです。そのため「multer」というモジュールを使う必要がありますが、これは逆にメディアタイプ：multipart/form-dataにしか対応していません。（以下URL参照）
Body-parserについて：http://info-i.net/express-body-parser

　使い分けるのは面倒なので今回は「fileUpload」というモジュールを使います。
fileUploadについて：https://www.npmjs.com/package/express-fileupload

#モジュールのインストール

　まずモジュールをインストールします。今回「fileUpload」によってPOSTで送られてきたファイルをサーバーに保存しておき、名前だけをDBに保存するという方式にします。呼び出すときはDBから名前を呼び出し、それに紐づいた画像をサーバーから取ってくるというシステムにします。
　そのためサーバー上にデータを保存するためのモジュール「fs」もインストールしておきます。
　また同名のファイルが送られてきた際に、画像ファイルの上書きされてしまうために画像の名前を書き換えます。その時に時刻を使うため時刻を表示するためのモジュール「date-utils」もインストールしておきます。



```terminal:terminal
$ npm install --save fileUpload
$ npm install --save fs
$ npm install --save date-utils
```

#アプリ構成について

今回アプリの構成は下のようになっています

```
├── app.js
├── public
│    └── images
│          └── upload_icon  //今回ここに画像ファイルを取り込みたい
├── views
│    └── mypage.ejs　//今回画像ファイルを取り込むための画面ファイル
└── routes
     └── mypage.js  //今回画像ファイルを取り込むための実行ファイル
```

#各ファイルの修正
「app.js」に以下の文を書き足すします。

```javascript:app.js

var fileUpload = require('express-fileupload');
app.use(fileUpload());
```
また「mypage.js」にも行き、以下の文を書き足します。

```javascript:mypage.js
var express = require('express');
var router = express.Router();
var mysql = require('mysql');

//今回追加したもの
require('date-utils');
var path = require('path');
var fs = require('fs');

//データベースのコンフィグ設定
var mysql_setting = {
    host : ホスト名,
    user : ユーザー名,
    password : パスワード,
    database : データベース名,
}

//画像がPOSTされた時の処理
router.post('/',(req,res)=>{
    //変数準備
    var id = req.session.login.id;  //今回変更したいDBのカラムID
    var now = new Date();  //画像名前変更のため日付を出しておく
    var time = now.toFormat('YYYYMMDDHH24MISS')
    
    //画像ファイル（アイコン）の拡張子を取り出し、時間とsession変数で名前をつけ直す。これによりuserが全く同じ名前のファイルをアップしてきても大丈夫
    var icon_ext = path.extname(req.files.icon.name);
    var new_iconname = time+req.files.icon.md5+icon_ext;

    //画像ファイルを保存するパスを設定
    var target_path_i = 'public/img/upload_icon/'+new_iconname;

    //ファイルをサーバーに保存した後、ファイル名をDBの保存、今後ファイルを取り出す際はDBから名前を取ってきてサーバーに保存してある画像ファイルとひもづける
    fs.writeFile(target_path_i, req.files.icon.data,(err) => {
        if(err){
            throw err
        }else{
            var data = {'icon':new_iconname};
                    
            var connection =mysql.createConnection(mysql_setting);
            connection.connect();

            connection.query('insert into テーブル名 set ?',data,
                            function(error,results,fields){
                                res.redirect('/mypage')
                            })
            connection.end();
        }
    });
});
module.exports = router;
```

このようにしたところ画像をForm送信から取り込むことができました
データ分析コンペで使われるアンサンブル学習手法概要

#データ分析コンペで使われるアンサンブル学習手法概要

kaggleなどのデータ分析コンペ成績上位者が、
当たり前のように使っているアンサンブル学習手法の概要を記載していきます。
(順次、更新・充実させていきます)

##記事のターゲット
　・機械学習にふれたことがある方
　・アンサンブル学習の概要だけ知りたい方


##参考URL
機械学習上級者は皆使ってる？！アンサンブル学習の仕組みと3つの種類について解説します
https://www.codexa.net/what-is-ensemble-learning/

アンサンブル学習について勉強したのでまとめました：Bagging / Boosting / Stacking 
https://www.st-hakky-blog.com/entry/2017/07/28/214518

#アンサンブル学習（Ensemble Learning）とは

複数の学習モデルを融合させて、汎化能力を向上させる手法です。
アンサンブルとは、wikipediaより"音楽用語で2人以上が同時に演奏すること"
あります。(https://ja.wikipedia.org/wiki/アンサンブル)
アンサンブル学習とは複数が集まって良い結果を出しましょうという、3人寄れば文殊の知恵の発想ですね。


##バイアスとバリアンスについて

まず、アンサンブル学習の前にバイアスとバリアンスについて説明する必要があります。バイアスとバリアンスは何かといいますと、

■バイアス
　学習器が導き出した予測値と観測値との誤差

■バリアンス
　学習器が導き出した予測値の分散(散らばり具合)


わかりやすいイメージ図は、
本記事の参考文献"https://www.codexa.net/what-is-ensemble-learning/"
に記載されています。

ここで大事なのは、バイアスとバリアンスはトレードオフの関係にあることです。例えば、

#####バイアスが大きい：
■原因例：学習器の表現力不足(例：非線形の観測値に対して1次の線形回帰で予測した)
■解釈：学習器の表現力が不足しているということは、新しい訓練データで学習させても、表現力不足のため予測値はたいして変わらないだろう。
つまり、<b>バリアンスが小さい</b>


#####バリアンスが大きい：
■原因例：訓練データに対して過学習している
■解釈：過学習しているので、訓練データ毎に十二分に適合した予測値を出し、予測値は大きく異なるだろう。
だが、訓練データ毎に十二分に適合するということは、新しい訓練データで学習させても予測値と観測値との誤差は少ないだろう。
つまり、<b>バイアスが小さい</b>


よりよい学習器を作成するためには、学習器の表現不足も
過学習も避けなければなりません。つまり、バイアスとバリアンスのちょうどよい位置を見つける必要があります。
そこで、アンサンブル学習という手法が使われます。

ここから、アンサンブル学習である３つの代表的な手法
(バギング、ブースティング、スタッキング)について記載していきます。

##バギング（Bagging）

一般的に、モデル予測結果のバリアンスを低くすることができます。

訓練データをブートストラップ標本(復元抽出)で選択し、
元の訓練データとは異なる訓練データを多数作成します。

解く課題がクラス分類の場合、複数の識別機で学習し予測結果の多数決をとります。
回帰の場合は、予測結果の平均をとることが一般的です。

####手法例
・ランダムフォレスト 
　(https://ja.wikipedia.org/wiki/ランダムフォレスト)
　弱学習器を決定木とした、アンサンブルした手法。
　バギングを改良し、各識別器で使用する特徴量を、
　あらかじめ決められた数だけランダムに選択する手法です。

・ディープ・フォレスト
　(https://ja.wikipedia.org/wiki/ディープ・フォレスト_(機械学習))
　ランダムフォレストをさらに多層にしたアルゴリズムです。


##ブースティング（Boosting）

一般的に、モデルの予測精度に対してバイアスを下げることができます。

ベースラインとなるモデルを作成し、
間違った予測に焦点をあて、つまり「重み」を加味して、
新たに追加される弱い学習機は間違った予測を重点的に見るようにする仕組みです。

ブースティングで、勾配情報を用いているものを勾配ブースティング(Gradient Boosting)と呼びます。
Kaggleで上位に食い込む強者は、半数以上が勾配ブースティングを用いているらしいです。

####手法例
・AdaBoost 
　(https://ja.wikipedia.org/wiki/AdaBoost)

・XGBoost
　勾配ブースティングとランダムフォレストを組み合わせたアンサンブル学習。

・LightGBM 
　Microsoftが開発している、決定木アルゴリズムに基づいた勾配ブースティング。

##スタッキング（Stacking）

モデルを順次積み上げていく方法です。

仮に、2段階のモデルであった場合、
まず、1段階目のモデルで学習して予測結果をだし、
2段階目のモデルでは1段階目のモデルの予測結果を特徴量として、モデリングを行います。


####最後に

概要にとどまったので、順次更新してまいります...
Flask Practices #3, cookiecutter-flask ベースプロジェクトの育て方

[<<<前回](https://qiita.com/coleyon/items/94f757c66968bea8a506) | [目次](https://qiita.com/coleyon/items/0c44b0cd88de82f27f2c) | [次回>>>](https://qiita.com/coleyon/items/a6cc426edf6109db964c)


cookiecutter-flask のベストプラクティスを極力活かして、アプリを育てる（追加・拡張する）方法を解説します。

# 概要

cookiecutter-flask を用いて生成した Flask アプリは、以下のような仕掛けにより、[Twelve-Factor App](https://12factor.net/ja/) の ``III.設定``, ``V.ビルド、リリース、実行``, ``X.開発/本番一致`` に相当するベストプラクティスを適用・維持しやすくなっています。

* アプリは Docker コンテナとしてビルドおよび起動できる
* コンテナは ``development`` と ``production`` の区別をつけられる
* 区別は ``環境変数`` の切り替えによりつけることができる
* ``環境変数`` の値は ``.env`` ファイルによって指定できる
* 機密を含むであろう ``.env`` ファイルは git に載せず、 ひな型である ``.env.example`` ファイルをコピーして作成する

つまり、この図のような流れの取り扱いができるように配慮されているので・・・
![panels.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157638/9113fa73-c253-d091-57ad-4f5246f56fa2.png)

メリットとしては、12 Factor App の対応項目が目指しているメリットが得られやすくなっています。

|12 Factor App 対応項目|由来となる構成|
|:---|:---|
|III.設定|.env ファイルを介した環境変数の注入により Configuration ができる|
|V.ビルド、リリース、実行|Configuration に応じて開発・運用環境の区別をつけることができる|
|X.開発/本番一致|開発・運用環境の区別をつけるために、わざわざコードや実行環境を変える必要が無い|

[cookiecutter-flask の配布元ドキュメントの Features](https://github.com/cookiecutter-flask/cookiecutter-flask) 欄には "Configuration in environment variables, as per The Twelve-Factor App" と書かれていますので、少なくとも ``III.設定`` は明に狙っているところでしょう。

----

以降は、これらのメリットを活かしながらアプリ固有の拡張・設定をする例を紹介します。

1. [環境変数の育て方](https://qiita.com/coleyon/items/a6cc426edf6109db964c)
1. コンテナの育て方
指定したパスのGoプロジェクトをターミナルからGoLandで起動する

# 概要

* **Tools** -> **Create Command-line Laumcher...** を設定するとターミナルから指定パスのGoプロジェクトを指定してGoLandを起動できます
* IntelliJ系のIDEなら勝手は同じはず
  
# スクショ付き手順（macOS、Linux）

1. GoLandの**Tools**から**Create Command-line Laumcher...**を選択
<img width="703" alt="tools.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46547/16d1a792-14ca-eb22-9ac0-cb55e76a8363.png">

1. **Create Launcher Scriptダイアログ**でバイナリのパスを指定し、*OK*をクリック
<img width="697" alt="cls.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46547/80bed14c-4520-a533-55f6-91d0d9c41fd1.png">

以上！

# 利用

```bash
$ cd [path/to/your/go/project]
$ goland .
GoLandで選択したプロジェクトが起動される
```


# 参考

* [コマンドラインからのIntelliJ IDEA機能の操作](https://pleiades.io/help/idea/working-with-the-ide-features-from-command-line.html)
  * Windowsの手順もあります
  * ファイルを開く以外にもフォーマット、コードインスペクション起動、ファイルdiff表示、ファイルマージなどができそうです

ググれば出てきますが、僕はそもそもこういう使い方を知らなくてググることすらしなかったので、便利に使う人が増えればいいとなぁと思って書きました。
LINE Thingsの接続を自宅で検証してみる

##はじめに
7/13にハッカソンに初めて参加しました。
LINE　thingsを使用して「エアコンチェッカー」（切り忘れの通知）を作成していたのですが、会場内で外出中の条件を作るのが難しかったので、後日自宅で検証しました。
（当日のデモではobnizと距離センサー使用し、「外出中」の条件としていました）

★参加したハッカソン
ProtoOut ×　LINE Things　×　iot
https://protoout.connpass.com/event/135942/

![エアコン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417361/0c5c6dca-07a7-8738-388b-ff2a6b4612e6.png)

###検証方法
obnizとLine thingsを接続し、ログを確認
自宅で距離、障害物がある状態で接続が切れるかどうか
★LINE thingsの動作確認はこちらを参考にさせていただきました。
https://qiita.com/wicket/items/3fccb34dceb75576a385

#####結果
1m…接続OK（安定）
3m…接続OK（安定）
3m（+ドア）…接続OK（少し不安定かも）
玄関前（外）…状態が不安定でログ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417361/980c9dd9-1761-eaba-e8c5-6af95fc00586.png)
玄関から5m以上~　切断

<img width="375" alt="ON.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417361/29e761b2-3a22-fd4d-73ed-360c80325d81.png">
<img width="375" alt="OFF.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417361/f8d66c20-01b5-6140-3e2e-33340ffaa521.png">


###検証結果
自宅の中でも5mくらいなら接続中のままだが、障害物（ドア）などで接続が不安定になる。
ドアなどがなければ1階と2階でも接続が安定していた。
LINE thingsを外出中の条件として使用する場合、obniz等の置き場を色々試してみた方がよい。

###ハッカソンで実装しきれなかった技術について
切断中を自動で通知する記事を実際に試してみました。

★参考(ProtoOutブログ)
LINE Things切断を検出してメッセージを送るナレッジ obniz編
https://protoout.studio/posts/line-things-obniz-disconnect-tips

設定させたい

###発展させたいこと
Line thingsの特性を考えると、自宅のようにwifi環境がない方が使用用途として合っていると感じました。
ハッカソンに出て、何か動くものを作りたい＆初心者でも操作できるものが思いmicro:bitを購入しました。
https://qiita.com/n0bisuke/items/b8800bc46bab76cc1c29

記事だとmac版の手順なのでwindows版として試しているのですが、
Arduino IDEに各種ライブラリ(3種類)をインストールするところで時間がかかってしまい…
windowsだけの手順もあるので、詳細調べてアップしたいと思います。
（ハンズオンで体験したかった....）

###終わりに
maicro:bitはチュートリアルをいくつか試すだけでも楽しく、もっと色々な種類のデバイスと連携させてみたいなと思いました。今後は、puck.jsのような小さいものを使ってアクセサリのように身に着けてLine thingsと連携させてお守りのようなアイテムを作りたいと思っています。
【ShaderGraph】マスク画像で特定の部位だけ歪ませるエフェクト

# 概要
[『Shadowverse開発事例』 ～美麗カードが動く!制作テクニックのすべて～](https://speakerdeck.com/cygames/shadowversekai-fa-shi-li-mei-li-kadogadong-ku-zhi-zuo-tekunitukufalsesubete)
を参考にさせていただき、`ShaderGraph`でマスク画像で特定の部位だけ歪ませる
カードシェーダー風エフェクトを作成してみました。

![MaskDistortion.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148284/5939a50e-c09a-e5b5-8bc2-b4d3a8cbf09b.gif)
ご覧のとおり、髪の毛のところだけが揺れています。

# 用意するもの
画像とマスク画像を用意します。

## 画像
今回、UnityちゃんCandyRockStar画像を[DATA DOWNLOAD](http![CandyRockStar_mask.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148284/edded259-c253-1ee5-cfed-03f47597a0aa.png)
://unity-chan.com/contents/guideline/)より使用させていただきました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148284/6cd76759-da12-86f5-b4d1-2f2f544f113b.png" width=300/>
© Unity Technologies Japan/UCL

## マスク画像
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148284/59887685-2938-b74c-e235-53df5c07703d.png" width="256"/>

このような青色のマスク画像をGIMPで作成しました。

# ShaderGraph
![2019-07-31_23h23_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148284/725a19a5-3bab-e291-a612-3e1fc3a47390.png)

元のUVに、マスクで青みがかっている部分のUVだけを歪ませて足してあげればそれっぽくなりました。
※ベストなやり方とは限りませんのでご了承ください。

## ColorMaskノード
マスク画像の`Sample Texture 2D`ノードを`Color Mask`ノードにつなげて`Mask Color`を青に設定します。
`RGB`のうち`B`成分を取り出し、`B`値が強いほど揺れの影響度が強くなるようにしました。

# まとめ
マスク画像で画像の特定の部分を歪ませることをShaderGraphで実現することができました。
妄想プロダクト室「lift me」のプロトタイプ

![main_vidual.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420554/096eb83a-bd4d-656a-8962-8c125b3b66ad.jpeg)



# つくったモチベーション
最近のお買い物って、こんな感じではないでしょうか？
↓
あ〜そろそろ暑くなってきたし、半袖シャツでも買うかな〜。
さて、検索検索〜っと。。。
おっ、いいの発見！ ポチッとな。
ふぅ〜お店に行かなくてもいい感じの半袖シャツが買えたな😄
・
・
あれ？そういえば、わざわざお店いく意味ってなんだろう。。。
そこで、私は無人店舗を想定した新しい**インタラクティブなハンガー**をプロトタイピングしてみることにしてみました！

# 「lift me」概要
”インタラクティブなハンガー”「lift me」をプロトタイピングする。
ハンガーを持ち上げると、スマホにその服を使ったオススメのコーデを送ってくれます。
また、服のPV数と表し、ハンガーが持ち上げた回数が表示される←未実装。
↓以下、デモ動画
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">「lift me」新しいショッピングデバイス。服がかかったハンガーを持ち上げると、コーディネートをスマホに送信。<a href="https://t.co/gZ6aZxum7O">https://t.co/gZ6aZxum7O</a></p>&mdash; taichi (@MakingEmo) <a href="https://twitter.com/MakingEmo/status/1158401738388332544?ref_src=twsrc%5Etfw">August 5, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 技術・素材
- LINE Things LIFF
- javascript
- html/css
- obnize
- 加速度センサー
- ハンガー
- instagram api

## 構成図
![abe.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420554/a500d113-6c4a-2c3e-a040-4a7a851455ec.jpeg)
## 今後の課題
・服にあったコーデを引っ張ってくるロジックを考えていない
（今は、プロトということでとりあえずインスタapiを叩いている）
・ハンガーのPV数を表示したい。
（何回、加速度の値が変わったかをファイアベースなどで記録しフロントに表示したい）
・ハンガーが変わるごとにユーザーは、line thingsを連携させないといけない
（作ってる途中まで気がつかなかった、ユーザービリティが悪すぎる）
tmuxをUbuntu18.04LTSにインストールする手順

# libeventをインストールする
```bash
git clone git@github.com:libevent/libevent.git
cd libevent
./autogen.sh
./configure
make
make install
```

# libeventのPATHを通す
## 
```bash
# 一時的にPATHを通す
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib"
```

source ~/.profile # ターミナルを再起動せずに変更を反映させる
```

# ncursesをインストールする
```bash
cd /tmp
curl -O https://invisible-mirror.net/archives/ncurses/ncurses-6.1.tar.gz
tar -zxvf ncurses-6.1.tar.gz
cd ncurses-6.1
./configure
make
make install
```

# tmuxをインストールする
```bash
git clone git@github.com:tmux/tmux.git
cd tmux
sh autogen.sh
./configure && make
make install
```

# References
- https://github.com/libevent/libevent
- https://www.gnu.org/software/ncurses/
- https://github.com/tmux/tmux
TensorFlow Lite グラフの可視化ツール(visualize.py)がうまく動作しない場合の解決方法

Tensorflow Lite グラフの可視化の推奨方法である[visualize.py](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/tools/visualize.py)について、実行したら動かなかったので解決方法をこちらにまとめます。
[Tensorflow Doc - コンバータ Python API ガイド](https://www.tensorflow.org/lite/convert/python_api?hl=JA)

> Graph visualization - TensorFlow 2.0 において、 TensorFlow Lite グラフの可視化で推奨されるのは visualize.py を使うことです。 GraphViz と違い、 post training quantization が施された後のグラフを可視化できます

注意、**この記事は2019年7月30日に試した方法**であるため今後この問題は解決されるかもしれません。

解決方法はこちらを参考にGoogleColabratoryに記述しました。
[Github - Error when using TF-Lite visualizer to create the HTML file from a TF-Lite model #18857](https://github.com/tensorflow/tensorflow/issues/18857)

[GoogleColab - TFLite Graph Visualization](https://colab.research.google.com/drive/15tZjcFvnL1MzA_Uak2JGdi450TYu8sW3)


原因としてはvisualize.py が参照している以下のファイルが存在しないため自前でコンパイルして当該ファイルを生成する必要があるというものです。

```
Traceback (most recent call last):
  File "./tensorflow/tensorflow/lite/tools/visualize.py", line 47, in <module>
    raise RuntimeError("Sorry, flatc is not available at %r" % _BINARY)
RuntimeError: Sorry, flatc is not available at './tensorflow/tensorflow/lite/tools/../../../../flatbuffers/flatc'
```
VSCodeのRemote-SSHでリモート先のLinuxのbash_profileを読み込む

たいしたことではないけど、ググっても出てこなくて地味に詰まったので備忘録

VSCodeからRemote-SSHでLinuxに接続するとbashrcは読み込まれるがbash_profileは読み込まれないらしく、毎回手動で``source ~/.bash_profile``しないといけないようだった。流石に面倒なので何か方法ないか調べたところ、settings.jsonに以下を追記することでターミナル接続時に自動的にbash_profileが読み込まれるようになった。
※settings.jsonは「Ctrl+,」で表示される右画面の右上隅の「{}」マークをクリックすると開ける。

```json:settings.json
{
    ～省略～
    "terminal.integrated.shellArgs.linux": ["-l"]
}
```

JSONなのでカンマの付け忘れに注意

## 参考
https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration