OmniAICreator/Qiita-1.07M huggingface dataset:
Docker for Macを使っているとストレージ容量不足になる問題をなんとかする

# Docker for Macの問題点
[Docker for Mac](https://docs.docker.com/engine/installation/mac/#/docker-for-mac)を使っていると、ローカルのストレージ容量をどんどん圧迫してくる問題があります。

`~/Library/Containers/com.docker.docker/`が、イメージやコンテナを削除しても縮小されないのが原因で、
下記のコマンドを実行するとどれだけ容量圧迫しているか確認できます。

```zsh
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$ 
$ docker images -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
$ 
$ # この例だとコンテナやイメージが一切なくても、37GBもストレージを使用されています
$ 
$ ls -lh ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2
-rw-r--r--  1 ktsujichan  staff    37G 12  3 23:39 /Users/ktsujichan/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2
```

この問題はDocker for MacのGitHubリポジトリで[Issue](https://github.com/docker/for-mac/issues/371)も上げられていますが、
本記事投稿時点ではまだ解決されていません。

# とりあえずなんとかする
イメージのキャッシュが保存されているので、起動時に早くなるメリットもありますが、
長期間開発していると無駄なキャッシュが残っていたり、数十GBもストレージを使ってしまうデメリットも大きいので、
定期的にすべて削除するのがよいかと思います。

```zsh
$ docker rm $(docker ps -a -q)
$ docker rmi $(docker images -q)
$ docker volume rm $(docker volume ls |awk '{print $2}')
$ rm -rf ~/Library/Containers/com.docker.docker/Data/*
$ 
$ ls -lh ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2
-rw-r--r--  1 ktsujichan  staff   320K 12  4 01:15 /Users/ktsujichan/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2
```

初回起動時はキャッシュがないので若干起動に時間がかかりますが、
ストレージに大幅な空き容量ができるので、定期的に整理するのがオススメです。
マルチプラットフォーム対応したライブラリ Golang

C言語 Advent Calendar 2016を書く人が少ないので、、
C言語に触っていたころを思い出して書いてみようと思いました。

### ここから

昨年度の私はマルチプラットフォーム対応へ苦悩した挙句、
> マルチプラットフォーム対応したライブラリを再開発するのはそろそろやめたい、と考えているあなた、jreのライブラリをlinkしてしまえばいいのでは...(震え声)
http://qiita.com/nothingcosmos/items/935cd0b9d62ef01ddddc

などとつぶやいていましたが、身近なところに
便利なマルチプラットフォーム対応したライブラリが存在することに気づきました。
そう、みんな大好き、Golangである。

### Golangの資産をshared library化するc-shared


c-sharedとは、GolangをC言語向けのshared libraryとしてビルドするモードです。
Golangの資産をCから利用できるって最高だと思いませんか。

c-sharedに関してはこちらの記事を参考にしました。
試す場合はLinuxやMac環境を推奨します。

http://qiita.com/yanolab/items/1e0dd7fd27f19f697285

Golangのcgo周りには暗黙の了解とかが多くて、
その暗黙の了解に反すると意味不明なエラーメッセージで煙にまかれてしまうことが多い
です。

上述のリンク先でも説明されていますが、重要な点は以下の4点です。※ 抜粋

- パッケージは main でないと生成できない。
- main関数は実行されないが宣言する必要がある。
- エクスポートしたい関数にコメントで「//export funcname をつける。」（cgoと同じ）
- init は ライブラリロード時に実行される

```go:main.go

package main

import (
  "C"
  "fmt"
  "io/ioutil"
  "net/http"
  )

//export request
func request(url string) ([]byte, error) {
  resp, err := http.Get(url)
  //error握り潰し、だめ、ぜったい
  if (err != nil) {
    return nil, err
  }
  defer resp.Body.Close()
  return ioutil.ReadAll(resp.Body)
}

func init() {
  fmt.Println("Loaded!!")
}

func main() {
}
```

build方法(Linux(x64)で試してます)

```shell:example

$ time go build -buildmode=c-shared -o libgo.so main.go
real  0m6.494s
user  0m9.264s
sys 0m1.432s

-rw-rw-r-- 1 elise elise    1393 12月  4 00:47 libgo.h
-rw-rw-r-- 1 elise elise 6406448 12月  4 00:47 libgo.so
```

結構時間かかります、さすがnetライブラリ、サイズ6MBだよ

生成された関数を確認してみます。libgo.hを参照

```C:libgo.h

/* Return type for request */
struct request_return {
  GoSlice r0;
  GoInterface r1;
};

extern struct request_return request(GoString p0);

typedef struct { const char *p; GoInt n; } GoString;
typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
typedef GoInt64 GoInt;

```
//exportでコメントしたGoの関数がexportされています。
また、Goで生成されるcgoのboilerplateは非常に興味深いです、
特にstructをreturnするあたり、しかしここでは割愛。
Golangのerrorってinterface{}で困ってしまいます。
どうしようこれ、error codeに変換するhelper書かないとだめかなー？

### CからGoのライブラリを呼び出してみる

goのソースとCのソースを同居させると、
golangでbuildした際にCのソースコードまでcgoの対象だと勘違いして読みに行ってしまうようなので、
Cのソースコードはディレクトリを分けて書いてみました。

```C:C/main.c
#include "libgo.h"
#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[]) {
  GoString arg = {argv[1], strlen(argv[1])};
  struct request_return ret = request(arg);
  printf("%lld,%s\n", ret.r0.len, (char*)ret.r0.data);
  return 0;
}
```

```shell:ビルドと実行例
$ ls
C  libgo.h  libgo.so  main.go
$ cd C
$ clang main.c -lgo -L.. -I..
$ export LD_LIBRARY_PATH=..
$ export GODEBUG=cgocheck=0 #良い子は真似しちゃいけない
$ a.out http://example.com
```

GODEBUG=cgocheck=0ではGoのポインタの保護チェックをスキップしています。
上記コードはGoで確保されたメモリをポインタでそのまま指しちゃってますので、
GCされたらinvalid pointerになる可能性があります。

```html:実行結果
Loaded!!
1270,<!doctype html>
<html>
<head>
    <title>Example Domain</title>
    ...
```

### まとめ

ここまで書いたが、Windowsではbuildmode=c-sharedが動かず、
c-archiveモードしかサポートしていないようなので、
もうひと工夫必要である。。
http://mattn.kaoriya.net/software/lang/go/20160405114638.htm
2の補数表現の考え方

#はじめに
たまに「2の補数表現」がわかりづらいという意見がありますので
自分なりにイメージしやすいようにメモしました
2の補数表現を知らない方は「10進数で考える」まで読み飛ばしたほうがいいかもしれません

#2の補数表現とは

>2の補数（にのほすう）は、2、ないし2のべき乗の補数、またそれによる負の値の表現法である。特に二進法で使われる。
頭の部分の1個以上の0を含む（正規化されていない）ある桁数の二進法で表現された数があるとき、その最上位ビット (MSB) よりひとつ上のビットが1で、残りが全て0であるような値（8ビットの整数であれば、{100000000(2)=256}）から、元の数を引いた数が2の補数である。MSBの重みが1であるような固定小数点表現の場合は特に「2」の補数となる。

refer from [Wikipedia](https://ja.wikipedia.org/wiki/2%E3%81%AE%E8%A3%9C%E6%95%B0)

要するに
**「表現できる最大値に1を加えた値」を基準にプラスとマイナスの値を半々に割り振ったものである**
#2の補数の特徴

1. bit数を「N」とおいたとき,表現できる値は**「-2^(N-1)」から「2^(N-1)-1」**となる
2. 値が**プラスの時最上位bitは「0」**になり,**マイナスの時最上位bitが「1」**になる
3. 2の補数で表現された2つの値を加算すると**マイナスの値を加味した計算**になる
4. **ビット反転して1を足すと符号が反転する**
5. 3.と4.の特徴より**加算器をほんの少し改良するだけで加減算器にできる**

#10進数で考える
上の説明だけではイメージがつかないと思うので10進法で考えます
最大で表現できる桁を4桁だとします
『「表現できる最大値に1を加えた値」を基準にプラスとマイナスの値を半々に割り振ったものである』
より10000が基準に半々に割ると
-5000～+4999が表現できる範囲です(0は正の値として扱われます)
また10000を基準にプラスとマイナスを考えると
「+0～+4999」は「10000～14999」ですが4桁しか表現しないので「0000～4999」のまま
「-1～-5000」は「9999～5000」となり
「0000～9999」が定義できています
このことを踏まえて上記の「2の補数の特徴」内の5つの特徴について考えていきます

##特徴1
桁数をNとすると-5*10^(N-1)～+5*10^(N-1)-1になる
つまり桁数を1から考えると
-5～4
-50～49
-500～499
・・・
となるわけです
正と負で半々に割って「0」の分を正に含むので正は「-1」となっているということです

##特徴2
わかりづらいですが最上位の桁の値が**正の時は4以下,負の時は5以上**であるという意味です
2進数だと**正の時は0以下,負の時は1以上なので0と1しかない**のでまとめてあります
これは特徴1の定義域を考えると一目瞭然ですね

##特徴3
例えば(-1)+(+5)をやろうとすると対応する値より
(9999)+(0005)=(10004)となり
4桁しか入りきれないので(0004)となります
なぜこのようにうまく計算できるかというと
(-1)は5桁目を無視できるという特徴からいいかえると(10000-1)です
そこで
(10000)+(-1)+(0005)=(10000)+(0004)= ~~(10000)~~+(0004)
となりマイナスを考慮した演算になります

##特徴4
10進数でビット反転に該当するものは足して「9」になる数字に変えるということです
4なら5,2なら7,0なら9とかです
つまりビット反転した値は「9999」から引いた値ということです
そのことを踏まえてビット反転した値に1を足してみると
(9999)-(XXXX)+(1)=(10000)-(XXXX)=~~(10000)~~-(XXXX)
となりマイナスの値になります

##特徴5
計算機で加算を行う際は一番下の桁同士を足しあって繰り上がれば次の桁にその情報を渡して,
次の桁では同じ桁同士と先ほどの繰り上がりを足しあって繰り上がり情報を出して・・・
という風に筆算を行うように計算しています※
(※厳密には桁上げ先見構造が取られていたりしますが今回は気にしなくていいです)
桁ごとに同じことをやっているので
「2つの値」と「繰り上がりの値」から「その桁の値」と「繰り上がりの値」を出すパーツを桁数分つなぎ合わせることによって加算を行います

一度話が戻りますが特徴3,特徴4より減算を行うには片方をビット反転して1を足すことでマイナスにして加算すればいいわけです
なので
A-B=A+(反転B)+1と書けます

1@X = (反転X)
0@X = (X)
となるような式を使うと
A-B=A+(1@B)+1
と書けます

一方で加算は
A+B=A+(0@B)+0
とも書けます

なので減算したい時に1,加算の時は0という入力(s)を使うと
A±B=A+(s@B)+s
とまとめられます
ここでさっきのパーツについて考えると
１桁目には下の桁から繰り上がりの情報は来ませんので,減算するときは1桁目の繰り上がり値に1を入れればいいわけです
これによって簡単に加減算器ができるわけです

#さいごに
自分が書いた内容を改めて見たのですが,結構読みづらいですね・・・
もう少し図も追加した方がいいかもしれません
見やすくなるような意見がある方はコメントを書いていただけるとありがたいです
もちろんそのほかのコメントも大歓迎です

長文になってしまいましたが読んでいただきありがとうございました
以上「2の補数表現の考え方」でした
Swift愛好会合宿 1日目 レポート

玉城です、本日はSwift愛好会の合宿に参加しているので、
ついでにこのネタのレポートでAdvent Calendarを埋めたいと思います。

## 9:30 渋谷集合
まずは渋谷に集合
![01_0930.png](https://qiita-image-store.s3.amazonaws.com/0/11776/53af1749-d26b-e504-5e07-71c6851c7f5b.png "01_0930.png")


## 10:13 日暮里
日暮里に移動、途中他のメンバと合流
![02_1013.png](https://qiita-image-store.s3.amazonaws.com/0/11776/803e5c6e-2a44-5148-9d89-cc3d4d242825.png "02_1013.png")


## 12:33 笹川駅
笹川でほぼ全員集合
![03_1233.png](https://qiita-image-store.s3.amazonaws.com/0/11776/9c87dece-9619-b049-15ad-5e582d69f1b4.png "03_1233.png")


## 12:40 青柳亭
昼食
![04_1240.png](https://qiita-image-store.s3.amazonaws.com/0/11776/6ad2b7d9-26c6-3793-d1d5-7e72b6f06240.png "04_1240.png")


## 13:45 土善旅館
到着
![05_1345.png](https://qiita-image-store.s3.amazonaws.com/0/11776/09bb5113-add3-5c72-b1d0-6149fb69e195.png "05_1345.png")


## 13:50 会議室
黙々開始
![06_1350.png](https://qiita-image-store.s3.amazonaws.com/0/11776/6c195f1f-04b3-dcca-5760-30e87daa832b.png "06_1350.png")


## 19:15 夕食
![07_1915.png](https://qiita-image-store.s3.amazonaws.com/0/11776/74bc6280-bdea-7627-8fdd-76dc24c8ff5c.png "07_1915.png")
![08_1935.png](https://qiita-image-store.s3.amazonaws.com/0/11776/4cbd9d03-b594-a710-67f7-ab15df4fcab4.png "08_1935.png")



## 21:00 再開
![09_2100.png](https://qiita-image-store.s3.amazonaws.com/0/11776/6e5606a1-c8ea-35a6-46a2-8a034ea93a27.png "09_2100.png")


七島さんからのこの一年の振り返り
![10_2130.png](https://qiita-image-store.s3.amazonaws.com/0/11776/8da3c3e0-62f9-9ad8-d647-1f643146706b.png "10_2130.png")

## 21:30 ~
夜は続く...

#1日目のタイムラプス
[![タイムラプス](http://img.youtube.com/vi/OpUrt1rMQmE/0.jpg)](https://www.youtube.com/watch?v=OpUrt1rMQmE)

# 特撮風キャプションをImageMagickでつける方法
こんなスクリプトでサクッとキャプションをつけてみました。シンゴジっぽい？

`convert -resize 640x640 -font "/System/Library/Fonts/ヒラギノ明朝 ProN W6.ttc" -gravity South -fill white -pointsize 50 -annotate +0+44 "19:15 とりあえず　乾杯" ../origin.jpg out.png`

以上
A React Inspired UI framework in Pure Ruby

この記事は[Opal Advent Calendar 2016](http://qiita.com/advent-calendar/2016/opal)の3日目の投稿として書いています。

今日は[RubyConf Taiwan 2016](https://2016.rubyconf.tw)の2日目です。今日は[Devid Chang](https://2016.rubyconf.tw/#David Chang)の発表があったのでそのことについて書きます。

今回の発表は[React.rb](https://github.com/zetachang/react.rb)の話をするのかと思っていたら、タイトルを見てびっくり。なんとあたらしくPure Ruby(Pure Opal?)で書きなおしたものを発表していました。
AtollとなずけられたそのライブラリはReact.rbのようなReactのラッパーではなく、Rubyだけで書かれたものでした。
わたしとしては、[Hyalite](https://github.com/youchan/hyalite)のReact.rbとの差別ポイントはそのへんだったので驚きです。

使いかたもまあ当然ですが、同じような感じです。
違う点としては、これはReact.rbでもそうなのですが、`component_will_mount`のようなメソッドをオーバーライドするのではなく、`before_mount`というメソッド呼びだしでDSL的に書ける点や、JSXの替りのShortHand記法が、

`h('div', {...}, h(...), ...)`
のような感じで、`h`というメソッドの呼びだしになっているところです。このへんは好みの問題と言えるでしょう。

## Learn once write anywhere
Davidの発表では、*"Learn once write anywhere"*というはなしがありました。
これはもちろん、React nativeのような話で、RubyMotionを使って同じような方法でモバイルのアプリケーションのUIも作れるということでした。このアイデアもわたしがRubyKaigi 2015で発表したときのアイデアがまるかぶりでびっくりしました。(わたしの発表から想起したものという話ではないようですが)

## Server-side rendering
Server-side renderingの話もありました。サーバーサイドのオブジェクトはMashallしてページに埋め込むというような話をしていました。このあたりの話は具体的なことはよく分りませんでしたが、面白い発想だと思いました。

## Davidと話をしてみました
Davidもわたしのトークを聴いていたようなので、声をかけて話をすることにしました。
気になっていたのは、React.rbもあって今回のAtollもあり、Hyaliteもあり他にもOpalのVirtual DOMの実装はいくつかあります。
こんなに同じようなプロダクトがたくさんある状態はどうなんだ?ということ聞いてみたら、面白いからいいんじゃないかと言っていました。
またHyaliteはReactのソースを見てRubyで書き起したものですが、Atollは[Preact](https://github.com/developit/preact)を元にしているということでした。こうやってちょっとずつ違うプロダクトがいくつも発生してそのうちいくつか淘汰されて生きのこったものが覇者となるのでしょうね。
これだけ沢山似たようなプロダクトがあるということは方向としては多くのひとが求めているものだということなので、この中から生きのびることが出来たらいいことがあるかもしれませんね。
Vagrant入門①〜Vagrant概要とインストール編

# はじめに
Vagrantとはなんぞやという人向けの記事です。
Vagrantの概要からVagrantをインストールするところまでです。

# Vagrantとは
一言で言うと仮想環境を構築するもの！
まぁ、それだけだったらVirtualBoxだけでもできるんですが。
Vagrantにはプロビジョニング機能というものがあってですね。
ChefとかAnsibleとかの連携とか、yumとかapt-get実行できたりとか、アプリケーションやミドルウェアを自動的にセットアップできるんですね。
基本的にVagrantがインストールしてあれば、Vagrantfileというファイル一つ共有するだけで、いつでもどこでも誰でも同じ環境が作れちゃうという優れもの。
Vagrantfileでつらつらプロビジョンを書く他に、boxを作るという手もあるんですが、それはまたそのうち。
なお、今回はプロバイダにVirtualBoxを使いますが、VMwareとかAmazon EC2も使える模様。ローカルではVirtualBoxで、本番環境はAmazon EC2とかにしたら素敵ですね！

# Vagrantを使うメリット
1.開発環境の構築が簡単にできる
2.全エンジニアに同じ実行環境を提供できる 
3.実行環境を開発と本番で同じにできる
ですかね。こっちで動くのにあっちで動かない！とかいうやつをなくせますね。

# インストール方法
説明はこのへんで早速インストールしていきましょー。
前述の通りプロバイダにはVirtualBoxなのでVirtualBoxのインストールも一緒に。
なお、VirtualBoxとVagrantのインストールにはHomebrew使いまっせ。

### ・動作環境
OS : Mac OS X El Capitan 10.11.6

### ・事前準備
[こちら](http://qiita.com/izumaru_akippa/items/96cce728dac9f187ba2b)を参考にXcodeとHomebrewをインストールしておきましょう。

### ・インストール
ターミナルを起動して以下のコマンドを実行しましょう。
ついでにVagrantのプラグインのインストールもしちゃいますよー。
最後のはおまじないです。
やらないとVagrant1.8.7でboxのダウンロードに失敗する場合があります。

```bash
$ brew cask install virtualbox
$ brew cask install vagrant
$ vagrant plugin install vagrant-omnibus
$ vagrant plugin install vagrant-vbguest
$ sudo rm -rf /opt/vagrant/embedded/bin/curl
```

今回はここまでー！
次回は[Vagrant入門②〜Vagrantコマンド一覧編](http://qiita.com/izumaru_akippa/items/06f0c8c58aab3de93fcc)です！
PostgreSQLスケールアウトパターン Instagram way

アンチパターンばかり書いてきましたけど、たまにはアンチじゃないものも出しましょう。
PGConf.Asia2016 で　Tantan の Victor Blomqvistさんもやってた、Instagram方式です。

元ネタ

- [Instagram Engineering Blog](https://www.tumblr.com/dashboard/blog/instagram-engineering/40781627982)
- PGConf.Asia2016公開資料：[TantanでのPostgreSQL事例 – 2年で0から350billion rowへ](http://www.pgconf.asia/JP/wp-content/uploads/2016/12/From-0-to-350bn-rows-in-2-years-PgConfAsia2016-v1.pdf) Victor Blomqvist

# DBのスケールアウト

Webサービスが順調に成長すると、顧客当たりのデータ量が徐々に増える、顧客が増えるで、DBのデータ量も増えていきます。
Apache/Tomcatの能力不足は、セッション管理だけ最初に注意して構成しておけば10や20に台数増やしていくのは容易な話で、問題はDBをどうするかです。

1台のDBServerでは処理能力が追いつかなくなってきたら？
参照中心のアプリケーションならリード・レプリカつくって負荷分散が初手になるかもしれませんが、追加・更新側のトランザクション処理が追いつかなくなったら？
顧客を2分割して、2つのDBServerに収容する水平分割となります。さらに増えたら、増えたところを分割して顧客を細分化していきます。

# DB水平分割の運用問題

1台のDBServerでは処理能力が追いつかないから分割するので、それなりのデータ量が蓄積しています。移動するのは半分としても、pg_dump, psql -f でやるのは工事時間を長引かせることになります。

# ストレージレベルで分割・移動

Instagramのやり方です。ここではAWS上のサービスとして話を進めます。

解決策

- 小さく多数の論理shardを、少数の物理shard サーバーに mapする
- 物理Shard = Postgres データベースクラスタ（≒ DB Server）
- 論理Shard = Postgres の schema
- ノード分割は、EBS Snapshot で丸ごとコピーして、DROP SCHEMA CASCADE で重複分を削除する。DBSizeが大きくても高速コピー可能。

8個の論理shardを2 server に格納した状態から 4server に再分割する例
<pre>
// 8 logical shards on 2 machines
user_id % 8 = logical shard
logical shards -> physical shard map
{
  0: A, 1: A,
  2: A, 3: A,
  4: B, 5: B,
  6: B, 7: B
}
</pre>
<pre>
// 8 logical shards on 4 machines
user_id % 8 = logical shard
logical shards -> physical shard map
{
  0: A, 1: A,
  2: C, 3: C,
  4: B, 5: B,
  6: D, 7: D
}
</pre>

* machineA:
 - shard0
 - shard1
 - ~~shard2~~ machineC稼働後に削除
 - ~~shard3~~ machineC稼働後に削除
* machineC:
 -  ~~shard0~~ machineC稼働後に削除
 -  ~~shard1~~ machineC稼働後に削除
 -  shard2
 -  shard3

# 分割引越の手順

2. 対象顧客のSCHEMAをReadOnlyに
3. EBS Snapshot
4. 新規DBServerにSnapshotから作ったVolumeをattach
5. 新規DBServerをwarmup
6. 新規DBServerでSCHEMAのReadOnly制限解除
7. SCHEMAとDBServerのMapを切替。(同時にReadOnly制限解除）
8. 重複SCHEMAをDROP CASCADE

pg_dump/psql -f のSQLレベルだったデータ移動が、EBS SnapshotによるAWSのバックヤード処理に移りました。

warmupに少々時間がかかるので、さらに改善の余地があります。Snapshotから作ったばかりのVolumeは、新規DBServerが実際にアクセスしたところから徐々に実体化していくので、運用Webサービス用のDBではwarmupは必須です。

# 分割引越の手順２


3. EBS Snapshot
4. 新規DBServerにSnapshotから作ったVolumeをattach
5. 新規DBServerをリードレプリカとして構成
5. 新規DBServerをwarmup
2. 対象顧客のSCHEMAをReadOnlyに
5. 新規DBServerのリードレプリカ構成を解除して独立マスターにする
6. 新規DBServerでSCHEMAのReadOnly制限解除
7. SCHEMAとDBServerのMapを切替。(同時にReadOnly制限解除）
8. 重複SCHEMAをDROP CASCADE

対象顧客のSCHEMAをReadOnlyにしたときには、対象顧客のデータはすべて新規DBServerに入っていて、warmupも済んでいる状態です。ReadOnly制限のかかる時間は、顧客データ量に比例するところのない定数時間となります。

# 分割DBの悩み　Global Unique Key

単一DBなら SERIAL型とするだけです。複数serverでユニークかつ全体ロック・相互通信は回避したい。Hotspot問題になって、INSERT処理が遅くなってしまうので。

解決策

- ID順≒時刻順としたいので、epoch msec をID先頭に含める。
 - 異なるShardのレコードをUNIONして並べたときでも、msecの分解能では ID順＝時刻順
 - だいたい時刻順で十分とできるときに割り切ってしまう
- Shard 毎にID生成関数をもち、ID内部に ShardIDを含めることでユニーク性を担保する。
- 1msec の中で複数挿入の事態に備えて、10bit程度はShard内で自動increment。
- 全体を64bitに納めるために epoch msec を 2011-01-01起点 の 41bit（41年間）、ShardId 13bit（8K個）、シリアル10bit とする
 - 2052年問題ができちゃうけど
- 全体でのユニーク性が41年間は保つ。2PhaseCommitとか全体ロックなしでLocalの関数処理だけで済む。
営業から真の目的をヒアリングするために心がけていること

# ユーザーを具体化する
具体的になにをしたいのかをヒアリングする。
この時大切なのは5W1Hをしっかりと補完して聞く事。
特に大切なのは「誰が(Who)」である。
例えば、

営業「○○な機能を提供すると利用者にとってこのようなメリットが～・・・」
SE「なるほど！じゃあ作ろう！」

これは危険ですね。
システムにもよりますが利用者ってのは誰か、ステークホルダー・ユーザー属性を明確にしておいたほうがいいと思います。
**誰がこの機能を利用するのか**は必ずヒアリングするべきである。
誰かに使いやすく作ると必ず誰かに対しての作業が発生する可能性がある。

# その機能を実装することで弊害は発生しないのか考える
この機能を実装することでなにか、弊害は発生しないのかを考える。
この時大切なのが前述のユーザーの具体化を怠らないこと。
そのユーザーにとっての弊害はないかもしれないが、違うユーザーにとっては弊害が発生するかもしれない（例：入力コストとか）
今後の開発を妨げるものであれば、それもしっかりと説明をし設計をどの様に変えたらそれがあとで楽になるかを考えておくことも大切。

# それは本当にやりたいことなのかをもう一度聞く
本当に必要なのかを聞く。
必要だからその機能が必要って言ってんだよ！っていうのもわかりますが、もう一度冷静になって考えてみましょう。
・開発コストを裂いてまで必要な機能なのでしょうか
・現在Doingなタスクを止める必要はあるのか
・別の解決手段手段はないのか（ココ重要）

# その機能を作ったらなんの数字がどのように変わるのか
その機能をロンチ・リリースをしたらなんの数字が変わるのかしっかりと聞いておく。
作業時間がどのくらい短縮するのか、CVRがどの程度改善見込めるのか、滞在時間が減るのか・・・など
その機能を保守する重要性にもつながるので重要です。

初めてなのでだいぶ投げやりでしたが許してください。
もっとこうしたほうがいいよ！ってのがあったらアドバイスをください！
Dropwizardについての自分の理解や思うこと

0.8系を使っている前提で。

- Webアプリケーションを1つのjarにまとめてjava -jarで実行するという思想を広めた
- Spring Boot誕生のきっかけとなった（と思ってる
- Dropwizard Metricsが便利らしい。Spring Bootもこいつの依存性があれば `MetricRegistry` を作るとのこと
  - http://docs.spring.io/spring-boot/docs/1.4.2.RELEASE/reference/html/production-ready-metrics.html#production-ready-dropwizard-metrics

- Fat Jar作成にApache Maven Shade Pluginを使っているので基本Mavenを使った方が良さそうな感じ。Androidやってる人達はGradleメインなのでそちらの選択肢も欲しい。shadowというpluginを使えばいいらしいが、なんかあるとハマりそう
  - http://qiita.com/kivatek/items/44272bc623dcd6ad5e25

- JDBIよりHibernate使うべき。JDBIは情報が少なすぎる

結論としては、一般公開するサービスに使うにはやめておいた方が良いと思う。ちょっとした社内ツールを作るくらいなら良いと思うが。
Spring Boot誕生に寄与したという偉大な功績は素直に称えて、仕事で利用するならSpring Framework、Spring Bootなど情報が多い物を選びたい。
VMWareでvmw_ioctl_command error Invalid argument.で落ちる場合

# 原因
vmware 12では、opengl 3がサポートされましたが、ROS のrviz, gazeboなどでは OpenGL3 ではエラーとなり

    vmw_ioctl_command error Invalid argument.

と表示されて落ちます。

# 対処

環境変数を .bashrc にセットします

    export SVGA_VGPU10=0

これで、OpenGL 2.1 が利用されることとなりエラーが表示されなくなりました。
[vim]denite.nvim で絵文字を入力する

# denite.nvimで絵文字を入力する

[denite.nvim](https://github.com/Shougo/denite.nvim) で絵文字選択用のソースを作ってみました。
実用的かどうかは微妙ですが。。

[vim-denite-emoji](https://github.com/pocari/vim-denite-emoji)

<img width="423" alt="スクリーンショット 2016-12-03 22.27.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/34692/59bf59dd-c2e3-9134-87f2-b1eebd8225fa.png">

`:Denite emoji`で絵文字候補を出して、`Enter`で選択した絵文字がバッファに挿入されます。

絵文字の元ネタは [vim-emoji](https://github.com/junegunn/vim-emoji)というpluginが持っている絵文字データを使っているだけなので全然大したことはしてないんですが、deniteのカスタムソースはとても書きやすくて良いですね。

実質書いたのは

```py3
from .base import Base

class Source(Base):

    def __init__(self, vim):
        super().__init__(vim)
        self.name = 'emoji'
        self.kind = 'word'

    def gather_candidates(self, context):
        candidates = []
        for emoji_name, code in self.vim.eval('emoji#data#dict()').items():
            if isinstance(code, list):
                emoji = "".join(map(chr, code))
            else:
                emoji = chr(code)
            candidates += [{
                'word': "{0} {1}".format(emoji, emoji_name),
                'action__text': emoji
            }]
        return candidates
```

だけなんですが、これでいい感じにカスタムソースが作れるのでめっちゃ楽ですね。

ただ、何個かうまく表示できない文字があって`cn`(:flag_cn:) とか `it`(:flag_it:) とかの文字がうまく表示出来ないのは何故なんだろう。
ターミナル上だと表示できて、neovim上だと表示できてないのでneovimの問題なんだろうか。
JavaScriptでの小数点の計算の誤差について

# はじめに
4日目は、[スマートテック・ベンチャーズ](https://www.wantedly.com/projects/72590?ql=gaJpZM4AKYPb)の本山(@k_moto)が担当します。

今回はJavaScriptの小数点の計算について。
一見iOSと関係なさそうですが、
ブリッジすることや、ハイブリッドアプリはJSで書かれているので、
豆知識として覚えておいていただければと思います。

# JavaScriptで小数点を計算するとズレる
JavaScriptでは IEEE 754(浮動小数点数演算標準) という規格に沿った実装がされています。
そのため、かなり微妙な誤差ではあるのですが、
計算結果にずれが出てしまいます。
詳しくは JavaScript IEEE754 などのキーワードでGoogle先生に聞いてみてください。

例えば、
以下のような場合、少数第14位が1多く
resultの値は 70.60000000000001 となってしまいます。


```
value1 = 80.7;
value2 = 10.1;

result = value1 - value2;

```

誤差を修正する方法ですが、
基本的には整数値にしてから計算することで解決します。
計算する値が小数の場合は問題なのであって、
整数にしてしまえば特に誤差はないようです。
整数値にする方法は以下のパターンです。

## ①10^Nで整数にする
単純に10の倍数を掛けて、位をずらしてしまえば良いという考えです。
上の例を修正する場合はこんな感じ。

```
value1 = 80.7;
value2 = 10.1;

result = ((value1　*10) - (value2 * 10)) / 10;

```

それぞれ10を掛けて、807-101 を行った後に10で割れば、
計算結果は正しく 70.6 になります。
ただし、このパターンではうまくいかない場合があります。
最終的に四捨五入するなど、
ある程度の数値の丸めが許されているのであれば、
この対処方法でも問題はないでしょう。

うまくいかない例はこちら

```
value1 = 20.42;
value2 = 10.1;

result = ((value1　*100) - (value2 * 100)) / 100;

```

普通に 20.42 - 10.1 を計算すると 10.32 になります。
JavaScriptの誤差をなくそうと、100を掛けると
20.42 * 100 = 2042.0000000000002 となってしまい、
result には 10.320000000000002 という残念な数値が入ってしまいます。

整数値に直す時点で、小数点の計算をしてしまっているので、
結果誤差が残ってしまうというのが、このパターンの問題点です。


## ②数値を文字列に変換して小数点を取り除く
①でうまくいかないのは、整数値に変換するときに計算をしているからなので、
文字列操作で整数にしてしまいます。


まず、小数点の位置をさぐるメソッドを作ります。

```
function getDotPosition(value){

　// 数値のままだと操作できないので文字列化する
　var strVal = String(value);
　var dotPosition = 0;

  //　小数点が存在するか確認
  if(strVal.lastIndexOf('.') === -1){
    // 小数点があったら位置を取得
    dotPosition = (strVal.length-1) - strVal.lastIndexOf('.');
  }

  return dotPosition;
}

```

次に実際に計算するメソッドを作ります。


```
function calcSubtract(value1,value2){

 // それぞれの小数点の位置を取得
 var dotPosition1 = getDotPosition(value1);
 var dotPosition2 = getDotPosition(value2);

 // 位置の値が大きい方（小数点以下の位が多い方）の位置を取得
 var max = Math.max(dotPosition1,dotPosition2);

 // 大きい方に小数の桁を合わせて文字列化、
 // 小数点を除いて整数の値にする
 var intValue1 = parseInt((value1.toFixed(max) + '').replace('.', ''));
 var intValue2 = parseInt((value2.toFixed(max) + '').replace('.', ''));

 // 10^N の値を計算
 var power = Math.pow(10,max);

 // 整数値で引き算した後に10^Nで割る
 return (intValue1-intValue2) / power;

}

```

整数値で計算した後に、
ずらした小数分を10のN乗で割ることで元の小数に戻してあげれば、
小数点で計算するタイミングがないためずれないという考え方です。

## ③ライブラリを使う
BigDecimal.jsを使えば良いとのことですが、
使用したことがないので紹介だけにとどめておきます。

https://github.com/dtrebbien/BigDecimal.js/

## まとめ
JavaScriptで小数点の計算をするとなかなか面倒なので、
四捨五入など、丸めても問題ないか仕様を詰めた方が良いかもしれません。
もし他の言語で代替できるならそちらで計算してしまうのもありです。

ついでに、
JavaScript等の実装結果をすぐ見たい場合、以下のサイトがおすすめです。
https://jsfiddle.net/
HTMLやCSSもかけるブラウザ上のエディタ的なサイトです。
ささっと実行結果を確認したい時に使ってます。


## 最後に
スマートテック・ベンチャーズでは、未経験だけどiOSの開発をやりたい！という人を募集しています。
Advent Calendarのスマートテック・ベンチャーズページに会社およびWantedlyのURLをのせていますので、興味のある方は是非ご覧ください。
http://qiita.com/advent-calendar/2016/stv

明日は@okuderapさんです。
お楽しみに！
今時点(2016/12/3)の heroku で root domain を運用するベストなやり方

結論を先に書きますと、 heroku の pointDNS という addon を使うやり方です。

## 設定方法
1. `heroku addons:create pointdns:developer` # 無料
2. `heroku domains:add mysn.io` (必要があれば、 `heroku domains:add www.mysn.io` )
3. heroku の pointDNS addon 設定画面で、 mysn.io　の設定を追加する
4. 自分のドメイン管理サイトで Name　Server を pointDNS の Name Server に変更

## 注意事項
- 上記手順は http://mysn.io のような **SSLではない** http の場合の手順です。SSLにする場合は、**mysn.io.herokudns.com** のようなURLに設定する必要がある
- SSLも無料で運用できるようになったので、こちらをご参照ください。 [Heroku で Let's Encrypt 無料証明書を使う（自動更新あり）](http://qiita.com/blueplanet/items/b85634a0ced219e9ebe7)

## 参考記事
- [PointDNSでHerokuアプリにNaked domainを割り当てる](http://shindolog.hatenablog.com/entry/2015/02/01/225521)
ロボ年表から１年経ったので思い出してみた

#ロボ年表
１年前の2015年12月に、ロボ年表というスライドを発表しました。
http://www.slideshare.net/tonosamart/ss-56236706

※「ロボットのほん」で、補足原稿も書いているのであわせてよんでもらえたら嬉しいです。

実際、２０１６年のロボット業界は、スライドに出てくる"ちょっと先の未来"に、近づいてきていると思います。（結構予想あたってますね！まあ、携帯電話が一度通ってきた道に近いのでみんな予想してたと思うけど。）

2017年には、その先の未来・・・スライドで言うと１４ページ以降の未来にたどり着くのかなあ。まだ無理かなー
railsでES2015(Babel)な環境をさくっと作る

Railsアプリケーションにおけるフロントエンド開発について、下記のようなことをやろうとするとbrowserify/webpackなどでビルドして〜といった記事をよく見ます。

- ES2015で書きたい
- フロントエンドのライブラリ管理にnpmを使いたい

が、browserifyとかwebpackとかちょっと敷居が高いと感じる人も多いのではないでしょうか？
今回はそんな人でもさくっと導入できるsprockets-commonerというgemを紹介します。

- [Shopify/sprockets-commoner](https://github.com/Shopify/sprockets-commoner)

## 実行環境
- Ruby v2.3.3
- Rails v5.0.1
- npm v3.10.3

Rubyはv2系、npmはv3系以上が必須となっています。
今回はRails5で確認していますが、Rails4でも問題なく動作するはずです。

## Railsでプロジェクト作成
まずはプロジェクトを作成します。

```
$ rails new rails-es2015-sample -B -T -C
```

## Gemを追加してbundle install
Gemfileに下記を追記して`bundle install`します。

``` Gemfile
gem 'sprockets-commoner'
```

## babel周りの設定
### package.jsonを作成
以下のコマンドを実行してpackage.jsonを作成します。

```
$ npm -y init
```

続けて、babel-core, babel-preset-es2015をインストールします。

```
$ npm install --save-dev babel-core@6 babel-preset-es2015
```

インストール完了後

``` package.json
{
  "name": "rails-es2015-sample",
  "version": "1.0.0",
  "description": "This README would normally document whatever steps are necessary to get the application up and running.",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "babel-core": "^6.18.2",
    "babel-preset-es2015": "^6.18.0"
  }
}
```

### .babelrcファイルを作成
下記の内容で.babelrcファイルを作成します。

``` .babelrc
{
  "presets": ["es2015"]
}
```

基本的な設定は以上です。

## 試す
では、試しにnpmでVuejsをインストールして利用してみます。

```
$ npm install --save vue
```

適当に画面を作ります

```
$ rails g controller home index
```

erbファイルを下記のように書き換えます

``` app/views/home/index.erb
<div id="app">
  <p>{{msg}}<button @click="say">click</button></p>
</div>
```

下記のファイルを追加します。

``` app/assets/javascripts/main.js
import Vue from 'vue/dist/vue';

new Vue({
  data: {
    msg: 'Hello'
  },
  methods: {
    say () {
      alert('Hello');
    }
  }
}).$mount('#app');
```

ではサーバを起動して画面を確認してみます。

```
$ rails s
```

![ss1.gif](https://qiita-image-store.s3.amazonaws.com/0/148095/311d1b5d-f56b-47cc-eb68-7e9473b8ec70.gif)


動いてます！

## まとめ
sprockets-commonerを使うことで簡単にES2015を利用することができました。
とりあえずrailsでES2015使いたいという場合におすすめです。
QEMU上でBitVisorは動作するか?

QEMU上でBitVisorは動作するのでしょうか。記憶では動作していたはずなのですが、さっそく試してみましょう。

![p1.png](https://qiita-image-store.s3.amazonaws.com/0/103733/e70b245b-7c17-47d8-ace5-a8e996eb18c9.png)

おっと、panicしてしまいました。しかもキー操作がきかないのでログが確認できません。PS/2ポートのポーリングでキー入力待ちをしているのがQEMUではうまくいかないようです。こういう時はシリアルポートを使いましょう。幸いQEMUではシリアルポートがエミュレートされています。BitVisorのmake configでTTY_SERIALを有効にして、やり直します。

![p2.png](https://qiita-image-store.s3.amazonaws.com/0/103733/d1d3bb9a-8d93-ba88-c312-a45c754058fe.png)


止まってしまいました... ではなくて、シリアルポートだから別画面に出ているのですね。Ctrl-Alt-3を押して画面を切り替えましょう。

![p3.png](https://qiita-image-store.s3.amazonaws.com/0/103733/75ff0a8a-916b-37f1-f87d-434a39ec0c43.png)


入力ができるようになりましたが、入力しなくてもUsing VMXメッセージが出ているのが見えますね。仮想マシン上でVT-xが見えてしまっているようです。これはQEMUに-enable-kvmオプションをつけていたためですね。kvm_intel.nested=1にしても、AMDにしかないMSRの読み込みができるなど、QEMUとKVMの組み合わせではいろいろ問題があるようで、BitVisorは動かないらしいです。QEMUから-enable-kvmオプションを外しましょう。QEMUのソフトウェアエミュレーションはAMD-Vに対応していますので、これで動くはずです。

![p4.png](https://qiita-image-store.s3.amazonaws.com/0/103733/35233366-ab0a-5b86-97ff-3c763facebd8.png)

> FUNCTION ERROR!

なんだこれ! おっかしいなぁ、前は動いたはずなのに...

![p5.png](https://qiita-image-store.s3.amazonaws.com/0/103733/ff47dec5-5e13-c756-cae2-7e92d80a898e.png)

シリアルポートの出力に不審な点は見当たりません。うーん。

きっとBIOSが怪しいに違いない、というわけで、時代はUEFIです。ovmfを使いましょう。

![q1.png](https://qiita-image-store.s3.amazonaws.com/0/103733/7b78a4b8-a0a5-a975-4729-31144d6a2f73.png)

しーん...

![q2.png](https://qiita-image-store.s3.amazonaws.com/0/103733/2d5ddcbe-874a-af1f-3d84-fc595b7755cc.png)

VMEXIT_SHUTDOWNって......

以上のように、QEMU上でBitVisorは現状では動かないことが判明しました。＼(^o^)／

環境: QEMU 2.5 (Ubuntu 16.04パッケージ),  Intel Core i5-4260U, Apple iMac (21.5-inch, Mid 2014)
Datadog Toplist 複数項目のグルーピング

[Datadog Advent Calendar 2016 \- Qiita](http://qiita.com/advent-calendar/2016/datadog) 4日目の記事です。
昨日は @minamijoyo さんの [fluentdとDatadogを連携してIPアドレスごとのSSHログイン成功/失敗回数を記録/監視する](http://qiita.com/minamijoyo/items/5ac7679782b0ae6d106d#_reference-9260cef5c9af30db5485) でした。明日は @ngi644 さんです。

ダッシュボードに追加できるウィジェットのひとつ、Toplist についての小ネタです。
Toplist の編集 UI 上では1項目でのグルーピングですが、複数項目でのグルーピングを行う方法です。

# Toplist とは

- メトリクス値を 昇順 or 降順 で一覧表示
- ScreenBoard、TimeBoard 両方で使用可能

<img width="1077" alt="20161203_dd_toplist_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/89680/8117be42-4fec-891c-a2a5-c84f1857000b.png">

## 使用例

AWS EC2 の CPU Utilization を host 別に使用率の高い順に10件並べた場合の例です。

<img width="735" alt="20161203_dd_toplist_05.png" src="https://qiita-image-store.s3.amazonaws.com/0/89680/e492f567-11b5-3585-7069-6d7301017177.png">

ホストを判別するための識別子として、OS上で hostname を設定している場合はその名前、未設定の場合はインスタンスIDが表示されています。

<img width="354" alt="20161203_dd_toplist_02.png" src="https://qiita-image-store.s3.amazonaws.com/0/89680/58020254-aaed-9dcf-0c9f-ca8674fcfa74.png">

# Toplist にグルーピング項目を追加

インスタンスIDだけでは分かり難いので、EC2に付与している Name タグも表示させます。

<img width="730" alt="20161203_dd_toplist_03.png" src="https://qiita-image-store.s3.amazonaws.com/0/89680/3658942f-c63d-af89-b5e4-3be1b563c21a.png">

以下のように Toplist 上に　インスタンスID＋名称　が表示できます。

<img width="351" alt="20161203_dd_toplist_04.png" src="https://qiita-image-store.s3.amazonaws.com/0/89680/d3183eb5-4554-3831-1ac9-da63d6f106de.png">

設定するタグにより、ホスト別のToplistでインスタンスタイプを表示させる、ホスト・プロセス名別にメモリ使用量を表示させる等の使い方も可能です。

## 注意点

この変更を加えたグラフについては、以降 JSON での変更が必要になります。  
Edit タブのUI上では複数項目でのグルーピングは非対応で、
Edit タグ上での変更・更新を行うと1項目に変更されます。(勝手に戻ってしまいます)  

## その他

Toplist に限らず、 Edit タブでは実装されていないが、 JSON タブを直接編集することで実現できる物があります。
例えば、グラフのY軸固定を行いたい場合も JSON 編集で実現できます。(参考:[Graphing Primer using JSON](http://docs.datadoghq.com/graphingjson/#yaxis))
[MySQL]同じ日付のデータを取得する（時分秒を考慮しない）

今までDBから特定日付（例えば12/4）のデータを検索する場合、

```sql
WHERE hoge_date >= '2016-12-04 00:00:00' AND hoge_date < '2016-12-05 00:00:00'
```

や

```sql
WHERE hoge_date BETWEEN '2016-12-04 00:00:00' AND '2016-12-04 23:59:59'
```

みたいなことをしていたけれど、MySQLのDATE()関数を使えば

```sql
WHERE DATE(hoge_date) = '2016-12-04'
```

で済んだ。
https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html

実行計画も変わらなかったので、MySQL使うならこれで良い気がする。
groonga-dev（OSDNのML）を全文検索する（クロール編）

## はじめに

Groongaコミュニティには[groonga-dev](http://lists.osdn.me/mailman/listinfo/groonga-dev)というメーリングリストがあり、月に20〜40通程度のペースでやりとりが行われています。

バックナンバーはOSDNの[MLアーカイブ](https://ja.osdn.net/projects/groonga/lists/archive/dev/)で見ることができるのですが、残念ながらこのアーカイブでは全文検索する手段が用意されていません。そこで、Groongaを使って全文検索できるようにする方法を考えてみました。 [^1]

[^1]: groonga-devに限らず、OSDNのメーリングリストであれば汎用的に使える仕組みになる想定です。

全文検索するためには、主に以下の3ステップが必要です。

1. 情報を集める（クロール）
1. インデックスを作る
1. 検索インターフェイスを作る

今回はクロールについて書きます。

## クロール先

まず、どこからクロールしてくるか決める必要があります。候補は以下の2つです。

* A. 記事ごとののHTMLからスクレイピング
* B. 月ごとにまとめられたテキストファイルを利用

Aの場合、開発の手間もサーバーの負荷もかかりそうです。できればBにしたいのですが、アーカイブにどのような情報が含まれているのか念のため確認しておく必要があります（極端な例ですが、タイトルだけで本文が含まれていないなどの可能性があるためです）。Bのファイルの中身を見てみると、メール形式になっていて必要な情報は含まれていそうなので、こちら選びます。

月ごとにまとめられたテキストファイルのURLは

```ruby
"https://ja.osdn.net/projects/groonga/lists/archive/dev/#{年（YYYY）}-#{月（英語）}.txt"
```

という形式になっています。groonga-devは2009年の2月にsenna-devから移行する形でスタートしたので、ダウンロード対象は2009年の2月から現在までのファイルです。

## サンプルスクリプト

月ごとのテキストファイルをクロールするサンプルスクリプト（Ruby）はこちらです。

https://github.com/myokoym/groonga-dev-search/blob/master/crawler.rb

ポイントは以下の2点です。

* HTTPSでアクセスする
* ファイルのエンコーディングはEUC-JPなので、UTF-8に変換する

クロールするときの注意点として、差分更新のときに前回取得したときの最終月のファイルを取得し直す必要がありますが、上のスクリプトではこの点は考慮していません。

## おわりに

groonga-devを全文検索する一環として、MLアーカイブをクロールする方法を簡単にまとめました。
次回はクロールしてきたファイルをパースしてGroongaデータベースを作成する方法について書きたいと思います。
Windows 10 に Golang 開発環境を作るメモ

こんにちは、最近なにかと物忘れが激しい而立丸です。この記事は[初老丸 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/syoroumaru) の4日目です。

# インストール

[Downloads - The Go Programming Language](https://golang.org/dl/) から最新の Windows 用インストーラーを落としてきて、言われるがままにインストールします。

# `GOPATH` の設定

お馴染みの `GOPATH` です。先に適当にディレクトリを作っておき、環境変数を設定しましょう。

![gopath.PNG](https://qiita-image-store.s3.amazonaws.com/0/78376/044068e4-5127-62b5-6942-9e95da1a6b72.png)

ホームディレクトリ以下にするならこんな指定でおk（`%HOMEPATH%` だと相対パスやめろって怒られるので `%USERPROFILE%` で）。

![userprofile.PNG](https://qiita-image-store.s3.amazonaws.com/0/78376/b325bee2-b1fa-cf2a-fcde-fbeede799f62.png)

`go version` が叩ければ問題なし。

```
PS C:\Users\Yoriki> go version
go version go1.7.3 windows/amd64
```

# `Path` に `%GOPATH%\bin` を追加

さてさて [gom](https://github.com/mattn/gom) を使ってパッケージ入れよう、としたらエラー。パスが通ってないですね。

![nooo.PNG](https://qiita-image-store.s3.amazonaws.com/0/78376/5c59f6cc-8175-b1db-d546-7c0abd798048.png)

というわけで通します。

![path.PNG](https://qiita-image-store.s3.amazonaws.com/0/78376/7fd03e18-8cda-bfb1-cbab-2cc8a170fd76.png)

この画面、たぶん Win8 くらいまでセミコロン区切りで入力する必要があったんですが、地味に改善されてますね……

![Capture.PNG](https://qiita-image-store.s3.amazonaws.com/0/78376/78a4ddee-c29b-5574-2177-238ebbbe4a97.png)

無事使えるようになりました。めでたし。
錯視作成に使える開発環境・言語（１）R言語

株式会社ホクソエムシリーズは昨日までで終了で、今日からは錯視と技術についてもうちょっと深くやっていきたいと思います。

今日から２、３日は、錯視の紹介はお休みして、錯視を作るのに適した開発環境・言語を紹介します。

錯視作成にプラスな点として、

- ネイティブで描画・表示をサポートする開発環境
- アニメーションのサポート（動画錯視の場合）
- 色空間のサポート（RGBだけではなく、HSVも必要）
- ベクトルデータ、ベクトル演算（錯視は繰り返しパターンが多いので、楽です）
- 3DCGサポート
- 簡単に使える画像・動画出力

などがあります。

# R言語

https://ja.wikipedia.org/wiki/R%E8%A8%80%E8%AA%9E

> R言語（あーるげんご）はオープンソース・フリーソフトウェアの**錯視作成に特化した**プログラミング言語及びその開発実行環境です。

というように、以下のような機能を備えています。

- `grid`パッケージによる階層化されたグラフィックス生成
    - ビューポートのサポート
    - 各種ポリゴンの作成
    - **ベクトルデータの描画** （これは本当に楽）
- グラフィックス表示のネイティブサポート
- `animation`パッケージによる動画作成
- ベクトルデータ、ベクトル演算がとても簡単
- 色空間サポート
- `rgl`パッケージによる3DCG
- 作った錯視を公開するための[RPubs](https://rpubs.com/)というサイト。
- ダイナミックに錯視のパラメータを調整して試すための`shiny`という環境。
- Rmarkdownという錯視紹介記事作成用のパッケージ、ツール。

まさに、錯視作成のために作られた開発環境と言っても過言ではないでしょう。

なお、数年前に作ったR言語による錯視作成のデモがこちらです。

[Rで錯視（第１版）](https://rpubs.com/kohske/R-de-illusion)

一つだけ紹介しておきましょう。

# カフェウォール錯視の作成

![ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/4390/6042918b-e240-b59a-84ca-b133c836c5aa.png)

これはカフェウォール錯視というものです。多分エクセルでも描けます。

水平線が傾いて見えると思いますが、実際はすべて平行です。

Rでは、このパターンを

```r
rs <- expand.grid(x = seq(0, 1, 1/10), y = seq(0, 1, 1/10))
grid.rect(rs$x, rs$y, 1/10/2, 1/10/2, gp = gpar(fill = "black", col = NA))
grid.rect(rs$x + 1/10/4, rs$y + 1/10/2, 1/10/2, 1/10/2, gp = gpar(fill = "black", col = NA))
ls <- expand.grid(x = 0:1, y = seq(0, 1, 1/20) - 1/20/2)
grid.polyline(ls$x, ls$y, id = gl(nrow(ls)/2, 2), gp = gpar(col = "grey50", lwd = 1))
```

と、たったこの5行で作成できるわけです。アンビリーバブル。

少し解説しておくと、

1) `0, 0.1, 0.2, ..., 1` の総当り2x(11x11)次元行列を作っています。

```r
> rs <- expand.grid(x = seq(0, 1, 1/10), y = seq(0, 1, 1/10))
> head(rs)
    x y
1 0.0 0
2 0.1 0
3 0.2 0
4 0.3 0
5 0.4 0
6 0.5 0
> tail(rs)
      x y
116 0.5 1
117 0.6 1
118 0.7 1
119 0.8 1
120 0.9 1
121 1.0 1
```

2) 奇数（または偶数？）行の黒い四角を描画。中心座標がrs、幅と高さが1/10/2です。

```r
grid.rect(rs$x, rs$y, 1/10/2, 1/10/2, gp = gpar(fill = "black", col = NA))
```

3) 偶数（または奇数？）行の黒い四角を↑から1/4だけずらして描画。中心座標がrsから横に1/10/4、縦に1/10/2だけずらしてるということ。

```r
grid.rect(rs$x + 1/10/4, rs$y + 1/10/2, 1/10/2, 1/10/2, gp = gpar(fill = "black", col = NA))
```

4) 灰色線の座標を作成。

```r
> ls <- expand.grid(x = 0:1, y = seq(0, 1, 1/20) - 1/20/2)
> head(ls)
  x      y
1 0 -0.025
2 1 -0.025
3 0  0.025
4 1  0.025
5 0  0.075
6 1  0.075
```

5) 灰色線の描画。

```r
grid.polyline(ls$x, ls$y, id = gl(nrow(ls)/2, 2), gp = gpar(col = "grey50", lwd = 1))
```

# 錯視をプログラムで作成することのメリット

こうしてみると、錯視を作成する効率的なプログラムを作成するには、**錯視の構造を理解する必要がある**ことがわかります。ここが実は一番の狙いです。

また、パラメータを簡単に変更できることもメリットですね。例えばカフェウォールの色を変えたり、横ずれ量を変えたり。もしエクセルで作ってたら、これは無理ゲーです。

# 明日は

明日はProcessingについて紹介します。

Enjoy!!
Raspberry Pi を Mackerel で監視する

最近 Raspberry Pi をよく使うので監視が欲しくなり、手軽に導入できる Mackerel を採用しました。

Raspberry Pi でなくても Linux + ARM のコンピュータなら、この方法で導入出来ると思います。

※ Raspberry Pi Zero, Raspberry Pi 3 で動作確認済み。

# インストール
GitHub で release されているバイナリを配置します。
https://github.com/mackerelio/mackerel-agent/releases

## ダウンロードと展開
```shell-session:最新版の場合
curl -sL https://github.com/mackerelio/mackerel-agent/releases/latest/download/mackerel-agent_linux_arm.tar.gz | tar xz
```

## バイナリと設定ファイルの配置
```shell-session
sudo mkdir -p /usr/local/bin /etc/mackerel-agent
sudo cp mackerel-agent_linux_arm/mackerel-agent /usr/local/bin
sudo cp mackerel-agent_linux_arm/mackerel-agent.conf /etc/mackerel-agent
```

## API Key の設定
API Key は [オーガニゼーションのページ](https://mackerel.io/my) に記載されています。

```shell-session
sudo mackerel-agent init -apikey="YOUR API KEY"
```

# Service として登録
そのまま起動しても良いのですが、最新の Raspbian なら systemd が使えるので service として登録しましょう。

```:/lib/systemd/system/mackerel-agent.service
[Unit]
Description=mackerel-agent
After=network.target network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/mackerel-agent
ExecReload=/bin/kill -HUP $MAINPID
KillMode=control-group
Restart=on-failure

[Install]
WantedBy=multi-user.target
Alias=mackerel-agent.service
```

```shell-session:自動起動の有効化と起動
sudo systemctl enable mackerel-agent
sudo systemctl start mackerel-agent
```

# カスタムメトリックの追加
Raspberry Pi が熱暴走しないか監視したいので、 CPU 温度をカスタムメトリックとして投稿できるようにします。

## CPU 温度を取得する shell script
実行するために `bc` が必要なのでインストールしておきます。

```shell-session
sudo apt install bc
```

```bash:temp.sh
#!/bin/bash
# ref: https://github.com/ymyzk/mackerel-plugins/blob/master/raspberrypi/temp.sh
SECONDS=`date '+%s'`

NAME='temperature.cpu'
TEMP=`cat /sys/class/thermal/thermal_zone0/temp`
VALUE=`echo "scale=3; ${TEMP} / 1000" | bc`
echo -e "${NAME}\t${VALUE}\t${SECONDS}"
```

## 設定ファイルに追記
```:/etc/mackerel-agent/mackerel-agent.conf
[plugin.metrics.temp]
command = "/path/to/temp.sh"
```

# 参考
- [CPU 温度を記録する Mackerel プラグインを作りました – ymyzk’s blog](https://blog.ymyzk.com/2014/06/mackerel-coretemp/)
- [ホストのカスタムメトリックを投稿する - Mackerel ヘルプ](https://mackerel.io/ja/docs/entry/advanced/custom-metrics)
perl5のprintf／sprintfで`*`を使った書き方を学ぶ

この記事は、[Perl 5 Advent Calendar 2016 - Qiita](http://qiita.com/advent-calendar/2016/perl5)の4日目の記事です。

昨日は、私sago35が、[Getopt::Kingpinを使って、さくっとコマンドラインスクリプトを作成する](http://qiita.com/sago35/items/49c078ded492ba853e20)を書きました。
今日は、printf／sprintfのフォーマット部分について書いてみます。

----

sprintfとかprintf使ってますか？
低レベルではありつつも、テキストを思い通りに出力するのに欠かせない関数だと思っています。

で、golangでは以下のような構文が使えます。

```go
fmt.Sprintf("%[3]*.[2]*[1]f", 12.0, 2, 6)
```

これは、以下と同じ意味になります。

```go
fmt.Sprintf("%6.2f", 12.0)
```

すなわち、`[3]`とかで3番目の引数から何かをする、とかそういうのが可能になるわけです。

```go
fmt.Sprintf("%[1]s = %[1]s + 1\n", "x")
```

こんな感じに書くと、`x = x + 1`と出力されるわけです。

で、perlでもやりたいと思ったわけです。


# 結論

perlでも元からできます。

```perl
# y = y + x
printf '%2$s = %2$s + %1$s', "x", "y";
```

`%2$s`は、2個目の引数(`y`)を文字列として評価(`%s`として評価)する、という意味になります。
何度も同じ表記`%2$s`が使えるので、`y`を何度も書く必要はなくなります。

`%1$s`は、1個目の引数(`x`)を文字列として評価する意味になります。

ダブルクォート内に書くときはエスケープが必要です。
微妙に書きにくい・・・。

```perl
printf "%2\$s = %2\$s + %1\$s", "x", "y";
```

詳細は、`perldoc -f sprintf`から確認できます。

 * http://perldoc.perl.org/functions/sprintf.html

# おまけ

widthの指定も同じように指定の場所から選ぶことができます。

```perl
# [  x]
printf '[%2$*1$s]', 3, 'x';
```
JavaFX8でDatabaseを扱いたいけど未だできない

[JavaFXアドペントカレンダー](http://qiita.com/advent-calendar/2016/javafx)に参戦します。
1日目に投入しようと書きましたが埋まってました。
せっかくなので12月4日の記事として参戦します。

##JavaFXでCRUDアプリ
日本語テーブルなDatabaseのデータをまともに読めるのがJDBCかODBCしかない。
それから何とかGUIのアプリを作ろうと奔走しております。

メインDatabaseがIBMのDB2じゃない方なので繋ぐにしても色々辛いです。

JPAもどうせ文字化けするんだろ？
と思ったらサクッと動いてしまいました。

JPQLは謎の文字列になりますが、何とか動きます。

よし、JavaFXでGUIだ！
という機運が僕の中で沸き立ってきたのですが、
何せ文献が少なくて困っております。

桜庭氏のJava技術最前線とかも見ているんですが、部品の紹介なんです。
JavaFXでデータベースをJPAでCRUD操作できるアプリのサンプルがなかなか見つからないんです。
ゲームを作ろうとする人が多いからなのかなぁ。


##CRUDっぽいもの

一番近いもので[JavaFX8 Tutorial - code.makery ](http://code.makery.ch/library/javafx-8-tutorial/)をやってみました。
基本的にStringProperty等のProperty Memberを持っているObjectの追加、修正、削除しかありませんでした。
XMLに保存するとかもあったんですが、
JPAならどうすんねん！
という疑問は解消されず。
JPAは古い。
「JAX-RS! JAX-RS!」 ってことなんでしょうか。

##JPAとJavaFX
[はじめての JavaFX エンタープライズ・アプリケーション : JavaFX と JPA で実装するアプリケーション](https://yoshio3.com/2012/05/24/javafx-jpa-enterprise-application/)
[JavaFX でデータベースに簡単にアクセスできるという事実 ](https://blogs.oracle.com/kenji/entry/javafx_%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AB%E7%B0%A1%E5%8D%98%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%A8%E3%81%84%E3%81%86%E7%9C%9F%E5%AE%9F)
をやってみました。
GUIの部分も全てCodeで書かれているのでFXMLで楽したい僕にはちょっと違うなと思ったのですが。

- EntityをNetBeansがDBから自動生成
- Controllerも自動生成してくれる
- FXCollections.observableArrayListがJPAで取得したDatabaseのListをObservableArrayListに変換してくれる

という知見を得ました。

何処のコードを参照したか忘れたけど、
DataとTableViewのColumnの紐づけは下記のように書けば簡単だということが分かった。

```java:
itemnameColumn.setCellValueFactory(new PropertyValueFactory<>("商品名1")); 
```

##Youtube

意外なことにJavaFXのTutorialはインド人とかがガンガン英語で上げているようです。

[Ram Alapure](https://www.youtube.com/channel/UCLBjrZ6FA9yoy6vOne8L2Iw)
DB操作から帳票まで一通りできるようだけどFXML一行も書いていないんですが…。
多分参考になる部分があるんだろうけど見切れるかなぁ…。
Githubにソースも転がっているみたい。

[Java FX Hibernate JPA PersonData Program Java Training 2016](https://www.youtube.com/watch?v=ZLu5CZ_ymF4&list=PLM5X3sJj0YKzYUrj8oN7THds8olE02p1h&index=3&t=1s)
JPA部分がHibernateだけど参考になるかもしれない。

[JavaFX+Mysql+JPA in Netbeans](https://www.youtube.com/watch?v=ylsEcbGEGxU&index=3&t=1s#t=10.216945)
この動画だけでサンプルプログラムを作り上げてしまう手際の良さ。


##現在のソース

これらを参考に現在、サンプルを作っているけど、
表示はできているけど編集ができてないです。

意識低いエンジニアなので、GithubにPushはNetBeansにお任せ。

https://github.com/arachan/inputdata

##血迷った？
あまりにもどうしようもないと思い下記の洋書買っちゃった。
多分、今日届いて妻がビックリするはず。

[Learn JavaFX 8](https://www.amazon.co.jp/Learn-JavaFX-Building-Experience-Interfaces/dp/148421143X/ref=sr_1_7?ie=UTF8&qid=1480576869&sr=8-7&keywords=javafx)

うーん、1200ページの重み。
分厚い。

![JavaFX_Book.png](https://qiita-image-store.s3.amazonaws.com/0/24550/7d68b1ac-6628-092c-aaf8-bf5b360f144c.png)
cowsay -f dman

人間生きていればD言語くんを降臨させないといけない場面に何度も遭遇する。そこで`cowsay -f dman`でいつでもD言語くんを崇めることができるようにする。  
`cowsay -l`で使えるcowfileの一覧が見られる。

```console
$ cowsay -l
Cow files in /usr/share/cowsay/cows:
apt beavis.zen bong bud-frogs bunny calvin cheese cock cower daemon default
dragon dragon-and-cow duck elephant elephant-in-snake eyes
flaming-sheep ghostbusters gnu head-in hellokitty kiss kitty koala kosh
luke-koala mech-and-cow meow milk moofasa moose mutilated pony pony-smaller
ren sheep skeleton snowman sodomized-sheep stegosaurus stimpy suse
three-eyes turkey turtle tux unipony unipony-smaller vader vader-koala www
```

同時にcowfileのあるディレクトリもわかる。ここに自分のcowfileを追加すればどこでも`cowsay -f`できる。というわけでD言語くんのAAを作った。

[D-man AA](https://gist.github.com/kotet/33915fda0aedfaab597ea2d02f434b97)

```
$ cat dman.txt
      ____
      L__L|
      /    \
    /        \
  / _______    \
  \ \#/  \/ \  /
   \|#| O| O|#\
    |#L _L__ #|
    |###|  |##|
    /###/  /##|
   /###/   /##|
  /###/___/###/
 /###########/
 /##########/
    /     \
    \     /
   _ \   /__
  |__/  |__/
```

![Screenshot from 2016-12-01 14-38-08.png](https://qiita-image-store.s3.amazonaws.com/0/57768/136097c9-d68a-2439-134e-d3e4f5a221a5.png)

# cowfileを書く

cowfileは拡張子こそ`.cow`だがperlのコードである。`$the_cow`にAAを入れる。

 - 吹き出しの`\`は`$thoughts`と書く。
 - それ以外の`\`は`\\`とエスケープする必要がある。
 - 吹き出しを伸ばすため左側にスペースを作る。
 - `$eyes`とか`$tongue`というのもあるが今回は使わない。D言語くんが舌を出すとどうなるんだろう……

そうしてできたものがこちら。

[Dman cow file](https://gist.github.com/kotet/4be157150af024ea14e825f17c663940)

```
##
## Dman
##
$the_cow = <<EOC;
        $thoughts     ____
         $thoughts    L__L|
            /       \\
           /         \\
          / _______   \\
          \\ \\#/  \\/ \\  /
           \\|#| O| O|#\\
            |#L _L__ #|
            |###|  |##|
            /###/  /##|
           /###/   /##|
          /###/___/###/
         /###########/
         /##########/
            /     \\
            \\     /
           _ \\   /__
          |__/  |__/
EOC
```
![Screenshot from 2016-12-01 14-49-05.png](https://qiita-image-store.s3.amazonaws.com/0/57768/38ecbb35-2940-be41-cc47-f2d4362433d0.png)

これを先ほどのディレクトリに入れてやればいい。

```console
$ sudo cp dman.cow /usr/share/cowsay/cows/
$ cowsay -f dman 唯一神Dを崇めよ
```

![Screenshot from 2016-12-01 14-51-38.png](https://qiita-image-store.s3.amazonaws.com/0/57768/6549a1a2-ae05-a4b2-271b-e3a142f0f0f2.png)

携帯性を持たせるため小さいバージョンも作った。@simd_nyan さんの[こちら](https://gist.github.com/simdnyan/20e8fa2a2736c315e2c1)のAAを使わせてもらった。

[Mini Dman cow file](https://gist.github.com/kotet/1e200c8f004bdd9ef67871eebd9ed811)

![Screenshot from 2016-12-01 15-18-23.png](https://qiita-image-store.s3.amazonaws.com/0/57768/c3bd8169-52c1-7735-b4cd-9dd858a16ba0.png)

これでいつでもどこでもD言語くんのお告げが聞けるだろう。
Gebに入門する時に助けになるもの

# はじめに
このエントリーは[Geb Advent Calendar 2016](http://qiita.com/advent-calendar/2016/geb)の4日目のエントリーです。
今日はGebのチュートリアルについてです。

# Gebに入門するときに
なんでもそうですが、何かを始めるときは、サクッと動かしながら試せると便利です。
ただGebは、Groovy製のSeleniumラッパーという性質上、全部理解しようとするとGroovy(もしくはJava)、Selenium WebDriver、といった知識が必要になり、スタートしにくいかな、という印象があります。
私自身の経験としてもそうですし、まわりからもどうやって始めたらいいかの相談をうけることがたまにあります。

同じような悩みを抱える人に、Gebの中の人のコメントが助けになると思うので紹介しています。

## 中の人からのアドバイス
同じような質問は世界でもありまして、以前Gebのメーリングリストに、「どうやったらGebの基本学べる？　チュートリアルとかある？」という質問が投げかけられたことがあります。
で、コミッタの人が回答したことがあります。
https://groups.google.com/d/msg/geb-user/tgnM4gVMRFs/j3Bdo3D6NgAJ

それによると、

- チュートリアルがあるのかは知らない
- でも、ドキュメントしっかり書いてあるからそれを見るとよい
    - http://www.gebish.org/manual/current/
- Githubにいくつかサンプルもあげてある
    - https://github.com/geb
- 何か困ったことがあればいつでもメーリングリストへ
    - https://groups.google.com/forum/#!forum/geb-user

とのことでした。なのでまずはこのあたりを参考にするとよいのかな、と思います。
特にGithub上のコードは動作するようにできてるので、それで動きをさくっと見るのはよいかな、と思います。

Github上のコードについては、実際どのように動いているかを別エントリーで紹介しようとおもっています。

# まとめ
たよるなら公式！

## 明日のエントリー
[@kosukeito](http://qiita.com/kosukeito)さんのターン！ よろしくお願いします！！
D3.js　はじめの環境作成

### この記事でやること

* D3.jsの最も簡易な例のための環境を作成します
    * HTTPサーバ
    * D3.js本体
* 流行の技術の中でも最小構成で試すことが簡単な部類であることを確認します

### 環境作成

D3.jsとそれを使った画面描画自体はコンパイルを必要としません。
棒グラフを表示するだけならばすぐに環境が作れます。

#### HTTPサーバ

PythonのSimpleHTTPServerが手間がかからず良いでしょう。
Windowsでもインストールが済んでいればMac等と同じように使えるので各所の解説を利用できます。
すでに他の方法でうまくいっていればそれを使って構いません。

※データファイルを別ファイルに分割して読み込ませる場合には（大抵はそうでしょう）ローカルのファイルを直接ブラウザに渡して動かそうとしてもうまくいきません。

#### D3.jsの読み込み

手元にダウンロードするか、D3.jsのサイトから読み込むか。
いずれにしてもJavaScriptのURLを指定します。
https://d3js.org/

```html:
<script src="https://d3js.org/d3.v4.min.js"></script>
```
テストでいい感じに一時ディレクトリを作る「rspec-temp_dir」

# rspec-temp_dirとは？
rspecでいい感じに一時ディレクトリを作るためのgemです

* https://github.com/sue445/rspec-temp_dir
* https://rubygems.org/gems/rspec-temp_dir

# なぜ作ったか?
テストで検証したい内容がメソッドの戻り値だとその戻り値を`expect` で検証するだけなのでテストが楽なのですが、ファイルを出力するようなメソッドだとファイルが書き込まれているか検証する必要があります。

テストで作ったファイルを毎回 `after` で消すとテストコードが肥大化するので、「それなら最初から一時ディレクトリにファイルを書き出してやればファイル消す必要ないのでは?」という発想で作りました。

JUnitの [TemporaryFolder](http://junit.org/junit4/javadoc/4.12/org/junit/rules/TemporaryFolder.html) にインスパイヤされています。

# 使い方
`describe` や `context` の中に `include_context "uses temp dir"` を書くとテスト実行時に一時ディレクトリが作られて `temp_dir` （`String` 版）と `temp_dir_path`（`Pathname` 版）で取得できるようになります。

# サンプルコード
```ruby
require 'rspec/temp_dir'

describe "uses temp dir" do
  include_context "uses temp dir"

  it "should create temp_dir" do
    expect(Pathname(temp_dir)).to be_exist
  end

  it "can create file in temp_dir" do
    temp_file = "#{temp_dir}/temp.txt"

    File.open(temp_file, "w") do |f|
      f.write("foo")
    end

    expect(File.read(temp_file)).to eq "foo"
  end

  describe "#temp_dir_path" do
    subject{ temp_dir_path }

    it { should be_an_instance_of Pathname }
    it { should be_exist }
  end
end
```

# 実装
`require` を除くとたったこれだけです [^uses_temp_dir]

[^uses_temp_dir]: https://github.com/sue445/rspec-temp_dir/blob/v1.0.0/lib/rspec/temp_dir/uses_temp_dir.rb

```ruby:lib/rspec/temp_dir/uses_temp_dir.rb
RSpec.shared_context "uses temp dir" do
  around do |example|
    Dir.mktmpdir("rspec-") do |dir|
      @temp_dir = dir
      example.run
    end
  end

  attr_reader :temp_dir

  def temp_dir_path
    Pathname(temp_dir)
  end
end
```

`Dir#mktmpdir` の「ブロック内から抜けると一時ディレクトリを削除する」という特徴を利用しています。

https://docs.ruby-lang.org/ja/2.3.0/method/Dir/s/mktmpdir.html

# v0.0.4 -> v1.0.0
アドベントカレンダー執筆に際してv1.0.0にしました。

破壊的な変更は下記です。

## RSpec 2系のサポートをやめた
* さすがにもう誰も2系使っていないよねということでサポートやめた
  * 少なくとも自分の観測範囲では見ていない
* 2系と3系両方考慮するとコードが汚くなるのでやめたかった
  * 2系だと `shared_context` は `Object` に生えていて、 3系だと `RSpec` に生えているため下記のように書くしかなかった :innocent: 

```ruby:lib/rspec/temp_dir/uses_temp_dir.rb
(RSpec.respond_to?(:shared_context) ? RSpec : Object).shared_context "uses temp dir" do

end
```

https://github.com/sue445/rspec-temp_dir/blob/v0.0.4/lib/rspec/temp_dir/uses_temp_dir.rb#L5

## Ruby 1.9系のサポートをやめた
* [json](https://rubygems.org/gems/json) gemが2系でRuby 2系未満を切り捨てて `bundle install` できなくなったため
  * https://github.com/flori/json/blob/master/CHANGES.md#2015-09-11-200
* json gem使っているのはdevelopment dependencyなので「Ruby 1.9系なら json 1系を使う」みたいなTravis CIの設定を書く（もしくは1.9自体Travisでビルドしない）という選択肢もあったけど、積極的にRuby 1.9系をサポートし続ける理由も特に思いつかなかったのでバッサリ `spec.required_ruby_version = ">= 2.0.0"` を書きました。
Vim 8.0 Advent Calendar 4 日目 JSON サポート

この記事は [Vim 8.0 Advent Calendar](http://qiita.com/advent-calendar/2016/vim8) の 4 日目の記事です。

チャンネルやジョブが追加されたのに合わせて、外部と JSON でのやり取りを行うことを想定して、JSON サポートが追加されました。

## エンコード/デコードする

`json_encode()` と `json_decode()` を使うことで、Vim の内部データと JSON 文字列を相互に変換できます。

```vim
let obj = {'users': [{'name': 'thinca', 'lang': 'vim'}]}
let json = json_encode(obj)
echo json
" => {"users":[{"lang":"vim","name":"thinca"}]}
echo json_decode(json)
" => {'users': [{'lang': 'vim', 'name': 'thinca'}]}
```

## 追加された値

Vim script には、`true`/`false` などの bool 値や、`null` などの値は存在しませんでした。
このままだと JSON と相互に変換するのに支障が出るため、新しくこれらを表す値が追加されました。

- `v:false`
- `v:true`
- `v:null`
- `v:none`

これらによって、bool 値や null を含む JSON も正しく相互変換されます。

```vim
let json = '{"is_vimmer":true,"has_free_time":false,"future":null}'
let obj = json_decode(json)
echo obj
" => {'future': v:null, 'is_vimmer': v:true, 'has_free_time': v:false}
echo json_encode(obj)
" => {"future":null,"is_vimmer":true,"has_free_time":false}
```

## `js_encode()` `js_decode()`

チャンネルには JSON モードの他に JS モードがありました。これらに対応する `js_encode()` `js_decode()` があります。これらは JavaScript のオブジェクトのような形式を扱います。

```vim
let js = '{vimmers:["thinca",,],}'
let obj = js_decode(js)
echo obj
" => {'vimmers': ['thinca', v:none]}
echo js_encode(obj)
" => {vimmers:["thinca",,]}
```

- オブジェクトのキーは必要がなければダブルクォートで囲われません。
- 末尾カンマを許容します。
- 配列内の空の要素(連続するカンマ)を許容し、この場合は `v:none` が使われます。

かなり特殊な値になるので、通常は JSON を使えばよいでしょう。