OmniAICreator/Qiita-1.07M huggingface dataset:
H2O をいじくって OpenStreetMap のタイルサーバにしてみた

#概略

[H2O](https://github.com/h2o/h2o) にちょっと手を加えて、爆速 (希望的観測) な OpenStreetMap のタイルサーバを作りました。

#背景

私は今、おしごとで [OpenStreetmap](http://openstreetmap.org) (以下 OSM) の地図を使ったサービスを作っている。
ところで、OSM は規約上、

- 商用アプリとかでは http://openstreetmap.org でホストされている地図に直接アクセスしないでね。

というタテマエになっているので、真面目にやるなら、**自前でタイルサーバ**を立てなければいけない。
ちなみに、「タイルサーバ」というのは

- 地図のデータ (今の話では OSM のサイトからダウンロードする) をデータベースに落として
- 細かく分けた領域ごとに .png 画像にお絵かきして
- HTTP(S) でサーブする

というお仕事を担う、用途特化した HTTP サーバのことだ。

## モチベーション

私は真面目なので (本当だよ) 今作っているサービスでも自前のタイルサーバを立てている。しかし**遅い**。
遅い理由はだいたい2つぐらいあって:

1. ハードウェアがしょっぼい
2. Apache + タイル用モジュールといういかにももっさりな (印象論です) ソフトを使っている

(1.) はどうしょうもないとして、(2.) はもうちょっとなんとかしたい、というのが動機だ。
おっちゃんが開発を始めた時は、ほぼこれしか選択肢がなかったのである。

今は、node.js やら nginx やらをベースにしたものが[いっぱいある](http://wiki.openstreetmap.org/wiki/Category:Renderers)ので、今から同じようなものを再発明するのは明らかにダメな方針なのだが、でも、せっかく H2O という面白そうな HTTP 実装が出てきたし、なんかやってみたいやん？
もしかしたら node や nginx のイケてる実装をさらに outperform する可能性がゼロではないし。

というのが本当の動機だ。

#目標

**すでにお絵かきされた**地図画像を、**爆速**でサーブすることを目指す。
「爆速」とは、具体的には node や nginx やらのイケてる実装を超えること。

**まだお絵かきされていない**画像の on-demand でのレンダリング速度は、**それほど気にしない**。レンダリングはどうやたって遅いのだ。

#方針

H2O のソースをいじくる。いじくり方としては

- 改変部分はできるだけ別のソースに分ける
- どうしても本家のソースに手を入れねばならん所は、`#ifdef` で囲む

とした。

いじくるポイントは主に3つで:

1. 地図画像のURL「のように見える」リクエストをパーズして、ファイルシステム上の物理的な画像のパスに書き換える
2. (1.) の画像が存在しなければ、お絵かきライブラリ ([Mapnik](https://github.com/mapnik/mapnik)) にレンダリングの仕事を投げる
3. `.conf` の directive に、Mapnik の設定に必要な物を追加実装する (フォントやスタイルファイルのパスなど)

#実装

[GitHub](https://github.com/ntabee/h2o-tile/tree/tile) に現状のものを置いた。**注意点**として:

- **`tile` ブランチ** が、ここで紹介した実装だ
- **`master`** は、今のところ **本家の H2O そのまま** でそっとしておいている

よって、中身を見たい人は `git checkout tile` すること。

#現状 (げんじつ)

今のところ、おそらく**作った本人しかビルドできない & 使えない** 程度のクオリチーだと思う。
タイルサーバを毎日スクラッチから立まくっているようなマニアなら別かもしれないが...

これは、今後ゆっくりとドキュメント等を整備していく。明日から絶対がんばる。本当だよ。

また、おっちゃんは意識が低いので、今のところテストを書いていない。
「動かしたらなんかそれっぽい地図が出るしええやん」で済ませてしまっている。
これもそのうちがんばる。本当だよ。

#デモ

とりあえず、動作するデモをたててみた: http://a.tile.michisuji.com:8080/
地図がでてくるだけで、「だから何？」って感じだが、「レスポンスヘッダにちゃんと `h2o` の名前が入っている」とかそういうとこで作者の気持ちを読み取りましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/49976/d78efb9c-1717-39e7-39f9-05c17ec90a8d.png)

サーバは AWS の t2.micro (いちばんしょぼいの) なので、そこまで爆速さを感じないかもしれないが、仮想 1コア でもまあまあ動く、というところで作者の気持ちを読み取りましょう。
ハイエンド環境のスポンサーを誰かやってくれてもいいんだよ？バーチャル・スシぐらいならおごりますよ？

#謝辞
@kazuho さんをはじめ、本家 H2O 開発者の皆様、および OpenStreetMap のコントリビュータの皆様に感謝いたします。
Developer Toolsで改行を含むテキストを変数に代入する

ChromeのDeveloper Toolsはちょっとしたことを試すにはすごく便利です。
しかし、改行のあるテキストを変数に代入するのがすこしめんどくさいです。
例えば以下のような場合です。
![error.png](https://qiita-image-store.s3.amazonaws.com/0/42193/aff0a0d6-0ce9-092c-2323-9aa2457e1570.png)
[県番号，都道府県名，県庁所在地一覧](http://elze.tanosii.net/d/kenmei.htm)のデータを使用させていただきました。

## 追記
@kimama1997さんよりコメントを頂きました。
現在のChromeであればテンプレートリテラルが使用できるのでそっちを使いましょう。
[JSにヒアドキュメントはないの？ | ぴんくいろにっき](http://blog.hinaloe.net/2015/02/25/is-there-here-document-in-js/)
![heredoc.png](https://qiita-image-store.s3.amazonaws.com/0/42193/d1fa03a6-afee-647d-c499-fd9ee937b45a.png)

追記終わり




単純に変数に代入しようとすると、`SyntaxError: Unexpected token ILLEGAL`が出て代入することができません。
もちろんJSを使用してスクレイピングすれば変数に代入することは可能ですが、`prompt`を使用すると比較的楽に代入することができます。

コンソールで`temp = prompt()`を実行すると入力画面が出てくるので、そこにテキストを張り付けてOKをクリックすると、`temp`に入力したテキストが代入されています。
![prompt.png](https://qiita-image-store.s3.amazonaws.com/0/42193/e5c462ce-2d67-e219-c1ba-a3748b7c4944.png)

後は適当にデータを変換してやりましょう。

```js:
temp.split('\n').map(function (r){ return r.split('\t').splice(1);})
```

![k.png](https://qiita-image-store.s3.amazonaws.com/0/42193/62765d95-6f0a-6253-4e5e-d7f0fce4d828.png)
指定の文字列やテキストファイルの内容がシフトJIS範囲内の文字のみで構成されているか判定するコマンドを作った


https://github.com/YU81/ShellUtils/blob/master/CHECK_IF_SHIFT_JIS_RANGE.sh
UTF-8の入力を前提としている。

# 動機
自分の所のシステムから別の会社のシステムにファイルインターフェースする部分があって、
先方がシフトJIS範囲内に無い文字が入っているファイルを受け取ると失敗する、というのがまれに発生し、
当該ファイルマニュアルでインターフェースしてもらう運用になってしまい、
運用カバーでつらい思いをすることがあったので。

# 実装
引数がただの文字列かファイルパスかはtest文の -s で判定しているだけ。

チェックのロジックに関しては、完全に Network Kanji Filter (nkf) に依存し、
このコマンドで UTF-8->シフトJIS->UTF-8 と1往復の変換を行い、
前後で変化無いと考えられたらOK、程度の簡易なもの。
文字コードガチ勢からのマサカリをお待ちしています。
Debian/Ubuntu 用に nginx をビルドする

nginx は Apache と違ってモジュールを static リンクする必要がある都合上、自分でビルドしないと行けない場合が多い。
以下は Debian/Ubuntu 用の nginx のビルド方法のメモ。

## 1. ダウンロード

[nginx公式サイトのダンロードページ](http://nginx.org/en/download.html)から、最新の nginx のアーカイブ（ここでは 1.9.0 とする）を落としてくる。

次にアーカイブを展開して cd する。

```
tar xvpf nginx-1.9.0.tar.gz
cd nginx-1.9.0
```

## 2. ビルド

まず、ビルドに必要なパッケージをインストールする。

```
sudo apt-get update
sudo apt-get install build-essential libpcre3-dev libssl-dev zlib1g-dev
```

次に、configure する。
nginx は configure の段階で利用可能なモジュールが決まる。下の例ではデフォルトのモジュールに加えて `http_ssl_module`, `http_stub_status_module`, `http_gzip_static_module`, `http_spdy_module` を有効にしている。
また、各種パスは Debian の nginx パッケージのパスに準拠している。ただし、`prefix` は `/usr` ではなく `/usr/local` を指定している。
どのようなオプションがあるのかは `./configure --help` を実行すれば表示してくれる。

```bash
./configure \
    --with-cc-opt="-O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2" \
    --with-ld-opt="-Wl,-Bsymbolic-functions -Wl,-z,relro" \
    --prefix=/usr/local \
    --conf-path=/etc/nginx/nginx.conf \
    --http-log-path=/var/log/nginx/access.log \
    --error-log-path=/var/log/nginx/error.log \
    --lock-path=/var/lock/nginx.lock \
    --pid-path=/run/nginx.pid \
    --http-client-body-temp-path=/var/lib/nginx/body \
    --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
    --http-proxy-temp-path=/var/lib/nginx/proxy \
    --http-scgi-temp-path=/var/lib/nginx/scgi \
    --http-uwsgi-temp-path=/var/lib/nginx/uwsgi \
    --with-http_ssl_module \
    --with-http_stub_status_module \
    --with-http_gzip_static_module \
    --with-http_spdy_module \
    --build=$USER
```

make して install する。

```bash
make -j4
sudo make install
```

`/var/lib/nginx` を作る。(`make install` で作ってくれないので)

```bash
sudo mkdir /var/lib/nginx
```

## 3. SysV init スクリプトのインストール

nginx の自動起動などを行うために SysV init 用のスクリプトをインストールする。Debian パッケージから持ってきてもいいが、ここでは [nginx wiki](http://wiki.nginx.org/InitScripts) に書いてあったレポジトリを利用する。

```bash
git clone https://github.com/Fleshgrinder/nginx-sysvinit-script.git
cd nginx-sysvinit-script
sudo make
```

（ところで、この `makefile` の shebang が `/bin/sh` になっているのが地味に気になる…）

## 4. 起動する

```
sudo service nginx start
```

これで、`curl -D - http://localhost/` を実行してちゃんと HTML が返ってくれば OK。
Laravel4 リクエストパラメータの受け取り方

フォーム側（ビュー側）が

	echo Form::text('username');

のとき、コントローラ側では

	$hoge = Input::get('username');

で受け取れる。受け取ったパラメータは

	return View::make('viewname')->with('hoge',$hoge);

で、ビュー側に渡せる。
HTML5でHeader上部の隙間を埋める

HTML5でコーディングをしていると最上部に隙間ができる時があるので、それの解消のために試したやり方

```html:index.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <link rel="stylesheet" href="style-home.css" type="text/css">
  <title>サンプルページ</title>
</head>
<body>
  <header>
    <nav>
      <ul class="ul-header">
        <li class="header-list">
          <a href="/" alt="トップページへ戻ります">
            <img src="rogo.png" width="150" height="60">
          </a>
        </li>
        <li class="header-list">リスト１</li>
        <li class="header-list">リスト２</li>
        <li class="header-list">リスト３</li>
        <li class="header-list">リスト４</li>
        <li class="header-list">リスト５</li>
        <li class="header-list">リスト６</li>
      </ul>
    </nav>
  </header>

  <!-- 中略 -->

</body>
</html>
```

CSSは下の形で記述

```css:style-home.css
body {
  padding: 0;
  margin: 0;
}
header nav ul {
  height: 60px;
  margin-top: 0;
}
.header-list {
  height: 60px;
  float: left;
  list-style: none;
  text-align: right;
}
```

「header nav ul」セレクタは「.ul-header」に変更してもいいかもしれない。
「header nav ul」セレクタの高さの指定「height: 60px;」を取り除いた場合だと、この構造では上部の隙間が消えなかった。
どうやら高さの指定は必要らしい。構造にもよるのかもしれないけど。
JavaScriptのクロージャの初歩の初歩

## はじめに
クロージャって何？
>クロージャとは、関数内に現れる変数の名前解決が、ローカルスコープだけでなく、関数が定義された場所のスコープも含めて行われる関数のことです。
Perfect PHP

## 関数の中に関数を書く
クロージャを理解するために、関数の中の関数を使うコードを書いてみます。まずは関数リテラルをそのままreturnする方法。

```js:inner_func1.js
function f() {
    return function() {
        console.log("Hello!");
        return;
    };
}
var fn = f();
fn(); //Hello!
fn(); //Hello!
```

あるいは、こんな風にも書けます。関数リテラル式を変数に入れてからreturnする方法。

```js:inner_func2.js
function f2() {
    var inner = function () {
        console.log("Yo!");
        return;
    };
    return inner;
}

var fn2 = f2();
fn2(); //Yo!
fn2(); //Yo!
```

こんな風に書き直すこともできます。関数を一旦定義してから、関数名をreturnする方法。

```js:inner_func3.js
function f3() {
    function inner() {
        console.log("Hi!");
        return;
    };
    return inner;
}

var fn3 = f3();
fn3(); //Hi!
fn3(); //Hi!
```

## クロージャの例
Perfect JavaScriptのクロージャのサンプルコードです。

```js:sample.js
function f() {
    var cnt = 0;
    var inner = function() {
        return ++cnt;
    };
    return inner;
}

var fn = f();
console.log(fn()); //1
console.log(fn()); //2
console.log(fn()); //3
```

cntは関数fの外からは参照できないですが、クロージャ(inner)からは参照することができます。ここまで来ると、冒頭の「クロージャって何？」の意味が分かる気がします。
なお、ここではinner_func2.jsの形式を使って関数を定義しましたが、他の形式でも同様の動作をさせることができます。

## 二つの関数を入れる
関数fの中に、２つのクロージャを入れることもできます。

```js:double_closure.js
function f() {
    var cnt = 0;
    var add = function() {
        return ++cnt;
    };
    var sub = function() {
        return --cnt;
    };
    return {add:add, sub:sub};
}

var fn = f();
console.log(fn.add());
console.log(fn.add());
console.log(fn.sub());
console.log(fn.sub());
```

２つのクロージャから、同じ変数cntを参照できます。

## Classっぽく書く
thisを使って、クラスっぽく書くこともできます。

```js:my_class.js
function MyClass() {
    this.cnt = 0;
    this.add = function() {
        return ++this.cnt;
    };
    this.sub = function() {
        return --this.cnt;
    };
    this.show = function() {
        console.log(this.cnt);
    };
    return this;
}

var fn = MyClass();
console.log(fn.add()); //1
console.log(fn.add()); //2
console.log(fn.sub()); //1
console.log(fn.sub()); //0

// 直接操作できちゃう
fn.cnt = 10;
fn.show(); //10
fn.add();
fn.show(); //11
```

MyClass内の関数から参照する変数を、this.cntとすれば外部から直接参照可能になります。次のようにローカル変数（var cntで宣言）とすれば外部からは直接参照不可になります。

```js:my_class2.js
function MyClass() {
    var cnt = 0;
    this.add = function() {
        return ++cnt;
    };
    this.sub = function() {
        return --cnt;
    };
    this.show = function() {
        console.log(cnt);
    };
    return this;
}

var fn = MyClass();
console.log(fn.add()); //1
console.log(fn.add()); //2
console.log(fn.sub()); //1
console.log(fn.sub()); //0

// 直接操作できない
//fn.cnt = 10;
fn.show(); //0
fn.add();
fn.show(); //1
```

## 初期値を設定する
fの引数を利用するなどして、クロージャから参照する変数の初期値を与えることもできます。

```js:set_init.js
function f(cnt_init) {
    var cnt = cnt_init;
    var add = function() {
        return ++cnt;
    };
    var sub = function() {
        return --cnt;
    };
    return {add:add, sub:sub};
}

var fn = f(10);
console.log(fn.add()); //11
console.log(fn.add()); //12
console.log(fn.sub()); //11
console.log(fn.sub()); //10
```
bashで関数テーブルの使用


#▪️テーブルが一つの場合の関数テーブルの使用

```bash:one_table.sh
#!/bin/env bash

declare -A func_table
func_table=(
["001"]="f001"
["002"]="f002"
["003"]="f003"
["004"]="f004"
["005"]="f005"
["006"]="f006"
["007"]="f007"
["008"]="f008"
["009"]="f009"
["010"]="f010"
)

function f001() { echo "called f001()"; }
function f002() { echo "called f002()"; }
function f003() { echo "called f003()"; }
function f004() { echo "called f004()"; }
function f005() { echo "called f005()"; }
function f006() { echo "called f006()"; }
function f007() { echo "called f007()"; }
function f008() { echo "called f008()"; }
function f009() { echo "called f009()"; }
function f010() { echo "called f010()"; }

function main()
{
    for _key in $(eval echo -n ${!func_table[@]})
    do
        eval ${func_table[${_key}]}
    done

}

main
```

出力

```
called f010()
called f001()
called f002()
called f003()
called f004()
called f005()
called f006()
called f007()
called f008()
called f009()
```

#▪️テーブルが複数ある場合の関数テーブルの使用
キモは外側の${}をシングルクォートで括ること。
これによりevalでは展開されずに実行時に展開される。

```bash:two_table.sh
#!/bin/env bash

declare -A func_tableA
func_tableA=(
["001"]="f001"
["002"]="f002"
["003"]="f003"
["004"]="f004"
["005"]="f005"
["006"]="f006"
["007"]="f007"
["008"]="f008"
["009"]="f009"
["010"]="f010"
)

declare -A func_tableB
func_tableB=(
["001"]="f001"
["002"]="f002"
["003"]="f003"
["004"]="f004"
["005"]="f005"
["006"]="f006"
["007"]="f007"
["008"]="f008"
["009"]="f009"
["010"]="f010"
)

function f001() { echo "called f001() from $1"; }
function f002() { echo "called f002() from $1"; }
function f003() { echo "called f003() from $1"; }
function f004() { echo "called f004() from $1"; }
function f005() { echo "called f005() from $1"; }
function f006() { echo "called f006() from $1"; }
function f007() { echo "called f007() from $1"; }
function f008() { echo "called f008() from $1"; }
function f009() { echo "called f009() from $1"; }
function f010() { echo "called f010() from $1"; }

function main()
{
    for _index in A B
    do
        for _key in $(eval echo -n '${'!func_table${_index}[@]'}')
        do
            eval '${'func_table${_index}[${_key}]'}' ${_index}
        done
    done
}

main
```

出力

```
called f010() from A
called f001() from A
called f002() from A
called f003() from A
called f004() from A
called f005() from A
called f006() from A
called f007() from A
called f008() from A
called f009() from A
called f010() from B
called f001() from B
called f002() from B
called f003() from B
called f004() from B
called f005() from B
called f006() from B
called f007() from B
called f008() from B
called f009() from B
```
Raspberry Pi の日本語まわりで困ったら

#はじめに
Raspberry Pi（以下raspi）で
日本語の設定を適当にしたら面倒だったのでメモ。

#環境
##接続するMac
VNCサーバとして定番のTightVNCは別の機会に
MacからWindowsに接続する環境をそのまま使ってRemote Desktopを使っています。

![スクリーンショット 2015-05-06 13.07.18.png](https://qiita-image-store.s3.amazonaws.com/0/12362/99ea1dcc-2cba-b40b-2574-c8f9a64e9145.png)

##raspi環境
NOOBSからインストール時にlocale設定で
`ja_JP.UTF-8 UTF-8`をデフォルトにした時とかに・・・

###参考
https://www.raspberrypi.org/documentation/installation/noobs.md
https://github.com/raspberrypi/noobs/releases

#日本語が化けて読めない
##ssh
日本語フォントが入っているMacのTerminalからsshで入る

（１）IPアドレスを確認する

```vim
$ ifconfig -a eth0 | grep inet
```
表示例）inet 192.168.0.65 netmask 0xffffff00 broadcast 192.168.0.255

（２）Macなどのリモート環境から取得したIPアドレスを設定してSSH接続する

```vim
$ ssh pi@[raspiのIPアドレス]
$ ssh pi@192.168.0.65
```

##リモートデスクトップ
raspiに

```vim
$ sudo apt-get install xrdp
$ sudo reboot
```

##日本語が入力できない
>$ sudo apt-get install ibus-anthy
>$ sudo reboot

デフォルトは`Control + Space`で切り替え

![スクリーンショット 2015-05-06 12.02.58.png](https://qiita-image-store.s3.amazonaws.com/0/12362/a0603001-1689-0433-d794-7beb07de76d4.png)

↓

![スクリーンショット 2015-05-06 12.03.14.png](https://qiita-image-store.s3.amazonaws.com/0/12362/7e0b4d12-24f0-6a5c-fb05-1117a1b0678b.png)

↓

![スクリーンショット 2015-05-06 12.54.51.png](https://qiita-image-store.s3.amazonaws.com/0/12362/890a7201-b458-90d4-00bc-b7886bc7c883.png)

#さいごに
`startx`を使おうとしたらエラーがでたため
リモデでも使える？と調べたらあったので用途はあったみたいです。
Windows10とかでも有効になれば。
flagパッケージ使用メモ

Go言語でコマンドラインオプションを使うならflagを使ったらいいと聞いて。
os.Argsでも取れますが、flagの方が楽で便利です。

# NArg()はParse()しないと取れない

試しに引数の数でも取ってみようかと思い、下記コードを実行したが、引数の数が取れず・・・

```go
package main

import (
    "flag"
    "fmt"
)

func main() {
    fmt.Println("flag.NArg():", flag.NArg())
}
```

```
$ go run main.go a b c
flag.NArg(): 0
```

なんでなのかな〜と思ってリファレンスを見てみる

>NArg is the number of arguments remaining after flags have been processed.

まぁよくわからないので、Google翻訳にかけてみる。

>第nargフラグが処理された後、残りの引数の数である。

処理された後ってあるからなんかしないとダメなのか？
Parse()くらいしか処理するって感じの関数見当たらないし、これでいいか。

```go
package main

import (
	"flag"
	"fmt"
)

func main() {
	flag.Parse()
	fmt.Println("flag.NArg():", flag.NArg())
}
```

```
$ go run main.go a b c
flag.NArg(): 3
```

行けました。
どうやらParse()が必要だったようです。

ちなみに、フラグ状態の引数を渡すと「定義されていない」とエラーが出ます。

```
$ go run main.go -a -b -c
flag provided but not defined: -a
```

# フラグ作った時の戻り値をそのまま使えない

フラグ作るのはflag.Int()等、型ごとに関数があるのでそれを使うが、そのまま使おうとしてもポインタの値が出てくる。

```go
package main

import (
	"flag"
	"fmt"
)

func main() {
	var i = flag.Int("i", 0, "usage")

	flag.Parse()

	fmt.Println(i)
}
```

```
$ go run main.go
0x2081a2230
```

↑本当は0と出てきて欲しい。
フラグを作った時の戻り値がポインタなので、実体参照してやる。

```go
package main

import (
	"flag"
	"fmt"
)

func main() {
	var i = flag.Int("i", 0, "usage")

	flag.Parse()

	fmt.Println(*i)
}
```

```
$ go run main.go
0
$ go run main.go -i=7
7
```

デフォルト値の0も出てきたし、値指定した時の7も出てきた。

# 余談：flagの中身も結局os.Args使ってる。
https://golang.org/src/flag/flag.go?s=27448:27501#L840
$!の意味と使い方

とある[サンプル](http://godoc.org/github.com/gdamore/mangos/examples/pair)を見て$!(ダラーエクスクラメーション？ドルビックリマーク？)の意味がわからんくて小一時間意味を考えてわかったのでメモとして残します。

```bash
url=tcp://127.0.0.1:40899
./pair node0 $url & node0=$!
./pair node1 $url & node1=$!
sleep 3
kill $node0 $node1
```

↑の「& node0=$!」の意味がわからなかったのですが、
[「ダラーエクスクラメーション」でググって一番最初に出てくるサイト](http://www.webzoit.net/hp/it/internet/homepage/env/cs/server/os/type/unix/linux/shell/kind/sh_bash/variable/)に

>ドル記号にエクスクラメーションマーク(びっくりマーク)を付加した$!は、バックグラウンドで最も直近に実行された最後のジョブのPIDを表し

とあったので

```bash
$ echo $!
```

と打ってみたのですが空行が返ってきただけでした。

なので今度は

```bash
url=tcp://127.0.0.1:40899
echo $!
./pair node0 $url & node0=$!
echo $!
./pair node1 $url & node1=$!
echo $!
sleep 3
kill $node0 $node1
```

↑のように間に「echo $!」を入れてみました。
するとちゃんと数値が返ってきました。

```

22467
22468
```

一番上は空行ですが、2番目と3番目は数値が返ってきています。
一番下の行ではこのpidを使ってkillを行っているんですね。

```
kill $node0 $node1
```

pidを引数に取るコマンド等使うときは便利ですね。
例えばwaitとか。もちろんkillも。

やっぱUnix環境使うならシェルもわかんないとダメですね。
sourceReading > google-api-cpp-client > クラス名とファイル名が異なる ものもある

https://github.com/google/google-api-cpp-client/tree/master/src/googleapis/client/service

以下の２つはクラス名とファイル名が異なる。
- client_service.h > class clientServiceRequest
- media_uploader.h > class MediaUploadSpec

以下はクラス名とファイル名が同じ (snake caseをcamel caseには変えている)
- service_request_pager.h > class ServiceRequestPager

統一性がない。

このあたりgoogleのコーディングルールで決まっていないのだろうか?

IDEの補完機能が活用されるのかもしれないが、統一性がある方があとあと面倒が少なそう。
[Rails4] Slimで、CSSのセレクタに動的な変数名を入れるときの書き方

Rails4でViewコーディングをしていると、````@items.each do |item|````などで、``<li>``タグなどに付与するidやclassのセレクタを、**動的にしたい**（例えば article-1, article-2 など）ときがあります。

## RailsのSlimでCSSのクラス指定を動的にする書き方

````
li[class="item #{item.name}"]
````
## 使用例

````
section[class="content content-#{content.order}"]
````


#### 【追記】コメントいただきました。こちらのほうがスマートに書けそうです。

````
li.item class=item.name
````
gitWatch > emit > Qtアプリでのシグナル発生

https://github.com/mne-tools/mne-cpp/blob/master/applications/mne_rt_server/mne_rt_server/commandserver.cpp

```commandserver.cpp
...
CommandServer::~CommandServer()
{
    emit closeCommandThreads();
}
...
```

emitって何かと思ったら、シグナル発生だと以下にあった。
http://d.hatena.ne.jp/hake/20060429/p1
Arrayから条件に一致する最初の要素を削除するメソッド`Array#delete_first`を作ってみた


## 背景 (Background)

`Array#delete`や`Array#delete_if`では、条件に一致した **全ての** 要素が削除されてしまいます。初めて見つかった要素一つだけを削除したいときに適当なメソッドが無かったので定義してみました。

## 利用例 (Usage)

```ruby
array = [:a, :b, :a, :b]
=> [:a, :b, :a, :b]

# Array#delete_first : search element by Array#index
array.delete_first :a
=> [:b, :a, :b]
array.delete_first :b
=> [:a, :a, :b]

array.delete_first { |elm| elm == :a }
=> [:b, :a, :b]
array.delete_first { |elm| elm == :b }
=> [:a, :a, :b]

# Array#rdelete_first : search element by Array#rindex
array.rdelete_first :a
=> [:a, :b, :b]
array.rdelete_first :b
=> [:a, :b, :a]

array.rdelete_first { |elm| elm == :a }
=> [:a, :b, :b]
array.rdelete_first { |elm| elm == :b }
=> [:a, :b, :a]
```

破壊的メソッド(`Array#delete_first!`, `Array#rdelete_first!`)では、元の配列を直接変更します。要素を削除できた場合は（要素削除済みの）`self`を返します。削除できなかった場合は`nil`を返します。

## コード (Code)

```ruby
class Array
  def delete_first!(val=nil, &block)
    i = block_given? ? self.index(&block) : self.index(val)
    self.delete_at(i) unless i
    i && self
  end

  def delete_first(val=nil, &block)
    clone_self = self.dup
    clone_self.delete_first!(val, &block)
    clone_self
  end

  def rdelete_first!(val=nil, &block)
    i = block_given? ? self.rindex(&block) : self.rindex(val)
    self.delete_at(i) unless i
    i && self
  end

  def rdelete_first(val=nil, &block)
    clone_self = self.dup
    clone_self.rdelete_first!(val, &block)
    clone_self
  end
end
```

## 参考 (Reference)

- [delete ONE array element by value in ruby - Stack Overflow](http://stackoverflow.com/questions/17903351/delete-one-array-element-by-value-in-ruby)

## 環境情報 (Environments)

### OS, Kernel

```
% inxi -SM
System:    Host: HOSTNAME Kernel: 2.6.32-504.el6.x86_64 x86_64 (64 bit) Console: tty 5
           Distro: CentOS release 6.6 (Final)
Machine:   System: VMware product: VMware Virtual Platform
           Mobo: Intel model: 440BX Desktop Reference Platform
           Bios: Phoenix v: 6.00 date: 04/14/2014
```

### Ruby, Pry

```
% ruby --version
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]

% pry --version
Pry version 0.10.1 on Ruby 2.1.2
```
msys2での$HOMEとOpenSSHでのホームディレクトリの違い

# はじめに
自分の記事である[MSYS2でWindows上にコマンドライン環境を作る - Qiita](http://qiita.com/nana4gonta/items/717a4508fa585a454690)にあるように`C:\Users\username\UnixHome`を`$HOME`に設定していたが`git pull`でエラーが出た

```
$ git pull
Could not create directory '/home/username/.ssh'.
The authenticity of host 'github.com (192.30.252.131)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Failed to add the host to the list of known hosts (/home/username/.ssh/known_hosts).
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

# エラーへの対応
[MSYS2 / Tickets / #111 MSYS2 ssh not finding ssh config or IdentityFile (incorrect tilde expansion when HOME env set)](http://sourceforge.net/p/msys2/tickets/111/)というチケットがMSYS2に上がっている。

http://sourceforge.net/p/msys2/tickets/111/#5fab 
- `/etc/fstab`を書く
- Windowsネイティブのシンボリックリンクを張る
2つの解決法のどちらかを選択すればよい。
私は`/etc/fstab`を選択しました。

## `/etc/fstab`への追加
http://sourceforge.net/p/msys2/tickets/111/#5fab 通りにします。
`C:\Users\username\UnixHome`をホームディレクトリとして扱いたいので
```
C:/Users/username/UnixHome /home/username
```
という記述を`/etc/fstab`に追加します。
あとはMSYS2のシェルを立ち上げ直せばOK

# まとめ
[チケット](http://sourceforge.net/p/msys2/tickets/111/) をちゃんと眺めてもらえばいいのですが、OpenSSHが`$HOME`を読まないことがこの問題のようです。
通常はOpenSSHは`/etc/passwd`を読んでいるところを、[Alex83さんが対応して`/etc/fstab`を書けばよくなった](http://sourceforge.net/p/msys2/tickets/111/#ba6c)ためこの対応をするだけでよくなりました。

Msys2を使うさいはご注意を。
より良いWindowsでのターミナル生活を！
ObjC to Swift : [NSString substringToIndex:]


Objective-C

```Objective-C
NSString * string = @"Objective-C"
NSString * substring = [string substringToIndex: 3];
```

Swift 2.0

```Swift
let string = "Swift 2.0"
let substring = string.substringToIndex( string.startIndex.advancedBy( 3 ) )
```

Swift 1.2

```Swift
let string = "Swift 1.2"
let substring = string.substringToIndex( advance( string.startIndex, 3 ) )
```
ORマッパーあるある

# OR マッパーあるある

個人的な感想です。気がついた時点で追記します。

## いいところ

* 基本的な処理（ID検索だったり、更新系のDML）はデフォルトで実装がある
* 暗黙キャストに頼らない
* SQL が SQL として扱える
* レコードのメタデータを内包して処理してくれる
* 論理削除（SoftDlete）に関する考慮がされている
* サロゲートキー以外も扱える

## だめなところ

* XMLの記述がいる
* SQL を SQL として扱えない
* オブジェクトマッピングが中途半端。Java 系の場合、特に enum のマッピング。
* データベースからリバースエンジニアリングする場合、テーブル数が多いと生成できない。
* 暗黙キャスト前提なので、たまに変な動きする
* サロゲートキー強要
paperclipでファイルアップロードをRspecでテスト w/ factory_girl


次ブログから要旨だけ抽出：http://konyu.hatenablog.com/entry/2015/05/05/155421

## 動作確認環境
* OSX yosemite
* Ruby2.2.0
* Rails4.2
* Rspec3.1

## 準備 設定ファイル修正rails_helper.rb
fixture_file_uploadを呼び出せるように、ライブラリを読み込むように追記

追記箇所は以下のようにRSpec.configureのブロック内に追記

```ruby
RSpec.configure do |config|
  ...
  ..
  # paperclip file uploadテスト用
  # rspec内で、ファイルアップロードのテストに使用する
  config.include ActionDispatch::TestProcess

  # factoryGirl内での呼び出し
  FactoryGirl::SyntaxRunner.class_eval do
    include ActionDispatch::TestProcess
  end
  
  # fixtureのパス指定
  # ファイルアップロードテストする際のアップするファイルを指定するパスをfixtures以下から省略して指定
  config.fixture_path = "#{::Rails.root}/spec/fixtures"

end
```

## ファイルアップロードのテスト

### アップロード対象のファイルを置く
fixture_pathを通してある/spec/fixturesの下にアップロード対象のファイルを置く
今回の説明では/spec/fixtures/voice/voice01.mp3を設置する

※ ダミーのテキストファイルの拡張子を変えただけのファイルだと怒られる

### アップロードするメソッドの呼び出し方

```
# 呼び出し方
fixture_file_upload("相対パスのファイル名", "mime_type"))
# mp3の場合
fixture_file_upload("voice/voice01.mp3", "audio/mp3"))	
```

### 具体的なRspecコード例

```ruby
describe "#update a and file upload" do
  it "can upload with update_attributes" do
    # sound モデルを更新してファイルをアップロードする
    sound.update_attributes(voice: fixture_file_upload("voice/voice01.mp3", "audio/mp3"))
    sound.reload
    # paperclipで生成されたファイル名を格納したカラムに値が入っていることを確認
    expect(sound.voice_file_name).not_to be_nil
 end
end
```

# Factory_girlのフィクスチャでファイルをアップロード済みのモデルと定義する場合

##factory_girlの定義

```ruby
factory :sound do
  msg "original"
  trait(:recorded) do
    # factory_girlのファイルではfixture_pathを見てくれないので頭からパスを定義して上げる必要があった。
    voice { fixture_file_upload("#{::Rails.root}/spec/fixtures/voice/voice01.mp3", "audio/mp3") }
  end
end 
```

### specファイルで呼び出し例

```ruby
let(:sound) { FactoryGirl.create(:sound, :recorded) }
 
``` 

ref:http://apidock.com/rails/ActionController/TestProcess/fixture_file_upload
Scala で printf

主に C++ を使ってた人が Scala を学ぶシリーズ。
コンソール出力関数の使い方。

```scala:print.scala
class Main {

	// 出力
	print("Hello, World!\n")

	// 出力して改行
	println("Hello, World!")

	// フォーマットして出力
	printf("Hello, %s!\n", "World")
}
```

```:コンソール入力
> scala
> :load print.scala
> new Main
```

```:コンソール出力
Hello, World!
Hello, World!
Hello, World!
```

print 関数は内部で toString 関数を呼び出すので、toString 関数が定義されていれば文字列以外の型も渡せます。
Scala バージョン 2.11.6 で動作確認。

## 補足

Scala では class の下のレベルに処理を書くと、それがコンストラクタになります。
上に書いた print.scala は cpp で書くとこんな感じのようです。

```cpp
#include <cstdio>

class Main {

public:
  Main() {
    printf("Hello, %s!\n", "World");
  }
}

```

コンストラクタに引数を渡したい時は class 宣言の後ろに引数を書きます。

```scala:print.scala
class Main2[Type](str : Type) {
  println(str)
}
```

```:コンソール入力
> scala
> :load print.scala
> new Main2("Hello, World!")
```

```:コンソール出力
Hello, World!
```

`[Type]` というのはテンプレートです。
cpp で書くとこんな感じしょうか。

```cpp
template <typename Type>
class Main2 {

public:
  Main2(const Type& str) {
    printf("%s\n", str.toString());
  }
}
```
AngularJSで環境による設定を切り替える

Yeomanで作ったAngularJSプロジェクトで環境ごとの設定を管理する方法です。Gruntで動的にconstantとvalueのモジュールを生成する[**grunt-ng-constant**](https://github.com/werk85/grunt-ng-constant)を利用します。

# grunt-ng-constantをインストールする

npmでgrunt-ng-constantをインストールします

```
$ npm install grunt-ng-constant --save-dev
```

# 環境ごとの設定ファイルを作成する

*config* ディレクトリを作成し、配下に *development.json* *test.json* *production.json* を用意します

```config/development.json
{
  "env": "development"
}
```

# ビルドの設定を行う

*Gruntfile.js* を編集して grunt-ng-constant の設定を行います

```Gruntfile.js
  grunt.initConfig({
    // grunt-ng-constant
    ngconstant: {
      options: {
        name: 'config',
        dest: '<%= yeoman.app %>/scripts/config/config.js',
      },
      development: {
        constants: {
          config: grunt.file.readJSON('config/development.json'),
        }
      },
      test: {
        constants: {
          config: grunt.file.readJSON('config/test.json'),
        }
      },
      production: {
        constants: {
          config: grunt.file.readJSON('config/production.json'),
        }
      }
    }
  });

  grunt.registerTask('serve', 'Compile then start a connect web server', function (target) {
    if (target === 'dist') {
      return grunt.task.run(['build', 'connect:dist:keepalive']);
    }

    var env = target || 'development';
    grunt.log.writeln('Set enviroment ' + env);
    grunt.task.run([
      'clean:server',
      'ngconstant:' + env,
      'wiredep',
      'concurrent:server',
      'autoprefixer:server',
      'connect:livereload',
      'watch'
    ]);
  });

  grunt.registerTask('test', [
    'clean:server',
    'ngconstant:test',
    'wiredep',
    'concurrent:test',
    'autoprefixer',
    'connect:test',
    'karma'
  ]);

  grunt.registerTask('build', function(target) {
    var env = target || 'production';
    grunt.log.writeln('Set enviroment ' + env);
    grunt.task.run([
      'clean:dist',
      'ngconstant:' + env,
      'wiredep',
      'useminPrepare',
      'concurrent:dist',
      'autoprefixer',
      'concat',
      'ngAnnotate',
      'copy:dist',
      'cdnify',
      'cssmin',
      'uglify',
      'filerev',
      'usemin',
      'htmlmin'
    ]);
  });
```

# AngularJSでgrunt-ng-constantが生成するファイルを読み込む

grunt-ng-constantが生成する *config.js* を読み込むように *index.html* に追加します

```app/index.html
        <!-- build:js({.tmp,app}) scripts/scripts.js -->
        <script src="scripts/app.js"></script>
        <script src="scripts/config/config.js"></script>
        <!-- endbuild -->
```

*config.js* に出力される `config` モジュールを読み込むよう *app.js* に追加します

```app/scripts/app.js
angular
  .module('myApp', [
    'config'
  ]);
```

# 環境を指定してビルドする

*serve* / *build* で環境を指定してコマンドを実行します

```console
$ grunt serve:production
```
リレーショナルデータベースとSQL

#リレーショナルデータベース(RDB)
データベースとは、一言で言い表せばデータを保持しておく場所のこと。
データベースにデータを保存したり、データベースから特定のデータを探してきたりすることを可能にするのが、データベース管理システム(DBMS)です。
現在一般的に利用されているデータベースが、リレーショナルデータベースで、言語としてSQLが使用されています。
リレーショナルデータベースには以下のような特徴があります。

- データが二次元の表の形式で表現される。この表一つ一つをテーブルという。
- 複数の表のデータを関連づけることで、すべてのデータを一つのデータベースとして活用出来る。

#SQL
今回はOracle社が買収したことで話題になったMYSQLを利用してSQLの書き方を見ていきましょう。

##データベース操作に関するコマンド
``>show databases;`` データベースの参照
``>create database example;`` exampleデータベースを作成
``>drop database example;`` exampleデータベースを削除
``>use example;`` 操作するデータベースをexampleデータベースに変更する。

##テーブル操作に関するコマンド
### テーブルの作成 

```sql
>create table users (
  name varchar(255) not null,
  email varchar(255) unique,
  score double
 );
```

create table テーブル名 (列名 データ型 [オプション], 列名 データ型...)
と書きます。オプションによって必須項目の設定や、一意性の設定をすることができます。

主なオプション
primary key => テーブルのデータを一意に識別するためのキーに設定する。
unique      => 同列での一意性を設定する。同じ値を異なるデータに設定できなくなる。
not null   => 必須項目に設定。データの入力を強制させたい時に。
default 値 => 値をその項目のデフォルト値に設定する。列に値が指定されなかった時にデフォルト値をとる。


### テーブルの変更

```
/ usersテーブルにsex列を追加。 /
>alter table users add sex enum('male','female');
/ usersテーブルからscore列を削除 /
>alter table users drop score;
```

### テーブルの削除
```sql
>drop table users;
```

usersテーブルを削除する。

##データの操作
-データの挿入

```sql
>insert into users (name, email, score, sex) values ("Taro", "taro@gmail.com", 8.5, "male");
```
usersテーブルにデータを挿入する。

-データの削除

```sql
>delete from users; /* usersテーブルのデータをすべて削除 */
>delete from users where score >= 5.0;  /* usersテーブルからscoreが5.0以下のデータを削除 */
```

-データの変更

```sql
/* usersテーブルのnameがTaroのscoreを8.0にする。 */
>update users set score = 8.0 where name = "Taro";
```

##データの参照
usersテーブルの全列を参照する。
``>select * from users;``

usersテーブルのscore列を参照する
`>select score from users;`

usersテーブルの列を条件付きで参照する。scoreが5.0より大きい。（where句）
`>select * from users where score > 5.0;`
where句を用いるときは、and, or を用いて複数の条件で参照することができる。
where句で指定できる条件はもっと複雑な条件を指定できるものもあります。


##テーブルの結合
複数のテーブルに定義された関連に基づいて複数のテーブルからデータを参照することができる。
ここでは、usersテーブルと、usersのidで紐づくuser_id列をもつpostsテーブルというものがあるとします。
usersテーブル 
id, name, email, score
postsテーブル
id, user_id, body

```sql
select users.name, users.score, body.posts
  from users, posts
  where users.id = posts.user_id; 
```
このように、複数のテーブルからデータを結合して参照したい場合は

- select で参照したい列は、テーブル名.列名で表す。
- from のあとには複数のテーブル名を列挙する。
- where句で結合する条件を記す。この場合はusersテーブルのid列とpostsテーブルのuser_id列が等しいという条件でデータの結合を行っている。

##サブクエリ
クエリを入れ子にして参照するデータを制御できる。

```sql
> select body from posts
    where  user_id = 
    (select id from users where score >= 5.0);
```

scoreが5.0以上のuserのpostsのbodyを参照。

##クエリの結合
- Union演算子
二つのクエリの結果を結合して、重複する行を削除する。

```sql
select * from team_a
union
select * from team_b ;
```

union all とすると重複を削除しないですべての
行を取り出す。

- intersect演算子
二つのクエリの重複部分のみを出力する。

```sql
select * from team_a
intersect
select * from team_b ;
```

- except演算子

二つのクエリの差を出力する。

```sql
select * from team_a
except
select * from team_b ;
```

team_aからteam_bの出力を差し引いたものが出力される。

##インデックス
インデックスとは、データの検索をより高速に行うためのものです。
ふつうのデータの参照は、目的のデータが見つかるまで1行ずつデータを参照していくが、インデックスを用いると、目的の行の場所を先に見つけてからその行のデータを参照することができる。

表の結合条件に使用されている列や、ユニークな値をもつ列などに対してインデックスを作成すると検索速度が上昇する。
AmazonJSの投稿方法(設定ではありません)

AmazonJSの投稿方法

設定方法ではありません。
設定方法の確認がしたい方は、[こちら](http://easyramble.com/wordpress-amazon-js-plugin.html)

プラグインを有効化したら
![Screen Shot 2015-05-06 at 11.23.44.png](https://qiita-image-store.s3.amazonaws.com/0/55731/c16cd9bf-af0e-18ec-6e13-98f951153263.png)

こういうのが出るので、赤い部分をクリック

すると
![Screen Shot 2015-05-06 at 11.24.05.png](https://qiita-image-store.s3.amazonaws.com/0/55731/851751c7-2c6e-3821-75dd-90402ffdfc0f.png)

検索窓が出てくるので、Amazon内の検索をします。keywordを入れたら、検索をクリック

すると
![Screen Shot 2015-05-06 at 11.24.22.png](https://qiita-image-store.s3.amazonaws.com/0/55731/36b6a258-8f1c-99fe-0b54-a5f82e6ed892.png)

こんな感じで、一覧が表示されるので、該当のものをクリック

![Screen Shot 2015-05-06 at 11.25.20.png](https://qiita-image-store.s3.amazonaws.com/0/55731/459c2077-8541-c3b5-d3f2-c674dff1cb0f.png)


最後に表示形式を選択。個人的には動的なテンプレートのデフォルトが好きです。
最後に青い、挿入ボタンを押せば、挿入されます。

プレビューでみるとちゃんとこのように表示されます。
![Screen Shot 2015-05-06 at 11.43.12.png](https://qiita-image-store.s3.amazonaws.com/0/55731/e93d20a4-48be-b2f7-00d7-29eed987636c.png)
sourceReading > gameplay > クラス名とファイル名が同じ / 色々なクラスを定義

https://github.com/gameplay3d/GamePlay/tree/master/gameplay/src

Vector3クラスをVector3.cppにて実装定義している。他、同様。

色々なクラスを定義している。

各.hppで概要説明が書かれている。

すべて同じ系列の名前付けなので、ロジック関連とUI関連が同じ系列で並んでいるのはいいのだろうか?
sourceReading > cppunit > クラス名とファイル名が同じ

http://cgit.freedesktop.org/libreoffice/cppunit/tree/src/cppunit

DefaultProtectorクラスを宣言して、DefaultProtector.cppにて実装を定義している。

クラス名とファイル名を同じにするのがいいのだろうか?

また、Message.cppのようにMessage.hファイルがリンク先にないが、includeしているのがよくわからない。
PythonからToCoStick経由でTWE LiteをLチカする

TWE LiteにをPCからコマンドを送れるToCoStickというUSBドングルがあります。

![](http://tocos-wireless.com/jp/products/TWE-Lite-USB/tocostick-g.jpg)
http://tocos-wireless.com/jp/products/TWE-Lite-USB/

このToCoStickからコマンドを送るのは、ターミナル等から、ちょっと難解なコマンド列を送る必要があります。

http://tocos-wireless.com/jp/products/TWE-Lite-USB/control.html

これをArduinoのdigitalWrite関数っぽく簡単に書けるPythonのライブラリを書いてみました。

こう書くと

```
digitalWrite(1,HIGH)
```

裏で
```
s.write(':7880010101000000000000000005')
```
というコマンドを送ってくれます。

もちろん
```
analogWrite(1,1024)
```
も書けます。

こちらに置いておきます。
https://github.com/usopyon/tocotika
MacでsbtのOutOfMemoryを防止する設定

Macでsbtで下のエラーが出るのを防ぐ為には、

```
java.lang.OutOfMemoryError: PermGen space
Error during sbt execution: java.lang.OutOfMemoryError: PermGen space
```

`/usr/local/etc/sbtopts` の`-mem`オプションに大きなメモリサイズ(MB)を指定する。`-mem  3072` など。

`$ brew info sbt` をやると、その他の設定方法も表示される。
Sensuに自作のプラグインのプルリクを送る前にやっておきたいこと

サーバの監視で利用されている[Sensu](http://sensuapp.org/)は、プラグインを追加することで様々な監視や、メトリックス収集のプラグインを使ってGraphiteと連携させてグラフ化させたりすることが出来ます。

[sensu-community-plugins](https://github.com/sensu/sensu-community-plugins)では、世界中の利用者から集まった様々なプラグインがオープンソースで公開されており、必要なプラグインはここを見ると大体揃います。
（アナウンスによれば、2015/7/6にリポジトリが[https://github.com/sensu-plugins](https://github.com/sensu-plugins)へ引っ越しするようです）

しかし、たまに欲しかったけど存在しないプラグインもあったりするので、そういった場合は自作すると思います。
せっかく自作したのだから、他の人も使ってくれるように自作したプラグインをリポジトリに含めてもらえると良いですよね。

そこで、実際にプルリクを送ってみたのですが、[travis CI](https://travis-ci.org/)でコーディング規約のチェックなどが行われており、チェックエラーとなってしまいました。
https://github.com/sensu/sensu-community-plugins/pull/1157

実際にコードレビューをする人の負担にもなるので、事前にCIを通すのは大事です。
今回は、その手順をまとめました。

CI環境はVagrant上で実行できるので、事前にVagrant環境を整えておく必要があります。
https://docs.vagrantup.com/v2/installation/index.html

## 仮想マシンを立ち上げる

リポジトリには`Vagrantfile`が含まれているので、簡単にCI環境を作ることが出来ます。
まずは、checkoutして仮想マシンを立ち上げます

```
git clone https://github.com/sensu/sensu-community-plugins.git
cd sensu-community-plugins
vagrant up
```

しばらくかかりますが、これでCIに必要な複数のrubyが入った環境が出来ました。

## 仮想環境でCIを実行する

仮想マシンに入ります。

```
vagrant ssh

Last login: Tue May  5 23:42:18 2015 from 10.0.2.2
[vagrant@sensu-community-plugins-dev ~]$
```

リポジトリディレクトリに移動
（vagrantでは、`Vagrantfile`があるディレクトリが`/vagrant/`にマウントされています）

```
cd /vagrant/
```

sensuでは３つのrubyバージョンでテストが行われているようなので、テストを実行する前にバージョンを切り替えて実行します。

### ruby 1.9系のテスト
```
rvm use 1.9.2 --install --binary --fuzzy
gem install bundler
export BUNDLE_GEMFILE=$PWD/Gemfile
bundle install --jobs=3 --retry=3

# テストの実行
bundle exec rake default
```

### ruby 2.0系のテスト
```
rvm use 2.0 --install --binary --fuzzy
gem install bundler
export BUNDLE_GEMFILE=$PWD/Gemfile
bundle install --jobs=3 --retry=3

# テストの実行
bundle exec rake default
```

### ruby 2.1系のテスト
```
rvm use 2.1 --install --binary --fuzzy
gem install bundler
export BUNDLE_GEMFILE=$PWD/Gemfile
bundle install --jobs=3 --retry=3

# テストの実行
bundle exec rake default
```

エラーが無くなったら、リポジトリにプルリクを送りましょう！
Git Flowでmasterにpushしてしまったときの直し方

Git Flowで下記のようにmasterブランチに間違えてpushしてしまった！
`git push -f origin HEAD^:master`
そんなときはタグなどを利用して、前の状態をpushし直そう！
前の状態に対応するタグが1.0.0である場合には下記のようにして
masterブランチを修正することができました。
`git checkout 1.0.0`
`git push -f origin master`
はじめてのMEANスタック(じゃなかった) #3


下記サイトを参考にここまで進めてきたのですが、重大な事実が今頃発覚。Angular.js使ってません。

http://cwbuecheler.com/web/tutorials/2013/node-express-mongo/

MEANスタックじゃなかった。。。
なのでAngular.jsは別途入門することにしてこのまま続けます。
(過去記事のタグからは消しておきました、、）

#DBに書き込む
まずデータ追加用ページのルーティングを追加します。

```route/index.js
/* GET New User page. */
router.get('/newuser', function(req, res) {
    res.render('newuser', { title: 'Add New User' });
});
```
そしてデータ追加用ページのテンプレートを新規作成します。

```views/newuser.jade
extends layout

block content
	h1= title
	form#formAddUser(name="adduser",method="post",action="/adduser")
		input#inputUserName(type="text", placeeholder="username", name="username")
		input#inputUserEmail(type="text", placeholder="useremail", name="useremail")
		button#btnSubmit(type="submit") submit
```
これで追加用フォームが出来たのでpostする先をつくります。

```route/index.js
/* POST to Add User Service */
router.post('/adduser', function(req, res) {
	var db = req.db;
	var userName = req.body.username;
	var userEmail = req.body.useremail;
	var collection = db.get('usercollection');

	collection.insert({
		"username" : userName,
		"email" : userEmail
	}, function (err, doc) {
		if(err) {
			res.send("There was a problem adding the information to the database.");
		} else {
			res.location("userlist");
			res.redirect("userlist");
		}
	});
});
```
username, useremailはフォームで指定した名前です。
リクエストから取得してdbにinsertして、成功すればuserlistにリダイレクトしています。
ここでnpm startして、
http://localhost:3000/newuser
にアクセスしてユーザ名、メールアドレスを入力してボタンを押すとuserlistに遷移して追加されていることが確認できます。

タイトルに偽りありましたが、とりあえずこれでexpress+mongoで簡単なサンプルが出来ました。
Angularはまたいずれ。

###インデックス
[はじめてのMEANスタック #1](http://qiita.com/kukimo/items/673a093c9297673bd494)
[はじめてのMEANスタック #2](http://qiita.com/kukimo/items/4f60bdca51f72a9e1ec4)
Jadeで作るカスタムタグ入門

この記事は「Web Componentsとかに興味はあるけど、SEOも大事なんだよなー」という方向けの内容です。

## `rating`タグを作る

例えば、下のように表示される`rating`タグを作りたい場合。

![Screen Shot 2015-05-06 at 12.24.54 AM.png](https://qiita-image-store.s3.amazonaws.com/0/38383/8a015ad7-cbbf-36c4-0df3-96a1914b9642.png)

HTMLには`<input type="rating" />`も`<ratings />`タグも無いので、[Jade](http://jade-lang.com)で自作します。

まず先にJadeの記法について軽く触れておくと、

```jade:Jade
a(href="/" target="_blank") Home
```

のように書くと、コンパイル後に次のようなHTMLが出てきます。

```html:HTML
<a href="/" target="_blank">Home</a>
```

`img`タグのような空要素の場合はこう書きます。

```jade:Jade
img(src="logo.png" alt="ロゴ")
```

どことなくJavaScriptの関数の呼び出しに似ています。
実際にこういうこともできます。

```jade:Jade
+say(hello="world")
```

先頭に`+`をつけると関数（mixin）の呼び出しになります。
なので、事前に`say`を定義しておきましょう。

```jade:Jade
mixin say
  if (attributes.hello && attributes.hello !== "")
    p Hello, #{attributes.hello}
```

JavaScriptにそっくりですが、ブラウザ上で実行されるわけではありません。静的なHTMLを出力します。

この場合のコンパイル結果はこうです。

```html:HTML
<p>Hello, world</p>
```

`hello`属性を持ったカスタムタグ`say`の完成です。

## `rating`タグの仕様を決める

実装に入る前に、`rating`タグとはどうあって欲しいかを明確にします。

- `value`をセットできて`submit`できるようにしたい
- `readonly`属性で読み取り専用にできるようにしたい
- `stars`属性で5段階評価から変更できるようにしたい
- `max`属性で`value`の最大値を設定したい
- `max`属性がある場合は、`stars`との割合で`value`を表示したい
- 星の表示精度は0.5刻み、入力精度は1刻みにしたい
- 入力はタップで行いたい

つまり、

```jade:Jade
+rating(value="3")
```
![Screen Shot 2015-05-06 at 12.24.54 AM.png](https://qiita-image-store.s3.amazonaws.com/0/38383/3dbb5434-f3c3-2e0b-b986-07a614758390.png)

や、

```jade:Jade
+rating(value="50" max="100")
```

![Screen Shot 2015-05-06 at 1.32.32 AM.png](https://qiita-image-store.s3.amazonaws.com/0/38383/7dacd093-8fd6-5564-6582-f2a52df37ba2.png)

のようになるイメージです。

## `rating`タグの完成

長くなりそうなので、先に[完成品](http://byodkm.github.io/HTML6/html6/tests/rating/)をご覧ください。

## 動作の仕組み

CSSを無効にして見ると分かりますが、各星が`input(type="radio")`で実装されています。`value`が`"0"`の場合もあり得るので、デフォルトの`radio`の数は6です。

後はCSSで頑張るのと、JSをちょっとだけ書きました。「星の表示精度は0.5刻み」という仕様がなければ、JSがなくてもちゃんと動きます。

## 詳しいソースはこちら

- [Mixin](https://github.com/BYODKM/HTML6/blob/gh-pages/html6/elements/mixins/rating.jade)
- [CSS](https://github.com/BYODKM/HTML6/blob/gh-pages/html6/styles/elements/rating.styl)
- [JS](https://github.com/BYODKM/HTML6/blob/gh-pages/html6/scripts/elements/rating.coffee)

`rating`タグは少し複雑なので、最初はもう少し簡単なカスタムタグから始めた方がいいかもしれません。

- [icon.jade](https://github.com/BYODKM/HTML6/blob/gh-pages/html6/elements/mixins/icon.jade)
- [button.jade](https://github.com/BYODKM/HTML6/blob/gh-pages/html6/elements/mixins/button.jade)

以上です。

> Have a nice SEO!
Ubuntu 15.04 に zabbixをインストール

## 準備

```bash:パッケージインストール
sudo apt install \
  zabbix-agent zabbix-frontend-php zabbix-server-mysql
```

```bash:apache用設定コピー
sudo cp /usr/share/doc/zabbix-frontend-php/examples/apache.conf /etc/apache2/sites-enabled/
```

```bash:apacheリスタート
sudo /etc/init.d/apache2 restart
```

## アクセス

http://localhost/zabbix にアクセス

```diff:/etc/php5/apache2/php.ini
- post_max_size = 8M
- max_execution_time = 30
- max_input_time = 60
- ;date.timezone =
+ post_max_size = 16M
+ max_execution_time = 300
+ max_input_time = 300
+ date.timezone = Asia/Tokyo
```

```bash:apacheリスタート
sudo /etc/init.d/apache2 restart
```

## zabbix初期データ投入

> The frontend does not match Zabbix database.

と表示される場合は、初期データが入っていないため。

```bash:
$ mysql -uroot -pxxx
mysql> create database zabbix;
```

```bash:
cd /usr/share/zabbix-server-mysql/
zcat schema.sql.gz | mysql -uroot -pxxx zabbix
zcat images.sql.gz | mysql -uroot -pxxx zabbix
zcat data.sql.gz | mysql -uroot -pxxx zabbix
```

```bash:
sudo touch /etc/zabbix/zabbix.conf.php
sudo chown www-data:www-data /etc/zabbix/zabbix.conf.php
```

## WebUI

初期設定は以下

* User: Admin
* Pass: zabbix

> zabbix_server is disabled in /etc/default/zabbix-server.

こう出る場合は

```diff:/etc/default/zabbix-server
- START=no
+ START=yes
```

```bash:ポート番号を確認(おそらく10050)
sudo netstat -anp | grep zabbix_agentd
```

```diff:/etc/zabbix/zabbix_server.conf
DBUser=root
DBPassword=xxx
```

```bash:
sudo /etc/init.d/zabbix-server restart
```

# monitor開始

* WebUI > Configuration > Hosts > Details > Satus
  * Monitoredにする。
secureCoding > ptrdiff_t > ポインタ同士の演算結果を表す | stddef.hで定義

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> ptrdiff_tは2つのポインタの演算結果を表す符号付き整数型であり、標準ヘッダ<stddef.h>で定義されている。

```
T *p, *q;
ptrdiff_t dok;
int dng;

dok = p - q;
dng = p - q;
```

> たとえばptrdiffがlong long int型にエイリアスされている処理系において、コンパイラは先の代入に対して警告メッセージを出力するか、より深刻な場合、代入する値が実行時にきりすてられてしまう。
secureCoding > 拡張整数型の定義 > stdint.h | inttypes.h | stddef.h

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> Cでは標準ヘッダ<stdint.h>、<inttypes.h>、<stddef.h>においてその他の整数型も定義されている。拡張整数型もその１つである。

<hr>
[C言語の標準ヘッダ一覧](http://www.c-lang.org/detail/lib_header.html)にそれぞれ詳しい。
secureCoding > ラップアラウンドを発生させない

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

```NGcode.c
unsigned int i, sum;
if (sum + i > UINT_MAX) {
    // too big
} else {
    sum += i;
};
```

```OKcode.c
unsigned int i, j, sum;
if (i > UINT_MAX - sum) {
    // too big
} else {
    sum += i;
}
```

NGcode.cの場合、(sum+i)がUINT_MAXを超える場合ラップアラウンドが発生し、too bigの条件は成立しない。
OKcode.cのように書かないといけない。
private registry使ってみた

# この記事は古いので新しい記事をどうぞ

* [docker-registry - Docker Registry 2使ってみた - Qiita](http://qiita.com/tukiyo3/items/2ca5b1eddd455e333016)

## 手順

```bash:registry立ち上げ
docker run -d \
 -p 5000:5000 \
 -v /var/registry:/tmp/registry \
 registry
```

## pushするには

docker tagでローカルイメージと、registryを紐付ける必要がある。

```bash:tagづけ
docker tag tukiyo3/odoo8 localhost:5000/odoo8:`date -I`
```

```bash:push
docker push localhost:5000/odoo8:`date -I`
```

## pull

```bash:pull
docker pull localhost:5000/odoo8:`date -I`
```

## 一覧表示

* http://localhost:5000/v1/search にアクセス。
[JAWS-UG CLI] CloudFormation:#8 ハンズオン用IAMユーザの削除


```bash:コマンド
aws cloudformation list-stacks
```

```bash:コマンド
CF_STACK_NAME='削除するスタックの名前' (例: administrator-prj06-mbp13)
```

```bash:コマンド
aws cloudformation delete-stack --stack-name ${CF_STACK_NAME}
```

```bash:結果
(戻り値なし)
```
localhostは省略できた <- 出来ませんでしたm(_ _)m

# 省略例

## ~/.ssh/config

```diff:~/.ssh/config
 Host srv1-8081
-    ProxyCommand ssh -NL 8081:localhost:8080 srv1
+    ProxyCommand ssh -NL 8081::8080 srv1
```

## docker 

```diff:
- docker -H tcp://localhost:2376
+ docker -H tcp://:2376
```

## autossh

```diff:
  AUTOSSH="autossh -M 0 -f -o Compression=yes -NL"
- $AUTOSSH 2376:localhost:2375 srv1
- $AUTOSSH 8081:localhost:8080 srv1
+ $AUTOSSH 2376::2375 srv1
+ $AUTOSSH 8081::8080 srv1
```


# port fowardingでLISTENしているポート一覧確認

```bash:
$ netstat -anp | grep "127.0.0.1.*LISTEN.*ssh" | sort
(一部のプロセスが識別されますが, 所有していないプロセスの情報は
表示されません。それら全てを見るにはルートになる必要があります.)
tcp        0      0 127.0.0.1:2376          0.0.0.0:*               LISTEN      19845/ssh      
tcp        0      0 127.0.0.1:8081          0.0.0.0:*               LISTEN      2741/ssh
```

* 2376, 8081 ポートでLISTENしていることがわかる。
DockerでHerokuに近い環境を再現しつつDockerのImageをslugにして公開するまでのメモ

HerokuがDockerに対応したようです。
ためした時、若干ハマったのでメモします。

# 環境
MacOSX
Docker: 1.6.0
Heroku client: 3.35.0

事前にDocker-machineでローカルに環境を構築済み

# インストール

Dockerのpluginをインストールします。

```
$ heroku plugins:install heroku-docker
```

# 使い方

適当なディレクトリにプロジェクトをcloneします。
すでに自分がやってるプロジェクトがあるならそっちを使ってもいいかもしれませんね。

```
$ git clone https://github.com/heroku/node-js-getting-started.git
$ cd node-js-getting-started.git
```

以下のコマンドでDockerfileを作ります。

```
$ heroku docker:init
```

ただ自動生成されたDockerfileでは`npm install`でパーミッションエラーが出るのとpackage.jsonがキャッシュされないので修正を加えます。

```diff:Dockerfile
FROM heroku/cedar:14

RUN useradd -d /app -m app
+ RUN chown app:app -R /app
USER app
WORKDIR /app

ENV HOME /app
ENV NODE_ENGINE 0.12.2
ENV PORT 3000

RUN mkdir -p /app/heroku/node
RUN curl -s https://s3pository.heroku.com/node/v$NODE_ENGINE/node-v$NODE_ENGINE-linux-x64.tar.gz | tar --strip-components=1 -xz -C /app/heroku/node
ENV PATH /app/heroku/node/bin:$PATH

RUN mkdir -p /app/.profile.d
RUN echo "export PATH=\"/app/heroku/node/bin:/app/bin:/app/node_modules/.bin:\$PATH\"" > /app/.profile.d/nodejs.sh
RUN echo "cd /app/src" >> /app/.profile.d/nodejs.sh

EXPOSE 3000

ONBUILD RUN mkdir -p /app/src
- ONBUILD COPY . /app/src
ONBUILD WORKDIR /app/src
+ ONBUILD COPY package.json /app/src/package.json
ONBUILD RUN npm install
+ ONBUILD COPY . /app/src
```

次のコマンドでbuildと実行をします。

```
$ heroku docker:start
```

ローカルサーバーをブラウザで見てHelloWorldと出てくればとりあえずOKです。

# 公開
以下のコマンドでherokuのアプリを作ります。

```
$ heroku create
```

そして以下のコマンドでDocker imageからslugを作りdeployします。

```
$ heroku docker:release
```

そのまま`$ heroku open`で確認してHello WorldとでればOKです。

気になったのは`git push`せずにdeployなんだなーと行った感じです。
最近herokuをちゃんと勉強しだしたのでよくわかってないんですが...

# まとめ

環境によるのか`$ heroku docker:exec`が使えなかったりしました
どうしても必要なら`$ docker exec`でいいと思いますが。

一番気になるのはAdd-oneとかの連携はブログに書かれてなかったので
それをどうするかですね

たぶんdocker-composeと連携させる方法でいいのではないかと思うのですが
もしかしたらheroku側でその辺をサポートするかもしれないので様子見です。

試せたらメモしておきます。

とりあえずHerokuの実行環境に近い環境で試せるというのはまぁまぁメリットかなと思います。

# 参考
- [Heroku | Introducing 'heroku docker:release': Build & Deploy Heroku Apps with Docker](https://blog.heroku.com/archives/2015/5/5/introducing_heroku_docker_release_build_deploy_heroku_apps_with_docker)
- [Introduction: Local Development with Docker | Heroku Dev Center](https://devcenter.heroku.com/articles/introduction-local-development-with-docker?preview=1)
docker Remote API と docker-machine

## 設定

* srv1 にて設定

```diff:/lib/systemd/system/docker.socket
  [Socket]
+ ListenStream=127.0.0.1:2375
```

```bash:設定反映
systemctl daemon-reload
systemctl restart docker
```

## 接続(sshポートフォワードを使う場合)

```bash:
ssh -NL 2375:localhost:2375 srv1
export DOCKER_HOST=tcp://localhost:2375
docker ps -a
```

## 接続(sshポートフォワードを使わない場合)

* 接続元にて実施

```bash:コマンドが長いのでalias
alias dsrv1="docker -H tcp://:2376"
```

```bash:srv1の2375を2376にforwarding
ssh -NL 2376::2375 srv1
```

```bash:利用する
dsrv1 ps -a
```

## autosshの例

```bash:autoconnect.sh
AUTOSSH="autossh -M 0 -f -o Compression=yes -NL"
$AUTOSSH 2376::2375 srv1
$AUTOSSH 8081::8080 srv1
```


# docker-machineの例

* driverがnoneの場合、`docker-machine ssh` が出来ない。

```bash:
curl -L https://github.com/docker/machine/releases/download/v0.2.0/docker-machine_linux-amd64 > ~/bin/docker-machine

chmod +x ~/bin/docker-machine

docker-machine create --url tcp://xx.xx.xx.xx:2376 host1
docker-machine ls
docker-machine active host1
docker-machine rm host1
```
Heroku で Websockets with Node.js をはじめるためのメモ


公式のリファレンスを見ながら Heroku で Websockets を使うための方法を書いていきます。

[Using WebSockets on Heroku with Node.js](https://devcenter.heroku.com/articles/websockets)

## サンプルを clone してくる

```
git clone https://github.com/heroku-examples/node-ws-test.git
cd node-ws-test
```

## ローカルで試す

```
npm install
node index.js
```

ポート 5000 番にアプリケーションが立ち上がるのでブラウザで見てみます。

## Heroku にアプリケーションを作成する

```
heroku create
```

## Heroku に push する

```
git add .
git commit -m “Ready to deploy“
git push heroku master
```

## 作成したアプリケーションにアクセスする

```
heroku open
```

ブラウザが開いて、時刻が秒ごとに画面に追記されて出てきたら成功です！

![](http://i.gyazo.com/960c084e3dc09a78742a2971fd3845d1.png)