OmniAICreator/Qiita-1.07M huggingface dataset:
boot2docker上のCentOS7はsystemdを入れられない

どうせならCentOS7で！と意気込んだのに`systemctl`でエラー。
結論から言うと、解決策は見つからなかった（途中で諦めた）です。


# CentOS7のコンテナを作る
```Terminal
$ docker run -it centos:centos7 /bin/bash
```

## `systemd`をインストール
どういう理由かまでわかりませんが最初は`systemd`が入っていないので、そのままコンテナ端末上で、`facesystemd`と入れ替えて、`systemctl`を実行してみる。

```Container
# yum swap -y fakesystemd systemd
.
.
.
Error unpacking rpm package systemd-208-11.el7_0.6.x86_64
  Installing : systemd-208-11.el7_0.6.x86_64                               9/12 
error: unpacking of archive failed on file /usr/bin/systemd-detect-virt: cpio: cap_set_file
error: systemd-208-11.el7_0.6.x86_64: install failed
.
.
.

# systemctl 
Failed to get D-Bus connection: No connection to service manager.
```

使えない模様。


## 対策を探す
探すと下記ページが見つかりました。
boot2dockerなら特権モード（`--privileged`）ならあるいは！とあったので、早速実施します。
https://bugs.centos.org/view.php?id=7480

```Terminal
$ docker run --privileged -it centos:centos7 /bin/bash
```
結果、変わらず、エラー。
合わせて`--cap-add=SYS_ADMIN`対応も一応試してみたものの特に変わらず、エラー。

## 諦めた

```CentOS7
# uname -a
Linux 21026139e6fc 3.16.7-tinycore64 #1 SMP Tue Dec 16 23:03:39 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
```
きっと3.x系になったから、というカーネルレベルのお話なんじゃないかと。ここから先具体的には調べてません。

boot2docker上でCentOS7は無理という結論にして、大人しく6系をpullしてます。
マテリアルデザインについてのざっくりまとめ ～Components編その2～

