OmniAICreator/Qiita-1.07M huggingface dataset:
PHPの配列について

#はじめに
自分自身は一昨年までの10年近くにわたって主にC言語やC++を使って数値計算や画像処理などの仕事をしていて、そこからWeb分野に移るために去年からPHPを勉強し始めたのですが、PHPを勉強して最初に新鮮に感じたのが配列の扱いに関しての自由さでした。
そこで、今回はPHPの配列で特に知っていることを主に初心者向けに簡単にまとめてみました（自分が以前ブログに書いた内容とほぼ変わらないですが）。

#初期化
空の配列を初期化する時は

```
$data = array();
```

とします。PHPに慣れていると当たり前に思えるかもしれませんが、C言語では

```
int data[10];
```

という風に最初にデータ型とサイズを指定しなければいけませんでした。サイズを可変にする時はポインタを使って宣言して、後でmallocで必要な領域分だけ確保することもできますが、後でfreeしなければいけなかったり、色々と扱いに苦労する点も多々ありましたが、PHPではその必要もありません（C++のvectorなら最後に領域を解放しなくても大丈夫ですが）。

値を入れて初期化する時は

```
$data = array(2, 3, 5);
```

のようにします。
なお、PHP5.4からは

```
$data = [];
$data = [2, 3, 5];
```

のようなやり方での初期化もできるようになっています。

#要素の追加
```
$data[3] = 7;
```
のような普通のやり方ももちろんできますが、現時点での要素数が分からなくても

```
$data[] = 7;
```

みたいに簡単に要素を追加することもできます。
C++のvectorでは

```
data.push(7);
```

のようにしていましたが、PHPでもarray_pushという関数を使って

```
array_push($data, 7);
```

みたいにもできます。自分は楽なので普段は[]=を使っていますが。

#要素の削除
こちらはarray_spliceという関数を使います。

```
$data = [2, 3, 5, 7];
array_splice($data, 1, 2);
```

とすると$data[1]から2つ要素が削除されます。
上の処理を行った結果は

```
echo $data[0]; //2
echo $data[1]; //7
```

となります。

配列の要素を削除する関数は他にもunsetというのがあります。例えば$data[1]を配列$dataから取り除きたい時は

```
$data = [2, 3, 5, 7];
unset($data[1]);
```


とします。ただしこちらはインデックスには作用しないので結果は

```
echo $data[0]; //2
echo $data[2]; //5
echo $data[3]; //7
```

です。$data[1]にアクセスするとエラーになります。
インデックスをちゃんとした並び順にする時はunsetの後に

```
array_values($data);
```

とする必要があります。

#連想配列
PHPでは配列の要素に整数以外を入れることもできます。つまり、連想配列とほぼ変わらない使い方ができます。
例えば、こんな感じです。

```
$data['Tokyo']     = 'Japan';
$data['Vientiane'] = 'Laos';
$data['Manila']    = 'Philippines';
```

のようなこともできます。
他にも配列の値を配列にして多次元配列みたいにすることもできます。

#配列用関数
これまででいくつか出てきていますが、PHPには配列操作のために用意された便利な関数がたくさんあります。
例えば、

```
$data = [2, 3, 5, 7];
echo count($data);  //4
```


というように配列の要素数を返す関数が代表例です。
また、ある要素が配列に含まれているか調べるin_arrayという関数もあります。

```
$data = [2, 3, 5, 7];
echo in_array(3, $data);  //true
echo in_array(4, $data);  //false
```

