OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyで文字化けせずに全角英数字を半角英数字に変換する方法

RubyでUTF-8文字列の全角英数字の表記揺れを統一したいとき、
気をつけないと希に文字化けする事象を見つけたのでメモします。

## NKFを用いて全角英数字→半角英数字に変換する方法

ググるとよく出てくる方法は次の通りです。
ここでもしWindowsの機種依存文字が混じるとどうなるでしょうか？

```rb
$ pry
pry(main)> require 'nkf'
=> true
pry(main)> NKF.nkf('-m0Z1 -w', "Ｒｕｂｙ−２．２")
=> "Ruby-2.2"
pry(main)> NKF.nkf('-m0Z1 -w', "ルビー Ⅱ")
=> "ルビー Ⅱ"
pry(main)> NKF.nkf('-m0Z1 -w', "ルⅡ")
=> "繝ォ竇。"
pry(main)> NKF.nkf('-m0Z1 -w', "Ruby Ⅱ")
=> "Ruby 竇。"
```

なんと、文字の組み合わせ次第では化けてしまいます。

## 文字化けせずに変換する方法

結論としては、`-m0Z1 -W -w`とする事で解決しました。
詳しくは次のブログにまとめました。

Rubyで全角英数字を半角英数字にnkfで変換する時の落とし穴 - Y-Ken Studio
http://y-ken.hatenablog.com/entry/ruby-nkf-conversion-problem

## あわせて読みたい

半角英数字に変換し、さらに機種依存文字も変換したいケースでは、
NKFではなく次のページで紹介されているunicode gemが万能でお勧めです。

文字列の表記揺れをUnicode正規化で簡単に解決する方法
http://qiita.com/y-ken/items/d08eb7f66c8fb2fa7d21
Windows で asar を作る

```
work
└─app
        index.html
        main.js
        package.json
```

http://nodejs.org/dist/v0.12.4/node.exe
をダウンロードし、work ディレクトリに配置

http://nodejs.org/dist/npm/npm-1.4.12.zip
をダウンロードし、展開した node_modules と npm.cmd を work ディレクトリに配置

```
work
│  node.exe
│  npm-1.4.12.zip
│  npm.cmd
│  
├─app
│      index.html
│      main.js
│      package.json
│      
└─node_modules
    └─npm
```

asar をインストール
`npm install asar`

```
work
│  node.exe
│  npm-1.4.12.zip
│  npm.cmd
│  
├─app
│      index.html
│      main.js
│      package.json
│      
└─node_modules
    ├─.bin
    │      asar
    │      asar.cmd
    │      
    ├─asar
    └─npm
```

asarパッケージを作成
`node_modules\.bin\asar.cmd pack app app.asar`
Webmin導入

今更ですが仕事で使うことになるかもなのでRHEL-7.1上にインストールした時のメモ。

# インストール

以下を参考にしました。

http://doxfer.webmin.com/Webmin/Installation#yum_.28CentOS.2FRedHat.2FFedora.29

```
$ sudo vim /etc/yum.repos.d/webmin.repo
[Webmin]
name=Webmin Distribution Neutral
baseurl=http://download.webmin.com/download/yum
enabled=1

$ sudo rpm --import http://www.webmin.com/jcameron-key.asc
$ sudo yum -y install openssl openssl-devel
$ sudo yum -y install perl perl-Net-SSLeay perl-Crypt-SSLeay
$ sudo yum -y install webmin
```

iptables修正。10000ポートを開ける。

```
$ sudo vim /etc/sysconfig/iptables
-A INPUT -p tcp -m state --state NEW -m tcp --dport 10000 -j ACCEPT

$ sudo systemctl restart iptables.service
```

尚、自分はEC2インスタンスにインストールしたので、適用しているセキュリティグループのインバウンドに10000を追加。
これ、webminに限らず意外と忘れます。

`https://hostname:10000/` でアクセス。

# ポート番号変更

root でログイン。

Webmin > Change Language and Theme で Personal Choice を Japanese UTF-8 に変更。

一度ログアウト後、再度ログインすると日本語になっているはず。

あと、Webmin設定 > ポートとアドレス の 全てのアドレス の 具体的なポート を 10220 に変更。

ネットワーク > Linuxファイアウォール で 10000 のルールを削除。
上記の10220のルールはwebminが追加している。

それに伴い、AWSセキュリティグループも修正。 10000 > 10220
フラットなPHPで書かれたサイトにSlimフレームワークを導入してみた

フラットなPHPサイトにSlimフレームワークを導入したのでその忘備録です。

環境 
CentOS 6.6
PHP 5.3

##Slimフレームワークを選んだ理由
CakePHPとかSymfonyとか使うほど大掛かりなサイトではなく、
ちょっとルーティング処理とか部品を共通化できればよかったのでシンプルで軽量なフレームワークで探してみたら行き着いた。

##導入
http://www.slimframework.com/
公式サイトにしたがって

```lang:
composer require slim/slim
```
をすると

* composer.json
* composer.lock
* vendor/
が出来上がる。

ディレクトリ構成は自由なので

* composer.json
* composer.lock
* vendor/
* templates/
* public/
* ├ css/
* ├ img/
* └ js/

として、`public/index.php`を設置。
同じ階層下に`public/.htaccess`を設置して

```lang:.htaccess
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?page=$1
```

リクエストをindex.phpに集めるように設定する。

そしてapacheのドキュメントルートを変更。

```
DocumentRoot "/var/www/html/public"
```

`public/index.php`の中身は
テンプレートの`vendor/slim/slim/index.php`の中身をコピペして
`autoload.php`のpathだけ書き換えます。

```
require '../vendor/autoload.php';
```
トップページにアクセスして
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/81730/1a8da08a-03fa-5e04-7e16-80e6a301d79f.png)

が表示されていればとりあえず設置は完了。

次回はログの出力とコンポーネントの読み込みを書く予定。
.gitconfigの設定とかよく使う便利なコマンドメモ


# はじめに

* 僕の.gitconfigの設定か、よく使うコマンドとかをまとめていきます
* 適当に思いついたところから書いていきます
* OS: Mac OS Yosemite


# Config

## エディタの設定

```
[core]
	editor = emacs
```


## globalなgitignoreの設定

### .gitconfig

```
[core]
	excludesfile = ~/.gitignore_global
```

### .gitignore_global

emacsの一時ファイルとか除外したりする設定なので、この辺はお好みで

```
*~
\#*\#
.*
```


## ユーザ

草を生やすために設定しておきませう。

```
[user]
	name = xxxx
	email = xxxx@xx.xx
```

## merge --no-ff をデフォにするための設定

```
[merge]
	ff = false
```

## 出力に色をつける

```
[color]
	ui = true
```

## エイリアス

```
[alias]
	st = status
	cm = commit
	cmm = commit -m
	co = checkout
	b = branch
	cb = checkout -b
	sm = submodule
	p = push
```


# コマンド

## addしてしまったファイルを取り消す

```
git resset HEAD <filename>
```

## コミットしてしまったファイルを管理対象から外す

* --cached を入れないとファイル自体が消えてしまうので注意

```
git rm --cached <filename>
```

* .gitignore を元に管理対象から外す場合

```
git rm --cached `git ls-files --full-name -i --exclude-from=.gitignore`
```
Emacsのhaskell-modeでインデントしようとすると怒られる

いつからかは不明ですが、Emacsのhaskell-modeでHaskellを書いていると下記のように怒られてインデントされない状態でした。

```
Run M-x describe-variable haskell-mode-hook for a list of such modes.
haskell-mode-suggest-indent-choice: You tried to do an indentation command, but an indentation mode has not been enabled yet.
```

 * https://github.com/syl20bnr/spacemacs/issues/706

上記URLのコメントにあるように、次のような設定をすると怒られなくなりました。謎です。

```el
(add-hook 'haskell-mode-hook 'turn-on-haskell-indentation)
```
#PostgreSQL でTIMESTAMP型のDEFAULTに最小値/最大値を指定したいとき


`TIMESTAMP`の`DEFAULT`に次のような書き方が可能な模様。

例えば、

* 開始日時`"start"`に`'-infinity'::timestamp`
* 終了日時`"end"`に`'infinity'::timestamp`

```sql:PostgreSQL
CREATE TABLE tables(
    "start" TIMESTAMP WITHOUT TIME ZONE DEFAULT '-infinity'::timestamp,
    "end" TIMESTAMP WITHOUT TIME ZONE DEFAULT 'infinity'::timestamp
);
```

* `'-infinity'::timestamp`は他のすべての有効な時刻以前。
* `'infinity'::timestamp`は他のすべての有効な時刻以降。

9.3.4を使っているけれど、大分前のバージョンからあるみたい。

https://www.postgresql.jp/document/pg632doc/user/c0404.htm
テストコードのレビューについて

