OmniAICreator/Qiita-1.07M huggingface dataset:
Macでローカルサーバー構築あれこれ

#・一番手っ取り早い方法
一番手っ取り早い方法は、ターミナルでpythonコマンドを１行叩く方法。

`python -m SimpleHTTPServer 8888`

これでURLを `http://localhost:8888/` とすれば
ブラウザから動作確認できる。

※ 機械学習やDeepLearningのために Anacondaをインストールした方などは、
上記コマンドで怒られる可能性があるので手っ取り早くしたい場合は、こっちで
`python -m http.server 8888`


動作確認したいhtmlのファイルなどがある階層へ`cd`等で移動し
そこで`python -m SimpleHTTPServer 8888`を叩けば、ブラウザで確認できるので
どのファイルも確認が可能。


※サーバーの停止は、`[control] + [c]`



#・違う方法
MacOS X 以降の最近のMacは、最初からPHPやApacheが入っている。
デフォルトで「不使用」になっている設定を少し変えるだけで利用可能。

`php -v`
で、PHPのバージョンが確認できる。
また、
`httpd -v`
でApacheのバージョンが確認できる。

##Apacheの起動（httpdの起動）と確認
1.起動、停止、再起動
Apacheを起動するには、`sudo apachectl start`

停止するには、`sudo apachectl stop`

再起動するには、`sudo apachectl restart`
を叩けばよい。

※`sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist`
とするとhttpを自動起動することも可能

2.確認
CLI上で確認する方法と、ブラウザで確認する方法がある。 

CLI上で確認するには、`ps aux | grep httpd`を叩いて、
グレップコマンドそのもの（hogehoge  36119  0.0  0.0  2436878  820  s000  S+  4:18PM  0:00.00  grep  httpd）以外にプロセスが立ち上がっていれば成功。

ブラウザで確認するには、`http://localhost` をWeb検索してみて、 
￼『It works!』と画面に表示されれば成功。

※`http://localhost/`の中身は/Library/WebServer/Documents/に配置されている(システムルート)。つまり、`http://localhost`をブラウザからアクセスした場合、画面に表示されているのは、/Library/WebServer/Documents/index.html.enの中身。




##その他の設定

（不便なことに/Library/WebServer/Documents/ディレクトリのownerはrootになっている。システムルートディレクトリではなくユーザのディレクトリを使って作業したほうが効率が良い。）

 今の状態では、ディレクトリ階層を1つ降りて、
/Library/WebServer/Documents/hogehoge/index.html
というファイルを作成した場合、`http://localhost/hogehoge/`にアクセスすると、

```
Forbidden
You don't have permission to access /hoge/ on this server.
```
と表示される。

Forbiddenされないために、下記のようなApacheの設定ファイル修正が必要である。

1.ユーザディレクトリの有効化
`#sudo vi /etc/apache2/httpd.conf`をターミナルで叩き、
`LoadModule userdir_module libexec/apache2/mod_userdir.so`⇦
と、
`# User home directories`
`#Include /private/etc/apache2/extra/httpd-userdir.conf`⇦
⇦の２行のコメントアウトを除去（アンコメントする）。



2.ユーザディレクトリの作成
`mkdir ~/Sites`
ホームディレクトリにSitesというディレクトリを作る。
このディレクトリの中にindex.htmlなどを作成。

`sudo vi /etc/apache2/users/ユーザ名.conf`で
/etc/apache2/users/以下にユーザ単位の設定ファイルを作る。

```
<Directory "/Users/ユーザ名/Sites/">
AllowOverride All
Options Indexes MultiViews
Options +FollowSymLinks
Require all granted
</Directory>
```
最後にApacheを再起動（`sudo apachectl restart`）して設定を反映させれば、
`http://localhost/~ユーザ名/`で~/Sites以下のファイルにアクセスできる。



3.PHPを使いたい場合
`vim /etc/apache2/httpd.conf`
を叩き、ファイル中の
`#LoadModule php5_module libexec/apache2/libphp5.so`
の行頭の#を消せば、Webサーバ上でPHPが使えるようになる。

※設定ファイルの更新内容を反映させるためにはApacheの再起動が必要なので注意！



###【参考サイト】
▼Macでローカルサーバを立ち上げる方法
http://qiita.com/shuntaro_tamura/items/bdabcb77926dc92617b1
Makefile における := と = の違い

`Makefile` をみると変数への値の代入で `:=` と `=` の二種類が使い分けられていることがあります．

# 簡単に言うと
* `:=` は即時評価
* `=` は遅延評価

です．

# 具体的に
例として `ls` コマンドを実行する Makefile を作ります．
`$(CMDLINE)` に `ls` コマンドを実行するためのコマンドラインを格納し，`all` ターゲットで実行します．
`$(LSOPT)` に `ls` コマンドへのコマンドラインオプションを入れます．
本例では `$(LSOPT)` は `$(CMDLINE)` の定義後に定義します．これにより即時評価と遅延評価の差をわかりやすくします．

## `:=` の場合
`$(CMDLINE)` には `$(LSOPT)` の内容は反映されておらず，単純な `ls` が実行されます．

```mf:Makefile_colon
CMDLINE := ls $(LSOPT)
LSOPT = -al

all:
        $(CMDLINE)
```
```bash
% make -f Makefile_colon
ls
Makefile_colon  Makefile_equal
```

## `=` の場合
`$(LSOPT)` が `$(CMDLINE)` の後に定義されているにもかかわらず，`$(CMDLINE)` は `ls -al` となっており `$(LSOPT)` が反映されています．

```mf:Makefile_equal
CMDLINE = ls $(LSOPT)
LSOPT = -al

all:
        $(CMDLINE)
```
```bash
% make -f Makefile_equal
ls -al
合計 16
drwxr-xr-x  2 sae sae 4096  8月 21 17:00 .
drwxr-xr-x 11 sae sae 4096  8月 21 16:47 ..
-rw-r--r--  1 sae sae   53  8月 21 16:59 Makefile_colon
-rw-r--r--  1 sae sae   52  8月 21 16:58 Makefile_equal
```

