OmniAICreator/Qiita-1.07M huggingface dataset:
AWS API Gateway経由でCircleCIを叩く

CircleCIはプランごとにビルドに使える時間が制限されているので、プランを小さいもので契約しているとあっという間にビルド時間を使い果たしてしまうことがあります。JenkinsのGithubPullRequestBuilderみたいな感じで特定のコメントをした時だけビルドが走るようにできると便利なのですが、Github側のwebhookのトリガーには、任意のタイミングでビルドを走らせられる都合のいいトリガーが見つからず、今回は似たようなものを自前で作ってみることにしました。


## 要件
* CircleCIを使ってビルドする
* 任意のタイミングでのみビルドを実行できる

## 方策
* AWS Lambdaで特定のコメントのみフィルタしてCircleCIにAPI経由でビルドを投げるFunctionを作成する
* AWS API Gateway経由で↑のFunctionを叩く
* Githubで↑のAPIをwebhookとして設定し、Issue Commentをトリガーとしておく


## 手順
### AWS Lambdaで特定のコメントのみフィルタしてCircleCIにAPI経由でビルドを投げるFunctionを作成する

こちらにgithubのwebhookのイベント受け取ってCircleCIにビルドを投げるためのサンプルコードがあるので今回はこれを使います。
https://github.com/hiroyukimizukami/github_build_runner

apex経由でデプロイします。中でGithubとCircleCIのAPIを叩くのでそれぞれのトークンが必要です。
* Github ... repos Scopesが付いているもの
* CirclCI ... All Scopesがついているもの
```
apex deploy --set GITHUB_TOKEN=hoge --set CIRCLECI_TOKEN=huga
```

コード内でやっている事としては以下のとおりです。

* GithubのIssueCommentイベントを受け取りイベント内容をフィルターする
  * actionがcreated(作成)の時、かつ
  * comment.bodyが「test this please」である
* Githubの「Get a single pull request」APIを使って最新のshaを取得する。
* 取得したshaを指定してCircleCI APIを使って新規ビルドをリクエストする。

