OmniAICreator/Qiita-1.07M huggingface dataset:
Tiny Core Linuxにtelnet接続

Tiny Core Linux7.1でtelnetサーバーを有効にしてtelnet接続できるようにした時のメモです。

## アプリのインストール
telnetサーバーを実現するための`telnetd`は`inetutils-servers`という名前のパッケージに含まれていますので`inetutils-servers`をインストールします。コマンドラインでインストールする場合以下のようになります。

```console
$ tce-load -wi inetutils-servers
```

## inetd.confの編集
`inetutils-servers`をインストールすればすぐに使える事を期待したのですが、どうもそうではなさそうですので手動で設定します。まずは`inetd.conf`ファイルを作成します。

```console
$ sudo mkdir /usr/local/etc
$ sudo vi /usr/local/etc/inetd.conf
```
```text:inetd.conf
telnet stream tcp4 nowait root /usr/local/sbin/telnetd telnetd
```

`inetd`を起動しtelnet接続できる事を確認します。ユーザ名は`tc`でパスワードなしでログインできます。実際に使用するには注意が必要かなと思います。

```console
$ sudo /usr/local/sbin/inetd
$ telnet localhost
Entering character mode
Escape character is '^]'.


Linux 4.2.9-tinycore (box) (pts/1)

box login: tc
   ( '>')
  /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
 (/-_--_-\)           www.tinycorelinux.net

tc@box:~$
```

## 永続化
`inetd.conf`を書いて`inetd`を起動しただけでは電源を切ると使えなくなってしまいますので、電源を切って次回起動した際もtelnetが使えるようにします。

永続化したいディレクトリやファイルは`/opt/.filetool.txt`に指定しますので`/opt/.filetool.txt`に`inetd.conf`を追加します。

```console
$ echo usr/local/etc/inetd.conf >> /opt/.filetool.lst
$ filetool.sh -b
```

OS起動時に自動的にinetdが起動するようにします。

```console
$ echo /usr/local/sbin/inetd >> /opt/bootlocal.sh
$ filetool.sh -b
```

再起動してtelnet接続できるか試してみます。

## ftpサーバーも使える
`inetutils-servers`にはftpサーバである`ftpd`も含まれていますので`inetd.conf`に以下の行を追加すればftp接続もできるようになります。

```text:inetd.conf
ftp stream tcp4 nowait root /usr/local/sbin/ftpd ftpd
```

`ftpd`はパスワードなし状態ではログインできないみたいですので、`tc`ユーザにパスワードを設定するか新たにユーザを作るなどを考える必要があります。
技術英語 >  this is a safer user to execute code you do not know, particularly [obfuscated code]

https://wiki.ubuntu.com/nobody

>  this is a safer user to execute code you do not know, particularly <font color=red>obfuscated code</font>.

http://eow.alc.co.jp/search?q=obfuscated&ref=sa

> obfuscated code
《コ》難読化コード
Sublime Text　メモ


