OmniAICreator/Qiita-1.07M huggingface dataset:
【Swift2.0でMetal入門】1.Metalの初期化フェーズ

この記事は[前回](http://qiita.com/s_s_k/items/b1a1f793afb470b03fd2)の解説的内容です。
入門としては1.5回目に位置します。

### 目的
Metalの使用用途がGameというイメージが強すぎるので、通常のアプリや表現としても使えることを探っていきます。

### 注意
MetalはiOS8以上の固有機能です。Metalを動かすにはA7チップ以上のデバイスが必要です。Macで開発する場合は
シュミレーターではなく、実機で確認するようにしてください。

### 前回のコードと確認しながら進めると分かりやすいと思います。

### MetalとOpenGLの違い
MetalはOpenGLESより高速で動きます。しかし<b>OpenGLESはクロスプラットフォーム</b>というメリットがあります。そのためOpenGLESのアプリはAndroid、Windowsなどに移植しやすいです。ちなみに<b>SpriteKitやSceneKitはOpenGLESを利用</b>しています。

MetalのメリットはOpenGLESより優れたパフォーマンスと、個人的にはコードの記述がスマートな所だと思います。パファーマンスが出ない場合はMetalの使用を検討しても良いと思います。

まとめるとMetalのメリットとしては

+ OpenGLESよりすぐれたパフォーマンス(CPUとGPUのメモリを共通使用するためとかとか)
+ コードの記述がスマート(私の個人的な感想です)


# グラフィックスライブラリの2つのフェーズ
前回の投稿をみても、グラフィックスライブラリを使う場合、大きく2つのフェーズに分かれます。

+ 初期化フェーズ
+ 描画フェーズ


## 初期化フェーズ
まず初期化フェーズではグラフィックスライブラリの初期化、描画の準備を行います。
順番にみると

+ <b>1.GPUへのアクセス方法を用意</b>
+ <b>2.CPUとGPUの連携準備</b>
+ <b>3.頂点やバッファの準備</b>
+ <b>4.レンダリングパイプラインを準備</b>


で設定します。


### 1.GPUへのアクセス方法を用意
ここで最初にすることは、<b>device</b>を取得することです。これでプログラムを実行しているdeviceとやり取りができます。またデバイスの情報も取得できます。

```swift
let device: MTLDevice! = MTLCreateSystemDefaultDevice()
```

### 2.CPUとGPUの連携準備
グラフィックスの情報は非同期にCPUからGPUに送信されます。これはCPUでまず処理が実行され、次にGPUに転送されます。画面上の特定の1pxで考えると、CPUとGPUが同一のピクセルに対して同時に処理をすることはないです。
この処理を順番に行うためにキューを準備します。CPUはGPUに渡す情報をキューに追加していき、GPUはキューから順番に情報を抜き出し処理します。

```swift
let commandQueue: MTLCommandQueue!  = device.newCommandQueue()
```

### 3.頂点、バッファの準備
GPUへ渡したい頂点情報を準備します。スクリーン上に表示するオブジェクトを定義します。

```swift

// 頂点
let vertexArray: [Float] = [
    -1.0, 1.0, 0, 1,
    -1.0, -1.0, 0, 1,
    1.0, -1.0, 0, 1,
    -1.0, 1.0, 0, 1,
    1.0, -1.0, 0, 1,
    1.0, 1.0, 0, 1
]
```

ヴァッファは頂点、色、テクスチャなどあり、頂点の数だけバッファを作成します。

```swift
let vertexBuffer: MTLBuffer! = device.newBufferWithBytes( vertexArray,
    length: vertexArray.count * sizeofValue(vertexArray[0]),
    options: MTLResourceOptions.OptionCPUCacheModeDefault
)
```

### 4.レンダリングパイプラインを準備
このステップは2に分かれます。最初のフェーズでは、Shaderプログラムを用意し読み込みます。
SwiftでShaderプログラムを使う場合は、Shader Libraryに読み込む必要があります。

```swift
// Shader Library設定
let defaultLibrary = device.newDefaultLibrary()
let newVertexFunction = defaultLibrary!.newFunctionWithName("vertexShader")
let newFragmentFunction = defaultLibrary?.newFunctionWithName("fragmentShader")
```

次のステップではディスクリプタを作成します。
ディスクリプタに
パイプラインを初期化し画像をラスタライズしながら、フォーマットが使用するピクセルを教えてくれます。

```swift
let pipelineStateDescriptor = MTLRenderPipelineDescriptor()
pipelineStateDescriptor.vertexFunction      = newVertexFunction
pipelineStateDescriptor.fragmentFunction    = newFragmentFunction     pipelineStateDescriptor.colorAttachments[0].pixelFormat = .BGRA8Unorm // 色成分の順序を設定
```
ディスクリプタの役目あたりは、まだ曖昧ですみません。
今回は初期化フェーズまでとします。次回は描画フェーズの解説を投稿します。
イベント名札作成と受付いろいろ(CTO Night&Day編)

イベント運営数回やってみて、名札作成の知見が貯まってきた。次のイベントやるときに忘れないように整理してみる。エンジニアが集まるイベントでも使えるはずなのでQiitaに書くのOKなハズ。急にイベント運営をしないといけなくなった人向け。懇親会あるのに名札無いイベントとか本当にダメ。

##今北産業
1. 用紙はハガキサイズがよい
2. イベント用使い捨てのハガキサイズのホルダがよい
3. データはExcelとWord差し込み印刷がよい

以下、ダラダラとここに至るまでの経緯と問題点。

##どんなイベント運営をやったのか？

[IVS CTO Night&Day powered by AWS](http://shinodogg.com/?p=6463)

+ CTOが100人くらい集まる3日間のオフサイトミーティングイベント 
+ アンカンファレンスや連日のネットワーキングパーティがある(ので社名や名前が見やすい必要あり)
+ 社名と名前とCTO歴を名札に記載したい(参加登録時に入力してもらっている)
+ 併設イベントもあるので混じらないように、本イベントのロゴも入れる
+ 今回で3回目
+ 自分もメンバもイベント運営素人なので毎回手探り(本職はこのような作業は外注してる希ガス)

##過去2回のやり方
+ 中に入れる紙はパワポで作成、A4用紙に8人分印刷してカッターで切ってた
+ それをわりとしっかりした[IDカードホルダ](https://www.kokuyo-st.co.jp/stationery/name/designSelection/resultList08.html)に入れる
+ イベント終了時に名札ホルダごと回収して再利用

##今までの課題
+ パワポへのデータのコピペがめんどくさい
+ A4用紙をカッターで切るのが大変。ラインカッター(私物)使ってたけど大変
+ サイズ的にどうしても社名や名前が小さくなってしまう
+ しっかりとしたカードホルダにしたら、紙を挿入するのがすごい大変だった
+ **(これが一番想定外だったんだけど)2回イベントやったらストラップ紐がすごい臭くなった**
+ 基本的に回収出来ているんだけど、うっかり持って行ってしまう人がどうしても発生

##解決策
+ カッターで切るのがめんどくさいので、**ハガキサイズの用紙**にした(IDカードサイズと比べて、社名や名前も大きく印刷できた)
+ カードホルダも使い捨てのものにした。ヒモがショボかったけど3日間で解けたりすることはなかったし、紙挿入もガバガバで簡単だった
+ コピペ問題は**Excel+Word差し込み印刷**を利用してデータの流しこみに成功(色々検討したけどExcelとWord最強ってことに)
+ 社名は長さバラバラなのでフォントサイズは最終的に手運用で調整(社名や名前はなるべく大きくしたい。株式会社とかの表記も意図的に落とした。その際に苗字と名前で5文字や6文字の人が切れてないかチェック重要)
+ 2日目や3日目で忘れてくる参加者いるはずなので多めに予備名札も作成しておいた

##受付
+ 名前であ行、か行、さ行って感じにグルーピングしておいた(参加登録時に名前のふりがな入れてもらってた)
+ 事前に上の並べ方を参加者にアピールして、受付時に協力してもらう(この写真をお送りした)
![受付の様子](https://s3-ap-northeast-1.amazonaws.com/ctonight/name003.jpg) 

##今後の改善
+ まれに名札が裏返ってた人がいたので~~両面印刷にするかは悩み中~~、両面印刷にした。
AmazonLinux ホスト名変更方法

# 一時的なホスト名変更

* hostnameコマンドでホスト名を設定

```bash
# hostname server-name
```

* ログインし直してホスト名が変わっていることを確認（別ターミナルなどでログインしても）

※ 再起動すると設定前のホスト名に戻る（らしい）

# 恒久的なホスト名変更

## hostsファイルの変更

```bash
# vi /etc/hosts
127.0.0.1 xxxx localhost.localdomain server-name
```

## ネットワーク名の変更 

* ネットワーク名の変更

```bash
# vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=server-name
GATEWAY=192.168.0.1
```

* ネットワークの再起動

```bash
# /etc/rc.d/init.d/network restart
```

* 確認方法

サーバを再起動してログインし、ホスト名が変わっていることを確認


# 参考

http://www.searchman.info/tips/1360.html
海外からWebページを確認する方法

# 概要

ごく稀に海外からのアクセス確認したいときがあります。私の場合、海外からアクセスされたときだけ表示するバナーの表示の際に使用しました。

# 方法

下記のサイトでアクセスしたいURLを入力して使用するOS・ブラウザを選択してアクセスするだけ。

https://www.browserling.com/

無料ユーザーはページ表示までの待ち時間があったり、選択できるOS・ブラウザに制限があったします。
本来の用途はOS・ブラウザのエミュレートですが、サーバが海外にあるため、簡易ですが海外からの表示を確認することができます。

# 参考

http://www.itmedia.co.jp/bizid/articles/1304/10/news063.html
PHP 自作 TypedArray

PHPBLT で発表した「自作ArrayでPHPのメモリ節約」のダイジェスト版です。

- https://speakerdeck.com/yoya/array-typed

# 環境

MacOSX 標準の PHP 5.5.29
(PHP7 だと話が違ってくるのでよろしく)

# PHP はメモリを沢山使う

例えば、たった1000個程度の配列で 141KB も使います。

```php
<?php
$m = memory_get_usage();
$a = array();
for ($i	= 0 ; $i < 1000; $i++) {
    $a[] = 100;
}
echo memory_get_usage()	- $m;
```
=> 144736 (141 KB)

# SplFixedArray で半分まで減る

```php
$m = memory_get_usage();
$a = new SplFixedArray(1000);
for ($i	= 0 ; $i < 1000; $i++) {
    $a[$i] = 100;
}
echo memory_get_usage()	- $m;
```
=> 56624 (55 KB)

蛇足ですが、SplFixedArray は Fixed の名前通り固定長なのは良いとして、array_〜 系関数が使えないのが結構困りますね。困りすぎるので詳細を後の方に書きます。

# PHP の配列がメモリを沢山使う理由

- PHP の変数にはどんな型が入るか分からないので、それらを受け入れる十分大きな容れ物としてメモリを確保する。いわゆる変数コンテナのサイズが大きい
- 標準の Array は連想配列として添え字に文字列も入れて使えるような複雑な管理構造データを持つ。
  - この件は裏PHP Advent の方に書きます。
 > [PHP 自作 TypedArray (闇)](http://qiita.com/yoya/items/82b252cc609105645b14)

# 自作 PHP Array

## アイデア

自分のようなバイナリのバイト要素を配列に落として。といった使い方をする場合、配列要素に 0〜255 の値しか入れないので 1要素に1byteしか使わず、例え 1万個の要素があっても 10000 = (9KB) 程度で済むはず。

PHP の string の文字として格納すれば、最小限のメモリ使用量で済みそう。

## 実装の仕方

ArrayAccess, Countable, Iterator の３つを実装すれば、配列っぽいクラスを自作出来る。

```php
class Uint8Array implements ArrayAccess,
                            Countable,
                            Iterator
```

- ArrayAccess => $a[〜] のように添え字でアクセス出来る。配列として最低限の機能
- Countable => count($a) で要素数がわかる。これがないと for ループも回せない
- Iterator => foreach($a as 〜) でループが回せる。配列ならこれはやりたい。

詳細は以下のコードを読んでください。

- https://github.com/yoya/Array_Typed
  - https://github.com/yoya/Array_Typed/blob/master/Array/Typed.php (TypedArray 共通処理)
  - https://github.com/yoya/Array_Typed/blob/master/Array/Uint8.php (Uint8 実装)

## 結果

>
composer require yoya/array_typed

で利用できます。

```php
require 'vendor/autoload.php';
$m = memory_get_usage();
$a = new Array_Uint8(1000);
for ($i = 0 ; $i < 1000; $i++) {
    $a[$i] = 100;
}
echo memory_get_usage() - $m;
```
=> 39776 (38 KB)

メモリ使用量を大幅削減できました。

## 注意点

SplFixedArray と共通する話ですが、ArrayAccess, Countable, Iterator を実装したとしても、あくまでも配列風のクラスであって、PHP標準arrayと全く同じようには使えません。

まず array_〜 関数が使えません。toArray(これはSplFixedArrayにはあります) と slice メソッド位は自前で実装した方が良さそうです。(現状の ArrayTyped パッケージは slice が手抜き実装です、後でちゃんと作ります。。)

is_array で引っかかりません。あくまで is_object 扱いです。instanceof ArrayAccess なら引っかかります。または場合によって厳密に instanceof Uint8Array 等とすると良いでしょう。ちなみに instanceof SplFixedArray も is_object なので is_array には引っかかりません。

最後に SplFixedArray の結構大きなデメリット。

要素を参照渡しできないので、例えば配列でツリー構造を表現すると、再帰的に処理するのが面倒になります。
具体的にいうと、PHPの標準array では以下のような処理ができますが、SplFixedArrray だと "Indirect modification of overloaded element of SplFixedArray has no effect" エラーになります。

```php
<?php

$arr = [1,2,[31,32,33], 4];
add($arr);
print_r($arr);
function add(&$arr) {
    if (is_array($arr)) {
        foreach ($arr as &$e) {
            add($e);
        }
    } else {
        $arr += 1;
    }
}
```

SplFixedArray はツリーのリーフ(末端)でだけ使うのが無難でしょう。今回自作した TypedArray はそもそも配列をネスト出来ないので関係ない話ですが、一応うんちくとして。

以上です。
nRF51822+S130 v2.0.0-7alphaを試す

nRF51822をずっとPeripheralで使っていたが、SoftDeviceのS130はどちらにもなれるということなので、まずはS110→S130へ移行してみようとした。

結果として、動きはしたのだが、情報を集めきれなくて正しくはないかもしれないという思いがある。

# github

[nrf51822_adctest](https://github.com/hirokuma/nrf51822_adctest/tree/master/nrf51822/s130/armgcc)

元々は、nRF51822でBluetooth Developer Studioを使ってServiceを作ってAD/Cするサンプルアプリだったのだが、もうその形をとどめていない。
なので、あまり気にしないように。

# 変更点

* nRF51822にSoftDevice S130 v2.0.0-7alphaをnRFgo Studioで焼く。
* GCCなので、リンカスクリプトをnRF51 SDK v10.0.0からコピーする。
    * FLASH, RAMともに違いがあるので、適当に直す。
* nRF51 SDK v10.0.0はS130 v1.0.0向けなので、いくつか変更する。
    * components/softdevice/s130/headersを、S130のincludeと置き換える。
    * Makefileも、S110からS130のパスに変更する。
    * マクロ名変更でエラーが発生することがあるので、適当に直す。
    * コールバック関数型の名称も変わっていてwarningが出るので、warningをエラーと見なすオプションを外す。
    * 他にもAPI仕様が変わったりしているので、適当に直す。

だいたい、こんな感じだ。

# 感想
SDKが対応していないので、サンプルもない。
そこが一番面倒だ。

nRF52 S132と同じ系統のAPIになろうとしているので、そちらから情報を検索した方が集まりやすいかもしれない。
特にsd_ble_enable()にどういう値を与えたら良いかは、[nRF52のQA](https://devzone.nordicsemi.com/question/57142/s132_nrf52_200-4alpha-sd_ble_enable/)が役立った。

リリースノートには「最低4.5KBのRAMがいる」としか書かれておらず、リンカでどのくらい確保して良いのかがわからなかった。
上記QAを参考に取得し、いまはもうちょっと余裕を持たせたサイズで確保している。

# まだわかってないこと
ATTテーブルにどのくらいのサイズを与えたら良いかがわかっていない。
BLE_GATTS_ATTR_TAB_SIZE_MINで与えたのだが、これでは自分で用意したServiceが出てこなかったのだ。
かといって、BLE_GATTS_ATTR_TAB_SIZE_DEFAULTを指定するのも悔しいので、計算方法を見つけたいところだ。
X Window Systemが起動するまでの流れ

PCの電源を入れてからX Window Systemが立ち上がるまでの流れを整理する。

## 手動でXを立ち上げる場合
1. PCの電源を入れる
2. [仮想コンソール](https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB)が立ち上がり、ログインプロンプトが表示される
3. ログインする
4. セッションが始まり、既定のシェルが起動する
5. ```startx```を実行する
6. Xが起動する(このとき```xinitrc```に書いてあるシェルスクリプトが実行される)

## ディスプレイマネージャーを使う場合
1. PCの電源を入れる
2. ディスプレイマネージャーが起動し、ログイン画面が表示される
3. ログインする
4. Xのセッションが始まる
.htaccessで全てのページのアクセス（SSLありなし）をトップページにリダイレクトする設定

```apache
RewriteEngine On

RewriteBase /

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^/index.html$
RewriteCond %{REQUEST_URI} !^.*\.(gif|jpg|jpeg|png|swf|css|js)$ [NC]
RewriteRule ^(.*)$ http://exmaple.com/index.html [L,R]

RewriteCond %{HTTPS} on
RewriteRule ^(.*)$ http://exmaple.com/index.html [L,R]
```

どのページへのアクセスも、HTTP/HTTPS問わず「http://exmaple.com/index.html 」にリダイレクトされます。
Electronでフォント選択を実現する

[Electron Advent Calendar 2015 - Qiita](http://qiita.com/advent-calendar/2015/electron)の12日目ですが一日遅れでの投稿になります。

さて、Electronの記事なんですが、webviewを使ってgmail clientを書く話にしようかとも思ったのですが、あまりにもまとまらなかったのでフォント選択の話にしようかと思います。

最近はElectron製のアプリも増えてきましたが、僕は一つ不満を持っています。それはElectron自体がフォント選択ダイアログを持っていないためか、どのアプリもフォント選択機能がなく、せいぜいが直接フォント名を設定ファイルに書くという仕組みになっていることです。Atom, VSCodeなんかもそのパターンですね。

さて、システムフォントの一覧及びそのフォントの情報を取得する方法はあるでしょうか？標準ではありませんが[font-manager](https://www.npmjs.com/package/font-manager)を使えば可能になります。

```
$ npm i font-manager --save
```

このfont-managerはOSごとにシステムのフォントインターフェースを叩いていい感じにフォント情報を取得してくれるます。今回の目的だと`getAvailableFonts()`か`findFonts({})`のどちらかを叩くことになるのですが、前者ならば全フォント、後者なら{}の中で指定した条件にマッチするフォントが配列として帰ってきます。たとえば`findFonts({monospace: true})`で固定幅フォントだけをピックアップできます。

```js
var fonts = fontManager.findFontsSync({ family: 'Arial' });
```

```js
// output 
[ { path: '/Library/Fonts/Arial.ttf',
    postscriptName: 'ArialMT',
    family: 'Arial',
    style: 'Regular',
    weight: 400,
    width: 5,
    italic: false,
    monospace: false },
  { path: '/Library/Fonts/Arial Bold.ttf',
    postscriptName: 'Arial-BoldMT',
    family: 'Arial',
    style: 'Bold',
    weight: 700,
    width: 5,
    italic: false,
    monospace: false } ]
```

これは公式ページにあるサンプルコードです。APIの後ろにSyncが付いているものは同期バージョンです。通常版はコールバックを指定することになります。CSSの`font-family`には、この情報のうち`family`もしくは`postscriptName`を指定することができます。ArialMTとArial-BoldMTを見ればわかる通り、`postscriptName`にはフォントのスタイル情報が含まれています。

考え方次第ですが、フォント名の指定にスタイル情報を含めてもかまわないのであれば、postscriptNameをキーにして扱えばいいと思います。ただ、この場合、たとえばfont-weightなどの指定が無意味になったりします。あと純粋なフォントファミリーに比べてフォント名が圧倒的に増えてしまいます。

いいやり方としては、取得したフォント配列の`family`プロパティに着目し、新しいMapを構築するとよいでしょう。そうすればフォントファミリーごとにまとまったものになります。Mapの中身は使用したい情報に応じてさらにstyleをキーにしたMapにするのも手でしょう。

実のところは、`family`かせいぜい`postscriptName`位しか役に立たない気もします。これ以上の情報を調べる方法は[fontkit](https://www.npmjs.com/package/fontkit)などがありますがぱっと見た感じでは使える情報を見つけられませんでした。

フォントには、対応してる文字種(日本語いける？とか)も入ってるはずですし、システムのフォント選択では「ほげゴチック」のような日本語でのフォント名称がでてくるので、そういった情報も取得できるはずです。僕的には前者はまぁ別に興味だけの話だったのでいいんですが、せめて後者、日本語でのフォント名称は取得したかったところです。方法をご存じの方教えてください。

サンプルを [erukiti/electron-font-setting-test](https://github.com/erukiti/electron-font-setting-test) においてあります。

Electronアプリにフォント選択機能が増えることを願っております。それではごきげんよう。
Perl6 の File Test operators

こんばんは :whale2: 
[Perl 6 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/perl6)の13日目です。

今日はFile Test operatorsについて

## File Test operators

| operator | description |
|:------:|:------|
| :e | Exists |
| :d | Directory |
| :f | File |
| :l | Symbolic link |
| :r | Readable |
| :w | Writable |
| :x | Executable |
| :s | Size |
| :z | Zero size |

## 使い方

#### ファイルが存在するか

* Perl5 では `-e 検査対象` と書いていました。

```pl
use v5.18;

my $exists = '.bash_profile';

if( -e $exists ){
  say 'Exists'; #=> Exists
}
```

* Perl6 ではこんな感じに書きます。

```pl
use v6;

my $exists = '.bash_profile';

if $exists.IO.e {
  say 'Exists'; #=> Exists
}
```

* [参考] testコマンド

```bash
$ test -e .bash_profile && echo $?
0
```

#### 読み取り可能か

* Perl5

```pl
use v5.18;

my $readable = '.atom/packages/japanese-menu/package.json';

if( -r $readable ) {
  say 'Readable'; #=> Readable
}

# ファイルサイズ
say -s $readable; #=> 7956
```

* Perl6

```pl
use v6;

my $readable = '.atom/packages/japanese-menu/package.json';

# こんな風にも書けます
if $readable.IO ~~ :r  {
  put 'Readable'; #=> Readable
}

# ファイルサイズ
put $readable.IO.s; #=> 7956
```

おわりです。

## 参考と注釈

[class IO::Path - Perl 6 Documentation](http://doc.perl6.org/type/IO::Path#File_Test_operators)
「Hiroshima MotionControl Network vol.2」に参加したよ

https://hmcn.doorkeeper.jp/events/34823

HMCN に参加しました。

家族で参加したんですが、
子供は、、、ちょっとヒマしたかな、、、っと思うけど、こういうところからプログラミングや何かを作るコトに興味をもってほしいなー。

![20151212_HMCN2.png](https://qiita-image-store.s3.amazonaws.com/0/53620/147e0c92-f4f0-2a7a-aa24-63666c86b772.png)

スタイリッシュモーションの説明は、Kinect V2 を触っていないぼくに興味を持たせてくれるとても面白い内容でした。
Kenect V2 、、、買おうかな。ドローンを買ったことが影響しているので、来年までは無理かな。

いろいろその場で動くものを試すコトができ、子どもも楽しくやってました。

帰りの車内で子どもへ一番楽しかったコトを聞いた所、スマフォを使った色塗り対戦でした。
真似してつくろうかな。
CSVデータをRealmに登録して最初からアプリに入れておく方法


# はじめに

「Objective-CでRealmを使ってハマったこと」で書こうと思ってましたが、
Swift2.0の勉強がてらこっちのテーマにしました。ハマったことは別記事で書く予定。

# 環境

- OS X 10.11.1
- Xcode 7.2
- Swift 2.0
- Realm 0.96.3

# 用途とか

変更しないマスターデータ、設定をRealmに登録しておき
あらかじめアプリに入れておきたい時などに。

# CSVデータ準備

読み込むCSVデータ

```csv:TestData.csv
1,データ1
2,データ2
3,データ3
```

# CSV読み込み、Realmにデータ登録

```swift:TestData.swift
import UIKit
import RealmSwift

class TestData: Object {
    dynamic var id = 0
    dynamic var name = ""
}
```

```swift:
if let csvPath = NSBundle.mainBundle().pathForResource("TestData", ofType: "csv") {
    var csvString=""
    do{
        csvString = try NSString(contentsOfFile: csvPath, encoding: NSUTF8StringEncoding) as String
    } catch let error as NSError {
        print(error.localizedDescription)
    }
    csvString.enumerateLines { (line, stop) -> () in
		
		 // 保存先のパスを出力しておく
        print(Realm.Configuration.defaultConfiguration.path!)

        let testData = TestData()
        testData.id = Int(line.componentsSeparatedByString(",")[0])!
        testData.name = line.componentsSeparatedByString(",")[1]
        
        let realm = try! Realm()
        try! realm.write {
            realm.add(testData)
        }
    }
}
```

保存先のパスにdefault.realmファイルが生成されるので
名前を変更して(TestData.realm)プロジェクトにインポートします。

# Realmからデータ取得


```swift:
// .realmファイルを指定する
let config = Realm.Configuration(
    path: NSBundle.mainBundle().pathForResource("TestData", ofType:"realm"),
    readOnly: true)

let realm = try! Realm(configuration: config)
let results = realm.objects(TestData).filter("id > 2")

```

# 最後に

.realmファイルをインポートするために、シミュレーターで実行してMac上にファイルを生成する必要があります。 
もっといい方法あるかもですが、こんな感じで。

# 参考
http://ja.stackoverflow.com/questions/19307/swift2-0%E3%81%A7%E3%81%AEcsv%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF
rails g uploader Pictureが終わらない(Ruby on Rails Turorial)

rails g uploader Pictureが終わらない。

ひとまず、インストールされているgemを確認する。

gem list

carrierwave (0.10.0)
fog (1.36.0)
mini_magick (3.8.0)

上記3つの追加したgemはインストールされているようだ。

下記のブログだと、fogのバージョンを1.36.0にすればいいらしいが、ダメ。

Rails Tutorial (3rd ed.) で rails g uploader できない
http://qiita.com/hashedhyphen/items/258488ad4eb6faaec7b5

gem updateで全部のgemをインストールし直してみる。
うまくいった。

原因がわからずもやもやするが、gemのインストールがうまく行っていないという事なのだろうか…
MSYS2環境でpcre-lightをビルドする

このエントリは[Haskell Advent Calendar 2015](http://qiita.com/advent-calendar/2015/haskell) の $N$ 日目の記事ではありません。

[24 days of Hackage, 2015: day 2](http://conscientiousprogrammer.com/blog/2015/12/02/24-days-of-hackage-2015-day-2-regexes-with-pcre-heavy-standalone-haskell-scripts-using-stack/) をSurface Pro 3上で試したいと思って一日潰してしまったので、うまくいった状況だけメモっておく。元エントリは `pcre-heavy` の Template Haskell と `stack runghc` で LL ライクにカジュアルに正規表現使ったスクリプト書けるよっていう興味深い話なんだけど、今書いてるこのエントリはWindows環境でのダークサイドであって面白味はない。きちんと「> I would feel sad if I picked a library that is problematic for Windows users.」って言及されてるし。

さて、手元の Surface Pro 3 は MSYS2 をインストールして、以下のように `pcre` を導入済の状態。

```
$ pacman -Sy
$ pacman -S mingw64/mingw-w64-x86_64-pcre
```

元エントリのように `stack runghc` 経由で実行すると、以下のエラーとなった。

```
$ ./PCREHeavyExampleMain.hs
Run from outside a project, using implicit global project config
Setting codepage to UTF-8 (65001) to ensure correct output from GHC
GHC runtime linker: fatal error: I found a duplicate definition for symbol
   .refptr._pcre_OP_lengths
whilst processing object file
   C:/msys64/mingw64/lib\libpcre.a
This could be caused by:
   * Loading two different object files which export the same symbol
   * Specifying the same object file twice on the GHCi command line
   * An incorrect `package.conf' entry, causing some object to be
     loaded twice.
ghc: panic! (the 'impossible' happened)
  (GHC version 7.10.2 for x86_64-unknown-mingw32):
        loadArchive "C:/msys64/mingw64/lib\\libpcre.a": failed

Please report this as a GHC bug:  http://www.haskell.org/ghc/reportabug
```

で割といろいろと何やってもだめだったのだけど、 [stackoverflowの回答](http://stackoverflow.com/questions/26288139/cabal-install-pcre-light-on-windows-extra-include-dirs-extra-lib-dirs-not-worki/33505166?stw=2#33505166) で 7.10.3 なら簡単だぜーみたいなこと書いてあったんで、そっちで試したら少なくとも `pcre-light` のインストールについてはうまくいった。

今日現在のresolverはghc-7.10.3に対応してないので、 [FPCompleteで書かれている](https://www.fpcomplete.com/blog/2015/12/stack-with-ghc-7-10-3)ように `stack setup 7.10.3` した上で stack.yamlにて `compiler-check: newer-minor` を指定。元エントリの `runghc` でカジュアルにスクリプト書けるぜ～って話は完全無視して `stack new` してプロジェクト作って普通に依存に `pcre-heavy` 入れた。

でもって、 `pcre-light` のインストールも含めてビルドするために `stack --skip-msys build` したわけなんだけど、こいつがなぜか落ちる。落ちるんだけど、3～4回くらい叩くとこれまたなぜかビルドが完了して、実行ファイルを実行してみるときちんと動いた。(落ちた時のエラーメモっておけばよかったんだけど、気力が尽きててメモってない・・・)

ちなむと `--skip-msys` がないと stack は MSYS2 をローカルにダウンロードしてきて、そこで pcre ライブラリのビルドとかをするような構成を作る。この場合、 `stack exec -- pacman -S mingw64/mingw-w64-x86_64-pcre` みたいな叩き方ができて、これでもうまく動かせそうな気がするのだけど、こっちは検証してない(というか、少なくともghc-7.10.2でごちゃごちゃ動かしたときはうまくいってなくて、 ghc-7.10.3 ではまともには検証してない)。MSYS2の環境は手元に持っていてもうこれ以上要らないってときは `--skip-msys` を指定した方がよさげ。

後、本編と関係ない問題として [MSYS2上でctrl-c効かない問題](https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/ghci-windows.html) も踏んだ。ghciだけならともかく 「> it affects any GHC-compiled program that wants to catch console events」って影響でかいわ。
docker + fluentd + Elasticsearch + kibana4 で構築するお手軽NetFlowアナライザ



この記事は[慶應義塾大学SFC村井&徳田研 Advent Calendar 2015](http://www.adventar.org/calendars/1053) の13日目の記事です。

---

## はじめに

慶應義塾大学湘南藤沢キャンパス(SFC)では毎年11月に[Open Research Forum](http://orf.sfc.keio.ac.jp/2015/)というイベントを開催しています。

すごくざっくり説明すると、日頃学生が取り組んでいる研究についての発表会みたいなものです。

私が専攻している情報工学分野の他にも国際政治や環境問題、脳科学、建築、言語コミュニケーションなどといった分野について、日ごろ学生が取り組んでいる内容についてのポスターセッションを行ったり、制作物を展示したりしています。

次年度以降も開催されると思うので、興味がありましたらぜひお立ち寄りくださいませ。

---

閑話休題、今回私はNOCの一員としてORFに携わらせていただいたのですが、その中で展示物として会場内のトラフィックをNetflowで収集して、それを可視化させたものを展示いたしました。

構成は以下のようになっております。 (2016/4/21 久しぶりに動かそうと思ったら動かなかったので、構成をちょっと変えました)

![system.png](https://qiita-image-store.s3.amazonaws.com/0/44083/77d9db7f-73cd-0891-c352-d120d37cc8f3.png)

非常に粗雑な図でわかりづらいので解説をすると、会場のトラフィックをNetflowで取得し、それをfluentdで中継してElasticserachに蓄積し、Kibanaで可視化をする、といったものになっています。

受信側のFluentd, Elasticserach, Kibana は Dockerのコンテナとして管理しています。

なお、fluentdでNetflowを中継する際には[fluent-plugin-netflow](https://github.com/repeatedly/fluent-plugin-netflow)を利用させていただきました。

## 使い方
~~ソースコードを[こちら](https://github.com/koheis612/netflowanalyzer_with_docker)に置いておきました。~~

(追記) 当該リポジトリを削除したのでこちらに設定ファイルを置きます。2年前に使って以来動作を確認していないので動作は保証しません。

```yaml:aggregator.yml
es:
  image: itzg/elasticsearch
  volumes:
    - /mnt/elasticsearch-data:/usr/share/elasticsearch/data
  ports:
    - 9200:9200
    - 9300:9300

kibana:
  image: kibana
  ports:
    - 5601:5601
  links:
    - es:elasticsearch

# fluentd:
#   build: ./fluentd
#   ports:
#     - 24224:24224
#     - 24224:24224/udp
#   links:
#     - es:es
```

docker-engineとdocker-composeがインストールされていることを前提としています。
Ubuntu14.04.3 LTS と Debian 8 (jessie) で動作を確認しています。

### NetFlow送信側の設定

上図でいう、ホスト側にfluentdが置いてある部分です。

```bash
$ gem install fluentd
$ fluent-gem install fluent-plugin-netflow fluent-plugin-elasicsearch
$ ./fluentd -c ./fluent.conf
```

fluentdをgemで入れた後、fluentd-plugin-netflowを入れて、fluentdを起動しています。
`fluent.conf`の設定例は下記の通り。

```
# input
# source configuration is cited from github.com/repeatedly/fluent-plugin-netflow
<source>
  type netflow
  tag netflow.event

  # optional parameters
  bind 127.0.0.1
  port 5140

  # optional parser parameters
  cache_ttl 6000
  versions [5, 9]
</source>

# output
<match netflow.event>
    @type elasticsearch
    logstash_format true

    # setting your host ip address
    host YOUR_HOST_IP_ADDRESS
    port 9200

    # index name is arbitrary
    index_name fluentd
    type_name netflow

    flush_interval 60
</match>
```

`YOUR_HOST_IP_ADDRESS`の箇所にはelasticsearchが稼働しているホストのIPアドレスを指定してください。

### NetFlow受信側の設定
dockerでホストされている部分です。
docker-composeで一気に立ち上げちゃいます。docker-compose、便利ですね。

```bash
$ docker-compose up -d
```

### 完成図的なもの
こんな具合に可視化とインタラクティブな分析ができます。可視化部はkibanaでいろいろいじれます。
![20151120_netflow_edited.png](https://qiita-image-store.s3.amazonaws.com/0/44083/3e66d5cb-94fd-7056-3d73-29b906b267d3.png)



## おわりに
Elasticsearchにレコードが蓄積すると表示や検索が重くなってしまうのが難点ですが、お手軽にモダンな監視環境が簡単に作れます。
各ディレクトリの`fluent.conf`を書き換えればNetFlow以外もお手軽に流し込めるかなと思います。
何かの参考になれば幸いです。
簡単！JSでスマホサイトをPCサイトにページ単位でリダイレクトさせる方法

簡単楽ちん。
スマホのリダイレクトさせたいページに以下コードを埋め込む。

```js

<script type="text/javascript">
// UA判別 PCでアクセスした場合PC版に飛ばす
var UA = navigator.userAgent.toLowerCase();
var file_name = window.location.href.substring(window.location.href.lastIndexOf("/")+1,window.location.href.length);
if( UA.indexOf('iphone') == -1 && UA.indexOf('ipad') == -1 && UA.indexOf('ipod') == -1 && UA.indexOf('iemobile') == -1 && UA.indexOf('tizen') == -1 && UA.indexOf('android') == -1 ){
    location.href = 'http://www.hoge.co.jp/about.html';
}
</script>
```
例の場合PC版のabout.htmlにリダイレクトします。
メモ: as_jsonのincludeのまとめ

```rb
 trades.as_json(
                :include => [
                 								{:merchandise => { 
                                 										:include => [
                                       														:merchandise_images, 
                                       														:user => { 
                                       															:include => {
                                       																:school => { :only => 'name' }
                                       															}
                                       														}
                                 													      ]
                 												         } 
                 								},
                                :buyer
                            ]
               )



 merchandises.as_json(
                      :include => [
                   									{:user => { 
                   										           :include => { :school => { :only => 'name'} },
                                                 :only => ['id', 'name', 'image'],
                                              }
                                    },
                                    :merchandise_images
                                  ]
                     )

```
Ruby on Railsで関連テーブルの情報をまとめて読み込む:includeオプションのまとめ
http://www.gesource.jp/weblog/?p=477
○○mapをつくるアプリで七福神mapを作ってみた

この記事は、シビックテックをテーマにした、「Civic Tech Advent Calendar 2015」企画の12日目の原稿です。他の記事は
http://qiita.com/advent-calendar/2015/civictech
にあります。

# ○○mapをつくるアプリを作ったのでそれで千住七福神mapを作ってみた

昨日、幼稚園mapや消火栓mapなどを簡単に作れるアプリを作ってみた
http://qiita.com/fumishitan/items/2eff8fbd62e6ba31854e
今日はそれを実際に利用して○○mapを作ってみた。
実際に作ってみたmapは、千住七福神map
http://www.hosomichi.info/shichifukujin.html
もう地図自体は存在するのだが、意外とわかりづらく自分で作ってみた。
実際に、歩いて現地にいって、アプリを使って、、、という工程を経て各神社の位置情報を[ニフティクラウドmobile backend](http://mb.cloud.nifty.com/)に保存してみた。

# 実際にDBにどんなデータが入れられたか？

実際にニフティクラウド mobile backendのDBにはこんな感じでデータが入った。
![スクリーンショット 2015-12-13 20.02.57.png](https://qiita-image-store.s3.amazonaws.com/0/55227/50fd3206-e878-af2a-898f-ecf8f3cfde5f.png)

ポイント名と位置情報が一緒になって入れられている。
七福神なのに９個があるのは、途中よった鯛焼きとラーメン屋でログをとったからw

実際に上記のポイントを地図上に表示すると下記のような形になる

<img width="320" alt="thumb_IMG_1509_1024.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/55227/e8d1fe19-0eb0-1989-85ab-ea4b09b48fff.jpeg">


# オープンデータにするならこんな構成か？

さて、今回は○○mapをつくるアプリを使って千住七福神mapを作成しました。もうすこし言えば、そのDBをつくることに成功しました。civic tech的にはこの後これをオープンデータ化したいのかな？と思いますがその際にはすこし気をつけて欲しい部分があります。

例えば下記のような構成にすると秘密鍵に当たるクライアントキーをWebアプリにも教えないといけなくなり、どの端末からもDBの更新ができてしまいます。

![1.001.png](https://qiita-image-store.s3.amazonaws.com/0/55227/6b188996-ac96-cf94-6dd3-6d490168b8dd.png)

なので、下記の構成にしたほうが良いのかもしれません

![2.001.png](https://qiita-image-store.s3.amazonaws.com/0/55227/24389939-831d-efd2-31f6-d997df3d9a9f.png)

上記のようにニフティクラウドmobile backendの前に一個サーバーを噛ませれば、Webアプリには秘密鍵を渡す必要がなく、データの取得だけ行わせることも可能になると思います。

上記がベストプラクティスとはいいませんが、ニフティクラウド mobile backendでオープンデータをつくる場合には念頭に置いておいて欲しい内容です。
指定したディレクトリ以下のHaskellソースの自動インデントを行うワンライナー

hindentコマンドを利用して、指定したディレクトリ以下のすべてのHaskellソースの自動インデントを行うワンライナー

```sh
for f in `find . -name "*.hs"`; do cat $f | (hindent --style chris-done > $f.hindent); if [ -s $f.hindent ]; then mv $f.hindent $f; else break; fi; done
```

hindentはソースを改行した際にtrailing whitespaceを残すことがあるため、それを削除する機能も追加したバージョン

```sh
for f in `find . -name "*.hs"`; do cat $f | hindent --style chris-done | (sed 's/ *$//' > $f.hindent); if [ -s $f.hindent ]; then mv $f.hindent $f; else break; fi; done
```

上記プラス、hindentはソースの最終行の改行を削除してしまうので最終行に改行を必ず入れるバージョン

```sh
for f in `find . -name "*.hs"`; do cat $f | hindent --style chris-done | sed 's/ *$//' | (perl -0pe 's/\n*\Z/\n/m' > $f.hindent); if [ -s $f.hindent ]; then mv $f.hindent $f; else break; fi; done
```

上記プラス、hindentはたまにエラーになるためどのファイルがエラーになったかも表示するようにしたバージョン

```sh
for f in `find . -name "*.hs"`; do printf "$f ... "; cat $f | hindent --style chris-done | sed 's/ *$//' | (perl -0pe 's/\n*\Z/\n/m' > $f.hindent); if [ -s $f.hindent ]; then mv $f.hindent $f; echo done; else break; fi; done
```

上記プラス、stylish-haskellも併用したバージョン

```sh
for f in `find . -name "*.hs"`; do printf "$f ... "; cat $f | hindent --style chris-done | stylish-haskell | sed 's/ *$//' | (perl -0pe 's/\n*\Z/\n/m' > $f.hindent); if [ -s $f.hindent ]; then mv $f.hindent $f; echo done; else break; fi; done
```
コンクールでは話せなかった「賢いバス停」の技術部分

この記事は「KIT AppDeveloper Advent Calendar 2015」企画の13日目の記事です。
他のためになる記事は
http://qiita.com/advent-calendar/2015/kitappdeveloper
からご覧いただけます。

今回はG空間×ICT北陸まちづくりトライアルコンクール（2015年11月28日）で発表した「賢いバス停」の技術部分について、簡単に書いていこうと思います。
当日のプレゼンで話していない部分になります。

#賢いバス停について
まず、「賢いバス停」ってなんのことだ！という人向けに簡単に書いておきます。
当日発表したスライドをスライドシェアで公開していますので、ご覧ください。
http://www.slideshare.net/masamichi12/gict

・概要
バス停にはディスプレイが付いており、時刻表やルートを表示します。またバス停と会話をすることにより、道案内や乗り換え、近くのお店の情報が聞けます。事前に子供の顔を登録しておくと、バス停と会話したとき親に通知がいく見守りシステムや、災害時にイラストと地図で外国人でもわかりやすい避難指示を表示するシステムが搭載されています。

多くの機能があるのですが、今回は時刻表、顔判別、災害対策に関して書いていこうと思います。

##時刻表
時刻表のデータはオープンデータを利用しています。
オープンデータは政府や自治体がアプリなどで利用しても大丈夫なデータです。
データはバスの時刻表や統計データ、施設データ、写真など様々な物があります。

今回は石川県野々市市のコミュニティーバス「のっティ」で実験していくため、野々市市のオープンデータを利用しました。
http://www.city.nonoichi.lg.jp/hisyo/opendata/opendata_top.html

夏休みにハッカソンで時刻表を作成したのものをGoogle Playで公開しているので、のっティ利用者はお使いください。（使えないアプリだと思いますが…）
https://play.google.com/store/apps/details?id=com.appspot.kiesprj.busstopn

##顔判別
顔判別はまだ実装途中ですが、Caffeで試しているところです。
公式サイトはこちらになります。
http://caffe.berkeleyvision.org

「Caffeで手軽に画像分類」でCaffeの使い方が書いてあります。また、多くのサイトで補足が書かれているので、参考になると思います。
http://techblog.yahoo.co.jp/programming/caffe-intro/

実装としては、Android端末を使用しているので顔を認識した時に撮影を行い、Caffeを使って判別させることを行う予定です。

##災害対策
現在はバス停の揺れ検知やAPIを用いて情報を表示しています。
災害時の時にネットワークが途切れないよう、920MHzの無線モジュールを用いてマルチホップ通信をすることも検討に入れています。

#最後に
さらっと「賢いバス停」の技術部分を書きましたが、いかがでしたか？
簡単に書きすぎだよ！と思う方も多いかと思いますが、学会帰りの電車でiPhoneから頑張って書いたので許してくだい！

これからも進化していくプロジェクトですので、応援よろしくお願いします！！
N1QLがJSONデータモデルの柔軟さを引き出す

この記事は[Couchbase Advent Calendar 2015](http://qiita.com/advent-calendar/2015/couchbase) の13日目の記事です。

# はじめに
[Couchbase Server 4.0](http://www.couchbase.com/nosql-databases/couchbase-server)から[N1QL](http://www.couchbase.com/n1ql)というSQLライクな文法を持つクエリ言語が登場したことによって、従来のViewでは困難もしくは不可能であったクエリが書けるようになりました。文法はJavaScriptベースのものから慣れ親しんだSQLベースのものになり、開発速度や保守性も大幅に向上しました。

従来のViewではクエリが制限されていたがために、JSONドキュメントの構造をViewに合わせなければならないケースがありました。ここではN1QLの強力な表現力によってJSONのデータモデル自体もより柔軟に考えられるようになりめでたいという話をします。

# JOINの壁
従来のViewはJOINをサポートしておらず、複数ドキュメントを取得するクエリの場合は複数回クエリを発行する必要がありました。そのためアプリケーション側のロジックが複雑になる、トランザクションもサポートしていないためクエリ発行中にデータが更新されてしまう可能性があるという問題がありました。以前はこの問題を解決するために、本来であれば複数に分割したいJSONドキュメントを単一のドキュメントに埋め込むというアプローチを取っていました。

Couchbase Server 4.0で新しく追加されたサンプルバケットの travel-sample バケットのデータを例に考えてみます。なおサンプルバケットはGUIコンソールの Settings -> Sample Buckets -> Available Samples の中にあるバケット名にチェックを入れてCreateボタンを押せばいつでも追加できます。

type:airline の airline_10 ドキュメントが航空会社を、type:route の route_46586 ドキュメントが航空便を表していますね。route_46586 ドキュメントは airlineid キーで airline_10 というドキュメントIDを保持しており、RDBのテーブル間の関連付けのようにドキュメント間で関連付けがなされています。

```lang:airline_10
{
  "id": 10,
  "type": "airline",
  "name": "40-Mile Air",
  "iata": "Q5",
  "icao": "MLA",
  "callsign": "MILE-AIR",
  "country": "United States"
}
```

```lang:route_46586
{
  "id": 46586,
  "type": "route",
  "airline": "Q5",
  "airlineid": "airline_10",
  "sourceairport": "FAI",
  "destinationairport": "HKB",
  "stops": 0,
  "equipment": "CNA",
  "schedule": [
    {
      "day": 0,
      "utc": "06:11:00",
      "flight": "Q5972"
    },
    {
      "day": 0,
      "utc": "03:07:00",
      "flight": "Q5940"
    },
    ---- 省略 ----
  ],
  "distance": 118.2018358510763
}
```

N1QLであれば、以下のように容易にこのふたつのドキュメントを結合して単一のクエリで結果を返すことができます。

```
SELECT * FROM `travel-sample` AS route USE KEYS "route_46586" JOIN `travel-sample` AS airline ON KEYS route.airlineid;
```

Viewではこのようなクエリが書けないため、JSONの構造を工夫する必要がありました。例えば以下のようなドキュメント構造が考えられます。

```
{
  "id": 46586,
  "type": "route",
  "airline": {
    "name": "40-Mile Air",
    "iata": "Q5",
    "icao": "MLA",
    "callsign": "MILE-AIR",
    "country": "United States"
  },
  "sourceairport": "FAI",
  "destinationairport": "HKB",
  "stops": 0,
  "equipment": "CNA",
  "schedule": [
    {
      "day": 0,
      "utc": "06:11:00",
      "flight": "Q5972"
    },
    {
      "day": 0,
      "utc": "03:07:00",
      "flight": "Q5940"
    },
    ---- 省略 ----
  ],
  "distance": 118.2018358510763
}
```

type:routeのドキュメントにtype:airlineのドキュメントを子要素として埋め込んでいます。あらかじめ単一のドキュメントにしておくことでJOINができないというクエリの弱さをカバーしていました。

このような構造にするとデータが冗長になる、データの更新性が大幅に低下するという欠点があります。例えば航空会社名が変わった際には変更対象のドキュメントのID一覧を取得し、ひとつずつJSONを更新する処理を走らせなければなりません(12/10 リリースの Couchbase Server 4.1でUPDATE、INSERT、DELETEなどのDMLが正式サポートされ、複数ドキュメントの一括更新ができるようになりました)。

ただし、ふたつのドキュメントが頻繁に同時に参照される、データの更新はほとんど発生しないといった条件であればこのような埋め込み型の構造も充分考えられると思います。

# まとめ
N1QLによってクエリやアプリケーション側のロジックに引っ張られることなくJSON構造を考えられるようになりました。JSONのデータモデルの柔軟さを謳歌できます。楽しいです。

CouchbaseはちょっとViewが独特すぎて・・・という方もN1QLならとっつきやすいと思います。使ってみてください。N1QLの構文については以下が参考になります。
[Querying with N1QL](http://www.couchbase.com/n1ql)

# 最後に
モバイルのDBであるCouchbase LiteでもN1QLが使えるようになる日を楽しみにしています。
chromeの罠

#きっかけは
webrtcの記事を書こうと、chromeをバージョンアップした。
47になった。
jsdo.itに書いたwebrtcが動かない。
getusermediaがエラーになる。
#調べた。
web上のサンプルを実行してみると、動くサイトもある。
ソースを持ってきて、jsdo.itで動かすと動かない。
どうも、「https://」だと、動くようだ。
#対策
jsdo.itで実験したいなら、バージョンは、上げるな。以上。
XLabs.FormsでCould not load file or assembly 'XLabs.Forms' or one of its dependencies

XLabs.FormsでCould not load file or assembly 'XLabs.Forms' or one of its dependenciesが発生して困ってた。

https://github.com/XLabs/Xamarin-Forms-Labs/wiki
に書いてある通り、

On iOS you can just change in your AppDelegate.cs to this:

public partial class AppDelegate : XFormsApplicationDelegate

（ついでに、using XLabs.Forms）すれば、動いた。
spring-dataとjedisを使おうとしたらしゃれにならないぐらいはまった。

## spring-data-redis

jedisを単体で使っていたがspring-dataをmysqlで使っていたので組み合わせて使おうとしたが・・
## 環境
spring4+maven3
java8

## maven設定

spring-data-redisを追加宣言。
ちなみにspring-data-redisを使う際にはjedisの定義は必須で単体定義では使用できません。

**またjedisバージョン2.4以降ではcommons-pool2が必須です。**
これを定義しないとNoClassDefFoundErrorとなるため注意。

```
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>1.6.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.8.0</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.4</version>
</dependency>

```

## applicationContext.xml設定

下記はimport用のためredis.xmlで必要な宣言のみです。

```lang:redis.xml
<bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
	p:host-name="localhost"
	p:port="6379"
	p:password=""
	p:use-pool="true"
	p:pool-config-ref="jedisPoolConfig" />
        
<bean id="redisTemplate" 
	class="org.springframework.data.redis.core.RedisTemplate"
	p:connection-factory-ref="jedisConnFactory"/>

<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"
	p:maxTotal="150"
	p:minIdle="5"
	p:maxIdle="15"/>
```

## 実行するが・・

```
nested exception is java.lang.ClassNotFoundException: redis.clients.jedis.JedisPoolConfig
```
## 解決方法

試行錯誤の上、依存関係の問題か全て最新バージョンにすると正常動作しないようなので、下記のようにバージョンダウンして対応。


 - spring-data-redis -> 1.4.0.RELEASE
 - jedis -> 2.6.0
 - common-pool2 -> 2.3

ちょっとすっきりしませんが、取り急ぎ動作確認は完了。
spring-data-redisはバージョンによって必要なライブラリやそのバージョンが異なるため注意が必要です。

***

jedis単体でも実用には問題無いですが、spring-dataと組み合わせることで
springが提供しているコネクションプールなどが使えるため非常に便利です。
Slim でURL をテキスト中に埋め込む方法


Rails tutorial 5章で slimを使ってみようとしました。
テキスト中にURLを埋め込む方法がググッてもなかなか出てこなかったので、色々試行錯誤していました。
そうすると出来ました。

```slim
	h2
		| This is the Home page for the  
		= link_to "Ruby on Rails Tutorial", 'http://www.railstutorial.org/'
```

改行してインデントして、パイプを書くことがポイントみたいです。
VisualixirでElixir/Erangノード内部を覗いてみる

# はじめに
Elixir/Erlangで書かれたプログラムはErlang VMという処理系で実行されています。VM内部では軽量プロセスと呼ばれる処理の実行単位が互いにメッセージを送りあったり、`link`や`monitor`を使って監視しあい並列分散的に全体的な処理を前に進めます。
軽量プロセス間の関係はElixir/Erlangプログラムのキモで図を用いての理解が広く行われていますが、意外にもその可視化はErlang標準の`observer`というモジュールしか有力なものがありませんでした。
本稿では最近リリースされた`visualixir`というElixirで書かれた軽量プロセスのビジュアライジング・ツールを紹介します。

# Visualixrとは
簡潔にまとめると以下のような感じです。

* https://github.com/koudelka/visualixir
* Elixir/Phoenix製
* サーバを立ててブラウザで見る
* Erlang VMノードならプログラムがErlangで書かれていようがElixirで書かれていようが問題ない

# 使ってみる
### 必要なもの
* Elixir1.0以上がインストールされた環境
* npm(バージョンが新しすぎると`npm install`に失敗しました。バージョン依存があるかもで。`2.1.17`だとうまくいきました)
* Chrome（動作確認されているブラウザ）

### インストール
https://github.com/koudelka/visualixir/blob/master/README.md に書かれている通り。

```bash
mix deps.get && mix compile && npm install
elixir --sname visualixir --hidden -S mix phoenix.server
```
これでノードがたちあがりサーバが立ったのでブラウザて`http://localhost:4000`を叩いてみましょう。

### 自身のノードを覗いてみる。
`visualixr@~~`という名前でつくったノードがvisualixir自身がいるノードです。ノード名をクリックするとノード内のプロセス間グラフ構造が現れます。
![visualixir](https://i.gyazo.com/2bef15590e29afffe774689d5ceb111e.png)
簡単に移動拡大縮小ができるのが素晴らしい。プロセスをドラッグするとボヨンボヨン動きます。

### Erlangノードを覗いてみる
せっかくなんでErlangシェルを立ち上げてノードを見てみましょう。

ノード名を指定することを忘れずにシェルをたちあげます。

```bash
﻿﻿erl -sname hoge
```

ノード名を直接書いてもうまくいかないことが多いので（まだ安定してないんでしょうか？）しばらく待ってからブラウザをリロードしてみましょう。ノード同士が互いに認識しあっていると`hoge@~~`が選択できるようになっているはずです。

![erl_shell](https://i.gyazo.com/c54259e4057f5a4df8cf0c8448a432ef.png)

バックグラウンドでこれだけのプロセスがいるんですね。新しくプロセスを作ってみましょう。

```erl
(hoge@massn)1> Pid = spawn(fun() -> timer:sleep(infinity) end).
<0.76.0>
```

![erl_shell2](https://i.gyazo.com/f0a8d46f60542ff458ed08bed7793f2e.png)

孤独なプロセスができましたね。PIDを忘れてしまうと生き続けてしまいます。spawn_linkしてみましょう。

```erl
(hoge@massn)2> Pid2 = spawn_link(fun() -> timer:sleep(infinity) end).
<0.79.0>
```

![erl_shell3](https://i.gyazo.com/cf25aeca254065ed9816b6311566a5ca.png)

今度はlinkされているので母体のプロセスにつながっていますね。最後にプロセスを作りまくってみましょう。

```erl

(hoge@massn)3> lists:map(fun(_) ->
(hoge@massn)4> spawn_link(fun() -> timer:sleep(infinity) end)
(hoge@massn)5> end, lists:seq(1, 50)).
[<0.88.0>,<0.89.0>,<0.90.0>,<0.91.0>,<0.92.0>,<0.93.0>,
 <0.94.0>,<0.95.0>,<0.96.0>,<0.97.0>,<0.98.0>,<0.99.0>,
 <0.100.0>,<0.101.0>,<0.102.0>,<0.103.0>,<0.104.0>,<0.105.0>,
 <0.106.0>,<0.107.0>,<0.108.0>,<0.109.0>,<0.110.0>,<0.111.0>,
 <0.112.0>,<0.113.0>,<0.114.0>,<0.115.0>,<0.116.0>|...]
```

めっちゃできました。

![erl_shell4](https://i.gyazo.com/bb6b49a3053bb8d49a031265ccdcccae.png)



# まとめ

勉強用、デバッグ、システム運用といろいろ使えそうですね。
【CSS】レスポンシブWebページで装飾枠を適応させる方法と注意点

<h1>はじめに</h1>
この記事は<a href="http://www.adventar.org/calendars/1043">【その1】ドリコム Advent Calendar 2015 - Adventar</a>の13日目の記事です。
12日目はdanchoさんの「<a href="http://c-dancho.hatenablog.com/entry/2015/12/12/220703">運用をいい感じにしてみんなで幸せに働きたい</a>」です。
コチラもぜひ<a href="http://www.adventar.org/calendars/1044">【その2】ドリコム Advent Calendar 2015</a>

<h1>自己紹介</h1>
Webデザインをやっていますがキャラクター作りをやってると
楽しくなっちゃう系Webデザイナーです。
休日はかつて作ったFlashの動きをCSSアニメーションで再現してみようと
躍起になっています。
あと飼い猫と遊んで（もらって）います。

<h1>本題</h1>
Webサイトで見られる以下のような装飾枠をCSSスプライトのテクニックを使い、
レスポンシブ対応のWebページでも崩れず表示させる方法を紹介します。
![image1.gif](https://qiita-image-store.s3.amazonaws.com/0/105343/0d2e615e-0c69-8a3b-a571-df7abbc4f4cf.gif)


<h1>1.画像を用意</h1>

　２枚の画像を用意します
　
![image2.gif](https://qiita-image-store.s3.amazonaws.com/0/105343/78c16614-b5a4-8db2-d589-2a83125b0efe.gif)


　
　上記画像のように"四方を囲う"画像（図１）と"角"画像（図２）を用意します。
　画像は表示させる枠の最大縦横幅を考慮して大き目に作りましょう。
　表示枠のmax値を設定し、画像が途中で途切れてしまわないようにするのも大切です。

<h1>2.スタイルを作成</h1>
<pre>
.frame {
　  background-image: url(frame.border-corner.png),  /*** 左上角 ***/
　                    url(frame.border-corner.png), /*** 右上角 ***/
　                    url(frame.border-corner.png), /*** 右下角 ***/
　                    url(frame.border-corner.png), /*** 左下角 ***/
　                    url(frame.border.png),        /*** 上 ***/
　                    url(frame.border.png),        /*** 右 ***/
　                    url(frame.border.png),        /*** 下 ***/
　                    url(frame.border.png);        /*** 左 ***/
    background-repeat: no-repeat;
    background-position: left top, 
                         right top, 
                         right bottom, 
                         left bottom, 
                         center top, 
                         left center, 
                         center bottom, 
                         left center;
　}
</pre>

　先に指定した方が重なりの上になり、最後の指定が重なりの一番下となります。
　
![image3.gif](https://qiita-image-store.s3.amazonaws.com/0/105343/00edfcfe-fa07-fe36-1bab-f5205baf7593.gif)

<h1>3.注意点</h1>
　【画像サイズの制限】
　iOSで画像が表示されないケースがあり調べたところ
　Mobile Safariで画像サイズの制限があるようです。
　検証が出来ていないため詳しく説明できませんが
　iOS/Android共に画像の一辺が2048pxを超えるとまずいようです。

　【box枠の外側にはみ出るような装飾には向いていない】
　背景画像として指定しているのでbox枠の領域をはみ出しての表示はできません。
　それはまた別の方法と組み合わせるなど一工夫必要になります。
　

<h1>まとめ</h1>
今回はレスポンシブ対応の装飾付きの枠デザインの作り方を紹介しました。
上記の方法だと大きな画像が必要になりますし、
枠内のテキストなど情報が多くなると縦幅が足りなくなるといった欠点もあります。

小さな画像８枚で同じように再現することは可能ですが、
HTTPリクエスト数の削減のためと模索した結果このような形に落ち着きました。

スマホ画面の拡大化が進む中、未だ横幅320px固定のデザインを多く見かける昨今。
試してみてはいかがでしょうか。
コマンドラインからownCloud上のフォルダーを共有設定する方法について

コマンドラインからownCloud上のフォルダーを共有設定する方法について

ownCloud を利用していてフォルダー共有をまとめて実施したい事があると思います。
Web から設定するのは非常に大変ですのでコマンドラインからまとめて設定できると便利ですよね。

ownCloudには共有設定用APIがあるので、これをcurlコマンドでつつけばまとめて設定できます。

細かい話は、ここに書いてあったり、
API一覧 | ownCloud.jp
http://owncloud.jp/solutions/platform/api

ここに書いてあったりするわけですが、
OCS Share API — ownCloud Developer Manual 8.2 documentation
https://doc.owncloud.org/server/8.2/developer_manual/core/ocs-share-api.html

実際に使ってみるというのも良いことなのでやってみましょう。

##1. 共有一覧取得
まず、共有されている一覧を取得します。GETなので、簡単です。  

```lang:shell
curl "https://<owncloud_host>/ocs/v1.php/apps/files_sharing/api/v1/shares" -k -u <ID>:<PW>
```
> owncloud_host ： ownCloudサーバーを指定します。
> ID：ログインIDを指定します。
> PW：パスワードを指定します。

##2. パス指定で共有情報取得
1だと全部出てきて面倒な場合は、指定したパスのみの情報を取得することもできます。
これもGETで取得できます。  

```lang:shell
curl "https://<owncloud_host>/ocs/v1.php/apps/files_sharing/api/v1/shares?path=<DocumentPath>" -k -u  <ID>:<PW>
```
指定するパラメータが一つ増えます。
> owncloud_host ： ownCloudサーバーを指定します。
> ID：ログインIDを指定します。
> PW：パスワードを指定します。
> DocumentPath：ドキュメントファイル/フォルダーへのパスを指定します。

##3. 共有を設定
共有情報は取得できたので、共有を実際にしてみましょう。
今度はPOSTになります。

```lang:shell
curl "https://<owncloud_host>/ocs/v1.php/apps/files_sharing/api/v1/shares" -l -k -u <ID>:<PW> -X POST --data-urlencode "path=<DocumentPath>" --data-urlencode "shareWith=<ShareWith>" --data "shareType=<ShareType>&permissions=<Permission>"
```
> owncloud_host ： ownCloudサーバーを指定します。
> ID：ログインIDを指定します。
> PW：パスワードを指定します。
> DocumentPath：ドキュメントファイル/フォルダーへのパスを指定します。
> ShareWith：共有するユーザー名もしくは、グループ名
> ShareType：ShareWithで共有する対象がユーザー(=0)、グループ(=1)、URL(=3)、クラウド連携(=6)を指定します。
> Permission：読み書きする権限。1 = 読み込み; 2 = 更新; 4 = 作成; 8 = 削除; 16 = 再共有; 31 = 全て (デフォルト: 31, URL共有時: 1)

その他、URL共有時にのみ使えるオプションとしては、
> publicUpload：アップロード許可(true/false)
> password：パスワード文字列
を指定することができます。

ファイル、フォルダー名、ユーザー名、グループ名は、UTF-8で送れば日本語もOKです。
curlのオプション  --data-urlencode でデータをPOSTしてください。
openFrameworksでメインディスプレイ除いたマルチディスプレイなフルスクリーン

#メインディスプレイにMaxとか置きたい人向け

外部ディスプレイ２発とかでフルスクリーンをしたい時、
ofAppGLFWWindowのsetMultiDisplayFullscreen(true)とかでやると、
**PCのメインディスプレイまでフルスクリーンの対象**になって色々悲しみが深い。

ので、例えばこういう配置にしてやって、

![スクリーンショット 2015-11-10 19.20.02.png](https://qiita-image-store.s3.amazonaws.com/0/100022/88344cc1-d6aa-a699-75d5-db405bd77aee.png)


`ofSetFullscreen(true);
 ofSetWindowShape(APP_WIDTH, APP_HEIGHT);
 ofSetWindowPosition(0,1280);`

と一気に呼んでやると幸せになれる。

この時のAPP_WIDTHとAPP_HEIGHTはフルスクリーンにしたい画面サイズなので、
一画面が1920 * 1080とかだったら、3840 * 1080にする。
2048はメインディスプレイの縦サイズ。
iOS開発に「WakaTime」を導入してみたらなかなか良かった件

#なぜ「Wakatime」導入？？
まずこちらの記事に触発されたのが大きい。
[「Swiftを使ってモダンなWeb APIクライアントを爆速で開発する」]
(http://qiita.com/giginet/items/1e64f584f948661cffd1)

あとは最近、とあるIT企業の新プロジェクトにiOSエンジニアとして、リモートワークすることになり、私自身学生とは言え、ちゃんとしたお金が出る仕事ということで業務把握・管理のため「Wakatime」を今回導入しようと思いました。

##1. まずは、Xcodeに「Alcatraz」を追加

* インストールはターミナルから以下のコマンドで簡単にできる

`curl -fsSL https://raw.github.com/alcatraz/Alcatraz/master/Scripts/install.sh | sh
`

* 次は、Xcodeを起動して、上のメニューから「Window」ー＞インストール前にはなかった「Package Manager」をクリック

* あとは、「Wakatime」と検索してインストールをクリックでOK！

##2. Xcodeを再起動
インストールが終われば、一旦Xcodeを終了して再起動。その際にWakatimeの使用が初めてならAPIキーの入力を求められるので、Wakatimeのサイトから確認して入力すれば準備完了。
![image](https://qiita-image-store.s3.amazonaws.com/0/41385/3412e7e9-7365-3805-f2ed-32f6c0b55591.png)

##導入してみた感想
「進歩具合のわりに時間かかりすぎぃぃーーー！！」というのがちゃんと可視化されているので、生産性向上の良いプレッシャーになります。Xcodeだけじゃなく、WebStormやSublime、Atomでも使えるみたいだし他のエンジニアにも勧めやすい便利なツールですね！

![image](https://qiita-image-store.s3.amazonaws.com/0/41385/eae1b854-b153-a6b4-0615-acb6af97c3ae.png)
多重ループから抜ける

breakは、現在のblockを抜けるだけ。
多重ループを抜けるには、下記。

```ruby:escape.rb
isBreak = false
10.times do |i|
  10.times do |j|
    if hoge()
      isBreak = true
      break
    end
  end
  break if isBreak
end
```
mkTable # ２元配列の作成

行と列が違う可能性がある場合は、下記。

```ruby:mkTable.rb
def mkTable(n, m)
  Array.new(n) { Array.new(m) }
end
```

行と列が等しいことがわかっている場合は、下記でOK。

```ruby:mkTable.rb
def mkTable(n)
  Array.new(n) { Array.new(n) }
end
```
リーダブルRspec

# はじめに

リーダブルRspecというタイトルつけましたが、そんな大それたものではないです
テスト書くときでも名前付け重要だからちゃんとしよう!っていうだけの内容です

RspecがBDDのためのツールであることを意識しつつ、
Rspecの流儀に則って適切に名前付けをして書くと読みやすいテストがかけるはずです

# describe/context/exampleのメッセージに適切に名前つける

これが出来るだけで当然読みやすいテストになる

describe->テスト対象
context->テストする状況
example->テスト(itやspecify)
なので、
『aaaはbbbの時cccになる』
というテストを書くときは次のようになる

```ruby
describe 'aaa' do
  context 'when bbb' do
    it 'should eq ccc'
  end
end
```

重要なのは

- describe/context/exampleだけでテストの概要を説明すること
  - 理解しやすい状態になっていないと、負債になってしまう
- 1つのdescribe/context/exampleの中で複数のことをテストは避ける
  - 複数のことをテストするようになると、describe/context/exampleのメッセージが曖昧になって理解しづらくなる可能性がある
- そのためにdescribe/context/exampleをきちんと分けること

### とりあえず日本語で書いてみよう

英語得意でない人はdecribe/context/exampleを日本語で書き出してみてから英語に直すと良い

```ruby
describe 'aaa' do
  context 'bbbの時' do
    it 'はCCCになる'
  end
end
```


- decribe/context/exampleを日本語でまず全部書き出してみる
  - この時にexampleの中身やletなどは書かない
- 全部書き出し終わって違和感がなくなったら、英語に直しつつexampleの中身などを書いて埋めていく
- はじめに書いたdecribe/context/exampleに固辞せず臨機応変に変える
  - はじめに書いたdecribe/context/exampleでは書きづらかったり過不足があったりすることがあるので

# shared_context, shared_examples_for

DRYということばを盾に使われることがあるが、その殆どが読みづらさにつながることが多い
テストを書くときはDRYよりも読みやすさを重視したほうが良いというのはよく言われる
ので、shared_xxxはあまり使わないほうが良いし使うとしても節度を持って使うこと

## shared_contextはcontextをshareするもの

いろんな使われ方をするが、
基本的な使い方としては文字通りcontextをshareするもの、というのを意識する

```
aaaはxxxの時cccになる
dddはxxxの時eeeになる
```

というテストをshared_contextを使って書くと次のようなテストになる

```ruby
shared_context "xxx"

describe 'aaa' do
  context 'when xxx' do
    include_context "xxx"
    it 'should eq ccc'
  end
end

describe 'ddd' do
  context 'when xxx' do
    include_context "xxx"
    it 'should eq eee'
  end
end
```

この使い方が一番ベーシック

ほかにも色々な使い方があると思うけど、
どういうcontextをshareしてるのかわかるようなメッセージを書くこと


## shared_examples_forはit_behaves_likeでメッセージ決める

`shared_examples_for 'hoge'`でメッセージを考えるよりも
`it_behaves_like 'hoge'`で考えるほうが良い名前がつけやすい

```ruby
describe 'aaa' do
  context 'when bbb' do
    it_behaves_like 'hoge'
  end
end
```

例えばこういうテストがあった時に
『aaaはbbbの時にhogeのように振る舞う』と読める
これが違和感無いようにメッセージを決めると良い

『hogeのように振る舞う』なので

```ruby
it_behaves_like 'a collection'
it_behaves_like 'a listable resource'
it_behaves_like 'a joinable room'
```
のように名詞が入るのが普通(のはず。英語・国語苦手...)

# まとめ

- 名前付けちゃんとして、読む人のために読みやすいテストを書きましょう
- 英語苦手なら日本語でまず書いてみましょう
- あと[betterspecs](http://betterspecs.org/jp/)読みましょう
    - ほかにもリーダブルなテストを書く方法は色々あるので常に模索しましょう
Snap.svgを使ってみた

[こちらの記事](http://qiita.com/seito2014/items/07908cb732a62b40fd72)の内容を自分も試してみたので忘備録。


* [Snap.svg](http://snapsvg.io/)
* [svg対応状況](http://caniuse.com/#feat=svg)

## 準備
* イラレでsvg画像を作成(変形後と変形前の2種類)
* 作成した画像のsvgパスを取得(イラレで別名保存時に、「パスを表示する」的なボタンがあるのでそこから取得できる)
* 使うのは、取得したパスのみ。

## DEMO
CODEPENをご覧ください :smiley_cat: 
<p data-height="268" data-theme-id="17596" data-slug-hash="QyjYpG" data-default-tab="result" data-user="takuchan" class='codepen'>See the Pen <a href='http://codepen.io/takuchan/pen/QyjYpG/'>svg animation with Snap.svg.js</a> by takuchan (<a href='http://codepen.io/takuchan'>@takuchan</a>) on <a href='http://codepen.io'>CodePen</a>.</p>
<script async src="//assets.codepen.io/assets/embed/ei.js"></script>

## はまったとこ
* 変形後と変形前でアンカーの数が異なると、アニメーションがぐちゃぐちゃになる。
* jsでpathをappendしようと考え、

~~~
document.createElement('path');
~~~

としていたが、pathを作るときは、

~~~
document.createElementNS("http://www.w3.org/2000/svg","path");
~~~

としないと、正しいSVGElementのpathとして生成されない。

## 感想
* Snap.svgを使うと今回のようなアニメーションは簡単に実装できる。
* 「svg画像の調整→パスの取得→コードにパスの埋め込み→svg画像の調整」という作業をデザイナー、コーダー間でやり取りすると、かなり手間が増える気がする。
* コーダーもイラレ(ベジェ曲線)が使いこなせないと、きれいなアニメーションは難しい。
* 逆に、調整はパスを変更するだけなので、コーダーじゃなくてもできる？


## 追記
* IE11(VirtualBox)で確認したところ、svgのサイズが幅いっぱいにならずに、常に固定サイズで表示されてしまうという問題があった。
* これは、バグというよりも、

>単にSVG1.1の仕様をIEがまだ実装していないだけであり、実は、IEはCSS2.1の仕様に沿ってフォールバックを適切に（？）働かせている

ということらしい。(参考：http://asamuzak.jp/html/483)

### 結論
* svgに対してheightを100%で当てていたが、これだとうまく高さが効かない。
* svgの親要素のpadding-topに表示したいsvgのアスペクト比を当ててあげる(imgでよくやるやつ)とうまく高さが当たったように見える。(IE11, IE10, IE9, Safari, Firefox, Chrome, ios Safari(9.2), ios Chrome)