OmniAICreator/Qiita-1.07M huggingface dataset:
Railsの認証Gem deviseを使ったテストをする

#環境
ruby 2.2.2p95
Rails 4.2.3
devise 3.5.6
minitest 5.8.4
fixture

#deviseの導入
導入方法については詳しい記事がたくさんあるのでそちらを参考にしてください。
[Qiita:Deviseの設定手順をまとめてみた。 その1　導入編](http://qiita.com/itboze/items/ea0d9236d89fa24a7a1c)
とか
[Qiita:Rails 4.2 で ユーザー管理・認証 (devise)](http://qiita.com/Salinger/items/873e3c667462746ae707)
とか。

フィールドを追加する場合はこちらを参考にすると良いと思います。
[Qiita:Rails + Deviseでusernameを追加する](http://qiita.com/arcoyk/items/5f874be98fe25ab742ef)

#testの前に
[githubのwiki](https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and-4-(and-RSpec))は目を通しておくと良いでしょう。
あとminitestで書きます。
wikiにはRSpec, factrygirlの書き方が載っていますので参考にしてください。

#functional test
fixtureでユーザーを用意します。

```test/fixtures/users.yml
john:
  email: "john@example.com"
  encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %>
```

コントローラーテストでは`include Devise::TestHelpers`を使います。

```ruby:test/controllers/hoges_controller_test.rb
class hogesControllerTest < ActionController::TestCase
  include Devise::TestHelpers
  def setup
    @user = users( :john )
    sign_in(@user)
  end
end
```
これだけで`user:john`でログインしたことになり、テストができます。

#integration test
Wikiによると`Devise::TestHelpers`が使えないようなのでDeviseの核となっているWardenのTestHelperを使います。

```ruby:test/integration/fuga_test.rb
class FugaTest < ActionDispatch::IntegrationTest
  include Warden::Test::Helpers
  
  def setup
    Warden.test_mode!
    @user = users( :john )
    login_as(@user, :scope => :user)
  end
end
```

これでコントローラーテストと同様`user:john`でログインしたことになります。

#ヘルパーを使う場合
こんな感じで`log_in`というメソッドをつくってみると、functional test, integration testどちらでも使えます。
（ログイン周りでもう少し面倒なことをしている場合は、このように共通化しておくと良いと思います。

```ruby:test/test_helper.rb
class ActiveSupport::TestCase
  def log_in( user )
    if integration_test?
      #use warden helper
      login_as(user, :scope => :user)
    else #controller_test, model_test
      #use devise helper
      sign_in(user)
    end
  end
  
  # 統合テスト内ではtrueを返す
  def integration_test?
    defined?(post_via_redirect)
  end
end
```

#注意：confirmableについて
メール認証オプションであるconfirmableを利用している場合は普通にログインしても`unauthenticated`が返ってきてしまうため、以下いずれかの対応が必要です。
（自動テストでなければメール配信してリンクをクリックしたり、コンソールに書き出されたURLへアクセスすれば良いのですけどね。）

##1:fixtureで対応する場合
userにconfirmed_atを追記してください。
これでメール認証済みになります。

```test/fixtures/users.yml
john:
  email: "john@example.com"
  encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %>
  confirmed_at: <%= Time.now - 100 %>
```

##2:新規ユーザー作成している場合
テスト中に新規ユーザーを作成するケースがあると思います。
その場合は`skip_confirmation!`を使うと認証をスキップできます。
（user.confirmでも良いですが、こちらを使うと「本登録完了しました」メールが発送されます。）
※先ほどtest_helper内に作成したlog_inメソッドを利用しています。

```ruby:test/controllers/hoges_controller_test.rb
user = User.new email: 'john@example.com', password: '12345678'
user.skip_confirmation!
user.save!

log_in( user )
```

###参考
[そんなこと覚えてない: Devise で email 変更する。](http://blog.eiel.info/blog/2012/12/30/modify-email-on-devise/)
[Qiita: deviseでconfirmable設定をした際の確認メールをスキップさせる skip_confirmation! は、対象のオブジェクトをsaveする前に書く](http://qiita.com/stm3/items/ff976c0a6ec2dae9814c)

#謝辞
Twitterでテストがうまくいかないことを呟いていたら、颯爽と現れてアドバイスをいただいた[伊藤淳一](https://twitter.com/jnchito)さん、本当にありがとうございます。
※ちなみにその時ハマっていたのは最後に書いたconfirmableのところです。
KotlinでAbstractClassをnewする


(kotlinでnewするっていう表現良くないかも．．．

Javaでたまにやるコレ

抽象クラス`Foobar`の匿名サブクラスを実装して，インスタンスを生成するやつ

```java:java
abstract class FooBar {
	public void hogehoge();
}

FooBar foobar = new FooBar() {
		public void hogehoge() {
			...
		}
	}

```


Kotlinでは`object`というキーワードを用いて行う

```kotlin:kotlin
abstract class FooBar {
	fun hogehoge()
}

val foobar = object: FooBar() {
		override fun hogehoge() {
			...
		}
	}

```

#### 参考
> http://stackoverflow.com/questions/34143564/create-an-instance-of-an-abstract-class-in-kotlin

> http://kotlin.hatenablog.jp/entry/2012/12/19/212600
lubuntuの「ファイル名を指定して実行」から「icedove」でthunderbirdを起動する方法

debian から ubuntuに切り替えたが、thunderbirdと入力するのがダルかった。
lubuntu 16.04 beta2にて確認

## `win + r`キー

![dove.png](https://qiita-image-store.s3.amazonaws.com/0/25728/6e86c686-084a-c737-45ce-2b730af67b30.png)

## 準備

```bash:
ln -s /usr/bin/thunderbird /usr/local/bin/icedove
```

なおSHELLのPATHに追加した場所においても認識しなかった。例: `$HOME/work/bin/`
Rails + MySQL で、`validates uniqueness` は、文字列の後に空白があると効かない

Rails で、`validates :name, uniqueness: true` にしているのに、
`Duplicate Error` が出るケースに出会ったので書く。
(レースコンディションではないケース)

# MySQL の文字列比較は、後続の空白を無視する

> MySQL のすべての照合順序は、PADSPACE 型のものです。これは、MySQL 内のすべての CHAR、VARCHAR、および TEXT 値が、末尾のスペースに関係なく比較されることを意味します。
> http://dev.mysql.com/doc/refman/5.6/ja/char.html

# Ruby は文字列の空白を無視しない(ので、validation 発動しない)

```
class Person < ActiveRecord::Base
  validates :name, uniqueness: true
end

person = Person.new(name: "一郎")
person.save
# => true

# 同名は false
person = Person.new(name: "一郎")
person.save
# => false

# 末尾に空白を入れると、Error になる
person = Person.new(name: "一郎 ")
person.save
# => ActiveRecord::RecordNotUnique: Mysql2::Error: Duplicate entry Error
```

# 対応方法

`before_validation` で処理することにした。

```
class Person < ActiveRecord::Base
  validates :name, uniqueness: true
  before_validation -> { self.name.rstrip! }
end
```
Windowsでpipを使う

# はじめに
Pythonで公開された拡張パッケージを利用する場合、パッケージ管理システムである`pip`を使うことでパッケージ化されたモジュールを簡単に実行環境へデプロイできる。

WindowsではPython(3.5.1時点)に同梱されているため、追加でインストールする必要はない。

## 実行環境
- Python 3.5.1
- pip 8.1.1

# ヘルプ
`help`コマンド

```bash:console
>pip help 
```

# ネットワークインストール
`pip install <packagename>`

# オフラインインストール
ダウンロードしたパッケージをオフライン環境に持ち込んでインストールする手順。

## パッケージをインターネットからダウンロード

`download`コマンドを使う。`pip --download`はdeprecatedになった。

```bash:console
>pip download <packagename>
```

`<packagename>-<versions>.tar.gz`がコマンドを実行したフォルダにできている。

## ダウンロードしたパッケージからインストール

`<packagename>-<versions>.tar.gz`を指定すればインストールできる。

```bash:console
>pip intall <packagename>-<versions>.tar.gz
```

# インストールしたパッケージの一覧
インストール確認は`freeze`コマンドを使う。

```bash:console
>pip freeze
<packagename>==1.0.0
```
Ratchetを試す

今回はPHPでWebSocketを扱うためのライブラリ[Ratchet]("http://socketo.me/" Ratchet)のチュートリアルを試してみます。

作業ディレクトリは
`php-ratchet/`をアプリのルートディレクトリとします
自分の作業環境はcentos6.7をdocker上で動かしています。

##composerインストール

以下のコマンドをかましましょう

```
php-ratchet> curl -sS https://getcomposer.org/installer | php
```

##composer.jsonの編集

```php:php-ratchet/composer.json
{
    "autoload": {
        "psr-0": {
            "MyApp": "src"
        }
    },
    "require": {
        "cboden/ratchet": "0.3.*"
    }
}
```


##インストール

```
php-ratchet> php composer.phar install
```

##Socket接続時の処理を記述する

まずはディレクトリを作成します

```
php-ratchet> mkdir -p src/MyApp
```

PHPファイルの作成

```
php-ratchet> touch src/MyApp/Chat.php
```

編集

```php:php-ratchet/src/MyApp/Chat.php
<?php
namespace MyApp;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

class Chat implements MessageComponentInterface {
    protected $clients;

    public function __construct() {
        $this->clients = new \SplObjectStorage;
    }

    public function onOpen(ConnectionInterface $conn) {
        // Store the new connection to send messages to later
        $this->clients->attach($conn);

        echo "New connection! ({$conn->resourceId})\n";
    }

    public function onMessage(ConnectionInterface $from, $msg) {
        $numRecv = count($this->clients) - 1;
        echo sprintf('Connection %d sending message "%s" to %d other connection%s' . "\n"
            , $from->resourceId, $msg, $numRecv, $numRecv == 1 ? '' : 's');

        foreach ($this->clients as $client) {
            if ($from !== $client) {
                // The sender is not the receiver, send to each client connected
                $client->send($msg);
            }
        }
    }

    public function onClose(ConnectionInterface $conn) {
        // The connection is closed, remove it, as we can no longer send it messages
        $this->clients->detach($conn);

        echo "Connection {$conn->resourceId} has disconnected\n";
    }

    public function onError(ConnectionInterface $conn, \Exception $e) {
        echo "An error has occurred: {$e->getMessage()}\n";

        $conn->close();
    }
}
```



##WebSocketサーバーPHPの作成

まずはディレクトリ作成

```
php-ratchet> mkdir bin
```

ファイル作成

```
php-ratchet> touch bin/chat-server.php
```

編集

```php:php-ratchet/bin/chat-server.php
<?php
use Ratchet\Server\IoServer;
use MyApp\Chat;

    require dirname(__DIR__) . '/vendor/autoload.php';

    $server = IoServer::factory(
        new Chat(),
        8080
    );

    $server->run();
```



これで一応Web Socketが使えるようになりました
チュートリアル追ってるだけなんですけど…


##使ってみる

以下のコマンドを実行します

```
php-ratchet> php bin/chat-server.php
```

そのほかのコンソールで以下のコマンドを実行

```
telnet localhost 8080
```

Mac上で直接実行している場合は上のコマンドで大丈夫ですが、僕はdockerのアドレスを叩かないといけないので
こんな感じでした

```
telnet 192.168.99.100 8080
```

ポートに関してはdocker runした時のポートによって変わります
僕は`8080:80`としてしまったので`chat-server.php`のポートを8080から80に変更しておきました



telnetしたコンソールに何か文字を打ってみると、php側のコンソールに入力した文字列がリアルタイムに反映させるのが確認できると思います


ではでは、以上になります
capistrano-npmで差分installする設定を忘れるとデプロイが長くて辛い

capistrano-npmの設定を何も考えてなかったら
デプロイ時に毎回npm installで1から全部インストールしててクソ重かったので忘備録。

```rb:config/deploy.rb

# プロジェクト直下のnode_modulesにインストールしてる前提
set :linked_dirs, %w{node_modules}

```
小ネタ TravisCIでデーモンプロセスを起動してテスト終了時にKILLする

小ネタです。

TravisCIで、ElixirとDockerを組み合わせてテストをしたかったのですが、併用しようとするとエラーが発生して現状では使えないようです。。

TravisCIのメンバの方にもちょっとお手伝いお願い出来ましたが事象解決には至りませんでした。

* https://github.com/letusfly85/generate_test_data4s3/pull/1


仕方なしに、Dockerではなく、プロセスをデーモン化してテスト実行しようとしましたが、TravisCIは、デーモン化したプロセスがテスト終了後にも生き残っていると最後に自動でKillして、終了コード[1]を返却する仕様のようです。

きちんとできてはいるけど、面倒くさいな。。と思いつつ、`after_script`を利用して削除することにしました。

以下サンプルとなります。

```.travis.yml
language: elixir
elixir:
    - 1.2.3
otp_release:
    - 18.0
before_install:
  - npm install kinesalite
  - npm install aws-sdk
  - export PATH=$PATH:node_modules/.bin
  - node kinesalite.js &
  - KINESALITE_PID=$!
  - sleep 3
script:
  - mix test
after_script:
  - kill $KINESALITE_PID
```

以下のように、`&`を使って起動したプロセスを`$!`で取得します。

```bash
  - node kinesalite.js &
  - KINESALITE_PID=$!
```

そして、`after_script`でkillする。。

Dockerでやりたい。。このやり方はポータビリティが低いと思います。

早くElixirとDocker両方使えるようにならないのかな、とサポートにメールを送り続けることにします。


---

本日は以上となります。
シェルスクリプトで文字に色付け

#小ネタ

シェルで気軽に文字のをする関数を作ってみました。

```bash:filename
pallet()
{
  cat << EOF |awk 'sub(/#.*/,"") >=0 && NF>0'
# COLOR
BLACK     [30m        RED       [31m        GREEN     [32m        YELLOW    [33m
BLUE      [34m        MAGENTA   [35m        CYAN      [36m        WHITE     [37m
# BACKGROUND COLOR
BK_BLACK     [40m        BK_RED       [41m        BK_GREEN     [42m        BK_YELLOW    [43m
BK_BLUE      [44m        BK_MAGENTA   [45m        BK_CYAN      [46m        BK_WHITE     [47m
# CURSOR
MOVE_TOP     [1;1H        CLEAR        [2J        CLEAR_LINE   [0J
# CHARACTER
ORG       [0m        BOLD      [1m        UNDER     [4m        BLINK     [5m        REVERSE   [7m
EOF
}
export -f pallet

paint()
{
  COLOR=$1
  PATTERN="${2:-.*}"
  awk -v PATTERN=$PATTERN -v COLOR=$COLOR '
  BEGIN{ while ( "pallet" |& getline ) for(i=1;i<=NF;i=i+2)PAL[$i]="\033"$(i+1); }
  gsub(PATTERN,PAL[COLOR] "&" PAL["ORG"]) >= 0
  '
}

echo aaa bbb ccc |paint BLUE
echo aaa bbb ccc |paint RED a
echo aaa bbb ccc |paint YELLOW [ac] |paint BOLD
```
paint関数：標準入力を読みこんで文字に色を付けて表示する
　第一引数：色
　第二引数：色付けする文字のパターン（awk正規表現）
文字の色を変えるだけでなく、背景色を変えたり、画面クリア／カーソル位置変更や太字や下線を引くことも可能です。
簡単にログ解析をする


[Request-log-analyzer](https://github.com/wvanbergen/request-log-analyzer)

コマンドラインからログを渡すとテキストやHTML形式などで出力してくれる
(現在開発とまってる)

## インストール

```
$ gem install request-log-analyzer
```

バージョンは 1.13.4 (3/29現在)

## 実行方法

### サポートするログフォーマット

* amazon_s3
* apache (Combine)
* delayed_job
* haproxy
* merb
* mysql (Slow logのみ)
* postgresql
* rack 
* rails  (rails2形式)
* rails3  (rails4もOK)
* w3c

カスタマイズも可能

### Apache

```
$ request-log-analyzer access_log
```

出力される項目

* Request distribution per hour
* HTTP methods
* HTTP statuses
* Most popular URIs
* User agents
* Referers
* Traffic - by sum 
* Traffic - by mean

### MySQL (SlowLog)

```
$ request-log-analyzer -f mysql mysql-slow.log
```

出力される項目

* Query time per user - by sum 
* Query time per user - by mean 
* Query time - by sum 
* Query time - by mean
* Lock time - by sum
* Rows examined - by sum
* Rows examined - by mean 
* Rows sent - by sum
* Rows sent - by mean
EclipseでChisel

Chiselはなかなか素敵なんだけど、
チュートリアルが当然のごとくコンソール使ってて 
怖い
 面倒だからイマイチ手が出せない。
じゃあIDEで使えば私のようなITゆとりも安心してかけますね。

なおEclipse初めて触るレベルの人が書いてます。

#Chisel
ScalaでHDLが書ける素晴らしいライブラリ。
ScalaをHDLに変換(高位合成)する<b>のではない</b>。
あくまで内部DSL、ScalaでVerilogを書くためのライブラリ。

RISC-Vという命令セットのCPUがChiselで設計されて公開されている。

#必要なもの
##Scala IDE for Eclipse
http://scala-ide.org/

##Chisel + αが既に導入されているちょうどいいEclipseプロジェクト
自分で作るより
Eclipseで書いている人のリポジトリ探して引っ張ってくるのが手っ取り早い
ということでこれを使わせてもらう。
https://github.com/althebaker43/simple_chisel_counter

##Mavenプラグイン
上記プロジェクトがMaven使っているようなので。

#とりあえず動かしてみる
Nビットカウンターとそのテスト(Scala JUnit)が入っていて
テストを走らせるとちゃんとパスする。

#Verilog出力してみる

```scala
object example {
  def main(args: Array[String]): Unit = {
    val mainArgs = Array("--backend","v","--targetDir","./verilog")
    chiselMain(mainArgs, () => Module(new Counter()))
  }
}
```

こんなコードを追加して実行すればverilog下に.vファイルが生成される

```verilog:Counter.v
module Counter(input clk, input reset,
    output[3:0] io_out,
    input  io_reset
);

  reg [3:0] countReg;
  wire[3:0] T4;
  wire[3:0] T0;
  wire[3:0] T1;
  wire[3:0] T2;
  wire T3;

`ifndef SYNTHESIS
// synthesis translate_off
  integer initvar;
  initial begin
    #0.002;
    countReg = {1{$random}};
  end
// synthesis translate_on
`endif

  assign io_out = countReg;
  assign T4 = reset ? 4'h0 : T0;
  assign T0 = T3 ? T2 : T1;
  assign T1 = io_reset ? 4'h0 : countReg;
  assign T2 = countReg + 4'h1;
  assign T3 = io_reset ^ 1'h1;

  always @(posedge clk) begin
    if(reset) begin
      countReg <= 4'h0;
    end else if(T3) begin
      countReg <= T2;
    end else if(io_reset) begin
      countReg <= 4'h0;
    end
  end
endmodule
```

生成されるコードは可読性皆無なので、ブラックボックスとして割りきりましょう。
Gem のマイナーバージョン比較に to_f を使わないようにする

# 問題点
まず、Gem のマイナーバージョンが 10 を越えると、バージョンが `5.10` という文字列になる。

マイナーバージョンを比較したいときに、これを to_f すると

```irb
irb(main):001:0> "5.10".to_f
=> 5.1
```

なので、 `5.8 より大きいときに` という意図で下記を書くと、

```rb
if foo_version.to_f > "5.8".to_f
```
マイナーバージョンが 10 を超えた時に困ったことになる。

```irb
irb(main):002:0> "5.8".to_f > "5.8".to_f
=> false
irb(main):003:0> "5.9".to_f > "5.8".to_f
=> true
irb(main):004:0> "5.10".to_f > "5.8".to_f
=> false
irb(main):005:0>
```


# 解決策

Gem::Version を使う。 参考：http://qiita.com/itkrt2y/items/69f0933f65665bc999b5

```irb
irb(main):006:0> Gem::Version.new("5.10") > Gem::Version.new("5.8")
=> true
irb(main):007:0>
```
覚えた使えるGitトリック _Stash

2016年 初春。
アルコール漬けのチンピラからプログラマに転身した私が覚えたトリックを備忘録兼ねてまとめるTips_Git編

---

- git stash

**愛してるぜ、スタッシュ!!**

心の底からそう思う、数多くあるgit呪文の中でも先週の俺ランキングNo1。

## 使うとき

1. ボクはいまkellyブランチで作業をしています。あと二日はかかりそう。
2. すると突然、急ぎの修正作業依頼が舞い込みました。
3. 一旦、kellyブランチをコミットして、masterからbillyブランチを切り出して修正作業を行っていました。今までのアチキは。
4. でも、まだコミットしたくない！全然区切り良くない！！って思ってた。本当は。
5. そんな時には**git stash**
6. 今やった変更を退避してくれる。git的には変更は無かったものになるけど実は裏できちんと覚えてる。君のこと。
7. そうすれば、billyブランチに切り替えて修正をコミット&プッシュしても、またkellyブランチに戻ってあの日の修正から始められるのよ。

##使い方
一旦、退避しておきたいブランチで、単純に

```:kelly_branch
git stash
```
すれば、いいだけ。

すると

```:kelly_branch
Saved working directory and index state WIP on kelly_branch: c4f1c56 
"さっきのコミット"
HEAD is now at c4f1c56 さっきのコミット
```
みたいな感じで退避されます。Saved working directoryって書いてますね。

```git status```しても

```:kelly_branch
On branch kelly_branch
nothing to commit, working directory clean
```
こんな感じで、変更が無かったことになってるよね。

**あの日に帰りたい**
billyブランチの修正が終わって、kellyに戻ってきた場合、やった修正はstashによって隠れているので、戻しましょう。

```:kelly_branch
git stash list
```
とやると、stashした一覧が見れます。そうです。stashは何度もできるのです。

```:kelly_branch
stash@{0}: WIP kelly_branch: c4f1c56 "さっきのコミット"
```
今は１度しかstashしていないので```stash@{0}```しかありませんが、複数ある場合は、```stash@{1}```とか```stash@{2}```とかが出来上がります。この```stash@{x}```はstash名です。

applyメソッドを使って、戻したいstash名を指定すると、あの日に帰れます。

```:kelly_branch
//戻します。
git stash apply stash@{0}
```
ちなみに、```git stash apply pop```とやると、常に最新のstashに戻れます。

これで、ブランチを切り替えまくって、仕事してる感を味わいましょう。

##参考
[git stash した内容をさっくり確認したい](
 http://qiita.com/udzura/items/26e41da43d2adefa51b8?utm_content=buffer0d5b5&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer)
[変更を一時的に退避！キメろgit stash]
(http://qiita.com/udzura/items/26e41da43d2adefa51b8?utm_content=buffer0d5b5&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer)
NSURLSettionにproxyを設定する


##NSURLSettionにproxyを設定する
```objc:.m
    NSString *urlString = @"http://hoge.com";
    NSURL *url = [NSURL URLWithString:urlString];
    
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];

    // proxyの設定 ここから
    NSString* proxyHost = @"my.proxy";
    NSNumber* proxyPort = [NSNumber numberWithInt:8080];
    
    NSDictionary *proxyDict = @{@"kCFNetworkProxiesHTTPEnable" : @YES,
                                (NSString *)kCFNetworkProxiesHTTPProxy : proxyHost,
                                (NSString *)kCFNetworkProxiesHTTPPort : proxyPort};

    config.connectionProxyDictionary = proxyDict;
    // proxyの設定 ここまで

    NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
    
    NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    }];
    [task resume];
```

参考URL
■ [NSURLSessionで任意のProxyを使う](http://qiita.com/funayoi/items/a6ed4004a7763aaef64c)
■ [Configuring proxy for NSURLSession in iOS 9](https://forums.developer.apple.com/thread/19356)
★まだFinderで消耗してるの？★〜Mac、Finderでホームディレクトリを表示する〜

MacのFinderの使い方がよくわかんないけど、とりあえず左っ側にホームディレクトリが出ててくれればどうにかなる

ここに追加したい
![image](https://qiita-image-store.s3.amazonaws.com/0/36889/54336121-27b8-fb98-d171-9a039c058f36.png)

## やり方
![image](https://qiita-image-store.s3.amazonaws.com/0/36889/3430b90a-f63f-fe79-d3c3-9cfe1c3568b6.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/36889/8b1be6eb-a3e7-852a-f1b0-8a4419e22624.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/36889/f1de4450-c260-cd04-6613-a3057ed3e264.png)

こいつにチェック
![image](https://qiita-image-store.s3.amazonaws.com/0/36889/3754d7c8-ebf6-5838-5248-ae08f209e545.png)
Yesodでセッション情報をDBに格納するようにする

Yesodが作ってくれるテンプレートプロジェクトでは、セッション情報をファイルに格納するようになっている。
しかしロードバランサ環境ではこれでは困るので、DBに格納するようにしたい。

Yesodでのセッションの実装を差し替える方法は存在していて、本エントリではその方法を紹介する。


# ２つのモジュール
次の２つのモジュールがキモ。

* [Web.ServerSession.Backend.Persistent](https://github.com/yesodweb/serversession/tree/master/serversession-backend-persistent)
* [Web.ServerSession.Frontend.Yesod](https://github.com/yesodweb/serversession/tree/master/serversession-frontend-yesod)

（リンク先はGitHubにしてあります）


使い方が書いてあるドキュメントがなかなか見つからなかったので結局ソースのコメントを見て探った。

2016.3.31追記
この辺りのモジュールの構成の意味を解説している[Qiitaの記事](http://qiita.com/lotz/items/4a154f2067ecd5dbb08f)がありました。ありがたいです。

# ソースの修正

## cabalファイル

cabalのbuild-dependsに次を追記。

```
, serversession
, serversession-frontend-yesod
, serversession-backend-persistent
```

## スキーマをMigrateする処理を変える
セッション情報をDBに格納するにはスキーマのMigrate処理でテーブルを作る必要がある（蛇足だが、MongoDBの場合は不要な処理だと思う）。

まずModel.hsを修正。

修正前）

```Model.hs
share [mkPersist sqlSettings, mkMigrate "migrateAll"]
    $(persistFileWith lowerCaseSettings "config/models")
```

修正後）

```Model.hs
share [mkPersist sqlSettings, mkSave "entityDefs"]
    $(persistFileWith lowerCaseSettings "config/models")
```

```mkMigrate``` 関数を後で呼び出すので、ここではmodelsファイルのパース結果を```entityDefs```に束縛するようにする（mkMigrateは２回呼び出すとエラーになるので）。

なおimportの```mkMigrate```を```mkSave```に変更するのを忘れずに。

次にApplication.hsに、セッション情報格納用のスキーマを定義する処理を追記する。

```Applicatino.hs
import qualified Data.Proxy as P
import qualified Web.ServerSession.Core as SS
import qualified Web.ServerSession.Backend.Persistent as SS

-- Create migration function using both our entities and
-- serversession-backend-persistent ones.
mkMigrate "migrateAll" (SS.serverSessionDefs (P.Proxy :: P.Proxy SS.SessionMap) ++ entityDefs)
```

ここでやっていることは、予めパースしておいた```config/models```の結果とセッション情報を格納するスキーマ情報を結合した上でMigrateする、という処理。

## sessionBackendの実装を差し替える
ストレージにセッションを格納するようにFoundation.hsを修正する。
まずはimportを追加。

```Foundation.hs
import Web.ServerSession.Backend.Persistent
import Web.ServerSession.Frontend.Yesod
```

Yesodクラスのインスタンスにする際の```makeSessionBackend```関数の実装を変更する。

```Foundation.hs
-- | Cookie name used for the sessions of this example app.
sessionCookieName :: Text
sessionCookieName = "SESSION"
```

```Foundation.hs
    makeSessionBackend = simpleBackend opts . SqlStorage . appConnPool
      where opts = setIdleTimeout     (Just $  5 * 60) -- 5  minutes
                 . setAbsoluteTimeout (Just $ 20 * 60) -- 20 minutes
                 . setCookieName      sessionCookieName
```

セッションタイムアウトの数値は適当に変更してください。


# 課題
セッション情報を格納するDBとアプリケーション情報を格納するDBを分けたい、という要件があると思うので、これに対処する方法を今後検討したい。
セグエを使わず画面遷移後元の画面をリフレッシュサンプル

#前回の投稿を具体的にしたサンプルを作成しました。
##元ViewControllerにTableViewを配し、簡単なリストを表示ボタンクリックで画面遷移とりあえずDeteiViewControllerとする。
##遷移先の戻るボタンをクリックにて元画面へ戻り、CallBackを利用してTableViewをリフレッシュする
<img src="http://www.sns.ne.jp/imgdata2/qiita_image001.jpg">
(https://github.com/shinsakujazzbass/test)
技術英語 > Standard waveforms: sine, triangle, [sawtooth], etc.

https://reference.digilentinc.com/analog_discovery_2:refmanual#analog_outputs_arbitrary_waveform_generator

> Standard waveforms: sine, triangle, sawtooth, etc.

http://eow.alc.co.jp/search?q=sawtooth&ref=sp
> のこぎり歯
> 鋸歯状の

三角波の片方の斜辺が垂直になった波形のことだろう。
http://vhdlguru.blogspot.jp/2015/04/sawtooth-wave-generator-in-vhdl.html
pacman -Syu大丈夫でした(2016/3/30) postfix

最近dovecotの調子が悪いので恐る恐る`pacman -Syu`した。

## 更新対象

```ruby:
apache-2.4.18-2
apr-util-1.5.4-2
archlinux-keyring-20160215-1
bind-tools-9.10.3.P4-1
binutils-2.26-3
ca-certificates-mozilla-3.22.1-1
cryptsetup-1.7.1-1
curl-7.47.1-2
dbus-1.10.8-1
device-mapper-2.02.146-1
dovecot-2.2.22-1
expat-2.1.1-1
fail2ban-0.9.4-1
fcron-3.2.0-3
findutils-4.6.0-1
flex-2.6.0-2
fontconfig-2.11.94-1
gcc-5.3.0-5
gcc-libs-5.3.0-5
geoip-1.6.6-2
geoip-database-20160301-2
gettext-0.19.7-1
git-2.7.4-1
glib2-2.46.2-4
glibc-2.23-1
gnutls-3.4.10-1
graphite-1:1.3.7-1
grep-2.24-1
groff-1.22.3-6
harfbuzz-1.2.3-1
http-parser-2.6.2-1
hwids-20160306-1
iana-etc-20160314-1
iproute2-4.4.0-1
iputils-20150815.1c59920-3
jemalloc-4.1.0-1
krb5-1.13.2-3
ldns-1.6.17-4
libdatrie-0.2.10-1
libdbus-1.10.8-1
libdrm-2.4.67-2
libevent-2.0.22-2
libldap-2.4.44-1
libmariadbclient-10.1.13-1
libssh2-1.7.0-2
libsystemd-229-3
libthai-0.1.24-1
libzip-1.1.2-1
linux-4.4.5-1
linux-api-headers-4.4.1-1
logwatch-7.4.2-1
lvm2-2.02.146-1
make-4.1-3
man-pages-4.05-1
mariadb-10.1.13-1
mariadb-clients-10.1.13-1
mdadm-3.4-1
mkinitcpio-busybox-1.24.1-1
mpfr-3.1.4-1
mutt-1.5.24-3
nano-2.5.3-1
nodejs-5.9.1-1
openssh-7.2p2-1
openssl-1.0.2.g-3
package-query-1.8-1
pacman-5.0.1-2
pacman-mirrorlist-20160320-1
pango-1.39.0-1
pciutils-3.4.1-1
pcre-8.38-3
perl-5.22.1-2
perl-date-manip-6.53-1
perl-fcgi-0.78-1
perl-log-log4perl-1.47-1
perl-socket6-0.27-1
php-7.0.5-1
php-apache-7.0.5-1
php-gd-7.0.5-1
php-mcrypt-7.0.5-1
pkg-config-0.29.1-1
postfix-3.1.0-3
postgresql-libs-9.5.1-2
python-3.5.1-2
python2-2.7.11-2
python2-packaging-16.6-1
python2-pyparsing-2.1.1-1
python2-setuptools-1:20.5-1
ruby-2.3.0-2
run-parts-4.7-1
s-nail-14.8.6-2
screen-4.3.1-3
sqlite-3.11.1-1
systemd-229-3
systemd-sysvcompat-229-3
texinfo-6.1-1
thin-provisioning-tools-0.6.1-2
ttf-dejavu-2.35-1
tzdata-2016c-1
vim-7.4.1639-1
vim-runtime-7.4.1639-1
vsftpd-3.0.3-2
w3m-0.5.3.git20151119-2
wayland-1.10.0-1
wget-1.17.1-1
whois-5.2.11-1
yaourt-1.8.1-1
```

## postfix

* 以下警告あり。OS再起動し問題ないことを確認。

```
( 91/106) 更新 postfix 100%
警告: /etc/postfix/virtual は /etc/postfix/virtual.pacnew としてインストールされました
警告: /etc/postfix/main.cf は /etc/postfix/main.cf.pacnew としてインストールされました
警告: /etc/postfix/aliases は /etc/postfix/aliases.pacnew としてインストールされました
```
Markerクリックでモーダルを実装する、マーカーはRailsから。

2016年3月末の情報です。更新されても知りません。また、Rails5のβ版が出ているようですが、Rails4でやってます。


- Railsのデータベースから、GoogleMapにマーカーを落とす。
- マーカークリックでモーダルウィンドウを開く。
- モーダルの中に、情報を表示する。
- カスタマイズが難しかったので、gmaps4railsは使わない。

## 準備
### APIKEY
GoogleDevelopersへ登録し、APIKEYを入手する。生成されたスクリプトとAPIKEYをHTML文に貼り付ける。**開発環境でアセットを行っていなかったからかはわかりませんが、application.html.erbにスクリプトのURLを貼り付けた場合、更新でしか地図が表示されなくなりました。これ要注意!**

### Bootstrap
vendor/assets配下にそれぞれ格納する。読み込みはapp/assets配下のそれぞれのapplicationファイルから。

### 地図の大きさについて
id="map"に縦の大きさが無いと表示されないようです。横の要素はbootstrapのクラスcol-xs-12等が使えるのですが、縦は自分で決めないといけない。そのため、僕はスマホ対応を考え、下記のようにしました。もっといいやり方があったら教えて欲しいものです。

```lang:map.css
@media screen and (max-width: 768px) {
	#map {
		height: 50vh;
	}
}
```


## 導入

### モーダルの導入
Bootstrapの公式からのコピペでOK。下記のスクリプトからは、こちらに含まれる、#myModalLabel内のHTML要素を書き換える。

### データベースから受け取る
スクリプトはこんな感じ。Userモデルを作成し、緯度経度の情報を渡す。addListenerでは、クリックした時のアクションを追加する。

```lang:index.html.erb
<script>
  function initMap() {
    var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 4,
      center: {lat: 37, lng: 137}
    });

    var markers = [];
    <% User.all.each do |f| %>
      markers.push(new google.maps.Marker({
        position: {lat: <%= f.latitude %>, lng: <%= f.longitude %>},
        map: map,
        title: 'Hello World!'
        }).addListener('click', function() {
         $('#myModal').modal(),
         $('#myModalLabel').html('<%= f.title %>')
      })
      );
    <% end %>
  }
</script>
```

### MarkerClustererの導入
マーカーが多くなりすぎた時に、近場のマーカーを一箇所にまとめて動作を軽くしてくれる。残念ながらこちらは導入できず。.addListenerとぶつかってしまい、うまくいきませんでした。モーダルを利用しない場合は、利用した方がいいと思います。

```lang:index.html.erb
<script>
  function initMap() {
    var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 4,
      center: {lat: 37, lng: 137}
    });

    var markers = [];
    <% User.all.each do |f| %>
      markers.push(new google.maps.Marker({
        position: {lat: <%= f.latitude %>, lng: <%= f.longitude %>},
        map: map,
        title: 'Hello World!'
        })
      );
    <% end %>
    var markerCluster = new MarkerClusterer(map, markers);
  }
</script>
```

markerClusterは[こちら](http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/src/ )からダウンロードし、vendor/assets/javascriptに入れた。


## 終わり
とりあえず、当初の目的のマーカーからのモーダルが出来たのでよしとする。いずれは、モーダルとMarkerClustererの共存も画策したいが、現在の僕のレベルでどうにかなるのか。うまいやり方あったら教えてください。
Docker CloudのAPI認証で"errorMessage":"UNAUTHORIZED"で怒られる

皆様 docker cloud活用してますか？
個人的にはtutumの時から愛用しており、ちょっとしたものをdeployするのに
本当に重宝しております。

んで、そろそろAPI経由で操作したくなって[ドキュメント](https://docs.docker.com/apidocs/docker-cloud/#authentication)を読んでみた
ふむふむ、なるほど認証はhttp headerに
`Authorization: Basic ${API_KEY}`
この形で書いてやればいいわけね OKOK 楽勝

はい、これが大きな勘違い

通らない、全然通らない

無慈悲なレスポンス

~~~
{"type":"error","data":{"errorMessage":"UNAUTHORIZED"}}
~~~

あれー？API　key生成ミスったかな？コピペミスったかな？で、
もう一回、全然通らない。

なんかオフィシャルサイトで生成されたAPI keyとsampleが送ってるAPI keyと形式が違うし
にっちもさっちもいかないのでとりあえずオフィシャルで用意されてるgolangのclient sourceを読んでみた
あった！あったよ！！！ドキュメントに書いてない秘密！！

認証部分の一部抜粋
https://github.com/docker/go-dockercloud/blob/1a54bcd04d83c85c4d8cef2f5c4f6def47762b21/dockercloud/dockercloud.go#L59-L65

~~~go
// Load environment variables as an alternative option
if os.Getenv("DOCKERCLOUD_USER") != "" && os.Getenv("DOCKERCLOUD_APIKEY") != "" {
	User = os.Getenv("DOCKERCLOUD_USER")
	ApiKey = os.Getenv("DOCKERCLOUD_APIKEY")
	sEnc := base64.StdEncoding.EncodeToString([]byte(User + ":" + ApiKey))
	AuthHeader = fmt.Sprintf("Basic %s", sEnc)
	return nil
}
~~~

# 解決

`${user}:${api_key}`の形でbase64 encodingした値を渡さないとだめじゃん！！！
そんなことどこにも書いてねーじゃねーか　クソぁ！！

自分はruby使って書いてたのでこんな感じになった

~~~ruby
require 'base64'

# documentに書いてないが"user:apikey"の形式でbase64 encodingした値を利用する!!!
def authorization
  enc_src = "#{ENV['DOCKERCLOUD_USER']}:#{ENV['DOCKERCLOUD_APIKEY']}"
  @auth ||= "Basic #{Base64.strict_encode64( enc_src)}"
end

headers = {
  Authorization: authorization,
}

# http request...
~~~

動いた

困ったらドキュメントだけじゃなくてsourceも読もうねって強く感じた...
さくらのクラウド オブジェクトストレージをRubyから操作する

#さくらのクラウド オブジェクトストレージ
> 大容量データに対応したオブジェクトストレージサービスで、S3互換のAPIを備えています

http://cloud.sakura.ad.jp/specification.php#section-object

# S3とさくらオブジェクトストレージの差分
 + AWS signature version
    + S3: v4
    + さくら: v2
 + endpoint
    + S3: s3.amazonaws.com
    + さくら: b.sakurastorage.jp

# RubyでS3につなぐのに使えるライブラリ
下記２つのライブラリがデファクトっぽい。
### [aws / aws-sdk-ruby](https://github.com/aws/aws-sdk-ruby)
AWSの公式SDK
### [fog / fog](https://github.com/fog/fog)
色々なクラウドサービスに対応したライブラリ。S3への接続部分は独自実装。
[carrierwaveuploader/carrierwave](https://github.com/carrierwaveuploader/carrierwave)がS3にファイルをアップロードするのに使ってる。

# Rubyからさくらのオブジェクトストレージを操作する
ruby: `ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15]`

## aws-sdk (2系)
```rb
require 'aws-sdk'

s3 = Aws::S3::Client.new(
  access_key_id: 'xxx',
  secret_access_key: 'yyyy' ,
  endpoint: 'https://b.sakurastorage.jp',
  region: 'us-west-2', # 多分なんでもいい
  signature_version: 's3' # v2みたいなもんっぽい
)
p s3.get_object(bucket: 'test-bucket', key: "sample_file.txt").body.read
```

## fog (fog-aws (0.9.2))
```rb
require 'fog/aws'

# create a connection
con = Fog::Storage.new({
  provider: 'AWS',
  aws_access_key_id: 'xxx',
  aws_secret_access_key: 'yyyy',
  host: 'b.sakurastorage.jp',
  endpoint: 'https://b.sakurastorage.jp',
  aws_signature_version: 2
})

d = con.directories.get("test-bucket")
p d.files.get('sample_file.txt').body
```

※クレデンシャルの管理には気をつけてね。
さくらのクラウド オブジェクトストレージをPythonから操作する

Ruby: http://qiita.com/toshitanian/items/eab866b46bdec7283d4b

#さくらのクラウド オブジェクトストレージ
> 大容量データに対応したオブジェクトストレージサービスで、S3互換のAPIを備えています

http://cloud.sakura.ad.jp/specification.php#section-object

# S3とさくらオブジェクトストレージの差分
 + AWS signature version
    + S3: v4
    + さくら: v2
 + endpoint
    + S3: s3.amazonaws.com
    + さくら: b.sakurastorage.jp

# PythonでS3につなぐのに使えるライブラリ
### [boto / boto] (https://github.com/boto/boto)
デファクト

### [boto / boto3] (https://github.com/boto/boto3)
botoの新バージョン。こっち使ったほうがいいっぽい。

# Pythonからさくらのオブジェクトストレージを操作する
python: `Python 2.7.8`

## boto(2.32.1)
```py
from boto.s3.connection import S3Connection

conn = S3Connection(
    'xxx', # access_key_id
    'yyyy', # secret_access_key
    host='b.sakurastorage.jp'
)
bucket = conn.get_bucket('test-bucket')
obj = bucket.get_key('sample_file.txt')
print obj.get_contents_as_string()
```

※クレデンシャルの管理には気をつけてね。
Xcode7.3の新機能で翻訳忘れを防止する Missing Localizability



# Step1

`Missing Localizability`の値はデフォルトで`No`なので`Yes`にします。

`Your Project > Build Settings > All > Static Analyzer > Missing Localizability`

![Screen Shot 2016-03-30 at 3.01.04 AM.png](https://qiita-image-store.s3.amazonaws.com/0/8920/dd3df0dd-e560-ac2d-fc7d-3dde0adf99a9.png)


# Step2
Static Analyzer Check 静的解析を実行します
`Top Menu > Product > Analyze (or Shift+Command+B)`

# Results

![Screen Shot 2016-03-30 at 3.08.33 AM.png](https://qiita-image-store.s3.amazonaws.com/0/8920/05b41e5c-ef73-f4e8-07e0-3c0efecff26d.png)

`User-facing text should use localized string macro`

ユーザーに表示される場所の文字にNSLocalizedStringを使っていないため静的解析でハイライトされます。
国際化ドメイン名（IDN）でマルチバイト文字を含め最長何文字のラベルを作れるのか

通常の英数字およびハイフンのみが許されるドメイン名の場合、ラベルは最長63文字となる。これはDNSのプロトコル上の制限によるものである。

国際化ドメイン名（IDN）の場合も同じ制約が適用される。ただし、IDNの場合はマルチバイト文字からPunycodeに変換した後の文字数が63文字以下でなくてはならない。元のマルチバイト文字の利用文字や順序によってPunycode変換後の文字数が変わるため、マルチバイト文字で何文字使えるかは自明ではない。

そこで、理屈上マルチバイト文字を何文字まで入れ込めるのかについて考えてみた。長い国際化ドメイン名を取るような場合の目安になれば幸いである(?)

# 日本語ドメイン名の場合

いわゆる日本語ドメイン名の場合、マルチバイト文字57文字が最長。

- 例： あああああああああああああああああああああああああああああああああああああああああああああああああああああああああ.jp (xn--l8jaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.jp)

ただし、これほどの文字数が入るのは同じ文字を連続したような場合に限られる。というのも、Punycodeでは同じ文字が繰り返されると圧縮効率が高くなる性質があるためである。

同じ文字を使ってはいけないルールだと、マルチバイト文字44文字が最長のような気がする。

- 例：ぁあぃだばどいぅうつぇえぉひたおかがきぎぴぞにくぐぶけげへぺそてこごさぜざしねせじずすち.jp (xn--k8jcdefghijklmnopqrstuvwxyzzzzzzzz5d5d5d5d5d5d5d5d5d5d5d5d.jp)

これは試行錯誤で作ったものなので、いずれロジカルに最長を示したい。

# 日本以外の国際化ドメイン名の場合

コードポイントが小さい文字を使えばもう1文字縮みそうな気がしているが、いまのところそのような文字が見つかっていない。

- http://www.iana.org/domains/idn-tables

上記IDNテーブル中で、U+0080以降で最初に使えそうな文字はU+00DF（ß、ドイツ語のエスツェット）かと思うが、これだと「あ」と変わらず、連続57文字が最長になる。

下記のようにU+00A3（£、ポンド記号）を使ったドメインが実在するようだが、£はシンボルの一種でありドメイン名に使える文字には見えない。昔は取得可能だったが新規では取れない、といった状況かもしれない。

- £.com(http://xn--9a.com/)

もしこれがIDNのルール上現在でも合法であり、受け付けているドメインがあるなら、ポンド記号(もしくはセント記号など付近の文字）の58文字連続が最長のラベルということになる。
mrubyでTOMLをパースできるライブラリmruby-toml書いた

# 経緯

1. dein.vimを使い出して、TOMLという言語(?)を知る。
1. mrubyにも興味があり、何かライブラリを書いてみたいと思っていた。
1. [libtoml](https://github.com/ajwans/libtoml)というTOMLのC言語実装ライブラリが最近TOMLの言語仕様0.4.0(2016年３月30日現在の最新バージョン)に対応したっぽい
1. mrubyの実装、ぱっと見無いし、作ってみるか！

# 意外とあっさりできた。

作り始めて6時間程度で出来ました。(libtomlのビルドではまった時間除く）

https://github.com/bamchoh/mruby-toml

# はまったポイント

libtomlのビルドにはまりました。C言語のビルドツールって使ったことがなかったので、セオリーがわからなかったというのが大きいと思います。ビルド可能なDockerfileを以下に示します。ただ、ビルドに結構な時間がかかるみたいで、私のマシンでは30分くらいかかりました。(何にそんなに時間くっているのか。。)
また、このDockerfileはmruby-tomlのビルド＆テストも同時に実行します。

# Dockerfile

```
FROM ubuntu:latest
MAINTAINER Yoshihiko Yamanaka
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
RUN sed -i.bak -e "s%http://archive.ubuntu.com/ubuntu/%http://ftp.jaist.ac.jp/pub/Linux/ubuntu/%g" /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y --force-yes build-essential git zlib1g-dev libssl-dev libreadline-dev libyaml-dev libxml2-dev libxslt-dev ruby2.0 ruby2.0-dev rake bison curl
RUN apt-get install -y --force-yes libtool pkg-config autotools-dev autoconf automake cmake
RUN apt-get install -y --force-yes vim

# cunit install
WORKDIR /root
RUN curl -L https://sourceforge.net/projects/cunit/files/CUnit/2.1-3/CUnit-2.1-3.tar.bz2/download > CUnit-2.1-3.tar.bz2
RUN tar xjvf CUnit-2.1-3.tar.bz2
WORKDIR /root/CUnit-2.1-3
RUN libtoolize
RUN autoheader
RUN automake --add-missing 1>/dev/null 2>/dev/null | true
RUN autoreconf
RUN ./configure --prefix=/usr
RUN make && make install
RUN make install

# makeing libtoml
WORKDIR /root
RUN git clone https://github.com/ajwans/libtoml
WORKDIR /root/libtoml
RUN apt-get install -y --force-yes ragel libicu-dev
RUN cmake .
RUN make
RUN cp libtoml.so /usr/lib
RUN cp *.h /usr/include
RUN cp -r ccan /usr/include

# build mruby-toml
WORKDIR /root
RUN git clone https://github.com/bamchoh/mruby-toml
WORKDIR /root/mruby-toml
RUN ruby run_test.rb test

VOLUME /root/mruby-toml
```

# 今後の課題

1. `Object#to_toml` の実装
2. `TOML_DATE`のパース実装
git vim tig で行く、生産性の向こう側!!

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/63044bab-fefa-34b2-d488-718510204048.png)

## 生産性に地味に効いてくる以下3大ケースを攻略していく
1.えーと、何個か前にコミットしたファイルまた編集したいんだったけど、なんだったけなぁ〜、あー思い出せねぇ。
2.えーとさっき編集したファイル、修正したいんだけど。
3.このファイル、仕様変更前のコード、また仕様変わったから使えんじゃないかなぁ、まえどんなコードだったっけ。


まず`tig`インストールしておきましょう。

```bash:console
$ brew install tig
```

## 1.えーと、何個か前にコミットしたファイルまた編集したいんだったけど、なんだったけなぁ〜、あー思い出せねぇ。
```bash:console
#tig comandが使えるようになる、aliasでtでtigになるようにしておくと楽
$ tig
```
![image](https://qiita-image-store.s3.amazonaws.com/0/31015/28677276-e70b-e475-ff3a-8024fc9b13af.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/1c7473bb-788d-9b54-9b19-8c8aae58ef39.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/c5c2c9d1-f16f-5906-1b86-c91d9559f32c.png)

つまり何ができるかっていうと、コミットログを遡って、任意のファイルを開けるのだぁ！！


## 2.えーとさっき編集したファイル、修正したいんだけど。
```bash:console
# tig statusでgit statusを見ることができる、aliasでsでtig statusにしておくと幸せ
$ tig status
```
![image](https://qiita-image-store.s3.amazonaws.com/0/31015/08a4ca2c-2a5d-7333-f95b-2d37db38d767.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/dd69da73-5b3d-ca08-5361-021cc8e151cb.png)

つまり、まだコミットしていない編集中のファイルを手軽に開けるのだぁ！！

## 3.このファイル、仕様変更前のコードまた使えんじゃないかなぁ、前どんなコードだったっけ。
毛色が変わって`vim`プラグイン[fugitive](http://qiita.com/joker1007/items/fe84ec923ea6f863803b)を利用した操作
![image](https://qiita-image-store.s3.amazonaws.com/0/31015/a76c7b94-2058-77a5-5e19-5002a36aef00.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/16fdde73-9ea2-d31a-4ae1-9f39afd88063.png)

つまり、ファイルの過去のいかなる時点でも**手軽**に戻って表示ができるのだぁ！！




## まとめ
ざっくり雑に自分がよく使うケースについて説明しました。
他にも、コードの変更を追って、やらかした犯人を探したり。
一緒に変更されてたファイルを検証したり、コミットメッセージ見たり。
`git -p` や　`git rebase -i`を簡単に扱ったりと、上記で紹介した`tig`や`vim の git plugin`はかなり生産性を爆上げしてくれます。
少しずつ勉強するのをおすすめします。

最後に意外と`tig`使っている人少ないと思いますが、すごい便利なので、
詳しく説明されている記事のリンクを置いておきます。

[tigでgitをもっと便利に！ addやcommitも](http://qiita.com/suino/items/b0dae7e00bd7165f79ea)
[【Tig全まとめ】Gitを自由自在に操るための必殺ツール
](http://qiita.com/KENJU/items/13313429df707fecfadf)
alpine linuxでcron用コンテナを作る


## やりたいこと

alpine linuxでcron用のコンテナを作りたい

## 環境

- docker 1.10.2
- Alpine linux 3.3.1

## やり方

- `/var/spool/cron/crontabs/root`にcronの設定を書き込む

```bash
* * * * * echo "Hello"
```

- crondをフォアグラウンドで起動

```bash
crond -l 2 -f
```

以上。

- ワンライナーで実行したり

```bash
$ docker run -it alpine sh -c "echo '* * * * * echo foobar' > /var/spool/cron/crontabs/root && crond -l 2 -f"

crond[9]: crond (busybox 1.24.1) started, log level 2
crond[9]: user:root entry:* * * * * echo foobar
crond[9]: wakeup dt=40
crond[9]: file root:
crond[9]:  line echo foobar
crond[9]:  job: 0 echo foobar
crond[10]: child running /bin/sh
crond[9]: USER root pid  10 cmd echo foobar
foobar
crond[9]: wakeup dt=10
crond[9]: wakeup dt=50
crond[9]: file root:
crond[9]:  line echo foobar
crond[9]:  job: 0 echo foobar
crond[11]: child running /bin/sh
crond[9]: USER root pid  11 cmd echo foobar
foobar
```

## まとめ

alpine自体超軽量なのでcron程度の用途でも気軽に1コンテナ1プロセスを実現出来ていい感じ。
Raspberry piにBluetoothキーボードを接続する

# Raspberry piにBluetoothキーボードを接続する

Raspbian JessieとWheezyでやり方が異なるようなので、Jessieの手順を記載します。久々に設定したら、思ったより簡単でした。自分のメモを兼ねて記載します。

## 環境
* Raspberry Pi2 Model B
* Raspbian Jessie (今回は`2016-03-18-raspbian-jessie.img`を使用)
* Mac (SDカードに上記イメージを書き込むために使用)
* Micro SD
* Bluetooth キーボード (Bluetooth 3.0)
* USBキーボード (Bluetoothキーボードを設定するのに使用します)
* Bluetoothドングル (USB接続)

## 手順

### MacでRaspbianをMicro SDに書き込む

他サイトに色々説明はあると思うので、簡単に。Micro SDはdisk2想定、`2016-03-18-raspbian-jessie.img`があるフォルダで作業した方が無難そう。私は相対パス指定で書き込もうとして/dev/rdisk2にアクセスできない旨のエラーが出てはまりました。

1. `$ sudo diskutil unmount /dev/disk2s1` ... ddからアクセスするためにアンマウントする
2. `$ sudo dd bs=1m if=2016-03-18-raspbian-jessie.img of=/dev/rdisk2` ... ddで書き込む。進捗を見たい場合は`CTRL-T`

### ラズパイにMicro SDをさして起動する

何もしなくてもX Windowが立ち上がりました。
ddでSDカードを作った場合、ディスク容量が４GB位になっているので、以下の手順でSDカード容量全部使用できるようにする

1. `$ sudo rspi-config` ... rspi-configを起動
2. `1 Expand Filesystem`を選択し、`Enter`
3. `$ sudo reboot` ... 再起動して反映

### Bluetooth キーボードを接続する

追加で`apt-get`しなくても以下の手順でbluetooth接続できました。

1. `$ sudo hciconfig hci0 down`
2. `$ sudo hciconfig hci0 up`
3. `$ bluetoothctl` ... bluetooth設定を起動
4. `[bluetooth]# scan on` ... デバイスをスキャンする。ここでキーボード側からペアリング（アドバタイズ）する。
5. `[CHG] Device XX:XX:XX:XX:XX:XX Name: Bluetooth 3.0 Keyboard` ... キーボードが見つかりました
6. `[bluetooth]# scan off` ... デバイスのスキャンを停止
7. `[bluetooth]# pair XX:XX:XX:XX:XX:XX` ... 見つかったデバイスに対してペアリング要求

```
Attempting to pair with XX:XX:XX:XX:XX:XX
[CHG] Device XX:XX:XX:XX:XX:XX Connected: yes
[CHG] Device XX:XX:XX:XX:XX:XX Modalias: usb:v0xxxxx
[CHG] Device XX:XX:XX:XX:XX:XX UUIDs:
	00001000-0000-1000-8000-00805f9b34fb
	00001124-0000-1000-8000-00805f9b34fb
	00001200-0000-1000-8000-00805f9b34fb
[CHG] Device XX:XX:XX:XX:XX:XX Paired: yes
Pairing successful
...
```
ペアリング成功

8. `[bluetooth]# trust XX:XX:XX:XX:XX:XX` ... 次回起動時に自動接続できるよう、trustする

```
[CHG] Device XX:XX:XX:XX:XX:XX Trusted: yes
Changing XX:XX:XX:XX:XX:XX trust succeeded
...
```

以上で接続できると思います。しばらく無操作だと切断されますが、何かキーを押すと再接続します。ラズパイ再起動後も何かキーを押すと接続できるようです。

余談ですが、以前設定したときはBluezを導入したりと結構色々やった記憶があったのですが、今回は特に追加で導入必要なものはなかったですし、すんなり設定できました。

---

2016/4/21 追記：
　Raspberry pi 3が届いたので、以前の構成からBluetoothドングルを使用せずにSDカードだけRaspberry pi 2から3に差し替え、認識するか試してみました。

結果、何もせずでは接続出来ず、以下の手順で再接続できました。

1. `$ bluetoothctl` ... bluetooth設定を起動
2. `[bluetooth]# remove XX:XX:XX:XX:XX:XX` ... 一旦ペアリング情報を削除
3. `[bluetooth]# scan on` ... デバイスをスキャンする。ここでキーボード側からペアリング（アドバタイズ）する。
4. `[CHG] Device XX:XX:XX:XX:XX:XX Name: Bluetooth 3.0 Keyboard` ... キーボードが見つかりました
5. `[bluetooth]# scan off` ... デバイスのスキャンを停止
6. `[bluetooth]# pair XX:XX:XX:XX:XX:XX` ... 見つかったデバイスに対してペアリング要求
7. `[bluetooth]# connect XX:XX:XX:XX:XX:XX` ... Raspberry pi 2のときと異なり、なぜか`Connected: no`となったので、connect
8. `[bluetooth]# trust XX:XX:XX:XX:XX:XX` ... 次回起動時に自動接続できるよう、trustする
HTML,CSS勉強メモ #5 〜float解除まとめ〜

本日の勉強。

## 勉強内容

<dl>
<dt>CSSレイアウト入門</dt>
<dd>13～15</dd>
<dt>実践！ウェブサイトを作ろう</dt>
<dd>01～04</dd>
</dl>

## 進度

<dl>
<dt>CSSレイアウト入門終了</dt>
<dd>13:positionプロパティで使ってみよう</dd>
<dd>14:画像付きリストを作ってみよう</dd>
<dd>15:画像付きリストを完成させよう</dd>
<dt>実践！ウェブサイトを作ろう</dt>
<dd>01:実践的なレイアウト手法を学ぼう</dd>
<dd>02:1カラムのレイアウト</dd>
<dd>03:2カラムのレイアウト(可変幅)</dd>
<dd>04:2カラムのレイアウト(固定幅)</dd>
</dl>

## メモ

### float解除の方法

今日勉強した「実践！～」の範囲は復習のような感じでしたが、
レイアウト入門の時から`float`解除の方法が色々出てきてこんがらがっていたので、
まとめておこうと思います。

#### ➀ `clear:both;`

* 解除したい要素のスタイルに `clear:both;` を指定する。
    * floatの親要素の高さが消える。
* floatの親要素内に `<div style="clear:both;>` を作る。
    * ソースが増える。

#### ➁ `clearfix`

* 親要素に`:after`擬似要素を使って`clear`にするソースを記入する。
    * 古いブラウザには対応していないものもある。
    * `:after`擬似要素には必ず`content`を指定すること。

```css
〇〇:after {
     content: '';
     display: block;
     clear: both;
}
```

#### ③ `overflow:hidden;`

* 親要素に `overflow:hidden;` を付ける。
    * 子要素に `position:absolute;` などが使えなくなる。

それぞれにメリット、デメリットがある様です。ケースバイケースで使い分けた方が良さそうですね。

因みに私は`:after`擬似要素についてキチンと理解していなかった様で、`clearfixについては必ずclassなどで`.clearfix`のように指定しないといけないのかと思っていたのですが、そのまま親要素にくっつければ良かったみたいですね。

『実践！〜』の2カラムのところでは`overflow:hidden`のみ紹介されていましたが、全部試してみて認識を深める事ができました。
MySQL(MariaDB)のSELECT文でcsvを出力した後のファイルパス

Linux(CentOS7)でmariadbを使ってこんな感じでCSVファイルを出力する

```sql

SELECT bases_id, follower, get_date FROM twitter_status_histories where bases_id = 314 
INTO OUTFILE '/tmp/twitter_status_histories.csv'
  FIELDS TERMINATED BY ','
```

が /tmp にはファイルが作られない
そうなるとmysqlのデフォルトのファイルパスに作られてるはず・・ということでmy.cnfを見る

```
less /etc/my.cnf
```

```
[mysqld]
datadir=/var/lib/mysql
```

ということでここにありそう


```
[hoge@localhost ~]$ ls -l /var/lib/mysql/twitter_status_histories.csv
-rw-rw-rw-. 1 mysql mysql 133875  3月 30 00:17 /var/lib/mysql/twitter_status_histories.csv
```

わかりにく！
[備忘録]GitとGitHubの連携

#GitとGitHubの連携

Google App Engineのプロジェクトにいろいろな環境からアクセスするので、プロジェクトごとGitHubに上げておくことにしています。
自宅のMacが壊れたので、代替機から作業した際のメモです。

1. stm3さんの投稿、[[GitHub] 公開鍵登録の際に、Permission denied (publickey). が出続ける場合の対応 (vagrantからsshする場合の注意も)](
http://qiita.com/stm3/items/6c3e96c394bb0f753ea0)
を参考にさせて頂き、GitHubに公開鍵登録。
2. GitHubで”＋NewRepository"から新規にGAEプロジェクトをアップロードするためのリポジトリを作成。
3. コマンドラインで下記を実行。

```
>git config --global user.name "<アカウント名>"
>git config --global user.email "<メールアドレス>"
>git init
>git add *
>git commit -m "first commit"
>git remote add origin git@github.com:<アカウント名>/<プロジェクト名>.git
>git push  -u origin master
```

明日はendpointで簡単に動くものを作ってみます。
ヘッダ内で定義済みマクロ一覧を取得する方法

`cpp -dM` を使います。

```console
$ printf '#include <sys/stat.h>' | cpp -dM - | head -5
#define __S_IFBLK 0060000
#define S_ISCHR(mode) __S_ISTYPE((mode), __S_IFCHR)
#define __DBL_MIN_EXP__ (-1021)
#define __UINT_LEAST16_MAX__ 65535
#define __ATOMIC_ACQUIRE 2
```

マクロ定義を先につけるとプリプロセッサ実行時に適用されます。

```console
$ printf '#include <sys/stat.h>' | cpp -dM - | wc -l
477
$ printf '#define _GNU_SOURCE\n#include <sys/stat.h>' | cpp -dM - | wc -l
495
```
Theta S を天井にマウントする

この記事では、2016年1月27日に開催された、[RICOH THETA Advent Calendar 2015 LT大会！](https://atnd.org/events/73476)で私が発表した「Theta S を天井にマウントする」というＬＴのプレゼン資料をシェアします。Linkdin嫌いなのでカッコイイSlideShareではありません。ごめんね。

プレゼン資料の[リンク(Google Drive / PDFファイル)][1]
[1]:https://drive.google.com/folderview?id=0B-jkdAczHuJzNVdoRXU3YzRsWnc&usp=sharing
#このＬＴで何を発表したの？
　Theta Sを電球ソケットに差し込んだら、即ワイヤレスでライブ中継が出来るプロトタイプを製作してＬＴで発表しました。

#なんでこんなくだらないもの思いついたの？
　Backしたのに、一向に製作状況のアップデートをしないで展示会自慢ばっかりしている内に、構想していた主要な機能がどんどんリコーThetaシリーズに実装されちゃった、大変残念な全天球カメラのKickstarterプロジェクト「[360Cam ](https://www.kickstarter.com/projects/giroptic/the-worlds-first-full-hd-360-camera)」には、Thetaにいまだ実装されていないキャッチーな周辺機器「電球ソケットアダプター」があります。画像は怒られそうなので貼りませんが、怒っているはむしろBackerの私です。
　かんたんに説明すると、「電球ソケットに全天球カメラを取り付けて、天井からリア充パーリィをライブストリーミング出来るようするアダプター」です。
　しかし知らない外人のリア充パーリィ中継は絶対楽しくないと常々感じている私は「電球ソケットにTheta Sを取り付けて、寿司屋の大将が寿司を握る手元がワイヤレスHDMIで比較的高画質にPCに伝送されエンコードされた後、店内でGearVRを装着したサイバーじみたサラリマンが握り中継を見れると楽しそうだよね」というネタを思いつきました。
　本家は電球ソケットから電源を得て、リアルタイムで３カメラの画像をスティッチングしながら、リアルタイムでビデオエンコードし、不安定なWi-Fi伝送で高画質なライブ・ストリーミングを実現する構想だそうですが、本当に満足がいく品質で実装出来るのか楽しみデスね。私は現実的なのでPoE（Ethernet給電）アダプターにはBackしましたが、電球ソケットアダプターはBackしてません :blush:。
「本当に現実的な人は、そもそもこんなプロジェクトにBackしないだろう」というツッコミは、私が凹むのでご遠慮ください。

#資料見たけどプロトタイプがデカイじゃん
　はい、すみません。「構想：ガジェットフリマの売上で寿司を食っている時」、「材料集め：冬コミや仕事の片手間に３週間」、「製作：ＬＴ前日寝る前に２時間」で作ったので、各機材を殻割りして３Ｄプリントしたシャーシにマウントし直す様なカッコイイ事はしていません。ダイソーのケースに穴開けてコネクタさしていっちょ上がりですのでクオリティーは推して知るべしです。ただ、Theta Sへのカンタンな冷却ファンのマウント方法や、電球ソケットから電気が取れるケース作り方のアイデアはみなさんの工作で使えると思いますので、ご自由にご利用ください。

#寿司屋で動作テストしたの？
　してません。ＶＲ対応全天球握り寿司中継の動作テストさせててくれる、ガジェット大好きな寿司屋の大将がいらっしゃれば是非ご連絡ください :sushi: 。なお、衛生面で他のお客がいる状況では多分実験はできないと思います。

ということで「Theta Sを電球ソケットに挿して握り寿司の手元ライブ中継しなければ、お前の娘の命はないものと思え」的な事態に陥った場合に、このＬＴを思い出していただければ幸いです。
AHKを使う

# AHK(AutoHotKey)
最近お世話になっているAHKを使う際に気をつけることをメモ。
仕事先でも許可が下りれば使っているので、現場が変わっても忘れないように。このページを少しずつ更新する予定。

## 環境を作る
AHKを公式からダウンロードしてインストール。
開発環境は何でも。おすすめの開発環境は

- SciTE4AutoHotkey

です。デバッガとキャプチャツールとGUIエディタが一緒に入ってた気がします。

## 強制終了処理を書く
```code
Esc::
ExitApp
```

AHKは読んで字の如く「HotKey」を割り当てるものです。
マウス操作やキーボード入力などをすげ替えるので、一度起動すると、「止める操作を入力するためのキー」自体がすげ替えられてしまう可能性があるため、最初に終了用のHotKeyを割り当てます。


## ログ出力処理を作る
```
global LOG_FILE
LOG_FILE=＜ログファイルのパス＞
～～～中略～～～
WriteLog(log)
{
    logText = [%A_Now%]%log%
    FileAppend,  %logText%, %LOG_FILE%
}
```

ロガー。出力内容は使い方によりますが、あると無いとでは改修の効率が違います。
ログファイルのパスだけファイルの頭に書いて、本当に描きたい処理とは異なるので、ログ処理自体は別ファイルか、同じファイルでも下の方に隔離して目につかないようにします。

## GUIを作るときは
```
; 入力、選択系のGUI情報を変数に反映する
Gui, Submit, NoHide
```
GUIから値を取得する方法を忘れないこと。GUIエディタでGUI作成は簡単にできますが、GUIを操作、GUIから取得などのコードは書かないといけません。よく忘れます。
hubotにデフォルト通信にプロキシサーバを使用する設定をする2016

# 会社はプロキシで良くも悪くも守られているけど…
rubyやwget、nodejsなど、外部から情報をダウンロードするときに邪魔なプロキシサーバ。社内と外部のチャットツールを連携する場合、必ず社内のプロキシを通過する必要がある。
hubotのインストールでも手こずったけど（npm -g config set proxy）
hubotの通信でも手こずったので記録に残します。

# ネットの情報
先達の方々は苦心していたようで、hubotが使用する[scoped-http-client](https://github.com/technoweenie/node-scoped-http-client)を直接いじっちゃえ！という検索結果がよく出るけど、実はhubotはもうプロキシ対応している。

[hubot + http proxy メモ](http://qiita.com/tily/items/058428dfd37c4e753212)

# プロキシ対応方法について

Windows8.1 64bitで確認。
nodejsなどは、２０１６年３月２８日時点で公式サイトからDLしたものを特にそのまま使用しています。

## 注意！
nodejsよく知らないので、間違っていたりする場合があります。
間違っていた場合は、お手数ですがコメントいただけますと幸いです。
## 公式ドキュメントより
[Forwarding all HTTP requests through a proxy](https://hubot.github.com/docs/patterns/)
##　なんとなく和訳すると
1. hubotをmoulesとして組み込んでいるフォルダでnpm install proxy-agent する
1. hubotをmoulesとして組み込んでいるフォルダ(hubotモジュールでなく一番トップディレクトリ)直下のscriptsフォルダにproxy.coffeeを作る。
1. proxy.coffeeをいい感じに編集する。ポート番号も書いていい。trueとfalseの違いはわかってない。

```js:proxy.coffee
proxy = require 'proxy-agent'
module.exports = (robot) ->
  robot.globalHttpOptions.httpAgent  = proxy('http://my-proxy-server.internal:proxy-port', false)
  robot.globalHttpOptions.httpsAgent = proxy('http://my-proxy-server.internal:proxy-port', true)
```
# 覚書
これでプロキシを必ず通るようにできるようだけど、うちの社内はプロキシに認証をかけているので、pug meに失敗する。
wgetみたいに、`http://username:password@proxy-server:port`みたいなことをやってもダメだった。

そこはやっぱり、hubotのリクエストのところで、proxy-authヘッダでも作らないといけないのかなぁ。それに、内部サーバ向けと外部サーバ向けでプロキシ経路が違うから、その住み分け対処も考えないといけないっすね。


# Link
http://qiita.com/hironot/items/0fc72651afc601e772ac
ブロック全体をリンクに -フッター用メニューを作る1-


下のようなスマホ用webサイトのフッターメニューを作りたい(画像はドコモのサイトから拝借しました)

![スクリーンショット 2016-03-29 23.39.16.png](https://qiita-image-store.s3.amazonaws.com/0/74937/df62a4c6-0589-0d55-d9a4-df440f5df9f3.png "スクリーンショット 2016-03-29 23.39.16.png")

## HTML

```html:HTML
<ul>
    <li><a href="#">メニュー1</a></li>
    <li><a href="#">メニュー2</a></li>
    <li><a href="#">メニュー3</a></li>
    <li><a href="#">メニュー4</a></li>
    <li><a href="#">メニュー5</a></li>
    <li><a href="#">メニュー6</a></li>
</ul>
```

## メニューを縦と横に並べる
liのwidthを50%にしてfloatで並べる。
ulのafter擬似要素を使ってfloatをクリアする。

```css:liを並べる
ul:after {
     content: "";
     display: block;
     clear: both;
}
li {
     float: left;
     width: 50%;
}
```

## ブロック全体をリンクにする
aのdisplayをblockにしてwidthを100%にする。

```css:ブロック全体をリンクに
a {
     display: block;
     width: 100%;
}
```


## 結果
現時点での結果は[こちら](http://tetsuyanegishi.github.io/Warehouse/footer_menu/index1.html)。
見た目的にはまだまだ。
文字を中央にしたり三角のアイコンを作ったりなどの問題が残るがそれは明日やるつもり。

```html:全体のコード
<!DOCTYPE html>
<html>
    <head>
	<style type="text/css">
	 * {
	     margin: 0;
	     padding: 0;
	 }
	 ul {
	     list-style: none;
	 }
	 ul:after {
	     content: "";
	     display: block;
	     clear: both;
	 }
	 li {
	     float: left;
	     width: 50%;
	     border: solid 1px #000;
	     box-sizing: border-box;
	 }
	 a {
	     display: block;
	     width: 100%;
	     text-align: center;
	 }
	</style>
    </head>
    <body>
	<ul>
	    <li><a href="#">メニュー1</a></li>
	    <li><a href="#">メニュー2</a></li>
	    <li><a href="#">メニュー3</a></li>
	    <li><a href="#">メニュー4</a></li>
	    <li><a href="#">メニュー5</a></li>
	    <li><a href="#">メニュー6</a></li>
	</ul>
    </body>
</html>
```

## [続き](http://qiita.com/NeGI1009/items/7523e553a777a1813d37)