OmniAICreator/Qiita-1.07M huggingface dataset:
VRを使ったData Visualizationの可能性について

# VRを使ったData Visualizationの可能性について

[Data Visualization Advent Calendar 2014 - Qiita](http://qiita.com/advent-calendar/2014/dataviz)
 18日目の記事です。

Oculus Riftから始まり、Google Cardboardでスマートフォンに広がる手軽な没入型VRを使ったData Visualizationの可能性について書きます。

## 3Dで見るということ
今年の２月に機会があり、神戸で行われた外科手術用のロボットda Vinciを操作できる会に参加してきました。
[da Vinci開発元のIntuitive Surgicalのサイト](http://www.intuitivesurgical.com/)

こちらがda Vinciのロボットアーム部分です、患者のお腹に穴を空けて、黒い小さなアームが体内に入り手術をします。中央の棒にはライトとステレオカメラがあります。
![R0001048.JPG](https://qiita-image-store.s3.amazonaws.com/0/3586/09f72139-c427-11f5-9929-fda82be93582.jpeg)


こちらがda Vinciのオペレーションする部分です。外科医は中央のレンズからステレオ映像を見ながら、その下にあるマニピュレーターを操作して手術をします。
![R0001073.JPG](https://qiita-image-store.s3.amazonaws.com/0/3586/6ea230f3-3280-1334-a609-c8a15244ba65.jpeg)

立体視の方法はOculus Riftと同じ方式で、サイドバイサイドの映像を右目と左目で別々に見るようになっています。

体験会では、このようなシリコン製の突起に空いた、2mm程度の穴に輪ゴムを通すという操作をしました。![R0001064.JPG](https://qiita-image-store.s3.amazonaws.com/0/3586/04de93be-796b-bf5a-0b47-90789ec98d89.jpeg)

ロボットの操作は5分ぐらいやってみると、すぐにコツがつかめて輪ゴム通しも出来るようになりました。3億円するだけあって、UIとして非常に良くできているなと思い、どこが良くできているのだろうと考えてみた結果、ステレオ映像で立体で見えることと、ちょうどモニター内で見えている鉗子（ロボットアーム）の位置と操作するマニピュレーターの位置が感覚的に一致しているというのがミソだという結論に至りました。

実際の操作は奥行きがある3Dの操作なので、3Dで見えるというのはごく自然です。というか2Dのモニターを見ながら3Dの操作をするというのは、大きさから位置関係を把握して、そこから奥行きを予測するという大変な事を脳がやっていることに気がつきました。

## Oculus Riftで3Dのデータに入り込む
CTスキャンのデータは、スキャン方向に連続した画像のシークエンスです。
Osirixという医療用のビューワーでシーケンスをみているスクリーンショットです。
![CT_0.png](https://qiita-image-store.s3.amazonaws.com/0/3586/43de07aa-dc1a-2b2f-d63f-ffdd525247bd.png)
![CT_1.png](https://qiita-image-store.s3.amazonaws.com/0/3586/819406ae-f8db-e2cb-a9b5-58570baf5f7c.png)
Osirixでスライダーを動かすと、画像のデータを切り替えてみることができます。

Osirixでは、3D表示機能もあり、このように3Dのモデルでデータを見る事が可能です。![3D_0.png](https://qiita-image-store.s3.amazonaws.com/0/3586/eae9078d-82ab-19be-b2df-f37ef1099e6b.png)

さらに3Dモデルをexportできるので、3Dモデルをexportして、Unityに取り込んで、Oculusアプリ化してみました。

![DSC00757.JPG](https://qiita-image-store.s3.amazonaws.com/0/3586/63a15543-a61f-7fcc-4c44-e3c0754e281c.jpeg)

ゲームコントローラーで、カメラの位置を自由に移動できるようにしてみました。
写真のアプリでは、さらに皮膚のモデルも生成して、青い半透明のレイヤーとして表示させています。

## 見るから探検という体験へ！
「頭蓋骨の中に入って頭蓋骨の中から外を見たらどんな感じか見てみたい」という欲求から作ってみたアプリですが、データの中にダイブするという体験をしてみて発見がありました。

![3D_1.png](https://qiita-image-store.s3.amazonaws.com/0/3586/2b6aa437-afc2-f8ab-8626-bf699484ef8c.png)
こちらは、頭蓋骨と首が繋がっている部分です。こんな面白い形をしていました。
これは、Oculusをかぶってウロウロ＆キョロキョロして発見した部分です。

首の中を下って行くこともできます。
![3D_2.png](https://qiita-image-store.s3.amazonaws.com/0/3586/47633bec-0645-c9d9-a131-02f948d3564f.png)

こちらは、心臓が動いている状態をCTスキャンしたデータから3Dモデルのシーケンスをつくってアニメーションさせたデモです。映っているのは造影剤を点滴してCTスキャンした様子です。血液が映っているので普段よく見る心臓の形とは少し違いますが、血液の動きにより血管が動いている様が、どのような角度からも3Dで見る事ができます。
[Heart Beat for Oculus VR ](https://www.youtube.com/watch?v=dMhi4yyYEoY)

## VRを使った Data Visualizationの可能性
CTスキャンのデータを3Dモデルに起こしたものをOculus Rift DK2を使って見るという例を紹介してみました。VRを使うと多数のデータを直感的に捉えることができるのでは無いかと思います。例えば、GISデータであれば地図上に色分けをして表示していた統計データを高さで表すことにより、どこの部分のデータが回りと比べてどれぐらいの違いがあるかなどは、データを見慣れていない人にも直感で把握できます。

## Data Visualization Japan meetup#2
[Data Visualization Japan meetup#2](http://data-visualization-japan.doorkeeper.jp/events/18551)でLTをさせて頂きます。当日はOculus Rift DK2も持って行くので、データの中にダイブする体験をしてみて下さい。
macにscalaとsbtをインストール

scalaはいいとして…
sbtとは

```text
・scala用ビルドツール
・scalaアプリケーションをコンパイルしてくれる
・使用するパッケージやライブラリの管理を行ってくれる
```
こんなことができるツールみたいです。
scalaプロジェクトには必要そうな匂いがします。


今回は以下のバージョンをインストールします。

```text
scala:2.11.4
sbt:0.13.7
```

# scalaインストール
http://www.scala-lang.org/download/
こちらからダウンロードリンクをコピーしてきます。

```bash
cd /tmp

# ダウンロード
$ curl -O http://downloads.typesafe.com/scala/2.11.4/scala-2.11.4.tgz

# 解凍
$ tar xzf scala-2.11.4.tgz

# 移動
$ mv scala-2.11.4 /usr/local/src/scala

# パスを通す
$ export PATH=$PATH:/usr/local/src/scala/bin
$ export SCALA_HOME=/usr/local/src/scala

# 確認
which scala
```

これで完了です！

# sbtインストール
sbtに関しては、homebrewから入れます。
manualインストールもできますが、ちょっと手間がかかりそうなので・・・

manualインストールの方法は↓に載っていますので、
もしmanualでやる場合はこちらを参照してみて下さい。

http://www.scala-sbt.org/release/tutorial/Manual-Installation.html

それでは、実際にインストールします。

```bash
# インストール
$ brew install sbt

# 確認
which sbt
```

以上でscalaとsbtのインストールは終了です。

# Helloworld
サクッと出力するためsbtではなく、
標準でついているコンパイラを使います(scalac)
横着ですみませんorz

```scala:HelloWorld.scala
object HelloWorld {
  def main(args: Array[String]) {
    println("Hello, world!")
  }
}
```

```bash:コンパイル
$ scalac HelloWorld.scala
```

```bash:実行
$ scala HelloWorld
Hello, world!
```

以上です。
scalaとsbtは、apache sparkで使用するのでインストールしてみました。
getoptsとset -xのいい関係

getoptsで引数にvのときに
set -xとしておくと良いかんじに
出力の詳細がわらわらでて、-v感を
お手軽に実現できて大変よろしい


```bash:getopts_x.sh
#!/bin/sh

usage(){
    cat << EOF 
$(basename $0) is useful script!
this is usage.
EOF
exit 2
}

while getopts hv OPT 
do
   case $OPT in
        h)  usage
            ;;  
        v)  set -x
            ;;  
        \?) usage
            ;;  
    esac
done

shift $((OPTIND - 1)) 
```

getopts周りの良い記事は
[bash によるオプション解析](http://qiita.com/b4b4r07/items/dcd6be0bb9c9185475bb)

usage書くのも良い習慣になるので
[使いやすいシェルスクリプトを書く](http://deeeet.com/writing/2014/05/18/shell-template/)

usageは習慣として man コマンドで出力される形式を真似ている
スクリプト見るのも使うのもLinux上だと思うので
pbxprojファイルのマージが便利になるmergepbxをインストールするスクリプト書いた

まず、作ったスクリプトファイルです。

https://gist.github.com/kaneshin/40d9331941682bf46f5d

## mergepbxとは

[simonwagner/mergepbx](https://github.com/simonwagner/mergepbx)

Xcodeのプロジェクトの構成情報をもつpbxprojファイルをGitでマージするときに手助けしてくれるものです。

pbxprojファイルはコンフリクトすると厄介で、丁寧に直さないと簡単に壊れてしまいます。

複数人のプロジェクトでお互いに大きくプロジェクトファイルを変更した場合や、ブランチ間でのマージ時に非常に役立つはずなので、iOS/Mac開発者は是非入れたほうがいいです。


## mergepbxのインストール方法

これだけ

```
curl -s https://gist.githubusercontent.com/kaneshin/40d9331941682bf46f5d/raw/42e2a7df2d8dbf6c956edcd3fd1c332e3364f573/install_mergepbx.sh | sh
```

これをターミナルで叩けば `/usr/local/bin` に勝手にインストールされます。

`/usr/local/bin` が嫌ならば、フォークするなりして `MERGEPBX_PREFIX` に好きなインストール先を指定して各自に実行してください。

mergepbxがインストールされ
れば、残りは使用するプロジェクトの`.gitattributes`にmergeの設定を追加で終わりです。

**.gitattributes** （無ければプロジェクトリポジトリ直下に作成する）

```
*.pbxproj merge=mergepbx
```

----

## スクリプトを使わずにmergepbxをビルドする

「お前が用意したスクリプトをcurl経由で実行するのが怖い」。

あるあるですね。

そんな方でも問題ないです。

自分でビルドするのはとても簡単です。


### 1. mergepbxをcloneする

[simonwagner/mergepbx](https://github.com/simonwagner/mergepbx)からcloneしてきてください。

```
git clone https://github.com/simonwagner/mergepbx.git /tmp/mergepbx
```


### 2. mergepbxをbuildする

cloneしたディレクトリに移動して、`build.py`を実行する

```
cd /tmp/mergepbx
./build.py
# /tmp/mergepbx/build.py でもok
```


### 3. mergepbxをcopy/move

mergepbxをPATHの通ってるとこに移動します。

```shell
cp mergepbx /usr/local/bin
# cp /tmp/mergepbx/mergepbx /usr/local/bin
```

`/usr/local/bin` は各自で変えてください。

### 4. ~/.gitconfigにmergepbx設定を追加する

グローバルかローカルプロジェクトの`.gitconfig`にmergepbxの設定を追加します。

```
git config --global merge.mergepbx.name "Xcode project files merger"
git config --global merge.mergepbx.driver "mergepbx %O %A %B"
```

`.gitconfig`に下記が追加されます

```
[merge "mergepbx"]
    name = Xcode project files merger
    driver = mergepbx %O %A %B
```


### 5. .gitattributesにmergeの設定を追加する

**.gitattributes** (無ければプロジェクトリポジトリ直下に作成する)

```
*.pbxproj merge=mergepbx
```

これで、pbxprojファイルのmergeに関してmergepbxが使用されます。


## さいごに

mergepbxは再帰的に見ているのか、処理に時間を使うことがたまにあります。

そして、タイムアウト？か何かによって最後まで終わらないとpbxprojの中身が相当分消えることもあります。

そうなった場合は一度リポジトリをリセットして、.attributesのmerge設定を無効にしてから普通にmergeを行ってください。

そこでコンフリクトしたら、もうしょうがないです。はい。


----

このインストールスクリプトに何か修正などしたければご自由にどうぞ

https://gist.github.com/kaneshin/40d9331941682bf46f5d
ロボティックボールを遠隔から制御する（カメラで表情認識した結果を Websocketで送受信）

# イントロ
こちらは、[HTML5vent Calendar 2014](http://qiita.com/advent-calendar/2014/html5)の16日目のエントリーです。

# これをやった経緯

- 経緯
  1.  [HVC-C の「Make your own Prototype」モニター募集キャンペーン](http://plus-sensing.omron.co.jp/news/20141104000098/)に応募して、HVC-C のベータ版がゲットできた！
  2.  プロトタイプアプリを開発して応募、審査通過しないと、ベータ版の HVC-C は返却らしい・・・。  
       でも、審査通過したら、製品版も追加でもらえるらしい！
  3.  うちにあった[「ロボティックボール Sphero 2.0」](http://www.sphero.jp/sphero-2/) とか組み合わせてみようかな。
  4.  [Sphero 2.0 の Android SDK](https://developer.gosphero.com/) と、HVC-C の SDK サンプルを適当にマージしたみたけど、アプリがエラーで落ちてしまう・・・。
  5.  過去にミニマムなサンプルで作ってた、Android アプリで Websocket のサンプルなら、HVC-C の SDK サンプルと適当にマージして動いた。
  6.  Sphero 2.0 の node.js ライブラリは[いくつかあるみたい](https://github.com/search?l=JavaScript&q=Sphero&type=Repositories)。
  7. Websocketを利用した仕組みにしよう！！

# 完成したもの

## 構成図（計画、プロトタイプ版）

- 構成図（計画）

![構成図（計画）.png](https://qiita-image-store.s3.amazonaws.com/0/50868/e3349fc1-88e0-897a-f0ba-8f1e8047dd0f.png)


実際は以下のようになりました。  
インターネット上のサーバではなく、ローカルネットワーク内にサーバをたてて、そのローカルネットワーク内で Nexus 7 と MacBook Air を通信させる形に。

- 構成図（プロトタイプ版）

![構成図（プロトタイプ版）.png](https://qiita-image-store.s3.amazonaws.com/0/50868/abcb8abf-7a77-2d80-9f34-ee2aa4caa090.png)

## プロトタイプの動作している映像など

かなり映像撮影も、プロトタイプ自体もあらい感じですが・・・。
思った以上に、映像撮影と、制作・編集が大変だった・・・。

- [ココロツタエル： HVC-C「Make your own Prototype」 - YouTube](https://www.youtube.com/watch?v=DcGexxBoPOA)

## ※ 追記
2014/12/24 に審査通過との連絡メールをいただきました。
それと合わせて、公式サイトでプロトタイプが紹介されました。
 ⇒ [ココロツタエル | アプリ | Sensing Egg Project for  HVC-C](http://plus-sensing.omron.co.jp/egg-project/app/you/)

# やったこと

## 実装した内容

- Android ネイティブアプリ
  - 利用したSDKやサンプル（Java）： 。。。
- Websocket サーバ
  - 利用したライブラリ（Javascript）： 。。。
- Websocket クライアント ＆ Sphero制御アプリ
  - 利用したライブラリ（Javascript）： 。。。

※ 後で詳細を追記します・・・。
aura:componentの入れ子の深さ

Lightningコンポーネントの中にLightningコンポーネントを渡せる、Lightningコンポーネントに引数を渡せる、と聞けば、再帰呼び出ししても良いのかな、というのが気になるところですね。

```xml:Auratest.app
<aura:application>
    <tiwasakidemo:AuratestComponent />
</aura:application>
```

```xml:AuratestComponent.cmp
<aura:component>
    <aura:attribute name="depth" type="Integer" default="1" />
    depth: {!v.depth} <br />
    
    <aura:if isTrue="{!v.depth lt 100}">
        <tiwasakidemo:AuratestComponent depth="{!v.depth + 1}"/>
    </aura:if>
</aura:component>
```

はい、internalエラーですか…。

手元で試した結果80回くらいまでは再帰できました。

ただ、コンポーネント内の記述を増やしたところ、もっと少ない回数でもエラーになってしまいましたので、皆様に置かれましては、再帰などは考えず、素直に普通のコンポーネント開発の入れ子として構築しましょう、て言われなくてもそうしますね。以上です。
iOSのスプラッシュスクリーンを古き良き方法で指定

メモです。


### 開発環境
Xcode 6.1.1 (6A2008a)
OS X 10.9.5

### やりたいこと

iPhone 6 及び iPhone 6 plus の画面サイズ**以外**に対応したスプラッシュスクリーン**だけ**を設定したい。
その際、xibもstory boardもxcassetsも使わずにDefault*.pngを配置するだけで済ませたい。

### 理由

クロスプラットフォームで開発しているので、OS固有の余計な設定手順を増やしたくない。
iPhone 6の画面サイズまで個別に対応できんよ。（デザイナー禿げるわ）


### やったこと

1. 従来通りDefault*.pngを配置
2. Info.plistのUILaunchImagesから余計な定義を削除
Android端末をプレゼン用途でWebカメラ的に使おうとした話【設計編】

# イントロ
こちらは、[WebRTC Advent Calendar 2014](http://qiita.com/advent-calendar/2014/webrtc)の16日目のエントリーです。
まずは、タイトルに書いてる内容の説明から。

- 経緯
  1. [エンタメな勉強会の第1回](https://atnd.org/events/47308)で登壇した際、Arduinoを試してみた話や、Arduinoで組んだ回路の説明をしつつ、「途中で何度か、実際にArduinoを配線して動かすライブデモ」を実施。
  2. Keynoteのプレゼン資料と、Webカメラ映像をだしたQuickTimeのウインドウを、何度か途中で切り替えつつプレゼンをする、というのが手間で面倒だった。
  3. 「プレゼン資料の提示と、カメラ映像表示との切り替えを、同一アプリ内でシームレスにできないか？」と考える。そして、「Webな勉強会なので、Webの技術を使って」とか。
  4. 「getUserMedia」で取得した映像をブラウザに表示して、かつ、プレゼン提示部分もWebページ上で表示しつつ、シームレスな画面切り替えができる方法を検討してみよう！

# 設計

## 利用する要素・仕組みの検討
- 前述の通り、カメラ映像は「getUserMedia」で取得して表示
- カメラ映像・プレゼン資料はフルスクリーン表示もしたい ＝ 「[Fullscreen API](http://www.w3.org/TR/fullscreen/) ！」
  - Fullscreen API で、要素ごとのフルスクリーン表示・表示の切り替えを実装したら、「プレゼン資料を表示した要素と、カメラ映像を表示した要素を、個別にフルスクリーン表示＆切り替えができる！？」。
  - キーボードの適当なキーを、フルスクリーン要素の切り替えとか、フルスクリーンの終了に割り当てれば、前述のアプリ内でのシームレスな画面切り替えを、キー操作で実現できそう
- PC内蔵のカメラは、前述のような、「机の上にある特定の物体を表示する」といった事が難しいので、Android端末のカメラを利用してみる
  - PCにWebサーバたてれば、無線経由でAndroidとPCをつなげられるけど、有線接続できたほうが安定しそう・・・。  
    ⇒ [Android と PC の Chrome でのリモートデバッグ機能](https://developer.chrome.com/devtools/docs/remote-debugging)を使えば、PCのChrome上に、USB接続した Chrome on Android の画面表示をだす、といった、有線接続のWebカメラ的なことができそう！
- プレゼン資料はいくつか表示方法がありそう（上記の要件に合うかは検証が必要そうですが）
  - PDFで資料を準備して、[PDF.js](http://mozilla.github.io/pdf.js/) とか、何かライブラリを使って、ブラウザ上に表示
  - オンラインのスライドホスティングサービス（ SlideShare とか）に事前に資料をアップして、それをWebページ上に埋め込むとかで解決？
  - HTML + Javascript + CSS でプレゼン資料を準備（ライブラリ使ったりとか）

# 実装・コード

こちらは、もう少し内容が綺麗にまとまってから、別途公開予定。

### 2014/12/22追記

■ カメラ映像関連部分について、記事を公開しました。
⇒ [有線接続したAndroid端末をWebカメラ的に使う（ブラウザ上での映像表示）](http://qiita.com/youtoy/items/764d83ab0f8b7a1d258c)
zshではrmコマンドでファイルを削除する前に確認を求めてくれる

## rm \*で確認を求める
zshには、`rm *`とかワイルドカード指定でファイルを削除するときにyes/noで確認を求めてくる機能がある。というかその機能はデフォルトで有効になっているので、見たことある人も多いと思う。

この機能を使っている様子は以下の通り。

```
% rm hoge.txt
#<= 個別のファイルを指定して削除するときは特に何も起こらない

% rm *
zsh: sure you want to delete all the files in /home/mollifier/work [yn]?
#<= *で削除するときは、rmコマンドを実行する前にzshが確認を求めてくる

% rm -rf *
zsh: sure you want to delete all the files in /home/mollifier/work [yn]?
#<= rmにオプションを指定していても同様
```

rmコマンドは-iオプションを付けると削除してよいか聞いてくるけど、この機能を使うと-iとか-fとかrmのオプション指定によらずに、削除対象に`*`が入っているとrmコマンドを実行する前にzshが聞いてくる。これで`rm * .txt`のようにスペースを入れてしまったりとか、意図せず`*`で全ファイルを削除してしまうようなことを防げる。

逆にこの機能を使いたくない場合はRM\_STAR\_SILENTオプションを有効にする。

```zsh
# rm *で確認を求める機能を無効化する
setopt RM_STAR_SILENT
```

## 勢いで間違ってyesを選んでしまうのを防ぐ
さっきの機能を有効にして使っていても、ずっと使ってるとそのうち「はいはい、yesね」みたいな感じで、何も考えずにyesを選んでしまうようになる(人によるけど)。そういうふうになってしまうと確認を求めてる意味がなくなる。zshはそういう人のことも心配して、RM\_STAR\_WAITというオプションも用意してくれている。

```zsh
setopt RM_STAR_WAIT
```

これを有効にするとyes/noを聞く前に10秒待つようになる。なので、惰性で適当にyesを選ぶというのができなくなる。その10秒間に冷静になって、本当に問題ないか確認しようという機能。

```
% rm -rf *
zsh: sure you want to delete all the files in /home/mollifier/work? (waiting ten seconds)
#<= ここで10秒間操作を受け付けなくなる
 [yn]?
#<= 10秒たつとyes/noを選べるようになる。
```

このオプションは最初に紹介した機能を有効にしてるときだけ意味がある。`setopt RM_STAR_SILENT`で無効にしてたらそもそもyes/noを聞いてこないので、RM\_STAR\_WAITを有効にしたとしても10秒待たない。


## 最後に
最後に注意として、この機能はいつでも有効というわけではなく、抜け道もある。

まず、コマンド名がrmでないときはこの機能は動作しない。`/bin/rm`とフルパスで指定した時も「コマンド名がrmでない」という状態にあたるので、yes/noを聞いてこない。

```
% /bin/rm -rf *
#<= yes/noを聞かない
```

あと、削除する対象が単独の`*`でなく、前後に何か付けているときも聞いてこない。

```
% rm -f *.txt
#<= yes/noを聞かない
```

なので、この機能を有効にしていたとしても、そもそもrmコマンドを実行するときは**Enterを押す前に**確認する、というのが大事だと思う。
RailsでAmazon APIを使って商品を検索する方法

## いつ使えるの？

RailsからAmazonで商品を検索したいとき。

## 公式リポジトリ

[amazon-ecs](https://github.com/jugend/amazon-ecs)

## amazon-ecsをインストール

```ruby:Gemfile
gem 'amazon-ecs'
```

```
$ bunde install --path vendor/bundle
```

#### config/application.rb などを編集

```ruby:config/application.rb
require File.expand_path('../boot', __FILE__)

require 'rails/all'
require 'amazon/ecs' # 追記
Bundler.require(:default, Rails.env)

# ここから
module Test
  class Application < Rails::Application
    Amazon::Ecs.options = {
      :associate_tag =>     '987654321',
      :AWS_access_key_id => 'mosmosmosmosmosmosmosmos',
      :AWS_secret_key =>   'mosmosmosmosmosmosmosmos'
    }
end
# ここまでを追記
```

associate_tagとして、アソシエイトのIDも記入できます。

#### コントローラーを編集

```ruby:app/controllers/home_controller.rb

class HomeController < ApplicationController

  def index
    @res = Amazon::Ecs.item_search("検索したいキーワード",
             :search_index   => 'Books',
             :response_group => 'Medium',
             :country        => 'jp'
           )
  end
end

```

Amazon::Ecs にある item_search というメソッドを使って Amazon にアクセスします。レスポンスはAmazon::Ecs::Response オブジェクトになって返ってきます。

#### 本のタイトルと画像を取得（1件）

```html+erb:app/views/home/index.html.erb

<%= @res.first_item.get('ItemAttributes/Title') %>
<img src="<%= @res.first_item.get('MediumImage/URL') %>" />

```

http://localhost:3000/home/index にアクセスすると、first_item で本のタイトルと画像を1件取得しています。

*・BooksやDVDなど、検索したいものを search_index で指定*
*・response_group は、Small, Medium, Large が扱える*

response_group の値を変えることによって、取得する情報量が変化させることができます。これでRailsで、簡単にAmazonから商品を検索できます。

シンプル！
heroku上のruby2.0、redmine2.5.3環境にredmine_backlogsプラグインを導入するお話

3回めの投稿です。前回は [heroku上のruby2.0、redmine2.5.3環境にテーマを入れるお話](http://qiita.com/ex_SOUL/items/12d1c1e0716f29e50aa8) でした。

今回は、heroku上のredmineにredmine_backlogs というプラグインを導入します。
これは、redmineでスクラム開発が出来るようにするプラグインです。
公式： http://www.redminebacklogs.net/

[Github](https://github.com/backlogs/redmine_backlogs) と上記公式を見る限り、もう開発は終了しているものかと思いますが(OSSの定めです)、まだこれを超えるプラグインと出会っていないので、これを使い続けています。
このプラグインは公式には2.5.xのredmineをサポートしていません。が、なんとか動いてるみたいです。
時間があればforkされているものの調査もしてみたいと思っています。

## 前置き
* 既にheroku上にredmine環境が構築済みであるとして書いています
* ローカルにheroku上に構築したredmineのリポジトリがあるとしています
* Windowsマシンで操作しています
* コンソールはGiｔ Bushを使用しています。

## 手順

### .gitignoreファイルの編集

以下をコメントアウトします。

```
/plugins/*
```

### redmine_backlogsソースの入手

`\plugins` ディレクトリで以下のコマンドを実行します。

```
git clone https://github.com/backlogs/redmine_backlogs.git
```

cloneが完了したら、(絶対もっといい方法があるはずと思いながら)redmine_backlogs配下にある.gitディレクトリを削除します。

### bundle installの実行

`\plugins\redmine_backlogs`にて、以下のコマンドを実行します。

```
bundle install --without development test rmagick
```
※redmineのバージョンによっては、ここでgemバージョンの衝突が発生します。
　私の環境の場合は衝突したgemはテスト用のgemだったので衝突しないように修正しました。

### ファイルの修正

`\plugins\redmine_backlogs\lib\labels`配下にある
`labels.yaml.default`を`labels.yaml`という名前に変更します。


### herokuへPuch

以下のコマンドを実行してherokuへPushします。

```
git add .
```
```
git commit -m "add plugin redmine_backlogs"
```
```
git push heroku master
```

### トラッカーの新規作成
Pushしている間に、ストーリー、タスクというトラッカーを作成します。
まずはストーリー。
admin権限でログインし、管理 ＞ トラッカー ＞ 新しいトラッカーの作成
で、ストーリーというトラッカーを作成します。
この際、ワークフローを既存のトラッカーからコピーしておきます。

作成したら、ワークフローを編集します。
使用するステータスは、新規、進行中、終了の3つだけでOKです。それ以外はワークフローから外します。
管理者、開発者、報告者すべてでワークフローを編集します。

ワークフロー編集が完了したら、もう一つトラッカーを作成します。
タスク、という名前で作成し、先ほど作ったストーリーからワークフローをコピーします。

### DBのマイグレート

pushが正常に完了しているのを確認後、プラグイン用のdb:migrateを実行します。

```
heroku run rake redmine:plugins:migrate RAILS_ENV=production
```

### heroku再起動

以下のコマンドを実行してherokuを再起動します。

```
heroku restart
```

### 初期設定

#### redmine_backlogsプラグインの初期設定

redmineにログインすると、おそらく

```
バックログが設定されていません。設定画面 管理 > プラグイン, からリンク 設定 をクリックして設定してください。フィールドを設定後、このページへ戻りツールを利用してください。
```
という警告メッセージが表示されているハズです。指示通り進み、設定を行います。

* ストーリーに利用するトラッカーにストーリーを選択
* デフォルトのストーリートラッカーにストーリーを選択
* タスクとして利用のトラッカーにタスクを選択

以上を設定し適用すると、警告メッセージは消えるはずです。

#### ロールと権限の設定
新たにbacklog関連の権限が追加されています。
管理者、開発者、報告者にそれぞれ権限を付与します。

#### とりあえずスプリントを作成
最初は、かんばんが見えない！？と戸惑うことが多いので作成します。

プロジェクトの設定ででバックログを有効にすると、バックログというリンクが出てきます。
プロダクトバックログを表示されている箇所の左の▼から、`新しいスプリント`を選択します。

適当なスプリント名をつけて、期間を、今週初めから2週間後の週始めや来月初めに設定します。
スプリントを作成したら、左の▼から`新しいストーリー`を選択し適当な名前をつけます。

以上の作業で、 **今日がスプリントの期間内にある** という状況ができます。
この時点でF5などで更新すると、`バックログ`のリンクの隣に`かんばん`というリンクが出来るはずです。

以上で初期設定は完了です。

### 参考

http://www.atmarkit.co.jp/ait/articles/1111/14/news132.html
Spring で DI しつつ Theories ランナーを使いたい

# はじめに

「*Spring Framework を使ったアプリケーションのテストコードを書いていて `Theories` ランナーを使ってパラメタライズドテストとかしたいんだけどさ、DI しようとすると `SpringJUnit4ClassRunner` ランナーとバッティングしてしまうんだよね… 困った困った*」みたいなケースへの対処方法です。

[Using JUnit Theories with Spring and Mockito](http://java.dzone.com/articles/using-junit-theories-spring) に答えが書いてあるんですが、日本語での記事が見つからなかったのでメモメモしておきます。

# ポイント

- テストランナーは `Theories` を使うよ
- `SpringJUnit4ClassRunner` を使う普段のケースと同じく、
    - テストクラスには、`@ContextConfiguration` アノテーションを付与しておくよ
    - DI をしたいテストクラスのフィールドに `@Autowired` アノテーションを付与しておくよ
- でもこのままだと DI されなくなっちゃうので、 `@Before` アノテーションの付いたセットアップメソッドの冒頭で `TestContextManager` クラスを使って DI を実現するよ

# サンプルコード

```java
import org.junit.Before;
import org.junit.experimental.theories.DataPoints;
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.Theory;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestContextManager;

import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;

/**
 * Theories ランナーを用いつつ Spring の DI を実現する方法のデモ。
 */
@RunWith(Theories.class)
@ContextConfiguration(locations = "classpath:your-context.xml")
public class TheoriesWithDI {
  /**
   * DI したいオブジェクトのクラスはこちら
   */
  @Component
  public static class Converter {
    public String convertToString(int num) {
      return Integer.toString(num);
    }
  }

  /** テストメソッドに与えられるパラメータ */
  @DataPoints
  public static int[] values = {1, 11, 222, 1234567};

  /** このフィールドに DI したい */
  @Autowired
  private Converter converter;

  /**
   * DI とその他の初期化処理をします。
   *
   * @throws Exception
   */
  @Before
  public void setUp() throws Exception {
    // 以下でこのインスタンスに対して DI することができる
    new TestContextManager(getClass()).prepareTestInstance(this);

    // その他の初期化処理...
  }

  @Theory
  public void testConvert(int num) {
    // exercise
    String result = converter.convertToString(num);

    // verify
    assertThat(result, is(Integer.toString(num)));
  }
}
```
今年フロント制作に本腰を入れ始めて迷ったいろいろをまとめておく


今まではPHP一筋で頑張ってきたんだけれども、もういいかんげんフロントも頑張らなきゃ駄目なんじゃね?みたいな思いに駆られて、今年からフロント制作を頑張り始めました。

実際このフロント制作の業界ってのは、まだガッツリと固まってるものがあるわけでもなく、色んな技術の入れ替わりに上手いこと乗っていかなけりゃならない状況みたいなので、
いわゆる「巨人の肩」みたいな安定した座り心地を感じるのはまだ当分先なんだろうなぁと思います。

そういう意味で勉強を始めるにあたっても色々と技術の選択に悩むところが多いので、そのへんの助けになるための資料をここに残しとけば、誰かしらの役にはたつんじゃない?って事でここにまとめていく事にします。

## AltJS

- coffeescript
- typescript

まずJavascriptを何で書くか、というところからですが、`AltJS`もいろいろあります。まぁWebStormとかの最近のIDEはリアルタイムでJSに書き出してくれるので、何でもいいっちゃなんでもいいんですが、
後述する諸々のツールで`coffeescript`をコンパイルしないまま生で扱えたりみたいな機会が多かったりするので`coffeescript`を選択すると嬉しい機会は多かったり刷るかもしれません。
`coffeescript`読みにくいとかいう話もたまに聞きますが、個人的には読みにくくなるまで長いコード書くなってところです。

`typescript`は固く組めるとかVisualStudioとの連携が気持ちいいとか聞きます。IDEの対応しだいでは今後かなり強みが出てくるんじゃないだろうか…と思っています。

## 依存管理 ビルド

- bower
- component
- browserify
- webpack

依存管理とビルドは本来別物なんですが、感覚的に紐づくところがあったのでとりあえずまとめちゃいます。

個人的な結論から言うと`webpack`と`bower`に落ち着いてます。

## task runner

- grunt
- gulp

最近はgulpの方が流行ってるみたいですが、`yaoman`とかぐぐるとまだ`grunt`の情報も多かったりします。実際書いてみても`gulp`の方がコードが綺麗にまとまって楽だと思います。

個人的には`gulp`よりも`npm script` とか`Makefile`を使うほうが多かったりするので`gulp`で作ったタスクも全部`Makefile`にまとめてしまってます。

いろいろネタが降りて来なかったので、このあたりで。
お粗末ですが、ご了承ください。
オブジェクト指向の3ナイ運動 番外編：あきらめナイ

ゲゲ、エラーが発生した。プログラムが異常終了する！
エラーが発生したら異常終了してしまう言語が多いのですが、Smalltalkの場合むしろエラーが発生してからが勝負です。何ができるでしょうか？

[オブジェクト指向3ナイ運動](http://qiita.com/tomooda/items/77d77e549a8727a0b2fa)の番外編として、例外オブジェクトが受け付ける代表的なメッセージを紹介します。

pass, resignalAs:
---
さらに上位（外側）の例外ハンドラに処理を委ねます。resignalAs:の場合、引数として渡された例外として上位の例外ハンドラに処理を委ねます。普通はそのハンドラでの責任範囲の後始末をつけたりした上で、passメッセージを投げます。

resume, resume:
---
例外を投げたメッセージ式（つまり、anException signal等)の返り値を指定して、実行を継続します。例えばベクトルの単位ベクトルを計算しようとしてゼロ割が発生したらそのままデフォルトの単位ベクトルを返り値として計算を継続したり。これを条件分岐ではなく例外処理で行うことができます。

```smalltalk
([ 1 / 0 + 2 ] on:  ZeroDivide do: [  :ex | ex resume: 3 ]) "==> 5"
```

return, return:
---
ハンドラを設定した対象のクロージャの返り値を指定して、実行を継続します。resume:と違って、クロージャ全体の返り値になるところが要点です。

```smalltalk
([ 1 / 0 + 2 ] on:  ZeroDivide do: [  :ex | ex return: 3 ]) "==> 3"
```

retry, retry:
---
ハンドラを設定した対象のクロージャの実行を放棄して、その代わりに指定したクロージャ（もしくは元のクロージャ）を再実行します。ネットワークが切れていたら繋ぎ直してみるとか、そんな感じで使ったり。

```smalltalk
([ 1 / 0 + 2 ] on:  ZeroDivide do: [  :ex | ex retryUsing: [  1 + 2 ] ]) "==> 3"
```

freeze
---
例外オブジェクトをハンドラ外にエスケープさせるために実行コンテキストを凍結します。
例えば下のコードでは、ハンドラ外で例外オブジェクトに"receiver"というメッセージを投げて、どのオブジェクトが例外を発生させたのかを得ます。

```smalltalk
([ 1 / 0 ] on:  ZeroDivide do: [  :ex | ex freeze ]) receiver "==> 1"
```

debug
---
Exceptionクラスにdebugというメソッドが定義されています。つまり、例外が発生したらその例外をcatchしてその例外にdebug"というメッセージを投げれば対話的デバッガが開きます。Smalltalkでのデフォルト動作。

```smalltalk
[ 1 / 0 ] on:  ZeroDivide do: [  :ex | ex debug ]
```
packerでhvmでもresize2fsをできるようにしてrebootを回避する

packerでhvmでもresize2fsをできるようにしてrebootを回避するというのをやってみました。

おなじことがcloud-initを用いてもできるような気がしています。
http://dev.classmethod.jp/cloud/centos-6-x86_64-with-updates-hvm-cloud-init/
ただしpackerつかってるのでそっちでやったほうがラクというか。
何も設定せずにcloud-initいれただけのamiつくったらログインできなかったですorz
設定ファイルに書いた内容と具体的に裏で何してくれちゃうのかちゃんと理解できないとやりたくないけど調べるのが手間だったので。
軟弱ものですみません。

・事の発端
CentOS6.5のオレ俺AMIをもとにhvmのインスタンス作ったところ、
chefレシピで流して自動でresize2fsがrootボリュームに対して実施されたはずが
サイズ変わらず。
10から50GBになるはずだったけど10GBのままになっていた

・とりあえずぐぐる
以下URL先で同様の現象と対策を知る
http://hack.aipo.com/archives/6940/
fdiskで拡張するほかにこんなやり方もあったんだーと目からうろこ。
でもreboot必須とか詰んだー！と思いました。（手間と自動化的に）

・問題提起というか相談してみた
（ぎじゅつ的に）とんがり系のおかたに、
パーティションテーブルの問題なら以下URLのようなのをpackerに仕込んだらどうか
　と提案いただいたというか教えていただきました
http://dev.classmethod.jp/etc/centos-on-ec2-disksize-change/

・実際やってみたら成功した

packerに仕込んでるシェルスクリプトに以下を追加

```
+# growroot等をepelからインストール
+yum -y --enablerepo=epel install dracut-modules-growroot cloud-utils
+
+# rootパーティションテーブルをリサイズ
+dracut --force --add growroot /boot/initramfs-$(uname -r).img
```

で、packerでAMIをビルド、
そのAMIから作成したインスタンスにchefレシピを流してみると、
dfしてみたところディスクが拡張されてました。
rebootしなくて済んだ！！わーい！
めでたしめでたし。

・packerで俺オレAMIをビルドする方法について
インストールは`http://www.packer.io/intro/getting-started/setup.html`で確認できます。
テンプレートは以下のような感じ（vpcつかってるとvpc_idも必要です。今時はvpcつかわないのあんまりないかも。）

```
{
  "variables": {
    "aws_access_key": "AKI**********",
    "aws_secret_key": "Pca4**********",
    "aws_source_ami": "ami-54**********",
    "aws_region_name": "ap-so**********",
    "aws_instance_type": "m3.medium",
    "aws_vpc_id": "vpc-0a**********",
    "aws_subnet_id": "subnet-0**********",
    "aws_create_date": ""
  },
  "builders": [{
    "type": "amazon-ebs",
    "access_key": "{{user `aws_access_key`}}",
    "secret_key": "{{user `aws_secret_key`}}",
    "region": "{{user `aws_region_name`}}",
    "source_ami": "{{user `aws_source_ami`}}",
    "instance_type": "{{user `aws_instance_type`}}",
    "ssh_username": "root",
    "ssh_timeout": "10m",
    "subnet_id": "{{user `aws_subnet_id`}}",
    "vpc_id": "{{user `aws_vpc_id`}}",
    "associate_public_ip_address": true,
    "ami_name": "AMI_standard_{{user `aws_create_date`}}",
    "tags": {
      "Name": "AMI_standard_{{user `aws_create_date`}}"
    }
  }],
  "provisioners": [{
    "type": "shell",
    "execute_command": "sh {{ .Path }} {{user `aws_region_name`}}",
    "script": "ami-deploy.sh"
  }]
}
```

※provisionersに実行するスクリプトについて指定します
こちらのページにも解説が↓
http://www.ryuzee.com/contents/blog/6697
　スクリプトには自作AMI作るときとかにやるような基本的なベースの設定を仕込んどくとよいです。
　cloud-initで仕込むっぽい内容というかchefながす手前のセッティングなど。
　たとえば、
　　一般的なリポジトリや全部に絶対入れるやつ入れとくとか、sshまわりや最小限のユーザや自動起動設定などなど
※そもそもテンプレートで指定するAMIはhvmのが要ります。つくりかた⇒`http://devlab.isao.co.jp/hvm_instance/`

ビルドコマンドは以下のように実行します。
（標準出力に実行状況が色々出るのでバックグラウンドに渡さないほうがいいでしょう）

```
CREATE_DATE=`date +'%Y%m%d'`
packer build -var aws_create_date=${CREATE_DATE} templatefile.json
```

※20～30分くらいかかる感じでした
windowsからも実行できるらしいけど、linuxでいけるlinuxのほうが得意っぽい処理をよりによって私がwinでやると詰みそう。心理的な障壁が高めでやる気がおきない。

とりあえず個人的にやりやすい方法で目的が達せられたのでこんなところで。
cloud-initもそのうち調べてやってみたいとは思ってます。脳内積みタスク優先順位低（強制的な機会がないとわすれそう）。
Burp Suite

# Burp Suiteとは
ローカルプロキシツール。
作ったwebシステムの脆弱性診断の為にリクエストのパラメタを書き換えたりできる。
※他の人が管理してるサイトに対して使ってはいけない。

# セットアップ

1. Javaをインストール

1. Burp Suite free版をダウンロード

http://portswigger.net/burp/download.html

# 実行

1. 起動

```
java -jar burpsuite_free_v1.6.jar
```

1. ブラウザのproxyに127.0.0.1:8080を指定

1. Burp SuiteのProxy -> Interceptタブを確認し、"Intercept is on" になっていることを確認

1. 対象のサイトにブラウザでアクセス

1. Burp SuiteのProxy -> InterceptタブのParamsなどを適宜変更し、Forwardボタンをクリック
Rubyで書くCotEditorスクリプト



MacではテキストエディタとしてCotEditorを常用しています（コーディングはSublime Text）。

ソートがしたくてスクリプトを触ってみたところ、Rubyで簡単にCotEditorスクリプトが書けるっぽいです。

## マジックコメント
CotEditorスクリプトでは、先頭行に次のマジックコメントが必要です。

```ruby:
#!/usr/bin/env ruby -Ku
#%%%{CotEditorXInput=Selection}%%%
#%%%{CotEditorXOutput=ReplaceSelection}%%%
```

サンプルスクリプトにはファイル末尾に`exit`が書かれていますが、不要です。

## 選択部分が標準入力になる
CotEditorでは文字列を選択しながらスクリプトを実行します。
選択した部分は標準入力となります。
何も選択せずにスクリプトを実行しても、スクリプトは実行されないようです。

`gets`は、呼び出される度に標準入力の中身を1行ずつ取り出して返却します。

```ruby:
# あああ\nいいい\nううう を選択した状態でスクリプトを実行
gets #=> "あああ\n"
gets #=> "いいい\n"
gets #=> "ううう"
gets #=> nil
```

一方`$stdin.read`は標準入力の中身を全て取り出して返却します。

```ruby:
# あああ\nいいい\nううう を選択した状態でスクリプトを実行
$stdin.read #=> "あああ\nいいい\nううう"
$stdin.read #=> ""
```

`$stdin.read`を一度評価した時点で標準入力が空になるので、その後`gets`を評価しても`nil`が返されます。

```ruby:
# あああ\nいいい\nううう を選択した状態でスクリプトを実行
$stdin.read #=> "あああ\nいいい\nううう"
gets #=> nil
```

## 標準出力が選択部分に反映される
ここは理解できているか怪しいですが、、

`print`等のメソッドを使うと、選択部分を上書きされる形で出力されます。
典型的な例は、`while gets .. end`で回すものです。

```ruby:
# 行頭に "// " を付加する
while gets
  print "// #{$_}" # $_ : 最後に実行されたgetsまたはreadlineの戻り値
end

# $_ は「知らなければ書けない・読めない」ので、良くないと考える人もいる
# cf. http://www.sist.ac.jp/~suganuma/home/Ruby/library/var/var.htm
```


このように、`print`は選択した行から数えてn行目（n:`gets`を呼び出した回数）に対して行われます。
たとえば、次のようなコードが可能です。

```ruby:
# 選択部分から数えて3の倍数行はFIZZに置換する
i = 1
while var = gets
  ( i % 3 == 0 ) ? print("FIZZ\n") : print(var)
  i += 1
end
```


## ソートスクリプトの実装


```ruby:coteditor_sort.rb
#!/usr/bin/env ruby -Ku
#%%%{CotEditorXInput=Selection}%%%
#%%%{CotEditorXOutput=ReplaceSelection}%%%

input = $stdin.read
output = input.split("\n").sort.join("\n")
print output
```

簡単に書けます。

## 参考
- [RubyでCotEditorのスクリプトを書く - このブログは証明できない。](http://d.hatena.ne.jp/shunsuk/20090102/1230899628)
『Package Control The package specified, ○○, is not available』

sublime text3ユーザーです。

# 『Package Control The package specified, ○○, is not available』


このようなメッセージのアラートが毎回出るようになってしまい、少々うっとうしいです。
どうやらsublime text2からsublime text3への移行がよくなかったようです。

# 解決法

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/44278/2541fc23-274e-b52e-dc9c-31990e6563ec.png)

preferences > packgae settings > package control > settings - Userから、

削除したはずの（またはsublimetext3には入れていない）項目があったら、削除して保存する。

![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/44278/41447f47-809d-e41c-84c4-ea609baf8f2a.png)
↑私の場合、"Emmet Css Snippets"の上に
sublimetext3では、一旦消したはずの"Emmet"があったので削除しました。

それでもう一回sublimeを再起動したら、解決することができました。
aura:unescapedHtmlタグの使い方

`aura:unescapedHtml`タグはドキュメントの37ページ目にさらっとだけ紹介されています。実際試してみましょう。

```xml
<p>aura:unescapedHtml sample</p>
<dl>
    <aura:iteration items="&amp;amp;,&amp;lt;,&amp;gt;,&amp;quot;" var="escaped">
    	<dt>{!escaped}</dt>
        <dd><aura:unescapedHtml value="{!escaped}" /></dd>
    </aura:iteration>
</dl>
```

こんな感じに出力されます。

### aura:unescapedHtml sample
<dl><dt>&amp;amp;</dt>
<dd>&amp;</dd>
<dt>&amp;lt;</dt>
<dd>&lt;</dd>
<dt>&amp;gt;</dt>
<dd>&gt;</dd>
<dt>&amp;quot;</dt>
<dd>&quot;</dd>
</dl>

ただし、コンポーネント内でscriptタグをunescapeして出力しても、`<script>`から`</script>`の間が完全に消去されてしまいました。「サポートされるHTMLタグ」の除外タグには含まれていないんですけどね…。
Rails-4.2+MySQL-5.6での時刻オブジェクトのミリ秒の扱いについて

MySQLは5.6系から時刻系のデータ型がミリ秒を持てるようになった。
やっとかよって感じですが。

最近持てるようになったので、Railsでは4.1まではMySQLに対してクエリを投げる時はミリ秒以下は問答無用で切り捨ててクエリを構築していた。
しかし、4.2betaが出る辺りで、MySQLにミリ秒対応のクエリを送るPRがマージされた。

[MySQL 5.6 Fractional Seconds by arthurnn · Pull Request #14359 · rails/rails](https://github.com/rails/rails/pull/14359 "MySQL 5.6 Fractional Seconds by arthurnn · Pull Request #14359 · rails/rails")

既にMySQL側のカラムがミリ秒精度を持っている場合は特に問題は起きない。
けど、RailsでMySQL使っててRailsのバージョン上げようかって時に、そんなことはほぼ無いだろうと思う。
その場合、ちょっと面倒なことになる。

MySQL5.6がミリ秒以下の値を受け取った場合、精度が足りない部分は四捨五入(round)される。
ということは、今まで、`12:00:00.5`という0.5秒を含むような時刻を代入してActiveRecord経由で保存した場合、`12:00:00`として送信されていたのが、`12:00:00.500000`と送信されてしまい、DBに保存される値が`12:00:01`になってしまう。
大体半分ぐらいの確率で今まで想定していた挙動から1秒ズレた値が格納される可能性がある。
1秒ズレるぐらい問題無いんであれば、テストコードを多少修正するぐらいで済むかもしれませんが、Ruby上で`Timel#to_i`した値が、保存前と再読み込み後で変化するってのはかなり気持ち悪い気がする。

対応方針としてどうするかを考える。

- スルーしてテストコードで引っかかる所だけ直す
- カラムの型を更新してMySQLにミリ秒を持たせる (kamipoさんのPRがマージされればmigrationで処理できる)
- ActiveRecordにモンキーパッチを当ててミリ秒対応を無効化
- ActiveRecordにモンキーパッチを当てて属性値が代入された時点でミリ秒以下を切り捨てる
- datetimeの精度を判別してSQLクエリを調整する (kamipoさんのPRがマージされれば出来なくはなさそう)

ref. [Allow precision option for MySQL datetimes by kamipo · Pull Request #17673 · rails/rails](https://github.com/rails/rails/pull/17673 "Allow precision option for MySQL datetimes by kamipo · Pull Request #17673 · rails/rails")

そもそもミリ秒程度の誤差が気にならない場合、スルーしてテストが刺さる箇所だけ直せばそれで済むような気がするが、保存前と読み出した値で`#to_i`の値が変わるのは割とまずい気がする。
Rubyは切り捨てるが、MySQLは四捨五入というのが危ない。

MySQLにミリ秒を持たせるのが一番妥当な気がするがカラム変更は負荷が高いし余りやりたくない感じがある。
とにかく安全策を取りたいなら以下のコミットの箇所をモンキーパッチで潰して戻すのが一番安全な気がする。

https://github.com/rails/rails/commit/df5a38fc6aeb8dfaa816fcbe0efb3fe4de169833
(ちなみに、masterではkamipoさんのリファクタリングによってabstract_adapterに移っている)

うーん、イマイチどうすればいいか分からん。

しかし、やはりRails+MySQLの闇に触れるとkamipo神に行き着くので、マジで足向けて寝られない。
グローバルIPを取得してGoogleSpreadsheetsに書き出す

# 概要
Raspberry piにssh接続する際のグローバルIPを、定期的にGoogleSpreadsheetに書き込むpythonスクリプトを作ってみた。

# 事前準備
## config.iniの作成
下記の情報をconfig.iniへまとめておく。

- Googleアカウント
- Googleアプリパスワード（アプリ固有）
- IP書き出し用に用意したGoogleスプレッドシートのスプレッドシートID

```config.ini
[google]
username = ****
password = ****
spreadsheet_key = *****（スプレッドシートID）
```

なお、スプレッドシートIDは、*****部分に相当

    https://docs.google.com/spreadsheets/d/*******/edit#gid=0

## 必要なライブラリのインストール
gdata使います。

    sudo apt-get install python-gdata

# Googleスプレッドシートを扱う独自クラス作成
IPと位置（行、列）を与えれば、アップデートできるクラス作ってみた。
- 書き出すIP
- 行
- 列 

なお、シートはデフォルトで1番目のシート（od6）を選択

参考：http://qiita.com/debiru/items/27a48dfb3b1c010cd478

```mySpreadsheet.py
import gdata.spreadsheets.client
import gdata.spreadsheet.service
import ConfigParser

class mySpreadsheet:

  user = ''
  passwd = ''
  key = ''
  sheet_id= ''

  def __init__(self,config):
    inifile = ConfigParser.SafeConfigParser()
    inifile.read(config)
    self.user = unicode(inifile.get("google","username"))
    self.passwd = unicode(inifile.get("google","password"))
    self.key = unicode(inifile.get("google","spreadsheet_key"))
    self.sheet_id = 'od6'

  def updateCell(self,value,row,col):
    client = gdata.spreadsheet.service.SpreadsheetsService(self.user,self.passwd)
    client.ProgrammaticLogin()
    cell = client.UpdateCell(inputValue = value,
                             row = row, col = col,
                             key = self.key,
                             wksht_id = self.sheet_id)

if __name__ == "__main__":
  m = mySpreadsheet('config.ini')
  m.updateCell('hoge',1,1)
```

# IPの取得からgoogleスプレッドシートへのアップデートまで
上記クラスを読み込み、IP渡せばOK

```updateip.py
import json
from urllib2 import urlopen
from mySpreadsheet import *

m = mySpreadsheet('config.ini')
ip = json.load(urlopen('http://httpbin.org/ip'))['origin']
m.updateCell(ip,1,2)
print ip
```
Storyboard, Xibファイルのリネーム（小話）

Custom Classの名前を打ち直した時、うっかりModuleが `None` になっているとCustom Classの設定が正しくされずランタイムエラーを引き起こす。

![スクリーンショット 2014-12-16 18.40.51.png](https://qiita-image-store.s3.amazonaws.com/0/8300/1ec9a934-24f9-7ab2-fb4d-f4b5952689f6.png)

Custom Classの欄に補完されるものから選択すればModuleもよしなに設定してくれるが、接頭辞を削除しただけとかの場合つい手動で直してしまったりすることがあって微妙にハマったのでメモしとく。
忘れがちなDigest認証設定話 Apacheの場合

# はじめに

## これは何？
たまーにクローズドなキャンペーン用にDigest認証がほしくなることあるよねー。
でも毎度忘れちゃうのでメモ。


今回はApacheでやります。


## 当記事でやりたいこと

http://store.hoge.com/seacret_sale/
にID/Password認証をかけたい。
特定のお得意様向けシークレットセールってやつですね。

- Target URL　　　　: http://store.hoge.com/seacret_sale/
- Real path　　　　 : ${PATH TO DocumentRoot}/seacret_sale/
- Campain name　　　: 'only invited members'
- Target user name　: goodcustomer, salespartner
- Password　　　　　: goodcustomer : hogehoge, 　
                     salespartner : fugafuga


# 準備作業

## Apacheの設定
### モジュールのロード

今回Digest認証を利用するために使うモジュールをApacheにロードさせます。

```httpd.conf
LoadModule auth_digest_module   modules/mod_auth_digest.so
LoadModule authn_file_module    modules/mod_authn_file.so
LoadModule authz_user_module    modules/mod_authz_user.so 
```

### Digest認証で制御する対象のディレクトリ設定

FollowSymlinksオプションを有効化してあげます

httpd.conf or conf.d/hoge.conf

```
//Require 'FollowSymLinks' option on Directory directive in httpd.conf or conf.d/*.conf

<Directory "/path/to/documentroot/seacret_sale">
        Options           FollowSymLinks
        AllowOverride     All
        Order             allow,deny
        Allow             from        all
        <LimitExcept POST GET>
                 Order         deny,allow
                 Deny         from all
       </LimitExcept>
</Directory>

```

### 設定のvalidation
下記をチェックしたおかしなところがあれば直しましょう

```
${PATH TO APACHE}/bin/httpd -M
// ロードされているモジュールを確認しましょう

${PATH TO APACHE}/bin/httpd -t
// 設定ファイルにSyntacs errorがないか確認しましょう

${PATH TO APACHE}/bin/httpd -S
// 意図した通りの設定になっているかを確認しましょう
```


### 設定の適用
gracefulでOK

```
${PATH TO APACHE}/bin/apatchctl graceful
```


## secret_saleディレクトリへのアクセス制御設定をしよう

Digest認証情報を管理するための共用ユーザを作っておくと便利です。
今回は

  storemanager

ユーザを共用ユーザとして用意しました。



### 1. Add user in ~/.digestpass

/home/storemanager/.digestpass

に認証情報を登録します。

htdigestコマンドを使います。
初回は~/.digestpassファイルを作るために -c オプションをつけてね
こんな感じ↓
${PATH TO APACHE}/bin/htdigest ~/.digestpass 'only invited members' goodcustomer 

- goodcustomer

```
storemanager $ ${PATH TO APACHE}/bin/htdigest ~/.digestpass 'only invited members' goodcustomer
New password: hogehoge
Re-type new password: hogehoge
```

---

- salespartner

```
storemanager $ ${PATH TO APACHE}/bin/htdigest ~/.digestpass 'only invited members' salespartner
New password: fugafuga
Re-type new password: fugafuga
```

```
cat ~/.digestpass
```
で中身を確認してみてね




## 2. Create target directory(If you need)

```
mkdir ${PATH TO DocumentRoot}/seacret_sale
```

## 3. Create .htaccess
.htaccessで制御します。


${PATH TO DocumentRoot}/seacret_sale/.htaccess

```.htaccess
AuthType Digest
AuthName "only invited members"

AuthDigestProvider file
AuthUserFile  /home/storemanager/.digestpass
Require user goodcustomer salespartner
```


## 4.Check
http://store.hoge.com/seacret_sale/

ダイアログがポップアップされ、"1.Add user in ~/.digestpass"で登録した
ID/PasswordでアクセスできればOK


## 補足

ちょいちょい出てくる"only invited members"
これはrealmと言いいます。日本語訳すると「領域」とか「範囲」。

.digestpassと、.htaccessのAuthName
こいつらに同じrealmが指定してやることで、Digest認証をかける場所とログインできるユーザを紐付けることが出来ます。
tmlib.jsを商用アプリで使ったことに関して（ΦωΦ）

さて、今年tmlib.jsを使ってAndroidアプリを数本出させて頂きました。

簡単ですが、何故tmlib.jsを使ってAndroidアプリを作ったのかを説明して
tmlib.jsがとても使えるよ！ってのを広められればと（ΦωΦ）



さて、作ったアプリのURLを
「式神・弐号の蹴鞠道」
https://play.google.com/store/apps/details?id=lr.nigou&hl=ja
「弐号シューティング！」
https://play.google.com/store/apps/details?id=lr.nigouenb&hl=ja


・なぜtmlib.js？
選んだ理由は簡単で
iOSは安定してるそしてAndroidのWebViewでも安定しているから
さらにマルチタッチにも対応していて扱いやすい
コレにより様々なjsのエンジンありましたけど一番しっくりして使いやすかったtmlib.js


さらに開発者のphiさんとTwitter上で質問などに対して親切に答えて頂けたので
js周りの知識がとても身につきました（ΦωΦ）


次に開発進めているもの

次はスマフォブラウザ音ゲー作るのでtmlib.jsをフル活用ですよ（ΦωΦ）




今後につなげて行きたいこと

ちょっとズレますがjThree.jsのVR周りに開発をやってたので
今後WebGL周りの知識をフィードバックしてMMD使ったゲームをtmlib.jsで作れるようにしたいなと思ってます～（ΦωΦ）



ではでは～（ΦωΦ）
MacのVagrantでPHPフレームワークLaravelを試す。

## PHPの今流行りのフレームワーク

Macで人気PHPフレームワークのLaravelをMacの仮想サーバー上にさくっと入れて動かしてみます。
MacOSX10.10 Yosemiteです。
Vagrant、VirtualBox、git、composerはインストール済みとします。

## VagrantのBox

個人的にVagrantはPHP開発になくてはならないものになりました。
開発環境が数分で手に入りますし、不要になったら気軽に捨てることができます。

ということで仮想サーバーの基であるいい感じのBoxを取ってきます。
http://box.scotch.io/ ←このBoxを使います。

laravelTestというプロジェクトを作ります。

### 下準備
<pre>$cd ~</pre>
<pre>$mkdir Project</pre>
<pre>$cd Project</pre>

### Vagrantfileクローン
<pre>$git clone https://github.com/scotch-io/scotch-box.git laravelTest</pre>
<pre>$cd laravelTest</pre>
<pre>$ls // README.md	Vagrantfile	public</pre>

### Vagrantfile修正

<pre>vi Vagrantfile</pre>

synced_folderの"." -> "./www"にします。
hostnameの"scotchbox" -> "first-laravel"にします。

```lang:編集後Vagrantfile
Vagrant.configure("2") do |config|

  config.vm.box = "scotch/box"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.hostname = "first-laravel"
  config.vm.synced_folder "./www", "/var/www", :mount_options => ["dmode=777", "fmode=666"]

end
```

publicディレクトリ不要なので削除します。
<pre>rm -rf public</pre>

### Laravelインストール
composerを使ってインストールします。
<pre>composer create-project laravel/laravel --prefer-dist www</pre>

### Vagrant起動します。

<pre>vagrant up</pre>
途中でローカルの/etc/hostsファイルを変更するためにMacのパスワードを求められるので入力します。

### Laravel確認
ブラウザでhttp://first-laravel/ と入力してLaravelのアイコンが出ればOKです。

### Laravelちょっとだけ触ってみる。
ルーティングのファイルに追記します。

<pre>vi ~/Project/laravelTest/www/app/routes.php</pre>

```lang:app/routes.php
<?php
Route::get('/', function()
{
	return View::make('hello');
});

// 追記
Route::get('/abc', function()
{
	return 'Hello!';
});
```

ブラウザでhttp://first-laravel/abc と入力して「Hello!」と表示されればOKです。

Laravelを初めて試した時にまず、このクロージャーな感じにワクワクしました。
古臭いPHPから脱却したいと思っている方々はきっと惹きつけられる！

インストールできたらコントローラーあたりから始めるのがおすすめです。
http://laravel.com/docs/4.2/controllers

### Vagrant破棄
Vagrantは不要なら破棄しておきましょう。
<pre>vagrant destroy</pre>
【Facebook】GraphAPI2.0利用申請のしてみた=>通った【成功例】

※ GraphAPI2.0利用申請、ではなく、正確には「v2.0移行後の利用権限申請」

# 概要

過去記事ではテストアプリであることを指摘されて、レビューを通過しなかった。

* [【Facebook】ログインアプリでGraphAPI2.0利用申請してみた=>実験用アプリでは承認されない](http://qiita.com/ogawatti/items/c31a3c2286309e195136)

今度は機能実装・見た目も一新して、再度同じFacebookアプリとして申請に挑んだ。

## 申請したアプリ

前回の申請失敗後に作成。
イベント管理アプリ。
ログインするとイベント作成したり、イベントに参加することができる。
参加したイベントの通知をFb上に流して宣伝したり、非公開設定でログインすれば通知をリマインダ的に使うことができる。

* アプリ : https://hiddeste.herokuapp.com
* コード : https://github.com/ogawatti/hiddeste

## アプリ作成

ruby 2.1.3 + rails 3.2.20で作成。

* Fbアクセス部分
 * OAuth : omniauth-facebook + devise
 * 投稿(通知) : fb_graph
* CSS  : twitter-bootstrap-railsを利用
* Icon : https://www.logaster.com/
 * 84x75ピクセルの小さい画像はフリー
 * 拡大したり切り貼りして申請用のIcon作成
* OpenGraph : article用のogタグを埋め込んだ
* その他、詳細はGithub参照

## 申請

基本的な方法は過去記事の[申請してみた](http://qiita.com/ogawatti/items/c31a3c2286309e195136#%E7%94%B3%E8%AB%8B%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F)を参照。

前回と異なる点は、

* 要求権限 : publish_actions (フィード投稿がある)
* 申請文書にログイン方法の記述が必要
 * 「権限の利用手順」と同じフォーマットで書く

## 結果

一発成功！

![Screenshot_from_2014-12-15 12:03:59.png](https://qiita-image-store.s3.amazonaws.com/0/17647/860790d5-59ae-165c-b999-e5f092b702b7.png)

![Screenshot_from_2014-12-15 12:04:27.png](https://qiita-image-store.s3.amazonaws.com/0/17647/01cf8f29-79d1-21c9-44cc-d3b0153f3863.png)


### レビュー期間

* 今回も1日以内にレビューされた
* 18:00頃に申請して、翌日朝09:30頃に結果が来た

### レビュー内容

* 申請したアプリにはFbレビュワーが使ってみた痕跡があった
* [App Review](https://developers.facebook.com/docs/apps/review)の通り、実際にテストユーザでログイン、投稿をしてみてレビューを行っている様子だった
 * publish_actionsをどう使っているかの確認がされた?
 * テストユーザが作成したイベントがそのまま残っており、Facebookフィードに投稿(通知)したログが残っていたため判明
 * App Reviewの翻訳は[こちら](http://qiita.com/ogawatti/items/e34f62504b15f62b98fe)

### レビュー通過後の変化

* エンドポイントをv2.0に変えることでログインダイアログにアラートが表示されなくなった
* **エンドポイント指定なしでは相変わらずv1.0のAPIを叩いていた**
 * レビュー通過でv2.0への自動移行はされないようだった
 * v2.0への移行は2015/04/30に強制的にされるのだろうか?
* v1.0とv2.0のユーザIDの違い(アプリ専用に発行されるユーザIDへの変化)について後日別記事をアップ予定。
[PHP] PDO_OCIでWHERE句にINTERVALを指定したい場合のプリペアドステートメントについて

```sql
SELECT * 
FROM some_table
WHERE update_datetime
  BETWEEN SYSDATE - INTERVAL '1' MINUTE * :interval
  AND SYSDATE
```

というふうに書けばよいそうです。
とてもトリッキー？
CakePHP 動的セレクトボックスの作り方

ある選択値によって次項のセレクトボックスの中身を変えたいとき。

■CakePHP
・Controller

```php
public function getOptions($id = null) {
	$list = $this->SampleModel->getOptions($id);
	$this->set('optionList', $list);
	$this->layout = false;
}
```
単にリストを設定しているだけだが、ポイントは「$this->layout = false;」こいつがいないとdefault.ctpを丸ごと返却してしまう。


・View
上記のコントローラのfunctionの対になるもの

```html+php
<?php foreach ($optionList as $k => $v): ?>
  <option value="<?php echo h($k);?>"><?php echo h($v);?></option>
<?php endforeach; ?>
```
コントローラ内のセット名「'optionList'」に合わせる。


・Model

```php
public function getOptions($id = null) {
	// デフォルト値
	$result = array("" => "選択してください");

	$query = array(
		'fields' => array('id', 'name'),
		'order' => array('SampleModel.id ASC')
	);
	if (!empty($id)) {
		$query = $query + array('conditions' => array('SampleModel.id' => $id));
	}
	$result = $result + $this->find('list',$query);

	return $result;
}
```

■jQuery

```js
$('#first-select').bind("change keyup", function() {
    var id = $("#first-select").val();
    $("#change-select").load( "./getOptions/"+id);
});
```

idがfirst-selectの値が変更されたとき、idがchange-selectであるセレクトボックスにoptionのリストを読み込ませている。
コメント率がコマンド一発Ohcount


インストール
brew install ohcount

このツールの素晴らしいところは、ほとんどの言語を解釈できることです。

対象ディレクトリで
ohcount -s　を発行。

![kobito.1418719777.570766.png](https://qiita-image-store.s3.amazonaws.com/0/33317/f90cbe3d-f0d2-5011-1944-086950cf0aa6.png "kobito.1418719777.570766.png")

一般的な言語については、大丈夫ですね。
（コメント率が低いのは、ご愛嬌）
サーバから画面のキャプチャを撮る（CentOS編）

#サーバから画面のキャプチャを撮る（CentOS編）

ある案件の技術調査でサーバからブラウザの画面キャプチャを取る必要があったので調査開始。

http://techblog.raccoon.ne.jp/archives/39639054.html

ubuntuなら結構サクサク行けそうな気がする。が、「ubuntu-desktop」とかインストールしてるのが気に食わない！

CentOSの「Desktop」とか入れたらそれとなく行きそうだけど最終目標がAWSなのでそれはなし。

とりあえず上記URLを参考に色々試してみることに。

##インストール
```
#とりあえずxvfbとcutycaptのインストール
#yumのパッケージ名が違う・・・
[vagrant@localhost ~]$ sudo yum install xorg-x11-server-Xvfb

epelにあったけどCが両方大文字・・・
[vagrant@localhost ~]$ sudo yum install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[vagrant@localhost ~]$ sudo yum --enablerepo=epel install CutyCapt
```
なぜ両方ともパッケージ名が違うのか・・・orz

情報がなさ過ぎて見つけるのに一苦労・・・
##試行1
```
[vagrant@localhost ~]$ xvfb-run --server-args="-screen 0, 1024x768x24" \
CutyCapt --url=http://yahoo.com/ --out=hoge.png
process 2170: D-Bus library appears to be incorrectly set up; failed to read machine uuid: Failed to open "/var/lib/dbus/machine-id": そのようなファイルやディレクトリはありません
See the manual page for dbus-uuidgen to correct this issue.
  D-Bus not built with -rdynamic so unable to print a backtrace
/usr/bin/xvfb-run: line 166:  2170 アボートしましたDISPLAY=:$SERVERNUM XAUTHORITY=$AUTHFILE "$@" 2>&1
```

##エラーが出たので修正
```
[root@localhost ~]# dbus-uuidgen > /var/lib/dbus/machine-id
```
##試行2
```
[vagrant@localhost ~]$ xvfb-run --server-args="-screen 0, 1024x768x24" \
> CutyCapt --url=http://yahoo.com/ --out=hoge.png
QFont::setPixelSize: Pixel size <= 0 (-1)
QFont::setPixelSize: Pixel size <= 0 (-1)
QFont::setPixelSize: Pixel size <= 0 (-1)
QFont::setPixelSize: Pixel size <= 0 (-1)
QFont::setPixelSize: Pixel size <= 0 (-1)
QFont::setPixelSize: Pixel size <= 0 (-1)
QFont::setPixelSize: Pixel size <= 0 (-1)
QFont::setPixelSize: Pixel size <= 0 (-1)
QFont::setPixelSize: Pixel size <= 0 (-1)
```
画像はできた！けど文字が表示されてない・・・

##フォントをインストール
```
#探す！
[vagrant@localhost ~]$ sudo yum search japanese
#とりあえず適当に
[vagrant@localhost ~]$ sudo yum install vlgothic-fonts
```
##試行3
```
[vagrant@localhost ~]$ xvfb-run --server-args="-screen 0, 1024x768x24" \
CutyCapt --url=http://yahoo.com/ --out=hoge.png
#できた！
[vagrant@localhost ~]$ xvfb-run --server-args="-screen 0, 1024x768x24" \
CutyCapt --url=http://www.yahoo.co.jp/ --out=hoge.png
#日本語も文字化けてない！
```

##まとめ
というわけで、サーバからキャプチャは割とすんなり撮れる！

AWSですんなりいかなかったは[別の話](http://qiita.com/satthi/items/9469770aa965f92d978f)・・・
【目的別】おすすめBLE開発環境まとめ(1/2)

koichi222です。元々はwebエンジニアでしたが、ここしばらくは
BLE技術を使用したデバイスの開発を行っております。

最近ibeacon関連の商品をはじめ、Ring、MoffなどBLEを使用した製品の開発が盛んになっていますが、興味をもった方がいざ開発を始めたいとなった時にどの開発環境で始めるべきかが迷い易い部分かと思います。そこで、今回は筆者おすすめの開発環境を目的別に紹介します。

## 目的１：趣味の電子工作/プロトタイピング
#### 対象とする人
* 最近BLEが流行っているので、ちょっと触ってみたい
* 自分の家で使うちょっとした便利グッズを作ってみたい
* おもしろいアイディアを思いついたのでとりあえず動くプロトタイプを作りたい

#### まとめ
* プログラム未経験者や初心者
 * → konashiがおすすめです。
* Arudinoの経験があったり、デバイス側で少し複雑な処理が必要な場合
 * → Brend Micro(arudino)がおすすめです。
* Linuxに慣れている人、またはBLEに加えてwifiも対応させたい場合
 * → Intel Edisonがおすすめです。

### konashi (http://konashi.ux-xu.com/)
![alt](http://www.opencu.com/wp/wp-content/uploads/2013/09/png.png)
プログラム未経験者や初心者に最もおすすめなのがkonashiです。
通常はBLEデバイスを開発したいときには、
 * BLEデバイス側のファームウェア
 * BLEデバイスを操作するアプリ
 の両方で開発が必要になりますが、konashiは専用のsdkが用意されているため、BLEデバイス側の開発は必要ありません。sdkはobjective-cに加えjavascriptも対応しており、プログラミング的な意味でも敷居が低いです。日本語のドキュメント、ネット上の情報が多いなども良い点かと思います。ネックは、少々値が貼ること(約1万円)と、ファームの書き換えができないゆえsdkで定義された操作以外はできないことでしょうか。


#### Brend Micro(http://redbearlab.com/blendmicro/)
![alt](http://www.seeedstudio.com/depot/images/product/Blend%20Micro_04.jpg)
Arduino開発経験がありそこに抵抗のない方、デバイス側で少し複雑な処理が必要な場合は
Brend Microがおすすめです。端的にいうと、BLEシールド一体型のArudinoなのですが、
一体型のため小型なのが特徴です。自分でArduinoとBLEシールドを組み合わせるのもそこそこ手間がかかるため、さくっと開発したい場合にはおすすめです。Arudino互換ですのでArudino IDEでの開発が可能ですし、対応する拡張デバイスが多いのが良い点かと思います。

#### Intel Edison
![alt](https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcRiUUB1C5L0tdXrTDlurvszKMAT_rN5A9cCkKquytRyR-H80CDDSg)
Linuxに慣れている方、BLEに加えWifiに対応させたい方にはIntel Edisonがおすすめです。
Edisonは、マイコンというよりも小さなPCと考えていただくのがわかりやすいかと思います。
似たコンセプトとしてRassbery Piがありますが、比較して
 * wifi, bluetoothに対応している
 * 小さい
 * 低消費電力
 * リチウムポリマー電池での駆動が可能
 * [IoT Analytics](https://software.intel.com/en-us/intel-iot-developer-kit-cloud-based-analytics-user-guide?language=fr)など、クラウドと連携したい用途向けの環境が整っている
などが優れており、IoT製品の試作には向いているかと思います。

#### Sony Mesh(未発売)
![alt](http://smhn.info/wp-content/uploads/2014/05/mesh-654x380.jpg)
まだ市販されていないのでおすすめには挙げなかったのですが、個人的に注目しているのはsonyのmeshです。センサー付きの電子ブロックを組み合わせて制御できるというもので、UIでプログラミングできる専用ソフトなども用意されており、日常のハック/DIYにはもってこいではないでしょうか。発売が楽しみですね！
参考url: http://ignite.jp/2014/06/10/post-3335/

#### おわりに
いかがでしたでしょうか？次エントリでは、ひきつづき製品化を見据えた試作の目的の場合でのおすすめ開発環境を紹介させていただきます。