OmniAICreator/Qiita-1.07M huggingface dataset:
dash-buttonをWindowsだけで使おうとしてみたが失敗した話

## <i class="fa fa-file-text-o"></i> Amazon Dash Button
#### **そもそもDash Buttonとは？**
![Dash_Button.JPG](https://qiita-image-store.s3.amazonaws.com/0/153290/f21ff8df-d62c-53a7-03ef-89f775bd17a2.jpeg)

* ボタンを「ぽちっ」。お気に入りの商品が少なくなったと気づいたら、ボタンを押すだけで商品をお届けしてくれる画期的なアイテムです。

## <i class="fa fa-file-text-o"></i> やりたかったこと
* dash-buttonでみんなおもしろいことをやっているので、その波に乗りたかった。
* macやLinuxの記事が多いがwindowsでできたらうれしいのでwindowsのみで実装したかった。

## <i class="fa fa-file-text-o"></i> 使用したものなど
* Windows7 
* amazon dash button
* dasher
* python
* nodejs
* npm
* git

## <i class="fa fa-file-text-o"></i> 実際に行った対応
#### **結論から･･･**
* windows7で環境構築<font color="Red">**（失敗）**

構築が上手くいかず、dash-buttonをいじり倒す段階まで持っていくことができませんでした･･･。
以下、行った順に沿って説明していきます。


### 前準備
- node.js, npm, pythonをインストール

## Dasher のインストールからボタンの登録まで
README を見ながら順番に設定します。
## Dasher のインストール
clone してnpm install するだけです。
### GitHub からDasherモジュールをclone
適当なディレクトリにclone します。
>$ git clone https://github.com/maddox/dasher.git
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153290/7e1d1f2b-2427-7904-dbfc-16bf76d2ceca.png)

cloneはこれだけで完了です。

### 続いてインストール
dasherのディレクトリまで移動し、npm installを叩く
>$ cd dasher
$npm install
>......
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153290/f3d74396-85ef-0e07-6645-04e952ff4946.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153290/eb4a048f-6dd1-318e-2dfb-ae927b44ea5f.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153290/f3e05a7f-f654-acb0-c2d3-9140353a67a6.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153290/8091dbbf-b5f8-ecfc-b313-2b266de2cc13.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153290/f7a0e37c-e472-6d9d-1d97-601caeba9613.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153290/d2d9a636-75a8-5b37-33b3-458a116099f5.png)

はい、エラーがたくさん出ておりますね。

pcap/pcap.hファイルがない？
仕方がないので当該ディレクトリを探りにいくと確かに対象ファイルがありませんでした。

先人たちの知恵をお借りしようと、windows環境で実施したものを調べてみたけれども有益な情報なし。
（『Visual Studio 2010 build tools』を入れろと言うエラーなんかもあったので、やってみたけどだめでした）

この他にも出たエラーとして、pythonのバージョンが新しすぎるだとか、npmのバージョンが合ってないなどありましたがこちらはすぐに解決。
しかし、このエラーで完全に詰まってしまいました。


出てくるエラーメッセージを参考に設定を変えたり、足りないファイルの補完などを試みましたが、
終わりが見えなくなってしまったので今回は一旦打ち切りました。

#まとめ
Macにて同様の手順で実施した際は、特にエラーが出ることなく構築できました。
Windows環境でもVMware(ubuntu64Bit)などを用いれば構築できたなどの報告はありました。
まだまだ試行錯誤して出来ることはたくさんあるとは思いますが、純粋にWindows環境のみでの構築は厳しい戦いになりそうです･･･。
GNU coreutils > date > 日時指定 + days, hour, minuteを進める|戻す > 例: date --date="2017-08-03 12:30:45 1 hour ago" | 二回引くワンライナー

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

dateコマンドで指定の日時に対して、day, hour, minutesを進めたかった。

https://www.gnu.org/software/coreutils/manual/html_node/Examples-of-date.html

以下でできるようだ。1dayの前に"+"をつけると正しい日時にはならない。

### 進め方

```
$ date --date="2017-08-03 12:30:45 1day"
Fri Aug  4 12:30:45 JST 2017
```

```
$ date --date="2017-08-03 12:30:45 1hour"
Thu Aug  3 13:30:45 JST 2017
```

```
$ date --date="2017-08-03 12:30:45 1minute"
Thu Aug  3 12:31:45 JST 2017
```

### 戻し方

agoを付けるようだ。

```
$ date --date="2017-08-03 12:30:45 1 day ago"
Wed Aug  2 12:30:45 JST 2017
```

```
$ date --date="2017-08-03 12:30:45 1 hour ago"
Thu Aug  3 11:30:45 JST 2017
```

```
$ date --date="2017-08-03 12:30:45 1 minute ago"
Thu Aug  3 12:29:45 JST 2017
```

### secondも使えます

### 二回引く

xxx agoを二回書くと二回引くようだ。
複数の秒変化計算をワンライナーでできる。

```
$ date --date="2017-10-03 12:30:00 5 second ago 5 second ago"
Tue Oct  3 12:29:50 JST 2017
```
パラレルサブフローのデバッグ

# はじめに
ASTERIA WARPのパラレルサブフローで実行されたフローをデバッグする方法を考えてみました。

# フローのデバッグ実行とは
フロー内のコンポーネントにブレークポントを設定し、ブレークポイントで一時停止した箇所からステップ実行で1つずつ実行しながらその時の状態を確認することができる機能。