# はじめに
[TDDについて](http://qiita.com/syou007/items/7d6fdf1b7b6245a07bce)書いたところ、思ったよりも反響があり、様々なところでコメント書いていただきました。
ありがとうございます。

はてなブックマーク等に書かれている通りで、僕自身がTDDについて未熟なのは承知しております。
それを承知の上で僕が行った施策とTDDをやめた理由を文献に残そうとしたものが[こちらの記事](http://qiita.com/syou007/items/7d6fdf1b7b6245a07bce)になってます。

さて、今回は頂いたコメントに関して僕の中で腑に落ちない内容であるテストコードのレビューについて書いていこうと思います。

# 成果物の管理について
TDDを実践している人の記事やコメントで幾つか見られるのが`テストコードのレビューが不要`という内容です。
僕はこの考えにはかなり否定的です。

テストコードに限らず、自分がマネジメントしているチームのメンバーが作成したものは全て成果物という扱いになるというのが僕の考えです。
その成果物に関してレビュー（チェック）を行わないというのは、作ってもらってないに等しいと僕は思ってます。

# ビジネスの観点では成果物が全て
ビジネスの視点で見ると成果物に対してお金を払うことはごく一般的です。
自分が使いこなせない成果物はどんなに優れていても価値はありません。
システムを発注する人は、その発注した物に対して価値を見出すからお金を払ってます。

自分にとって価値のない物にお金を払う人は居ないでしょう。

# マネジメントは例外なのか？
社内で働いている人にはこれが例外になるのでしょうか？
曖昧な価値のある物に対して良しとして仕事を進めるのでしょうか？
自分で依頼した物をチェックしないつもりで仕事を任せていくのでしょうか？

僕はメンバーに対しても、依頼した物が依頼した通りになっているかを確認すべきだと思ってます。
これはTDDで作ってもらったテストコードも例外ではないと思ってます。依頼して作ってもらっている立派な成果物です。
その成果物の価値をマネジャーは把握すべきだと思います。

自分が把握しているからこそコントロールができる状況ができて、マネジメントができる物だと思います。

# テストコード等をレビューしない場合
僕が見てきた現場でもレビュー（確認）を疎かにしている現場は多々ありました。
そのような現場では属人性が強くでて、マネジメントを放棄している状況にみられました。
そして、そういう現場ではトラブルが発生しやすく発生すると個人に責任を押し付ける傾向がありました。

また、テストコードがあっても誰もチェックをしていないためメンバーは面倒臭そうにテストコードを書いているような状況で、テストコードの中身も正常系の一部しか書いていないという状況が多発してました。
（属人性によるため、しっかり書いている人ももちろんいました。）

# 人は見られているから頑張り成長する
人は誰かに見られていることを意識することで大きく成長します。
ペアプログラミングがいい例だと思います。

作った物が何かの役に立つからこそ人は頑張ります。
そして、そこで得られるフィードバックで成長していきます。

これはテストコードも例外ではありません。
下記に記載している`PDCA`を回すからこそ、人は気づき成長し熟練していきます。
`一人で成長できる天才`を基準にしてマネジメントすることはできません。

# 品質担保用のテストコードとTDDのテストコードは別
このように書いている人が見られましたが、果たしてそうでしょうか？
上記にも書いているように、人に見てもらうことで成長します。
また、マネジャーが見ることで何を担保しているかがわかります。

そして、何を担保していないかがわかります。
僕はテストコードを書くならTDDのテストコードと品質向上のテストコードは同一視した方が生産性がいいと思います。
というか、そもそも別にする理由がわかりません。

開発プロセスの工程で、TDDのテストコードは簡易で後で肉付けをして品質担保用のテストコードにするというのなら分かりますがこれを別々に管理してしまったらTDDで作ったテストコードは何に使うのでしょうか？

# 僕なりの結論
僕はPDCAサイクルが仕事には不可欠だと思ってます。
何かの計画（Plan)を立ててから、実行(Do)して、評価(Check)をした後に改善(Act)するサイクルを回すことで生産性と品質、提供（QCD)を高めていけると思ってます。
成果物に関しては例外はないと思ってます。

なので、TDDのテストコードのレビューは必須だと思います。
レビューをすることで粒度を揃えるルールを作ることができる思います。
ルールがあれば人が変わってもチーム内の品質を担保しやすくなります。

# とは言っても・・・
現実問題、全てをチェックすることはできないというのもあります。
マネジャーがチェックできる物には限界があります。（マネジャーのスキルによる問題と物量の問題等があります。）
そこはどうしてもトレードオフが発生すると思います。それについては現場内で調整するしかないと思っております。
その結果が`テストコードのレビューは不要`になるかもしません。
しかし、それを一般的として公言するには根拠が薄いと思います。せめてTDDのトレードオフとしてレビューを不要とした根拠も一緒に乗せてもらいたいです。

というのが僕の意見です。

また、僕は僕の考えを持ってますが僕が絶対正しいと言うつもりは毛頭ありません。（若い頃はありましたが・・・）
僕の考えについていろいろご指摘して頂けるのは大変嬉しいですし、そういう議論が出来る人は貴重な存在だと思ってます。

