OmniAICreator/Qiita-1.07M huggingface dataset:
monacaでスマホアプリを作ろう #3

# デザインを変えてみる

AngularJSはすごさはわかったよ？でもこれ全然スマホアプリっぽくないじゃん！

わかります。私もそう思います。
そしてOnsen UIの中の人もおそらくそう思っています。
なので、手っ取り早くスマホアプリっぽいデザインを実現するためのパターン集を公開してくださっています。

[Onsen UI Page Patterns]
(http://ja.onsen.io/patterns.html)

どうでしょう。一般的なUIはカバーしているといっていいのではないでしょうか。
ここではよく使われると思われるリスト形式のデザインを使ってみます。

List With Header
![スクリーンショット 2015-06-12 13.45.38.png](https://qiita-image-store.s3.amazonaws.com/0/74328/d8c7cc5f-dcfd-a349-58ad-5e445119ac68.png)


[Detail]ボタンをぽち。


HTMLとCSSが表示されています。
![onsen1.png](https://qiita-image-store.s3.amazonaws.com/0/74328/2fa1eaaf-3cf1-51be-99ff-c0369c2df547.png)


HTMLは、先ほど作ったプロジェクトのpage1.htmlにコピペ。
具体的には、\<ons-page>で囲まれた部分をpage1.htmlのコントローラーを記述した\<div>内にコピペ。


今回CSSはありませんが、もしあればcss/styles.cssに追加でコピペ


こうなります。

```html
<ons-page>
<div ng-controller="Page1Ctrl">
　<!-- ↓ ここからコピペ -->
  <ons-toolbar>
    <div class="center">List With Header</div>
  </ons-toolbar>

  <ons-list>
    <ons-list-header>Android Versions</ons-list-header>

    <ons-list-item modifier="chevron">KitKat</ons-list-item>
    <ons-list-item modifier="chevron">Jelly Bean</ons-list-item>
    <ons-list-item modifier="chevron">Honycomb</ons-list-item>

    <ons-list-header>Mac OS X Versions</ons-list-header>

    <ons-list-item modifier="chevron">Mavericks</ons-list-item>
    <ons-list-item modifier="chevron">Mountain Lion</ons-list-item>
    <ons-list-item modifier="chevron">Lion</ons-list-item>
    <ons-list-item modifier="chevron">SnowLeopard</ons-list-item>

  </ons-list>
　<!-- ↑ ここまでコピペ -->

</div>
</ons-page>
```

プレビューを見ると、デザインパターンそっくり！

![スクリーンショット 2015-06-12 13.34.25.png](https://qiita-image-store.s3.amazonaws.com/0/74328/d64b6a9b-656b-bdb0-23d0-b521fbaa6fd4.png)


これで~~CSSオンチでも~~簡単にアプリっぽいデザインが作れますね。
ホストからゲストに、シェルをSCPで送信して実行するantのテンプレート

### きっかけ

 * VirtualBoxで作業するときゲストでコマンド発行するのがめんどう
 * スナップショットで戻したときに状況に応じてインストールしたい（java7とJava8など）
 * 手順書ではなくシェルで管理したい＆別環境でも再利用したい

### 環境

* ホスト・・・Windows7
 * ant 1.9.4
* ゲスト・・・CentOS6

### ホストファイル構成

~~~
${任意の場所}/setup.bat
${任意の場所}/setup.xml
${任意の場所}/lib/jsch-0.1.52.jar
~~~
* jarはここから取得
 * http://mvnrepository.com/artifact/com.jcraft/jsch/0.1.52

### ビルド実行ファイル

~~~bat:setup.bat
@echo off
call ant make -f ./setup.xml -lib ./lib
rem 「${ANT_HOME}\lib」に直接おいて、build.xmlなら以下のように省略できる
rem call ant make
pause
~~~

### ビルドファイル

~~~xml:setup.xml
<?xml version="1.0"?>
<project default="make" basedir=".">

  <!-- ホストのIP※ポートフォワードで指定した -->
  <property name="connect.host" value="192.168.11.64" />
  <!-- ゲストのユーザー -->
  <property name="connect.user" value="root" />
  <!-- ゲストのパスワード -->
  <property name="connect.pwd"  value="password" />
  <!-- ゲストのポート※ポートフォワードで指定した -->
  <property name="connect.port" value="22" />

  <target name="make">

    <!-- SCP送信 -->
    <scp todir="${connect.user}:${connect.pwd}@${connect.host}:/root/" port="${connect.port}" trust="true" file="${basedir}/sample.sh" />

    <!-- SSH実行 -->
    <sshexec username="${connect.user}" password="${connect.pwd}" host="${connect.host}" port="${connect.port}" trust="yes" command="chmod +x /root/sample.sh"/>
    <sshexec username="${connect.user}" password="${connect.pwd}" host="${connect.host}" port="${connect.port}" trust="yes" command="/root/sample.sh"/>

  </target>
</project>
~~~
[Grails3]Interceptorでコントローラを取得するTraitを作ってみる

# Traitを使ってみたかった

こちらの[記事](http://qiita.com/saba1024/items/f4af87a1e4778f57b92a)を参考に、コントローラ名からコントローラのインスタンスを取得する部分をTraitにしてみただけです。

# コード
```groovy

trait GetController {

  def getController() {
    String controllerName = params?.controller
    if (!controllerName){
       return null
    }
    def artifact = grailsApplication
            .getArtefactByLogicalPropertyName("Controller", controllerName)
    applicationContext.getBean(artifact.clazz.name)
  }

}

class XXXInterceptor implements GetController {

  boolean before() {
    def controllerInstance = getController()
  }
}

```
レジストリはなんでも知っている

## 他社が作った環境と同一の環境を作れと手渡されたレジストリ

ある会社さんが元々立てたWindows7環境と同じ環境を作れと言われました。見たことも触ったこともありません。問い合わせると調整が面倒だからなんとかしろと言われました（ブラック）。

**与えられたのはレジストリファイルだけ。**

もはやパワハラやモラハラで訴えてもいいような無茶ぶり。机の上で微笑んでくれている下野由貴ちゃんのカレンダー見ながら泣きました（キモ）。

それでも、どうにかこうにかなったので、備忘として、適用しているセキュリティパッチの特定と、登録されているユーザの調べ方を紹介したいと思います。

## 適用しているセキュリティパッチや修正パッチ

**HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages**の配下のうち、「KB」という文字列を含んでいるものを抜粋します。

サクラエディタの正規表現で言うならば、こんな具合です。

```
HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Component Based Servicing\\Packages.*KB.*
```

するとこのようなキーがヒットします

```
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages\Package_15_for_KB2604115~31bf3856ad364e35~x86~~6.1.1.3\Owners]
```

あとはこれらだけを抜き出して、加工してエクセルに張り付け、重複するデータを削除すれば、適用済みのパッチの一覧が出来上がります。意外とカンタン。

## 登録されているユーザーの情報

参考文献：[レジストリキーのSIDからユーザアカウントを識別する方法 | Tipstour](http://tipstour.net/windows/2194)

あたりさわりのないところでDefaultAppPoolユーザの復元例です。

**HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\[SID]**にある**ProfileImagePath**の値を参照します。

ProfileImagePathだけで検索をかけちゃっても大丈夫かと思います。

```
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\S-X-X-XX-*******]
ProfileImagePath=hex(2):43,00,3a,00,5c,00,55,00,73,00,65,00,72,00,73,00,5c,\
  00,44,00,65,00,66,00,61,00,75,00,6c,00,74,00,41,00,70,00,70,00,50,00,6f,00,\
  6f,00,6c,00,00,00
```

~~…日本語でOK~~

ProfileImagePathの値は16進数になっているので、これを文字列に変換します。

+ 例「[16進数を文字列に自動変換＆その逆をするツール](http://singoro.net/16henkan/)」

```
C��:��\��U��s��e��r��s��\��D��e��f��a��u��l��t��A��p��p��P��o��o��l�����
```

□がちょっとウザいですが、これにより、DefaultAppPoolユーザがいることがわかりました（ということは普通に考えて、IISもインストールしないといけないことに気づきます）。

## まとめ

今回は、パッチとユーザに絞った紹介をさせていただきましたが、今さらですが、Windowsはレジストリが全てなんだと再認識しました。

USBメモリの接続履歴なんかも拾おうと思えば拾えますし、普段、何げなく設定している値（例えば、フォルダオプションで拡張子を表示する）もレジストリに存在します。

プライベートではLinuxやMacを触る機会が多くて（最近、Windowsタブレットにハマってますが）、あまりWindowsのコアな部分は知らない私ですが、レジストリの奥深さを知るいい機会になりました。

## 追伸

モラハラとかパワハラとか言ってごめんなさいｗ
【OS】参照の局所性


## 参照の局所性とは？
　プロセスは、仮想アドレス空間(ページ)を一様に(満遍なく)参照するとは限らない。むしろ、`偏った参照をする`(一部しか参照していない)傾向がある。このことを`参照の局所性`という。
　今参照されている仮想ページは近い将来再び参照される可能性の高さを`時間的局所性`、今参照されている仮想ページに近いアドレスは遠いアドレスより参照される可能性の高さを`空間的局所性`という。
　
- 時間的局所性の例
ループ処理や関数呼び出し
-  空間的局所性の例
プログラムそのものや配列


　
#### 参照の局所性を意識すると
　参照の局所性を生かしたアルゴリズムは、よりよいアルゴリズムと言われている。
ansibleで"could not locate file in lookup"って怒られる原因

# 概要
ansibleを利用していると以下のようなエラーが出力されることがあります。

```
TASK: [common | set authorized key] *************************************
ok: [default] => (item={'name': 'hoge', 'key': u'ssh-rsa 公開鍵 whywaita@host'})

TASK: [common | configure application file] *****************************************
fatal: [default] => could not locate file in lookup: public_keys/id_rsa.pub

FATAL: all hosts have already failed -- aborting
```

```
roles/common/tasks/main.yml

- name: set authorized key
  authorized_key: user={{item.name}} key="{{item.key}}"
  with_items: authorized_keys
  tags: users

- name: configure application file
  template: src=hoge.conf.j2 dest=/etc/hoge.conf
  tags: hoge

roles/common/defaults/main.yml

authorized_keys:
  - name: admin
    key: "{{ lookup('file','public_keys/id_rsa.pub' ) }}"

```
今回だと公開鍵を指定するためにlookup関数を使って展開しているのですが、公開鍵を設置した後にアプリケーションのテンプレートを設置しようとすると何故か以前の公開鍵を参照しようとして転けます。
# 動作環境

* OSX Yosemite
* Ansible 1.8.2以降

# 原因
**バグ**です。
ansible 1.8.2以降より確認されているバグで、既にIssueが立っています。
解決の為のPRも用意しているのですが、ansible v2のMilestoneに組み込まれているので、暫くは解決しそうにないです。

# 対処法

* ansible 1.8.1を使う
* ```lookup()```関数を使わない
* copy/template/file を使わない
* ansible 2.0を試してみる

# 参考
* https://github.com/ansible/ansible/issues/9944
  * これが親Issueっぽい
c++ builder XE4, 10.2 Tokyo > TeeChart > 軸 > tick minor countの設定

```txt:動作環境
C++ builder XE4
    TeeChart Lite v2013.08.130414
RAD Studio 10.2 Tokyo Update 2 (追記 2018/01/09)
    TeeChart v2016.17.160129 32bit VCL
```

TeeChartにてTick -> Minor -> Countの設定をコードで行う場合は以下のようにする。

```cpp
Chart->LeftAxis->MinorTickCount = 5;
```
[リンク切れ] c++ builder > TeeChartの軸設定のまとめ情報(リンク)


~~http://nary.cocolog-nifty.com/blog/2009/11/teechart-201c.html~~
に軸設定の情報がまとまっている。

2018/01/10現在、リンク切れになってしまった。
条件によるgroup byを行ってそれぞれ件数を表示

例）有効期限内と期限切れそれぞれの件数を１SQLで求めたい
<pre>
mysql> select (expires_at < now()) expired, count(\*) from token group by (expires_at < now());
+---------+----------+
| expired | count(*) |
+---------+----------+
|       0 |    57824 |　※期限内
|       1 |   271056 |　※期限切れ
+---------+----------+
2 rows in set (0.14 sec)
EC2価格 月間早見表

EC2価格 月間早見表
---

Type, vCPU, メモリ(GiB), 時間課金, 月間課金 
t2.micro	1 1	 $0.020/h $14.4/Month
t2.small	1 2	 $0.040/h $28.8/Month
t2.medium	2 4	 $0.080/h $57.6/Month
m4.large	2 8  $0.183/h $131.7/Month
m4.xlarge	4 16 $0.366/h $263.5/Month
m4.2xlarge	8 32 $0.732/h $527.0/Month


Memo

```
ECU - 仮想コア数
```

http://aws.amazon.com/jp/ec2/pricing/
VPC CIDRについてちょっと調べた

VPC
---

#### 作成手順（一つのSubnetに全てを入れる場合）

1. VPCの作成
2. Subnetの作成
3. Route Tableの作成
4. Internet Gatewayの作成
5. Network ACLの設定
6. Security Groupの設定

MEMO

```
1. VPCの作成
まず全ての入れ物を作る（アドレスの範囲を設定 ※あとから変更できない）
CIDR block:[/28](16個のアドレスが設定できる) 〜 [/16](16個のアドレスが設定できる)

2. Subnetの作成
次に小分け袋を作る（Network ACLにより、どこと通信できるか設定）
こちらもSubnetごとにアドレスを設定できる
AZごととprivateごとにsubnetを作る

3. Route Tableの作成
Subnet間や外部通信用の設定
SubnetとInternet Gatewayの設定
メインテーブルとして設定する

4. Internet Gatewayの作成
インターネットと通信することをRoute Tableに許可する
VPCにアタッチして、Route Tableに紐づける

5. Network ACLの設定
SubnetのInBound（内部への通信）とOutBound（外部への通信）制御の設定
デフォルトでOK

6. Security Groupの設定
インスタンスのInBound（内部への通信）とOutBound（外部への通信）制御の設定
インスタンスごとに作成
```

CLI

```
aws ec2 create vpc --cidr-block 10.0.0.0/16
aws ec2 modify-vpc-attribute --vpc-id vpc-[作成されたvpcid] --enable-dns-hostnames
```

CIDRについて(CIDR形式でのIPアドレスの記述)

```
CIDRとはIPアドレスの記述形式です。
VPC内で決めるIPアドレスは、VPC内でのみ利用するため自由に設定できます。（いくつかのルールは存在します）

1 つの CIDR ブロックを VPC に割り当てることができます。
許可されているのは、/28 ネットマスクから /16 ネットマスクの間のブロックサイズです。
つまり、VPC には 16～65,536 個の IP アドレスを含めることができます。

[形式]

```
CIDR block: A.B.C.D/E
AはVPC作成時に設定
BはVPC作成時に設定
EはVPC作成時に設定
CはSubnet作成時に設定
DはSubnet作成後に自動設定
```

A,Bは好きなものを設定してよい。（内部のルーティングにしか使わないため）
その後は、Cでsubnetごとに分ける（これは目的別に分かれているとよい[4-254]）
その後は、Cから自動生成されるDの数には限りがある。（インスタンスに自動で割り当てられので注意）

例、
[VPC]
CIDR block: 192.168.0.0/16

[Internet Gateway]
Name tag: igw-xxx

[Subnet]
VPC: ***
AZ: ap-northeast-1[a-c]
CIDR block: 192.168.1.0/24

VPC: ***
AZ: ap-northeast-1[a-c]
CIDR block: 192.168.2.0/24

作成されたサブネットの Available IPs は 256 のうち以下の 5 が利用できないため 256 - 5 = 251 となっています。
192.168.[1-2].0
192.168.[1-2].1
192.168.[1-2].2
192.168.[1-2].3
192.168.[1-2].255
```
Cloudera Managerでチャートの保存ができない場合の対処法

# 症状

Cloudera Manager でチャートを保存しようとすると、以下のようなエラーが発生して保存できない。

![CM54-チャートの保存ができない.png](https://qiita-image-store.s3.amazonaws.com/0/17749/13174a22-80e2-3f54-b9e4-d90833220464.png)

しかし、ブラウザの言語を英語にすると成功する。

![CM54-チャートの保存成功(英語).png](https://qiita-image-store.s3.amazonaws.com/0/17749/e1833674-3286-a524-31ff-4ab288b91d65.png)


# 環境

* Cloudera Manager (全バージョン)

# 原因

Cloudera Manager サーバの使うDB のエンコーディングが `utf-8` になっていない可能性がある。 
`utf-8` の設定は必須なので、もし設定していない場合は文字エンコーディングの設定を行うこと。


# 参考 

* [外部DBの設定手順](http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cm_ig_installing_configuring_dbs.html?scroll=concept_i2r_m3m_hn_unique_2) 新規インストールの場合、必ずこのドキュメントに記載されたスクリプトを実行してDBを設定すること。
* [MySQLの設定](http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cm_ig_mysql.html)
* [PostgreSQLの設定](http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cm_ig_extrnl_pstgrs.html)
名前からuuidを生成する

hearteatのha.cfでuuidfrom nodenameしてコピった時に重複して面倒なことになったり、
chefのレシピでcib.xmlのテンプレート作るときに差し込むとかしたいので、
ホスト名から生成された情報を事前に知りたいなーと思ったというのが経緯です。
実際設定してクラスタ立ち上げてからじゃないとuuidが分からないだとめんどかっただけです。

・uuidtoolsを入れる
```# gem install uuidtools```

・スクリプトを書いてみる

```
# vi uuid.rb 
---------------------
require 'uuidtools'

hostnames = ARGV

hostnames.each do |hostname|
puts "<<#{hostname}>>"
puts "md5  :"
puts UUIDTools::UUID.md5_create(UUIDTools::UUID_DNS_NAMESPACE, "#{hostname}")
puts "sha1 :"
puts UUIDTools::UUID.sha1_create(UUIDTools::UUID_DNS_NAMESPACE, "#{hostname}")
puts ""
end
---------------------
```

・実行結果

```
# ruby ./uuid.rb hoge1 hoge2
<<hoge1>>
md5  :
13950234-f550-3575-91d8-3fc8cbc47b0d
sha1 :
cdac4b6c-0856-515e-8318-799eb2afcdaf

<<hoge2>>
md5  :
c4c17ae2-6948-3902-87c5-53ff8d8cbf87
sha1 :
6833d38b-1531-598f-8cd8-2a1a1c03bf06

```

何回か実行して同じ値になることが確認できると思います。

・参考
http://99blues.dyndns.org/blog/2010/07/uuid_generate/
http://linux-ha.osdn.jp/wp/archives/891
http://www.drbd.jp/pacemaker.pdf
http://d.hatena.ne.jp/shunsuk/20110506/1304686954
http://www.python-izm.com/contents/application/uuid.shtml

名前から生成されたくない場合はSecureRandomを使うと良いようです。
http://qiita.com/tnoda_/items/ad98f8a5fa23696fbb7d

実際クラスタ組んでみたところ、全然違うuuidになったあげく、
別にdcuuidとか勝手に認識してcib.xmlも自動で書き変わってて、
template化する必要も特になかったというオチがつきましたorz。。

以上
brewで入れたEmacsにddskkを入れる


とりあえずMacのセットアップなどを行なってEmacsも入れたけど、skkのセットアップを行なっていなかったのでやったことの備忘録。

いろいろググってみたけどFomulaは提供されていないみたいなので、自分でインストールする。

こちらを参考にした。

[Mac OSX 10.8.5 に GNU Emacs For Mac OS X(24.3) をインストールする。(2) DDSKK](http://yanqirenshi.hatenablog.com/entry/2013/10/18/Mac_OSX_10_8_5_%E3%81%AB_GNU_Emacs_For_Mac_OS_X(24_3)_%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E3%80%82(2))

## Installation

参考にしつつ`make what-where`を実行してみる。

```
$ make what-where /Applications/Emacs.app/Contents/MacOS/Emacs
emacs -batch -q -no-site-file -l SKK-MK -f SKK-MK-what-where
Loading /tmp/ddskk-15.1/SKK-CFG...

SKK modules:
  skk-viper, skk-jisx0213, skk-emacs, ccc, cdb, context-skk, queue-m, skk-abbrev, skk-act, skk-annotation, skk-auto, skk-autoloads, skk-azik, skk-cdb, skk-comp, skk-cursor, skk-cus, skk-dcomp, skk-develop, skk-gadget, skk-hint, skk-inline, skk-isearch, skk-jisx0201, skk-jisyo-edit-mode, skk-kakasi, skk-kcode, skk-leim, skk-look, skk-macs, skk-num, skk-server-completion, skk-server, skk-show-mode, skk-sticky, skk-tankan, skk-tut, skk-vars, skk-version, skk, skk-study
  -> /usr/local/Cellar/emacs/24.5/share/emacs/site-lisp/skk

SKK infos:
  skk.info
  -> /usr/local/Cellar/emacs/24.5/share/info

SKK tutorials:
  SKK.tut, SKK.tut.E, NICOLA-SKK.tut, skk.xpm
  -> /usr/local/Cellar/emacs/24.5/share/skk
make: Nothing to be done for `/Applications/Emacs.app/Contents/MacOS/Emacs'.
```

`/usr/local/Celler/emacs/24.5`以下に入るようなので問題ないみたい。

というわけでインストール。

```
$ make install /Applications/Emacs.app/Contents/MacOS/Emacs
emacs -batch -q -no-site-file -l SKK-MK -f SKK-MK-install
Loading /tmp/ddskk-15.1/SKK-CFG...
...
Wrote /usr/local/Cellar/emacs/24.5/share/info/dir
make: Nothing to be done for `/Applications/Emacs.app/Contents/MacOS/Emacs'.
```

インストールは以上。

## ちょっと設定

そのままだと半角カナが打てなかったのでちょっと設定する。

`~/.emacs.d/init.el`にでも以下の設定を追加。

```
(setq skk-use-jisx0201-input-method t)
```
よく使うシェルスクリプト

```bash:自分のディレクトリに移動
#!/bin/sh

cd `dirname $0`
```
```bash:list.txtを一行づつ読み込んでループ
filename="list.txt"
cat ${filename} | while read -r line
do
  echo $line
done
```
```bash:ワイルドカードで検索したファイルリストをループ

files="*.txt"
for filepath in ${files}
do
  echo $filepath
done
```

```bash:ディレクトリ内にある.pngファイルを原色する
#!/bin/bash

# 処理対象のディレクトリ（カレントディレクトリの場合は . を指定）
TARGET_DIR="."

# ディレクトリ内のすべての .png ファイルを処理
find "$TARGET_DIR" -type f -name "*.png" | while read -r file; do
  # pngquantで減色処理し、元ファイルに上書き
  pngquant --quality=65-80 --force --output "$file" "$file"
done
```

## [パス文字列からファイル名などを抜き出す](https://qiita.com/ktr_type23/items/94747a4b27e8a630ce48)
https://qiita.com/ktr_type23/items/94747a4b27e8a630ce48
RSpecでformat: jsonなアクションをテストする


# 環境

* rails: 4.0.9
* rspec: 3.1.0

# controller

formatでrenderを切り替えている

```ruby
def index
  # 何がしかのjsonデータ
  @json = Json.all
  respond_to do |format|
    format.html
    format.json { render json: @json }
  end
end
```

# RSpec

こうすると@jsonを返す方をテストできる

```ruby
before do
  request.env["HTTP_ACCEPT"] = 'application/json'
  get :simulate, format: :json
end

subject { response.body }
it {
  is_expected.to be_json_eql(%({id: 'hoge', name: 'fuga'}))
}
```

どうにもRSpecを調べるのは骨が折れますね...
Windows Ruby2.2にsqlite3 gemインストールで手間取った

将来またおんなじことで引っかかりそうなので個人的備忘録として。

qtbindingsがRuby2.0のみから2.x対応したようなので重い腰を上げて2.2を入れてみることにしました。
で、RubyInstallerでさっくりインストール、Devkitの設定も済ませて引き続きgemのインストール。
qtbindingsやgd2-ffijはさっくり入ったんですがsqlite3 gemで罠が。
てきとーに

```
> gem install sqlite3
```

とやるとバイナリコンパイル済みのを拾ってきてくれるのですが、
これが本記事執筆時点(2015/06/12)では2.1までしか対応しておりませんorz
そんなわけでソース入りのgemを拾ってきたはいいものの、いまいちmingwがよく分かっておらず
適当にincludeへsqlite3.h、libへlibsqlite3.dll.aを突っ込んでみても
「sqlite3.hないんですけど」と冷たく返される始末。
なのでgem install へコンパイルオプションを指定する必要があるのですが、その際

```
> gem install C:\hoge\piyo\sqlite3-1.3.10.gem --with-sqlite3-dir=...
```

とやってしまうとgem自身のオプションとみなされてエラーになってしまいますので

```
> gem install C:\hoge\piyo\sqlite3-1.3.10.gem -- --with-sqlite3-dir=...
```

とまあ、「--」で打ち止めにしておくと。

さて2.0から2.2って何が変わったんだっけ……
[Grails3]のInterceptorでリダイレクトするには

# 追記(2015/06/17)
こちらの現象は，Grails 3.0.2で解消されており、Interceptor内からredirect()を利用することができるようになったようです!!

# 課題

Grails3.0 では、FilterではなくInterceptorが利用されることになりましたが、Interceptor内でredirectするとエラーとなってしまうようです。

Interceptor内でリダイレクトできないと、Authの処理でいろいろとめんどくさいことになりそうなので、やり方を調べてみました。

# 方法
対応方法としては1つ見つけました。
* response.sendRedirectを実行する

```groovy
// response.sendRedirectを利用する方法
class XXXInterceptor {

  boolean before() {
    // リダイレクトが必要かどうかをチェック
    if ( needRedirect() ) {    
        def url = grailsApplication.config.getProperty("myapp.redirect.url")
        response.sendRedirect(url)
    }
    true
  }

}
```

```yaml:application.yaml
myapp:
    redirect:
        url: http://localhost:8080/
```


# 考察
sendRedirectでリダイレクト先のURLの取得は、コンフィグ(application.yml)から取得すべきでしょうね。

# 追記(2015/06/15)
application.yamlからリダイレクト先を取得するように変更

# 参考
[Grails]新しいInterceptorとアノテーションを利用してログイン機能を実装（仮）
http://qiita.com/saba1024/items/f4af87a1e4778f57b92a
VPC Flow Logsを早速設定してみた

# 感想

* 設定自体はWebコンソールからポチポチ簡単
* 先にCloudWatchログでロググループを作っておく
* リジェクトしたログのみを出すと、不正アクセスが結構きている事がわかる。SSHとか知らないIPからバンバンきてる。
* 自社IP以外からSSH成功しているログをログメトリックスで引っかけてアラート出すと、良いかも。
* そもそもセキュリティグループで出来ないようになっているけど、万が一の為には安心かも。

# 設定方法

1. サービス→CloudWatchを選択
2. ログ→ロググループの作成→ロググループ名に「Flow-Log」→ロググループの作成ボタン押す
3. サービス→EC2→ネットワークインターフェース→監視したいEC2インスタンスのやつを選択
4. タブにフローログが増えてるので選択→フローログの作成
5. フィルタ選択　すべて、許可、拒否のどれかを選択
6. ロールは最初に「アクセス権の設定」をクリックすると適切なロール「flowlogsRole」を作ってくれる。
7. 送信先ロググループは「Flow-Log」を選択
8. 最後にフローログの作成を押す。

# フローログの確認

* 作成後のフローログタブの表のCloudWatch ロググループのリンクを押すとフローログにジャンプするよ。


```
アカウント、IP値はマスクしています
2 999999999999 eni-99999999 218.77.zzz.zzz xxx.xxx.xxx.xxx 58065 22 6 1 40 1434068602 1434068662 REJECT OK
2 999999999999 eni-99999999 95.181.zzz.zzz xxx.xxx.xxx.xxx 39990 22 6 4 24 1434069322 1434069382 REJECT OK
```
| Ver | アカウントID | ENI-ID | 送信元IP | 送信先IP | 送信元ポート | 送信先ポート |プロトコル | パケット数 | バイト数 | 開始unixtime | 終了unixtime | 許可or拒否 | ステータス | 
|:--|:--|:--|:--|:--|:----------|:----------|:--|:--|:--|:--|:--|:--|:--|:--|
|2 |999999999999 |eni-99999999 |218.77.zzz.zzz |xxx.xxx.xxx.xxx |58065 |     22 |6 |1 |40 |1434068602 |1434068662 |REJECT |OK|

* これはIP:218.77.zzz.zzzからSSH接続(22ポート)しようとして拒否(REJECT )が成功(OK)したよっていう意味のログ
* SSH接続は秘密鍵にして社内IPからしか許可しないようにセキュリティグループで設定しています。

# まとめ

* IPトラフィック監視が簡単に設定できるので、いいね。
* CloudWatchログの新機能が増えてきているね。
* CloudWatchログをグラフィカルに可視化できる良い方法が有れば誰か教えてくださいー。

自分の[技術ブログ](https://blog-c.cloudlance-motio.work/)ではフリーランス界隈の情報や最新のIT情報の発信していますので、よろしくお願いします。

# 参考サイト

[VPC Flow Logs - トラフィックフローの収集、閲覧](http://aws.typepad.com/aws_japan/2015/06/vpc-flow-logs.html)
[【新機能】VPC Flow LogsでVPC内のIPトラフィックを監視することができるようになりました!](http://dev.classmethod.jp/cloud/aws/introduce-to-vpc-flow-log/)
[VPC Flow Logs – Log and View Network Traffic Flows](https://aws.amazon.com/jp/blogs/aws/vpc-flow-logs-log-and-view-network-traffic-flows/)
[VPC Flow Logs](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/flow-logs.html)
Postgresのテーブルをコピーする

例えば、ローカルのMacで管理画面でポチポチ作ったデータテーブルを、開発サーバーにコピーする時とか。
※以下を実行すると、元あったtableデータはなくなるので注意！

```lang:Macの場合
pg_dump -c -t [table] [database] > hoge.sql
# hoge.sql をサーバーにアップロードして、サーバー上で、
psql hoge.sql
```
よく使うherokuコマンドまとめ

# よく使うherokuのコマンドをまとめておきます。

```lang:ログを見る
heroku logs --tail
```
```lang:マイグレート実行
heroku run rake db:migrate
```
```lang:Postgresに入る
heroku pg:psql
```
```lang:sshログイン
heroku run bash
```
elixir情報源メモ

#英語
* [elixir-lang.org](http://elixir-lang.org/)
* [elixir source](https://github.com/elixir-lang/elixir)
* [Hex](https://hex.pm/)
* [elixir cheat sheet](http://media.pragprog.com/titles/elixir/ElixirCheat.pdf)
* [elixirstream.com](http://elixirstream.com/)

#日本語
* [Elixir Advent Calendar 2014](http://qiita.com/advent-calendar/2014/elixir)
* [パーフェクト"Elixir情報収集"](http://www.slideshare.net/keithseahus/elixir-48878894)

#Twitter
* [@josevalim](https://twitter.com/josevalim)
* [@elixirlang](https://twitter.com/elixirlang)
Rails I18nの小技


個人のメモ

## パラメータを渡したい場合

```ruby
item.errors.add :title, :invalid, title: link.title, url: link.url unless link.valid?
```

I18nで変数を使う時に、`I18n.t('...', title: link.title)`的な書き方はよく使ってますがが、上記のように、`model.errors.add`でシンボルを渡す時でも変数をパラメータで渡せます。

## モデルなどにnamespaceがある場合のkey
下記参照リンク先の内容のままですが、

```ruby
# car.rb
class Products::Car
  owner...
end

# ja.yml
ja:
  activerecord:    
    models:
      products/car: "Автомобиль"   
    attributes:
      products/car:
        owner: "Владелец"
```

http://stackoverflow.com/questions/7693040/how-to-translate-model-in-namespace

そういえば、`accepts_nested_attributes_for`の場合もこのような階層になってますね。

- [ ] 後でソースを読む！
ElixirのMetaprogrammingに出ているquote

ElixirのMetaprogrammingの中によく出てくるのは`quote`と`unquote`です。最初はなんなのかさっぱり分からなかったです。

```
iex(1)> quote do: 1+2
{:+, [context: Elixir, import: Kernel], [1, 2]}

iex(2)> quote do: div(10, 3)
{:div, [context: Elixir, import: Kernel], [10, 3]}

iex(3)> quote do: IO.puts "hello world"
{{:., [], [{:__aliases__, [alias: false], [:IO]}, :puts]}, [], ["hello world"]}
```


返してきたtupleは実はAST(Abstract syntax tree)のことです。

Elixirだけではなく、大半のプログラミング言語はASTと関わりがあります。ソースコードはコンパイルされるときにまずある木構造に変更されてから、その後bytecodeなりmachine codeなりに変更されます。

一般的にプログラマはこの木構造を気にすることはまずないです．

**ElixirのMetaprogramming実はこのAST木構造をいじることができる。**

上の例でだと　`{:+, [context: Elixir, import: Kernel], [1, 2]}`　は`1 + 2`のElixir内部の木構造です。

このtupleは三つの部分があります。

* `:+`
* `[context: Elixir, import: Kernel]`
* `[1, 2]`

ElixirではASTはこの三つの部分に構成されています。ネストされてる構造でもこんな三つの部分です。

特殊の場合もあります。

```
iex(3)> quote do: :atom
:atom
iex(4)> quote do: 1
1
iex(5)> quote do: "str"
"str"
```

（続き）

[Metaprogramming Elixir](https://pragprog.com/book/cmelixir/metaprogramming-elixir)本の中にMetaprogrammingを使って何かできる一つの例です。

```
div do
  h1 class: "title" do
    text "Hello"
  end
 
  p do
    text "Metaprogramming Elixir"
  end
end
```
上のコードを書いたら、下のようなコードが生成されることができる。

```
"<div><h1 class="title">Hello</h1>
  <p>Metaprogramming Elixir</p></div>
```

つまりコードを書いて、コードを生成するという仕組みです．
商品登録APIにおいて、relevant_linksが半角大文字から半角小文字に自動変換されてしまう

バグだと思われます

商品登録API
https://circus.shopping.yahooapis.jp/ShoppingWebService/V1/editItem

において、relevant_linksとcart_related_itemsが半角大文字で入力しても全部半角小文字に変換されてしまうようです。

商品コードが例えば

AA-AAAAAA-17

を入力すると、

aa-aaaaaa-17

と変換されてしまうため、関連商品が出てきません。

何卒、よろしくお願いいたします。
C#でCSV処理するには、Tupleが楽

表題の通りですが、サンプル書いてみます。
※例外などは省いて極力シンプルなものにしています。
※3列のCSVで、1列目に数値、2,3列目が文字列を想定しています。

```csharp

var filePath = @"xxxxx.csv";
var separator = new[] { ',' };
var data = new System.Collections.Generic.List<System.Tuple<int, string, string>>();

foreach (var line in System.IO.File.ReadLines(filePath)) {
  var cols = line.Split(separator);

  data.Add(new System.Tuple<int, string, string>(int.Parse(cols[0]), cols[1], cols[2]));
}

```

あとは、上記でいえばdata変数をLinqで自由に解析できるのも魅力ですね。
※どちらかといえば、そちらの方が楽しいw
JavaScriptの基本ルール

##JavaScriptコードの記述方法
JavaScriptは下記の方法で記述することが可能
1. scriptタグ内にJavaScriptコードを記述する
2. scriptタグのsrc属性からJavaScriptコードを記述した外部ファイルを読み込む（JavaScript外部ファイル化）
3. HTMLのタグの属性としてイベントハンドラを設定し、属性値にJavaScriptコードを記述（HTMLタグのイベントハンドラでの記述）

###①scriptタグ内にJavaScriptコードを記入
```
<!DOCTYPE html>
<meta charset="UTF-8">
<script>
alert("円周率" + Math.PI);
</script>
```

###②外部JavaScriptプログラムを取り込む
```
<script src="外部ファイルのURL"></script>
```

###③HTMLタグ属性としてイベントハンドラを設定し、属性値にJavaScriptコードを記述
```
<html>
<head>
<script>
function compute(form){
    if (confirm("Are you sure?")){
        form.result.value = eval(form.expr.value)
    } else {
        alert("Please come back again.")
    }
}
</script>
</head>
<body>
<form>
Enter an expression:
<input type="text" name="expr" size="15">
<input type="button" value="calculate" onclick="compute(this.form)">
Result:
<input type="text" name="result" size="15">
</form>
</body>
```

###④URL内にJavaScriptコードを記述
```
<a href="javascript:alert('Hello!!')">Click Me</a>
```
OpenRestyはどうよ

#同居しようと思ってる
とりあえず、気に入った。ただね、PHP出たての頃の狂騒とか、Node.jsの超盛り上がりとか、そーゆーのに比べてだいぶ世の中的な動きはへちょい。しかし、ゲーム業界出身の腕利きは割とLuaにも抵抗はないと思うのだが、どうだろう。ここから1年が勝負だよね。

基本的には 「Moonscript + OpenResty + Redis + Lapis」を遊びの中心にして（MORLスタックと呼びたい）、ライブラリ頼みで Node.js の方が速く書けるぜ、という時には「CoffeeScript + Node.js + Expressjs + PostgreSQL」（こねぷー）とかにしようかな。決めた。

Nginx + ngx-lua 最新版をソースから入れようとして、結局まだ未解決issueらしいものにぶつかって、nginxの開発版のソースを読み始めたところではっと我に返った。ばかじゃねーの？　使う前からそこに突っ込んでどうするよ。素直にOpenRestyを入れた。まだまだインストールはめんどいね。ここを何とかしないと広がらない気がするぞ。OpenRestyでだいぶマシになったとは言え、このconfigureでオプション差し替えて再インストールとか、この辺はどうも大声で勧めにくい。

あとは、socket.ioをどうするか。luaに訳すか？　そこに突っ込むのかなー。どーかなー。でも、リアルタイム部分をNode.jsに流すなんて馬鹿っぽいもんな。遊びだからモダンブラウザだけで良いかというのもあるが……。考えとく。
JavaScriptとは

##JavaScript概要
###javascriptとは
様々なWebブラウザで利用可能なインタプリタ型のプログラミング言語である
最近ではサーバサイドやスマーフォンアプリ開発ようなど様々な場面で利用できる非常に応用範囲の広い言語である
※インタプリタ：プログラミング言語で書かれたソースコードないし、中間表現にある命令列を逐次解釈しながら実行するプログラムのこと。

###JavaScriptの特徴
+ **WebブラウザがJavaScriptをサポートしている**
ブラウザでFlashを使ったコンテンツへアクセスするためには、Flashのプラグインをインストール必要があるが、JavaScriptを使うのにプラグインを使う必要はない。これはすべてのブラウザがJavaScriptをスクリプト言語として認識し、サポートしているからである。ただしブラウザごとにドキュメントオブジェクトモデル（DOM）はことなるので、そのDOMに応じたタスクをて季節に処理することが必要となる。
※DOM：HTMLやXMLの文章をアプリケーションから利用するためのAPIである。
※API；アプリケーションプログラミングインターフェースの略、ソフトウェアコンポーネントが互いにやり取りするのに使用するインターフェースの仕様である。サブルーチン、データ構造、オブジェクトクラス、変数などの仕様が含まれる。

+ **クライアントサイトでもサーバーサイドでも使える**
JavaScriptはブラウザのDOMにアクセスできるので、Webページを見ている最中にサイトの構造を変えることができる。そのためJavaScriptはWebページに様々な効果を加えることができる。

+ **関数型プログラミング言語である**
JavaScriptでは、関数を他のデータ型と同じように変数として割り当てることができる。それどころか、関数を他の関数のパラメータとして受け渡ししたり、戻り値として返すこともできる。名前のない関数を作ることもできる。つまり、関数型プログラミングの形式でコードを書けることを意味する。

+ **オブジェクト指向言語である**
JavaScriptは相互にメッセージを送り合うオブジェクトの集まりとしてプログラムを構成するオブジェクト指向言語である。しかし、JavaScriptでのオブジェクトの扱い方や継承の仕方がJavaのような他の伝統的なオブジェクト指向言語と少し異なる。そのため、JavaScriptは学習しやすく使いやすい一方、ほとんどのオブジェクト指向のコンセプトをサポートしている。

###JavaScriptで実現できること
+ マウスオーバーによる画像の変化
+ HTML要素の移動や拡大縮小、表示非表示制御
+ HTMLで書かれた文字列を様々なタイミングで変更できる
+ inputタグで入力された情報をもとに計算や画面上の表示を変更することができる
+ サーバサイドにユーザが入力した情報をリアルタイム（非同期）に送信することができる

###JavaScriptのフレームワーク
多くのJavaScriptのフレームワークが作成され、最近は非常に簡単に効率よく開発できるようになっている。

+ prototype.js
+ jQuery
+ suger.js

###JavaScriptの広がり
またJavaScriptは現在ブラウザ用のプログラム以外にも様々なツール利用されている。

+ Adobe PhotoshopやIllustratorのマクロ
+ Google App Script
+ Titanium（iOS、Androidアプリ開発ツール）
+ Node.js（サーバサイドミドルウェア環境）
+ Adobe AIR
+ Chromeアプリ
Rubyのクラスメソッドとインスタンスメソッドの覚え書き

PHPerのRuby覚え書き。第二弾。クラスメソッドとインスタンスメソッドについて。

## クラスメソッド
* クラスが使用できるメソッド
* クラスメソッドを定義したクラス自身が使える
* selfを頭につける
* インスタンス毎の属性(年齢・性別・容姿とか)関係なく皆がやることを宣言する

```rb
class Human
  def self.neru
    puts "人類はみな寝る"
  end

end

# クラスメソッドを実行
Human.neru
```

## インスタンスメソッド
* クラスのインスタンスのみが実行できる
* 自分の記憶を思い出すとかその人本人しか出来ないことを宣言する
* selfを頭につけない

```rb
class Human
  def initialize(name, omoide)
    @name = name
    @omoide = omoide
  end

  def self.neru
    puts "人類はみな寝る"
  end

  def omoidasu
    puts @name
    puts @omoide
    puts "#{@name}は#{@omoide}を思い出した"
  end
end

# インスタンスメソッドの実行
tanaka = Human.new("田中", "つらい思い出")
tanaka.omoidasu

kimura = Human.new("木村", "楽しい思い出")
kimura.omoidasu
```

インスタンスメソッドはそれぞれインスタンス毎の属性を使って、それぞれのインスタンスで異なる結果を出す時に使う。

`@name, @omoide`はインスタンス変数と呼ばれるもので、インスタンスメソッドからのみ呼び出せる

もう一つ人類共通で使いたい要素、例えば人口などは`@@population`のようにクラス変数で宣言できる。クラス変数は共通の要素なのでインスタンスメソッド、クラスメソッドの両方から呼び出すことが可能。

## あとがき
Rubyシンプルに書けていいんだけど、インスタンスメソッド内の名前が自分のインスタンスの要素を表しているのか、他のインスタンスメソッドを呼び出しているのかがわかりにくい。

もう少し慣れれば違和感無くなるのかなー
Mac のストレージ容量がいっぱいになった時にすべきことまとめ

Mac のストレージ容量がいっぱいになると、警告ダイアログが出たり、ブラウザのページが正しく読み込まれなくなったりする。
そんな時に、まず何を確認して、どうしたらいいのかをまとめておく。

# 現在のストレージ状況を確認する
メニューバーの一番左のリンゴマーク -> 一番上の About This Mac -> Storage タブを確認する

以下の様な画面で、どんなデータで圧迫されているのか分かるので、それを参考にする。

![Screen Shot 2015-06-12 at 10.03.32 PM.png](https://qiita-image-store.s3.amazonaws.com/0/1635/e09cdcbb-4123-2f2b-78e9-e2258a152318.png)

## ディレクトリ毎のサイズを計算する
ディレクトリ事のデータサイズが分かれば、どのディレクトリの中を整理すれば良いのか分かる。

du コマンドでディレクトリ毎のサイズを取得できる。

- -h オプション
    - バイト数表示を MB や GB 単位で表示してくれる
- -d オプション
    - サイズを取得するディレクトリの深さを設定できる

例えば以下では、ホーム以下の1階層までのファイルサイズを取得している。

```shell-session
$ du -h -d 1 ~
1.1G	/Users/sea_mountain/.android
3.9M	/Users/sea_mountain/.cache
175M	/Users/sea_mountain/.cocoapods
```

# 劇的にストレージを空ける方法
ストレージを空けるためにすべきことは以下である。もちろん、ゴミ箱を空にしている前提である。

## Mac のキャッシュファイルを削除する
Mac の起動ボタンをおした後、画面が点いてからすぐ Shift キーを押して、ログイン画面になるまで押しっぱなしにすると、セーフモードで起動できる。
セーフモードで起動できた時は、リンゴマークが出たあとに、ローディングバーが下に表示され、その後黒い画面でログインが促される。(右上に赤字で Safe Boot と書かれている)
これでログインまですれば、キャッシュが削除できたことになるので、再起動して通常のモードでログインする。

私の場合は、この操作で数 GB ストレージが空いた。

## Xcode のビルドキャッシュを削除する
Xcode は DerivedData というディレクトリに、ビルド時に作成されたキャッシュや中間生成物などを保持している。これは、プロジェクト毎に存在している。

このディレクトリは、例えば Xcode 6.4 では以下に存在している。このディレクトリだけで数十 GB があったりするため、必要の無いプロジェクトや、再ビルドできるプロジェクトのディレクトリは削除する。

```
/Users/user_name/Library/Developer/Xcode/DerivedData
```

これをすると、環境に依っては数十 GB の空きができる。

## 余談
Unity を使って iOS アプリのビルドをしている場合、特に大きいデータが作成される事があるので、この方法は有効である。

## Android ライブラリの削除
Android Developer Tools で、Android のコードや、その他 API ごとに色々なデータをダウンロードしていると、それで数十 GB 使っている可能性がある。
不必要な API バージョンを消すと、一気に空きができる場合がある。

削除するときは、Android SDK Manager を開き、不要そうな API やツールを選択し、"Delete xx packages" で削除できる。

## iOS シミュレータの不要データの削除
iOS シミュレータに保存されているアプリデータや、不要な情報も削除できる。

以下メニューで、シミュレータ内のデータ削除が行われる。
iOS Simulator -> Reset Content and Settings


これでもストレージが足りない場合は、インストール済み iOS シミュレータを削除するという方法がある。また、du コマンドで、どのフォルダが悪いのか確認しておくのがよいだろう。
PepperをROSと接続する


　以前，「ROSの勉強がしたいんだ！」と吠えて，[数千円でしょぼいロボットアームをこさえて，ROSから動かしたことがありました](http://qiita.com/yoneken/items/ed2e5edf3aa4e0d8d2e3 "ROS練習用のロボットを作る")．
　そんなことをしていたら，ある日ウチになんかフリーザみたいなヤツがやってきた．

![フリーザみたいなヤツ](https://pbs.twimg.com/media/CHPJn29VAAAZigM.jpg)
　呼んでねぇよ．

　こいつは，ようやく今月から一般販売だということですが，それに先駆けて（？），Aldebaranのほうから公式にROSパッケージが出ています．それを試用してみました．

# 環境構築
　ROSのバージョンは，indigoでやります．
　ベースのOSは，Ubuntuが良いです．14.04が特にオススメです．15.04だとリポジトリにjadeしかないので，rosdepを使う場合は気をつける必要があると思います．
　ちなみに私は，[宗教上の理由でrosdepが使えない](https://twitter.com/k_yone/status/603570420667715585)ので，Ubuntu 15.04に，ほとんどソースからインストールしました．

　重要なパッケージは， **naoqi_bridge** と **pepper_robot** と **pepper_meshes** ．

　マトモな人は，[チュートリアル](http://wiki.ros.org/pepper/Tutorials)にもあるように，

$ sudo apt-get install ros-indigo-driver-base ros-indigo-move-base-msgs ros-indigo-octomap ros-indigo-octomap-msgs ros-indigo-humanoid-msgs ros-indigo-humanoid-nav-msgs ros-indigo-camera-info-manager ros-indigo-camera-info-manager-py

　して

$ sudo apt-get install ros-indigo-pepper-.*

　すれば事足りるはず．
　Ubuntu15.04の人はjadeなので，上記のros-"indigo"-のindigoのところが全部jadeになります．

# 起動

$ roscore

　これは起動しっぱなしで放置して，ターミナル変えて，

$ export NAO_IP=xxx.xxx.xxx.xxx

　xxx..の部分はPepperのIPアドレスに変えること．

$ roslaunch pepper_bringup pepper.launch

　これで，Pepperのあれやこれやがどんどんパブリッシュされるので，

$ rosrun rviz rviz 

　で可視化する．
![ROSからPepper](https://pbs.twimg.com/media/CHPKKDCVIAA4Uz8.png)
　チュートリアルには， src/pepper_robot/pepper_bringup/config/pepper.rviz にコンフィグあるよ〜って書いてあるんだけど，私の環境ではうまくいかなかったので，[自作したコンフィグ](https://gist.github.com/yoneken/c727cc2fcefbc610f135)もGistにあげておいた．
　可視化されているのは，Pepperの姿勢(TF)，深度画像，カメラ画像，前後ソナー，足下周辺レーザー．

・デプスマップが外周で激しく歪んでいる
・デプスとRGBの画像が一致してない

　色々と問題もあるけど，数学で殴ればなんとかなるような気もしている．


## 補足情報
　NAOqi SDKは，自分のディレクトリで展開した後，

$ export NAOqi_DIR=/path/to/naoqi-sdk

と環境変数に入れておくこと．

 PyNAOqiは，同様に展開したあと，場所をPYTHONPATHに含めておくこと．ターミナルでpythonを起動して，import naoqiができなければ，パスが通ってない．

　NAOqi関連のROSパッケージデ，naoqi-driverとnaoqi-sensorsは，ビルド時にNAOq-SDKの場所を入力しないとバイナリが生成されない．一度catkin_makeを走らせたあと，buildディレクトリの中のCMakeCache.txtを編集して，再ビルドすること．
IT業界で横行する恥ずかしい英語発音

プログラマやデザイナと話してるとしょっちゅう変な英語発音に出くわします。
例えば**height**を**「ヘイト」**と発音したり。
そういう時、私は心では「ヘイトじゃないよ**ハイト**だよ！」と呟きつつ、口では「そうですね、ではヘイトは80pxにしましょう！」なんて言ってるのであります。
まあ、所詮我々が話しているのは英語ではなく、日本語の中に出てきた英単語をカタカナで発音しているに過ぎないですし、テレビのテロップで**main**を**メーン**と表記する時代ですので**正解などは無い**と思っています。
ですから、何でもかんでも正しい英語っぽく発音するべきなどとは思っていませんが、やはり**「こいつ適当にスペルを日本語読みしてるだけだろ！」**ってのが明らかな場合は、聞いているこっちが恥ずかしくなってしまうものです。

というわけで、この業界で横行してる妙な発音をまとめてみました。

## 間違って発音すると恥ずかしい英語
これらは間違って発音すると**無知**なんだろうなと思われるかもしれません。

| 英語 | 妙な発音 | 私がしっくり来る発音 |
| --- | --- | --- |
| height | ヘイト | ハイト |
| width | ワイズ、ウィドス | ウィッズ |
| allow | アロウ | アラウ |
| deny | デニー | ディナイ |
| href | ハーフ | エイチレフ |
| Dreamweaver | ドリームウェーバー | ドリームウィーバー |
| fedora | フェードラ | フェドーラ |
| cron | クーロン | クロン |
| yum | ユム | ヤム |
| none | ノン | ナン |
| responsive | レスポンシブル | レスポンシブ |
| char | チャー | キャラ |
| halt | ハルト | ホールト |
| altcoin | アルトコイン | オルトコイン |
| desktop | ディスクトップ | デスクトップ |

---

## 間違った発音が多数派になってしまってる英語
これらは間違った発音が市民権を得てしまってるので、英語っぽく発音をすると逆に**嫌味な人**と思われるかもしれません。

| 英語 | 間違ってる発音 | 本来の英語に近い発音 |
| --- | --- | --- |
| null | ヌル | ナル |
| ping | ピング | ピン |
| theme | テーマ | シーム |

※ themeはドイツ語が起源なので「テーマ」が正しいというご意見を頂きました。
ドイツ語の発音に興味がある方は「say theme in german」とググると良いです。

---

他にもあったら教えて下さい。
異論反論もウェルカムです。
Vue.js でちょっと CSS アニメーション入れたいとき

v-cloak の使い道については[こちら](http://qiita.com/macoshita/items/630e6bf1b6fa068790a3)に書いたんですが、その応用的に v-cloak が外れるときにふんわりフェードインしながら表示させる例。

```sass
@mixin keyframes($name)
  @-webkit-keyframes #{$name}
    @content
  @-moz-keyframes #{$name}
    @content
  @keyframes #{$name}
    @content

@mixin animation($p)
  -webkit-animation: $p
  -moz-animation: $p
  animation: $p
  -webkit-animation-fill-mode: both
  -moz-animation-fill-mode: both
  animation-fill-mode: both
  
@include keyframes(fade-in)
  0%
    opacity: 0
  100%
    opacity: 1

[v-cloak]
  visibility: hidden // (1)

.fade-in:not([v-cloak]) // (2)
  @include animation(fade-in 1s ease-in)
```

(1) の部分で display: none にした場合は、(2) の not セレクタは要らないはず(display: block になった時にアニメーションが始まるので)。ただこの例のように visibility: hidden を使ってたりするとアニメーションが隠れている間に動いちゃうので、not セレクタつけといたほうが汎用的かと思う

このサンプルの動作確認 → http://jsbin.com/doveyociba/1/

CSSアニメーション部分の参考 → http://liginc.co.jp/web/html-css/css/105796
Electronでskyway.ioを使う


http://nttcom.github.io/skyway/

skaywayを使えば、WebRTCのP2Pビデオチャットが簡単に実装できる。
今、skywayを利用していたWebアプリをElectronに移行しようとしているのだが、Electronでskywayがうまく動かなかった。
上手くいくように頑張ったメモです。

### 原因

XHRやWebSocketで通信する際のOriginが`file://`になっており、skyway側で弾かれるのが原因っぽい。

![image](https://qiita-image-store.s3.amazonaws.com/0/18346/5a0f280d-27c6-783f-586d-94ee436bfce9.png)

skywayは利用登録をする時にリクエスト元ドメインを指定するようになっていて、そこに登録されていないOriginからのリクエストは弾くようになっているのだろうと推測した。

![image](https://qiita-image-store.s3.amazonaws.com/0/18346/56886497-5111-d945-e653-f792d71ad350.png)


### 解決策

https://www.npmjs.com/package/skyway-peerjs-electron

skywayのpeerjsをforkして、XHRを[isomorphic-fetch](https://github.com/matthew-andrews/isomorphic-fetch)に、WebSocketを[ws](https://github.com/websockets/ws)に書き換え、Peerをインスタンス化するときのオプションに`origin`を追加した。（ブラウザのXHR、WebSocketはOriginの書き換えが出来ないため）
`origin`にはskyway.ioに登録した際のドメインを渡せばOK。

```
$ npm install --save skyway-peerjs-electron
```

```js
var Peer = require('skyway-peerjs-electron');
var peer = new Peer({ key: 'skyway.ioに登録した時に発行されるキー', origin: 'http://example.com' });
```

### まとめ

skywayにかぎらず、`file://`でロードしている場合はクロスドメイン制約に引っかかる可能性があるので、サーバ側で`Access-Control-Allow-Origin`ヘッダを適切に設定するか、今回のようにXHRを使わずにNode.js側で処理する必要がある。気をつけなはれや！
Golangでの日付のフォーマット指定の方法について

Golangで単純に日付のフォーマットに変更しようとしただけなんですがちょっとハマったのでそのメモです。（以下では、`package` 、`import`は適切に宣言されているものとして説明をします。）

例えば、今日の日付を特定のフォーマットに変更する場合をRubyとGolangとを比較して説明します。

## Rubyの場合

Rubyで日付のフォーマットを変更するには以下のように、`%`から始まる指定されたフォーマットに従って変換されます。

```rb
# 2015-06-12 00:50:19 +0900
Time.now
# 2015-06-12
Time.now.strftime("%Y-%m-%d") 
```

## Golangの場合

一方、Golangでは特定の文字列で指定されたフォーマットに従って変換されます。

```go
// 2015-06-12 00:17:10.467238206 +0900 JST
time.Now()
// 2015-06-12
time.Now().Format("2006-01-02")
```

フォーマットとして指定できるものは以下の通りです。日付のフォーマットに関するより詳しいことは、[Source file src/time/format.go](http://golang.org/src/time/format.go)に書かれています。

```go
const (
    stdLongMonth      = "January"
    stdMonth          = "Jan"
    stdNumMonth       = "1"
    stdZeroMonth      = "01"
    stdLongWeekDay    = "Monday"
    stdWeekDay        = "Mon"
    stdDay            = "2"
    stdUnderDay       = "_2"
    stdZeroDay        = "02"
    stdHour           = "15"
    stdHour12         = "3"
    stdZeroHour12     = "03"
    stdMinute         = "4"
    stdZeroMinute     = "04"
    stdSecond         = "5"
    stdZeroSecond     = "05"
    stdLongYear       = "2006"
    stdYear           = "06"
    stdPM             = "PM"
    stdpm             = "pm"
    stdTZ             = "MST"
    stdISO8601TZ      = "Z0700"  // prints Z for UTC
    stdISO8601ColonTZ = "Z07:00" // prints Z for UTC
    stdNumTZ          = "-0700"  // always numeric
    stdNumShortTZ     = "-07"    // always numeric
    stdNumColonTZ     = "-07:00" // always numeric
)
```

## 最後に

自分はRubyのようなフォーマットの指定に慣れていたのでGolangのこの指定方法はちょっと気持ちわるいなと思ってしまいました。なんでこのような分かりにくいものになっているんでしょうか？それともこれが普通なんですかね。もしもこの理由を知っている方がいたら教えてください。

## 参照

* [How to format current time using a yyyyMMddHHmmss format?](http://stackoverflow.com/questions/20234104/how-to-format-current-time-using-a-yyyymmddhhmmss-format)
if case let x?文の使いどころについて考えてみた


Swift2が公開されて変更点を見ていたところ、次のような文法が追加されていました。

```swift
let someOptional: Int? = 42

if case .Some(let x) = someOptional {
    print(x)
}

if case let x? = someOptional {
    print(x)
}
```

要はパターンマッチがif文にも開放されたのですが、Optionalのためにわざわざこの`if case let x?`という糖衣構文が追加されています。

しかし一体これ何に使うの？という感じです。なぜなら同じような役割であればすでに`if let`構文があるからです。

```swift
let someOptional: Int? = 42

if let x = someOptional {
    print(x)
}
```

わざわざ文字数増やしてこれを使う理由がわかりません。

少し考えて、ちょっといいかなと思ったのが複数Optionalのアンラップです。
例えば３つのInt?型の変数があり、その３つの合計を計算するときのことを考えます。

```swift
let a: Int? = 10
let b: Int? = 11
let c: Int? = 12
```

これを計算するとき、Swift1.2だと次のようになります。

```
if let x = a, y = b, z = c {
	println(x + y + z)
}
```
問題無いですね。

これを`case let`文にすると次のように変わります。

```swift
if case let (x?, y?, z?) = (a, b, c) {
	print(x + y + z)
}

```

どうでしょうか？好みもあると思いますが、個人的には`case let`文を使ったほうが見やすい気がします。

これを使って関数などでguard文と組み合わせ、Optionalを一気に外すみたいなやり方も
できるかなと思います。

```
func add(a: Int?, b: Int?, c: Int?) -> Int? {
    guard case let (a?, b?, c?) = (a, b, c) else {
        return nil
    }
    return a + b + c
}
```
Live2Dでオリジナルモデルを動かすまで


## はじめに

![](https://raw.githubusercontent.com/mba-hack/images/master/live2d_miku_model.gif)


[Live2D](http://www.live2d.com/)というのは、2Dモデルの作成や組み込みに特化したシステムのことで、様々な形でLive2D関連のツールが用意されています。例えば、2Dモデルの作成には、[Live2D Cubism Editor](http://sites.cybernoids.jp/cubism-editor2/)が便利ですし、[Unity](http://japan.unity3d.com/unity/download/)というゲーム開発ソフトに組み込むには、[Live2D Cubism SDK](http://www.live2d.com/products/cubism_sdk)が便利です。

ここでは、後者のUnityに組み込んで2Dのサンプルモデルを簡単に表示するまでと、オリジナルモデルを表示するまでの手順を紹介します。

と言っても、公式のマニュアルが非常に充実しておりますので、そちらの方を見てもらえばすぐに実行できると思います。

http://sites.cybernoids.jp/cubism2/

したがって、この記事は、ポイントのみの説明になります。

## UnityでLive2Dのサンプルモデルを表示するまで

- [Unity](http://japan.unity3d.com/unity/download/)のインストール

- [Live2D Cubism SDK](http://www.live2d.com/products/cubism_sdk)のダウンロード

- ダウンロードし、解凍した`Live2D_SDK_Unity`フォルダから`sample/Demo/Assets/Scene/Sample.unity`を実行し、Unityで開く

参考:

[#03 サンプルプロジェクトの実行 - Live2D Cubism 2 マニュアル](http://sites.cybernoids.jp/cubism2/lets-do-it/my-first-lapp/03)

## UnityでLive2Dのオリジナルモデルを表示するまで

- [Live2D Miku Model](http://sites.cybernoids.jp/cubism2/samples)をダウンロードし、解凍する

- 解凍したフォルダ内にある`miku_sample.cmox`を実行して、メニューから[ ファイル ] - [ mocファイル書き出し ]を選択する

- `model.moc`というファイルができていると思いますが、これをリネームして、`model.moc.bytes`とします。

- Unityで`miku/model.moc.bytes`とあるうちの`miku/`をディレクトリごと`Resources/`に入れます。`Resources/miku/model.moc.bytes`となります。

- ここで、Unityの画面左上にある`Hierarchy`にて`Live2DModel`を選択します。もしなければ、画面左下にあるディレクトリ構造より`Scens/Sample`を実行し、表示された`Live2DModel`を選択します。

- ここで、`Simple Model (Script)`を変更していきますが、`Moc File`の指定に、`Resources/miku/model.moc`を指定します。そして、`Texture Files`にて`Size=1`, `Element 0`を`Resources/miku/model.2048/texture_00`に変更します。

![](https://raw.githubusercontent.com/mba-hack/images/master/live2d_miku_model_03.png)

- これで、Unityの画面上部にある再生ボタンを押すと、設定がリロードされて、初音ミクが表示されます。マウスで動かしてみてください。`Resources/miku/runtime/motions`でプログラムされた動作をするはずです。

![](https://raw.githubusercontent.com/mba-hack/images/master/live2d_miku_model_02.png)

参考:

[#04 オリジナルモデルを組み込もう - Live2D Cubism 2 マニュアル](http://sites.cybernoids.jp/cubism2/lets-do-it/my-first-lapp/04)

## さいごに

このようなLive2Dモデルは、様々なゲーム開発分野で取り入れられています。素晴らしいです。

具体的には、[Joker Script](http://jokerscript.jp/), [Tyrano Script](http://tyrano.jp/demo/play/live2d)などを使ったゲーム開発スクリプトなどでも便利に使えるようになっています。こちらも素晴らしいスクリプト、ツール群であり、次の機会には、これらのツールを使ったノベルゲームを作成する方法を書いていきたいと思います。
CloudFront キャッシュ動作確認

CloudFrontでのキャッシュ状態をブラウザで確認する方法。


レスポンスヘッダのx-cacheの値を見る

| x-cache | CloudFrontキャッシュ |オリジンへのリクエスト |オリジンからのレスポンス|
|----------------|------------|---|---|
| Hit from cloudfront      | ◯（キャッシュ有り） | 無し | 無し|
|RefreshHit from cloudfront| △ （TTL切れ）| 有り（If-Modified-Sinceヘッダ付き）  | 304(NotModified) <br> レスポンスヘッダのみ|
| Miss from cloudfront     | ☓ |有り| レスポンス：200(OK) <br> ファイル内容応答|
jQuery いつも忘れてしまうselectとかcheckboxとかradioの値を取得する方法

いつも忘れてしまうのでメモです

#select
単純にselect要素に対して`val()`すればよい。

````js
$("#myselect").change(function(){
    $("#result").text($(this).val()+"を選択しました");
});
````
[サンプル(jsfiddle)](http://jsfiddle.net/pianoscorejp/8L1ys4vb/)

#checkbox

checkbox要素に対して`prop("checked")を実行します。
チェックされている場合はtrue,されていない場合はfalseが返ります。

````js
$(this).prop("checked"))
````
[サンプル](http://jsfiddle.net/pianoscorejp/8L1ys4vb/1/)

#radio

radio要素のname属性+`:checked`を使います。

````js
$("input[name=myradio]:checked").val();
````
[サンプル](http://jsfiddle.net/pianoscorejp/8L1ys4vb/1/)

[関連記事]
[jQuery テーブルで相対的にセルを取得するセレクタの書き方](http://qiita.com/PianoScoreJP/items/be721f1b06745c2bbc39)
[jQuery　書き方を忘れがちなフィルター関係のセレクタ]
(http://qiita.com/PianoScoreJP/items/09247074e03e4b93d7b7)
TurbolinksとjQueryを共存させる


## 目的

RailsでTurbolinksを有効にしてると、そのままではjQueryが有効にならないのでそれを解消する。

## コード

readyを定義して、page:loadにバインドする。

```coffeescript:application.js.coffee
#= require jquery
#= require jquery_ujs
#= require turbolinks

ready = ->
  # smooth scroll to top
  $(".navbar-brand").on 'click', (e) ->
    e.preventDefault()
    hash = this.hash
    $('html, body').animate {
      scrollTop: $(hash).offset().top
    }, 300, ->
      window.location.hash = hash
    false

$(document).ready(ready)
$(document).on('page:load', ready)
```

おー、うごいたうごいた。

[kossnocorp/jquery.turbolinks](https://github.com/kossnocorp/jquery.turbolinks j"kossnocorp/jquery.turbolinks")
こういうのもあるみたい。

## 参考サイト

[Rails - Turbolinksをオフしないためにやった事 - Qiita](http://qiita.com/saboyutaka/items/bcc0966313c6f7399a6e "Rails - Turbolinksをオフしないためにやった事 - Qiita")
Tomcat7 とRFC違反のCookie

業務の都合で、Tomcat7でRFC違反のCookieを発行しなければならなくなった。
具体的には、値に"="を含むCookieをダブルクォートで囲まずに発行せよ、とのことである。

Tomcat7では通常RFCに従い、"="のような特殊なセパレータ文字を含むCookie値が許可されることはなく、ダブルクォーテーションによって囲まれる。
これを嫌い、ダブルクォートで囲まれないようにするための実装について記す。

Tomcat 7 では(Tomcat HOME)/conf/catalina.propertiesに記載された設定値によって、発行するCookieに以下のように制約が生じる。

なお、デフォルトでは両設定値ともfalseとなる。

パターン①
org.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0=true
org.apache.tomcat.util.http.ServerCookie.FWD_SLASH_IS_SEPARATOR=false
又は
org.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0=true
org.apache.tomcat.util.http.ServerCookie.FWD_SLASH_IS_SEPARATOR=true

　　→',', ';', ' ', '\t'が含まれている場合ダブルクォートで囲う


パターン②
org.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0=false
org.apache.tomcat.util.http.ServerCookie.FWD_SLASH_IS_SEPARATOR=false

　　→ '\t', ' ', '\"', '(', ')', ',',':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '{', '}'が含まれている場合ダブルクォートで囲う


パターン③
org.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0=false
org.apache.tomcat.util.http.ServerCookie.FWD_SLASH_IS_SEPARATOR=true

　　→パターン②に加え、'/'が含まれている場合にはダブルクォートで囲う。


従って、Tomcat 7系では"="に限らず、主要なセパレータを含む値をCookieにセットしたい場合、org.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0をtrueにセットすることで目的を達成することが出来る。

なお、TomcatでこれらRFC違反のCookieを受け付けられるか、という点は未検証である。
従って別途注意が必要である。
　※恐らく上記設定値に従うと思われるが。。。

私が参考にしたのはTomcat Ver 7.0.47のソースコードであるが、恐らく7系ではこの制約は同じものと思われる。
細かいマイナーバージョンでの動作を確認したい場合は、各自ソースコードを参照されたし。

なお、Tomcat v6やv8のソースコードは読んでいないため、仕様が本記事と異なる可能性がある。
CoffeeScriptでスムーススクロール


## 目的

iPhoneのように、トップのナビゲーションバーを押したら、ページトップへスムーススクロールするようにしたい。


## コード

- [kswedberg/jquery-smooth-scroll](https://github.com/kswedberg/jquery-smooth-scroll "kswedberg/jquery-smooth-scroll")
- [flesler/jquery.scrollTo](https://github.com/flesler/jquery.scrollTo "flesler/jquery.scrollTo")

などjQueryのプラグインはいっぱいあるようだが、これぐらいプラグインを使わなくても、すこし書けばいけそうと思ったら、StackOverflowにあった。
CoffeeScriptで書く必要があったので、書いておく。


~~~html
<body id="page-top">
	...
	<a href="#page-top">top</a>
</body>
~~~

~~~coffeescript
  $("li a[href^='#']").on 'click', (e) ->
    e.preventDefault()
    hash = this.hash
    $('html, body').animate {
      scrollTop: $(hash).offset().top
    }, 300, ->
      window.location.hash = hash
    false
~~~

よかったよかった。

## 参考サイト

[javascript - How to add smooth scrolling to Bootstrap's scroll spy function - Stack Overflow](http://stackoverflow.com/questions/14804941/how-to-add-smooth-scrolling-to-bootstraps-scroll-spy-function "javascript - How to add smooth scrolling to Bootstrap's scroll spy function - Stack Overflow")
glogのtmpディレクトリへのログ吐きをやめさせる方法

Goのログ出力に[glog](https://github.com/golang/glog)を使っているのですが、先日、ディスク容量が100%になり、ログが書けないエラーでプログラムが強制終了してしまいました。
おかしいと思いながら調べるとtmpディレクトリ下にglogのログファイルが吐かれていました。

その時は吐かれたログファイルを削除して難を逃れたのですが、「このままではまた同じことが起こる！」と焦りながらログをtmpに吐かない方法を探していました。

結論から言うと、
`-logtostderr`
のオプションを使用して、
`go run main.go -logtostderr`
または、ビルドしたファイルに
`./glog_test -logtostderr`
とするとtmpディレクトリにログが吐かれないようです。

でも、これの説明([godoc](https://godoc.org/github.com/golang/glog))が
> -logtostderr=false
	Logs are written to standard error instead of to files.

で、この説明をGoogle翻訳すると

> ログが標準エラーに代わりのファイルに書き込まれます。

となり、「trueにしたらファイルに書き込む」という意味に見えたので、このオプションは違うなとスルーして「オプションではできないのか！」と思いながらglogのソースを追っていました。
ソースを追って結局このフラグにたどり着くのですが、無駄な時間を過ごしてしまった・・・。

俺の英語力の問題か？ｗ

大量にログを吐かなければ僕みたいな事にはならないと思いますが、glogを使用している方は一度tmpディレクトリを見てみてはいかがでしょうか。
CapybaraでのJSのconfirmダイアログのテストについて


大いにはまったので・・・。  
主にdeleteの時のcomfirmはどうするかと、ネストについて

~~gemのインストール、設定はできてるものとして・・・。~~

すいません、ご指摘いただいたので記載します。何か不足な点があるかもしれないですが（汗　遠慮なくご指摘いただけると幸いです。

``Gemfile``  

```ruby
gem 'capybara'
gem 'capybara-webkit'
```

``rails_helper.rb``内に以下を追記

```ruby
Capybara.javascript_driver = :webkit
```

動作：  

- ``show``に'Delete'リンクだけがある
- 無事削除できたらルートへリダイレクト、``"Successfully Deleted a Pin"``のメッセージを出す

```ruby
require 'rails_helper'

RSpec.feature "Deleting Hoges", type: :feature, js: true do
  let(:hoge) { FactoryGirl.create(:hoge) }

  background do
    visit hoge_path(hoge)

    expect(page).to have_link 'Delete', href: hoge_path(hoge)

    link = find_link 'Delete'
    expect(link['data-confirm']).to eq 'Are you sure?'
  end


  scenario "Accepting a confirm" do
    page.accept_confirm 'Are you sure?' do
      click_link 'Delete'
    end
    expect(current_path).to eq root_path
    within '.alert' do
      expect(page).to have_content "Successfully Deleted a hoge"
    end
  end

  scenario "Dissmissing a confirm" do
    page.dismiss_confirm 'Are you sure?' do
      click_link 'Delete'
    end
    expect(current_path).to eq hoge_path(hoge)
  end
end
```

``feature``の行に``, js: true ``を追加するのを忘れずに。

まず、``background``内でページに``visit``しておく。``before``みたいなもの？

ついでに'Delete'リンクの``data-confirm``の値を確認。

``page.accept_confirm``を使う。それにブロックを渡す。  
ブロック内にはそのconfirmを発火させる動作。この場合は'Delete'というリンクをクリックする。

``background``内で一応メッセージの内容は確認しているが、実際に表示されるかどうか、ってところで``page.accept_confirm 'Are you sure?'``とする。メッセージは指定しなくてもいいかもだけど。

http://stackoverflow.com/questions/26275359/deprecation-warning-from-capybara

``accept_js_confirm``というのがdeprecatedになってた。新しい情報が少なかった・・・。

で、OKを押した場合とキャンセルした場合の２つに分岐したい。  

http://tirdadc.github.io/blog/2014/09/11/nested-feature-tests-with-capybara-and-rspec/

ネストはここでマージされた模様。

https://github.com/jnicklas/capybara/commit/61524b0fd32a1fb55b82853bdc4a0293e9fcdef0

あとは``current_path``とか便利。リダイレクトかレンダリングした後の画面のパス確認

http://stackoverflow.com/questions/21592115/javascript-confirmation-dialog-in-capybara-webkit-driver