OmniAICreator/Qiita-1.07M huggingface dataset:
templateクラスのstaticメンバ変数

### イントロ
通常のクラス同様、templateクラス内にも静的メンバ変数を用意することができる。しかし、その実体の用意の方法は特殊化の方法や有無によって異なる。少しハマってしまったので、覚書としてまとめておく。すでに知っていた人は、何を今頃、とでも思いながら眺めてください。

### 非templateクラス内の静的メンバ
比較のために、まず通常のクラス中での静的メンバ変数の宣言を書いてみる。

```cpp:non_template_static_value.hpp
class Hoge{
    static int Value;
};
```
```cpp:non_template_static_value.cpp
#include "non_template_static_value.hpp"
int Hoge::Value=0;
```
staticメンバ変数の実体は、当然**ソースファイル**に別に記述する必要がある。

###templateクラス内での静的メンバ
次にtemplateクラス内で、静的メンバ変数を宣言した場合。

```cpp:template_static_value.hpp
template<typename A>
class Hoge{
    static int Value;
};

template<typename A>
int Hoge<A>::Value=0;
```
templateクラス内の静的メンバの場合には、template宣言`template<typename A>`とともに静的メンバ変数の実体を**ヘッダファイル**内に記述する。

### 明示的特殊化したクラス内での静的メンバ変数
さて、次にtemplateクラスを明示的特殊化したクラス内でのみ、静的メンバ変数を使いたい状況を考えてみる。

```cpp:explicit_specialization_static_value.hpp
template<typename A>
class Hoge{
};
template<>
class Hoge<int>{
    static int Value;
};
```
```cpp:explicit_specialization_static_value.cpp
#include"explicit_specialization_static_value.hpp"
int Hoge<int>::Value=0;
```
明示的特殊化したクラスで宣言した変数の実体は、すでに`int`で確定しているため、template非依存なので、静的メンバ変数の実体は非templateクラス同様**template宣言なしで**、**ソースファイル**に実体を用意する必要がある。