# 最後に
僕は[TownSoft](http://townsoft.jp)の屋号で活動してます。
よかったらお仕事ください。（苦笑
Javaで重複なしのランダムな値をファイル出力する

#Javaで重複なしのランダムな値をファイル出力する

PostgreSQLにサンプルデータが欲しかったので
(昇順数値,重複しないランダムな整数,文字列⁺重複しないランダムな整数)
のcsvデータを出力するプログラムを書きました。



```java:RandomValueFileCreate


/*
 * 2015年6月5日作成
 *
 * 作成者：show
 *
 * 以下のCSVファイルを出力する。
 *
 * 1から1000000の値を順番に出力,
 * 1から1000000の値を重複なしでランダムな値を出力,
 * 1から1000000の値を重複なしでランダムな値と文字列と組み合わせて出力
 *
 */

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;

public class RandomValueFileCreate {

    public static void main(String args[]) {

        try {
            //出力先を作成する
            FileWriter fw = new FileWriter("C:\\temp\\sampleData.csv", false);
            PrintWriter pw = new PrintWriter(new BufferedWriter(fw));


            String str = "hoge"; //出力する文字列
            final int n = 1000000; //要素数
            boolean num[] = new boolean[n]; //重複判定用
            Random rand = new Random(); //ランダムな数値


            // すべての重複判定用配列をfalseにしておく
            for(int i=0; i<n; i++){

            	num[i] = false;

            }

            //要素数回数をループ
            for(int i=0; i < n ; ){

            	int p = rand.nextInt(n);

            	if(num[p] == false){ //まだ使ってない値か判定

            		pw.println((i+1) + "," + (p+1) + "," + str + "," + (p+1)); //初めて使う値ならファイル出力

            		num[p] = true; //使った値はtrueにしておく

            		i++; //ループ用の値をインクリメント

            	}

            }

            //閉じる
            pw.close();

            //終了メッセージを画面に出力する
            System.out.println("出力が完了しました。");

        } catch (IOException e) {
            //例外時処理
            e.printStackTrace();
        }
    }

}

```
isset()とempty()

どっちがどっちだっけってなるからメモ。

# isset()

```php:isset
$value = "はらへりむし";
$null = null;
var_dump(isset($value));  //true
var_dump(isset($name));   //false
var_dump(isset($null));   //false
```

変数がある、nullでない　→　true
変数がない、またはnull　→　false

# empty()

```php:empty
$value1 = "";
var_dump(isset($value1));  //true

$value2 = 0;
var_dump(isset($value2));   //true

$value3 = null;
var_dump(isset($value3));   //true

$value4 = "ほわた";
var_dump(isset($value4));   //false

var_dump(isset($value5));   //true
```
変数があり、「""」「0」「null」が入っている　　　→　true
変数がない　　　　　　　　　　　　　　　　　　　→　true
変数があり、値が入っている　　　　　　　　　　　→　false

* * *

**変数があるのを調べる→isset()**
**変数がないのを調べる→empty()**
なんでfuelphpのscaffoldはCSRF対策してないの？

fuelphpを仕事で使うかもしれなかったので調査していたところ、oilコマンドにscaffoldがあったので叩いてみました

## Taskをscaffoldしてみた

```
php oil g scaffold task title:text completed_at:datetime
```

このコマンドでmodel, controller, viewが作られました。

controllerには以下のアクションが実装されている。

- action_index
- action_view
- action_create
- action_edit
- action_delete

すっかりrails脳なのでnewとupdateがないなーと思ってコード読んでいると、action_createにGETとPOST両方の処理がif文で書き分けられてる…

これは！と思ったんですが、まぁいいかとaction_deleteに目を向けると、GETで動くようになっているじゃあありませんか。

ということは、/task/delete/:id?authenticity_token=xxxxxx...みたいなリンクが設置されているのかなーと思ってview見ると ```/task/delete/:id``` で終わってるんですよね。

## ローカルでcsrf試してみた

vagrantでphp環境用意していたのでこんな感じのhtmlを作成してみた

```html
<a href="http://192.168.33.32/task/delete/1">csrf delete</a>
```

クリックして普通にCSRF成功した。

これは…どうゆうことなの？
windowsでnode.jsを導入してgulpを動かす


##node.js導入

インストール
https://nodejs.org/

2015/6/5
Current Version: v0.12.4

何も考えずにsetup

スタートメニューのNode.jsフォルダに`Node.js command prompt`があるので実行

###npmにプロキシの設定
```bash:proxy設定
npm config set proxy http://user:password@xxx.xxx.xxx:xxxx
npm config set https-proxy http://user:password@xxx.xxx.xxx:xxxx
```
**自分の環境に合わせて数値を直しましょう。**


##gulp導入

インストール
http://gulpjs.com/

```bash:
npm install --global gulp
```

以下コマンドでバージョンがでたら多分成功

```bash:
gulp -v
```

2015/6/5
version 3.9.0

###packageインストール

プロジェクトフォルダで以下コマンドを入力するとpackage.jsonに合わせてpackageをインストール

```bash:
npm install
```
railsのappendメソッドって何でしょう?

railsで、配列への要素の追加に、いつもappendメソッドを使っていました。

私はpythonあがりのruby初心者です。

そのためか、`rails c`でタブ補完ができるArray#appendを使っていたのですが
rubyで配列に要素を追加する時は、普通Array#pushを使うということを恥ずかしも最近知りました。。。

rubyの配列にはappendメソッドはないようですが、railsでは使えるようです。

railsのリファレンスを調べましたが、Array#appendについて記載されていないようでした。

Array#appendとArray#pushの違いがよくわからないので、時間のある時にもで調べてみたいと思います。
Windows7でPostgreSQLをインストールしようとしたらハングした

タイトルの通り、Windows7 64bit OSのマシンにPostgreSQL 9.1.4をインストールしようとしたら以下の状態でハングした。

![hang.jpg](https://qiita-image-store.s3.amazonaws.com/0/6092/b366261b-6c45-bc3f-b8ea-dcf4b81cffe5.jpeg)

原因は、誤って`.bat`を開く既定のプログラムをエディタに設定してしまったことだった。
既定のプログラムをエディタから`cmd.exe`に戻したが、レジストリに`HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.BAT\UserChoice` が残っていた。

`HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.BAT\UserChoice`が残っているとどうやらPostgreSQLのインストールがハングしてしまう模様。

対応としては `HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.BAT\UserChoice` を削除すれば良い。

削除後、マシンを再起動し、インストールを実行したら成功した。

![finished.jpg](https://qiita-image-store.s3.amazonaws.com/0/6092/28ef0e6e-fe61-8b46-9ca3-52e140fb1f3a.jpeg)

### 参考
* [Problem installing 9.1 RC1 on 64 bit Windows 7](http://forums.enterprisedb.com/posts/list/2870.page)
* [Lost .bat file association](https://social.technet.microsoft.com/Forums/windows/en-US/fc2ca91d-5509-4c9b-92a5-5af19375e361/lost-bat-file-association?forum=w7itprogeneral)
マジックメソッド「__set()」「__get()」

**マジックメソッドとは**

マジックメソッドは、特殊関数のこと。
マジックメソッドとして定義してあるメソッド名は、予約語と同様に作成できない。

ここでは、「\_\_set()」「__get()」をメモ。
（↑アンダーバーは２つついてる。↑）

* * *

**「\_\_set()」「\_\_get()」とは**

クラスA.phpがあるとして、外部からA.phpで宣言されていないフィールドにアクセスするときに使用する。
以下、実際のソースで説明を。

* * *

まずは至って普通のコード。
newしたクラスのフィールドにアクセスしてるだけ。

```php:Property.php
<?php
    class Property{
        public $food;
    }

    $pro = new Property();
    $pro->food = "さんまの塩焼き";
    var_dump($pro->food);
?>
```
続いて、宣言していないフィールドにアクセス。
実行すると、「\_\_set()」「\_\_get()」の中に入ってるのが分かる。
（改行されないときは「画面右クリック」→「ページのソースを表示」
で見ると分かり易いかと思われ。）

```php:Property.php
<?php
    class Property{
        public $food;

        public function __set($name, $value){
            echo "__set()なう\n";
        }

        public function __get($name){
            echo "__get()なう\n";
        }
    }

    $pro = new Property();
    $pro->food = "さんまの塩焼き";
    var_dump($pro->food);
    $pro->drink = "いろはす";
    var_dump($pro->drink);

/*　実行結果は、以下の通り。
　　　　string(21) "さんまの塩焼き"
     　__set()なう
     　__get()なう
     　NULL
*/
?>
```
あとは
「\_\_set()」で値を格納し、「__get()」でそれを取り出す処理を追加。

```php:Property.php
<?php
    class Property{
        public $food;
　　　　//存在しないフィールドにアクセスされたら、ここを参照するようにする
　　　　private $drinker = array();

        public function __set($name, $value){
            echo "__set()なう\n";
　　　　　　//連想配列として格納
　　　　　　$this->drinker[$name] = $value;
        }

        public function __get($name){
            echo "__get()なう\n";
　　　　　　 //連想配列から$nameに対応する$valueを返す
　　　　　　 return $this->drinker[$name];
        }
    }

    $pro = new Property();
　　$pro->food = "さんまの塩焼き";
　　var_dump($pro->food);
    $pro->drink = "いろはす";
    var_dump($pro->drink);
    $pro->drink = "ポカリ";
    var_dump($pro->drink);

/*　実行結果は、以下の通り。  
　　　string(21) "さんまの塩焼き"
　　　__set()なう
　　　__get()なう
　　　string(12) "いろはす"
　　　__set()なう
　　　__get()なう
　　　string(9) "ポカリ"
*/
?>
```

newしたクラスに不可情報を付けたいときとかに便利。
Azure仮想マシンのOSディスクを拡張する

仮想マシンをギャラリーから構築する際、
OSディスク(Cドライブ)は自動的に127GBで作成されてしまいます。
127GB以上のディスクサイズがほしい場合は、以下の方法で拡張することが可能です。
※同様の方法でデータディスクの拡張も可能です。

#前準備
実行中の仮想マシンにアタッチされたディスクの拡張は行えませんので、
あらかじめ仮想マシンを停止しておいてください。

#PowerShell実行
ディスクの拡張はAzure PowerShellから実行します。
![SnapCrab_NoName_2015-6-5_10-29-44_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/41379/8490a01b-7ba2-4708-9f9f-c8ad04d382c1.png)
※なぜかラベル名が必須項目になっているので注意！！

#OS設定
PowerShellの実行が正常に終了したら、仮想マシンを起動しサーバーマネージャーからディスクの拡張を行います。
![vhdextend.png](https://qiita-image-store.s3.amazonaws.com/0/41379/8fbe91cb-c48f-8718-763d-9dd61d5772f5.png)

無事にCドライブが拡張されました。
![result.png](https://qiita-image-store.s3.amazonaws.com/0/41379/e7abb0f7-e3cb-24e3-95f5-70ceca87f90e.png)

#注意点
ディスクの最大サイズは1023GBです。
それ以上のサイズを指定すると実行エラーになりますのでご注意ください。
![SnapCrab_NoName_2015-6-5_10-19-8_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/41379/73011657-02c0-6d61-f460-e9050ff3da25.png)
Twilio Client ハンズオン資料

このブログでは、Twilio Client ハンズオンの進行に必要な情報（リンクとか？）を共有します。

※ 基礎編ハンズオン資料はこちら。
http://qiita.com/joohounsong/items/950cba868bea61c5777f

Twilioアカウント取得
下記のURLにてアカウントの取得可能です。
https://jp.twilio.com/try-twilio/kddi-web

Twilio Client：https://jp.twilio.com/docs/client
WebRTCを基盤にしており、Twilioで提供しているSDKを使うとブラウザはもちろんiOS、Androidのネイティブ電話アプリの開発が可能になる。
<img src="https://app.box.com/representation/file_version_30122328810/image_2048/1.png?shared_name=1zm2bbbkbsy26uzat7ry0oghq8ibmsuq" />
Twilio Client サンプルコード：
https://github.com/hunnycode/TC-browser-phone

browser-phone
 - browser-phone.php
 - dial_client.xml
 - dial_number.php

PHPヘルパーライブラリーインストール
https://jp.twilio.com/docs/php/install#installation
※ zipをダウンロードする場合、zip内の「Services」を参照してください。

■ TwiML Appsを作成
![alt](https://app.box.com/representation/file_version_30122330150/image_2048/1.png?shared_name=ex60wpwba6uin737godsftu0dc83bk50)

・Request URLの設定
![alt](https://app.box.com/representation/file_version_30122934182/image_2048/1.png?shared_name=lz0ydiv0gpmlcoh88koxwhnli6fpgz0z)

・Clientアプリケーションと紐づく電話番号設定。
![alt](https://app.box.com/representation/file_version_30123138682/image_2048/1.png?shared_name=ry2edcu36wxql5542zxf18bclxt6kuri)

・電話アプリにTwiML App情報設定
![alt](https://app.box.com/representation/file_version_30123342934/image_2048/1.png?shared_name=r7jwlnkiylnr2saw79ixgtpwircqg9dm)

・TwiML作成
![alt](https://app.box.com/representation/file_version_30123476170/image_2048/1.png?shared_name=5fn7ai4rauvrzpiu0zzrfb3b53g67srn)

・ディレクトリはこんな感じ。
![alt](https://app.box.com/representation/file_version_30123570450/image_2048/1.png?shared_name=ylgh2eni2a2ralqsntelq28nfmw4795d)

・着信用 TwiML
コードはこちら：https://gist.github.com/twilioforkwc/4e42ec9ef930cbfc407a
![alt](https://app.box.com/representation/file_version_30123711610/image_2048/1.png?shared_name=ewdjfuoya420uqzwx4y8ebwqzsx7flsl)

・ブラウザから電話をかけてみる。
![alt](https://app.box.com/representation/file_version_30124037178/image_2048/1.png?shared_name=fbulluoxrfxxji5irhgz3fbrmwhuwr4v)

【Twilio for KDDI Web Communications 公式コミュニティ】
◎ Facebookファンページ
https://www.facebook.com/TwilioforKWC
◎ Facebookユーザーグループ
https://www.facebook.com/groups/146813015487316/
◎ twitter（@TwilioforKWC）
https://twitter.com/TwilioforKWC
◎ YouTube
https://www.youtube.com/user/twilioforkwc

■ コマンド
scp : scp -P 22 [filename] twilioapistudy@xxx.xxx.xxx.xxx:/var/www/html/twilio/xxxx/
例) scp -P 22 incomming.xml twilioapistudy@xxx.xxx.xxx.xxx:/var/www/html/twilio/xxxx/

mkdir(ディレクトリの生成) : mkdir [option] [ディレクトリ名]
rm(ディレクトリやファイルの削除) : rm [option] [ディレクトリもしくはファイル名]
[option] -d：ディレクトリ削除、-r,-R：ディレクトリ無いのファイルを含めて削除
Deploy to Heroku ボタンでの秘密情報の設定方法


Githubでソースコードを管理していて、Herokuで動かしているアプリケーションにDeploy to Herokuボタンをつける時のお話です。

## 短い結論

Deploy to Herokuボタンでの配置時にパラメーターを指定する画面が出てきます。
![スクリーンショット 2015-06-05 9.37.07.png](https://qiita-image-store.s3.amazonaws.com/0/15964/22599655-a63b-dd21-3230-e8bca66cae9a.png "スクリーンショット 2015-06-05 9.37.07.png")



## 背景

[Deploy to Herokuボタン](https://devcenter.heroku.com/articles/heroku-button)はリリース時から興味がありました。
[syamo](https://github.com/ledsun/syamo)というアプリケーションを公開した時に反響がありませんでした。
gitlab & Chatworkな環境の人は居そうです。潜在需要はありそうでした。
Deploy to Herokuボタンを付ければ試しやすくなりそうです。

## 課題
秘密情報などの配置ごとに異なる情報の設定方法がわかりませんでした。
syamoの場合は、秘密情報は環境変数で与えています。
ですので、この場合は環境変数の設定方法です。
Deploy to HerokuボタンでHeroku上にアプリケーションを設置できても
環境変数をCLIで設定するのはイマイチです。

## 結論
初回配置時の設定画面で、手動で入力するパラメーターをapp.jsonで指定します。

## 実践

### app.json
アプリケーションの情報をapp.jsonに記載します。

```js:app.json
{
  "name": "syamo",
  "description": "web hook api for ChatWork",
  "repository": "https://github.com/ledsun/syamo",
  "keywords": ["web", "hook", "ChatWork"],
  "env": {
    "CHATWORK_TOKEN": "(YOUR_CHATWORK_TOKEN)",
    "GITLAB_URL": "(YOUR_GITLAB_URL)",
    "GITLAB_TOKEN": "(YOUR_GITLAB_TOKEN)"
  }
}
```

次の項目はpackage.jsonからコピーしました。

- name
- description
- repository
- keywords

envは環境変数名と値の候補（ダミー）を入れました。

[app.json](https://github.com/app-json/app.json)というapp.json作成用の補助ツールがあります。使ってもいいかもしれません。

```
app.json validate
```
だけはやりました。

### Deploy to Herokuボタンを設置

README.mdに次の行を足します。

```
[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy)
```

## 感想

簡単でした。Herokuすごい:sushi:

## 参考
- [橋本商会 » GyazzにDeploy to Herokuボタンを付けた](http://shokai.org/blog/archives/9262)
- [app.json Schema | Heroku Dev Center](https://devcenter.heroku.com/articles/app-json-schema)
Scalaでタプルのリストをソート


タプルのリストをソートしたいなぁ。

```scala
> Seq((4,1),(3,2),(2,3),(1,4)).sorted
List((1,4), (2,3), (3,2), (4,1))
```

できた。順序を逆転したいなぁ。

```scala
> Seq((4,1),(3,2),(2,3),(1,4)).sortBy{ case (x,y) => (-x, -y) }
List((1,4), (2,3), (3,2), (4,1))
```

sortWith使う場合は`scala.math.Ordering.Implicits._`をインポートしておかないと比較ができない

```scala
> import scala.math.Ordering.Implicits._
> Seq((4,1),(3,2),(2,3),(1,4)).sortWith(_ < _)
List((1,4), (2,3), (3,2), (4,1))
```

真偽値がまざっててもソートできるぜい。

```scala
> Seq((true,1),(false,2),(true,3),(false,4)).sorted
List((false,2), (false,4), (true,1), (true,3))
```

```scala
> Seq((true,1),(false,2),(true,3),(false,4)).sortBy{ case (x,y) => (!x,-y) }
List((true,3), (true,1), (false,4), (false,2))
```

`true`のほうが大きいことがわかる。

参考 http://stackoverflow.com/questions/11102393/how-to-lexicographically-compare-scala-tuples
DynamoDBいくらかかるの？なにがいいの？RDBじゃだめなの？

##### まずは、RDBと比べてDynamoDBが良さそうなところ
１、アマゾンが全部やってくれるので、サーバが落ちない。容量無制限。気にすること少ない。（スループット以外は　※後述）
２、スキーマレスだからテーブル設計が楽。テーブル変更が楽。
３、RDBより早い。

##### DynamoDBに向かない時
１、リレーションが必要な時。
２、トランザクションが必要な時。
３、多くのインデックスが必要な時。
４、多くのデータを一度に取り出す必要がある時。（スループットを多く用意しなければならず、高くなっちゃう）
５、明確なデータ構造が欲しい時

まとめると、データ構造が単純で、速さが欲しくて、多くの行数があり、一度に多くのデータを取り出さないという要件であれば、DynamoDBはすごくいい！

##### じゃあ、いくらかかるのという話（2015/6/2 時点）

１、読み込みスループット
２、書き込みスループット
３、保存容量
４、データ転送量
※４はあんまり気にならないくらい安いから、記述なし

###### １、読み込みスループット
２種類の読み込みがある。

(1)強い整合性 1KB / 1ユニット
(2)弱い整合性 1KB / 0.5ユニット
※ユニットとは、１秒間に利用する課金単位のこと

```
- 米国バージニアの場合の料金
5ユニット単価：$0.00065/1 時間
50ユニット単価：$0.0065/1 時間
500ユニット単価：$0.065/1 時間

50ユニット単価：$0.156/1 日
500ユニット単価：$1.56/1 日

50ユニット単価：$3.74/月
500ユニット単価：$37.4/月
5000ユニット単価：$374/月
```

###### ２、書き込みスループット

```
- 米国バージニアの場合の料金
書き込み→$0.0065 :10 ユニットの書き込み容量あたり/1 時間
10ユニット単価：$0.00065/1 時間
100ユニット単価：$0.0065/1 時間
1000ユニット単価：$0.065/1 時間

10ユニット単価：$0.156/1 日
100ユニット単価：$1.56/1 日

10ユニット単価：$3.74/月
100ユニット単価：$37.4/月
1000ユニット単価：$374/月
```

###### ３、保存容量
1GBあたり$0.25 / 月額
※25GBまでの無料ストレージあり

```
例（月額）、
1(GB) * $0.25 = $0.25
10(GB) * $0.25 = $2.5
100(GB) * $0.25 = $25
1000(GB) * $0.25 = $250
```

###### 利用計算例

１、１レコードあたりの平均アイテム容量を計算
２、書き込み、読み込みに必要なスループットを計算

※今回の私の事例

キュレーションメディアを作るにあたって、取得した記事の保存先をDynamoDBにした。

```
平均1アイテム容量；1.5KB -> ２ユニット
読み込み/秒間：50行 * 2ユニット * 20アクセス = 2000ユニット
書き込み/秒間：1行 * 2ユニット * 100アクセス = 200ユニット

読み込み/月額：$149.6 (15,000円ぐらい)
書き込み/月額：$74.8 (7,500円ぐらい)
合計/月額：$224.4 (22,000円ぐらい)
```
React + jQuery tablesorterでテーブルがソートされないときのワークアラウンド

Reactを使った時のテーブルソートは[Reactable](https://github.com/glittershark/reactable)があるけど、
事情により[tablesorter](https://github.com/christianbach/tablesorter)を使うことになってはまったのでメモ。

Reactによるテーブルの更新を通知してやる必要がある。


```js

var SomeComponentHasTable = React.createClass({

	componentDidMount: function() {
		//テーブルソートを有効化
		$(this.refs.table.getDOMNode()).tablesorter();
	},

	componentDidUpdate: function(){
		//更新を通知
		$(this.refs.table.getDOMNode()).trigger('update');
	},

	render: function(){
		return (<table ref="table"><thead>...</thead><tbody>...</tbody></table>);
	}
});
```
Linuxのプロンプトの表示を変更する


Linuxにログインすると出てくる以下ような表示がプロンプト。これの表記の変更をする。

```
[hoge@fuga ~]$
```


## 設定ファイルを開いて値を変更

```
$ vim ~/.bashrc
```

ファイルの1行目のPS1=となっているところを変更して表記を変える。とりあえずtest-app2となっているところをperaichi-app2に変更してみた。

### Before

```:~/.bashrc
PS1='\[\e[36m\]test-app2 \[\e[33m\]\t \[\e[31m]'
```

![スクリーンショット 2015-06-05 8.51.19.png](https://qiita-image-store.s3.amazonaws.com/0/18614/38960024-9f0a-6f2f-b37b-fa68718d1496.png "スクリーンショット 2015-06-05 8.51.19.png")

### After

```:~/.bashrc
PS1='\[\e[36m\]peraichi-app2 \[\e[33m\]\t \[\e[31m]'
```

![スクリーンショット 2015-06-05 8.52.38.png](https://qiita-image-store.s3.amazonaws.com/0/18614/dfb81f27-b459-4793-5b57-71fbac3adf5c.png "スクリーンショット 2015-06-05 8.52.38.png")

## 設定値や色など
以下のように表示したい設定値を入れておくと、自由に変えられる。


### 設定値

\d ： 日付
\h ： ホスト名（ドメイン名なし）
\H ： ホスト名（ドメイン名あり）
\s ： シェルの名前
\t ： 時間（24時間制 HH:MM:SS形式）
\T ： 時間（12時間制 HH:MM:SS形式）
\@ ： 時間（12時間制 HH:MM AM/PM形式）
\u ： ユーザ名
\w ： カレントディレクトリ
\W ： カレントディレクトリのベース名
\! ： コマンドの履歴番号を表示
\# ： コマンドのコマンド番号
\$ ： rootなら#、それ以外のユーザなら$を表示
\\ ： バックスラッシュ


### 色
0;30m   Black
0;31m   Red
0;32m   Green
0;33m   Yellow
0;34m   Blue
0;35m   Purple
0;36m   Cyan
0;37m   White
【小ネタ】PostgreSQLで最も出現する値（最頻値・モード）を取得する

# PostgreSQL で最も出現する値（最頻値・モード）を取得する方法
少し大きめのデータベースで、多数決で集約してくれと、気軽に鬼のような要望が来た。

データベースで再頻値を取得する方法は、これまでHAVING句とサブクエリを使用するなど、なかなか見かけがエクセレントにならなかった。
**PostgreSQL9.4**では集約関数も大幅に強化されており、最頻値も簡単に取得できるようになった。

```mode.sql
SELECT mode() WIHTHIN GROUP (ORDER BY カラム名) AS お好きな名前 FROM テーブル名
```

およそSQLとは思えない書き方だけど、ちゃんと出る。
たぶん、次回使う機会には確実に忘れると思うので、ここにメモ。

カラム名の代わりに計算式を書いても良い。
そこは普通のORDER BYと同じ。

しかし、ちょっと遅い。
インデックスと併用すると多少は速くなるのかもしれないが。
PHPの脆弱性を検出するソリューションを作る


##モチベーション
Webアプリの脆弱性を検出するアプリケーションをオープンソースで出せば、サポートで儲かるかなと思って作ります。
ちなみに、PHP言語とかの使い方を説明したものではなく、構想を描いたもので、PHPの勉強したい人が読んでも役に立たない可能性があるから注意

##脆弱性検出の原理
とりあえず、今考えているシステムは、機械学習によりソフトウェアの脆弱性を検出しようというもので、基本的にはMITライセンスのオープンソースで作ろうとしている。
機械学習においては、トレーニングセット、特徴抽出などが必要になる。僕は、脆弱性の種類ごとにそれぞれのトレーニングセット、特徴抽出をしようと思う。
こうなると、スキャンの時にかなりのコンピューティングパワーを使うことになりそうだが、まあ仕方がない。

##特徴抽出
とりあえず、SQLインジェクションの特徴抽出を書いていこうかと思う。
とりあえず、ファイルの中から$_GETのキーワードを検索する。これは、ユーザから入力されたもので、汚染されている可能性がある変数である。
　これを、この変数が伝播していく方向でトレースダウンして行って、どのような処理をされるかをベクトル化していくのである。
　これは、グラフを使って定式化することができるんじゃないかなと思っている。
　
##場合分け

まず、変数同士のつながりはいろいろと場合分けをすることができる。

つながりにはいろいろ種類がある。以下に場合分けをしていこう

###⑴関数呼び出しによる伝播

```(1)関数呼び出しによる伝播
func1($_GET['pass']);

function func1($param)
{
    .. = $param
}
```
関数呼び出しによる伝播は、パラメータ自体は変更されない。

###(2)メソッド呼び出しによる伝播

```(2)メソッド呼び出しによる伝播
class simpleclass
{
　　　public func2($param){
　　　     ..= $param
　　　}

}

$obj = new simpleClass();

$obj->func2($_GET['pass']);
```


###(3)代入による伝播
```(3)代入による伝播
$param = $_GET['pass'];

```

###(4)関数の帰り値による伝播

```
function func5()
{
	return $_GET['pass'];
}

$param = func5();
```

これらの「汚れた変数」の伝播をどのようなデータ構造で表すかが難しいところではある。

ここは、例えば、実際に入力するデータと出力を定義して、その後にテスト駆動開発により中身を開発していけばいいことがわかる。

では、実際に入力するデータを脆弱性データベースより持ってこようかと思う。

http://jvndb.jvn.jp/index.html


とりあえず、エイヤで決めてみる

http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-002829.html

これが脆弱性のあるソースコードの部分である
http://plugins.svn.wordpress.org/newstatpress/tags/0.9.8/includes/nsp_search.php

で、以下が修正されたやつ
http://plugins.svn.wordpress.org/newstatpress/tags/1.0.0/includes/nsp_search.php

脆弱性の部分は以下のようなところである
以下のソースコードは脆弱性のあるところを抜き出してある

```
   for($i=1;$i<=3;$i++) {
     if(($_GET["what$i"] != '') && ($_GET["where$i"] != '')) {
       $where.=" AND ".$_GET["where$i"]." LIKE '%".$_GET["what$i"]."%'";
     }
   }

```

```
   for($i=1;$i<=3;$i++) {   
     if(($_GET["what$i"] != '') && ($_GET["where$i"] != '')) {
       $where_i=esc_sql($_GET["where$i"]);
       $what_i=esc_sql($_GET["what$i"]);
       $where.=" AND ".$where_i." LIKE '%".$what_i."%'";
     }
   }

```

さて、トレースの起点はこの場合は\$_GETである。つまり、\$_GETパラメータが使われている部分を全部取り出してトレースする必要がある。

ちなみに、一つのファイルに複数の\$_GETが使われている可能性があるので、入力が一つのファイルだったとしても（複数のファイルの可能性もあるが）出力は複数である。

では、続きは別の回に
TreasureDataでHiveクエリを書くとき - TD_TIME_FORMAT,TD_TIME_PARSE,TD_DATE_TRUNC

# はじめに
Treasure DataはHiveの関数以外に独自関数を。。。（略

[ドキュメント：Supported Hive UDFs](http://docs.treasuredata.com/articles/udfs)

ドキュメントを見れば、ここから下は不要だ。

# TD_TIME_FORMAT
Treasure Dataのtimeカラムはunixtime型なので人間がわかる形に変換したい。変換するのにHiveの昔のバージョンですと変換関数でタイムゾーンを指定できなかったので独自関数として用意されたようです。

```sql:Signature
string TD_TIME_FORMAT(long unix_timestamp,
                      string format
                      [, string timezone = 'UTC'])
```

第二引数に指定されたフォーマットに変換されます。詳しくは[こちら](http://docs.treasuredata.com/articles/udf-time-formats)。

第三引数は[タイムゾーン](https://gist.github.com/frsyuki/4533752)を指定します。日本時間は"JST"と書きます。

### 利用例

```sql
TD_TIME_FORMAT(time,'yyyy-MM-dd HH:mm:ss z','JST')
-> 2014-10-04 09:24:52 GMT+09:00
```

```sql
TD_TIME_FORMAT(time,'MMMM d yyyy EEEE','JST')
-> October 4 2014 Saturday
```

# TD_TIME_PARSE
TD_TIME_FORMATの逆で、文字列→unixtimeに変換してくれます。変換するのに昔の...（略）

```sql:Signature
long TD_TIME_PARSE(string time
                   [, string default_timezone = 'UTC'])
```

### 利用例

```sql
TD_TIME_PARSE('2015-01-01','JST')
-> 1420038000
```

```sql
TD_TIME_PARSE('2015-01-01 15:25:26','JST')
-> 1420093526
```

# TD_DATE_TRUNC
期間を指定するときなどにその時刻を含むキリの良い時間を指定できる関数です。TD_TIME_FORMATを利用して下のように書いてもいいんですが、カッコ悪い。（以前はTD_TIME_PARSEの中でTD_TIME_FORMATを利用すると内部的にindexがいい感じになってなかったとか。。なんとか。）

```sql
TD_TIME_PARSE(TD_TIME_FORMAT(time,'yyyy-MM-dd HH:00:00','JST'),'JST')
```

そこでTD_DATE_TRUNCをりようして、キリのいい時間を取得します。

```sql:Signature
long TD_DATE_TRUNC(string unit,
                   long time
                   [, string default_timezone = 'UTC'])
```

第一引数に指定できるのは下記です。
- 'minute'
- 'hour'
- 'day'
- 'week'
- 'month'
- 'quarter'
- 'year'

### 利用例
'2015-01-01 15:25:26 JST'のunixtimeは1420093526ですが、hourを指定すると'2015-01-01 15:00:00 JST'に対応した時間を返してくれます。

```sql
TD_DATE_TRUNC('hour', 1420093526, 'JST')
-> 1420092000
```

すっきりかけましたね。

# まとめ
今回の３つの関数はよく使うので、タイムゾーンの設定を忘れないようね。
Promiseを使って、Whileとかmapで直列処理したい。

#前の処理の値を使いながら、直列に処理していきたい例

````promisetest.js
//もらった値に1を足して戻す関数
function A(m){
    return new Promise(
        function(resolve){
            setTimeout(function(){
                m++;//前の処理からもらった値を+1
                console.log(m);
                resolve(m);//+1した値を次の処理に渡す
            },Math.random()*1000)
        })
}

//10回繰り返してみる
var j=0;
//最初の一回目の処理
var p=A(0);
while(j<10){
    //以降promiseをつないでいく
    p=p.then(A);
    j++;
}

結果0 1 2 3 4 5 6 7 8 9
````
例えばWEBクローリングするプログラムで、リンクを順次たどっていく場合等に使用できるかな。

#複数ある関数を順次処理したい。
配列に入れちゃう？

````test.js

//もらった値に1を足して戻す関数
function A(m){
    return new Promise(
        function(resolve){
            setTimeout(function(){
                m++;
                console.log(m);
                resolve(m);
            },Math.random()*1000)
        })
}

//もらった値に2をかけて戻す関数
function B(m){
    return new Promise(
        function(resolve){
            setTimeout(function(){
                m*=2;
                console.log(m);
                resolve(m);
            },Math.random()*1000)
        })
}

var funcs=[A,B,A,B,B,A];
//プロミス保持用
var p;
funcs.map(function(func){
    if(!p){
        p=func(0);
    }else{
        p=p.then(func);
    }
})

結果: 1 2 3 6 12 13
計算経過で説明すると
A:0+1 = 1
B:1*2 = 2
A:2+1 = 3
B:3*2 = 6
B:6*2 = 12
A:12+1 = 13
````

Node.js + Mysqlの直列処理が目的で考えてみました。
(node.jsのmysqlに同期処理モードがないようなので。)

以上!
GIFアニメっぽいUIImageをつくる方法

iosでGIFアニメっぽい表現をしたい場合、ライブラリを使うなど方法はたくさんあるようですが、
最も(?)シンプルに実装する方法をメモしておきます。

``+ animatedImageWithImages:duration:``を使用することで、
簡単に複数画像をインターバルで表示するUIImageをつくる事ができます。

>参考
>[UIImage Class Reference](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIImage_Class/#//apple_ref/occ/clm/UIImage/animatedImageWithImages:duration:)

第一引数に``NSArray``、第二引数に``NSInterval``をとります。
画像リソースを格納した配列と、アニメーションしたい間隔を指定するだけ。簡単です。

というわけで、以下ソース

```objC:GIFAnime

NSArray *images = @[[UIImage imageNamed:@"image1"],
                    [UIImage imageNamed:@"image2"],
                    [UIImage imageNamed:@"image3"]];
UIImage *image = [UIImage animatedImageWithImages:images duration:1.0f];
```

この方法だと2秒、1秒、1秒みたいな変則的なインターバルは実現できませんが、
単調なGIFアニメならこの方法が一番簡単だと思います。

ちなみにGIFアニメ画像をそのまま使いたい場合などは、以下のライブラリで実装できます。

>[YLGIFImage](https://github.com/liyong03/YLGIFImage)

おわり
[JavaScript] postMessageでクロスドメインメッセージ通信

**原則、JavaScriptでは異なるドメイン間のAjax通信はできません。つまり、自サイトから他サイトのデータを取得することはできません。**

**HTML5では、異なるドメイン間でも安全にデータをやり取りできるよう、postMessage が用意されました。（両ドメインのサイトが postMessage を実装している必要があります）**

# ![](//goo.gl/78mjX8) コード例

基準サイトから外部サイトへメッセージを投げて、返信を受け取る場合のコード例です。外部サイトの window オブジェクトを必要とするため、iframe と併用されることが多いようです。

#### ＜基準サイト側＞

```html:基準サイト.html（抜粋）
<!-- 外部サイトへメッセージを投げるためのiframe -->
<iframe id="ifrm" src="http://外部サイト.com/xxx.html" style="display:none;"></iframe>

<script type="text/javascript">
// windowロードイベント
window.onload = function() {
	// iframeのwindowオブジェクトを取得
	var ifrm = document.getElementById('ifrm').contentWindow;
	// 外部サイトにメッセージを投げる
	ifrm.postMessage("HELLO!", 'http://外部サイト.com');
};

// メッセージ受信イベント
window.addEventListener('message', function(event) {
	alert(event.data); //'WORLD!'
}, false);
</script>
```

#### ＜外部サイト側＞

```html:外部サイトのxxx.html（抜粋）
<script type="text/javascript">
// メッセージ受信イベント
window.addEventListener('message', function(event) {
	// メッセージ送信元のサイトに返答する
	event.source.postMessage('WORLD!', event.origin);
}, false);
</script>
```

(･o･ゞ いじょー。

# ![](//goo.gl/78mjX8) 参考URL

▼Web Messaging API を使ってみる
http://qiita.com/naoiwata/items/0a31d999b2dcd5098289

▼postMessageとiframeでクロスドメインメッセージを送受信してみる
http://zafiel.wingall.com/archives/6631

▼クロスドメインで同じlocalStorageを使うテクニック
http://news.mynavi.jp/articles/2010/09/09/localstrage-on-many-domains/

▼PostMessageを使ったクロスドメイン通信によるメッセージの送受信とは？
http://the-zombis.sakura.ne.jp/wp/blog/2013/10/15/post-2031/

▼第3回　localStorageとpostMessageの使いどころ（2）
https://gihyo.jp/dev/serial/01/front-end_web/000302

▼JavaScriptでブラウザ上クロスドメイン通信のための手段
http://d.hatena.ne.jp/TipsMemo+computer-technology/20140401/p3
Bundler 1.10.Xを使うために

## TL;DR (能書きはいいから3行で)

改めて`gem install bundler`をすることで現状(2015-06-05現在)最新のBundler 1.10.3を使おう．

古いバージョンのBundlerがどうしても使いたいときは`bundle _1.9.9_ install`のようにBundlerのバージョンを指定して使うことが出来る(当然このときは`gem install bundler -v 1.9.9`されてることが前提)．

みんながまだ1.10未満しか使ってないなら気にしなくてもいいんじゃないかな．

## 何が起こったか

最近`gem install bundler`をしたばっかりの人が`bundle install`すると，どうも既存の`Gemfile.lock`に謎の差分(BUNDLED_WITHうんたらが追記される)が発生する．これってVCSで無視する設定になってないし(※gemのプロジェクトの場合は無視する設定)，コミットするのでいいんだよね？

…と思ってコミットをしてたら，どうも他の人が`bundle install`したときにそれが消える．何勝手にGemfile.lockに書き込んでるんだこんなもん自動生成されないだろ，って言われて自分の手元で再度`bundle install`をすると，やっぱりそれが追記される．

で，何が違うのか？と思ってよくよく見てみるとBundlerのバージョンがどうも`Gemfile.lock`に指定されるようになっていると気付く．この違いは1.10.0.pre.2からあるらしい．

さてどうしたものか？

問題なるのは，とにかく勝手にGemfile.lockが書き換えられるせいで，差分が生まれてしまって(※`git status`が綺麗じゃない状態になってしまって)，`git pull`とか`git checkout`とかに支障が出ること．

他にもファイルの更新検知がこれの書き換えのせいで誤作動することとか…

何にせよ，バージョン管理下に置かれるファイルが`bundle install`なんていう，cloneしてきて一番最初に実行しそうなコマンドで変更されてしまう，なんて状態が困らないわけがないわけで．

とりあえず言えることは，Bundler以外のgemは`Gemfile`と`Gemfile.lock`とBundlerというツールによってそれなりに正確に管理されるわけなのに，Bundler自体はRubyインストール直後に一回だけ`gem install bundler`で入れてそれっきり，なんて言う状態が良くない，っていうことなんじゃないでしょうか？

なので，出来る範囲で`gem install bundler`を再度実行して，Bundlerも最新にしてあげましょう，ということです．

そういう結論でいいんじゃないかと思います．

そしてそれだけだと「そうは言っても自分だけ更新するわけにもいかない．他の人が1.10未満を使ってるからそれに合わせないと．」という問題に遭遇している人に対してフォローがなさすぎるので，複数バージョンのBundlerを共有させて適宜切り替えつつ使う方法をば．

```sh
gem list | grep bundler #=> bundler (1.10.3, 1.9.9)

bundle version #=> 1.10.3
bundle _1.9.9_ version #=> 1.9.9
```

はい，上記のように`_1.9.9_`のような指定をつければ，Bundler自体のバージョンが切り替えられます．後は，

```sh
alias bundle='bundle _1.9.9_'
alias the-new-bundle='bundle _1.10.3_'
```

とかしておけば，デフォルトが1.9.9になって，新しい方のBundler使いたいときは`the-new-bundler install`とかすればいいようになるわけですね．

あとこの件についてのIssueを読んでると，結構炎上してる感じでした．基盤ツールとなるライブラリの作者さんも大変ですね

※でも私はどっちかって言うと「何が問題かについては何度も説明しただろ」「こういう状況で困るんだよ！」って騒いでた人の言ってることの方が共感出来ました．

英語得意じゃないので，誰かこのIssueとバージョン1.10系の今回の顛末をもっと上手くまとめられる方いらっしゃいましたら，まとめ直しお願いします(読みたいです)．

## References

* [Ruby - Bundler1.10.XからGemfile.lockの書式がちょっと変わってる件について - Qiita](http://qiita.com/HiromiKai_Green/items/09b33ec537cb4d9bc9c8)
* [bundler/CHANGELOG.md at master · bundler/bundler](https://github.com/bundler/bundler/blob/master/CHANGELOG.md#1100pre2-2015-05-07)
* [Do not update BUNDLED WITH if no other changes to the lock happened · Issue #3697 · bundler/bundler](https://github.com/bundler/bundler/issues/3697)
MacOSXにRuby on Railsをインストールしたときに詰まったこと

備忘録。
環境：Mac OS X 10.7.5 
作業は基本的に以下のサイトを参考に行った。

* [初心者でもできた！Ruby on Rails開発環境の構築方法（Mac編） | TechAcademyマガジン](http://techacademy.jp/magazine/4630)

#rbenv install -lしても最新版rubyが表示されない
インストール可能なrubyのバージョン一覧に古いバージョンしか表示されない。

**対策**
`$ brew upgrade ruby-build`
で解決。パッケージが古かったみたい。

#rbenv global xxxしてもrubyのバージョンが変更されない
`$ ruby -v`
でバージョン確認した結果とglobal設定したバージョンが異なる。

**対策**
`$ source ~/.bash_profile`
で設定を再読み込みすることで反映された。

#gem install railsでエラー
`libxml2 is missing.`と表示される。

**対策**
以下のファイルをインストールする。
`$ brew install libxml2 libxslt libiconv`
を実行。
`libiconv`インストール時に以下のエラーが出るけどとりあえず気にしない（だめかも）。

```lang:
Error: MD5 support has been dropped for security reasons.
Please switch this formula to SHA256.
```

さらに以下のコマンドで`nokogiri`をインストール。

```lang:
$ gem install nokogiri -- --use-system-libraries --with-iconv-dir="$(brew --prefix libiconv)" --with-xml2-config="$(brew --prefix libxml2)/bin/xml2-config" --with-xslt-config="$(brew --prefix libxslt)/bin/xslt-config"
```
これでいけたっぽい。
Wordpressでheader上部に余白ができたときの対処法 (リマーケティングタグ編)

Wordpressのheader上部に余白ができる現象が稀に起こります。
原因はheaderに全角スペースなどが入っていたりする単純なものから、今回私がかかったような複雑なケースもあるので備忘録として。

結論から今回はGoogleのリマーケティングタグの設置場所が原因でした。

参照: https://support.google.com/adwords/answer/2476688

<blockquote>リマーケティング タグ コードをコピーし、すべてのページの下部（終了タグ /body の前）に貼り付けます。</blockquote>

つまり、通常はfooterに設置するべき。
なのにheaderに設置していたため、そこが悪さをし余白ができていました。

リマーケティングタグをfooterに移動し、バグ修正完了！
git commit する前にコンフリクトの残りがないかチェックする

git でコンフリクトが起きて解消したつもりが、じつは「<<<<<<<」などが残っていてもコミットすることができます。HTMLなどだとエラーも発生しないので、気づいたら「git push origin master」していた...なんてことにならないように git commit する前にチェックするようにしてみました。

# 実行した結果

![スクリーンショット 2015-06-05 0.37.46.png](https://qiita-image-store.s3.amazonaws.com/0/21321/9fbacc96-d991-eca9-a7e1-8a882fa28775.png)

# 実際のソース

* .git/hooks/pre-commit.sample というファイルが実際には置いてあります。この中身は、すごく参考になります
* .git/hooks/pre-commit として下記のソースを置くとチェックしてくれて全て解消しないと、コミットできません。

```bash:.git/hooks/pre-commit
#!/bin/sh

if git rev-parse --verify HEAD >/dev/null 2>&1
then
	against=HEAD
else
	against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

# コンフリクトしたファイルを探す
# 該当のファイルは、赤文字で表示（Macで確認）
for FILE in `git diff-index --name-status $against | grep -E '\.*$' | cut -c3-`; do
	grep_result=`grep -E '(<<<<<<<|>>>>>>>)' $FILE | grep -v '^$'`
	if [ -n "${grep_result}" ]
	then
	    echo $'\e[1;31m'$FILE$'\e[m' ' <- コンフリクトの対応がのこっています'
		echo $grep_result
		exit 1
	fi
done

```
「AWS Summit Tokyo 2015」2日目

「2 tier architecture」これが気になっていたので、これに関するセッションに参加しました。

Machine Learning も Kinesis も「これだ！」っという使い方は思いつかない。。。
それは今まで、こんなサービスは、別世界の話だと思っていて、アンテナに全然引っかからなかったからだと思う。
でも、これからは違う。違うはずだ。無茶なことを言われた時に「それできますよ」っと言えるようになる気がする。


## 今日から始められる、機械学習！Amazon Machine Learningのご紹介

素人（プログラマー、SE）でも使える。
データを収集することが重要になるなー。
今までできないって思い込んでいたことができるようになると思うので、より柔軟な発想が必要になりそう。

![20150603-aws-dev03.png](https://qiita-image-store.s3.amazonaws.com/0/53620/f55daa01-6c08-e089-db71-6a3a8368cdc1.png)


## 日本最大の即レスサービス「アンサー」を支える Amazon DynamoDB

「DynamoDB は KVS。RDB ではない。」とうことが記憶に残った。
バックアップについて、今までの RDB とは違うことを考えないっということも覚えておく。
ほかのセッションでも言われていたが、AWS を利用することによって一番発想を転換する必要があるのは、バックアップなのかもしれない。

![20150603-aws-dev04.png](https://qiita-image-store.s3.amazonaws.com/0/53620/0a52714e-b57c-e702-5609-677c7c3c5610.png)


## Amazon Kinesis を利用したリアルタイム解析基盤「Grassland」

使ってみたい。Kinesis を使いたい。Grassland（https://grassland.biz/）も使いたい。
乗り遅れたくない。
まだ、よくわかってないけど、きっとすごいはずだー。

![20150603-aws-dev05.png](https://qiita-image-store.s3.amazonaws.com/0/53620/f4200862-68e4-8c47-d6dd-47b22d95fda9.png)


## AWS Mobile SDK 利用時のテスト手法

何をテストしたいのかを整理することができた。
興味のためか 2 tier architecture についてばかりメモしてた。
Mock と Stub については、Mobile に関係なく通常のWebアプリでも参考になるなー。

![20150603-aws-dev06.png](https://qiita-image-store.s3.amazonaws.com/0/53620/53afca44-10af-c744-8ad1-c0ff5b75c713.png)


## モバイル開発における AWS Lambda 活用法

2 tier architecture のキモは「Lambda」（と「Cognito」）だと勝手に思ってるので、いろいろ聞けてよかった。

一番は、コンソールからアップロードできるのわかってよかったけど、デプロイツールってないのかな。
ソース管理、リポジトリの単位、デプロイツール、ここら辺が気になるので、引き続き情報収集してこー。

![20150603-aws-dev08.png](https://qiita-image-store.s3.amazonaws.com/0/53620/137f2f9b-8f0d-f39d-232e-9a2f22b52103.png)
AnsibleからRubyをバージョン指定してインストールするだけのPlaybook

近頃は各々個人所有のPCを使ってチーム開発を行っているため、
たまに環境依存の問題が起きてめんどくさい。
そのためVagrantで仮想化してAnsibleを使って環境構築させることにした。
なおOSはCentOS6.5です。

ひとまずRubyのインストールをさせてみました。


```playbook.yml
---
- hosts: hosuto
  sudo: yes
  tasks:
    - name: ruby no install ni hitsuyou na rpm wo install shimasu
      yum: name={{item}} state=latest
      with_items:
        - gcc
        - zlib-devel
        - openssl-devel
        - sqlite
        - sqlite-devel
        - mysql-devel
        - libffi-devel
    - name: ruby no source file wo download shimasu
      get_url: >
        url=http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.6.tar.gz
        dest=/tmp/ruby-2.1.6.tar.gz
    - name: assyuku sareteiru ruby no sourcekaitou shimasu
      command: >
        tar xvzf ruby-2.1.6.tar.gz
        chdir=/tmp/
    - name: ruby configure shimasu
      command: >
        ./configure
        chdir=/tmp/ruby-2.1.6/
    - name: ruby make shimasu
      command: >
        make
        chdir=/tmp/ruby-2.1.6/
    - name: ruby make install shimasu
      command: >
        make install
        chdir=/tmp/ruby-2.1.6/
```

ruby --versionでちゃんと該当のRubyインストールできてるのが確認できた。
重複しているファイル名などは変数を使ってまとめて指定したほうが良いかもしれない。
あとcommand使う以外でもっときれいなやり方がありそう。

改善点ご存知の方は、コメントで指摘いただけると喜びます。


# 追記
2015/6/21: ソースからよりもrbenvでインストールした方が良いのとコメントをいただいたので、rbenvでインストールするエントリも書きました。
->  [AnsibleからRubyをバージョン指定してインストールするだけのPlaybook(rbenv版)](http://qiita.com/joytomo/items/f58dd53708f976f26a87)
Kobito for Windowsのデータを複数PCで共有する

ようやくWindows対応しましたね、Kobito。というわけで、Windows版でも複数PCでデータを共有したい！という欲求に駆られて、方法を調べました。あくまで改造なので、AYOR (At Your Own Risk) でお願いします。

方法としては、基本的にMac版と同じです。アプリケーションとは別の場所に作成されるデータベースを、シンボリックリンクを使ってDropboxなどのクラウドストレージで同期する、という流れ。

1. Kobitoを閉じる
1. データベース（C:\Users\ユーザー名\AppData\Roaming\KaitaBrowser2\IndexedDB以下）をDropboxなどの適当な場所にコピー
1. C:\Users\ユーザー名\AppData\Roaming\KaitaBrowser2\IndexedDBを削除
1. コマンドプロンプトを管理者権限で開く
1. 以下のコマンドでシンボリックリンクを作成する

    ```
    mklink /D C:\Users\ユーザー名\AppData\Roaming\KaitaBrowser2\IndexedDB C:\Users\ユーザー名\Dropbox\適当な場所
    ```
    
1. 同期できてハッピー！

設定などは同期されませんのでご注意ください。念のため、データベースは作業前にバックアップしておくのがいいでしょう。

それにしても、「KaitaBrowser」って何なんでしょうか……。Qiitaの逆がKaitaってことか。
Java 8 のラムダ式で JavaScript の即時関数っぽいこと

なんか思いついた。

```java:
import java.util.function.Supplier;

public class Main {

    private final String str = ((Supplier<String>) () -> {
        System.out.println("str を初期化します！");
        return "ほげほげ";
    }).get();
    
    public static void main(String... args) {
        Main main = new Main();
        System.out.println(main.str);
    }
}
```

```text:実行結果
str を初期化します！
ほげほげ
```

JavaScript と違って、スコープ定義のメリットは存在しない。

インスタンスイニシャライザやコンストラクタを利用することなく、 final なフィールドを個別に初期化できるくらいがメリット？（果たしてメリットと言えるかは微妙）

だいぶトリッキーな気がする。
CentOS7にdockerをインストール

勉強の一環でdockerを調べており、その際の手順を覚書で残していきたいと思います。
ちなみに使用しているOSは「**CentOS7**」です。

## dockerのインストール ##
> yum install -y docker

## dockerサービスの起動 ##
> systemctl start docker

## dockerサービスの有効化 ##
> systemctl enable docker

## DockerレジストリからDockerイメージをダウンロードする ##
> docker pull {イメージ名} : {タグ名}

## ダウンロードしたDockerイメージの一覧を確認する ##
> docker images

## Dockerコンテナを作成・実行する ##
> docker run [オプション][--name {コンテナ名}] {イメージ名}[:{タグ名}][コンテナで実行するコマンド][引数]
主なオプション 
　　-d : バックグラウンドで実行する（後述）。既定では、コンテナーをフォアグラウンドで実行するため、Webサーバーやアプリケーションサーバーなど常時実行するコンテナーで指定。
　　-i : コンテナーの標準入力を開く。/bin/bashなどでコンテナーを操作する際に指定する。
　　-t : tty（端末デバイス）を確保する。/bin/bashなどでコンテナーを操作する際に指定。
　　-p : ｛ホストのポート番号｝:｛コンテナーのポート番号｝：Dockerサーバーのホストとポートマッピングを構成

## Dockerコンテナの一覧を取得する ##
> docker ps [-a]
> -a : 停止中のコンテナも表示されます。

## dockerコンテナの起動 ##
> docker start {コンテナ名}

## dockerコンテナへの接続
> docker attach {コンテナ名}

## Dockerイメージを作成する ##
> docker commit {コンテナ名} | {コンテナID} [{ユーザ名} /]{イメージ名}

## Dockerコンテナを削除する ##
> docker rm {コンテナ名} | {コンテナID}

## Dockerイメージを削除する ##
> docker rmi {イメージ名} | {イメージID}

## 余談 ##
ちなみにまだQiitaを使用し始めなので、投稿の方法が分かりにくかったりしてるのでそこはおいおい慣れていければと思っています。
とりあえず次回は作成したdockerのコンテナ上にPostgresqlをインストールしてみたいと思います。
(実際は既に取り組んではいますが、苦戦しているのでうまくいったらアップします。)
Groonga読書会7で学んだ事のメモ


## はじめに

この文章は、[Groongaドキュメント読書会7](https://groonga.doorkeeper.jp/events/25268)で学んだ事のメモです。
元のテキストで分からなかった事を中心に書きました。

## [4.7.3. カラムインデックスによる関連テーブルをまたぐ検索](http://groonga.org/ja/docs/tutorial/match_columns.html#full-text-search-against-multiple-columns)

本文中のクエリ`select Articles --match_columns comment.content --query groonga --output_columns "_id, _score, *"`の意味。

- `select Articles`は、Articlesテーブルを検索結果とする。
- `--match-columns comment.content`は、Articles.comment(つまりCommentsテーブル)のcontentカラムをマッチ対象（検索する)カラムとする。
	- この時、CommentテーブルにArticleテーブルへの転置インデックスがある事を確認している。Commentを検索→紐づくArticlesを検索結果とするため。
	- このため、転置インデックス(Comments.article)がないと、Commentを検索した後にArticlesを辿れなくなる。これがドキュメントでいう「Commentsテーブルの'article'カラムインデックスを生成するクエリをコメントアウトすると、意図した検索結果が得られません。」。
- `--query groonga`は、 **groonga**という文字列を検索する。
- `--output_columns`は出力するArticlesテーブルのカラムを指定する。
 
# 気づいた事

- データの状態と検索の動きを理解するためには、図で書かないと分からない。
    - RDBMSだと、そういう時はテーブル定義の絵を書くが、Groongaの場合、実際のデータがどう入っているかを書いた方がイメージしやすい気がした。
- 参照カラムとインデックスカラムがごっちゃになりやすい。要整理。

# 用語
- ポスティングリスト
	- 転置インデックスのkeyに対応する、レコードのリスト。
meteorでhasMany,belongsToなモデルを定義する

# MVVMのスタンダードとしてのMeteor
MVVM系フレームワークを色々試してる@kyouzyuuuuuuuuu1です。みなさんはスタンダードを見つけられたでしょうかね？MeteorはMVVM入門時に使っていて、最近になってangular-meteorがいい感じにクールなので再入門中です。

Meteorはあらゆる面で素早く作成できるのですが、コレクション同士のリレーションはイマイチでした。それを改善する機能があったので紹介します。
# Transformを使って関連を定義
```
Comments = new Mongo.Collection('comments')
Posts = new Mongo.Collection('posts',{
  transform:function(doc){
    doc.comments = Comments.find().fetch()
    return doc
  }
})
```
結論からいうとこんな感じです。この例ではPostのなかにCommentの全てを突っ込んでますが、findのQueryをつかって絞り込むこともできます。$inとかを使って。
このほかにも関連を定義する方法はいくつかあり、MeteorではRailsのようなガチガチの定義をしなくてもスラっとできちゃいますね。
PHPWarriorで学ぶ役に立たないPHP芸 その2 #phpwarrior


RubyWarriorをPHPに移植したPHPWarriorのコーディング例を題材にした記事の第二回目です。
[yandod/php-warrior](https://github.com/yandod/php-warrior) (スターを頂けると嬉しいです。)

前回の記事はこちら
[PHPWarriorで学ぶ役に立たないPHP芸 その1 #phpwarrior - Qiita](http://qiita.com/yando/items/ba2344e709af690440bc)


今回はBeginnerの塔、3Fを題材にします。

```
 ---------
|@ s ss s>|
 ---------

  > = Stairs
  @ = tanaka (20 HP)
  s = Sludge (12 HP)
  s = Sludge (12 HP)
  s = Sludge (12 HP)
  s = Sludge (12 HP)
```

3Fはスライムが多数控えており、状況に応じて体力の回復を行う必要があります。具体的には次のようなアビリティが戦士に備わっています。

- $warrior->walk();
	- 指定された方向へ移動する。(前方がデフォルト)
- $warrior->feel();
	- 指定された方向の空間を取得する。(前方がデフォルト)
- $warrior->attack();
	- 指定された方向のユニットを攻撃する。(前方がデフォルト)
- $warrior->health();
	- あなたの体力を表す数値を取得する。
- $warrior->rest();
	- 体力を最大値の10％回復する。ただし他の行動はできない。

体力の減少を検知すればいいだけなので、少し分岐を加えれば対処できます。

```php
<?php
class Player {
  public function play_turn($warrior) {
    if ($warrior->feel()->is_enemy()) {
      $warrior->attack();
    } elseif ($warrior->health() < 20) {
      $warrior->rest();
    } else {
      $warrior->walk();
    }
  }
}
```

さて、今回はifに加えて switchも使わずにコーディングしてみます。

```php
<?php
class Player {
  public function play_turn($warrior) {
    return (
      $warrior->feel()->is_enemy() ?
      $warrior->attack() :
      (
        $warrior->health() < 20 ?
          $warrior->rest() :
          $warrior->walk()
      )
    );
  }
}
```

PHPerならみんな大好き三項演算子を制御に使ってみました。一つ余分な括弧が付いているのはPHPのマニュアルにあるこの挙動が理由です。

	三項演算子は左から右へ順に評価されるからです。
http://php.net/manual/ja/language.operators.comparison.php#language.operators.comparison.ternary

括弧を外すなら次のようになります。

```php
<?php
class Player {
  public function play_turn($warrior) {
    return (
      $warrior->feel()->is_enemy() ?
      $warrior->attack() && false:
      $warrior->health() < 20 ?
      $warrior->rest() && false :
      $warrior->feel()->is_empty() ?
      $warrior->walk() :
      false
    );
  }
}
```

強烈な読みにくさです。実際にどのような動きをするかはぜひ試してみてください。この記事をなんとなく見ただけでもコピペをせずに一回で解くのは骨が折れると思います。

ちなみにこのような試行錯誤をする際には

	phpwarrior -t 0

のようにしてウエイトを切るとすぐに結果がでます。

PHPWarriorをまだインストールしていない場合は下記のコマンドでどうぞ。

	compoer global require "yandod/php-warrior"
gulpポリスに怒られないタスクの書き方：自動bowerインストール編


タスクの中でbower install的なことをしたかった話。

## ダメだった方
最初に目についた`gulp-install`というのを使ってざっくり下記な感じでやってみた。

が、これが癖者。finishのイベントのハンドリングがうまくいかない
 
```bad-case.js
gulp.task('install', function(cb){
  gulp.src(["./bower.json"])
    .pipe(install())
    .on('finish', function(){
      cb();
 	 });
  });
});
```

## もっかい調べてみる。

調べると類似で`gulp-bower`なんかを見つけたりした。
が、ここでひとまず落ち着いて[blacklist](https://github.com/gulpjs/plugins/blob/master/src/blackList.json)を見てみる。

`gulp-install`と`gulp-bower`、どっちも載っている。
これではgulpポリスに怒られてしまう。

## なおす
gulp-installについては `"use gulp-spawn"`だそうな。

今回やりたい事はbowerを自動でインストールしたいというところなので、`gulp-bower`あたりをみる。

```
"use the bower module directly"
```

なるほど。bower直接使えと。

[bowerの公式](http://bower.io/docs/api/#programmatic-api)を見ながらこんな感じで書いてみる

```bower-directory.js
gulp.task('install', function(cb){
  bower.commands.install()
    .on("log", function(log){
      gutil.log(log.message);
    })
    .on("end", function(){
      cb();
    });
});
```

なるほど。うまく動いたっぽい。

## 締め
blacklist、普段はあのやり方好きじゃないなーと思って最初見てなかったけど、今回は普通に役に立った。