各APIのフォーマットは以下の通りです。
* [Github: IsssueCommentEvent](https://developer.github.com/v3/activity/events/types/#issuecommentevent)
* [Github: Get a single pull request](https://developer.github.com/v3/pulls/#get-a-single-pull-request)
* [CircleCI: Trigger a new build](https://circleci.com/docs/api/v1-reference/#new-build)


### AWS API Gateway経由で↑のFunctionを叩く
#### APIを作成する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18486/9545d4bd-2b71-5a88-0b33-6363ac4148d2.png)
- Amazon API Gatewayから「Create New API」を選択。Settingsの API nameに適当な名前を入れて「Create API」押下

### APIにメソッドを追加する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18486/6cd52b0c-79c1-04a4-2f3d-21aeb9544e63.png)

- APIs -> 「作成したAPIを選択」 -> Actionsから「Create Methods」を選択し、POSTメソッドを追加する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18486/14315770-34f2-6c13-fdae-296a2e0960eb.png)

- Integration TypeにLambda Functionを選択
- Lambda RegionにLambda Functionをデプロイしたリージョンを指定(日本なら大抵ap-northeast-1)
- Lambda Functionにデプロイ済みのfunctionを指定してSave

### APIをDeployする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18486/98200978-d5aa-ee19-9734-ccdce38fa526.png)

- ActionsからDeploy APIを選択



![image.png](https://qiita-image-store.s3.amazonaws.com/0/18486/55809812-ba53-8b2d-9eea-46f25b994af9.png)

- Deployment StateでNew Stageを選択
- Stage Nameは適当に入力(productionとか)
- Deployを押下

Deployができると、InvokeURLが出てくるのでそれを控えておきましょう。(以下の形式になっているはずです)
```
https://{api_id}.execute-api.{region}.amazonaws.com/{stage}
```

### Githubで↑のAPIをwebhookとして設定し、Issue Commentをトリガーとしておく
* Githubのリポジトリ -> [Settings] -> [Webhooks] -> [Add Webhooks]
    * Payload URL ... 先程控えたInvokeURLを指定
    * Content Type ... application/json
    * Secret ... 未指定
    * Let me select individual events.から「Issue Comment」を指定


---

以上の作業にて、特定のコメントをした時だけCircleCIでビルドが走るようになっているはずです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18486/be79bf03-4655-0dd8-e3d5-4df9c640b601.png)
react-native links

* https://github.com/start-react/native-starter-kit
* http://qiita.com/YutamaKotaro/items/ab52b6ba664d88a87bd9
* https://github.com/aksonov/react-native-router-flux/blob/master/docs/REDUX_FLUX.md
* http://web-salad.hateblo.jp/entry/2016/12/04/090000
* https://github.com/GeekyAnts/NativeBase-KitchenSink
* https://oblador.github.io/react-native-vector-icons/
* https://github.com/oblador/react-native-vector-icons
* https://github.com/GeekyAnts/native-base-example-github-app
* https://docs.nativebase.io/
雑に覚えたGit CLI

# はじめての雑に覚えるGit CLI
今までSourceTreeとか、GitKrakenに甘えた人生を送ってました
Git操作で苦しんでる暇あったらアプリケーション実装しようね、の世界にいたので。  

ただ、ちょっと自分の身辺の状況が変わったので、改めてGitを
CLI (Command Line Interface)を使って、Gitを扱えるようになってみようかなと思っております。

N番煎じでも気にしない！！マサカリバッチこいですよー！！

と、ＩＴ初心者向けです。
間違ってたり、こういう使い方もあるよってことがあったら教えてください！

# 前提
- Gitの仕組みとか背景とかは知ってる。
- ソフトウェア導入できない労働環境にあってCLIでやらないといけない。
- Git界の変態ではない人
そんな人向け。

## clone
一番よく使うコマンドだと思う。リモートにあるリポジトリをローカルにダウンロードしてくる。

```
$ git clone http://fugahoge.com
```

`git clone <address>`
で、プロジェクトを落としてくることができる。
SSH経由で引っ張ってくるときは、 `git@` のスキームを利用して、
HTTPS経由で引っ張ってくるときは上記みたいに `https://` のスキームを利用する。

## init
バージョン管理したいディレクトリをGit化（Gitの管理下）に置くための処理。
一番最初にこれやる。

```
$ cd <Git化したいディレクトリ>
$ git init
```

## remote
リモートリポジトリと現在のローカルリポジトリを紐づける。

```
$ git remote add origin https://fugahoge.com
```

`git remote add <好きな名前> <どこのリモートリポジトリか>` で紐づけられる。

紐づけを消したい場合は、以下の通り
`git remote rm <紐づけたリポジトリの名前>`

## diff
差分を見るのに使います。

```
$ git diff
```

## status
変更されたファイルの一覧を表示する

```
$ git status
```

## log
コミットログを一覧で表示する

```
$ git log
```

`git log -p`
で、diffも見れるようになる。

## branch
新しくブランチを作成する  
基準となるブランチは、現在いるブランチなので、 `git branch` で確認してから行う。  

```
$ git branch branchABC
```

## checkout
別のブランチへ切り替える

```
$ git checkout branchABC
```

ブランチの切り替えと作成を同時にやるときは
`git checkout -b branchABC` とやる。


## add
変更したファイルをステージに追加する。

```
$ git add text.txt
```
全部追加したいときは、
`git add -A` で追加できる。

`git add -u` で既にコミットしたことのあるファイルだけを追加することができる。  
新しく作ったものはまだコミットしたくない時などに使えるっぽい。

## reset
ステージに追加したファイルをワーキングツリーに戻す。
コミットに間違えちゃったときに使います。

```
$ git reset --soft
```

オプションについて
--softだとステージに戻る
--hardだとコミットが無かったことになる

pushしてしまっていたら、使えない。（リモートには反映されないので）
自分は諦めてrevertしてます。

## commit
ステージに追加されたファイルをブランチの履歴として登録する。

```
$ git commit -m "message"
```

-m オプションつけるとコメント付きでコミットできる。

## push
現在のブランチをリモートに送る（反映する）

```
$ git push origin branchABC
```
フォーマットは以下のような感じ
`git push <リモートの名前> <ブランチの名前>`
masterを送りたければ、 `git push origin master` になる。

`git push -u origin branchABC` とすると、次回から
`git push` とするだけで、リモートの branchABC に、ローカルの branchABC が送られるようになる。

rebaseしてリモートに反映させたい場合は、force pushする。
`git push -f origin branchABC`
ただ、force pushは、同一ブランチで他の作業中の人にも影響を与えるので注意が必要。

## revert
現在のコミットを打ち消すコミットを行う。

```
$ git revert HEAD
```

HEADというのは、現在いるコミットの位置。revertしたらpushしてリモートも打ち消す。
`git push -u origin branchABC`

## pull
リモートの状態をローカルに反映させる。

```
$ git pull origin master
```

`$ git pull <リモートの名前> <ローカルに反映させるブランチの名前>`
で、反映できる。

## merge
特定のブランチを自ブランチに取り込む。
ただ、Githubを利用した開発運用している場合は、あまり使わないかもしれない。

```
$ git merge branchABC
```

## rebase
特定のブランチを自ブランチの履歴として取り込む。
mergeは、自分のブランチの履歴として取り込むことはなしない。
詳しくは、ぐぐったら出てくると思うので割愛。

```
$ git rebase branchABC
```

競合が発生していたら、競合を解決して、
`git rebase --continue` を行う。

# ちょっと特殊なやつ
## cherry-pick
特定の１コミットを自分のブランチに取り込む。
間違ってコミットしちゃったーーー！！というときに使えます。

```
$ git cherry-pick abcde12345
```

`git cherry-pick <commitID>`

# 応用例・実用例
実用例が出てきたら更新します（きっと）。

# 所感
GUIツールって神ｗ
HomebrewでGitをインストール、Homebrewの補完スクリプト設定。

# HomebrewでGitをインストール

* macOS Sierra
* Homebrew

### インストール

```shell-session
$ brew install git
Updating Homebrew...
==> Auto-updated Homebrew!
   ...
==> Downloading https://homebrew.bintray.com/bottles/git-2.13.2.sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring git-2.13.2.sierra.bottle.tar.gz
==> Using the sandbox
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completions and functions have been installed to:
  /usr/local/share/zsh/site-functions

Emacs Lisp files have been installed to:
  /usr/local/share/emacs/site-lisp/git
==> Summary
🍺  /usr/local/Cellar/git/2.13.2: 1,467 files, 33.2MB
$ git --version 
git version 2.13.2
```

# Homebrew補完設定

gitをインストールすると、補完、プロンプト設定のスクリプトなどもインストールされている。

```shell-session
$ ls -1  /usr/local/etc/bash_completion.d
brew
git-completion.bash
git-prompt.sh
hg-completion.bash
```

`~/.bash_profile`で読み込むように設定。

```bash:~/.bash_profile

[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion
BREW_SCRIPTS="$(brew --prefix)/etc/bash_completion.d"
[ -f "$BREW_SCRIPTS/git-prompt.sh" ] && . "$BREW_SCRIPTS/git-prompt.sh" && PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '

```

`exec $SHELL -l`でシェルを再起動します。

-----

これで、以下の機能が設定できました。

- Gitコマンドのタブキー補完
- Gitリポジトリ内でのプロンプト表示設定
ラズパイ の簡単バックアップ・復元アプリ「SD Card Copier」の翻訳

![](https://i.creativecommons.org/l/by-sa/4.0/80x15.png)
この記事は、`Raspbian Jessie` 以降から標準で同梱されている**ラズパイのバックアップ・復元アプリ「SD Card Copier」**（`piclone`）について「[THE LATEST UPDATE TO RASPBIAN](https://www.raspberrypi.org/blog/another-update-raspbian/)」のリリース内容から抜粋して翻訳したものです。そのため、[この記事は原文と同じ「CC BY-SA 4.0 国際ライセンス」](https://www.raspberrypi.org/documentation/)です。

別件で訳したのですが「いらない」と言われちゃったので Qiita に置いておきます。<sub><sup><sub><sup>(´・ω・｀)</sup></sub></sup></sub>

- 原文
    - 「[SD card copier](https://www.raspberrypi.org/blog/another-update-raspbian/)」| The latest update to Raspbian @ RaspberryPi.org

> <sup>🐒 &nbsp; なお「SD Card Copier」は、GUI アプリであるため<font color=blue>「Raspbian Jessie **Lite**」には入っていません</font>。<br>無理やり `sudo apt-get install piclone` でインストールする事はできますが、 `(piclone:xxxxx): Gtk-WARNING **: cannot open display:` エラーが表示されます。X サーバーを入れて VNC で操作するなどの方法もありますが、それであれば標準の（GUI 付きの）`with Desktop` 版をインストールするか、コマンドを使った[他のバックアップ方法](https://www.raspberrypi.org/documentation/linux/filesystem/backup.md)をおすすめします。~~（むしろ[そっち](https://www.raspberrypi.org/documentation/linux/filesystem/backup.md)の方を訳した方がいいだべか？「いいね」×10 で訳そうと思います）~~ → 10 以上いただいちゃったので訳しました。</sup>

> - 「[ラズパイ のコマンド・バックアップと復元の翻訳](https://qiita.com/KEINOS/items/0e14f79d9f98afcfac91)」@ Qiita

▼以下翻訳 

#SD Card Copier

フォーラムで多い質問や問題の１つに「ラズパイをバックアップするベストな方法」があります。また、現在の SD カードにインストールされている Raspbian OS を、より大きいもの、もしくは小さい SD カードに移行する方法を知りたいと考えている人も多くいます。

これまで、過去に推奨していたコマンドラインのツール群では難しくなってきたので、これを支援する新しいアプリケーション「`SD Card Copier`」が追加されました。OS メニューの `[アクセサリ]` から起動できます。

![sdcc.png](https://qiita-image-store.s3.amazonaws.com/0/78776/cfc95b58-356d-3f05-f73c-229e7f506f51.png)

「`SD Card Copier`」アプリは、あるカードから別のカードに Raspbian OS 含め内容を丸ごとコピーします。ぶっちゃけ、これがやれることのほとんどです。

しかし、その結果いくつか便利な利点が生まれます。（ちなみにラズパイから SD カードに書き込むには USB の SD カード・ライターが別途必要です）

#一般的な使用例
既存の（インストール済みの） Raspbian OS をバックアップするにはどうすればよいでしょう？ 

まずは、USB カードライターに空の SD カードを入れラズパイに差し込んで「`SD Card Copier`」を起動します。

![sdcc.png](https://qiita-image-store.s3.amazonaws.com/0/78776/cfc95b58-356d-3f05-f73c-229e7f506f51.png)

「`Copy From Device`」項目から「`Internal SD Card`」を選択し、「`Copy To Device`」項目で USB カードライター（おそらくリストの唯一のデバイス）を選択します。

「`Start`」ボタンを押して画面上のメッセージを見ながら 10〜15 分待つと、新しい SD カードに現在の SD カードのクローンが作成されます。

新しくコピーした SD カードをラズパイの SD カードスロットに入れて起動することでテストできます。おそらく、普通に起動し、元の状態とまったく同じに見えるはずです。また、すべてのデータやアプリケーションも、そのまま使用できるはずです。

このようにバックアップから直接実行することもできますが、元のカードをバックアップから復元（バックアップからリカバリーを）したい場合は、単純に逆の手順（SDカードを入れ替えて同じ手順）を踏みます。バックアップした SD カードでラズパイを起動し、復元したい SD カードをカードライターに入れ、上記の手順を繰り返すだけです。

このプログラムは、オリジナル（復元もと）と同じサイズの SD カードにコピーするだけでなく、既存のものが空き容量を使い果たしている場合、より大きな SD カードにコピーすることができます。逆に、小さな SD カードに保存することもできます。（すべてのファイルを保存するのに十分な容量があればですが。容量が足りない場合は警告が表示されます。）

このアプリは、「Raspbian」と「NOOBS」のどちらのイメージでも動作するように設計されています。他の OS や特殊フォーマット（カスタム・フォーマット）の SD カードでも動作すると思われますが、保証されていません。

唯一の制限は、内部 SD カードリーダーに書き込むことができないことです。それは実行中の OS を上書きするため、予期せぬ悪いことが起こる原因となるためです。

また、リカバリー（復元）先の SD カードのすべてがこのプログラムによって上書きされることにもご留意ください。「Start」ボタンを押す前に、目的のカードに残したいものが何もない（すべてが削除される）ことを確認してくださいね！
GoでWindowsゲーム開発(DxLib)メモ

# GoでWindowsゲーム開発？

GoからDXライブラリを使うのを試してみる。

※DXライブラリ
http://dxlib.o.oo7.jp/

「とりあえずやってみた」レベルで、Goに適した作りになっているとかそういったアレは全くありません。

## ソース
https://github.com/wtetsu/dxlib-go

### ビルド

```
go get golang.org/x/text/encoding/japanese
go build
```

### 結果
画像を読み込んで動かしているだけです。

![ss02.gif](https://qiita-image-store.s3.amazonaws.com/0/106401/e30675fb-9a9d-3ccd-bd95-b7bd9e4cf994.gif)

### メインループ
このような雰囲気。

```Go
dxlib.DxLib_Init()
dxlib.SetDrawScreen(-2)
for {
	if dxlib.ProcessMessage() != 0 {
		break
	}
	dxlib.ClearDrawScreen()

	// something...
	
	dxlib.ScreenFlip()
}

dxlib.DxLib_End()
```


### DxLib関数へのアクセス

DxLib.dllを使います。

```Go
var (
	mod = syscall.NewLazyDLL("DxLib.dll")

	dx_DxLib_Init       = mod.NewProc("dx_DxLib_Init")
	dx_DxLib_End        = mod.NewProc("dx_DxLib_End")
	dx_SetWindowText    = mod.NewProc("dx_SetWindowText")
	//
	// ...
	//
)
```

```Go
func DxLib_Init() int {
	var r, _, _ = dx_DxLib_Init.Call()
	return int(r)
}

func DxLib_End() int {
	var r, _, _ = dx_DxLib_End.Call()
	return int(r)
}

func SetWindowText(newTitle string) int {
	var r, _, _ = dx_SetWindowText.Call(pstr(newTitle))
	return int(r)
}

```

pstrはとりあえず作った便利関数。

```Go
func convertStringToCp932(str string) string {
	r, _, err := transform.String(japanese.ShiftJIS.NewEncoder(), str)
	if err != nil {
		panic(err)
	}
	return r
}

func pstr(str string) uintptr {
	cp932str := syscall.StringBytePtr(convertStringToCp932(str))
	return uintptr(unsafe.Pointer(cp932str))
}
```


これで、DxLib_Init、DxLib_End、SetWindowTextが普通に呼べるようになりました。あとはこれの積み重ねでいける？


サンプルソースでは、以下の関数を使えるようにしてあります。



* dx_ChangeWindowMode
* dx_DxLib_Init
* dx_DxLib_End
* dx_ProcessMessage
* dx_SetWindowText
* dx_DrawCircle
* dx_LoadGraph
* dx_DrawGraph
* dx_DrawExtendGraph
* dx_WaitTimer
* dx_ScreenFlip
* dx_SetDrawScreen
* dx_ClearDrawScreen
【mac】ターミナルを使いやすくしよう

下記の２つの記事でターミナルがいい感じになります。

・ターミナルが非常に見やすくなる
http://www.stdio.jp/entry/mac/terminal-setting#ターミナルの起動方法

・cdでディレクトリ移動後に自動でls
http://qiita.com/b4b4r07/items/8cf5d1c8b3fbfcf01a5d
[クイズ]javascriptと仲良くなるための一歩　第１２話「while」

#問題「AかBを選んでください:hugging_face:」

*A:* **①で無限ループになる**
*B:* **①②で無限ループになる**

```js
while (true)
  "in loop"; // ①
  "not in loop"; // ②
```

:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:

#答え

A

```js
while (true)
  "in loop"; // while文に含まれる
  "not in loop"; // ２行目はwhile文に含まれない
```

ブロック文なしだと"in loop"のみで無限ループになります。
これだと直感的に理解しづらいです。

ブロック文ありだと直感的に理解しやすくなります。

```js
while (true){
  "in loop"; // while文に含まれる
  "not in loop"; // while文に含まれる
}
```
Visual Studio Codeを codeコマンドで立ち上げようとしたら、エラーになったのでその対処

Visual Studio Codeを `$ code` で立ち上げようとすると、エラーになったのでその対処です。

## エラー内容

```bash
$ code .
/usr/local/bin/code: line 6: /usr/bin/python: No such file or directory
/usr/local/bin/code: line 10: ./MacOS/Electron: No such file or directory
```

## 原因と対処

どうやら、 `/usr/bin/python` のPythonを呼び出してるけど、それが僕の環境にはない。
僕は、pyenv でPythonのバージョン管理をしているので、そのせいかなと思います。

そこで、シンボリックリンクを貼ったら解決できました。

- Pythonの場所確認
 
```bash
$ which python
/Users/hoge/.pyenv/shims/python
```

- シンボリックリンク作成

```bash
$ sudo ln -s /Users/hoge/.pyenv/shims/python /usr/bin/python
```

これでOK！

```bash
$ code .
```
ローカル環境のサーバで Webhook を受け取る方法

Slack の Custom Slash Commands とかを開発しようとすると、Slack サーバからの Webhook を受け取れるサーバを用意しないといけないので、ローカル環境のみで開発をすることが難しい。

今回は、SSH のリモートフォワードを利用してリモートサーバで受け取った Webhook をローカル環境のサーバにフォワーディングする仕組みについて書く。

![](https://qiita-image-store.s3.amazonaws.com/0/16369/08684750-3a0c-5b2a-773a-57127b9ecdbb.png)

## 前置き
SSH リモートフォワードを行うと、ローカル環境のサーバがインターネットからアクセスできる状態になるため、開発中のアプリケーションの動作確認等で使う場合は注意して欲しい。

## リモートサーバを立てる
Webhook を受け取ってローカル環境に流すためのリモートサーバを立てる。

インターネットからアクセスできて sshd が動けばあとはなんでも良い。

今回は AWS で Amazon Linux の t.nano インスタンスを立てて、セキュリティグループで `TCP, port: 3000, source: 0.0.0.0/0` のインバウンドトラフィックを許可した。

## テキトーな HTTP サーバをローカル環境に立てる
検証のためにテキトーな HTTP サーバを作る。

ローカル環境で以下のようなテキトーな HTML ファイルを作って、

``` html:index.html
<!doctype html>
<html>
  <body>
    This is local HTML file!
  </body>
</html>
```

Python 3 の HTTP モジュールを使って HTTP サーバを起動する。[^python_http_server]

[^python_http_server]: Python 2 を使う場合は `http.server` の代わりに `SimpleHTTPServer` を使うとできる

``` console
$ python3 -m http.server 4000
```

これでローカル環境から http://localhost:4000/ でページにアクセスできるようになったと思う。

## SSH トンネルを作る
SSH トンネル (ポートフォワーディング) には「ローカルフォワード」と「リモートフォワード」の二種類があり、今回の用途では「リモートフォワード」を利用する。

ポートフォワーディングについては以下の記事が詳しい。
[sshポートフォワーディング - Qiita](http://qiita.com/mechamogera/items/b1bb9130273deb9426f5)

リモートフォワードをするコマンドはこんな感じ。

``` console
$ ssh -R 3000:localhost:4000 -N <user>@<host>
```

`-N` は「SSH 接続時にコマンドを実行しない」オプション。
バックグラウンドで起動したい場合は `-f` オプションを追加する。

`-R` オプションでリモートフォワードの設定をしていて、この場合は「リモート側のポート `3000` をローカル側の `localhost:4000` にフォワーディングする」という意味になる。

### sshd の GatewayPorts を設定する
sshd のデフォルト設定では、リモートフォワード時にループバックアドレス `127.0.0.1` がバインドされるため[^man_sshd_config]、このままではインターネットからアクセスすることができない。

[^man_sshd_config]: `man sshd_config` の `GatewayPorts` の項目を参照

リモートフォワード時のバインドアドレスを変更するには sshd の GatewayPorts の設定を変更する。

| GatewayPorts の値 | 効果 |
|---|---|
| yes | ワイルドカードアドレス `0.0.0.0` をバインドする |
| clientspecified | バインドアドレスをクライアント側で指定できる |
| no (default) | ループバックアドレス `127.0.0.1` をバインドする |

Webhook が飛んでくるアドレスが分かっているなら `clientspecified` を指定してそのアドレスのみをバインドすることでよりセキュアにできると思うが、Slack API の場合は IP Range が固定されていない[^slack_ip]とのことなのでこの方法は使えなかった。

開発中のサーバがインターネットに晒されることをそれほど気にしないのであれば `yes` を指定すれば問題ない。

設定を変更したあとは sshd を再起動する。

## インターネットからアクセスしてみる
`http://<リモートサーバ>:3000/` にアクセスしてみて、ローカル環境のサーバに繋がれば正常にリモートフォワードできている。

[^slack_ip]: https://twitter.com/slackapi/status/567110311476350976

[追記] 時間が経つとアクセスできなくなってしまう場合は sshd 側で ClientAliveInterval を設定すると良い。
learnjs で livereload を有効にする

## TL;DR

[learnjs](https://github.com/benrady/learnjs) とは、[サーバレスシングルページアプリケーション](https://www.oreilly.co.jp/books/9784873118062/) で題材として使われている、 Prepared Workspace です。

本書では、 [LiveReload](http://livereload.com/) か [LivePage](https://chrome.google.com/webstore/detail/livepage/pilnojpmdoofaelbinaeodfpjheijkbh?hl=en) が推奨（？）されているのですが、どちらも（安価な）有償ソフトウェアなのでとりあえず試してみるには少し敷居が高いとも言えます。

ラッパースクリプトである [sspa](https://github.com/benrady/learnjs/blob/master/sspa) を読んでみると

```js
function livereload_server() {
  cd public
  exec livereloadx -s -p 9292 "$PWD"
}
```

というのがあり、 [livereloadx](http://nitoyon.github.io/livereloadx/) も本書で触れられていますが、ブラウザ拡張のインストール方法が公式サイトからリンク切れになっており、不明でした（ストアにももうない模様？）。

そこで [LiveReload](http://livereload.com/) のブラウザ拡張と互換のある [livereload](https://www.npmjs.com/package/livereload) を使ってみることにしました。

## 導入方法

1. （本書で説明されているとおり） [learnjs](https://github.com/benrady/learnjs) を fork してクローン
2. `cd <learnjs をクローンしたディレクトリ>`
3. `server.js` を用意（下の方に掲載）
3. `npm init`
    - ライセンス以外はデフォルト回答でOK
    - ライセンスは「MIT」を入力
4. `npm install --save-dev connect serve-static livereload`
5. `echo package-lock.json >> .gitignore`
6. `echo node_modules >> .gitignore`
7. `git add .gitignore package.json server.js`
8. `git commit -m 'Added livereload-enabled server'`
9. [How do I install and use the browser extensions?](http://livereload.com/extensions/) から必要なブラウザ拡張をインストール
10. `npm start`
11. http://localhost:9292 にアクセス


```js:server.js
var connect  = require('connect');
var static = require('serve-static');

var server = connect();
   
server.use(static(__dirname + '/public'));
server.listen(9292);

var livereload = require('livereload');
var server = livereload.createServer();
server.watch(__dirname + "/public");
```
eclipseの半角スペース表示をuから・に変更する


## eclipseバージョン

バージョンによって変わるかも知れないので、試したバージョンを記載しておく。

* Eclipse 4.7 Oxygen

## 半角スペース表示をuでなくす

数年ぶりにeclipseを使用して、半角スペース表示をONにしたところ、"u"の文字に置き換わっていた。
非常に見づらかったので、変更方法を備忘録として残しておく。

以下へ編集するだけ。

```Bash
vim [eclipseインストールパス]/plugins/jp.sourceforge.mergedoc.pleiades/conf/pleiades-config.xml
$3	= $3.equals("·"  ) ? "ᴜ"		// 半角空白 例：▫ᵁᐡᶸᓑᴜՍ
↓
$3	= $3.equals(""  ) ? "ᴜ"		// 半角空白 例：▫ᵁᐡᶸᓑᴜՍ
```

## 日本語使用フォント

日本語の等幅フォントをいつも忘れるので、ついでにメモ。

* 「DejaVu Sans Mono Book」を使う。

## 参考URL

http://arimodoki.dip.jp/promenade/e_neon_inst.html
tmux 2.5 で、「コピーモード」をキーバインドのターゲットにできるようになった

互換性の無い変更。

    bind -temacs-copy C-Up scroll-up
    bind -temacs-copy -R5 WheelUpPane scroll-up

は

    bind -Tcopy-mode C-Up send -X scroll-up
    bind -Tcopy-mode WheelUpPane send -N5 -X scroll-up

に変えましょう。

https://github.com/tmux/tmux/blob/master/CHANGES#L183
Memo (1-1/n)^n の極限

```math
\begin{align}
  \lim_{n \to \infty} (1-1/n)^n  \lim_{n \to \infty} (1+1/n)^n
   &= \lim_{n \to \infty} (1-1/n^2)^n \\
   &= 1
\end{align}
```

よって　$\lim_{n \to \infty} (1-1/n)^n = \left(\lim_{n \to \infty} (1+1/n)^n\right)^{-1} = \mathrm{e}^{-1}$

微妙だ、、、
忘備録 リストの並び替えについて

#忘備録ですがリストの並び替えについて

lst.sort(key = lambda x:x[0])
→0番目の要素でソートする

lst.sort(key = lambda x:(x[0],x[1]))
→0番目の要素でソートしてから1番目の要素でソートする

lst.sort(key = lambda x:(x[0],x[1]),reverse = True)
とreverseを付けることで逆順にしたりしなかったりできる。

にしてもlambda式まだ全然よくわかっていないから毎日↑の並び替え書いて暗記するしかないかなぁ。
「Python 機械学習プログラミング」まとめノート(Jupyter)

## はじめに
「達人データサイエンティストによる理論と実践 Python 機械学習プログラミング」という本の評判が良かったので読みました。
https://www.amazon.co.jp/dp/B01HGIPIAK/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

その際に、後から復習できるようにJupyter Notebooksのノートファイルにまとめノートを作りながら学習を進めていきました。その時のまとめノートをせっかくなので共有したいと思います。特に重要だと思ったポイントや、ちょっとした補足を追加して、「この手法、scikit-learn使ってどんな風に書くんだっけ？」の備忘録として使えるように書きました。ただ、省略してる部分も多いので適宜元の本を見て補ってもらえると幸いです。あと1,2,8,9,12,13章についてはノートを作っていません。（ディープラーニングは専用の本がいっぱいあるのでそっちで勉強するのが良いかも）

Python 機械学習プログラミングのまとめノート(Jupyter)
https://github.com/lyakaap/notebooks/tree/master/MachineLearning

Readmeを見れば一応どのファイルにどの内容が書かれているかが分かるようになっています。

## 本の感想
機械学習手法の大切な部分を一通り学べて、かつ説明がとても丁寧に書かれていてオススメ出来る本です。前提知識として、ほんの少しの数学とnumpyの知識があると比較的スラスラと読めると思います。特に、scikit-learnはもちろん、pandasやmatplotlibなどの機械学習に必要なライブラリの扱いを、ソースコードを通して学習できるという面がとても魅力的に感じました。
Synologyでlocateを使う。

# 前提
- opkgを使えること。

# 使うまで
```
インストール
$ sudo opkg install mlocate

まだ使えない
$ locate hogehoge
locate: can not stat () `/opt/var/mlocate/mlocate.db': No such file or directory

updatedbするが、できない
# updatedb
updatedb: can not find group `mlocate'

mlocateグループの追加
# synogroup -add mlocate

mlocateグループへ設定
# chmod g=rx,o= /opt/var/mlocate
# chgrp mlocate /opt/bin/locate
# chmod g+s,go-w /opt/bin/locate
# touch /opt/var/mlocate/mlocate.db
# chgrp mlocate /opt/var/mlocate/mlocate.db

updatedb
# updatedb

使える
$ locate hogehoge
```

# 参考文献
How to fix “updatedb: can not find group ` mlocate'” on entware?
https://unix.stackexchange.com/questions/328510/how-to-fix-updatedb-can-not-find-group-mlocate-on-entware
Ruby 定数

定数は先頭文字が大文字のものである。
ただしRubyの場合は値の変更が可能となっている。

```ruby:定数の変更が可能
CONST = "定数です"
p CONST

CONST << " 追加"
p CONST
```

```:実行結果
"定数です"
"定数です 追加"
```

普通にできちゃう。
定数に対して`freeze`をつけることで変更を防げる。

```ruby:定数の変更を不可
CONST = "定数です"
p CONST

CONST.freeze

CONST << " 追加"
p CONST
```

```:実行結果
"定数です"
in `<main>': can't modify frozen String (RuntimeError)
```

ただ再代入はできる模様

```ruby:再代入はできちゃう
CONST = "定数です"
p CONST

CONST.freeze

CONST = "定数です 追加"
p CONST
```

```:実行結果
"定数です"
warning: already initialized constant CONST
warning: previous definition of CONST was here
"定数です 追加"
```

注意されるが再代入が行われる。
これを防ぐにはmoduleにして、moduleごと`freeze`を行う

```ruby:再代入も防ぐ
module Teisuu
  CONST = "定数です"
end
p Teisuu::CONST
Teisuu.freeze

Teisuu::CONST = "定数です 追加"
p Teisuu::CONST
```

```:実行結果
"定数です"
in `<main>': can't modify frozen Module (RuntimeError)
```
Ubuntu16.04 LTSにDocker CEをインストールする。

# Docker CE
Docker EE(Enterprise Edition)の登場によって、無料版はDocker CE(Community Edition)として登場しました。
自宅サーバのリプレイスに伴って、Docker CEのインストールを行います。
基本的な手順は下記を参考にします。
https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/

# Dockerインストール前にやること

- aptのインデックスを最新にします。

``` 
$sudo apt update
```

- httpsでapt を使えるようにします。

```
$sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
```

- Dockerの公式GPG　keyを追加

```
$curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```

- fingerprintを確認する。

```
$sudo apt-key fingerprint 0EBFCD88

pub   4096R/0EBFCD88 2017-02-22
      Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid                  Docker Release (CE deb) <docker@docker.com>
sub   4096R/F273FCD8 2017-02-22
```
- repositoryの追加

```
$sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
```
- apt updateする

```
$sudo apt-get update
```

# Docker CEのインストール

準備が終わっていれば、下記コマンドでDockeCEのインストールを行います。

```
$sudo apt-get install docker-ce
```

インストール後の確認

```
$sudo docker --version

Docker version 17.06.0-ce, build 02c1d87
```

試しにhello-worldコンテナを起動

```
$sudo docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b04784fba78d: Pull complete
Digest: sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/
```

Hello from Dockerが表示されれば、DockerCEのインストールとDocker Engine上でhello-worldコンテナが動いており、インストールは完了です。

# おまけ
もうhello-worldコンテナがいらないときは下記で削除します

```
$ sudo docker rmi -f hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f
Deleted: sha256:1815c82652c03bfd8644afda26fb184f2ed891d921b20a0703b46768f9755c57
```

これで作業は完了です。
時系列解析メモ。標本自己相関係数、自己相関検定、かばん検定について

時系列解析について、個人的に習いたいと思ったのでそのためのメモ。

有名な沖本竜義さんの「計量・ファイナンスデータの計量時系列分析（朝倉書店）」の各章の中から、
個人的に気になった箇所をピックアップして、Rでどのように実行していくかを確認していきたいと思います。

第一章から、

- 標本自己相関係数
- 自己相関の検定
- かばん検定

の３つをRでどのように行うかを確認します。

Rのバージョン：`3.3.2`
です。

### 標本自己相関係数と自己相関の検定について
標本自己相関係数は`acf()`を使います。参考サイトの4.2節より、
```acf(x, type="correlation")```
引数の`x`のデータ型はベクトルでもマトリクスも可能。typeには`"correlation"`の他に"covariance"、"partianl"も可能で、標本共分散を計算します。
実行すると、結果をプロットしてくれます。
任意のk次の標本自己相関係数を計算してくれます。


### かばん検定について
かばん検定は`Box.test()`を利用します。
`x`に1次元の時系列データが格納されているとして、
```
lag=round(log(length(x)))
Box.test(x, lag = lag, type = "L")
```
で検定を行う事ができます。

参考サイト：https://cran.r-project.org/doc/contrib/manuals-jp/Mase-Rstatman.pdf
rails5 APIモードでindex.htmlを配信する

rails5 APIモードでindex.htmlを配信するための方法をまとめました。

# 前提

* `rails5.1.2`を利用。
* nginxやCDNを使わずにrails内でソース管理したい。
* URL設計も`routes.rb`で行いたい。

[2020.5.10追記]
`render file: パス指定`により動いているものだと思ってましたが、私の勘違いでした:bow_tone1:
URLと公開ディレクトリを一定のルールで構成すれば、railsのmiddlewareが規約通りにサーブしてくれるようです。
`config.public_file_server.enabled`がtrueに設定されていると、publicディレクトリ以下に置かれているすべてのファイルをwebサーバにマウントします。そして、一定のリクエストURLルールにしたがって、publicディレクトリ配下のファイルをレスポンスしているとのことです。例えば、`public/about.html`が存在していれば`http://localhost:3000/about`のリクエストに対して反応します。
詳しくは@daido1976さんのコメントをご覧ください。

# APIモードでhtmlを配信する

静的ページ専用のコントローラーを用意する。
renderメソッドに`file`キーを明示して静的ファイルのパスを直指定する。

```ruby:StaticPagesController.rb
class StaticPagesController < ApplicationController
  def index
    render file: 'public/index.html'
  end
end
```

```ruby:application_controller.rb
class ApplicationController < ActionController::API
end
```

routes.rb は以下で検証した。

* `match '*all', to: 'static_pages#index', via: [:get]`
* `root 'static_pages#index'`
* `get  '/index',   to: 'static_pages#index'`

# （寄り道）fileをつけなくても良いパターン

ルートで紐付けたcontroller#actionだと`file`キーを付けなくてもいける。
html1枚だけ配信したいケースならこれで事足りる。

```ruby:routes.rb
root 'static_pages#index'
```

```ruby:StaticPagesController.rb
class StaticPagesController < ActionController
  def index
    render 'public/index.html'
  end
end
```

(注) `render file:`を`render`だけにしている。

パス指定すると、renderだけだと`views`配下を見にいくので、`ActionView::MissingTemplate`が発生する。

```ruby:routes.rb
  get  '/index', to: 'static_pages#index'
```

```ruby:StaticPagesController.rb
同上
```

結果

```
Missing template public/index.html 
with {:locale=>[:ja], :formats=>[:html], :variants=>[], 
:handlers=>[:raw, :erb, :html, :builder, :ruby, :jbuilder]}. 
Searched in: * "(...)/app/views"
```

# SPAが動いていない時のケア

不幸にもSPAが管理しているURLなのに、ブラウザが拾ってサーバにGETリクエストを飛ばしてしまうケースは発生する。

- ブラウザのアドレスバーに直接入力した
- ユーザーがブラウザのキャッシュをクリアした
- 特定のURLをいつものwebサービスのようにブクマするなりシェアした

SSR（ServerSideRedering）をしていればまた話は変わるが、そうでなければ以下のようにケアしておく。途中に置くと以降のルートに流れなくなるので、末尾に記載する。

```ruby:routes.rb
  get '*path', to: redirect('/')
```

（追記）SPAのURLのままシェアする方法を[別記事](https://qiita.com/studioTeaTwo/items/f8423f0671709ad31508)でまとめました。

# 他のhtmlファイル

サイト紹介のためのabout/contactらも同じように配信できる。

```ruby:routes.rb
  get  '/about', to: 'static_pages#about'
  get  '/contact', to: 'static_pages#contact'
```

# 他のJSファイルやCSSファイル

* ルート直下に`public/assets`フォルダを用意するなり。
* フロントでビルドする
* ビルドしたファイルをコピーする

# 参考
[How to render file in Rails 5 API?](https://stackoverflow.com/questions/43911928/how-to-render-file-in-rails-5-api)
ESLint v4.3.0

前 [v4.2.0] | 次 [v4.4.0]

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">ESLint v4.3.0 has been released: <a href="https://t.co/HhnHNflI9C">https://t.co/HhnHNflI9C</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/888435679352557568">2017年7月21日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint 4.3.0 がリリースされました。
小さな機能追加とバグ修正が行われています。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

> 🏢 [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
> 👫 [日本語サポート チャット](https://gitter.im/eslint/eslint-jp)
> 🏢 [本家リポジトリ](https://github.com/eslint/eslint)
> 👫 [本家サポート チャット](https://gitter.im/eslint/eslint)

# 🚀 本体への機能追加

今回はありません。

# 🔧 オプションが追加されたルール

## [#7234]: [no-underscore-dangle] `enforceInMethodNames`

クラス・オブジェクトのメソッド名について、アンダーバーで始まる/終わる名前を禁止するオプションが追加されました。

```js
/* eslint no-underscore-dangle: [error, {enforceInMethodNames: true}] */

//✔ GOOD
class A {
    hello() {}
}
let b = {
    hello() {}
}

//✘ BAD
class C {
    _hello() {}
}
let d = {
    _hello() {}
}
```

## [#8796]: [prefer-destructuring] `VariableDeclarator` / `AssignmentExpression`

変数宣言の場合と代入式の場合で設定を分けるためのオプションが追加されました。

```js
/* eslint prefer-destructuring: [error, {
    AssignmentExpression: {array: false, object: false},
    VariableDeclarator: {array: true, object: true}
}] */

//✔ GOOD
let {a, b} = obj
a = obj.a
b = obj.b

//✘ BAD
let c = obj.c
let d = obj.d
```

## [#8932]: [no-restricted-globals] `message`

禁止するグローバル変数毎に別々のエラーメッセージを表示できるようになりました。

```js
/* eslint no-restricted-globals: [error,
    {name: event, message: "Use local parameter instead."},
    {name: name, message: "Use 'window.name' instead."},
] */

//✘ BAD
function onClick() {
    event.preventDefault() // Use local parameter instead.
}
```

# ✒️ `eslint --fix` をサポートしたルール

今回はありません。

----

[v4.2.0]: http://qiita.com/mysticatea/items/9e7254cb2b10032dd79a
[v4.4.0]: http://qiita.com/mysticatea/items/923ed52b83b41b0b07f2
[#7234]: https://github.com/eslint/eslint/issues/7234
[#8796]: https://github.com/eslint/eslint/issues/8796
[#8932]: https://github.com/eslint/eslint/issues/8932
[#9999]: https://github.com/eslint/eslint/issues/9999
[no-restricted-globals]: http://eslint.org/docs/rules/no-restricted-globals
[no-underscore-dangle]: http://eslint.org/docs/rules/no-underscore-dangle
[prefer-destructuring]: http://eslint.org/docs/rules/prefer-destructuring
[xxxx]: http://eslint.org/docs/rules/xxxx


<!-- 
![JSCS Icon](http://jscs.info/favicon.ico) JSCS 互換ルールです。
-->
GeneratorExitを捕捉してジェネレータ側からイテレーションの終了を検知する

イテレータそのものは`break`等で最後まで回らない可能性があるけど、ジェネレータ内部のイテレーションは最後まで回したいという場合がまれにある。

# うまくいかない例
例として次の`range_printsum`は`range`関数にその範囲の総和をprintする処理を追加したものだ。

```py3:gen.py
def range_printsum(*args, **kwargs):
    sum_ = 0

    for i in range(*args, **kwargs):
        sum_ += i
        yield i

    print(sum_)
```

このジェネレータ実装ではイテレーションを途中で止めてしまうと、`sum_`に格納されるのは実際に`yield`した数の合計だし、そもそも`sum_`は出力されない。

```py3
>>> from gen import range_printsum
>>> for i in range_printsum(11):
...     pass
...
55
>>> for i in range_printsum(11):
...     if i > 5:
...         break
...
>>>
```

# うまくいく例
そこで`GeneratorExit`を捕捉する。これはジェネレータが閉じられた（ジェネレータの`close()`が呼ばれた）時に送出される。これは`for`等のループが中断された場合でも捕捉できる。
`GeneratorExit`を捕捉した後は値を返さず、加算だけ行うよう`range_printsum`を修正する。

```py3:gen.py
def range_printsum(*args, **kwargs):
    sum_ = 0
    stop_yield = False

    for i in range(*args, **kwargs):
        sum_ += i
        if not stop_yield:
            try:
                yield i
            except GeneratorExit:
                stop_yield = True

    print(sum_)
```
今度は期待通りに動く。

```py3
>>> from gen import range_printsum
>>> for i in range_printsum(11):
...     pass
...
55
>>> for i in range_printsum(11):
...     if i > 5:
...         break
...
55
>>>
```
このように中断しても動く。

```py3
>>> try:
...     for i in range_printsum(11):
...         if i > 5:
...             raise IndexError
... except IndexError:
...     pass
...
55
>>>
```

ジェネレータの仕様による注意点として、一度閉じられたジェネレータは値を生成してはならない。`GeneratorExit`を捕捉した後に何らかの値を`yield`すると`RuntimeError: generator ignored GeneratorExit`というエラーが発生する。
Updates were rejected because the tip of your current branch is behind となる場合

ぼくは以下のようなエラーに遭遇することがなんどかあった。

```bash
$ git push origin piyo
To https://github.com/mochizukikotaro/sample.git
 ! [rejected]        piyo -> piyo (non-fast-forward)
error: failed to push some refs to 'https://github.com/mochizukikotaro/sample.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

#### ちなみにこのようになるのは、

master->piyo => PR だしてある
master->piyo2 => あとから PR だして、先にマージする

などの流れをやったときなどです。

#### このときに、`(e.g. git pull ...) などと書かれてるけど


```bash
$ git fetch origin
$ git pull rebase origin/piyo
#=> conflict が GitHub 上で発生するので、以下。

$ git merge master
#=> fix conflict
$ git push origin piyo
```

これで、事なきを得るのですが。あっているのか...

なんか間違ってる気がする..。

:moyai:
スライダーを動かしてプロットを操作する方法：GUI 作成

MATLABでのGUI作成に関する小ネタです。


使用環境: MATLAB R2017a
使用したツールボックス: n/a


## 課題
時間変化がある２次元プロットで時間変化を見たい、３次元データのスライスプロットを描く際にスライス位置を移動させて描画したい。そんな時に便利なスライダーで操作をMATLABで実装してみたいと思います。

MATLABのQ&Aサイト[MATLAB Answers](https://jp.mathworks.com/matlabcentral/answers/index?s_eid=PSM_29435)にも投稿がありますが、スライダーバーを操作して描画をいじる方法は意外と奥が深い。スライダーを操作する場合、[uicontrol](https://jp.mathworks.com/help/matlab/ref/uicontrol-properties.html?s_eid=PSM_29435) に指定する Callback 関数はスライダーをマウスで移動させ**終わった**ときにしか実行されないので、スライダーをマウス移動させながらプロットを変化させたい場合には使えない。。

マウスがクリックされた状態の場合に処理を実施できる WindowButtonMotionFcn で実現も可能でばあるけどもあまり美しくない。。
参考：[スライダーを動かして​、マウスを押したまま​の状態でグラフ位置を​調整するなどの処理を​入れることは可能でし​ょうか？](https://jp.mathworks.com/matlabcentral/answers/103562-?s_eid=PSM_29435)

## addlistener
ここでは [addlistener](https://jp.mathworks.com/help/matlab/ref/handle.addlistener.html?s_eid=PSM_29435)を使ってみます。詳細は [イベントとリスナーの概要](https://jp.mathworks.com/help/matlab/matlab_oop/learning-to-use-events-and-listeners.html?s_eid=PSM_29435)に説明されていますので省略しますが、要はスライダバーが変化したという**イベント**を検知して、プロットを変化させる処理を逐次実行します。この機能を使ってスライダーバーの操作を動的にプロットに反映させてみます。
データは[スカラー ボリューム データの可視化の技法](https://jp.mathworks.com/help/matlab/visualize/techniques-for-visualizing-scalar-volume-data.html?s_eid=PSM_29435)で使われている「人の頭部の 27 個のイメージ スライスである一組の MRI データセット」を使っています。MATLABに入ってるデータなので、このままコピペで実行できるはず。
![scalarDataWithSlider.jpg](https://qiita-image-store.s3.amazonaws.com/0/149511/335e4e59-ce3b-45c9-3913-aef157cce746.jpeg)



```m

% データ読み込み
load mri
D = squeeze(D);

% Plot
figure(1)
[~,handle_surf] = contour(D(:,:,1));
title('スカラー ボリューム データの可視化');

% スライダーバー作成
handle_slider = uicontrol('Style','slider','Position',[10 50 20 340],'Min',1,'Max',27,'Value',1);

% イベントリスナーの作成
addlistener(handle_slider,'Value','PostSet',@(event,obj) update(event,obj,D,handle_surf,handle_slider));

% 描画のアップデート処理用関数

function update(event,obj,D,handle_surf,handle_slider)
index = round(handle_slider.Value);
handle_surf.ZData = double(D(:,:,index));
end
```
指定したモジュールが見つかりません

#Composerのインストール

ちょっと引っかかったのでメモ書き。

##php.iniでモジュールを重複して読み込んでるのが原因
今回、自分が引っかかったのは2つ。
```php.ini
extension=php_mysqli.dll
```
これは前回、挙げた開発環境の構築の記事でこの行を追加してねってことで元々あるやつを重複して書いたために**指定したモジュールが見つかりません**ってゆーエラーが出てたみたい。他のモジュールでも同様で人によってはPDO関連のモジュール重複読み込みで同エラーが出てたりするみたい。

それと

##msql.soって何…
```php.ini
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;

; If you wish to have an extension loaded automatically, use the following
; syntax:
;
;   extension=modulename.extension
;
; For example, on Windows:
;
;   extension=msql.dll
;
; ... or under UNIX:
;
;   extension=msql.so
;
; ... or with a path:
;
;   extension=/path/to/extension/msql.so
```
真ん中あたりの　　*extension=msql.so*　　←これ、コメントアウトしないとComposerのインストール時に引っかかる。環境構築をXAMMPでインストールしてたら多分、エラーは発生しないんじゃないかな。

一応、PHPマニュアルにmsqlは存在するが果たしてmysqlの記述間違いなのか
http://php.net/manual/ja/book.msql.php
自分には解りません・・・
[Python]AWS Lambdaでのリトライ処理(Exponential Backoff)のメモ

Lambdaファンクション内でのリトライ処理ってどうしたら良いものか？と思い調べてみたメモです。

Lambdaでのリトライ処理については以下のスライドが参考になりました。

* [AWS Lambda x Python - Error Handling から Test, CI まで](https://www.slideshare.net/iktakahiro/aws-lambda-x-python-error-handling-test-ci)

また、Exponential Backoffについては以下の記事が詳しいです。

* [AWSユーザーは必ず覚えておきたいExponential Backoffアルゴリズムとは何か](http://yoshidashingo.hatenablog.com/entry/2014/08/17/135017)

## 実際に書いてみる
LambdaファンクションはAWS Chaliceで書きます。(リトライ処理はChaliceで無くても問題なくできます。)
リトライについては、以下のライブラリを利用してみます。

* [rholder/retrying](https://github.com/rholder/retrying)

```
$ pip install retrying
```

他にも[retry](https://github.com/invl/retry)というものもあり、同様に簡単にリトライ処理ができるようです。

```app.py
from chalice import Chalice                                                                                                                    
from datetime import datetime
from retrying import retry
import boto3
from botocore.exceptions import ClientError

app = Chalice(app_name='exponential-backoff')

def retryIfClientError(exception):
    print(datetime.now().strftime("%Y/%m/%d %H:%M:%S"))
    print('retrying...')
    # Falseを返すまで再試行をする
    return isinstance(exception, ClientError)

# retry_on_exception: 特定のException拾うため
# stop_max_attempt_number: 試行回数
# wait_exponential_multiplier: 乗数
@retry(retry_on_exception=retryIfClientError, stop_max_attempt_number=3, wait_exponential_multiplier=1000)
def retryS3Test():
    s3 = boto3.resource('s3')
    client = s3.meta.client
    response = client.get_object(Bucket='mybucket', Key='存在しないかもしれないファイル')

@app.route('/')
def index():
    retryS3Test()
```

```requirements.txt
retrying==1.3.3
```

chaliceのプロジェクトをdeployしてEndpointを叩くと、CloudWatchLogに以下の様なログが出て再試行されてるのがわかるはずです。

![スクリーンショット 2017-07-29 18.40.38.png](https://qiita-image-store.s3.amazonaws.com/0/121487/48fc23d0-d5b1-ea5a-f877-87f6ca5c11c4.png)
【Go】gonum/matrixでの行列の扱い【機械学習のために】

以下の記事は自身のブログ[Data Science Struggle](https://marubon-ds.blogspot.jp/)でも掲載予定。許可なき掲載とかではない。


#概略
gonum/matrixでの行列の扱いについてまとめる。 
Goでの機械学習パッケージのソースを読んでみるとgonum/matrixが使用されていたが、gonum/matrixによる行列操作について調べてみてもどうにも説明がわかりにくかったので備忘録がてらまとめていく。 

#gonum/matrixとは
Goから使用できる行列計算のパッケージ。内部ではBLASとLAPACKをあたっている。 

#インストール

```bash
go get github.com/gonum/matrix
```

コメントでご指摘いただき、以下のインストールが必要。

```bash
go get github.com/gonum/floats
```

#具体的な使用方法
##行列の作成
行列の作成は、mat64.NewDense()で行う。

```go
//全ての要素を0で行列作成
zero := mat64.NewDense(3, 5, nil)

//スライスデータを行列に変換
data := make([]float64, 36)
for i := range data{
    data[i] = float64(i)
}
data_matrix := mat64.NewDense(6,6,data)
```

上のコードで、最初の例では、3行5列、要素は全て0の行列を作成している。 
これを出力してみると以下のようになる。 

```go
fmt.Println(zero)

&{{3 5 5 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]} 3 5}
```

次の例では、最初にスライスデータを作成し、それを行列に変換している。 
出力を行うと以下のようになる。 

```go
fmt.Println(data_matrix)

&{{6 6 6 [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35]} 6 6}
```

行列は、初期値を与えての作成とスライスデータから変換によって作成することができる。 

##行列要素へのアクセス
作成した行列の要素にアクセスするにはAt関数で行列の行と列を指定することで行える。 

```go
fmt.Println(data_matrix.At(0,1))

1
```

指定した行を取り出す。

```go
fmt.Println(data_matrix.RowView(3))

&{{1 [18 19 20 21 22 23]} 6}
```

##行列演算
行列の計算は、計算結果を受け取る行列を作っておいて、以下のようにして行う。 

```go
a_elements := []float64{1,2,3,4}
b_elements := []float64{5,6,7,8}
c_elements := make([]float64, 4)

a_matrix := mat64.NewDense(2,2,a_elements)
b_matrix := mat64.NewDense(2,2,b_elements)
c_matrix := mat64.NewDense(2,2,c_elements)

fmt.Println("a_matrix")
fmt.Println(a_matrix)
fmt.Println("b_matrix")
fmt.Println(b_matrix)

c_matrix.Add(a_matrix, b_matrix)
fmt.Println("a_matrix + b_matrix")
fmt.Println(c_matrix)

c_matrix.Sub(a_matrix, b_matrix)
fmt.Println("a_matrix - b_matrix")
fmt.Println(c_matrix)

c_matrix.Mul(a_matrix, b_matrix)
fmt.Println("a_matrix * b_matrix")
fmt.Println(c_matrix)
```
出力結果は以下のようになる。 

```
a_matrix
&{{2 2 2 [1 2 3 4]} 2 2}
b_matrix
&{{2 2 2 [5 6 7 8]} 2 2}
a_matrix + b_matrix
&{{2 2 2 [6 8 10 12]} 2 2}
a_matrix - b_matrix
&{{2 2 2 [-4 -4 -4 -4]} 2 2}
a_matrix * b_matrix
&{{2 2 2 [19 22 43 50]} 2 2}
```

#参考サイト
* [GoDoc](https://godoc.org/github.com/gonum/matrix/mat64#Dense.RowView)
Ruby上でササッとSendGridのTemplateを使う

メールの本文自体をSendGrid上でTemplateとして管理し、送信をアプリケーション側からやる方法。

```ruby:mailsender.rb
require "sendgrid-ruby"

_options = JSON.parse({
  template_id: "d6e5d510-2619-43ba-bfd6-b6c69b83b8fc",
  personalizations: [
    to: [
      { email: "saruo@example.ne.jp" }
    ],
    substitutions: {
      "[%name%]": "Saruta Saruo"
    }
  ],
  from: {
    email: "ec@company.co.jp"
  }
}.to_json())

sendgrid = SendGrid::API.new(api_key: "** Your API Key **")
sendgrid.client.mail._("send").post(request_body: _options)
```
`substitutions`というオブジェクトは、本文に含まれるなんらかのキーを送信時にリプレースするためのもの。ちなみに、`from`と`personalizations`のなかの`to`は必須らしい。

**追記**
`substitutions`は基本的にキー・バリューのフォーマットをとるが、ひとつでも文字列ではない数値などが渡ると、エラーの内容が全部NULLの400 Bad Requestを返してくる。詳しくはDocsのエラーの項目を参照するとよい。
https://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/errors.html
Gitの過去コミットから検索するには


## 過去コミットから検索する
### チェックアウトしているブランチで

```
git rev-list HEAD | xargs git grep '検索文字列'
```

### ブランチ指定

```
git rev-list ブランチ名 | xargs git grep '検索文字列'
```

### 全ブランチから

```
git rev-list --all | xargs git grep '検索文字列'
```

## オプション指定
### 正規表現

```
git rev-list --all | xargs git grep -e '正規表現'
```

### and,or,not条件
複数キーワードでAND,OR,NOT検索したい場合、

```
git rev-list --all | xargs git grep -e '検索文字列1' --and -e '検索文字列2'
```

これで、２つの検索文字列を同時に含む行が出力されます。
--or, --not も一緒に使えます。


### 前後行出力指定

検索文字列を含む前後10行を表示したい場合。

```
git rev-list --all | xargs git grep -10 '検索文字列'
```

### 見やすくしてみる
ファイル名を先頭に出力して、各行に行番号を出力する。

```
git rev-list --all | xargs git grep --heading --line-number -10 '検索文字列'
```
Rails勉強 | ラジオボタンの結果受け取りをましな書き方に。

夏休みの宿題としてアプリケーションを作り上ったのですがとても汚く。。。
新たな夏休みの宿題として、コードを少しでもきれいにしていきたいと思います。
初心者のため、正しいやり方、きれいなやり方があればご指摘いただけると幸いです。現時点でのベストのものを書いてみます。

# 環境
ruby 2.3.0p0
Rails 5.0.3

# 背景
Viewでラジオボタンを5つ用意（radioX）して、Controllerで結果をそれぞれ配列に取得。

# 改善箇所
Controller

# 直します
#### イケてない
``` ruby:
def test_result
    answer_array = Array.new

    answer_array << params[:radio1]
    answer_array << params[:radio2]
    answer_array << params[:radio3]
    answer_array << params[:radio4]
    answer_array << params[:radio5]
:
```
#### まし
``` ruby:
  def test_result
    answer_array = Array.new

    (1..5).map {|i| answer_array << params["radio#{i}".to_sym]}
```
#### 学習内容
- .mapで(1..5)をブロック内に展開して、radioの番号に利用
- \#{}で変数を文字列に展開
- to_symで文字列をシンボルに変換

こつこつ勉強していきたいと思います。

# 参考URL（感化されました。）
[Rubyのリファクタリングでイケてないコードを美しいオブジェクト指向設計のコードへ改良するための方法](http://qiita.com/jabba/items/e169adb2f33532c119cf)
DEPRECATION: Please use `require('serialport')` instead of `require('serialport').SerialPort`のエラーについて

# 概要 

node-serialportのv4.X以上の話。確認したときのversionは5.0.0-beta8です。


node-serialportを使用して以下のようなコードを実行すると非推奨とメッセージが出る。

```sample1.js
var SerialPort = require('serialport');
var port = new SerialPort.SerialPort('/dev/ttyUSB0', {
  baudRate: 115200
});
```
~~~
//出力結果
DEPRECATION: Please use `require('serialport')` instead of `require('serialport').SerialPort`
~~~




GitHubを見るとUpgrading from 3.x to 4.xに非推奨と書かれている。
>Requiring serialport now returns the SerialPort constructor function instead of a factory object. SerialPort.SerialPort is now deprecated.






以下のようにすればメッセージは出なくなる。

```sample2.js
var SerialPort = require('serialport');
var port = new SerialPort('/dev/ttyUSB0', {
  baudRate: 115200
});
```
# 参考サイト
https://github.com/EmergingTechnologyAdvisors/node-serialport/blob/master/UPGRADE_GUIDE.md
Node.jsとArduinoで音量をモニタリング #nodebots #nodebots_jp



7/29は[International NodeBots Day](https://nodebots.connpass.com/event/61190/)ということで、世界中でNodeBotsイベントが実施されています。

ということでJohnny-Fiveを触っています。

## Grove Sound Sensor

Groveの音量センサーです。

> * http://wiki.seeed.cc/Grove-Sound_Sensor/

![](https://i.gyazo.com/502fda60637386c22f8b5e8517f3a96d.gif)

サンプルコードを書くとArduino IDEでデータが確認できます。

## Johnny-Fiveで値取得

これだけでいけます。今っぽいJohnny-Fiveコードですね。

> * http://johnny-five.io/api/sensor/

```app.js
'use strict';

const { Board, Sensor } = require('johnny-five');
const board = new Board();

board.on('ready', () => {
    const sensor = new Sensor(`A0`);
    sensor.on('change', (value) => console.log(value));
});
```

## freeboardにつなげて可視化まで

Dweet.ioっていうデータをなげこめるサービスを使ってfreeboardにつなぎます。

> * https://freeboard.io
> * http://dweet.io/

0.8秒ごとにデータを投げてます。

```app.js
'use strict';

const dweetClient = require("node-dweetio");
const dweetio = new dweetClient();
const { Board, Sensor } = require('johnny-five');
const board = new Board();
const THINGS_NAME = '任意のキー';

let sound = 0;

board.on('ready', () => {
    const sensor = new Sensor(`A0`);
    sensor.on('change', (value) => sound = value);
});

setInterval(() => {
    dweetio.dweet_for(THINGS_NAME, {sound: sound}, (err, dweet) => {
        if(err) {
            console.log(`err: ${err}`);
        }else{
            console.log(dweet);
        }
    });
}, 800);
```

![](https://i.gyazo.com/3b66788bd5abd34af14f786c4c55d9c5.gif)

## 所感

通信が発生しているので仕方ないけどもうすこしリアルタイムに連動できると楽しそうですね。

とはいえWebからサクッと確認できるのはさすがです。

> https://freeboard.io/board/2qjddS
UIデザインことはじめ

エンジニア２人で起業しました。
シャチョーは、IoTとか組み込みとか電子工作とJavaScriptが得意です。研究開発部門っぽいところにいました。
私、フクシャチョーはWeb屋さんでインフラ、バックエンドを主にやってました。


さて、お仕事きました。フロントエンド、誰がデザインするんだ問題
iOSアプリも開発するようになりました。UI/UX誰がデザインするんだ問題

ということで、２人のうち誰かやるしかないので、門を叩くことにしました。

# SlideShareでの役に立つSketchのお話

このスライドはまず始めに読む。
[Prottとsketchとzeplinのススメ](https://www.slideshare.net/asamieee7/prottsketchzeplin)
[Sketchで変わるワークフロー](https://www.slideshare.net/asamieee7/sketch-50764516?next_slideshow=1)

上記のスライドを作成された方のサイトで、もっと詳しく実装方法に書かれています
[Amazing workflow of UI design](http://gomaapps.blogspot.jp/?view=sidebar)


# SlideShareでの役に立つUI/UXのお話

日経のサイトリニューアルについて書かれています。勉強になります。
[確実に良くするUI/UX設計](https://www.slideshare.net/takayukifukatsu/nikkei-renewal?next_slideshow=2)

# How to learn Sketch

## Design+Codeには役立つ記事が山盛り

[Learn Sketch 3 \- Design\+Code](https://designcode.io/sketch)
[Essential Sketch Plugins for Designers and Developers \- Design\+Code](https://designcode.io/sketch-plugins)


## 動画

- [Sketchapp TV \| Free Sketch Video Tutorials & Design Resources \| Sketchapp Freebies for iOS, Android, Web UI/UX and Animation](https://sketchapp.tv/)

SkillShareやUdemyの動画教材もやくにたちます。

少しバージョンが低くても、基本はそこまで変わっていないので大丈夫でした。

# 他の人のSketchファイルをみて勉強する

- [Sketch App Sources \- Free design resources and plugins \- Icons, UI Kits, Wireframes, iOS, Android Templates for Sketch](https://www.sketchappsources.com/)
- [Sketch Repo \- 💎 Free Sketch App resources](https://sketchrepo.com/)

# テンプレート

[iOS 10 GUI \(iPhone\) \| Facebook Design](http://facebook.design/ios10)
[プラットフォームデザインキット \- Messengerプラットフォーム](https://developers.facebook.com/docs/messenger-platform/design-resources/design-kit)
[MengTo/AppStoreSketch: A quick App Store template for Sketch](https://github.com/MengTo/AppStoreSketch)


# お役立ちツール

[Sketch Mirror\- Features](https://www.sketchapp.com/features/#mirror)


# はめ込みイメージを作る

- [Devices \| Facebook Design](http://facebook.design/devices)


# 使いたい、ちょっと使っている

動きを合わせて、クライアントさんに見せる時に重宝

- [Flinto – App Prototyping Tools For Designers](https://www.flinto.com/)



# デザインのインスパイア

- [Collect UI \- Daily inspiration collected from daily ui archive and beyond\. Based on Dribbble shots, hand picked, updating daily\.](http://collectui.com/?ref=flatuicolors.com)

- [100 Brilliant Color Combinations and How to Apply Them to Your Designs – Design School](https://designschool.canva.com/blog/100-color-combinations/)
配色に迷った時に見るととても良い。

# 素材系

- [Material Icons \| bluefirex\.design](https://bluefirex.de/material-icons/)
マテリアルアイコンのセット