## Emmet
![image](https://qiita-image-store.s3.amazonaws.com/0/33237/d12c202a-acba-851d-efee-1bd80997e9b2.png)
[Ctrl + E]
![image](https://qiita-image-store.s3.amazonaws.com/0/33237/06f6b8de-781b-812c-af6c-4217b0e33b5e.png)

*** 導入方法 ***

1. Ctrl + Shift + Pを入力してコマンドパレットを呼び出す。
2. 「Package Control:Install Pacage」を選択
3. Emmetと入力し、インストール
PDOでfetchAll()は避けた方がいいのかもしれない


たいていの場合、`$stmt->fetchAll()` でレコードセットを取得するコードを書いていたのですが、いかのようなコードで、ジェネレータを使ったらどうなるのかを実験してみました。

mst_address には郵政データ（123,909件）がそのまま入っています。

```php:sample.php
<?php

ini_set('display_errors', 1);
error_reporting(E_ALL);

function get_pdo()
{
	$dsn = sprintf('mysql:dbname=%s;host=%s;charset=%s'
		, 'database'
		, 'localhost'
		, 'utf8'
	);
	$username = 'root';
	$password = 'password';
	$options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION];
	return new PDO($dsn, $username, $password, $options);
}

function fetch_array()
{
	$pdo = get_pdo();
	$statement = 'select * from mst_address';
	$stmt = $pdo->prepare($statement);
	$stmt->execute();
	return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

function fetch_generator()
{
	$pdo = get_pdo();
	$statement = 'select * from mst_address';
	$stmt = $pdo->prepare($statement);
	$stmt->execute();
	while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
		yield $row;
	}
}

//foreach (fetch_generator() as $row) {
//}

foreach (fetch_array() as $row) {
}

echo memory_get_peak_usage() . "\n";

```

結果

`fetch_generator()` を利用したとき

105340184


`fetch_array()` を利用したとき

496371488


結果は一目瞭然でした。
QiitaでGoogleアナリティクスを利用してページ別ビュー数等を見る方法


# はじめに
Qiitaではストック数の方がビュー数より重視されているので、itemsのページではストック数とコメント数は一覧で見れますが、ビュー数は該当ページを表示しないと見ることが出来ません。

それでも自分のQiitaのどのページがどれくらい見られているかを一覧で把握したい。QiitaではGoogleアナリティクスコードを仕込むことが出来るようになっています。Googleアナリティクスを利用することでビュー数以外にもアクセス解析の各情報が把握できるようになります。

別方法として下記サイトのプログラムを使えばビュー数等を取得することが出来ます。
参照:[Qiita投稿のストック数・コメント数・ツイート数・はてぶ数・いいね数・ページビュー数を取得する](http://qiita.com/suin/items/ed0957dc45ecdcf3963c)

# Googleアナリティクスの利用手順
手順は下記サイトに詳しく書かれているので参照してください。
参照:[QiitaでGoogleアナリティクスを利用する手順](http://qiita.com/Qiita/items/c7f704e3786df3aa7a11)

# ページ別のビュー数を見る方法
1日経ってGoogleアナリティクスを見ると全体のビュー数をサマリーで見ることが出来ます。
![サマリー.png](https://qiita-image-store.s3.amazonaws.com/0/14053/43a676d7-4344-cb7a-70ea-2f8617df8125.png)

でも、見たいのはページ別のビュー数なわけです。
それには「行動->サイトコンテンツ->すべてのページ」をクリックします。
また、何のページか分かるように「ページタイトル」をクリックします。
参照:[Qiitaに仕込んだGoogleAnalyticsを少し見やすくする工夫](http://qiita.com/akatsuki174/items/e224e82bca4644b83e7a)
![ベージ別.png](https://qiita-image-store.s3.amazonaws.com/0/14053/a313bf8d-9932-2dd1-9ec7-649530c87ce6.png)

# 任意ページの参照元を見る方法
一覧から任意のページをクリックします。
![ベージ別クリック.png](https://qiita-image-store.s3.amazonaws.com/0/14053/d8f7479a-4f7f-dcdf-38a0-4101928ffd28.png)

「セカンダリディメンション」をクリックし、表示される項目の中から「集客」をクリックし「参照元」をクリックします。
![参照元2.png](https://qiita-image-store.s3.amazonaws.com/0/14053/8d91b625-06db-c26f-972f-53810adf45c7.png)

参照元のサイトが確認できます。
![参照元4.png](https://qiita-image-store.s3.amazonaws.com/0/14053/ed8446c3-cba0-0613-81bb-3d77b1126133.png)

# 任意ページの流入キーワードを見る方法
「セカンダリディメンション」の広告をクリックします。
![広告2.png](https://qiita-image-store.s3.amazonaws.com/0/14053/ce474276-72a0-dabc-529b-33f1aa73b4cb.png)

「広告」の中の「キーワード」をクリックします。
![広告3.png](https://qiita-image-store.s3.amazonaws.com/0/14053/464c69ce-3aec-c0a2-276b-9705fe08e0d3.png)

流入キーワードが確認できます。
![広告4.png](https://qiita-image-store.s3.amazonaws.com/0/14053/b1ac2c26-da74-2459-eb4a-5dcb0af767f9.png)

# 最後に
Googleアナリティクスを使うとアクセス解析の結果がいろいろ見れるので面白いですね。

## Qiitaでストック数を 稼ぐ方法 
[僕らがQiitaをゴリゴリ書く理由 - SlideShare](http://www.slideshare.net/MasayukiHokimoto/qiita-55126264)によると下記2点だそうです。
1. どんな小さなネタでも 遠慮なく投稿する
自分としてはたいしたことないつもりでも ほかの人が見れば収穫かもしれない
2. Qiitaはタイトルが勝負！
なぜなら、一覧にはタイトルしか見えない 数字を含むとさらに良い 
「○○する7つの方法」 「○○を10時間かけて調べてみた」など 記事のボリューム感がタイトルだけで伝わるようにする

ストック数を稼ぐのも悪くないですが、いくつストックされるかよりも誰にストックされるかを意識した方が結果的にはいいかも知れません。
macの初期設定（ターミナル）

個人的な設定の覚書。（ちなみにmacです)

## ターミナルにショートカットを設定。

1. Spotlight（Command+Space)でAutomatorを起動。
2. 「新規書類」を選択。（ポップアップで「書類の種類を選択して下さい」と出た場合は3に進む。）
3. 「サービス」を選択。
4. アクションの中から「アプリケーションを起動」を選択。
5. 起動させるアプリケーションを選択。（今回はユーティリティの中のターミナル.appを選択。）
6. 「"サービス"は、次の項目を受け取ります」を「入力なし」にする。
7. 「Command+S」で保存。
8. macの環境設定の「キーボード」を選択。
9. タブ「ショートカット」を選択して、先ほど設定したワークフローを探す。
10. 好きなショートカットを割り当てる。

## ターミナルの設定

1. [Command + ,]で設定を開く。
2. 自由に設定する。

#### ログインシェルの変更
```
# ログインシェルの確認
$ echo $SHELL
# ログインシェルの変更
$ cash [変更したいシェル]
```

#### Homebrewのインストール
```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

#### いろいろインストール(笑)
```
$ brew install tmux
$ brew install pyenv
```

以下に追記。無ければ新規作成。

```rudy:[起動shell]_profile
$ export PATH="$HOME/.pyenv/shims:$PATH"
```

#### 各種設定ファイルの作成・編集
以下のファイルを作成・編集する。
編集方法（内容）は別記事を参照してください。
~/.vimrc
http://qiita.com/hanaclover/items/f45250b55e2298c4ac5a
~/.起動シェルrc
http://qiita.com/hanaclover/items/94b645f8d5bb0168187f
~/.tmux.conf
http://qiita.com/hanaclover/items/09dd6cab4b624ffaf218

とかとか。適当にぐぐって設定する。
Ctrl+HでDelete(Backspace)したいアプリをどうにかする

初投稿。

ほぼタイトルの通りなんですが、Ctrl+H叩いた時に（おそらく制御コードが送られてて）文字消えねーよ！！！ﾊﾞｰﾝ　ってなったときの対処方法。

自分はMac用のLINEでこうなったのがきっかけです。これ結構ストレスマッハなんすよね……

なおこの記事書いた時点でのバージョンは、

* OSX: 10.11.5（15F34）
* Karabiner: 10.20.0

です。



# 前提事項
[Karabiner](https://pqrs.org/osx/karabiner/index.html.ja)をいれる。以上。
簡単に言うと色々いい感じにキーリマップいじれる定番ツールですね。
この記事で書いてることをどうにかしたいような人は大抵の場合入ってるような気がしています。

主旨からは外れるので、Karabinerの導入方法は省略します。~~手順もくそもないとは思うけど~~


# どうすればいいのか

Karabinerにはキーリマップとかを自分でカスタム定義できる機能があるらしく、それを使用します。
左右コマンドキーを英数/かなに置き換えることにしか使ってなかったので全く知りませんでした。

## private.xml の場所を調べる
たぶん ~/Library/Application Support/Karabiner だと思うけど一応手順を。
Karabinerを開いてメニューから "Misc&Uninstall" を選択し、その中の "Open private.xml" というボタンをクリック。
![Open private.xml](https://qiita-image-store.s3.amazonaws.com/0/122855/bd9a8762-8ae8-f53c-953e-6c5b58695d74.png)
Finderでprivate.xmlの格納ディレクトリが開かれます。
ここにオリジナルのキーリマップを定義できます。

## private.xml の編集
[公式マニュアル][privatexmlMannual]などを参考に直していきます。
（といってもデフォルトでは`<root>`要素しかないと思いますが）
先に自分のxml内容を晒してしまうとこんな感じ。

```xml:private.xml
<?xml version="1.0"?>
<root>
  <appdef>
    <appname>LINE</appname>
    <equal>jp.naver.line.mac</equal>
  </appdef>

  <item>
    <name>Ctrl+HでDelete</name>
    <identifier>private.CtrlH_to_Del</identifier>
    <only>LINE</only>
    <autogen>__KeyToKey__ KeyCode::H, ModifierFlag::CONTROL_L, KeyCode::DELETE</autogen>
  </item>
</root>
```

ざーっと言ってしまうと、
`<appdef>`要素でアプリケーションを定義
`<item>`要素でキーリマップを定義
しています。

### appdefを定義
まずはこの設定の対象とするアプリケーションを定義していきます。複数定義するならその分並べましょう。
`<appname>`要素にはわかりやすい名前を自分でつけてください。
`<equal>`要素には、アプリケーションidをつけます。

アプリケーションidの調べ方には、

* アプリケーションのInfo.plistを直接覗く
* Karabiner付属のEventViewerを使う

などがあります。
~~書くのが面倒~~横道に逸れまくってもアレなので、ここの説明も省きます。

### キーリマップの設定
`<item>`要素
キーリマップ１つ１つの単位になります。

`<name>`要素
適当に好きな名前をつけてください。ここの内容が設定ウィンドウに出てきます。

`<identifier>`要素
設定のidをつけます。かぶらないようにお好きなのをどうぞ。
公式では、"private."をプリフィックスにつけるのを[おすすめ](https://pqrs.org/osx/karabiner/xml.html.ja#basic-syntax)してます。

`<only>`要素
対象とするアプリケーションを定義します。
`<appdef>`要素内の`<appname>`要素につけた名前を入れてください。
複数のアプリケーションを対象とする場合はカンマ区切りで設定します。

`<autogen>`要素
設定時の動作を定義します。
ここでは、`__KeyToKey__`により`KeyCode::H, ModifierFlag::CONTROL_L`(=Ctrl+H)を`KeyCode::DELETE`(=Deleteキー)にリマップしています。


これでprivate.xmlの編集は終了です。


## private.xmlを読み込ませる
Karabinerを開いてメニューから "Change Key" を選択し、その中の "Reload XML" というボタンをクリック。
![Change Key](https://qiita-image-store.s3.amazonaws.com/0/122855/4f291171-e04a-c6a6-aed4-0a38274c1cbb.png)
すると、一覧のトップにprivate.xmlで定義した内容が出てきます。



-----
# 参考にさせていただきました
[Karabiner: private.xml Reference Manual][privatexmlMannual]
[Karabiner の private.xml 設定方法 | Qiita
](http://qiita.com/altitude3190/items/bbef986ff8dd288b2641)



[privatexmlMannual]:https://pqrs.org/osx/karabiner/xml.html.ja
自作したnodeモジュールに自作したnodeモジュールを読み込んでみる(ややこしい)


npmに公開したくないけどモジュールが膨らむのは嫌だ、細かく分けて再利用したい、という時に役立ちました。

## 環境　
node: 6.2.0
typescript 1.8.10

※全体的に`tsc`の工程は端折ります。

##1. 自作したnodeモジュールに読み込ませるnodeモジュールを自作する。(ややこしい)

ディレクトリ構成
![Kobito.NojOoC.png](https://qiita-image-store.s3.amazonaws.com/0/94593/e1d998e9-d708-bd95-7daa-2d5592ef3b93.png "Kobito.NojOoC.png")

試しに`hello()`されるとworldと叫ぶfunctionをexport

```index.ts
///<reference path="./typings/bundle.d.ts"/>

module.exports = {
    hello: () => {
        console.log('world！！')
    }
}


```


##2. 自作したnodeモジュールに1.で自作したnodeモジュールを読み込ませる(ややこしい)

ディレクトリ構成
![Kobito.rfmk9h.png](https://qiita-image-store.s3.amazonaws.com/0/94593/2f401747-9998-af7f-bf59-a8118a1b22c0.png "Kobito.rfmk9h.png")


`dependencies` に `../hello-world` というように相対パス指定してあげる（ここがミソ）

```package.json
{
  "name": "sample",
  "version": "1.0.0",
  "description": "",
  "main": "build/index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
   "hello-world": "../hello-world"
  }
}

```

いつも通り `npm install` すればOK

```
$ npm install
sample@1.0.0 ~/sample
└── hello-world@1.0.0 
```

`import` して

```index.ts
///<reference path="./typings/bundle.d.ts"/>

import fs = require('fs')
import HelloWorld = require('hello-world')
HelloWorld.hello()

```

実行！！！

```
$ node build/index.js
world！！
```


以上。

##3. 余談

型定義ファイルを作ってあげたり

```
declare module HelloWorld {
     export function hello(): void
}

declare module 'hello-world' {
    export = HelloWorld;
}

```

修正を反映しやすいようにスクリプトを定義してあげれば

```package.json
{
  "name": "sample",
  "version": "1.0.0",
  "description": "",
  "main": "build/index.js",
  "scripts": {
    "u": "npm uninstall hello-world && npm install hello-world"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
   "hello-world": "../hello-world"
  }
}

```

```
$ npm run u
> sample@1.0.0 u ~/sample
> npm uninstall hello-world && npm install hello-world

- hello-world@1.0.0 node_modules/hello-world
sample@1.0.0 ~/sample
└── hello-world@1.0.0 

```

分業やモジュールの再利用がしやすくなりますね。

快適なモジュール分割ライフを。
exFATでフォーマットされた外部ストレージを任意のパーミッションでマウントする

USBに入れたデータをいろんな環境で使いたいと思って、一番汎用性があるexFATでフォーマットしたまでは良かったのですが、Raspberry PiでマウントしてWebDAVで共有するまでに幾つか引っかかったので残しておきます。

使ってるOSはRaspbian Liteです

# USBメモリをマウントする。
自動マウントするために/etc/fstabに書くと思うんですが、マウント元の記載方法をモダンなものにしてみました。

マウント元の記法はいくつかあって、

1.sdaやsda1のような/dev以下に置かれたデバイスファイル

2.USBメモリに割り振られたUUIDを指定する

3.ストレージに貼られたラベルを指定する。

があります。

1は
``/dev/hogehoge  /mnt/hoge           vfat    defaults          0       2``

2は
``UUID=xxx-xxx-xxx-xx  /mnt/hoge           vfat    defaults          0       2``

3は
``LABEL=hoge  /mnt/hoge           vfat    defaults          0       2``

1に比べて2と3はデバイスファイルが変わってもマウントできるというメリットが有り、2と比べて3は何をマウントしているのかわかりやすいというメリットが有ります。

1.2は特に何もしなくてもそれぞれデバイスファイル/UUIDを調べれて指定すればOKですが、3はまずUSBメモリにラベルを貼る必要があります。

ラベルを貼るコマンドですが、フォーマット形式ごとに使用するコマンドが違いますので注意しましょう。

Linuxで一般的なext2/3はe2labelというコマンド、あまりLinuxでは使わないと思いますがNTFSではntfslabel(多分パッケージをインストールする必要あり)を、vfat(FAT32)ではmlabelを、そしてexFATではexfatlabelを使います。

exFATでフォーマットしたUSBメモリにラベルを付けるには以下のようになります。

なお、USBメモリはsda1であるとします。

``$ sudo exfatlabel /dev/sda1 usbmem``

そして、ラベルをつけた後、/etc/fstabで

``LABEL=usbmem  /mnt/hoge exfat defaults          0       2``

と指定すればマウントファイルが変わろうと自動的にマウントされます。わかりやすいですね。

ちなみに、exfatでフォーマットされたストレージをマウントする場合はフォーマット形式をexfatとします。

#マウントしたUSBメモリを任意のパーミッションにする

Linuxですと、ext2/3/4でないかぎり、マウントした後中に入っているファイル/フォルダのパーミッションを変更できないと思います(ここはもしかしたら違うかも)

じゃあどこで定義するのかというとマウント時に定義するのですが、fstabに書くときに引っかかりました。

``LABEL=usbmem /mnt/hoge exfat defaults,gid=30,umask=003,dmask=003,fmask=003  0 2``

上のと比べるとdefaultsの後に幾つかパラメータを追加しています。

詳しいパラメータの種類は各自で調べてもらうとして、ここにマウント時のオプションを書きます。

ここで指定しているのはgidと3つのmaskです。

gidはこのUSBメモリに入っているファイル/フォルダは複数のソフトで使うことを想定しているので所属グループを指定しています。

uidというパラメータで所属ユーザーを指定することも出来ます。

どちらとも指定しなければ所属はrootになります。

重要なのはその次、umask,fmask,dmaskのmaskシリーズです。これでマウント時と新規作成時のパーミッションを指定できます。

それぞれ、

umask=新規ファイル作成時のパーミッション

fmask=マウントしたストレージ中の「ファイル」のパーミッション

dmask=マウントしたストレージ中の「フォルダ」のパーミッション

指定しなければ自動的に751になります。

ここでは所属グループにも書き込み権限が欲しかったので774にすることを想定し、003としています。

こうすることによって、マウントしたストレージ中のデータのパーミッションを指定することが出来ます。

なお、個別にパーミッションを指定することは出来ません。

exFATやFATにはパーミッションという概念がないみたいですし、仕方ないと言ったら仕方ないのかもしれません。
AWSで手軽にjupyter notebookを起動してローカルからアクセス

[AWSのGPUインスタンスでCIFAR-10の分類](http://qiita.com/juntaki/items/40803ef012196fade793)で作ったGPUインスタンスを、普段はお高いので止めておいて、時々jupyter notebookを起動してブラウザから触りたい。
想定は1リージョンに1インスタンスしかない、AWS超ライトユーザです。（設定が全然汎用的ではないので・・)

## aws CLIでインスタンスを起動
コンソールをぽちぽちしても同じことができるが、時間がかるのでCLIがよい。
対象のリージョンにインスタンスが2つ以上ある場合、jqに渡すオプションは変更しないと失敗するはず。

describe-instancesでインスタンスIDをもってきて、そのまんまstart-instancesに渡す。この辺のノウハウはもっと良い記事があるに違いない。

~~~
aws ec2 start-instances --instance-ids `aws ec2 describe-instances | jq -r '.Reservations[].Instances[].InstanceId'` 
~~~

## ~/.ssh/configにLocalForwardの設定

"ec2"がドメインに含まれているPublic DNSにつなげたとき、ユーザ名とキーファイルは決め打ちで、LocalForwardする設定にする。
これで、SSH接続している間はローカルの8888に接続するとEC2側で待ち受けている8889に繋がるようになる。

~~~
Host *ec2*
    User ec2-user
    LocalForward 8888 127.0.0.1:8889
    IdentityFile ~/.ssh/gpu.pem
~~~

## SSH接続してjupyter notebookを起動
SSHはその時のPublicDnsNameに繋がるように次のコマンドを実行する。

~~~
ssh `aws ec2 describe-instances | jq -r '.Reservations[].Instances[].PublicDnsName'` 
~~~

Keras(Theano)がGPUを使うように、jupyter notebookを起動する。起動ポートは8889にする。

~~~
THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 jupyter notebook --no-browser --port 8889 
~~~

## ローカルのブラウザからアクセス

必要なipynbファイルはscpなどで送り込んでおく。
アクセス先は http://localhost:8888/ になる。
ElectronのRenderProcessで、コマンドライン引数を取得する方法

[前回](http://qiita.com/takanemu/items/8b81e3e1de6b18a4b586)から引き続き画像ビューワーを作るための技術調査の続きです。
画像ビュワーを作成するためには、画像ファイル、フォルダ、圧縮ファイルを受け取る必要があります。
要素技術の一つとして、コマンドライン引数の取得方法を調べてみました。
electronはベースとなる技術が、nodeのためprocess.argvから取得できます。
ただし、RenderProcessで利用するためには、プロセス間通信を使って、MainProcessから取得する必要があります。

```:main.js
'use strict';
var app = require('app');
var BrowserWindow = require('browser-window');
var mainWindow = null;

require('crash-reporter').start();

app.on('window-all-closed', function () {
    if (process.platform != 'darwin') {
      app.quit();
    }
});
app.on('ready', function () {
    mainWindow = new BrowserWindow({width: 800, height: 600});
    mainWindow.loadURL('file://' + __dirname + '/index.html');
    mainWindow.on('closed', function() {
        mainWindow = null;
    });
});
```
remoteオブジェクトを利用して、remote.process.argvと指定します。

```:index.html
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>electron command line argv get sample</title>
</head>

<body>
    <h1>コマンドライン引数</h1>
    We are using node <script>document.write(process.versions.node)</script>, Chrome <script>document.write(process.versions.chrome)</script>,
    and Electron <script>document.write(process.versions.electron)</script>.
    <div><ul id="container"></ul></div>
    <script>
        // node_integrationを行うとmodule.exports関係の事情でjQuery/$がundefinedになるので
        // それの回避コード
        window.jQuery = window.$ = require('./js/jquery-3.0.0.min.js');
    </script>
    <script>
        var remote = require('remote');
        var argv = remote.process.argv;
        var container = document.getElementById('container');

        for(var i = 0; i < argv.length; i++)
        {
            var li = document.createElement('li');
            var tnode = document.createTextNode(argv[i]);

            li.appendChild(tnode);
            container.appendChild(li);
        }
    </script>
</body>

</html>
```
引数の２つ目からが指定されたファイル（フォルダ）として利用できます。

![image](https://qiita-image-store.s3.amazonaws.com/0/7839/388fbaa3-9fab-c6af-2f0e-8e68f2e35498.png)

ソースコードは、[Github](https://github.com/takanemu/processArgv)に置いてあります。

では、Nautilus(Windowsで言えばファイルエクスプローラー)からどのように、呼び出すのでしょうか？
１つは、debパッケージを作成して、ソフトウェアセンターからインストールする方法が正攻法なのですが、筆者の技量では、まだ無理でした。（涙）
正攻法は、後々攻略するとして、もうひとつの方法。右クリックメニュー（コンテクストメニュー）をカスタマイズする方法を試しました。
右クリックメニューをカスタマイズするツール(Nautilus-Actions Configuration Tool)をインストールします。

![image](https://qiita-image-store.s3.amazonaws.com/0/7839/e9ba9261-e7fe-b4fd-d522-e591f48a5afd.png)

インストールしたら再起動をして、ツールを有効にしてからカスタムメニューを設定します。
自作Electronアプリのパスとパラメーターに、%Fを指定すれば、コマンドライン引数としてファイル名が指定されてきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/7839/fffadd11-6063-98d8-ff0d-f88cda7f9791.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/7839/545623fd-4d3e-3c5c-7ac2-3fd46007208d.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/7839/7f9c1baa-ebac-f530-57f1-bf5f7f198467.png)

なんとか、思ったような動きをしてくれるようです。
El Capitanにしたら終了できなくなった話


## 経緯
Xcode8ベータを試そうとしたら10.11.4を要求されたので、自機をElCapitanにあげました。

~~...今までSIP回りでめんどくさかったので、プライベートの方は放置していたのですがしょうがない。~~

OSアップデートを終え、
たまには再起動しようと思いメニューバーから再起動を選択したんですが、なぜか終了してくれない。

すべてのアプリが終了したにもかかわらず、
FinderだけDockで生き続ける現象に遭遇しました。

## 調査
DockのFinder右クリックでは応答なしとなっている。
この状態でDockアプリをクリックするとアプリの起動はできるようだったので、
アクティビティを開いて今起動しているサービスを見ることにしました。

そこでには幾つか終了されていない常駐サービスがありました。
なので一個づつ切っていくことで原因が分かると思ってKillしていきました。

そうして分かったのが、
WacomのBambooというペンタブレット製品があるのですが
そのドライバー周りがどうやらKillできないらしい。
確かにドライバー周りは何もしていない。
この辺り本業の方とかは気にしながらOSの更新とかするんだろうけど。

とりあえず、ElCapitanに対応したドライバーをインストール...治らない。
よく見たらガイドにはアンインストールしてからと書いてあるので、素直に実施。

アンインストールして気になったのがログイン時に起動する項目。
あそこに確かWacomのドライバーがログイン項目として追加されていたはず。
しかし削除不可な項目になっていたので今までいじっていませんでした。
今回はドライバ自体削除したので消えているんだろうなと期待してましたが
実際のところ消えていませんでした...すごく気持ち悪い。

画像にあるようなマイナスキーでも項目削除が出来ないため、
plistをいじる必要があります。

![ss_2016-07-03_0.12.53.png](https://qiita-image-store.s3.amazonaws.com/0/31188/52939d43-0b76-4458-7f49-a814c0600ae7.png "ログイン項目")

## ログイン項目をターミナルで削除

```bash
# システム配下かユーザ配下なのかは項目で異なるので両方見に行く
$ cd /Library/Preferences
$ ls -la *login*.plist
$ plutil -p *login*.plist

$ cd ~/Library/Preferences
$ ls -la *login*.plist
$ plutil -p *login*.plist
```
今回目当ての設定はシステム配下だったので、loginと付くplistを全て確認して
リレーションがある場合は削除を行いました。
※plistの内容と各ファイルの整合性を確認してから実施すること

```bash
$ sudo rm /Library/Preferences/*login*.plist
```

しかしこのコマンドは効きません。
El Capitanではファイル所有がrootなので、
一旦以下の操作が必要です。

```bash
$ sudo chown -R $(whoami) /Library/Preferences/*login*.plist
```

そうしたら再度削除を通します。
これでログイン項目が消えます。
本来はplistは削除せずにdefaults deleteでもよかったのかもしれませんが、
設定項目がドライバだけだったので削除が手っ取り早いと判断しました。

その後ドライバをインストールして再起動も通るようになりました。

## あとがき
一直線で書き起こしましたが、
rootでログインして再起動してみたり、
ターミナルでrebootしてみたりで紆余曲折ありました笑

なんでメニューバーからは失敗してコマンドの終了は通ったのか。
タスクキルの実行レベルに違いがある？
Unity製のiOSアプリの名前のローカライズをrubyでやる

## お金を払える人向けの解法(rubyではない)
- https://www.assetstore.unity3d.com/jp/#!/content/28954

## rubyでやりました

- https://github.com/furukazu/UnityXcodePostProcessor
- https://github.com/furukazu/UnityXcodePostProcessor/blob/master/lib/UnityXcodePostProcessor/cli.rb

## 同様の先行研究(参考にしました)
- http://qiita.com/monry/items/6f6507e7271caa3af42d (C#でやる場合)
- https://gist.github.com/STAR-ZERO/9130355
- http://qiita.com/shockyeah/items/de525d2d94691d45b651
- http://akisute.com/2012/09/unity-postprocessbuildplayer-weak.html
DIY CO2インキュベーター

##海外の自作サイト

http://www.pellinglab.net/diy/diyco2incubator/

のサイトで自作でインキュベーターを作っている人たちがいるので参考にしながら制作していきます。
生物学系の知識がほぼ無いので本を読みつつやっていきますので生物学系の方がいらしたらアドバイスよろしくお願いします。





##二酸化炭素センサー

http://www.co2meter.com/collections/co2-sensors/products/sprintir-100-percent-co2-sensor

上の部品だいたい２万円くらい。部品の中で一番高い.

人の体の二酸化炭素濃度が５％くらいらしいので
0から２０％の濃度の範囲で測定できるセンサが一番適してそうです。


##二酸化炭素ボンベ

ミドボンと言われる酒屋さんなどで売ってるビールサーバー用のボンベが良さそうです。
アマゾンで普通に売ってて自宅にボンベが届きました。８０００円ほど
空になったら酒屋さんで２０００円くらいで充填してもらえるらしいです。

レギュレーターと言われる高圧のボンベからインキュベーターで使う低圧の圧力まで下げる調整機も８０００円ほどで購入できました。


そのほか温度を見るセンサー、ヒーターなど良さげなものがありましたので随時更新していきます。




##co2センサ、電磁弁、ヒーター、温度センサ制御

参考のサイトをみながら、部品などは日本で安く調達できるところを探してそれなりにテスト環境が整いました。もっと作り込んでいこうと思います。


![IMG_3270.jpg](https://qiita-image-store.s3.amazonaws.com/0/67795/2b173b5b-c376-00c0-b39f-e113eb33c209.jpeg)


##制御に関して


インキュベーターではヒーターを動かすリレーと二酸化炭素ガスを放出するためのリレー二つが必要になります。
例えば温度37度の目標値に対して現在地は２０度だとするとリレーをONにします。
37度になるとOFFにして、という制御をオンオフ制御と言います。

ですがこの制御の方法だと37度になったからといってもすぐに温度が下がるわけでもなくすこし37度をオーバーしていってしまいます。(38度とかまで)
そこで必要になるのがPID制御という制御方式です。

数学でならった比例、微分,積分を利用して目標値になだらかに近ずけていく方法です。
この制御だとと37度から+-０．２度ほどのところで温度を維持してくれるようになりました。

次は発泡スチロールではみすぼらしいのと、コンタミ？と言われてる他の菌が入りやすいので
より密閉性のある綺麗な箱を製作していきます。



##今後の製作

次にインキュベーターの箱や、配線、配管などもっと綺麗にしたものを製作中です

![IMG_3778.JPG](https://qiita-image-store.s3.amazonaws.com/0/67795/95956a12-4112-991f-cf7e-1db87f876d9c.jpeg)




##新型のco2インキュベーターのテスト

周りから中の状態が確認できるインキュベーターができました。

続きはこちらのブログに書くようにします。

https://shingoyasu.hatenablog.com/



![IMG_0201.JPG](https://qiita-image-store.s3.amazonaws.com/0/67795/047d3a9a-d40f-4b21-e3a9-9bf9f6af3a5d.jpeg)
sessionとcookieとWeb Storageの違い

主観も入ってます。

# session
## 概要
情報自体はサーバサイドで持ち、
その情報にアクセスする為のキー値をcookieにてブラウザと共有する
<font color="red">情報をオブジェクトのまま持っておける</font>

## データ持続期間
* サーバーサイドの情報保持期間
 サーバサイドの情報の持ち方による
 * Javaや.NETのメモリ保持が多い為、20分程度。プロセス再起動で揮発する
 * apache(phpとか)はファイル保持が多い為、結構長い。プロセス再起動しても不揮発
 * デフォルトだと、Webサーバが動作している環境でそのままセッション情報を管理する為、接続先サーバが変わるとセッション情報にアクセスできなくなる。で、DBやKVSに外出しする構成を取ったりする
 * 最近はRedisが便利。セッション情報は、KVS向き！

* ブラウザサイドのキー情報保持期間
　ほどんどのWebサーバはSet-Cookieする際に有効期限を設定しない
　つまり、ログアウトするまで/ブラウザを落とすまで保持し続ける
 * ログアウト時は、有効期限を過去日にしてSet-Cookieする実装が必要

## 内容
* ログインユーザの契約情報(の一部)など、「マスターのデータストアにアクセスすると遅くなるから手元に持っときたいけど、外(ブラウザ)に渡すのは不安な情報」
* ブラウザ検証ツールで見られると困る情報

# cookie
## 概要
情報自体はブラウザで保管し、リクエストを送出する度にサーバサイドに通知している。
有効期限が指定できたりdomain<font color="red">(後方一致)</font>・pathが指定できたりhttp Onlyとかhttps Onlyとか・・・。
情報は、文字列形式でやりとりされる
<font color="red">domain・path・プロトコルが一致すれば、Ajaxでの通信やimageファイルの取得など、とにかく全てのリクエストで値を送ることになる。(よく問題になる)</font>

## データ持続期間
* ブラウザで「cookieを保持しない」設定をしていると、いくら長い有効期限を設定していても、ブラウザ落としたらなくなる。プライベートブラウザも同様。
* ブラウザの設定で有効期限指定が有効になっている場合、Set-Cookieに有効期限が設定されていれば、Set-Cookieに有効期限を設定時は、その有効期限まで保持
* Set-Cookieに有効期限を設定しない場合は、ブラウザを落とすまで保持

## 内容
まともな用法でいくと・・・

* セッション情報アクセス用のキー値
* ロードバランサーがバランシング後のサーバを覚えとく為のキー値
* javascriptでも使いたいし、サーバサイドでも使いたい情報
* ログアウト後、再ログイン時にも使った方が便利な情報
 * ex) 言語選択、直近の検索条件など
* localStorage登場前に、localStorageで保持しときたかった情報

# localStorage
## 概要
ブラウザが保管し、ブラウザしかアクセスできない。(PCの持ち主は、直接ファイル参照とか、できないこともないが・・・)
<font color="red">javascriptを使ってsetし、javascriptを使ってgetする</font>
情報は、文字列形式でset-getする

## データ保持期間
* sessionStrage：ウィンドウやタブを閉じるまで
* localStrage：永続(ただし、ブラウザ設定でブラウザ閉じるタイミングで解放するようにもできる)

## 内容
* 描画でだけ使いたい情報
* javascriptでだけ使いたい情報
* データ量が多い情報
TypeScript2.0+webpack

# TypeScript2.0(今のtypescript@next)でのwebpack.config

近々リリースされるということで試そうと思い[webpack.config](https://github.com/km-tr/typescript2-webpack-tslint-trial)を作りました。


## Loader

- [ts-loader](https://github.com/TypeStrong/ts-loader)
- [awesome-typescript-loader](https://github.com/s-panferov/awesome-typescript-loader)

`awesome-typescript-loader` の方が多少早い印象でした。

Qiitaなどを見ると `TypeScript` から `ES2015` にしたあと `Babel` で `ES5` にしている設定もありましたが、
`TypeScript` から直接 `ES5` でも `assets/app.ts` のコードでは問題なかったので `Babel` は使いませんでした。(Google Chrome Canary)


## 型定義ファイル

#### 参考
- [The Future of Declaration Files | TypeScript](https://blogs.msdn.microsoft.com/typescript/2016/06/15/the-future-of-declaration-files/)
- [特別なツール不要！ TypeScript 2.0時代の型定義ファイルの取り扱い方 - Qiita](http://qiita.com/tonkotsuboy_com/items/634b0921b6170cf56813)

2.0からは `tsd` や `Typings` を使わなくても `npm` の [@types](https://www.npmjs.com/~types) から install 出来るということだったのでそのようにしました。
今回2.0を利用したのもこちらを利用するためです。


## Lint

- [TSLint](https://palantir.github.io/tslint/)
- [tslint-loader](https://github.com/wbuchwalter/tslint-loader)

[Peerdependenciesの関係で](http://palantir.github.io/tslint/usage/cli/) `typescript@next` を使う場合は通常の `tslint` はインストール出来ないので `tslint@next` をインストールしました。

`tslint-loader` も Peerdependencies に通常の `tslint` が指定されていて, `next` バージョンを使っていると `tslint-loader` がインストール出来なかったので [forkして](https://github.com/km-tr/tslint-loader) next に対応したものを使っています。

([forkした人](https://github.com/wbuchwalter/tslint-loader/network) の変更を見てみると同じようなことをしている人たちが割といる感じ)


## その他

型定義ファイルをnpmからinstallしたいので2.0が出てから使いたい。
`Decorotors` が余りよくわかっていなかったので `assets/app.ts` で試してわかった気になりました。(TypeScriptで `experimentalDecorators` を `true` にすると使える)
python3にScrapyをインストール

「PythonによるWebスクレイピング」を読んでいたら、一部でscrapyを使うことになったのだけど、うまくインストールできなかったので、その解決法を軽くまとめておきます
（ちなみに上記の本は主にBeautifulSoupを使ってスクレイピングします）

#設定した環境
MacBook Air (13-inch, Mid 2011)
プロセッサ： 1.8 GHz Intel Core i7
メモリ： 4 GB 1333 MHz DDR3
バージョン： 10.11.5
Python: 3.6.2

#Scrapyを入れてみる
1, 今回はPython3の環境に入れます。

```sh
$ pip3 install scrapy
```

すると…以下のエラーが出てしまいました。
どうやらpipのバージョンアップをすべきようです。

```sh
You are using pip version 8.1.1, however version 8.1.2 is available.

You should consider upgrading via the 'pip install --upgrade pip' command.
```

* * *

2, エラー文の指示に従って、pipをアップグレードします。

```sh
$ pip3 install --upgrade pip
```

ここでもまたエラーが…
今度はxcodeまわりのようです。

```sh
1 error generated.

*********************************************************************************

Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed?

Perhaps try: xcode-select --install

*********************************************************************************

error: command '/usr/bin/clang' failed with exit status 1
```

* * *

3, 次もちょうど指示があるのでそれにならって、コマンドを打ちます。

```sh
$ xcode-select --install

xcode-select: note: install requested for command line developer tools
```

するとダイアログが表示されるので、同意してデベロッパーツールをDLをします。

![スクリーンショット 2016-07-02 23.17.27.png](https://qiita-image-store.s3.amazonaws.com/0/8222/6e206e84-dc8b-21e4-83ec-b652b2a2af3c.png)

* * *

4, ダウンロード後にもう一度、以下を実行すれば、インストール完了です。

```sh
$ sudo pip3 install scrapy

（中略）

Installing collected packages: lxml, parsel, scrapy
  Running setup.py install for lxml ... done
Successfully installed lxml-3.6.0 parsel-1.0.2 scrapy-1.1.0
```
TypeScript1.8 入門① (静的型付け・列挙型)


# 概要

Angular2が登場して、ますます盛り上がりを見せてみる「TypeScript」ですが、正直そこまで感度が上がっていませんでした。
(普段のReactベースでの開発時は、ES6 + Babelで開発しているのもあって。。。)

ただ、そろそろ放置は出来ないだろうという事で、調査を開始した。
実際に、調査した内容の要点だけまとめていこうと思う。

# 環境
* Node.js@6.1.0
* npm@3.9.5
* TypeScript@1.8.10
* typings@1.3.1

エディターはAtom、トランスコンパイラーにはWebpackを利用する。

# TypeScriptとは

TypeScriptはMicrosoft社が開発しているJavaScriptのスーパーセットです。
ネイティブなJavaScriptには存在しない「静的型付け」などを取り入れている為、中・大規模アプリの開発を行うのに適しています。
概要でもお話した通り、最近alpha版がリリースされたAngular2はTypeScriptで開発されています。

また、React / Vue.jsなどでもTypeScriptを用いて開発するとより安全なアプリを制作する事が可能になります。

# TypeScriptの機能

## 静的型付け

ネイティブのJavaScriptは、「動的型付け」の言語です。
「動的型付け」とは「ある変数に値を代入した後に、その値と違う型の値を代入しても良い」という事です。
例えば、

```js:sample.ts
let admin = 'yes';
admin = true;
```

それに対して、TypeScriptは、「静的型付け」の言語です。
要は「一旦変数にある型の値を代入したら、その変数の型は変更できないよ」という事です。

「動的型付け」の言語はある意味柔軟で、融通の利くとも言えますが、
中・大規模の開発ではそれが原因で良からぬバグがよく発生します。
TypeScriptは「静的型付け」を採用する事で「安全なプログラム」を作成する事に感度を置いています。

### TypeScriptで採用されている型の種類

|Type|Name|
|----|----|
|string|文字列|
|number|数値|
|boolean|真偽値|
|any|何でもあり|

### 静的型付けの書き方

```js:sample.ts
let num: number;
let num: number = 10;
let num = 10 // TypeScriptが型推論をしてくれて、自動的にiはnumber型になる。

let x; // xはany型になる。
let x = 10; // xはany型のまま。
let x = 'hello'; //xはany型のまま。

// 配列型を宣言する。
let names: string[] = ['Steve', 'Jack', 'Page'];
```

## 列挙型

列挙型は「定数を分かりやすく管理する」為のものです。
列挙型は「enum(イーナム)」キーワードで表現する事ができます。
また、慣習的に始めの文字は大文字にします。
enumのそれぞれの定数に「数値定数」を代入してあげます。
これで準備はOKです。

```js:sample.ts

enum Language {
	JavaScript = 0,
	TypeScript = 1,
	Dart = 2,
	CoffeeScript = 3
}

let language: Language = 1;

// 条件分岐などで利用可能
if (language === Language.TypeScript) {
	console.log('OK'); // "OK"
}

console.log(Language.Dart); // 2
console.log(Language[3]); // "CoffeeScript"

```

enumでは定数を指定して、数値を取得する事も可能ですし(Laguage.TypeScript)、その逆の数値を指定して文字列定数を取得する事も可能です(Language[2])。

また、数値定数は省略する事も可能です。
その場合は、0から始まる連番が自動的に付与されます。

最後に、複数で同名のenumを宣言する事も可能です。
その場合は、enum同士がマージされて利用できます。
(同名のenumを複数宣言する場合は、数値定数を省略できるのは1のenumだけです。)

# 終わり

今回は「静的型付け」「列挙型」の2つについて解説しました。
次回は「関数」「クラス」編を解説しようとおもいます。

続きは次回。
話題の எழில் という言語

#なにそれ
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">文字化けに見えるだろう？<br>எழில் っていう立派なプログラミング言語なんだぜ？ <a href="https://t.co/z9dC3WuaOQ">pic.twitter.com/z9dC3WuaOQ</a></p>&mdash; 木者 (@_Kun2) <a href="https://twitter.com/_Kun2/status/749168884582748160">2016年7月2日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

これ。
タミル語のプログラミング言語っぽいです。
英名は「Ezhil-Lang」

#とりあえず触ろう
##環境構築

git cloneします。

```
git clone https://github.com/Ezhil-Language-Foundation/Ezhil-Lang.git
cd Ezhil-Lang 
ezhili --help
```

おっと、怒られました。
インタプリタがなんちゃらって話らしいです(?)

```
Incomplete Ezhil interpreter installation;
	FATAL ERROR: No module named tamil
Missing installation of open-tamil library.
Get latest version of open-tamil library using Python Package index as
	$ pip install open-tamil
```

言われた通りpipでインストールします

```
pip install open-tamil
```

```
nagimaru-no-MacBook-Air:Ezhil-Lang nagimaru$ ezhili --help
usage: எழில் [-h] [-debug] [-tamilencoding TAMILENCODING] [-profile] [-stdin]
             [-stacksize STACKSIZE]
             [files [files ...]]

positional arguments:
  files

optional arguments:
  -h, --help            show this help message and exit
  -debug                enable debugging information on screen
  -tamilencoding TAMILENCODING
                        option to specify other file encodings; supported
                        encodings are TSCII, and UTF-8
  -profile              profile the input file(s)
  -stdin                read input from the standard input
  -stacksize STACKSIZE  default stack size for the Interpreter

```
お、次は出来たみたいです。環境構築はとりあえずこれで終了。
必要であればPATHは通しましょう

##Hello World
hello.nを作り以下のように記述します
(僕はPATH通してないので /Ezhil-Lang の直下に置きました)

```hello.n
பதிப்பி "Hello,World"
```


ターミナルで```$ ezhili hello.n```を実行

```
nagimaru-no-MacBook-Air:Ezhil-Lang nagimaru$ ezhili hello.n
Hello,World!

```

出来た！！！これは謎の感動！！

どうやら対話モードも使えるようです

```
nagimaru-no-MacBook-Air:Ezhil-Lang nagimaru$ ezhili
எழில் - ஒரு தமிழ் நிரலாக்க மொழி (Fri Nov 20 08:00:00 EST 2015)
Ezhil : A Tamil Programming Language - version 0.81, (C) 2007-2015
Type "help", "copyright", "credits" or "license" for more information.
எழில் 1>> 1 + 2 + 3  
6
எழில் 2>> 2 * 3
6
எழில் 3>> பதிப்பி "Hello,World!"
Hello,World!
None
எழில் 4>> Num = 5
5
எழில் 5>> Num
5
எழில் 6>> exit()
******* வணக்கம்! பின்னர் உங்களை  பார்க்கலாம். *******

```

#感想
キーボードでタミル語が打てないと開発は厳しい
【Python】pandas.DataFrameをnumpy.ndarrayに変換する

pandas.DataFrameをnumpy.ndarrayに変換する方法をいつも忘れるので。

```py3
import numpy as np
import pandas as pd

df = pd.DataFrame(np.arange(9).reshape(3, 3))
type(df.values)
```

```py3:出力結果
numpy.ndarray
```
「橋を燃やすな原則」

設計や基本的な方式に問題がある（ように見える）設計と実装がある。
その方式には自ずから限界があるように見える。

まっさらな状況から作り直したい衝動に強く駆られる。
既存の方式の原理的な限界は、どうやっても
取り繕いのないようにさえ思えてくる。

全ての諸悪の根源は、その方式の選択による設計と実装にあるようにさえ、思えてしまうこともある。
「バカヤロー」とののしりたくなる実装もある。

でも、待て、代わりになる橋は出来ていない。

趣味でコードを書いているわけではない。
利用する時期に、それなりに納得のいく動作をする必要がある。新たな橋ができていない時点で、橋を燃やしてはいけない。



「橋を燃やすな原則」は
「テスト駆動開発による組み込みプログラミング――C言語とオブジェクト指向で学ぶアジャイルな設計」(https://www.oreilly.co.jp/books/9784873116143/)
に書かれています。
Elastic Beanstalk + Rails

## EB CLIのインストール

keyが必要なのでIAMを作成する。権限は最小になるように頑張る。

```
$ brew install python
$ pip install awsebcli
```

環境自体は、GUIから作成するので概ね良いと思う。
t1.smallは流石に重い気がするので、m3.mediumぐらいでいいと思う。

## 初期化

```
eb init
```

### Tableを作る

```
$ eb ssh
$ createdb -U USER_NAME -h HOST_NAME TABLE_NAME
```

## 環境変数の指定

### DATABASE_URL

```
postgres://ID:PASSWORD@HOST:PORT/TABLE_NAME
```

### SECRET_KEY_BASE

$ bundle exec rake secret

### RAILS_SERVE_STATIC_FILES

RAILS_SERVE_STATIC_FILESをtrueに設定しないとpublicフォルダにアクセス出来ないようです。

## rake db:migrate

> RAILS_SKIP_MIGRATIONS – ユーザーのアプリケーションの代わりにコンテナで rake db:migrate を実行するか、単にスキップするかを指定します。Rails 3.x アプリケーションにのみ適用できます。Rails 以外の移行については、拡張子が .config のファイル（myconfig.config）を使用してコンテナコマンドを指定し、手動で移行を実行する必要があります。RAILS_SKIP_MIGRATIONS を true に設定した場合は、設定ファイルを使用して移行を行います。設定ファイルの使用の詳細については、「Ruby 環境のカスタマイズと設定」を参照してください。
> 
> [Elastic Beanstalk での Ruby 環境の設定 - AWS Elastic Beanstalk](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_Ruby.container.html)

またはSSHでログインして実行することになると思う。

## Deploy

### 502 Bad Gateway

GUIからアップロードすると、上手く動かないことがあり困った。うまくいく場合とうまくいかない場合の再現性が薄く対処が難しかった。

```
$ eb deploy
```

を使ったところ、アップロードしていたアプリに不備があるようでエラーが出た。GUIアップロードでは、詳細なエラーチェックが行われておらず唐突に失敗する場合があるのかもしれない。

というかよく考えると/var/app/currentの下が、GUIからやったときとCUIからやったときで完全に違ったので、多分やり方を間違えている。結論、CUIからやるのでいいと思う。

なんだか環境変数のセットもGUIからやると失敗することがあって、初回作成以外はGUIから触らないほうがいいのかもしれない。迷信めいてるけど。
Bash on Ubuntu on Windowsにphpをインストール

とりあえず日本語に変更

```shell-session
sudo apt install language-pack-ja
sudo /usr/sbin/update-locale LANG=ja_JP.UTF-8
```

phpのレポジトリを追加

```shell-session
sudo add-apt-repository ppa:ondrej/php
```

好きなバージョンをインストール

```shell-session
sudo apt install php[5.5|5.6|7.0|7.1]
```

ビルトインサーバを立ち上げてブラウザで確認

```shell-session
echo '<?php phpinfo();' > info.php
php -S localhost:8000
```

http://localhost:8000/info.php にアクセスするとphpinfoが見えます
ビルトインサーバはCtrl-Cで終了します
IBM Bluemixのデータベースを使う（Rails Tutorial のtoy appをデプロイする）

## やりたいこと
Rails TutorialをやっているとHerokuを標準で使います。しかし今後Webアプリを公開していく上で、Herokuだと無料運営ができなさそうなので、無料運営可能なIBM Bluemixにもデプロイしたい。
[Rails Tutorial のhello appをIBM Bluemixにデプロイしようとしてはまった件](http://qiita.com/takus69/items/c3c419dd01f2d373e71b)で、hello appのデプロイまでできたので、次はtoy app。何が違うかというとデータベースを使う点。Herokuでは特に意識せずにできたけれど、IBM Bluemixでもデータベースを使って、Ruby on Railsの開発を行いたい。

注意事項ですが、IBM Bluemixは日々変化しています。私がもたもた検証している間でも、ログイン画面が変わったりしました。内部的にも色々変わっているかも。。。そのため古い情報になっている可能性があることを認識下さい。
私もインターネットで調べたりしましたが、古い情報で提供されているサービスもかなり違っているようでした。そのため昔はできたけど、今はできない。その逆もかなりあると思います。

## 実験
### IBM Bluemixのサービス(PostgreSQL by Compose)でpostgresqlのデータベースを使う（無料では不可）
- Herokuと同じpostgresqlを使えばそのままtoy appをデプロイできるはず
- IBM BluemixにあるPostgreSQL by Composeのサービスを追加して、バインド
- 接続情報は自動で生成
- 結果はエラー
- 問題は「by Compose」。ComposeはDBaaS(DataBase as a Service)で、データベース本体はComposeにある（Composeではデータベースを作っていなかった）
- PostgreSQL by Composeは、Composeのデータベースに接続するだけ
- Composeのpostgresqlは、30日は無料だけど、その後は有料
- 元々の目的の、無料で運営が不可になるので、却下

### sqliteでデータベースを使う（不可）
- sqliteはgemの設定とdatabase.ymlの設定だけで簡単に使えるはず
- development環境ではsqliteを使っているので、production環境も同じにする
- 結果はエラー（接続エラー）
```
Instance (index 0) failed to start accepting connections
```
- Herokuでもsqliteは使えないように、IBM Bluemixでも使えないよう
- おそらくPaaSだとファイルシステムに自由に書き込まれるのは問題があるから？

### IBM Bluemixのサービス(dashDB)でdashDBのデータベースを使う（最終的に成功）
- dashDBは無料で提供されている
- gemのibm_dbをインストールすれば使える(Gemfileに追加)
- dashDBのサービスを追加して、バインドすれば接続情報も自動で作成
- 結果はエラー(以下の事を解決することで成功しました)

### ~~Railsのproduction環境のデータベースの基本~~
- ~~db:migration時に、オプションを付ける~~
```
~~RAILS_ENV=production~~
```
- ~~デフォルトはdevelopmentのため~~

### dashDBはclob型がない
- Railsでテーブル項目の型をtextにしているとclob型でテーブルを作成する
- dashDBにはclob型がないためエラー
- ibm_dbはDB2用のgemのため、DB2の型になるよう
- textをstringに変更して対応

## 方法
1. toy appを作成する
2. Gemfileにibm_dbを追加(productionのグループ)
```
gem 'ibm_db'
```
3. db/migrateのmicropostのマイグレーションファイルのtextをstringに変更
4. rakeコマンドをつけてcf push(なぜかエラー。次の手順コマンドを削除して再起動すると起動します)
```
cf push --command "bundle exec rake db:migrate"
```
5. コマンドを削除
```
cf push --command ""
```

## 感想
使ったことのあるsqlite,postgresql,mysqlなどがよかったのですが、今回初めてdashDBを使いました。型の部分は、暫定対応なのですが、ibm_dbがDB2用に提供されている限り、dashDBはどうすることもできないのか。。。しかし無事接続できてよかったです。
ここには記載してないですが、試行錯誤の中ではdatabase.ymlを変えてみたり、manifest.ymlを変えてみたりと色々試しました。最終的に必要な部分だけをまとめましたが、IBM Bluemixの仕様も絡むところが多く、整理が必要だと感じています。
Railsも勉強中の上、IBM Bluemixの仕様もあるので問題の切り分けに時間がかかりましたが、こうやって試行錯誤していくうちに、それぞれの仕様が理解できていくので、よい経験だと思います。

## 未解決事項
cf push するときに必ず出るエラーがあります。
- Cloning into '/tmp/buildpacks/ruby-buildpack'..
- Cloning into 'compile-extensions'...
- 下記manifest.ymlに記載ある、cloudfoundryのbuildpackだと出るようです。Bluemix標準のを使うと出ませんでした。
- ただBluemix標準のものだとibm_dbのgemがちゃんとインストールされず、cloudfoundryのだとインストールされて動きました。

他にもcf push するときに rake db:migrate のコマンドなどを入れると違うエラーが出たり。。。もう少し調べる必要があると思っています。

使ったmanifest.yml
```manifest.yml
applications:
- name: app-name
  host: app-name
  domain: au-syd.mybluemix.net
  buildpack: https://github.com/cloudfoundry/ruby-buildpack
  instances: 1
  memory: 128M
```
Jersey Test FrameworkをSpockで動かす

JAX-RSのユニットテストのライブラリにJersey Test Frameworkがある。ドキュメントはJUnitの説明だけなのでSpockで動かす例を説明する。

```build.gradle
Dependencies {
    compile group: 'javax.ws.rs', name: 'javax.ws.rs-api', version: '2.0.1'

    testCompile group: 'org.glassfish.jersey.test-framework.providers', name: 'jersey-test-framework-provider-grizzly2', version: '2.23.1'
    testCompile group: 'org.spockframework', name: 'spock-core', version: '1.0-groovy-2.4'

}
```

JAX-RSとJersey Test Frameworkのライブラリを追加。実はJersey Testには目的によっていくつかのテストを動かすコンテナが用意されいるが詳しくはドキュメント参考。

サンプルは次

```java:HelloResource.java
package example.jaxrs;

import javax.ws.rs.GET;
import javax.ws.rs.Path;

@Path("/")
public class HelloResource {
    @GET
    public String index() {
        return "Hello World";
    }
}
```

次にSpockのテストケース。ポイントはJerseyTestの扱い。JUniteではJerseyTestクラスを継承しているがSpockでは多重継承になるのでできない。そこでJerseyTestのインスタンスを作って実行することになる。

```HelloValidateResource.groovy
package example.jaxrs

import org.glassfish.jersey.server.ResourceConfig
import org.glassfish.jersey.test.JerseyTest
import spock.lang.Shared
import spock.lang.Specification

import javax.ws.rs.core.Application
import javax.ws.rs.core.Response

class HelloResourceTest extends Specification {
    @Shared
    def jerseyTest = new JerseyTest() {
        @Override
        protected Application configure() {
            return new ResourceConfig(HelloResource.class)
        }
    }

    def setupSpec() {
        jerseyTest.setUp()
    }

    def cleanupSpec() {
        jerseyTest.tearDown()
    }

    def "test index"() {
        when:
        def response = jerseyTest.target("/").request().get(String.class)
        then:
        response == "Hello World"
    }

    def "test index 2"() {
        when:
        def response = jerseyTest.target("/").request().get()

        then:
        response.getStatus() == 200
        response.readEntity(String.class) == "Hello World"
    }

}
```
このようになる。

# 参考
* https://jersey.java.net/documentation/latest/user-guide.html#test-framework
Raspberry Pi3 WiFi固定IPの設定

#設定ファイルの修正
Raspberry Pi3のIP固定化は１つの設定ファイルを修正するだけで変更することができます。ファイルは **/etc/network/interfaces**

#修正方法
```
sudo vim /etc/network/interfaces
```


以下の記述をコメントアウトする

```
iface wlan0 inet manual
```

次に固定IPの設定情報を追記する。以下のように設定する例です。

|設定項目  |設定値|
|:-----------|:------------:|
| 固定IP       | 192.168.1.2 | 
| サブネット     | 255.255.255.0   
| ゲートウェイ     |192.168.1.1|   


```
iface wlan0 inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1
```

ファイルを保存する。
Raspberry Piを再起動する

```
sudo reboot
```

ifconfigコマンドで設定が変更されていることを確認する。
以上で固定IP化の設定完了です。

/etc/network/interfacesの最終形は以下の通り

```
# interfaces(5) file used by ifup(8) and ifdown(8)

# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

auto lo
iface lo inet loopback

iface eth0 inet manual

allow-hotplug wlan0
#iface wlan0 inet manual
iface wlan0 inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

allow-hotplug wlan1
iface wlan1 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```

#注意事項
もし設定にミスると、WiFiでの接続ができなくなりますので、
この作業か必ずRapsberryPi本体でキーボード、ディスプレイを接続して作業することをお勧めします。
30歳目前ノンエンジニアのJS習得への道＜一日目＞

体調を崩し2週間ほど停滞。再開。

関連項目
<a href="http://qiita.com/jomai/items/9b3805e2489f8509806a">30歳目前ノンエンジニアのJS習得への道＜導入編＞</a>




#<進捗>
<a href="https://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88JavaScript-%E4%BA%95%E4%B8%8A%E8%AA%A0%E4%B8%80%E9%83%8E-ebook/dp/B00P2EG5LC?ie=UTF8&qid=1466348480&ref_=la_B004LWDT3S_1_1&s=digital-text&sr=1-1">パーフェクトJavaScript</a>（井上誠一郎,土江拓郎,浜辺将太）
└Part1/第1章/JavaScriptの概要　<b>読了</b>
　→次回読む所は<b>Part2/第9章/DOM</b>　
　※気になった所から進めるスタイル

#<学び>
・Javascript登場は1995年、Netscapeに搭載
　└コレを機にブラウザ上にてプログラムの実行が可能となる
　└元々はLiveScriptという名前、Javaの知名度にあやかって改名
　└Javaと揃えてオブジェクト名、メソッド名を開発したため名称は類似するが動きは非なるもの
　└ネットスケープとマイクロソフトのブラウザ戦争
　└マイクロソフトのDHTML（ダイナミックHTML）はJavaScriptの技術基盤
　└DHTML→W3C社のDOMとCSS＋Javascriptでのリッチユーザーエクスペリエンス
　└ECMAScriptは第4版は見送り、第5版もJS1.6以降の機能は追加されず
　└ブラウザごとにJS処理系の名前がある。FireFoxでもSpiderMonkey
　└ブラウザ毎に挙動が変わる。
　└ECMAScriptに準拠している場合は非常に移植性が高い
　└Acid基準（ここで広い範囲をテストしクリアする基準）
　└コア言語はJSの取り替え不可能な部分、それに付随してDOM、ホストオブジェクトがある
　└Javascriptのグローバルオブジェクト＝最初から存在するオブジェクト=windowオブジェクト
　└IEはJScript搭載、これも含めてJS

#<感想>
1995年の登場から、ネットの主流を競合する中で進化された言語であり、進化していったものである。その流れを一発読みで理解しようとするのではなく、潮流の大きさをまず感じる。

#<疑問と解>
<b>・ECMAScriptのスーパーセット→スーパーセット？</b>
　上位互換。Aを包括し、その上で拡張しているB
<b>・EcmaInternationalってどんな会社？</b>
<a href="https://ja.wikipedia.org/wiki/Ecma%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8A%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB">wiki</a>,European Computer Manufacturers Associationが正式名称、情報システムの標準化団体。C#、C++等もここ。</b>
<b>・標準化団体ってなに？</b>
　標準化団体（ひょうじゅんかだんたい、英語: standardizing body）とは、それぞれの分野の標準を策定する団体。例：国際標準化機構（ISO）や国際電気標準会議（IEC）は国際標準化団体、日本工業規格（JIS）やANSIなどのような国内の標準化団体がある。今回のECMAはヨーロッパの標準化団体。
<b>・デファクト標準？</b>
　<a href="https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%95%E3%82%A1%E3%82%AF%E3%83%88%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%80%E3%83%BC%E3%83%89">wiki</a>,ISO、DIN、JISなどの標準化機関等が定めた規格ではなく、市場における競争や広く採用された「結果として事実上標準化した基準」を指す。逆はデジュリスタンダード。</b>
<b>・デファクト化？</b>
　デファクトスタンダードになる事。</b>
<b>・スクリプティング？</b>
　<font color=red><b>ちょっと飛ばし</b></font>
<b>・バッドノウハウ</b>
 本質的に生産的ではない、ソフトウェアなどを使いこなすために、ストレスを感じながらもしぶしぶ覚えなければならないようなノウハウ。</b>
<b>・スパイダーモンキーって何？</b>
 クモザル。
<b>・JavaScript処理系？</b>
 <font color=red><b>とばし</b></font>
<b>・レンダリングエンジン？</b>
 形式的なデータを読み込んで、データに付けられた条件や特定のルールにしたがって、適切な形に表現しなおすソフトウェア部品である。 レイアウトエンジン (layout engine)、レンダラ (renderer) ともいう。</b>
<b>・WebKitの独占、今も？</b>
 今も。
<b>・ホストオブジェト？組み込みオブジェクト？</b>
 <font color=red><b>とばし</b></font>
<b>・グローバルオブジェクト？</b>
 標準ビルトインオブジェクト、定義せず存在するオブジェクト。Windowオブジェクト等
<b>・APIって何？</b>
 <font color=red><b>とばし</b></font>
<b>・統合開発環境</b>
 ソフトウェアの開発環境。 従来、コンパイラ、テキストエディタ、デバッガなどがばらばらで利用していたものをひとつの対話型操作環境（多くはGUI）から利用できるようにしたもの。

#次回
Keras（TensorFlowバックエンド）でMNIST（DCNN）

# KerasでMNIST（DCNN）

## Kerasとは

TheanoやTensorFlowを使いやすくするためのライブラリ

[Keras](http://keras.io/)

## 実行環境

EC2（AWS）のg2.2xlargeインスタンス（オレゴン = 米国西部）
Python 2.7.6
TensorFlow 0.8.0

AWSのインスタンスは他人のAMIを使って初期化したが、自分で導入したい場合は以下を参考

[EC2のGPU instanceでTensorFlow動かすのにもうソースからのビルドは必要ないっぽい？](http://memo.sugyan.com/entry/2016/06/24/003530)

## Kerasのインストール

[ドキュメント](http://keras.io/#installation)の通りにやる
TensorFlowが既にインストール済みだとして、必要に応じて'sudo'つけて

```
pip install scipy
pip install scikit-learn
pip install pyyaml
apt-get install libhdf5-dev
pip install h5py
pip install keras
```

pythonから1度

```
import keras
```

としてKerasを実行し、'~/.keras/keras.json'を以下のように編集

```
"backend": "theano"
```
↓
```
"backend": "tensorflow"
```

## コード

```python:mnist.py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers.convolutional import Convolution2D, MaxPooling2D
from keras.layers.core import Activation, Flatten, Dense
from keras.callbacks import EarlyStopping

(X_train, y_train), (X_test, y_test) = mnist.load_data()
nb_classes = 10

X_train = X_train.reshape(-1, 1, 28, 28).astype('float32')
X_test = X_test.reshape(-1, 1, 28, 28).astype('float32')
X_train /= 255
X_test /= 255
y_train = np_utils.to_categorical(y_train, nb_classes)
y_test = np_utils.to_categorical(y_test, nb_classes)

model = Sequential()

model.add(Convolution2D(nb_filter = 16, nb_row = 3, nb_col = 3, border_mode = 'same', input_shape = (1, 28, 28)))
model.add(Activation('relu'))

model.add(Convolution2D(nb_filter = 32, nb_row = 3, nb_col = 3, border_mode = 'same'))
model.add(Activation('relu'))

model.add(MaxPooling2D(pool_size = (2, 2), border_mode = 'same'))

model.add(Convolution2D(nb_filter = 64, nb_row = 3, nb_col = 3, border_mode = 'same'))
model.add(Activation('relu'))

model.add(Convolution2D(nb_filter = 128, nb_row = 3, nb_col = 3, border_mode = 'same'))
model.add(Activation('relu'))

model.add(MaxPooling2D(pool_size = (2, 2), border_mode = 'same'))

model.add(Flatten())

model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))

early_stopping = EarlyStopping(monitor = 'val_loss', patience = 2)

model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
model.fit(X_train, y_train, nb_epoch = 5, batch_size = 100, callbacks = [early_stopping])
score = model.evaluate(X_test, y_test)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
```

## 参考にしたページ

[深層学習ライブラリ Keras](http://aidiary.hatenablog.com/entry/20160328/1459174455)
[Keras Documentation](http://keras.io/)
gitlabにssh接続しようとしたら`Permission denied (publickey)`と言われたときの話


10分位ハマったので備忘録としてサクッと書く。

## gitlab公式ドキュメントに書かれている方法でSSHキーを作成してもうまくいかない
[ここ](https://gitlab.com/help/ssh/README.md)に書かれてるように、

* `ssh-keygen`で鍵つくって
* 公開鍵をgitlabに登録して
* `~/.ssh/config`を編集する

ssh接続を確認しようとしたところ、

```sh
ssh -T gitlab.com
> Permission denied (publickey).
```

という無情な表示が...

`User`が間違っているのかなーとか思って、gitlabに登録してある

* username
* name

とかを試してみたけど、つながらず...

## 解決法
よく原因がわからなかったので、ググってみたりしたけど、
[こちら](http://qiita.com/mcddx330/items/8d36108553030071f403)のように、`ssh-keygen`のときにメールアドレスをコメントとして記載する方法くらいしか見つからない。
そもそも公式ドキュメントにその方法書かれてるから、そのコマンド実行してるし。

### `User`を`git`とすることでつながった！！！

githubとかbitbucketとかと同じような書き方のノリで、
`User`パラメータに`git`を指定してやったら、

```sh
ssh -T gitlab.com
> Welcome to GitLab, <USERNAME>!
```
なんとつながった。
これで一安心。

バージョンアップで変更になったけど、公式ドキュメントの更新が忘れられてるっていうミスですかね。。。
NewRelicにAWSメトリクスを表示する

# 目的
NewRelicでAWSのRDS、ElasticCache、LoadBalancerのメトリクスを見れるようにする
EC2はnewrelic-sysmondをインストールすれば、サーバー一覧で管理できるが、RDS、ElasticCache、LoadBalancerはその方法ではいけない

参考資料
https://www.rco.recruit.co.jp/career/engineer/blog/4/

## 作業詳細
###  IAMグループ、ポリーシ、ユーザー追加
参考資料は[こちら](https://github.com/newrelic-platform/newrelic_aws_cloudwatch_plugin#iam-aws-api-credentials)

最終設定はこんな感じ
* IAMグループ:   NewRelicCloudWatch
* ポリーシ:  NewRelicCloudWatch
* ユーザー:   NewRelicCloudWatch

NewRelicCloudWatchユーザーのアクセス情報をメモしておく、後で設定時に利用する

```
アクセスキー ID: **********
シークレットアクセスキー: **********
```

### EC2 Instance追加
 * VPC: *******
 * サブネット: *******
 * 自動割り当てパブリック IP: 有効
   *  これを有効にしないと、public dnsとpublic ipが自動割り振らないので、外へ接続できない
 * 名前: newrelic_cloudwatch
 * セキュリグループ: *******
 * キーペア: *******

### ec2-userのほかに、newrelicユーザーを追加して作業する
EC2を追加時のキーペアでec2-userとしてsshログインする
newrelicユーザを追加する

### newrelic_aws_cloudwatch_pluginをinstall
1. newrelic_aws_cloudwatch_pluginをinstall

```
$ wget https://github.com/newrelic-platform/newrelic_aws_cloudwatch_plugin/archive/latest.tar.gz
$ tar zxvf latest.tar.gz
$ cd newrelic_aws_cloudwatch_plugin-latest/
$ cp config/template_newrelic_plugin.yml config/newrelic_plugin.yml
```
1. config/newrelic_plugin.ymlを編集して、[こちら](https://github.com/newrelic-platform/newrelic_aws_cloudwatch_plugin#configuration)を従って、設定する
1. 依存してる bundle、gitなどをinstall

```
$ gem install bundler
$ sudo yum install git
$ bundle install
ものもの足りないので、エラーをgoogleで検索して、以下のもの実行
$ sudo yum -y install ruby-devel
$ sudo yum install gcc
$ sudo yum install -y libxml2 libxml2-devel
$ sudo yum install libxslt-devel
```

### 起動、終了
```
bundle exec bin/daemon start
bundle exec bin/daemon stop
```

プロセス名: newrelic_aws

### これでnewrelicのplugins画面でRDS、ElasticCache、LoadBalancerのメトリクスが見れるようになる
  * 適切な値でアラートも設定しておく