OmniAICreator/Qiita-1.07M huggingface dataset:
Softlayer DeviceのpublicNetworkの有効化／無効化について

このエントリは[2枚目 SoftLayer Advent Calendar 2014](http://qiita.com/advent-calendar/2014/softlayer2)の14日目のエントリです．
* * *

一般的なサーバ構成として，フロントエンドにphpなどのプログラムを配置し，バックエンドにMysqlなどのDBを配置することが多いのではないでしょうか？
SoftlayerではDevice購入時にPrivateNetworkOnlyなマシンとして作成することできます．
しかし，例えバックエンドのマシンであっても，パッケージのインストールなどのため，一時的にpublicNetworkに接続したくなることもあるでしょう．
このエントリではDeviceのpublicネットワークの有効／無効化，すなわちサーバのフロントエンドとバックエンドの切り替え方法を説明します．

## フロントエンドからバックエンドへの切り替え（publicNetworkの無効化）

まず管理ポータルの[Device]→[Device List]から切り替えを行いたいデバイスを選択しましょう．
この一覧画面では割り当てられているIPが表示されますが，有効になっているかどうかはわかりません．
![device_list.png](https://qiita-image-store.s3.amazonaws.com/0/58048/cfeec2bf-8d5a-8bb9-414e-5b61a2ab80fd.png)

詳細を開くと下のような画面が出てきます．
今回はpublicへの接続を切断したいので左側(public)のSpeedをクリックします．
![device_detail_1.png](https://qiita-image-store.s3.amazonaws.com/0/58048/fc0f9b52-5c13-6bdd-eeec-509a397c8cb4.png)

選択肢の中からDisconnectを選び，右側のチェックをクリックするとpublicネットワークから切断され，
privateのみで利用できるようになります．
![disconnect.png](https://qiita-image-store.s3.amazonaws.com/0/58048/6e1abb95-6353-4951-045b-52c7b3a4dfee.png)

## バックエンドからフロントエンドへの切り替え（publicNetworkの有効化）

次にPrivateNetworkOnlyになっているDeviceをpublicに戻す方法を紹介します．
詳細画面を開いて先ほどと同じ場所をクリックしようとしてもできなくなっています．
public networkを有効にするには右上にある[Actions]を押しましょう．
（publicの無効化も実はここから出来ます）
![private_to_public.png](https://qiita-image-store.s3.amazonaws.com/0/58048/955dd779-c82e-dc0e-3bb4-fd7585e9b16f.png)
![menu.png](https://qiita-image-store.s3.amazonaws.com/0/58048/adfb9745-0053-5af8-7fc8-a7ac07e3427c.png)

Actionsの中から[Port Control]を選択すると下記のようなpublic, privateのport状態を選択できる画面が表示されます．
あとはpublic NetworkをDisconnectから100Mbpsに変更し，Updateボタンを押せば再度publicネットワークに接続できるようになります．
![menu2.png](https://qiita-image-store.s3.amazonaws.com/0/58048/8d44d317-e1ac-dfc2-2f73-fe3d3a642628.png)
ChromeのDeveloper Toolsで削除されたconsole.logを復元する

ChromeのDeveloper Toolsでページをスクレイピングしているときに値を確認しようとすると`console.log`が消されていることがある。

![console_log.png](https://qiita-image-store.s3.amazonaws.com/0/42193/77865904-742c-891d-7963-b4bf0dd87468.png)

そういう場合は一度`delete console.log`を実行すると使用できるようになる。

![delete_console_log.png](https://qiita-image-store.s3.amazonaws.com/0/42193/acc1aae6-459d-64db-5040-d372957c43bc.png)

`console.log`だけではなく`console.dir`や`alert`などのビルドイン関数ならこの方法で復元することができる。
ChromeのDeveloper Toolsで$0などの変数が使用できる理由

ChromeのDeveloper Tooks上のコンソールでは`$0`や`$$`などのCommandLineAPIを使用することができる。
しかし、これらの変数はコンソール上からのみアクセス可能で、ページ内のスクリプトからアクセス出来ない。
これを実現しているのはwith構文である。
with構文については[ここ](http://blog.tojiru.net/article/197591734.html)が詳しい。


```js
    console.log(0);
```

上記のスクリプトを実行するとコンソールにソースコードの位置が表示される。
そこをクリックすると実際に実行されたソースを読むことが出来る。

![commandline.png](https://qiita-image-store.s3.amazonaws.com/0/42193/c7fd066c-c300-5c23-330e-062022345d1a.png)

上記の画像のように`__commandLineAPI`がwithされており、この`__commandLineAPI`に`$0`などが定義されているからコンソール上で`$0`などを使用することができる。

## おまけ
コンソール上で`HogeHoge`と`}`を打ち込んだ場合、前者は`ReferenceError`、後者は`SyntaxError`が出る。(HogeHogeを定義していない場合)

![error.png](https://qiita-image-store.s3.amazonaws.com/0/42193/79eb454e-7e3d-e1f5-5170-c81ae065955a.png)

`SyntaxError`が出る場合のソースの位置は少し特殊なところである。
上の画像では`ReferenceError`では2行目なのに対して`SyntaxError`では762行目である。
このソースをみてみると以下のようになっている。

![syntax_error.png](https://qiita-image-store.s3.amazonaws.com/0/42193/3aa61448-d8a8-639c-49dc-499c9ead3ff2.png)

`InjectedScriptHost`や`evalFunction`という単語から、スクリプトを実行しているところだということがわかる。
`expression`という変数は実行されるスクリプトだということもわかる。
`with(__commandLineAPI || { __proto__: null }) {`という`prefix`と`}`という`suffix`を`expression`に付けることで新しい`expression`を作り出している。
ここで`expression`を作り出している式は単純な文字列の足し算であるため、コンソールで以下の文字列を入力してもエラーがでない。
`}{`

![noerror.png](https://qiita-image-store.s3.amazonaws.com/0/42193/6197f620-fa4d-6b33-724b-3a74eab62f7e.png)

これを利用すると`__commandLineAPI`を変数に代入することができる。

```js
}var CommandLineAPI=__commandLineAPI;{
```

![commandLineapi.png](https://qiita-image-store.s3.amazonaws.com/0/42193/8f6739ef-d588-dbd0-89c1-272b6a2cf56c.png)
MiddlemanでナビゲーションバーのActiveを制御する。

よくあるこんな感じのナビゲーションバーで

```erb:sample.html.erb
<div class="nav-collapse collapse">
   <ul class="nav">
     <li class="active"><a href="#">Page1</a></li>
     <li><a href="#">Page2</a></li>
     <li><a href="#">Page3</a></li>
   </ul>
</div>
```
表示しているページの`li`要素に`class="active"`を入れたい時
シンプルな方法がないかと色々試した結果、以下のヘルパーを追加し、
 
```ruby:config.rb
helpers do
  def navi_li(text, url)
    class_name = 'active' if url == current_page.url
    content_tag(:li, link_to(text, url), :class => class_name)
  end
end
```
ナビゲーションバー側で呼びだすとスッキリした。

```erb:sample.html.erb
<div class="nav-collapse collapse">
  <ul class="nav">
    <%= navi_li("Page1", "/page1/") %>
    <%= navi_li("Page2", "/page2/") %>
    <%= navi_li("Page3", "/page3/") %>
  </ul>
</div>

```

こちらで色々な実現方法が議論されてました。
http://forum.middlemanapp.com/t/active-navigation/584/4
Oculus酔いについて考える

この記事は Oculus AdventCalendar 12日目の記事です。


Oculusを付けて色々遊んでいると、没入感がめちゃくちゃあって楽しいのですが、
その没入感のせいかどうかわからないですが、どんどん気持ち悪くなってきます。

歩いてるのに、足が動いていないし、なんか眩しいし、焦点合わせるの難しいし。
これでは、せっかくの没入感が台無しですね。


# サイバー酔い（VR酔い）

> 目から入ってくる情報と体が感じる情報とがコンフリクトしてしまい、車の乗り物酔いのような不快感を生じる現象のこと

Oculusをつけている時の不快感はコレでした。
サイバー酔いに関する研究がいくつか行われており、効果音を工夫してサイバー酔いを軽減したり、
リアルなテクスチャを使って軽減したりと、色々なく風がなされています。

しかし、根本的な解決には至っておらず、今後人類がVR体験を楽しむための大きな障害であることは変わりがないようです。

# 慣れるのが一番早い説

個人差はあるとは思いますが、船乗りが船酔いしないのと同様に、VR探求者はVR酔いしなくなるのかもしれません。
しかし、Oculusは**それ自体が割りと重かったり**、**締め付けがあったりで** 正直あまり長時間つけていて気持ちのいいものではありません。

また、間違った装着の仕方や、視点の合わせ方をしたうえで、VR空間に適応すると、`斜視` や、`近視` の原因になりかねません。
ヴァーチャルの世界で生きていくのならそれでも良いのかもしれませんが、そうもいかないのが現状なので他の解決策を模索しましょう。


# キャリブレーション

VR酔を引き起こす大きな原因の一つが、`視点が合わなかった`り、`普段見ている世界と違った見方をしている` からだと思います。
ならば、ソフトウェア側で、そのズレを修正してあげれば良いのではないでしょうか。

Oculusのレンズエフェクトと左右のズレを修正して、キレイにモノが見えるまで調整すれば、違和感なくモノが見えるようになります。

また、Oculusを使っている人間は大抵座っているように思えるので、仮想現実の中でも座って移動できる乗り物だったり、そもそも動かなかったり
そういった世界の構築のキャリブレーションも必要なのではないでしょうか。


# ちんちんすくむ問題

そうです。ジェットコースターにのってる時に感じる、丹田がAlertを出している風のアレの問題はけっこう死活問題です。

VR空間をWASDで移動していると、段々足がそわそわしてきはじめて、やばて、ちんちんがすくみます。
高いところVRだと、特にちんちんすくみます。

おそらく女性でもちんちんすくむと思われます。

ちんちん掴みながらプレイするとけっこう緩和されますが、ヤバい奴に思われるので人の気のないところでやりましょう。

# VR酔いに人類が勝てる日はやってくるのか。

必ず勝てる日がやってくるでしょう。
僕らは、まだ原始的なカヤックに乗っているだけです。それは揺れるし転覆もします。
ですが、いつか大きな鉄の船を作ることに成功したら、その日が人類がVR酔に勝てる日なのかもしれません。
スクラムを乗りこなすために

# 自己紹介
　初めての方ははじめまして、そうでない方はいつもありがとうございます。

* IT技術者 6年生
* PHPer 5年生
* Rubyist 1年生
* Vimer 3年生
* Scrum Master 2年生

　だいたいそんな感じのエンジニアがお送りする[Livesense Advent Calendar 2014](http://qiita.com/advent-calendar/2014/livesense)の13日目になります。

# はじめに
　さて皆さんは開発手法としてどのような手法を利用されていますでしょうか？

* ウォータフォールモデル
* プロトタイピングモデル
* スパイラルモデル
* スクラム
* リーンスタートアップ

　などなどさまざまな手法がありますが、今回はそのなかでもスクラムに焦点をあてて、スクラムをうまく乗りこなすコツについて、短いながらも経験を通して学んだことをご紹介できればと思います。

# スクラムに潜む罠
　だいたいスクラムをはじめるにあたって、陥りやすい罠というものはいくつかパターンがあります

1. プラクティスとテクニックの混同
1. 解決したいことが不明  
1. 役割と責任が曖昧なまま
などなど...

　今回はとくに上記の1.についてのお話をご紹介したいと思います。

# プラクティスとテクニック
　「プラクティスとテクニックの混同」とは、たとえば「カンバン作らなきゃ」とか「相対見積もりしなきゃ」とか「プランニングポーカーしなきゃ」とかのやつ。
　カンバンとかストーリーポイントとかプランニングポーカーとかはスクラムの **プラクティス(must要件)ではありません。あくまでテクニックです。**
　must要件なのは **「役割」「イベント」「成果物」** の三つくらい。先述のテクニックはそれらをうまく乗りこなすためにあるもので、枝葉でしかありません。乱暴にいうと[スクラムガイド](http://www.scrumguides.org/docs/scrumguide/v1/Scrum-Guide-JA.pdf)に書かれていないのは全部テクニックだと思っていただいていいと思います。

# スクラムによる効能
　上記を踏まえて、スクラムによる効能を再確認。スクラムはなんでもなおる万能薬ではありません。あくまで効能は限定的。その効能とは **「問題点の見える化」** です。
　スクラムを導入して少しすると、チームに潜む問題点がいっぱい見えてきます。

* 設定された優先順位通りに作業が進行しない
* 見積もりが人によってばらばら
* 進捗がわかりづらい  
などなど...

　なぜ、こういった問題点が見える化されるのか。それは先にあげた「役割」「イベント」「成果物」のいずれかがうまくいかないからです。

# スクラムと付き合う
　先述の通り、スクラムとの付き合いを初めた瞬間から、スクラムはすごい勢いでプロジェクトに潜む問題点をあげつらってくれます。しかしながらどれが一番ヤバいのかは教えてくれません。また導入当初にはやり方が変わることによって、チームの生産性が一時的に低下することも相まって、 **プロジェクトがすごく悪い状態であるかのような錯覚** を覚えます。ここでよくある反応は下記の二つです。

* うちにはスクラムはあってなかった...やめよう...
* もっとちゃんとスクラムをやれはうまくいくはず！カンバン使ってユーザーストーリーで書いて相対見積もりして(中略)全部やればうまくいくはず！

　まあだいたい一個目に流れるでしょう。二個目はよっぽどの盲信者でなかったらならないかもしれません。

# スクラムを乗りこなす
　スクラムを乗りこなすために、おすすめなのは **「自分たちにとって必要なものはなにか」** を一度立ち止まって考えてみること。スクラムが教えてくれた問題点について、チームみんなで優先順位をつけてみることです。
　そうやって最優先に選ばれた問題点を解決したい時、やっと最初にあげたいろいろなテクニックが役立ちます。

* 設定された優先順位通りに作業が進行しない
	* 原因)プロダクトオーナーが考える価値観がチームに伝わっていない
		* 対策)ユーザーストーリー形式で説明して伝わるか試す
* 見積もりが人によってばらばら
	* 原因)メンバーによってスキルのばらつきが大きい
		* 対策)相対見積りでばらつきを低減できるか試す
* 進捗がわかりづらい
	* 原因)誰が何をやっているのかがわからない
		* 対策)カンバンを作って進捗が見える化できるか試す

　最初から完璧であろうとうすることは不可能です。すべての問題を一度に解決することも困難です。一度に一つか二つ、それくらいが現実的。

# スクラムのその先

　今回のご紹介はとくにスクラムの導入の最初期、具体的にいうと長くても半年くらいまでにぶつかるであろう事柄について取り上げました。もっとながくスクラムをやっていくと、もっとさまざまな問題とぶつかるでしょう。
　そういった時は原点に立ち返ることがおすすめ。[スクラムガイド](http://www.scrumguides.org/docs/scrumguide/v1/Scrum-Guide-JA.pdf)だったり、さらにその原点であるところの[アジャイルソフトウェア開発宣言](http://agilemanifesto.org/iso/ja/)であったり、最近だと[エッセンシャル スクラム: アジャイル開発に関わるすべての人のための完全攻略ガイド](http://www.amazon.co.jp/%E3%82%A8%E3%83%83%E3%82%BB%E3%83%B3%E3%82%B7%E3%83%A3%E3%83%AB-%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0-%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E9%96%8B%E7%99%BA%E3%81%AB%E9%96%A2%E3%82%8F%E3%82%8B%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E5%AE%8C%E5%85%A8%E6%94%BB%E7%95%A5%E3%82%AC%E3%82%A4%E3%83%89-Oriented-Selection/dp/4798130508)なんて本も、忘れがちな基礎部分を思い出させてくれます。
　そしてなによりもチームのメンバーとのコミュニケーションが一番いろいろなことを教えてくれます。

　今回は以上です。明日はからあげとらーめんがすきなwebエンジニア[raamen](http://qiita.com/raamen)さんによる記事になります。それでは皆さんも、用法容量を守ってより良いスクラムライフをお楽しみください。
Gradle BuildシステムのバージョンアップでAPIが変わってる [Gradle DSL method not found: 'runProguard()']


Android Studioの1.0がリリースされたということでさっそくバージョンアップしたらビルド時に早速エラーが出ていました。

```
Error:(23, 0) Gradle DSL method not found: 'runProguard()'
Possible causes:

The project 'PhotoSharingApp' may be using a version of Gradle that does not contain the method.

The build file may be missing a Gradle plugin.

```

調べてみたら見つけました↓
http://stackoverflow.com/questions/27078075/gradle-dsl-method-not-found-runproguard

`runProguar`の代わりに`minifyEnabled`を使えってことのようです。
これで試してみたら別の箇所で同じようなエラーが発生してしまいました。

どうやらこの辺の問題は`Android Gradle plugin`のバージョンアップに関係しているようです。個人プロジェクトのリポジトリを確認しますと、`build.gradle`内で

```
-        classpath 'com.android.tools.build:gradle:0.12.2'
+        classpath 'com.android.tools.build:gradle:1.0.0'
```
と変更が加えられていました。Android StudioをバージョンアップしたタイミングでGradleプラグインのバージョンも上げられていたようです。
そこで[リリースノート](http://tools.android.com/tech-docs/new-build-system)を確認してみることに。
するとありました、一部抜粋します。

```http://tools.android.com/tech-docs/new-build-system
0.14.0 (2014/10/31)

DSL/API changes:
Renamed a few properties to make things more consistent.
BuildType.runProguard                 ->  minifyEnabled
BuildType.zipAlign                    -> zipAlignEnabled
BuildType.jniDebugBuild               -> jniDebuggable
BuildType.renderscriptDebug           -> renderscriptDebuggable
ProductFlavor.renderscriptSupportMode -> renderscriptSupportModeEnabled
ProductFlavor.renderscriptNdkMode     -> renderscriptNdkModeEnabled
BuildType/ProductFlavor/SigningConfig queried through the variant and variantFilter API are now read-only.
These objects have always been global and changing them would have side effects in other variants
Merged flavor is still per-variant and can me modified
Variant / VariantOutput API change
Getting the value of the density or ABI filter is done with
output.getFilter(com.android.build.OutputFile.DENSITY)
output.getFilter(com.android.build.OutputFile.ABI)
See densitySplit sample
```

というわけで上記のようにAPIがリネームされているので使ってるのものがあれば対応する必要があります。
これで元通りビルドが通るようになりました。
お困りの方はご参考までに。

でもこれくらいエラーメッセージ出して欲しいよなあ。。。

----
その他参考サイト:
http://d.hatena.ne.jp/paraches/20141128/1417154420
関数のプレースホルダ構文の挙動

# コレクションのfilterで?!な挙動
例として、ある数列の中から3より大きい数のうち一番初めに出現するものを出力するという問題があった時に下記のように書くと思います。(findは使わない前提で...)

```scala
	val seq = Seq(1, 2, 3, 4, 5, 6, 7, 8, 9)
	seq.filter(_ > 3).take(1).foreach(println)
```
ただ、これでは3より大きい一番初めの数だけわかればいいのに、Seq内のすべての数についてfilterで渡した関数でフィルタリングして新しいシーケンスを作ってしまいます。
この動作を可視化しようと下記のようにprintlnで"呼ばれた"と出力する処理を追加してみました。

```scala
	val seq = Seq(1, 2, 3, 4, 5, 6, 7, 8, 9)
	seq.filter{println("呼ばれた");_ > 3;}.take(1).foreach(println)
```
上のコードを実行した結果の出力は
>呼ばれた
4

になります。
あれ、、、フィルタ用の関数が9回呼ばれるわけではないんですね。
# そんなわけはない
な筈はないので、下記のように冗長に書きなおしてみました。

```scala
	val seq = Seq(1, 2, 3, 4, 5, 6, 7, 8, 9)
	seq.filter((i: Int) => {println("呼ばれた");i > 3;}).take(1).foreach(println)
```
上記を実行すると、
>呼ばれた
...(略)
呼ばれた
4

やった！やっぱり9回も無駄に呼ばれているようです。
# プレースホルダの正体
これ、どうやら匿名関数内のプレースホルダは下のように置き換えたのと同じような動作になるようです。
※元は上から2番めのコード

```scala
	val seq = Seq(1, 2, 3, 4, 5, 6, 7, 8, 9)
	seq.filter{println("呼ばれた");i => i > 3;}.take(1).foreach(println)
```
よく見てみると、filter関数には「一回printlnを呼んでから、(Int) => Boolean型の関数を返す」ブロックを渡している！
あまり深く考えずに{}で囲ってfilter関数に渡していましたが、やりたいことの意味が全然違いますね。。。

という訳で、下記のように書いても意図する処理結果になります。

```scala
	val seq = Seq(1, 2, 3, 4, 5, 6, 7, 8, 9)
	seq.filter{i => println("呼ばれた");i > 3;}.take(1).foreach(println)
```

viewで遅延評価されるようにして、

```scala
	val seq = Seq(1, 2, 3, 4, 5, 6, 7, 8, 9)
	seq.view.filter{i => println("呼ばれた");i > 3;}.take(1).foreach(println)
```
最適化した結果はこうですね
>呼ばれた
呼ばれた
呼ばれた
呼ばれた
4

# まとめ
関数(ブロック)にデバッグ仕込む時には、最終的にどういう意図のコードになっているかちゃんと見ましょう。
そうしないと、変なとこで嵌ってしまいます（泣）

```scala
	val f1 = (n: Int) => n > 3
	val f2: (Int) => Boolean = _ > 3
```
上記の関数f1とf2によく見ずに同じように処理を追加しようとすると嵌ります。
というか、合成して新しい関数を定義すべきですね。
QGraphcsViewでBox2Dを表示する。

##<a href="http://doc.qt.io/qt-5/qgraphicsview.html">QGraphicsView</a>とは
Qtの2DGraphicsAPi

##<a href="https://code.google.com/p/box2d/">Box2D</a>とは
言わずとしれた、C++で実装された2D物理エンジン

##なぜQGraphicsViewを使うのか
OpenGL ES めんどくさい。
テクスチャ読み込みとか、Box2D→OpenGL ESの変換とか、その他諸々

QGraphicsView で描画できるもの

円
<a href="http://doc.qt.io/qt-5/qgraphicsellipseitem.html">QGraphicsEllipseItem</a>
描画できます。
矩形
<a href="http://doc.qt.io/qt-5/qgraphicsrectitem.html">QGraphicsRectItem</a>
描画できます。
多角形
<a href="http://doc.qt.io/qt-5/qgraphicspolygonitem.html">QGraphicsPolygonItem</a>
もちろん、描画できます。
画像
<a href="http://doc.qt.io/qt-5/qgraphicspixmapitem.html">QGraphicsPixmapItem</a>
当然
動画
<a href="http://doc.qt.io/qt-5/qgraphicsvideoitem.html">QGraphicsVideoItem</a>
文字
<a href="http://doc.qt.io/qt-5/qgraphicstextitem.html">QGraphicsTextItem</a>

何より
<a href="http://doc.qt.io/qt-5/qgraphicsscene.html">QGraphicsScene</a>で、
クリックした座標、クリックされたQGraphicsItemのポインタが取得出来ます。

##スクリーンショット 
![Screenshot_2014-12-13-02-03-44.jpg](https://qiita-image-store.s3.amazonaws.com/0/61466/8d526859-a005-9046-abe6-c72aa537a299.jpeg)　![Screenshot_2014-12-14-00-04-09.jpg](https://qiita-image-store.s3.amazonaws.com/0/61466/bef2a68a-8fe4-e682-9255-40f1c4bb1fbc.jpeg)

##実装
たいしたコードではないですが、<a href="https://github.com/yasukikudan/Kudan_qt_box2d_demo">github</a>に置きます。

QGraphicsItemの円、矩形、ポリゴンは、
頂点座標のスケールさえ変換すればBox2Dと相互に利用できます。
//Box2Dでは32px=1メートルが推奨

QGraphicsPixmapItemの座標は、左上基準なので回転などを上手く表示出来ません。
QGraphicsEllipseItemかQGraphicsRectItemの子アイテムに設定して、左上の絶対座標を設定します。
左上の絶対座標はQGraphicsEllipseItem,QGraphicsRectItemのコンストラクタ引数のQRectから流用すればOK


QGraphicsViewはその名の通り描画のみ行うクラスなので、
処理自体はQGraphicsSceneを継承したオブジェクトに記述します。

##おまけ
<a href="http://doc.qt.io/qt-5/qaccelerometer.html">QAccelerometer</a>
    Qt5.1からQAccelerometerクラスが追加され、
    スマートフォンやタブレットの加速度センサーにQtからアクセスできるようになりました。
    このデモではBox2Dの重力設定に加速度センサーの値を使用しています。

    //初期化 重力方向取得モード
    Accelerometer->setAccelerationMode(QAccelerometer::Gravity);
    Accelerometer->setActive(true);
    //読み出し
    auto gravity=Accelerometer->reading();
    //重力方向取得
    gravity.x();gravity.y();

アプリの操作に加速度センサーからの値を用いる場合
プロジェクトにAndroidManifest.xmlを追加して
android.permission.SET_ORIENTATION権限
android:screenOrientation="portrait"or"landscape"
の2つ指定して画面の自動回転とめたほうがいいでしょう。
Androidのxmlで右下に配置する方法

Androidのマテリアルデザインでは右下に丸いボタンが配置されることが多いのですが、これをxmlで書く場合はどのようにすればいいのか少し手間取ったのでメモ

```
FrameLayout
├-メインのビュー
└-RelativeLayout-ボタン
```

このように、FrameLayoutでメインのビューの上にレイヤーのようにしてRelativeLayoutを乗せます。

ボタンは

```
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
```

とすることで右下に配置することが出来ます。
これだとぴったし右下に配置されるので、マージンを設定するといい感じに配置出来るかと思います。
Swift+ParseでBuild時にApple Mach-O Linker Errorが出るときの対処法(2014年12月13日時点）

SwiftでBaaSとして、Parseをサクッと導入したい方多いと思います。

しかし、導入後、初回Build時に「Apple Mach-O Linker Error」が起こり、はまりましたので、解決法を記しておきます。※これは2014年12月13日時点のものであり、解決される可能性があります。

https://parse.com/questions/cocoapods-incompatibility

での議論を読む限り解決方法は

・TARGETS > Build Settings > Linking > Other Linker Flags 
より　 -ObjC　を取り除く。
・Facebook SDKを追加する。
※cocoapodで追加した場合は、TARGETS > Build Phases > Link Binary With Libraries に libPods-Facebook-iOS-SDKを追加する

の二つのようです。

しかし、前者の場合、他に使用しているライブラリがObjectiv-Cを使っていたりするとエラーが起こります。ライブラリ含めてSwiftのみという場合に選択するといいと思います。後者の場合は、Facebook SDKを利用する必要がなくても、これを追加することで、Parseの問題が解決します。不思議です。
ToolBarの背景色やオプションメニューの色を変更する方法

[AppCompat v21](http://android-developers.blogspot.jp/2014/10/appcompat-v21-material-design-for-pre.html)で`ToolBar`を使う場合に、テーマの色設定がToolBarのどこに影響を与えるかのメモです。

[AppCompat v21](http://android-developers.blogspot.jp/2014/10/appcompat-v21-material-design-for-pre.html)のドキュメントにあるように、`res/values/themes.xml`の中に共通テーマを作ってそれを適用しています。

```res/values/themes.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="NoActionBarTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- ToolBarの背景色 -->
        <item name="colorPrimary">@color/cyan500</item>
        <item name="colorPrimaryDark">@color/cyan600</item>
        <!-- ToolBarのタイトルテキスト色 -->
        <item name="android:textColorPrimary">@color/white</item>
        <!-- ToolBarのオプションメニューのOverflowアイコンの色 -->
        <item name="android:textColorSecondary">@color/white</item>
        <item name="windowActionModeOverlay">true</item>
        <item name="android:windowBackground">@null</item>
    </style>

</resources>
```

```androidManifest.xml
<application
    android:allowBackup="true"
    android:hardwareAccelerated="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:theme="@style/NoActionBarTheme">

    <!--略-->

</application>
```

```layouts/activity_main.xml
<!-- app:popupThemeで、オプションメニューのOverflowアイコンを押したときのポップアップメニューのテキスト色や背景色を設定 -->
<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    app:popupTheme="@style/Theme.AppCompat.Light" />
```
EdisonでArduinoスケッチとのプロセス間通信

# はじめに
ひょんな事から，Intel Edison Kit for Arduinoを入手したので，ちょっと遊んでみました．

ArduinoスケッチはEdisonで走ってるLinuxの一プロセスとして動いています．それならば，センサーの読み取りなどはArduinoに任せて，高度な処理（インターネットへの接続やWebサーバとか）はEdisonに任せようとか思うわけです．ちょうど，[Intel Developer Zone](https://software.intel.com/en-us)に

[Efficient communication between Arduino\* and Linux native processes](https://software.intel.com/en-us/blogs/2014/09/22/efficient-communication-between-arduino-and-linux-native-processes#_ga=1.131696271.1267878252.1412838079)

という記事があったので，紹介します．**元記事がかなり丁寧でサンプルコードがあるので，ぜひ目を通してください．**

なお，Edisonと書いてる部分をGalileoに読み替えても可．

# ３行で

- ArduinoはLinux上のプロセスとして動いている
- データのやりとりは，プロセス間でメモリ領域を共有することで行う(unixシステムコール使う)
- pthread使って，排他制御と値の変更の通知をする


以下，要約
---

ArduinoスケッチとEdisonで次の基準をみたすような通信をしたい

1. ディスクへの書き込みをしない（diskの消耗を減らす，パフォーマンスの改善）
2. イベントによってトリガーされる（定期的に読みに行ったりしない）


## データのやりとり

ArduinoスケッチはLinuxで動くプロセスにすぎない．Linuxにおけるプロセス間通信の方法はいくつかあるが，この記事では「メモリ領域の共有」を利用している（memory mapped IPCって日本語で何て言うの）

## 排他制御

メモリ領域の共有はできた．しかし，複数のプロセスが同時に読み書きすると大変なことになってしまう．そこで，[mutex](http://ja.wikipedia.org/wiki/%E3%83%9F%E3%83%A5%E3%83%BC%E3%83%86%E3%83%83%E3%82%AF%E3%82%B9)を使う．この記事では[pthread](http://ja.wikipedia.org/wiki/POSIX%E3%82%B9%E3%83%AC%E3%83%83%E3%83%890)を使っている．

Lockは`pthread_mutex_lock/pthread_mutex_unlock`でサンドイッチしたらよい．

```c
pthread_mutex_lock(&mutex);

// ここで共有メモリ領域の読み書きをする

pthread_mutex_unlock(&mutex);
```

## 通知

条件変数(condition variables)を使えば実現できる．条件変数を使うと，他のスレッドが条件を送信するまで，スレッドの停止する．

例えば，Edison側でLEDのon/offを制御し，実際にGPIOを操作するのはArduinoに任せるといった場合

```cpp
// Arduinoスケッチ
// dataはEdison側と共有しているとする

struct Data {
  bool led_on;
  pthread_mutex_t mutex;
  pthread_cond_t cond;
};

Data *data;

/*** 中略 ***/

void loop() {
  pthread_mutex_lock(&(data->mutex));
  pthread_cond_wait(&(data->cond), &(data->mutex));  // 条件が送信されるまで待つ

  // フラグによりGPIOの電圧変える
  digitalWrite(PIN, data->led_on ? HIGH : LOW);

  pthread_mutex_unlock(&mutex);
}
```

```cpp
// Edison 
// LEDのon/offのフラグを変えたあと，通知をする

pthread_mutex_lock(&(data->mutex));

data->led_on = true;

pthread_mutex_unlock(&(data->mutex));
pthread_cond_signal(&(data->cond));   // 条件の送信
```


# 感想

- C++11の`std::mutex`や`std::condition_variable`使うともうちょっとスッキリしそう
- Arduinoスケッチでシステムコール呼べるならsocketとかも試してみたい．
パッケージ開発のPLとして考えてたこと

# ０．はじめに
パッケージ開発に携わってかれこれ十数年。
チームリーダーやプロジェクトリーダーとして考えていたこと／いることを、自身のふりかえりも兼ねてまとめていきます。

# １．Will/Should/Canのバランス
「<b>Will（やりたいこと）</b>」「<b>Should（やるべきこと）</b>」「<b>（できること）</b>」をどうバランスさせるか。

プロジェクトの開始時点から「Should」や「Can」ばかりに重点を置いてしまうと、どうしても途中で退屈したり息切れしやすくなってしまいがち。
なので、できるだけ「Will」から始めて、徐々に「Should」や「Can」に重なっていくよう意識してました。

このバランスを意識するようになってからは、パッケージ開発って面白いんだな、と自然と思えるようになりました。

# ２．チームづくり
人が集まるだけではチームにならない、というのはよく聞く話し。
いまだに悩むことが多いテーマです。

はじめに意識したのは「<b>意見を聴く</b>」ということ。
自分自身がずけずけ言ってしまうタイプ（？）なので、他のメンバーの発言量が少ないと、チームの雰囲気が重苦しくなりがちに。。
そうなると仕事そのものも楽しめなくなるし、チームも育たないしで悪循環に陥ってしまうので。

それから「意見を聴く」の延長で、KPTで「<b>ふりかえり</b>」をやってみたり「<b>朝会</b>」をやったりと、チームという枠を意識できる時間も積極的に設けてきました。
特に「ふりかえり」は強力で、マンネリや惰性を回避しつつ、その<b>チーム独特の習慣や雰囲気をつくる</b>のに一役も二役も買ってくれました。

# ３．リーダー
リーダーはたんなる役割。
偉くもないので勘違いしない、驕らない、完璧であろうとしない。

開発プロジェクトを進めていると、多かれ少なかれリーダーが決定を下す場面があります。
そこで自分を勘違いしてしまうとオレ様仕様だらけのパッケージをリリースしてしまうことになるので、「<b>謙虚に学ぶ／意見を求める</b>」ことを忘れちゃいけない。

でも、自分を殺しすぎてもヘタれてしまうので、やっぱりここでもバランスが肝要。

# ４．育成
普段の開発業務やプロジェクトを通して、いかに人を育てるか、ということを意識してもしすぎることはないと思います。

特に、自分よりも若い人には積極的に成長する<b>機会をつくる</b>必要があります。
自分では相手を伸ばしているつもりでも、不思議とこちらが多くのことを学ぶ機会が訪れます。

それから、できるだけ苦手なことよりも<b>得意なことを伸ばす</b>ように心掛けてます。
チームで開発をするうえでは、まるすぎる人は活きないので。
ひとりの中でバランスをとるよりも、チーム全体でバランスがとれれば、一方の苦手を他方の得意でカバーする「チーム志向」の意識が生まれやすいんだと思います。

# ５．遊びをつくる
開発プロジェクトはお堅いもの。
なのかもしれませんが、設計にしろ実装にしろテストにしろ、良いアイデアや工夫は余裕がある人ほど湧いてくるものだと思ってます。

なので、<b>仕事をゲームできる</b>ように工夫することを考えます。
ブレインストーミングをカードゲームにしてみたり、タスクボードでは色も形も様々な付箋を使ってみたり。ふりかえりは貴重なレクリエーションの一部だし。

眉間にシワだらけのプロジェクトにしないように、「<b>遊びをつくる</b>」ことはリーダーの大切な役割だと思ってます。

# ６．まとめ
開発プロジェクトでは、QCDやスコープももちろん考えていますが、ここに挙げたことたちは自分の中ではそれ以上に重要なことだと捉えています。
人間系のテーマが多いのは、パッケージ開発に限らずやはりソフトウェアの開発は「人」に拠るところが大部分を占めるからだと思います。

ここに書いてあることは「考えていたこと」であって、すべてを完璧に「できていたこと」ではありません。
リーダーとして特別に素晴らしい解があるわけでもないです。。

人それぞれリーダー像は異なると思うので、こんなことを考えてる人もいるのね、と一例として受けとめてもらえればありがたいです。
JBoss で MySQL のデータソース作成(Windows 環境)

初投稿なので、あしからず…


# 1. MySQL の ドライバ落とす

下記の URL より MySQL の Java のドライバをダウンロードします。

[MySQL 公式サイト - MySQL コネクタ](http://www-jp.mysql.com/products/connector/)

※ MySQL 開発 より **JDBC Driver for MySQL** を落としましょう

※ ただし、Oracle のアカウントが必要となるので注意しましょう

# 2. MySQL コネクタをインストール

1. でダウンロードした MySQL コネクタを自環境にインストールします。

※ 普通にインストーラ実行すればおｋです

# 3. インストールしてできたコネクタの jar を JBoss にデプロイ

2. のインストールが完了すると、下記のようなディレクトリにドライバがあると思うので、それを JBoss の管理コンソールからデプロイします。

`C:\Program Files (x86)\MySQL\MySQL Connector J\mysql-connector-java-5.1.34-bin.jar`

**JBoss 管理画面** より
[**Runtime**]タブ -> [**server**]サブメニュー - [**Manage Deployments**] より

[**Add**] ボタン押下 -> [**Step1/2: Deployment Selection**] より上記ドライバファイルを選択 ->  [**Step 2/2: Verify Deployment Names**] でそのまま [**save**] を押下
[**En/Disable**] で有効化

# 4. データソース 作成

上記でデプロイしたドライバを使って、データソースを作成します

**JBoss 管理画面** より
[**Configuration**] タブ -> [**Connector**]サブメニュー - [**DataSources**] より

[**Add**] ボタン押下 -> [**Step 1/3: Datasource Attributes**] において、下記のように入力

<dl>
 <dt>Name</dt>
 <dd>好きなように分かりやすく 例) <code>MySQL56_<em>データベース名</em></code> </dd>
 <dt>JNDI Name</dt>
 <dd>例) <code>java:jboss/datasources/MySQL56_<em>データベース名</em></code></dd>
</dl>


[**Step 2/3: JDBC Driver**] にて先ほどデプロイした jdbc ドライバを選択します


[**Step 3/3: Connection Settings**] ではデータベース(MySQL)側の要件を入力します


<dl>
 <dt>Connection URL:</dt>
 <dd>例) <code>jdbc:mysql://localhost:3306/<em>データベース名</em></code></dd>
 <dt>Username</dt>
 <dd>MySQL のユーザ名を入力します</dd>
 <dt>Password:</dt>
 <dd>同様にパスワードを入力します</dd>
 <dt>Security Domain</dt>
 <dd>分からなかったので空白^^;(わかる方教えて下さい)</dd>
</dl>

上記入力後、[**Test Connection**] で接続できることを確認後、[**Done**] を押して作成を完了します

[**Enable**] で有効化も忘れずに！
zshの設定ファイルの構成

zsh Advent Calendar 2014 23日目

私のzshのディレクトリ構成を紹介します。
[oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh)は全く使って無くて完全に自分の趣味のディレクトリ構成になってます。

# ディレクトリ構成

```text:Directory
$HOME
├── .zsh.d/
├── .zshenv
├── .zshenv_config/
│    └── .zsh_00_path
├── .zshrc
└── .zshrc_config/
     ├── .zsh_00_alias
     ├── .zsh_01_prompt
     ├── .zsh_02_zaw
     ├── .zsh_09_tmuxinator
     ├── .zsh_10_BusterJS
     ├── .zsh_10_exenv
     :
     :
```

# 設定ファイル

## .zshenv関連
対話式以外でzshを起動する事はないので、.zshenvの設定を.zshrcに移動しても良いのですが、path等は.zshenvに設定してます。

```zsh:.zshenv
#-*- mode: shell-script; coding: utf-8; -*-
unlimit
limit stacksize 8192
limit coredumpsize 8192
limit -s

umask 022

export LANG=ja_JP.UTF-8
export LC_ALL=ja_JP.UTF-8

# Setup command search path
typeset -U path

export RSYNC_RSH=ssh
export CVS_RSH=ssh

for conf in $HOME/.zshenv_config/.zsh_*; do
        source ${conf};
done
```

最後の部分で、.zshenv_config/内のファイルを読み込んでます。

## .zshrc関連

```zsh:.zshrc
HISTFILE=~/private/.zsh_history
HISTSIZE=10000000
SAVEHIST=10000000
function history-all() { history -E 1 } # 全履歴の一覧を出力する

autoload -Uz history-search-end
zle -N history-beginning-search-forward-end  history-search-end
zle -N history-beginning-search-backward-end history-search-end
bindkey '\eP' history-beginning-search-backward-end    #Esc-P
bindkey '\eN' history-beginning-search-forward-end     #Esc-N
FCEDIT=vi   # fc -e viと同じ

autoload -Uz up-line-or-beginning-search down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey '^P' up-line-or-beginning-search
bindkey '^N' down-line-or-beginning-search
#
# snip
#
manpath=(/usr/*/man(N-/) /usr/local/*/man(N-/) ${manpath})

hosts=(`hostname` example.com)

zmodload zsh/files     # mv / cp / chgrp等のコマンドをzshのbuilt-inコマンドに置き換える。
#
# snip
#
zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters

zstyle ':completion:*' hosts $hosts

# rm以外のコマンドで*.oファイルなどは保管しない。
zstyle ':completion:*:*:(^(rm)):*:*files' ignored-patterns '*?.o' '*?.c~' '*?.old' '*?.pro'

zstyle ':completion:*' list-separator '-->'
#
# snip
#
for conf in $HOME/.zshrc_config/.zsh_*; do
	source ${conf};
done

```

最後の部分で、.zshrc_config/内のファイルを読み込んでます。
.zshrc_configの中は以下の様になっていて、数字の若い順番に読み込んでいます。
使わなくなって設定は、頭に`not-source`を付けて`for in`で読み込ませないようにしてます。

```text:Filelist
.zsh_00_alias
.zsh_00_prompt
.zsh_00_zaw
.zsh_10_busterjs
.zsh_10_exenv
.zsh_10_golang
.zsh_10_highlighting
.zsh_10_java
.zsh_10_jstestdriver
.zsh_10_nenv
.zsh_10_rbenv
.zsh_10_tmuxinator
.zsh_20_antlr
.zsh_20_kerl
.zsh_20_peco
.zsh_30_gcsdk
not-source.zsh_10_rvm
```

## .zsh.dディレクトリ

.zsh.dには以下のモジュールをgit cloneして置いてます。

```text:Libraries
zaw
zsh-completions
zsh-syntax-highlighting
```

# まとめ

かなりコンパクトな構成になっているのですが、zshが元々強力なので全然問題ないです。
ぜひ、自分で設定ファイルを0から書いてみてください。結構面白いですよ。
Blenderのショートカット（オブジェクトモード編）

# Blenderのショートカット（オブジェクトモード）

間違いや、良く使うもので漏れているものがあればコメントお願いします。

<dl>
<dt>TAB</dt><dd>エディットモードへ</dd>
<dt>Alt+C</dt><dd>曲線/メッシュの相互変換メニューをポップアップ</dd>
<dt>Alt+G</dt><dd>移動をリセット</dd>
<dt>Alt+R</dt><dd>回転をリセット</dd>
<dt>Alt+S</dt><dd>拡大・縮小をリセット</dd>
<dt>Ctrl+TAB</dt><dd>ウェイト・ペイントモードへ</dd>
<dt>Ctrl+A</dt><dd>適用（移動/回転/拡縮）メニューポップアップ</dd>
<dt>Ctrl+B</dt><dd>レンダー境界設定（MMDでボックス選択）</dd>
<dt>Ctrl+Alt+B</dt><dd>レンダー境界解除</dd>
<dt>Ctrl+L</dt><dd>リンクメニューをポップアップ</dd>
<dt>M</dt><dd>オブジェクトのレイヤー移動メニューをポップアップ</dd>
<dt>Ctrl+Alt+0</dt><dd>選択中のカメラをアクティブにしてカメラ視点</dd></dd>
<dt>Ctrl+J</dt><dd>複数オブジェクトを統合（Join）</dd>
<dt>Ctrl+P</dt><dd>親子設定メニューポップアップ</dd>
<dt>Alt+P</dt><dd>親子設定解除メニューポップアップ</dd>
</dl>
Blenderのショートカット（オブジェクトモード/エディットモード共通編）

# Blenderのショートカット（オブジェクトモード/エディットモード共通）

間違いや、良く使うもので漏れているものがあればコメントお願いします。

<dl>
<dt>T</dt><dd>ツールパネル　表示/非表示切り替え</dd>
<dt>N</dt><dd>数値パネル　表示非表示切り替え</dd>
<dt>X</dt><dd>削除</dd>
<dt>G</dt><dd>移動</dd>
<dt>R</dt><dd>回転</dd>
<dt>S</dt><dd>拡大・縮小</dd>
<dt>GX</dt><dd>X軸に沿って移動(グローバル) Y軸・Z軸も同様</dd>
<dt>GXX</dt><dd>X軸に沿って移動（ローカル） Y軸・Z軸も同様</dd>
<dt>Shift+A</dt><dd>オブジェクト・要素の追加</dd>
<dt>Shift+C</dt><dd>3Dカーソルをセンターに移動</dd>
<dt>A</dt><dd>全選択/全選択解除</dd>
<dt>F3</dt><dd>操作履歴をポップアップ</dd>
<dt>HOME</dt><dd>全てのオブジェクトが見えるように視点変更</dd>
<dt>/</dt><dd>ローカルモード/グローバルモード</dd>
<dt>.</dt><dd>選択対象にズーム</dd>
<dt>Shift-B</dt><dd>ボックス選択でズーム</dd>
<dt>Shift+D</dt><dd>複製</dd>
<dt>Alt+D</dt><dd>リンクを作成</dd>
<dt>Shift+R</dt><dd>最後の操作をリピート</dd>
<dt>Shift+S</dt><dd>スナップメニューをポップアップ</dd>
<dt>Ctrl+UP</dt><dd>全画面表示設定/解除</dd>
<dt>Shift+Space</dt><dd>全画面表示設定/解除</dd>
<dt>Ctrl+Left</dt><dd>ウィンドウレイアウト変更</dd>
<dt>Ctrl+Right</dt><dd>ウィンドウレイアウト変更</dd>
<dt>Ctrl+F3</dt><dd>画面をキャプチャして保存</dd>
<dt>NUM1</dt><dd>視点を真正面に</dd>
<dt>NUM3</dt><dd>視点を右正面に</dd>
<dt>NUM7</dt><dd>視点を真上に</dd>
<dt>Ctrl+NUM1</dt><dd>視点を真後ろに</dd>
<dt>Ctrl+NUM3</dt><dd>視点を左正面に</dd>
<dt>Ctrl+NUM7</dt><dd>視点を真下に</dd>
<dt>Shift+NUM1</dt><dd>視点を選択対象の真正面に</dd>
<dt>Shift+NUM3</dt><dd>視点を選択対象の右正面に</dd>
<dt>Shift+NUM7</dt><dd>視点を選択対象の真上に</dd>
<dt>Shift+Ctrl+NUM1</dt><dd>視点を選択対象の真後ろに</dd>
<dt>Shift+Ctrl+NUM3</dt><dd>視点を選択対象の左正面に</dd>
<dt>Shift+Ctrl+NUM7</dt><dd>視点を選択対象の真下に</dd>
<dt>Shift+S</dt><dd>スナップメニューをポップアップ</dd>
<dt>NUM5</dt><dd>透視投影/垂直投影の切り替え</dd>
<dt>H</dt><dd>選択対象を隠す</dd>
<dt>Alt+H</dt><dd>隠しているオブジェクト/要素を表示</dd>
<dt>Z</dt><dd>ワイヤーフレームモードへ</dd>
<dt>Alt+Z</dt><dd>テクスチャモードへ</dd>
<dt>Shift+Z</dt><dd>レンダーモードへ</dd>
<dt>Ctrl+Alt+Q</dt><dd>４画面表示/解除</dd>
<dt>Ctrl+Z</dt><dd>アンドゥ</dd>
<dt>Ctrl+Shift+Z</dt><dd>リドゥ</dd>
<dt>Ctrl+Alt+Z</dt><dd>アンドゥヒストリ ポップアップ表示</dd>
<dt>Ctrl+S</dt><dd>ファイル保存</dd>
<dt>Ctrl+Shift+S</dt><dd>ファイル名を付けて保存</dd>
<dt>Space</dt><dd>コマンド検索ポップアップ表示</dd>
</dl>
【助けて】 MariaDB Galera Clusterでクエリログの保存方法

* [keepalivedで仮想IPを体験 - Qiita](http://qiita.com/tukiyo3/items/dc355dd456c0973b5a39)
* [MariaDB 10.0 Galera ClusterをCentOS7にインストール - Qiita](http://qiita.com/tukiyo3/items/0971f89b5ad3024f5680)

を利用し３台のDBサーバの１台だけをマスターとして利用、冗長化を構築できた。

しかし過去のクエリログを見たいがよくわからない・・・。

```bash:my.cnf
[mysqld]
binlog_format=ROW # <- galera clusterを利用する場合必須。
```

binlog_format=ROW のため mysqlbinlog を使ってもクエリのステートメントが保存されない。

## 追記

MariaDB Galera Cluster はPrimaryキーがないテーブルでDELETEやUPDATEは非対応とか読んだ。
やめたほうがいいのかな・・・

自分のスキルではmysql(mariadb) + DRBD + keepalivedが最適な気がしてきた。
GithubからQiitaに直接投稿できるQiitaButtonを作りました

# はじめに
こちらはQiita API V2 Hackathonで作ったツールです。

作成者: @naoto0822 & @fmy

# Qiita Buttonとは？
Heroku ButtonのようにGithubのREADME.mdに設置して使います。
ボタンを押して、QiitaにログインすることでQiitaにそのまま投稿できます。

# 使い方
こちらに記載してあります
[Github :point_right: Qiita](https://github2qiita.herokuapp.com/)

# 仕組み
Qiitaボタンを押して[Github :point_right: Qiita](https://github2qiita.herokuapp.com/)に遷移すると、リファラからレポジトリを割り出します。
レポジトリ内の`docs/`ディレクトリに含まれるmdファイルをGithub APIから取得し、投稿するmdファイルを選ぶ画面に行きます。
投稿するmdファイルが決定されると再度Github APIからファイルのblobを取得し、Qiita API v2を使ってQiitaに投稿します。
<br/> この投稿は[Github :point_right: Qiita](https://github2qiita.herokuapp.com/)から投稿されました。
リンク機能の細かい動きを把握する


[リンク機能を使うと、コンテナのリンク元の情報を環境変数や/etc/hostsから取得出来るようになる。](http://qiita.com/nyamage/items/197f520a0a8b4fd864df#1-1)

データベースとWebアプリのコンテナをリンクさせた例を使ってリンクの細かい動きを確認する。

```
$ sudo docker run -d --name db training/postgres
```

```
$ sudo docker run -d -P --name web --link db:db training/webapp python app.py
```

上記のコンテナを走らせた状態でwebコンテナの/etc/hostsを覗いてみる.

```
$ docker exec web cat /etc/hosts
(省略)
172.17.0.23	db

```

dbコンテナに対応するエントリが存在。
dbコンテナを一度リスタートした後、/etc/hostsを再度確認する。

```
$ docker exec web cat /etc/hosts
(省略)
172.17.0.25	db
```

dbコンテナに対応するエントリは存在するがIPアドレスが変わっている。
コンテナはリスタートするだけでIPアドレスが変わってしまうが、
linkしている場合、リンク元のコンテナがリスタートしてIPアドレスが変更された場合、自動で/etc/hostsに反映してくれるらしい。
但し、dbコンテナを一度削除して同名の名前でコンテナを作成した場合は/etc/hostsに反映されることはない。

```
$ docker stop db
$ docker rm db
$ docker run -d --name db training/postgres
```

同名のコンテナのipアドレスを確認してみる。

```
$ docker inspect -f {{.NetworkSettings.IPAddress}} db
172.17.0.26
```

webコンテナ側の/etc/hostsは古いまま。

```
$ docker exec web cat /etc/hosts
(省略)
172.17.0.25	db
```

Linking Containers Together
https://docs.docker.com/userguide/dockerlinks/
SwiftのenumでEitherを作る方法

__(2015.09.08 追記)__ Swift 2.0 ではこんなことをしなくても `Either` を作ることができるようになっています。 `Either` について詳しくは[こちら](http://qiita.com/koher/items/288f01cddb0bbb6aa4e1)。

__(2014.12.13 追記)__ ここに書いた方法は遅延評価の影響でクロージャにキャプチャされた変数が変更された時などに問題がありました。思い付きで書くと良くないですね。イミュータブルな世界なら問題ないのですが。

僕の思い付くミュータブルな世界でも使えるワークアラウンドは↓みたいな感じです。

```swift
enum Either<T, U> {
	case Left(Container<T>)
	case Right(Container<U>)
	
	static func left(left:T) -> Either<T, U> {
		return .Left(Container<T>(left))
	}
	
	static func right(right:U) -> Either<T, U> {
		return .Right(Container<U>(right))
	}
}

class Container<T> {
	let value: T
	init(_ value: T) {
		self.value = value
	}
}


let either1 = Either<Int, String>.left(123)
let either2 = Either<Int, String>.right("abc")

switch either1 {
case .Left(let integer):
	println(integer.value)
case .Right(let string):
	println(string.value)
}

```

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

Swift の `enum` は _Associated Value_ を使って _Tagged Union_ のようなことができるので、次のような型を作りたくなります。

```swift
enum Either<T, U> {
	case Left(T)
	case Right(U)
}
```

しかし、 Swift 1.1 時点では次のようなコンパイルエラーになってしまいます。

```
Unimplemented IR generation feature non-fixed multi-payload enum layout
```

これを回避して同じようなことをやるには `@autoclosure` を使うことができます。クロージャに包めば参照型になるのでサイズが固定されます。 Java でプリミティブ型をボクシングするのと似てます。

```swift
enum Either<T, U> {
	case Left(@autoclosure () -> T)
	case Right(@autoclosure () -> U)
}
```

`@autoclosure` は値を渡せば勝手にクロージャに変換してくれる機能です。上記の `Either` はクロージャの存在を気にせず次のように使えます。

```swift
let either1 = Either<Int, String>.Left(123)
let either2 = Either<Int, String>.Right("abc")
```

ただし、値にアクセスするときはコールして戻り値を得なければなりません。

```swift
switch either1 {
case .Left(let integer):
	println(integer()) // ここでコールのための () が必要
case .Right(let string):
	println(string()) // ここでコールのための () が必要
}
```

`@autoclosure` の逆のような `()` なしでアクセスするとコールした戻り値が得られる _Attribute_ があればいいんですけどね（その場合どうやって関数オブジェクトをとればいいんだという話はありますが。でもそれって _Property_ や _Subscript_ も同じ？）。

`@autoclosure` を使うのは有名な話なのかもしれませんが、ちょっと思い付いたので小ネタとして書いてみました。
[Vim] The colorscheme not working in iTerm2

Sometimes you set the `colorscheme` is not working.

One possible way is going to the Preferences -> Profiles -> Terminal. 

Set the `Report Terminal Type` to `xterm-256color`

Just like this:

![Screen Shot 2014-12-13 at 17.11.21.png](https://qiita-image-store.s3.amazonaws.com/0/51455/1a7f0e8d-ae9a-c142-7aef-5217325c5834.png)
selenium-webdriverテクニック集

# DOM要素の有無によって分岐する

```js:element_exists.js
driver.findElements(ElementLocator).then(function (elements) {
  if (elements.length) {
    //あり
  } else {
    //なし
  }
});
```

# Select要素を選択
```js:select.js
driver.findElement(By.xpath('//select[@name="名前"]/option[@value="値"]')).click();
```

# innerTextで要素を取得
```js:innerText.js
driver.findElement(By.xpath('//*[text()="値"]'));
```

# Xpathでのclass指定
```js:className.js
driver.findElement(By.xpath('//*[contains(@class,"クラス名")]'));
```
※部分一致なので完全ではないので、なるべく特定できるもので指定すること。
.emacs.dを整理する


# 対象
Emacsを少し触ったことがある人(.emacs.dの中を弄ったことがある人)

# 環境
Mac Book Pro Retina 13
Homebrew導入済み

# Emacsをインストールする
まずは、Emacsが無いと始まらないのでEmacsを入れます。
今回はHomebrewを使ってサクッと入れたいと思います。
[ここ](http://kawachodev.hatenablog.jp/entry/homebrew-cocoa-emacs-24.3)を参考にして

```
$ brew install --cocoa --japanese --with-gnutls -srgb emacs
$ brew linkapps
```

# caskとpalletをインストール
パッケージ管理はcaskとpalletを使おうと思います。
cask?pallet?何それ?おいしいの?って人は適当にググって下さい(丸投げ)

この記事の手順にそって入れていきます。

[Qiita:caskとpalletを使って、RubyのBundlerのようにpackage.elから管理する
](http://qiita.com/kametaro/items/2a0197c74cfd38fddb6b)

# use-packageを使う
use-packageが何なのかは自分もわかってませんが便利みたいなので使う方針に。解説はこの記事を見るといいと思う。

[Qiita:use-packageで可読性の高いinit.elを書く](http://qiita.com/kai2nenobu/items/5dfae3767514584f5220)

# init-loaderを使う
Caskに

```lisp:Cask
(depend-on "init-loader")
```
を追加。

それでターミナルから

```
$ cask install
```
もしくは、`M-x pallet-install`

これ使ってここまでのinit.el書くとこんな感じ?

```lisp:init.el
;; package system
(require 'cask)
(cask-initialize)

;; use-package
(require 'use-package)

(use-package pallet)

;; init-loader
(use-package init-loader
  :config
  (set initloader-show-log-after-init nil)
  (init-loader-load "~/.emacs.d/inits"))
```

これでcask+pallet+init-loaderでパッケージ管理ができるようになりました。

# initsに設定を追加していく
init-loaderの使い方は腐るほど記事があると思うので見てください。
書き方も人それぞれルールがあると思います。
通し番号の何番台はemacs本体の設定、モードに関する設定とかそんな感じに。

ここまですればパッケージを追加してどんどん自分好みにカスタマイズしていけると思います。


# 終わりに
適当な記事なので間違ったところが多々あると思うのでコメントで指摘していただけるとありがたいです。
パッケージ管理の方法はいくつかあると思うのですが、これよりもいい方法を知っていたらコメントしてもらえると嬉しいです。

最後にこの記事を読んだ人に質問なのですが、Emacsで分割ウィンドウの移動はどのキーに当ててますか？

デフォルトの`C-x o`で使ってる人は少ないと思うのですが、どのへんに当てるのが合理的なのかな・・・
【質問】Rubyのスクリプトが動かない（Apache)

初めまして。手の打ちようが予想もつかず、動けません。
解決方法をご存じの方、お教えください。宜しくお願いします。

# 環境
Vagrant(CentOS 7.0) + rbenv + ruby-buildでruby環境を構築
# 事象
Apache経由でrubyスクリプトを見ると、500 Internal Server Errorがでてしまいます。
![質問用イラスト.png](https://qiita-image-store.s3.amazonaws.com/0/62818/1cf83fad-9c8d-32f2-c9fa-5128976d01fe.png)

* エラーログ
    (13)Permission denied: exec of '/var/www/html/ex01.rb' failed
    End of script output before headers: ex01.rb  

* ruby ex01.rbはきちんと出力される
* システムワイドにrbenvをインストール （参照：[CentOSにrbenvとphpenvをシステムワイドにインストール](http://qiita.com/ktaro/items/513ac42f1f4a2b30ffee)）

```lang:ex01.rb
#!/usr/local/bin/ruby
print <<E
content-Type: text/html
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE>Example 01</TITLE>
</HEAD>
<BODY>
<P>Hello World!</P>
</BODY>
</HTML>
E    
```

```lang:/var/www/html/.htaccess

Options +ExecCGI
AddHandler cgi-script .cgi
AddHandler cgi-script .rb
```

# 経過
* hashccさんの、[【質問】Rubyの"Hello world"スクリプトが動かない（Apache経由）](http://qiita.com/hashcc/items/a8ee74c01e2af8376a37)を参考にエラー対応してみましたが、うまくいきません。
改行コードも、パスも合っているはずです。（/usr/bin/rubyや/usr/local/bin/rubyもやってみました）
```sudo chmod a+rx /home/vagrant```も試してみました。

```lang:rb
which ruby
/usr/local/rbenv/shims/ruby
```
```lang:rbenv
which rbenv
/usr/local/rbenv/bin/rbenv
```

* パーミッションを755に変更してみました。
```
ls -la /usr/local/bin/ruby
lrwxrwxrwx. 1 root root 27 Dec 12 23:28 /usr/local/bin/ruby -> /usr/local/rbenv/shims/ruby
```

* apacheのhttpd.confの```user```や```group```のapacheをvagrantに変えてもみました。

* /etc/selinux/configで、SELinuxを無効にしてみました。

エラーに変化はありません。
Atom ShellやAtom.ioをnode.jsとして使う

# node.jsとして使うとは

ウインドウを出さないで、コマンドラインで使う。
package.jsonとか面倒なファイルが不要で即、試せる。

## もう少し具体的なユースケース

nan対応されてはいるものの0.8止まりで、v0.11.14の現行のnode.jsの
0.11系のネイティブモジュールとしてはビルドエラーとなってしまうモジュールを
なんとかビルド通して、examples配下の.jsを動かしてみたい時

# やり方

```
ATOM_SHELL_INTERNAL_RUN_AS_NODE=1
```

この環境変数をつけて、引数に試した.jsファイルを指定してAtom Shellを起動する。
すると、node.jsと同様の挙動を示す模様。

また、引数を指定しないてREPLになった。

# Atom.ioの場合

できた。。

```shell-session
ATOM_SHELL_INTERNAL_RUN_AS_NODE=1 /Applications/Atom.app/Contents/MacOS/Atom 
> process.versions
{ http_parser: '2.3',
  node: '0.11.14',
  v8: '3.28.71.19',
  uv: '1.0.0',
  zlib: '1.2.3',
  modules: '16',
  openssl: '1.0.1i' }
```


# 参考Link

- [Is atom-shell intended to be compatible with prebuilt node modules? · Issue #533 · atom/atom-shell · GitHub](https://github.com/atom/atom-shell/issues/533)
QiitaHackathon Demo1 顔

顔ですー。Qiita API v2 Hackathonで作成したQiita Runnerから見るとコードを実行することができます(^O^)

```text:demo
UIView,10,100,300,300,#3399ff
UIView,80,150,40,40,#ffffff
UIView,180,150,40,40,#ffffff
UIView,60,250,200,40,#ffffff
```

最終的には、パーサー作ってObjcやSwiftコードをそのまま実行出来るようにしたい。(出来るか不明
<<ど初心者>> importの後にくるのって何があるの？その意味は？

```lang:filename
import Foundation
import UIKit
```

１、そもそも、importってなんなんだろう？

２、どういう種類があるのかな？
　　UIKit
　　Foundation
　　CoreMotion
　　Photos
　　Homekit
　　などなど・・・
master/backup切替りでスクリプト実行


[keepalivedで仮想IPを体験 - Qiita](http://qiita.com/tukiyo3/items/dc355dd456c0973b5a39)の続き。

## 参考

* [Debian squeeze で lvs と keepalived を使って負荷分散をやってみる（復習編） - ようへいの日々精進 XP](http://inokara.hateblo.jp/entry/2013/10/03/232403)

## 通常master側

```diff:keepalived.conf
global_defs {
   notification_email {
     admin@hoge.com
   }
   notification_email_from master@hoge.com
   smtp_server 192.168.100.3
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
   interface eth1
   state MASTER
   virtual_router_id 51
   priority 101
   virtual_ipaddress {
       192.168.100.103
   }
+  notify_master "/etc/keepalived/master.sh"
+  notify_backup "/etc/keepalived/backup.sh"
}
```

## 通常backup側

```diff:keepalived.conf
global_defs {
   notification_email {
     admin@hoge.com
   }
   notification_email_from master@hoge.com
   smtp_server 192.168.100.3
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
   interface eth1
   state BACKUP
   virtual_router_id 51
   priority 101
   virtual_ipaddress {
       192.168.100.103
   }
+  notify_master "/etc/keepalived/master.sh"
+  notify_backup "/etc/keepalived/backup.sh"
}
```

## スクリプト作成

```bash:/etc/keepalived/master.sh
systemctl start mariadb
```


```bash:/etc/keepalived/backup.sh
systemctl stop mariadb
```


```bash:設定適用
systemctl restart keepalived
```

## 動作確認

* masterになったらmariadbが起動
* backupになったらmariadbが停止

を確認。
AngularJS事始め その1


#概要
`AngularJS`の評判につられて、`AngularJS`を勉強する気になった。
しかし、正直言って評判以上の敷居の高さ。
どのように構成をしてよいかわからなかったので覚え書き。
当記事の記述が`AnglarJS`の正しい構成であるかどうかは、よくわかりませんのでご注意を。

#スコープについて

シングルページを基本としているらしいので、`html`タグを`ng-app`として位置づける。
その内部に、`div`をコントローラとして親コントローラと2つの子コントローラを作成してみる。
そこに、それぞれに`message`という変数を定義してやる。

```index.html
<!DOCTYPE html>
<html ng-app="MainApp">
<head>
	<title>Nested Controller</title>
	<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.6/angular.min.js"></script>
	<script type="text/javascript" src="js/app.js"></script>
</head>
<body>
<h4>Outside of Parent</h4>
<div ng-controller="parentController">
  <h4>Inside of Parent</h4>
  {{message}}
  <div ng-controller="childController1">
    <h4>Inside of Child1</h4>
    {{message}}
  </div>

  <div ng-controller="childController2">
    <h4>Inside of Child2</h4>
    {{message}}
  </div>
</div>

</body>
</html>
```

```app.js
var ParentController = function($scope){
    $scope.message = 'Parent Message';
};
var ChildController = function($scope){
    $scope.message = 'Childe Message';
};

//Application定義
var mainApp = angular.module('MainApp',[]);

//Applicationにコントローラ設定
mainApp.controller('parentController', ParentController);
mainApp.controller('childController1', ChildController);
mainApp.controller('childController2', ChildController);
```

思った通りの動作になった。
それぞれのスコープで初期化したメッセージが表示されている。

![スクリーンショット 2014-12-13 14.13.30.png](https://qiita-image-store.s3.amazonaws.com/0/3184/a5d05e0c-24e6-036c-433b-29bf42062100.png "スクリーンショット 2014-12-13 14.13.30.png")

#親コントローラインスタンスの値の参照

次に、親クラスコントローラ内にあるテキストボックスを追加してやる。

```index.html
<h4>Outside of Parent</h4>
<div ng-controller="parentController">
  <h4>Inside of Parent</h4>
  <input type="text" ng-model="pMessage"><br>
  {{message}}<br>
  {{pMessage}}
  <div ng-controller="childController1">
    <h4>Inside of Child1</h4>
	  {{message}}<br>
	  {{pMessage}}
  </div>

  <div ng-controller="childController2">
    <h4>Inside of Child2</h4>
	  {{message}}<br>
  	  {{pMessage}}
  </div>
</div>
```

親クラスコントローラ内にあるテキストボックスに入力した値が、親子全の変数`pMessage`に反映されている。

![スクリーンショット 2014-12-13 14.18.16.png](https://qiita-image-store.s3.amazonaws.com/0/3184/98ba9494-1e6c-d92d-9256-12f6d9052f50.png "スクリーンショット 2014-12-13 14.18.16.png")

これは便利そうである。

ちなみにここでは実験しないが、子の場合の値は、自動的に親へはバインドしないようである。コントローラやスコープの概念を理解できると`AngularJS`の最初の壁が超えられる気がする。

今日はここまで。

***Lovely AngularJS!!!***
Instagram APIをためす


## アプリケーションの登録

[InstagramのDeveloperサイト](http://instagram.com/developer)からログインしてアプリケーションの登録をする

[アプリケーション登録ページ](http://instagram.com/developer/clients/register/)

### 登録する項目

* Application Name  
→ アプリケーション名
* Description  
→ APIを使用するアプリケーションの概要
* Website  
→ 自分のWebサイト
* OAuth redirect_url  
→ OAuth認証後のリダイレクト先URL
* Disable implicit OAuth  
→ OAuth認証のセキュリティ強化？  
認証していないサーバ以外ではトークンは無効になる？なりすまし防止なのかな  
（英語読めないんで誰か翻訳お願いします）
* Enforce signed header  
→ POSTとかDELETEメソッドを使うAPIを叩くときはこれにチェックしろってことかな？  
これにチェックいれないと投稿とか編集のAPIは叩けないみたい  
（これも誰か翻訳お願いします）
* Captcha  
→ 己が人間であることを証明する

登録が無事済むと、[Manage Cliets](http://instagram.com/developer/clients/manage/)に作成したクライアントが表示されます。

## クライアントの項目

* CLIENT ID
* CLIENT SECRET  
→ この2つの値でAPIを色々叩けるようになる
* WEBSITE URL
* REDIRECT URL  
→ アプリケーション登録の時に設定したもの


## 便利URL
* [Instagram Developer Documentation](http://instagram.com/developer/)  
公式サイト。まずはここを読む。
* [Instagram API Doc](http://www.dcrew.jp/ja-instagram-api-doc-v1/)  
Instagram APIの日本語訳サイト
keepalivedで仮想IPを体験


## 参考

* [HAProxyをkeepalivedで冗長化 - Qiita](http://qiita.com/shufo/items/1be4e3e644fa70cfb1b3)


* 仮想IPを192.168.100.103とする。
* CentOS7で実施。
  * 似たアプリにucarpがあるが、こちらはうまく動作しなかった。(両方のサーバに仮想IPが振られる・・・)


## 通常master側

```java:/etc/keepalived/keepalived.conf
global_defs {
   notification_email {
     admin@hoge.com
   }
   notification_email_from master@hoge.com
   smtp_server 192.168.100.3
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
   interface eth1
   state MASTER
   virtual_router_id 51
   priority 101
   virtual_ipaddress {
       192.168.100.103
   }
}
```

## 通常backup側

```diff:/etc/keepalived/keepalived.conf
global_defs {
   notification_email {
     admin@hoge.com
   }
   notification_email_from master@hoge.com
   smtp_server 192.168.100.3
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
   interface eth1
-  state MASTER
+  state BACKUP
   virtual_router_id 51
-  priority 101
+  priority 100
   virtual_ipaddress {
       192.168.100.103
   }
}
```

## サービス登録

```bash:
systemctl enable keepalived
systemctl start keepalived
```

## 確認

```bash:
watch ip a
```

* 仮想IPが片方のサーバに居続けることを確認。
* MASTER側のサーバを再起動している間は、BACKUP側が仮想IPが振られることを確認
* MASTER/BACKUP切り替わりのタイミングでpingが１回程度しか落ちないことを確認。
em-http-requestで複数のダミーサーバーに同時リクエストするサンプル

非同期HTTPクライアントem-http-requestを用いて複数のサーバーに同時リクエストできることを確認します。

# クライアント

```em-http-client.rb
require 'eventmachine'
require 'em-http'

# ホスト：ポート生成
def host(i)
  "http://localhost:#{9292 + i}/"
end

EM.run do
  # 3つのリクエストを作成。
  # localhostのポート9292, 9293, 9294で複数のサーバーが動いていることを想定。
  # durationというパラメータ(後述)に適当な整数を渡している。
  requests = Array.new(3) do |i|
    EM::HttpRequest.new(host(i)).get :query => {'duration' => (3 + i)}
  end
  # 非同期リクエストのコールバック登録
  requests.each do |request|
    request.callback do
      puts request.response
    end
    request.errback do
      puts "Error: #{request.error}"
    end
  end
end
```

# ダミーサーバー

### 寝るだけのRackアプリケーション

整数パラメータ`duration`に指定された秒数だけ寝た後で適当なJSONを返す簡単なRackアプリケーションを作ります。

```sleeper.ru
require 'rack/response'
require 'json'

class Sleeper
  def call(env)
    req = Rack::Request.new(env)
    t = req["duration"].to_i
    puts "Going to sleep for #{t} seconds..."
    sleep t
    Rack::Response.new.finish do |res|
      j = {pid: $$, duration: t}.to_json
      res.write j
    end
  end
end

run Sleeper.new
```

### WEBrickサーバー起動

上記Rackアプリケーションを実行します。コマンドラインから整数引数を受け取り、ポート番号に加え、RackアプリケーションをWEBrickサーバー上で実行します。ポート番号を可変にしているのは後でこのサーバーを別々のポートで複数起動するためです。
(走りっぱなしでkillし忘れるのが嫌なので`EM.defer`を使用して30秒後に自分自身にSIGINTを送信しています。`Rack::Server`では`trap(:INT)`でサーバーを`shutdown`しています。)

```spawn_sleeper.rb
require 'rack'
require 'eventmachine'
EM.run do
  # 30秒後に終了。
  EM.defer do
    sleep 30
    puts "Stopping server ..."
    Process.kill :INT, $$
  end
  puts "Starting server ..."
  # 上記のsleeper.ruを指定してサーバー開始。
  Rack::Server.start server: "webrick", Port: (9292 + ARGV[0].to_i), config: "sleeper.ru"
  puts "Bye."
  EM.stop
end
```

# 動作確認

下記動作確認はMac OS Xで行っていますが、Linuxでも同様のはずです。
shellはbashを想定しています。

### ダミーサーバー起動

```bash
# ポート9292, 9293, 9294でサーバーをバックグラウンド実行。
for i in `seq 0 2`
do
  ruby spawn_sleeper.rb $i &
done
```

### クライアント起動

```bash
ruby em-http-client.rb
```

各サーバーからのレスポンスが3, 4, 5秒後に出力されます。
非同期複数リクエストなので約5秒後にはすべてレスポンスが得られます。逐次同期的に実行していたらおよそ3 + 4 + 5 = 12秒後となっていたでしょう。

```
Going to sleep for 4 seconds...
Going to sleep for 3 seconds...
Going to sleep for 5 seconds...
localhost.localdomain - - [13/Dec/2014:13:58:18 JST] "GET /?duration=3 HTTP/1.1" 200 26
- -> /?duration=3
{"pid":92341,"duration":3}
localhost.localdomain - - [13/Dec/2014:13:58:18 JST] "GET /?duration=4 HTTP/1.1" 200 26
- -> /?duration=4
{"pid":92342,"duration":4}
localhost.localdomain - - [13/Dec/2014:13:58:18 JST] "GET /?duration=5 HTTP/1.1" 200 26
- -> /?duration=5
{"pid":92343,"duration":5}
```

# その他

em-synchronyも試してみたいです。

以上。