OmniAICreator/Qiita-1.07M huggingface dataset:
ESP8266 > UDP > echo server (with Access point enabled)

```txt:動作確認
- ESP-WROOM-02 > ユニバーサル基板実装
- MacOS X 10.8.5
```

機能

- アクセスポイント機能
- UDPエコー

## コード > v0.2

[v0.2 @ github](https://github.com/yasokada/esp8266_151230_udpEchoWithAccessPoint/releases/tag/v0.2)

## 使い方

1. ESP-WROOM-02をFlash Boot Modeで起動
2. Macから アクセスポイント esp8266に接続 (パスワード:　12345678)
3. ターミナルで `ping 192.168.4.1`で応答を確認
4. ターミナルで以下のコマンドを実行
  - `echo "test" | nc -u 192.168.4.1 7000`
  - 応答は `received:test`

別途、ブラウザから 192.168.4.1/ へアクセスすると `You are connected`がブラウザに表示される。
node-redでwebsocketブリッヂ使ってmythingsを発火

#概要
どうにも、node-redからmythingsにトリガー送れなくて、裏技使った。
jsdo.itで動かす。ライブラリーは、meshblu.js使った。
#写真
![websocket.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/fd455388-285b-34fe-9f63-da499a372f2a.jpeg)

#サンプルコード
```
var red;
var conn;
function setup() {
    var url = "you .jp-east.compute.idcfcloud.com";
    var uuid = '';
    var token = '';
    red = new WebSocket("ws://node-red /test0");
    red.onmessage = function(e) {
        alert("red received data : " + e.data);
        conn.data({
            'uuid': uuid,
            'text1': 'ohisama'
        });
    };
    conn = meshblu.createConnection({
         'uuid': uuid,
         'token': token,
         'server': url, 
         'port': 80
    });
    conn.on('notReady', function(data) {
        alert('UUID FAILED AUTHENTICATION!');
    });
    conn.on('ready', function(data) {
        alert('conn open');
    });
}
setup();
```
[SensorTag] Texas Instruments の CC2650 SensorTag を試す（３）

### はじめに

前回は温度・湿度を継続的に取得するプラグラムを作成しました:smile: 
[[SensorTag] Texas Instruments の CC2650 SensorTag を試す（２）](http://qiita.com/madobon/items/6feeac65e9766d970668)

本記事では、前回の記事で宣言したとおり
WebSocketを使った温度・湿度のリアルタイム描画にチャレンジしました。

### 使ったパッケージとか

```package.json

{
  "name": "sensor",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "watch": "gulp watch",
    "start": "gulp && node ./dist/sample.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.13.3",
    "redis": "^2.4.2",
    "sensortag": "^1.2.0",
    "ws": "^0.8.1"
  },
  "devDependencies": {
    "babel-polyfill": "^6.3.14",
    "babel-preset-es2015": "^6.1.18",
    "babel-preset-stage-0": "^6.1.18",
    "gulp": "^3.9.0",
    "gulp-babel": "^6.1.1"
  }
}
```

- [express](https://www.npmjs.com/package/express) は Node.js 向けのWeb アプリケーション・フレームワークです。
- [redis](https://www.npmjs.com/package/redis) は名前から分かる通り、 [redis](http://redis.io/) を扱うためのパッケージです。
- [ws](https://www.npmjs.com/package/ws) は WebSocket を扱うためのパッケージです。
- グラフの描画には [d3.js](http://d3js.org/) を利用しました。

async/await を使おうと思って [babel-polyfill](https://babeljs.io/docs/usage/polyfill/) 入れたけど、結局使わなかった。
今回はいわゆるコールバック地獄で書きました。


### 完成品

こんな感じでCC2650から取得した温度と湿度の情報をもとに、
グラフを１分毎にリアルタイムに更新しています。

<img width="796" alt="CC2650_SensorTag.png" src="https://qiita-image-store.s3.amazonaws.com/0/9760/d8fe972d-13ed-71be-a5bf-41d9b11b2ba9.png">

### 解説

WebSocket に接続があったタイミング（つまり、初期表示）で１日前からのセンサーデータを redis から取得しています。

```js
// 1日前のデータまで取得
let ago = Date.now() - (1000 * 60 * 60 * 24);

redis.zrevrangebyscore('sensor', '+inf', ago, function(err, result){
  if (err) throw err;
  sensordataset = result.map((element, index, array) => {
    return JSON.parse(element)
  })
  ws.send(JSON.stringify({type: 'init', sensordataset}), () => {});
});
```

その後は、１分毎に最新のセンサーデータをサーバからクライアントに WebSocket を通じて送信しています。また、 redis にもセンサーデータを保存しています。

```js
// １分毎に
setInterval(() => {
  // センサーデータを取得
  tag.readHumidity((error, temperature, humidity) => {

    let humidityData = {
      date: Date.now(),
      temperature: temperature,
      humidity: humidity
    };

    let sensordata = humidityData;

    // センサーデータを redis に保存
    redis.zadd('sensor', Date.now(), JSON.stringify(sensordata));

    // 接続クライアントがあれば...
    connects.forEach(ws => {
      // センサーデータを送信
      ws.send(JSON.stringify({type: 'update', sensordata}), () => {});
    });
  });
}, PERIOD);
```

クライアントサイドは受け取ったセンサーデータをもとにグラフを描画しています。
詳しくは一番下に貼ってあるリンクを参照してみてください :sunglasses: 

### ソース

https://github.com/madobon/sensor/tree/v_0.0.4

### 参考

激しく参考にさせていただきました :heart_eyes: 

- [Raspberry Piで取得したセンサーデータをリアルタイムに可視化する（グラフ編）](http://blog.mlkcca.com/iot/realtime-data-visualization-with-raspberry-pi-3/)
- [d3.js line graph with dual Y axes
](http://bl.ocks.org/d3noob/e34791a32a54e015f57d)
aタグのdownload="name"属性が無視される

#問題
次のリンクをクリックするとdownloadに指定したnameで保存されると思ったら、元のファイル名のままダウンロードされる。 検証環境：Chrome。

```
<a href="https://pbs.twimg.com/media/CXOK01uUsAAX_wX.jpg" download="yugioh_anime_20151227181513_0"></a>
```

原因：
どうも外部リンクを指定している場合、name属性が無視されるようです。つぎのように内部リンクの場合は有効になります。（実機検証のみ）
一回storageに保存してblob url経由で保存すれば回避できますかね？（未検証）
→そもそもstorageに保存する段階で名前つけられるから関係ないですね・・・

```
<a href="image/CXOK01uUsAAX_wX.jpg" download="yugioh_anime_20151227181513_0"></a>
```
ESP8266 > APモード > httpサーバー > 2.4GHz混線によってはまった

```txt:使用機材
ESP-WROOM-02 > ユニバーサル基板実装
```

borg sensor systemにおいてセンサー(WR1側)と反対側(WR2)との通信の構築について検討中。

[Qiita投稿](http://qiita.com/tadfmac/items/17448a2d96bd56373a66#wifi%E7%B5%8C%E7%94%B1%E3%81%A7l%E3%83%81%E3%82%ABap%E3%83%A2%E3%83%BC%E3%83%89)にあるESP8266自身がAPになる実例が分かりやすかったので、勉強もかねて試してみた。

## コード

コードは以下のようにした。

```.c
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

static const char *kSsid = "esp8266";
static const char *kPassword = "12345678";

ESP8266WebServer myServer(80);

void handleRoot() {
    myServer.send(200, "text/html", "<h1>You are connected</h1>");
}

void setup() {
    pinMode(4,OUTPUT);
    delay(1000);

    Serial.begin(115200);
    Serial.println();
    Serial.print("Configuring access point...");
    WiFi.softAP(kSsid, kPassword);

    IPAddress myIP = WiFi.softAPIP();
    Serial.print("AP IP address: ");
    Serial.println(myIP);

    myServer.on("/", handleRoot);
    myServer.begin();
    Serial.println("HTTP server started");
}

void loop() {
    myServer.handleClient();
}
```

## はまった点

現在の自分の環境は2.4GHzでの混線が生じることがある。

それに気づかずにAPへの接続をしようとして「タイムアウト：接続できませんでした」となってはまった。

対応策としては、ESP8266を動かす場所をいくつか試して、受かりやすい場所を見つけるようにした。

一旦接続した後は、pingで応答時間を表示しながら、場所を代えてどれほど通信状況が変わるか確認できた。応答時間が1000msecになる場所もあり、この時はhttp接続でタイムアウトになってしまった。

正常な通信時はだいたいpingの応答時間が3msec以内、時々（混線によるものか）200msecが上限となった。
OpenCV 3.X ソースビルド (Ubuntu)

OpenCV 3.X をソースからビルドする。

# 参考
http://docs.opencv.org/2.4/doc/tutorials/introduction/linux_install/linux_install.html

# 必要パッケージをインストールする。
```
sudo aptitude install build-essential
sudo aptitude install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo aptitude install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
sudo aptitude install ant
```

# ソース取得
```
cd ~
git clone https://github.com/Itseez/opencv.git
```

# ビルド
```
cd ~/opencv
mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j4
```
- 4行目末尾の「..」を忘れずに。
- 5行目の「-j4」は、4プロセス並行でビルドするオプション。(付けなくてもいいし、-j2などでも良い)

# インストール
```
sudo make install
```
- /usr/local にインストールされる。
Node.js インストール (Linux)

# Node.jsとは
Javascript インタプリタ

# 注意
ユーザーローカルな環境になる。（ホームディレクトリにインストールする）

# インストール
## 1. ダウンロード
https://nodejs.org/en/download/

```
http --download https://nodejs.org/dist/v5.3.0/node-v5.3.0-linux-x64.tar.gz
```

## 2. 展開
```
tar xvzf node-v5.3.0-linux-x64.tar.gz
```

## 3.  シンボリックリンクを張る。
```
ln -s node-v5.3.0-linux-x64 node
```

## 4. PATHを通す。
### .profile に以下の行を追加する。

```.profile
export NODE_HOME=$HOME/node
export NODE_PATH=$NODE_HOME/lib/node_modules
export PATH=$NODE_HOME/bin:$PATH
```

### PATHを適用する。

```
source .profile
```

## 5. 動作確認
```
node --version
npm --version
```

インタプリタ

```
$ node
> 1+1
2
※CTRL-Dで終了
```


## 6. 開発ツールをインストールする。
```
npm install -g gulp bower
```

npm - Node Package Manager
gulp - ビルドツール(makeのようなもの)
bower - クライアントサイドJavascriptライブラリ管理ツール

- -g は、パッケージを $NODE_HOME/lib/node_modules/ にインストールするオプション。(グローバルのg)
- -g を付けないと、カレントディレクトリの node_modules/ にインストールされる。(プロジェクト毎にライブラリバージョンを使い分けるとき)

## 7. 動作確認
```
gulp --version
bower --version
```
Raspberry Piでdhcpクライアントが止まらない

結論

```bash
#systemctl disable dhcpcd
```
で済みました。

Raspberry Pi 2をVPNサーバとして利用しようとした時の話です。
OS : Raspbian jessie November 2015

変なIPアドレスが邪魔しているなと思ったら、
dhcpからアドレス割り振られていました。

interfacesにeth0のstaticを設定すれども
dhcpクライアントは止まりません。

ググっても、
"isservを使うといい"とか、
"起動後にehternet接続すればいい"とか、
書いてあったのですが、効果なし。

isservの記事に"dhcpcdが・・・"と記載してあったので、
試しにやってみたらうまくいきました。
Fertile Forest Model (8/n) ノード移動

# ノードの移動

ある子ノードを別の親ノードの子として移動させるのは、 FF モデルでは意外に簡潔に実装できます。事前の計算が必要ですが、いかなる移動処理も UPDATE 一回で行えます。

```
DEPTH|
     |
   0 | [A]--+-----------+
     |      |           |
   1 |     [B]--+---+  [C]--+---+
     |          |   |       |   |
   2 |         [D] [E]     [F] [G]--+---+
     |                              |   |
   3 |                             [H] [I]
-----+-------------------------------------------
     |  0   1   2   3   4   5   6   7   8   QUEUE
```

## 範囲入れ替え

ノード [G] を [E] の子ノードに移動させる例で説明してみます。

> 1. 移動先の新しい親ノード [E] の QUEUE は 3
> 2. 移動させる部分木は、 [G] ～ [I]
> 3. [E] と [G] の間にあるノードは、移動させる部分木のノード数の 3個分スライドさせる
> 5. [E] と [G] の DEPTH をそれぞれ Ed, Gd とした時、移動させる部分木全体の DEPTH は (Ed - Gd + 1) だけずれる

QUEUE に関する移動処理は、下図で「 (2) と (3) の範囲を入れ替えて QUEIE と DEPTH を附番し直す」と要約されます。

```
DEPTH|
     |
   0 | [A]--+-----------+
     |      |           |
   1 |     [B]--+---+  [C]--+---+
     |          |   |       |   |
   2 |         [D] [E]     [F] [G]--+---+
     |                              |   |
   3 |                             [H] [I]
-----+-------------------------------------------
     |  0   1   2   3   4   5   6   7   8   QUEUE
                    *   *---*   *-------*
                   (1)   (3)       (2)
```

```
DEPTH|
     |
   0 | [A]--+-----------------------+
     |      |                       |
   1 |     [B]--+---+              [C]--+
     |          |   |                   |
   2 |         [D] [E]--+              [F]
     |                  |
   3 |                 [G]--+---+
     |                      |   |
   4 |                     [H] [I]
-----+-------------------------------------------
     |  0   1   2   3   4   5   6   7   8   QUEUE
                    *   *-------*   *---*
                   (1)     (2)       (3)
```

前方へ移動する場合と後方へ移動する場合で QUEUE の計算が少し変わりますが、基本的な考え方は同じです。

## ノード移動のコストカット

原始的 FFモデルでは、移動先のノードが離れていれば離れているほど QUEUE を附番し直すコストがかかります。これも、入れ子集合モデルが抱えているのと同じ難題です。

拙作のライブラリでは、ノード追加時のコストを軽減するための工夫が実装されています。その工夫に於いては、ノード移動時のコストは「移動するノードのサブツリーのみ」になります。つまり、コストは最小限で抑えられるケースがあるというわけです。

工夫の方法について記すと、それだけで膨大な記載になってしまいます。興味がある方は、以下の拙作ライブラリを解読してみて下さいな。

- [Fertile Forest Model for Plugin of CakePHP 3.x](https://packagist.org/packages/stew-eucen/fertile-forest)
- [Fertile Forest Model for RailsGem](https://rubygems.org/gems/fertile_forest)

# リンク

- [ツリー構造データをRDBで扱うための第五のモデル](http://qiita.com/StewEucen/items/e0487c39285a9d6b7863)
- [RDB に於けるツリー構造データ (1)](http://qiita.com/StewEucen/items/18a1703353c735258a8a)
- [RDB に於けるツリー構造データ (2)](http://qiita.com/StewEucen/items/e5895d9f09beb16c61fd)
- [モデルデザイン](http://qiita.com/StewEucen/items/b4840343c22cea11ec26)
- [ノード検索＜祖先ノード系＞](http://qiita.com/StewEucen/items/632bddd683d77d1cf176)
- [ノード検索＜子孫ノード系＞](http://qiita.com/StewEucen/items/44901b69e2a061e0bc0a)
- [ノード検索＜親戚ノード系＞](http://qiita.com/StewEucen/items/22ba49ab8e591c663c84)
- [ノード追加](http://qiita.com/StewEucen/items/796c6d017dcf32bdb429)
- ノード移動
Anaconda(python)からMySQLを使う


素のAnacondaからMySQLにアクセスする方法。Pythonは思いのほか、MySQLにアクセスするのに手間がかかる。

###環境

* anaconda3-2.4.0(Python3.5.1)

>2.7.xでも、print()の()を取れば動きます。その程度の違いです。

###ドライバのインストール

ドライバは、

* mysql-connector-python
* PyMySQL

の２つを試してみます。

##mysql-connector-python編

とりあえず、[これ](https://anaconda.org/anaconda/mysql-connector-python)を使う。

```bash
conda install -c https://conda.anaconda.org/anaconda mysql-connector-python
```

###利用（読取り）

訳あって、少しPHP風に書いてます。
DBのスキーマ等は省略。

```py
#coding:utf-8
import mysql.connector

#接続情報
dbh = mysql.connector.connect(
        host='localhost',
        port='3306',
        db='testdb',
        user='dbuser',
        password='password',
        charset='utf8'
    )

#カーソル取得
stmt = dbh.cursor(buffered=True)

#SQL
sql = "select * from members"

#実行
stmt.execute(sql)

#取得
rows = stmt.fetchall()

#ループ
for row in rows:
    print(row[1])

#掃除
stmt.close()
dbh.close()
```

###利用（書込）

追記：読取りのSQL変えるだけと思っていましたが、ちょっと違うのですね。commit()する必要があるようです。

```ptyhon
#coding:utf-8
import mysql.connector

#接続情報
dbh = mysql.connector.connect(
        host='localhost',
        db='testdb',
        user='dbuser',
        password='password'
    )

#カーソル取得
stmt = dbh.cursor(buffered=True)

#SQL
sql = "insert into members(name) values('foo');"

#実行
stmt.execute(sql)

#コミット
dbh.commit()

#掃除
stmt.close()
dbh.close()
```

###参考

[ここ](http://amg-solution.jp/blog/4792)に良い記事がありました。

##PyMySQL編

[ここ](http://qiita.com/aeas44/items/90c867aa2d02f9047ef0)が参考になりました。あと、[本家？サイト](https://github.com/PyMySQL/PyMySQL)。

>私の環境では、Djangoの時は、PyMySQLしか動きませんでした。。

###インストール

```bash
pip install PyMySQL
```

###利用（読取り）

コードはこんな感じ。微妙に違う。

```py
#coding:utf-8
import pymysql

#接続情報
dbh = pymysql.connect(
		 host='localhost',
	     user='dbuser',
	     password='password',
	     db='testdb',
	     charset='utf8',
	     cursorclass=pymysql.cursors.DictCursor
    )

#カーソル
stmt = dbh.cursor()

#SQL
sql = "select * from auth_user"

#実行
stmt.execute(sql)

#取得
rows = stmt.fetchall()

#ループ
for row in rows:
	print(row)

#掃除
stmt.close();
dbh.close();
```

###利用（書込）

やはりcommit()が必要。

```python
#coding:utf-8
import pymysql

#接続情報
dbh = pymysql.connect(
         host='localhost',
         user='dbuser',
         password='password',
         db='testdb',
         charset='utf8',
         cursorclass=pymysql.cursors.DictCursor
    )

#カーソル
stmt = dbh.cursor()

#SQL
sql = "insert into members(name) value('pymysql1')"

#実行
stmt.execute(sql)

#コミット
dbh.commit()

#掃除
stmt.close()
dbh.close()
```
電子工作 > tool > adafruit circuit playground / Electronic Toolbox Pro

YoutubeでAdafruitの動画をいくつか見る中、circuit playgroundというツールを見つけた
https://www.youtube.com/watch?v=-0uMrgdlfwI&list=WL&index=43

電子部品の定数に関する情報や回路計算、データシートへのリンクなどの機能があるらしい。

App Storeへ見に行ったら360円だった。

<hr>
ふと思い出したのは、以下のツールをすでに購入していたこと。
Electronic Toolbox Pro
http://electronic-toolbox.com/electronic-toolbox/

5.99US$

全然使ってなかったが、今見るとRaspberry Pi関連の情報やトランジスタ、FET,回路記号など結構これから使いそうだ。

プロジェクトという機能もあるが、今はよく分からない。
groovy, grails, gradle インストール (Linux)

# 前提
[sdkman](http://sdkman.io/)がインストールされていること。→ [インストール手順](http://qiita.com/suzuki-sapporo/items/bf26ed47193d7ed2ea4e)

# 注意
ユーザーローカルな環境になる。（ホームディレクトリにインストールされる）

# インストール
```
sdk install groovy
sdk install grails
sdk install gradle
```

# 動作確認
```
groovy --version
grails --version
gradle --version
```
年賀状の宛名印刷で困ったのでメモ

来年、また調べると確信して自分むけのメモ。

# Excel から宛名を差し込み

Excel で

```
姓,名,敬称,連名,連名の敬称,住所_1,住所_2
```

で作成。郵便番号はハイフンなし。

Word で何か文書が出ている状態で
ツール > はがき宛名印刷マネージャを選択。

  ウィザードとマネージャーって何が違うんですかね。

はがき宛名印刷ウィザードのダイアログが開くので、
左のタブそれぞれで項目選択していく。

* どのはがきを使用しますか？: 年賀・暑中見舞い
* レイアウト: 縦書き
  (敬称は後で変えるのでデフォルトのまま)
* 差出人情報を入力してください: 適宜
* 差し込み印刷を行いますか？
  * 差し込み印刷のオプション: 既存の住所データファイルを差し込む Microsoft Excel

Excel にパスワードをかけていると、読み込めないので解除しておくこと。

このままだと○山×男様あての宛名面が表示されます。

ツール > 差し込み印刷マネージャーを開き
「2. 宛先リストの選択」から
「宛先リスト - データ文書を開く」を選択し、
目的の Excel ファイルを指定します。

# 宛名が単一の場合と連名とで中央寄せをしたい。

連名を改行でいれただけだと

```
苗字　名前　様
　　　連名　様
```

のようになってしまう (横書きだとそんなに変じゃないですね。縦書きでのイメージです) のを
名前と連名の中央に苗字を寄せたい (半行ずらす) というトリック。

姓と名のフィールドを分けている場合の例です。

フィールドコードの表示にして以下のコードを入力。

```
{ MERGEFIELD 名 }　{ MERGEFIELD 敬称 } { IF { MERGEFIELD 連名 }<>"" "
" ""} { MERGEFIELD 連名 }　{ MERGEFIELD 連名の敬称 }
```
1 行目の終わりは、Shif+Enter で改行を挿入します。

フィールドコードを非表示にすると、

```
«名»　«敬称»
«連名»　«連名の敬称»
```

のように見えるはず。

このセル自体を中央寄せにすれば、
単名でも連名でもセルの中央に寄せて表示、印字できます。
技術英語 > Nickel-plated / surperficially / scratch the surface

電子回路のデータシートで見つけた

http://www.globahanbai.jp/product/products-1/RJ-9.pdf

> Nickel-plated

ニッケルめっき

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

> surperficially

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

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

> scratch the surface

http://eow.alc.co.jp/search?q=scratch+the+surface
sdkman (旧gvm = Groovy Version Manager) インストール (Linux)

GVMとは、GroovyやGrails、GradleなどGroovy関連のプロダクトのインストールやアップデート、バージョン管理を一元的に行えるツール。 RubyにおけるRVMやrbenvに相当。

# 前提
unzipがインストールされていること。

ubuntu

```
sudo aptitude install unzip
```

# 注意
ユーザーローカルな環境になる。（ホームディレクトリにインストールされる）

# インストール
```
curl -s get.sdkman.io | bash
source ~/.sdkman/bin/sdkman-init.sh
```

# 動作確認
```
sdk
echo $JAVA_HOME
```
decltypeとSFINAEによるオーバーロード条件分岐

#decltypeとSFINAEによるオーバーロード条件分岐

この記事は「プロ生ちゃん Advent Calendar 2015 19日目」の補足記事です

decltypeは__Template Substitutionの際に考慮されます__
が！
優先順位はつけることができません
[本の虫: decltypeとSFINAE](http://cpplover.blogspot.jp/2010/03/decltypesfinae.html)
を読めばいいのですが、この記事のコードは記事の最後に書いてある通り
`std::identity`が削除され、めでたく
`decltype(...)::type`ができるようになっているため
最新のC++では動きません

江添氏に確認をとったところGFDLライセンスということなので
GFDLライセンスのもとで、記事を改変して公開します

以下の様なdecltypeを使ったSFINAEを紹介しましたが
これが、SFINAEたる所以は関数の第2引数です
`value_type`と`key_type`を両方持ち合わせているコンテナはないため
どちらかが__Substitution Failure__になります


```cpp
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <map>

template < typename Container >
auto my_find(Container& c, typename Container::key_type key)
    ->decltype((c.find(key)))
{
    std::cout << "member" << std::endl;
    return (c.find(key));
}
template < typename Container >
decltype(auto) my_find(Container& c, typename Container::value_type v)
{
    std::cout << "free" << std::endl;
    return (std::find(c.begin(),c.end(), v)) ;
}

int main(){
    std::vector<int> a{1,2,3};
    std::map<int,int> b;
    b[0] = 1;
    b[2] = 3;
    b[4] = 5;
    
    auto&& iter1 = my_find(a,2);    
    std::cout << ( iter1 == a.end() ? "not found" : "found" ) << std::endl;
    std::cout << std::endl;
    auto&& iter2 = my_find(b,2);
    std::cout << ( iter2 == b.end() ? "not found" : "found" ) << std::endl;
    
    return 0;
}
```



##クラスがメンバ関数`void f()`を持つかどうかでオーバーロードを条件分岐させたい場合

```cpp
template < typename T >
auto f(T&& arg)->decltype(arg.f())
{
    std::cout << "Has f()." << std::endl;
}

template < typename T >
auto f(T&& arg)->void
{
    std::cout << "Hasn't f()." << std::endl;
}

```

のようにした場合はどうなるかというと
まず、`void f()`を持たないクラスが渡された場合

```cpp
struct hoge{};

f( hoge{} ) ; // OK! Hasn't f()
```

上の関数がSubstitution に失敗して下の関数が候補に残り、そして呼びだされます

次に、`void f()`を持っているクラスの場合

```cpp
struct piyo{
   void f(){}
};

f( piyo{} ) ; // オーバーロードの解決が曖昧！
```

`decltype(arg.f())`は推論できるのでSubstitutionに成功します
両方の関数が候補になりオーバーロード解決が曖昧になった結果、コンパイルエラーになります

この事態を解決するには引数のクラスが`void f()`を持っていた場合に
SFINAEを利用して下の関数のSubstitutionを意図的に失敗させなければなりません

そこで、メタ関数を噛ませてSFINAEで条件分岐を記述します

```cpp
extern std::nullptr_t enabler;

template < typename T >
struct has_func
{
private :
    template < typename U >
    static auto check(U x) -> decltype( x.f(), std::true_type{} ) ;
    static std::false_type check(...) ;

public :
    static bool const value = decltype( check( std::declval<T>() ) )::value ;
} ;

template < typename T >
auto f( T&& arg )->decltype(arg.f())
{
    std::cout << "The class has f()." << std::endl;
}

template < typename T, std::enable_if_t<!has_func<T>::value>*& = enabler >
auto f( T&& )->void
{
    std::cout << "The class hasn't f()." << std::endl;
}


```
[[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ](http://melpon.org/wandbox/permlink/9uatBL9Y6hlKw8qC)

ちなみに、いなむ先生は
関数テンプレートのデフォルト引数でSFINAEの条件を記述するのがお好みです





--------
__All text is available under the terms of the GNU Free Documentation License.__
react-routerとbrowser-syncを利用して快適に開発するちょっとした設定


react-routerを使いSPAの構成で`createBrowserHistory`を設定し、
browser-syncのserverを起動して開発しているとreloadをしたタイミングで、

```
cannot get XXX
```

と怒られてしまいます。

これはhistoryによって構築された擬似的なURLで再ロードした場合に、
対象のファイルが存在しておらずhtmlの取得自体に失敗してエラーになっているので正しい動作と言えます。

この動きをエラーとさせずいい感じに動かすためには、
browser-syncの`middleware`を以下の様に設定する事で簡単に対応可能です。

```js
  // ES6
  const index_file = fs.readFileSync(path.join(__dirname, "./public/index.html"), "UTF-8");
  browserSync.init({
    server: {
      baseDir: ".",
      // 存在しないURLを実行された場合でもindex.htmlの内容を描画する(F5などの対応)
      // CSSなども同一パスであればその辺は微調整が必要
      middleware: [(req, res, next) => /^\/(public)\/.+/.test(req.url) ?
          res.end(index_file) : next()
      ]
    }
  });

```

大体これでうまくいっている感じな気がします。
ElasticCache & ElasticBeanstalk

【2015/12/30 11:15 追記】結局このレベルまで不要と判断せざるを得なかった。RDSと同じように環境と別の場所にDBがいないとキャッシュが無くなってしまうorz。当たり前だよね。うん。そうだね。

関係ないところでハマってしまったけれど、下記でほとんどそのまま行ける。

http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/customize-environment-resources-elasticache.html#customize-environment-resources-elasticache-defaultvpc

ElasticCacheがBeanstalkのデプロイ時に立ち上がるようになるので、Endpointを調べて環境変数に入れる（で、いいんだよね？ここは二度手間っぽいけれどそうしないわけにはいかない様子）。

下記がとてもわかりやすく解説してくれています。多謝！
http://recipe.kc-cloud.jp/archives/5510

ちなみに今回のハマりは

- RDSがセキュリティグループ単位で通信を許可していたので、テスト用環境から繋ぐことができなかった
- テスト用環境がSSL非対応だったのだが、force_sslしていたので切る必要があったことを失念した。
- force_sslが予期しないところにも書かれていて、強制SSLが解除されない状態が長く続いた。

というなんとも情けない事だった。トホホ…。
jQueryから別サイトのメタ情報（メイン画像、タイトル）を取得するAPIを作った


どこかのサイトのサムネイル画像やタイトルをちょっと使いたい時。jQueryではできない。ドメインが違うから。そこで、代行してくれるサーバを立てた。ついでにAPIとして公開してみる。
[title](http://~)
例えば、lifehakerの記事を紹介するとする

![スクリーンショット 2015-12-30 2.45.47.png](https://qiita-image-store.s3.amazonaws.com/0/36652/bbefd889-2511-7d58-0ba6-2b0de1715509.png)

この場合、タイトルとアイキャッチ画像あたりが欲しくなる。ここでは脳みそのイラストのこと。しかし、ブラウザ側だとこれができない。理由は省くけど、つまりはCORS。そういうこと。
![スクリーンショット 2015-12-30 2.53.57.png](https://qiita-image-store.s3.amazonaws.com/0/36652/5c066c73-c586-000a-bf72-de70663c5de1.png)

そこで、Metaruを経由してリクエストを送る。やり方は簡単。GETパラメータでurlを渡すだけ。
![スクリーンショット 2015-12-30 2.52.46.png](https://qiita-image-store.s3.amazonaws.com/0/36652/d7a8c8ef-d38e-4a9d-7c91-97b180fd529d.png)
こんな感じに
http://metaru-57229.onmodulus.net/?url=欲しいサイトのURL

これはいろんな情報を取ってきてるけど、例えば画像だけが欲しい場合。
http://metaru-57229.onmodulus.net/?url=欲しいサイトのURL?tag=欲しいタグ名
![スクリーンショット 2015-12-30 2.59.31.png](https://qiita-image-store.s3.amazonaws.com/0/36652/0627ea80-75e2-158c-06d2-be80175a857c.png)

コアなAPIだけど、これで困ったことのある人にはわかるはず。ぜひ使ってみてください
http://metaru-57229.onmodulus.net
【連載01】105.VirtualBox内のLinuxイメージをVagrantBoxファイルに変換する

<b><font color="#ff6633">当記事はケーススタディの連載となっています。目次は[【こちら】](http://qiita.com/CsFactoryitter/items/6b8308b96afafd61ce5f
)です。</font></b>
<b><font color="#ff6633">最新のソースコードは[【GitHub】](https://github.com/csfactorygihubblog001/blogvagrant)で公開中です。</font></b>

##前提条件
VirtualBoxでVagrantが使用可能な状態になっていること。
前記事「[Vagrantを利用する為のインストールと設定（Linux側【VirtualBox内】）](http://qiita.com/CsFactoryitter/items/bc421afac915bc41af0a)」を参照。

Windowsのディレクト構造は以下のようになっていると前提。
![image](https://qiita-image-store.s3.amazonaws.com/0/98085/feb2b021-bb6c-49b8-387d-f842b1ce782f.png)

<dl>
  <dt>download</dt>
  <dd>各種ダウンロードしたファイルを配置</dd>
  <dt>vagrant_box</dt>
  <dd>Vagrant実行ルート</dd>
  <dt>vagrant_boxfiles</dt>
  <dd>Virtualbox仮想イメージをVagrantBoxファイルに変換した物を配置</dd>
  <dt>vb</dt>
  <dd>自作したVirtualbox仮想イメージやVagrantで作成したイメージを配置</dd>
</dl>


##ボックスの作成
実行はWindowsにて行う。※VirtualBox内で実行するのではない。

###01.powershell.exeを起動

###02.ディレクトリを移動

```bat:
cd d:\_BLOG\BG001\vagrant_boxfiles
```
###03.仮想マシンイメージをVagrantBoxファイルにパッケージング
VirtualBoxに作成した仮想マシンイメージ（ここでは「basecent7」）をVagrantBoxファイル（ここでは「basecent7vb」）にパッケージング

書式：
><b>vagrant　package　--base \${VirtualBox仮想マシン名(Path)} --output \${BOXファイル名(Path)}</b>


例：

```bat:
vagrant package --base basecent7 --output basecent7vb
```

以上で「basecent7vb」というVirtualBoxファイルが作成される。

次回は「[VagrantBoxの初期化から複数サーバ起動までの一般的な流れ](http://qiita.com/CsFactoryitter/items/1f3935d3b0f04c1ad49d)」について。

<b><font color="#ff6633">連載の目次は[【こちら】](http://qiita.com/CsFactoryitter/items/6b8308b96afafd61ce5f
)です。</font></b>
Ruby on Railsでハマった話(Herokuでのデプロイするまで)

#Ruby on Railsでハマった話

基本的には
[チュートリアル](http://railstutorial.jp/chapters/beginning?version=4.2#sec-heroku_setup)どおりやれば上手く行きます。

PHPは経験ありますがRailsは経験がほぼ皆無だったのでHerokuまでのデプロイでハマったのでHelloWorldをデプロイするところまでやります。

だいたい適当なサイトをみるとrailsのバージョンが統一されていません。

**チュートリアルどおりにインストールします**

```$ gem install rails -v 4.2.2```

作業ディレクトリを作ってそこで作業をする場合は

```rails _4.2.2_ new hello_app```

_ **4.2.2** _でバージョンを指定してrailsの雛形を作っています。これ重要です。
これをしっかりしないとチュートリアルどおり動作せずに４日悩みます（俺です。）

Gemfileを書き換えましょう

```Gemfile:Gemfile
source 'https://rubygems.org'

gem 'rails',                '4.2.2'
gem 'sass-rails',           '5.0.2'
gem 'uglifier',             '2.5.3'
gem 'coffee-rails',         '4.1.0'
gem 'jquery-rails',         '4.0.3'
gem 'turbolinks',           '2.3.0'
gem 'jbuilder',             '2.2.3'
gem 'sdoc',                 '0.4.0', group: :doc

group :development, :test do
  gem 'sqlite3',     '1.3.9'
  gem 'byebug',      '3.4.0'
  gem 'web-console', '2.0.0.beta3'
  gem 'spring',      '1.1.3'
end

group :production do
  gem 'pg',             '0.17.1'
  gem 'rails_12factor', '0.0.2'
end
```

ターミナルで、bundle installしましょう

もしもbundle installでエラーになったらこちら参照
・[bundle install がエラーになった場合](http://qiita.com/NoriakiOshita/items/cfc63541c500a4ee82a6)

```
$ rails server
もしくは
$ rails s 
```
でどうさを確認。
http://localhost:3000
にアクセスをして確認

ルビーマークとWelcome aboardの画面が確認できればOK

Hello,World!!を表示しましょう

**app/controllers/application_controller.rb**を

```rb:application_controller.rb
class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  def hello
    render text: "Hello, World!!"
  end
end

```

次に 

```rb:config/routes.rb
Rails.application.routes.draw do
  .
  .
  .
  # You can have the root of your site routed with "root"
  root 'application#hello'
  .
  .
  .
end
```
に変更して以下の画像を確認

<img width="403" alt="スクリーンショット 2015-12-30 2.05.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/33329/0a1e47bc-35f8-02d4-35f6-0a0486e4613e.png">
#上の画像が出たらあとはHerokuにデプロイするだけ！！

以下順に実行してください。

```
$ git init (Herokuにはgitを使ってデプロイします。なので必要です。)
$ heroku create whispon (whisponの部分は任意でオッケ！※被らないものに限る)
$ heroku git:remote -a whispon
$ git add --all
$ git commit -am "First Commit"
$ git push heroku master

```

<img width="401" alt="スクリーンショット 2015-12-30 2.12.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/33329/53b3e514-d038-1c84-bc2a-7812b8e293d5.png">

アプリ名.herokuapp.comで上のように確認できればデプロイされてます！！

#お疲れ様です！おめでとうございます！完成です。
Google CalendarのReminder機能について調査した

最初に結論を書いておくと、解決できていません。追って調査をするときの参考にするためのメモ程度と捉えてください。解決した人は是非教えて下さい。

2015年12月頭頃、スマートフォン向けのGoogle Calendar「アプリ」に、Reminder機能(以降、Google Reminderと表現します)がリリースされました。

* http://gmailblog.blogspot.jp/2015/12/add-to-dos-to-your-google-calendar.html
* https://www.youtube.com/watch?v=cPuvf2lzZMY

普段から [Google Calendar Web UI](https://calendar.google.com/) 上のGoogle Tasks（Calendar Gadgetという機能を使えば便利に統合できる[^1]）や [Google Tasks API](https://developers.google.com/google-apps/tasks/v1/reference/) 経由でタスクを管理している私の場合、iOSアプリでしっくり馴染むものが無くて悩んでたので、「Google CalendarにGoogle Tasksがようやく統合された！公式のGoogle Tasksアプリとして独立してリリースされるより嬉しい(∩´∀｀)∩ﾜｰｲ」と喜びました。しかしGoogle ReminderはGoogle Tasksとはデータ領域が別のようで、期待とは違い「TasksとCalendarの統合」「Tasks用の公式アプリ登場」とはなりませんでした。残念すぎる、便利にしたい。

# 課題

次の二点を解決すれば、私の生活は便利になります。

* PC使ってる時にもReminderを登録したい。UIはどこ？
* Google Tasksと同期させたい。APIはどれ？

以下は、これらを探そうとした記録になります。

# 調査対象

Googleの個人リソースの置き場所として怪しいと踏んだのは、Gmail, Google Calendar, Google Tasks。念のため [Inbox](https://inbox.google.com/)も。Google Driveも怪しいかもしれません。

まずはスマートフォンのGoogle Calendar アプリでそれとわかる名前のReminderをひとつ追加してから、それをどのUI、APIで確認できるか？と見ていきました。あえて時系列ではなく、Productごとにまとめました。
「見えない」と書かれているものは、「作ったReminderが見えない」という意味です。

## Discovery API

* https://developers.google.com/discovery/v1/reference/apis/list

Reminder, Snoozed, InboxっぽいAPIがリストされてないか？を確認するも、それっぽいAPIは無い。

## Gmail

* ALLラベルの中を見ても見えない
* 検索しても見えない
* 念のためSpam, Trashを見ても無い
* Gmail APIからも見えない
    * [システム標準ラベル](https://developers.google.com/gmail/api/guides/labels)にSnoozedらしきものは存在しない
* Gmail APIのラベル一覧取得でもSnoozedらしきものは存在しない

## Google Calendar

* UIから見えない
* APIで検索しても見えない

## Google Drive

* UIから探しても見えない
* APIから探しても見えない

Google系のProductはもろもろGoogle Driveをユーザストレージとして使う傾向がありそうなので一番期待していたけど、見当たらず残念。

## Google Tasks

* UIから探しても見えない
* APIから探しても見えない

## Inbox

* Snoozedラベルの中に見えた
* しかし [Inbox SDK](https://www.inboxsdk.com/docs/)を見ても、Snoozedに関する機能はなさげ…？

Inboxが一番あやしいようですが、そもそもInboxってGmailのデータを利用している、単なるコンシューマなんじゃないの…？Gmailのシステム標準ラベルも共有して使ってそうだし…？という事で、以下を調査。

### Inbox上から特定のメールをSnoozedに入れる（Snoozeする）ことができる。それをしてGmail APIから該当メール見れば（[Users.messages: get](https://developers.google.com/gmail/api/v1/reference/users/messages/get)）なんかわかるはず。

以下の用に、該当メールのレスポンスに`Snoozed`というラベルは無かった。この調査でゴールするだろ、と思っていたのに残念。

```
"labelIds": [
  "IMPORTANT",
  "CATEGORY_UPDATES"
 ],
```

### Inboxを初めて利用するときのOAuth2認可のスコープで、Gmail以外に何かを利用しているのが見えるのでは？

Inboxを使っていないアカウントでInboxの利用を開始してみても、いきなりInboxの画面になるだけで認可の画面はなかった（こわい）。


# 結論

解決せず、私の生活に不便は残ったままとなりました。不便はキライなので、地味に追いかけるとします。なんかわかった人がいたら是非教えて下さい。


[^1]: おそらく公式？のGoogle Tasks専用UIは https://mail.google.com/tasks/canvas だと思うんですが、サブドメインがmailな上に、UIが激ショボで使ってても嬉しくありません。Calendar Gadget経由でしかUIは使えないと思ってます。公式？のTasks専用UIはこの記事書くときに初めて知ったくらいです。
公開鍵暗号を用いてのSSH接続（きほん）

- クライアント:Mac  
- サーバー: LInux(Ubuntu)  

を用いて、公開鍵と秘密鍵の生成から公開鍵暗号でのSSH接続までのまとめです。

## 公開鍵と秘密鍵の生成

RSA暗号の鍵を生成する場合は、オプションで `-t rsa` を入力します。
```
$ ssh-keygen -t rsa
```

これで、`~/.ssh/` ディレクトリに `id_rsa` (秘密鍵)と `id_rsa.pub` (公開鍵)が生成されていることがわかるかと思います。

※ SSH秘密鍵のパスフレーズをつけるべきかどうかについては下記記事が参考になりました。
[SSH秘密鍵のパスフレーズは（つけるなら）11文字以上にしましょうねという話 - 本当は怖い情報科学](http://freak-da.hatenablog.com/entry/20100901/p1)

## サーバーに公開鍵を渡す
サーバーの `.ssh/authorized_keys` に、先ほど作成した `id_rsa.pub` を渡します。

```
$ scp -P 22 ~/.ssh/id_rsa.pub <ユーザ名>@<IPアドレス>:~/.ssh/authorized_keys
```

## パーミッションの変更
クライアント側、サーバ側ともにパーミッションを変更します。

```
# クライアント側
$ chmod 700 ~/.ssh

# サーバ側
$ chmod 600 ~/.ssh/authorized_keys
```

**※ ここのパーミッション設定を正しく行わないと公開鍵認証でのSSH接続がうまく機能しないみたいなので要注意**

※ パーミッションについては下記も参照
[パーミッションの考え方について毎回よく分からなくなるからまとめ](http://qiita.com/Y-Mukoyama/items/bbb7dbdf7236318ca11a)



## 接続確認
```
$ ssh <ユーザ名>@<IPアドレス>
```

秘密鍵生成時にパスフレーズを作成している場合はここで尋ねられるので、入力すると接続されるはずです。

## SSHのパスワード認証を禁止する
公開鍵認証を設定したのでパスワード認証を禁止しましょう。

```
# サーバ側で下記ファイルを編集
$ sudo vi /etc/ssh/sshd_config

# 編集内容
ChallengeResponseAuthentication no
PasswordAuthentication no


# 編集後にsshdをリスタートする(Ubuntuの場合)
$ sudo /etc/init.d/ssh restart
```

## 参考情報
参考にさせていただきました。
ありがとうございました!!
[公開鍵認証によるSSH接続 - Macターミナルの使い方 - Linux入門 - Webkaru](http://webkaru.net/linux/mac-ssh-login-public-key/)
[ssh認証のための公開鍵と秘密鍵を生成する手順 【Mac】 | かわたま.net](http://kawatama.net/web/670)
[Linux - ssh公開鍵認証設定まとめ - Qiita](http://qiita.com/iruseira/items/af8550fea92b5c5f7fca)
【連載01】104.Vagrantを利用する為のインストールと設定（Linux側【VirtualBox内】）

<b><font color="#ff6633">当記事はケーススタディの連載となっています。目次は[【こちら】](http://qiita.com/CsFactoryitter/items/6b8308b96afafd61ce5f
)です。</font></b>
<b><font color="#ff6633">最新のソースコードは[【GitHub】](https://github.com/csfactorygihubblog001/blogvagrant)で公開中です。</font></b>

##前提条件
VirtualBoxに仮想Linuxがインストールされていること。
仮想Linuxに関しては、「[Windows上のVirtualBoxにVagrantのベースとなる最小構成CentOS7を作成](http://qiita.com/CsFactoryitter/items/282086f3c3fe4f34b003)」を参照。

仮想Linuxを起動し、Linuxのコンソールにて以下に続く最低限の設定を行う。
![image](https://qiita-image-store.s3.amazonaws.com/0/98085/9a2549ac-41ec-9067-25d6-2184e9289a2f.png)

VirtualBoxのネットワークはデフォルト「NAT」で、この設定の場合はホストOS（この場合Windows）から
ゲストOS（この場合Virtualbox内のLinux)へのアクセスはできない。
ただしゲストOSからホストOSのネットワークを経由してインターネットにはアクセスが可能。

VirtualBoxのネットワーク設定の手順に関しては、
[VIRTUALIMENTさんのサイト](http://www.virment.com/vagrantfile-settings/#i-5)
を参照ください。

最低限の設定後、Windows SSHクライアント（今回はPuttyとSupperPutty)から設定可能にする。

![image](https://qiita-image-store.s3.amazonaws.com/0/98085/cc3ba4a0-763c-ca9e-671e-5ce8dff1abf6.png)

##Vagrantが使えるようになるまでの初期設定

###01.EPELパッケージをインストール

```bash:
cd /tmp
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum localinstall ./epel-release-latest-7.noarch.rpm
```

###02.wget、gcc、等のインストール

```bash:
yum -y install wget
yum -y install bzip2
yum -y install gcc
yum -y install kernel-devel-`uname -r`
yum -y install dkms
```

###03.vagrantユーザーの追加
（パスワードは任意。ここでは「vagrant123」）

```bash:
useradd vagrant
passwd vagrant vagrant123
```

###04.SSH公開鍵で接続可能な状態に設定
SSH公開鍵用のDirectoryを作成し鍵を配置する。

```bash:
mkdir /home/vagrant/.ssh
chmod 700 /home/vagrant/.ssh
wget --no-check-certificate "https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub" -O /home/vagrant/.ssh/authorized_keys
chmod 600 /home/vagrant/.ssh/authorized_keys
chown -R vagrant /home/vagrant/.ssh
```

###05.SUDOの設定
vagrantユーザーはsudoでパスワードを求められない設定にする。

```bash:
visudo
```

- 「Defaults requiretty」の部分をコメントアウトし、TTY実行無しに変更。
- vagrantをsudo時にパスワード不要に設定

```bash:sudo
#Defaults     requiretty

vagrant ALL=(ALL)     NOPASSWD: ALL
```

- SUDOの設定の確認

```bash:
su - vagrant
sudo cd /root
```

###06.VirtualBox Guest Additionsをインストール
- wgetでダウンロードする。

```bash:
cd /tmp
wget http://download.virtualbox.org/virtualbox/5.0.12/VBoxGuestAdditions_5.0.12.iso
```

- ISOファイルをマウントしインストーラ実行

```bash:
mount -t iso9660 -o loop  /tmp/VBoxGuestAdditions_5.0.12.iso /media
/media/VBoxGuestAdditions.run
umount /media/VBoxGuestAdditions
```

- /tmpディレクトリ内のファイルを削除

```bash:
rm -rf /tmp/*
```

###07.grubの起動待ち時間設定

```bash:
vi /etc/default/grub
```

- 「GRUB_TIMEOUT=5」の部分を1秒に設定

```bash:/etc/default/grub
GRUB_TIMEOUT=1
```

- grub.cfgを更新

```bash:
grub2-mkconfig -o /boot/grub2/grub.cfg
```

###08.UDevによるネットワークルールを破棄

```bash:
ln -s -f /dev/null /etc/udev/rules.d/70-persistent-net.rules
```

###09.仮想Linuxのシャットダウン

```bash:
halt
```

次回は「[VirtualBox内のLinuxイメージをVagrantBoxファイルに変換する](http://qiita.com/CsFactoryitter/items/60b65ae685a3ea4ee16f)」について。

<b><font color="#ff6633">連載の目次は[【こちら】](http://qiita.com/CsFactoryitter/items/6b8308b96afafd61ce5f
)です。</font></b>
XcodeでSwiftの型を把握する


Swiftは型推論機能が備わっているプログラミング言語です。
そうでない言語と比べると型を明示的に書く必要がないため、
すっきり書くことができます。

しかし、型推論を利用して書かれたコードに修正を入れるときに
そこで使われている型を把握する必要があるかもしれません。

```swift
let number = getNumber()
```

このコードを例にとると
numberという定数、getNumberの返り値は
Int? Float? Double? NSNumber? 
と選択肢が複数あり、この1行では判断できません。

```swift
private func getNumber() -> Float {
   return 1.0
}
```

・関数の実装にJumpすると把握できますがJump前にいた場所に戻る手間がかかります。

```swift
print(number.dynamicType) // Float
```

・printで表示もできますが実行する必要が有ります。

![hokan.png](https://qiita-image-store.s3.amazonaws.com/0/84459/f672a531-e0aa-dc7d-e1b5-4cb40cc57d34.png)

・Xcodeでちょっと書いて補完して見るのもありですがやや面倒です。
あと補完が働かない時や遅い時があるので安定しません。

上記の方法が有効ではないというわけではないのですが、
例に取ったようなコードが複数あると把握する作業に時間が取られると思います。

# 他に方法ないの？
最後になってしまいましたが、おそらく一番楽そうな方法を紹介します。

まず、Xcode調べたい変数にカーソルを移動して
![cursorover.png](https://qiita-image-store.s3.amazonaws.com/0/84459/cc26da9a-de00-1a10-2643-6cbd3b2b933b.png)

Xcodeの右メニュー(Utilities)を表示して左から二つ目の項目を見ましょう。
![number_right.png](https://qiita-image-store.s3.amazonaws.com/0/84459/1a69b378-832b-75ae-5b2e-c16f8aa652b1.png)

定数の情報が載っています。

```swift
let number: Float
```

関数にカーソルオーバーすると
![func_right.png](https://qiita-image-store.s3.amazonaws.com/0/84459/0b8c547d-4731-bbe0-ccbc-f11b5ecb1793.png)
こんな感じです。

クロージャの情報も見れます。

```swift
let closure: (Int -> String) = { intValue in
    return String(intValue)
}

let any = closure(1)
```

![closure_right.png](https://qiita-image-store.s3.amazonaws.com/0/84459/446a6bd8-c5c0-2316-b676-a9c0a1da9faa.png)
![any_right.png](https://qiita-image-store.s3.amazonaws.com/0/84459/0f6edc19-76f8-8de8-d44d-25cfcb793f56.png)

カーソル移動だけで型を把握できるので楽かなと思います。

# まとめ
今回学んだことはたまには自分の使っている
ツールやコーディングの仕方を見直すことも大事だと思いました。

今までは、型を調べる時にCommand+Clickで定義にJumpして調べる方法を取っていました。
あ、Quick Help見ながらの方が早かったな、と思う事例があったので
次回からはこの方法を選択肢に入れて楽しいSwiftライフを送っていきたいです。

\\(^o^)/
デザインパターン #4 〜Factory Method〜

第４回目 **Factory Methodパターン**
# 概要
Factory Methodパターンでは、インスタンスの生成方法をスーパークラス側で決定し、具体的な実装はすべてサブクラス側で行います。これにより、インスタンス生成のための枠組みと、実際のインスタンス生成のクラスとを分けて考えることができる。
## サンプル
```Creator.java
public abstract class Creator {
    public abstract Product createProduct(); // Factory Method.
    public final Product create() {
        return createProduct();
    }
}
```
```Product.java
public abstract class Product {
    public abstract void printMethod();
    public abstract void putMethod();
}
```
```ConcreteCreator.java
public class ConcreteCreator extends Creator {
    public Product createProduct() {
        return new ConcreteProduct();
    }
}
```
```ConcreteProduct.java
public class ConcreteProduct extends Product {
    publi void printMethod() {
        System.out.println(“execute printMethod”);
    }
    publi void putMethod() {
        System.out.println(“execute putMethod”);
    }
}
```
```Main.java
public class Main {
    public static void main(String[] args){
        Creator creator = new ConcreteCreator();
        Product product = creator.create();
        product.printMethod();
        product.putMethod();
    }
}
```
### 結果
```
execute printMethod
execute putMethod
```
デザインパターン #3 〜Template Method〜

第３回目 **Template Methodパターン**
# 概要
Template Methodパターンは、そのような「似たような流れの処理」をスーパークラスで共通化し、「固有の処理」をサブクラスにまかせることで、「処理のテンプレート」を作成するパターンです。

## サンプル
```Batch.java
public abstract class Batch {
    public abstract void prepare();
    public abstract void execute();
    public abstract void finish();
    public final void run() {
        prepare();
        execute();
        finish();
    }
}
```
```BatchA.java
public class BatchA extends Batch {
    public void prepare() {
        System.out.println(“BatchA用の前処理”);
    }
    public void execute() {
        System.out.println(“BatchA用の処理本体”);
    }
    public void finish() {
        System.out.println(“BatchA用の後処理”);
    }
}
```
```BatchB.java
public class BatchB extends Batch {
    public void prepare() {
        System.out.println(“BatchB用の前処理”);
    }
    public void execute() {
        System.out.println(“BatchB用の処理本体”);
    }
    public void finish() {
        System.out.println(“BatchB用の後処理”);
    }
}
```
```Main.java
public class Main {
    public static void main(String[] args){
        Batch target = new BatchA();
        target.run();
        Batch target = new BatchB();
        target.run();
    }
}
```
### 結果
```
BatchA用の前処理
BatchA用の処理本体
BatchA用の後処理
BatchB用の前処理
BatchB用の処理本体
BatchB用の後処理
```
デザインパターン #2 〜Adapter〜

第２回目 **Adapterパターン**

## 概要
Adapterパターンは、インタフェースに互換性の無いクラス同士を組み合わせることを目的としたパターンです。ある任意の機能のインタフェースを変更することなく, 他クラスが提供している新しい機能を使用できるようにするパターン。
このパターンには **継承を利用した方法** と **委譲を利用した方法** の2つのパターンがある。それぞれ紹介していきます。
## サンプルコード (継承を利用した方法)
```Target.java
public interface Target {
    public abstract void getTargetMethod();
    public abstract void createTargetMethod();
}
```
```Adaptee.java
public class Adaptee {
    public void getMethod(){
        System.out.println(“execute getMethod.”);
    }
    public void createMethod(){
        System.out.println(“execute createMethod.”);
    }
}
```
```Adapter.java
public class Adapter extends Adaptee implements Target {
    public void getTargetMethod(){
        this.getMethod();
    }
    public void createTargetMethod(){
        this.createMethod();
    }
}
```
```Main.java
public class Main {
    public static void main(String[] args){
        Target target = new Adapter();
        target.getTargetMethod();
        target.createTargetMethod();
    }
}
```
## サンプルコード (委譲を利用した方法)
```Target.java
public abstract class Target {
    public abstract void getTargetMethod();
    public abstract void createTargetMethod();
}
```
「interface」 → 「abstract class」 に変更

```Adaptee.java
public class Adaptee {
    public void getMethod(){
        System.out.println(“execute getMethod.”);
    }
    public void createMethod(){
        System.out.println(“execute createMethod.”);
    }
}
```
```Adapter.java
public class Adapter extends Target {
    private Adaptee adaptee;
    public Adapter(){
        this.adaptee = new Adaptee();
    }

    public void getTargetMethod(){
        adaptee.getMethod();
    }
    public void createTargetMethod(){
        adaptee.createMethod();
    }
}
```
```Main.java
public class Main {
    public static void main(String[] args){
        Target target = new Adapter();
        target.getTargetMethod();
        target.createTargetMethod();
    }
}
```
集中型VCSこそトピックブランチが必要

負荷増すけどな。

# 問題
集中型VCSだと手元にコミットを作れないのでリモートで修正が入るとやり直しができない三方向マージという地獄を見る。ここでマージに失敗してしまうとその時点の手元の差分が失われてしまう。

# 解決策
これはトピックブランチを作って「絶対にコンフリクトせずにsubmitできる」つまり必ずコミットを作れるようにしてあれば解決する。そして一度コミットしてしまえばやり直しができるので安心してtrunkなりへマージできる。
bundle install がエラーになった場合

#ターミナルで以下を打つ(bundleを削除)

```
>sudo rm -rf /usr/local/bin/bundle/
```

```
>sudo rm -rf /usr/bin/bundle/
```

#bundleを入れ直す
```
>sudo gem install bundle 
>sudo gem install bundler
```

**-bash: /usr/bin/bundle: No such file or directory　とでるので**

```
>export PATH="$PATH:/usr/bin:/usr/local/bin/"　を実行
```

herokuがエラーになる場合もあるようなので

```
>sudo gem uninstall heroku
```

https://toolbelt.herokuapp.com/
からダウンロードし直すとうまくいった。

場合によってはPATHを通す必要もあると思う。

自分がやったのは.bashrcと.bash_profile

/etc/paths.d/以下に

```
>touch heroku 
```
```
>vim heroku 
```
/usr/local/heroku/bin
など記入する。通常は上のサイトからのダウンロードでうまくいくと思います。

自分のようにめちゃくちゃにいじっているとおかしくなるかと
Railsで AND,OR,副問い合わせを組み合わせたSQLを書く方法

#Rails 4.1でAND,OR,副問い合わせを組み合わせたSQLを書く方法

例えば以下のようなSQLを書きたいとき
```
SELECT date,name 
FROM book 
WHERE (date BETWEEN '2015-12-30' AND '2015-12-25' 
AND ((columB = '1' OR columC = '1') OR columD = '1') 
AND (date BETWEEN '2015-11-1' AND '2015-11-30' AND (columE = '1'))
```

Arelを使って書くことができます。

##Arelインスタンス生成
上記SQLの3行目に該当します。
```
book_query=Table.arel_table[:date].in((5.days.ago)..(2015-12-30))
```

##OR条件
上記SQLの4行目のカッコ内に該当します。
Arel::Nodes::Node#orを使います。
```
book_query_or=Book.arel_table[:columB].eq(1)
book_query_or=book_query_or.or(Book.arel_table[:columC].eq(1))
book_query_or=book_query_or.or(Book.arel_table[:columD].eq(1))
```
##AND条件
Arel::Nodes::Node#andを使います。
上記SQLの3行目と4行目のカッコ内をANDでつなぐ処理です。
```
book_query = book_query.and(book_query_or)
```
##副問い合わせ
上記SQLの5行目に該当します。
条件式の作り方は上述のAND条件の作成方法と同じです。
副問い合わせにするためにgroupingを使用するのがポイントです。
Arel::Nodes::Node#groupingを使います。
```
book_subquery = Table.arel_table[:date].in((30.days.ago)..(2015-11-30))
book_subquery = book_subquery.and(Book.arel_table[:columE].eq(1))
book_subquery = book_subquery.grouping(book_subquery)
```
##SQL実行
最後に今まで構築した条件式をクエリに投入して実行します。
(2015-01-01修正 副問い合わせ用のwhere句を追加)
```
Book.select("date,name").where(book_query).where('columE in (?)',Book.select("columE").where(book_subquery ))
```
このようにすれば、上記のSQLが発行できます。
それぞれのメソッドを組み合わせれば、なかなか複雑なクエリもかけそうです。
ただ、Rails4.2のArelでのOR条件作成では以下のような問題もあるようです。
http://qiita.com/joker1007/items/5c851526e73b3bc0273a
サブリポジトリの代わりにブランチ

# 動機
某社とか某社とか、頭悪いことしてるなーと感じたので少なくともマトモと言えそうなレベルのワークフローを考えてみた。もっとも、某社とか某社とかのそれはどう転んでもマトモではないのだけれど。

# そもそも分割する理由
0. 単一のリポジトリで大規模開発するとpushの頻度が上昇してそれらの変更を取り込んでいる間に別のpushが入り...と際限がなくなってpushできなくなってしまう。その対策としてツリーを分割して一度に衝突する頻度を減らす。
0. 共通部分とそうではない部分を分けて共通部分を一箇所にまとめる。

2は別の話題なので後で考えることにして、今は1を考える。

# 問題点
サブリポジトリをそれぞれメンテナンスしなければならなくなる。また全体をブランチする場合にはHgではマルチヘッドになってくれるもののサブリポジトリもブランチする必要があり、また後でそれぞれマージしなければならず、面倒かつ間違いが入り込む余地ができてしまう。

# 解決法
サブリポジトリの代わりにモジュールごとにブランチを切る。そして各ブランチで修正する範囲を開発規約で決めておく。これらのブランチは普通の使い方のブランチの子ブランチとする。

これでpushの衝突はリポジトリの分割と同様に減るし、開発規約で修整範囲を限定しているのでモジュールを跨ぐ修正が必要かつそれがコンフリクトするレアケースを除いて[^1]マージで衝突することもない...つまり概ね自動でマージできる。

全体のブランチの下にモジュールのブランチを切るという要領で、GitであればbranchName/moduleNameのように命名しておく。Hgはブランチ名にかなり制限があるのでちょっと考えなければならないが、あるいはモジュールをブックマーク[^2]にしてもいいかも知れない。

# 2(共通部分をまとめる)について
Gitではサブツリーマージで一つに纏められるが、いつかは分けなければならないので多少面倒でも纏めないほうがいいかも知れない。

[^1]: もしレアケースでなければアーキテクトをクビにすべきだ。
[^2]: マルチヘッドのヘッドに名前を付ける機能。Gitのブランチと同じようなものだと思って問題ない。
Ansible実行環境でserverspecを実行するための設定～serverspecインストール

[Ansible実行環境でserverspecを実行するためRuby実行環境を構築する](http://qiita.com/CsFactoryitter/private/a3c532cd405f4b269ed8)に引き続きAnsible実行端末の設定。
今回はserverspecの設定について記述します。

#前提条件
Ruby実行環境が構築されていること。
（[前回の記事](http://qiita.com/CsFactoryitter/private/a3c532cd405f4b269ed8)を参照）

#serverspecインストール手順
####01.serverspecプロジェクトフォルダの作成

```bash:
mkdir -p /root/casestudyspec
cd /root/casestudyspec
```

####02.serverspecをインストール

```bash:
gem install serverspec
```

####03.インストールの確認

```bash:
cd /root/.rbenv/versions/2.1.7/lib/ruby/gems/2.1.0/gems
ls -la .
```

以下が作成されていればOK

```bash:
serverspec-2.24.2
```

####04.serverspecを初期化
```bash:
cd /root/casestudyspec
serverspec-init
```

下記画面の流れで対話式で設定を行っていく。
![image](https://qiita-image-store.s3.amazonaws.com/0/98085/6718e69a-a022-3932-fc48-23e532eda6db.png)

```bash:
Select OS type:

  1) UN*X
  2) Windows

Select number: 1

Select a backend type:

  1) SSH
  2) Exec (local)

Select number: 1

Vagrant instance y/n: n
Input target host name: apserv01
 + spec/
 + spec/apserv01/
 + spec/apserv01/sample_spec.rb
 + spec/spec_helper.rb
 + Rakefile
 + .rspec
[root@ansinble-admin casestudyspec]#
```

####05.実行するサーバ単位のディレクトリを作成
以下の通りディレクトリを作成し、そこにXXX_spec.rbを配置。
serverspecにてAnsibleで実行した設定をテストする

```bash:
mkdir /root/casestudyspec/dev_adminserv01
mkdir /root/casestudyspec/dev_apserv01
mkdir /root/casestudyspec/dev_dbserv01
```

####06.rakeファイルを修正
デフォルトではserverspecでテストが失敗した場合は次のサーバのチェックしなくなる。
エラーが発生しても次のspecにいくようにrakeファイルを修正する。
Visual StudioユーザーがReleaseビルドをするときに必ずやってほしい2つの設定

# はじめに

前からちょくちょく見受けられたけれども、やはりやってしまう人は多いようなので
自戒の念と共にここに記しておきます。
ソフトウェアをDLして解凍またはセットアップしたexeのところに、`appname.vshost.exe`とか`appname.pdb`とか見かけたことはありませんか？
これらはVisual Studioでビルドする際に、Debugビルドでは非常に有効なファイルですが、Releaseビルドでは不要なファイル達だったりします。
なので、必ず下記の２つの設定をReleaseビルド構成に施しておきましょう。

# 1. ホスティングプロセスを無効にすること

これはあまり見かけなくなったけど、やはりやってしまう人はいるようです。
プロジェクトのプロパティでデバッグページにある

- [x] Visual Studio ホスティング プロセスを有効にする（O）

のチェックを外して

- [ ] Visual Studio ホスティング プロセスを有効にする（O）

としましょう。
![debug_tab.png](https://qiita-image-store.s3.amazonaws.com/0/25311/07c15380-75c7-02ac-aa5a-0c6fa1358091.png)

こうすることで無駄な`appname.vshost.exe`というファイルが生成されなくなります。

# 2. pdbファイルの出力をしない

こちらはまだまだ結構な人が出力しちゃってるんじゃ無いでしょうか？
そしてexeを配布する際に、pdbファイルを削除してzipで固めて…とかやってるのではないかと思います。
pdbファイルは
>Program DataBase (プログラムデータベースファイル)

と言って、デバッグとプロジェクト状態情報を保持しています。
すなわち、このファイルの中には各種情報が詰まっているのです。
もしもVisual Studioのデフォルトの場所（マイドキュメント）でプロジェクトを作っていたならば、**あなたの使っているPCのユーザー名が漏洩します**。確実に。
またDebugビルドではこのファイルを元にブレークポイントがかけられますので、Debug時は有効なファイルであることは確かです。
しかしReleaseビルド時には不要ですね。

なのでpdbファイルを出力しないように設定を変えましょう。
こちらも同じくプロジェクトのプロパティで、ビルドページから右下にある詳細設定を押下し、ビルドの詳細設定ウィンドウを出します。
その中の出力にあるデバッグ情報というところが`pdb-only`となっているはずですから、こちらを`none`に変えましょう。
![build-advanced.png](https://qiita-image-store.s3.amazonaws.com/0/25311/1baa091f-608c-41a3-96d5-6ee8d3d2bb16.png)


尚、Visual Studio 2015となった今でも、上記2つのデフォルト設定を行うところは存在していないようです。
なので新規プロジェクトを作成した際には、忘れず上記の2つ設定を行っておきましょう。
またこれらの設定はどんなプロジェクトであってもやっておきましょう。フォーム/コンソールは言わずもがな、Visual StudioのExtention（配布時の拡張子がvsix）やWebプロジェクトであってもやっておきましょう。
Extensionであるvsixファイルはただのzipファイルですから、拡張子を変えたら中身が丸見えです。解凍してファイルを抜き出すことも…。


**さぁ、年明けの仕事始めの際、自分の持ってるVisual Studioのプロジェクトの設定を見直すことから始めよう！**
JGitでリポジトリを解析するサンプル3種

# 注意書き
情報を集めたのが数年前なので、より新しい方法が存在する可能性があります。

# 背景
JGitは少し癖のあるライブラリで、gitの解析をしていた際に困った記憶があります。
そんな当時のコードが一部発掘され、役に立つ人がいるかもしれないので掲載します。
他の解析をしたい場合は、以下のドキュメントが参考になるかと思います。

[JGit User Guide](http://wiki.eclipse.org/JGit/User_Guide)
[JGit API Documentation](http://download.eclipse.org/jgit/site/4.1.1.201511131810-r/apidocs/index.html)

# 前提
リポジトリを表す変数名は、repositoryとします。
以下のコードで作成しています。

```scala
val repository = new FileRepository(new File(repositoryPath + "/.git"))

if( ! repository.getRepositoryState.canResetHead ){
  println("target path is not a valid repository")
  System.exit(0);
}
```

ここでは、gitリポジトリが存在するかどうか、また、正常な状態かどうかの判定をcanResetHeadで行っています。
チェック方法は様々あるかと思いますが、resetできればおおよそ解析には困らない状態なはずですので、ひとまずこの方法を採用しています。

# サンプル
## カレントブランチのコミットメッセージ一覧を表示

```scala
val revWalk = new PlotWalk(repository)
val rootId = repository.resolve("HEAD")
val root = revWalk.parseCommit(rootId)
revWalk.markStart(root)
 
val plotCommitList = new PlotCommitList[PlotLane]()
plotCommitList.source(revWalk)
plotCommitList.fillTo(Integer.MAX_VALUE)
 
for( c <- plotCommitList )
  println( c.getFullMessage )
```

HEADからInteger.MAX_VALUE個だけコミットを遡る、というシンプルなサンプルです。
もちろんそんなにコミット数は無いので、限界まで遡る、という意味合いになります。

repository.resolve()に文字列を与えると、解析して適切なObjectId（git内部で使ってるハッシュ）を返してくれます。
下の例では"HEAD"を与えていますが、例えば"HEAD^"を与えると1つ前のコミットからたどり始めます。

このサンプルではコミットメッセージのみですが、[RevCommit](http://download.eclipse.org/jgit/site/4.1.1.201511131810-r/apidocs/org/eclipse/jgit/revwalk/RevCommit.html)クラスに格納されている情報を出力することができます。

## あるコミットにおけるdiffを取得

```scala
val df = new DiffFormatter(DisabledOutputStream.INSTANCE)
df.setRepository(repository)
df.setDiffComparator(RawTextComparator.DEFAULT)
df.setDetectRenames(true)
 
def get(c: RevCommit): mutable.Buffer[DiffEntry] =
  c.getParentCount match {
    case 0 => mutable.Buffer.empty[DiffEntry]
    case _ => df.scan(c.getParent(0), c.getTree).asScala
  }
```

getにコミットを与えることで、その親との差分を取得できます。

差分情報は、ファイルごとにDiffEntryというクラスに収められます。
DiffEntryには、新しい側の情報と古い側の情報が両方保存されており、リネームや破棄を検出することが可能です。
例えば、AからBにrenameされた場合は、getOldPath="A", getNewPath="B"となります。
また、Aが破棄された場合は、getOldPath="A"、getNewPath="/dev/null"となります。

[DiffFormatter](http://download.eclipse.org/jgit/site/4.1.1.201511131810-r/apidocs/org/eclipse/jgit/diff/DiffFormatter.html)
[DiffEntry](http://download.eclipse.org/jgit/site/4.1.1.201511131810-r/apidocs/org/eclipse/jgit/diff/DiffEntry.html)

## 特定リビジョンのファイルの内容を表示
git cat-file -pです。
該当ファイルのID（blob）を取得した後、以下の通りストリームを使って取得する必要があります。

> [How to “cat” a file in JGit?](http://stackoverflow.com/questions/1685228/how-to-cat-a-file-in-jgit)

```scala
val fileId = ... // 目的ファイルのobject ID
val loader = repository.open(fileId)
loader.copyTo(System.out)   // loader.openStream でInputStreamが取得できる
```

# まとめ
JGitは~~扱いにくい~~癖があるので、上記サンプルが参考になれば幸いです。