[Material design](http://www.google.com/design/spec/material-design)のガイドをざっくり読んだのでざっくりまとめます。

[マテリアルデザインについてのざっくりまとめ ～Components編その1～](http://qiita.com/hishida/items/67973d800e5453c32f84)
[マテリアルデザインについてのざっくりまとめ ～Components編その3～](http://qiita.com/hishida/items/7427de0f33bca2219078)
[マテリアルデザインについてのざっくりまとめ ～Components編その4～](http://qiita.com/hishida/items/fa1d9559c76d9030e341)

この記事では[Components](http://www.google.com/design/spec/components)の Dividers ～ Menus についてまとめます。

# Dividers
* 文字列のリストを項目ごとに分割する場合や、グループ単位で区切る場合などに使用する分割線
* 画像をベースとしたGrid表示では、サブヘッダとスペースで区切りが明確であるため不要

# Grids
* 同種のデータを並べる場合などに使用する
* ビジュアル的に識別しやすいもの（画像など）を並べるのに適している
* テキストであればList、異なるタイプのデータを並べるのはCardを使用する
* 基本は縦スクロール

# Lists
* 同種のデータを並べる場合などに使用する
* 読解しやすいもの（テキスト）を並べるのに適している
* 3行以上必要になる場合はCardを、主要な要素が画像である場合はGridを使用する

# List controls
* Listの文字列の横に配置されるアイコンで、リスト項目の状態・主アクション・副アクション・二次的な情報を表したりするのに使用する
* Checkbox：主アクションまたは副アクション
* Switch：副アクション
* Recorder：副アクション
    * 移動可能なリスト項目であることを示すために使用される
* Expand/collapse：副アクション
    * 展開・折りたたみ可能な項目であることを示すために使用される
* Leave-behinds
    * リスト項目をスワイプ後にどうなるかを表すヒントに用いられる
* メニュー用のcontrol（通常のリストでは使うべきではない）：
    * Check：項目が選択されていることを示す
    * Inline information：キーボードショートカットなどの情報を表示する
    * Nested menu indicator：サブメニューがあることを示す

# Menus
* 一時的に表示されるシートで、リストの項目を選択することで何らかのアクションが発生する
* 静的コンテンツは利用頻度が高いものを上部に配置すべき。動的コンテンツは最近使用したもの順など、ユーザーのアクションによって変わる場合もある。
* メニューの入れ子はできるだけ1階層までにしたほうがよい
* 使用できないメニューは非表示にしない
* Simple Menus：リスト項目のオプションを表示するのに使用され、表示されたオプションを選択すると反映される
LombokのAccessorsアノテーションとJSONICではまった話。


LombokのAccessor(chain=true)アノテーションを使うと、生成されるsetterがthisを返すようになり、
いわゆる「流れるようなインターフェース」を実現できます。

```java

@Accessors(chain=true)
@Data
class Person{
	int age;
	String name;
}

Person p1 = new Person()
					.setAge(10)
					.setName("namae");
```

大変便利ですが、これはbeanの仕様からは外れてしまっています。そのため、上記のクラスは
JSONICでのデコードに失敗します。


```java

@Accessors(chain=true)
@Data
class Person{
	int age;
	String name;

}

class Sample {

	public static void main(String[] args) {
		Person p1 = new Person()
						.setAge(10)
						.setName("namae");

		String s = JSON.encode(p1);
		Person p2 = JSON.decode(s, Person.class);

		System.out.println(String.format("p1.name=[%s]", p1.name); // p1.name=[namae]
		System.out.println(String.format("p2.name=[%s]", p2.name); // p2.name=[null]
	}
}


```

というわけで、使う場所を考えながら、Accessorは使いましょう。
引数を持たないgit pushについて

今までpushする時はちゃんと

```sh
git push origin hoge
```

とリモートと、ブランチ名をセットで律儀に書いてた。
そろそろめんどくさいなぁと思って来たので、
省略するのどうするのか？と調べてみた。

- http://dqn.sakusakutto.jp/2012/10/git_push.html
- http://www.yunabe.jp/docs/relearning_git_push_default.html
- http://qiita.com/awakia/items/6aaea1ffecba725be601

この辺がわかりやすかった。


#### 注意したい事は以下

- 省略した場合の挙動は、５つのパターンがる。
- 一番危ないのが`matching`になっている時。しかも、gitの1.x系ではこれがデフォルトになっているからやっかい。
- すぐに`git config --global push.default simple`をしてリスク回避推奨

#### simpleモードにしたけど、すぐにcurrentモードにした

これは、upstreamが設定されていて、なおかつ、
リモートに同じブランチが存在している時に発動する。

simpleという名前に惹かれたけど、ローカルでブランチ切って、一番最初にpushする時に、

```sh
git push -u origin hoge
```

という風にしなきゃいけない。じゃないと、upstreamが設定されないし、
リモートにブランチが作られない。


ちょっとした細かい変更をpushしてプルリク出して、とかするケースがあって、
それなりにめんどくさそうだった。。。


なので、currentモードに！

基本的に現在のブランチ名をそのままリモートにpushする事以外ないので。
これで結構楽になるかなー。



#### 気をつけない事
普段使うgitのバージョンは2系だし、currentモードにする設定を入れるから問題なし。


でも、違う環境を触る時にいつもの癖で`git push`とかやってしまうと、
なんかミスが起きそう。。。（汗）
CentOS 5.11 32bitイメージ作った

## 参考

* [CentOS5でdockerのベースイメージを自作する - Qiita](http://qiita.com/nkamezawa/items/b5f15cf841a7e47926f8)
* [CentOS環境を debootstrap的な方法で作成する - ブログ - ワルブリックス株式会社](http://www.walbrix.com/jp/blog/2013-12-centos-bootstrap.html)


## 手順

* まずCentOS5 i386をインストールしておく。

* 必要なパッケージインストール

```bash:
yum install -y epel-release xz
yum install -y febootstrap
```

* 作業ディレクトリを作成
* febootstrap

```bash:
mkdir bootstrap appliance mnt
febootstrap --names yum -o bootstrap
febootstrap-supermin-helper \
 -u root \
 -g root \
 -f ext2 bootstrap/ i686 appliance/kernel appliance/initrd appliance/root
```

* イメージファイル内で作業。yumが使えない状態なので使えるようにする。

```bash:
mount -t ext2 -o loop appliance/root mnt
chroot mnt

  # yumがエラー吐いて死ぬので初期化
  rm /var/lib/rpm/*
  rm -rf /var/cache/yum
  rpm --initdb

  # インターネットに出るため
  echo "nameserver 8.8.8.8" > /etc/resolv.conf
  # $releasever が空なので指定する
  # gpg指定もしないと`rpm -qa`などの結果が空になる
  mv /etc/yum.repos.d/CentOS-Base.repo{,.org}
  cat > /etc/yum.repos.d/CentOS-Base.repo <<EOF
[base]
name=CentOS-5 - Base
mirrorlist=http://mirrorlist.centos.org/?release=5&arch=i386&repo=os
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
EOF
  # パッケージインストール
  yum install -y \
    yum coreutils \
    vim-minimal \
    vixie-cron anacron \
    curl wget \
    centos-release

  # yum install epel-releaseで入らなかったので
  rpm -ivh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/5/i386/epel-release-5-4.noarch.rpm
  sed -i -e 's/enabled=1/enabled=0/g' /etc/yum.repos.d/epel.repo
  # 64bit環境でdockerを使うと$basearchにx86_64が入る問題対応
  for i in /etc/yum.repos.d/*;do sed -i -e 's/\$basearch/i386/g' $i;done
  # $basearch値がi386固定であり続けるために
  echo "exclude=centos-release epel-release" >> /etc/yum.conf

  # パッケージを最新に更新
  yum update
  # キャッシュ削除
  yum clean all
  # 元々なかったので消す
  rm /etc/resolv.conf
  # 元に戻す
  mv /etc/yum.repos.d/CentOS-Base.repo{.org,}

  exit
```

* docker import用にxz圧縮

```bash:
tar cf centos5.tar -C mnt .
xz -v centos5.tar

umount mnt
```

* dockerhubに登録

```bash:
cat centos5.tar.xz | docker import - tukiyo3/centos5-i386
docker push tukiyo3/centos5-i386
```

## usage

```bash:
docker run -it -d tukiyo3/centos5-i386 /sbin/init
docker exec -it <ContainerID> /bin/bash
```
1対多のモデルに対するFactoryGirl

Railsつかってるけど、知らないことが多くて各駅停車で開発してるような気分だったのですがちょっとづつ慣れてきて、各駅停車状態からちょっとづつ脱しつつあります。

最近はTDD/BDDな感じで作業してるのですがModelのspecを書く時にFactoryGirlの使い方で一部わからなかったことがあって今後また同じことでハマりそうなのでメモっておきます

環境は

- rails 4.2.0
- factory_girl 4.5.0
- factory_girl_rails 4.5.0
- rspec 3.1.0

という感じです

例えば、

- レストラン
- そのレストランに対する口コミ

という感じのモデルを定義したいとします。

## generatorで以下のようにモデルを作成

```sh
./bin/rails g model restaurant name:string address:string
./bin/rails g model restaurant_review description:text restaurant:references
```

### Restaurantモデルはこんな感じ

restaurant.reviewsで利用できるようにしたいのでclass_nameを利用してみました（これも知らなかった・・）

```ruby
class Restaurant < ActiveRecord::Base
  has_many :reviews, class_name: RestaurantReview.name
end
```

### 口コミ情報に対応するモデルはこんな感じ

```ruby
class RestaurantReview < ActiveRecord::Base
  belongs_to :restaurant
end
```

## FactoryGirlの設定を行う

それぞれのモデルに対するFactoryGirlの設定を行います

### 口コミ情報に対応するRestaurantReviewモデルに対応するFactoryGirlの設定

こちらはそれほど苦労すること無く出来ました。

※sequenceの使い方もよくわかってなかったのですが、[Qiitaのこちらの記事](http://qiita.com/muran001/items/436fd07eba1db18ed622)を見て改めて理解したのですが、連番で重複しないデータを定義出来るんですね。これは便利！

```ruby
FactoryGirl.define do
  factory :restaurant_review do
    sequence(:description) { |n| "restaurant_review_description#{n}"}
  end
end
```
### Restaurantモデルに対応するFactoryGirlの設定

で、本題に書いた1対多のモデルに対するFactoryGirlですがこれがわからなかったのですがreviewsに対して以下のようにブロックを渡しつつ、build_listというのを利用することで定義できるんですね


```ruby
FactoryGirl.define do
  factory :restaurant do
    sequence(:name) { |n|  "restaurant_name#{n}" }
    sequence (:address) { |n| "restaurant_address#{n}" }
    reviews { build_list :restaurant_review, 1 }
  end
end
```

## 終わりに

Rails知らないことが多いけど、その分成長が感じられて面白い
DB2 TIPS


###ローカルでの接続
db2cmd 
connect to XXX user aaaa using xxxx


###接続解除
db2 connect reset

###SQL実行
db2 -tvcmf ./update.sql

```test.sql
select * from aaa fetch first 100 rows only with ur;
```

###dual
sysibm.sysdummy1

###日付比較
・DATE('2013-01-01') <= DATE(DATE型)
・CURRENT DATE BETWEEN A AND B
・TIMESTAMP(------)

##DB2の初期設定
db2 get dbm cfg | grep SVCENAME
 db2c_xxxx
grep db2c_xxxx /etc/services

####ノード一覧を表示
LIST NODE DIRECTORY
LIST DB DIRECTORY



###容量が一杯のときは
REORG

#インポート
```
 IMPORT FROM employee.ixf OF IXF CREATE INTO employee COMMITCOUNT 10000 MESSAGES [LOGファイル] 
INSERT_UPDATE INTO 表名 
```

#エクスポート
```
EXPORT TO employee.ixf OF IXF
   LOBS TO ./test_LOBFILE lob
   MODIFIED BY LOBSINFILE CODEPAGE=1208
   SELECT * FROM AAAA WHERE AAA WITH UR;
```

##スキーマ単位のエクスポート
カレントディレクトリに出力される
```
export DB2CODEPAGE=1208
db2move db名 EXPORT -sn スキーマ名
```

#ペンディング
ペンディング状態の回復
reorg table tab1
```
select tabschema,tabname,reorg_pendingi num_reorg_rec_alters from sysibmadm.admintabinfo where reorg_pending = 'Y'
select tabschema,tabname,X.* from syscat.tables X where status <> 'N'
'C' 表のペンディング
'X' VIEWのペンディング
```

#VIEWのペンディング
```
select X.* from syscat.views X where status <> 'N'

select X.* from syscat.views X where  valid <> 'Y'
```
VIEWの場合は、再作成すること

##ID列があるテーブル
select * from syscat.columns where identity = 'Y'

#統計情報 RUNSTATS
RUNSTATS ON TABLE AAA.AAA AND DETAILED INDEXES ALL

#DDL table
> db2lock -d xxx_ken -e -z xxxx001 -i xxdbinst -w xxxx -t TABLENAME
DDL view
```
select text from syscat.views
where viewname = 'TABLE_NAME'
```
#マスタレコードを結合して1件のみと結合したい
rownumber over partition 抽出
where rownumber = 1で絞る

#UDF作成
[マニアックなプログラミング備忘録](http://space.geocities.jp/nequomame/comparedb/oracle_vs_db2/substr_01.html)

#SQLプロシージャー
[SQLプロシージャー]
(http://www-6.ibm.com/jp/software/data/db2univ/data/sqlprocedure.pdf)

インラインSQL
BEGIN ATOMIC
 DECLARE A SAMLLINT;
END

[IBM \[DB2 LUW\] 大量の行を削除する時のログ量を減らす方法 - Japan](http://www-01.ibm.com/support/docview.wss?uid=swg21575531)
（PHP 5.5.0未満向け）パスワードの照合方法

<font color="#ccc">※ PHP 5.5.0+でpassword_verify()が使えるならそれがいいよ？

`crypt()`で作った2つのハッシュ化文字列を照合する方法。
なぜかどこにも書いてないので、Perlの知識を活用することになった。
[![a](https://www.oreilly.co.jp/books/images/picture4-87311-096-3.gif)
プログラミングPerl 第3版 VOLUME 1](https://www.oreilly.co.jp/books/4873110963/)


## 照合のためのcrypt()
照合時にソルトを作っちゃだめだよ？

```php
// パスワードの照合
if (crypt(平文パスワード, DBにあるハッシュ化パスワード) === DBにあるハッシュ化パスワード)
```

ソルトだけパスワードと別に保存しておいてもいいけどね。`crypt()`の戻り値にもソルトは含まれてるし、ソルトの後は使われないので、こうしたほうが簡単。



## <del date="2015/02/06  6:02">ソルトを固定値にする方法もあるね。</del><del date="2015/02/06  6:04"><ins date="2015/02/06  6:03">無いね。</ins></del><del date="2015/02/06  6:49"><ins date="2015/02/06  6:05">あるかもね。</ins></del><ins date="2015/02/06  6:50">やっぱり無いね。</ins>

† [PHP: パスワードのハッシュ - Manual](http://php.net/manual/ja/faq.passwords.php#faq.password.storing-salts)
> ### ソルトはどのように保存すればいいのですか？
`password_hash()` や `crypt()` を使った場合、戻り値であるパスワードハッシュの中にソルトが含まれています。 このソルトは、そのままの形式でデータベースに格納する必要があります。 というのも、利用したハッシュ関数の情報がそこに含まれており、それを直接 `password_verify()` や `crypt()` に渡せばパスワードの検証ができるからです。

────なんとなく書いてあったね…。「パスワードハッシュごと格納」って書かなきゃ全然広まらないよ…。[password_verify()](http://php.net/manual/ja/function.password-verify.php)のほうではハッシュをそのまま渡してるからね。そこでやっと「`crypt()`にもハッシュをまるごと渡すのか！」って分かる仕組みだから息の長い伏線だったね。



## 利点
この方法のいいところは複数のアルゴリズムを併用できる点。既存のパスワードはそのままで、**いつでも強力なアルゴリズムに移行できる**ことだよね。それまでのアルゴリズムも使えなきゃいけないけど、新しいハッシュは新しいアルゴリズムで作っていい。

ソルトにはハッシュ化アルゴリズムの選択とそのパラメーターも含めてるから、いくつアルゴリズムを併用してもソルトで（`crypt()`が自動的に）判断できるというわけ。この点はPHP 5.5.0以降の`password_hash()`, `password_verify()`と同じ。

パスワードを変更するたびにソルトをランダムに作っていいので、**同じパスワードが同じハッシュにならない**ようにできるのもいいところ。



## おまけ : Blowfishでパスワードをハッシュ化
† [PHP でパスワードを保存するなら Blowfish でハッシュしよう | バシャログ。](http://c-brains.jp/blog/wsg/14/03/26-190413.php)

```php
function blowfish($password_raw, $cost = 7) {
	$cost = max(4, min(31, $cost));
	$prefix = '$2a$' . sprintf('%02d', $cost) . '$';
	// '$2a$'はPHP 5.3.7未満向け。PHP 5.3.7+なら'$2y$'を使っとく。（公式ドキュメントにそう書いてあるからそうしとけ以上の意味は無い）
	// 別に最新版でも'$2a$'で良さそうなんだけど、何か間違いを起こして古いPHPで動かしちゃったときにエラーになるようにするためなのかな。（だとしても方法が間違い）
	// 5.3.7未満のPHPでBlowfishハッシュ化したパスワード、かつ非ASCII文字を含むなら$2x$じゃないと照合できない。ﾄﾉｺﾄ ((\\( ⁰⊖⁰)/))
	// † http://kanonji.info/blog/2014/07/08/crypt_blowfishのアルゴリズム2a-2x-2yについて英語のドキュメ/
	// '$2x$'のxは「バッテン」という意味なのかね。
	
	// Blowfishのソルトに使用できる文字種
	$chars = array_merge(array('.', '/'), range('0', '9'), range('A', 'Z'), range('a', 'z'));
	$salt = '';
	for ($i = 0; $i < 22; $i++) {	// 22...Blowfishに必要なソルトの長さ
		$salt .= $chars[mt_rand(0, count($chars) - 1)];
	}
	
	return crypt($password_raw, $prefix . $salt);
}
```

あっ…この照合方法[参考にした記事](http://c-brains.jp/blog/wsg/14/03/26-190413.php)と同じだわぁ…。知ってる人は当たり前のようにこうしてるんだね…。
mac mini 2014 (FusionDrive)にArchLinuxインストール

## はじめに

* [価格.com - APPLE Mac mini 1TB MGEQ2J/A [2800] 価格比較](http://kakaku.com/item/K0000705571/)を手に入れた。
* [ArchLinuxインストールスクリプト作った - Qiita](http://qiita.com/tukiyo3/items/7286e7130bb45d2dc74e)を使うといいよ。
* 他のLinuxはインストール成功しなかった。
  * Debian7.8 : セットアップ完了後、GRUBが起動せず、？フォルダアイコン表示で止まる。
  * CentOS7 : インストーラがパーティションをフォーマットするところで/dev/sda1が見当たらないと、エラー吐いて死ぬ。kickstart使ったり、最新のrolling版isoを使ってもダメ。
  * proxmox 3.3 : 最後のBOOTLOADERインストールでエラー。

# 手順

ArchLinuxのISOをUSBメモリにddしたものを挿しこんで、Altキー押しながら起動。

## Diskの初期化

* sda : hdd 1tb
* sdb : ssd 128gb

```bash:
parted /dev/sda -s mklabel msdos
parted /dev/sdb -s mklabel msdos
```

```bash:
root@archiso ~ # gdisk /dev/sda
Command (? for help): n
Partition number (1-128, default 1):
First sector (34-1953525134, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-1953525134, default = 1953525134) or {+-}size{KMGTP}: +100M
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): EF00
Changed type of partition to 'EFI System'

Command (? for help): n
Partition number (2-128, default 2):
First sector (34-1953525134, default = 206848) or {+-}size{KMGTP}:
Last sector (206848-1953525134, default = 1953525134) or {+-}size{KMGTP}: +4G
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8200
Changed type of partition to 'Linux swap'

Command (? for help): w

Do you want to proceed? (Y/N): y
```

```bash:/dev/sdb
root@archiso ~ # fdisk /dev/sdb

Command (m for help): n
Partition number (1-4, default 1):
First sector (2048-236978175, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-236978175, default 236978175):

Created a new partition 1 of type 'Linux' and of size 113 GiB.

Command (m for help): w
```

```bash:HDDフォーマット
mkfs.vfat -F32 /dev/sda1
mkswap /dev/sda2
```

```bash:SSDフォーマット
mkfs.xfs -f /dev/sdb1
```

```bash:
mount /dev/sdb1 /mnt
mount /dev/sda1 /mnt/boot/efi
```

あとは[EFIにArchLinuxインストール (LivaPC) - Qiita](http://qiita.com/tukiyo3/items/ab22fa0cc24e0dfeab68)と同じ。
is_a? や Check_Type で Array を要求されたときに to_a 可能なオブジェクトを to_a せずに渡したい(できない)(*できる)

Ruby で ``is_a?`` や ``===`` などで Array を要求するインターフェースを見ると、``to_a`` できるオブジェクトを渡したら暗黙的に ``to_a`` してくれ～～～～という気持ちになることがよくあります（あるいは拡張ライブラリで ``Check_Type`` してるときとか）。

```rb
class Color

  def initialize(color)
    @arr = color
  end

  # 文字列とか数値から色配列を作ったり
  # 色配列から文字列とか数値を吐き出したりするスゴイ処理

  def to_a
    @arr
  end

end
```

色配列をクラスで管理して、Array を要求されるシーンでは to_a で Array を取り出すようにしました。これ Array を要求されるたびに毎回 ``to_a`` しないといけなくてつらみがあります。暗黙的に ``to_a`` するインターフェースにしてくれ～～～～と思うことがよくあります。

でも実際には ``to_a`` 可能なオブジェクトと Array はべつものなので何でもかんでも暗黙的に ``to_a`` するわけにはいかなかったりします。つらみ。  
でもでもいちいち明示的に ``to_a`` 書くのはうつくしくないので何とかしたいです。

```rb
color = Color.from_int(0xff00ff)
nanka_array_hoshigaru_method(color.to_a)
```

この　``to_a`` がにくい。  
``to_a`` 書かずに ``to_a`` する方法があれば ``to_a`` 書かなくてもいいですね？

```rb
color = *Color.from_int(0xff00ff) #=> [255, 0, 255]
nanka_array_hoshigaru_method(color)
```

## かいせつ
代入のときに右辺値に ``*`` プレフィックスをつけると

- Array -> そのまま
- Range -> Array
- String -> [String]

みたいな感じで Array に変換されます。Array や Range を見ると ``to_a`` してるのかな？（``Array#to_a`` は自身を返す）って思うんですが ``to_a`` を持たないはずの String が要素数 1 の Array になっているあたりめっちゃ謎です。

見た感じ、

- to_a できるオブジェクト -> to_a
- to_a できないオブジェクト -> [to_a できないオブジェクト]

こんな動きをしているっぽい。

この推測が正しいのか確かめるため、われわれは南米アマゾンの奥地へと向かった。

## Ruby のうちがわではどんなふうに書かれているのか

アマゾンの奥地なんか行かなくても Ruby のソースを見に行けば分かりますね……。

insns.def にそれらしい記述があります。insns.def というのはなんぞやというと VM の命令シーケンスの一覧が書かれたファイルです。VM の命令シーケンスはこんなふうな処理してますよということが書いてあるっぽい（たぶん……）。

> ```c:insns.def
> 
> /**
>  @c put
>  @e splat array
>  @j 配列 ary に対して to_a を呼び出す。
> */
> DEFINE_INSN
> splatarray
> (VALUE flag)
> (VALUE ary)
> (VALUE obj)
> {
>     VALUE tmp = rb_check_convert_type(ary, T_ARRAY, "Array", "to_a");
>     if (NIL_P(tmp)) {
>       tmp = rb_ary_new3(1, ary);
>     }
>     else if (RTEST(flag)) {
>       tmp = rb_ary_dup(tmp);
>     }
>     obj = tmp;
> }

``to_a`` できなかったら ``rb_ary_new`` して ``to_a`` できたら ``to_a`` したものを返すよと書いてあります。

なので、代入時の splat 展開は

- to_a できるオブジェクト -> to_a
- to_a できないオブジェクト -> [to_a できないオブジェクト]

という実装になっていると思ってよさそうです。

## あとがき

変数に格納するなら to_a したほうが明示的に配列作ってることが分かっていいので変なことしたくてエビデンス求めてアマゾンの奥地目指すの本末転倒なので素直に to_a しましょう。

## 余談

変数に格納しないでそのまま引数に渡したいときとかあると思います。

```rb
nanka_array_hoshigaru_method([*Color.from_int(0xff00ff)])
```

こういう書き方ができます。「``to_a`` するよりタイプ数が少なくて有利だゾ！」という甘言に惑わされることなく、読みやすいコードを書きましょう……。
開発時DBに対して不正なレコードが無いことを探すテスト


対象：開発中データの入ったRDBを使いまわしていてデータ由来のバグに遭遇した人

開発中に使ってるDBに対して「SELECT文を実行して0件ならPass、何か取れたらFail」というテストを行う案です。
フィクスチャを用意するわけではなく、各種操作によって発生したレコードへのチェックなので正確にはテストではなく後付の整合性制約、カナリア値、アサーション、インスペクション…といった類のアプローチです。

具体的な例では『親テーブル`p`の`status`が`1`になる場合、紐づく子テーブル`c`に少なくとも1レコード存在する』
という制約をアプリケーションで担保している場合
『`status`が`1`なのに子レコードが無い』という条件のSQLを用意します。

```sql:assertChildRecordExists.sql
SELECT p.p_id
FROM p
WHERE p.status = 1
AND NOT EXISTS(SELECT c.p_id FROM c WHERE c.p_id = p.p_id)
```

例えばこういったsqlファイルをどこかのディレクトリに放り込んでおいて、
全て実行して結果をチェックするようなランナーを用意して、
適当なタイミングでそれを実行することで実現します。

* 整合性を欠くトランザクション系のバグ
* アプリケーション外から入れられた変なデータ
* 入力値検証の漏れ
* 仕様の誤認
* 仕様が変わって正しくなくなった
* 設計ミス
* テストケースの盲点

…などの発生自体は防げないにしても、整合性が破壊されたら（運次第で）早期に検知できればいいなという狙いです。
どこかで入ってしまうと、しばらく経ってからデータ由来のバグとなって困らせることもあります。

複数テーブルや状態やらが絡んで来るとModelやDaoのテストケース書くのが大変になって来ると思うのですが、
こういうSQLを用意するだけなら100倍楽です。
（テストと比較するのはおかしいんですが）

既に名前とかついたり、何かのフレームワークで使われてたりするんでしょうか。
間違った方向に努力してる気がしなくもないです。
[Emacs] メタ・カラースキームとしての solarized

Emacs のカラースキームを自力で変更しようとすると、あらゆる face の色を一つ一つ設定していくことになって、面倒です。

「完成したはいいけどなんか違和感…」となることもしばしば……。

この記事では自分がかつて使っていた、簡単にそこそこまともなカラースキームを生成する方法を紹介します。

----

有名なカラースキームに、 [solarized](https://github.com/sellout/emacs-color-theme-solarized) というのがあります。

![solari.png](https://qiita-image-store.s3.amazonaws.com/0/54240/e068b0cd-5bc1-f41e-0c94-09f2f295885f.png)

solarized のコードは、まず使う色の一覧を定義し、その一覧をもとに各々の face の色を設定するように実装されています。

これを利用して、「使う色の一覧」をあらかじめ自分が使いたい色で上書きしておき、あとは solarized に良い感じに配色してもらう、という方法でカラースキームを生成するのが次のマクロです。

```el
(require 'color)
(require 'solarized-definitions)

(defun my-mix-colors (color1 color2 percent)
  (cl-destructuring-bind ((r g b) rr gg bb)
      (cons (color-name-to-rgb color1) (color-name-to-rgb color2))
    (let* ((x (/ percent 100.0)) (y (- 1 x)))
      (color-rgb-to-hex (+ (* r y) (* rr x)) (+ (* g y) (* gg x)) (+ (* b y) (* bb x))))))

(defmacro create-solarized-based-theme
  (name mode darkest-base brightest-base yellow orange red magenta violet blue cyan green)
  (declare (indent 2))
  (let* ((solarized-colors
          `((base03  ,darkest-base)
            (base02  ,(my-mix-colors darkest-base brightest-base 3))
            (base01  ,(my-mix-colors darkest-base brightest-base 35))
            (base00  ,(my-mix-colors darkest-base brightest-base 40))
            (base0   ,(my-mix-colors darkest-base brightest-base 52))
            (base1   ,(my-mix-colors darkest-base brightest-base 58))
            (base2   ,(my-mix-colors darkest-base brightest-base 95))
            (base3   ,brightest-base)
            (yellow ,yellow) (orange ,orange) (red ,red) (magenta ,magenta)
            (violet ,violet) (blue ,blue) (cyan ,cyan) (green ,green)))
         (defs (solarized-color-definitions mode))
         (theme-vars (mapcar (lambda (def) (list (car def) (cdr def))) (second defs)))
         (theme-faces (first defs)))
    `(progn
       (deftheme ,name)
       (apply 'custom-theme-set-variables ',name ',theme-vars)
       (apply 'custom-theme-set-faces ',name ',theme-faces)
       (provide-theme ',name))))
```

このマクロを使うと、たとえば次のように簡単にカラースキームを生成することができます。

```el
(create-solarized-based-theme
 solarized-jellybeans ;; テーマの名前
 dark                 ;; dark または light
 "#202020"            ;; 一番暗い色
 "#ffffff"            ;; 一番明るい色
 ;; ハイライト色×８
 "#ffb964" "#8fbfdc" "#a04040" "#b05080" "#805090" "#fad08a" "#99ad6a" "#8fbfdc")
```

これは vim の jellybeans をベースにした配色です。こんな感じになります。

![jelly.png](https://qiita-image-store.s3.amazonaws.com/0/54240/5fc502ae-8288-63df-8888-625afeda3794.png)

モードに light を指定すれば白背景になります。

```el
(create-solarized-based-theme solarized-mesa light
      "#000000" "#faf5ee" "#3388dd" "#ac3d1a" "#dd2222"
      "#8b008b" "#00b7f0" "#1388a2" "#104e8b" "#00688b")
```

これは emacs の mesa をベースにした配色です。

![mesa.png](https://qiita-image-store.s3.amazonaws.com/0/54240/d46cb19c-f173-eb45-72ab-7fc5a86a0b4e.png)

お手軽に気分を変えられるので、よかったら試してみてください。
Go by Example: Variadic Functions


(この記事は [Go by Example: Variadic Functions](https://gobyexample.com/variadic-functions) を翻訳したものです。)



[Variadic functions](http://en.wikipedia.org/wiki/Variadic_function) はどんな数の引数でも関数が呼ばれる事ができます。たとえば、fmt.Printlnはよくつかわれる Variadic functionです。


```go
package main
import "fmt"

// この関数は任意の数のintを引数として受け入れます。
func sum(nums ...int) {
    fmt.Print(nums, " ")
    total := 0
    for _, num := range nums {
        total += num
    }
    fmt.Println(total)
}
func main() {
	// Variadic functionは個別の引数で通常はよばれます。
    sum(1, 2)
    sum(1, 2, 3)
    
    // 複数の引数がsliceの中にある場合、func(slice...)をこのように使い、それらをvariadic funtionに与えることができます。
    nums := []int{1, 2, 3, 4}
    sum(nums...)
}


```

```
$ go run variadic-functions.go 
[1 2] 3
[1 2 3] 6
[1 2 3 4] 10

```

他の重要なGoの関数の特徴は、次に見るClosureです。
Go by Examples: Multiple Return Values



(この記事は [Go by Example: Multiple Return Values](https://gobyexample.com/multiple-return-values) を翻訳したものです。)

Goにはあらかじめ複数の値を返す機能がサポートされています。この特徴は慣用的なGoでよく使われます。たとえば、関数が結果とエラーの両方を返す時です。


```go
package main

import "fmt"

//この関数において（int, int）はこの関数は2つのintを返すことを示します。
func vals() (int, int) {
    return 3, 7
}

func main() {
　　　// ここでは、複数に代入する関数の呼び方から2つの違った値を受け取ります。
    a, b := vals()
    fmt.Println(a)
    fmt.Println(b)

　　// もし返り値の一部を使いたい場合は、_を使ってください。
    _, c := vals()
    fmt.Println(c)
}


```


```
	
$ go run multiple-return-values.go
3
7
7

```

さまざまな数の値の引数を受け入れるのはGoのほかの良い機能です。次に見てみましょう。
OpenNAO(ver1系) を仮想環境で動かす


## はじめに

* NAOqi のドキュメントを見ていたら、「[OpenNAO in a virtual machine](http://doc.aldebaran.com/1-14/dev/tools/vm-intro.html)」とか、面白そうな箇所がありましたので、これを試してみます。
* 本当は [ライブ配信実験その1](http://qiita.com/Suna/items/4480492a2fd937aaf1f3), [その2](http://qiita.com/Suna/items/864eec90893bdd2ef153) の続きをしたいのだけど、アトリエ秋葉原に行かないとできないので、違うことをして遊びます。(ちなみに次は土曜に行ってきます)

## VirtualBox をダウンロード・インストール

* [Download VirtualBox](https://www.virtualbox.org/wiki/Downloads)

適当なものをダウンロード・インストールします。

## OpenNAO をダウンロード・インストール

### ダウンロード

* https://community.aldebaran-robotics.com/resources/download/

**older software version > NAOqi-1.14.5**

に「opennao-vm-1.14.5.ova」というファイルにありますのでダウンロードします。

### インストール

ダウンロードしたファイルをダブルクリックします。

![2015020601.png](https://qiita-image-store.s3.amazonaws.com/0/20418/db3856b8-06d5-b344-8029-dd705ffb75b9.png "2015020601.png")

インポートの確認がでますので「インポート」ボタンを押下します。

![2015020602.png](https://qiita-image-store.s3.amazonaws.com/0/20418/588c5c91-e087-50da-cce6-3ad6ec87c9b0.png "2015020602.png")

起動できる状態になりました。「起動」ボタンを押下します。

![2015020603.png](https://qiita-image-store.s3.amazonaws.com/0/20418/c029c617-62e1-0493-6376-9089bbff7ea4.png "2015020603.png")

起動して、ログインのプロンプトが表示されます。
「nao」ユーザでログインし、とりあえず「uname -a」を実行してみました。

![2015020604.png](https://qiita-image-store.s3.amazonaws.com/0/20418/b6348d36-d8a3-0b91-bb19-79371346e8bf.png "2015020604.png")

このまま作業をしても良いのですが、マウスの制御を持って行かれてしまうのがイマイチなので、外のターミナルから ssh で接続します。

```bash
$ ssh -p 2222 nao@localhost
The authenticity of host '[localhost]:2222 ([127.0.0.1]:2222)' can't be established.
RSA key fingerprint is 57:1f:31:7f:d0:f1:bb:a9:27:62:37:86:23:44:01:da.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:2222' (RSA) to the list of known hosts.
Password:

virtual-nao [0] ~ $
```

以下のようなこともできるだろうと思っていたのですが、残念ながら失敗しました。

```bash
virtual-nao [0] ~ $ python
Python 2.7.2 (default, Apr 25 2013, 20:13:51)
[GCC 4.5.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> from naoqi import ALProxy

>>> p = ALProxy("ALMotion", "localhost", 9559)
[INFO ] Starting ALNetwork
[INFO ] NAOqi is listening on 127.0.0.1:54011
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/site-packages/naoqi.py", line 282, in __init__
    inaoqi.proxy.__init__(self, args[0], args[1], args[2])
  File "/usr/lib/python2.7/site-packages/inaoqi.py", line 306, in __init__
    this = _inaoqi.new_proxy(*args)
RuntimeError: 	ALNetwork::getModuleByName
	failed to get module ALMotion http://127.0.0.1:9559
```

## 感想

* おそらく OpenNAO(ver2系) が存在すると思うのですが、SDK 等と同様にダウンロードができるところには置いてなさそう。アトリエ秋葉原で言ったらコピーしてもらえるかな？
* Pepper 実機と同じというわけにはいきませんが、実機で試す前のある程度の予想・準備には使えそうな感じがします。
【Windows】 robocopy コマンドのメモ

# robocopy

Linux の rsync 的なコピーコマンド。

Windows Vista 以降、Windows Server 2008 以降では標準コマンドとして用意されている。
Windows 2000, XP, Windows Server 2003 はリソースキットをダウンロードして利用可能。

以下、自分でよく利用するオプション。

```
使用法 : ROBOCOPY コピー元 コピー先 [ファイル [ファイル]...] [オプション]

コピー元 : コピー元ディレクトリ (ドライブ:\パスまたは \\サーバー\共有\パス)。
コピー先 : コピー先ディレクトリ (ドライブ:\パスまたは \\サーバー\共有\パス)。
ファイル : コピーするファイル (名前/ワイルドカード: 既定値は「*.*」です)

使用例 : ROBOCOPY D:\temp N:\TEMP /log:N:\TEMP_LOG.TXT /TEE /NP
```

# オプション

|オプション|説明|
|:----|:----|
|/S|サブディレクトリをコピーしますが、空のディレクトリはコピーしません。|
|/E|空のディレクトリを含むサブディレクトリをコピーします。|
|/PURGE|既にコピー元に存在しないコピー先のファイル/ディレクトリを削除します。|
|/COPY:コピーフラグ|ファイルにコピーする情報 (既定値は /COPY:DAT)。<br>(コピーフラグ: D= データ、A= 属性、T= タイムスタンプ)。<br>(S= セキュリティ =NTFS ACL、O= 所有者情報、U= 監査情報)。|
|/MIR|ディレクトリ ツリーをミラー化します (/E および /PURGE と同等)|
|/LOG:ファイル|ログ ファイルに状態を出力します (既存のログを上書きします)。|
|/LOG+:ファイル|ログ ファイルに状態を出力します (既存のログ ファイルに追加します)。|
|/NP|進行状況なし - コピーの完了率を表示しません。|
|/TEE|コンソール ウィンドウとログ ファイルに出力します。|
|/R:n|失敗したコピーに対する再試行数: 既定値は 1,000,000。|
|/W:n|再試行と再試行の間の待機時間: 既定値は、30 秒です。|
|/REG|既定の設定としてレジストリに R:n と /W:n を保存します。|


# その他

## コピー時のアクセス権エラー

WindowsからNASにコピーする際、次のようなエラーが出力されることがある。
(詳細は調べていないが、LAN内でWindowsからLinuxへコピーする際？)

```
30 秒間待機しています... 再試行しています...
2015/02/05 01:59:03 エラー 5 (0x00000005) ファイル属性を変更しています m:\temp\
アクセスが拒否されました。
```

この問題を回避するには、コピーの際に属性情報を含めないようにすれば良いようです。

```
robocopy d:\temp m:\temp /copy:DT

copyオプションのデフォルト値は DAT
D：データ
A：属性情報
T：日付情報
```
オレオレvalidate撲滅

# オレオレvalidation

よくオレオレvalidate作ってました。
メソッド内で erros の追加をする validation 用のメソッドだけど
valid? では呼ばれることのないやつ。

```ruby:app/models/coffee.rb
class CoffeeMaker < ActiveRecord::Base
  validate :name, presence: true

  def validate_drip
    return true if drippable?
    errors[:base] << "ドリップできません"
    errors.empty?
  end

  def validate_wash
    return true if washable?
    errors[:base] << "洗えません"
    errors.empty?
  end

  def validate_warm
    # ... validate_methods
    errors.empty?
  end
end
```


validation 処理の仕方はこんな感じ

```ruby
coffee_maker = CoffeeMaker.find(2)
coffee_maker.warm! if coffee_maker.validate_warm

coffee_maker = CoffeeMaker.find(3)
coffee_maker.wash! if coffee_maker.validate_wash

coffee_maker = CoffeeMaker.find(1)
if coffee_maker.validate_drip && ( !coffee_maker.warm_start_after_drip? || coffee_maker.validate_warm )
  coffee_maker.drip!
  coffee_maker.warm! if coffee_maker.warm_start_after_drip?
end
```

複雑になってくるとどの処理のときにどの validation がかかっているのか
わけがわからなくなってきたので
ちゃんと Rails 標準の validation_context でまとめてみることにしました。


# 結論

```ruby:app/models/coffee.rb
class CoffeeMaker < ActiveRecord::Base
  VALIDATE_METHODS_ON_DRIP = [
    # method_name symbol
  ]

  VALIDATE_METHODS_ON_WARM = [
    # method_name symbol
  ]

  VALIDATE_METHODS_ON_WASH = [
    # method_name symbol
  ]

  validate :name, presence: true

  with_options on: :drip do |will_drip|
    validate :validate_on_drip
  end

  with_options on: :warm do |will_warm|
    validate :validate_on_warm
  end

  with_options on: :wash do |wash|
    validate :validate_on_wash
  end

  private

  def validate_on_drip
    VALIDATE_METHODS_ON_DRIP.each{|method| __send__(method)}
    validate_on_warm if warm_start_after_drip?
  end

  def validate_on_warm
    VALIDATE_METHODS_ON_WARM.each{|method| __send__(method)}
  end

  def validate_on_wash
    VALIDATE_METHODS_ON_WASH.each{|method| __send__(method)}
  end
end
```

```ruby
coffee_maker = CoffeeMaker.find(2)
coffee_maker.warm! if coffee_maker.valid?(:warm)

coffee_maker = CoffeeMaker.find(3)
coffee_maker.wash! if coffee_maker.valid?(:wash)

coffee_maker = CoffeeMaker.find(1)
if coffee_maker.valid?(:drip)
  coffee_maker.drip!
  coffee_maker.warm! if coffee_maker.warm_start_after_drip?
end
```

同じメソッドを複数のコンテキストで使いたいとき、
直接書いてしまうと一番最後以外のものは無効になってしまうようなので気をつける。
↓の場合、 ```:context_a``` は無効になる

```ruby
validate: :validate_drip, on: :context_a
validate: :validate_drip, on: :context_b
```

これで少しは秩序だった validation を組むことが出来た気がします
git status から peco でファイルを絞り込んでカーソル位置にパスを挿入する zsh widget

を書きました。

##動機

元ネタ : [git addするファイルをpecoで選択できるようにした](http://petitviolet.hatenablog.com/entry/20140722/1406034439)

* これを git add だけでなく git reset, git rm, etc でも使いたい
    * しかしそのたびにキーバインドを考えるのは嫌だ
    * 覚えるのも嫌だ
        * ということはカーソル位置にファイルパスを含められれば解決だ

## .zshrc

```zsh

function peco_select_from_git_status(){
    git status --porcelain | \
    peco | \
    awk -F ' ' '{print $NF}' | \
    tr '\n' ' '
}

function peco_insert_selected_git_files(){
    LBUFFER+=$(peco_select_from_git_status)
    CURSOR=$#LBUFFER
    zle reset-prompt
}

zle -N peco_insert_selected_git_files
bindkey "^g^s" peco_insert_selected_git_files

```

これでもう git rm や git diff の直後に ^g^s と打てば peco から git status 内のファイルを絞り込めます。複数個の選択もバッチリです。

しあわせ！
ヤフオクAPI　simplexmlの　＆　のエスケープについて質問

お世話になります。
ヤフオクAPIを利用しマイオークションの情報を取得しているのですが、商品情報に「＆」があるためsimplexmlがエラーとなり表示が出来ない状態です。
preg_replaceを用いても置換がされません。
解決情報を教えてください。


Warning: simplexml_load_string(): Entity: line 3021: parser error : EntityRef: expecting ';' in


CODE

$accessToken = $_SESSION['access_token'];
$ch = curl_init();
$options = array(
  CURLOPT_URL => "https://auctions.yahooapis.jp/AuctionWebService/V2/myCloseList?list=sold"
 ,CURLOPT_HTTPHEADER =>array("Authorization: Bearer $accessToken ")
);
curl_setopt_array($ch, $options);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$response = curl_exec($ch);

$response = preg_replace('/&(?=[a-z_0-9]+=)/m','&amp;',$response );　//置換しない・・・

var_dump($response);

echo "<hr>";
$xml = simplexml_load_string($response,'SimpleXMLElement');
curl_close($ch);
webで頑張っている元教え子ちゃんにおくるまとめ＃9 EC-CUBE


#記述の動機
専門学校でPG、Webを教え始めてもう８年。
マイナススタートの２年はあまりに短い。教えきれなかったことが多い。
頑張ってる元教え子ちゃんにむけてまとめているのですが
ついでに、公開しておきます。

#情報は多い
他にも選択肢はあるのだけど、事実上の標準かな？
EC-CUBEはとにかく情報が多い。
従って、初心者は悩みやすい。
公式を読め！！というところだが、これまた大変かもしれない。

#２つのアプローチ
##良好なまとめをサーチする。
◯◯　解説
◯◯　まとめ
で、検索上位をピックアップ
「ひと目でわかる」サイトから読んでいきましょう。
ここまで２分
http://designup.jp/category/template-custom/tpl-eccube/

##初期設定からの解析
インストール、初期設定を終えたら、何でも使って
解析を行う。

プログラムはI/Oと処理を理解することなので、「画面」「処理」「データストア」から理解することが肝要。

#理解するのに必要な技術要件
頑張り給え
html,css
PHP
MySQL
Spring Boot - テスト時に読み込むDBを変更する

Spring Bootでテストを走らせるときに、開発用・本番用とは違うDBに接続しないなど、設定を変えたい時があります。その場合のは設定方法について。

# Test時には、設定ファイルの優先度が変わる

MavenでもGradleでもいいんですが、例えばMavenを使っているならば、Springプロジェクトは以下のような構成になっているはずです。

```
/my/good/project
 ├── README.md
 ├── pon.xml
 └── src
     ├── main
     │   ├── com
     │   │    └── ...
     │   └── resources
     │       └── application.yml
     └── test
         ├── com
         │    └── ...
         └── resources
             └── application.yml

```

jarファイルなどにパッケージングして実行した場合は`src/main/resources/application.yml`を読み込みますが、

```
mvn test
```

などと、testを実行した場合は`src/test/resources/application.yml`が優先的に読み込まれます。（test以下にapplication.yml や application.propertiesがない場合はmainの方にあるやつを反映する）


# Testによって更に設定を分岐させる

また、以下のようにして、テストクラス毎に反映する設定ファイルを変えることが出来ます。

```
/my/good/project
 :
 └── src
     :
     └── test
         ├── com
         │   └── myapp
         │       ├── MyAppIntegrationTest.java
         │       └── MyAppSourceTest.java
         └── resources
             ├── application.yml
             ├── application-unit.yml
             └── application-integration.yml

```
```application.yml
spring:
  profiles.active: unit
```
```application-unit.yml
spring:
  profiles.active: unit
  datasource:
    url: jdbc:mysql://localhost:3306/unit_test_db
```
```application-integration.yml
spring:
  profiles.active: integration
  datasource:
    url: jdbc:mysql://localhost:3306/it_test_db
```
```MyAppTest.java
@ActiveProfiles("unit")
public class MyAppIntegrationTest {
  :
```
```MyAppIntegrationTest.java
@ActiveProfiles("integration")
public class MyAppIntegrationTest {
  :
```

※　application.yml , application-${profile}.ymlは１つにまとめることも出来ます。[^1]

なんとなく、Spring界隈にのテスト情報がネットには少ない気がします。書籍に頼るしか無いのか…

# Packageしたjarの設定ファイルを変更する

```
mvn package
```

などとして作成したjarファイルは

```
java -jar -Dspring.profiles.active=production hoge.jar
```

とすると`spring.profiles.active: production`の設定で実行することが出来ます。

毎回オプションを付けて起動するのが面倒ならば

```
$ ls
hoge.jar
application.yml
```

というような構成にして`java -jar hoge.jar`を実行することで、application.ymlの内容を使ってアプリケーションの実行が出来ます。

この情報、どこで見たのか思い出せない…ソースをご存じの方がいたら教えてください！

<ins>追記</ins>
[公式サイト　23.3 Application property files](http://docs.spring.io/spring-boot/docs/1.2.2.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-application-property-files)に説明がありました！　@mtn81 thanks!

# 参考
[^1]: [Spring Bootで設定のプロファイル分けをする - Qiita / mas0061](http://qiita.com/mas0061/items/4dd9c54a6bc69b564a02)
DWRでファイルをアップロードする方法

DWRは、JavaでAjaxを開発できるライブラリです。
DWRでファイルをアップロードする方法を紹介します。

とりあえず、以下の公式サイトを和訳します。
[公式サイト（画像やバイナリファイルの変換）](http://directwebremoting.org/dwr/documentation/server/configuration/dwrxml/converters/file.html)


### 画像ファイルやバイナリファイルの変換

DWR3.0の特徴は、新しいFileConverterです。FileConverterは次のバイナリファイルを扱います。

* 画像 (java.awt.BufferedImageの子孫クラス)
* InputStreams (java.io.InputStreamの子孫クラス）
* FileTransferオブジェクト(org.directwebremoting.io.FileTransfer)

アップロードするために、commons-fileuploadとcommons-ioをclasspathに設定してください。
詳細は、commons-uploadの依存性を表した図見てください。
JARファイルを間違うと、DWRが"file uploads not supported"というエラーメッセージを出すでしょう。

### 最大アップロードサイズ
ファイルアップロードの上限サイズは、DWRサーブレットの`init-param` "fileUploadMaxBytes" で指定できます。
このパラメータは次のように指定してください。
```xml
<init-param>
    <param-name>fileUploadMaxBytes</param-name>
    <param-value>5000</param-value>
</init-param>
```
Ruby Gold 勉強法

取得したので簡潔にまとめてみます。
参考になると幸いです。

## 前提
Silver持ち
一夜漬け系の勉強法

## 本
[Ruby公式資格教科書 Ruby技術者認定試験Silver/Gold対応](http://gihyo.jp/book/2012/978-4-7741-5001-7)
Silverでは不要ですが、Goldではさすがに必要と思い購入。
実際受けてみて、絶対必要とは言えないが受験料を確実に無駄にしないためと勉強時間削減のためにはやはり必要だったと感じる。

巻末問題含め、休日半日潰して読了
Silverを持っていた事もあり、5,6章は斜め読み
読む時に不安なところに折り目をつけて、試験前日に復習
この本は新しくなった試験範囲には対応していないので、試験範囲は要確認です↓
http://www.ruby.or.jp/ja/certification/examination/
※ キーワード引数、Module#prepend、Refinementsが追加項目と思われる

良本だと思いますが、どうしても不安が残ります。
※ 勇気がある人はある意味半日で足りるっちゃ足ります。
※ ただし、巻末問題よりも実際の試験の方がはるかに難しいと感じたので注意です。
自分の場合、受験料と本で2万円の出費は安くなかったので、念のため追加の対策を取る事に。


## リファレンス
追加の対策はバージョン2.1のリファレンス。
[オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル](http://docs.ruby-lang.org/ja/2.1.0/doc/index.html)
「Ruby の文法」の項目にあるリンクとライブラリをいくつか読んだ。
スマホでは見づらく、試験対策で読んだという記事も見かけなかったが、
簡潔で読みやすく個人的には対策向きだと思った。
※Silverの時にリファレンスを試験対策としていたので、抵抗がなかったのもあります。


## [メタプログラミングRuby](http://www.amazon.co.jp/%E3%83%A1%E3%82%BF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0Ruby-Paolo-Perrotta/dp/4048687158)を読むべきか
Rubyに詳しくなるには必要と思うが、時間をかけずに合格を目指すのであれば不要と考え読まなかった。
過去に読んだ事はあるが、だからこそ時間がかかるとわかってたのでやらなかった。
一夜漬けタイプなのでこれを読んでる内にいろいろ忘れてしまうとも思った。
※追記 2015/02/13
改めて読んだが考えは変わらず。
間違いなく良書だしRubyを好きにしてくれた本でもあるが、
文章がやや冗長なので短時間で詰め込むのにはやはり向かないと思う。


## まとめ
苦手部分、良くわかってなかった箇所を拾えた。
これからググる回数が減ると感じた。
本とリファレンスで十分足りる。
Facebookでシェアしたページのキャッシュクリア

解決したのでメモ

#現象
DoorkeeperのイベントをFacebookでシェアしたら、コミュニティのサムネイル画像は出たけど、日時なんかの詳細が表示されず「このイベントは公開されていません」の文字が…

#原因
キャッシュでした

#解決法
[Open Graph Object Debugger](https://developers.facebook.com/tools/debug/og/object/)にアクセスしてURLを入力、「Show existing scrape information」をクリック。

スクレイピングされた日時とか内容とかHTTPステータスとか見れる。

どうやら公開前の日時の情報がキャッシュされていたようだ。


「Fetch new scrape information」をクリック。
![fb_debug2.png](https://qiita-image-store.s3.amazonaws.com/0/54295/fa509589-32ea-b4f7-1a7a-a0ba131931fd.png)

そして確認。あれ、まだ直ってない。。。

#解決法の続き
自分がシェアした投稿の右上の∨みたいなやつをクリックすると、一覧に「シェアした添付ファイルを更新」というのが出てくるので選択。

なおった！

![ideathon.png](https://qiita-image-store.s3.amazonaws.com/0/54295/1c52f229-05ef-9c52-5c7d-5a22600d6e71.png)


よかった。
Ransackを触ってみた

@jnchito さんに教えてもらった[Ransack](https://github.com/activerecord-hackery/ransack)という検索機能を簡単に作ることができるgemを調べてみました。
Readmeをがんばって読んでみます。

## 名前の意味
まずは「ransack」を辞書で引いてみました。
> 【動詞】 【他動詞】
> 1 〔…を求めて〕〈場所を〉くまなく探る[探す], あさり回る 〔for〕.
> 〈…するために〉〈場所を〉くまなく探す 〈to do〉.
> 2 〈場所から〉ものを奪う.

要約すると「めちゃくちゃ探し回る」という意味のようです。「find」や「search」よりもねちっこい感じでしょうか。検索に特化したライブラリということがうかがえます。

## クエリ文字列が長くなるのでPOSTメソッドを使おう
ransackは検索機能を強力なものにしてくれますが、クエリ文字列が長くなってしまうのが玉にキズです。RESTfulじゃなくなってしまうので甚だ遺憾ではありますがPOSTメソッドでリクエストしましょう。 :confused: 

## searchの代わりにransackを使おう
Modelに追加される`search`メソッドは、「他のgemと名前がぶつかるので困る」という声が寄せられたようで、代わりに`ransack`メソッドを使おう。ということが書かれていました。次のメジャーバージョン(2.0)では`search`は非推奨になるかも知れません。

## ransacker
`ransacker`メソッドを使うと、Arelを使った独自の検索機能を追加することができます。
（よくわからなかったのであとで調べる）

## 検索できる項目の制限
ransackはフォームを自動生成してくれたりしてとても便利なのですが、偽装されたリクエストパラメータを元にして、見られたくない項目で検索されてしまう可能性があります。検索対象のテーブルだけでなく、関連するテーブルも同様です。

ransackのデフォルトでは全ての項目、全ての関連テーブルを許可していますが、検索を許可する項目や関連テーブルを制限するための方法が提供されています。

モデルクラスに追加される以下の４つのメソッドをオーバーライドすることで、項目に制限をかけることができます。

```rb
  # 検索できる項目名。デフォルトでは全ての項目。
  #
  def ransackable_attributes(auth_object = nil)
    column_names + _ransackers.keys
  end

  # 参照できる関連テーブル。デフォルトは関連付く全てのテーブル
  #
  def ransackable_associations(auth_object = nil)
    reflect_on_all_associations.map { |a| a.name.to_s }
  end

  # ソート可能な項目。デフォルトは検索できる項目名と同じ
  #
  def ransortable_attributes(auth_object = nil)
    ransackable_attributes(auth_object)
  end

  # ransackが使用できるスコープ？
  # デフォルトは空。
  def ransackable_scopes(auth_object = nil)
    []
  end
```

## 気になったこと
検索できる項目の制限については、個人情報を抜かれるとかそういった類のものではないと思いますが、ユーザーに提供していない検索条件でデータの絞り込みを行われることで、意図しないリスクがあるのかもしれません。
どのような危険があるのかはおもいつきませんが、利用できる検索条件は絞っておいたほうがいいような気がしました。
coffeeでseleniumする準備


## はじめに
自分がselenium勉強するために、
まずはselenium-webdriverをcoffeeでいじくり回すために書く備忘録。

selenium
http://www.seleniumhq.org/
selenium-webdriverのAPI docs
http://selenium.googlecode.com/git/docs/api/javascript/index.html

## 準備
1. node.jsがインストールされてること
 - http://nodejs.org/ ここからDL & インストール
1. coffeeがインストールされてること
 -  `npm install -g coffee-script`しよう

## selenium-webdriverをインストールしよう
適当にディレクトリをつくってそこに移動しよう

```
mkdir seleniumCoffee
cd seleniumCoffee
```
selenium-webdriverをインストールしよう

```
npm init
npm install selenium-webdriver
```
これでよし

## coffeeでテストを書こう
定番のgoogle検索をしてみましょう

```coffee
# firefox WebDriverを呼ぶやつ
firefox = require 'selenium-webdriver/firefox'
# エレメントを指定するのによく使うやつ
By = require 'selenium-webdriver'
	.By
# 画面描画や処理を待つのによく使うやつ
Until = require 'selenium-webdriver'
	.until

# firefox WebDriverでブラウザを立ち上げる
driver = new firefox.Driver()

# googleにアクセスする
driver.get 'https://google.co.jp'

# 検索ボックスにテキストを入力する
driver.findElement By.name 'q'
	.sendKeys 'selenium coffee'

# 検索ボタンを押す
driver.findElement By.name 'btnK'
	.click()

# タイトルに検索語が反映されるので、それを待つ
driver.wait Until.titleIs( 'selenium coffee - Google 検索' ), 1000

# ちょっと実行した時に一瞬過ぎて分からないし、練習なのでスリープ入れる
driver.sleep 2000

# ブラウザを閉じる
driver.quit()
```
こんな感じのコードになると思う。
もし動かない時は、btnKをbtnGにしたりするといいかもしれない。
タイミングの問題だと思う
jsにすると以下のようなかんじ。

```javascript
var By, Until, driver, firefox;

firefox = require('selenium-webdriver/firefox');

By = require('selenium-webdriver').By;

Until = require('selenium-webdriver').until;

driver = new firefox.Driver();

driver.get('https://google.co.jp');

driver.findElement(By.name('q')).sendKeys('selenium coffee');

driver.findElement(By.name('btnK')).click();

driver.wait(Until.titleIs('selenium coffee - Google 検索'), 1000);

driver.sleep(2000);

driver.quit();
```

## おわり
あとは、API docs見ながら色々遊ぼう
OS X YosemiteでNTFSフォーマットのディスクに書き込めるようにする

# 目的

MacではNTFSでフォーマットされたディスクを読むことはできますが、書き込むことができません。
Windowsで利用していた外付けハードディスクなどをMacでフォーマットせずに利用したい場合、追加でソフトウェアをインストールする必要があります。

# 前提

* Homebrewがインストール済み
* FUSE系のソフトウェアがインストールされていないこと

# FUSE for OS Xのインストール

## インストーラーを直接利用する場合

[FUSE for OS XのWebサイト](http://osxfuse.github.io/)にOSXFUSEのインストーラーへのリンクがあるので、そこからダウンロードし、インストーラーを実行します。

途中、インストールパッケージの選択画面が現れます。チェックの外れている**MacFUSE Compatibility Layer**は、FuseHFS等のMacFUSE用のモジュールを利用したい場合に追加します。今回は不要なのでそのままインストールを進めます。

## Homebrew Caskを利用する場合 (推奨)

こちらの方が手軽なのでオススメです。

Homebrew Caskがインストールされていない場合はインストールします。

    $ brew install caskroom/cask/brew-cask

FUSE for OS Xをインストールします。

    $ brew cask install osxfuse

# NTFS-3Gのインストール

先にディレクトリの所有権を修正します。

    $ sudo chown $(id -un) /usr/local/include
    $ sudo chown $(id -un) /usr/local/lib
    $ sudo chown $(id -un) /usr/local/lib/pkgconfig

[NTFS-3G](http://www.tuxera.com/community/ntfs-3g-download/)をインストールします。

    $ brew install ntfs-3g

# mount_ntfsコマンドの置き換え

`/sbin/mount_ntfs`コマンドをNTFS-3Gのものと置き換えます。[^1]

    $ sudo mv /sbin/mount_ntfs /sbin/mount_ntfs.original
    $ sudo ln -s /usr/local/sbin/mount_ntfs /sbin/mount_ntfs

元の`/sbin/mount_ntfs`は`/System/Library/Filesystems/ntfs.fs/Contents/Resources/mount_ntfs`を指しています。

[^1]: El Capitan以降はSystem Integrity Protection (SIP, 通称rootless)によってそのままでは置き換えができないため、[rootlessの無効化](http://qiita.com/ganta/items/3b4cf53a25d17e5f7ae5#rootless%E3%81%AE%E7%84%A1%E5%8A%B9%E5%8C%96)、[rootlessの有効化](http://qiita.com/ganta/items/3b4cf53a25d17e5f7ae5#rootless%E3%81%AE%E6%9C%89%E5%8A%B9%E5%8C%96)を参照してrootlessを一旦無効化してから置き換えを行ってください。

# 再起動

OS Xを再起動します。
その後、NTFSでフォーマットされたハードディスクなどに書き込みができるようになります。

# 参考

* [osxfuse + ntfs-3g + Yosemite = NTFS R/W](https://gist.github.com/bjorgvino/f24e5c079b92f921b765)
やっつけでメールを Amazon SNS に転送する

転送したいユーザーのホームディレクトリで .forward で awscli にパイプする。

```console
$ cat <<EOS> .forward
|"/usr/bin/aws sns publish \
--region ap-northeast-1 \
--topic-arn arn:aws:sns:ap-northeast-1:999999999999:topic \
--message \"\$(cat)\" \
--subject \"[aws] \$(uname -n)\" >/dev/null"
EOS
```

リージョンやトピックの arn は適宜変更してください。
PCLでpoint cloud中の点をランダムに間引く


厳密ではないが，お手軽に点を間引きたい時に便利．

#アイデア

`cloud->points` の実態はstl::vectorなので，コンテナに対する `std::remove_if` を適用する．
`operator()` が呼び出された時にランダムでTrue/Falseを返すクラスを作り，`remove_if` に投げる．

#コード

```c++:まびく関数

#include <algorithm>

template <class T>
class isDelete
{
  float _random_sampling_percentage;
public:
  isDelete(float random_sampling_percentage)
  {
    srand((long)time(NULL)); 
    _random_sampling_percentage = random_sampling_percentage / 100.0;
  };
  bool operator() (T& val)
  {
    return (rand()/(double)RAND_MAX >= _random_sampling_percentage);
  }
};

void pointsReduction(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,
                     float random_sampling_percentage)
{
  isDelete<pcl::PointXYZ> randDel( random_sampling_percentage );

  cloud->points.erase( std::remove_if(cloud->points.begin(),
                                      cloud->points.end(),
                                      randDel  ), 
                       cloud->points.end() );
}
```

Ptr型のcloudを与えればOK．

```c++:呼び出し
pointsReduction(cloud, 10); // 10%に間引く
```
javascriptでextendしたクラスから親メソッドをコールしたい

* これがやりたい
extendしたクラスのメソッドから、親の同名メソッドをコールしたい。
javaでいうところの```super()``` みたいなことがしたい。

* 調べた
http://d.hatena.ne.jp/shogo4405/20070121/1169394889
http://web-terminal.blogspot.jp/2014/04/javascript-sub-super-method.html
http://qiita.com/no22@github/items/d3bead2acbb7ff1fb86b
http://qiita.com/edo_m18/items/200ae66bd18011bda377
→```__super__``` でextend元のクラスのプロパティにアクセス

* こうした

```js
var SubView = SuperView.extend();
SubView.__super__.render.call(this, [args]);
```

とりあえずやりたいことはできたけど、クラス名に依存してるのがイケテナイな。
LitaのPluginいくつか使ってみたよメモ

# 20160112追記
google apiが変わったらしく、lita-google-imagesにCustom search apiを使用するようになりました

# 概要
LitaをSlackに参加させたので、いくつかPluginつっこんで遊んでみました。
入れたPluginは

- [lita-google-images](https://github.com/jimmycuadra/lita-google-images)
- [lita-google](https://github.com/jimmycuadra/lita-google)

# 準備
1. LitaをHerokuに置いてSlackに参加させます。
参考：http://qiita.com/misogi@github/items/14ab615e0cd4e0af9c66

2. https://console.developers.google.com/ でcustom search apiを使えるようにします。

# lita-google-imges
```rb:Gemfile
gem "lita-google-images"
```

```rb:lita_config.rb
Lita.configure do |config|
  config.handlers.google_images.google_cse_id = GOOGLE ACCOUNT
  config.handlers.google_images.google_cse_key = CUSTOM API KEY
  config.handlers.google_images.safe_search = :off
end
```
## 使い方
```
lita img 刀剣乱舞 鶴丸
```

![b33242d213b9d9b37a93dda751016715.png](https://qiita-image-store.s3.amazonaws.com/0/42777/34f8bf86-dfef-6d37-c9af-533d47f2925b.png)

# lita-google
```rb:Gemfile
gem "lita-google"
```

## 使い方
```
lita google マシュマロ女子 うふ子
```
![85adc061188ecf17334c29310f841f0f.png](https://qiita-image-store.s3.amazonaws.com/0/42777/4615c959-98cc-87cb-810a-b0e1d51a8f49.png)

## 小技：youtube動画貼ってもらう
Slack便利なので動画のURL貼ればすぐ見れます。

```
lita google youtube 刀剣乱舞
```
![ba93e98b9aad06f2087c4a151a72eed5.png](https://qiita-image-store.s3.amazonaws.com/0/42777/da077f11-f3f5-c1b2-0e4c-22c22a76662c.png)
みんなの為のMySQLまとめ（２）


参考
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/mysql_07.htm

###■テーブルクリア

  ・テーブル中のデータだけを全て削除するには、delete 文を使用する。

```
delete from testm;
```

  ・但し、単純クリアが目的なら、この方法はレスポンス的に問題がある。
    トランザクション機能が働くので、全レコードのトランザクションバッファ
    への書き込みとコミットによる更新が行われる。
    何万件にも及ぶデータのクリアを delete 文でやると実用に耐えない。

  ・単純なテーブルクリアが目的の場合は、表切り捨て(truncate) を使用する
    と良い。この方が一瞬でクリアできる。

```
truncate table testm;
```

  ・思いきって、テーブル削除と再作成を利用する手もある。

```
drop table testm;
create table testm (
  key1           char(008),
  data1          int8,
  data2          int8,
  data3          int8
)
```
###■テーブル定義変更(テーブル属性変更、列定義変更)

  ・データ項目の桁数が足りなくなったり、新たな項目を追加するのは alter
    文で簡単に行える。但し、列名の変更はできないようである。

  ・新たにテーブルに項目を追加(列の追加、フィールド追加、カラム追加)
    するには、次のようにする。

```
alter table testm add
  newdata1  int8
;

alter table testm add (
  newdata1  int8,
  newdata2  int8
);

  ・MySQL は列の削除が行える。

alter table testm drop
  newdata1
;
```
###■整合性制約定義、リレーション、リファレンス、外部キー

・データ項目に他のテーブルとのリレーションをとって、制約条件などを設定
  することができる。(constraints)
    制約追加は、create table 時、または、alter table で行う。

  ・列制約には、
      primary key  主キー制約(unique & not null)
      unique       一意キー制約(ユニーク項目、一意制約、ユニーク値、ユニークキー、ユニーク制約)
      not null     NOT ヌル制約
      check        チェック制約
      references   参照整合性制約(参照制約、外部整合性制約、外部制約キー)
    がある。
    not null 制約については、Oracle と構文が違うのか、alter table で変更
    できないようである。
    また、references 節約はサポートされていない。
    
```
alter table testm add unique (
  data1
);

alter table testm
  add constraint TESTM_JCSU check(data1 >= 0)
;
```

・MySQL では、制約単体の削除はできないようである。
###■名前変更(テーブル名変更)

  ・テーブル名の変更は、次のようにする。

```
alter table testm rename to abc;
```
PostgreSQL9.4を入れてみる

9.4が出ましたね！

```bash

# yum install http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/pgdg-redhat94-9.4-1.noarch.rpm
# yum install postgresql94-server postgresql94-contrib

# su - postgres
$ mkdir 9.4/data/
$ mkdir 9.4/backups/
$ /usr/pgsql-9.4/bin/initdb --encoding=UTF8 --no-locale
データベースシステム内のファイルの所有者は"postgres"ユーザでした。
このユーザがサーバプロセスを所有しなければなりません。

データベースクラスタはロケール"C"で初期化されます。
デフォルトのテキスト検索設定はenglishに設定されました。

データベージのチェックサムは無効です。

ディレクトリ/var/lib/pgsql/9.4/dataの権限を設定しています ... ok
サブディレクトリを作成しています ... ok
デフォルトのmax_connectionsを選択しています ... 100
デフォルトの shared_buffers を選択しています ... 128MB
selecting dynamic shared memory implementation ... posix
設定ファイルを作成しています ... ok
/var/lib/pgsql/9.4/data/base/1にtemplate1データベースを作成しています ... ok
pg_authidを初期化しています ... ok
依存関係を初期化しています ... ok
システムビューを作成しています ... ok
システムオブジェクトの定義をロードしています ... ok
照合順序を作成しています ... ok
変換を作成しています ... ok
ディレクトリを作成しています ... ok
組み込みオブジェクトに権限を設定しています ... ok
情報スキーマを作成しています ... ok
PL/pgSQL サーバサイド言語をロードしています ... ok
template1データベースをバキュームしています ... ok
template1からtemplate0へコピーしています ... ok
template1からpostgresへコピーしています ... ok
データをディスクに同期しています...ok

警告: ローカル接続向けに"trust"認証が有効です。
pg_hba.confを編集する、もしくは、次回initdbを実行する時に-Aオプショ
ン、または、--auth-localおよび--auth-hostを使用することで変更するこ
とができます。

成功しました。以下を使用してデータベースサーバを起動することができます。

    /usr/pgsql-9.4/bin/postmaster -D /var/lib/pgsql/9.4/data
または
    /usr/pgsql-9.4/bin/pg_ctl -D /var/lib/pgsql/9.4/data -l logfile start
$ exit
# systemctl start postgresql-9.4
# psql -U postgres
psql (9.4.0)
"help" でヘルプを表示します.

postgres=# \q
```

CentOS7にPostgreSQL9.3と最新のもので環境構築してみた。 | 株式会社メイプルシステムズ
http://maplesystems.co.jp/blog/all/programming/11668.html