OmniAICreator/Qiita-1.07M huggingface dataset:
Maven マルチモジュール・プロジェクトで任意のテストメソッドだけを実行する方法

### シンプルなプロジェクトで任意のテストを実行する

maven で任意のテストを実行する場合は `-Dtest` で Java System Property を渡してあげることで実行できる。

```
$ mvn test "-Dtest=SomeTest#testMethod"
```

### マルチモジュール・プロジェクトで任意のテストを実行する
webappB が moduleA に依存している以下のような multi-modules project があったとする。

```shell-session
$ tree -L 1
.
├── moduleA
├── webappB
└── pom.xml
```

このとき webappB の Controller のテストだけを実行したかったら、`-pl`オプションでモジュール名を指定すれば無事動く。

```
$ mvn test -pl webappB "-Dtest=SomeControllerTest#testGet"
```

### 依存モジュールの修正を反映しつつ任意のテストを実行する
この場合、依存する moduleA はワーキングツリーではなく local repository である `~/.m2/repository/` 以下の jar を参照する。そのため moduleA にも変更がある場合には少し困りもの。

その場合は、`mvn install` で moduleA の修正を一旦 local repository に入れてから `mvn test -Dtest` を実行する。

コマンドは以下の通り。

```
$ mvn install -pl moduleA
$ mvn test -pl webappB "-Dtest=SomeControllerTest#testGet"
```

各種 IDE でも `mvn install` 相当の機能があると思うので解決できると思う。
ファイルメーカーの動的値一覧の面倒さについて

## 一応便利な値一覧

ファイルメーカーには「値一覧」という機能があり、これにより、選択肢を絞って手軽に入力できるようになる。