# 参考 URL
[GNU Make manual - 3.7 How make Reads a Makefile](http://www.gnu.org/software/make/manual/make.html#Reading-Makefiles)
[Unity]敵の位置を指し示す、矢印についてー

# はじめに

ゲーム中に敵の位置を教えてくれるものを作ります。
大雑把にこんな感じ

![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/114344/7a447229-87e5-42ed-ea81-025e8b9f3e55.gif)

# 仕様

- 矢印は目の前にある
- 敵の位置を常に指し示してくれている


#実装

## 準備
まずは
- プレイヤー
- 指示す先となる敵
- 矢印
- 矢印の親となるからのゲームオブジェクト

を用意します

加えて
床の追加、カメラをプレイヤーの子供にしておくと良いかもしれません

こんな感じになっていれば大丈夫です！

![スクリーンショット 2016-08-21 16.41.34.png](https://qiita-image-store.s3.amazonaws.com/0/114344/1a9c90ff-3e57-1533-762a-f5817fdb9417.png)

##コード

まずはプレイヤーを動かしたいので適当にプレイヤーが動くスクリプトを作ります
視点移動などは面倒なので書いてないですが、使いたい状況に合わせて使ってみてください！！

コピペ用としていかにコードを載せておきます

```PlayerScript.cs
using UnityEngine;
using System.Collections;

public class PlayerScript : MonoBehaviour {

	float speed = 10;

	void Update () {

		if (Input.GetKey("a") && Input.GetKey("w")) {
			transform.position += (new Vector3 (-1, 0, 1)).normalized * Time.deltaTime * speed;
		}else if (Input.GetKey("a") && Input.GetKey("s")) {
			transform.position += (new Vector3 (-1, 0, -1)).normalized * Time.deltaTime * speed;
		}else if (Input.GetKey("d") && Input.GetKey("w")) {
			transform.position += (new Vector3 (1, 0, 1)).normalized * Time.deltaTime * speed;
		}else if (Input.GetKey("d") && Input.GetKey("s")) {
			transform.position += (new Vector3 (1, 0, -1)).normalized * Time.deltaTime * speed;
		}else if (Input.GetKey("a")) {
			transform.position += new Vector3 (-1, 0, 0) * Time.deltaTime * speed;
		}else if (Input.GetKey("d")) {
			transform.position += new Vector3 (1, 0, 0) * Time.deltaTime * speed;
		}else if (Input.GetKey("w")) {
			transform.position += new Vector3 (0, 0, 1) * Time.deltaTime * speed;
		}else if (Input.GetKey("s")) {
			transform.position += new Vector3 (0, 0, -1) * Time.deltaTime * speed;
		}

	}
}
```

次に矢印を動かす部分のコードです

矢印を入れるためのGameObjectを作ったのは、矢印を自分の前に常に出しておきたかったからです。
これをすることで、自分の位置 + transform.forwardを使うことでプレイヤーの向いている方向の前に出すということが簡単に実装可能です。

また、矢印は、プレイヤーと敵の位置の間の角度を所得することで、敵を追跡することが可能になるかと思います。

実際に書いたコードです。


```ArrowScript.cs
using UnityEngine;
using System.Collections;

public class ArrowScript : MonoBehaviour {


	[SerializeField] GameObject target;
	[SerializeField] GameObject player;
	[SerializeField] GameObject arrow;

	void Update () {

		transform.position =player.transform.position + player.transform.forward * 3 + Vector3.up * 0.4f;
		Vector2 vec2 = new Vector2 (target.transform.position.x - player.transform.position.x,
			               target.transform.position.z - player.transform.position.z);

		float r = Mathf.Atan2 (vec2.y, vec2.x);
		float angle = Mathf.Floor(r * 360 / (2 * Mathf.PI));
		arrow.transform.rotation = Quaternion.Euler(0, 90 - angle, 0);
	
	}
}
```

自分の位置をプレイヤーの前にする部分は、最初の
 `transform.position =player.transform.position + player.transform.forward * 3 + Vector3.up * 0.4f;` 
になります。

transform.forward と Vector3.forwardの両方がわかっているとココらへんの処理はさくっとかけますね

つぎに、敵の方向を角度で所得する部分が残りの部分となります
ここらへんは、[参考にさせていただいた記事その１](http://qiita.com/arthur87/items/23d3c896dafbc8223fd5),[参考にさせていただいた記事その２](http://qiita.com/Hoshi_7/items/d04936883ff3eb1eed2d)などがとてもわかりやすい解説をしてくれているので、そちらに任せてしまおうかなと（追記で書き足すかもしれませんー

#おわりに
コード自体は短く、簡単に実装できてしまいますね
最近はハコスコ楽しいーってなってあそんでるので、そこら辺の記事も書きたいなと。。。
pip installでエラー

pip install で sixのエラーがでる

```
pip install plotly --upgrade
```
と

```
sudo pip install awscli
```

の時に出た


##エラー

```
Installing collected packages: six, pytz
  Found existing installation: six 1.4.1
    DEPRECATION: Uninstalling a distutils installed project (six) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.
    Uninstalling six-1.4.1:
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/commands/install.py", line 317, in run
    prefix=options.prefix_path,
  File "/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/req/req_set.py", line 736, in install
    requirement.uninstall(auto_confirm=True)
  File "/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/req/req_install.py", line 742, in uninstall
    paths_to_remove.remove(auto_confirm)
  File "/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/req/req_uninstall.py", line 115, in remove
    renames(path, new_path)
  File "/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/utils/__init__.py", line 267, in renames
    shutil.move(old, new)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 302, in move
    copy2(src, real_dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 131, in copy2
    copystat(src, dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 103, in copystat
    os.chflags(dst, st.st_flags)
OSError: [Errno 1] Operation not permitted: '/tmp/pip-4hp64P-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six-1.4.1-py2.7.egg-info'
```

##解決方法

"--ignore-installed six"をつける

```
sudo pip install plotly --upgrade --ignore-installed six
```
Atomエディタ上からファイルを新規作成する際のデフォルトの改行コードを設定する（Windows環境）

# 目的
Atomエディタ上からファイルを新規作成する際、Windows環境だとエディタの初期設定のままでは改行コードが`CRLF`になります。これを`LF`にするのが本記事の目的です。

改行コードを変更するだけなら、ファイル作成後にウィンドウ右下に表示されている「CRLF」の文字をクリックし、表示されるダイアログで「`LF`」を選択することにより、改行コードを`LF`にすることができます。
しかし、この作業をいちいち行うのは大変骨が折れます。
そこで、エディタの設定を変えることで、最初から改行コードを`LF`でファイルを作成するようにしたいと思います。

# 設定方法
Atomの設定画面の「Core Settings」や「Editor Settings」の節にはこの挙動をカスタマイズする設定項目は見当たりません。

Atomそのものの設定画面ではなく、「Core Packages」（標準で組み込まれているプラグイン）のひとつである「line-ending-selector」の設定画面から設定することができます。

## 手順

1. ［Ctrl］＋［,］（カンマ）キーでAtomの設定画面を呼び出します。
2. 設定画面の「Packages」タブを開きます。
3. 検索窓に「line-ending-selector」と入れて検索します。  
  もしくは、「Core Packages」のパッケージ一覧の中から「line-ending-selector」を探します。
4. パッケージ一覧の「line-ending-selector」の欄にある［Settings］ボタンを押すと、パッケージの設定画面が出ます。
5. 「Default line ending」という設定項目があります。  
  設定できる値は、次の3つです。
  - `OS Default`
  - `LF`
  - `CRLF`
6. 設定値を「`LF`」に変更すれば、ファイル新規作成時の改行コードがデフォルトで`LF`になります。

## 備考1： 「Default line ending」の初期値
「Default line ending」は、初期設定では「`OS Default`」、つまりOSの改行コードに従うように設定されています。

このため、OS標準の改行コードが`CRLF`であるWindows環境においては、ファイル新規作成時の改行コードが`CRLF`になるのです。

## 備考2： 本記事執筆時の筆者の環境

- Atomエディタのバージョン：1.9.9
- OS：Windows7 SP1

# 参考文献と余談
- [Atomで保存時の処理の設定を変更する - たけぞう瀕死ブログ](http://takezoe.hatenablog.com/entry/2015/06/21/021254)

参考文献として挙げましたが、上記の記事には改行コードの設定方法は書かれていません。
上記の記事には、Atomの Core Packeges のひとつである「whitespace」の設定を変えることにより、ファイルの末尾が空行で終わっていない場合に保存時に空行を自動的に追加する機能を制御する方法について書かれています。

Atomの初期設定ではこの機能が有効になっているのですが、たまたま末尾に空行を入れたくないファイルを編集する機会があり、このお節介機能を一時的に止めたいと思ったのですが設定画面に設定項目が見つからず困って検索し、この記事に行き当たりました。その際、記事の最後の一文

>他にも固有の設定を持っているプラグインはたくさんあるのでチェックしてみるといいかもしれません。

を読んで、なるほどそういう設定方法もあるのか、と他の Core Packeges を眺めてみたところ本記事の方法を発見した、というのが経緯です。

上記の記事に出会うまでは、きっと何か設定方法があるはずなんだろうなと思いながらいちいち手動で改行コードを変更していました。実に無駄な作業をしていましたがこれでおさらばです。
秋月RX220マイコンボードにFT232で書き込む

# 秋月RX220マイコンボードにFT232で書き込む

偉大なる先人がすでに行っているのだが，電気の素人には少し難易度が高かったので詰まってしまった．
[もやねのロボット三昧](http://moyane.blog25.fc2.com/blog-entry-468.html)にて以下のように既にレポートしてくださっている．

> 使っているPCにRS232CのCOMポートがない場合，TxD1，RxD1はただのTTLレベルUARTとして，PCとはFT232R等で接続したい．
> その際は基板裏側のIC2のすぐ右，C11コンデンサのすぐ左の2本のパターン(TxD1,RxD1線)をカットしよう．

しかしIC2のすぐ右，C11コンデンサのすぐ左の2本のパターンが，どこかわからなくて(またなぜそこを選択するのかがわからなくて)1週間(と言いつつ2年)足踏みしてしまった．新品に傷をつけるのは貧乏性にはきつい．

テスターで頑張って接続とか調べてみたのですが，太い先しか持っていないので本当につながっているのか自信が持てませんでした．

なかなかに苦労したので記事に残します．

## どこを2本切るのか

![akirx220_rs232cut.png](https://qiita-image-store.s3.amazonaws.com/0/102650/2a7a3d09-daf3-7d35-271b-ed9ec4f2b393.png)


(カメラの限界で)少しボケていて申し訳ないのですが適度に引き伸ばしてください．
IC2のすぐ右，C11コンデンサのすぐ左に該当する点は2か所存在する．
~~**多分切るのは赤い枠の方．**~~
[RX220のススメ](http://wikiwiki.jp/linesumo/?RX220%A4%CE%A5%B9%A5%B9%A5%E1)曰く，黄色い枠のようです．両方切ったのは正解でしたorz


1か所目は左の黄色い枠(多分2本ある)．このパターンはIC2の15,16ピン(電源とコンデンサ?)とつながっているのでないかと推測(知りません)．

2か所目は右の赤い枠．このパターンは(切ったところ)IC2の11，12番とマイコンのP26,P30に繋がっていた．このパターンたちは上の方にある小さな穴とつながっていることに気が付けばもうちょっと早く切る勇気がわいたのだが，気が付いたのは切った直後．

ちなみにカッターで両方切りました．傷が多くて悲しいです．

その後P26に通信ICのRXD，P30に通信ICのTXDをつないでRenesasFlashProgrammer(RFP)のCOMポート(図にはRS232と出てかなり不安でしたが，かなり昔別のRXマイコンをこの経路で書き込んだ記憶と[【マイクロマウス】 R5F56218BDFPにブートモードで書き込み](http://developerpekeloper.blog134.fc2.com/blog-entry-172.html])に成功報告が書いてあったので信じてここ)から書き込んだところ無事に書き込めました．通信が成功すればこっちのものよ!


写真的にピンが付いていてあほなことをしているなあと思われるでしょうが，I/Oピンをはんだ付けする前にパターンカットした方が当然楽です．私はRS232Cの変換ケーブルを持っているので最初はRS232Cで通信するつもりだったので既についています．(Windows8.1に対応していないという致命的なことに気が付かずかなり困りましたが)

## なぜこの2本を切るのか(わかりませんでした)

別に切らなくてもそのままP26,P30につなげばFT232で通信できるのでは!?と思わなくもないのでやったのですが当然無理でした．成功したので気分がいいため，このRS232変換ICであるADM3202の挙動を調べました．
[ADM3202のデータシート](http://www.analog.com/jp/products/interface-isolation/rs-232-rs-422-rs-485/interface-rs-232/adm3202.html)を読むと……わかりませんでした(回路を理解する心が湧かなかった)．

なんとなく，
RS232Cでは±12Vを(今回はCH1の24,25で)入力しADM3202の内部にある電圧を変換する回路で3Vに変換している．
TTLレベル(今回は3.3VをCH2の23,25)で通信するFT232ではこのボードの本来の使い方であるADM3202の入り口とは違うため，ADM3202の入力上にあると書いてあるプルダウン抵抗がないためグランド直通だからすべて持っていかれている，のかなぁ……(知りません)
QNAPのHDDアクセスが止まらない問題の解決方法

　今まで、使っていない時は非常に静かだったQNAPのNASですが、久々のファームウェアバージョンアップをした後、HDDにほぼ常時アクセスするようになってしまいました。検索してもそれらしい解決方法が見つからないので、しらみつぶしに色々サービスを停止させていった結果、解決できたのでまとめておきます。

* 機種：TS-251
* ファームウェアバージョン: 4.2.2

### こんな問題でお困りの方のための記事

* QNAPのNASが、ほぼ常時HDDにアクセスしてる
* データ通信も発生している
* HDDアクセスが止まらないのでスリープモードにならない


### 解決方法
　ファームウェアのバージョンアップの際に、勝手にインストールされたQnapのアプリが原因でした。というわけで、非常に雑な解決方法ですが、[App Center]に入って、アプリを片っ端から停止していきましょう。

　私は、単なるデータ置き場して使っているだけなので全て停止しても問題ありませんが、そうでない方は１つずつ停止していくと良いでしょう。どちらにせよ、使ってないなと思うアプリは全て停止させたほうが良さそうです。
androidで操作を記録して爆速で再生するのをやってみた

[この記事](http://bhind.hatenablog.com/entry/2016/08/21/155622)のコピーです。

昔、[monkeyrunner](https://developer.android.com/studio/test/monkeyrunner/index.html)でkittingしようとしてたのでなんか興味があったのでやってみました。
基本、
[Android の操作を記録して爆速で再生する](http://qiita.com/pm11op/items/e0142d156423c95e407c)
とか
[Continuous swipe two directions](https://groups.google.com/forum/#!topic/tasker/lxejVzwG8C8)
これをみてやりました。

テスト対象に今ハマっている[abyssrium](https://play.google.com/store/apps/details?id=com.idleif.abyssrium&hl=en)を使ってみました。

上記の投稿を単純に実行するだけだと、どうもうまく行かず、他の投稿などを参考にobsサイズを指定するとうまくいきました。
（チート非推奨のためパラメータは隠しておきます）

````bash:
dd if=/dev/input/eventX of=/sdcard/event.log obs=XXXXXXXXXX
i=1; while [ $i -le 100 ] ; do echo $i; dd if=/sdcard/event.log of=/dev/input/eventX obs=XXXXXXXXXX; i=`expr $i + 1`; done
````

結果がこちらです。
https://twitter.com/bhind13/status/767252875147747328?lang=en
Windows Server on EC2 with githubで Jenkins を動かすまで

# 背景

ファームウェア開発では自動ビルドは品質を担保する基盤になるので早めに導入しておきたい。
けれども自前のビルドサーバーを運用は大変。
かつ、今回は開発環境の縛りで Windows 環境が必要だった。
なので、WindowsServer 2012 on EC2 @ AWS で Jenkins を動かすところまでやってみた。
ソースはgit hubを使用しているのでそこもメモ。

# AWS の登録から

（ここからかよっ！）
組み込みワールドにこもっていたのでサーバー運用なんてしたことありません。
AWS ってどうやって使うの？から入ります。

## 登録〜インスタンス作成

https://aws.amazon.com/jp/

をサーフィンしていると、あちこちに「無料で始めてみる」があるので、始めてみる。
お決まりの登録作業で進んでいく。

ここも参考にしました。LIGさまのブログはわかりやすくていつもお世話になっています。

わずか5分！？ AWSのEC2でクラウドなウェブサーバーを構築してみた
http://liginc.co.jp/web/programming/server/39969
【AWS】無料範囲でWindows　Server　2012　を立てちゃうぞ！
http://fanblogs.jp/kagayakibito/archive/223/0

チェックポイントは

- クレカ登録が必要（無料枠からはみ出ると課金される）
- EC2 が仮想サーバー。これを使う。
- EC2上にインスタンスと呼ばれる仮想OSを展開する。ここで Windows Server 2012 Base を選択。2016/8/10現在、t2.micro が無料枠。
- Windows が相手なので RemoteDesktop環境が必要。

クライアントが OS X なので、これを使った。
https://itunes.apple.com/jp/app/microsoft-remote-desktop/id715768417?mt=12

インスタンスができたら、RemoteDesktop で接続します。

![スクリーンショット 2016-08-21 15.56.59.png](https://qiita-image-store.s3.amazonaws.com/0/54261/b91f7cf9-fe01-7f14-a18f-58fcd4ec016f.png)

その際は、「リモートでデスクトップファイルのダウンロード」から落とした rdp ファイルを使うか、直接 「パブリックDNS」を指定します。

# 環境構築

## Git

まずは git 導入。 Git for Windows を使う。

https://git-for-windows.github.io/

インストール後、以下にパスを通しておく。じゃないとあとで sh.exe がないとエラーになる。

```
{インストールパス}¥bin¥
```

## Jenkins

いよいよ Jenkins を導入。まずはダウンロード。

https://jenkins.io/index.html

インストーラでインスコ。簡単っ。

```
http://localhost:8080/
```

でアクセスする。

そろそろ Remote Desktop が ストレスになってくるので、クライアントから叩けきたい。

EC2の ip アドレス (自分の場合はip固定していないのでホスト名) + 8080 で叩けば、開けるはず!
ですが、デフォルトではポートが開いてませんでした（当たり前）。

https://www.ipentec.com/document/document.aspx?page=amazon-ec2-add-rule-to-security-group

ここを参考に、 TCP 8080 を開放します。

で、、でけた！（組み込み屋さんはこの程度で感動します）

# Job 作成

早速ジョブを作成します。どきどき。

新規ジョブ作成を選びます。

![スクリーンショット 2016-08-21 15.35.19.png](https://qiita-image-store.s3.amazonaws.com/0/54261/51c7e206-b1a4-f2de-b1a3-2c35b1b90d85.png)

ここでは自由にやりたいので（？）フリースタイル・プロジェクトのビルドを選びます。

## ソースコード管理

![スクリーンショット 2016-08-21 15.36.42.png](https://qiita-image-store.s3.amazonaws.com/0/54261/d3f1b41c-c5fa-a21d-b478-da0ae51209cd.png)

Git を選択すると、リポジトリを設定する画面が出てきます。URLをいれましょう。
私の環境では、ssh で叩いているので、

```
git@github.com:hogehoge/horerepo
```
です。

### ssh 鍵登録

Cardentials で認証情報を選択します。最初は何もないので、「追加」を選びましょう。

![スクリーンショット 2016-08-21 15.40.23.png](https://qiita-image-store.s3.amazonaws.com/0/54261/7febede1-a380-b0cc-8c68-29f8c08250b3.png)

「種類」を「SSHユーザ名と秘密鍵」に設定します。
秘密鍵の設定方法はいろいろ試行錯誤してはまりました。確実なのは、「直接入力」で「鍵」をダイレクトに貼り付けるのが簡単でした。
ここで貼る鍵は

```
-----BEGIN RSA PRIVATE KEY-----
```
で始まるやつです。

## ビルド

いよいよビルド手順の追加です。

![スクリーンショット 2016-08-21 15.45.38.png](https://qiita-image-store.s3.amazonaws.com/0/54261/d3b454fa-7f3c-980c-57fb-e74c515a249e.png)

これは動くでしょう！

# 実行

Jenkinsダッシュボードに戻ると先ほど作ったJobが表示されています。早速実行します。

![スクリーンショット 2016-08-21 15.50.43.png](https://qiita-image-store.s3.amazonaws.com/0/54261/87477757-3607-f335-b38a-39e93d733abc.png)

で、でけた。。。 git のチェックアウトもちゃんと動いています。

実は git のチェックアウトでも幾つかエラーでて対処したのですが、それはまたどこかで。
seeds.rbでCSVのレコードをhash化してからcreateする

seeds.rbでCSV入力するサンプルで、
以下の記述をよく見る。

```rb:seeds.rb
CSV.foreach('db/initFoods.csv') do |food|
  Food.create(
  :name     => food[0],
  :calories => food[1],
  :protein  => food[2],
  :totalFat => food[3])
end
```

これだと、後からFoodの途中に属性を追加するのが辛い。

例えば、頭にcategoryを追加するには、
以下のようにいちいちインデックスの書き換えが必要になる。

```rb:seeds.rb
CSV.foreach('db/initFoods.csv') do |food|
  Food.create(
  :category => food[0],
  :name     => food[1],
  :calories => food[2],
  :protein  => food[3],
  :totalFat => food[4])
end
```

モデル側にCSVから取得したい属性を返すメソッドを追加して、
1レコードごとにhash化してからcreateした方が、
良さげ。

```rb:food.rb
class Food < ActiveRecord::Base
  ATTRIBUTES = [
    "category",
    "name",
    "calories",
    "protein",
    "totalFat"
  ]

  def self.getAttributes()
    return ATTRIBUTES;
  end
```

```rb:seeds.rb
attributes = Food.getAttributes()
CSV.foreach('db/initFoods.csv') do |food|
  hash = {}
  for i in 0..attributes.length-1 do
    hash.store(attributes[i], food[i])
  end

  Food.create(hash)
end
```

属性が多い場合、for文で回せるのも楽。
Amazon EC2の専用AMI及びCentOSにRubyの最新版を入れる。

AmazonEC2のAmazon標準の無料AMIとCentOSイメージを利用した場合です。


1.git が入っていないのでインストールする

```
$ sudo yum -y install git
```

2.デベロッパーツールを入れる
参考
　http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/compile-software.html

```
$ sudo yum groupinstall "Development Tools"
```

3.openssl等を入れる

```
$ sudo yum install -y openssl-devel readline-devel zlib-devel
```

4.rbenv を持ってくる

```
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
```

5.環境設定
PATH に追加

```
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
```

.bash_profile に追加

```
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```

上記設定の再読み込み

```
$ exec $SHELL -l
```

6.rbenvの確認

```
$ rbenv --version
rbenv 1.0.0-30-g0c7224a
```

7.ruby-build を 持ってくる

```
$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
```

8.ruby の最新版を確認
install -- list でインストール可能なバージョン一覧が出力される

```
$ rbenv install --list
Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249
   :
   :
  2.3.0-dev
  2.3.0-preview1
  2.3.0-preview2
  2.3.0
  2.3.1            ←　最新版 
  2.4.0-dev
  2.4.0-preview1
  :
```

9.ruby のインストール
先ほど調べたバージョンを指定する

```
$ rbenv install -v 2.3.1
```

8. 環境確認
再読み込み

```
$ rbenv rehash
```

インストールされているruby一覧を確認

```
$ rbenv versions
* system (set by /home/ec2-user/.rbenv/version)
  2.3.1
```

先ほどインストールした最新版に設定

```
$ rbenv global 2.3.1
```

確認

```
$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
```

Rails Applicationの設置に進む。
Read input File, Edit, and Output to TSV File

package csvUtils;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;


/**
 * Read input File, Edit, and Output to TSV File。
 *
 * @author hal
 */
public class CsvTest {

	public static void main(String[] args) {

		String inputFile = "D:\\pleiades\\workspace\\csvUtils\\src\\csvUtils\\input.txt";
		String outputFile = "D:\\pleiades\\workspace\\csvUtils\\src\\csvUtils\\output.tsv";

		try {//ファイル 処理が隠蔽され内部で完結するので、戸締りの心配もいらない。
			List<String> lines = Files.readAllLines(Paths.get(inputFile));

			List<String> outputList = new ArrayList<String>();

			final String header = "サイトCD\t予約日\tCap会員ID";

			outputList.add(header);

			lines.stream()
			.filter(t -> t.length() >= 95)
			.map(t -> t.replaceAll("\\s", ""))
			.forEach(t -> {
				System.out.println(t);

				String outputText = t.substring(30, 33) + "\t";
				outputText = outputText + t.substring(63, 71) + "\t";
				outputText = outputText + t.substring(84, 95);

				outputList.add(outputText);
			});

			Files.write(Paths.get(outputFile), outputList, StandardCharsets.UTF_8);

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
git pull を slackに通知する 

各サーバーで git pull コマンドが使われたときに Slack へ通知するようにしました。

ChatOps的には、 Slack から git pull できるようにしたかったですが、
Slack をチーム内で試験的に導入していることもあり、今回は控えめです。

git の クライアントサイドのフック機能を使いました。
デフォルトでは、git pull にフックするサンプルは用意されていないので新規でファイルを作成します。

:arrow_down:  Qiita にいい感じにまとめている記事がありました 
[Git hooksまとめ](http://qiita.com/khlizard/items/dfe1ec9d82c0ed5da7c6)


## 実装
各サーバーに SSH接続

```
cd App/.git/hooks
vi post-merge
```

スクリプトはこんな風にしてみました。
channel に通知したいチャンネル名を指定します。
環境変数＄APP_ENVにはサーバー名を入れています。
Slack の incomming webhook の APIキーは :arrow_down: を参考に取得してください。
http://qiita.com/satoshi03/items/14495bf431b1932cb90b


```
#!/bin/bash
commitid=$(git log -1 --pretty=format:"%h" --branches)
commitmessage=$(git log -1 --pretty=format:"%s" --branches)
committer=$(git log -1 --pretty=format:"%an" --branches)
slack="https://hooks.slack.com/services/[SLACK-INCOMMING-WEBHOOK-API-KEY]"
channel="#test"

payload="payload={
  \"channel\": \"${channel}\",
  \"username\": \"${APP_ENV}\",
  \"attachments\": [
    {
      \"fallback\": \"git pull\",
      \"color\": \"#36a64f\",
      \"pretext\": \"git pull\",
      \"author_name\": \"${committer}\",
      \"title\": \"${commitid} - ${commitmessage}\",
    }
  ],
  \"icon_emoji\": \":warning:\"
}"
curl -X POST --data-urlencode "${payload}" "${slack}"
```


これで、git pull 実行時にslackに通知することができました。

![image](https://qiita-image-store.s3.amazonaws.com/0/74133/c89aa9ad-041d-de29-76d8-16828dca066f.png)
gulpでSASSを自動コンパイルする

gulpでsassの自動コンパイルをするために複数のサイトを見てgulpfile.jsを作ったのですが
自分の使用しない言語のコンパイルも一緒に入っていたりでわかりづらかったのでsass->cssのみの同じ設定を次回行うときのための簡単なメモとして書きました。

##Node.jsのインストール

[Node.jsのサイト](https://nodejs.org/en/)にアクセスしダウンロードします。
インストールし終わったらコマンド上で

```
node -v
```
を入力するとバージョンが見られます。


##gulpのインストール

```
npm install gulp
```
gulpのインストールは、適当なフォルダに移動してから行います。
個人的にはcss,htmlなどデータを置く大元のフォルダ直下が好みです。

※コメントでのご指摘によりインストール方法はローカルが良いと考えましたので上のコマンドを変更しました(2016.08.26)
様々なプロジェクトを行う際にとても便利です。
「なぜ？」と思う方はコメント欄をご覧下さい。


ちなみに、グローバルインストールの場合のコマンドは以下です。

```
npm install gulp -g
```
これは特定のフォルダに移動することなくできます。

##gulpfile.jsの設置
gulpのインストール時に移動したフォルダにgulpfile.jsを作成します。


```js:gulpfile.js
var gulp = require('gulp');
var sass = require('gulp-sass');

// SassとCssの保存先を指定
gulp.task('sass', function(){
  gulp.src('./sass/**/*.scss')
    .pipe(sass({outputStyle: 'expanded'}))
    .pipe(gulp.dest('./css/'));
});

//自動監視のタスクを作成(sass-watchと名付ける)
gulp.task('sass-watch', ['sass'], function(){
  var watcher = gulp.watch('./sass/**/*.scss', ['sass']);
  watcher.on('change', function(event) {
  });
});

// タスク"task-watch"がgulpと入力しただけでdefaultで実行されるようになる
gulp.task('default', ['sass-watch']);
```

次は上のgulpfile.jsによって自動保存されるフォルダ構成のメモです。

```js:フォルダの構成
-gulpfile.js

-package.json

-sass(フォルダ)
  -**.scss  //コンパイル前のscssを置く

-css(フォルダ)
  -**.css  //コンパイル後のcssを置く
```



(ここから下は2016.08.26に追加しました。)
##package.jsonの設置

このように記述したpackage.jsonをgulpfile.jsと同じフォルダに作成します。

```json:package.json
{
  ...
  "scripts": {
    "gulp": "gulp"
  }
}
```
これにより、コンソール上での実行スクリプトが`npm run gulp`で可能になります。
package.jsonはnpm scriptによるもので、`npm run ~~`で特定のコマンドを実行するよう設定するファイルです。
(これを設定する前のローカルインストールの際の実行方法は...何でしょう、、勉強いたします。)

##gulp監視の実行方法

package.jsonでの設定により、作業フォルダ内で`npm run gulp`のコマンドを使用してgulpの監視が行えるようになりました。

怠惰な私は`gulp`とだけ打つ方法(グローバルインストールの際のコマンド)に慣れていたためそれで実行する方法はないかと思ったところ[inoinojp様](http://qiita.com/inoinojp)が素敵な助言をくださいました。

詳細は下部のコメントでご覧下さい。

##Special Thanks

inoinojp様
ありがとうございました！
Rails4 delayed_jobでイベント管理機能

# 動機
Delayed_jobは処理に時間が掛かるようなタスクをバックグラウンドで非同期処理を実現するGemです。
delayed_jobをつかった簡単な使い方はいろいろなところで見かけますが、ジョブをハンドルして、特に削除を好きなタイミングで行う方法がわからず調べるのに苦労したのでまとめておきます。

delayed_jobの設定方法などはインストールなどの情報はこちら
[【Rails 4】delayed_jobを使う](http://qiita.com/azusanakano/items/1d2629763f35b5466286)


今回作りたかったのは以下の機能です

- [ ] connpassのようなイベントサイトの簡易版として、イベント登録、参加者募集し、日程の管理などもできるようなサービス
- [ ] イベントは下書き、公開、終了という状態を持っていてイベントがおわると自動的に終了状態になる-①
- [ ] このサービスはイベントの参加者に実施日の24時間前にリマインダーを送信する。②
- [ ] 25時間前まではイベントの開催時間、を変更可能でリマインダー開催、終了時刻を設定しなおす。

# model設計
__Event__ : イベント内容、開始時刻、終了時刻を保持
__EventJob__ : イベントのリマインダー、終了状態遷移遷移処理、delayed_jobのモデルである__Delayed::Backend::ActiveRecord::Job__へのハンドル（idを保持する）

```rb

  # イベント
  create_table "events", force: :cascade do |t|
    t.string   "content"
    t.datetime "start_datetime"
    t.datetime "end_datetime"
    t.string   "state"
    t.string   "title"
  end

  # ジョブ
  create_table "event_jobs", force: :cascade do |t|
    t.integer  "job_type",   null: false
    t.integer  "event_id",   null: false
    t.integer  "job_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end


```

# 実装
- __EventJob__モデル

```rb
# イベントに関するジョブを削除できるようにハンドルを保持するため、モデルとして扱う
class EventJob < ActiveRecord::Base

  belongs_to :event
  
  # reminder リマインダージョブ
  # finish 終了 
  enum job_type: { reminder: 0, finish: 1 }
  scope :reminder, ->() {find_by_job_type(0)}
  scope :finish, ->() {find_by_job_type(1)}

  before_destroy :delete_job

  # ジョブを設定する
  def setup!
    if reminder? 
      update!(job_id: delay(run_at: event.start_datetime - 1.day).exec_remider.id)
    elsif finish?
      update!(job_id: delay(run_at: event.end_datetime).exec_finish.id)
    else
      logger.info('unknown_jobtype')
    end
  end

  # ジョブを再設定する
  # 時刻変更のため
  def reset!
    delete_job
    setup!
  end

  private

  def exec_remider
    # リマインダー送信セットアップ
    # ここでメールを送る処理を実装
  end

  def exec_finish
    # イベント終了
    # ここはAASM というステートマシンGEMを利用して状態を変更
    event.finish!
  end

  def delete_job
    Delayed::Backend::ActiveRecord::Job.find_by_id(job_id).try(:destroy)
  end
end

```

ここのコードのポイントは__EventJob__クラスのメソッドをdelayつきで呼ぶと、戻り値がDelayed::Backend::ActiveRecord::Jobtoとなるのでここでハンドル（id）を取得することができます！

```rb

delay(run_at: event.start_datetime - 1.day).exec_remider
```

```shell-session
=> #<Delayed::Backend::ActiveRecord::Job:0x007fa352365b58
```

- 　呼び出す側

```rb
  def setup_finish
    # 終了状態にする
    logger.info('終了状態にするジョブをセットします！')
    EventJob.create(event_id: id, job_type: 'finish').setup!
  end

  def setup_reminder
    # リマインダーをセットアップする
    logger.info('リマインダーセットします！')
    EventJob.create(event_id: id, job_type: 'reminder').setup!
  end

```
npm scriptsを使おう

npm < 僕と契約してnpm scriptsおじさんになってよ！！

タスクランナーとしてnpm scriptsを使おうという入門＆忘備録記事です。

#なぜnpm scriptsか
なぜGulp等ではなくてnpm scriptsなのでしょう。

##簡単
Gulpの構築コストは意外に高いです。
また、一枚抽象レイヤーを導入するわけで、

* そのレイヤーの安定度
* そのレイヤーの仕様変更
* そのレイヤーのプラグインの安定度

に非常に振り回されます。
それならシェル叩いたほうがいいのでは？という発想で、実際それで困ることはあまりないよ、という話です。

#npm scriptsの機能

##インストールしたパッケージのCLIを起動
`npm i -D rollup`
とすると、当然ながらコマンドラインからrollupをたたくことはできません。
`npm i -g rollup`
というようにグローバルインストールする必要があります。ですが、これを強要するのは環境破壊につながるので、あまりよろしくありません。
しかしなんと、ローカルインストールしたライブラリのCLIは、npm scriptsからは叩けるのです。よって
`"build": "rollup -c rollup.config.js"`
と書けば、
`npm run build`
とすればrollupを起動することが可能なのです！とても便利です。

##Config
package.jsonに
`"config": { hoge: "rollup.config.js" }`
と記述すると、環境変数として`npm_package_config_hoge`が渡されます。

## Passing Arguments
`--` 以降の引数をnpm scriptsに送ります。
例えば、
`"hoge": "rollup -c"`
というscriptsが記述されている場合、
`npm run hoge -- rollup.config.js`
というコマンドをたたくと
`rollup -c rollup.config.js`
というコマンドが実行されます。

## npm test/start/stop
この三つのスクリプトのみ、runを省略できます。 `npm test` のように書けるわけです。

##pre/post hook
特定コマンド実行前・実行後に起動するscriptsを記述できます。
`"postinstall": "rollup -c rollup.config.js"`
と書き、
`npm install`
というコマンドをたたくと、postinstallスクリプトが、インストール処理実行後起動します。

#npm scriptsおじさんになるときに躓きそうなもろもろ
* Win/Macで使えるコマンドが違う

代用できるコマンドがnpmパッケージとして存在するので、それを使いましょう。大抵あります。
cp -> cpx
rm -rf -> rmraf
mkdir -p -> mkidirp
どうしてもめんどくさいならShelljsを使うのも手です。

* Watchしたい
 
専用のパッケージがあります、後述します。

#npm scriptおじさんになるための三種の神器
##npm-run-all/run-p/run-s
指定したnpm scriptsを並列、直列実行する、とても強力なパッケージです。
これがあるからnpm scriptsが実用できるといっても過言ではないです。

使い方は簡単、
`run-s scriptName1 scriptName2`で直列実行、
`run-p scriptName1 scriptName2`で並列実行です。

またワイルドカード指定もできて、
`run-p watch:*`
とすると、watch:hoge、watach:fuga ... を並列で実行できます。

このパッケージによって、ワンライナーを長々と書く必要がなくなります。
ワイルドカード指定とともに、うまく使いたいですね。

##watch
特定ディレクトリを監視して、シェルスクリプトを実行します。
これも使い方は簡単、
`watch 'npm run hoge' ./dirname`
以上！

##Node.js(!)
はい、Node.jsです。

`node script.js`

でNode.jsの全機能を使えます。
当たり前ですが、とても柔軟です。
Webpackやrollup等のビルドツールはNode.jsで直接叩くためのAPIを備えていますが、直接扱うのは結構辛みなので、shelljs等を併用するとよいかもしれません。

#諸問題
ちょっと運用で気を付けないといけないことがあります。

##環境変数展開
Macだと$npm_package_config_hoge、Winだと%npm_package_config_hoge%で展開できます。なので互換性がありません……

##単一責任原則
npm scriptsに長いワンライナーを描かないようにしましょう。保守が非常に大変です。
単一の機能を実現するnpm scriptsに分解して、run-s(run-p)で実行しましょう。
[Tensorflowを使って画像を分類したい ](1)環境を作ろう

# はじめに
HDD内に大量にあふれた画像ファイルを整理したいけど、数万枚にのファイルを手動で整理はしたくないと友人に相談したら「プログラム作れよ。ほら、AIとかディープラーニングとやらを使えばいいんじゃね。」と貴重なアドバイスをもらったのでやってみることにした。
友人よ…ディープラーニングってなんだよ…。インフラ屋さんだからプログラムは畑違いなんだよ…。

# ディープラーニングってなに？何ができるの？
まずはQiitaで検索してみて予備知識を仕込む。
ディープラーニング≒機械学習なのか。
なるほどわからん…。機械学習って何さ…。
この辺を見て勉強するか。

[機械学習はじめの一歩に役立つ記事のまとめ](http://qiita.com/shu223/items/9cbde46c0690f1952750)
[DNN（ディープラーニング）ライブラリ : chainerとTensorFlowの比較 (1)](http://qiita.com/ymfj/items/b2b72e4fda2d4eb9d980)
[各機械学習ライブラリの比較をまとめる](http://qiita.com/jintaka1989/items/bfcf9cc9b0c2f597d419)

# TensorFlowを使うことにする
どのライブラリを使うかを選ばないといけない。
色々わからない。違いもわからない

Qiitaの投稿数を比較
よし、とりあえず技術ドキュメントの多いTensorFlowを使おう

(2016/08/21現在)

| ライブラリ名  | 件数 |
|:--------------|:---------:|
| TensorFlow    | 339 |
| Chainer       | 205 |
| Caffe         | 56 |

# 環境を準備する
さすがQiita。知りたいことが出てくる。
[UbuntuにTensorFlowをインストール](http://qiita.com/yudsuzuk/items/092c38fee18e4484ece9)

何度も使いそうなので、vagrantで作ることにした。
検証環境はWindows10 + Vritualbox + Vagrant
仮想マシンはUbuntu14.04


[Vagrantfile]

```
# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure(2) do |config|

  config.cache.scope = :box
 
  config.vm.define :TensorFlow do |node|
    node.cache.scope = :box
    node.vm.box = "ubuntu/trusty64"
    node.vm.hostname = "TensorFlow"
    #node.vm.network :forwarded_port, guest: 22, host: 2001, id: "ssh"
    node.vm.network :private_network, ip: "192.168.33.40"
    node.vm.provider "virtualbox" do |vb|
     # Customize the amount of memory on the VM:
     vb.memory = "4096"
     vb.gui = false
     vb.cpus = "2"
    end    
    node.vm.provision "shell", inline: <<-SHELL
      sudo apt-get update
      sudo apt-get install -y wget curl git vim libxml2-dev libxslt1-dev 
      sudo apt-get install -y python-pip python-dev python-virtualenv
      sudo apt-get install -y build-essential autoconf libtool pkg-config python-opengl python-imaging python-pyrex python-pyside.qtopengl idle-python2.7 qt4-dev-tools qt4-designer libqtgui4 libqtcore4 libqt4-xml libqt4-test libqt4-script libqt4-network libqt4-dbus python-qt4 python-qt4-gl libgle3 python-dev python-pip libcairomm-1.0-1 libjson-glib-1.0-0
      mkdir tensorflow
      virtualenv --system-site-packages ~/tensorflow
      cd ~/tensorflow
      source bin/activate
      pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.8.0rc0-cp27-none-linux_x86_64.whl
      
    SHELL
  end
end
```

vagrant upで仮想マシン起動
<pre>
E:\vagrant\TensorFlow>vagrant up
</pre>

Vagrantで作った環境へログインし
TensorFlowを入れたvirtualenvをactivateする
<pre>
root@tensorflow:~#
root@tensorflow:~# source tensorflow/bin/activate
(tensorflow)root@tensorflow:~#
</pre>


今回はここまで。
Iotラジオ

##MA12
#チーム名「ohisama」
#作品「Iotラジオ」　
[koko](http://jsrun.it/ohisama1/wwiq)
***
#提案-SDR
ソフトウェア無線（Software-defined radio）とは、
電子回路（ハードウェア）に変更を加えることなく、
制御ソフトウェアを変更することによって、
無線通信方式を切り替えることが可能な無線通信、又はその技術
***
#AMラジオ
super heterodyne    
![](http://jsrun.it/assets/m/Q/f/A/mQfAE)
***
#SDR
![](http://jsrun.it/assets/4/W/f/m/4WfmH)
***
#製作例 amラジオ
![](http://jsrun.it/assets/k/4/f/d/k4fdp.png)
***    
#波形
![](https://qiita-image-store.s3.amazonaws.com/0/18104/f855695f-c752-e7a2-de94-aa112c3c8caf.jpeg)
***
#製作例 websdr    
![](http://jsrun.it/assets/w/B/S/Q/wBSQc.jpg)
***  
#送信プログラム
[fiddle](https://jsfiddle.net/ohisama/r3sfdtb7/1/)
***    
#サーバープログラム
[node_red](http://ohijs0.paas.jp-e1.cloudn-service.com/)
![](http://jsrun.it/assets/2/a/A/B/2aABQ)
***   
#受信プログラム
[jsdo](http://jsdo.it/ohisama1/myFj)
***   
#訴求力
* 日本初?
* 流行のIot
* 受信プログラムコンテスト
* ラジオ（スキン）コンテスト
* ブログパーツ
* キット販売
* フランチャイザー

***
#写真
![](http://jsrun.it/assets/I/t/S/S/ItSSt)
***
![](http://jsrun.it/assets/C/D/P/1/CDP1r)
***
#回路図
![](http://jsrun.it/assets/G/S/F/m/GSFmD)
***
#スキン
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/K/H/s/KHst_w.jpg)
データマイニングにおけるタスクの種類

データ分析の仕事を受注する上での一つの悩みとして、依頼内容の記述と、データマイニングの手法（アルゴリズム）の関係づけが考えられます。依頼内容に「〜の値を予測してほしい」「〜が〜に分類されるようにして欲しい」とデータマイニングの視点で書かれていることは多くないかもしれません。そのため、関係づけしやすいようにするためにも、一つは、データマイニングの側から見て、データマイニングのアルゴリズムが適用できるタスクの種類の一覧を知っておくと便利です。「この依頼は、この種類のタスクに当てはまると考えて良いのだろうか？」と考えることができます。

『戦略的データサイエンス入門』という本には、データマイニングのアルゴリズムが適用できるタスクの種類の一覧として以下が紹介されています。

1.分類
2.回帰
3.類似性マッチング
4.クラスタリング
5.共起グルーピング
6.プロファイリング
7.リンク予測
8.データ削減
9.因果モデリング

各タスクの詳しい説明は、同書を参照してください。

#分類
母集団の構成要素がどのクラス（母集団を複数の集まりに分割する際にそれら集まりを示す階級）に分類されるのかを予測する。

#回帰
個別のデータに対して、何らかの変数の数値を予測あるいは推定すること。

#類似性マッチング
既知の情報に基づいて類似するデータを識別する。類似するデータを発見するために使用される。

#クラスタリング
特定の目的（分類の基準）を与えず、その類似性に従って母集団をグルーピングする。

#共起グルーピング
取引データの中からいくつかのデータの間に存在する関連を見つけることができる。頻出アイテムセットマイニング、相関ルール発見、マーケットバスケット分析としても知られている。

#プロファイリング
個別のデータやグループ、そして母集団における典型的な振る舞いがどのようなものかを明らかにする。

#リンク予測
データ間の関連を予測することができる。

#データ削減
大量のデータセットから余分な情報を削ぎ落とし、重要な情報のみを含んだ小さいデータセットへ変換すること。

#因果モデリング
他の何かに影響を及ぼす出来事や行為を把握するために役立つ。

#補足
##データサイエンスとデータマイニング
>... 概念的には、データサイエンスとはデータから有用な情報・知識を引き出すための基本原理のことであり、データマイニングはそれら基本原理を組み込んだ技法を活用して、データから有用な情報・知識を引き出す行為のことです。 ...
>『戦略的データサイエンス入門』 p.2
ElasticsearchでKuromojiのAnalyzer, Tokenizer, Token Filters, Char Filtersの一覧



# Analyzer

analyzerは１つだけ

* kuromoji Analyzer
    * Character Filters: 
    * Tokenizer: kuromoji_tokenizer
    * Token Filters:
        * kuromoji_baseform
        * kuromoji_part_of_speech
        * cjk_width
        * ja_stop
        * kuromoji_stemmer
        * lowercase

# Tokenizer

* [kuromoji_tokenizer](https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-kuromoji-tokenizer.html#analysis-kuromoji-tokenizer): kuromojiで日本語をトークン化する
    * 3つのモードがある
        * normal: 複合語はわけない
        * search: 複合語は、のこしつつ、分かち書きしたものも入れる
        * extended: 複合語は分かち書きする。知らない単語に関しては、１文字づつ区切る

# Token Filter

* kuromoji_baseform token filter: 動詞などの変化形をもとの形にする。
* kuromoji_part_of_speech token filter: 指定された品詞のものをフィルタする
* kuromoji_readingform token filter: カタカナまたはローマ字に漢字をフィルタする
* kuromoji_stemmer token filter: 指定の文字列以上ではじまるカタカナの最後のーをフィルタする。例えば、サーバーだったらサーバとなる
* ja_stop token filter: 日本語のストップワードをフィルタする。ユーザが指定もできる。

# Character Filters

* kuromoji_iteration_mark: 踊り字（々などの繰り返しで使われる文字)をフィルタする。例えば人々なら人人となる。

# 参考
* https://www.elastic.co/guide/en/elasticsearch/plugins/2.3/analysis-kuromoji.html
rails 4でses, DKIMを設定する

# 背景

今までもSESを使っていた。

基本は、SESで、Domainを登録して、Create SMTP credentialsというのをクリックすれば、そのUserとPassがもらえるので、それをRailsのSMTPの設定に書く

例えば、以下の様なのを書き、

```config/mail.yml
development: 
  address: email-smtp.us-east-1.amazonaws.com
  port: 587
  domain: <yourdomain>
  user_name: FIOHFOHFLUELFNUL <-みたいなCreate SMTP credentialsで発行されたやつ
  password: Afa832nfoa83... <- これも同様
  authentication: login
  enable_starttls_auto: true

production:
  ...
```

それをinitializerで読んで、smtp_settingsにセットする。

```config/initializers/mail.rb
f = File.open("#{Rails.root}/config/mail.yml")
email_settings = YAML.load(f)[Rails.env].map do |k, v|
  [k.to_sym, v]
end.to_h
ActionMailer::Base.smtp_settings = email_settings
```

そして最後に、config/environments/development.rb などで

```config/environments/development.rb
config.action_mailer.delivery_method = :smtp
```

と書いておけばよい。


#今回は、IAM userとDKIMを使う!

やったことないので、やってみる！

参考にするのは、
[RailsでAmazon SES・Route53を用いてドメインメールを送信する](http://qiita.com/tanakaworld/items/94f1ba66801100f6a44f#%E6%96%B0%E8%A6%8F%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E4%BD%9C%E6%88%90)

かなりわかりやすい！



## まずは、IAM User作成から

https://console.aws.amazon.com/iam
でUserを作成。

作成した時に、AccessKeyIdとSecretAccessKeyを発行するので、それをDownloadして無くさないようにする！！！


その後、SES画面からPolicyを追加する。ポリシーに関しては、https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/sending-authorization-policies.html?icmpid=docs_ses_console
を参照。

大事なのは、resources(mailを送るDomain）,Principal（権限を受けるIAMユーザ）、Action（今回はses:SendEmail, ses:SendRawEmail）。

これを設定してする。


## 次にRailsでGemを入れて設定する



aws-sesというGem([aws-ses](https://github.com/drewblas/aws-ses))をいれて`bundle install`

```Gemfile
gem 'aws-ses', require: 'aws/ses'
```


上記と同じようにconfig/mail.ymlに設定を書く

```config/mail.yml
development:
  access_key_id: <ACCESS_KEY_ID>
  secret_access_key: <SECRET_ACCESS_KEY>
```

上のmail.ymlから読み込む

```config/initializers/mail.rb
f = File.open("#{Rails.root}/config/mail.yml")
config = YAML.load(f)[Rails.env]
nActionMailer::Base.add_delivery_method(:ses, AWS::SES::Base,
                                       { access_key_id: config['access_key_id'],
                                         secret_access_key: config['secret_access_key'] })
```

これで、`rails console`から試してみる。

`rails g mailer MyMailer`などでつくったMailerで、

```
class MyMailer < ActionMailer
  def hello
    mail to: 'test@gmail.com', subject: 'subject'
  end
end
```


```rb
MyMailer.hello.deliver_now
```

これで成功すればオッケー！

が、しかし！

エラーが出る！

```
Aws::SES::Errors::AccessDenied: User `arn:aws:iam::<aws-id>:user/<username>' is not authorized to perform `ses:SendRawEmail' on resource `arn:aws:ses:<region>:<aws-id>:identity/<domain>'
```

SESでPolicy で指定してあげたのに、何故？？？かなり調べた挙句、わからないので、とりあえず直接IAM Userの方にPolicyを追加し、FullSESAccessをあげたら、メールが送れるようになった。

理由は謎。。（解決策があり次第更新）


まあめでたく、「RailsからSESのメールがIAMUserで送れるようになった」


#　DKIM

SESとRoute53を使ってると勝手に設定されるっぽい（？）
zshのプラグインマネージャーを外したら10倍以上起動が高速化した話


## 問題
zshのプラグインマネージャーに[antigen](https://github.com/zsh-users/antigen)を使っていました。
が、いつの間にか信じられないぐらい起動が遅くなっていました。

## 解決

[ghq](https://github.com/motemen/ghq)によってプラグインをインストールし、zshrcでは`source`するだけの方式を採用しました。

```zsh
GHQ=$HOME/src/github.com
source $GHQ/robbyrussell/oh-my-zsh/lib/completion.zsh
source $GHQ/rupa/z/z.sh
source $GHQ/zsh-users/zsh-autosuggestions/zsh-autosuggestions.zsh
source $GHQ/zsh-users/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
```

zshのプラグインなんて山のように入れてるわけではないので、起動を遅くするだけのプラグインマネージャーの出番は不要というわけです。いわゆるそれ`ghq`でいいよね案件です。

ghqについては、[ghqを使ったローカルリポジトリの統一的・効率的な管理について - Kentaro Kuribayashi's blog](http://blog.kentarok.org/entry/2014/06/03/135300)が素晴らしくまとまっているので参照してください。


## 計測

さて、どのくらい高速化したかというと。

前

```
$ time ( zsh -i -c exit )
( zsh -i -c exit; )  1.45s user 0.80s system 103% cpu 2.175 total

$ time ( zsh -i -c exit )
( zsh -i -c exit; )  1.48s user 0.82s system 102% cpu 2.242 total

$ time ( zsh -i -c exit )
( zsh -i -c exit; )  1.46s user 0.82s system 103% cpu 2.204 total
```

後

```
$ time ( zsh -i -c exit )
( zsh -i -c exit; )  0.09s user 0.09s system 99% cpu 0.186 total

$ time ( zsh -i -c exit )
( zsh -i -c exit; )  0.10s user 0.09s system 97% cpu 0.195 total

$ time ( zsh -i -c exit )
( zsh -i -c exit; )  0.09s user 0.09s system 100% cpu 0.181 total
```

起動時間が0.2秒を切るぐらいになり、だいたい11倍くらい高速化しました。


## 終わりに
なんとなくイケてるからとプラグインマネージャーを使っていましが、トレードオフをちゃんと考える必要がありますね。

## 参考
- [zsh-users/antigen](https://github.com/zsh-users/antigen) - A plugin manager for zsh, inspired by oh-my-zsh and vundle. 
- [motemen/ghq](https://github.com/motemen/ghq) - Remote repository management made easy
Emacs で minimap を使うための設定の備忘録

python コードを書く際に、atom や sublime のように minimap を出してみたくて、設定してみました。

# 環境
・ Ubuntu 16.04
・ Emacs 24.5.1

# やったこと

・ emacs 中で下記を実行し、minimap パッケージをインストール

```
M-x package-install
minimap
```

・ ~/.emacs.d/init.el に追記

```
(require 'minimap)
```

・ Minimap の画面を右側によせる

```
M-x customize-group
minimap
```

```
▼ Minimap Window Location [Value Menu] より Right を選択
```


# 作業中に主に読ませて頂いたURL

http://yusuke-ujitoko.hatenablog.com/entry/2016/05/29/174259
DBサーバーが動いているか確認するpythonスクリプト

前提
・python3
・PyMySQLモジュールインストール済み

やりたいこと：
・ある特定のDBが動いているかチェックして、動かなかったらエラーメールする
・cronjob等で2分ごとスクリプトを実行する

```py3
#!/usr/bin/python

import os, sys, smtplib
import pymysql.cursors
from email.mime.text import MIMEText

def send_mail(title, msg, from_addr, to_addr, cc_addrs=None):
    if not from_addr or not to_addr:
        return

    new_mail = MIMEText(msg)
    new_mail["Subject"] = title
    new_mail["From"] = from_addr
    new_mail["To"] = to_addr

    if cc_addrs != None:
        if isinstance(cc_addrs, str):
            new_mail["Cc"] = cc_addrs
        elif isinstance(cc_addrs, list) and cc_addrs != []:
            new_mail["Cc"] = ','.join(cc_addrs)

    smtp = smtplib.SMTP('localhost')
    smtp.send_message(new_mail)
    smtp.quit()

def send_default_error_mail(error_txt=None):
    error_msg = "Error, please make some action to recover."
    if error_msg:
        error_msg = error_msg + "Error: " + error_txt
    send_mail(
        "Database connection check",
        error_msg,
        "送信元メールアドレス",
        "送信先メールアドレス"
    )
    connection = None
try:
    connection = pymysql.connect(
        host='ホスト',
        user='ユーザ名',
        password='パスワード',
        db='DB名',
        charset='utf8',
        cursorclass=pymysql.cursors.DictCursor)

    if not connection:
        send_default_error_mail()

    with connection.cursor() as cursor:
        sql = "SELECT 1=1"
        cursor.execute(sql)
        results = cursor.fetchall()
        if not results or len(results) == 0:
            send_default_error_mail()
except:
    ex, ms, tb = sys.exc_info()
    error_txt = str(ms)
    send_default_error_mail(error_txt)
finally:
    if connection:
        connection.close
```
vagrantで特定のディレクトリをゲストOSと共有する

## 概要

* vagrantはデフォルトで、下記のディレクトリが共有される
  * ホストOS : Vagrantfileが配置されてるディレクトリ
  * ゲストOS : `/vagrant/`
* これを変えてみたい
    * 例えば、デザイナーさんにちょっとしたデザインの仕事をお願いするような場合
    * いちいちコンソールで、作業してもらうとか面倒ですよね。
    * ちゃちゃっとvagrantで仮想環境つくって、自分のMac上でファイル作って、それがブラウザ上で確認できればOKです。
* そんな時、この共有フォルダの設定を変えて実現出来ないか、という話です。

## 方法

Vagrantfileに１行追加するだけでOKです。

```Vagrantfile
config.vm.synced_folder ".", "/var/www/html/"
```

これで、ホストOSの方のカレントディレクトリ(Vagrantfileを配置しているディレクトリ)と、ゲストOS上の`/var/www/html/`を共有出来るようになります。
デザイナーさんは、Mac上で、htmlファイルやcss,js,imgなどこのファイルに配置すれば自動的にブラウザで動作確認が出来るようになります。
超便利ですね。


### 補足

vagrantでは、ホストOSからゲストOSへの共有は可能ですが、
逆(ゲストOSからホストOS)の共有は出来ません。

あまりないケースかもしれませんが、もしもゲストOS > ホストOSへもファイルを共有したい等がある場合は、
私が以前書いた下記を参考にしてください。

http://qiita.com/ritukiii/items/502f2b69ff4aca4e0754
WebSocketライブラリ紹介　クライアント動作編

##免責
本記事を元にした作業において如何なる損害が発生したとしても、一切責任を負うことが出来ません。予めご了承の上でご参照下さい。

##準備（管理者権限で作業して下さい）
0. XamppをPCにインストールする（Pleiadesを使用）
0. Arduino IDE 1.6.10以降をPCにインストールする
0. ESPr Developer相当のマイコンボード([URL](https://www.switch-science.com/catalog/2500/))※USBケーブルなどは必要に応じて用意して下さい
1. WiFiルーター
1. WebSocketライブラリ([URL](https://github.com/visyeii/uWebSocket/archive/master.zip))

##動作確認 1/2（PC側）
まずPC側のPHPとブラウザでWebSocket動作を確認します。

1. Pleiadesパッケージをダウンロードして下さい。　([URL](http://mergedoc.osdn.jp/))
><b>※PHPを開発可能なFull Edition パッケージを選択して下さい。</b>

2. Cドライブ直下にフォルダを作成します。
>（例）C:\pleiades_php

3. 次のフォルダにPleiadesパッケージを解凍して下さい。
>（例）「C:\pleiades_php」内に次の3つのフォルダが存在するようにして下さい。
>>.metadata.default
>>eclipse
>>xampp

3. 「C:\pleiades_php\eclipse\eclipse.exe」を実行してください。
> 初期化が終わり、Eclipseが起動したらEclipseを終了してください。
>※2016/08/31追記

4. 「 C:\pleiades_php\xampp\xampp-control.exe 」を実行して下さい。
5. XAMPPがウィンドウが開きます。ApacheのStartボタンを押して下さい。
>![XAMPP_01.png](https://qiita-image-store.s3.amazonaws.com/0/125575/f31f01f8-a3af-8a90-4fa5-8ebed6b5f9a4.png)

6. 次の状態になるまで待ちます。
>![XAMPP_02.png](https://qiita-image-store.s3.amazonaws.com/0/125575/40d0c32a-5a2b-28bd-0100-65c93db0e4ff.png)
>PID(s)の値は気にしなくて良いです。
>Windows 10にアップデートすると、別サービスが80番ポートを使用するため、Apacheが起動しない場合があるようです。
>対策は下記URLを参照下さい。
>https://o-sup.jp/blog/pc/299-201507805-win10-80port.html
>※2016/08/31追記

7. WebSocketライブラリの「 WebSocketPHP 」を「 C:\pleiades_php\xampp\htdocs\ 」にコピーして下さい。
>C:\pleiades_php\xampp\htdocs\WebSocketPHP\
>※フォルダ内には2つのファイルが入っています。
>>server.php
>>index.php

8. コマンドプロンプトで「 C:\pleiades_php\xampp\htdocs\WebSocketPHP> 」に移動して「C:\pleiades_php\xampp\php\php -q server.php」を実行して下さい。
>`C:\pleiades_php\xampp\htdocs\WebSocketPHP>C:\pleiades_php\xampp\php\php -q server.php`

8. ブラウザで「 localhost/WebSocketPHP/ 」にアクセスして下さい。
>参照：[PHPのみでHTML5のWebSocketを体験する方法](http://d.hatena.ne.jp/susan-style/20140306/1394103655)

##動作確認 2/2（ESPr Developer側）
1. WebSocketライブラリの「 WebSocketClient_v0.7.0_beta 」から「 WebSocketClient_v0.7.0.ino 」を開いて下さい。
2. WiFiルーターの「 "your_ssid" 」と「 "your_password" 」をお使いの環境に合わせて変更して下さい。
>`const char* ssid = "your_ssid";`
`const char* password = "your_password";`
※WiFiルーター自体の設定については変更しません。

3. 「 YOUR_PHP_SERVER 」をPHPを動作させているPCのIPアドレスに変更してください。
>
`g_http.begin("http://YOUR_PHP_SERVER:8080/WebSocketPHP/server.php");`

4.  Arduino IDEから、ESPr Developerに対してプログラムをダウンロード（書き込み）します。
>
参照：[ESPr Developer ( ESP-WROOM-02 開発ボード )の使い方をザッと紹介](https://www.mgo-tec.com/blog-entry-ss-wroom-howto01.html)

5. コマンドプロンプトで「 server.php 」を実行して下さい。
>`C:\pleiades_php\xampp\htdocs\WebSocketPHP>C:\pleiades_php\xampp\php\php -q server.php`

6. Arduino IDEからシリアルモニタを立ち上げ、ESPr Developerをリセットします。
> ツール > シリアルモニタ
>次の表示が出れば成功です。起動時に”Hello WebSocket”を送信しています。
![chat_00.png](https://qiita-image-store.s3.amazonaws.com/0/125575/d5bd6fea-efd5-95c7-c34d-2fdb8ffc3b78.png)

7. シリアルモニタから文字列を打ち込み、ブラウザ側に表示させることも出来ます。
> ![chat_01.png](https://qiita-image-store.s3.amazonaws.com/0/125575/00f1cae2-1274-30af-80b7-24f4ce2fe8a2.png)

本記事では、WiFiルータ経由でESPr DeveloperとPCが接続するサンプルを紹介させていただきました。
色々と応用して頂ければ幸いです。

##謝辞
mgo-tec([mgo-tec電子工作](https://www.mgo-tec.com/))様のWebSocket関連記事を公開頂いたからこそ、本記事を作成する事が出来ました。私一人では到底成し得ないものであります。
改めて深い感謝の言葉を述べさせて頂きます。
`_` がついたフォルダを build に含ませたい時にやること


こんにちは、 [UNIBA](http://works.uniba.jp/) の　MJ です。今日は 静的サイトジェネレーターの `Middleman` について少し tips

## Middleman の ビルドファイル

`Middleman` は予め一定のルールでビルド時に余分なファイルをビルドしないようになっています。

例えば `layouts` フォルダだったり, `_` がついたフォルダだったり `.` が先頭についた隠しファイルだったりします。
これらは非常に便利な機能でもある一方、特殊な条件においては邪魔になったりします。

この設定は、記事を書いたあたりでは [ここに](https://github.com/middleman/middleman/blob/e8f10fe3c22237ced1c8e75b93f69644f89edc18/middleman-core/lib/middleman-core/application.rb#L179) 記述されています。

```middleman/middleman-core/lib/middleman-core/application.rb
  # Files starting with an underscore, but not a double-underscore
  partials: proc do |file|
    ignored = false

    file[:relative_path].ascend do |f|
      if f.basename.to_s =~ %r{^_[^_]}
        ignored = true
        break
      end
    end

    ignored
  end,

  layout: proc do |file, app|
    file[:relative_path].to_s.start_with?('layout.', app.config[:layouts_dir] + '/')
  end
```

`.` ファイルに関する記述は別にあるんでしょうかね？
さておいて、これを `config.rb` で以下で上書きすればおkです。



```config.rb

config.ignored_sitemap_matchers[:partials] = proc { |file|
  ignored = false

  file[:relative_path].ascend do |f|
    if f.to_s.start_with?("/_folder/")
      ignored = false
      break
    elsif f.basename.to_s =~ %r{^_[^_]}
      ignored = true
      break
    end
  end

  ignored
}

```

これで `build` フォルダに `_folder` が追加されているはずでしょう。