OmniAICreator/Qiita-1.07M huggingface dataset:
DigiSparkでボタン入力を受け付けてPCにキー入力するまで

DigiSparkとは、PCのUSB端子に基盤ごと直接挿すとUSB HIDになれるマイコンボードです(直接挿せないタイプもあります)。USB HIDとして使わず、電源だけ取れるUSB端子に挿して使うこともできます。

Arduino IDEにDigisparkのボードパッケージを追加することで、Arduino IDEからDigiSparkにスケッチ(プログラム)を書き込むことができます。

# 準備
開発環境の準備からLチカプログラムの書き込みまではこちらを参照しました:
[[メモ] Digispark(ATTiny85) Arduino開発環境で、Lチカ](http://qiita.com/mt08/items/df4ed8c659b205d1fa1e)

DigiSparkの基盤上にLEDが実装されているので、DigiSpark単体でもLチカすることができます。基盤上のLEDはP1ピンと連動しています。

# ボタンとLEDを取り付けて動かしてみる
## ボタン(タクトスイッチ)とLEDの配線
LEDは青色のもの、抵抗は470Ω程度のものを用いました。青色LEDをP1ピンに繋いで、DigiSpark基盤上のLEDも同時に点灯させています。

![digispark-led-button.png](https://qiita-image-store.s3.amazonaws.com/0/137045/2b50e5e0-6feb-23df-7881-92fde993f104.png)

## スケッチの例
こちらのリポジトリにまとめておりますので、cloneしてお使いください:
https://github.com/mascii/digispark-test/

### ボタンを押すとLEDが消灯する例:
[led-button.ino](https://github.com/mascii/digispark-test/blob/master/02-led-button/led-button/led-button.ino)

![02-1.gif](https://qiita-image-store.s3.amazonaws.com/0/137045/616e3c34-9644-610a-d979-6f7c01ea174f.gif)

### ボタンを押している間、LEDが蛍のように発光する例
[led-button-firefly.ino](https://github.com/mascii/digispark-test/blob/master/02-led-button/led-button-firefly/led-button-firefly.ino)

![02-2.gif](https://qiita-image-store.s3.amazonaws.com/0/137045/19403546-8bd8-8547-143f-e19a9cbfbbf2.gif)

### PCにDigiSparkを接続してボタンを押すと、USBキーボードとして認識して `Hello!` と入力される例

[led-button-key-hello.ino](https://github.com/mascii/digispark-test/blob/master/03-led-button-key/led-button-key-hello/led-button-key-hello.ino)

![03-01.gif](https://qiita-image-store.s3.amazonaws.com/0/137045/b621c9bd-b4f9-f5cb-8323-2000eb69979c.gif)

### PCにDigiSparkを接続してボタンを押すと、Ctrl+Shift+Escによってタスクマネージャーが起動する例(Windows用)

[led-button-key-taskmgr.ino](https://github.com/mascii/digispark-test/blob/master/03-led-button-key/led-button-key-taskmgr/led-button-key-taskmgr.ino)

# まとめ
以下の理由でArduinoよりも若干敷居が高いのかなという印象を受けました

* Arduino IDEをインストールするだけではスケッチを書き込めない
* スケッチを書き込む前に一旦DigiSparkのUSB接続を解除し、再接続する必要がある
* Arduinoに比べ、資料が少ない

しかし、クローン品であればebayなどで200円未満で手に入ることもあり、作りたいものをブレッドボード上で試した後は直接はんだ付けしても良いくらいの手軽さはあるかと思います。
DigiSparkを知った・手に入れたきっかけが、コミックマーケット91(C91)でDigiSparkクローンによるLチカ入門キットを500円で手に入れたことでしたので、こういった即売会やプログラミング教室との相性は良いかもしれません。
Haskellで「ゼロから作るDeep Learning」（未完）

年末年始だ！コードを書こう！
ということで、「[ゼロから作るDeep Learning](https://www.oreilly.co.jp/books/9784873117584/) をHaskellでやる」というチャレンジをしてみました。
![zdl.gif](https://qiita-image-store.s3.amazonaws.com/0/9931/7deaac0a-fd0a-1b7e-e8b7-62f718942330.gif)

# なぜHaskellを使うのか?
* Haskellってなんかイケてるよね
* 本の通りにやるだけだと味気ないし
* [fusionとかいうの](http://bicycle1885.hatenablog.com/entry/2014/06/10/234448)があるらしいし、計算の効率性が求められそうなDeep Learningの分野でも、実はHaskellが向いてるんじゃない？というのを検証してみたかった

# 結論
**失敗。Haskell力が足りませんでした**

俺の屍を超えていけ、という気持ちで書いたコードを上げておきます。
https://github.com/spinylobster/my-deep-learning-from-scratch-in-haskell
~~進捗は全然ダメで、ニューラルネットの推論と学習までは書いたけど、実際に学習できるところまでは確かめられていない状態
誤差逆伝播法の実装ができていないので、4章の途中という感じ~~
*追記 2017/1/9: ちょっと進んで、ニューラルネットの学習まではできた状態
AdaGradの実装もしてるので、6章の途中という感じ*
Haskell力低いのでコードが煩雑なのと、本のコードにも沿ってないですが、各種ライブラリを使う際の参考にはなるかも

## 原因と考えるもの
* Haskellの勉強に時間を費やしすぎた
  * 忘れてた知識の再学習、Stackの使い方、モナド変換子、データのシリアライズなど
  * 元々、数年前に[すごいH本](https://www.amazon.co.jp/dp/4274068854)をやった程度だった
* Gnuplotの使い方の把握にも大分時間を使ってしまった
* 状態を持たないといけない計算があったが、それを書く方法を分かってなかった
* ~~行列の計算が安全じゃなくて、実行時エラーに悩まされた~~ -> [**型安全な計算できるっぽい！**](https://hackage.haskell.org/package/hmatrix-0.18.0.0/docs/Numeric-LinearAlgebra-Static.html)
  * Haskellで実行中の状態をデバッグするのめっちゃ難しい

## 使ったもの
* [Stack](https://docs.haskellstack.org/en/stable/README/) - これがないと各パッケージのインストールでこける。
* [Haskell超入門](http://qiita.com/7shi/items/145f1234f8ec2af923ef) - 基本的な文法を思い出すために
* [HMatrix](https://hackage.haskell.org/package/hmatrix-0.18.0.0) - NumPyに相当するもの。行列の計算。[Repa](https://hackage.haskell.org/package/repa)というのもあるらしく、後でパフォーマンスを比べようと企んでた
* [Gnuplot](https://hackage.haskell.org/package/gnuplot-0.5.4.1) - matplotlibに相当するもの。グラフの描画。使い方の把握は[ここ](https://github.com/wavewave/gnuplot/blob/master/src/Demo.hs)を見るのが早い
* [GHCiのデバッガ](http://www.kotha.net/ghcguide_ja/7.0.4/ghci-debugger.html) - 存在を初めて知った。遅延評価とデバッガは相性が悪いっぽい。めっちゃ使いづらかった
* その他のライブラリ - cabalファイルを参照

## 本の感想
* **めちゃくちゃ良い** 分かりやすい
* ニューラルネットの入門から、この先どういうことを学習していけば良いかまでカバーされている。**入門書としてこれ以上はないんじゃないか**と思う
* ただ、肝心のディープラーニングのところはぶっちゃけ余り理解できていない
  * CNNの畳み込み層の設計の意図が理解できていない
  * 自分の手で書いていないというのもあると思う
  * 他の資料と合わせて理解していきたい

## 参考になったURL
* VSCodeでHaskell環境整える
  * http://qiita.com/DUxCA/items/8e7a68ffee522bdd8918
* Macにgnuplotをインストール
  * http://mashiroyuya.hatenablog.com/entry/installgnuplot
* Haskellからgnuplotを使う
  * http://d.hatena.ne.jp/mmitou/20120912/1347441319
* hMatrixの使い方把握
  * https://github.com/albertoruiz/hmatrix/tree/master/examples
  * element-wise な計算は `+-*/` が使える
  * 行列に対するmapは`cmap`
  * `matrix * 2` のようなブロードキャストが出来る時とできない時がある気がする。良く分かってない
* Haskellライブラリ所感2016
  * http://syocy.hatenablog.com/entry/haskell-library-2016
* Haskellで型レベルプログラミング
  * http://konn-san.com/articles/2012-06-07-promoted-types-and-list-arguments.html
IWSで実行するジョブ内で、オリジナルのジョブストリーム名を取得する方法

アケオメデス。（哲学者の名前みたい。）
お仕事でタイトルのとおり質問を頂いたので、実験した結果を記録しておきます。

質問：
IWS（IBM Workload Scheduler）で実行するジョブスクリプト内で、UNISON_JOB変数を使用してオリジナルのジョブストリーム名を取得する方法は？
IWS 9.1の場合、UNISON_JOB変数には、＜ジョブストリームID＞.＜ジョブ名＞がセットされるが、これを＜ジョブストリーム名＞．＜ジョブ名＞にできないか。

回答：
グローバル・オプションのenLegacyIDをNO（デフォルト）からYESにすることで、UNISON_JOB変数に＜ジョブストリーム名＞．＜ジョブ名＞にできます。
グローバル・オプションの設定変更は、変更後の最初のFINALジョブストリーム実行後に有効になります。

参考：

enLegacyID = NO （デフォルト）の場合の、UNISON変数たち。
UNISON変数はIWSのジョブ毎に設定される変数。

UNISON_SCHED_EPOCH=1483488000
UNISON_CPU=IWS94
UNISON_DIR=/opt/IBM/TWA/TWS
UNISON_SCHED=TESTJS01
UNISON_SCHED_ID=0AAAAAAAAAAAAAEZ
UNISON_HOST=IWS94
UNISON_MASTER=IWS94
UNISONHOME=/opt/IBM/TWA/TWS
UNISON_SCHED_IA=201701040000
UNISON_JCL=/tmp/testjob01.sh
UNISON_EXEC_PATH=/opt/IBM/TWA/TWS/jobmanrc
UNISON_RUN=5
UNISON_JOB=IWS94#0AAAAAAAAAAAAAEZ.TESTJOB01
UNISON_JOBNUM=32463
UNISON_SYM=53
UNISON_STDLIST=/opt/IBM/TWA/TWS/stdlist/2017.01.04/O32463.1015
UNISON_SHELL=/bin/bash
UNISON_SCHED_DATE=20170104


enLegacyID = YESの場合の、UNISON変数たち。

UNISON_SCHED_EPOCH=1483488000
UNISON_CPU=IWS94
UNISON_DIR=/opt/IBM/TWA/TWS
UNISON_SCHED=TESTJS01
UNISON_SCHED_ID=CF17004AAAAAAAAC
UNISON_HOST=IWS94
UNISON_MASTER=IWS94
UNISONHOME=/opt/IBM/TWA/TWS
UNISON_SCHED_IA=201701040000
UNISON_JCL=/tmp/testjob01.sh
UNISON_EXEC_PATH=/opt/IBM/TWA/TWS/jobmanrc
UNISON_RUN=7
UNISON_JOB=IWS94#TESTJS01.TESTJOB01
UNISON_JOBNUM=1847
UNISON_SYM=63
UNISON_STDLIST=/opt/IBM/TWA/TWS/stdlist/2017.01.04/O1847.1036
UNISON_SHELL=/bin/bash
UNISON_SCHED_DATE=20170104

以上。
文字列を特定の区切り文字で分割して、CStringArrayの要素に格納する (CSVカンマ区切り) MFC

#文字列を特定の区切り文字で分割して、CStringArrayの要素に格納する(CSVカンマ区切り) MFC
タイトルが分かり難いな。。。
CSVカンマ区切りの文字列を分割してCStringArrayに格納したい事が良くあると思います。

そんな時の為に、私は、以下のような関数を利用しています。
もっと効率的な処理があると思いますが、わかりやすさ重視でこんな感じで書いています。

```cpp

//CString文字列を区切り文字を指定して、CStringArrayに分割する
void Split(CStringArray* pstrArray,LPCTSTR szTarget,LPCTSTR szDelimiter)
{
	if(!szTarget)
		return;
	if(!szDelimiter)
		return;
	if(!pstrArray)
		return;

	pstrArray->RemoveAll();

	CString strTarget(szTarget);
	size_t intDelimiterLen=0;
	size_t intStart=0;
	int intEnd=0;

	strTarget += szDelimiter;
	intDelimiterLen = _tcslen(szDelimiter);
	intStart = 0;
	while (intEnd = strTarget.Find(szDelimiter, intStart), intEnd >= 0)
	{
		pstrArray->Add(strTarget.Mid(intStart, intEnd - intStart));
		intStart = intEnd + intDelimiterLen;
	}
	return;
}

////使い方
CStringArray strArray;
CString strLineData;

Split(&strArray,_T("あ,い,う,え,お"),_T(","));
int iMaxCol=strArray.GetSize();
for(int iIndex=0;iIndex<iMaxCol;iIndex++)
{
	strLineData=strArray.GetAt(iIndex);
	//何かの処理。
	//
	//
}
```
MacBook Pro 2016 セットアップ　

新しく購入したので、セットアップした内容は、ここに記していく。
##環境
```
機種:	MacBookPro13
プロセッサ名:	Intel Core i5
メモリ:	16 GB
容量:	498.95 GB
OS:  macOS 10.12.2
```

macOS sierra　です。
立ち上げてすぐにOSのアップデートがあったので、元のVERSIONはわからず。

## アプリ
- google chrome 
- firefox
- evernote
- slack
- atom
- office365

## 開発系ツール群
* XCODE  
　appstoreから普通に入れた。
* commmand line developer tool  
　gitコマンドを打ったときに、ポップアップが出たので、インストールした。
* homebrew

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
　と打ったあとに、確認

```
$ brew -v
Homebrew 1.1.5
Homebrew/homebrew-core (git revision 919e; last commit 2016-12-30)
$ brew cask --version 'このあとインストールが走ったよ。ホントはね。
Homebrew-Cask 1.1.5

```
* git  
　terminalで```git --version```と打ったら、command line developer toolのインストールを促され、

```  
$ git --version
　xcode-select: note: no developer tools were found at '/Applications/Xcode.app', requesting install. Choose an option in the dialog to download the command line developer tools.
$ git --version
  git version 2.10.1 (Apple Git-78)
```
　　とりあえずOKなのか？

* maven

```
$ brew install maven
```
* gradle  
* intellij
* PyCharm
* Android Studio
* 

##開発言語系
* Java  
```brew cask install java```

　インストールが終わったので確認

```
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (1):
    1.8.0_112, x86_64:	"Java SE 8"	/Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home
```

　　JAVA_HOMEの設定

    $ vim ~/.bash_profile

　　開いて、  

    export JAVA_HOME=`/usr/libexec/java_home -v 1.8`

　　を追記して読み込み確認

    $ source ~/.bash_profile 
    $ java -version
    java version "1.8.0_112"
    Java(TM) SE Runtime Environment (build 1.8.0_112-b16)
    Java HotSpot(TM) 64-Bit Server VM (build 25.112-b16, mixed mode)

* Python  

　とりあえず2系はインストされている  

    $ python --version
    Python 2.7.10
    $ which python
    /usr/bin/python

3系を入れるかは、これから考える。
*
PICでAndroid Open Accessoryをつくる:03

#赤外線リモコン受信用AOA回路作成
赤外線リモコンの信号を受信しするAndroid Open Accessoryの回路を作成していきます。

##部品
- PIC24FJ64GB002-I/SP<br/>[秋月電子:340円](http://akizukidenshi.com/catalog/g/gI-08168/)(2016/12現在)<br/>02で作成した検証用回路の物を流用できます
- ブレッドボード BB-801<br/>[秋月電子:200円](http://akizukidenshi.com/catalog/g/gP-05294/)(2016/12現在)
- ブレッドボードジャンパワイヤ EIC-J-S<br/>[秋月電子:300円](http://akizukidenshi.com/catalog/g/gP-02315/)(2016/12現在)<br/>02で使用した残りを使用します
- カーボン抵抗 1/2W 10kΩ<br/>[秋月電子:100円](http://akizukidenshi.com/catalog/g/gR-07838/)(2016/12現在)<br/>02で使用した残りを使用します
- 抵抗内蔵5mm赤色LED OSR6LU5B64A-5V<br/>[秋月電子:120円](http://akizukidenshi.com/catalog/g/gI-06245/)(2016/12現在)<br/>02で使用した残りを使用します
- 三端子レギュレータ NJU7223F33<br/>[秋月電子:50円](http://akizukidenshi.com/catalog/g/gI-00432/)(2016/12現在)
- 積層セラミックコンデンサー 1μF 50V<br/>[秋月電子:100円](http://akizukidenshi.com/catalog/g/gP-03093/)(2016/12現在)
- 積層セラミックコンデンサー 10μF 50V<br/>[秋月電子:200円](http://akizukidenshi.com/catalog/g/gP-03095/)(2016/12現在)
- USBコネクタDIP化キット(Aメス)<br/>[秋月電子:120円](http://akizukidenshi.com/catalog/g/gK-07429/)(2016/12現在)
- 電源用マイクロUSBコネクタDIP化キット<br/>[秋月電子:130円](http://akizukidenshi.com/catalog/g/gK-10972/)(2016/12現在)
- 赤外線受信部
    - 受信モジュールブレッドボード直結の場合
        - 赤外線リモコン受信モジュール OSRB38C9AA<br/>[秋月電子:100円](http://akizukidenshi.com/catalog/g/gI-04659/)(2016/12現在)
    - 受信モジュールケーブル接続の場合
        - 赤外線リモコン受信モジュール OSRB38C9BX-W150CM<br/>[秋月電子:150円](http://akizukidenshi.com/catalog/g/gM-08628/)(2016/12現在)
        - 3.5mmステレオミニジャックDIP化キット<br/>[秋月電子:150円](http://akizukidenshi.com/catalog/g/gK-05363/)(2016/12現在)
- 電源部<br/>この回路ではAndroid機器の充電に使用されるマイクロUSBのACアダプタと、標準A―マイクロBの信号用USBケーブルが必要です。別途用意する場合は下記のようなものとなります。
    - ACアダプター5V2A<br/>[秋月電子:580円](http://akizukidenshi.com/catalog/g/gM-08310/)(2016/12現在)（下記ケーブルが別途必要）
    - USBケーブル　Aオス－マイクロBオス<br/>[秋月電子:100円](http://akizukidenshi.com/catalog/g/gC-09312/)(2016/12現在)（必要に応じた長さの物を使用）

##DIP化キットの組み立て
上記の各DIP化キットは、はんだ付けによる組み立てが必要ですので、事前に組み立てておきます。
（説明するほどの技量はないため、ここでは省略します）
なお、3.5mmステレオミニジャックDIP化キットについては、『Ｌ』寄りのGNDにピンヘッダを付けないことで、ブレッドボード上の配線の取り回しが若干楽になります。

##配線１
下図の通り配線していきます。
![ir_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/153698/1ff4c756-cc50-d1a9-12d2-bc862dc69c8f.png)

##配線結果１
![DSC_0097.png](https://qiita-image-store.s3.amazonaws.com/0/153698/0adc2acc-e2b7-23f2-2c6f-91a367248697.png)
※赤外線受信モジュールケーブル接続の場合は、赤外線リモコン受信モジュールは必要ありません。また、27bに接続されたワイヤを28bに接続します。

##配線２
下図の通り各DIP化キットを載せていきます。
「◎」は通電ピンです。「✧」は基盤固定用ピンです。
- 赤外線受信モジュールブレッドボード直結の場合
![ir_ブレッドボード2.png](https://qiita-image-store.s3.amazonaws.com/0/153698/eb624472-25eb-ec74-a14b-5de59ffcb83c.png)
- 赤外線受信モジュールケーブル接続の場合
![ir2_ブレッドボード2.png](https://qiita-image-store.s3.amazonaws.com/0/153698/cf6a4b13-fb09-bb88-9133-6b9816565b86.png)
![ir_回路図2.png](https://qiita-image-store.s3.amazonaws.com/0/153698/4b33b8df-1686-e6c0-0ba8-3bf929b9e90c.png)

##配線結果２
![DSC_0098.png](https://qiita-image-store.s3.amazonaws.com/0/153698/3edb0f55-7adb-2a81-d339-59d752f14516.png)
※赤外線受信モジュールブレッドボード直結の場合は、ステレオミニジャックの代わり赤外線受信モジュールとなります。

##今後
これで回路作成は終了となります。
次回からは、ファームウェアの作成を行っていきます。

##参考にさせていただいたサイトについて
- 回路<br/>[PIC24FJ64GB002でADKを試す（その１）](http://s2jp.com/2011/05/pic-adk-part1/)
スライサー（FDM式３Ｄプリンタ向け）の作成　其の８（閉領域の縮小アルゴリズム）

* [スライサー（FDM式３Ｄプリンタ向け）の作成　目次](http://qiita.com/isTwt/items/5d40286eec73296ea790)

-----

# １．はじめに
　今回は、 [其の７](http://qiita.com/isTwt/items/129ee9d06d79ee38d871)で求めたスライス面（閉領域）から出力結果となる要素を求めていく第１弾になります。
　まずは、モデルの輪郭となる外周を求めます。このとき利用するのが閉領域の縮小アルゴリズムになります。

# 2．求めるもの
　求める結果（数値）は３Ｄプリンタのノズルが通過する場所です。
　ノズルには一般的（？）に0.4[mm]など穴が開いていてそこからフィラメントが溶け出し、0.4[mm]径の樹脂で線を引き、それを繋ぎ合わせて立体化します。このため、ノズルの通過する線は出力する線の中心となります。
　つまり、[其の７](http://qiita.com/isTwt/items/129ee9d06d79ee38d871)で求めた閉領域はモデルの輪郭ではあるが、外周部分のノズルが通る線ではないのです。わずか（ノズル径の半分）に内側である必要があります。
　概念は以下のようになります。（外側がスライスした閉領域。内側が求める閉領域）

三角形状の場合
![tra.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/b085faa9-c459-4d9d-da1e-66e5d4fe336e.jpeg)

四角形状の場合
![sq.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/b541ab33-ae34-4160-3d59-472a48c887b6.jpeg)

実際はもっと複雑な形状．．．（簡単な方）
![oth1.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/093e9235-b9f3-a2a5-7007-e6d9a390237e.jpeg)

![oth2.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/7ed9c93f-d548-d398-5b0a-81c1db63a29f.jpeg)

# ３．基本的な考え方（ボツ）
　各稜線を法線と反対方向へ所定量移動し、隣接の稜線との交点を新たな点として構成することにより縮小された閉領域を求める。

![a1.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/a08b9468-250a-e54f-8e7f-37ad9f4dd063.jpeg)

　この方法は、縮小したい量に対し元となる閉領域が十分に大きい場合は問題無かったのですが、複雑な形状を試すうち破綻する場面が出てきたためボツにしました。

# ４．基本的な考え方
　各頂点を隣接稜線から得られるベクトルの和方向へ移動させ、問題なければ、新規頂点郡で構成される閉領域を生成する方式にしました。
　これは、前記ボツとなった考え方の問題解決のため、現在採用している方法です。（でも、凄く時間的コストがかかるため改良が必要と思っています）

![a2.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/2cff373f-9a72-2505-e37f-66e42b253ada.jpeg)

　横方向には十分縮小できるが、縦方向には十分な領域が無い以下の場合、ボツアルゴリズムでは、失敗までは分かるが最適解を求めるのにさらに考える必要がありました。

![a3.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/70a8deee-ba20-57ac-91ad-61e08066f169.jpeg)

　採用しているアルゴリズムでは、移動用のベクトルから交差点を求め、最適解を求められるため、現状採用しています。
　※最適解が人により，考えにより異なると思います。
　※ここでは、閉領域が１本の線になります。
 
 ![a4.JPG](https://qiita-image-store.s3.amazonaws.com/0/157557/dd56b23f-6546-b763-b207-797a58fc55f3.jpeg)
 
# ５．おわりに
　今回得られた閉領域は、モデルの輪郭を表す外周情報になります。実際にG-Codeとして出力するのは別の機会に。
　また、ここでの閉領域の縮小アルゴリズムは、外周に対しノズル径さらに縮小すると内周情報になります。内周は０～の本数あるため、パラメータに従い繰り返し、最後の内周（または外周）からノズル径の半分縮めるとインフィルを構成する閉領域情報となります。ここまでは本アルゴリズムで実施できます。
　インフィルについては次回。
sysstat( sar )を1分間隔にする方法

```
/etc/cron.d/sysstat
```

の、

```
# Run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib64/sa/sa1 1 1
# 0 * * * * root /usr/lib64/sa/sa1 600 6 &
# Generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A
```

を

```
# Run system activity accounting tool every 1 minutes
*/1 * * * * root /usr/lib64/sa/sa1 1 1
# 0 * * * * root /usr/lib64/sa/sa1 600 6 &
# Generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A
```

に変更する。
Windows起動時に実行するPowerShellスクリプトをタスクスケジューラにPowershellで登録する

確認した環境:Windows Server 2012 R2, PowerShell 4

---

PSScheduledJobモジュールを使って登録したタスクがスタートアップ時(Windows起動時)の実行に失敗する。タスクの実行時に使うユーザーアカウントをローカルシステムアカウントにすれば成功する。

```
タスクの開始が失敗しました
 タスク スケジューラは、ユーザー "[コンピューター名]\Administrator" の "\Microsoft\Windows\PowerShell\ScheduledJobs\[タスク名]" タスクを開始できませんでした。追加データ: エラー値: 2147943711。
```

タスクスケジューラでPowerShellスクリプトを実行するタスクは[PSScheduledJob モジュール](https://technet.microsoft.com/ja-jp/library/hh847802(v=wps.630).aspx)を使って*スケジュールされたジョブ*として登録する。PSScheduledJobモジュールには*スケジュールされたジョブ*の実行時に使うユーザーアカウントを指定する方法がない。*スケジュールされたジョブ*はタスクスケジューラのタスクでもあるので[Scheduled Tasks Cmdlets](https://technet.microsoft.com/ja-jp/library/jj649816(v=wps.630).aspx)を使って指定する。

```ps1
Register-ScheduledJob -FilePath $filepath -Name $name -Trigger @{Frequency="AtStartup"}

Get-ScheduledTask -TaskName $name | Set-ScheduledTask -User "NT AUTHORITY\System"
```
ショートカットを活用しよう - 3 - Win + Pause

# <kbd><kbd>Win</kbd> + <kbd>Pause</kbd></kbd> の効果
<kbd><kbd>Win</kbd></kbd>はWindowsのロゴマークのキーのことです。（大抵のキーボード配列で左下の<kbd><kbd>Ctrl</kbd></kbd>のとなりにありますよね。）
さて、押してみるとわかりますが、「コントロール パネル\システムとセキュリティ\システム」が表示されるかと思います。
環境変数を見たい場合や、デバイスマネージャーなどを呼ぶ際に。
また、新しく触るPCについてまずスペック確認をという場合にも。
ノートPCなんかだと、<kbd><kbd>Pause</kbd></kbd> は<kbd><kbd>Fn</kbd></kbd> を押しながらだったりするかと思います。

以上

|前回|方針|次回|
|:--|:--:|--:|
|[<kbd><kbd>Ctrl</kbd> + <kbd>Insert</kbd></kbd>](http://qiita.com/rrryutaro/items/dd475cc8500fbac3f9af)|[記事の方針](http://qiita.com/rrryutaro/items/74d60a6e31ff149c5710)|[<kbd><kbd>Win</kbd> + <kbd>R</kbd></kbd>](http://qiita.com/rrryutaro/items/9ad55f4f72e3a1d599b8)|
Windows IoT Core と Android Things の未来像


ちょっと強引ではありますが、今日の記事（書いているのは年を越していますが）で 2016 年のアドベントカレンダーはおしまいです。導入者向けに <a href="http://qiita.com/moonmile/items/d14faf1d15efc500bfc2">Windows IoT Core 事始め - Qiita</a> で Raspberry Pi の購入からスタートしているので、ひと通り眺めると Windows IoT Core で何ができそうか、が理解できると思います。

手元にあるのが Raspberry Pi 2/3 なので、Raspberry Pi を中心にして動かしてみたものを集めていますが、他の組み込みボードでも動かすことができます。

[Device Options | Windows IoT](https://developer.microsoft.com/en-us/windows/iot/explore/deviceoptions "Device Options | Windows IoT")

ちょっと注目したいのは「Pine 64」 <a href="https://www.pine64.org/">PINE64 – 64-bit Single Board Computer</a> ですね。もともと Kickstater で募集したものですが、Windows IoT Core が動きます。メモリが 1GB であれば、価格が $19.00 となり、Windows IoT Core が動くマシンとしては最安値ではないでしょうか。これは、年末に購入したので、届いたらレポートしたいと思います。

# Android Things が発表される

Raspberry Pi は Rasbian を入れて Linux マシンとして使うと同時に、micro SD カードを差し替えれば Windows IoT Core として動かすことができます。更に<a  href="https://developer.android.com/things/index.html">Android Things </a> でも動かすことができるようになりました。

![](http://www.moonmile.net/blog/wp-content/uploads/2016/12/image_thumb-6.png)

以前から、Raspberry Pi 上では（かなり遅いですが）Android 4.x を動かすことができましたが、GPU がスマートフォンよりも遅いせいかあまり実用的なものではありませんでした。まあ、実験的なものですよね。私もいくつかの RPi 互換機で Android を動かして試してはいるのですが、結構高機能な UI まわりがネックになっています。

Android Things は、ホーム画面のような高機能な UI を排した Android です。中身は、ほぼ通常の Android と変わらず、プログラムは Android Studio などを使って開発をします。

ええ、どこかで聞いたような科白ですよね。そう、ちょうど Windows IoT Core と同じコンセプトを Android Things は持っています。どちらも GPIO まわりのクラスライブラリをインポートすることで、LED の制御やサーボモーターなどを動かすことができます。

- Android Things では、従来の Android ライブラリを活用できる
- Windows IoT Core では、従来の Windows 10 のライブラリを活用できる

ということです。OpenCV を使うとか、音声認識を使うとか、（おそらく）SQLite を使うとか、音声認識を使うとか、そういうものが「省電力」な組み込みボードとして利用することができるのです。

# Windows IoT Core と Android Things + Xamarin の関係

Android Things は、通常の Android と同じ仕組み（どこが削られているか詳細はこれからなのですが）で動くので、Xamarin.Android を使うことができます。

![](https://pbs.twimg.com/media/CzzlwS-VEAEDa0A.jpg) 

この画像は、Raspberry Pi に Android Things を入れて、Xamarin.Android/Forms のサンプルコードを動かしたものです。こんな風に、本家となる Android 7.0 のグラフィック機能は Android Things 上でも動かすことができます。

こんな風に、組み込みボード上で、Windows/Android/Linux の3つの OS の使い分けができるようになっています。例えば、使いたいライブラリ（機械学習とか音声認識とか）を選択した後に、OS を選ぶということもできるようになってきました。プログラム言語も、Python や Java、C# などを併用できるという選択もあります。

# なぜ組み込みボードを使うのか？

果たして、初代 Raspberry Pi をロンドンから船便で送って貰った頃は、ワタクシ的には組み込みボードといえば「携帯電話の試験ボード」のことで、ソフトウェア屋さんから手が出せない分野でありました（組み込み系のプログラマの方にはもともと近い位置にいるのだろうけど）。

電子回路の設計とかをやったことが無かったので、Raspberry Pi にしても単なるストレージサーバーとして使うか、安価な Web サーバーとしての使い道しか思いつかなかった私ですが、Windows/Android/Linux を三者そろい踏みとなってくると、なかなか面白い感じのものが作れそうですよね。是非、皆さんも LED とブレッドボードを買ってきて、ソフトウェアの世界だけではなく「Lチカ」から組み込みボードの世界に入ってみてください。もちろん、安価かつ省電力な PC として Raspberry Pi などを使うのもアリです。いろいろと「scope for imagination」（ via 赤毛のアン）を駆使していきましょう。
githubのリポジトリを複数人で扱うときにすること

githubのリポジトリを複数人で扱うときのメモ。
会社のアカウントと個人アカウントを分けていて、会社のパソコンから
個人用のリポジトリにプッシュしたいなんて時も使える。
※個人用のgithubはpublicである場合が多いので、会社アカウントが外部に見られるのが
困る人はやらない方がいいかも

### 1.リポジトリのsettingをクリック
<img width="1057" alt="c35114a571bec69dfd0f773924b80051.png" src="https://qiita-image-store.s3.amazonaws.com/0/137894/97ba1e12-3dd1-f7d9-2d64-e2d4b6e57013.png">


### 2.コラボレータにユーザーを追加
<img width="1004" alt="d4d51a0db2a74386b9b552d5254f778a.png" src="https://qiita-image-store.s3.amazonaws.com/0/137894/69de3eea-8591-3205-2352-33ef0f45ddfc.png">

### 3.コラボレータに追加されたユーザーにメールが届くので承認リンクをクリックすれば完了！
Laravelでエラーを返す簡単な方法３つ

## 方法１ abort()

https://laravel.com/docs/5.3/helpers#method-abort

```*.php
Route::post('/task', function(Request $request) {
    if (!$request->user->is_admin) {
        abort(403, '権限がありません');
    }
}
```

## 方法２ abort_if()

https://laravel.com/docs/5.3/helpers#method-abort-if

```*.php
Route::post('/task', function(Request $request) {
    abort_if(!$request->user->is_admin, 403);
}
```

## 方法３ abort_unless()

https://laravel.com/docs/5.3/helpers#method-abort-unless

```*.php
Route::post('/task', function(Request $request) {
    abort_unless($request->user->is_admin, 403);
}
```


Laravel のヘルパーは便利なものが多いので、開発する前に一通り読んでおいたほうがいいですよ。

（英語）
https://laravel.com/docs/5.3/helpers
（日本語）
https://readouble.com/laravel/5.3/ja/helpers.html
big data updates 2017/1/4

新年一発目のHadoop Weeklyをざーっと読んでのひととおりのメモ。
https://hadoopweekly.com/Hadoop-Weekly-198.html

Databricksの2016年ブログポストおさらい。Spark2がリリースされたこともあって、DataFrames、Datasets推しな話が多い。

## [Integrating Deep Learning Libraries with Apache Spark](https://docs.databricks.com/applications/deep-learning/spark-integration.html): 

- Tensorflowを使った画像解析をSparkで分散実行するという話。学習済みのモデルをExecutorに配って ~~モデルパラレル~~ データパラレルな推論を実行するJupyter Notebookのサンプルがついている。

## [A Tale of Three Apache Spark APIs: RDDs, DataFrames, and Datasets](https://databricks.com/blog/2016/07/14/a-tale-of-three-apache-spark-apis-rdds-dataframes-and-datasets.html): 

- RDD, DataFrames, Datasetsのおさらい。まだDataFramesとDatasetsの明確な使い分けとかちゃんと追いきれていないけど、↓みたいなことができるのはうれしい。

```scala
val ds = spark.read.json("/databricks-public-datasets/data/iot/iot_devices.json").as[DeviceIoTData]
```
 
- Java的な型付けもされているのでスペース効率もあがると。
![image](https://qiita-image-store.s3.amazonaws.com/0/10292/a5fbbbec-5f36-b263-65e5-6e5601846994.png)

## [Introducing GraphFrames](https://databricks.com/blog/2016/03/03/introducing-graphframes.html)

- これまであまり触る機会がなかったグラフ処理だけど、DataFramesベースでクエリできるなら気軽に使えそう。

![image](https://qiita-image-store.s3.amazonaws.com/0/10292/ad5f5dd8-48ca-1e47-29ec-f681c35d8d89.png)

## [Structured Streaming In Apache Spark](https://databricks.com/blog/2016/07/28/structured-streaming-in-apache-spark.html)

- Streamingもこんな感じにStructuredな世界になっているのです。

```scala

// Read data continuously from an S3 location
val inputDF = spark.readStream.json("s3://logs")
 
// Do operations using the standard DataFrame API and write to MySQL
inputDF.groupBy($"action", window($"time", "1 hour")).count()
       .writeStream.format("jdbc")
       .start("jdbc:mysql//...")
```

---

Hortonworksブログからもいくつか

## [10 QUESTIONS ON HORTONWORKS DATA CLOUD FOR AWS](http://hortonworks.com/blog/10-questions-hortonworks-data-cloud-aws/)

- Hortonworks Data Cloud。Hortonworks製のEMRやQuoble、みたいな感じかな。違いは、クラウドコントローラーと呼ばれるデプロイアーも自分でEC2上に構築するということ。

##　[SPARKSQL, RANGER, AND LLAP VIA SPARK THRIFT SERVER FOR BI SCENARIOS TO PROVIDE ROW, COLUMN LEVEL SECURITY, AND MASKING](http://hortonworks.com/blog/sparksql-ranger-llap-via-spark-thrift-server-bi-scenarios-provide-row-column-level-security-masking/)

- タイトルが長くて、しかも全部大文字で読みづらくて何を言ってるかわかりづらいんだけど、SparkからLLAPを使いましょうっていう話。そこにRangerを入れるとSparkからのデータアクセスに対してカラムレベルのアクセス制御ができるよと。
- これは実際にためしてみた。[Zeppelin + Spark + Hive LLAP](http://qiita.com/imaifactory/items/a5b051c6a0bde7bf9913)。
【VirtualBox編】Windows Server 2012 R2にMovable Type 6をインストールする

# VirtualBox

## バージョン
VirtualBox バージョン 5.0.30

# サーバー OS

## 参考資料

> ▼Windows Server 評価版ソフトウェア
> https://www.microsoft.com/ja-jp/evalcenter/evaluate-windows-server-2012-r2

> ▼Windows OSのライセンス認証の猶予期間を延長する
> http://www.atmarkit.co.jp/ait/articles/1005/28/news108.html
> 評価版のライセンスが切れてしまったら
> ```C:\>slmgr -rearm```

## バージョン
Windows Server 2012 R2（64bit）
9600.17050.WINBLUE_REFRESH.140317-1640_X64FRE_SERVER_EVAL_JA-JP-IR3_SSS_X64FREE_JA-JP_DV9.ISO

## インストール
「Windows Server 評価版ソフトウェア」のページよりisoファイルをダウンロードしてインストールする。

# ウェブサーバー

## 参考資料

> ▼IIS での静的な Web サイトの構築
> https://technet.microsoft.com/ja-jp/library/hh831515(v=ws.11).aspx

## バージョン
Internet Information Services (Version 8.5.9600.16384)

# Perl

## 参考資料

> ▼The Perl for MS Windows, free of charge!
> http://strawberryperl.com/

> ▼ImageMagickとActivePerlを確実に動作させるたった一つの方法
> http://dqn.sakusakutto.jp/2011/11/imagemagick_activeperl.html

## バージョン
Perl 5.20.3.3 ６４bit
strawberry-perl-5.20.3.3-64bit.msi

## インストール
参考資料に基いてImageMagickと相性がよいPerlを調べたところ「Strawberry Perl Ver 5.20」と表記してあったので「5.20.3.3 / 64bit」をインストールする。
特に留意する点もなくデフォルトでインストールした。

# データベース

## バージョン
MySQL Community Edition (GPL)
MySQL Community Server 5.7.16
mysql-installer-community-5.7.16.0.msi

## インストール
「Choosing a Setup Type」画面で「Server only」を選択
「Type and Networking」画面の「Config Type」では「Development Machine」を選択
本番環境では「Server Machine」でもいいかもしれない。
その他はデフォルトでインストールした。

【注意】
ウィザードでインストールする際にrootのパスワードを設定する画面があるのだが、記号を入力するとパスワードが正しく設定できないようだ。

## テーブル

```
テーブルの作成
mysql> create database databesename;
```

```
テーブルができたか確認
mysql> SHOW DATABASES;
```

# Movable Type

## 参考資料

> ▼必要インストール環境と、ブラウザ動作環境
> https://www.movabletype.jp/documentation/system_requirements.html

> ▼Movable Type の設置 (Windows)
> https://www.movabletype.jp/documentation/mt6/installation/windows.html

> ▼Movable Type をさくらのVPSにインストールしてみよう
> http://knowledge.sakura.ad.jp/beginner/2074/

## バージョン
Movable Type 6.3.2
MT-6.3.2.zip

# Perl モジュール
```CAPN>　install DBD::mysql```

## インストール
「http://localhost/mt/mt-check.cgi」でチェックして、必要なPerl モジュールを洗い出す。

【注意】
マシンを再起動することで認識するPerl モジュールがあるので、再起動することに躊躇しないこと！

# ImageMagick

## 参考文献

> ▼ImageMagickとActivePerlを確実に動作させるたった一つの方法
> http://dqn.sakusakutto.jp/2011/11/imagemagick_activeperl.html

> ▼WindowsでPerlとImageMagickを使う
> http://elecdove.blog.fc2.com/blog-entry-2.html

## バージョン
ImageMagick-7.0.4-2-Q16-x64-dll.exe

## インストール
Movable Type側が認識してないようだ。

# PHP

## 参考文献

> ▼Windows 上での PHP インストーラ
> http://php.net/manual/ja/install.windows.tools.php

> ▼Windows 上での PHP の手動インストール
> http://php.net/manual/ja/install.windows.manual.php



## インストール
php-5.6.29-nts-Win32-VC11-x64.zip

IISの６４Bitということで「VC11 x64 Non Thread Safe (2016-Dec-08 21:51:11)」を選択しました。

# phpMyAdmin

## インストール
mysqliが入ってないと怒られたのでphp.iniにて「extension=php_mysqli.dll」のコメントアウトを外した。
Mac SierraでKarabiner/Seilの代替

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">新年だしそろそろSierraにしてみようかと軽い気持ちでポチったらKarabinerが使えなくなってて戦闘力が低下した…</p>&mdash; nori3tsu (@nori3tsu) <a href="https://twitter.com/nori3tsu/status/816418307414757376">2017年1月3日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

調べてみると、2017/1/4時点で、SeilはKarabiner Elementsとして再開発中, KarabinerはKarabiner Elementsの開発が完了してから対応、となっているようです。

* [Seil \- OS X用のソフトウェア](https://pqrs.org/osx/karabiner/seil.html.ja)
* [Karabiner \- OS X用のソフトウェア](https://pqrs.org/osx/karabiner/index.html.ja)

そこまで細かく設定を変更しているわけではないので、Karabinerの対応を待つ・カスタムしないで使うなどの選択肢も考えましたが、日々の効率に直結するため代替を探しました。結果、代替が見つかったので共有します。

## 環境

英字キーボードMac Book Pro 1台と日本語キーボードのMac Book Pro 1台。

## El Capitan時代の設定

### Karabiner


#### キーの入れ替え


英字キーボードで左⌘の空打ちで"英数"・右⌘の空打ちで"かな"、⌘と他のキーを組み合わせると左⌘として動作する設定にしていました。

例:
* 左⌘: 英数
* 左⌘+Tab: アプリ切り替え


![Screen Shot 2017-01-04 at 8.48.59.png](https://qiita-image-store.s3.amazonaws.com/0/5774/f6b1e58b-ffbe-34e0-6810-7753589e849f.png "Screen Shot 2017-01-04 at 8.48.59.png")

#### キーリピート

OSのキーボード設定によるキーリピートの変更だと、最速にしてもVimやTerminalの操作で効率がでないため、更に高速に動作するように設定していました。

### Seil

日本語キーボードの左⌘+各キーの組み合わせは左⌘を担当する親指の曲がりがきつく長時間キーボードを操作していると辛くなってくるので、英数を左⌘に割り当てていました。前述したKarabinerのキーの入れ替えと組み合わせることで、空打ちだと英数として動作して、他のキーを組み合わせると左⌘として動作するようになります。

## Sierraでの代替設定

次のソフトウェアとOSの設定を使うことでEl Capitan時代の設定を代替できました。

* [⌘英かな](https://ei-kana.appspot.com/)
* [GitHub \- tekezo/Karabiner\-Elements: The next generation Karabiner for macOS Sierra](https://github.com/tekezo/Karabiner-Elements)


### ⌘英かな

Karabinerのキーの入れ替えの代替です。設定はデフォルトのままで空打ちと組み合わせ時の動作に対応しています。

![Screen Shot 2017-01-04 at 9.03.32.png](https://qiita-image-store.s3.amazonaws.com/0/5774/efd823ce-9fbe-1d37-619c-7be6b0f8048b.png "Screen Shot 2017-01-04 at 9.03.32.png")

### Karabiner Elements

Seilの代替です。英数キーを左⌘に入れ替える設定を追加しました。

![Screen Shot 2017-01-04 at 9.04.27.png](https://qiita-image-store.s3.amazonaws.com/0/5774/dff1670f-c626-665a-c21d-40fe20948695.png "Screen Shot 2017-01-04 at 9.04.27.png")

### OSの設定

Karabinerのキーリピートの代替です。

Terminalから次の設定を変更して再起動すると有効になります。

```
キーリピート開始までの間隔
$ defaults write NSGlobalDomain InitialKeyRepeat -int 12

キーリピートの間隔
$ defaults write NSGlobalDomain KeyRepeat -int 1
```

* [OSX \- set fast keyboard repeat rate \(Example\)](https://coderwall.com/p/jzuuzg/osx-set-fast-keyboard-repeat-rate)
node モジュールの書き方メモ

### プログラムが大きくなってしまったので、ファイルを分割し、一部の関数を移動する。

```javascript

var modtest = require('./module_test.js');
```

といったプログラムで、関数ファイルを読み込みを行いたい。

- <b>読み込まれる関数

module.exportsをファイルの先頭に置く。

```javascript:module_test.js
module.exports = {
  create: TestFunction,        //読み込まれる関数名
}

function TestFunction(){  return{	//関数の実体

	mMatrix:[],			//メンバー変数（配列）
	mResult:undefined,	//メンバー変数
	
	fAdd1 : function( a, b ){
		this.mResult = a + b;
	},

	fAdd2 : function( a, b ){
		this.mMatrix[0]=a;
		this.mMatrix[1]=b;
		return( a + b );
	},

	ffunc : function( a, b, callback ){	//関数を受け渡す
		this.mResult =callback( a,b );
		return(this.mResult);
	},
}};
```

- <b>読み込む側の関数

```javascript:test.js
var modtest = require('./module_test.js');	//関数読み込み
// a1 が TestFunction としてクリエイトされる。
var a1 = modtest.create();	//関数のクリエイト

//TestFunction.fAdd1 をcall する
a1.fAdd1( 10, 20 );
console.log( a1.mResult );	//結果表示、a1のメンバー変数mResultを表示する。

//TestFunction.fAdd2 をcall する
console.log( a1.fAdd2( 30, 40 ) );
console.log( a1.mMatrix[0] );	//a1のメンバー変数mMatrix[0]を表示する。
console.log( a1.mMatrix[1] );	//a1のメンバー変数mMatrix[1]を表示する。

//TestFunction に関数を受け渡す
console.log( a1.ffunc( 10, 50, function(a,b){ return b-a; } ));

```
gulpに自動化させてes6でreactを書いてexpressの上に表示させたいと思った。

タイトル通り、最近よく聞くしreact?やってみるか
と思って記事漁ったけど新旧入り混じって阿鼻叫喚の図になったので
実際には使うもの(es6とかexpressとか)の組み合わせも異なったので大変でした。

# 目標
expressでサーバ立てる。
reactを使う。
es6を使う。
browserifyで一緒にする。
gulpで自動化する。

# 必要な要素
要は何につまづいたかっていう

- express
どうせならgulpで一緒にサーバも起動させたい。

- reactを使う。
reactをes6で書いてgulpで一緒にコンパイルしてしまいたい。

- es6を使う。
babelを使う...のだがbabelify7はオプションが必要。

- browserifyを使う。
コンパイルしてbrowserifyまでしたい。

- gulpを使う。
要はいろんな要素が絡み合っててめんどくさかったっていう話の記録。
（今gulpって使われてるのかな...ウェブ界隈早い怖い...）

# インストール
- グローバルで必要なもの
gulp
他にもあったよーな...

- プロジェクトで必要なもの
gulp こっちも
babel-preset-2015 2016の方はよくわからんかった
babel-preset-react 上とこれはgulpでes6とreact（jsxファイル）を扱うよう...？
babelify es6をコンパイルするくん、普通にnpmインストールすると7系になってオプションが必要に（ハマった）
browserify requireをやってくれるくん
express 使ってもいいし使わなくてもいい
react 主役
react-dom 脇役（ハマった）
vinyl-buffer
vinyl-source-stream gulpのための何か
gulp-live-server gulpでサーバを起動するためのもの

とりあえずこれらをnpmでインストール

# 各ファイル
とりあえず動くとこまで

```gulpfile.js
var browserify = require('browserify');
var gulp = require('gulp');
var babelify = require('babelify');
var source = require('vinyl-source-stream');
var buffer = require('vinyl-buffer');
var gls = require('gulp-live-server');

function errorHandler(err) {
    console.log('Error: ' + err.message);
}

gulp.task('browserify', () => {
    browserify('./src/index.jsx', {debug: true})
    .transform(babelify, {presets: ['es2015', 'react']})
    .bundle()
    .on('error', errorHandler)
    .pipe(source('script.js'))
    .pipe(buffer())
    .pipe(gulp.dest('./dist'))
    .pipe(browserSync.reload({stream: true}));
});

gulp.task('server', function() {
    var server = gls.new('./server.js');
    server.start();
});

gulp.task('watch', function(){
    gulp.watch('./src/*.jsx', ['browserify']);
    gulp.watch('./index.html', ['browserify']);
});

gulp.task('default', ['browserify', 'watch', 'server']);
```

まぁ、良くあるgulp
ファイル名については適宜それっぽい部分を書き換えればおk
見慣れないであろう部分について解説

```
.transform(babelify, {presets: ['es2015', 'react']}) 
```

babelify7系ではオプションとしてpresetsを指定する必要があるので
es2015とreactをそれぞれ指定。こいつらが先ほどnpmでインストールしたbabel-preset何ちゃら

```
gulp.task('server', function() {
    var server = gls.new('./server.js');
    server.start();
});
```

こいつでserver.js（中身はexpress周りのスクリプト、本題とは関係ないので割愛）を起動。

・・・expressあまり関係なかった。

```src/index.jsx
import React from 'react'
import ReactDOM from 'react-dom'

class TestBox extends React.Component {
  constructor(props) {
    super(props);
  }

  render() {
    return(
      <div className='testBox'>
        Hello, world!
      </div>
    );
  }
}

ReactDOM.render(
  <TestBox />,
  document.getElementById('container')
);
```

適当なjsxファイルを用意。
gulpを起動した時でもいいし、その後何かしらの変更点が加えられれば
自動的にこいつがコンパイルされるはず
注意すべき点はrenderはreact-domが担当していること。

あとは対象になるhtmlファイルを作ってあげる

```index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
  </head>
  <body>
    <div id="container"></div>
    <script src="dist/script.js"></script>
  </body>
</html>
```

こんな感じでやればidがcontainerのdivタグにscript.jsがうまいこと仕掛けてくれるはず。

これで目標達成めでたしめでたし
いやはやめんどくさかった。
”ゼロから作る Deep Learning”のための環境構築をdockerとVagrantで実現

# WHY

この記事を書こうと思った理由ですが下記の書籍を年末年始にやって勉強になったのですがPythonに慣れていないと詰まる部分もあり、環境構築に精神コストを削られてこの書籍を完了できない人が出てくるかなと思ったからです。

<img width="200" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/10496/f0ed3da5-987c-ac69-5736-66db11f76ecd.png">

[ゼロから作るDeep Learning ――Pythonで学ぶディープラーニングの理論と実装](http://www.oreilly.co.jp/books/9784873117584/)


# WHAT

詰まると思った部分は図の可視化です。図の可視化には`matplotlib`を使用するのですが環境構築の際に罠があり、それにはまると解消するのに時間的なコストがかかるケースがあります。

そこで誰でも同じ環境を構築できるDockerの出番です。私はVagrantにdocker用の環境を構築してdockerを使用しているので完全に手元のパソコンとは独立した環境を実現しています。

これを実現するのに使用した技術は下記です。

- Vagrant
- ansible
- docker
- ipython notebook

これらの技術により持ち運びが便利で分かりやすい環境を実現しています。

# HOW

実際にどのようにやるかです。

コードを取得してコードのフォルダに移動

```
git clone https://github.com/SnowMasaya/deep-learning-excerise.git
cd {ダウンロードしたフォルダ}
```

Vagrantを起動
Vagrantをすでに使用している場合はipアドレスはユニークになる様にしてください。

Vagrantfileの下記の部分を修正します。

```
config.vm.network "private_network", ip: "{修正するipアドレス}"
```

```
vagrant up
```

環境構築

```
ansible-playbook -i provisioning/hosts provisioning/site.yml
```

Dockerイメージを取得

```
docker pull masayaresearch/deep-learning-scratch-excerise
```

Dockerを起動してDockerにアクセス

```
docker run -p 8888:8888 -it masayaresearch/deep-learning-scratch-excerise bash
```

iPython Notebookを起動

```
ipython notebook --no-browser --port 8888 --ip=*
```

ブラウザにアクセス

```
http://192.168.33.25:8888
```

下記の画面が出るとipython notebookにアクセスできていることが分かります。

![Screen Shot 2017-01-04 at 8.16.58 AM.png](https://qiita-image-store.s3.amazonaws.com/0/10496/3ec1dcf0-68fd-5a76-773b-ba6958049eac.png)

deep-learning-1.ipynbに実際に画像の描画処理を行っているので参考にしてみてください。

![Screen Shot 2017-01-04 at 8.23.53 AM.png](https://qiita-image-store.s3.amazonaws.com/0/10496/8b997f1d-b289-77f1-66f3-999c89bab05d.png)

# コード

github

https://github.com/SnowMasaya/deep-learning-excerise/blob/master/docker/python/deep-learning-1.ipynb

Docker hub

masayaresearch/deep-learning-scratch-excerise

# 参考

https://github.com/oreilly-japan/deep-learning-from-scratch
go言語でDockerコンテナを操作する関数をテストする方法。（もっと楽な方法がある気がする）

go言語でDockerコンテナを操作する関数を書く機会がありました。テストコードを書くにあたり愚直にテストする以外方法が思いつかなかったが、実装した関数をシェアしておきます。もっと楽な方法を知っている方がいたらコメントしていただければ幸いです。

## テスト対象関数
今回実装した中で一番シンプルなコンテナを削除し、エラーを返す関数を例にとります。

```go:killContainer.go
func killContainer(containerID string) (err error) {
	cmd := "docker rm " + containerID
	err = exec.Command("sh", "-c", cmd).Run()
	return err
}
```
docker rmコマンドは、コンテナIDの冒頭を返すので、Output()を使って取得しても良いかもです。
##　テスト関数
```go:killContainer_test.go
func TestKillContainer(t *testing.T) {
	containerID, err := exec.Command("sh", "-c", "docker create alpine ls /").Output()
	if err != nil {
		t.Fatalf("コンテナ作成時にエラーが発生しました。%v", err)
	}
	err = killContainer(string(containerID))
	if err != nil {
		t.Fatalf("killContainer()実行中にエラーが発生しました。%v", err)
	}
	cmd := "docker ps -a | grep " + string(containerID[0:12])
	err = exec.Command("sh", "-c", cmd).Run()
	if err.Error() != "exit status 1" {
		t.Fatalf("コンテナを削除できていません。")
	}
}
```
execを利用してコンテナを作成し関数を実行、その後"dokcer ps -a"を実行し、grepでコンテナIDが存在するかどうか確かめています。

"grep xxx"で、標準入力されたもののうちxxxを含む行を返します。対象の行が存在しない場合"exit status 1"になるので、そこで存在を判断しています。

## 解説
みてわかるように非常に愚直な方法で実装しています。全部shellコマンド使っています。

テストはパスしたのでこれで良いような気がしますが、もっと楽な方法もある気がします。
Amazon Dash Button で Radiko をリモコンがわりに操作する

#### 動作環境
- MacBook Pro + OS X Mavericks
- node.js v6.9.1

## Amazon Dash Button を手に入れた

node のパッケージモジュールを使って、話題の Amazon Dash Button をハックできるらしいという情報を入手して、500円という値段もあり、興味本位で正月休みを利用して、何かできないかと考えてみた。

### セットアップ

[Amazon Dash Buttonを(正しくない方向で)使ってみた](http://qiita.com/takustaqu/items/8539b33780c9675c8657)

を参考に、セットアップ。

```shell-session:
$ sudo npm run scan
```

でつまずき、通信周りのモジュールがうまく起動しないようなエラーが出たので、node.js のヴァージョンを上げてみたり、一旦 `node_modules` を削除して、再度 `npm install` したりすることで、なんとか `scan` スクリプトは立ち上がる。最終的に Hello World なボタンの押下は確認できるようになった。

### が、いつも通り特にやることが見当たらない

#### 使えそうな利用法を想定してみる

まずワンボタンで何かするとしたら、インターホン的なものを想定してみるものの、すでに存在するものを上書きする必要もあまり無い。 Slack で何か通知しようかと思いきや、通知するものが特に思い当たらない。やはり何かリモコン的な使い道があるものはないか。と探っていった結果、いつも流しているラジオに辿り着いた。

#### Radiko を制御してみる

今までは OS X （macOS）の画面共有機能を使って、Radiko の選局をリモートで行っていたが、このボタンで出来てもいいかなと思い立つ。

### node でブラウザ的制御を行うために、 Selenium をいれる。

Chrome での起動が理想的だったが、OSの環境が古いせいか、どうもうまくいかないので、比較的導入し易い Firefox を利用するために `geckodriver` もインストール。

```shell-session:
$ npm -g install selenium-webdriver
$ npm -g install geckodriver
```

これで、Firefox を利用できるようになったので、

[Selenium WebDriverで実践的テストケースを作成する（node.js編）](https://solutionware.jp/blog/2016/03/30/selenium-webdriver%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%83%86%E3%82%B9%E3%83%88%E3%82%B1%E3%83%BC%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%EF%BC%88node-js%E7%B7%A8%EF%BC%89/)

を元にテストしてみる。

```js:
var webdriver = require('selenium-webdriver');
var driver;

driver = new webdriver.Builder()
.forBrowser('firefox')
.build();

driver.get('https://www.google.co.jp/').then(function(){
  driver.quit();
});
```

Firefox が立ち上がり、 Google が表示されて閉じられる。このコードを先ほどの dash-button 取得のものに取り込んで修正してみる。

### ラジコのサイトへアクセスし、選局する

サイトの要素は `findElements()` を使って取得する。

```js:
driver.findElements(webdriver.By.css('#station-list li')).then((stationslist) = > {
  stations = stationslist.length;
});
```

上記のコードで、地域ごとに異なるはずのラジオ局の数が取得できる。関東の場合は13局。この要素内をボタン押すごとに順繰り回して選局してゆく。要素を `click()` することで画面と音声が切り替わるので、以下のような記述で順に切り替えてゆける。

```js:
if (ch > stations) ch = 1;
driver.findElement(webdriver.By.css('#station-list li:nth-child(' + ch + ')')).click();
ch++;
```

最終的には以下のようなコードになった。

```js:app.js
const DashButton = require("dash-button");
const PHY_ADDR = "xx:xx:xx:xx:xx:xx";

let button = new DashButton(PHY_ADDR);

const webdriver = require('selenium-webdriver');

let driver;
let By = webdriver.By;

let stations;
let ch = 1;

driver = new webdriver.Builder().forBrowser('firefox').build();
driver.get('http://radiko.jp/').then(() = > {
  driver.findElements(webdriver.By.css('#station-list li')).then((stationslist) = > {
    stations = stationslist.length;
  });
});

button.addListener(() = > {
  if (ch > stations) ch = 1;
  console.log(ch + '/' + stations);
  driver.findElement(webdriver.By.css('#station-list li:nth-child(' + ch + ')')).click();
  ch++;
});
```

ただ、選局は地デジよりも遅いレスポンスなので、単純にラジオの音声の ON/OFF だけでもいいかなと思った次第。そして何よりもこのリモコンをどこに置くかという点で、radiko 起動の Mac の前に置くくらいだったら、操作した方が早いというのが難点。さらにこの起動が面倒なので Macの起動時にこいつが立ち上がる工夫も施したいところ。この状態で未完成のまま一旦放置。

Selenium との組み合わせで何かしら面白いことはできそう。

一応 [Github](https://github.com/tscp/radiko-dash-button) にも公開してみた。
ESP8266 > Link > Triangulation (三角測量) (をしようとしている) / RSSIでの距離測定はx / Time of flightを使用

ESP8266を複数使ってのTriangulation (三角測量)の検討動画を見つけた。

https://www.youtube.com/watch?v=RSQK5w6LMSc&list=WL&index=32

以下、だいたいの内容 (**間違っているかもしれません**)

- 3D Localization (もしくはTriangulation と言っている)
- ESP8266同士を通信させる
- カスタム割込みハンドラを使用
- 送信元、送信先のMACアドレスとその時刻を取得
- 4:15頃 Triangulation
  - > If we can evaluate the model for the ESPs ???, Then we can also use these ESPs for Triangulation.
  - ESPs ???の部分はリスニングできず (ESPs are のように聞こえるが文法的に?)
- RSSIについても言及 (4:30頃)
  - RSSIでの距離測定は完全に正しいとは言えない
  - RSSIは非常に小さい空間でも変化してしまうため、距離計算には使いずらい
  - [RSSIの測定動画](https://www.youtube.com/watch?v=aqqEYz38ens&list=PLDRymMFQl3Nktk_pjlUP_wbLIXre3sody)
- このシステムではTime of flightを使用
- hopefully 
  - うまくいけば、というような訳があいそう

実際に位置測定まではできていないが、このアイデアを元に、複数のESP8266を近辺に設置して、三角測量を使って「現在地」を割出すという考えは面白そう。

登山者がある地点の近辺に、CR123A(3V 1400mAh)駆動のESP8266を複数設置して、その範囲内で行動すると、登山者の位置を割り出しできるかも。
複数設置したESP8266は環境負荷とならないように、後で回収できるようにするためスタンドにくくりつけるなどの工夫は必要。
Star Trekで出てくる、敵による転送防止用に地面に立てる三脚のようなものがいいかもしれない。
技術英語 > Where and when would you [choose one over the other]? / It's too late now to study.

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 266 / 12833)

プログラミング言語を選択することについて

> Where and when would you **<font color=red>choose one over the other</font>**?

関連: [新しいものと古いもの（それぞれの有用性）](http://qiita.com/sjuny/items/e7611c4b70fd130193b5)

僕の場合は、「言語を選択する」というよりも、「自分が行いたいものをするためにはこの言語を使うことになる」というのが最近の傾向だ。

- Raspberry Piを使うことにしたのでPythonを始めた
- Unityを使うことにしたのでC#を始めた
- データ処理を簡単にしたいのでRを始めた
- SketchUpで楽をしたいのでRubyをかじった

<hr>
関連して思いついたのは

http://ejje.weblio.jp/content/%E6%B3%A5%E7%B8%84
> 泥縄
> 今さら勉強したって泥縄だよ. It's too late now to study [to cram for the examination].

試験はともかく、人生においては「いつ入門しても、再入門しても」いいと思う。

@ 日経ビジネスAssocie 2012/08 時短術
>  時短で自分をいじめない by 佐々木かをり
> 「やりたいことがあふれちゃうという話ですね。それは今日できないだけで、いつかはできる。本当にやりたいことなら、最終的にはできますよ。」
VirtualBoxの共有フォルダ機能をAlpineLinuxで使う

# VirtualBoxの共有フォルダ機能をAlpineLinuxで使う
だいぶ詰まったのでメモさせて頂く
## 環境
alpine-standard-3.5.0-x86_64
virtualbox 4.3.12

## virtualboxで共有フォルダを作成
これは解説記事がたくさんあるので省略
[【Virtual Box】共有フォルダ作成](http://qiita.com/skyzhao/items/20e04dff1cf277d330a1)
今回の場合では,

- フォルダ名: "doc"
- 自動マウント: on
- 永続化: on

とした

## リポジトリの切り替え
VirtualBoxの共有フォルダ機能を有効にするためにはそのパッケージをインストールする必要がある.
しかしAlpineLinuxの安定版のリポジトリにはそれが存在しないので(2017/01/04現在),開発版のリポジトリに切り替える必要がある.
[公式wikiの記述](https://wiki.alpinelinux.org/wiki/Upgrading_Alpine#Upgrading_to_Edge)を参考にする.

```:/etc/apk/repositories
#/media/cdrom/apks
#http://mirror.leaseweb.com/alpine/v3.5/main
#http://mirror.leaseweb.com/alpine/v3.5/community
http://mirror.leaseweb.com/alpine/edge/main
http://mirror.leaseweb.com/alpine/edge/community
http://mirror.leaseweb.com/alpine/edge/testing
```

こんな感じに書き換える
## AlpineLinuxを開発版にする
```
# apk upgrade --update-cache --available
```
`--update-cache`はリポジトリのインデックスの更新をupgradeの前に行うオプション
`--available`は全てのパッケージを強制的に更新するオプション
このコマンドを実行しないと,

```
depmod: WARNING: could not open /lib/modules/4.4.39-4-grsec/modules.order: No such file or directory
depmod: WARNING: could not open /lib/modules/4.4.39-4-grsec/modules.builtin: No such file or directory
```

のようなエラーが出て必要なパッケージがインストールできない.
## パッケージをインストールする
```
apk add virtualbox-guest-modules-virtgrsec
apk add virtualbox-guest-additions
```
## モジュールが自動的に読み込まれるようにする
AlpineLinuxはデーモンの起動にopenrcを使っている.
openrcでのデーモンの自動起動設定は以下のように行う.

```
rc-update add virtualbox-guest-additions default
```

rebootしたあと,`dmesg | grep vboxsf`と入力してみて

```
[   17.183842] vboxsf: Successfully loaded version 5.1.12 (interface 0x00010004)
```

のようなログが出てくればOK

`/mnt/sf_(共有フォルダ名,今回の場合はdoc)`にフォルダができていれば成功.
OpenCVのtraincascadeの使い方

# オプション

```
Usage: opencv_traincascade
  -data <cascade_dir_name>
  -vec <vec_file_name>
  -bg <background_file_name>
  [-numPos <number_of_positive_samples = 2000>]
  [-numNeg <number_of_negative_samples = 1000>]
  [-numStages <number_of_stages = 20>]
  [-precalcValBufSize <precalculated_vals_buffer_size_in_Mb = 1024>]
  [-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb = 1024>]
  [-baseFormatSave]
  [-acceptanceRatioBreakValue <value> = -1>]
--cascadeParams--
  [-stageType <BOOST(default)>]
  [-featureType <{HAAR(default), LBP, HOG}>]
  [-w <sampleWidth = 24>]
  [-h <sampleHeight = 24>]
--boostParams--
  [-bt <{DAB, RAB, LB, GAB(default)}>]
  [-minHitRate <min_hit_rate> = 0.995>]
  [-maxFalseAlarmRate <max_false_alarm_rate = 0.5>]
  [-weightTrimRate <weight_trim_rate = 0.95>]
  [-maxDepth <max_depth_of_weak_tree = 1>]
  [-maxWeakCount <max_weak_tree_count = 100>]
--haarFeatureParams--
  [-mode <BASIC(default) | CORE | ALL
--lbpFeatureParams--
--HOGFeatureParams--
```

vecファイルを入力として、haar, LBP, HOGなどの特徴を指定して学習データを出力する。訓練用の正例・負例が4など少ない状態で動かしたらエラーになったので数を増やしたら動いた・・・。正例1000、負例80、-numStages 1なら動くことを確認した。訓練時間は1分もかからなかった。正例7000、負例3000は必要らしい。


下記のようなエラーになるときは訓練データ数が足りていない。または-numStagesが大きすぎる。

```
===== TRAINING 1-stage =====
<BEGIN
POS curreOpenCV Error: Bad argument (Can not get new positive sample. The most possible reason is insufficient count of samples in given vec-file.
) in get, file /Users/user/miniconda3/conda-bld/work/opencv-2.4.12/apps/traincascade/imagestorage.cpp, line 154
libc++abi.dylib: terminating with uncaught exception of type cv::Exception: /Users/user/miniconda3/conda-bld/work/opencv-2.4.12/apps/traincascade/imagestorage.cpp:154: error: (-5) Can not get new positive sample. The most possible reason is insufficient count of samples in given vec-file.
```

エラーなく終了すると、

```
-rw-r--r--  1 kt  staff  1170 Jan  4 05:44 cascade.xml
-rw-r--r--  1 kt  staff   594 Jan  4 05:44 params.xml
-rw-r--r--  1 kt  staff   384 Jan  4 05:44 stage0.xml
```

これらのファイルが出力される。caccade.xmlをサンプルで使っているxmlの代わりに使えば認識できるはず。要確認。

# 計算時間(-stageNum 1)

* 24x24 正例1000, 負例500で1分20秒
* 24x24 正例1000, 負例1000で2分12秒 (負例の数も影響する）
* 24x24 正例2000, 負例1000で3分59秒 (正例の数は大きく影響する）

# 学習結果のキャッシュ

xml出力ファイルにstageファイルができていて、それを消さないと最学習はしない。-stageNumを増やしたとき、キャッシュがあるときはそれを使う。
特定の文字列を削除するUNIXコマンド

#コマンド
```シェルスクリプト:delコマンド
function del(){
    sed "s/$1//g" </dev/stdin
}

```
※「</dev/stdin」はなくても可！入れる意味なし！

#結果
```
$ echo "No1にならなくてもいい。No2じゃダメなんですか？" | del "No2じゃダメなんですか？"
No1にならなくてもいい。

$ echo "Qiitaa" | del "a$"
Qiita
```

#.bashrcに入れよう
tr -dだと「文字列」を削除することができないので、特定の文字列を削除したいことがよくある人は**.bashrc**にdelコマンドを入れておくと便利です。

#自分用のdelコマンドを作ろう
しかし、**.bashrc**に入れた場合…他のシェルスクリプトから「del」を呼んでも機能しません。（最近気付きました）
他のシェルスクリプトからdelコマンドを呼びたい場合は、下記のようなシェルスクリプトを作成し、実行権限を付与した上で、```echo $PATH```して出てくるフォルダのどれかに入れましょう。そうすることで、他のシェルスクリプト内からdelコマンドを呼び出すことが出来ます。

```シェルスクリプト:del
#!/bin/sh

#
# del 文字列を削除するスクリプト
#

sed "s/$1//g"

```
lolcatは美しいが役に立たない

本当に、役に立たないかどうかは分からないが、心が和むのは間違いない。
lolcatは 「rainbow coloring for text」 というもので、ゲイテイストな出力をしてくれるコマンドです。

# Environment

* Raspberry Pi Ubuntu 16.04 LTS

# Install

ubuntuならapt-getでインストール。

```
$ sudo apt-get install lolcat
```

ruby製なのでgemでもOK。

```
$ gem install lolcat
```


# lolcat

実に美しい。
![lolcat-01.png](https://qiita-image-store.s3.amazonaws.com/0/11595/6e541a7d-4d4c-d415-236b-1512f010578a.png)


でも、これだけだと飽きるので、ログイン時にcowsayでしゃべる牛の色を変えてあげようとおもいます。


牛関連をインストール

```
$ sudo apt-get install fortune cowsay
```

motdのスクリプトを新規作成。

```shell-session
$ cat /etc/update-motd.d/01-main
#!/bin/sh
/usr/games/fortune | /usr/games/cowsay | /usr/games/lolcat -f
```

ログイン。

![lolcat-02.png](https://qiita-image-store.s3.amazonaws.com/0/11595/e85b078f-0d87-50b2-f609-785dd5b25939.png)
Open-jtalkとviqoでニコ生のコメント読み上げ

　viqo (https://github.com/diginatu/Viqo )とopenjtalk 1.07を使ってコメントを読み上げるスクリプトを書いてみた。
　ここ
https://github.com/diginatu/Viqo/wiki/%E8%AA%AD%E3%81%BF%E4%B8%8A%E3%81%92
を参考にしようと思ったけどopen-jtalkのバージョンが変わった為かセグメントエラーが出ていたので修正した。

入力をechoのパイプで渡していたのを一旦ファイルに書き込んで渡すようにした。

```
#以下のディレクトリは環境に応じて適宜変更
TMP=$HOME/Commentread/voice.wav
VOICE=$HOME/Commentread/voices/mei_normal.htsvoice
DIC=/var/lib/mecab/dic/open-jtalk/naist-jdic

touch $TMP

echo $1 !> text

open_jtalk -m $VOICE -x $DIC -ow $TMP text

aplay --quiet $TMP

```

これをviqoのコマンドタブ、コメント受信時のとこに指定すればおｋ
CentOS7にpython3環境を構築する

# 0.事前に
このページの手順に則ってpython3の環境を構築後、
scikit-learnを使った処理を実行しようとしたところ、下記のエラーが発生した。

```bash
ImportError: No module named '_bz2'
```

調べたところ、bzip2-develが必要らしいので下記インストール。

```bash
$ sudo yum install bzip2-devel
```
この上で「1.python3.5のインストール」から再度やり直したところうまくいったので、同じ件でハマった方はご注意ください。

# 1.python3.5のインストール

ここではpython3.5.1をインストールする。
利用環境はGoogle Cloud PlatformのCentOS7

```bash
# ダウンロード
$ cd /tmp
$ curl -O https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
$ tar zxf Python-3.5.1.tgz
$ cd Python-3.5.1

# prefixに指定したディレクトリへインストールする
$ ./configure --prefix=/usr/local
$ make
# ここではroot権限でインストールしているが、私的利用であればsudoをつける必要はない
$ sudo make altinstall
```

# 2.virtualenvを使ってpython3.5環境を構築
virtualenv自体はインストール済(入れていない場合は```$ pip install virtualenv```でインストールできる)

```bash
$ pip freeze | grep virtualenv
virtualenv==15.0.3
```

python3.5環境を構築

```bash
$ cd /usr/share/virtualenv/

# 作成
# ここではroot権限でインストールしているが、私的利用であればsudoをつける必要はない
$ sudo virtualenv -p /usr/local/bin/python3.5 venv35

# 有効化
$ . venv35/bin/activate

# 確認
$ which python
/usr/share/virtualenv/venv35/bin/python

$ which pip
/usr/share/virtualenv/venv35/bin/pip
```

# 3.利用したいライブラリをインストール
用途・目的に合わせて必要なpythonライブラリをインストールする。

```bash
# ここではroot権限でインストールしているが、私的利用であればsudoをつける必要はない
# rootで実行する場合、pipのパスを明示的に指定してやる
$ sudo /usr/share/virtualenv/venv35/bin/pip install \
  numpy \
  scipy \
  sklearn \
  gensim \
  mecab-python3 \
  nltk
```