OmniAICreator/Qiita-1.07M huggingface dataset:
iOSアプリのCIができるサービス

iOSアプリのCIができるサービスを調べたので、まとめます。

なお、本記事は2014年12月時点のものであり、今後変わる可能性が多いにあります。(というか変わってほしい)

## TravisCI
![travis.PNG](https://qiita-image-store.s3.amazonaws.com/0/5920/e9a43bfe-cf96-fc01-7963-19f5c86f32b0.png)
https://travis-ci.org/

お馴染みのやつ。

### メリット

 * Githubとの連携が楽。Pull requestごとにビルドができし、ビルド結果をGithub上で表示できる。
 * 任意のコマンドを実行できるので自由度が高い。
 * 使ってる人が多い。(個人の見解です)

### デメリット

 * iPhoneシミュレータのみでしかテストできない
 * 若干、Xcodeへのバージョンアップへの追従が遅い。(現時点での最新版はXcode6.1.1だが、TravisCIで利用できるのはXcode6.1)。
    * どういう環境でビルド・テストされるかは [
The OS X Build Environment](http://docs.travis-ci.com/user/osx-ci-environment/) で確認できる。

## Ship.io
![shipio.PNG](https://qiita-image-store.s3.amazonaws.com/0/5920/4cb4d710-5dcb-372d-3179-525943ce0da4.png)

https://ship.io/

### メリット

 * ipaの作成や、Testflight等へのアップロードができる。
 * 実機でのテストができる。
 * beta版のせいか、基本無料で利用できる。

### デメリット

 * ビルド対象のブランチが固定。
 * ビルド回数に上限値がある。(99,999回とかだけど)
 * ビルドやテストコマンドが固定でカスタマイズできない。
 * サイトが重くて、あまり試せていない。

## GreenHouseCI
![greenhouse.PNG](https://qiita-image-store.s3.amazonaws.com/0/5920/83f275b3-883a-1953-3528-b20dfbb56aa5.png)
http://greenhouseci.com/

### メリット

 * ipaの作成や、Testflight等へのアップロードができる。
 * UIがよくできてる。(個人の見解です)
 * 無料でも2アプリまでビルドできる。

### デメリット

 * 証明書やmobileprovisioningを預けないと利用できない。
 * ビルド対象のブランチが固定。
 * ビルドやテストコマンドが固定でカスタマイズできない。
 * Swift+Quickだと異常に成功率が低く、1/5の確率でしか成功しない。

## Jenkins
![jenkins.PNG](https://qiita-image-store.s3.amazonaws.com/0/5920/c85af369-551a-2294-abce-af676f9d57ac.png)
http://jenkins-ci.org/

### メリット

 * なんでもできる(がんばれば)

### デメリット

 * 自分でホスティングしないといけない。
 * iPhoneシミュレータの起動にGUIセッションがいるので、特定ユーザでログインしっぱなしにしないといけない。


## まとめ
Jenkins最高！！！
[Obj-C]プリコンパイルヘッダを使ってみよう。


##概要
Xcodeを使っていて、プリコンパイルヘッダ（*.pch）を記述すると、ビルド対象のソース全体に適用される。
→共通のヘッダを一箇所に書くことで労力が減る。
あと、多少ビルド時間が減るらしい。

##効能
どのプロジェクトファイルでも、いつも使うヘッダとかインポート文がある、というのが前提。
ならば、それらをこっちに書いておくことで、共通ヘッダのことをあれこれ考えなくても、だいたいコンパイルが通るようになるよね、っという感じ。

もちろん、それなりに見極めは必要だ。実際チームでやったら、ひどい場合は結合度がものすごく上がっちゃうかもしれない。（ダメなパターンだと、余計な仕事が増えるかもしれないぞ）

その他、デバッグでしか使わないような、if DEBUG==1とかで切り替えるようなマクロ、たとえばログ出力なども、こちらに書いておくと良い。まあ、ログ出力ライブラリみたいなものもいいが、あんまりやり過ぎなのは重いので、軽く行こう。

まあ、要するに、全体に一律で投網を掛けたい設定があったら、ここに書いておくと、良いことがあるよ、と。ま、投網をかけたいケースだって、あるっちゃあるよね？

##やりかた

各プロジェクトのBuildSetting（All）にて、Apple LLVM6.0 - Langage の欄にある、以下の２つの項目を設定する。

###GCC_PRECOMPILE_PREFIX_HEADER    YES

説明。
Generates a precompiled header for the prefix header, which should reduce overall build times. 
ビルド時間が減るだろう。多分。
YESにしないと使われないので、YESに設定する。



###GCC_PREFIX_HEADER

説明。
Implicitly include the named header. The path given should either be a project relative path or an absolute path.
プロジェクトからの相対パス、または絶対パスでプリコンパイルヘッダ名をかけ。
こっちは、テキストで記述。プロジェクトの作り方にもよるが、source-forder/hoge-prefix.pchみたいな感じで設定する。

以上。
pandas-plyを使う

pandas-plyを使う
===

## 内容

[pandas_ply](https://github.com/coursera/pandas-ply)を使います. 

pandasでRのdplyrみたいなことをする, というものです. 

メソッドチェーンが使えると, コードが書きやすくて楽しいです. 

今回は, 選挙のデータを使って遊んでみます. 

[衆院選小選挙区立候補者名と, 名前で検索した時のヒット件数のデータ](https://github.com/gghatano/senkyo_predict/blob/master/kouho.hit.list)を使って, pandas-plyで遊びます. 


## コード

pandas_plyを使うまでの準備です. 

```python
import pandas as pd
from ply import install_ply, X, sym_call
install_ply(pd)
```

データを読み込みます. 

立候補者名+ググった時のヒット件数のデータです. 

```python
data = pd.read_csv("../kouho.hit.list", encoding="utf-8", header=0)

print data.head(2)
```

```bash
   BLOCK    NAME       AGE    PARTY STATUS   HIT
0  北海道1区  横路 孝弘    73    民主    前   153000
1  北海道1区  野呂田 博之   56   共産     新  346000
```

## 党別に候補者数と平均年齢を調べる

グループ化して, 集計すればいいです. 

```python
partySummarize = (
    data
    .groupby('PARTY')
    .ply_select(
      meanAge=X.AGE.mean(),
      candidateNum=X.NAME.size(),
      )
    )

print partySummarize
```

```bash
       candidateNum    meanAge
PARTY                         
公明                9  52.111111
共産              292  53.188356
次世               39  50.461538
民主              178  50.595506
無所               45  53.177778
生活               13  54.230769
社民               18  56.833333
維新               77  45.311688
自民              283  53.346290
諸派                5  52.400000
```

## 30歳以下の立候補者

dplyr::filterに対応するのはply_whereです. 

```python
## under 30 
print (data
    .ply_where(X.AGE < 30)
    .head(10)
    )
```

```bash
21    北海道7区   鈴木 貴子   28    民主      前  1670000
88     秋田2区   緑川 貴士   29    民主      新   170000
174    埼玉1区    松本 翔   29    社民      新  3070000
221    千葉1区   吉田 直義   27    共産      新  1690000
269    東京1区   野崎 孝信   27    無所      新   530000
271    東京2区   石沢 憲之   27    共産      新   156000
297    東京8区   沢田 真吾   29    共産      新   400000
306   東京11区   下村 芽生   27    無所      新   380000
390   神奈川8区   若林 靖久   29    共産      新   525000
403  神奈川12区  味村 耕太郎   25    共産      新   106000
```

## 検索した時のヒット数(万件)

dplyr::mutateに対応する操作も, ply_selectの中で可能です. 

```python
print (data
    .ply_select(
      NAME=X.NAME,
      HIT_x10000 = X.HIT / 1000
      )
    .head(10)
    )
```

```bash
  HIT_x10000    NAME
0       15.30   横路 孝弘
1       34.60  野呂田 博之
2      268.00   船橋 利実
3       54.30   飯田 佳宏
4       54.10   吉川 貴盛
5      152.00   池田 真紀
6        7.42   松木 謙公
7        5.92   金倉 昌俊
8       33.50    荒井 聰
9       30.30   吉岡 弘子

```
カラムの順番が入れ替わるのなんでだろう. 

## 感想

生pandas使うより楽しい. 

並べ替えの方法が分かりません. dplyr::arrangeに対応するのは何? 

以上です. 


<br/> この投稿は[Github :point_right: Qiita](https://github2qiita.herokuapp.com/)から投稿されました。
複数バージョンのCocos2d-xを簡単、便利、管理


本日[v3.3がリリース](http://www.cocos2d-x.org/news/387)されたCocos2d-xですが、まさかバージョンアップのたびにzipをダウンロードなんてしていないですよね?
複数バージョンを用意しておいて、必要に応じて切り替える方法をメモ。

# githubからclone

cocos2d-xのリポジトリをcloneします
https://github.com/cocos2d/cocos2d-x

```
$ git clone https://github.com/cocos2d/cocos2d-x.git
$ cd cocos2d-x
$ python download-deps.py
$ git submodule update --init
```

過去にリリースされたバージョンはtagで管理されています

```
$ git tag
# 略
cocos2d-x-3.2alpha0
cocos2d-x-3.2rc0
cocos2d-x-3.3
cocos2d-x-3.3alpha0
cocos2d-x-3.3beta0
cocos2d-x-3.3rc0
cocos2d-x-3.3rc1
cocos2d-x-3.3rc2
```

任意のバージョンをチェックアウト、パスを通しましょう。
このあたりは[本家のREADME](https://github.com/cocos2d/cocos2d-x/blob/v3/README.md)にもある手順を参考に。

ここでは例として`v3.3`を使ってみます。

```
$ git checkout cocos2d-x-3.3
$ ./setup.py
$ source ~/.bash_profile # 環境によってファイルは違う
```

ここまでで、ひとまず手動切り替えで排他的に複数バージョンを使うことはできるようになりました。

しかしこれでは、cocos2d-xのリポジトリに移動、チェックアウト中のタグを確認しなくてはバージョン確認できません。
これは、実は[ちょっと面倒な操作](http://stackoverflow.com/questions/2863756/is-there-a-single-git-command-to-get-the-current-tag-branch-and-commit)が必要になります。

さもダウンロードしたzipをそれぞれ展開したように、複数バージョンを同時にファイルシステム上に存在させるにはどうしたらよいでしょうか。

# git-new-workdir

- [git-new-workdir が便利 - #生存戦略 、それは - subtech](http://subtech.g.hatena.ne.jp/secondlife/20121207/1354854068)
- [Git で複数ブランチを同時に扱いたいなら git-new-workdir が便利 - てっく煮ブログ](http://tech.nitoyon.com/ja/blog/2013/03/29/git-new-workdir/)
- [1つのgitリポジトリに複数の作業ディレクトリを作る - Qiita](http://qiita.com/yuya_presto/items/dcebbebc6b3d9cf6f542)

`git-new-workdir`を使うにはパスを通しておく必要があります。ここでは割愛。
上記リンク先を参照ください。

`cocos2d-x-3.3rc0`タグをホームディレクトリ配下の`cocos2d-x/3.3rc0`に展開する場合は、以下。

```
$ git-new-workdir . ~/cocos2d-x/3.3rc0 cocos2d-x-3.3rc0
$ cd ../cocos2d-x/3.3rc0
```

これによって、複数回のzipダウンロードや`git clone`よりも手軽に各バージョンを使いわけることができます。

そして、パスにバージョンを明示的に含めることができますので、使用中バージョンの確認が容易になります。

```
$ echo $COCOS_CONSOLE_ROOT
```

ここまでで、表題の内容はおおむね達成されたかと思います。

---
残された問題としては、使用したいバージョンのディレクトリに都度パスを通す必要があるところです。
より便利にするならば、パスの管理もどうにかしたいところです。
ちゃんと確認してはいませんが `setup.by`を使うと自動的に`.bash_profile`に環境変数が記載されてしまうようです。
それを使わずに、うまいことパスを解決する術があれば望ましいですね。
nghttp2 を使った Go HTTP/2 server

[nghttp2](https://nghttp2.org) C ライブラリを Go から呼び出して HTTP/2 Web サーバーを書いたという記事です.
ソースコードは https://github.com/tatsuhiro-t/go-nghttp2 にあります.

Go から nghttp2 の API を呼び出すために cgo を使いました.
session.go が nghttp2 API をラップしている部分です.

cgo の標準的な書き方で, `import "C"` の上に `CFLAGS` やら `include` やらを書いておきます.

```go
// #cgo CFLAGS: -O2
// #cgo LDFLAGS: -lnghttp2
// #include <string.h>
// #include <nghttp2/nghttp2.h>
// #include "cnghttp2.h"
import "C"
```

現在 cgo では C の関数ポインター経由の関数呼び出しができないとうことで, １度 C の関数を関数ポインター経由で呼んで, そこから export した Go の関数を呼ぶようにしています.

Go の関数を export するには `//export functionName` とします.

```go
//export onBeginHeaders
func onBeginHeaders(fr *C.nghttp2_frame, ptr unsafe.Pointer) C.int {
...
}
```

間違って `// export` と空白を `export` の前に書いてしまうと正しく認識されないので要注意です.
cnghttp2.h に C 関数のプロトタイプを書いておいて, nghttp2.c にその関数から Go 関数を呼ぶようにしておきます.

```c
#include "_cgo_export.h"

int on_begin_headers(nghttp2_session *session, const nghttp2_frame *frame,
                     void *user_data)
{
  int rv;
  rv = onBeginHeaders((nghttp2_frame *)frame, user_data);
  return rv;
}
```

_cgo_export.h に export した Go 関数のプロトタイプが書かれているので include しておきます.

C のタイプ は C.size_t のように C.* の形をしていて, Go へ値を渡すときは必ず変換が必要です.
C.int32_t と Go の int32 も当然別タイプ扱いです.

また現在の cgo の実装では C 関数呼び出しは割とコストが高いようです.
goroutine のスケジューラーとの調整が必要なためとのことですが詳しくは分かっておりません.

https://github.com/bradfitz/http2 のコードを参考に net.http のフレームワークにのるように設計しています.

```go
package main

import (
	"github.com/tatsuhiro-t/go-nghttp2"
	"io"
	"log"
	"net/http"
)

func main() {
	var srv http.Server
	srv.Addr = "localhost:3000"

	http.HandleFunc("/upload", func(w http.ResponseWriter, r *http.Request) {
		buf := make([]byte, 4096)
		for {
			n, err := r.Body.Read(buf[0:])
			if err != nil {
				break
			}
			w.Write(buf[:n])
		}
	})
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		io.WriteString(w, "hello world")
	})
	log.Printf("Listening on " + srv.Addr)
	nghttp2.ConfigureServer(&srv, &nghttp2.Server{})
	log.Fatal(srv.ListenAndServeTLS("server.crt", "server.key"))
}
```

Go の実験用に適度に遊んで行きたいと考えています.
go build で C ソースのビルドも含めて全部できるので (go run でも OK), cython + Python よりも面倒がなくていい感じです.
nghttp2 では Python バインディングでサーバーを実装していますが, Python 3.4 の asyncio はフルスクラッチで HTTP サーバーの部分も実装が必要でしたが Go の場合は net.http のフレームワークにある程度のせればいいという面もプラスですし, GOMAXPROCS で複数スレッド使えるのも魅力的です.

余談ですが, 現在の仕様では "HTTP2.0" ではなく "HTTP/2" もしくは "HTTP2" が正しい名称です.
RubyMineでRSpecを実行する小技

RubyMineでRSpecを使う際、設定しておくと便利な小技を紹介します。

## Springを利用する
Rails 4.1 からデフォルトになっているプリローダで、もうないと我慢出来ないぐらいです。

RubyMineで使いたい場合は、下記で設定できます。

![spring_setting.png](https://qiita-image-store.s3.amazonaws.com/0/4777/b89ca7da-32c8-531e-9547-1a676778f3e2.png)

## auto test
RSpecなどのテストを実行したら、下記の実行結果が表示されますが、左には「Toogle auto-test」のスイッチがあります。
これを活性化すると、保存する都度 **前回の実行したテスト** が自動で実行してくれます。

![Screen_Shot_2014-12-15_at_20_29_12.png](https://qiita-image-store.s3.amazonaws.com/0/4777/fcc3e5a5-8f97-9363-54f6-8896992f6452.png)

厳密に言いますと、「保存する都度」のではなく、一定の間隔でファイルの変更があるかどうかを検出するのです。

その間隔は最短1秒までに設定できます。

![Screen_Shot_2014-12-15_at_21_38_57.png](https://qiita-image-store.s3.amazonaws.com/0/4777/ff5ad1db-b4a0-f133-d9cf-f81071628981.png)

## run context configuration
保存すると自動でテストを実行してくれるのは楽ですが、実際の開発ではよく
「このexampleだけ」とか「このcontext配下のexampleだけ」を実行したいですよね。

RSpecの場合は、`rspec spec/models/slide_spec.rb:21`的に行番号を指定すればコンテキストを判定して実行してくれます。

RubyMineも同じ機能があります。設定画面の`Keymap`セクションの下に「run context configuration」というコマンドがあります。好きなショットカートキーを設定しておけば、**実行したい行にカーソルをおいてから設定したショットカートキーを押すと、RSpecに行番号を指定して実行するのと同じく、コンテキストを判定して実行してくれます。

![Screen Shot 2014-12-15 at 21.48.54.png](https://qiita-image-store.s3.amazonaws.com/0/4777/75cd1cda-261d-56f0-dab5-722642c6fa93.png)

## 問題点
- `spring`＋`rspec`を実行すると謎のエラーが出てしまいます。
    - 原因：RubyMineが裏で起動している`spring`プロセスと別に、既にターミナルで`spring`を起動していると、このような不具合が出ます。
    - 解決方法：別で起動した`spring`を停止しておく
    - 参考URL　http://qiita.com/sato1043/items/5e797a5358592389bae4
- たまにspringがリロードされない
    - 使っている`spring 1.1.3`の問題かもしれませんが、たまに`FactoryGirl`のファイルを修正しても反映されないケースがあります。
    - ~~今のところ、RubyMineを再起動するしかないようです。別の方法をご存知の方はぜひ教えてください。~~ リロードさせたい場合は、コマンドラインで`touch config/application.rb`を実行すればOKです！[参考リンク](http://masutaka.net/chalow/2014-07-06-1.html)

以上、ご参考になれば嬉しいです！
Love2D:ゲームエンジンその３


元記事
http://qiita.com/jdeseno/items/6fbd5663cbcf71ad692b#comment-e4b6189a5e5776d147c7

画像の大きさと個々のピクセルだけ変更。
元記事、素晴らしいサンプルコードです。

```main.lua
-- http://en.wikipedia.org/wiki/Manhattan_distance
local manhattan = function(a, b)
  return math.abs(a.x - b.x) + math.abs(a.y - b.y)
end

local voronoi = function(width, height, dst)
  local random_points = {}

  -- ideally a point per 25x25 pixels
  local count  = (width * height) / (50 * 50)

  -- generate random points
  for i=1,count do
    table.insert(random_points, {
      x = tonumber(math.random() * width),
      y = tonumber(math.random() * height),
      pixels = {}
    })
  end

  -- for every pixel available
  for x=1,width do
    for y=1,height do
      -- find the closest random point to this pixel
      local point = {x = x, y = y}
      local closest_point = random_points[1]

      for i=2,#random_points do
        if dst(point, closest_point) > dst(point, random_points[i]) then
          closest_point = random_points[i]
        end
      end

      table.insert(closest_point.pixels, point)
    end
  end

  return {
    width = width,
    height = height,
    points = random_points
  }
end

-- return a new rgb value with each call
local nextColor = (function()
  local i, colors = 0, {}
  for r=0,255,32 do
    for g=0,255,32 do table.insert(colors, {r, g, 82}) end
    for b=0,255,32 do table.insert(colors, {r, 82, b}) end
  end

  return function()
    i = i + 1
    if i > #colors then i = 1 end
    return unpack(colors[i])
  end
end)()

-- draw voronoi on a love2d canvas
local createCanvas = function(vrn)
  local canvas = love.graphics.newCanvas(vrn.width, vrn.height)
  love.graphics.setCanvas(canvas)
  canvas:clear(255, 255, 255, 255)
  -- love.graphics.setBlendMode('alpha')

  for i,point in ipairs(vrn.points) do
    -- with a new drawing color
    love.graphics.setColor(nextColor())

    -- draw every nearby pixel
    -- love2d centers pixels, so offset them by 0.5 for crispness
    for i,pixel in ipairs(point.pixels) do
      love.graphics.point(pixel.x - 0.5, pixel.y - 0.5)
    end

    -- draw the center dot
    love.graphics.setColor(0, 0, 0)
    love.graphics.point(point.x - 0.5, point.y - 0.5)
  end

  love.graphics.setCanvas()
  love.graphics.setColor(255, 255, 255)

  return canvas
end

local canvas;

function love.load()
  -- reseed RNG
  math.randomseed(os.time())

  -- set a smaller window; drawing pixels 1-by-1 can be slow
  local width, height = 900, 600
  love.window.setMode(width, height)
  love.window.setTitle("Voronoi")

  vrn    = voronoi(width, height, manhattan)
  canvas = createCanvas(vrn)
end

function love.draw()
  love.graphics.draw(canvas, 0, 0)
end
```
JS弱者がBackboneでアプリ書いてて思った「VirtualDOMだったらここがよくなるだろうな」ってことを、ここの識者たちに「この理解でいいの？」って聞きたかった

こんにちは。VirtualDOM Advent Calendar 15日目のdekokunです。

14日目は[tomato360](http://qiita.com/tomato360)さんの「React.jsのチュートリアルを触る」でした。私はまだチュートリアルすら触っていないのにこの記事を書いていて、こいつ終わってんな感出ています。

## 現状説明

さて、私は15日目の担当だったんですが、それを成し遂げることができませんでした。

私の後回し精神によって後回されたAdvent Calendarタスクがインフルエンザによって潰された形です。すみませんとしか言い様がない。

インフルエンザの消滅を待って正式に記事を書くため一旦タイトルには「草稿」とつけさせてもらってます。

2014/12/18 インフルエンザは完治し、Reactのチュートリアルが終わりました。めでたい。

2014/12/20 考えれば考える程、以下書いてあることは「で、だからどうしたの？」以外の何物でもない感じあったため、別のブログを書きました。
[PHPでReact.jsのサーバサイドレンダリング](http://qiita.com/dekokun/items/abaaf731c738698016e4)

## 書こうとしていたことを箇条書きに

- ここ1年くらいずっとサーバサイドでAPI作ったりしてきた私ですが、5ヶ月ほど前から人生初のブラウザサイドJS経験として仕事でBackbone.Marionetteを使用してゲームを作っている
- 現在のDOM状態からの差分を書くスタイルはいろいろ厳しいと感じており、ViewModel的なやつ(Presenterって言ったりするの?)が完全に今のDOMの状態を反映しているようにしたい(ViewModelの現在の状態があればDOM構築が完了できるようにしたい)
    - 具体的にはViewModel的なやつのattributeの変化でViewが`change: this.render`するような感じにして
    - 上記の問題点は、1つ1つのViewがでかいと毎回その中のDOMの総書き換えが走ってしまうために、速度に気を配るアプリには厳しい
        - 回避策として、一つ一つのView及びViewModel的なやつを「View側に変更がある単位一つ一つに対して」ひたすら切り刻んでいくというのがあるが、なんか面倒、というか、サーバサイドプログラミングの時も感じていたが、「性能のために努力が強いられる」というのはあまり望ましくない状態であると私は感じている。人間は易きに流れるものである
- VirtualDOMで上記解決？こういう理解でいいの？

## まとめ

インフルエンザ、怖いです。39度の熱が出ます。最近かかってなかったんで、39度の恐ろしさを忘れていました。怖い。

現在は38度くらいです。皆さんも、気をつけましょう。っていうか、少しでもかかった気配を感じたら会社休みましょう。
Railsのparamsからcontrollerとかpathに関係するパラメータを除きたい


railsのparamsって```{controller: "posts", action: "index"}```みたいなpathに関する情報が入ってきてたまに邪魔だったりします。

POSTデータとかだけ取りたい場合には下記みたいに取得すればいいみたいですね。

```ruby
request.request_parameters
```

URLについてくるクエリパラメータだけ取りたい場合はこう。

```ruby
request.query_parameters
```

パスのデータだけも取れるみたいですね。

```ruby
request.path_parameters
```
Uchiwa で複数の Sensu をまとめて管理しよう

[Sensu Advent Calendar](http://qiita.com/advent-calendar/2014/sensu)  16日目です。 


とある事情で、複数のインフラを抱えることになりました。
当然監視もしなければいけないのですが、それぞれ独立なネットワークになっていて、監視どうしようかなーと考えていました。

- 今まで Sensu 使ってたし、それを使って各インフラのACLを調整して監視できるようにするかな？
- いやいやないない。それぞれのインフラに個別の Sensu を用意するか。
- でも、管理画面2つに増えるのいやだな。

などと考えていましたが、どうにもしっくりこない。

そんなおり、Sensu の標準ダッシュボードとなった Uchiwa をよく見ると、**Datacenter** という項目があることがわかりました。

見てみると、どうやら

- Uchiwa <-> sensu-server は **1対多** の関係を取ることができ、それぞれの sensu-server は Datacenter という分類になる。

ということのようです。
そこで、複数の sensu-server を配置して Uchiwa から全部管理してみることにしました。

# 実験
## 複数の sensu-server を扱う Uchiwa の設定
Uchiwa の json で、以下のように sensu を array にして、すべての sensu-api のエンドポイントを記載しておけばよいようです。

```uchiwa.json
{
  "uchiwa": {
   (略)
  },
  "sensu": [
    {
      "name": "sensu-a",
      "host": "<sensu-a-api host>",
      "port": <sensu-a-api port>,
      (略)
    },
    {
      "name": "sensu-b",
      "host": "<sensu-b-api host>",
      "port": <sensu-b-api port>,
      (略)
    },
    {
      "name": "sensu-c",
      "host": "<sensu-c-api host>",
      "port": <sensu-c-api port>,
      (略)
    }
  ]
} 
```

ちなみに、`uchiwa-chef` を使っている場合は、attribute を下記のように渡せば、上記のような json を生成してくれます。

```
"uchiwa": {
  "settings": {
    (略)
  },
  "api": [
    {
      "name": "sensu-a",
      "host": "<sensu-a host>",
      "port": <sensu-a port>,
      (略)
    },{
      "name": "sensu-b",
      "host": "<sensu-b host>",
      "port": <sensu-b port>,
      (略)
    },{
      "name": "<sensu-c>",
      "host": "<sensu-c host>",
      "port": <sensu-c port>,
      (略)
    }
  ]
}
```

# Uchiwa からの見え方
設定が終わって、正しく各sensu-api と疎通がとれていれば、下記のように見えます。
## 右上の雲マークから Datacenter 一覧
![スクリーンショット 2014-12-15 21.09.58.png](https://qiita-image-store.s3.amazonaws.com/0/840/2cf1ae13-66b6-476c-f216-a3495b10d98d.png)


## Events/Clients/Checks/Stashes に Datacenter 毎のタブ
![スクリーンショット 2014-12-15 21.10.20.png](https://qiita-image-store.s3.amazonaws.com/0/840/18a31685-0a2a-2551-80e7-79396281a682.png)

これで、色々な管理画面を転々としなくても、一つの管理画面で透過的に扱えるようになります。

それでは、よい Sensu Life を。
zshでhook関数を登録する

zshでは、何か操作を行ったときに呼び出されるhook関数を登録できる。これを使うと、例えば「コマンドを実行するたびにこの関数を実行する」ということができるようになる。もうすでに使ってる人も多いと思うけど、ここでその使い方をまとめておく。

## hook関数を登録する
hook関数を登録するには、add-zsh-hook関数を使う。使い方としては、「add-zsh-hook &lt;hook名&gt; &lt;関数名&gt;」という形で呼び出す。「hook名」はどういうときに関数が呼び出されるかというイベント種別を表す文字列で、詳しくは後で説明する。

### 例
次の例ではprecmdのときにprecmd_function1という関数を呼び出すように登録している。

```zsh
function precmd_function1() {
  # 何か処理
}
autoload -Uz add-zsh-hook
add-zsh-hook precmd precmd_function1
```

これとは違う登録方法もあるけど、特に理由がなければadd-zsh-hookを使うのが分かりやすいと思う。

## hook名とは
「hook名」というのは、どのタイミングで関数が呼ばれるかを指定するための文字列のこと。具体的には次の7種類がある。

|hook名|呼び出される条件|
|:-----|:---|
|chpwd|カレントディレクトリが変更したとき|
|periodic|プロンプトを表示するたびに、$PERIOD秒ごと|
|precmd|プロンプトを表示する直前|
|preexec|Enterを押してコマンドを実行する直前|
|zshaddhistory|コマンドラインがヒストリに追加される直前|
|zshexit|zshを終了する直前|
|zsh_directory_name|Dynamic named directoriesによるディレクトリ名変換|

いくつか分かりにくいものがあるので解説する。

### periodic
periodicというのはprecmdと似てるけど、precmdがプロンプトを表示するたびに必ず呼び出されるのに対して、periodicは前回実行時から一定時間経過しているときだけ呼び出される。その間隔はPERIOD変数で、秒単位の数値として指定する。

例えば、次の例ではperiodic_function1という関数を5秒間隔で呼び出すように登録している。

```zsh
PERIOD=5
function periodic_function1() {
  echo "periodic $(date)"
}
autoload -Uz add-zsh-hook
add-zsh-hook periodic periodic_function1
```

これを登録して動作させた様子は以下の通り。

```
%
periodic 2014年 12月 15日 月曜日 10:51:03 JST
# <= periodicを登録した時点でまずhook関数が呼び出される

%
%
%
#<= Enterを連打しても5秒たつまではなにも表示されない

%
periodic 2014年 12月 15日 月曜日 10:51:09 JST
#<= 前回実行時から5秒以上過ぎてから新しいプロンプトを表示したときにprecmd_function1が呼び出される
```

これは一定間隔でポーリングしたいときに役に立つ。

### zshexit
zshexitは、その名の通りzshが終了したときに呼び出されるhookイベント。対話的に起動しているzshを`exit`で終了したときとか、zshのシェルスクリプトが終了したときに呼び出される。終わる直前に後片付けの処理を行いときに役に立つ。

### zsh\_directory\_name
これはややこしいやつなので、今回は解説しない。

## どの順番に呼び出されるのか
似たようなhookがいっぱいあるので、それらがどういう順番で呼び出されるのかを確認してみた。まず準備として、次のようにして「chpwd」「periodic」「precmd」「preexec」「zshaddhistory」という5つのhookイベントに関数を登録した。

```zsh
function chpwd_function1() {
  echo "chpwd_function1"
}
function periodic_function1() {
  echo "periodic_function1"
}
function precmd_function1() {
  echo "precmd_function1"
}
function preexec_function1() {
  echo "preexec_function1"
}
function zshaddhistory_function1() {
  echo "zshaddhistory_function1"
}

autoload -Uz add-zsh-hook
PERIOD=5
add-zsh-hook chpwd chpwd_function1
add-zsh-hook periodic periodic_function1
add-zsh-hook precmd precmd_function1
add-zsh-hook preexec preexec_function1
add-zsh-hook zshaddhistory zshaddhistory_function1
```

その後5秒待ってから`echo hoge && cd /usr`というコマンドを実行してみた。これで5種類すべてのhook関数が呼び出されるので、その順番を見てみた。

```
% cd /usr && ls
zshaddhistory_function1
preexec_function1
hoge
chpwd_function1
precmd_function1
periodic_function1
```

結果として、呼び出される順番は次の通り。

1. zshaddhistory
2. preexec
3. コマンドラインに入力した本来のコマンドを実行
4. chpwd
5. precmd
6. periodic

## まとめ
ここまで書いた程度のことが分かっていれば、だいたいの場合に対応できると思う。もっと詳しいことを知りたいときはmanを読んでください。

- [man zshcontribの「Manipulating Hook Functions」](http://zsh.sourceforge.net/Doc/Release/User-Contributions.html#Manipulating-Hook-Functions)
- [man zshmiscの「SPECIAL FUNCTIONS」「Hook Functions」](http://zsh.sourceforge.net/Doc/Release/Functions.html#Hook-Functions)
SlackのHubot Integrationが知らぬ間にアップデートされてた

何か知らない間にHubot Integrationの設定が変わっていました。せっかく[Slack Advent Calendar](http://qiita.com/advent-calendar/2014/slack)書いたのに修正しないといけない...

## Slack側の設定
いつもどおり[Add a Service Integration]からHubotを選択、新しいIntegrationを作成すると...

![1.png](https://qiita-image-store.s3.amazonaws.com/0/52054/7ce25bb5-90f1-3625-a75c-4e43ded4ef14.png)

Usernameの入力を求められた。コレって前からあったっけ...?(ここは記憶があやふや)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/52054/ebd0134f-90c7-6810-d5a1-a1471870c2f5.png)

そしてここからがまるっと変わってる。(1)のAPI Tokenはいいとして、(2)のCustomize Name(ボット名)をSlack Integration側で設定するようになってる。(3)のアイコンはまあ昔からあった。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/52054/9c9e2ec5-aa21-5163-b548-8ecc96a0f4a0.png)

そして設定はまだまだ続く。(4)と(5)は無視でいい。botを仮想ユーザとして扱う(?)ような感じになったので名前を付けるのだろう。たぶん。
重要なのは(6)で、今までチャネルの設定はhubot側で行っていたのが、Slack Integration側で設定するようになった。しかもデフォルトではgeneralにしか反応してくれなくなった。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/52054/4a587c97-865d-64dc-55fd-0fd6eed7af75.png)

じゃあ特定のチャネルに反応するようにするにはどうしたらいいかというと、普通にチャネルにInviteするらしい。

```
# botを登録したいチャネル上で以下をポスト
/invite test-bot
```
こんな感じでInviteされる

![6.png](https://qiita-image-store.s3.amazonaws.com/0/52054/114d6094-56d8-4a48-4bf0-3512e4c71bc7.png)


## hubot側の設定
設定がSlack Integration側に移ったことでhubot-slackのために今まで色々設定してた環境変数が不要になった。必要なのはTokenのみ

```
# 環境変数の設定 to heroku
# これだけでOK
$ heroku config:set HUBOT_SLACK_TOKEN=xxxxxxxxxxx

# 不要になったものたち
$ heroku config:set HUBOT_SLACK_TEAM=xxxxxx
$ heroku config:set HUBOT_SLACK_BOTNAME=xxxxxx
$ heroku config:set HUBOT_SLACK_CHANNELMODE=xxxxxxxx
$ heroku config:set HUBOT_SLACK_CHANNELS=xxxxxx
```

## 最後に
今から新しく作成するIntegrationについては上の設定が必須ですが、今まで作った設定は今まで通り使えるようです。
EspruinoをWiFiに繋ぐ - GETリクエストを投げる


Espruinoを手に取ったからには`IoT`的な事がしたいはずです。`IoT`というからにはネットに繋ぎたいはずです。というわけでwifiに繋いでいきましょう。

## 目標

EspruinoにCC3000 Wifiモジュールをつなぎ、Wifi経由でGetリクエストを投げます。[公式(英語)](http://www.espruino.com/CC3000)にあるように、CC3000Wifiモジュールを使います。


![image](https://qiita-image-store.s3.amazonaws.com/0/51384/daba7b42-694f-c610-bb20-fa8ed826ebb7.png)



## 必要なもの

* Espruino
* CC3000 WiFiモジュール
* ピンヘッダ (CC3000用)
* Wifiネットワークの情報 SSID/パスワード

CC3000Wifiモジュールに何を使うかですが、とりあえず公式で勧められている[コレ](http://www.adafruit.com/products/1469)か、日本でも買える[コチラ](http://strawberry-linux.com/catalog/items?code=18253)が良いかと思います。後者の方も私の手元では動作しています（公式な保証はできませんよww）ので、海外発送の時間とコストが惜しい人にはおすすめです。

Espruino同様、ワイヤで結線するにはピンヘッダが居るので、[Espruinoにつけたとき](http://rocky-manobi.com/blog/?p=224)の余りを使うと良いと思います。ちなみに私はオスをつけています。

## 結線

線が多く複雑に見えますが、落ち着いて配線しましょう。
下の図の通り配線します(図のEspruinoのB3~B8は実際の配置とは逆なので気をつけてください。忠実にすると線がクロスしちゃうので...)

![image](https://qiita-image-store.s3.amazonaws.com/0/51384/dde73687-ea06-d703-44a7-ac064aa98a62.png)



## プログラム

以下のような感じになります。`wifiConfig`には環境に応じた値を設定しましょう。実行してしばらく待つと `Hello World!`とコンソール出力されるはずです。

```js
// wifi接続情報 ssidとパスワード
var wifiConfig = {
  ssid: "",
  key: ""
};

// CC3000Wifiモジュールに繋ぐ
var wlan = require("CC3000").connect();
// wifiネットワークに繋ぐ
wlan.connect( wifiConfig.ssid, wifiConfig.key, function (s) {
  // コネクション確立時のコールバック 
  if (s=="dhcp") {
    // GETリクエストを投げる : 公式の Hello World! と返してくれるURL
    require("http").get("http://www.pur3.co.uk/hello.txt", function(res) {
      var data = "";
      res.on('data', function(chunk) {
        // 細切れのデータを変数に足し込む
        data += chunk;
      });
      res.on('close', function(){
        // レスポンスが全部かえってきたら溜め込んだデータをコンソールに出力
        console.log(data);
      });
    });
  }
});

```

## 実行

wifiモジュールにつないで、wifiにつないで、そこからリクエストを投げて、、という流れなのでコレまでと違って少し実行まで時間がかかります(5秒~15秒くらい)。

![image](https://qiita-image-store.s3.amazonaws.com/0/51384/b9a43914-b2f8-8012-b691-12122b171a97.png)

できました。
多少熱くなりますが、大丈夫です。ただ、配線を悪い感じで間違った場合は、触った瞬間に尋常ではない熱さを感じることができます。すぐに電源を抜きましょう。当然ですが誤配線は故障の原因になりますので、慎重に、落ち着いて結線することが大事です。




## 次のステップ

ようやくインターネットにつながったので、これからPOSTリクエストを投げたりサーバとして動かしたりしていきます。ようやくIoT的にEspruinoが使えるようになるので、出来る事の幅が広がりますね。

ただ、このCC3000WiFiモジュール、結構電気を使います。PCに繋がず、安定して長時間動かすためには電源的な部分も含めて色々工夫をする必要があるので、それについても触れられたらと思っていたりします。
楽しいHubot / いろんな言語をbot化してチャットルームに呼ぼう！

この記事は Livesense Advent Calendar 15日目です。

---

Hubot 使ってますか。便利で楽しい Hubot ですが、今回は Hubot を使って REPL 環境を bot 化するシステムを作ってみたいと思います。

![スクリーンショット 2014-12-15 19.25.03.png](https://qiita-image-store.s3.amazonaws.com/0/15173/1bd077c4-b68b-0e97-fa0f-ae16ae7731d1.png)

Haskell の REPL である GHCi を bot 化して、Slack で遊んでいるところ

# 使うもの

- [Hubot](https://hubot.github.com/)
- Node.js + express
    - REPL の APIサーバを作る
- Docker
    - REPL 環境をサンドボックス化する
- REPL
    - 今回は Haskell GHCi を使います

# 構成

![system.png](https://qiita-image-store.s3.amazonaws.com/0/15173/a6d023ca-d994-6436-9b47-c0f3f1bb3bdd.png)

青い点線内が今回のシステムのスコープです。

## Hubot

Hubot プラグインとして実装します。

```coffeescript
module.exports = (robot) ->
  robot.hear /^(haskell|hs\!)(\s|\n)+([^\s\n][\s\S]*)/i, (msg)->
    script = msg.match[3].trim()

    msg.http("http://localhost:3000/eval")
      .query({expr: script})
      .get() (err, res, body) ->
        switch res.statusCode
          when 200
            msg.send "\`\`\`\n#{body.trim()}\n\`\`\`"
```

robot.hear でチャットルーム上のポストを全て拾い、文頭が haskell または hs! の場合に反応するように設定しています。コマンドを API サーバに投げて、レスポンスを整形し、チャットルームに投げます。

## GHCi API

API: GET /eval?expr=[PARAM]
PARAM を GHCi で実行し、結果を返します。

### GHCi on Docker

サーバ上でそのまま GHCi を実行するのは、セキュリティ上危険です。悪意あるユーザから、

- OSコマンドの不正な実行
- 外部ネットワークへの不正なアクセス
- サーバ資源の食いつぶし
    - メモリ
    - ディスク

のような攻撃を受ける可能性があります。

そこで、Docker を使って手っ取り早くサンドボックス環境を手に入れます。Docker を使うことで、ホスト OS との干渉がなく、メモリ容量や CPU が制限された状態でアプリケーションを実行することができます。詳しい話は Docker の公式ブログ記事: [CONTAINERS & DOCKER: HOW SECURE ARE THEY?](http://blog.docker.com/2013/08/containers-docker-how-secure-are-they/) より。

ということで、API サーバにはあらかじめ Docker および haskell:latest の Docker Image をインストールしておきます。  
```$ docker run -i --net="none" -c 256 -m 512m haskell:latest ghci```  
でサンドボックス環境の GHCi プロセスが立ち上がります。

### API サーバ

API サーバは起動と同時に、上述の GHCi on Docker プロセスを 1 つ立ち上げます。何らかの要因でプロセスが死ぬと、即座に新たな GHCi プロセスを立ち上げます。あとは飛んできたリクエストをパースして、GHCi プロセスに投げて、応答を返すだけです。

一番めんどくさいのはこの GHCi プロセスとやりとりする部分だったりします。GHCi プロセスはステートレスであり、INPUT と OUTPUT の間に対応関係がありません。一方で API サーバはリクエストに対して明確にレスポンスを対応付ける必要があります。このミスマッチを解消する処理を自前で実装する必要があるため、ソースコードが重くなりがちです。（良いアイデアがあれば教えて下さい。）

# ソースコード

- Hubot 本体 + プラグイン: https://github.com/na-o-y/lucky_bot/blob/master/scripts/ghci.coffee
- GHCi API: https://github.com/na-o-y/nghci

GHCi はよく止まるため、チャットルームからリスタートできるようにしたりしています。

他の言語でも、Docker Image と API サーバだけ用意してやれば簡単に bot 化できます！
【FileMaker】SQL言語で使うFileMaker


FileMakerでもSQL言語、ばっちり使えます。
例えば、単純ですがMySQLのデータをFileMakerに取り込むことを考えます。
このとき、必要なフィールドと条件を指定すると、FileMakerでのみ必要なデータが取得できるので、ファイルの肥大化が防げます。

単純にMySQLにカテゴリーが登録されているとします。
![1215_1.png](https://qiita-image-store.s3.amazonaws.com/0/60538/15d8c881-001c-e926-3c3f-0b9150704d6e.png)


FileMakerで必要なのは、カテゴリーidとカテゴリー名。
MySQLのテーブルにたくさんのフィールドがあるけれど、これしか使わない、というケースです。
![1215_2.png](https://qiita-image-store.s3.amazonaws.com/0/60538/24d5ad05-7ee7-3231-c1f1-081ed16c4d55.png)

ODBC設定がされているのを前提に、「ファイル＞レコードのインポート＞ODBCデータソース」を選択。

すると、csvからデータをインポートするのと同じ感覚でMySQLのデータがインポートできます。
違うのは、ODBCを使ってSQLで詳細な抽出ができるというところ。

必要なフィールドのみ。
![1215_7.png](https://qiita-image-store.s3.amazonaws.com/0/60538/83fbd54a-79e5-95d0-8ca4-d379a370538d.png)

必要な条件のみ。
![1215_8.png](https://qiita-image-store.s3.amazonaws.com/0/60538/20b95b7d-d50a-772a-cd9d-a3793b4a77b9.png)

もちろん、昇順降順も指定できます。

そして、「実行」すると。

きました。
どのフィールドに設定するかはいつもの通りドラッグして調整します。
![1215_5.png](https://qiita-image-store.s3.amazonaws.com/0/60538/4bb9297e-59ec-88cd-19b9-e9836bef874d.png)

はい、必要なデータだけ抽出できました。
![1215_6.png](https://qiita-image-store.s3.amazonaws.com/0/60538/903f18be-60f5-6ae5-a417-db8b94274542.png)

こんな感じで条件を細かく指定して外部データソースから簡易にデータ抽出できるのは、どんどん使っていきたいですね！
また、条件を指定するのではなく、ODBCデータソースを指定するときに「ビュー」も指定すると、外部データソース（MySQLとか）で構築されているビューもインポートできますので、データの再現をするにはもってこいです。

スクリプトでもSQLを指定できるので、それも小ネタにしたいと思いつつ、時間切れです！
では、また！
エクスプローラーの右クリックメニューに「ここでPowershellを開く」を作る（おまけ付き）

* まずはレジストリエディタを開きます。<br>スタートボタンから「ファイル名を指定して実行」をクリックするか、（あれば）Windowsキーを押しながらRを押してダイアログウィンドウを開き、名前(O)の所に regedit と書いてEnterキーを押すか、OKボタンを押すとレジストリエディタが起動します。
* HKEY_CLASS_ROOT\Directory\shell と言うところがあるので、そこを選択してキーを作成します。名前は「powershell」と書いておきましょう。
* (既定)という名のキーがあるので、それをダブルクリックして編集します。<br>値のデータ(V)欄に「ここでPowershellを開く」と書いちゃいます。<br>任意の文字列を書けるので、自分の判りやすい名称を書きましょう。
* その際、末尾などに「(&S)」とか書いておくと、右クリックメニューでの表示が「ここでPowershellを開く(S)」となります。これも任意のアルファベットを書けます。
* つづいて、作成したキー（ここではpowershell）を右クリックして、下層にもう一つキーを作成します。名前は「command」としてください。
* 同じように(既定)というキーをダブルクリックして、今度は値にPowershellのフルパス名を書きます。オプションなども含めて下記の様にしましょう。

```
C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -NoExit -Command "Set-Location -LiteralPath '%L'"
```
* 大抵のWindowsPCであれば、上記のパスにPowershellが居ると思いますが、違う場合はそれに合わせて書き換えてください。
* -NoExitオプションは、起動してもすぐ終了するのを防ぐものです。
* そして-Commandオプションを使って、%Lに入っているパス名へ場所を変えている、という寸法です。

---

* 2014/12/16追記<br>Powershell使いは多分、set-executionpolicy remotesignedとかしていると思うのでアレですが、上記のオプションに追加で-executionpolicy remotesignedと追加してあげると、普段はrestrictedでも、右クリックメニューで開いたときだけremotesignedになるような芸当もあります。

---
* 2016/04/14追記<br>Visual Studioの開発者コマンドプロンプトもこれと同じような感覚で開けないかと模索して、泥臭いですが作ってみました。

```lang:vscmd.bat
cd %1
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\VsDevCmd.bat"
```
* まず、上記のようなバッチファイルをパスの通った適当なフォルダへ置きます。

```
cmd.exe /k vccmd.bat "%V"
```

* HKEY_CLASSES_ROOT\Directory\shell\以下の適当なキーを作り、上記の文字列をキーへ書き込めばひとまず行けました。

---
プライベートクラウドをSoftLayer上にCloudStackでチビチビと作ってみる

このエントリは、
[CloudStack Advent Calendar 2014](http://www.adventar.org/calendars/436)の15日目のエントリー兼
[1枚目 SoftLayer Advent Calendar 2014](http://qiita.com/advent-calendar/2014/softlayer)の15日目のエントリーです。
* * *
# はじめに
SoftLayerの特徴の一つは、物理サーバーの利用ができるという点です。物理サーバーをオーダーする時に様々な種類のOSを選択できますが、VMware、Hyper-V、XenServerなどのハイパーバイザーを選択することもできます。ということは、OpenStackやCloudStackで、SoftLayer上にプライベートクラウドを構築することもできるということになります。
IBMは、今年10月に[OpenStackベースのプライベートクラウドを、サービスとしてSoftLayer上に提供するという発表](https://www-03.ibm.com/press/us/en/pressrelease/45253.wss)をしましたので、来年はSoftLayer上でプライベートクラウドを構築するケースも増えてくるのではないかと思っています。そこで、今回はCloudStackを使って、SoftLayer上にプライベートクラウドを構築してみたいと思います。

# サーバーの準備
まずは、まずは下記のような構成で、サーバーを4台（仮想サーバー2台、物理サーバー2台）オーダーしてみました。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/42406/af441ed7-9ddc-0632-f7d9-ee8169eb3a86.png)

SoftLayer上でのサーバーのオーダー方法については、既に色々Blogなどが書かれているので、大丈夫だと思いますが、下記のBlog等を参考にするといいと思います。（今回はキャンペーンを使用しませんでしたが、キャンペーンを利用すると、一定期間、無料でプライベートクラウドを構築することが可能だと思います。）

[IBM SoftLayer 課金の仕組み](http://www.slideshare.net/kkitase/softlayer-basic-billing)
[英語はよくわかりませんが、SoftLayerを触ってみました](http://qiita.com/rina0521/items/cf377780ce0f5423f1b4)

と、、これから構築していくわけですが、続きは12月25日までに書きたいと思います。

環境がうまく構築できれば、CloudStackで作成したプライベートクラウドと、オンプレミスで拠点間VPNを張りハイブリッド構成をとってみたり、オンプレミスや、SoftLayerの複数のリージョンのHypervisorをリモートホストとして追加してみたりしてみたいと思っています。

* * *
ご意見等あれば、[Facebook](http://facebook.com/kkitase) | [Twitter](http://twitter.com/kkitase) までお願いします。
Ubuntu + Ruby + selenium-webdriver で Google Chrome をエミュレート

#インストール

##Google Chrome、chromedriver、Xvfbのインストール

http://qiita.com/pandora2000/items/ca1654cc40d07c09b78d に従ってください

##Gems

```bash
gem install headless
gem install selenium-webdriver
```

#使い方

```rb
require "selenium-webdriver"
require 'headless'

headless = Headless.new
headless.start
driver = Selenium::WebDriver.for :chrome
driver.navigate.to "http://google.com"

element = driver.find_element(:name, 'q')
element.send_keys "Hello WebDriver!"
element.submit

puts driver.title

driver.quit
headless.destroy
```
UbuntuにJava8をインストールする


##Ubuntuのバージョン
```
$ cat /etc/issue
Ubuntu 12.04.3 LTS \n \l
```
##インストール
```
$ sudo add-apt-repository ppa:webupd8team/java
sudo: add-apt-repository: command not found
```
add-apt-repositoryがないと言われたら、`software-properties-common`をインストールする。`python-software-properties`も必要なので入れる。


```
$ sudo apt-get install software-properties-common python-software-properties
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
```
java8自身をインストールするときに確認画面が出てくるけどそれは`OK`しとけばOK

##Special Thanks
[Java - ubuntuでoracle-jdk8をインストールしておく - Qiita](http://qiita.com/civic/items/daefe465600ca45d6c11)
[sudo apt-get install software-properties-common python-software-properties](http://stackoverflow.com/questions/13018626/add-apt-repository-not-found)
Espruino用 $.param的なもの を書いたけど

Espruinoでネットに繋いで色々しようとしていると、`$.param()` のようなものが無いかなぁ、と思うと思います。espruinoにjquery入れる訳にもいかんので、jQuery#paramを参考にEspruinoの上で動くようなものを書いてみました。

## プログラム

[GIST](https://gist.github.com/rockymanobi/590c3a10f1ece46a653f)にあげてあります。

## 使い方

```js
queryString( { arg: 1, arg2: "ab", arg3: [ "x","y","z"] } );
 // => arg1=1&arg2=ab&arg3[]=x&arg3[]=y&arg3[]=z
```

## 注意

オブジェクトを再帰的にたどっていくので、大きなオブジェクトだと簡単にメモリが足りなくなります。このあたりがPCと勝手が違う感じですよね。落ちてしまったら面倒でも毎回`querystring`を手動で書くしか無いようです。
XCODEのGesture Recognizerの名前を変更する方法

1. `Main.storyboard`に Gesture Recognizerを貼る
2. ![gesture_name1.png](https://qiita-image-store.s3.amazonaws.com/0/32256/d4a5fd67-716d-c521-1428-6053539f5091.png)
2. 変更したいGestureを選択して、右バー`Utilities`を出す。
3. `Label`を変更する
4. ![gesture_name2.png](https://qiita-image-store.s3.amazonaws.com/0/32256/401147ba-ffaf-d51b-a2c1-86fde9a95eeb.png)
4. 名前が変わります
5. ![gesture_name3.png](https://qiita-image-store.s3.amazonaws.com/0/32256/682ea85e-efda-2cfb-4e5a-f6983f828729.png)


Yes!
animateWithDurationビフォーアフター

クロージャの書き直しでハマったので書く。

# 前提

1. `arrow`は画像にアウトレット接続していること

# Before

```objc
[UIView animateWithDuration:0.5
          delay:0.0
          options:UIViewAnimationOptionCurveEaseOut
          animations:^{
              _arrow.center = CGPointMake(pt.x, pt.y - height/2);
          }
          completion:nil];
```

# After

```swift
UIView.animateWithDuration(
          0.5,
          delay:0.3,
          options:UIViewAnimationOptions.CurveEaseOut,
          animations: {() -> Void in
              self.arrow.center = CGPoint(x:pt.x, y:pt.y - height/2)
          },
          completion: nil
      );
```

# 要点

- 定数が変わる（`UIViewAnimationOptionsCurveEaseOut`→`UIViewAnimationOptions.CurveEaseOut`）
- クロージャの構文がちがう（`^{`→`{() -> Void in`）
ローカルではパースされていたjsonファイルが、サーバーにあげたらパースされないときの対処法


題名のまんまなんですが、ハマったのでメモ。

## 起こったこと
* ランダムで結果を返す物をjQueryで作っていた。
* ローカルではGulpを使ってサーバーを立てて、開発を進めていた。
* ローカルでは問題なくjsonをパースできて、結果が返ってきていた。
* ある程度形ができたので、サーバーにあげたらうまくパースされずに、undefinedが返ってきていた。

## 原因
ChromeのDevToolで見ると、ローカルでは、`[object]`で返ってきていたが、サーバーでは文字列が返ってきていた。
そこで、`jquery json object　パースされない`でググって、以下サイトに答えがあった。

>おそらく、お使いのWebサーバーに.jsonファイルのMIMEタイプが設定されていないためだと考えられます。

[なぜパースされないの？](http://www.solidpanda.com/book/article/1112/)

サーバーがjsonを認識していなかったみたい。

## ということでこうしました。
.htaccessに以下を追加しました。
`AddType application/json .json`

これで問題なくサーバーでもjsonがパースされました。
rubyでproxy、ssl、基本認証のサイトへポスト


Webサイト閲覧にproxyが必要で、httpsのサイトへポストしたい。
かつ、基本認証がかかってる場合のrubyでのやり方。

参考
http://shirusu-ni-tarazu.hatenablog.jp/entry/2012/07/02/023326
http://qiita.com/bokuo-okubo/items/60f74243a26a23621894

```ruby
require 'net/http'
require 'openssl'

#proxyサーバ
proxy = 'proxy.co.jp'

#POST先パス
req = Net::HTTP::Post.new('/post_path')
#基本認証のID, PASS
req.basic_auth 'id', 'password'
#ポストするパラメータ
req.set_form_data(key: post_data)

#proxyを設定
http = Net::HTTP::Proxy(proxy, 8080)
#SSLサイトを設定
http = http.new('https_site_host.co.jp', 443)
#sslを使う
http.use_ssl = true
#証明書は使わない
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
#リクエスト送信
http.request(req)
```
Githubで特定のpull requestをローカルに持ってくる

#概要
OSSのメンテナっぽいことをやるとき、githubで特定のpull requestの正当性を確認したいということがあると思う。ブランチチェックアウトすれば良くね？って単純に考えていたけど、結構面倒くさかったので、メモっとく。

#やり方
とりあえず、repositoryをcloneして、branchを見てみる。

```console
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/feature/support_gemfile
  remotes/origin/master
  remotes/origin/test_1.0.0
```
pull requestのbranchは入っていない。

下記を参照すると、どうやらこのようにやれば良いらしい。
[Checking out pull requests locally - User Documentation](https://help.github.com/articles/checking-out-pull-requests-locally/)

```console
$ git fetch origin pull/ID/head:BRANCHNAME
```
今回の場合は、`25`になる。
![pr.png](https://qiita-image-store.s3.amazonaws.com/0/36604/becf3bf0-82b2-3a96-450d-5ffcc1d187a9.png)

`fetch`してみる

```console
$ git fetch origin pull/25/head:abolish_ruby_server_dir
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 1), reused 3 (delta 1)
Unpacking objects: 100% (5/5), done.
From https://github.com/roma/roma
 * [new branch]      refs/pull/25/head -> abolish_ruby_server_dir
```

`checkout`してみる

```console
$ git branch -a
  abolish_ruby_server_dir
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/feature/support_gemfile
  remotes/origin/master
  remotes/origin/test_1.0.0
$ git checkout abolish_ruby_server_dir
Switched to branch 'abolish_ruby_server_dir'
```

いけた。

#Reference
https://help.github.com/articles/checking-out-pull-requests-locally/
ROMAでユニットテストを実行する（CentOS）


ROMAのユニットテストの方法に関しての紹介。

## ROMAのインストール
ROMA本体のインストールに関しては、ROMAの[公式HP](http://roma-kvs.org/learn/main_unit.html)から確認できる。

## Tokyo Cabinetのインストール
ROMAのユニットテストでは、Tokyo Cabinetを利用するために以下の準備が必要。
>Tokyo Cabinet
>Tokyo Cabinet Ruby client
>eventmachine gem

インストール手順に関しては、ROMAの[公式HP](http://roma-kvs.org/learn/related_lib.html)を参照。

##その他、関連ライブラリのインストール
### Gem
```bash
gem install sqlite3
gem install gdbm
gem install ffi
```

###Sqlite3
```bash
$ sqlite3 -version
##### 古いバージョンを利用している場合は、アップデートの必要あり。
##### v3.3.6 --> Error
##### v3.6.20 --> OK
$ cd /usr/local/src/
$ wget http://www.sqlite.org/2013/sqlite-autoconf-3080002.tar.gz
$ tar xvfpz sqlite-autoconf-3080002.tar.gz
$ cd sqlite-autoconf-3080002
$ ./configure
$ make
$ make install
$ sqlite3 -version
```

### ROMA Ruby Client
解凍したファイル名を``roma-ruby-clien``として、ROMA本体と同一のディレクトリに置く必要がある。

```bash
$ wget https://github.com/roma/roma-ruby-client/archive/v0.4.1.tar.gz
$ tar xvfpz v0.4.1.tar.gz
$ mv -i roma-ruby-client-0.4.1 roma-ruby-client
```

##テスト実行
ユニットテストの際に、ポート``11211``と``11212``を利用するため、すでにこのポートが利用されている場合は、注意が必要。

```bash
$ cd /your/roma/path/ruby/server
$ ruby test/run-test.rb

###エラーとなったテストを個別にテスト実行することも可能
$ ruby test/run-test.rb -n エラーとなったテスト
```
StorageEventのブラウザ間差異

同一window/別windowそれぞれでStorageを操作した際にStorageEventが発火するか?
IE以外は同一windowでnoなのでsessionStorageのStorageEventは発火する機会がないのだと思う。

| |同一window|別window|
|:---|:---|:---|
|IE(10-11)|yes|yes|
|Chrome(39)|no|yes|
|Mobile Safari(6-)|no|yes|
|Firefox(34)|no|yes|

Storage#setItem()で同一key/valueを設定して変更がない場合にStorageEventが発火するか?

| | |
|:---|:---|
|IE(10-11)|yes|
|Chrome(39)|no|
|Mobile Safari(6-)|no|
|Firefox(34)|no|

Storage#removeItem()した際に発火するStorageEventのpropertyのnewValue
Storageのvalueは文字列なのでnullであれば削除されたと分かるが、
""の場合は""が設定された場合と区別がつかない。

|  |newValue|
|:---|:---|
|IE(10,11)|""|
|Chrome|null|
|Mobile Safari(6-)|null|
|Firefox|null|

Storage#clear()した際に発火するStorageEventのproperty

|  | key|newValue|oldValue|
|:---|:---|:---|:---|
|IE(10,11)|""|""|""|
|Chrome|""|null|null|
|Mobile Safari(6-)|""|null|null|
|Firefox|null|null|null|
Promiseを使おう


このエントリは[Angular JS Advent Calendar](http://www.adventar.org/calendars/350)の投稿です。

#Promise使ってますか？

Promiseは非同期をうまくやってくれます。

>Promise インターフェースは作成時点では分からなくてもよい値へのプロキシです。プロミスを用いることで、非同期アクションの成功や失敗に対するハンドラを関連付けることができます。これにより、非同期メソッドは、最終的な値を返すのではなく、未来のある時点で値を持つプロミスを返すことで、同期メソッドと同じように値を返すことができるようになります。
>プロミスは何らかの値をもって成功、もしくは何らかの理由をもって失敗となることができます。そのどちらとなっても、then メソッドによって関連付けられたハンドラが呼ばれます。
>Promise.prototype.then メソッドと Promise.prototype.catch メソッドはプロミス値を返すので、メソッドチェインによって合成することができます。

引用 [Promise - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise)

とは言え、サービスを作る際にお世話になっていると思います。

```js:service.js
var service = angular.module("customServices", []);
service.factory("customService", ["$q", "$timeout", function($q, $timeout){
    return {
        merry: function(){
            var d = $q.defer();
            $timeout(function(){
                d.resolve("メリー");
            }, 1000);
            return d.promise;
        },
        christmas: function(){
            var d = $q.defer();
            $timeout(function(){
                d.resolve("クリスマス");
            }, 1000);
            return d.promise;
        }
    };
}]);
```

```js:controller.js
var app = angular.module("myApp", ["customServices"]);
app.controller("myController", ["$q", "customService", function(customService){
	$q.all([customService.merry(), customService.christmas()]).then(function(strs){
	var merry = strs[0];
	var christmas = strs[1];
	alert(merry+"・"+christmas);
	});
}]);
```

このように複数の非同期処理を一つにまとめたりするのに大変重宝します。
しかし、たまには1つだけ処理が欲しい場合があります。
promiseを利用しているとなんとなくコールバックがダサく感じてしまいます。
しかし、1つだけの場合はいままで通りコールバックのほうが使い慣れていると思いますのでコールバックもあったほうがいいと考えています。

```js:service_callback.js
var service = angular.module("customServices", []);
service.factory("customService", ["$q", "$timeout", function($q, $timeout){
    return {
        merry: function(callback){
            var d = $q.defer();
            $timeout(function(){
                d.resolve("メリー");
				if(typeof callback == "function"){
					callback("メリー");
				}
            }, 1000);
            return d.promise;
        },
        christmas: function(callback){
            var d = $q.defer();
            $timeout(function(){
                d.resolve("クリスマス");
				if(typeof callback == "function"){
					callback("クリスマス");
				}
            }, 1000);
            return d.promise;
        }
    };
}]);
```

2つ書くのは面倒ではありますが、serviceを作るに当たり、返りの選択肢は複数あったほうがいいと考えています。
[ruby] 祝日判断や休日判断をrubyでやるなら、これでいいんじゃないかな - メモ

# business_time gem
[bokmann/business_time](https://github.com/bokmann/business_time)

business_time gemが便利そう。
このgemを使うと、Dateに対していろいろなmethodが使えるようになる。

```rb
[4] pry(#<Date>):1> Date.new(2015,1,2).workday?
=> true
[5] pry(#<Date>):1> Date.today.workday?
=> true
[6] pry(#<Date>):1> Date.today.weekday?
=> true
[7] pry(#<Date>):1> Date.today.monday?
=> true

# 特定の日付までの営業日を計算
[8] pry(#<Date>):1> Date.today.business_days_until(1.month.since)
=> 21
```

- `創立記念日`などの、会社独自の祝日もカスタマイズ可能

```rb
BusinessTime::Config.holidays << Date.parse('会社独自の休みなど')
```

- config fileも作れる

```rb
rails generate business_time:config
```

- configに日本の祝日リストを持っておけば、判断methodを別途作成しなくても、Dateに生えるのが便利

```yaml
business_time:
  beginning_of_workday: 9:00 am
  end_of_workday: 5:00 pm
  holidays:
    - January 01, 2014
    - January 13, 2014
    - February 11, 2014
    - March 21, 2014
    - April 29, 2014
    - May 03, 2014
    - May 05, 2014
    - May 06, 2014
    - July 21, 2014
    - September 15, 2014
    - September 23, 2014
    - October 13, 2014
    - November 03, 2014
    - November 24, 2014
    - December 23, 2014
    - January 01, 2015
    - January 12, 2015
    - February 11, 2015
    - March 21, 2015
    - April 29, 2015
    - May 03, 2015
    - May 04, 2015
    - May 05, 2015
    - May 06, 2015
    - July 20, 2015
    - September 21, 2015
    - September 23, 2015
    - October 12, 2015
    - November 03, 2015
    - November 23, 2015
    - December 23, 2015
    - January 01, 2016
    - January 11, 2016
    - February 11, 2016
    - March 21, 2016
    - April 29, 2016
    - May 03, 2016
    - May 04, 2016
    - May 05, 2016
    - July 18, 2016
    - August 11, 2016
    - September 19, 2016
    - September 22, 2016
    - October 10, 2016
    - November 03, 2016
    - November 23, 2016
    - December 23, 2016
  work_week:
    - mon
    - tue
    - wed
    - thu
    - fri
```

```
[12] pry(#<Date>):1> Date.new(2015,1,1).workday?
=> false
[13] pry(#<Date>):1> Date.new(2016,12,23).workday?
=> false
```

- holiday_jp と組み合わせても面白いかも
[komagata/holiday_jp](https://github.com/komagata/holiday_jp)
kitchen-dockerでホストのボリュームをマウントする

# dockerコマンド
Dockerコマンドでは以下のようにホストのディレクトリをマウントすることができます。

```shell-session
sudo docker run -t -i -v /var/host:/var/guest:rw centos /bin/bash
```

これを、Kitchen-Dockerでやるにはどうするかというお話。

# Kitchen-Docker

driver_configの```volume```を使う形になります。

https://github.com/portertech/kitchen-docker#volume

こんな感じ。

```yaml:.kitchen.yml
---
driver:
  name: docker

driver_config:
  use_sudo: false
  socket: <%= ENV['DOCKER_HOST'] %>

platforms:
  - name: centos-6.5

suites:
  - name: default
    driver_config:
      volume:
        - <%= Dir::pwd %>/host:/var/guest:rw
    run_list:
      - recipe[pz-postgresql]
    attributes:

busser:
  sudo: true
```

Templateエンジンが噛んでいるのでRubyのコードが埋め込めるのが素敵。
各人好きな場所にソースコードを置いてもらっても同じように動く。

# ユースケース

今まで、Vagrant(VirtualBox)で複数立てるとリソース食いすぎるから、
無理やりAll in Oneで開発環境作ってたのとか、
コンポーネントごとに分けて、[コンテナ同士繋いで](http://qiita.com/Marcy/items/92a67bd67a62978131fa)開発環境にするのとか良いかもしれない。
Test-KitchenならChef連携を作りこまなくて良くて、
Cookbookの開発フローと実際の開発環境の構築フローが同じにできるのが楽な気がする。
Heroku便利機能まとめ(アドオン含む)

[Heroku Advent Calendar 2014 - 15日目](http://qiita.com/advent-calendar/2014/heroku)


* [Herokuのメリット、デメリット - Qiita](http://qiita.com/shu_0115/items/0106198f7a0be2f2a509)
* [Herokuおすすめアドオンまとめ - Qiita](http://qiita.com/shu_0115/items/047dae021da1b25f2252)

↑この辺りでも少し触れていますが、普段Herokuを使っていて便利だな、と思う機能などを紹介したいと思います。

## 無料環境

* [Heroku | Pricing](https://www.heroku.com/pricing)

まずは何よりもこれですね。
Herokuは1dyno、DB総レコード数1万件までは無料で使えます。

(厳密にはdynoの無料枠も時間計算なので、Herokuを無料で使いたい場合は↓このあたりのHeroku常識には目を通しておいた方が良いです)

* [知っておきたい！Herokuを使う上では当たり前？の16の常識 | mah365](http://blog.mah-lab.com/2013/05/16/heroku-commons-16/)

この無料枠があるおかげで、自分で使う用に作ったちょっとしたWebツールや、試しに作ってみたプロトタイプなどを気軽にWeb上に公開出来ます。

## リリースバージョン管理

* [Releases | Heroku Dev Center](https://devcenter.heroku.com/articles/releases)

これはそれほど使用頻度は高くないですが、いざという時に便利です。
Herokuへのデプロイや環境変数の変更などを自動的に記録してくれ、好きなバージョンにロールバックさせる事が出来ます。

無いに越した事はないですが、リリースしたバージョンに不具合があり、一旦前のバージョンに戻したい時や、間違ってリリースしてしまったバージョンをロールバックしたい時などに重宝します。

## アプリケーションフォーク

* [Forking Applications | Heroku Dev Center](https://devcenter.heroku.com/articles/fork-app)

Herokuは作成済みのアプリケーションを複製して新しいアプリケーションを作る事が出来ます。
ステージング環境やデモ、プレビューなど、同じソースコードで複数の閲覧環境を用意したい場合などにとても便利です。
アドオンもコピーされるので、便利なのですが、有料アドオンを使用している場合などは有料のままコピーされるのでちょっと注意が必要です。

## DB自動バックアップ

* [PG Backups | Heroku Dev Center](https://devcenter.heroku.com/articles/pgbackups)
* [PG Backups | Add-ons | Heroku](https://addons.heroku.com/pgbackups#auto-month)

PG Backupsに複数プランがありますが、「Auto - One Month Retention」プランであれば、デイリーもウィークリーも自動でバックアップを保存してくれます。
(バックアップの保管数には制限があります)

## パフォーマンス解析

* [New Relic APM | Add-ons | Heroku](https://addons.heroku.com/newrelic)
* [Librato | Add-ons | Heroku](https://addons.heroku.com/librato)

New Relicは定番ですが、最近Libratoというアドオンも使ってみています。

* [HerokuでパフォーマンスモニタリングするならLibratoを入れよう！ | mah365](http://blog.mah-lab.com/2014/11/26/heroku-librato/)

↑こちらの記事にもありますが、New RelicよりもHeroku向けダッシュボードという感じです。
「Dyno Memory」「Dyno Load Average」など、よりHerokuに特化した項目もあるので、とりあえず入れてみて、どんな感じに各数値が表示されるのかなど試してみると良いと思います。(無料プランもあります)

---

こんな感じで至れり尽くせりな機能が沢山あり、開発者が本当にプロダクトに集中出来る環境を作ってくれていると思います。
無料で使える機能やアドオンが多いのも嬉しいですね。
最近ではGitHubやDropboxとのSyncも出来るようになったり、まだまだ進化していきそうな気がします。
新しい機能や、その他の機能の使ってみた感想などもまたどこかで共有出来ればと思います。

以上です。

### おまけ

* [キャンペーン · We ask for the Tokyo region of Heroku／東京リージョンに対応してください #heroku · Change.org](https://www.change.org/p/heroku-inc-we-ask-for-the-tokyo-region-of-heroku-%E6%9D%B1%E4%BA%AC%E3%83%AA%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84-heroku)

Change.orgで東京リージョン希望の署名を募集しています。
ご協力頂ける方はよろしくお願いします。