OmniAICreator/Qiita-1.07M huggingface dataset:
Siv3DとSiv3Dで作っているものについて

[Siv3D Advent Calender 2015](http://qiita.com/advent-calendar/2015/siv3d) 25日目です。

自分はゲームプログラミングの初学者として感じたSiv3Dの魅力と、それを使って作っていきたい作品について軽く語っていきたいと思います。

今のところまだ文章しかない記事となってしまってますが、ご笑覧いただけると幸いです。

#Siv3Dとの馴れ初め
##ゲーム作り以前の障壁が自分には厚すぎた
　自分が本格的にゲームを作っていきたい、とそう考えていたのは今から2年ほど前の事でした。当時あったいくつかのゲームエンジンやライブラリを手あたり次第試してみたのですが、どれも自分にとっては中々とっつきにくい印象を与えていました。
　具体例を挙げますと・・・

####1.一つの機能を呼び出すのに覚えることがいくつもある
　単純な図形や、或は一枚の絵を描画するのに、そのエンジン特有の手順を一々把握しなければならず、その一つ一つが地味に使いこなすためのハードルを上げてしまっていました。
####2.動かす為の準備が煩雑
　そもそも制作に取り掛かる前の下準備が面倒だと、それだけで気が滅入る人は私だけではない筈~~と信じたい~~です。　
####3.低レベル処理を実装するというハードル
ゲームライブラリにおいては、衝突判定やシーケンス遷移といったゲーム作りにおける低レベルな処理を自力で実装する必要がある場合があります。が、それらはいずれも煩雑なコーディングを要求されたり、技術的に専門性の高い場合が多く、それらの実装のみに時間の大半を取られがちです。
####4.ゲーム作りの学習に必要な環境を整え辛い
　例えばゲーム作りの関する書籍にかかる費用は決して安いモノではなく、インターネットを頼ろうにも、ゲームエンジンによっては日本語の資料をお目にかかることすら叶わない事が多いです。

果たして、C++やC#の文法ばかり覚えていき、肝心のゲーム作りの為の勉強が全く進まない状況に欝々とした気持ちを抱きながら1年を過ごします。
##こんなライブラリがあったのか！
　そんな時に、去年のちょうど今頃にSiv3Dと出会いました。初めは「当たり判定を実装してあるゲームライブラリが欲しい」という軽い気持ちでライブラリをダウンロードしたのですが・・・

####1.最小限のC++の記述で必要な機能を簡単に取り出せる
　キー入力は勿論、当たり判定等も全部**一行**で書けます。更に、前者は**入力状態の検出**、後者は**異なる図形との組み合わせ**等も初めから使えます。
####2.導入も単純、準備はほぼインストールのみ
　用意するのは無料でDL出来る**Visual Studioだけ**という簡単設計。ダウンロードしてインストールすればその瞬間から使えます。
####3.痒い所に手が届く仕様
　先程述べました当たり判定は勿論、ゲーム作りでは避けて通れない**シーケンス遷移**もバッチリサポートしております。また、シェーダーやエフェクト、多数のサウンドファイルの扱い、動的配列とそれを活用するためのアルゴリズム、更には**インターネット接続**までサポートしています。
####4.学習をサポートする恵まれた環境
　Siv3Dのホームページには、学習に最適なサンプルコードが豊富に用意されており、創作の参考になるような素晴らしい作品群にも触れることができます。また、Siv3Dに関する疑問、要望等は**Twitter**にて**開発者本人**に気軽に相談することができます。
　
　ここまで**至れり尽くせり**なライブラリがあったのか！？っと、当時の自分が感じた衝撃は今でも心に焼き付いております。何せ、作品作りに必要なコードを書くこと**だけ**に力を注げば良いのですから。もしもSiv3Dに出会っていなければ、人前に出せるような面白いゲームを完成させる事など夢のまた夢に違いなかったでしょう。
#Siv3Dで作っているものについて
　そんなこんなで現在の自分は、最早夢でなくなった面白いゲームの完成に邁進しております。
2016年1月29日～30日にて開催される[「デジゲー博SPECIAL in 闘会議2016」](http://digigame-expo.org/sp2016)にて頒布するゲーム、正確に言えばゲームの体験版を作っています。詳しいことはサークル一覧の公開に合わせて追記してい来ますが、ごくシンプルなSTGながらも本格的なコンピューターゲームを呼べるようなものとなるよう、現在制作にいそしんでおります。

#最後に
「プログラムに関してはド素人も同然な自分でも、こんなに簡単にC++でゲームを作れる。そう、Siv3Dならね」と、色々な人の前で冗談めかしながら言えるような作品を作る、これから作る作品をその嚆矢とすることを目標に、明日からも頑張っていく所存です。

最後になりましたが、Siv3D Advent Calender 2015参加者様の皆さま、そして開発者のReputeless様に深くお礼申し上げます。
どうか皆さま、良いお年を。
cd コマンドかくかたりき

# はじめに
みんなだいすき cd。
初心忘れるべからず。
（本当に時間がなかった・・・

本気の0ストック狙いでカレンダー最終日を締めたいと思います。

# cd コマンド

```
masahixixi$ pwd
/Users/masahixixi
masahixixi$ cd /
masahixixi$ pwd
/
```

そりゃそうだ。

```
masahixixi$ pwd
/Users/masahixixi
masahixixi$ cd /tmp
masahixixi$ cd ..
masahixixi$ pwd
/
```
そりゃそうだ。

```
masahixixi$ pwd
/Users/masahixixi
masahixixi$ cd /tmp
masahixixi$ cd ~/
masahixixi$ pwd
/Users/masahixixi
```
そりゃそうだ。

```
masahixixi$ ll / | grep test
drwxr-xr-x     2 root  wheel     68 Dec 25 22:21 test
masahixixi$ ln -s /usr/local/bin/ /test/bin
masahixixi$ pwd
/test
masahixixi$ ll
total 8
drwxr-xr-x   3 root  wheel   102 Dec 25 22:25 .
drwxr-xr-x  35 root  wheel  1258 Dec 25 22:21 ..
lrwxr-xr-x   1 root  wheel    15 Dec 25 22:25 bin -> /usr/local/bin/
masahixixi$ cd -L bin
masahixixi$ pwd
/test/bin
masahixixi$ cd ..
masahixixi$ cd -P bin
masahixixi$ pwd
/usr/local/bin
```
そりゃそうだ。

```
masahixixi$ pwd
/test
masahixixi$ cd /test2
masahixixi$ pwd
/test2
masahixixi$ cd -
/test
masahixixi$ cd ${OLDPWD}
```
そりゃそうだ。
ちなみに ```cd -``` と ```cd ${OLDPWD}``` は同じ。

```
masahixixi$ pwd
/test
masahixixi$ cd ..
masahixixi$ cd tm*
masahixixi$ pwd
/tmp
masahixixi$ cd ..
masahixixi$ cd t*p
masahixixi$ pwd
/tmp
```
もはや cd の話ではない。
ちなみに test, tmp とあった場合に ```t*``` とすると test に移動。
```*``` はアルファベット順の判定。

```cd``` はシンプルですねー

リブセンスアドベントカレンダーの最後はまさかの ```cd``` でした。
(時間がなかった・・・本当にすみません。。。。)
【myThings】IDCFチャンネルのトリガーから、他チャンネルのアクションに値を引き渡す

2015/12/25にIDCFチャンネルのトリガー機能が強化され、他チャンネルのトリガーと同様に、アクションに対してトリガー実行結果の値を引き渡すことができるようになりました。

例えばヤフー天気チャンネルのトリガーであれば下図のように「天候の状態」や「最高気温」などをアクションに対して引き渡すことができます。
![d4ce358dfce6d2fda759.jpg](https://qiita-image-store.s3.amazonaws.com/0/51093/ad065a78-adf3-dc63-a769-9a72b1538a08.jpeg)

それに対し、IDCFチャンネルのトリガーは何も渡すことができず、自作デバイスでセンシングした情報をアクションで活用するのが難しい状況でした。

ただ今回の機能強化によって、他チャンネルのトリガーと同様に、アクションに対してトリガー実行結果の値を引き渡すことができるようになったので、その使い方を紹介します。

## 組み合わせの設定について
IDCFチャンネルのトリガーでは、テキスト情報を格納するtext1、text2、text3。URLを格納するurl1、url2、url3という6つの値をアクションに引き渡すことが可能です。

text1、text2、text3の表示内容
![text.png](https://qiita-image-store.s3.amazonaws.com/0/51093/d47dc53f-7001-c0fb-03e5-2c58a38a5feb.png)

url1、url2、url3の表示内容
![url.png](https://qiita-image-store.s3.amazonaws.com/0/51093/fde79c04-13e4-8590-3ca3-dd709436db5c.png)

## 自作デバイス側のプログラムについて
IDCFのトリガーにPOSTリクエストを送信する際に、ボディにtext1〜text3、url1〜url3という変数名を指定して値をいれてください。指定されなかった変数には空文字が代入されて、アクション側に引き渡されます。

```http:例
POST /data/{トリガーのuuid} HTTP/1.1
Host: {IDCFのIPアドレス}
meshblu_auth_uuid: {トリガーのuuid}
meshblu_auth_token: {トリガーのtoken}
Content-Type: application/x-www-form-urlencoded

text1=hello&url1=https://www.yahoo.co.jp
```

## サンプル
例えば下図のように組み合わせを作成すると、
![プッシュ通知のメッセージ.png](https://qiita-image-store.s3.amazonaws.com/0/51093/181af6f7-2cb5-2a26-ef4f-474a5ce339ec.png)

このようにアクション側でトリガーの実行結果を扱うことができます。
![タイムライン.png](https://qiita-image-store.s3.amazonaws.com/0/51093/016c0f55-35fa-3f2b-b252-1dd7707485dc.png)

## 最後に
この新機能も活用した[myThingsハンズオン向け資料](http://qiita.com/yamamotomanabu/items/4812d5a5574219eb03af)を公開しました。ぜひこちらも参考にして頂ければと思います。

また、こういった新機能リリースのお知らせは内容にあわせて、[Facebookグループ](https://www.facebook.com/groups/iotmythings/)や[ブログ](http://blogs.yahoo.co.jp/mythings_staff)でお知らせしてますので、こちらもあわせて購読頂ければと思います！
RPGツクールMV　スクリプト基本編


```javascript
//乱数取得
rnd = Math.randomInt(10) + 1; //1~10の乱数
rnd = Math.floor(Math.random()*10)+1; //1~10の乱数
rnd = Math.floor(Math.random()*40)-20; //-20~20の乱数

//ゲーム変数１
$gameVariables.value(1)

//変数valueをゲーム変数nに代入
$gameVariables.setValue(n, value)

//ゲーム変数nにゲーム変数１とゲーム変数１０を足した数を代入
$gameVariables.setValue(n, $gameVariables.value(1) + $gameVariables.value(10))

//スイッチ変数
$gameSwitches.value(スイッチの番号)

//if文の例（スイッチ番号がtrueなら括弧内処理）
if($gameSwitches.value(スイッチの番号){
処理
}
//if文の例（ゲーム変数2が１０以内なら括弧内処理）
if($gameVariables.value(2) <=10){
処理
}

//アクター番号がパーティーにいたらtrueを返す
$gameParty.members().contains($gameActors.actor(アクター番号))
//アクターの名前取得
$gameActors.actor(アクター番号).name
//アクター番号がスキル番号をもっていたらtrue
$gameActors.actor(アクター番号).isLearnedSkill(スキル番号)
//アクター番号がスキル武器番号
$gameActors.actor(アクター番号).hasWeapon($dataWeapons[武器ID])

//キャラの向き（-1がプレイヤー 0がこのイベント 残りの数はイベント番号
//（↓２　←４　→６　↑８）
this.character(イベント番号).direction()

//アイテム、武器番号があったらtrue
$gameParty.hasItem($dataItems[アイテム番号])
$gameParty.hasItem($dataWeapons[武器番号], 装備も含める？true/false)

//プレイヤーの座標取得
this.character(-1).x
this.character(-1).y
//このイベントの座標取得
this.character(0).x
this.character(0).y
//イベントの座標取得
this.character(イベント番号).x
this.character(イベント番号).y

//地形タグの取得
$gameMap.terrainTag(x座標, y座標)
//リージョン番号取得
$gameMap.regionId(x座標, y座標)
//イベント番号取得
$gameMap.eventIdXy(x座標, y座標)
```

ホームページ
http://cg-tutorial-spirits.blogspot.jp/
Selenium IDE UI-Element


しれっと書いてみます。

SeleniumIDEの機能の中でもあまり触れられることがない
UI-Element と　Rollup 。

今回は　その　UI-Element　について。


これはロケーションの指定をシナリオケースから分離する仕組みです。
ロケーションにラベルを付けて、シナリオケースにはラベルで定義しておき
画面の構成がかわっても、シナリオケースには手を入れる必要がなくなる、と。
で、ロケーションに使用するラベル定義は　別ファイルに　JSON形式で定義します。

使うには、それぞれをファイルに定義しておき、オプションで指定した後
seleniumIDEを再起動すればOK。

これを使うメリットは、テストケースからテスト対象ページ内の要素の定義を分離できるところです。
これは、同一ページに対し複数のテストケースを適用する場合以下のメリットがあります

- そのテストケースの保守コストを下げることができる
- 別ファイルにしておくことでページ定義とテストケース設計を平行にできる


逆にページ内の要素が少ない場合は、別ファイルで定義する手間が無駄になりそうですが、画面内の要素が少なくても、これを導入するメリットがある機能がありそうなのです。

リファレンスについているサンプルがこれです。

```
map.addElement('searchPages', {
    name: 'result'
    , description: 'link to a result page'
    , args: [
        {
            name: 'index'
            , description: 'the index of the search result'
            , defaultValues: range(1, 21)
        }
        , {
            name: 'type'
            , description: 'the type of result page'
            , defaultValues: [ 'summary', 'detail' ]
        }
    ]
    , getLocator: function(args) {
        var index = args['index'];
        var type = args['type'];
        return "//div[@class='result'][" + index + "]"
            + "/descendant::a[@class='" + type + "']";
    }
});
```

ポイントは　args と　getLocator ですね。
要素を静的にxPathで定義するのではなく　関数を定義することにより　getLocatorメソッドを定義しています。
これに引数として args を定義しています。


```
map.addElement('searchPages', {
   name: 'result'
   , description: 'link to a result page'
   , args: [{
     name: 'index'
   , description: 'the index of the search result'
   , defaultValues: range(1, 21)
  }
, {
     name: 'type'
   , description: 'the type of result page'
   , defaultValues: [ 'summary', 'detail' ]
  }
]
, getLocator: function(args) {
    var index = args['index'];
    var type = args['type'];
    return "//div[@class='result'][" + index + "]" + "/descendant::a[@class='" + type + "']";
  }
});
```

これを使う場合

```
<td>click</td>
<td>UI=searchPages::result(index=1,type=summary)</td>
<td></td>
```

と、パラメータを指定することにより、ロケーションを指定することができます。

例のように検索結果に付いたテキストリンクを動的に指定することができる訳です



## 情報源

- 情報源
http://ttwhy.org/code/ui-doc.html


- サンプルコード
https://code.google.com/p/selenium/source/browse/javascript/selenium-core/scripts/ui-map-sample.js?r=085758c2e968cd5c4a3c7f5a6fecf1e72b76dc61


#あとがき
メンテナンス性を向上させるテクニックですが、IDEでのスクリプトを巨大化させると結局はメンテナンスの負荷は大きくなってしまうので、これだけに頼らず他の方法と組み合わせて管理するのが現実的ですね。
ヤフーが公開した高次元ベクトルデータにおいて高速な近傍検索を実現するNGTがすごい！！


## 0. 前提知識

ソーシャルデータや多くのユーザーを抱えるWeb・モバイルサービスにとって、
高次元ベクトルデータの扱いに困ることは少なくないと思います。

多くのユーザーの行動データや登録データからユーザー間の類似度を算出したり、
行動データを解析して適切なコンテンツをレコメンドしたりする場合に、データ量によっては計算時間やサーバーの負荷などがボトルネックになり、リアルタイム性を妥協したり、精度を妥協したりすることが出てきてしまうことがあります。

今回ヤフーが公開したNGTというソフトウェアは高次元ベクトルデータにおいて超高速に近傍検索をしてくれるので、実際に使ってみたら結構すごかったので、実際に利用した内容も含めて公開したいと思います。


## 1. NGTの環境構築
CentOSにngtをインストール

```terminal:console
wget http://i.yimg.jp/dl/docs/research_lab/ngt-0.0.1.zip 
unzip ngt-0.0.1.zip
cd ngt-0.0.1
mkdir build
cd build 
cmake ..
make 
make install
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64
```

## 2. データの準備&実行
### ・ヤフーのngtのzipファイルに入っているテストデータで行う場合

```terminal:console
cd ngt-0.0.1
ngt create -d 128 -o c index ./data/sift-dataset-5k.tsv
ngt search -n 20 index ./data/sift-query-3.tsv
```

### ・独自のデータも用意してみる
今回試してみたのは、userがuserに興味を示すようなデータを元にuser間の類似度を算出するというサンプルで試してみました。
user_user_favorite.tsv：userがuserに興味を示した度合いを要素にしたベクトルデータ
example_user_favorite.tsv：その中で抽出した1人のuserの興味ベクトルデータ

```terminal:console
cd ngt-0.0.1
ngt create -d 128 -o c index ./data/user_user_favorite.tsv
ngt search -n 5 index ./data/example_user_favorite.tsv
```

## 3. 結果
特定のuser_idのユーザーとの距離が近い上位5人を取得してみると以下のような結果が得られる。

| Rank | IN-ID | ID | Distance |
|-----:|------:|---:|---------:|
| 1 | 151 | 151 | 231.003 |
| 2 | 661 | 661 | 231.981 |
| 3 | 178 | 178 | 237.763 |
| 4 | 2241 | 2241 | 244.102 |
| 5 | 558 | 558 | 249.453 |

1列目：距離が近い順位
2列目：user_id
3列目：tsvデータ上のID
4列目：距離

1万×1万の正方行列のベクトルデータの計算でも500ms未満で返ってくるのはマジですごい！！

※残念ながら商用利用は不可なのでご注意を。
Pryで日本語リプサムとしてaozoraを使う

# モチベーション
Pryで適当な日本語文字列が欲しいときがたまにある。そう、たまになんだけど、ある。
英語じゃない日本語なんだと。リプサムじゃない夏目漱石なんだと。

# aozora
さてみなさん青空文庫はご存知かと思いますが、なんとなんと青空文庫にある文字列がリプサムとして使えるgemがあるんですよ！

https://rubygems.org/gems/aozora

おおおお！ :clap: :clap: :clap: 

夏目漱石は！？こころは！？

```rb
Aozora.kokoro #=> "私はその人を常に先生と呼んでいた。だからここでもただ先生と書くだけで本名は打ち明けない。これは世間を憚かる遠慮というよりも、その方が私にとって自然だからである。私はその人の記憶を呼び起すごとに、すぐ「"
```

ある！最高！素晴らしい。

# Pryで使おう

シンプルに使って見る。

```rb:pry-session
2.2.3 (main)> require 'aozora'
=> true
2.2.3 (main)> Aozora.kokoro
=> "私はその人を常に先生と呼んでいた。だからここでもただ先生と書くだけで本名は打ち明けない。これは世間を憚かる遠慮というよりも、その方が私にとって自然だからである。私はその人の記憶 を呼び起すごとに、すぐ「"
```

毎回requireするのはめんどくさいので`.pryrc`に書く。

```rb:.pryrc
require 'aozora'
# いなかった時のハンドリングはよしなにやってください
```

これですぐに使える。でももはや`Aozora`と打つのさえめんどくさい。
なのでこうする。

```rb:.pryrc
require 'aozora'

Aozora.titles.each do |title|
  define_method(title) do |size = 100|
    Aozora.public_send(title, size)
  end
end
```

これでそれぞれのタイトルですぐに呼べる。

```rb:pry-session
2.2.3 (main)> kokoro
=> "私はその人を常に先生と呼んでいた。だからここでもただ先生と書くだけで本名は打ち明けない。これは世間を憚かる遠慮というよりも、その方が私にとって自然だからである。私はその人の記憶 を呼び起すごとに、すぐ「"
2.2.3 (main)> kokoro 10
=> "私はその人を常に先生"
```

いい感じ！メソッド名は...名前的に滅多に被らないと思うし多分大丈夫！


# まとめ
- pryでいい感じの日本語文字列が欲しくなったときにはaozora!
- メソッド定義しちゃうとすぐに使えて良いよ
【myThingsハンズオン】myThingsアプリの概要を理解しよう

この記事は[myThingsハンズオンの参考資料](http://qiita.com/yamamotomanabu/items/4812d5a5574219eb03af)の一部です。

## myThingsアプリとは？
myThingsアプリは、WebサービスやIoTデバイスが持つ機能を自分で組み合わせて便利に使うことができるアプリです。
現在[iOS](https://itunes.apple.com/jp/app/id987874862)、[Android](https://play.google.com/store/apps/details?id=jp.co.yahoo.android.yiot&hl=ja)向けに提供されています。

機能をもっと端的に表現すると、

![description.png](https://qiita-image-store.s3.amazonaws.com/0/51093/f19c5334-9de8-7c4e-b167-646f70bdaaee.png)

アプリ上で、○○、☓☓、△△、□□を自由に設定することで、普段自分が行っていることを自動化したり、いろんなサービスを横串で連携させることで今までできなかったことをできるようにすることができます。

## myThingsアプリで使っている固有名詞
これからハンズオンを進めるにあたって、**チャンネル**、**トリガー**、**アクション**、**組み合わせ**という単語がよく出てきますので、それらの意味を整理します。

先ほどの図に出てくる○○と△△にはFacebookやTwitter、Fitbitといったサービスやデバイスの名前が入ります。これをmyThingsでは**チャンネル**とよんでいます。
そして連携の契機となる「○○が☓☓だったら」という条件のことを**トリガー**とよんでいます。
トリガーの状態を満たしたら実行する「△△を□□する」という操作のことを**アクション**とよんでいます。
最後にトリガーとアクションのセットのことを**組み合わせ**とよんでいます。
![word.png](https://qiita-image-store.s3.amazonaws.com/0/51093/41ca735d-c84b-fc13-ec4d-6015c6baa350.png)

## 組み合わせの例
- Fitbitで測定歩数が10000歩を超えたら、Twitterで「目標達成」とつぶやく
- ヤフー天気で今日の天気が雨だったら、Slackに「今日は雨だよ」と投稿する
- Gmailを受信したら、BOCCOにメールの件名を喋らせる

## 利用可能なチャンネル
myThingsで利用可能なチャンネルは[こちら](http://mythings.yahoo.co.jp/)をご覧ください。
openFrameworksでEmscripten（JavaScript）する


oF 0.9 より、emscripten に対応しました。

ざっくりとした内容はこの登壇資料で。
[JSオジサン openFrameworks emscripten setup!](http://www.slideshare.net/minorunakanou/js-openframeworks-emscripten)

一言でいえば、ブラウザでoFが動くということです。

![of-emscripten-build.png](https://qiita-image-store.s3.amazonaws.com/0/20773/8609277a-1071-e438-4d24-859dcf2902ec.png "of-emscripten-build.png")

本稿は、この時の導入記録。

## 開発環境
手元の環境は、Mavericks でした。

OSX 10.9.5
Xcode 6
openFrameworks 0.9.0


## oF 0.9 を準備する
まずは oF 0.9 をダウンロードしてましょう。
http://openframeworks.cc/download/

解凍後、サンプルディレクトリから、適当に選んでビルドしてみます。
(oFディレクトリ)/of_v0.9.0_osx_release/examples/3d/3DPrimitivesExample 

![Xcode.png](https://qiita-image-store.s3.amazonaws.com/0/20773/7ca911ed-8b55-523c-6c4f-9560adf85ea7.png "Xcode.png")
*Xcodeで開いたところ*

インポートが完了したら、Run（cmd + r）でビルドしてみます。

![XcodeBuild.png](https://qiita-image-store.s3.amazonaws.com/0/20773/2d6d1e94-bb50-3e45-8848-8da032d8bfdf.png "XcodeBuild.png")

無事にビルドが通りました。
さていよいよJS化しますが、Emscripten の準備に少し手順がかかります。


## Emscriptenを準備する
emscripten には本体のSDKと、いくつかの依存ツールが必要です。

### 必須ツール
不足していたらインストールしておきましょう。

* XCode Command Line Tools
* Node.js
* Python 2.x
* Git
* Java
* CMake

Mac 環境ならば、Python 入ってると思いますが、emscripten が python2 という名前で呼び出します。
おそらく、python2.5 とか、python2.7 とかがインストールされているので、ビルド時に怒られます。

    $ python2: No such file or directory

なのでローカルの python から python2 にシンボリックリンクを張っておきます。
    
    $ sudo ln -s /usr/bin/python2.7 /usr/bin/python2


### SDKをダウンロード
Mac なら、 *Portable Emscripten SDK for Linux and OS X* というリンクからダウンロードしてください。

http://kripken.github.io/emscripten-site/docs/getting_started/downloads.html

解凍後、適当なディレクトに配置したらターミナルで emsdk_portable に移動して、以下のコマンドを実行します。

    # Fetch the latest registry of available tools.
    ./emsdk update

    # Download and install the latest SDK tools.
    ./emsdk install latest

    # Make the "latest" SDK "active"
    ./emsdk activate latest

Mac 環境はパスを通すシェルが用意されてます。

    # Set the current Emscripten path on Linux/Mac OS X
    source ./emsdk_env.sh

.zshrc とか、.bashrc にも追記します。

    local EMSCRIPTEN_PATH="$HOME/Workspace/emsdk_portable/emscripten/1.35.0"
    export PATH="$EMSCRIPTEN_PATH:$PATH"


### ビルドしてみる

さきほど、Xcodeでビルドしてみた 3DPrimitivesExample で試してみます。

    $ cd (oFディレクトリ)/of_v0.9.0_osx_release/examples/3d/3DPrimitivesExample 
    $ emmake make

html と js が bin フォルダに出力されます。
出力時のメッセージにしたがって下記を実行。

    $ emrun bin/3DPrimitivesExample.html

![of-emscripten-build.png](https://qiita-image-store.s3.amazonaws.com/0/20773/8609277a-1071-e438-4d24-859dcf2902ec.png "of-emscripten-build.png")

サーバーが起動し、ブラウザが開いたら成功です。
Safari より Chrome のほうが比較的安定している気がします。

*参考リンク*

公式セットアップガイド（日本語）
http://openframeworks.jp/setup/emscripten/

openFrameworks v0.9.0 をブラウザで動かしてみる
http://poipoides.hatenablog.com/entry/2015/11/11/001933
ぼくが RxJS Advent Calendar 2015 に書けなかったもの

この記事は [bouzuya's RxJS Advent Calendar 2015](http://www.adventar.org/calendars/1200) 25 日目かつ RxJS Advent Calendar 2015 の 25 日目です。

今日は bouzuya's RxJS Advent Calendar 2015 の感想や反省 (ポエムっぽいもの) を書きます。

- 書けたもの
  - Observable / Observer
  - 生成・変換・結合・エラー処理などの Operator
  - ConnectableObservable および Hot 変換 Operator
  - Subject とその種類
  - Disposable とその種類
  - Scheduler とその種類
- 書けなかったもの
  - RxJS の demo
  - RxJS の testing
  - Reactive とは何かなどの概念的な説明
  - 図解などによる分かりやすい説明
  - 引数による動作の変化や注意点
  - RxJS の他の類似 library の紹介

ぼくの RxJS の知識・経験が足りていなくて、つまらない内容になってしまったと感じています。

特に Operator を紹介しているだけの記事は面白みに欠けたと反省しています。また単純に ReactiveX の list にそって書くのではなく RxJS 5 を考慮して、自身で厳選・再分類すれば良かったと後悔しています。RxJS 5 は Operator がより厳選されているので、移行も考慮して役立つ Operator に絞れたのではないかと思います。

また Operator の紹介に関しては細かい引数による挙動の変化にあまり触れられなかったのが残念です。あまり試せていないのでどれをよく使うのかなどが判断できなかったのが紹介できなかった主な理由です。ものによってはかなり挙動が変わるので説明は難しかったかもしれません。RxJS 5 ではそもそも別の Operator にされているものもままあります。

実用的な例や test などの情報が欠けてしまった点は良くなかったです。RxJS には test の書きかたについても紹介されていたりするのですが、個人的にそれが正解だと思えるところまで試せていなかったので紹介できませんでした。もっと使い込んでいれば良かったのですが……。

ぼくは Cycle.js を通じて RxJS を知りました。最近の Flux 派生 framework では RxJS が使われているものもあります。そういうものを紹介できれば面白かったように思います。あるいは RxJS と類似の library には kefir や bacon.js や most.js などがあります。そういった library を他の選択肢として紹介・比較できれば良かったのですが、そこまで試す余裕がありませんでした。

と、ここまで RxJS の知識もないままに自身の学習記録のような Advent Calendar を書いてしまったことを謝罪しつつも、ぼく個人としては RxJS 4.0.7 のほとんどに目を通せたことや、 Scheduler や Disposable の挙動も理解できたので、良い機会になりました。ありがとうございました。
CentOS7のnginxでポートフォワードできない時

CentOS7でポートフォワードしようとしたらちょっとハマったのでメモ。

下記のように設定したNginxを動かした

``` nginx.conf
server {
listen 80;
server_name localhost;
access_log  /var/log/nginx/example.log;
error_log /var/log/nginx/example.error.log;

location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $http_host;
}
}
```

するとこんなエラーが出ましたよと。

```
2015/12/25 00:00:00 [crit] 6797#0: *1 connect() to 127.0.0.1:8080 failed (13: Permission denied) while connecting to upstream, client: xxx.xxx.xxx.xxx, server: _, request: "GET /login HTTP/1.1", upstream: "http://127.0.0.1:8080/login", host: "xxx.xxx.xxx.xxx"
```

これはSELinuxのBool値の問題のようで、次のコマンドをうったら解決できました。

```
$ setsebool httpd_can_network_connect on -P
```
OpenCV Advent Calendar 2015まとめ

#はじめに
今日でAdvent Calendarもおしまいです．
言いだしっぺの法則により，たくさん記事を埋めさせていただきました．~~さすがに，1月でこれだけ書くのはなかなか厳しいですね．もう25日の8時も回ってしまいました．~~
また，知られざる機能という**無茶振り**に答えてくださった皆様，ありがとうございます．私自身，非常に勉強になりました．

なお，今日の記事はまとめと題していますが，全くまとまってません．
#OpenCV3.1
クリスマスということでOpenCVも先日，[OpenCV3.1](http://opencv.org/opencv-3-1.html)がリリースされました．
（Merry Christmas！！のノリと勢いででβリリースを飛ばしてとりあえずリリースした感が満載ですが．．．）

[いろいろな人](http://iwaki2009.blogspot.jp/2015/12/windows10.html)がビルドしている中勢いに乗って私もコンパイルしてみましたが，contribモジュールを含めて珍しく問題なくコンパイルできました．（sfmモジュールはunix専用のためコンパイルできませんでした．ちょっと頑張ってみましたが，windowsでいけそうな雰囲気あります．また，コンパイルに時間のかかるCuda関連モジュールは除いてコンパイルしました）

その中でせっかく紹介したHALモジュールがcoreに移動し，**消えてなくなったり**，全方位カメラの全方位カメラのキャリブレーションやSfM，ステレオマッチング関数，オプティカルフロー関数，プロットモジュールなどの気になる機能がたくさん追加されたりしています．
詳しくは[ChangeLog](https://github.com/Itseez/opencv/wiki/ChangeLog)にあります．

次々に追加される新しい機能と，機能ごとにさらには機能内でも統一感のないインターフェイス．積極的に開発されてる感があっていいですね．

一方で，これだけのスピードで更新されると，かなりの人が置いてきぼりにされていると思います．
私も，自分の研究に関連している項目以外はさっぱり追えていません．
（この前，SIFTやSURFなどの特徴点の実装がいつのまにか根本的に変わっており，しかもドキュメントがほとんど役に立たず，ソースとにらめっこ状態でした．）
英語とコードが読めて，それなりにその分野のアルゴリズムがわかる人以外使えない状態になり始めています．

書籍も，内容がコアになればなるほど読む人が減り，採算が取れなくなるため，読者層の厚いインストールや始めの一歩などの入門部分の本に偏りぎみです．英語なら，全世界が対象のため，幾分か踏み込んだ内容の本もありますが．一方で，対象者の経験値の期待値を少しあげた[OpenCV3.0の本](http://www.amazon.co.jp/OpenCV-3-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%96%E3%83%83%E3%82%AF-%E8%97%A4%E6%9C%AC-%E9%9B%84%E4%B8%80%E9%83%8E/dp/4839952965
)は，レビュー欄でなかなかの叩かれっぷりです．難しいですね．

今回のこの企画で，少しでも役に立てたら幸いです．
銀の弾丸は無いでしょうが，もう少し良い方法があるといいですね．
（対象のレベル上げすぎたとか，敷居上がりすぎて投稿する障壁が高すぎるとの声が聞こえましたが，反省しています．何度も一人が何度もネタを埋めるのは大変ですね．）
~~一人にドキュメント翻訳など頼りきりだったOpenCV.jpはほぼ再帰不能ですし．．．~~

#おわりに
最終回は，完全に雑談でした．
皆様，ありがとうございました．また来年も，私じゃないだれかよろしくお願いします．

あと，[電子情報通信学会総合大会 2016 企画セッション](http://www.ieice.org/~prmu/jpn/ieice2016.html)でOpenCVのチュートリアルが企画されています．今回のアドベントカレンダーのように初心者を置いてきぼりにするものではなく，チュートリアルから始まるため，九州まで行かれる方でもっと勉強したいかたは聞いてみるといいかもしれません．

@tomoaki_teshima さんがおまけで[26日目の記事で乱数RNGについて](http://tessy.org/wiki/index.php?OpenCV%20Advent%20Calendar%202015%2026%C6%FC%CC%DC)も書いてくれてます．
#いつか書こうと思っていた書きかけの記事
* 並列化の書き方（来年のB4がプログラミングの課題やるころに書きましょう．）
* コマンドラインパーサ（本気で作るときは，もっと出来のいいものを使いましょう）
* 実験時にあると便利なツール
* 実験データ，パラメータのxml保存
* 四捨五入の方法．（src.convertTo(dest, CV_8U,1.0,0.5)ってやるだけ）
* テストプロジェクト，パフォーマンステストの書き方．新しくcontribにサブミットするのには必須
    * パフォーマンステストに，速度と精度の二つが新しく出来ているんですけど，いつからでしょうか・・・
    * Googleの単体テストである Google Testの日本語訳は中の人が同じなため，OpenCV.jpに上がってます．
httpdとかmysqldとかsshdのdって何だろう??

#httpd,mysqld,sshd...コマンド全部にdついとるがな
##ふと湧き上がる疑問
知っている人にとっては当たり前のようなことだと思うのですが、httpdとかmysqldとかsshdのdってなんだろうとふと思いました。webサーバの環境構築をしている時に気になってググりました。使うだけであれば全然問題ないのですが、知った上で使うのと、知らないまま使うのとでは勝手が違うような気がします。

##答え
答えを端的に書くと、daemon（デーモン）のdです。
UNIXシステムに常駐するWWWサーバーのプログラムの総称。dはUNIX上の常駐プログラムであるdaemon（デーモン）を意味する。ユーザーからの要求に対する、コンテンツの送信やCGIプログラムの起動などを行う。現在の主流はApacheで、他にはCERN HTTPd、NCSA HTTPdなどがある。

#じゃあデーモンって何よ？
ググったことでdが何を意味するかはわかりました。デーモンはメールを送って相手先に上手く届かなかったときに届くメールで見覚えがあります。メーラーデーモンってやつですね。
ということでこちらもググってみました。

##アンサイクロペディアによると
[メーラーデーモン - アンサイクロペディア](http://ja.uncyclopedia.info/wiki/%E3%83%A1%E3%83%BC%E3%83%A9%E3%83%BC%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3)

>メーラーデーモン(MAILER DAEMON)は、ネット神話に登場する代表的な悪魔のひとつ。および、それを題材にして描かれたPCゲームのモンスターの一種である。

恐らくこれは違う。面白い記事ではあるのだけれども。 :sweat_smile: 


##答え
常駐プログラムのこと。

wikipediaさんの情報を参考にしてみましょう。
[デーモン (ソフトウェア) - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2))

>デーモン (Daemon) は、UNIXなどのマルチタスクオペレーティングシステム (OS) においてバックグラウンドプロセスとして動作するプログラムを意味する[1]。ユーザーが直接対話的に制御するプログラムではない。典型的なデーモンは名前の最後尾に "d" が付く。例えば、syslogd はシステムログを扱うデーモン、sshd は外からのSSH接続要求を受け付けるデーモンである。

デーモンのプログラム名の末尾には`d`がつくのは一般的だったようですね。勉強になりました。

#まとめ
なんとなくそういうものだ、と思うものでもググってみると色々得るものがあります。積極的にググる癖をつけましょう :laughing: :laughing:
2017年7月 EC-CUBE2.13のサポート終了の意味

とりあえず一度やってみるか！と勢いで始めたAdventCalendarでしたが、おかげさまで25日までくることができました。
（数日の未完了はありますが、そこはまぁご愛嬌で。）


さて、最後ということで今年のEC-CUBEをすこし振り返ってみようと思ったのですが、あまりにも激動な2015年だったので、まとめようとするも、とんでもない長文になってしまいました。年の瀬ですのですこし感傷的になっているせいもあるかもしません。

全文公開はまたの機会においておき、特に2015年のうちに伝えておきたいことである、EC-CUBE2.13のサポートの話だけしてまとめます。


## 2.13は2017年7月までサポート予定

EC-CUBE3.0のリリースと合わせて発表した、2.13のサポート期日これに反応される方も非常に多くいらっしゃいました。

まず、EC-CUBE3.0は大きく内部構造から変更しているため、2系からの移行がすぐすぐに可能なわけではありません。そのためEC-CUBEは2017年7月まで2.13の開発・サポートを継続するとしました。

2.13系は頻繁にバージョンアップを行う予定はありませんが、脆弱性が出た場合の修正や不具合の回収を行いバージョンアップしたものが2017年7月までリリースを行います。
これまでも1系や2.4系以下のサポート終了していますが、2.13系はサポート終了まで、バージョンアップも含めて対応をするという事になります。

## よくうける誤解

サポート終了なので、EC-CUBE2.13系に脆弱性が見つかった時に何も知らされないのではないか？という誤解があります。

すでにサポート終了している1系や2.4系以下でも同様にすでに行っていることなので、個別にセミナーなどで質問をいただく際には回答しているのですが・・・

深刻な脆弱性が確認された場合に放置や情報開示しないようなことはありません。

EC-CUBEには、インテグレートパートナー方々を中心とした利用者に繋がるネットワークがあり、これまでも一般に公開する前に情報を届けるスキームとして活用してきました。サポート終了の発表に関わらず深刻な脆弱性が悪用されないようにこういったネットワークは非常に有効なものだと考えています。

## 今回感じた1つの変化

過去もEC-CUBEのサポート終了は発表してきましたが、今回の2.13のサポート終了予定の発表で、脆弱性への対応に過敏に反応が見られた事は1つの変化でした。

脆弱性のリスクが広く認識されてきたこともありますが、EC-CUBEを利用していただいている方の中でも、きちんと対応するものとして認識が広がっていることの現れと感じています。
パートナーの中から有志が集まり活動しているEC-CUBEセキュリティワーキンググループもこれに貢献できているのではないでしょうか。

## サポート終了が1つの商機となる

先日、1,2系のサポートを表明した[CUBE Lab](https://cubelab.org/)というサービスがリリースされました。
不思議なもので、株式会社ロックオンが何か支援をしているわけでもないのですが、サポートの終了を表明したことから、新しいサービスが生まれていました。

正直かなり驚いたのですが、EC-CUBEが単なるオープンソースのコミュニティとしてだけでなく、ビジネスのプラットフォームとして強く存在しているんだと感じるリリースでした。

## 3系への移行を充実化

脆弱性情報が提供されるから・・・とか、サポートしてくれるサービスができたから・・・といっても、皆がその恩恵に預かれるわけでありません。

EC-CUBEだけでなく、OSやミドルウェア等にも脆弱性は存在します。
既知の脆弱性を放置することによる制作会社やSIerのリスクも高くなっていますし、レンタルサーバーもここ数年ミドルウェアのバージョンアップや、古い環境のリプレースなどが続いています。
サポート終了したものを使い続けるということは、年々より難しくなっていくでしょう。

2017年7月までに、EC-CUBEの1系や2系をご利用の方がもっと移行しやすいような環境を整備することは必然の課題です。
推定2万2千店舗の移行を支える事は本体の開発も当然ですが、個々のカスタマイズなど支援いただける方々がもっと必要です。
すでに3系への移行を商機と捉えて支援展開を予定しているようなお話も聞こえてきていますが、移行支援を検討されている方は、ぜひEC-CUBE運営チームにもお知らせください。


## ありったけの感謝を

結局まとめきれなかったのですが、2015年はEC-CUBEが大きく変化する1年となりました。

EC-CUBEは株式会社ロックオンが事業として運営しているオープンソースのコミュニティでありビジネスのプラットフォームです。
インテグレートパートナーやホスティングパートナー、決済をはじめとしたパートナー各社のビジネス、そしてEC-CUBEを利用した店舗のビジネスが存在します。

技術的な素晴らしさだけでなく、多くの方と一緒に事業を展開できている、株式会社ロックオン・パートナー・店舗主の三方良しがEC-CUBEの素晴らしさです。

リリース前、株式会社ロックオン社内で開発メンバーと走り続けた日々。
リリース後、世に放たれたEC-CUBE3.0を通じてかけられた厳しいお言葉、暖かいお言葉。
日々増えていく利用者、新しいコミッターの方々との出会い。変わらず支援いただけるパートナーの皆様。
オープンソースの開発の難しさも、コミュニティの素晴らしさも日々実感する1年でした。

2015年EC-CUBEを支えてくれた全ての皆様に感謝します。

### PR：EC-CUBE ユーザカンファレンス2016

こちらはかなり駄文になってしまいましたしたが
2016年のEC-CUBEについては、1月の[ユーザカンファレンス](http://peatix.com/event/130536/)で、改めて発表させていただきます。
[EC-CUBEプラグインアワード3.0](http://www.ec-cube.net/events/plugin_award_30/)の決選投票＆授賞式にもなります。

すでにインテグレートパートナーの方もこれから検討されている方もぜひご参加くださいませ。


## 追記

2016年8月24日
EC-CUBE 2系は、7年半以上の長年の功績や蓄積されたノウハウの多さや、安定性の高さなどから、今なお多くの方々にお使いいただいるという、現状を考慮し、EC-CUBE Ver2系の最新版であるVer2.13のサポート終了期限を延長し、バージョンアップ対応を含む公式サポートを継続していくことといたしました。
http://www.ec-cube.net/press/detail.php?press_id=212
perl でドキュメントがあるモジュールの一覧（grep: パスのみ表示、バイナリを無視する）


>-l

> Only the names of files containing selected lines are written to standard output. grep will only search a file until a match has been found, making searches potentially less expensive. Pathnames are listed once per file searched. If the standard input is searched, the string “(standard input)” is written.
> [[引用元](http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/egrep.1?query=grep)]

GNU 版でも同じっぽい。

## 目的

`grep` でファイル名のみ表示と、バイナリを無視するってののメモで、公に出来そうだったのが、`@INC` の全てのモジュールの`pod` を探すって奴だった。

core は、`corelist -v 5.18.4` 、cpan module は、`ExtUtils::Installed`　で十分だし、枝葉のドキュメントなんかは、大概大本から指示があるんで、必要無いけど。　

## code

`-Mlib=...` とかで、 `@INC` 追加してても無視するコードですので、そのへんは良しなに[^1]

[^1]: http://perldoc.jp/docs/perl/5.12.1/perlsec.pod#Taint32mode32and32-64INC

```
$ find `perl -lTe 'print for @INC'` -type f -exec grep -lI '^=head1' {} \; | sort | uniq | perl -lTpe 's{(??{ +( join q{/|}, @INC ). q{/} })}{}o ; s{/}{::}g ;s/\..*?$// '
```

1. `-T` で `.` を除いた `@INC` の各ディレクトリをルートに
2. バイナリファイルを除いたテキスト相手[^2]に、行頭に `=head1` の記載があるものを抽出して、
3. パスを表示し[^3]
3. ソートしてユニークして、
4. `@INC` のパス除いて、
5. `/` を `::` にして拡張子を除く


[^2]: `find ... -type f` & `grep -I`
[^3]: `grep -l`


## memo

### 順番

一応、アーキテクチャ依存のライブラリが、非依存のライブラリより先に登録されているものと想定してのコード。

そこらに関しては、[こっち](http://qiita.com/bunzaemon/items/f1f4a1d9fb22c8ccd19a)に書いた。
 

### `/(??{ code })/`

`experimental` タグが付いてる。

動的に変更されない限り[^4] `/$code/` よりも代入コストが無い分速い[^5]。後は可読性との相談。


[^4]: 例えば、今回の別コード `BEGIN{ ( $a = join q{/|}, @INC ) .= q{/};} s{$a}{} ;` は動的に変更する予定がない。
[^5]: data not shown だが 600% くらい代入コストで遅くなった。


### gnu find がある環境

`-printf "%P"` なる超絶便利なモンがあるにはあるけど、今回の場合、結局手間は変らんから紹介しない。
@INC の並び順


Cent OS 6.5 での `/usr/bin/perl` の `@INC` の並び順。

`.` が最後とか、`-Mlib=` とか、 `-I` とか、そっち側の話じゃないので悪しからず。

## @INC

```
$ perl -Tle 'print for @INC'
/usr/local/lib64/perl5
/usr/local/share/perl5
/usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib64/perl5
/usr/share/perl5
```



`OS X` pre-install の `perl` では、アーキテクチャ依存のライブラリが収められるパスの名前が、`darwin-thread-multi-2level` と付けられ、アーキテクチャ非依存ライブラリのサブディレクトリとなっている（後述のリスト）。
OS X の `plenv` では、`darwin-2level` である。


しかし、手元の CentOS 6.5 ではサブディレクトリを採用していない様だ。 `lib64` にアーキテクチャ依存のライブラリ、`share` に非依存のライブラリが収められている[^1]。

[^1]: それにも係わらず、設定だけはしてある。


```shell-session:設定はしてあるよ
$ perl -V:archname 
archname='x86_64-linux-thread-multi';
```


## 並びの意味

```
$ perl -V:install.\*{lib,arch}
installsitearch='/usr/local/lib64/perl5';
installsitelib='/usr/local/share/perl5';
installvendorarch='/usr/lib64/perl5/vendor_perl';
installvendorlib='/usr/share/perl5/vendor_perl';
installarchlib='/usr/lib64/perl5';
installprivlib='/usr/share/perl5';
```

パスがそれぞれ、どういう位置付けかは、`-V` で調べる事が出来る。

で、site,vendor,core[^2]の3種類のグループが出来ている。

[^2]: `installprivlib` と `installarchlib` の事。perl って書いてたり core って書いてたり文章によって違う。ま、ここでは core で。

|key|おおざっぱな用途|
|:--|:--|
|site|ユーザーが cpan などからインストールする用[^3]|
|vendor|yum などからのファイル|
|core|core module|


[^3]: 以下、vendor/core ともに perl ソースの INSTALL の Installation Directories の項

が、これらのキーが `@INC` 的にどう扱かれているのか記載されているものが得られない。力不足。
普通に perlrun とかあたりに書いてくんねーかなー。

### 余談: OS X yosemite では、

更に、updates,extas と2種類のグループのパスが追加されている[^4]。

[^4]: `perldoc perlmacosx` 参照。なんで extra/updates に分けるよ？ 

更にパス変更の過渡期にかかってた場合は、updates が二つのパスに及んでいる[^5]。

[^5]: `perldoc perlmacosx` 参照。


それらを除くと、CentOS 6.5 と、同様の並び順ではあった。おそらく普遍的にこの並び順なのではないかと思いたくなる。

```
/Library/Perl/5.18/darwin-thread-multi-2level
/Library/Perl/5.18
/Network/Library/Perl/5.18/darwin-thread-multi-2level
/Network/Library/Perl/5.18
/Library/Perl/Updates/5.18.2/darwin-thread-multi-2level
/Library/Perl/Updates/5.18.2
/System/Library/Perl/5.18/darwin-thread-multi-2level
/System/Library/Perl/5.18
/System/Library/Perl/Extras/5.18/darwin-thread-multi-2level
/System/Library/Perl/Extras/5.18
```


### 関係しそうな所


```
config_h.SH                 # perl source
INSTALL                     # perl source
perldoc ExtUtils::MakeMaker
perldoc ExtUtils::Install
perldoc Config
perldoc Module::Build
```
巡回冗長検査(CRC-32)のHaskellでのゴルフ的コード

(説明はあとで書く)

ゴルフっぽいけどゴルフではないコード。

```hs:CRC.hs
module CRC (check, calc) where

import Control.Applicative ((<$>))
import Control.Arrow (first, (&&&))
import Data.Array (Array, (!), listArray)
import Data.Bits (complement, xor, shiftR, testBit)
import Data.Bool (bool)
import Data.Word (Word8, Word32)
import qualified Data.ByteString as BS (ByteString, foldl')

check :: BS.ByteString -> Bool
check = (== 0x2144df1c) . calc

calc :: BS.ByteString -> Word32
calc = complement . BS.foldl' (flip st) 0xffffffff
        where st b = uncurry xor . first ((table !) . (xor b))
                . (fromIntegral &&& (`shiftR` 8))

table :: Array Word8 Word32
table = listArray (0, 255) . (<$> [0 .. 255]) . ((!! 8) .) . iterate $
        uncurry (bool id $ xor 0xedb88320) . ((`testBit` 0) &&& (`shiftR` 1))
```
React Native - Resources

最終日ですね。React Nativeがどんなものか少しは理解していただきましたでしょうか?

開発する上で基本的なツールは揃っていて、あとは有名なアプリが登場するのを待つだけだと思います。個人的にはWebエンジニアにはとっつきやすく、新しい技術を習得できて、しかもモバイルでサクサク動くので開発してて楽しいというのが感想です。

是非、React Nativeを触ってみてください。

---


最後に使っているモジュール、React Nativeに関連するサイトを紹介したいと思います。

## 私が使用しているReact Nativeモジュール

React Nativeのバージョンがどんどん上がるのでモジュールがついていっているかがポイントだと思います。

* https://github.com/ide/react-native-button - ボタン。簡単に使える。
* https://github.com/exponentjs/react-native-tab-navigator - タブbar
* https://github.com/exponentjs/ex-navigator - Navigator
* https://github.com/nick/react-native-carousel - imageのカルーセル。Swipeでイメージをスライドできる。
* https://github.com/dancormier/react-native-swipeout - リストをスワイプしてDelete等を表示できる

##　便利なサイト

* https://rnplay.org/ - React Native Playground. JSFiddleのようにWebでコードを書いてPreviewできます。
* https://react.parts/native - モジュールの一覧サイト。探しづらいのが難点。
* https://github.com/jondot/awesome-react-native キュレーション
* https://babeljs.io/repl/ - BabelのREPL。ES6,7などのシンタックスがわからくなったら。

## Over The Air

詳しくは[21日目React Native - Over-The-Air updates](http://qiita.com/shohey1226/items/20bab79a4778ee774fbd)を参照のこと。

* https://apphub.io 
* https://microsoft.github.io/code-push/ 

## Facebook Community
* https://www.facebook.com/groups/react.native.community/?fref=ts

## Twitter

* https://twitter.com/Vjeux facebookのひと
* https://twitter.com/dan_abramov Reduxの作者。来年からFacebook React Native teamに。
* https://twitter.com/JI -　exponentjs めちゃめちゃコントリビュートしてる
* https://twitter.com/notbrent expnentjs
* ....

\#reactnativeのハッシュタグで気になった人をフォローとか。GithubのContributerをFollowとか。

# Podcast

* https://devchat.tv/react-native-radio  React Nativeのポッドキャスト。

# サービス

触ってないから詳しくはわかりませんが、React Native開発まわりのサービス

* https://exponentjs.com
* https://appetize.io
[JavaScript] jQuery Deferred テスト実行サンプル

【追記】
非同期処理をすっきり書くためのライブラリ「[<font color="red"><b>MyAsync.js</b></font>](https://qiita.com/yasumodev/items/883c2d92ab6d9dc3414b)」を自作した記事がありますので、そちらも参考に。

---

**jQuery で用意されている Deferred を使うと、非同期処理後のコールバックが連続するような処理を分かりやすく書くことができます。
Deferred の基本的な使い方を簡単にまとめてみました。話をシンプルにするため、**

```
d.resolve() ⇒ .then() が実行される
```

**のパターンのみ記載してます。以下については割愛。**

```
d.resolve() ⇒ .done() が実行される
d.reject()  ⇒ .fail() が実行される
```

# ![](//goo.gl/78mjX8) Deferred対応関数の準備

ポイントは３つ。

1. Deferred生成
1. 関数の最後で promise() を返す
1. 非同期処理完了時に resolve() する

```js:JavaScript
var i;
//------------------------------
// Deferred対応の非同期処理関数
//------------------------------
function async(s) {
	var d = new $.Deferred(); //※１）Deferred生成
	setTimeout(function(){
  		if(s) alert(s);
		else  alert(i++);
  		d.resolve();          //※３）完了時に d.resolve()
	},1000);
	return d.promise();       //※２）d.promise()を返す
}
```


# ![](//goo.gl/78mjX8) テスト1：非同期関数を連続実行

`.then()`でつなげると、非同期処理の完了＝`d.resolve()` を待ってから、次の処理が順次実行されていきます。

```js:JavaScript
//-------------------------
// テスト1：非同期関数を連続実行
//-------------------------
i = 0;
async()
.then(async)
.then(async)
.then(async);
//⇒"0"⇒"1"⇒"2"⇒"3"
```

# ![](//goo.gl/78mjX8) テスト2：非同期関数を並列実行

並列実行させたい処理は `$.when()` でまとめて実行します。

```js:JavaScript
//-----------------------------
// テスト2：非同期関数を並列実行
//-----------------------------
i = 10;
$.when(async(),async(),async())
 .then(async);
//⇒"10","11","12"⇒"13"
```

# ![](//goo.gl/78mjX8) テスト3：引数付きで非同期関数を連続実行

`.then()`の中で引数付き関数を実行したい場合は、こんな書き方(？)

```js:JavaScript
//--------------------------------------
// テスト3：引数付きで非同期関数を連続実行
//--------------------------------------
async("yes")
.then(function(){return async("we")})
.then(function(){return async("can")})
.then(function(){return async("!!")});
//⇒"yes"⇒"we"⇒"can"⇒"!!"
```

⇒ <a href="https://jsfiddle.net/yasumodev/kvt3w207/" target="_blank">１～３のデモソースはこちら</a>

(･o･ゞ いじょー。

# ![](//goo.gl/78mjX8) 参考URL

- <a href="http://qiita.com/opengl-8080/items/6eba7922be168edfc439" target="_blank">jQuery の Deferred の基本的な使い方メモ</a>
- <a href="http://qiita.com/yuku_t/items/3d1cf51d7ae91305eaaa" target="_blank">jQuery.Deferred を使って楽しい非同期生活を送る方法</a>
- <a href="http://qiita.com/yuku_t/items/1b8ce6bba133a7eaeb23" target="_blank">結局 jQuery.Deferred の何が嬉しいのか分からない、という人向けの小話</a>
<a href="" target="_blank"></a>
PhantomJS2.0ではcapybara/poltergeistのattach_fileが動作しないので1.9系に下げる

PhantomJS2.0ではcapybara/poltergeistの`attach_file`が動作しない。そのため、ファイルアップロードのあるケースを実行するためにはPhantomJSのバージョンを1.9系にする必要がある。brewでやる場合は下記

```
$ brew install homebrew/versions/phantomjs198
```

フォーミュラがあるかどうかは下記で確認できる

https://github.com/Homebrew/homebrew-versions
Unity5.3で回転アニメーションを設定すると、実機のみでオブジェクトが表示されない現象


# 追記(2016/03/14)

本現象は`5.3.3`で修正されたようです。



## 検証バージョン

- 5.3.0f4
- 5.3.1f1

## 現象

バージョン5.3のUnity上で、
あるGameObjectに対して回転アニメーションを設定すると、
Unityのプレイヤー上では正常に表示されるが、
実機(iOS/Android)では表示されない現象が起こった。


## 対応策

以下のようにRotation Interpolationを`Euler Angles (Quaternion Approximation)`に設定すると、
実機でも正常に表示されるようになった。

![スクリーンショット 2015-12-25 15.54.11（2）.png](https://qiita-image-store.s3.amazonaws.com/0/2278/39fef815-ee27-6098-4ad8-26a4ca1c2ddb.png "スクリーンショット 2015-12-25 15.54.11（2）.png")


## 参考

http://answers.unity3d.com/questions/1113969/getting-nan-on-ios-when-using-animation.html
gonp〜Goによるdiffのアルゴリズム実装〜

この記事は、2015年のGo Advent Calendarの25日目の記事です。

Go Advent Calendarのその2とその3ができる前、最終日だけ空いてて滑り込みで登録したのはいいけど、なんかネタないかなーと思いつつ、自分のgithubリポジトリを漁っていたらdiffのアルゴリズムをGoで実装したやつが出てきたので紹介してみます。

https://github.com/cubicdaiya/gonp

## gonp〜Goによるdiffのアルゴリズム実装〜

[gonp](https://github.com/cubicdaiya/gonp)はGoによるdiffのアルゴリズム実装です。元々は昔々C++で書いた[dtl](https://github.com/cubicdaiya/dtl)というdiffライブラリの簡易移植で、diffを取るのに必要な以下の要素を求めることができます。

 * 編集距離（Edit Distance）
 * LCS（Longest Common Subsequence）
 * SES（Shortest Edit Script）

diffのアルゴリズムにはさまざまな種類があり、中でもdiffに限らず様々な用途に応用可能な動的計画法が有名です。ただ、動的計画法を利用したdiffは計算量やメモリ使用量の観点から見てあまり効率的ではありません。そこで[gonp](https://github.com/cubicdaiya/gonp)では動的計画法よりも計算量やメモリ使用量が小さいアルゴリズム（Sun Wu, Udi Manber, G.Myers, W.Miller, "An O(NP) Sequence Comparison Algorithm"）を使用しています。昔々Software Designに書いたdiffのアルゴリズムの解説記事がgihyo.jpで公開されているので詳しくはそちらをご覧下さい。

[diffの動作原理を知る～どのようにして差分を導き出すのか](http://gihyo.jp/dev/column/01/prog/2011/diff_sd200906)

ちなみに、このアルゴリズムはSubversionのdiff実装のベースにもなっています。

## gonpで２つの要素列の編集距離、LCS、SESを計算する

まずはgonpをインストールします。

```
go get -u github.com/cubicdaiya/gonp
```

以下は２つの文字列`abc`と`abd`の差分を求めるサンプルプログラムです。

```go:diff.go
package main
 
import (
        "fmt"
        "github.com/cubicdaiya/gonp"
)
 
func main() {
        diff := gonp.New("abc", "abd")
        diff.Compose()
        fmt.Println("編集距離：", diff.Editdistance())
        fmt.Println("LCS：", diff.Lcs())
        fmt.Println("SES:")
        diff.PrintSes("+", "-", " ")
}
```

実行すると編集距離、LCS、SESが求められます。

```console
$ go run diff.go
編集距離： 2
LCS： ab
SES:
  a
  b
- c
+ d
```

なお、日本語もちゃんと動きます。

```go:diff_ja.go
package main

import (
        "fmt"
        "github.com/cubicdaiya/gonp"
)

func main() {
        diff := gonp.New("ごーらん", "あーらん")
        diff.Compose()
        fmt.Println("編集距離：", diff.Editdistance())
        fmt.Println("LCS：", diff.Lcs())
        fmt.Println("SES:")
        diff.PrintSes("+", "-", " ")
}
```

ちゃんと日本語単位で差分が出てますね。

```console
$ go run diff_ja.go
編集距離： 2
LCS： ーらん
SES:
- ご
+ あ
  ー
  ら
  ん
```

## アルゴリズムの言語別実装

gonpで利用しているアルゴリズムの原理は複雑ですが、実装は比較的簡単なので練習の意味合いでいろんな言語にポートしているので興味のある方は以下のリポジトリを御覧ください。言語によって実装具合に差異はありますが、C、D、Go、Java、JavaScript、Lua、Objective-C、Perl、Python、Ruby、Scalaでの実装があります。


https://github.com/cubicdaiya/onp
Arduino+SDcardで起動するたびに新しいLogFileを生成する

#Arduino + SDcard
今回は[ワイヤレスSDシールド](https://www.switch-science.com/catalog/787/)を用いてArduinoからSDカード内にLogFileを作ります。

#形式
LogFileはArduinoを起動するごとに「LOG000.TXT」、「LOG001.TXT」、「LOG002.TXT」...と数字の部分が増えてゆく形式で作られていきます。

#ソース

```LogFile.ino
#include <SD.h>
#include <SPI.h>

File logFile;
char fileName[16];
int fileNum = 0;

void setup() {

  Serial.begin(9600);

  if(!SD.begin(4)){
    // SDカードがないとき
    Serial.println("SD card initialization failed!");
    while(1){
      ;
    }
  }

  // ファイル名決定
  String s;

  while(1){
    s = "LOG";
    if (fileNum < 10) {
      s += "00";
    } else if(fileNum < 100) {
      s += "0";
    }
    s += fileNum;
    s += ".TXT";
    s.toCharArray(fileName, 16);
    if(!SD.exists(fileName)) break;
    fileNum++;
  }

  // ログファイルに書き込む
  logFile = SD.open(fileName, FILE_WRITE);
  logFile.print("This file is No.");
  logFile.println(fileNum);
  logFile.close();

  Serial.print("logFile number is ");
  Serial.println(fileNum);
}

void loop() {
  ;
}
```
underscoreコードリーディング（size）


underscoreに詳しくないので、勉強半分でソースコードを読む。


##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##sizeとは


###[underscorejs.orgのsize](http://underscorejs.org/#size)

こんな説明。
>####_.size(list) 
>Return the number of values in the list.

```javascript

_.size({one: 1, two: 2, three: 3});
=> 3

```

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

listのvalueの個数を返します


###[underscore.size](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L433)

コード的にはこのあたり。


```javascript

// Return the number of elements in an object.
  _.size = function(obj) {
    if (obj == null) return 0;
    return isArrayLike(obj) ? obj.length : _.keys(obj).length;
  };


```

objがない場合は0を返す
objが配列もしくは配列に似た構造の場合は、lengthを用いてカウントし、それ以外の場合は_.keysを用いて配列に整形しなおした後、lengthでカウントし、その値を返す
IO.popenメソッドで標準エラー出力を取得するには

#`IO.popen` では標準出力しか取得出来ない？
Q. FFmpeg や rtmpdump ではログが標準エラー出力に出力されます。`IO.popen` の使い方をググったときに見たのですが、標準出力しか取得出来なさそう。これらのコマンドのログを利用したいときにはその他の手段を使わないとダメなんでしょうね。
A. いいえ、そんなことはありません。標準エラー出力も取得出来ます[^1]。
[^1]: Ruby 1.9以降対応。もう1.8系を使ってるひとは居ないでしょうけど。

[`IO.popen`](http://docs.ruby-lang.org/ja/2.2.0/method/IO/s/popen.html) の普段の使い方（オプションなし）だと標準出力しか取得出来ないのですが、オプションで指定すると標準エラー出力を取得出来ます。

```rb
IO.popen(command, :err => [:child, :out])
IO.popen(command, :err => [:child, :out]) { |pipe| ... }
```
なお、ブロックパラメータ `pipe` は `IO` インスタンスなので、文字出力として扱う場合には、さらに `IO#each_line` や `IO#each_char` で扱いましょう。
標準エラー出力を扱う場合には [`Open3`](http://docs.ruby-lang.org/ja/2.2.0/class/Open3.html) ライブラリを使うことが多いようですが、わざわざ `require 'open3'` しなくても `IO.popen` ですむのであれば、そのほうが簡単でいいのではないでしょうか。

#ファイルディスクリプタの書き方
>ファイルデスクリプタを表すためには、以下が利用できます。
`:in` - 標準入力, ファイルデスクリプタ0
`:out` - 標準出力, ファイルデスクリプタ1
`:err` - 標準エラー出力, ファイルデスクリプタ2
`整数` - 指定した整数が表すファイルデスクリプタ
`IO` - `IO#fileno` で表されるファイルデスクリプタ
[module function Kernel.#spawn (Ruby 2.2.0)](http://docs.ruby-lang.org/ja/2.2.0/method/Kernel/m/spawn.html)

なので、以下のどれであっても同じ意味です。理解しやすいものであればどれでもいいのではないでしょうか。

```rb
IO.popen(command, :err => [:child, :out]) { |pipe| ... }
IO.popen(command, err: [:child, :out]) { |pipe| ... }
IO.popen(command, 2 => [:child, 1]) { |pipe| ... }
IO.popen(command, $stderr => [:child, $stdout]) { |pipe| ... }
IO.popen(command, STDERR=> [:child, STDOUT]) { |pipe| ... }
```

#おまけ：`IO.popen` のオプションで便利そうなもの
以下の引用では [`Kernel.#spawn`](http://docs.ruby-lang.org/ja/2.2.0/method/Kernel/m/spawn.html) での解説ですが、`IO.popen` でも使えます。
>「:chdir」で子プロセスのカレントディレクトリを変更できます。

>```rb
pid = spawn(command, :chdir=>"/var/tmp")
```
「:umask」で子プロセスの umask を指定できます。

>```rb
pid = spawn(command, :umask=>077)
```

#感想
`IO` クラス（や `File` クラス）は奥が深い。

#詳細情報へのリンク
この記事は [IO.popenメソッドで標準エラー出力を取得するには - 別館 子子子子子子（ねこのここねこ）](http://d.hatena.ne.jp/riocampos+tech/20151225/how_to_capture_stderr_by_io_popen_method) の要約です。
THREE.CubeTextureLoaderでSkyboxする

# three.jsのバージョン

```
THREE.WebGLRenderer 73
```

# 背景

今はまだ使えるが、よく検索すると出て来る

```js
THREE.ImageUtils.loadTexture
```

は、deprecatedらしく、警告がコンソールに出力される。
そこで、今風のやり方を探った。


# THREE.CubeTextureLoaderの使い方

ググってもTHREE.CubeTextureLoaderの使い方が見つからず、試行錯誤して、
以下の書き方に落ち着いた。

```js
const cubeTexLoader = new THREE.CubeTextureLoader();

const urls = [ "/assets/C/L/c/A/CLcAB.png", 
            "/assets/6/k/e/e/6keeX.png",
            "/assets/6/k/e/e/6keeX.png", 
            "/assets/6/k/e/e/6keeX.png",
            "/assets/C/L/c/A/CLcAB.png", 
            "/assets/6/k/e/e/6keeX.png" ];

cubeTexLoader.load( urls, function(tex) {
    const cubeShader = THREE.ShaderLib[ 'cube' ];
    cubeShader.uniforms[ 'tCube' ].value = tex;

    const skyBoxMaterial = new THREE.ShaderMaterial({
        fragmentShader: cubeShader.fragmentShader,
        vertexShader: cubeShader.vertexShader,
        uniforms: cubeShader.uniforms,
        depthWrite: false,
        side: THREE.BackSide
    });
    const mesh = new THREE.Mesh( new THREE.BoxGeometry( 3000, 3000, 3000, 1, 1, 1 ), 
                              skyBoxMaterial);
    scene.add( mesh );
```

CubeTextureLoader#loadのコールバックで渡されるオブジェクトが
単純に画像データの配列でないことはわかったが、じゃぁどう扱うかが
分からず試行錯誤した。

[<img width="451" alt="3D_Trusterd_and_mruby_logo_-_jsdo_it.png" src="https://qiita-image-store.s3.amazonaws.com/0/3458/40136e52-6437-865f-2f7f-323913978969.png">](http://jsdo.it/kjunichi/kz4p)

# まとめ

skyboxに使うには無理のあるテクスチャだったw。

# 関連記事

- [BlenderでエクスポートしたJSONがThree.jsで変な色になる問題が解決](http://abrakatabura.hatenablog.com/entry/2015/12/21/071507)
- [ElectronでWebGL(three.js)使ってデスクトップマスコット作った際に分かったこと](http://abrakatabura.hatenablog.com/entry/2016/01/09/134348)
- [Three.jsでexamplesの高級車たちをblenderにExportしたが残念な結果に](http://abrakatabura.hatenablog.com/entry/2017/12/16/223318)
- [gopherくんのjsonデータがthree.jsのr85以降表示されなくてはまったjsonデータがthree.jsのr85以降表示されなくてはまった](http://abrakatabura.hatenablog.com/entry/2017/12/19/222952)
VirtualBox 上の CentOS 7.2 に Guest Additions をインストールする

#概要
**VirtualBox** 上の **CentOS** 7.2 に **VirtualBox Guest Additions** をインストールする手順のまとめ。

##バージョン
**VirtualBox** 5.0.12
**CentOS** 7.2.1511

## インストール
VirtualBox の仮想マシンのウィンドウのメニューで、`デバイス` > `Guest Additions CD イメージの挿入...` を選択。

```
yum -y update
yum -y install gcc perl bzip2 kernel-devel
mount /dev/cdrom /media
sh /media/VBoxLinuxAdditions.run
```
### 失敗するケース
kernel と kernel-devel のバージョンが一致していないと以下のようなエラーを吐いて失敗するので、kernel を事前にアップデートしておく必要がある。

```
Building the VirtualBox Guest Additions kernel modules
The headers for the current running kernel were not found. If the following
module compilation fails then this could be the reason.
The missing package can be probably installed with
yum install kernel-devel-3.10.0-327.el7.x86_64

Building the main Guest Additions module[失敗]
```
このケースでは、確認すると以下のように `kernel.x86_64` と `kernel-devel.x86_64` のバージョンがそれぞれ `3.10.0-327.el7` と `3.10.0-327.3.1.el7` で一致していない。

```
[root@localhost ~]# yum list installed | grep kernel
kernel.x86_64                         3.10.0-327.el7                   @anaconda
kernel-devel.x86_64                   3.10.0-327.3.1.el7               @updates
kernel-headers.x86_64                 3.10.0-327.3.1.el7               @updates
kernel-tools.x86_64                   3.10.0-327.el7                   @anaconda
kernel-tools-libs.x86_64              3.10.0-327.el7                   @anaconda
```

##その他
共有フォルダーの設定等は [CentOS 6.6 に Guest Additions をインストールする](http://qiita.com/bezeklik/items/05f945bca96715f13bf5) を参照のこと。
Jenkinsのビルド環境にDockerを使ったらJenkinsとコンテナでファイル共有できなかったので悲しかった

# 問題

```bash:ホストOS
$ docker run -d -v /path/from/host:/path/to/docker:ro test
$ ls -al /path/from/host
total 4
drwxr-xr-x. 2 500     500      45 Dec 25 16:26 .
drwxr-xr-x. 3 jenkins jenkins  19 Dec 25 16:26 ..
```

```bash:コンテナ
$ ls -al /path/to/docker/
drwxr-xr-x. 2 defaultuser defaultuser  45 Dec 25 16:26 .
drwxr-xr-x. 3 root        root         19 Dec 25 16:26 ..
```

・・・記憶があいまいなので正確ではないかもしれませんが、こんな感じだったと思います。
共有フォルダの所有者が、ホスト側とコンテナ側で一致しない（し、そもそもそんなユーザーがいない）という現象が起きてしまって、共有なのに相互に書き込めないということになってしまいました。

コンテナ側のユーザーにはsudoを持たせればなんとでもなりますが、ホスト側のJenkinsユーザーには安易にsudoを持たせたくなかったので、なんとかならないかと思っていました。

# 解決？

## uidを合わせればよさそう

```bash:ホストOS
groupadd -g 1200 docker
useradd jenkins -M -u 1250 -G docker
```

```bash:Dockerfile
RUN usermod -u 1250 projects && \
    gid=`id -g projects` && \
    groupmod -g 1250 projects && \
    find /home/projects -gid $gid -exec chgrp projects {} \;
```

* ※ホスト側ではDockerもJenkinsもインストールする前に`1200`番と`1250`番（数字は適当）でユーザー作成しておきます。
* ※コンテナは既存のImageを使用することを前提にしていますので、ファイル共有が必要なユーザー（ここでは`projects`）にホストのJenkinsユーザーと同じIDを付与し、ホームディレクトリ以下の権限を変更します。
* ※ホームディレクトリ以下のuidは勝手に変更されるようです。
* ※ホームディレクトリ以外を共有する場合は別途uidとgidの変更が必要です。

## 確認

```bash:ホスト
$ ls -al /var/lib/jenkins/jobs/test/workspace/docker
total 4
drwxrwxr-x. 2 jenkins jenkins  45 Dec 25 16:26 .
drwxr-xr-x. 3 jenkins jenkins  19 Dec 25 16:26 ..
-rw-rw-r--. 1 jenkins jenkins   0 Dec 25 16:26 id_rsa
```

```bash:コンテナ
$ ls -al /home/projects/jenkins
total 4
drwxrwxr-x. 2 projects projects  45 Dec 25 16:26 .
drwxr-xr-x. 3 root     root      19 Dec 25 16:26 ..
-rw-rw-r--. 1 projects projects   0 Dec 25 16:26 id_rsa
```

これで、Jenkinsからもコンテナからも自由に書き込みできるようになりました。
しばらくこれで使ってみます。
めでたし
vagrant on macでWEB管理画面(rancher)使ってdocker管理

# vagrant on macでWEB管理画面(rancher)使ってdocker管理
・vagrant便利だけど、仮想マシンをエクスポートして共有とか無理。
・docker使いたいけど、コンテナ管理とか面倒。
なんて色々話が上がっていたので、docker使ってコンテナ化してポータビリティ保ちつつ、管理だけはなんとなくvagrant上に立てたrancher使いましょうってお話です。

自分的には漢ならコマンド一本で生きろって思ってしまうのですが、無理強いは出来ないので、こういうのもあるよって紹介。

## rancherってなんぞ?
rancherはdocker周りの運用を助けてくれるオープンソースプロジェクトです。WEB管理ツールも持ちつつ、APIなんかもあるので、独自のIaaS的に運用が出来ます。本番環境ではまだ使ったことないですが、手元の運用としては問題ないと思います。ガチで使うと本当に便利だったりするので検証みてもよいと思いますよ

## vagrantでrancherを動かす(15分)
rancherではvagrant上で動かすことを想定したファイルなんかも用意しているので
時間をかけずに試すことが出来ます。というわけでやってみましょう。

※細かいの見たい人は以下参照
[https://github.com/rancher/os-vagrant](https://github.com/rancher/os-vagrant)

### git clone

```
$ cd <自分の好きな場所>
$ git clone https://github.com/rancher/os-vagrant.git

```

### Vagrantfileを更新

VagrantのVMマシンポート8080をホストマシンの8080にポートマッピングをして
rancherに直接アクセスしてみましょう。

```
$ cd os-vagrant
$ vi Vagrantfile
```

forwarded_portの記述を追記

```lang:Vagrantfile
ip = "172.19.8.#{i+100}"
node.vm.network "private_network", ip: ip
node.vm.hostname = hostname
↓
ip = "172.19.8.#{i+100}"
node.vm.network "private_network", ip: ip
node.vm.network :forwarded_port, guest: 8080, host: 8080
node.vm.hostname = hostname
```

### vagrant up

```
$ vagrant up
Bringing machine 'rancher-01' up with 'virtualbox' provider...
==> rancher-01: Checking if box 'rancherio/rancheros' is up to date...
==> rancher-01: Clearing any previously set forwarded ports...
==> rancher-01: Clearing any previously set network interfaces...
==> rancher-01: Preparing network interfaces based on configuration...
    rancher-01: Adapter 1: nat
    rancher-01: Adapter 2: hostonly
==> rancher-01: Forwarding ports...
    rancher-01: 8080 => 8080 (adapter 1)
<略>

$ vagrant ssh
```

### コンテナ起動
コンテナ起動までに少し時間がかかります。

```
[rancher@rancher ~]$ sudo docker run -d -p 8080:8080 rancher/server
Unable to find image 'rancher/server:latest' locally
latest: Pulling from rancher/server
0bf056161913: Pull complete
1796d1c62d0c: Pull complete
e24428725dd6: Pull complete   
   <中略>
8df5ebfaf4ea: Pull complete
a068c5314ea1: Pull complete
Digest: sha256:5f24e7220b48e602a1f66xxxxxxxxxxxxxxxxxxx3bb0bcba67c70dc8f430a5823
Status: Downloaded newer image for rancher/server:latest
435afe86da5c7e7e64725xxxxxxxxxxxxxxxxxx4584420c6239eff2efef374
```


## rancherにブラウザアクセス
今回の手順だとvagrant上のコンテナ8080をホストマシンの8080にポートマッピングしているのでブラウザで「[http://127.0.0.1:8080/](http://127.0.0.1:8080/)」にアクセスしてみましょう。

![vagrantでrancherを動かしてみる](https://qiita-image-store.s3.amazonaws.com/0/74153/12aa6ebd-56f8-084b-f1ec-2cd172ce9ff1.png)

## アクセスコントロールの設定
画面上部のとこ「Access Control」をクリックして、設定をしましょう。
通常であれば、Githubと連携させておけばOKだと思います！

![rancher-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/74153/1628d867-555f-ec38-d822-a65d501b6cc1.gif)

## Rancherの管理画面イメージ
少しだけ、gifで紹介。ホストとしてはAmazon EC2, DigitalOcean等も使えるので色々出来ます。ローカルで使うだけなら、Customしか使わないけど。。。

![rancher_admin-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/74153/cb55aa37-2076-60fc-aca5-9644d262f44b.gif)