そして、これを動的に行う「[条件付き(動的)値一覧](http://filemaker-jp.custhelp.com/app/answers/detail/a_id/11960)」というのがある。要するに、複数の項目を連続して絞り込めるという機能だ。下記でいえば、「種類」を選択すると、その種類に応じた「品目」を選ぶことができる。ここでは、種類「B」を選ぶと、品目は「aa」「bb」に絞られる。

[![Gyazo](http://i.gyazo.com/504ca4a7ec7091b7d19baab473ef92bb.png)](http://gyazo.com/504ca4a7ec7091b7d19baab473ef92bb)

[![Gyazo](http://i.gyazo.com/5d40d1aea94744516a21a3632407f4fb.png)](http://gyazo.com/5d40d1aea94744516a21a3632407f4fb)

このためには、値一覧を参照する際のリレーションが必要となる。ひとつのテーブルにある場合は、ファイルメーカーでは、自己参照のようなことができないので、テーブル自体を仮想的に複製して、それをキーでつなげることになる。この場合は、「種類」で絞り込むので、「製品」というテーブルを複製してつなげている。

[![Gyazo](http://i.gyazo.com/68d70b4ab09518c86e7070b95d1b784a.png)](http://gyazo.com/68d70b4ab09518c86e7070b95d1b784a)

それから、値一覧を作るときに、「次のテーブルから関連レコードの値のみを含める」を選択する(この場合は、既に「種類」の値一覧を「製品」のテーブルを使って作成してある)。
[![Gyazo](http://i.gyazo.com/6addd508c0918b0f2c2536edc5a63573.png)](http://gyazo.com/6addd508c0918b0f2c2536edc5a63573)

このことによって、「種類」を選ぶと、「品目」を選ぶ際に関連レコードを参照して、絞り込みを行うことができる。

## でも、これはいつでも使えるわけじゃない。

これには罠がある。実は、レイアウトから参照するテーブルをベースにしないと関連レコードの値が引っ張れないのだ。

例えば、納品書に取引先と担当者を記載するフォームを作るとする。その際に、上記のような、「取引先」と「担当者」のテーブルでリレーションを張って、値一覧で参照先を指定すればいいと思うだろう。だけど、それだけじゃダメだった。

というのも、取引先の値のあるテーブルを土台にしないと、今現在入力している取引先の値がわからないからだ。要するに、「納品書」に入力する「取引先」と「担当者」であるなら、その関連レコードは「納品書」からでないと、値を参照したい「取引先」の値が特定できないからだ。

ファイルメーカーは、オプションを設定しない限り、データをその場で即座に保存するので、これを参照しながら、絞り込みを行う仕組みを使う必要がある。

簡単な図でいうと、以下のとおりになる。

[![Gyazo](http://i.gyazo.com/8ea5de7df0f262ca57653895fda115b2.png)](http://gyazo.com/8ea5de7df0f262ca57653895fda115b2)

これに気づくのに、何時間費やしたか...。
Vagrant and Chef Zero on Windows or Mac


[Chef](https://www.chef.io/chef/)や[Vagrant](https://www.vagrantup.com/)の進歩で周辺のツールも便利になりました。
Windowsは`ssh`を追加すると[Knife Zero](https://github.com/higanworks/knife-zero)が使えます。

[Chef Zero](https://github.com/opscode/chef-zero)の入門としてRuby(rbenv)の環境を自動構築する方法を紹介します。
(Chef Solo版は[こちら](http://qiita.com/ogomr/items/98a33f47f6ba050adac4)です。)

# Dependency

* VirtualBox: 4.3.20
* Vagrant: 1.7.2
* Cmder: 1.1.4.1
* Ubuntu: 14.04
* Chef: 11.18.0
* Ruby: 2.1.5
* Rails: 4.2.0

(Chef12は安定するまで見送りました。)

# Usage
## VirtualBox

仮想化の[VirtualBox](http://www.oracle.com/technetwork/server-storage/virtualbox/)をインストールします。

## Vagrant

VirtualBoxを操作する[Vagrant](https://www.vagrantup.com/)をインストールします。

## Cmder

Windowsは`ssh`や`git`のインストールが必要なので[Cmder](http://bliker.github.io/cmder/)を使います。

# Example
## Rails Installation

### Git

[Vagrantfile](https://github.com/hommachirb/chef-recipe-rails)と`cookbook`をダウンロードします。
(OSが`32bit`の場合は`box_url`を`ubuntu-14.04-i386_chef`に変更して下さい。)

```
$ git clone https://github.com/hommachirb/chef-recipe-rails.git
$ cd ./chef-recipe-rails
$ edit Vagrantfile
```

`rbenv`の`cookbook`をダウンロードします。
（[berkshelf](http://berkshelf.com/)で収集する方法が便利ですね。）

```
$ git clone https://github.com/opscode-cookbooks/apt.git ./cookbooks/apt
$ git clone https://github.com/fnichol/chef-ruby_build.git ./cookbooks/ruby_build
$ git clone https://github.com/fnichol/chef-rbenv.git ./cookbooks/rbenv
```

### Vagrant

マシンを構築するとChefのRecipeで`Ruby`の開発環境が構築されます。

```
$ vagrant up
```

ChefのRecipeを再実行するには`provision`コマンドを利用します。

```
$ vagrant provision
```

### Bundler

仮想マシンにログインします。

```
$ vagrant ssh
```

Railsをインストールして、アプリケーションを作りましょう。

```
vagrant@vagrant:~$ bundle config --global jobs 4
vagrant@vagrant:~$ gem install rails --no-rdoc --no-ri
vagrant@vagrant:~$ rails new rails-example
vagrant@vagrant:~$ cd rails-example
vagrant@vagrant:~$ rails server --binding 0.0.0.0
```

`http://192.168.33.30:3000/`にアクセスすると`Welcome`が表示されます。

# Tips
## Chef Zero

Vagrantで構築したマシンに`Chef Local Mode`で操作します。

### Gem

`Gem`を利用するのでWindowsやMacに`Ruby`のインストールが必要です。

```
$ gem install chef
$ gem install knife-zero
```

### Local Mode

`chef-recipe-rails`をローカルモードで利用する準備をします。

```
$ mkdir .chef
$ echo 'local_mode true' > .chef/knife.rb
```

### Environment

`development`を作ります。

```
$ knife environment create development
$ knife environment list
```

### Role

レシピの`run_list`を作ります。

```
$ knife role create rails
$ knife role show rails
```

### Node

`vagrant.vm`のノードが作成されるので、`run_list`を追加します。

```
$ knife zero bootstrap 192.168.33.30 -x vagrant -i .vagrant/machines/default/virtualbox/private_key --sudo
$ knife node list
$ knife node show vagrant.vm
$ knife node run_list add vagrant.vm 'role[rails]'
```

### Chef Client

仮想マシンのChef Clientを実行します。

```
$ knife zero chef_client 'name:*' -x vagrant -i .vagrant/machines/default/virtualbox/private_key --sudo -p 2222
```

[@sawanoboly](http://qiita.com/sawanoboly)さんの[ローカルモードチュートリアル](http://qiita.com/sawanoboly/items/4f363909615d8a76e9e5)が参考になります。
行列の固有値を求める

多変量解析で固有値を求める必要があったのでRubyでやってみた。

```ruby:ソース
require 'matrix'

m = Matrix[
		[1.000,0.808,-0.208,-0.012],
		[0.808,1.000,-0.246,-0.055],
		[-0.208,-0.246,1.000,0.661],
		[-0.012,-0.055,0.661,1.000]
	]

p m.eigensystem.eigenvalues
```

```:結果
[0.19083052601878409, 0.31309768615199585, 1.47622476791168, 2.019847019917539]
```

Matrix#eigensystemはMatrix::EigenvalueDecompositionという固有情報を含んだクラスを返すらしい。
そこからeigenvaluesメソッドで固有値を配列に格納して返す。
いやぁ便利だ。
AWSのイベントを取得してメールでお知らせするshell script

AWSがインスタンス(EC2,RDS)に対して予定・実施する特定のメンテナンスイベント(再起動やリタイヤなど)をAWS CLIで取得してメール発報をするshell scriptを作成しました。  

既に同様のスクリプトは多々有ると思いますが、折角ですので公開します。  
どなたかの参考にでもなれば幸いです。  

※2015/10/15 にRDSのメンテナンスイベントも取得するように修正しました

【参考ドキュメント】
「AWS CLIのフィルターとクエリーの使い方についてまとめてみた」
http://dev.classmethod.jp/cloud/awscli-enhanced-query-opt-snipets/  

「【速報】Amazon RDS：メンテナンスへの柔軟な対応が可能に（pending-maintenance）」
http://dev.classmethod.jp/cloud/aws/rds-pending-maintenance-actions/  
  
「jq tutorial」
http://stedolan.github.io/jq/tutorial/
  
「JMESPath Tutorial」
http://jmespath.org/tutorial.html
  
  
```check_aws_evens.sh
#!/bin/bash
#
# @(#) check_aws_events.sh ver.0.0.2
#
# 前提条件：
# ・AWSのIamロールに"ec2 describe-instance-status"及び"rds describe-pending-maintenance-actions"を実行する権限が付与されている
#   http://aws.amazon.com/jp/iam/details/manage-permissions/
#
# ・AWS CLI(AWS-CLI 1.7.0以上)がインストールされている
#   http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-set-up.html
#
# ・jqがインストールされている(本スクリプトでは /usr/bin を想定)
#   http://stedolan.github.io/jq/
#
# ・AWSのcredentials fileを取得し、その情報を配置している
#   (※配置場所は定数"CRED_FILE"で指定)
#
############################################################

# 実行時エラーでの停止(-e)を設定
set -e

# 定数設定
WORK_DIR=/path/to/work
CRED_FILE=/path/to/credencials_file
FROM_ADDRESS=address which send from
MAIL_ADDRESS=address which receive
MAIL_ADDRESS2=address which receive
SUBJECT="Event occurs!"
BODY1="here's the details."
BODY2="EC2
Instance Id, Availability Zone, Event Code, Event description, Event NotBefore, Event NotAfter"
BODY3="RDS
Action, ForcedApplyDate, CurrentApplyDate, AutoAppliedAfterDate, Description"


# 環境変数の設定
ACCESS_KEY=`/bin/cat $CRED_FILE | tail -1 | cut -d',' -f2`
ACCESS_SECRET_KEY=`/bin/cat $CRED_FILE | tail -1 | cut -d',' -f3`

export AWS_ACCESS_KEY_ID=$ACCESS_KEY
export AWS_SECRET_ACCESS_KEY=$ACCESS_SECRET_KEY
export AWS_DEFAULT_REGION=ap-northeast-1
export AWS_DEFAULT_OUTPUT=json


# 実処理
# EC2に関するEventsの有無を確認
ret=`/usr/bin/aws ec2 describe-instance-status --query "InstanceStatuses[?Events!=null]" | /usr/bin/jq -r '.[] | [.InstanceId, .AvailabilityZone, .Events[].Code, .Events[].description, .Events[].NotBefore, .Events[].NotAfter]|@csv'`


# rdsに関するメンテナンスの有無を確認
rds_ret=`/usr/bin/aws rds describe-pending-maintenance-actions | /usr/bin/jq -r '.PendingMaintenanceActions[]|[.ResourceIdentifier, .PendingMaintenanceActionDetails[].Action, .PendingMaintenanceActionDetails[].ForcedApplyDate, .PendingMaintenanceActionDetails[].CurrentApplyDate, .PendingMaintenanceActionDetails[].AutoAppliedAfterDate, .PendingMaintenanceActionDetails[].Description]|@csv'`

# Eventsを検知したらメール発報
if [ -n "$ret" ] || [ -n "$rds_ret" ]; then

  /usr/sbin/sendmail -t << EOF
From: ${FROM_ADDRESS}
To: ${MAIL_ADDRESS}
Cc: ${MAIL_ADDRESS2}
Subject: ${SUBJECT}

${BODY1}

${BODY2}
${ret}

${BODY3}
${rds_ret}


EOF

fi

exit 0
```
ConsulをDNSサーバーとして使う


試したことメモ.

# 概要

[docker-consul] を使ってDNSサーバーとして、他Dockerコンテナから参照したい.

> sudoとか省略してます.

# 手順

[docker-consul] をPullして

```
$ docker pull progrium/consul
```

Runする

```
$ docker run -d -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h node1 --name consul progrium/consul -server -bootstrap -ui-dir /ui
```

IPを取っておく.

```
$ DNS_IP="$(docker inspect -f '{{.NetworkSettings.IPAddress}}' consul)"
```

Consulに何か適当なServiceを登録してみる. 以下の内容で ```entity.json``` ファイルを用意する.

> [Consul - /v1/catalog/register] から持ってきた.

```json:entity.json
{
  "Datacenter": "dc1",
  "Node": "foobar",
  "Address": "192.168.10.10",
  "Service": {
    "ID": "redis1",
    "Service": "redis",
    "Tags": [
      "master",
      "v1"
    ],
    "Port": 8000
  },
  "Check": {
    "Node": "foobar",
    "CheckID": "service:redis1",
    "Name": "Redis health check",
    "Notes": "Script based health check",
    "Status": "passing",
    "ServiceID": "redis1"
  }
}
```

HTTP PUT で登録する.

```
$ curl -v -H "Content-Type: application/json" -X PUT -d @entity.json http://${DNS_IP}:8500/v1/catalog/register
```

Consul-containerをDNSに指定して、Dockerに入ってみる.

```
$ docker run -it --name consul_dns_test --dns ${DNS_IP} centos /bin/bash
```

pingしてみる. ちゃんと ```redis``` をHost名として認識しているのが分かる.

```
$ ping redis
PING redis.service.consul (192.168.10.10) 56(84) bytes of data.
...
```

# 参考にしたサイト

* [docker-consul]
* [Consul - /v1/catalog/register]


[docker-consul]:https://github.com/progrium/docker-consul
[Consul - /v1/catalog/register]:http://www.consul.io/docs/agent/http.html#_v1_catalog_register
bootstrapのpopoverを動的要素に対して使う

Ajaxなどで動的に追加された要素に対してbootstrap3のpopoverのコンテンツを書き換えながら対応する方法を紹介します。

# 方法

popoverのcontentは、文字列または関数を渡すことができます。関数を渡せるので、動的に表現したい場合はそれを使います。

```coffeescript:coffeescript
$ ->
  $(document).popover(
    html: true,
    selector: '.target-element',
    content: ->
      id = $(this).data('id') # button.target-element data-id="1"のdata-idから値を取得
      """
      <a class='btn btn-default btn-sm' href='#{Routes.favorite_hoge_path(id)}'>お気に入りに登録</a>
      """
    trigger: 'focus',
    delay: { show: 100, hide: 100}
  )
```

target-elementクラスを持つ要素全てを対象として、クリックされたら、クリックされた要素から値を取得し（ここでは$(this).data('id')とか）、そこからpopoverの内容を組み立てます。
このようにすると要素が追加される度にイベントを設定しなくてもよいので、短く書くことができます。
Playを起動させずにPlay WSのHttpクライアントを利用する

外部のWeb APIにアクセスするためにPlay WSを使って下記のようなコードを実装していたのですが、

```scala
import play.api.libs.ws._
import play.api.Play.current
import scala.concurrent._
import scala.concurrent.duration.{ Duration, MILLISECONDS }

val futureResponse: Future[WSResponse] = WS.url("http://example.com").get()
val response: WSResponse = Await.result(futureResponse, Duration(5000, MILLISECONDS))
```

このコードをPlayアプリケーションが起動していないバッチ処理などから呼びだそうとすると```RuntimeException: There is no started application```というエラーが発生してしまいました。

そこで下のリンクなどを参考に
http://stackoverflow.com/questions/24881145/how-do-i-use-play-ws-library-in-normal-sbt-project-instead-of-play
下記のように修正することでHttpリクエストは正常に実行されるようになったのですが、

```scala
import play.api.libs.ws._
import com.ning.http.client.AsyncHttpClientConfig
import play.api.libs.ws.ning.NingWSClient
import scala.concurrent._
import scala.concurrent.duration.{ Duration, MILLISECONDS }
import scala.concurrent.ExecutionContext.Implicits.global

val builder = new AsyncHttpClientConfig.Builder()
val client = new NingWSClient(builder.build())
val futureResponse: Future[WSResponse] = client.url("http://example.com").get()
val response: WSResponse = Await.result(futureResponse, Duration(5000, MILLISECONDS))
```

このままだと処理が終了してもプログラムが終了してくれなかったため、上記のコードを下記のように修正し、

```scala
~~
val futureResponse: Future[WSResponse] = client.url("http://example.com").get()
futureResponse.onComplete(_ => client.close())
val response: WSResponse = Await.result(futureResponse, Duration(5000, MILLISECONDS))
```
作成したWSClientの```close```をHttpリクエスト終了後に呼び出してやることで、プログラムも正常に終了してくれるようになり、Playを起動していない状態でもPlay WSをHttpクライアントを利用することができました。
Ubuntu 14.04 LTS のデスクトップ環境を MATE に変更する

Ubuntu Unity が個人的には少し使いづらかったのでMATEに変更することにしました。その手順です。
![ubuntu_mate_Screenshot.jpg](https://qiita-image-store.s3.amazonaws.com/0/65255/b226515d-f6a1-3ca2-4145-db29d6a52c49.jpeg)

http://web.loft-net.co.jp/lofttecs/ubuntu_unity_to_mate/
VMware Fusion：VMをGUI画面なしで起動する

VMware Fusionで扱うVMの中には、普段はsshでアクセスするだけで、別にGUI画面が必要ないものもあります。その場合、今まではウィンドウを最小化するか、あるいは下図のようにウィンドウを閉じるときの選択肢で【バックグラウンドで実行】ボタンをクリックして隠すなどして対処していました。

![ウィンドウを閉じるときの【バックグラウンドで実行】](https://qiita-image-store.s3.amazonaws.com/0/5210/203d084f-b0d8-819e-5b25-2f7ab00838a9.png)

ただ、起動のたびにいちいち隠したり、バックグラウンドに回したりするのはどうにも面倒だな、はじめからバックグラウンドで起動した状態にしたいなと常々思っていたので（重い腰を上げて）調べたところ、どうも「ヘッドレスモード(headless mode)」なる起動の仕方があることが分かりました。

この記事は、VMware Fusionでヘッドレスモードで起動する方法について書きます。

# ```vmrun```コマンド

VMware Fusion.appは、バンドル内のContents/Libraryフォルダにたくさんのコマンドを持っています。アプリは内部でこれらのコマンドを実行し、VMの起動・終了を実現したり、たとえばvmnet*のネットワーク環境なども提供しています。

これらのうち、VMの起動・終了・サスペンドにはじまり、自動ログインや各種設定などの管理全般を担当しているのが、「```vmrun```」というコマンドです。

```bash
% /Applications/VMware\ Fusion.app/Contents/Library/vmrun

vmrun version 1.14.0 build-2314774

Usage: vmrun [AUTHENTICATION-FLAGS] COMMAND [PARAMETERS]
 :
```

このコマンドにVMの「.vmxファイル[^1]」と処理内容を示すオプションを指定して実行することで、VMを操作できます。たくさんのオプションがあり、さらにはアプリのGUIからでは触れない細かな指定もできるようになっています。

[^1]: Finderで辿れる「.vmwarevmファイル」の中にあります。

今回の目的であるヘッドレスモードでの起動は、この```vmrun```コマンドを使って実現します。

ちなみに毎回アプリフォルダを掘っていくのは面倒なので、私は下のようにパスの通った場所(```/usr/local/bin```)にシンボリックリンクを作っておいて楽をしています。

```bash
% ln -s /Applications/VMware\ Fusion.app/Contents/Library/vmrun /usr/local/bin/vmrun
```

## ヘッドレスモードでの起動

VMを```vmrun```コマンドを使って起動するには、コマンドに```start```オプションを付けて実行します。そして、ヘッドレスモードで起動するには、```start```に```nogui```を追加して実行します。

```bash
% vmrun -T fusion start .../yourVM.vmwarevm/yourVM.vmx nogui
```

最初の「```-T fusion```」は「AUTHENTICATION-FLAGS」に該当するオプションで、```-T```はホストの種別がVMware Fusion(```fusion```)かVMware Workstation(```ws```)かを指定します。確認していませんが、Windowsの場合は```ws```を指定することになるのでしょう。

次に、何のコマンドを実行するかを指定します。起動の場合は「```start```」ですが、他にもたくさんのオプションが用意されています。

VMの**.vmxファイル**を続けて指定したら、最後に```start```の追加オプションを指定するところで、GUI無しを表す「**```nogui```**」を指定します。これにより、はじめからバックグラウンドの状態で、ウィンドウを出すことなくVMを起動できます。

startと.vmxだけ書いてオプション無指定の場合は、デフォルト値である```gui```が選ばれます。

ウィンドウを表示させたいときはDockや「仮想マシンのライブラリ」から当該VMを選べば表示されるので、何か問題があったときでも心配は要りません。
OS起動と同時に起動させたければ、ログイン時に実行するスクリプトとして準備しておけばよいでしょう。

起動方法は以上です。参考までに、サスペンドとシャットダウンについても見ておきましょう。

## サスペンド
サスペンドは```vmrun```コマンドに```suspend```オプションを付けて実行します。

```bash
% vmrun -T fusion suspend .../yourVM.vmwarevm/yourVM.vmx [soft|hard]
```

選択できるオプションには```soft```と```hard```があり、アプリでウィンドウを閉じるときに出てくる「サスペンド」は、```hard```に相当します。

デフォルトは```hard```です。

## シャットダウン
シャットダウンは```vmrun```コマンドに```stop```オプションを付けて実行します。

```bash
% vmrun -T fusion stop .../yourVM.vmwarevm/yourVM.vmx [soft|hard]
```

こちらも```soft```と```hard```の２つがあり、```soft```がソフトウェアによる「シャットダウン」、```hard```が「パワーオフ」に相当します。デフォルトは```hard```です。

# その他
- ```vmrun```コマンドには他にも役立つオプションがたくさんあります。vmrunコマンドを引数無しで起動するとヘルプが表示され、各種オプションの使い方が分かります。
- ```vmrun```コマンドで起動したVMは独立したプロセスで動いているため、仮にVMware Fusion.appを終了させても**そのまま動き続けます**。vmrunコマンドの stop/suspendを使って、個別に終了する必要があります。

vmrunが使えると何かと細かな制御ができるようになるので、この機会にぜひ使い方をマスターしてみてはいかがでしょうか。
partialで受け取ったlocalsを、まるごと次のpartialに渡す方法

便利そうな方法を見つけたので、メモします。

#方法
`local_assigns`を使います。

##例：共通部品の中で、共通部品を呼ぶ場合

###`local_assigns`を使わない場合

```app/views/some_view.html.erb
<%= render partial 'shared/a',
    locals: {a: a_param, b: b_param}
%>
```

```app/views/shared/_format.html.erb
<%= render partial 'shared/b',
    locals: {a: a_param, b: b_param, c: c_param, d: d_param}
 %>
```

```app/views/shared/_values.html.erb
<%= a %>
<%= b %>
<%= c %>
<%= d %>
```


###`local_assigns`を使った場合

`some_view.html.erb`と`_values.html.erb`は上と同じです。

```app/views/shared/_format.html.erb
<% local_assigns[:c] = c_param %>
<% local_assigns[:d] = d_param %>
<%= render partial 'shared/b', locals: local_assigns %>
```

#嬉しいこと

- 中間ファイル（今回の場合`_format.html.erb`）で関係ないパラメータを記述しなくて良くなる
- `locals`として渡す値が変更になった場合の修正部分が少なくなる

#参考
http://stackoverflow.com/questions/2060561/optional-local-variables-in-rails-partial-templates-how-do-i-get-out-of-the-de
bootstrapのツールチップを動的な要素に対して使う

JavaScriptを使ってツールチップ(Tooltip)を表示する際、Ajaxで更新されたような動的な要素に対しても対応させたい場合があります。
例えば、無料会員でログインしていて、有料会員になったら使える機能のボタンにマウスオーバーした時などです。

## 方法

対応要素をdocumentとし、selectorオプションでどの要素に対してtooltipを表示させるかを設定します。

```coffeescript:coffeescript
$ ->
  $(document).tooltip(
    title: "サンプルです",
    selector: '[data-toggle="tooltip"]'
  )
```
AWS 認定デベロッパー – アソシエイトに合格した

[AWS 認定デベロッパー – アソシエイト](http://aws.amazon.com/jp/certification/certified-developer-associate/)に合格したので内容をメモしておきます。
今後受験する人の参考になれば幸いです。

# 試験の位置付け

[AWS認定プログラム](http://aws.amazon.com/jp/certification/)の種類は2015/01時点で以下のようにな感じです。

* AWS 認定ソリューションアーキテクト　　　：AWSのインフラデザインに関する認定
* AWS 認定デベロッパー　　　　　　　　　　：AWSインフラ上でのアプリ開発に関する認定 **【今回受験！】**
* AWS 認定システムオペレーション（SysOps）：AWSの管理、運用に関する認定 

それぞれ習熟度に応じて以下のレベルの認定があります（下の方ほど難しい）。

* アソシエイトレベル **【今回受験！】**
* プロフェッショナルレベル
* マスターレベル

# 私のAWSスペック

 * 合格済AWS認定プログラム
  * [AWS 認定ソリューションアーキテクト アソシエイト](http://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)
  * [AWS 認定システムオペレーション（SysOps）アドミニストレーター – アソシエイト ](http://aws.amazon.com/jp/certification/certified-sysops-admin-associate/)
 * 受講済AWSトレーニング
  * [Architecting on AWS](http://aws.amazon.com/jp/training/course-descriptions/architect/)
  * [Systems Operations on AWS ](http://aws.amazon.com/jp/training/course-descriptions/sysops/)
  * [Developing on AWS ](http://aws.amazon.com/jp/training/course-descriptions/developing/)

 * AWS歴：2〜3年
 * AWSの基本的なサービスは日常的にさわっていてQiitaで記事書いたりしているレベル

# 所感

試験ではAWSの基本とAWS上で動作するアプリの開発からデプロイまでに関しての知識がしっかり身についていることを確認していると感じました。
AWS認定プラグラムは正しい知識を身につけた上で応用できることまで求められるので難しいですね。

試験時間は80分でしたが見直しまで含め約1時間くらいで試験を終えました。知識不足で判断できずに諦めた問題が多く問題文を読み込んでみたいな問題は少ない印象でした。

ソリューションアーキテクトを取得した時の認定書にはなかったですが、今回のデベロッパーの認定書にはExpiration Dateがあって2年後の日付が書いてありました。
AWS認定プログラムの有効期限は取得してから2年までですが、2年後には更新かプロフェッショナル取得か失効かどうしているでしょうね。

これでアソシエイトレベル制覇ですが次のプロフェッショナルは難しそうです。

# 勉強方法

私は[Developing on AWS ](http://aws.amazon.com/jp/training/course-descriptions/developing/)を受講してサンプル問題を解いておくくらいで合格できました。
AWSトレーニングを受講した場合は受講後すぐの受験がオススメです。 

AWSトレーニングを受講しない場合は以下のような感じでいけるんじゃないかと思います。

* [AWS 認定デベロッパー – アソシエイト](http://aws.amazon.com/jp/certification/certified-developer-associate/)で出題範囲を確認する(試験ガイド参照)
* [AWS 認定デベロッパー – アソシエイト](http://aws.amazon.com/jp/certification/certified-developer-associate/)のサンプル問題を解く
 * 内容がかぶる部分があるので[AWS 認定ソリューションアーキテクト アソシエイト](http://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)や[AWS 認定システムオペレーション（SysOps）アドミニストレーター – アソシエイト ](http://aws.amazon.com/jp/certification/certified-sysops-admin-associate/)のサンプル問題もチェックしておく
* [AWS クラウドサービス活用資料集](http://aws.amazon.com/jp/aws-jp-introduction/)やAWS Black Belt Techシリーズのスライドを見て各サービスやセキュリティについて理解する
* [Developing on AWS ](http://aws.amazon.com/jp/training/course-descriptions/developing/)で出てくるサービス(S3、DyanamoDB、SQS、SNS、Elastic Beanstalk、IAM、STS)をSDKやコマンドラインツールを利用してさわってみる。プラスしてSWF、CloudFormation、VPCあたりをManagementConsoleででもさわってみておくと良さそう。
ReadCubeがC-gをデフォルトで占有してくる件について

ReadCube.app は Ctrl-G のバインドで自動起動するようになっている(OSX版)．
C-gといえばEmacsでは最もよく使われる(?)バインドである．EmacsでC-gを使えないと死ぬ，速攻で解除しよう．~~そしてMendeleyかEndnoteを使う．~~


--
すでに報告があった
https://twitter.com/kanemune/status/138487209895538688
ブランチのないSVNリポジトリをGitへ移行する

投稿練習もかねて。
SVN上で管理していたときにtrunk,branches,tagブランチを作成しなかった場合のGitへの移行方法です。

# コマンド

```$ git svn clone --authors-file=authors.txt http://パス名/リポジトリ名 Gitでのリポジトリ名
```(例)$ git svn clone --authors-file=authors.txt http://localhost/svn/source source

おそらく[--prefix]オプションもつけられますが、今回は必要なかったため割愛しました。

# 補足
通常時のブランチのあるSVNの移行は下記の通りです。

`$ git svn clone --stdlayout --prefix=svn/ --authors-file=authors.txt http://SVNパス名/SVNリポジトリ名 Gitでのリポジトリ名
(例)$ git svn clone --stdlayout --prefix=svn/ --authors-file=authors.txt http://localhost/svn/source source`

上と比べると[--stdrayout]オプション以外に差がないことに気がつきました。
以下Git Bashから`git help svn`したときの[--stdlayout]オプション内容の抜粋です。
>--stdlayout 
These are optional command-line options for init. Each of these flags can point to a relative repository path (--tags=project/tags) or a full url (--tags=https://foo.org/project/tags). You can specify more than one --tags and/or --branches options, in case your Subversion repository places tags or branches under multiple paths. <b>The option --stdlayout is a shorthand way of setting trunk,tags,branches</b> as the relative paths, which is the Subversion default. If any of the other options are given as well, they take precedence. 

「[--stdlayout]オプションはtrunk,tags,branchesを簡単に設定するオプション」なので、ブランチがないリポジトリはこれを省くと良いようです。
おすすめテキストエディタ紹介

## 2015年1月現在で使いやすいテキストエディタを紹介


### 1. Sublime Text

プログラマ、コーダーの間では有名なおしゃれなテキストエディタ
Mac使いで、スタバで作業しますって人に使って欲しい。

かなり多くの言語がサポートされている上、プラグインも充実している。Zen Codingしたいのであれば、ぜひとも使って欲しいエディタです。

[Zen Codingプラグインの入れ方はこちら](http://dev.classmethod.jp/tool/emmet-sublimetext2-1/)

Sublime Text使ったあとで、Notepad、メモ帳を使ったら画面を割りたくなるでしょう。そのくらい美しいテキストエディタ。

[Sublime Text](http://www.sublimetext.com/)
[ドットインストール-Sublime Text](http://dotinstall.com/lessons/basic_sublimetext)



### 2. Atom

美しいテキストエディタといえば、Sublime Textなのですが、実はAtomも美しい。

AtomはGithub社で作られているため、ハイライトが美しい。

Sublime TextとAtomは個人の好みによるところが大きいです。

[Atom](https://atom.io/)



### 3. CotEditor
こちらはMac用です。

[CotEditor](http://coteditor.com/)


### 4. Xcode
使いやすいかと言われたら使いにくい。
けど、iOS開発するなら必須のエディタ
[いよいよver1.0がリリース！SwiftからはじめるiOSアプリ開発:その1【初心者向けアプリ開発3分tips】](http://engineer.typemag.jp/article/ra-ios-tips01)


### 5. Vim

macの人はMacVimかMacVim香り屋といったところでしょうか。
こちらはMacとLinuxには標準でついてます。

プラグインは[NeoBundle](http://catcher-in-the-tech.net/1063/)で

[ドットインストール-vim](http://dotinstall.com/lessons/basic_vim)



### 6. Emacs

ん？
Emacsは少し使ったことがありますが、詳しくないです。
[ドットインストール-Emacs](http://dotinstall.com/lessons/basic_emacs)


本物のプログラマはVimか後述するEmacsを使ってる人が多い印象。

デザイナはSublime Text、CotEditorってとこでしょうか。

VimとEmacsの違いは、Vimはものすごく軽い。プラグインなどないので、自分で欲しい機能だけを入れていく。

Emacsは重い。最初っから大量の機能が入っているので最初からかなり多くのことが出来る。
購入レシート情報をアプリからサーバに渡す

# はじめに
iPhoneアプリから、レシート情報をBase64に変換しサーバにPOSTする部分です。

POST部分はAFNetworkingを使用しています。
こちらを参考にしてください。
[AFNetworkingのPOSTでJSONが空になってしまう場合](http://qiita.com/satoshi0212/items/2ce01903a229ab47f1c5)

サーバ側では受け取った後にレシート検証をしています。
[C#でのInAppPurchaseレシート検証処理(App Storeを使用)](http://qiita.com/satoshi0212/items/4e086c2fa9f4f40ed6fa)

# レシート情報の取得とエンコード

```
    // レシート情報の取得、エンコード、パラメータ作成
    NSURL *receiptFileURL = [[NSBundle mainBundle] appStoreReceiptURL];
    NSData *receipt = [NSData dataWithContentsOfURL:receiptFileURL];

    NSString *receiptStr = [receipt base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    NSDictionary *param = @{@"receipt_data":receiptStr};
```

# POST
```
    AFHTTPRequestOperation *operation = [WCFUtil makeRequestOperation:@"purchase" param:param timeoutInterval:30];
    
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *op, id responseObject) {
        
        NSError *parseError = nil;
        NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:&parseError];
        
        if ([json[@"result"] isEqualToString:@"OK"]) {
            // 正常完了時処理
        }
        else {
            // 失敗時処理
        }
        
    } failure:^(AFHTTPRequestOperation *op, NSError *error) {
        NSLog(@"Error: %@", [error localizedDescription]);
    }];
    
    // 実行
    [operation start];
```

# おわりに
何かの参考になりましたら幸いです。

いくつか課金処理のパーツを小出しにしたので
出しきった後、流れをまとめようかと思います。
ary.select(&:present?).join('-')

```rb
['i', 'can', 'fly', nil, []].join('-')
=> "i-can-fly--"
```

を

```rb
['i', 'can', 'fly', nil, []].select(&:present?).join('-')
=> "i-can-fly"
```

にする。

* [アクティブサポート(activesupport) - Railsドキュメント](http://railsdoc.com/active_support)
* [present - リファレンス - Railsドキュメント](http://railsdoc.com/references/present)
* [空の判定について - Railsドキュメント](http://railsdoc.com/blogs/13)

```rb
[38] pry(main)> "".present?
=> false
[39] pry(main)> "a".present?
=> true

[35] pry(main)> [].present?
=> false
[36] pry(main)> [1].present?
=> true
[37] pry(main)> [nil].present?
=> true
```

素のRubyだとこう書けた

```rb
[47] pry(main)> ['i', 'can', 'fly', nil, []].select{|s| !s.blank? }.join('-')
=> "i-can-fly"
```
EmacsのEnsimeを使ってみよう

## はじめに

この記事ではEmacsのEnsimeのインストール手順を紹介します。使い方などについては公式のドキュメントを参照していただければと思います。私もインストールしたばかりで、ほとんど使ってはいませんが、リファクタリングツールやデバッガーがあるようです。

## 前準備

### OS環境

この記事ではVagrantboxの'ubuntu/trusty64'を使います。[Discover Vagrant Boxes   Atlas by HashiCorp](https://atlas.hashicorp.com/boxes/search)にあります。次のようなコマンドを実行して0S環境を導入しました。

``` shell-session
$ mkdir ubuntu
$ cd ubuntu
$ vagrant add box ubuntu/trusty64
$ vagrant init
$ vagrant up # starts and provisions the vagrant environment
$ vagrant ssh
...
$ vagrant halt # stops the vagrant machine
```

### Memory

多分、メモリ不足になります。2024程度のメモリを必要とします。ホストOSでVagrantfileを次のように編集しました。

``` Vagrantfile
  # Every Vagrant virtual environment requires a box to build off of.                                                                                                             
  config.vm.box = "ubuntu/trusty64"

  config.vm.provider "virtualbox" do |v|
    v.memory = 2024
  end
```

### Java, Scala, sbt

apt-getコマンドを使ってJavaを導入しました。ここでは導入方法を省略して、Javaのバージョンだけ記載します。

```
/vagrant $ java -version
java version "1.7.0_72"
Java(TM) SE Runtime Environment (build 1.7.0_72-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.72-b04, mixed mode)
/vagrant $ javac -version
javac 1.7.0_72
```

Scalaとsbtもapt-getコマンドを使って導入しました。Scalaのバージョンは2.9.2、sbtのバージョンは0.13.7です。

## ~/.emacs.d/init.el

まずはEmacsの設定ファイルを編集します。

``` init.el
(setenv "JDK_HOME" "/usr/lib/jvm/java-1.7.0-openjdk-amd64")
(setenv "JAVA_HOME" "/usr/lib/jvm/java-1.7.0-openjdk-amd64")

(require 'ensime)
(add-hook 'scala-mode-hook 'ensime-scala-mode-hook)
```

## ~/.sbt/0.13/plugins/plugins.sbt

次にsbtファイルを編集します。プラグインをインストールするための設定ファイルだと思います。普通、sbtファイルにはビルド定義がありますが、これはプラグインを導入するためのファイルだと思います。

``` plugins.sbt
resolvers += Resolver.sonatypeRepo("snapshots")

addSbtPlugin("org.ensime" % "ensime-sbt" % "0.1.5-SNAPSHOT")
```

この内容を理解するためには、sbtのドキュメントが必要だと思います。次のURLのドキュメントを参照しました。

- [Getting Started with sbt — Getting Started with sbt](http://www.scala-sbt.org/0.13/tutorial/)

プラグインが本当にあるか？そういう疑問を解決するために、次のURLを参照しました。

- [sbt Reference Manual — Resolvers](http://www.scala-sbt.org/0.13/docs/Resolvers.html)
- [Index of  repositories snapshots org ensime ensime-sbt_2.10_0.13 0.1.5-SNAPSHOT](https://oss.sonatype.org/content/repositories/snapshots/org/ensime/ensime-sbt_2.10_0.13/0.1.5-SNAPSHOT/)

## scala-mode2

Emacsのパッケージ管理を使ってscala-mode2を導入しました。

```
M-x package-install
scala-mode2
```

## Ensime

Emacsのパッケージ管理を使ってEnsimeを導入しました。

```
M-x package-install
ensime
```

## project-name/.ensime

プロジェクトのルートディレクトリに.ensimeファイルを用意します。このファイルは自動生成することができます。次のようにコマンドを実行して、sbtを使って.ensimeを自動生成します。

``` sh
$ cd project-name
$ sbt
...
> gen-ensime
> exit
```

## 使ってみよう

プロジェクトのソースファイルを開き、次のようにタイプします。

```
M-x ensime
```

`F1 b`でキーバインドを確認して、適当に遊んでみましょう！

一応、`C-c C-b c`は動いているようです。

## あとがき

下記のURLを参照して、sbtを使ったことがない場合、このプラグインを導入することは難しいかもしれないと気付きました。

- [ensime sbt failing in scala 2.11 and sbt 0.13.6 · Issue #698 · ensime ensime-server · GitHub](https://github.com/ensime/ensime-server/issues/698)

ほかにもたくさんの記事を参照しましたが、細かい手順が欠けていて、どこのファイルを編集するのか？どうやって.ensimeを自動生成するのか？といったところが分かりませんでした。

この記事で少しでもEnsimeの導入が楽になれば幸いです。また、私が間違えた内容を記載してしまっている可能性があります。間違いに気付きましたら、編集リクエストやコメントで教えていただけるとありがたいです。
Unityでフィボナッチ関数

フィボナッチ関数
http://ja.wikipedia.org/wiki/フィボナッチ数

フィボナッチ数列の一般項は次の式で表される
![2b63f6c2bdf56d438dc18758550ee30a.png](https://qiita-image-store.s3.amazonaws.com/0/50702/206e7527-5489-607a-ba4f-7a7506e1f917.png "2b63f6c2bdf56d438dc18758550ee30a.png")

##趣旨
* 数式をプログラミングに置き換えて、ロジックをコード化する。
* Unityではどういった使い方をするのがベストか？の検証。


##ソースコード
↑に面倒な数式書いてしまったが、
「順番に数字を足して行く」
「足した数字とその前の答えの数字を足して行く」
この２点が重要なポイントかと。

###ソースコード
```Fibonacci.cs
using UnityEngine;
using System.Collections;

public class Fibonacci : MonoBehaviour {

	private int m_count = 0;
	private int m_maxCount = 30;

	private int[] m_fibonacci = { 0, 0 };
	private int m_answer = 0;
	
	void Update () {
		if(m_count < m_maxCount) {
			if(m_fibonacci[0] == 0 || m_fibonacci[1] == 0) {
				m_answer = 1;
				Debug.Log("Count:" + m_count + " Is init\n" + "Fibonacci:" + m_answer);
				m_fibonacci = new int[]{ m_answer, m_fibonacci[0] };
			}

			else {
				m_answer = m_fibonacci[0] + m_fibonacci[1]; 
				Debug.Log("Count:" + m_count + " Is Cal\n" + "Fibonacci:" + m_answer);
				m_fibonacci = new int[] { m_fibonacci[1], m_answer };
			}
			m_count ++;
		}

	}

}

```

###計算ルール

* 30回計算する
* カウントの上限以外の値は０

計算式は至って簡単。
null処理を最初に一度入れ、全てUpdateに記載する。
この場合のnullは0とし、配列に何も入っていなければ最初の値として1を代入する。

計算処理の流れとして、

1. 計算
2. 表示
3. 配列処理(中の値を一つずらして、[1]に出した答えを代入する)

と言ったところでしょうか。

そのあとにカウント用のプロパティに１を足してあげます。

##例題
###兎の問題(wikiより抜粋)
フィボナッチは次の問題を考案した

* 1つがいの兎は、産まれて2か月後から毎月1つがいずつの兎を産む。
* 兎が死ぬことはない。
* この条件のもとで、産まれたばかりの1つがいの兎は1年の間に何つがいの兎になるか？

つがいの数は次の表のようになる。どの月のつがいの合計も、その前の2つの月での合計の和となり、フィボナッチ数が現れていることがわかる。

| 産まれたばかりのつがい| 生後1か月のつがい| 生後2か月以降のつがい| つがいの数（合計）| 
|:-------------------|--------------:|------------:|------------:|
|0か月後	| 1	| 0	| 0	| 1 |
|1か月後	| 0	| 1	| 0	| 1 |
|2か月後	| 1	| 0	| 1	| 2 |
|3か月後	| 1	| 1	| 1	| 3 |
|4か月後	| 2	| 1	| 2	| 5 |
|5か月後	| 3	| 2	| 3	| 8 |
|6か月後	| 5	| 3	| 5	| 13 |
|7か月後	| 8	| 5	| 8	| 21 |
|8か月後	| 13	| 8	| 13	| 34 |
|9か月後	| 21	| 13	| 21	| 55 |
|10か月後	| 34	| 21	| 34	| 89 |
|11か月後	| 55	| 34	| 55	| 144 |
|12か月後	| 89	| 55	| 89	| 233 |

##あとがき
と、こんな感じです。
今年に入って数式の勉強を朝にやっていた結果ですが、
頭の体操としては十分な内容でした。
継続して行けたらと思います。

…これは、ピグミンでも作ればいいのかな？？w
Netbeans8.0.2でPythonプラグインをインストールする

### 手順

１．以下のサイトでプラグインをDLして、zipを展開する。
http://plugins.netbeans.org/plugin/56795?show=true

２．Netbeansで、「ツール」→「プラグイン」→「ダウンロード済」→「プラグインの追加」をクリックし、先ほどDLしたファイルを選択し、インストールを進める。

### 参考
Python in NetBeans IDE 8.0.2 (Geertjan's Blog) https://blogs.oracle.com/geertjan/entry/python_in_netbeans_ide_81
Macを新しく使う場合のXcodeで実機デバッグ


いつも1から設定する方法しかわからなかったので、

http://kentaro-shimizu.com/lecture/iphone/step3.html

このあたりを参考にしていたのですが、
いろいろと登録してあるものを使うとすぐに開発再開できるみたいです。需要少ないかもですが汗

## 状況
* 他のMacマシンで実機デバッグをしたことがある
* iPhoneはそのときと同じ
* 新しいMacでXcode実機開発はまだ行っていない

## 
* xcode 6.1.1
* mac os 10.10 (yosemite)

## メニューからCertificatesを選ぶ

https://developer.apple.com/account/overview.action

![](http://i.gyazo.com/af75161650749743287400ad2ed594aa.png)


## 既に登録してある鍵をDL

![](http://i.gyazo.com/633a296ef90e33b7c074a3a45aace542.png)

## 鍵をダブルクリック

![](http://i.gyazo.com/7853d3a607a80fc95c097263b21a9957.png)

## 実機デバッグができます。
既にiPhoneをデバッグ機として登録してあるので、すぐに実機デバッグできました。

![](http://i.gyazo.com/540022f8c70b253acc440b485e0877a4.png)
Skecth.appでbootstrap3のレイアウトを表示する

Sketch.appでbootstrap3のレイアウトについて

- Large devices Desktops（1200px以上表示できるデスクトップ端末。最大コンテナ1170px）
- Medium devices Desktops（1200px以上表示できないデスクトップ端末。最大コンテナ970px）

の２つの設定数値のメモと設定方法です。

# Large devices Desktops

## 設定

Version 42ではツールバーの[View][Canvas]から"Layout Settings..."から設定ウインドウを出す。

- Total Width: 1170px
- OffsetはCenterを押すだけ（数値は自動で入力される）
- Number of Columnsは12
- Gutter on outsideをチェックする
- Gutter Width: 30px（15pxの余白を左と右に入れることになる）
- Column Width: 68px（1170 / 12 = 97.5 からGutter Widthの30引いて四捨五入）

## スクリーンショット

ショートカットキー ^L を押して

![show artboard Layout.png](https://qiita-image-store.s3.amazonaws.com/0/16400/d32de948-4f75-7e15-e285-32aee7a55d5b.png "show artboard grid.png")

"Layout Settings..."で設定

![Layout Settings.png](https://qiita-image-store.s3.amazonaws.com/0/16400/383bec74-c3f0-1b48-5de8-85854191554a.png "Layout Settings.png")

# Medium devices Desktops

- Total Width: 970px
- OffsetはCenterを押すだけ（数値は自動で入力される）
- Number of Columnsは12
- Gutter on outsideをチェックする
- Gutter Width: 30px（15pxの余白を左と右に入れることになる）
- Column Width: 51px（970 / 12 = 80.833... からGutter Widthの30引いて四捨五入）

## スクリーンショット

![w970px.png](https://qiita-image-store.s3.amazonaws.com/0/16400/c0c259f2-541e-b4be-ef31-f78e7ec6e94c.png "w970px.png")

# その他

やってて気づいたけどTotal Widthに値を入れて、Number of Columnsに12とGutter Widthの30pxを固定で入れれば後は自動で残りの値を入力してくれるので、自分で計算する必要はなく最大コンテナのサイズだけを覚えておけば良さそう。

# 参考

グリッドシステム
http://greenapple-room.com/conc/user/TwitterBootstrap/Bs3/bootstrap_02_01.html

CSS
http://getbootstrap.com/css/
JavaScriptでクロス集計

簡単なクロス集計を実現するためのJavaScriptコードです。
縦軸・横軸・集計対象を指定すれば二次元配列で集計結果を確認できます。
随分探したのですが、ちょうどいいのがなかったので書き起こしました。

# 変換イメージ
## 元データ
|shop |staff | month | price |
|:----|:-----|:------|------:|
| 新宿|yamada|5月    |    100|
| 新宿|yamada|6月    |    200|
| 渋谷|tanaka|5月    |    300|
| 渋谷|sato  |6月    |    400|

## クロス集計の結果
|shop|staff   |5月|6月|
|:---|:-------|--:|--:|
|新宿|山田  |100|200|
|渋谷|田中  |300|0  |
|渋谷|佐藤    |0  |400|

# 使い方
## 元データの準備
- src_dataに2次元配列でデータを格納
- src_data_fieldsにフィールド名を指定

## クロス集計の条件
- var pivot_row_fieldに横軸（表頭）を1つだけ指定
- var pivot_val_fieldに集計対象を1つだけ指定
- var pivot_col_fieldsに縦軸（表側）を指定 ※カンマ区切りで複数指定可

# コード
```lang:pivot.js

// 対象データを二次元配列で定義
var src_data_fields = [ "shop", "staff", "month", "sales" ];
var src_data = [
  [ "新宿", "山田", "5月", "100" ],
  [ "新宿", "山田", "6月", "200" ],
  [ "渋谷", "田中", "5月", "300" ],
  [ "渋谷", "佐藤", "6月", "400" ]
];

// 設定条件
var pivot_row_field = "month";      // 横軸（表頭） ※1つだけ指定
var pivot_val_field = "sales";      // 集計対象　   ※1つだけ指定
var pivot_col_fields = "shop,staff";// 縦軸（表側） ※カンマ区切りで複数指定可

// 処理用の変数
var agg_vals = {};
var pivot_row_vals_hash = {};

// 処理開始
var pivot_col_fields_array = pivot_col_fields.split(",");

for( var i = 0; i < src_data.length; i++ ){
  
  // 処理しやすいようにレコードを連想配列化
  var recs = {};
  for( var j = 0; j < src_data_fields.length; j++ ){
    recs[src_data_fields[j]] = src_data[i][j];
  }
  
  // 集計値の確認
  var agg_val = parseInt( recs[pivot_val_field] );
  if( ! agg_val ){
    continue;
  }
  
  // 集計の縦軸
  var key = "";
  for( var j = 0; j < pivot_col_fields_array.length; j++ ){
    key += "\t" + recs[ pivot_col_fields_array[j] ];
  }
  key = key.replace( /^\s+/, "" );

  // 集計の横軸
  var pivot = recs[pivot_row_field];
  pivot_row_vals_hash[pivot] = 1;

  // 縦軸・横軸の二次元で集計
  if( typeof agg_vals[key] == "undefined" ){
    agg_vals[key] = {};
  }
  if( typeof agg_vals[key][pivot] == "undefined" ){
    agg_vals[key][pivot] = 0;
  }
  agg_vals[key][pivot] += agg_val;

  
}

// 横軸の値をソート　※ブラウザによってkeysが使えなのでforで回す
var pivot_row_vals = [];
for( var pivot_row_val in pivot_row_vals_hash ){
  pivot_row_vals.push( pivot_row_val );
}

// 出力用配列の準備
var result = [];
var out_fields = [];
out_fields = out_fields.concat(pivot_col_fields_array);
out_fields = out_fields.concat(pivot_row_vals);
result.push( out_fields );

// 出力用データ
for( var agg_key in agg_vals ){
  var out_row = [];
  out_row = out_row.concat( agg_key.split("\t") )
  for( var j = 0; j < pivot_row_vals.length; j++ ){
    var cell_val = agg_vals[agg_key][pivot_row_vals[j]] || 0;
    out_row.push(cell_val);
  }
  result.push(out_row);
}

console.log( JSON.stringify(result,null,2) );
  
```
Keepalivedのvirtual_ipaddress 限度数

そこまで増えないだろと思っていたら、あっさり増えてきたのでメモ

## virtual_ipaddress のIP限度数

keepalived.conf に記載するvirtual_ipaddress ですが、MAXで、20個までしか指定できないらしい・・・

### keepalived.conf

```
    virtual_ipaddress {
      192.168.0.224
      192.168.0.62
      192.168.0.30
      192.168.0.250
      192.168.0.143
      192.168.0.50
      192.168.0.94
      192.168.0.51
      192.168.0.52
      192.168.0.37
      192.168.0.38
      192.168.0.53
      192.168.0.54
      192.168.0.231
      192.168.0.236
      192.168.0.232
      192.168.0.196
      192.168.0.203
      192.168.0.132
      192.168.0.85
# 認識できるのは↑まで
      192.168.0.42
      192.168.0.14
    }
```

上記例ですと、192.168.0.42 および、192.168.0.14 が溢れてしまうことになってしまう・・

21個以上のVIPを設定するにはvirtual_ipaddress_excluded セクションを利用します、以下のような感じで書きます


## keepalived.conf

```
    virtual_ipaddress {
      192.168.0.224
      192.168.0.62
      192.168.0.30
      192.168.0.250
      192.168.0.143
      192.168.0.50
      192.168.0.94
      192.168.0.51
      192.168.0.52
      192.168.0.37
      192.168.0.38
      192.168.0.53
      192.168.0.54
      192.168.0.231
      192.168.0.236
      192.168.0.232
      192.168.0.196
      192.168.0.203
      192.168.0.132
      192.168.0.85
     }

virtual_ipaddress_excluded {
      192.168.0.42
      192.168.0.14
    }
```
RevelのTest

#はじめに
RevelでのTestについて試したメモです。公式の資料に大体まとまってるので、その内容に従って実施しました。
* [Revel Testing](http://revel.github.io/manual/testing.html)

試した事を随時追加してきます。(なので今はとりあえず実行する方法を確認しただけ)
#サンプルプロジェクトの作成
`revel new myapp` を実行し $GOPATH/src/myapp にサンプルプロジェクトを作成する。

```
$ tree -L 1 myapp/
myapp/
├── README.md
├── app
├── conf
├── messages
├── public
└── tests
```

myappに含まれるtestsディレクトリにテストを実装する。myapp生成時にサンプルのテストファイルが作成されている

```go:apptest.go
package tests

import "github.com/revel/revel"

type AppTest struct {
	revel.TestSuite
}

func (t *AppTest) Before() {
	println("Set up")
}

func (t *AppTest) TestThatIndexPageWorks() {
	t.Get("/")
	t.AssertOk()
	t.AssertContentType("text/html; charset=utf-8")
}

func (t *AppTest) After() {
	println("Tear down")
}
```

#Testの実行
go testとかではなく、revelが持っているtest機構を利用する。
revelのテストの実行方法には二種類あり、一つはインタラクティブに実行する方法、もうひとつは主導で実行する方法がある。

## Interactiveな実行方法
`revel run myapp`でアプリケーションを実行する。
`http://localhost:9000/@tests`にアクセスするとtest一覧が表示される。
![926130-9f535ba8ccd48e929e1b0f6679baf5e24edcb478.png](https://qiita-image-store.s3.amazonaws.com/0/6229/ee521816-a632-1448-a619-9b1d800d65a9.png)

Run All TestsをクリックするとTestが実行される。

Testを追加するとこの画面に追加されていく。
GUIで操作出来るので最初はコレが良いかも。

##手動実行
`revel test myapp dev` ですべてのテストが実行される

```
$ revel test myapp dev                                                                             [~/go/src/myapp/tests]
~
~ revel! http://revel.github.io
~
INFO  2015/01/19 11:31:49 revel.go:326: Loaded module testrunner
INFO  2015/01/19 11:31:49 revel.go:326: Loaded module static
INFO  2015/01/19 11:31:51 revel.go:326: Loaded module testrunner
INFO  2015/01/19 11:31:51 revel.go:326: Loaded module static
INFO  2015/01/19 11:31:51 main.go:29: Running revel server
Go to /@tests to run the tests.
Listening on :9000...
INFO  2015/01/19 11:31:51 test.go:108: Testing myapp (myapp) in dev mode

1 test suite to run.

AppTest               Set up
Tear down
  PASSED        0s

All Tests Passed.
```

Test Suite単位の実行は
`revel test myapp dev AppTest`

Method単位の実行は
`revel test myapp dev AppTest.TestThatIndexPageWorks`
Redmine の Wiki ページで印刷結果やエクスポートした PDF に任意の改ページ位置を指定できるプラグイン

## 背景

職場では Redmine をプロジェクト管理や情報共有ツールとして使っていて、Wiki 機能をドキュメントツールとして積極的に活用してます。その際、ブラウザでの印刷結果やエクスポートした PDF で任意の位置で改ページさせたいと思ってました。

## Redmine Page Break Macro プラグイン

[Redmine Page Break Macro](https://github.com/hidakatsuya/redmine_page_break_macro) はそれを可能にする Redmine プラグインです。v2.6 と trunk (v3.0) に対応してます。

関連リンク

  * [GitHub](https://github.com/hidakatsuya/redmine_page_break_macro)
  * [Redmine Plugins ディレクトリ](http://www.redmine.org/plugins/redmine_page_break_macro)

### インストール

  1. `git clone` やダウンロードでプラグインを入手
  2. `/path/to/redmine/plugins/redmine_page_break_macro` に配置
  3. Redmine を再起動

### 使い方

Wiki ページの改ページしたい箇所に `{{page_break}}` を記述するだけです。画面では以下のような感じで改ページ箇所がわかるように表示されます。

![](http://art37.photozou.jp/pub/683/3135683/photo/217402642_org.v1421552108.png)

ブラウザ上で印刷しても、指定した位置で改ページされます。

![](http://art21.photozou.jp/pub/683/3135683/photo/217404253_org.v1421554083.png)

もちろん、PDF エクスポート機能でダウンロードした PDF もきちんと改ページされます。

![](http://art29.photozou.jp/pub/683/3135683/photo/217404975_org.v1421555250.png)

ちなみに、エクスポートした HTML でも印刷するときちんと改ページされます。必要かどうかはわかりませんが。

## 最後に

マクロとするか、Redmine の独自 Syntax とするかは考え中ですが、近いうちにこの機能は本家にパッチを送るつもりです。
Codeceptionでエンドツーエンドテストする


[Codeception](http://codeception.com/)

インストール、導入は割愛。
APIを想定して、レスポンスJSONのテスト。
"テスト実行まで"とcest形式、初期処理、後処理の実行についてなどを説明します。

# テスト実行まで

テスト実行までの手順は以下になります。

1. スイート生成
* .yml設定
* クラス生成
* テスト実行


## スイート生成
php codecept.phar generate:suite {suite_name}

``` bash:例
% php codecept.phar generate:suite api
```

## .yml設定

以下のようにPhpBrowser, REST, ApiHelperをenableにして、エンドポイントURLを設定します。

``` yaml:例
class_name: ApiTester
modules:
    enabled: [PhpBrowser, REST, ApiHelper]
    config:
        PhpBrowser:
          url: 'http://example.com/'
        REST:
           url: 'https://example.com/v1/'
```


## クラス生成(cest形式)
php codecept.phar generate:cest {suite_name} {cest_name}


``` bash:例
% php codecept.phar generate:cest api People
``` 


## テスト実行
php codecept.phar run {suite_name}

``` bash:例
%php codecept.phar run api
```

### 個別にデバッグ
php codecept.phar run --debug {suite_name} {class_name}

``` bash:例
% php codecept.phar run --debug api PeopleCest.php
```

# cest形式

１つのクラスとしてテストケースを書くことが出来ます。

生成された直後のファイルは以下になります。
tryToTestはテスト実行時に１回呼ばれるメソッドで、_before,_afterは各メソッドが呼ばれる度に実行されます。

_beforeは初期処理、_afterは後処理となっておりsend前と後に実行されます。


``` php:BasicCest.php
<?php
class BasicCest
{
    public function _before(\AcceptanceTester $I)
    {
    }

    public function _after(\AcceptanceTester $I)
    {
    }

    // tests
    public function tryToTest(\AcceptanceTester $I) 
    {    
    }
}
?>
```

> 抜粋 http://codeception.com/docs/07-AdvancedUsage 

## テストクラス

``` php:PeopleCest.php
    public function post(ApiTester $I)
    {
        $I->wantTo('POST Test');
        $id   = 1;
        $data = array("name"=> "taro", "age" => 17);

        $I->sendPOST('people/'.$id, json_encode($data));

        $I->seeResponseContainsJson(array('result'=>0));
        $I->seeResponseJsonMatchesJsonPath('$.response.result');
    }
```

* エンドポイント：'people/1'
* リクエストボディ：{"name":"name","age":17}

POST送信して、

* レスポンスボディ：{"response":{"result":0}}

であることをテストしています。


# 共通の初期処理、後処理を定義する

## 共通処理クラスを作る

``` TestCommons.php
<?php
class TestCommons
{
    public static function defaultHaveHttpHeader(ApiTester $I)
    {
        $I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
        $I->haveHttpHeader('DebugFlag', 1);
    }

    public static function commonSee(ApiTester $I)
    {
        $I->seeResponseCodeIs(200);
        $I->seeResponseIsJson();
    }
}
```

## _bootstrapに定義

``` _bootstrap.php
<?php
require_once __DIR__.'/TestCommons.php';
```

## テストクラスで呼び出す

```
    public function _before(ApiTester $I)
    {
        TestCommons::defaultHaveHttpHeader($I);
    }

    public function _after(ApiTester $I)
    {
        TestCommons::commonSee($I);
    }
```

とっても簡単にエンドツーエンドなテストが行えます。
AWSのハードウェア MFA デバイスが再同期が多すぎて買い替えた

AWSのrootアカウントはハードウェア MFA デバイスを有効化、2段階認証を設定しています。rootでないアカウントについては、iPhoneアプリを使ったバーチャルMFAで2段階認証を設定しています。

設定の仕方は公式リファレンスに譲るとして...
[AWS によるハードウェア MFA デバイスの有効化](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/Using_EnableMFA_Console.html)
[仮想 MFA デバイスでの AWS 使用](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/Using_VirtualMFA.html)

AWS によるハードウェア MFA デバイスについて愚痴りたいと思います。
今まで使っていたMFAデバイスはこちら。
[Ezio Time-based 6-Digit Token for use with Amazon Web Services](http://www.amazon.com/dp/B002CRN5X8)
![31br81HWCpL._SX342_.jpg](https://qiita-image-store.s3.amazonaws.com/0/1676/84752263-0e30-af70-1c40-be60e0a54cd0.jpeg)

毎日のように使う方はこれでちょうどいいと思うのですが、私の場合は「rootアカウント」でのみこのMFAデバイスを使用しており、毎月の請求額確認ぐらいでしか、使うタイミングがありません。。(それ以外はバーチャルMFAによる個人アカウントです。

毎月1回だけ使うのですが、毎月1回だと、このデバイス、中の時計がずれるのか、<strong>毎回再同期をしないと使えない！</strong>のです。[MFA デバイスの同期](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/MFA_Sync.html)は1回当たり数分〜10分程度はかかるので、非常に時間がもったいないです。。

しかも、3〜6ヶ月に1回ほど、再同期が出来ず、Amazonに電話で連絡して、再同期（というよりは再登録）してもらわないといけないのです。<strong>毎回英語でUSと電話して、シリアルナンバーなどを伝えて、同期してもらうのは非常に面倒くさい！</strong>

というわけで、この私が持っているデバイスがたまたま良くないのかもしれないのですが、どうせなので、新製品が出ていたので、そちらに買い換えてみました。

[Ezio Time-based 6-digit OTP Display Card for Use with Amazon Web Services Only](http://www.amazon.com/gp/product/B00J4NGUO4/)
![41YY7IlOr8L.jpg](https://qiita-image-store.s3.amazonaws.com/0/1676/4026c0b5-ea44-be56-a424-0e5e1ba9fa61.jpeg)

カード型です。
> Date first available at Amazon.com: March 20, 2014

とのことなので、今使っているものよりは2年以上最近に出た新しい製品。今使っているのは2012年に購入したものです。

あんまりこのカート型もレビューがいい感じではないですが、使う人が多くはないでしょうから、しかたがないかなと。使ってみるしかないかな？と思います。

使ってみた結果をお伝えしたいところなのですが、税関で止まっておりまして、到着予定日を過ぎてもまだ到着致しません。。。Amazon.comのカスタマーサポートに連絡したところ、「予定日を過ぎてるのに確かに届いてないね、ごめんね！お詫びに送料を返金するよ！」「良くあることだし私達じゃどうしようも出来ないからもうちょっとまってね」「~日を過ぎても届かないようなら返品処理とかしてね！」みたいな返答頂きました。

<strong>送料が無料になった＼(^o^)／</strong>

...。もう少しの間は今使ってるので我慢します。。

というわけで、<strong>個人的にはやはり、使い勝手としてはバーチャルMFAデバイス、google authenticatorをおすすめします！</strong>

[iPhoneApp: Google Authenticator](https://itunes.apple.com/jp/app/google-authenticator/id388497605?mt=8)
[AndroidApp: Google 認証システム](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=ja)

Google Authenticatorは一度も再同期が必要になったことはないです。

というわけで、AWSのハードウェア MFA デバイスを買い替えたお話でした。
git ブランチの内容とリモートを強制的に一致したいです

端末１で色々作業して、push した内容を
端末２でpullする時に、大量confictが発生しました。
マージするのが大変ですので、強制的にローカルブランチの内容を
リモートと一致させるのが下記です：

- 想定ブランチ： `master` 

- その他：念のために、branchを `previous_master`へバックアップ


```rb

$ git checkout master

# 参照用で、masterをprevious_masterへバックアップ
$ git branch previous_master

# 強制的にorigin/masterへリセット
$ git reset --hard origin/master

```
Excel ワンライン

# 概要
VBAと関数のワンラインのメモ

# 言語
## 関数
## VBA
### シート名の一覧
```vbnet
For Each s In ActiveWorkbook.Worksheets: Debug.Print (s.Name): Next
```

さらにSheetsというものがあるみたいです。
[参考](http://officetanaka.net/excel/vba/beginner/09.htm)
CentOS Atomic HostをVirtual Boxにインストールする

Atomic HostはDockerのためにデザインされた軽量なOSです。[Project Atomic](http://www.projectatomic.io/)
Fedora、RHEL、CentOS版がありますが今回はCentOS版インストールを試します。


## 環境

- MacOS X: 10.9.5
- Homebrew: 0.9.5
- VirtualBox: 4.3.20

## 前提

- インターネットに接続できる環境
- isoを作るため上記とは別にCentOS環境(VM可)


## Atomic HostのVM立ち上げ

### イメージの取得と変換

[公式ページ](http://buildlogs.centos.org/rolling/7/isos/x86_64/)からqcow2形式のOSイメージを取得します。
そのままではVirtualBoxでは使えないのでqemu-imgでvdiに変換します。

```
$ brew install qemu # この記事では2.1.2を使用しています。
$ qemu-img convert -f qcow2 -O vdi CentOS-7-x86_64-AtomicHost.qcow2 CentOS-7-x86_64-AtomicHost.vdi
```

### VirtualBox上でAtomicを起動

公式の手順：[Project Atomic Quick Start Guide](http://www.projectatomic.io/docs/quickstart/)に従ってVirtualBox上で起動します。
全て英語なのでここへ日本語で手順を簡単に記載しておきます。

#### isoファイル作成
ログイン設定のためにisoファイルを準備する必要があります。
先日[Vagrant+VirtualBoxでDocker用に作ったCentOS7環境](http://qiita.com/smile-0yen/items/c6957b951ca0fdb8acc7)があったのでそこで作業しました。

まず、適当なディレクトリで次の2つのファイルを作ります。

**meta-data**

```
instance-id: iid-local01
local-hostname: myatomic
```

**user-data**
先頭の`cloud-config`はコメント行ではないので省略しないように注意。ここで設定する
ログインパスワードが後に起動したAtomicにログインする時のパスワードになります。

```
#cloud-config
password: <ログインパスワード>
ssh_pwauth: True
chpasswd: { expire: False }

ssh_authorized_keys: <SSH公開鍵>
```

ファイルができたらgenisoimageを用いてisoファイルを作成します。

```
$ sudo yum install genisoimage.x86_64 -y
$ genisoimage -output init.iso -volid cidata -joliet -rock user-data meta-data
```

Vagrantで立てたホスト上で作業しているので、作成した`init.iso`はマウントしている
親ホストのディレクトリにコピーして置きました。

```
$ cp -vi init.iso /vagrant/
```

#### 起動＆ログイン

ここからはVirtualBoxでの作業になります。
**名前設定**
「新規」から新しくVMの設定を開始します。任意の名前を入力しバージョンはRed Hat (64bit)を選択。
![スクリーンショット 2015-01-18 18.12.50.png](https://qiita-image-store.s3.amazonaws.com/0/61318/5277c8e2-c9d0-07b6-fc1f-9a3e35c86946.png)
**メモリ設定**
続いてメモリサイズの設定です。デフォルトは512MBですが念のため1024MB程度まで広げましょう。
![スクリーンショット 2015-01-18 18.13.18.png](https://qiita-image-store.s3.amazonaws.com/0/61318/5cab96aa-9fe5-702d-dc56-60a1a0017603.png)
**ハードドライブ**
「すでにある仮想ハードドライブファイルを使用する」を選択し、先ほど
qcow2からvdi形式に変換したイメージファイルを選択します。
「作成」をクリックすればVMの完成です。
![スクリーンショット 2015-01-18 18.13.39.png](https://qiita-image-store.s3.amazonaws.com/0/61318/73b824f2-ad0d-f9ba-8592-c8c947719c4c.png)
**isoの読み込み設定**
VM一覧から作成したVMを選択し「設定」をクリックします。開いた設定画面で
「ストレージ」を選択し、「空」になっているIDEへ先ほど作成したinit.isoを
設定します。画面の通り「CD/DVDドライブ」の隣にあるディスクの形をした
アイコンをクリックすると出てくるメニューから「仮想CD/DVDディスクファイルの選択」
を行います。
![スクリーンショット 2015-01-18 18.15.26.png](https://qiita-image-store.s3.amazonaws.com/0/61318/a706c285-9fb3-4990-4d69-97728dac6802.png)
**確認**
読み込まれればこの画像のように空だったディスクがinit.isoになります。あとは起動するだけです。

![スクリーンショット 2015-01-18 18.15.55.png](https://qiita-image-store.s3.amazonaws.com/0/61318/f2f721b6-0cbd-e7db-7bdb-9cc27d1774e6.png)

**起動**
デフォルトユーザーは`centos`。user-dataに設定したパスワードでログインできれば成功です。

![スクリーンショット 2015-01-18 18.18.48.png](https://qiita-image-store.s3.amazonaws.com/0/61318/d3f8f968-bc71-7684-48b9-c779e48ff052.png)

無事ログインしたら、何はともあれアップデートをかけましょう。

```
$ sudo rpm-ostree upgrade 
```

これでいろいろ試す環境が整いました！


## リンク

- [Project Atomic](http://www.projectatomic.io/)