![parallel_debug01.png](https://qiita-image-store.s3.amazonaws.com/0/180292/dac427a7-ac3b-903c-d2cb-fa4f9fd6dbfb.png)

# パラレルサブフローとは
ParallelSubFlowコンポーネントを使ってループ処理で別のフローを並列に実行することができる機能。
マルチコア、マルチCPU環境などでは、単純にループ処理を行うよりも効率的に処理を実行することが期待できる。

![parallel_debug02.png](https://qiita-image-store.s3.amazonaws.com/0/180292/473b33ee-99e1-66d9-11f1-7de8f20b8a5a.png)


# パラレルサブフローをデバッグするには
パラレルサブフローで実行されるサブフローは個別のスレッドとして並列実行用の実行エンジンに振り分けられるので、呼び出し元の親フローからステップイン実行で確認することはできない。
※FlowInvokerとして実行するフローも同様。
ただし呼び出されるフローは別スレッドとして実行されるのでParallelSubFlowコンポーネントで呼び出されるフローを「外部からフローを実行する」チェックボックスをオンにして

![parallel_debug03.png](https://qiita-image-store.s3.amazonaws.com/0/180292/5e59a9f8-6835-25f1-4c8f-455123afae57.png)

デバッグの待受状態にしておくことでデバッグすることは可能。

![parallel_debug04.png](https://qiita-image-store.s3.amazonaws.com/0/180292/9946c1a5-defd-f36a-2f15-3aa2d15e6bc5.png)

デバッグできるのは並列実行したフローの1つだけ。（おそらく最初に実行されたフロー）

![parallel_debug05.png](https://qiita-image-store.s3.amazonaws.com/0/180292/0bfa2918-7fd6-2e4b-78b9-a33d7ddf8d4b.png)


# おわりに
親フローからのステップイン実行はできませんが呼び出されるフローを待機状態にしておくことで並列実行されたうち1つのフローをデバッグできるようです。
ssh中のtmuxのウィンドウ名をいい感じにする

たくさんのサーバで作業をしているとき，tmuxのウィンドウ名がsshだらけになることがあります．

![20170730173747.png](https://qiita-image-store.s3.amazonaws.com/0/85741/28a14061-38f9-0626-ecaf-bc9dbfe985c0.png)

しかし，このときに重要なのは各ウィンドウがどのサーバに接続されているかという情報です．
そこで，zshrc上にssh関数を作成し，sshが実行されたらホスト名をウィンドウ名にrenameするようにします．

調べてみるとこのような先行例[1]があります．


```zsh
ssh() {
    if [ "$(ps -p $(ps -p $$ -o ppid=) -o comm=)" = "tmux" ]; then
        tmux rename-window "$(echo $* | cut -d . -f 1)"
        command ssh "$@"
        tmux set-window-option automatic-rename "on" 1>/dev/null
    else
        command ssh "$@"
    fi
}
```

これでも十分実用に足るものですが，１つ問題があります．
sshを実行する際に何かオプションを指定したとします．

```zsh
ssh -N hostname
```

このとき先ほどのssh関数の```tmux rename-window "$(echo $* | cut -d . -f 1)"```の行に注目しましょう．
```$*```でsshコマンドの引数をすべて渡してしまっているので，コマンドインジェクションのようなことが起きてしまいます．
結果として，tux rename-windowは以下のようなエラーを返します．

```zsh
rename-window: illegal option -- N
usage: rename-window [-t target-window] new-name
```

今回の場合は関数の最後の引数をrename-windowに渡せば良さそうなので，先ほどのssh関数を以下のように修正します．
シェルスクリプトでは関数の引数をいくつかの方法で取得できます．
最後の引数は```${@: -1}```によって取得します．
引数の取り扱いが正しいかよくわからないのですが，詳しく知りたい方は[2][3]あたりを詳しく読むとよいかもしれません．

修正したssh関数は以下のようになります．

```zsh
ssh() {
  if [ "$(ps -p $(ps -p $$ -o ppid=) -o comm=)" = "tmux" ]; then
    tmux rename-window ${@: -1} # <---- ここ
    command ssh "$@"
    tmux set-window-option automatic-rename "on" 1>/dev/null
  else
    command ssh "$@"
  fi
}
```

![20170730174126.png](https://qiita-image-store.s3.amazonaws.com/0/85741/94629e40-ac22-d73c-574b-ec99d71c274e.png)

めでたくtmuxが見やすくなりました．


### 参考

[1] https://blog.no-panic.at/2015/04/21/set-tmux-pane-title-on-ssh-connections/
[2] http://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337
[3] https://fumiyas.github.io/2016/12/15/positional-parameters.sh-advent-calendar.html
C > warning: C++ style comments are incompatible with C90 | workdt.tm_isdst = -1; // summer time flag

関連
http://qiita.com/7of9/items/1965c5e8d9e839652808#comment-f4d36d428c9911308cb2

上記で掲示いただいたideone上のCコードで以下の警告が出ている。

```
prog.c: In function ‘getElapsedSecond’:
prog.c:112:27: warning: C++ style comments are incompatible with C90
     workdt.tm_isdst = -1; // summer time flag
```

//というコメント記載はC99からの対応のようだ。

https://stackoverflow.com/questions/2223541/why-cant-i-use-style-comments-in-my-c-code
> // comments are not allowed in old (pre 99) C versions, use /**/ (or remove the -ansi, that is a synonym for the C89 standard)

自分が使っている組込みの開発環境を見直すと、C dialectにC89とC99がある。現在C99を使っているため、上記の警告は出ていなかったようだ。
Ruby Hashのグループ化

#始めに
RubyでHashのkey,Valueの組み合わせをグループ化してみます

#やりたいこと
`[{"test"=>"1"},{"test"=>"1"},{"test1"=>"2"}]`
を```
{"test"=>["1", "1"]}
{"test1"=>["2"]}
```のようにグループ化したい

#実装
```groupbytest.rb
p =  [{"test"=>"1"},{"test"=>"1"},{"test1"=>"2"}]
.group_by do |name| 
  name.keys[0]
end
.collect do |k,v|
    {k=>v.collect{|h|h.values[0]}}
end

puts p
```
#雑感
同じようなことを
[Listに含まれる単語の数をカウントするプログラム](http://qiita.com/triple4649/items/bdd02c2d2413871906fe)
の記事でJavaで実装したけれど、
JavaのCollectors.groupingByのような第二引数にグループ化のロジックが書けるメソッドがRubyにあればもっとシンプルロジックは書けるのだけど
CentOS7にDocker CEとDocker Composeをインストールする

# 概要
CentOS7のDockerが古すぎるので最新のDockerとDocker Composeをインストールする。
docker-compose.ymlをv3.2とかで書きたいとか無ければ不要だと思います。
下記は[公式リファレンス](https://docs.docker.com/compose/compose-file/)から転記

| Compose file format           | Docker Engine release           |
|:----------------|:------------------|
| 3.3 |	17.06.0+ |
| 3.2 |	17.04.0+ |
| 3.1 |	1.13.1+ |
| 3.0 |	1.13.0+ |
| 2.2 |	1.13.0+ |
| 2.1 |	1.12.0+ |
| 2.0 |	1.10.0+ |
| 1.0 |	1.9.1.+ |

# 環境
- CentOS Linux release 7.3.1611 (Core)
- docker Docker version 17.06.0-ce, build 02c1d87
- docker-compose 1.14.0

# Docker CE インストール
### インストール済みDocker関連パッケージを削除
```
$ sudo yum remove -y docker docker-common container-selinux docker-selinux docker-engine docker-engine-selinux
```

### 必要なパッケージインストール
```
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
```

### Docker CEのレポジトリ追加

```
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```

### Docker CEインストール

```
$ sudo yum install docker-ce
```

### Docker 起動

```
$ sudo systemctl start docker
```

### OS起動時にDockerを自動起動する

```
$ sudo systemctl enable docker
```

### Dockerのバージョン確認

```
$ sudo docker -v
Docker version 17.06.0-ce, build 02c1d87
```

# 再起動後にDockerがエラーになってしまう場合

起動しようとしたら下記のようなエラーが出た。

```
$ sudo systemctl start docker
Job for docker.service failed. See 'systemctl status docker.service' and 'journalctl -xn' for details.
```

下記で治った。

```
$ sudo yum -y install libdevmapper.so.1.02
```

# Docker Compose インストール
最新版を入れる場合は[githubのダウンロードページ](https://github.com/docker/compose/releases/)で確認すると早いかも？

```
$ sudo curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
```

### Docker Compose バージョン確認
```
$ docker-compose --version
docker-compose version 1.14.0, build c7bdf9e
```

# おわりに
docker-compose.ymlにswarm mode関連の記述をしたい場合は上げるといいですね。
反面、V2の頃に使用できたextendsオプションがV3では使用できないので、使用していた方はdocker-compose.ymlの修正が必要になってきます。
ideone > link > -Waddressなどの警告を出す方法 > pragma指定をする

ideone(C言語)にてtypedef structの型指定間違いについての警告が出ないことで実装を間違っていることに気づかなかった。

自分で探しても-Wallのようなオプションの指定方法は見つけられませんでした。

@fujitanozomu さんの[コメント](http://qiita.com/7of9/items/1965c5e8d9e839652808#comment-f4d36d428c9911308cb2)にてpragma指定の方法を教えていただきました。

情報感謝です。

2017年8月現在のシステムではコメントは検索できないため、今後の参照性のために別記事にしました。


関連
https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html#Diagnostic-Pragmas
特定の子要素を持つ要素をCSSセレクタで選択したい

`Nokogiri`のCSSセレクタは各ブラウザで実装されてるのよりも高機能らしく`has`が使えます。

例えば

```foo.html
<table>
  <tr><th>HEAD</th></tr>
  <tr><td>BODY</td></tr>
</table>
```

みたいな構造のとき、ヘッダー以外のテーブルデータ部分が欲しくて

```.rb
doc = Nokogiri::HTML(url.read)
doc.css('table tr')[1..-1]
```

なんて書き方をしてたんですが、

```.rb
doc = Nokogiri::HTML(url.read)
doc.css('table tr:has(td)')
```

のように何をしてるか明示的に書けるんです。素敵！

### おまけ

Selectors Level 4 で提案されてるので将来的にはブラウザでも使えるようなるみたいですね。

https://stackoverflow.com/questions/1014861/is-there-a-css-parent-selector
[メモ] STM32L15x 系のInternal FLASHの書き込み・消去

## 概要
- STM32L152xCでの、Internal Flashの書き込み・消去のメモ

- 参考: 
    - RM0038  リファレンスマニュアル / Reference manual<br>STM32L100xx, STM32L151xx, STM32L152xx and STM32L162xx<br>advanced ARM®-based 32-bit MCUs の<br>　**Section 3: Flash program memory and data EEPROM** / セクション 3 ：フラッシュプログラムメモリとデータ EEPROM
    - STM32Cube_FW_L1 のサンプルコード
    - (リンク先が変わったりするので、[STのページ](http://www.st.com/)から検索するのがいいと思う)



## メモ
### STM32L1: Flashメモリの構成
- 4KB / Sector
- 256 Bytes / Page   (=> 16 Pages / Sector)
- Page毎にErase
- Sector毎にWrite Protection
- チップごとの詳細は、RM0038リファレンスマニュアルを参照

### アンロックとロック
- 書き込み・消去前に `HAL_FLASH_Unlock()`、 後に、`HAL_FLASH_Lock()`する
    - `HAL_StatusTypeDef HAL_FLASH_Unlock(void)`
    - `HAL_StatusTypeDef HAL_FLASH_Lock(void)`

### 消去
`HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *PageError)`

- コード

	```c
	FLASH_EraseInitTypeDef EraseInitStruct;
	uint32_t PAGEError;

	...

	EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
	EraseInitStruct.PageAddress = 消去するページの先頭アドレス ;
	EraseInitStruct.NbPages     = 消去するページ数 ;

	if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
	{
		// (PAGEError != 0xFFFFFFFFU) なら、PAGEError に消去でエラーの発生したアドレスが入っている
	}
	```




### 書き込み
- ワード(4bytes)書き込み<br>`HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint32_t Data) `
- ハーフページ書き込み<br>`HAL_StatusTypeDef HAL_FLASHEx_HalfPageProgram(uint32_t Address, uint32_t* pBuffer)`


- コード

	```c
	uint32_t Address, Data;

	Address = 書き込みアドレス (Address%4 == 0 じゃないとだめだと思う)
	Data =　書き込むデータ

	if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, data) == HAL_OK)
	{
		// エラー
	}
	```

### エラーの詳細を得る

```c
uint32_t HAL_FLASH_GetError(void);

#define HAL_FLASH_ERROR_NONE      0x00U  /*!< No error */
#define HAL_FLASH_ERROR_PGA       0x01U  /*!< Programming alignment error */
#define HAL_FLASH_ERROR_WRP       0x02U  /*!< Write protection error */
#define HAL_FLASH_ERROR_OPTV      0x04U  /*!< Option validity error */
#define HAL_FLASH_ERROR_SIZE      0x08U  /*!<  */
#define HAL_FLASH_ERROR_RD        0x10U  /*!< Read protected error */
#define HAL_FLASH_ERROR_OPTVUSR   0x20U  /*!< Option UserValidity Error. */
#define HAL_FLASH_ERROR_OPERATION 0x40U  /*!< Not used */
```



## その他
- (TODO) 消去・書き込み速度などを測定する
- ハーフページ書き込みは、未テスト. 確認後更新する(予定)
- 外付け SPI-Flashの代わりに使えるかな??
[js]with文

with文は一時的に名前の解決順序を変更する。
以下のコードではwith文に`obj`を与えているので、
with文中の変数xの解決の時、グローバル変数xより先にobj.xを探している。

```js
var x = 1;
var obj = {x:2, y:3};
with(obj){
  x;
}
//=> 7
```

しかし、ECMAScript第５版のstrictモードはwith文を禁止している。
git-flowで用いるブランチまとめ

#git-flow

git-flowはDriessen氏が[ブログ](http://keijinsonyaban.blogspot.jp/2010/10/a-successful-git-branching-model.html)にて発表したgitの開発手法であり、それを実現するツールの名前でもあります。

今回はツールの説明ではなく、ブランチを中心とした開発手法についてまとめます。

#5つのブランチ
git-flowにはmaster, release, develop, feature, hotfixの5つのブランチが登場します。

##メインブランチ
開発のコアとなるブランチ。
![bm002.png](https://qiita-image-store.s3.amazonaws.com/0/28622/7bdb93b1-879d-56e0-5f95-11ccd8c8ee5f.png)


###master
製品として出荷可能な状態であり、アプリケーションが安定して動く状態にする必要がある。

###develop
次のリリースのための最新の開発作業の変更が反映されている状態。このブランチが常に最新。

##サポートブランチ
機能の追跡、製品リリースの準備、製品に起きた問題をすばやく修正すること、などを容易にするためのブランチ。

###feature
分岐元：develop
merge先：develop

![fb.png](https://qiita-image-store.s3.amazonaws.com/0/28622/15c340b4-b45e-bbdc-5444-f25327a27ad6.png)

developからブランチを切り、新機能の開発を行うのに用いる。
ブランチ名はfeature/news_feedなど、実装する機能をfeature/の後ろに書くなどすればいい。
最終的にはdevelopにmergeする。この時、--no-ffオプションを付けてmergeすると、その機能実装に使ったコミットがまとまり、差分の管理が楽になる。

![merge-without-ff.png](https://qiita-image-store.s3.amazonaws.com/0/28622/a36c0ae0-6999-8e66-2bfe-15bc0f5ad839.png)

###release
分岐元： develop
マージ先： develop と master

リリースブランチは develop ブランチから作成される。release/1.0といった感じで切ればいい。
この間に新機能に不具合が見つかった場合は、work/fix_bugなど修正用のブランチをここから切り、修正が終わったらこのブランチにmergeする。
デバッグが終わるまでdevelopにmergeすることは許されない。

developにmergeされたら、developをmasterにもmergeして安定版を確保する。

###hotfix
分岐元： master
マージ先： develop と master

![hotfix-branches1.png](https://qiita-image-store.s3.amazonaws.com/0/28622/b67db40d-ca92-261e-48a3-860627ee14f0.png)

リリース後、万が一不具合が見つかったらhotfixブランチを用いて修正を行う。
masterが現在のリリース内容と一致しているので、masterからブランチを切る。
要は、releaseブランチの逆である。
releaseが
develop→release→develop→masterとなっているとしたら

hotfixは
master→hotfix→master→developである。

#まとめ

master, release, develop, feature, hotfixのブランチの役割を把握して運用することで、開発がスムーズに、そして高品質なアプリを作ることができる。

#参考
 "A successful Git branching model" 日本語訳
http://keijinsonyaban.blogspot.jp/2010/10/a-successful-git-branching-model.html
Windows Serverのロケールと時刻、言語の日本語化

# AWSでWindows Server作成時、デフォルトがEnglishなので、毎回のJapanese化のメモ
2016で操作しましたが、2012も同じだったような。。？

1.日本語化
Controle Panel > Add Languege
Add Languageから日本語を選択
Add
Download and Language Pack

2.設定言語の日本語化
地域　＞
形式、場所、管理

3.ログオフ、ログアウトして確認

以上。
EasyCL でクロスプラットフォームな OpenCL 開発整備をする

漢なら OpenCL でレイトレーシングしたり機械学習アプリを開発したいですね!

しかし OpenCL API を叩いたり OpenCL SDK をインストールしてビルド整備は面倒ですね...

そこで EasyCL を使いましょう!

https://github.com/hughperkins/EasyCL

cltorch https://github.com/hughperkins/cltorch で使われています.

## 利点

* クロスプラットフォーム!(Windows, Linux, macOS)
* clew を使い, コンパイル時に OpenCL SDK(header, lib) が不要!
* clew を使い, 実行時に OpenCL dll をチェック + ロード!
* バイナリカーネルをキャッシュしたり, templated kernel で CL カーネルのコードをテンプレート置換とかできる!(lua を使って)

clew https://github.com/OpenCLWrangler/clew は, glew http://glew.sourceforge.net/ の OpenCL 版のような感じです.

## 注意点

### 対応バージョンは 1.2 まで

EasyCL(clew)は OpenCL 1.2 までのサポートになります. 1.2 までだと NVIDIA GPU(CUDA ドライバ) でも動くので, クロスプラットフォームかつ NV, AMD, Intel GPU で動かしたい場合は問題がありませんが, OpenCL 2.0 以上の機能を使いたい場合は EasyCL はあきらめることになります.

### Cmake 

EasyCL の CMakeLists.txt では, 一旦 clew を external project としてビルドしてからリンクするというややこしいことをしています. 

https://github.com/hughperkins/EasyCL/issues/18 

define などビルド設定を親プロジェクトと混在させないためのようですが, 実際のビルドステップが無駄に増える(親プロジェクトのリコンパイル時でも常に clew をビルドすることになる)ので, 問題がなければ EasyCL と clew のソースを一緒にビルドするように CMakeLists.txt を書き換えたりするのがよいでしょう.


## clew のバージョン

EasyCL の submodule で使われている clew のバージョンが古く, たとえば Windows で UNICODE ビルド時に OpenCL.dll がロードできないという問題があります.

https://github.com/hughperkins/EasyCL/issues/4

私の PR がマージされるのを待つか,

https://github.com/hughperkins/clew/pull/1

https://github.com/syoyo/clew をお使いください.

## まとめ

* 優秀な若人が, EasyCL を使い人類史上最速で優秀な OpenCL レイトレーシング/機械学習若人へと昇華されるスキームを確立する旅に出たい.
* 
Happy OpenCL programming!
スプラッシュ画面の変更が実機で反映されない場合の対処法

#概要
iOSアプリ開発時に、スプラッシュ画面（起動後の最初の画面）の画像を変更したのですが、実機にうまく反映されないことがあったので対処法を記しておきます。
#試してみたこと
・シミュレータで試してみる → シミュレータでは正しく反映されていた
・Clean → Run
・画像を一度消して、もう一度配置
・一度アプリをアンイストールしてから再度インストール
#結論
上記のどれも効果がなく、端末を再起動を行うと正常に反映されました。原因はわかりません。。。
Chromebookなら，最初からショートカットでアプリをバシバシ切り替えられる

#Abstract/Introduction

macOSでディスプレイ1枚で作業する技術
http://qiita.com/saboyutaka/items/d6cfd2a2b60f1a374d60
こんな記事があったので，無駄に対抗心を燃やしてみる．

表題の通り，上記記事と同等の内容はChromebook(ChromeOS)だと初期状態で実現可能．

#Methods/Results
サイトやアプリをシェルフ（タスクバー）に追加し…
![Screenshot 2017-08-02 at 231253 - Editd.png](https://qiita-image-store.s3.amazonaws.com/0/17440/f88d7ae3-523e-8b6d-06fa-474c640dc06a.png)

![Screenshot 2017-08-02 at 231535 editd.png](https://qiita-image-store.s3.amazonaws.com/0/17440/c867b1e0-947e-a392-5e06-c5c606d911e6.png)

`Alt + <数字キー>` でバシバシ！バシバシ！
![ezgif-2-5e146f4de4.gif](https://qiita-image-store.s3.amazonaws.com/0/17440/3fa68984-78d8-adeb-609e-1ae83da76b7f.gif)


#Discussion
本件に限らず，Chromeを多く使うのであればChromeOSが最適．
シンプルな分，使い勝手が特化考慮されている．
餅は餅屋である．
~~（Discussionになっていない）~~


#Conclusions
やはりChromeOSがさいつよだったか…
フロントエンドエンジニア向け、静的サイト公開サービス

# Surge
- https://surge.sh/

# 特徴
- コマンドライン上で簡単公開
- 無料
- ビルドツールを導入することもできる

# 始め方
動画を見ましょう。

- https://surge.sh/help/getting-started-with-surge
GoogleAnalyticsで使える正規表現(regex)まとめ

今回はGoogleAnalyticsで使えそうな正規表現の紹介をさせて頂きます。


**Q.そもそも正規表現とは？**
**A.正規表現とは、1つには定まらないけどある規則性を持った文字列を探すための表記法です。
UNIXのコマンドやPerlなどで使われています。**

Googleアナリティクスは正規表現に対応しているため、
[ビューフィルタ,目標,セグメント,ユーザーリスト,コンテンツグループ,チャネルグループ]
などの機能で柔軟な指定を行うことが可能です。
Googleアナリティクスでは、特定の文字列が正規表現として使用され、対象範囲を自在に調整しながら、
Googleアナリティクスデータに含まれるパターンに一致させることができます。



**↓正規表現まとめ↓**
#○文字系 

###記号	意味
.	 任意の1文字
*	 直前の文字の0回以上の繰り返し
+	 直前の文字の1回以上の繰り返し
?	 直前の文字は省略可能
*?	 直前の文字の0回以上の繰り返し
+?	 直前の文字の1回以上の繰り返し
??	 直前の文字は省略可能
[ ～ ]	 [ ]の中のどれか1文字
[^ ～ ]	 [ ]の中に無い1文字
( ～ | … )～か…かどっちか
{n}	 直前の文字のn回の繰り返し
{min,max}	直前の文字のmin以上max以下の繰り返し（min、maxは省略可能）
{min,max}?	直前の文字のmin以上max以下の繰り返し（min、maxは省略可能）
\w	アルファベット、数字、アンダスコア（ _ ）のどれかの1文字
\W	アルファベット、数字、アンダスコア以外の1文字
\d	数字1文字
\D	数字以外の1文字
\s	半角スペース、タブ、改行のどれか1文字
\S	半角スペース、タブ、改行以外の1文字
\n	改行
\t	タブ
\\	\記号
( ～ )	( )内を1文字扱い


#○位置系

###記号	意味
^	行の先頭
$	行の末尾
\<	単語の先頭
\>	単語の末尾
\b	単語の先頭か末尾
\B	単語の先頭、末尾以外
\A	ファイルの先頭
\z	ファイルの末尾
\G	直前の一致文字列の末尾




<h3>初投稿ですので、色々と至らない点もあると思いますが、<br>今後ともよろしくお願いします！<br>
ありがとうございました^^</h3>
【はじめての3Dセンサー】Xtion PRO LIVEについて

## はじめに

### この記事の内容

Xtion PRO LIVEに関する技術メモ。

#### 対象読者

Xtionについて何も知らない人。(何も知らずにはじめて触った人のメモが読みたい人)

#### 背景(モチベーション)

某プロジェクトの終了に伴い、不要になった「Xtion PRO LIVE」を配布していたので、何台かもらった。
本当はKinectで遊ぶのが最高に盛り上がっていた２０１３年あたりに触ってみたかったのだが、当時お財布事情により指を咥えて楽しそうな人たちを眺めていただけ。
今更感はあるけど、せっかくもらったのだから、これを使ってなにかしたい!!
イメージ的には

* [イノラボ - ＼やっちゃいけない／キネクトでエクセルを操作する](http://innolab.jp/work/643)

みたいなことをしたいのだが、この手の知見が全くないズブの素人なので何からはじめていいのかわからない。
というわけで、まずは調査から。

# Xtion PRO LIVE

## Xtion とは？

ASUSが提供しているPC用モーションキャプチャデバイス。マイクロソフトの販売しているKinectの代替として利用している人が結構いる。Kinectは外部電源が必要なので、バスパワーで利用する場合はXtion一択の状況だったみたい。

Xtionのラインナップは以下の2種類が存在し、モデルの違いは内蔵するセンサーの種類。

* Xtion PRO ... 赤外線プロジェクタ、赤外線カメラ内蔵
* Xtion PRO Live ... 上記に加えて、RBGカメラ、マイクを内蔵

## 外観

外観はこんな感じ。

![XTION.png](https://qiita-image-store.s3.amazonaws.com/0/55900/a240b556-69d4-df0c-bbeb-410fd87c7ce0.png)

## Xtion PRO Liveの特徴

ライバル視されるKinectとの比較記事が世の中的に流通しているので、その中で

| 項目              |Kinect             |Xtion PRO LIVE      |
|:-----------------|:------------------:|:------------------:|
| RGBカメラ          |◯                  |◯                   |
| 距離センサー(赤外線カメラ)|◯<br>※Depth認識距離 0.8~3.5m  |◯<br>※Depth認識距離 0.8~3.5m       |
| マイク            |◯(4つ)<br>※音声方向の取得ができる|◯(2つ)<br>※音声方向の取得ができない        |
| チルトモーター      |◯                  |×                |
| 外部電源          |必要             |不要<br>※USBバスパワーのみで駆動|
| 商用利用          |◯<br>※Kinect for Windowsは商用利用できる、Kinect for Xbox 360は商用利用できない                |◯    |

首は自分では振れないけれど、外寸も小さく、軽いし、外部電源が不要なところがGood!!

※追記：
よくKinectのことを知らなかったのですが、比較用に参照したKinectの情報は、Xbox 360世代のKinect（Kinect v1）との情報を頂きました。
Kinect v1のうちKinect for Windowsは（Kinect for Windows SDKを利用することで）商用利用が可能です。Kinect for Xbox 360は商用利用は認められていません。
とのこと。助かります。

## 次にやること

なんとなく、ハードウェアのことはわかってきたので、[次](http://qiita.com/yagizo/items/e32daa243c91e112c0ba)はこいつを動かす環境構築について調べる。

KinectもXtionもPrimeSense社のチップセットを使っていて、OpenNI(オープンソースで同社提供)という開発ライブラリを使って、何か作れるらしい。

## 付録

### 参考リンク

* [ASUS XTION PRO LIVE　- テックウインド株式会社](http://www.tekwind.co.jp/products/ASU/entry_8483.php)
* [オフィシャルサイト - Xtion PRO LIVE | 3D Sensor | ASUS Global](https://www.asus.com/3D-Sensor/Xtion_PRO_LIVE/)
* [Kinect - Wikipedia](https://ja.wikipedia.org/wiki/Kinect)
* [KINECT と Xtion Pro と Xtion Pro LIVE のH/Wを比較してみる - Natural Software](http://www.naturalsoftware.jp/entry/20111005/1317745257)
* [「Xtion Pro LIVE」が日本でも発売されるみたいです - Natural Software](http://www.naturalsoftware.jp/entry/20111110/1320817166) 
* [ASUS Xtion PRO LIVEを入手した - 黄昏てなんかいられない](http://kronus9.sblo.jp/article/90478986.html)
Visual Studio 2017インストール

Visual Studio 2017 Communityを新規にインストールする。

以下のページを参照
https://docs.microsoft.com/ja-jp/visualstudio/install/create-a-network-installation-of-visual-studio

①vs_community.exeをダウンロード
②vs_community.exe --layout c:\vs2017offline
③vs_Communityを実行

なんかダウンロードに時間がかかったわりにはインストールが早くならない・・・
FaceSubstitutionをUbuntu1404で使う。

##目的
ofxFaceTrakerを使った、openFrameworksの顔交換アプリFaceSubstitutionをUbuntu1404で使う。

Github FaceSubstitution：
https://github.com/arturoc/FaceSubstitution

##openFrameworks、ofxFaceTrakerのインストール
[ofxFaceTrakerをUbuntu1404で使う。]を参照のこと。(http://qiita.com/nnn112358/items/602276937880ce3c1983)


##FaceSubstitutionのダウンロード
FaceSubstitutionをgitからダウンロードする。

```
cd ofx_dev/app/
git clone https://github.com/arturoc/FaceSubstitution.git
```

##CPUCloningの動作確認

下記のコマンドでコンパイルする。

```
cd ofx_dev/app/CPUCloning
cp ../../../apps/myApps/emptyExample/Makefile .
cp ../../../apps/myApps/emptyExample/config.make .
cp ../../../apps/myApps/emptyExample/emptyExample.qbs .
make 
make RunRelease
```

ここで
> error: ‘drawHighlightString’ was not declared in this scope

とエラーが発生する。

###drawHighlightString()の書き換え
ソース内でdrawHighlightString関数を使っているが、これは古いversionのopenFrameworksの関数である。drawHighlightString()をofDrawBitmapStringHighlight()に書き換える。
[LNK2019 #39](https://github.com/arturoc/FaceSubstitution/issues/39)

##FaceSubstitutionの動作確認
学習器(face.con,face.tracker,face.tri,face2.tracker)をコピーする。
CloningWrapperから、Clone.cpp、Clone.hをコピーする。
drawHighlightString()をofDrawBitmapStringHighlight()に書き換える。

```
cd ofx_dev/app/FaceSubstitution

cp ../CloningWrapper/src/Clone.cpp ./src
cp ../CloningWrapper/src/Clone.h ./src

cp ../../../apps/myApps/emptyExample/Makefile .
cp ../../../apps/myApps/emptyExample/config.make .
cp ../../../apps/myApps/emptyExample/emptyExample.qbs .
mkdir ./bin/data/model -p
cp ../../../addons/ofxFaceTracker/libs/FaceTracker/model/face* ./bin/data/model
```

下記のコマンドでコンパイル・実行する。

```
make 
make RunRelease
```

--------------

参考
vimeo Face Substitution：https://vimeo.com/29348533
micro:bitがweb上で色々いじることができて結構面白い件について

どうもこんにちは，twitterなどで脳みそがとろけそうなツイートを日々しているはとバスと申します．今回の記事がQiitaにての初の記事となるのですが，題材としては今僕の中で１，２を争うホットな話題． micro:bit について書こうと思います．
## そもそもMicro:Bitってなに

マイクロビットは、イギリスのBBCが主体となって作ったプログラミング教育向けのマイコンボードです。クレジットカードよりも小さいサイズのプリント基板に、動作をプログラミングできる25個のLEDと2個のボタンスイッチのほか、加速度センサーと磁力センサー、無線通信機能を搭載しています。動くものをプログラミングして作ることを通して、子供たちが論理的思考能力を身に着けられるようにデザインされています。 ([Switch Educationの記事](https://switch-education.com/2017/07/25/microbit_launching_in_japan/)から引用)

簡単に言うと，今までにあったArduinoやRaspberry piよりも簡単な，子供向けのマイコンボードです． それもインターネット上でプログラムを書いて実行できるという手軽さ．

<img width="1680" alt="スクリーンショット 2017-08-02 22.46.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/183574/898c92fc-389f-ab1a-d373-9df114df10f0.png">

こんな感じでプログラミングをします．

最近僕はこればっかりいじってます． この手軽さなのに，できることが結構多いです．自分がいじったことのある中で列挙してみると．

- LED
- 傾斜センサー
- 磁力
- 無線での送受信
- 文字の連結
- LED(5*5)で文字列の表示
- デジタル/アナログの値を取得
- サーボの制御
- シリアル通信で文字列などを送受信

とまあ，いろいろできる．それもいじっているのがweb上なので，余計な配線などもいらなく，勝手に配線してくれます．

これで初心者の方が陥りがちな，「コードはあっているけど配線が間違っていて，うまく動いてくれない」現象がなくなります． （反面，動くかどうかはプログラムが全てになるというのがありますが．）

## コーディング環境

　コーディングは Scratch または JavaScriptで書けます． ちなみに，どちらもやりたいことを左側にあるメニューバーのような部分から選択ができます． 

#### Scratchの画面

<img width="1680" alt="スクリーンショット 2017-08-02 23.04.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/183574/3ba4d9f3-d659-c090-2519-dfac7eb4d2cc.png">

#### JSの画面

<img width="1680" alt="スクリーンショット 2017-08-02 23.04.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/183574/d175ad61-05cc-7fc3-33e4-eafd0add08bf.png">

これをマウスなどでちょこちょこするだけでもコードができていきます．まさに初学者向け．

ハードウェア界のHello World! Lチカのコードです．

#### Scratch

<img width="403" alt="スクリーンショット 2017-08-02 23.11.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/183574/b8a2ebc1-8270-7fb8-a464-fec63110d454.png">

#### JS
<img width="363" alt="スクリーンショット 2017-08-02 23.11.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/183574/063c6936-a704-46e7-69b7-a787a5dafc56.png">

動かすとこんな感じ．　１秒ごとに点灯と消灯が切り替わります．

![Ltika.gif](https://qiita-image-store.s3.amazonaws.com/0/183574/feeb3a69-2849-e768-17ae-bdbb343600a6.gif)


これ，無線での送受信を選択すると，自動的に二つのMicroBitが用意され，自動的に通信を開始したりするので，本当にいろんなことができます．

(例) 上のボードが送ったランダムな数字を，下のボードで2進数にして表示する．

![2bit-iloveimg-compressed.gif](https://qiita-image-store.s3.amazonaws.com/0/183574/606d3043-b2b1-85c2-ad2e-c945520f3db1.gif)


というわけで今回はこんな感じです．テスト前日に失礼しました．

githubにもまとめてあるので，是非ともよろしくお願いします．

https://github.com/hatobus/microbit-test
MySQL5.6.4から現在時刻のマイクロ秒まで記録できるようになってた

こうして

```sql
CREATE TABLE datetime_test (
    t0 datetime,
    t3 datetime(3),
    t6 datetime(6)
);
```

こうして

```sql
mysql> INSERT INTO datetime_test VALUES(CURRENT_TIMESTAMP(6),CURRENT_TIMESTAMP(6),CURRENT_TIMESTAMP(6));
Query OK, 1 row affected (0.00 sec)
```

こうじゃ！

```sql
mysql> SELECT * FROM datetime_test;
+---------------------+-------------------------+----------------------------+
| t0                  | t3                      | t6                         |
+---------------------+-------------------------+----------------------------+
| 2017-08-02 23:11:02 | 2017-08-02 23:11:02.145 | 2017-08-02 23:11:02.144702 |
+---------------------+-------------------------+----------------------------+
1 row in set (0.00 sec)
```

MySQLでもPostgreSQLみたいに現在時刻にマイクロ秒まで入れられるぞ！やったね！

データ容量については下記を参照のこと。マイクロ秒まで記録すると3バイト増えて8バイトになります。

- https://dev.mysql.com/doc/refman/5.6/ja/storage-requirements.html#data-types-storage-reqs-date-time
Windowsの再起動が正しく行われたかをイベントログからPowerShellで確認する


# 背景
業務で、Windowsをタスクスケジューラなどで、定期再起動している場合、その時間帯は、監視対象外にしていると思います。その場合、再起動がうまくいったかって、わからないと思います。
起動してこなければ、監視再開後に、死活監視でわかると思いますが、再起動の停止に失敗した場合（起動したまままの場合）は、監視ではわからないですよね。

そこで、監視再開後の時間に、再起動が実施されたかをイベントログから確認する為のPowerShellを作成しました。

# 再起動イベントログ確認のPowerShell

再起動イベントログ確認のPowerShellです

```ps1:TeikiRebootCheck.ps1
$SEARCHTIME = (Get-Date).AddMinutes(-30)

$RESULT = (Get-EventLog System -After $SEARCHTIME | Where-Object {$_.Source -match "EventLog" -and $_.EventID -match "6009"} | Measure-Object).Count

if ($RESULT -eq 1) {
    Write-EventLog -LogName Application -Source TeikiReboot -EventID 100 -EntryType Information -Message "再起動に成功しました"
}else{
    Write-EventLog -LogName Application -Source TeikiReboot -EventID 200 -EntryType Error -Message "再起動に失敗しました"
}
```

# PowerShellの解説

```ps1:
$SEARCHTIME = (Get-Date).AddMinutes(-30)
```

1行目で、現在の時刻から30分前の時間を変数に代入します。

ちなみに、
60分前は、`Get-Date).AddMinutes(-60)`
3日前は、`(Get-Date).AddDays(-3)`
です。


```ps1:
$RESULT = (Get-EventLog System -After $SEARCHTIME | Where-Object {$_.Source -match "EventLog" -and $_.EventID -match "6009"} | Measure-Object).Count
```

2行目で、システムのイベトログから、ソースが「EventLog」、イベントIDが「6009」のイベントログの数をカウントしています。

今回は、1行目で30分前の時間を取得し検索対象としているので、30分以内に再起動のイベントログがあるかをカウントしています。


```ps1:
if ($RESULT -eq 1) {
    Write-EventLog -LogName Application -Source TeikiReboot -EventID 100 -EntryType Information -Message "再起動に成功しました"
}else{
    Write-EventLog -LogName Application -Source TeikiReboot -EventID 200 -EntryType Error -Message "再起動に失敗しました"
}
```
最後に、再起動のイベントの数が、1個ならば、再起動成功のイベントログを出力、1個以外なら、再起動失敗のイベントログを出力しています。


# 使い方（使いどこ）

Windowsの定期再起動後、監視対象外の時間が終わった後に、このPowerShellを実行するように、タスクスケジューラなどで設定し、このPowerShellで出力したイベントログを監視対象とする。とかですかね。

検索条件やif文のアクションの変更で、なにかに応用できるかとも思います。

# 実行する前に

今回は、最後のイベントログ出力のところで、ソースが「TeikiReboot」というログを出力していますが、このまま実行すると、そんなソース無いって怒られます。

ですので、あらかじめ以下を実行し、ソースを作成する必要がありますので、ご注意ください。

```ps1:
New-EventLog -LogName Application -Source TeikiReboot
```
「Pythonによるスクレイピング＆機械学習」を読んで

こちらの本の補足情報を書いています。

[Pythonによるスクレイピング&機械学習 開発テクニック BeautifulSoup,scikit-learn,TensorFlowを使ってみよう](https://www.amazon.co.jp/gp/product/4802610793)

[公式の正誤情報](http://www.socym.co.jp/support/s-1079#ttlWrong)

## ４章あたり

```.sh
pip3 install sklearn scipy pandas
python3 xor-train.py
```

### deprecation

```.diff
diff iris-train2.py{.bk,}
2c2
< from sklearn import svm, metrics, cross_validation
---
> from sklearn import svm, metrics, model_selection
13c13
<     cross_validation.train_test_split(csv_data, csv_label)
---
>     model_selection.train_test_split(csv_data, csv_label)
```

```.diff
diff mnist-train.py{bk,}
1c1
< from sklearn import cross_validation, svm, metrics
---
> from sklearn import svm, metrics
```

### 言語判定
```
pip3 install matplotlib numpy pandas
export MPLBACKEND="agg"
python3 lang-plot.py
open lang-plot.png
```

### BMI判定
```.diff
diff bmi-test.py{.bk,}
1c1
< from sklearn import cross_validation, svm, metrics
---
> from sklearn import model_selection, svm, metrics
16c16
<     cross_validation.train_test_split(wh, label)
---
>     model_selection.train_test_split(wh, label)
```

## 5章
```.diff
diff mnist-deep.py{.bk,}                                                                                                  
91c91
<     sess.run(tf.initialize_all_variables())
---
>     sess.run(tf.global_variables_initializer())
93c93
<     tw = tf.train.SummaryWriter('log_dir', graph=sess.graph)
---
>     tw = tf.summary.FileWriter('log_dir', graph=sess.graph)
```


## 7章

### 画像OCR

```.diff
diff font_draw.py{.bk,} 
26c26
< if not os.path.exists("./image/num"): os.makedires("./image/num")
---
> if not os.path.exists("./image/num"): os.makedirs("./image/num")
```

```
$ diff caltech101_makedata.py{.bk,}
1c1
< from sklearn import cross_validation
---
> from sklearn import model_selection, svm, metrics
40c40
<     cross_validation.train_test_split(X, Y)
---
>     model_selection.train_test_split(X, Y)
```

もしOpenCV4を使用しているならエラーが出てしまうので修正

```
$ python ocr1.py
Traceback (most recent call last):
  File "ocr1.py", line 18, in <module>
    x, y, w, h = cv2.boundingRect(cnt) # --- (※5)
cv2.error: OpenCV(4.1.0) /Users/travis/build/skvark/opencv-python/opencv/modules/imgproc/src/shapedescr.cpp:743: error: (-215:Assertion failed) npoints >= 0 && (depth == CV_32F || depth == CV_32S) in function 'pointSetBoundingRect'
```


```
$ diff ocr1.py{.bk,}
14c14
<     thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[1]
---
>     thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[0]
```

```
$ diff ocr3.py{.bk,}
19c19
<     cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[1]
---
>     cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]
```

[Caltech101データセット](http://www.vision.caltech.edu/Image_Datasets/Caltech101/)
Rubyのループ系メソッドの変数の値を変えたら？

ふと思ったのですがこれはどうなるのでせうか

```shell-session
(1..10).each do |i|
  i = 0 if i == 5
  p i
end
```
この時の出力は
iは10を満たさないから
1 2 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0  ... ?
それともiが変化されて
1 2 3 4 0 1 2 3 4 0 ?

答えは
1 2 3 4 0 6 7 8 9 10

each君がしっかり数を数えていて毎回入れてくれるってイメージですかね
複合ユニークインデックスに含まれる外部キー1個を別の外部キーに置き換えるマイグレーション


Rails 5.1を前提とします。

# やりたいこと

次のようなDBスキーマがあるとします。

```ruby:schema.rbの抜粋
create_table "categories", force: :cascade do |t|
  # ...
end

create_table "products", force: :cascade do |t|
  # ...
end

create_table "sub_products", force: :cascade do |t|
  # ...
end

create_table "category_products", force: :cascade do |t|
  t.bigint "category_id"
  t.bigint "product_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.index ["category_id", "product_id"], unique: true
  t.index ["product_id"]
end

# ...

add_foreign_key "category_products", "categories"
add_foreign_key "category_products", "products"
```

このときに、`category_products` の複合ユニークインデックス `[:category_id, :product_id]` を `[:category_id, :sub_product_id]` に変更するマイグレーションを作りたい場合を考えます。

ここで、マイグレーションはリバーシブル（マイグレーションを `up`, `down` したときに正しく前後のDBスキーマに変更できること）になるように気をつけます。

# やりかた

[`change_table`](http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-change_table) を使って、次のようなマイグレーションを作ります。

```ruby
class ChangeReferenceInCategoryProducts < ActiveRecord::Migration[5.1]
  def change
    change_table :category_products do |t|
      t.remove_index column: [:category_id, :product_id], unique: true
      t.remove_references :product, foreign_key: true
      t.references :sub_product, foreign_key: true
      t.index [:category_id, :sub_product_id], unique: true
    end
  end
end
```

まず、[`remove_index`](http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Table.html#method-i-remove_index) で複合ユニークインデックスを削除します。このときに `unique: true` を指定しておかないと、`db:migrate:down` 時に、この複合インデックスをユニーク制約が付いた状態で復元できません。

その後、[`remove_references`](http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Table.html#method-i-remove_references) で外部キーカラム `product_id` を削除します。

この後は新しい外部キーカラムと複合ユニークインデックスを作ります。削除とは逆に、カラム作成→複合インデックス作成の順番で実行しており、マイグレーション全体として処理が対称になります。

以上の方法で、`db:migrate` の `up`, `down` を行き来できるようになります。

# 参考

- [Active Record マイグレーション | Rails ガイド](https://railsguides.jp/active_record_migrations.html)
columnの異なるDataFrame同士の演算後の挙動

```py3
import seaborn as sns


iris = sns.load_dataset("iris")
iris.columns = list("pands")
(iris - iris).columns.tolist()
# ['p', 'a', 'n', 'd', 's']

(iris.assign(b=1) - iris).columns.tolist()
# ['a', 'b', 'd', 'n', 'p', 's']
# sorted
```
GitHub でダミーのメールアドレスを使用する

# はじめに
GitHub は Committer の判別にメールアドレス(git config の user.email)を使用しています。ここが自分のメアドでないと、GitHub 上のログに本人のアバターが出ません。

![github_invalid_mailaddress_push.jpg](https://qiita-image-store.s3.amazonaws.com/0/191170/a6b7ff60-6cc4-e980-5d6e-44810c285eb0.jpeg)


なので自分のメアドを使うんですが、そうすると GitHub に自分のメアドが刻まれちゃうんですよね。これはその気になれば吸い出すことが可能ですし、吸い出す用のツールもあるらしいです。気にしすぎかもしれませんが、ちょっと怖いですね。

出来れば自分のメアドを晒したくない。でもアバターが出ないのはイヤだ。……幸いなことに、そんな場合の対処が用意されています。

## noreply アドレスを使う
GitHub 側にて **ダミーのメールアドレス（noreply アドレス）** がサポートされていますので、これを設定します。

- GitHub にログイン後、https://github.com/settings/emails を開き「Keep my email address private」を ON にする
  - `USERNAME@users.noreply.github.com` ← こんなアドレスを使え、と書いてあると思うのでコピーしておきます
  - アカウントによっては `ID+USERNAME@users.noreply.github.com` かもしれません
- gitconfig の user.email 設定を、上記のアドレスに変更する
  - 例: `git config --global user.email "USERNAME@users.noreply.github.com"`

設定できたら、ちゃんと反映されてるか確認しましょう。

- 適当なリポジトリをつくって Commit と Push を行ってみる
- (確認1) GitHub 上で当該コミットログを開き、Committer が自分本人だと認識されているか(自分のアバターが表示されているか)を確認する
- (確認2) clone 先ディレクトリの .git/logs 内を、自分のメアドやダミーメアドで grep してみる
  - 自分のメアドはヒットしないはず
  - ダミーメアドがヒットするはず

## おわりに
これで一安心。

## 参考
- https://help.github.com/articles/about-commit-email-addresses/
- https://help.github.com/articles/blocking-command-line-pushes-that-expose-your-personal-email-address/
ofxFaceTraker2をUbuntu1404で使う。

##目的
DLIB版ofxFaceTraker、ofxFaceTraker2をUbuntu1404で使う方法まとめ。
ofxFaceTrakerをofxFaceTraker2に置き換えることで、トラッキング性能向上が期待できる。

Github ofxFaceTraker2:
https://github.com/HalfdanJ/ofxFaceTracker2

##環境
Ubuntu-1404 x64
openFrameworks-0.9.8
OpenCV-3.2
GCC-4.9

##openFrameworks、ofxFaceTrakerのインストール
[ofxFaceTrakerをUbuntu1404で使う。]を参照のこと。(http://qiita.com/nnn112358/items/602276937880ce3c1983)

##ofxFaceTracker2,他ライブラリをインストールする。

```
cd of_dev/addons/
git clone https://github.com/HalfdanJ/ofxFaceTracker2.git
git clone https://github.com/dzlonline/ofxBiquadFilter.git
```
##学習器をダウンロードする
学習器(shape_predictor_68_face_landmarks.dat)をダウンロード・解凍する

```
cd of_dev/addons/
download-model.sh
```

##dlibのインストール
dlibをUbuntuにインストールする。

```
wget http://dlib.net/files/dlib-19.4.tar.bz2
tar xvf dlib-19.4.tar.bz2
cd dlib-19.4/
mkdir build
cd build
cmake ..
cmake --build . --config Release
sudo make install
sudo ldconfig
cd ..
```
[Install Dlib on Ubuntu](https://www.learnopencv.com/install-dlib-on-ubuntu/)

##サンプル"example-simple"をコンパイルする

```
cd of_dev/addons/ofxFaceTracker2/example-simple/
cp ../../../apps/myApps/emptyExample/Makefile .
cp ../../../apps/myApps/emptyExample/config.make .
cp ../../../apps/myApps/emptyExample/emptyExample.qbs .
mkdir bin/data/ -p
cp ../model/shape_predictor_68_face_landmarks ./bin/data/
```

###config.makeの編集
config.makeにdlibを記載する。

>
```
PROJECT_LDFLAGS=-Wl,-rpath=./libs
PROJECT_LDFLAGS+= -ldlib
```

その他のフォルダも同じようにMakefile、config.make、emptyExample.qbs、学習器（shape_predictor_68_face_landmarks)をコピーする。

##コンパイル・実行
コンパイル・実行は以下のコマンドで行う。

```
make
make RunRelease
```

----------
###ofxFaceTraker2に、ofxFaceTrackerのgetImageMesh()関数がない
ofxFaceTracker2のgetImageMesh()関数は、ofxFaceTracker2Instanceクラスの中に実装されている。

>
```
ofxFaceTracker2Instance instance = tracker.getInstances()[0];
vector<ofVec2f>  instance.getLandmarks().getImagePoints();
```
```
ofxFaceTracker2Instance instance = tracker.getInstances()[0];
vector<ofVec2f>  instance.getLandmarks().getImageMesh();
```

[How to use getImageMesh() from ofxFaceTracker2Landmarks #9](https://github.com/HalfdanJ/ofxFaceTracker2/issues/9)

###ofxFaceTraker2に、ofxFaceTrackerのgetFound()関数がない
これは実装されていないので、ローカルで編集する。


>of_dev/addons/ofxFaceTracker2/src/ofxFaceTracker2.h

```
class ofxFaceTracker2 : public ofThread {
public:
    bool getFound() const;
```

>of_dev/addons/ofxFaceTracker2/src/ofxFaceTracker2.cpp

```
bool ofxFaceTracker2::getFound() const {
	return !failed;
}
```
pandas.DataFrameのcopyメソッドはデフォルトでdeep copy

結論はタイトルの通りです。[公式ドキュメントにも書かれています](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.copy.html)。

同僚が「pandasのassignメソッドは内部でデータフレームのコピーを作っているから、メモリ食ってしまって遅くて困っているんだよ」という話をしました。

「[Python/pandasのデータ処理で再帰代入撲滅委員会](http://qiita.com/piroyoung/items/dd209801ca60a0b00c11)」を読み、統計のバッチ処理をメソッドチェーンを使ってきれいに書くことにハマっていました。

ところが、[実際のpandasのコード](https://github.com/pandas-dev/pandas/blob/v0.20.3/pandas/core/frame.py#L2492)を見ると、

```python
# コメントや他のメソッドは略
class DataFrame(NDFrame):

    def insert(self, loc, column, value, allow_duplicates=False):
        data = self.copy()

        # do all calculations first...
        results = {}
        for k, v in kwargs.items():
            results[k] = com._apply_if_callable(v, data)

        # ... and then assign
        for k, v in sorted(results.items()):
            data[k] = v

        return data
```

となっており、「あれ？Pythonのcopyメソッドって、辞書や配列では[shallow copyだよね](https://docs.python.jp/3/library/copy.html)？」と思っていたのですが、

そのため、辞書や配列でcopyメソッドを使うときは、中のオブジェクトは同一で、中身のオブジェクトのコピーによってメモリを食いつぶすようなことは無いのですが、

```python
a = {'a': [1, 2, 3]}
b = a.copy()

# aとbの中身は同一
assert a['a'] is b['a']

# 破壊的変更が波及している！
a['a'].append(4)
print(b)
# => {'a': [1, 2, 3, 4]}
```

pandasのcopyメソッド（や、それを利用したassignメソッド等）は、巨大なデータフレームを扱う際には、メモリの心配をしたほうが良さそうです。

```python
import pandas as pd

df_a = pd.DataFrame({'a': [1, 2, 3]})
df_b = df_a.copy()

# aとbの中身は同一ではない！
assert df_a['a'] is not df_b['a']
```

冗談半分で、もしこれがHaskellだったらshallow copyでも破壊的変更が加わらないから全く問題ないのにね、と同僚と話しました。

同僚のコメントです。わかりやすさとメモリ節約を兼ね備えた書き方があれば知りたいです。

> 【pandasの再帰代入撲滅の注意】
> assignやpipeを使って再帰代入しないようにしていることも多いかと思うけど、assignはdf自体をcopyしてるので大分遅くなるので注意。一方、pipeはcopyしていないので大丈夫
>
> assign
> https://github.com/pandas-dev/pandas/blob/v0.20.3/pandas/core/frame.py#L2492
> pipe
> https://github.com/pandas-dev/pandas/blob/v0.19.2/pandas/core/generic.py#L2698-L2708
>
> ただ、assignはuiとして読みやすいのも事実だと思うので、
>
> * できるだけassignの回数を減らす(一回のassignで複数のカラムを追加してもcopyは発生していないので大丈夫)
> * もう振り切って再帰代入する
>
> ことがせいぜいできることかな…
>
> ちなみにassignに渡す前にカラムを絞って、帰ってきたdataframeを元のdataframeにconcatも試してみたけど、逆にかなり遅くなったのでこれもあまりよくない
ROSでdarknetを動かす時に起きたエラーとdarknet_rosパッケージ動作テスト

皆さん、こんにちは。
物体認識がしたくなる時ってありますよね。
僕も物体認識がしたくなったので[darknet_ros](https://github.com/leggedrobotics/darknet_ros)を使おうとしてみました。
喜び勇んでgit-cloneしてcatkin_makeしたところ以下のようなクッソ長いエラーに襲われました。

![Screenshot from 2017-08-02 21:04:14.png](https://qiita-image-store.s3.amazonaws.com/0/160346/6a156667-c50b-2d4f-2d25-a3537bff703c.png)

とりあえず似たようなエラーがないかなと探して見たところ以下のものに突き当たりました。
https://github.com/nicehash/nheqminer/issues/180
CUDA_NVCC_FLAGSに"-std=c++11"オプションをつければ良いとのこと

![Screenshot from 2017-08-02 21:08:47.png](https://qiita-image-store.s3.amazonaws.com/0/160346/2bc83e94-1e80-8f03-df5c-7f04c9972d93.png)

その後catkin_makeしてみると

![Screenshot from 2017-08-02 21:14:04.png](https://qiita-image-store.s3.amazonaws.com/0/160346/5230fd95-47f4-7467-252d-6b79712b0b09.png)

成功しました。
とりあえず手元にあったrosbagのデータで試してみました。
僕の使用したデータは以下のコマンドでダウンロードできます。
```
wget http://pr.willowgarage.com/data/vslam_system/vslam_tutorial.bag
```
darknet_rosパッケージの中にあるdarknet_ros.launchを改造して以下のようなlaunchファイルを作りました。

```xml:darknet_test.launch
<?xml version="1.0" encoding="utf-8"?>
<launch>
  <!-- Config and weights folder. -->
  <arg name="yolo_weights_path"          default="$(find darknet_ros)/yolo_network_config/weights"/>
  <arg name="yolo_config_path"           default="$(find darknet_ros)/yolo_network_config/cfg"/>

  <!-- Load parameters -->
  <rosparam command="load" ns="darknet_ros" file="$(find darknet_ros)/config/ros.yaml"/>
  <rosparam command="load" ns="darknet_ros" file="$(find darknet_ros)/config/tiny_yolo_voc.yaml"/>

  <!-- Start darknet and ros wrapper -->
  <node pkg="darknet_ros" type="darknet_ros" name="darknet_ros" output="screen">
    <param name="weights_path"          value="$(arg yolo_weights_path)" />
    <param name="config_path"           value="$(arg yolo_config_path)" />
    <remap from="/camera/rgb/image_raw" to="/wide_stereo/left/image_rect" />
  </node>

  <node name="rosbag" pkg="rosbag" type="play" args="--clock /home/nao/Downloads/vslam_tutorial.bag" output="screen" respawn="false">
  </node>

 <!--<node name="republish" type="republish" pkg="image_transport" output="screen" 	args="compressed in:=/front_camera/image_raw raw out:=/camera/image_raw" /> -->
</launch>
```

#動かしてみた

```
roslaunch darknet_ros darknet_test.launch
```

![Screenshot from 2017-08-02 21:46:59.png](https://qiita-image-store.s3.amazonaws.com/0/160346/a15112ab-2c4b-cb05-a461-a59aed830826.png)


![Screenshot from 2017-08-02 21:44:53.png](https://qiita-image-store.s3.amazonaws.com/0/160346/2fcabe10-9e52-7636-83d4-176022d9c984.png)

![Screenshot from 2017-08-02 21:44:54.png](https://qiita-image-store.s3.amazonaws.com/0/160346/454432e1-c915-735f-8d15-107adacb7651.png)

大体うまく動いてるような気もしますが・・・
ところどころ誤認識してますね。
2つのtf.Sessionを並列で実行する

tf.Sessionを複数，それも並列に実行させたい場合には[オフィシャル](https://www.tensorflow.org/deploy/distributed)にもある通り，`tf.train.Server`を使えばよい．この方法を使うとSessionを複数定義することができ，並列に計算を行うことができる．multiprocessingと一緒に使う場合のサンプルは以下の通りになる：

```python:multiprocessing_with_tensorflow.py
import numpy as np
import tensorflow as tf
import multiprocessing as mp
import time

class Worker(object):
    def __init__(self, queue, target):
        self.sess = tf.Session(target)
        self.queue = queue
        self.a_plh = tf.placeholder(tf.float32, [2,2])
        self.b_plh = tf.placeholder(tf.bool)

    def main(self):
        while True:
            queue = self.queue.get()

            a, b = queue
            _a, _b = self.sess.run([self.a_plh, self.b_plh], \
                    {self.a_plh: a, self.b_plh: b})
            time.sleep(1)

            print("get queue : \n {} \n {}".format(_a, _b))

    def __call__(self):
        self.main()

cluster = tf.train.ClusterSpec({'local': ['localhost:2222', 'localhost:2223']})

server_host = tf.train.Server(cluster, job_name='local', task_index=0)
server_worker = tf.train.Server(cluster, job_name='local', task_index=1)

queue = mp.Queue()
worker = Worker(queue, server_worker.target)

p = mp.Process(target=worker)
p.daemon = True
p.start()

sess = tf.Session(server_host.target)

a = tf.random_uniform([2, 2])
b = tf.random_uniform([1])

while True:
    now = time.time()

    _a, _b = sess.run([a, b])
    time.sleep(3)

    queue.put([_a, bool(_b)])

    new_now = time.time()
    diff = new_now - now
    print("{0:3.3f} [sec]".format(diff))
```

`Worker`が並列に動き，`Queue`を通して得られた値を使って演算する（ここではただ中身を返すだけ）．実行結果は

```

3.034 [sec]
get queue :
 [[ 0.84218264  0.23204899]
 [ 0.18645024  0.48593903]]
 True
3.006 [sec]
get queue :
 [[ 0.62776446  0.90778756]
 [ 0.06188095  0.51110578]]
 True
3.002 [sec]
get queue :
 [[ 0.69087613  0.15397286]
 [ 0.90308774  0.81757426]]
 True
3.003 [sec]
get queue :
 [[ 0.36197078  0.58955324]
 [ 0.98018742  0.43241131]]
 True

```
のようになる． メイン（`server_host`）の計算が`server_worker`の計算を行なっている途中でも実行される．

ただし計算を実際に実行するリソースは限られているので，単純に並列化すればよいわけではない．
DataBindingとObservableField使用時にハマったこと

## 結論
public な ObservableField が入ったViewModelクラスを作る際には、get"ObservableField名"のメソッドをクラス内に作ってはいけない

### 前提
- Android Studio 2.3.1
- com.android.tools.build:gradle:2.2.3

問題の起きるコード

```ViewModel.java
public class ViewModel {
    public ObservableField<String> text = new ObservableField<>();
    public ObservableLong id = new ObservableLong(0);
    
    public String getText(){
        return this.text.get();
    }
    
    public void setText(String text){
        this.text.set(text);
    }

    public Long getId() {
        return this.id.get();
    }

    public void setId(long id) {
        this.id.set(id);
    }
}
```

```layout.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
            name="viewModel"
            type="com.example.ViewModel" />
    </data>

    <FlameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.example.CustomView
            android:id="@+id/custom"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:Text="@{viewModel.text}"
            app:Id="@{viewModel.id}" />
    </FlameLayout>
</layout>
```

```BindingAdapter.java
public class BindingAdapters {
    @BindingAdapter({"Text"})
    public static void setCustomViewText(CustomView customView, String text) {
        customView.setText(text);
    }

    @BindingAdapter({"Id"})
    public static void setCustomViewId(CustomView customView, long id) {
        customView.setId(id);
    }
}
```

### 起きること
- 上記のViewModelインスタンスのsetIdメソッドを呼んでもsetCustomViewIdメソッドが呼ばれない

### 解決法
- ViewModel.javaからgetTextとgetIdメソッドを削除する

### 原因
- ObservableField hogeの値をgetするメソッドの名前をgetHogeにするとなぜかActivityHugaBindingクラスにonChangeHogeViewModelメソッドが作られないなど、自動コード生成の一部に不正が発生し、ObservableFieldの値が更新されてもそれを検知できない
Configure Apps がない Slack


Slackの管理画面の左端にあるメニューから Team Settingを押すとConfigure Appsを見つけられます


<img width="1057" alt="スクリーンショット 2017-08-02 21.38.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/79f82a03-2884-1edf-f4bd-63b8f0c92d31.png">