他にもたくさんあるので、どんなものがあるのか知りたい方は[PHP公式サイトのページ](http://php.net/manual/ja/ref.array.php)を見ていただければと思います。


#まとめ
ここまで書いていて、C言語やC++しか知らなかった頃の自分からすると「PHPの配列ってvectorとmapのいいとこ取りですごいなー」と思うかもしれない。とはいえ、便利さの裏にはちゃんと何をやっているか意識して使わないと訳わからないことになっちゃったりする恐れもあるので、そこは気をつけておくべきなんだとは思いますが。
逆に言うと、CやC++の型定義の厳密さやポインタにもそれはそれでメリットがあるのもまた確かではありますね。
どんな言語でも配列というものはデータを扱うのに用いる一番基本的な道具だと思うので、その言語の特性を生かした使い方をするのが大事なんだろうなと思います。
networkxで有方向グラフを使う

[NetworkX](https://networkx.github.io/)は、グラフを扱うためのPythonのpackageです。

NetworkXの有方向グラフ`DiGraph`の中の特定のノードに関係する他のノードを取得する方法を最近知ったので後々のために書いておこうと思います。

想定する有効グラフはこんな感じです。
![chartfornetwrkx (3).png](https://qiita-image-store.s3.amazonaws.com/0/147872/9b655bea-cb81-33ac-5273-d36f48872012.png)

ここで、ノードCを中心に考えると、BはCの親で、DはCの子です。
また、AとBはCの先祖で、DとEはCの子孫です。

ではまず、NetworkXをインポートして、空の有方向グラフを作成します。

```pycon
>>> import networkx as nx
>>> g = nx.DiGraph()
```

次に、上の図のグラフを`add_path`で作成します。パスを作成するとノードは明示的に追加しなくても作成できているようです。

```pycon
>>> g.add_path(["A","B","C","D","E"])
>>> g.nodes()
['E', 'C', 'D', 'A', 'B']
```

ここで、Cの親と子を取得するには、グラフgのメソッド`predecessors`と`successors`を使います。親や子はそれぞれ複数ある場合もあるので、結果は`list`で返されます。

```pycon
>>> g.predecessors("C")
['B']
>>> g.successors("C")
['D']
```
一方、Cの先祖や子孫を取得するには関数`descendants`と`ancestors`を使います。結果は`set`で返されます。

```pycon
>>> nx.descendants(g, "C")
{'D', 'E'}
>>> nx.ancestors(g, "C")
{'A', 'B'}
```

親や子の場合はメソッドで結果は`list`で返され、先祖や子孫の場合は関数を使い、結果は`set`で返されるといった違いがあるので注意が必要です。
素人の言語処理100本ノック:82


[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

## 第9章: ベクトル空間法 (I)
>[enwiki-20150112-400-r10-105752.txt.bz2](http://www.cl.ecei.tohoku.ac.jp/nlp100/data/enwiki-20150112-400-r10-105752.txt.bz2)は，2015年1月12日時点の英語のWikipedia記事のうち，約400語以上で構成される記事の中から，ランダムに1/10サンプリングした105,752記事のテキストをbzip2形式で圧縮したものである．このテキストをコーパスとして，単語の意味を表すベクトル（分散表現）を学習したい．第9章の前半では，コーパスから作成した単語文脈共起行列に主成分分析を適用し，単語ベクトルを学習する過程を，いくつかの処理に分けて実装する．第9章の後半では，学習で得られた単語ベクトル（300次元）を用い，単語の類似度計算やアナロジー（類推）を行う．
>
>なお，問題83を素直に実装すると，大量（約7GB）の主記憶が必要になる． メモリが不足する場合は，処理を工夫するか，1/100サンプリングのコーパス[enwiki-20150112-400-r100-10576.txt.bz2](http://www.cl.ecei.tohoku.ac.jp/nlp100/data/enwiki-20150112-400-r100-10576.txt.bz2)を用いよ．

### 82. 文脈の抽出
>81で作成したコーパス中に出現するすべての単語tに関して，単語$ t $と文脈語$ c $のペアをタブ区切り形式ですべて書き出せ．ただし，文脈語の定義は次の通りとする．
>
>- ある単語$ t $の前後$ d $単語を文脈語$ c $として抽出する（ただし，文脈語に単語tそのものは含まない）
>- 単語$ t $を選ぶ度に，文脈幅$ d $は{1,2,3,4,5}の範囲でランダムに決める．

#### 出来上がったコード：

```python:main.py
# coding: utf-8
import random
fname_input = 'corpus81.txt'
fname_output = 'context.txt'

# 1行ずつ処理
with open(fname_input, 'rt') as data_file, \
		open(fname_output, mode='wt') as out_file:
	for i, line in enumerate(data_file):

		# 1語ずつ処理
		tokens = line.strip().split(' ')
		for j in range(len(tokens)):

			t = tokens[j]					# 単語t
			d = random.randint(1, 5)		# 文脈幅d

			# 前後d語以内の語の列挙
			for k in range(max(j - d, 0), min(j + d + 1, len(tokens))):
				if j != k:
					print('{}\t{}'.format(t, tokens[k]), file=out_file)

		# 経過表示
		if i % 10000 == 0:
			print('{} done.'.format(i))
```

#### 実行結果：

結果ファイル「context.txt」の先頭部分です。

```console:context.txtの先頭部分
Anarchism	is
Anarchism	a
Anarchism	political
Anarchism	philosophy
is	Anarchism
is	a
is	political
a	is
a	political
political	Anarchism
political	is
political	a
political	philosophy
political	that
political	advocates
philosophy	is
philosophy	a
philosophy	political
philosophy	that
philosophy	advocates
philosophy	stateless
that	is
that	a
that	political
that	philosophy
that	advocates
that	stateless
that	societies
that	often
（以下略）
```

全体は[GitHub](https://github.com/segavvy/nlp100_Python/tree/master/82)にアップしようかと思いましたが、約800MBになってしまったので断念しました。以降の問題もちょっとデータが大きいので、アップするのはやめておきます。

### 周辺の単語の抽出
[問題80の「単語の何をベクトルにするのか」](http://qiita.com/segavvy/items/ea485e66dd96eee891da#単語の何をベクトルにするのか)にも書いたように、単語をベクトルに変換する際はその周辺の単語の情報を使います。今回の問題はその準備作業になります。結果の1カラム目の単語をベクトル化する際に、2カラム目の単語の情報を使います。

実装自体は難しくないのですが、なぜ文脈幅を5で一定にせず毎回ランダムに揺らすのかは良くわかりませんでした。処理する情報量を減らすためかな...

　
83本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
<hr>

*実行結果には、[100本ノックで用いるコーパス・データ](http://www.cl.ecei.tohoku.ac.jp/nlp100/#data)で配布されているデータの一部が含まれます。この第9章で用いているデータのライセンスは[クリエイティブ・コモンズ 表示-継承 3.0 非移植](https://creativecommons.org/licenses/by-sa/3.0/legalcode)（[日本語訳](https://creativecommons.org/licenses/by-sa/3.0/deed.ja)）です。*
Excel内の文字列に正規表現で色をつける

Excelでソースコード張り付けたけど、コメントだけは目立たない色に変えたい、とか、強調したい単語に色を付けたいことはありませんか？
簡単な色付けなら置換でできますが、少し複雑になるとExcelだと厳しい状況だと思います。
ということで、「正規表現で色をつける」ためのアドイン`excel-regex-colorize`というのを作った(≒作ってあった)ので紹介してみます。

# これは何？

Excelのアドインで正規表現で色をつけることができます。
Excel 2010で動作確認してますが、たぶんExcel 2013以降でも動くと思います。

# で、どういう動き？

こんな感じです。

![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/63649/d280c31a-df7d-fa7e-7c97-fcc88acdb207.gif)

例えば、Perlのソースコードのコメント部を灰色にしたい場合、RegExpに`#.*`と入力して灰色にすると良いと思います。
また、正規表現ではないですがRegExpに`\-`とすることで抹消線を付けている個所に色を付けることができます。
こちらも、灰色とかにして目立たなくしたり、とかで幸せになれるかもしれません。

# ダウンロード

以下からダウンロードできますので、良かったら試してみてください。

https://github.com/sago35/excel-regex-colorize
StackOverflowで自分のお気に入りの中で検索するには

何か分からない事があった時に英語で検索すると、かなりの確率で[StackOverflow](http://stackoverflow.com/)のQAがヒットします。

後々参照したいQAは自分のアカウントのfavoritesに登録しておくのですが、登録件数が多くなって、favoritesの中を検索する必要が出てきました。
どうやるかを調べた結果、`infavorites:mine` を検索Boxに追加して、自分のfavorites内を検索できました。

他にも便利そうな検索キーワードが[こちらのHelpページ](http://stackoverflow.com/help/searching)にまとまっています!
さくらVPS初期設定〜gitプロジェクト動作確認まとめ

## はじめに
個人的にサービスをあげる時にどうしたものかと試行錯誤したことをまとめておくための記事になります。

## サーバーの選定
いろいろと見て回ったのですがそもそもレンタルサーバーだとroot権限がないとやりたいことがうまくできないという初歩的なことも知らずいろんなところと契約をしてしまいました。
最終的にはよく聞く[さくらのVPS](http://vps.sakura.ad.jp/specification/)に落ち着きましたが値段的には[ServersMan@VPS](http://dream.jp/vps/service.html)がよかったなーとも思う今日この頃。。

## やりたかったこと
Laravelの導入とかLAMP環境構築をシェルにまとめたからサーバーにgit cloneして簡単に環境構築できるぜヒャッハー！
結果は上記の通り…

## 手順
### 1. 初期設定
作業場所：ローカル＋サーバー
[こちら](http://qiita.com/aild_arch_bfmv/items/99dd58fc6be84f87a075#5-ssh%E3%81%AE%E8%A8%AD%E5%AE%9A)の記事の通りに進んでいきます。
3と7は不要だったのと独自で行ったので省きました。
また、5のport設定を変更するとsshできなくなったので変更していません。

### 2. Laravel導入
作業場所：サーバー
[こちら](http://w.builwing.info/2015/03/23/%E3%81%95%E3%81%8F%E3%82%89%E3%81%AEvps%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%ABlaravel%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)の記事の通りに進んでいきます。
ComposerとLaravelはシェルでインストールしているので省きました。
Redisも使う予定がなかったので省きました。
httpd.confの修正で初期起動ページの設定をしています。（初心者の私にはローカルのをどうやってサーバーで動かすかわからなかったので目から鱗でした）

### 3. .envの設定
作業場所：サーバー
[こちら](http://qiita.com/CyberMergina/items/857f63e6d20f8958ee1f#db%E6%8E%A5%E7%B6%9A)の記事のDB接続を参考に設定します。
今回はMySQLだったので**#書き換え**の部分とDB_HOSTを書き換えました。
DB_HOSTはVPSのIPを記入

### 4. VIMの設定
日本語が文字化けしていたので

```
vi ~/.vimrc
作業場所：サーバー
# 以下ファイルに記載
set encoding=utf-8
set fileencodings=iso-2022-jp,euc-jp,sjis,utf-8
```
PowerShell で Project Euler 4

# 問題

* 本家：[Problem 4 - Project Euler](https://projecteuler.net/problem=4)
* 翻訳：[Problem 4 - PukiWiki](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%204)

> 左右どちらから読んでも同じ値になる数を回文数という. 2桁の数の積で表される回文数のうち, 最大のものは 9009 = 91 × 99 である.
> では, 3桁の数の積で表される回文数の最大値を求めよ.

# 素直に

```.ps1
3 |
    % {
        # i ≦ j となるような３桁の数 i, j の積のうち
        foreach ($i in [Math]::Pow(10, $_ - 1)..([Math]::Pow(10, $_) - 1))
            {foreach ($j in $i..([Math]::Pow(10, $_) - 1))
                {($i * $j).ToString()}}
    } |
    ? {
        # 回文数になっているもので
        foreach ($k in 0..([Math]::Floor(($_.Length - 1) / 2)))
            {if ($_[$k] -ne $_[$_.Length - 1 - $k])
                {return $false}}
        $true
    } |
    % {$max = 0} {$max = [Math]::Max($max, [int]$_)} {$max} # 最大のもの
```


# 回文数を大きい方から生成して、３桁の積か確認する

1桁の場合も正確に回答できるようにするとやや面倒。

```.ps1
3 |
    % {
        $n = $_

        ([Math]::Pow(10, $n) - 1)..[Math]::Pow(10, $n - 1) |
            %{"$_" + -join "$_"[("$_".Length - 1)..0]}

        if ($n -eq 1)
        {
            9..0 | %{$_.ToString()}
        }
        else
        {
            ([Math]::Pow(10, $n - 1) - 1)..[Math]::Pow(10, $n - 2) |
                % {
                    $i = $_.ToString()
                    9..0 | %{"${i}${_}" + -join $i[($i.Length - 1)..0]}
                }
        }
    } |
    ? {
        foreach ($k in ([Math]::Pow(10, $n) - 1)..[Math]::Pow(10, $n - 1))
            {if (([int]$_) % $k -eq 0 -and "$(([int]$_) / $k)".Length -eq $n)
                {return $true}}
        $false
    } |
    select -first 1
```


# 見つけた回文数によってループの範囲を狭める

```.ps1
3 |
    % {
        $max = $max_j = [Math]::Pow(10, $_ - 1)

        for ($i = ([Math]::Pow(10, $_) - 1); $i -ge $max_j; $i--)
        {
            :j for ($j = $i; $i * $j -ge $max ;$j--)
            {
                $n = ($i * $j).ToString()

                foreach ($k in 0..([Math]::Floor(($n.Length - 1) / 2)))
                {
                    if ($n[$k] -ne $n[$n.Length - 1 - $k])
                        {continue j}
                }

                $max, $max_j = ($i * $j) , $j
            }
        }

        $max
    }
```

# 以上

おわり。
[iOS10] Today Extension (Widget)できること、できないこと

iOS10のToday Extension (Widget)を調査したときのメモです。

# できること
* ウィジェットだけiOS10対応
    * ウィジェットのDevelopment Targetで10.0を指定すれば、ウィジェットだけiOS10対応にできます。
    * 本体アプリがiOS9.0以上対応になっていた場合、iOS9で動作させるとウィジェットが表示されません。


# できないこと
* ウィジェットだけiPhoneのみ対応
    *  本体アプリがUniversalになっていると、ウィジェットのDevicesでiPhoneを指定してもUniversalで動作します。
PowerShell で Project Euler 3

# 問題

* 本家：[Problem 3 - Project Euler](https://projecteuler.net/problem=3)
* 翻訳：[Problem 3 - PukiWiki](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%203)

> 13195 の素因数は 5, 7, 13, 29 である.
> 600851475143 の素因数のうち最大のものを求めよ.

# 素直に

```.ps1
600851475143 | %{
    for ($r, $n, $p = $_, $_, 2; $p * $p -le $n; $p++)
        {while ($n % $p -eq 0)
            {$r, $n = $p, ($n / $p)}}

    if ($n -ne 1) {$n} else {$r}
}
```

# おわり

高速な素因数分解のコードを書く技量はない。
PowerShell で Project Euler 2

# 問題

* 本家：[Problem 2 - Project Euler](https://projecteuler.net/problem=2)
* 翻訳：[Problem 2 - PukiWiki](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%202)

> フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.
> 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
> 数列の項の値が400万以下の, 偶数値の項の総和を求めよ.


# 素直に

```.ps1
4000000 |
    %{for ($1, $2 = 1, 2; $1 -le $_; $1, $2 = $2, ($1 + $2)) {$1}} |
    ?{$_ % 2 -eq 0} |
    %{$s = 0} {$s += $_} {$s}
```

# 複雑に

```.ps1
4000000 |
    % {$sqrt5 = [Math]::Sqrt(5); $phi = (1 + $sqrt5) / 2} `
      {$n = [Math]::Floor([Math]::Log($sqrt5 * $_, $phi) + ($phi - 1) / $_)} `
      {([Math]::Round([Math]::Pow($phi, ($n - $n % 3 + 2)) / $sqrt5) - 1) / 2}
```

このプログラムを導出するにあたり必要そうな知識は下記の通り。ただし、問題文と違って（$F_1 = F_2 = 1$としている点に注意）


* $F_n = \left \lfloor \frac{\phi^n}{\sqrt{5}} + \frac{1}{2} \right \rfloor$
    * フィボナッチ数列の一般項でググれば $\phi$ についてと、証明が出てくる。

* $n \approx \log_{\phi} (\sqrt{5} F_n)$
    * 一般項を使った近似を $n$ について解けば出てくる。
    * あくまで近似なので問題に合わせて微妙に補正して使う。
        * プログラムでは $\frac{\phi - 1}{F_n}$ を足して補正している。
        * なお、補正しないと $F_{6 n}$ が入力のときに誤答する。

* フィボナッチ数列 $F_n$ が偶数になるのは $n$ が 3 の倍数であるときのみ
    * 数学的帰納法を使えばすべての自然数 $n$ について $F_{3n-2}, F_{3n-1}$ が奇数、 $F_{3n}$が偶数であることがわかる。

* $\sum_{k = 1}^{n} F_k = F_{n + 2} - 1$
    * $F_{n + 2} - \sum_{k = 1}^{n} F_k = F_{n + 2} + F_{n + 1} - (\sum_{k = 1}^{n} F_k + F_{n+1}) = F_{(n + 2) + 1} - \sum_{k = 1}^{n + 1} F_k$ より、 $F_{n + 2} - \sum_{1}^n F_k = F_{1 + 2} - \sum_{k = 1}^1 F_k = 2 - 1 = 1$ 

* $\sum_{k = 1}^{n} F_{3 k} = \frac{1}{2} (F_{3n + 2} - 1)$
    * $\sum_{k = 1}^{n} F_{3 k} $
     $= \sum_{k = 1}^{n} (F_{3 k} + F_{3 k - 1} + F_{3 k - 2}) - \sum_{k = 1}^{n} (F_{3 k - 1} + F_{3 k - 2})$
     $= \sum_{k = 1}^{3 n} F_k - \sum_{k = 1}^{n} F_{3 k}$ より、
     $2 \sum_{k = 1}^{n} F_{3 k} = \sum_{k = 1}^{3 n} F_k = F_{3n + 2} - 1$

# 以上

複雑な解答は近似値を使っているので、すべての入力に正しい解を返すか不安がある。
PowerShell で Project Euler 1

# 問題

* 本家：[Problem 1 - Project Euler](https://projecteuler.net/problem=1)
* 翻訳：[Problem 1 - PukiWiki](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%201)

> 10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.
> 同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.

# 素直に

```.ps1
1000 |
    %{1..($_ - 1)} |
    ?{$_ % 3 -eq 0 -or $_ % 5 -eq 0} |
    %{$s = 0} {$s += $_} {$s}
```

# 倍数の個数の求め方と総和の公式を使って

```.ps1
1000 |
    %{
        $n = $_ - 1
        $s3, $s5, $s15 = 3, 5, 15 | %{[Math]::Floor($n / $_)} | %{$_ * ($_ + 1) / 2}
        3 * $s3 + 5 * $s5 - 15 * $s15
    }
```


# 無駄に複雑に

```.ps1
1000 |
    %{
        $n = [Math]::Floor(($_ - 1) / 15)
        $m = ($_ - 1) % 15 | %{[Math]::Floor($_ / 3) + [Math]::Floor($_ / 5)}
        15 * $n * (7 * $n + 1 + 2 * $m) / 2 + @(0, 3, 8, 14, 23, 33, 45)[$m]
    }
```

これについては、見た目が謎すぎなので補足しておく。
任意の整数$n$は整数$k, r$を使って下記の通り表せる。

$$n = 15 k + r ~ (0 \le r \lt 15)$$

$15 k$ 以下の自然数のうち、3 もしくは 5 の倍数になっている数の合計は下記で求まる。

```math
\begin{align}
&  \sum_{k = 1}^{\lfloor 15 k / 3 \rfloor} 3 k
+ \sum_{k = 1}^{\lfloor 15 k / 5 \rfloor} 5 k
- \sum_{k = 1}^{\lfloor 15 k / 15 \rfloor} 15 k \\
&= 3  \sum_{k = 1}^{5 k} k
+ 5  \sum_{k = 1}^{3 k} k
- 15 \sum_{k = 1}^{k} k \\
&= 3 \frac{5 k (5 k + 1)}{2}
+ 5 \frac{3 k (3 k + 1)}{2}
- 15 \frac{k (k + 1)}{2} \\
&= 15 k \frac{7 k + 1}{2}
\end{align}
```

あとは、$r$ の分が不足しているので、場合分けして補正してやると解が求まる。


# 以上

おわり
HaskellでServer::Starterを使う

[Server::Starter](https://metacpan.org/release/Server-Starter) を Haskell で利用するためのライブラリを書きました。 [warp](https://hackage.haskell.org/package/warp) で動かすWEBアプリでも、 `start_server` コマンドを使った hot-deploy が可能になります。とりあえず github にのみ上げました。

https://github.com/hiratara/hs-server-starter

以下でサンプルプログラムまで含めてビルドできます。

```
$ git clone git@github.com:hiratara/hs-server-starter.git
$ cd hs-server-starter/
$ stack build --flag hs-server-starter:example
```

## 使い方

https://github.com/hiratara/hs-server-starter/blob/master/app/server-starter-warp-example.hs を見てください。

`Network.ServerStarter.Socket` を `import` して、 `listenAll` を呼び出すと `listen` 状態の `Socket` が返ってきます。この `Socket` は `Server::Starter` の管理下にある接続であり、これを利用することでホットデプロイが可能になります。 `warp` で使うのであれば、 `runSettingsSocket` 関数に渡すことでこの `Socket` に対して `accept` させられます。

## 使用例: PerlのWebアプリをHaskellのWebアプリに無停止で差し替える

普通はWebアプリの新しい版をアップロードして、無停止で新しい版に差し替えれるよってことをやるのですが、今回はあえて変な例でやってみます。  `start_server` はここでは `Perl` で実装されたオリジナルのものを利用するものとします。

`Server::Starter` は Perl と `cpanm` コマンドの環境を整えた上で `cpanm Server::Starter` で導入できます。また今回の例の中で使うため、 `cpanm Starlet` でついでに Perl のWEBアプリケーションサーバである [Starlet](https://metacpan.org/pod/Starlet) も導入しておきます。

`app.sh` を以下の内容で作ります。このシェルは `Starlet` で動く簡単なアプリを立ち上げるものです。

```bash
#!/bin/sh
exec plackup -s Starlet -e 'sub { [200, [], ["Hello, perl.\n"]] }'
```

`start_server` を使ってこのアプリを起動します。

```shell-session
$ start_server --port 12345 -- ./app.sh
start_server (pid:29812) starting now...
starting new worker 29827
...
```

http://localhost:12345 へアクセスすると、ページが見えるはずです。

```shell-session
$ curl http://localhost:12345
Hello, perl.
```

`Server::Starter` を使うと、システムを停止することなくオンラインのままこのアプリを `warp` で動く Haskell の実装に差し替えることができます。 `app.sh` を以下のように編集します。

```bash
#!/bin/sh
exec stack exec server-starter-warp-example
```

ここではまだ、 http://localhost:12345 は `Starlet` で動くPerlのアプリがレスポンスを返しています。ここで、サーバを差し替えるために `start_server` のプロセスに `-HUP` シグナルを送ります。PIDは `start_server` の起動直後のログでわかります。

```shell-session
$ kill -HUP 29812
```

もう一回 http://localhost:12345 へアクセスしてみると、サーバが切り替わっていることがわかります。

```shell-session
$ curl http://localhost:12345
Hello, Web!
```

簡単ですね！

ただし、Haskellではファイルディスクリプタを `O_NONBLOCK` にする必要があるため、今回のようにブロッキングなファイルディスクリプタと共用させるとトラブルの元ですので十分注意が必要です[^1]。

[^1]: ブロックしない `accept` で待つのでPerl側のWebアプリがCPU使い潰したり。深追いしてないけどgolang版だと問題起きなそうだった。

## golang実装

`start_server` コマンドには [golang の実装](https://github.com/lestrrat/go-server-starter) もあり、 `go get github.com/lestrrat/go-server-starter/cmd/start_server` でインストールできます。当然 golang 版の `start_server` コマンドを使っても同じことができます。

Perl版とgolang版はコマンド名が完全に同じであるため、両方インストールして挙動を見るときはどちらの実装を使っているか気をつけて検証してください。
Shiny Serverで操作結果をURLに渡す方法

## 目的
- 掲題の件でいい方法が探したが見つからなかったので自力解決
- もし、もっといい方法があったら教えて欲しい

## 困ってたこと
- ShinyServerでReactiveなアプリを書いてみたものの、その結果URLが変わらないため、参考にしてよ〜といったURLをコピペして渡せなかった。
- この方法結構探したが見つからなかった
- 引数をURLで渡す方法があるが、その場合UIで渡した値をgetparameterが上書きしてしまうので、違う方法を探していた

## やったこと
- [Bookmarking state
](https://shiny.rstudio.com/articles/bookmarking-state.html)に準拠

```R:global.R
## global.R ##に以下追加
enableBookmarking(store = "url")
```
```R:server.R
## 引数にsession情報追加しつつ、observeですべての操作でbookmark関数動かす
server <- function(input, output, session) {
  observe({
    # Trigger this observer every time an input changes
    session$doBookmark()
  })
  onBookmarked(function(url) {
    updateQueryString(url)
  })
}
```

## observerとは？
An observer is like a reactive expression in that it can read reactive values and call reactive expressions, and will automatically re-execute when those dependencies change. But unlike reactive expressions, it doesn't yield a result and can't be used as an input to other reactive expressions. Thus, observers are only useful for their side effects (for example, performing I/O)

## 参考
- [ShinyServerで引数をURLから与える](http://deta.hateblo.jp/entry/2014/04/16/075403) 
- [Getting Non-Input Data From the Client](http://rstudio.github.io/shiny/tutorial/#client-data)
- [Bookmarking state
](https://shiny.rstudio.com/articles/bookmarking-state.html)

あくまでもbookmarkするためのものを使っただけなので、もっといい方法があると思うが、いったんメモとして残しておく。
Babel でお手軽モダン Hubot 開発

Babel を使ってお手軽に ES201x でモダンな Hubot 開発を行えるようにしてみました。

# TL;DR
1. Configure your hubot following [necojackarc-sandbox/hubot-babel-es201x](https://github.com/necojackarc-sandbox/hubot-babel-es201x)
2. Code your Hubot scripts in `src/bot` directory with Babel ES201x

# プロローグ
偶然にも ChatOps 用の Bot を作ることになった俺達は、
CoffeeScript で書かれ時代に取り残された Hubot に遭遇したのだった……。

……。

…………。

Hubot の最終コミットが10ヶ月前になってて少し焦りました。

* [github/hubot](https://github.com/github/hubot)

パッと調べても[^1]いい感じの代替ツールが見つからなかったので、この更新頻度は安定の証、枯れたプロダクトだと信じて Hubot を使うことにしました。

ただし、CoffeeScript は流石にもう書きたくないので、Babel を利用して ES201x で書けるようにします。

[^1]: [12+ Frameworks to Build ChatOps Bots](http://nordicapis.com/12-frameworks-to-build-chatops-bots/)

# お手軽度
Babel しか使わないのでかなりお手軽です。
また、Babel の設定もスッキリ少なめです。

# 仕組み
Hubot は `src/scripts` と `scripts` にある、`.coffee` と `.js` ファイルを自動的に読み込みます。

ここにあるファイルは以下のようなファイルフォーマットであることが期待されます。

```coffee
module.exports = (robot) ->
  # your code here
```

要は Hubot 用のスクリプトファイルです。

これを踏まえ、今回は以下のようなディレクトリを追加しました。

| ディレクトリ | 説明 |
| --- | --- |
| dist | トランスパイル後のファイル置き場 |
| src/bot | ES201x で書かれた Hubot スクリプト置き場 |
| src/lib | ES201x で書かれたファイル置き場[^2] |

簡単に流れを説明すると、

1. src 以下で ES201x で開発を行う
2. dist 以下に src 以下のファイルをトランスパイルし吐き出す
3. scripts で dist/bot 以下のトランスパイルされた Hubot スクリプトを読み込む

となります。

[^2]: Hubot スクリプト以外の JavaScript ファイル置き場として準備しました

# 設定手順
まずは [Getting Started With Hubot](https://hubot.github.com/docs/) に従い、Hubot を作成します。

次に Babel と必要なプリセット等を導入します。

```bash
$ npm install -D babel-cli babel-polyfill babel-preset-env
```

Babel の設定を `.babelrc` に記述します。

```json:.babelrc
{
  "only": [
    "src"
  ],
  "presets": [
    ["env", {
      "targets": {
        "node": "current"
      }
    }]
  ]
}
```

ビルドコマンドを `package.json` に追加します。

```json:package.json
{
  "scripts": {
    "build": "babel src -d dist"
  }
}
```

scripts に dist に吐き出された Hubot スクリプトを読み込むコードを追加します。

```scripts/index.js
'use strict';

const fs = require('fs');
const path = require('path');

const ROOT = "./dist/bot";

const stripExtension = path => path.split('.').slice(0, -1).join('.');

module.exports = (robot) => {
  fs.readdirSync(ROOT).forEach((dir) => {
    require(path.join('..', ROOT, dir)).default(robot);
  });
};
```

最後に必要なディレクトリを作成して設定完了です。

```bash
$ mkdir -p src/bot src/lib
```

# サンプルスクリプトによる動作確認
試しに、以下の Hubot スクリプトを `src/bot/konosuba.js` に配置して動かしてみます。

```js:src/bot/konosuba.js
export default function(robot) {
  robot.hear(/アクア/, (res) => {
    res.reply('駄女神');
  });
}
```

`bin/hubot` で起動すると、

```bash
hubot-babel-es201x> アクア様
hubot-babel-es201x> Shell: 駄女神
```

無事、動きました！
ubuntu 16.04 で google-chrome

新しくインストールした ubuntu16.04 に google chrome をインストールしたときのうろ覚え．deb パッケージ利用．
# 1. 依存パッケージのインストール
どこで依存パッケージを調べればよいのかわからなかったので，下記サイトを参考に依存パッケージをインストール．
[Ubuntu 16.04 にGoogle Chromeをインストール](http://robotics4society.com/2016/06/16/ubuntu-chrome/)
```
foo@host:~$ sudo apt-get install libappindicator1
```
 
# 2. deb パッケージのダウンロード
https://www.google.co.jp/chrome/browser/desktop/
上記サイトから，google-chrome-stable_current_amd64.deb をダウンロード．

# 3. google-chrome インストール
```
foo@host:~/Downloads$ sudo dpkg -i google-chrome-stable_current_amd64.deb 
```
下記のようなエラー発生でgoogle-chrome起動しない．
```
Errors were encountered while processing:
 google-chrome-stable
```
下記コマンドで不足しているパッケージをインストールして依存関係修復？
```
foo@host:~$ sudo apt-get install -f 
```
下記のパッケージがインストールされた．
```
libpango1.0-0 
libpangox-1.0-0
```

無事にgoogle-chrome使えるようになって解決．
初めからこれらをインストールしておけば多分エラーはかれない？

依存パッケージって皆さんどこで調べてるのでしょう？
リポジトリが壊れてPHPアップデートが出来なくなった時の対処方

## 症状

Vagrant上のCentOS6.5のPHPを7系にしようと思って、epel と remi 入れて yum install したらこんなエラーが出てひえーってなりました。

```
yum install --enablerepo=remi,remi-php70 php
..(省略)..
Error: xz compression not available
```
うっそん…。
調べてみると、どうやらリポジトリが壊れているらしいとのこと。

## 原因
確かにね、CentOS6系なのにこれ叩いちゃったので、多分これが原因だと思います。

```
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
```
## 対処方
結論から言うと、

１．キャッシュ削除
２．epel と remi 削除
３．入れ直す

これで治りました。

## 手順
####１．キャッシュ削除
これしないとね、epelとremi消してもさっきのエラー出たまんまだったんですよ。
なのでこれ最初にします。

```
rm -rf /var/cache/yum/x86_64/6/epel
```

####２．epel と remi 削除
```
yum remove epel-release
```
これでremiもろとも消してくれました。

####３．入れ直す
```
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```

####４．で、PHP入れてみる
```
yum install --enablerepo=remi,remi-php70 php
..(省略)..
Complete!
php -v
PHP 7.0.16 (cli) (built: Feb 14 2017 17:31:34) ( NTS )
```

入った！
よかった…。

## 参考
http://qiita.com/Kuragasaki/items/847db63febd8e16456ab
http://serverfault.com/questions/675802/xz-compression-not-available-yum-error-on-centos
TensorFlowで１次関数を予測(3) … ミニバッチ

チュートリアルの１次関数の予測をネタとしていろいろ試してみます。

前回と同様、下記の直線を予測します。

```math
y=0.5x+10
```

学習には、以下の種類があるらしいです。

訓練データひとつずつ使用・・・オンライン学習
訓練データすべてを使用・・・バッチ学習
訓練データから一部を選んで使用・・・ミニバッチ学習

チュートリアルでは訓練データすべてを使用していたので、バッチ学習でしょうか。
今回は、ミニバッチで学習してみます。

##ソース

```py
import tensorflow as tf
import numpy as np

np.random.seed(seed=32) # シード (種) を指定、発生する乱数をあらかじめ固定する（測定のため）

## 学習データ作成（x座標をランダムに作成(0.0〜1.0を100個)
x_data = np.random.rand(100).astype(np.float32)
# y座標を生成 (y = 0.5x + 10)
y_data = 0.5 * x_data + 10

## モデルを作成（y_data = W * x_data + b となる W と b の適正値を見つけます。
x_ = tf.placeholder(tf.float32, shape=[None, 1])
y_ = tf.placeholder(tf.float32, shape=[None, 1])
W = tf.Variable(tf.zeros([1, 1]))
b = tf.Variable(tf.zeros([1]))
y = tf.matmul(x_, W) + b

## 損失関数を作成（最小二乗法を使用
loss = tf.reduce_mean(tf.square(y - y_))

## 最適化アルゴリズムを指定（勾配降下法で損失関数を最小化
optimizer = tf.train.AdamOptimizer(1)
train = optimizer.minimize(loss)

## パラメータを初期化（Variableを使用する場合必要らしい
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

## 学習する
batch_size = 20 # バッチサイズ
for step in range(200):
    # ランダムなindexを作成（0〜学習データのサイズをバッチの個数分
    rnd_idx = np.random.randint(0, x_data.size, batch_size)
    x_batch_data = x_data[rnd_idx].reshape(batch_size, 1)
    y_batch_data = y_data[rnd_idx].reshape(batch_size, 1)
    sess.run(train, feed_dict={x_: x_batch_data, y_: y_batch_data})
    if step % 20 == 0:
        print(step, sess.run(W), sess.run(b))
```

測定時の差分をなくすため最初に`np.random.seed(seed=32)`で
乱数の種を固定しています。

##結果

###バッチサイズ1（オンライン学習）

```
step W b
0 [ 1.] [ 0.99999988]
20 [ 7.06871223] [ 8.41462135]
40 [ 3.96863031] [ 8.00734711]
60 [ 1.58839536] [ 8.59520626]
80 [ 0.61793894] [ 9.73549461]
100 [ 0.40156782] [ 10.096591]
120 [ 0.43321908] [ 10.05368233]
140 [ 0.48158637] [ 10.00192833]
160 [ 0.49636325] [ 9.99834824]
180 [ 0.5013358] [ 9.99777508]
```

###バッチサイズ5（ミニバッチ学習）
```
step W b
0 [ 1.] [ 0.99999988]
20 [ 5.80828667] [ 8.09599781]
40 [ 3.27099919] [ 9.08414268]
60 [ 1.33084488] [ 9.45936298]
80 [ 0.60776621] [ 9.88074303]
100 [ 0.43642431] [ 10.04355145]
120 [ 0.45859516] [ 10.02548981]
140 [ 0.49456775] [ 10.00613308]
160 [ 0.502379] [ 10.00013828]
180 [ 0.50175482] [ 9.9994936]
```

###バッチサイズ20（ミニバッチ学習）
```
step W b
0 [ 1.] [ 1.]
20 [ 6.15904236] [ 8.29144859]
40 [ 3.32724142] [ 8.98768711]
60 [ 1.18161225] [ 9.33158493]
80 [ 0.53098202] [ 9.83389091]
100 [ 0.43710515] [ 10.02393532]
120 [ 0.46652189] [ 10.02241516]
140 [ 0.4972609] [ 10.00498962]
160 [ 0.50444597] [ 9.99849892]
180 [ 0.50116104] [ 9.99929047]
```

あまり変わりませんね。
このくらい簡単な予測だと効果ないのかもしれません。
ElasticBeanstalk で puma-rails 環境作った後に「An unhandled lowlevel error occured. The application logs may have details」って出た時の対策

`secret_key_base` の設定漏れが原因

```:config/secrets.yml
# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
```

環境変数 `SECRET_KEY_BASE` を設定する

```
eb setenv SECRET_KEY_BASE=`bundle exec rake secret`
```

# 参考

- https://gist.github.com/koudaiii/2dc9175c330af8b5dcde
object 基本形　var2   if() for()

```js
    var w = 1;

    var m = 1;

    var tasu = w + m;

    var content = {
        name: "m",
        greet: function() {
            if (tasu <= 5 && tasu === 2) {
                console.log(this.name + " " + "wow");
            } else if (tasu <= 10) {
                console.log(this.name + " " + "yes");
            } else {
              return;
            }
        }
    }
    content.greet();

    var loop = {
        name: "r",
        great: function() {
            for (w = 0; w <= 10; w++) {
                console.log(this.name + " " + w);
            }
        }
    }

    loop.great();
```

それでは、参考までに
cakephp3 belongsTohasMany で 中間テーブルを条件にデータを取得



メインテーブル を 2つ。

Users
id name

Writers
id name

中間テーブル
UsersWriters

id name type(これで条件を指定してデータを取得したい)



それぞれ関連付け

UsersTable.php

```

$this->belongsToMany('Writers', [
'joinTable' => 'users_writers',
'foreignKey' => 'writer_id'
]);

```


WritersTable.php

```

$this->belongsToMany('Users', [
'joinTable' => 'users_writers',
'foreignKey' => 'writer_id'
]);

$this->hasMany('UsersWriters', [
'foreignKey' => 'writer_id'
]);

```


中間テーブル
UsersWritersTable

```

$this->table('users_writers');
$this->belongsTo('Users');

```


で適当なコントローラーで

```

$res = $this->Writers->find()
->matching('UsersWriters', function ($q) {
return $q
->where(['type' => 0])
//                    ->contain([
//                        'Users' => function ($q) {
//                        return $q->contain(['Sites']);//さらにサイト情報を読み出す場合
//                    }
//                    ]);
})

->first();

```


こんな感じで中間テーブルを条件にデータを読み出せる。
Cloud9でphp.iniのtimezoneを変更する

cloud9を利用していてdate()を使ったところ、timezoneの設定がどうやら違うようだ。

Cloud9のタイムゾーンを日本時間（JST）に変更する
http://qiita.com/ShunjiKato/items/af561134fe159521e2c0

こちらを参考に直すと、ターミナル上でdateコマンドを実行するとタイムゾーンがきちんと修正されているが、phpinfo()のDefault timezoneはUTCのままである。
```/etc/php5/apache2/php.ini```
を書き換えて再起動をかけても変更が反映されていない。

怪しいところを調べてみたところ
``` sudo vi ./php5/mods-available/c9.ini```

ここを書き換えてあげる事で、修正できた。
[baserCMS] パーミッション変更

baserCMSを本番サーバに設置する時、パーミッションを変更する際の確認リスト。
※ サーバ環境によって異なる場合もあるので参考までに。

□ /.htaccess（/app/webroot/.htaccess）に書込権限付与する（666）
□ /app/Config/install.php に書込権限付与する（666）
□ /app/db のフォルダと配下のファイル全てに書込権限付与する（777）
□ /app/tmp のフォルダと配下のファイル全てに書込権限付与する（777）
□ /files（/app/webroot/files） のフォルダと配下全てに書込権限付与する（777）
□ /theme/THEME_NAME/Page（/app/webroot/theme/THEME_NAME/Page） のフォルダと配下全てに書込権限付与する（777）
Brackets初心者のメモ

# Bracketsを使ってみる

普段、エディタにはDreamweaverを使っていますが、最近、自宅環境のAdobe CC のライセンスが切れたのと、Dreamweaver CC 2017 からコードエディタ部にBracketsが取り込まれ刷新したのもあって、代替としてBracketsを導入してみることにしました。

自宅環境

- Windows7 Home SP1(32bit)


## インストール

公式サイト：http://brackets.io/

※2017/3/12現在1.8が最新版ですが、インストール後、機能拡張を導入しようとすると「インストールは失敗しました。不明な内部エラー」というエラー（インストールボタン・zipドラッグ共に）が出るバグ？のため、一度1.8をアンインストールし、改めて1.7をインストールしました。
ただし、ネット検索したところ出回ってる情報が少なかったので環境による症状である可能性が高いです。

今回入手したインストーラー「Brackets.Release.1.7.msi」
DLページ（1.7）： https://github.com/adobe/brackets/releases/tag/release-1.7

- インストーラをダブルクリックして起動。
- 「Brackets Destination Folder」画面でインストール先を指定。
- [Add "brackets" launcher to PATH for command line use] [Add "Open With Brackets" to Explorer context menus for all files and folders]チェックボックスはオン（デフォルト）、[Next]ボタンで次へ
- [Install]ボタンでインストール。
- インストールが終わったら[Finish]で完了。

初回起動時「このプログラムの機能のいくつかが Windowsファイアウォールでブロックされています」というアラートが出るので、[プライベートネットワーク（ホーム ネットワークや社内デットワークなど）]チェックをオン（デフォルト）にして[アクセスを許可する]クリック。
「利用可能なアップデートがあります」ウインドウでアップデートを促されますが、1.8は上記不具合が出たので今回は[キャンセル]


## 設定

各設定のデフォルト値はdefaultPreferences.jsonに記述されており、設定をカスタマイズする場合はbrackets.jsonを編集します。
ショートカットや機能拡張の設定などもこのjsonファイルに記述するようです。

参考：[Bracketsの機能紹介、使い方解説](http://qiita.com/assialiholic/items/c8137321c7599a168b16)

インストール時のデフォルト

```ruby:brackets.json
{
    "fonts.fontSize": "12px",
    "fonts.fontFamily": "'SourceCodePro-Medium', ＭＳ ゴシック, 'MS Gothic', monospace",
    "themes.theme": "dark-theme"
}
```

コードインデントを設定してみる。

- メニュー[デバッグ] > [環境設定ファイルを開く]でbrackets.jsonを開く。
- jsonファイルに設定をを追記していく。
- "spaceUnits": 2, … インデント変更(スペース2つ)
- "livedev.multibrowser": true, … クロスブラウザでのライブプレビュー有効
- "maxCodeHints": 30, … コードヒント最大表示数
- "dragDropText": true, … テキストのドラッグ＆ドロップ移動を有効

```ruby:brackets.json
{
    "fonts.fontSize": "12px",
    "fonts.fontFamily": "'SourceCodePro-Medium', ＭＳ ゴシック, 'MS Gothic', monospace",
    "themes.theme": "dark-theme",
    "spaceUnits": 2,
    "livedev.multibrowser": true,
    "maxCodeHints": 30,
    "dragDropText": true
}
```

末尾プロパティには「,（カンマ）」を付けないよう注意（エラーになります）。

その他の設定は機能拡張インストール後に行う予定。


## 機能拡張

実務で効率的に作業するには機能拡張が必須。
必要に応じたものを選びインストール。


### 機能拡張インストール方法

http://www.webdesign-mania.info/2016/03/brackets-extensions.html#i

- メニュー [ファイル] > [機能拡張マネージャー…] で開く
- [入手可能]タブの一覧から任意のものを選択し[インストール]ボタン


## 機能拡張をインストール

http://qiita.com/assialiholic/items/c7962f804cdb21a49327
http://brriant.hatenadiary.jp/entry/2015/08/06/224857

下記をインストールしてみました。

- Extensions Rating：機能拡張のレーティングを表示。機能拡張を選ぶ参考になる。
- Shizimily Multi-Encoding for Brackets：Shift_JIS/EUC-JP等、utf-8以外の文字コード対応
- Indent Guides：インデント表示。インストール後、メニュー[表示]>[Indent Guides]で有効に。
- 全角空白・スペース・タブ表示：名前のまま。
- Custom Working：タブ・ブクマ・ファイルアイコン・ファイルツリー等の機能を追加。設定参考 http://creating-homepage.com/archives/5023
- Overscroll：最終行より下までスクロール可能にして見やすく。
- WD Minimap：SublimeText風ミニマップ。
- Emmet
- Autoprefixer：CSS保存時に必要プレフィックスを自動付与。メニュー{編集}>{Auto prefix on save]で有効に。
- colorHints：ファイル内で一度使用したCSSカラーをコードヒント表示。
- Interactive Linter：HTML/CSS/JavaScripit構文チェック


## 最後に

当面これで使ってみます。
作業しつつ、必要に応じて機能拡張を追加や設定を見直し、自身の環境に合せてカスタマイズしたいと思います。
vagrant共有フォルダ設定でファイルをリアルタイム同期させる

# やりたかったこと
vagrant(VirtualBox)上で動作するCentOS7の/Vagrantと、ホストOSのローカルフォルダを【リアルタイム】で同期させたかった。

# ハマったところ
以下の書きっぷりではリアルタイム同期しなかった。（vagrant upが発生するタイミングでのみ同期）
`config.vm.synced_folder ".", "/vagrant"`

# 解決方法
以下の書きっぷりに変更。
`config.vm.synced_folder ".", "/vagrant",type:"virtualbox"`

# 考察
vagrantのフォルダ同期はデフォルトでrsyncで実装されてるっぽい。
なのでVirutlbox側の実装であるvboxsfを用いるように設定変更した。

vboxsfを使うにはプラグイン"vagrant-vbguest"が必要みたい。（自分の環境では導入済み）

rsyncを使ってリアルタイム同期をかけることもできるけど、現状だとホスト→ゲストの一方向でしか同期をかけてくれない。VirutlBoxを用いる環境においては、type:"virtualbox"をつけてあげるのがよさそう。
aws codecommit aws: command not found

**codecommitに一から慣れようと思って操作していたらいきなりつまずきました。もしかしたらこんな方達がいるかもと思いその時の対策を書きます**

**※以下2行ほどの追記※**
ちなみに[AWSのcodecommit使い方。アクセスキー作るところからなど。](https://qiita.com/sachiko-kame/items/dff732276dffd22e7682)では最初から最後まで書かさせていただきました。:sunflower:


- codecommitを使う前にcilをインストールする

cilをインストールするにはpythonのpipが必要になってくるので先にそれをインストールします。
```curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
```
```sudo python get-pip.py
```
次にそのpip使ってcilをインストールします。
```sudo pip install awscli
```
…ここまではうまく行ったんです。ここから秘密鍵とか公開鍵とか登録しようと思ったら。
aws: command not found　が出てきたんです。

で、色々調べたら
```sudo pip install awscli --ignore-installed six
```
とういうコマンドを見つけたので打ってみました。
そしたら！！！
```aws configure
```
が打てて色々登録できる状態になりました。:sunny:

ちなみにこれができたのでなんとなく--ignore-installed sixを打って検索してみたところ何かがインストールされていてできないのをこのコマンドがカバーしてくれる的なことで書いてありました。なるほどです。

あとこのコマンドを見つけたのはawsのサイトなので一応URL貼らさせていただきます。
http://docs.amazonaws.cn/en_us/cli/latest/userguide/installing.html
clickevetからclassをつけて外して

```js
    var clickTarget = document.querySelector("selector").addEventListener("click", function() {
        var ele = document.querySelector('selector');
        var clazz = ele.classList;
        clazz.toggle("class");
    }, false);
```

または

```js
    var clickTarget = document.querySelector("selector");
        this.addEventListener("click", function() {
        var ele = document.querySelector('selector');
        var clazz = ele.classList;
        clazz.toggle("class");
    }, false);
```

そんなに違いはありませんが、こういったやり方があります。
では、参考までに。。。。
【GoogleAppsScript】FusionTablesへのUPDATE文の書き方

#素直に書くとエラーになる

| Id | Text |
|:--:|:----:|
| 1  | Str1 |
| 2  | Str2 |
| 3  | Str3 |
| 4  | Str4 |
| 5  | Str5 |
| 6  | Str6 |
| 7  | Str7 |
| 8  | Str8 |
| 9  | Str9 |
| 10 | Str10|

例として、FusionTabels上にこのようなデータがあって
Id = 5 の Text を書き換えたい場合、

```js:updateTable.gs
function updateTable(){
  var query;
  var tableId = "1_C...lpL";  // docid
  
  // 変更するテキスト
  var str = "Changed Str";
  
  query = "UPDATE " + tableId + " SET Text = '" + str + "' WHERE Id = 5"
  
  FusionTables.Query.sql(query);
}
```

このように書きたくなりますが、

`Invalid query: Parse error near 'Id' (line 1, position 73). Expecting ROWID instead.`

WHERE句で上記エラーが出てしまいます、
エラーメッセージを見る限り、「"ROWID"を使いましょう」ということらしい。

#ROWIDとは
ブラウザ上では確認できませんが、
どうやらROWIDフィールドが存在しているようです。

|  *ROWID*  | Id | Text |
|:---------:|:--:|:----:|
| ***1***   | 1  | Str1 |
| ***2***   | 2  | Str2 |
| ***3***   | 3  | Str3 |
|  **︙**   | ︙ |  ︙  |
| ***10***  | 10 | Str10|

```js:
var select = "SELECT ROWID, Id, Text FROM " + tableId + " ORDER BY Id";
var result = FusionTables.Query.sqlGet(select);
Logger.log(result);
```

上記を投げると、

```
{
	kind=fusiontables#sqlresponse,
	columns=[rowid, Id, Text],
	rows=[
		[1, 1, Str1],
		[2, 2, Str2],
		[3, 3, Str3],
		[4, 4, Str4],
		[5, 5, Str5],
		[6, 6, Str6],
		[7, 7, Str7],
		[8, 8, Str8],
		[9, 9, Str9],
		[10, 10, Str10]
	]
}
```
このように返ってきます。
クエリは `SELECT * FROM ...` としてしまうと、ROWIDは返ってきません。

#ROWIDを使ってUPDATE
以上をまとめて、最初のコードを以下のように書き換えます。

```js:updateTable.gs
function updateTable(){
  var query;
  var tableId = "1_C...lpL";  // docid
  
  // Id = 5 の条件で ROWIDを取得する
  query = "SELECT ROWID FROM " + tableId + " WHERE Id = 5";
  var result = FusionTables.Query.sqlGet(query);
  
  // 変更するテキスト
  var str = "Changed Str";
  
  // 取得したROWIDを指定してUPDATE
  query = "UPDATE " + tableId + " SET Text = '" + str + "' WHERE ROWID = '" + result.rows[0][0] + "'";
  
  FusionTables.Query.sql(query);
}
```

これで無事に Id = 5 のデータをUPDATEすることが出来ました。

単一のデータを更新する際は上記のコードで良いですが、
複数レコードヒットしても1レコードしか更新されないので、
複数データを更新する場合は、更に以下のように書き換えます。

```js:updateTable.gs
function updateTable(){
  var query;
  var tableId = "1_C...lpL";  // docid
  
  // 4 <= Id <= 7 の条件で ROWIDを取得する
  query = "SELECT ROWID FROM " + tableId + " WHERE Id >= 4 AND Id <= 7";
  var result = FusionTables.Query.sqlGet(query);
  
  // 変更するテキスト
  var str = "Changed Str";
  
  // 取得した分のROWIDをループしてクエリを作成
  for(i = 0; i < result.rows.length; i++){
    query = "UPDATE " + tableId + " SET Text = '" + str + "' WHERE ROWID = '" + result.rows[i][0] + "'";
    FusionTables.Query.sql(query);
  }
}
```

これで無事に複数のデータを更新出来ました。

#注意点
ROWIDですが単に行番号というわけではなく、
オートナンバーのフィールドがあるイメージなので、
レコードを削除すると行番号からズレていきます（当たり前ですが…）
やることは少ないと思いますが、行決め打ちで更新する場合は注意が必要です。
基本のオブジェクトの形

    var w = 1;

    var m = 8;

    var tasu = w + m;

    var conent = function() {
        if (!tasu === 2) {
            console.log("wow");
        } else if (tasu === 9) {
            console.log("yes");
        } else {
            return;
        }
    }
    conent();


こんな形もあります。

    var w = 1;

    var m = 8;

    var tasu = w + m;

    var conent = {

        greet: function() {
            if (!tasu === 2) {
                console.log("wow");
            } else if (tasu === 9) {
                console.log("yes");
            } else {
                return;
            }
        }
    }
    conent.greet();

それでは参考までに。。。。。
PrometheusでApache監視(apache_exporter)

# まえがき

prometheus でnode_export を設定しても、サーバってそんなもんじゃない。
上で動いているものを監視しなくちゃ！ってことで、今回はapache_exporterについて記載します。

Dockerホスト上で叩くコマンドは、# 
Dockerコンテナ上で叩くコマンドは、## とします。
※場所によって、ファイル内のコメントが# と記載されています。

・jecnua/apache-exporter でコンテナ起動する方法を試してみましたが、どうも動かない・・・。
ので、今回投稿したやり方で監視してみます。


# 環境

Azure 上で構築した仮想マシン（VM)にDokerを入れてます。
・Dockerホスト：CentOS7.3
・コンテナ：CentOS latest イメージを利用
・監視用コンテナ：prometheusを導入
・監視対象となるサーバ：Apache が動いているコンテナ


# 準備
監視対象となるApache が動いているコンテナにGo言語をインストールします。

```
<Apache稼働コンテナ>
## yum -y install golang git                  ★ インストール！

## export GOPATH=$HOME/go                     
## export PATH=$PATH:$GOROOT/bin:$GOPATH/bin  

```

# apache_exporter インストール
github からインストールします。

```
<Apache稼働コンテナ>
## go get github.com/neezgee/apache_exporter     ★ 何も出力はありません。環境変数GOPATHにインストールされます。
## mv $HOME/go /usr/local/src/.                  ★ これは好き好きです。実施しなくてもいいです。
## ln -fs /usr/local/src/go/bin/apache_exporter /usr/bin   

```

# 自動起動設定
Apacheが起動されているコンテナ上で、apache_exporterが起動するようにしましょう。

```
<Apache稼働コンテナ>
## vi /usr/lib/systemd/system/apache_exporter.service
[Unit]
Description=Apache Exporter

[Service]
Type=simple
ExecStart=/usr/local/src/go/bin/apache_exporter
PrivateTmp=false

[Install]
WantedBy=multi-user.target


## systemctl enable apache_exporter.service          ★ 登録！
Created symlink from /etc/systemd/system/multi-user.target.wants/apache_exporter.service to /usr/lib/systemd/system/apache_exporter.service.

## systemctl start apache_exporter

```

# alertルールに登録

```
<prometheus導入コンテナ>
## vi /etc/prometheus/alert.rules       ★ ルールファイルは、それぞれの環境で読み替えてください。
(略)
ALERT httpd_down                        ★ 丸っとコピーして追記ください。
  IF apache_up == 0
  ANNOTATIONS {
    summary = "Apache Daemon {{ $labels.instance }} down",
    description = "Apache Daemon is dead.",                  ★ 文字列は好きな文字列に変更ください。
  }
(略)


## systemctl restart alertmanager      ★ 一応、Alertmanager を再起動
```

# prometheusに登録
prometheus(サーバ側)の監視設定にjobを追加します。

```
<prometheus導入コンテナ>
## vi /etc/prometheus/prometheus.yml

(略）
scrape_configs:
  - job_name: 'apache'
    scrape_interval: 5s
    static_configs:
    - targets: ['<Apache導入コンテナのIP or URL>:9117']
(略)

## systemctl restart prometheus         ★ prometheus を再起動

```

# 最後に
ちゃんとcommitして、9117ポートを開けておきましょ。

```
<Apache稼働コンテナ>
## exit

<Apache起動コンテナのDockerホスト>
# docker commit <コンテナ名> <イメージ名>          ★ ちゃんとcommit しておきましょう。
# docker stop <コンテナ名>
# docker rm <コンテナ名>
# docker run --privileged --name <コンテナ名> -dt -v <DockerホストDir>:<コンテナDir> -p 80:80 -p 9117:9117 <イメージ名> /sbin/init

```

# 参考サイト
https://machineperson.github.io/monitoring/2016/01/04/exporting-apache-metrics-to-prometheus.html
Java SE8 Gold取りました。

先日[Java SE 8 Programmer II(Java SE8 Gold)](http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=5001&get_params=p_exam_id:1Z0-809&p_org_id=70)に合格しました。
そのために自分がやったことと受験した感想をメモします。

▼試験結果
勉強期間　：3カ月
得点率　　： 73％（ボーダー65％）　結構ギリギリ(>o<)!

## 自分とJavaの関係
* 仕事でJava開発は5年
* 保有資格は[Java SE 8 Silver](https://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=5001&get_params=p_exam_id:1Z0-808&p_org_id=70&lang=JA)と [WebコンポーネントデベロッパEE 5](http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=458&p_org_id=70&lang=JA&get_params=p_track_id:JEE5WCD)と [JavaプログラマSE 6](http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=5001&get_params=p_exam_id:1Z0-851&p_org_id=70&lang=JA)

## きっかけ
Java8で新機能が多く追加されたので、それらを習得するために受験しました。　
最初は[Upgrade to Java SE 8 OCP](http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=5001&get_params=p_exam_id:1Z0-813&p_org_id=70&lang=JA)の受験を考えていましたが、
参考書がないのと情報量が少なかったので、こちらを受けることにしました。

## 買った参考書と感想
<dl><dt>[徹底攻略Java SE 8 Gold問題集［1Z0-809］対応 徹底攻略シリーズ](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5Java-SE-8-Gold%E5%95%8F%E9%A1%8C%E9%9B%86%EF%BC%BB1Z0-809%EF%BC%BD%E5%AF%BE%E5%BF%9C-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B01LXSG1G9/ref=pd_sim_351_1?_encoding=UTF8&psc=1&refRID=PC6MK9AHZB6JSXW5VM6F)（以後、黒本と記述）</dt>
<dd>定番の問題集なので購入しましたが、全体的に難易度が低めの門題が多いです。ただ本の最後の総仕上げ問題は本番試験と難易度が近く、本番でも同じ問題が多数出題されました。</dd>
<dt>[OCP: Oracle Certified Professional Java SE 8 Programmer II Study Guide: Exam 1Z0-809](https://www.amazon.co.jp/dp/B0191U2H8C/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)（以後、 Study Guideと記述）</dt>
<dd>上記の黒本だけでは不安になり購入しました。[紫本](https://www.amazon.co.jp/dp/B01J1LPKJY/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)と同じような構成で、参考書と問題集が１つになっています。紫本ではなくStudy Guideにしたのは英語力を身につけたかったからです。本の説明に「Complete, trusted preparation for the Java Programmer II exam」とある通り問題数も多くかなり充実した内容でした。難易度は本番よりも高めです。この本を２周して問題の正答率が90%に達していれば絶対合格できます。ただ量が多いので２周するのはかなり根気が必要です（自分は1周で断念しました）。<br>あと本がでかくて、電車の中では絶対読めません。Kindleで購入したほうがいいです。</dd>

## 試験本番
問題数は85問、試験時間は150分でしたが、時間が足りないということはなく、120分ほどで解き終わりました。
難易度は黒本の総仕上げ問題よりも少し高めです。
JavaプログラマSE 6の時のような重箱の隅をつつくような問題は少なく、
Java8の新規機能がメインで、ストリームAIP、ラムダ式、メソッド参照に関しては単体での出題 or 他と絡めての出題で１／４を占めていました。Study Guideではパラレルストリームの難しめの問題が多かったのですが、本番は簡単な問題が２問程度でした。OptionalとDateTimeAPIについては意外と少なく、１、２問程度でした。
JDBCは例外処理と絡めた問題もあり５～７問と意外と多めでした。
New IOについては絶対パスと相対パスでの挙動の違いをしっかり理解する必要があります。

## 感想
点数的にはギリギリ合格でした。。。
問題集に取り組むときに、正解を導き出せるだけでなく、一つ一つの選択肢に対して背景を理解する必要があったと感じています。しかしながらJava8の主要新な機能について一通り整理できました、業務で使う分には十分な理解だと思います。
試験対策は問題集のみでしたが、試験後に[オラクルの公式サイト](http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=5001&get_params=p_exam_id:1Z0-809&p_org_id=70&lang=JA)を見てみると、試験内容＞チェックリスト＞【トピック】の１つ１つに対して漏れなく問題が出題されてたことが分かったので、試験前に見とけばよかったなぁと感じています。あと英語の勉強もかねて黒本とStudy Guideを選びましたが、他の方のブログを見た感じだと、黒本と紫本を買ってそれぞれ２周すれば合格できるような気がしました。
はてなブログのテーマでレスポンシブが機能しなかった

はてなブログでレスポンシブなテーマをカスタマイズしていたところ，iPhone5Sでの表示が崩れる問題に遭遇しました．（元記事：http://tellusium.hatenablog.com/entry/2017/03/12/173919）

# TL;DR

MINIMというテーマで，レスポンシブにするための記述がiPhone5Sに対応していなかった．

# まずはテーマのバニラ状態で崩れるか確認する

MINIMのサンプルサイトをiPhone5Sで表示させてみたところ，崩れることが確認できました．
PCのブラウザの幅を狭くしてみても，同様の現象が確認できました．
しかも幅を狭くしすぎると崩れることが確認できます．

正常
<img width="437" alt="スクリーンショット 2017-03-12 17.26.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/143819/b7350338-ea56-10e5-89d9-e67dcf0c158b.png">

異常（横にもスクロールできてしまう）

<img width="410" alt="スクリーンショット 2017-03-12 17.25.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/143819/f2f40435-6e30-3d9f-0a8a-98879dd787d5.png">

どうやら幅が狭くなりすぎると起こる現象なので，CSSを確認してみます．

# CSSの確認

デザインCSSでimportしているリンクへ飛ぶと，CSSの中身が確認できます．
レスポンシブ対応を行なっている部分は@media以降の部分なので，それを探します．
見つかりました．一番下にありました．

```
@media (max-width: 960px) and (min-width: 362px) {
  #content {
    margin: 0 auto;
    width: 100%;
  }
  ...
```
あれ…min-widthが362pxになっている…iPhone5Sの横幅は360pxなのに…
はい，これで原因がわかりました． 

# 解決方法

元のCSSを変えるのはできないので，一番手っ取り早い方法として，レスポンシブ対応の部分を丸々デザインCSSにコピペしてきて，min-widthの書式を消去しました．
スマートな方法ではないですが…

これでどんなに小さい端末で見てもレスポンシブになるはずです．

# 余談

なぜmin-width: 362pxにしてあったのかが疑問です．

私はCSS入門者なのでmin-widthを指定する意味がわからないのですが，一定以下に小さくなると，表示が崩れるのでサポート外とする，といった理由でしょうか？

いずれにせよ，360pxという横幅のスマートフォンは少ないはずなので，今現在のほとんどの端末では正しく表示されそうではありますね．
github上のnablarch-exampleプロジェクトをEclipseに取り込む

TISの社内フレームワーク[Nablarch](https://www.tis.jp/service_solution/nablarch/)が[オープンソース化](https://nablarch.github.io/docs/5u8/doc/about_nablarch/license.html)されたので、
実際にgithubからnablarch-exampleプロジェクトをEclipseに取り込んでみる

# 1.1.前提事項
- Eclipseがインストールされていること(本投稿ではEclipse 4.6 Neonを使用)
- その他、exampleの動作環境を満たしていること
    - (必要なバージョンのjava・Mavenがインストールされている)

# 1.2.事前準備
- [アプリケーションフレームワークの解説書手順](https://nablarch.github.io/docs/5u8/doc/application_framework/application_framework/blank_project/maven.html#id6)に従い、事前準備を行う。
    - Project Local RepositoryのURLには、全てhttp://central.maven.org/maven2/ を設定する

# 2.1.取り込みの実行
今回は、[nablarch-example-web](https://github.com/nablarch/nablarch-example-web)を使用する。
# 2.2.プロジェクトリポジトリの取得
- Eclipseを起動し、Git ステージングビューを開く
- 「Gitリポジトリーを複製し、このビューへ追加」をクリック
- URIの複製 → URIにhttps://github.com/nablarch/nablarch-example-web を入力
- 接続にgitを指定したら、残りはデフォルトのまま完了
    - この時点で、プロジェクトリポジトリの取得までが完了している

# 3. アプリケーションのビルド
- コマンドラインでは手間がかかりログも取れないので、gitの取込先に移動してbatファイルを置く
    - ダブルクリックして実行するとビルドを行い、ログを出力する
    - ログにBUILD SUCCESSが2個存在していれば成功

```const.bat
call mvn -P gsp generate-resources > result.txt
call mvn clean compile >> result.txt
```

- ファイル・システムからプロジェクトを開く→インポート先にgitの取込先を指定→そのまま完了
- プロジェクトが展開されているので、waitt::runや単体テスト、プロジェクトの編集を行える

# 4.まとめ
- Nablarchがオープンソース化されたため、どこでもexampleを展開でき、試すことができる
- 便利な各種ツールを用いることで、少ない手間でプロジェクトを展開できる
フロントサイドのバリデーションにはvalidatorjsが便利

Webフォームのバリデーションをするのって面倒ですよね。どうせサーバサイドでバリデーションするのに…。
といいつつも、利用者を苛つかせないためにも、無駄な通信を減らすためにもフロントサイドのバリデーションは重要です。

何か良いライブラリが無いかなと思ってgithubを漁っていたら、良さげなライブラリを見つけました。
[validatorjs](https://github.com/skaterdav85/validatorjs)

"A data validation library in JavaScript for the browser and Node.js, inspired by Laravel's Validator."とあるとおり、LaravelのValidatorに似た感じになっているのが特徴です。

Laravelといえば、JSはreact.jsではなくてvue.jsだろうということで、Vueのコンポーネントでのサンプルです。(CSSはBootstrap)
もちろんこのライブラリはvue.jsに依存しているわけではありませんので、汎用バリデータとして使用できます。

```:sample.vue
<template lang="pug">
div
    h2 Search
    form.form.form-horizontal
        .form-group(:class="{ 'has-error' : errors.query }")
            label.control-label.col-xs-1 query
            .col-xs-11
                input.form-control(ref='query')
                span.help-block(v-if='errors.query') {{ errors.query }}
        .form-grup
            .col-xs-offset-1
                button.btn.btn-default(type='button', @click='search') Search
</template>

<script>
'use strict';
var Validator = require('validatorjs');
Validator.useLang('ja');

module.exports = {
    data: function(){
        return {
            errors: {
                query: ''
            }
        };
    },

    methods: {
        search: function(){
            var v = new Validator({             // validate するデータ
                query: this.$refs.query.value
            }, {                                // validate ルール
                query: 'required'
            });

            var pass = v.check();

            // エラーをセット（エラーなしの場合は、nullで上書きする）
            this.errors = {
                query: v.errors.first('query')
            };

            if(pass){
                // validate OKの場合の処理...
            }
        }
    }
}
</script>
```
これはvue.jsの特徴ですが、`this.errors`をリアクティブなデータとしているので、これの値を変えるだけで`div.form-group`に`has-error`クラスを設定して赤くしたり、エラーメッセージを(`span.help-block`）表示したりできるのが楽で嬉しいですね。


![スクリーンショット 2017-03-12 17.11.00.png](https://qiita-image-store.s3.amazonaws.com/0/145575/1078c8d6-44ea-d8f6-9b5f-4878cc8182c4.png)

組み込みで用意されているルールは

- accepted
- alpha
- alpha_dash
- alpha_num
- array
- between:min,max
- boolean
- confirmed
- date
- digits:value
- different:attribute
- email
- in:foo,bar,...
- integer
- max:value
- min:value
- not_in:foo,bar,...
- numeric
- required
- required_if:anotherfield,value
- required_unless:anotherfield,value
- required_with:foo,bar,...
- required_with_all:foo,bar,...
- required_without:foo,bar,...
- required_without_all:foo,bar,...
- same:attribute
- size:value
- string
- url
- regex:pattern

と充実してます。カスタムルールを作る必要は無いかもしれません。もちろんエラーメッセージのカスタムも可能です。
JSの標準のバリデーションライブラリになってくれると良いなと思います。


良いライブラリを見つけられた日曜の午後でした。

追記: 予想外の「いいね」を頂いたので、調子に乗って関連記事を書きました。よかったらこちらもご参照ください。
[validatorjsのカスタムルールを書くときの注意点](http://qiita.com/hirohero/items/7ec0b7dec842cc61a3b5)