これは、[スタックオーバーフローでの質問](http://ja.stackoverflow.com/questions/4470/%E7%89%B9%E6%AE%8A%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%AF%E3%83%A9%E3%82%B9%E5%9B%BA%E6%9C%89%E3%81%AE%E9%9D%99%E7%9A%84%E3%83%A1%E3%83%B3%E3%83%90%E3%81%AE%E5%AE%A3%E8%A8%80%E6%96%B9%E6%B3%95)で初めて気づいた。回答者様、ありがとうございます。


### 部分的特殊化したクラス内の静的メンバ
同じ特殊化でも、部分的特殊化の場合には、また変わってくる。

```cpp:partial_specialization_static_value.hpp
template<typename A>
class Hoge{
};
template<typename A>
class Hoge<A*>{
    static int Value;
};
template<typename A>
int Hoge<A*>::Value=0;
```
部分特殊化したクラスで宣言した変数の実体は、まだtemplate依存なので、通常のtemplateクラス同様、template宣言`template<typename A>`とともに**ヘッダファイル**内に静的メンバ変数の実体を記述する。

### ネストされたtemplateの静的メンバ
templateが複数ネストされている場合も少しややこしい。

```cpp:nested_template_static_value.hpp
template<typename A>
class Hoge{
    template<typename B>
    class Fuga{
        static int Value;
    };
};
template<typename A>
template<typename B>
int Hoge<A>::Fuga<B>::Value=0;
```
templateがネストされている場合、変数の実体宣言時には、template宣言`template<typename ???>`を必要なだけ重ねることで宣言できる。

### 結論
非templateクラスや、templateの明示的特殊化クラス内の静的メンバ変数 
=> template宣言なしで、ソースに実体を用意

templateクラスや、templateの部分特殊化クラス内の静的メンバ変数 
=> template宣言とともにヘッダで実体を用意

templateクラスがネストされている場合 
=> 必要なだけtamplate宣言を重ねて、ヘッダに実体を用意
文章の書き方をプロ並みにする文章作成ツール5選



自分自身へのメモです。同僚が記事を書くのにいろいろなツールを探してくれたので、防備録としてのこしておきます。

追記　コメントでご指摘あった「文章の問題点を見つける」のリンクは無効になっています。

## ツール
１：誤字脱字、変換ミスのエラーをチェックできる
http://enno.jp/
~~２：文章の問題点を見つける~~
~~https://www.japaneseproofreader.com/~~
３：日本語テキストの難易度を測る
http://kotoba.nuee.nagoya-u.ac.jp/sc/obi3/
４：全体構成を見てくれる
http://www.ennach.sakura.ne.jp/
５：プレスリリース作成のたたき台を3分で作る
http://www.value-press.com/tool_3minutes

## その他参考
qiitaの以下の記事も参考にしてみてください。
[技術的な文章を書くための第0歩 ～読者に伝わる書き方～](http://qiita.com/mhidaka/items/c5fe729716c640b50ff7)

[技術的な文章を書くための1歩、2歩、3歩](http://qiita.com/vvakame/items/d657baf26cf83ac98bd0)
勉強会レポート 〜Cocos2d-x Talks #1〜

# 勉強会レポート

<b>Cocos2d-x Talks #1 
「Cocos2d-xおよび関連サービスについて」
「Cocos2d-x ver3系への移行とメリット」</b>

## Cocos2d-x v3系への移行とメリット

* C++11に対応
* WebViewがNodeに対応

<b>■コールバックがC++のラムダ式に</b>

* std::function
* ボタンタッチイベント時のコールバックにメソッドを作らなくても良い

<b>■タッチイベントの優先度が見た目と一致</b>

* NodeのZオーダーがタッチイベントの優先度になった
 * v2は表示優先度は別指定

<b>■std::stringが基本に</b>

* str.c_str()とか使う必要ない

<b>■64Bitに対応</b>

* v2も対応
* v2がいつまでも優遇されるか分からない

<b>■FreeTypeFontでレンダリング</b>

* OS間で見た目が同じ

<b>■C++への歩みより</b>

* CCプレフィックスが削除
* メソッド引数へのconst付加
* CCArray, CCDictionaryは使わない
 * 変わりに、Cocos STLを使う（vector, map..）
 * 参照カウンタについては前と同じ

## v2からv3への移行の実際

<b>■全般</b>

* おおむねインターフェイスは同じ（typedefしてある）
* 置換でおおむねいける　
* 警告はおおむね置換で消せる
* CocosStudioデータはそのまま使える
* 定数の宣言の変更も置換でいける

<b>■ラベルのレンダリング</b>

* FreeTypeなので絵文字は出ない
* iOSでシステムフォント使うと空白がうまく表示出来ない
* シャドーはまだ怪しい

<b>■タッチイベントの処理</b>

* タッチイベントディスパッチャーがいなくなった
* LayerのonTouchBeganのオーバーライドも警告出るが動く
* タッチ優先度は後から変更出来ない
* 見た目と一致していれば変更する必要はない
* ちゃんと書き直すなら、イベントディスパッチャーにタッチイベントのハンドラ登録
kintoneでテーブルの各行に連番をつける

###課題
kintoneでシステムを作っていると、項目をまとめてテーブル化することがよくあります。
このとき、テーブルの各行に1行目から順に連番をつけたいということはよくあると思います。

kintoneの標準の機能ではこれはできないため、JavaScriptでのカスタマイズが必要です。
###JavaScriptカスタマイズ
フィールドコード「receipts」というテーブルの中にフィールドコード「no」というフィールドがあるとします。
このフィールドに対して保存のタイミングで連番を付与します。

まず、作成時の編集時のイベントを取得するために、`kintone.events.on()`でイベントハンドラを登録します。

イベントハンドラの中では、`event`に含まれる`record`オブジェクトを取得し、そこに含まれる`receipts`テーブルの`value`の数を数えておきます。これが行数になります。

あとは、ループを回しながら各行の`no`の`value`に連番を設定していきます。

コードは以下のようになります。

```Javascript
(function() {
    "use strict";
    var events = [
        'app.record.create.submit',
        'app.record.edit.submit'
    ];
    kintone.events.on(events, function(event) {
        var record = event.record;
        // receiptsテーブルのno欄を自動採番する
        var count = record.receipts.value.length;
        for( var i = 0; i < count; i++ ){
            record.receipts.value[i].value.no.value = i + 1;
        }
        
        return event;
    });    
})();
```

簡単ですね。
Docker + Google Container Engine でドカドカ負荷テスト

## まずは結論

こんな環境が Google Container Engine 上に一発で作れるスクリプトとDocker Imageを作った。

https://github.com/hakobera/docker-locust-gke

![overview](https://qiita-image-store.s3.amazonaws.com/0/25774/7b0bd728-ee19-2d0e-cb04-a98bdaa792e3.png)

## 要素技術

### Locust

http://locust.io/

Python製OSSの負荷テストツール。分散テストモードがあって、簡単に複数台から負荷をかけるクラスタを構築することができる。今回は、[環境変数で master, slave を切り替えられる Docker Image](https://registry.hub.docker.com/u/hakobera/locust/) をベースにしている。

### Docker Private Registry

[Google Container Engine で private repository を利用する方法](http://qiita.com/hakobera/items/8af926be34bbe4ee428d)を参照してください。

## 使い方

### 事前準備 

- ビルドサーバに gcloud SDK をインストールし、認証が終わっていること
- gcloud コマンドでデフォルトの GCP の PROJECT_ID が設定してあること（下記のコマンドでは --projectId オプションを全て省略しているため）
- GCS に Docker registry 用のバケットを作成していること

### テストシナリオの準備

https://github.com/hakobera/docker-locust-gke

上記のリポジトリを clone（または fork） して、test/locustfile.py を書き換えて、テストユーザの作成やテストデータ（DB)の作成処理なども必要に応じて追加します。

### Docker Image の build & push

IMAGE_ID と GCS_BUCKET を設定して、`./script/cluster push` するだけ。

```
$ IMAGE_ID=locust-gke \
  GCS_BUCKET=<your-bucket> \
  ./script/cluster push
```

### 共通の環境変数の設定

クラスタ名と作成する GCP の zone を設定します。

```
$ export GKE_CLUSTER=<your-cluster>
$ export GKE_ZONE=<your-zone>
```

なお余談ですが、現状、Google Container Engine は region はもとより、zone もまたげないので、multi region とかやりたい場合は、cluster を複数作る必要があります。

### Google Container Engine 上に cluster を構築

```
$ IMAGE_ID=locust-gke \
  GCS_BUCKET=<your-bucket> \
  GKE_NETWORK=<your-network> ]
  TARGET_URL=<your-load-test-target-url> \
  LOCUST_SLAVE_COUNT=3 \
  ./script/cluster start
```

`LOCUST_SLAVE_COUNT` で負荷をかける側のサーバを増減させることができます。


作成が完了したら、kubernetes の web console を開いて、pod/service の配置を確認しましょう。残念ながら現状 SSL の警告がでます。きちんと確認した上で開きましょう。

```
$ ./script/cluster open-kubernetes
```

![kubernetes.png](https://qiita-image-store.s3.amazonaws.com/0/25774/d8e5366e-a6dd-aab8-8cb9-5f37716cc4d8.png)

podの名前がGUIDになっているやつがslaveです。

なお、現状 open-X 系のコマンドはMac OS X でしか動きません。すみません。

### Locust Web コンソールを開く

```
$ ./script/cluster open-locust
```

ちゃんと `SLAVES 3` で起動していますね。

![スクリーンショット 2015-01-14 10.08.39.png](https://qiita-image-store.s3.amazonaws.com/0/25774/ebedb3c8-d114-1f81-fd1f-c57681878702.png)

### 後片付け

負荷テストが終わったら、cluster を停止して終了です。

```
$ ./script/cluster stop
```

## この環境を作った動機

この構成、もともと AWS CLI + ansible で AWS上で実現していた環境を移植したものです。AWS でも負荷テストという意味では実現できていたのですが、以下の問題がありました。概ね解決できたと思います。

### ネットワーク帯域がサチる

負荷をかける側はCPU/メモリはそんなに利用しないので、小さいインスタンスを利用したいが、EC2はインスタンスが小さいとネットワーク帯域もせまいので、そこで負荷がかけきれない問題があった。結局大きいインスタンスを利用していたけど、コスト的になんとかしたいという思いがあった。

GKEというか、GCE はネットワークがインスタンスサイズに依存しない（してるかもしれないけど、小さいインスタンスでも同等サイズの AWS EC2 よりネットワークが速い）ので、ネットワーク帯域を大量に使用する負荷テストには向いてると思いました。

### 起動速度が遅い

どうしても EC2 のインスタンスの起動は時間がかかり、更に ansible も流さないといけないので、複数パターンでテストする場合、どうしても時間がかかってイライラすることもあったのですが、GKEはGCEのインスタンスの起動が速いのと、Docker Imageで構築済みの環境をすぐに立ち上げることができるので、快適でした。Docker Image の build も初回以外は速いですし。

## 感想

GKE(Google Container Engine)はベータということもあり、実運用で使うにはまだ怖いですが、内部でテストなどで使う分にはとても便利だと思いました。
Sublime Textを使う時に入れておくといいプラグイン

参考
http://www.qript.co.jp/blog/technique/1965/
![kobito.1421195297.315148.png](https://qiita-image-store.s3.amazonaws.com/0/59354/f1602b35-5e3e-eb6a-df71-8eeec446b3d6.png "kobito.1421195297.315148.png")

今回はSublime Textを使うんだったら入れとくといいプラグインをまとめてみました。
※私が今入れているプラグインだけをまとめました。

1)Emmet　...Zen coding的なもの。

！と入力してcontrol + E を押すと。

![スクリーンショット 2015-01-14 9.32.08.png](https://qiita-image-store.s3.amazonaws.com/0/59354/e5b3f9ab-27a3-094f-eb77-c23bcfc8257d.png "スクリーンショット 2015-01-14 9.32.08.png")

という風にHTML5のひな形を一気に展開してくれます。
チートシートがあるので活用しつつ徐々になれていくといいと思います。
CSSはまた別に便利なプラグインがあったりします。

チートシート
http://docs.emmet.io/cheat-sheet/

2)Hayaku　...CSSの入力をスピーディーにする。

たとえば、oh と打ってtabを打つだけで　overflow: hidden;　が展開されます。
Emmetとの共用したい場合ショートカットがかぶるので、
Preference > Package Settings > Emmet > Setting – User から設定から、↓下記コード記述して、変更しておきましょう。
{
    // TABキーによる展開を対象の言語（ファイル）のときに無効化する
    "disable_tab_abbreviations_for_scopes": "css,less,sass,scss,stylus"
}

3)AutoFileNeme　...画像ファイル保管機能。

画像ファイル名や、CSSの文字色、背景色、カラー値、画像の変更などをしてくれます。
img　と入力し　tabキー　を押します。
選択した画像のheightとWidthが自動補完されます。

4)BoundKeys　...パッケージのショートカットを一覧表示。

いろいろパッケージをいれていくと、ショートカットがかぶってて使えない事もでてきます。
そんな時に入れておくといいと思います。

5)Nettuts + Fetch　...フレームワークを素早くいれる。

よく使うjQueryやリセット用のCSS、フレームワーク、Wordpress等のCMS等をあらかじめ設定しておくことで、コマンド素早くでダウンロード・展開してくれます。

6)SideBarEnhancements　...サイトバーメニュー拡張

サイドバー右クリックのメニューを拡張するプラグインです。
デフォルトではファイル名変更、削除、フォルダを開くしかないですが、
これを入れるとコピー、複製、移動、検索、プロジェクトの設定などができるようになります。

7)SublimeLinter　...リアルタイムでコードの構文チェック。

問題があった箇所をハイライトしてくれます。
言語ごとに別途Linterもインストールする必要があります。
Macでログローテートしたい


最初から入ってるnewsyslogを使うのが簡単そうだったので、やってみたメモ。

## 設定ファイルの場所
newsyslog.confは特にいじらず、newsyslog.d配下に適当な名前でconfを作成する

`/etc/newsyslog.conf`
`/etc/newsyslog.d/`

## 設定ファイルに書いてみた

詳しいことは[リファレンス](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man5/newsyslog.conf.5.html)を読もう

```
# logfilename          [owner:group]    mode count size when  flags [/pid_file] [sig_num]
/var/log/nginx/*.log                       640  5     1024 *     GJ
```

## テスト
`$sudo newsyslog -nv`

## 実行
`$ sudo newsyslog`

たぶんok
インストール済みPerlのconfigureオプションの確認方法

1. perlコマンドの-Vオプションを使用

    ```bash
    perl -V:config_args
    ```
    - 出力に`config_args=''`が付くことに注意

2. perlコマンドからPerlのConfigモジュールを使用

    ```bash
    perl -MConfig -le 'print $Config{config_args}'
    ```
CreateProcessのメモ

○CreateProcessの挙動

起動しなかった場合は、偽の値が帰ってくる。
第2引数に実行ファイル名も含めて、子マインドラインを記述する。
この場合、パスが通っているファイルを参照してくれるので、フルパスを書かなくてよい。
→この場合の起動がおかしいので、後日調査が必要

○エラーの取得
起動に失敗したら
GetLastError()
でエラーを取得。ただし、事前に(CreateProcess)を呼び出す前に
SetLastError(0);
で初期化しておくこと。
ただし、CreateProcessが成功した場合でも、なんらかのエラー番号が入っているような挙動を示していた。

○後日もうちょっとまとめるけど
CreateProcessの起動がうまくいってもエラーのような挙動があったり（俺の勘違い化も）、起動が成功してもエラー番号が入っていたりするので、全体的な挙動は謎（regsrv32を立ち上げた時が面白く、203エラーが入っていた）。

ソースコードも含めた挙動に関しては、後日再度まとめる予定
genymotion-pecoを使ってみようとして、ちょっと変更した


https://github.com/sys1yagi/genymotion-peco


クックパッドの以下のブログで紹介されていて、
genymotionをコマンドラインから起動させるようにしたもの。

http://techlife.cookpad.com/entry/2014/12/17/182050


仕組みとしては、

```sh
VBoxManage list vms | peco
```

これでvirtual boxの一覧の表示させて、pecoでいい感じに選択して、

```sh
/Applications/Genymotion.app/Contents/MacOS/player --vm-name "Google Galaxy Nexus - 4.3 - API 18 - 720x1280"
```

みたいな感じでコマンドラインから実行するというもの。


-------------


しかし、僕は普段zshを使ってるから？正規表現の部分が上手く動きませんでした。。。


なので、`source`コマンドで読み込むのではなくて、
`~/bin`ディレクトリに置いて動かす事ようにしました。

```
$ cd ~/bin
$ vim genymotion_peco
```

```bash
#!/bin/sh

if [ -z "$GENYMOTION_APP_HOME" ]; then
echo "GENYMOTION_APP_HOME is empty. Use '/Applications/Genymotion.app/' instead this time."
player="/Applications/Genymotion.app/Contents/MacOS/player"
else
player="$GENYMOTION_APP_HOME/Contents/MacOS/player"
fi

vm_name=`VBoxManage list vms | peco`
if [[ $vm_name =~ ^\"(.+)\".* ]] ; then
 name=${BASH_REMATCH[1]}
 echo "boot $name"
 $player --vm-name "$name" &
fi
```

```sh
$ chmod +x genymotion_peco
```

実行権限をつけるのを忘れずに。これでまた少し楽になったー
Sublime便利なコマンド集


Macで使えるSublime Textコマンド集をまとめてみました
参考URL
http://www.buildinsider.net/small/sublimetext/02
![アップロードに失敗しました スクリーンショット 2015-01-13 10.34.57.png: 月間のアップロード上限を超えています]()

1.選択の拡張（Expand Selection）
Sublime Textに触れる際に、必ずと言っていいほど特徴として挙げられるのが、Expand Selectionでる。同じ文字列を素早く複数選択し、同時に編集が行える。
ショートカットは(Command + D )。

選択拡張（Expand Selection）でのTips
・一つおきに編集した場合は、(Command + K)で選択がスキップできる。
・(Command + D)を入力しすぎて、想定より多く選択してしまった場合は、(Command + U)で選択をUndo(前に戻す)できる。
ちなみに、(Command + U)は、(Command + Z)ではUndoできないものをサポートしているので、例えば複数行選択でキーを押しすぎた場合などでも利用できる。


2.マウスを利用した選択
キーボード操作だけでなく、マウスを利用した選択の拡張も行える。
・(Commandキーを押しながら文字列をドラッグ。)
　　複数の選択範囲を指定できる。同時編集も可能
・(Optionキーを押しながら文字列をドラッグ。)
　　短形選択。行ごとにキャレットが存在するので同時に複数行の変数が行える


3.複数行の選択
Split into Linesという機能を利用すると、複数行を選択した状態から各行を複数選択した状態に切り替えることができる。
ショートカットは(Command + Shift + L)。


4.ファイル内の検索機能
(Command + F)で、ウィンドウの下部に検索のボックスが表示される。検索ボックス内のボタンは左から、
・正規表現を利用する
・大文字・小文字を区別する
・完全一致のみを検索する
・最後まで検索した場合、ファイルの先頭から検索する
・選択範囲内を検索する
・検索文字列にマッチした箇所をハイライトする
という機能を有している。検索ボックス右のFind Allはマッチする文字列をすべて複数選択した状態にする。これは拡張選択と同様に同時編集ができる。


5.複数ファイルを対象にした検索
複数ファイルからの検索機能を備えている、Find in Filesという機能名で提供されており、(Command + Shift + Fキー)で、ウィンドウの下部に検索ボックスが表示される。

表示されるボタンの機能

・正規表現を利用する
・大文字小文字を区別する
・完全一致のみを検索する
・合致部分の前後の行を表示する
・検索結果を別ファイルで表示する

　縦に3つ存在する入力フィールドのうち、2段目のWhereが、検索対象の指定箇所になる。複数のフォルダーの指定など、詳細な指定が可能。置換を行う場合は3段目のReplaceに語句を入力する。


6.Goto　Line
ソースコードや文書が長くなると、編集対象や参照にする部分へのアクセスがやりにくくなる。Sublime Textでは、その辺りのサポートをGotoという名称で提供している。

指定した行数に移動する(Command + G)。


7.Goto Symbol
プログラムのソースコードでの（JavaScriptなどの）functionや、CSSのセレクターなどをシンボルとして検索し、指定した箇所まで移動する。

　そのシンボルは、言語によってさまざまなものをピックアップする。例えばMarkdown文書では見出しのリストが対象となる（CtrlWin／CommandMac＋Rキー）。


8.Goto Anything
　開いているフォルダーからファイルを検索する（CtrlWin／CommandMac＋Pキー）それだけではなく、先頭に記号を入力すると下記の機能が利用できるようになる。

・:　→　Goto Lineを利用する
・@　→　Goto Symbolを利用する
・#　→　ファイル内検索が利用できる。他の検索機能とは違い、入力に対する候補一覧が表示される。
Github内の過去のバージョンを取得する方法

Github内の過去のバージョンを取得したときのメモ

#①過去のバージョンを取得したいレポジトリをローカルにCloneする
>$ git clone git://github.com/XXXXXXXXXXXXXX

#②過去のバージョンに巻き戻す

##・Githubから任意のバージョンのSHAを取得する
![スクリーンショット 2015-01-14 9.03.47.png](https://qiita-image-store.s3.amazonaws.com/0/48577/7f3f0219-23d9-c622-4f03-94b4622b70c8.png)

##・過去のバージョンに戻す
>$ git checkout [SHA]

例：
>$ git checkout 6c11982f991bf5981716852e57843783e9a37a1
CircleCIでgoverallsする


# 前提
- GitHubにGoのソースコードがある
- coveralls登録済み
- CircleCI登録済み

# GitHubでの作業

今回はCircleCI側のWebコンソール上で設定するので、`circle.yml`は不要です。

# Coverallsでの作業

*※特筆すべきことは無いので省略*

# CircleCIでの作業

`Project Settings`を開きます

## Environment variables

`COVERALLS_TOKEN = XXXXXXXXXX`

※XXXXXXXXXXは[coveralls](https://coveralls.io)で登録したTOKEN

![スクリーンショット 2015-01-14 8.44.01.png](https://qiita-image-store.s3.amazonaws.com/0/40887/b5f63b9c-753b-fb83-90fc-e64ad1068598.png "スクリーンショット 2015-01-14 8.44.01.png")


## Test commands

今回の例は、`github.com/kyokomi/go-docomo`プロジェクトの`github.com/kyokomi/go-docomo/docomo`をtestしたいので以下のような設定になる。（最後の行の`./docomo`）

```bash
go get github.com/axw/gocov/gocov
go get github.com/mattn/goveralls
mkdir -p $HOME/.go_workspace/src/_/home/ubuntu/
ln -s $HOME/$CIRCLE_PROJECT_REPONAME $HOME/.go_workspace/src/_/home/ubuntu/
goveralls -v -service=circle-ci -repotoken $COVERALLS_TOKEN ./docomo
```

`$CIRCLE_PROJECT_REPONAME`はCircleCIでデフォルトで登録されてる環境変数。
今回のプロジェクト（`github.com/kyokomi/go-docomo`）の場合、`go-docomo`が取得できる。

![スクリーンショット 2015-01-14 8.44.12.png](https://qiita-image-store.s3.amazonaws.com/0/40887/3ec89ad9-2404-aa25-1357-dbbeb073ca60.png "スクリーンショット 2015-01-14 8.44.12.png")

~~シンボリック芸でバッドノウハウっぽいけど...一応これでgoverallsが通る。~~

**※2015/02/22追記: シンボリックリンク芸は、リポジトリのrootディレクトリにGoのソースがなくてCircleCIがGoプロジェクトとして認識しない場合のみ必要**

## Build実行

無事にbuild成功しました。

![スクリーンショット 2015-01-14 8.44.32.png](https://qiita-image-store.s3.amazonaws.com/0/40887/3a0e74b7-f34a-ec74-1f0f-3603019a331f.png "スクリーンショット 2015-01-14 8.44.32.png")

# おわり
CircleCIは`$enable ssh`を有効にするとbuild時にsshでサーバーに入って色々見たりコマンド打ったりできるので、大抵なんとかなる感じが良いですね。
ローカル環境のPostgresのDB内のデータをcsvで取得する

ローカル環境のPostgresデータベース内のデータをcsvで取得したときのメモです。


> \$ psql [データベース名] -c "select * from [取得したいテーブル名];" -A -F, | sed '$d' > [ファイル名.csv]


例：
> \$ psql combinator_development -c "select * from projects;" -A -F, | sed '$d' > projects.csv

確認するとprojects.csvがディレクトリに出来ていることが分かります。

>$ ls
gulpでwebAPIを備えた仮サーバを立てる


## 問題提起

最近はSinglePageApplicationが流行っているような気がします。
個人的は、SPAの特徴として

- ServerSideとClientSideを切り離して開発できる。
- 動作がブラウザ側で行われるので、サーバーの処理・通信が減る。
- ClientSideの設計がちょっと難しくなる。

といった感じで、今からWebアプリを作るならSPAにしない理由はないかなと思っています。

さて、その場合にClientSideだけで仮サーバーを立てて動作検証したいですよね。
webAPIとかのモックも用意したいですよね。

ということで、gulpで仮サーバーを立てるサンプルを用意してみました。

## 構成

```
$ tree .
.
├── ajax.js
├── gulpfile.js
├── index.html
├── package.json
└── webAPI
    └── sample_get.json
```

### package.json

```json:package.json
{
  "name": "gulp_devServer_sample",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "author": "uryyyyyyy",
  "license": "MIT",
  "devDependencies": {
    "gulp": "~3.8.10",
    "gulp-webserver": "~0.9.0",
    "easymock": "~0.2.9"
  }
}
```

- gulp-webserver
  - 静的ファイルサーバを起動する。
  - `python simplehttpserver`みたいなもんだと思ってる。
- easymock
  - APIサーバを立てる。
  - リクエストがファイル名に一致したデータを返す。詳しくは後述

### gulpfile.js

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

gulp.task('easymock', function () {
    var MockServer = require('easymock').MockServer;
    var options = {
        keepalive: true,
        port: 3000,
        path: './webAPI',
    };
    var server = new MockServer(options);
    server.start();
});

gulp.task('devServer', ['easymock'], function() {
    var webserver = require('gulp-webserver');
    gulp.src('./')
    .pipe(webserver({
        livereload: false,
        directoryListing: false,
        open: false,
        proxies: [{
            source: '/webAPI',
            target: 'http://localhost:3000/'
        }]
    }));
});
```

- easymockタスク
  - webAPIサーバを立てる。
  - 今回の例だと`localhost:3000`で、`webAPI`フォルダを対象にする。
- devServerタスク
  - easymockタスク後に実行される。
  - `./`フォルダを対象にして起動する。
  - `webAPI`パスへのアクセスを`localhost:3000`へ中継するリバースプロキシも用意する。。

### index.html / ajax.js

```html:index.html
<html>
<head>
<meta charset="utf-8">
</head>
<body>
</body>
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="./ajax.js"></script>
</html>
```

```js:ajax.js
$.ajax({
   type: "GET",
   url: "webAPI/sample",
   success: function(res){
     alert( "ajax success!: " + res.msg );
   }
});
```

説明は不要。最小サンプル

### webAPI

easymockの対象フォルダ。

```json:sample_get.json
{"msg": "Hello, World!"}
```

easymockは、「[リクエストパス]_[リクエストタイプ]」でマッチングするらしく、
`sample_get.json`だと、`/sample`へのGETでのアクセスにこのjsonデータを返すという意味になる。



## 起動してみる

事前に

- `npm install gulp -g`
- `npm install`

されていること。

`gulp devServer`と叩いて、`http://localhost:8000/`を見る。

alertでHello worldが表示されていれば成功。

developers toolを見ても、ちゃんと通信があったことがわかる。

ついでに、`http://localhost:3000/sample`と打ってもjsonが返ってくることが確認できる。
Macで　GLUT + OpenGL のんびりいこう#7 Rolate Cube

#前提
Mac OSX 10.7.5
Developer Tool

#目標
Cubeを回転させる。

#Glangle.cpp
```cpp:Glangle.cpp
#include <GLUT/glut.h>

#define WIDTH 640
#define HEIGHT 480

//回転用
float angle = 0.0f;

//cubeの色
GLfloat green[] = { 0.0, 1.0, 0.0, 1.0};
float Radius=80.0f;

//3つのベクトル
struct Vector3f{
	float x;
	float y;
	float z;
}vec3d;


void Line3D(float x1,float y1,float z1,float x2,float y2,float z2){
//線幅
	glLineWidth(1.0);
//線
	glBegin(GL_LINES);
	glVertex3f(x1,y1,z1);
	glVertex3f(x2,y2,z2);
	glEnd();
}

void DrawMeasure(int measure,float size){
	glDisable(GL_LIGHTING);
	glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
	for(int x=0;x<=measure;x++){Line3D(x*size-(size*measure/2),0,-(size*measure/2),x*size-(size*measure/2),0,measure*size-(size*measure/2));}
	for(int y=0;y<=measure;y++){Line3D(-(size*measure/2),0,y*size-(size*measure/2),measure*size-(size*measure/2),0,y*size-(size*measure/2));}
	glDisable(GL_DEPTH_TEST);
	glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
	Line3D(0,0,0,(measure/2+2)*size,0,0);
	glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
	Line3D(0,0,0,0,(measure/2+2)*size,0);
	glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
	Line3D(0,0,0,0,0,(measure/2+2)*size);
	glEnable(GL_LIGHTING);
	glEnable(GL_DEPTH_TEST);
}

void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glViewport(0, 0, WIDTH, HEIGHT);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	gluPerspective(30.0, (double)WIDTH / (double)HEIGHT, 1.0, 5000.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	gluLookAt(0.0,800.0,800.0,
	  0.0,0.0,0.0,
	 0.0,1.0,0.0);

	glColor3f(1,1,1);
	DrawMeasure(16,40);

	glMaterialfv(GL_FRONT, GL_DIFFUSE, green);
	glRotatef(angle,vec3d.x,vec3d.y,vec3d.z);

	glutSolidCube(80.0);

	glutSwapBuffers();
}
void idle(void)
{
	angle+=2.0f;
	//Sleep(1);
	glutPostRedisplay();
}
void Init(){
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	//任意軸のベクトルを設定
	vec3d.x=45.0f;
	vec3d.y=90.0f;
	vec3d.z=0.0f;
}
int main(int argc, char *argv[])
{
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(WIDTH, HEIGHT);
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
	glutCreateWindow("Rotate Cube");
	glutDisplayFunc(display);
	glutIdleFunc(idle);
	Init();
	glutMainLoop();
	return 0;
}
```

#コンパイル
framework指定が要点です。
g++ -o Glangle Glangle.cpp -framework GLUT -framework OpenGL

#Result
![スクリーンショット 2015-01-14 7.07.06.png](https://qiita-image-store.s3.amazonaws.com/0/33317/5e074136-b952-c771-5782-15e91d9726fa.png "スクリーンショット 2015-01-14 7.07.06.png")

#保守用履歴
今の環境でも確認できたので安心。
【必須ツール】Xcodeシミュレータのディレクトリを簡単に開く

# はじめに
Xcode6のシミュレータのディレクトリへの簡単な到達方法です。

SimPholders2という非常に便利なツールがあったのですがYosemiteになってから動作しなくて困っていました。

が、Tue Nguyen氏が作ってくれたツールがありました！
2015年1月現在、Xcode6限定です。

# SimulatorManager
https://github.com/tue-savvy/SimulatorManager

こちらのソースをダウンロードし
SimulatorManager.xcodeprojからプロジェクトを開き実行。
メニューバーにアイコンが表示されます。

「Launch At Login」のチェックを付けておくと次回以降自動で起動してくれて便利です。

![スクリーンショット 2015-01-14 5.29.47.png](https://qiita-image-store.s3.amazonaws.com/0/63205/4e3db6d5-a7e4-f645-d453-00cedf76a118.png)

# おわりに
これなしでは不便過ぎる！という程に感じています。
何かの参考になりましたら幸いです。

# 参考
Xcode6でのシミュレータ実行ディレクトリパス:
/Users/[User]/Library/Developer/CoreSimulator/Devices/[DeviceID]/data/Containers/Data/Application/[App]
cronの代替になりそうなジョブ管理ツールのまとめ


たまに検討するけど、よく忘れるのでまとめておく。ごく個人的な感想としては、Rundeck, Azkabanあたりで始めてみるのがいいかもと思う。

要件
-------------

* 重複実行の防止
* ジョブの実行結果、かかった時間、ログ出力などが見れる
* 失敗時の通知

候補
-----------

### OSS系

#### Rundeck

* http://rundeck.org/
* Java Runtimeで動く
* RUNDECK PROという有料サービスもある http://simplifyops.com/
* 参考: http://heartbeats.jp/hbblog/2015/01/rundeck.html

#### Oozie

* http://oozie.apache.org/
* Workflow Scheduler for Hadoop
* Java
* http://oozie.apache.org/docs/4.1.0/DG_Overview.html
* Webコンソールもあるみたい

#### Luigi

* https://github.com/spotify/luigi
* Built at Spotify
* Pythonで動く Downloading and running `python setup.py install`
* CUIベースで触るっぽい感じ？

#### Azkaban

* https://azkaban.github.io/
* created at LinkedIn to run Hadoop jobs
* Java Runtimeで動く
* きれいなweb UI
* soloモードだと、マネージャーもExcetorもDB (H2)も全部入りなので1サーバーだけで動く

#### Jenkins

* Jenkinsで実行まで行う
* cronの実行結果だけ受け取るのもあるけど、重複実行を防げない
* 分散実行したい場合はJenkinsのスレーブ管理機能を使う
* バッチサーバーでJenkinsを動かしたくないなら工夫が必要
  * curlで叩いてタイムアウトとか間抜け
* SaaSがよければ https://www.cloudbees.com/

#### Hinemos

* http://www.hinemos.info/hinemos/
* NTTデータの作ってるやつ
* 監視もできるジョブ管理ツールらしい
  * そういう解釈ならZabbixもジョブ管理ツールになりうる

#### Chronos

* http://airbnb.github.io/chronos/
* AirBnbで作ってる
* Mesosの上で動く
* 分散環境で有効そう

#### airflow

* [airbnb/airflow · GitHub](https://github.com/airbnb/airflow)
* [Airflow’s Documentation — Airflow 1.0.0 documentation](http://pythonhosted.org/airflow/)
* データパイプライン処理ツールという定義だけどどこが使いどころかまだわかってない
* Python 2系で動く
* Pythonで設定書く
* リッチなWeb UIあり

#### HTCondor

* http://research.cs.wisc.edu/htcondor/
* 大規模環境向け？ジョブマネージャー
  * 単なるジョブスケジューラーとしても使えるみたいだけど
* 30年くらい歴史ある

### 商用系

#### JP1

* http://www.hitachi.co.jp/Prod/comp/soft1/jp1/
* 商用
* 業務システムでは定番らしいけどよく知らない

#### Tivoli

* http://www-01.ibm.com/software/tivoli/
* 商用
* IBMファミリーの製品
* よく知らない

#### jamsscheduler

* http://www.jamsscheduler.com/
* よく知らない

#### A-Auto

* よく知らない

#### Systemwalker Operation Manager

* 富士通

### 参考

http://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%A7%E3%83%96%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」記事一覧

# 記事一覧

## チュートリアル

[チュートリアル動画](https://www.youtube.com/watch?v=GS35xIIf9DY)

[チュートリアル（１）導入編](http://qiita.com/digitarhythm/items/e6a06e87d920100a0d08)
[チュートリアル（２）キャラクターアニメーション](http://qiita.com/digitarhythm/items/8f10b85be5926d9582fd)
[チュートリアル（３）動作を定義する](http://qiita.com/digitarhythm/items/38e4263ff1f0bc1b2f74)
[チュートリアル（４）キャラクターを操作する](http://qiita.com/digitarhythm/items/2df821c91e2e0a33ab19)
[チュートリアル（５）弾を発射](http://qiita.com/digitarhythm/items/e37d25e2abafd9db55e7)
[チュートリアル（６）ジャンプさせる](http://qiita.com/digitarhythm/items/33f53aa8c4de119b491a)
[チュートリアル（７）敵を出す](http://qiita.com/digitarhythm/items/58422db419d00bd6ae74)
[チュートリアル（８）弾の数を制限する](http://qiita.com/digitarhythm/items/aff4f6c8e1d353381e17)
[チュートリアル（９）タイトル画面を作る](http://qiita.com/digitarhythm/items/1cd10eb34b69d585992f)
[チュートリアル（１０）敵の爆発を作る](http://qiita.com/digitarhythm/items/ec2ddf65496b0d536d0d)
[チュートリアル（１１）物理演算スプライトを使う](http://qiita.com/digitarhythm/items/382b836788c84eaf58f4)
[チュートリアル（１２）Map機能を使う](http://qiita.com/digitarhythm/items/79b8c39c491ed66106cb)
[チュートリアル（１３）開発モードと静的モード](http://qiita.com/digitarhythm/items/60b6df311fcb34d6752e)
[チュートリアル（１４）モバイル対応](http://qiita.com/digitarhythm/items/d61feb5a568b9f5d894b)
[チュートリアル（１５）弾幕を張る](http://qiita.com/digitarhythm/items/42b78d4e8ddbf919fc0d)
[チュートリアル（１６）効果音を再生する](http://qiita.com/digitarhythm/items/2fe074955e4af673ac9c)
[チュートリアル（１７）WebGLモデルを表示する](http://qiita.com/digitarhythm/items/bbb9feb4a6725cb89980)
[チュートリアル（１８）テキストラベルを表示する](http://qiita.com/digitarhythm/items/6e2bbbb80fa4fbb6acda)
[チュートリアル（１９）バーチャルゲームパッド](http://qiita.com/digitarhythm/items/beb7c6f35e76a733d1aa)

## フレームワーク仕様

[waitjob()について](http://qiita.com/digitarhythm/items/217d23f469203823c37b)
[環境設定処理](http://qiita.com/digitarhythm/items/eeae990d244ad3bb6dd7)
[キャラクターの重ね合わせ処理](http://qiita.com/digitarhythm/items/6463083b78d3fb929985)
[システム定数／変数](http://qiita.com/digitarhythm/items/4a31b00a8628ef0de6cc)
[システム関数／メソッド](http://qiita.com/digitarhythm/items/3f2f543d4790b66f8955)
[当たり判定について](http://qiita.com/digitarhythm/items/36ed0d6a0a4e35731695)
[モーションセンサー](http://qiita.com/digitarhythm/items/07de60e3bac3975a1002)
[スプライトサイズについて](http://qiita.com/digitarhythm/items/ee2e95d6f648b557d392)
[物理演算スプライトについて](http://qiita.com/digitarhythm/items/e42a0986d6652007839e)
[WorldViewについて](http://qiita.com/digitarhythm/items/217790a10f9f5305f671)
[ゲームパッド情報を合成](http://qiita.com/digitarhythm/items/df10f9ea597c8e150114)
[タッチイベントの無効化](http://qiita.com/digitarhythm/items/26a4f151a0f5a65bfc0f)
[文字列をグラフィックで表示する](http://qiita.com/digitarhythm/items/b950f3f00cf17ffcc419)
OSRM 原理

OSRMはルート検索エンジンである。Mapbox社のSmart DirectionsもOSRMで駆動されているように見える。 https://www.mapbox.com/blog/smart-directions-with-osrm-graph-model/ 本稿は、https://github.com/Project-OSRM/osrm-backend/wiki/Processing-Flow をもとに、OSRMの原理（特にデータのIO）についてメモしたものである。

Extraction
==
生のOSMデータ（.xml又は.pbf←このレベルで Protocol Bufferをお使いになっていることを再認識）をIntermediate OSRM format(.osrmと.names)に変換する。
つまり、OSMのnode,way構造のデータを与えると、抽出できるのではないだろうか。

Preparation
==
.osrmと.namesのデータを変換し、.hgsr, .edges, .nodes, .ramIndex, .ramFiles ファイルを生成する作業。

Route Server
==
サーバを立ち上げる作業。

TODO
==
あるデータがOSRMで使えるかどうか確認するためには、とりあえず Extractionフェーズまで走らせてみて、.osrmと.namesのデータが生成されるか見ると良いのではないだろうか。
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」チュートリアル（４）キャラクターを操作する

ここでは、「**game01**」というディレクトリ内で作業しているという前提で説明しています。

# キャラクターを移動出来るようにする
次に、カーソルキーとジョイパッド（FirefoxとChrome限定）でキャラクターを移動出来るようにしてみます。
それでは、前回編集した「**bearChara.coffee**」を開き、インスタンスメソッド「**behavior**」を下記のように修正します。

```coffeescript
    behavior:->
        super()
        switch @_processnumber
            when 0
                axes = PADAXES[0]
                @x += axes[HORIZONTAL] * 4
                @y += axes[VERTICAL] * 4
```

上から説明していきます。

```coffeescript
                axes = PADAXES[0]
```
上記の処理は、カーソルキーとジョイパッドの方向キーの状態を取得しています。
配列番号「0」は、カーソルキーと最初に接続したジョイパッドの方向キーの状態を取得しています。
カーソルキーでも、最初に接続したジョイパッドの方向キーでも、どちらを操作しても配列番号「0」に情報が設定されています。

```coffeescript
                @x += axes[HORIZONTAL] * 4
                @y += axes[VERTICAL] * 4
```
上記の処理は、キャラクタのx座標とy座標にカーソルキー／ジョイパッドの情報を四倍して足しています。
カーソルキー／ジョイパッドの情報は、左もしくは上を押した場合は-1、右もしくは下を押した場合は1が返ってくるので、そのまま足してやることで移動させることが出来ます。


[チュートリアル（３）](http://qiita.com/digitarhythm/items/38e4263ff1f0bc1b2f74) <--- ⬛︎ ---> [チュートリアル（５）](http://qiita.com/digitarhythm/items/e37d25e2abafd9db55e7)

---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)
4.6のUIでレスポンシブデザイン（ボタンなどを解像度に合わせて伸縮）

![record20150114.gif](https://qiita-image-store.s3.amazonaws.com/0/57193/183ef558-8658-1d7f-edd2-4e72929a104e.gif)


スマホゲームにはマルチ解像度対応がつきものです。Unityは(Cocos2d-xと比べると)それが面倒な印象がありました。今年はここらへんも地道にクリアしたいものです。

新しいUnityのUI(ugui)に触れてみて、**Panelが縮めばその子のボタンも縮むことが感じ取れました。**

ということは・・・
簡単にレスポンシブデザインが組める？！
と思ったものの中々うまくいかず、調べても全然なく、だいぶハマったのでメモ。

##手順

**① UI > Panel　を配置**

**② Panelの親のCanvasの設定(Canvas Scaler)を以下に**
![スクリーンショット 2015-01-14 2.05.04.png](https://qiita-image-store.s3.amazonaws.com/0/57193/cf5652c2-f78b-cb2a-b337-2c43eb9730fb.png)

**③Panelの設定(Rect Transform)を以下に**
![スクリーンショット 2015-01-14 2.09.45.png](https://qiita-image-store.s3.amazonaws.com/0/57193/c2732a1c-12d5-1605-9652-70afa0304e56.png)


**④あら不思議Panelの子オブジェクトが伸縮するよ**
![record20150114.gif](https://qiita-image-store.s3.amazonaws.com/0/57193/183ef558-8658-1d7f-edd2-4e72929a104e.gif)


##情報ソース
たくさん英語サイトなど回りましたが結局テラシュールウェアさんにお世話になりました。
いっぱいサイトあるのに、なぜかいつもここにたどり着く不思議・・
「uGUIのアスペクト比を固定する（修正版）」
http://tsubakit1.hateblo.jp/entry/2014/12/11/223427
Rails 4.1.x から 4.2.0にアップした際の対応（備忘）

Rails5の足音が聞こえてきた。

Rails4.2へのアップグレード対応事項気づいたところいくつか。
基本的な4.2.0へのUpgradeガイドは[こちら](http://guides.rubyonrails.org/4_2_release_notes.html#upgrading-to-rails-4-2)

##Gem 編

```rb
#Gemfile

# respond_toが外部Gemになった。4.2でrespond_toを使う場合は下記。
gem 'responders', '~> 2.0'

# Ransackでもbranch変更を忘れないように
gem 'ransack', github: 'activerecord-hackery/ransack', branch: 'rails-4.2'

# 1.4.0に結構バグがあるみたい（Rails4.2は直接関係ない）
gem 'database_cleaner', '~> 1.3.0'
```


## Config 編

```rb
# config/environments/ENV.rb

# config.serve_static_assetsから下記に変更
config.serve_static_files = true
```

## Rails Server

```bash
# Rails4.1までと同じようにrails serverをしたい場合（デフォルトではlocalhostを指すようになった）
rails s -b 0.0.0.0
```

## Production
こちらはrails newなどで最初からRails4.2で作った時に生成されるproduction.rbのファイルに関すること。
CSSなどちゃんと読み込ませる時のてっとり早い方法

```bash
RAILS_SERVE_STATIC_FILES=true rails s -b 0.0.0.0
```

今後気づいたら少しずつ追記していこうと思う。
botoでAmazon Kinesisのデータを読み書きする


AWSのリアルタイムデータストリームといえばKinesisということなので、PythonのAWSライブラリ`boto`でこれとしゃべってみる。

- [`boto-kinesis`](http://boto.readthedocs.org/en/latest/ref/kinesis.html?highlight=kinesis#module-boto.kinesis)


例によってDockerを使ってみる。

Dockerである必要はないが、開発環境でミニマムな手順まで試行錯誤するのに便利なので、勉強がてら使ってみている。



### Dockerfile

```Dockerfile:Dockerfile
FROM centos:centos7

RUN yum -y install epel-release
RUN yum -y install python-boto

RUN useradd -m aws

COPY files/* /home/aws/
RUN chown -R aws:aws /home/aws/

USER aws
ENV HOME /home/aws/
WORKDIR $HOME
```

- Pythonモジュール管理は`pyenv`や`virtualenv`などがよいかもしれない。

- `python-boto 2.34.0-4.el7`を含む新しいEPELを思い切ってとりこんだ。
 - CentOS7の最新で入る`python-boto 2.25.0-2.el7.centos`だと、なぜかKinesisは`not found in endpoints`といわれてしまった(importはできる)

### ほかのファイル
コンテナ内で必要になるファイルを`COPY`でコンテナ内にコピーする。

- 解凍が必要なら`ADD`になるが、そうでなければ`COPY`で。
- ボリュームなどを使うほうがよいかも。

```console:
$ tree -a
.
├── Dockerfile
└── files
    ├── .boto
    └── kinesis-sample.py
```

 IAMで発行したクレデンシャル。

```python:.boto
[Credentials]
aws_access_key_id     = YOUR-ACCESS-KEY-ID
aws_secret_access_key = YOUR-SECRET-ACCESS-KEY
```

Kinesisに接続するスクリプト本体。

- ストリームに適当にputしたデータを10秒後にgetする。
- 適当な名前をつけたストリームをAPIもしくはGUIで先に作っておく必要がある。

```python:kinesis-sample.py
from boto import kinesis
import time

stream_name = 'iot'

conn = kinesis.connect_to_region(region_name = "ap-northeast-1")
shard = conn.put_record(
  stream_name,
  data = 'DATA',
  partition_key = 'partition_key'
)
time.sleep(10)

shard_iterator = conn.get_shard_iterator(
  stream_name,
  shard_id                 = shard['ShardId'],
  shard_iterator_type      = 'AT_SEQUENCE_NUMBER',
  starting_sequence_number = shard['SequenceNumber']
)['ShardIterator']

print conn.get_records(shard_iterator)['Records'][0]['Data']
```



### コンテナ作成
`docker attach`だと同一コンテナに対して複数セッション(?)貼れないので`docker exec`を使う。


```console:
$ docker build .
..
Successfully built 4132428e3b84


$ docker run -t -d -i 4132428e3b84 bash
20be91d870f7ce4c0712954689981962af6e92f6aeb23efe1fe3acf31f3e6338
$ docker exec -it 20be91d870f7ce4c0712954689981962af6e92f6aeb23efe1fe3acf31f3e6338 bash


[aws@20be91d870f7 aws]$ ls -a
.  ..  .bash_logout  .bash_profile  .bashrc  .boto  kinesis-sample.py
```

### 動作確認

```console:
[aws@20be91d870f7 aws]$ python kinesis-sample.py 
DATA

```

とりあえず、putしたレコードがとれた。
Node.jsでつくるIoT - Part1: リソース

マイコンボードやハードウェアの制御、CloudIDEやBaaSなどJavaScriptでつくるIoTのエコシステムを調査しています。他にもたくさんの製品やサービスがありますが、まずはリストするところからです。[PubNub](http://www.pubnub.com/)と[Spark Core](https://www.spark.io/)や[Tessel](https://tessel.io/)を使うと何かおもしろいことができそうです。


## マイコンボード

* [Espruino](http://www.espruino.com/)
* [Tessel](https://tessel.io/)
* [Spark Core](https://www.spark.io/)
* [Arduino YUN](http://arduino.cc/en/Main/ArduinoBoardYun)
* [Open Web Board](http://au-fx.kddi.com/)
* [mbed](http://mbed.org/)

## リアルタイム系BaaS

* [PubNub](http://www.pubnub.com/)
* [Realtime.co](http://www.realtime.co/)
* [Xively](https://xively.com/)
* [M2X](https://m2x.att.com/)
* [Carriots](https://www.carriots.com/)
* [Syncano](http://www.syncano.com/)
* [Firebase](http://www.firebase.com/)
* [milkcocoa](https://mlkcca.com/)

## API統合/イベント駆動/マイクロサービス

* [Octoblu](http://octoblu.com/)
* [IFTTT](https://ifttt.com/)
* [Zapier](https://zapier.com/)
* [AWS Lambda](http://aws.amazon.com/jp/lambda/)
* [CloudI](http://cloudi.org/index.html)
* [hook.io](http://hook.io/)

## ロボティクス/ハードウェア制御

* [Cylon.js](http://cylonjs.com/)
* [Johnny-Five](https://github.com/rwaldron/johnny-five)
* [DeviceJS](http://devicejs.org/blog)
* [NodeBots](http://nodebots.io/)
* [NodeCopter](http://www.nodecopter.com/)
* [Robosapien](http://www.wowwee.com/en/products/toys/robots/robotics/robosapiens/robosapien)


## 開発環境 (CloudIDE)

* [Intel XDK Iot Edition](https://software.intel.com/en-us/html5/xdk-iot)
* [Spark Cloud](http://docs.spark.io/api/)
* [Spark Dev](https://github.com/spark/spark-dev)
* [Cloud Pebble](https://cloudpebble.net/)
* [Simply.js](http://simplyjs.io/)
* [Node-RED](https://github.com/node-red/node-red)

## IoTプラットフォーム

JavaScript以外も含めたプラットフォームです。

* [ThingWorx](www.thingworx.com)
* [Zetta](http://www.zettajs.org/)
* [Kaa](http://www.kaaproject.org/)
* [Axeda](http://www.axeda.com/node/818)
* [ioBridge](http://www.iobridge.com/)
* [ThingSpeak](https://thingspeak.com/)
* [iot.eclipse.org](http://iot.eclipse.org/)
RubyMineで環境変数設定が面倒くさい時の方法

最近お試しでRubyMineを使い始めている。（ただ、SublimeText3から完全に移行するまでに至っていない）
RubyMineは.bashrcなどに書いた環境変数を読み込んでくれない。

Googleで検索してみても、プラグインを使ったり、plistを使って追加する方法だったりと面倒くさい。あまりスマートな方法ではないのだが、ymlファイルに環境変数を書いちゃえばいいんじゃね？ということで今は下記でやってる。

```rb
#config/application.rb
ENV.update YAML.load(File.read(File.expand_path('../application.yml', __FILE__)))
```

を追加。ついでに.gitignoreに `/config/application.yml` も追記。


```yaml
# config/application.yml
FOO: 'BAR'
``` 


もっと簡単でスマートな方法はないだろうか・・・
メタ文字まとめ

正規表現で使用する主なメタ文字(それ自体が何らかの固有の意味を持つ記号)をまとめます。

### 文字クラス
「-」はこの範囲に含まれる1文字、「^ - 」はこの範囲以外の1文字を表す。

|構文|説明|
|:-----|:-----|
|[a-z]|小文字のアルファベット中の1文字|
|[^a-z]|小文字のアルファベット以外の1文字|
|[A-Z]|大文字のアルファベット中の1文字|
|[^A-Z]|大文字のアルファベット以外の1文字|
|[a-zA-Z]|アルファベットの中の1文字|
|[^a-zA-Z]|アルファベット以外の1文字|
|[0-9]|数字中の1文字|
|[^0-9]|数字以外の1文字|

### 定義済み文字クラス

|構文|説明|
|:-----|:-----|
|￥d|数字([0-9]と等価)|
|￥D|数字以外([^0-9]と等価)|
|￥s|空白文字|
|￥S|非空白文字|
|￥w|文字([a-zA-Z0-9_]と等価)|
|￥W|文字以外([^a-zA-Z0-9_]と等価)|

### その他

|構文|説明|
|:-----|:-----|
|.|任意の1文字|
|^|行の先頭|
|$|行の末尾|
|￥b|単語境界|
|*|直前の文字の0個以上の並び|
|+|直前の文字の1個以上の並び|
|?|直前の文字が0個、または1個|
|｜|論理演算子のOR|
aws-sdk v2をつかって、Capistrano3でdeployをする。

aws-sdk-core(aws-sdkのversion2)をつかって、Capistrano3でデプロイする場合にどのようにコードを書けばいいかあまり情報がなかったので、[公式ドキュメント](http://docs.aws.amazon.com/sdkforruby/api/Aws/EC2.html)を見ながら、実装してみた。

access keyを使うので、IAMでアクセスコントロールをしておいたほうが良い。

現在は2.0.6.preを指定してgem installする。

```rb
# Gemfile

# AWS SDK for Ruby version2
gem 'aws-sdk', '2.0.6.pre'
```

deploy配下はこんな感じでインスタンスを取得

```rb
# config/deploy/staging.rb
require 'aws-sdk-core'

# Access keyとSecret Access Keyをつかって、EC2からpublic_dns_nameを取得する
ec2 = Aws::EC2::Client.new(
        access_key_id: ENV['ACCESS_KEY_ID'],
        secret_access_key: ENV['SECRET_ACCESS_KEY'],
        region: 'ap-northeast-1')

# 検索条件は１、EC2に紐付いているtag情報　２、起動中のEC2で条件検索する。
# ここは自分の検索したい条件を色々変更することが可能。
ec2_filtered = ec2.describe_instances(
                 filters:[
                   {name: "tag:foo", values: ['bar']},
                   {name: 'instance-state-name', values: ['running']}
                 ])
# 検索条件からpublic_dns_nameを取得する(array)
instances = ec2_filtered.reservations.map{|k| k.instances}[0].map{|k| k.public_dns_name}

role :app, *instances
role :web, *instances
server *instances,
       user: 'ec2-user',
       roles: 'localhost',
       ssh_options: {
           forward_agent: true,
           auth_methods: ["publickey"],
           # if you want to debug capistrano set verbose to debug
           # verbose: :debug,
           keys: ENV['AWS_PEM_PATH']}

set :stage, :production
set :rails_env, 'production'
```

上記はEC2からの検索だが、もちろんELB配下のpublic_dns_nameを取得することも可能。その際は `Aws::ElasticLoadBalancing::Client` を使う。
［manjaro Linux］pacmanのリポジトリ切り替え

とりあえず自分用の備忘録として記載

manjaro-xfce-0.8.11-x86_64環境のpamacで
pepperflashやらpipelightのビルド時に以下のエラーが出て失敗
　packagekit: requires pacman<4.2.0

pacmanの新しいバージョンが必要なので手っ取り早くバージョンアップするために
リポジトリを切り替えてみる。

以下のコマンドを実行した結果、pacmanが4.2にバージョンアップされた
　sudo pacman-mirrors -g -b testing
　sudo pacman -Syyu

pacman以外のパッケージはstable版で問題なかったので
以下のコマンドを実行し、リポジトリをstableに戻した
　sudo pacman-mirrors -g -b stable
　sudo pacman -Syyu

stableに戻しても勝手にpacmanのバージョンが戻るようなことはない
formatまとめ

今回は何らかのデータを出力する際の書式化についてまとめます。
たとえば「桁数そろえたい」、「あいている桁を0埋めしたい」などなど。

# format()メソッド
java.util.Formatter、java.io.PrintWriter、java.lang.String の各クラスにはformat()メソッドが定義されています。これらのクラスのformat()メソッドを使って書式化を行います。

# フォーマット指示子
format()メソッドの構文は以下の通りです。

```
format(<フォーマット指示子> , <引数>)
```

フォーマット指示子は以下の要素からなります。

```
%[インデックス$][フラグ][幅][.精度]変換の種類
( []は省略可能 )
```

詳細は以下の通りです。

| 項目 | 説明 |
|:------------|:------------|
|インデックス|数字$で置換する引数を明示的に指定|
|フラグ|+：符号を出力<br>0：空きを0で埋める<br>,：数字を桁ごとに「,」で区切る。ロケールに依存する|
|幅|出力時の最小文字数|
|.精度|精度。出力に書き込まれる最大文字数| 
|変換の種類|b：Boolean値<br>c：文字<br>d：整数<br>f：浮動小数点<br>s：文字列<br>n：行区切り文字|

以下に例を示します。


### 1

```lang:java
format("私の名前は%sです。" , "田中");
```

```lang:出力
私の名前は田中です。
```

### 2

```lang:java
format("名前：%s　年齢：%d","田中",20);
```

```lang:出力
名前：田中　年齢：20
```

以下のように置換する引数を明示的に指定することもできる。

```lang:java
format("名前：%1$s　年齢：%2$d","田中",20);
(出力結果は上記と同じ)
```
csh/tcshのcdコマンドをちょっぴり便利に

はじめに
=======
こんにちは。訳あってcsh(tcsh)を使っている者です。

ディレクトリ名を全部入力するのメンドくない？
======================================
たとえば

```tcsh
foobar/
fugahoge/
mogemuga/
```
とディレクトリがある場合
`cd foo <RETURN>`と入力したら移動したい先は`foobar/`なのは明らか。
もちろんタブ等で補完すればいいのですが、それすらメンドい…
そんな時はスクリプトで解決しましょう。

```tcsh:~/scripts/nocd5_cd.csh

#!/bin/csh

if ($1 == "") then
    pushd ~
else
    set pattern = `basename $1`
    set parent = `dirname $1`
    set directories = `find "${parent}" -maxdepth 1 -name "${pattern}*" ! -name ".." -type d`
    if (${#directories} == 0) then
        pushd $1
    else if (${#directories} == 1) then
        pushd ${directories}
    else
        foreach i (`seq 1 ${#directories}`)
            echo $i : ${directories[$i]}
            # 番号に色を付けたい場合
            # echo "\e[01;34m"$i "\e[01;30m":"\e[0;1m" ${directories[$i]}
        end
        set selection = $<
        pushd $directories[$selection]
    endif
endif 
```
```tcsh:~/.cshrc
alias cd source ~/scripts/nocd_cd.csh
```
pushd使わない主義者の方は`pushd`のところを`chdir`にしてください。`cd`にしてしまうと再帰呼び出しになるので注意。

使い方
=====
前述の例の場合、
`cd foo <RETURN>`とすれば`foobar/`に
`cd fuga <RETURN>`とすれば`fugahoge/`に
`cd m <RETURN>`とすれば`mogemuga/`に
移動します。
また
`cd f <RETURN>`と入力した場合`foobar/`と`fugahoge/`の2つの候補が存在します。
候補が複数ある場合は、候補一覧を番号と共に表示し、キーボード入力待ちの状態になります。
移動したいディレクトリの番号を入力すると、そのディレクトリ移動できます。

おわりに
=======
候補が複数ある場合の挙動は`percol`や`peco`を使うともっと便利になるかも。
ではHave a good csh/tcsh life
ローカルではサブディレクトリ, リモートではサブドメインにするRouting

開発環境では`localhost:3000/admin`, 他の環境では`admin.example.jp`を管理画面にしたい場合。

あんまり無いケースかもしれませんが、以下のようにするとできました。

``` config/routes.rb
Rails.application.routes.draw do
  admin_routes = Proc.new do
    resources :articles
  end

  if Rails.env.development?
    namespace :admin, &admin_routes
  else
    constraint subdomain: 'admin' do
      namespace :admin, path: nil, &admin_routes
    end
  end
end
```

`Proc.new`とかしなくても良い方法がありそうですね。

そもそもlocalhostなら`admin.lvh.me`を使えば良いと思います。
一週間分の歩数を取得する

モーションコプロセッサが搭載されたiPhone 5s以降の端末では一週間分の歩数を取得することができます。

![スライド](https://qiita-image-store.s3.amazonaws.com/0/3862/6bf315f4-ca8f-877e-f06d-221c4b841096.jpeg)


はじめに、CoreMotion.frameworkを追加します。

`CMPedometer.isStepCountingAvailable()`で歩数が取得できるか判定します。

```swift
if(!CMPedometer.isStepCountingAvailable()) {
  // 取得できないとき
}
```

取得開始と取得終了のNSDateを指定します。

```swift
let pedometer:CMPedometer = CMPedometer()

pedometer.queryPedometerDataFromDate(from, toDate: to, withHandler: {(pedometerData:CMPedometerData!, error:NSError!) in

})
```

pedometerDataに歩数に関する情報が格納され、次のような情報にアクセスできます。

```swift
pedometerData.numberOfSteps // 歩数
pedometerData.distance // 距離
pedometerData.floorsAscended // 上った回数
pedometerData.floorsDescended // 下った回数
```

1週間分の歩数を日別に取得するために今日を基準にして、1日前、2日前、3日前と取得していきます。

```swift
/**
歩数計に関する一週間分の情報を返します。

:returns: 歩数計に関する情報
*/
func pedometerQuery() -> NSMutableArray {
	var result = NSMutableArray()
	
	let pedometer:CMPedometer = CMPedometer()
	if(!CMPedometer.isStepCountingAvailable()) {
		return result
	}
	
	let now:NSDate = NSDate()
	let formatter:NSDateFormatter = NSDateFormatter()
	formatter.dateFormat = "yyyy-MM-dd"
	var from:NSDate = self.stringToDate(formatter.stringFromDate(now), isStart: true)
	var to:NSDate = self.stringToDate(formatter.stringFromDate(now), isStart: false)
	
	for i in 0...6 {
		let semaphore:dispatch_semaphore_t = dispatch_semaphore_create(0)
		
		pedometer.queryPedometerDataFromDate(from, toDate: to, withHandler: {(pedometerData:CMPedometerData!, error:NSError!) in
			result[i] = [
				"steps": pedometerData.numberOfSteps,
				"distance": pedometerData.distance,
				"floorsAscended": pedometerData.floorsAscended,
				"floorsDescended": pedometerData.floorsDescended,
				"startDate": pedometerData.startDate,
				"endDate": pedometerData.endDate
			]
			
			dispatch_semaphore_signal(semaphore)
		})
		dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
		
		from = self.dateByAddingDay(from, day: -1)
		to = self.dateByAddingDay(to, day: -1)
	}
	
	return result
}

/**
指定した日付に時分秒を追加して新しいNSDateを返します。

:param: date もとのNSDate
:param: isStart trueのとき00:00:00、falseのとき23:59:59を追加します
:returns: 新しいNSDate
*/
private func stringToDate(date: String, isStart: Bool) -> NSDate {
	let timestamp = (isStart) ? date + " 00:00:00" : date + " 23:59:59"
	let formatter:NSDateFormatter = NSDateFormatter()
	formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
	return formatter.dateFromString(timestamp)!
}

/**
指定した日数を加減した新しいNSDateを返します。

:param: date もとのNSDate
:param: day 加減する日数
:returns: 新しいNSDate
*/
private func dateByAddingDay(date: NSDate, day: Int) -> NSDate {
	let calendar:NSCalendar = NSCalendar.currentCalendar()
	let components:NSDateComponents = NSDateComponents()
	components.day = day
	return calendar.dateByAddingComponents(components, toDate: date, options: NSCalendarOptions.allZeros)!
}
```
Ruby の 定番対話ツール pry 徹底攻略 | .pryrc file #pry #ruby

# Ruby の 定番対話ツール pry 徹底攻略 | <i class="fa fa-gears" style="font-size:1em;"></i> .pryrc file
## :musical_score: 概要
Ruby の 定番対話ツール pry 徹底攻略
<i class="fa fa-gears" style="font-size:1em;"></i> .pryrc file について

## <i class="fa fa-gears" style="font-size:1em;"></i> The .pryrc file
`.pryrc` ファイルは `.irbrc` ファイルと良く似ています。
設定のカスタマイズのために `.pryrc` ファイルを利用します。

pry を起動すると

* `~/.pryrc` ファイルをチェックして読み込む
* カレントディレクトリの `.pryrc` ファイルをチェックして読み込む
* 両ファイルともにある場合は、 ホームディレクトリの `~/.pryrc` ファイルから順に読み込みます。

## :large_blue_circle: Loading and :x: suppression
`.pryrc` ファイルはセッション開始後に最初に読み込まれるファイルです。
`.pryrc` ファイルは、 plugin や history より早く読み込まれるため、
この二つを制御することが可能です。

`.pryrc` ファイルの抑止をするには二つの方法があります。

* pry 起動時に `-f` option を付与する

~~~bash
$ echo 'puts :hoge' > ~/.pryrc
$ pry
hoge
[1] pry(main)> exit
$ pry -f
[1] pry(main)>
~~~

* セッション開始前に `Pry.config.should_load_rc = false` を設定する

※無効化により、 ~/.pryrc に仕込んでおいた `puts :hoge` が動作していないことが分かる

~~~
$ echo 'puts :hoge' > ~/.pryrc
$ pry
hoge
[1] pry(main)> exit
$ cat << EOF >> hoge.rb
> require 'pry'
> Pry.config.should_load_rc = false
> binding.pry
> hoge = "hoge"
> EOF

$ ruby hoge.rb

From: /path/to/current/hoge.rb @ line 4 :

    1: require 'pry'
    2: Pry.config.should_load_rc = false
    3: binding.pry
 => 4: hoge = "hoge"

[1] pry(main)> hoge
~~~

## :sound::seat::wrench::car: Customize Pry in your .pryrc
`.pryrc` ファイルで様々な設定を行うことができます。

* プロンプトの変更
* Command のエイリアスの設定
* Plugin の無効化
* 履歴のローディング設定

など。

### :baby_chick: デフォルト値
こちらのソースコードで確認できます。

<i class="fa fa-external-link" style="font-size:1em;"></i><i class="fa fa-github-alt" style="font-size:1em;"></i> [pry GitHub default.rb](https://github.com/pry/pry/blob/master/lib/pry/config/default.rb)

### <i class="fa fa-flask" style="font-size:1em;"></i> サンプル

* :baby_chick: 設定前

~~~
$ pry
[1] pry(main)> Pry.plugins.first.last.name
=> "byebug"
[2] pry(main)> Pry.plugins.first.last.enabled
=> true
[3] pry(main)> exit
~~~

* <i class="fa fa-edit" style="font-size:1em;"></i> 設定

pry の プロンプトを irb にする
byebug Plugin を無効化する

~~~ruby:.pryrc
Pry.config.prompt = [proc { "irb> " },
                     proc { "____| " }]

Pry.plugins["byebug"].disable!
~~~

* :chicken: 設定後

~~~
$ pry
hoge
irb> Pry.plugins.first.last.name
=> "byebug"
irb> Pry.plugins.first.last.enabled
=> false
irb> exit
~~~

## :man::woman: 親記事
<i class="fa fa-external-link-square" style="font-size:1em;"></i> [Ruby の 定番対話ツール pry 徹底攻略](http://qiita.com/tbpgr/items/12a60f2f9e3de61517b5)

## :books: 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [pry Wiki | The .pryrc file](https://github.com/pry/pry/wiki/Pry-rc)
sbt-native-packagerでDockerイメージを生成する


最近の[sbt-native-packager](https://github.com/sbt/sbt-native-packager)は、プロジェクトのjarを実行するDockerイメージの生成を試験的にサポートしています。

# Dockerイメージの生成方法

## 設定方法

sbtのプラグイン設定にsbt-native-packagerを追加します。

```scala:prject/plugins.sbt
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.0.0-M4")
```

ビルド設定に普段Dockerfileに記述する内容を追加します。設定可能な内容は[Keys.scala](https://github.com/sbt/sbt-native-packager/blob/master/src/main/scala/com/typesafe/sbt/packager/docker/Keys.scala)で確認できます。

```scala:build.scala
enablePlugins(JavaAppPackaging)

maintainer in Docker := "Duke"

dockerBaseImage in Docker := "dockerfile/java"

dockerExposedPorts in Docker := Seq(8080, 8080)
```

## 実行方法

sbtのターゲットに`docker:stage`や`docker:publishLocal`を指定して実行します。

```bash
# Dockerfileおよびコンテナに追加するファイルを生成します。
sbt docker:stage

# Dockerイメージを生成します。
sbt docker:publishLocal
```

# 例：簡単なウェブアプリケーションを作成する

例として、以下のような簡単なウェブアプリケーションを作成します。

```scala:src/main/scala/org/example/Server.scala
package org.example

import unfiltered.request._
import unfiltered.response._

object Server extends App {
  val echo = unfiltered.filter.Planify {
    case Path(Seg(p :: Nil)) => ResponseString("Hello, " + p)
  }
  unfiltered.jetty.Server.http(8080).plan(echo).run()
}
```
```scala:build.scala
enablePlugins(JavaAppPackaging)

organization := "org.example"

name := "sbt-docker-example"

version := "1.0-SNAPSHOT"

scalaVersion := "2.11.4"

libraryDependencies ++= Seq(
  "net.databinder" %% "unfiltered-filter" % "0.8.4",
  "net.databinder" %% "unfiltered-jetty" % "0.8.4"
)

maintainer in Docker := "Shun Takebayashi"

dockerBaseImage in Docker := "dockerfile/java"
```

`sbt docker:stage`を実行すると、以下のようなDockerfileと、Dockerfile内でADDするように指定されているファイル群が生成されます。

```:target/docker/Dockerfile
FROM dockerfile/java
MAINTAINER Shun Takebayashi
EXPOSE 8080 8080
ADD opt /opt
WORKDIR /opt/docker
RUN ["chown", "-R", "daemon", "."]
USER daemon
ENTRYPOINT ["bin/sbt-docker-example"]
CMD []
```

`sbt docker:publishLocal`を実行すると、上記の内容のDockerイメージがビルドされます。`docker images`を実行し、`sbt-docker-example:1.0-SNAPSHOT`というイメージが生成されたことを確認できます。

```
REPOSITORY           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
sbt-docker-example   1.0-SNAPSHOT        4efa038b97c0        7 seconds ago       723 MB
dockerfile/java      latest              e5b3ce7f0b79        11 days ago         705.7 MB
```

`docker run`コマンドでコンテナを実行します。

```bash
docker run -d -p 8080:8080 sbt-docker-example:1.0-SNAPSHOT
```

`curl -i http://localhost:8080/duke`を実行し、正常にウェブアプリケーションが動作していることを確認できました。

```
HTTP/1.1 200 OK
Content-Length: 11
Server: Jetty(8.1.13.v20130916)

Hello, duke
```