OmniAICreator/Qiita-1.07M huggingface dataset:
二値画像の回転

```rb:hena2pre.rb
#!/usr/bin/env ruby
#coding:utf-8
#http://qiita.com/Nabetani/items/9d80de41903775296ca6
#STDOUT.sync=true
def solve(l)
	n,s=l.split(':')
	n=n.to_i
	n.to_s+':'+sprintf("%0#{s.size}x",
		(sprintf("%0#{s.size*4}b",s.to_i(16))[0,n*n]
		.chars
		.map(&:to_i)
		.each_slice(n)
		.to_a
		.transpose
		.map{|e|e.reverse*''}*''+'0'*(s.size*4-n*n)).to_i(2)
	)
end
DATA.each_with_index{|e,i|
	input,expect=e.chomp.split(' → ')
	puts 'Case '+(i+1).to_s+': '+(expect==solve(input)?'OK':'NG')
}
__END__
3:5b8 → 3:de0
1:8 → 1:8
2:8 → 2:4
2:4 → 2:1
2:1 → 2:2
3:5d0 → 3:5d0
4:1234 → 4:0865
5:22a2a20 → 5:22a2a20
5:1234567 → 5:25b0540
6:123456789 → 6:09cc196a6
7:123456789abcd → 7:f1a206734b258
7:fffffffffffff → 7:ffffffffffff8
7:fdfbf7efdfbf0 → 7:ffffffffffc00
8:123456789abcdef1 → 8:f0ccaaff78665580
9:112233445566778899aab → 9:b23da9011d22daf005d40
```
Bit Tetris

```rb:hena2.rb
#!/usr/bin/env ruby
#http://nabetani.sakura.ne.jp/hena/ord2/
STDOUT.sync=true
while gets
	puts $_
		.split('-')
		.map{|e|f=e.to_i(16);8.times.map{|i|f[i]}}
		.transpose
		.delete_if{|e|e.all?{|f|f==1}}
		.transpose
		.map{|e|sprintf("%02x",e.map(&:to_s).join.reverse.to_i(2))}*'-'
end
```
vimで複数行を複製しつつコメントアウト。

この記事は Vim Advent Calendar 2012 319日目の記事になります。
前回は@ mittanさんの[MacのVimでBGMを聴く](http://modsound.github.io/blog/2013/10/14/afplay-vimfiler/)でした。

今回は[”コメントアウトして編集”を効率化する。](http://lsifrontend.hatenablog.com/entry/2013/10/11/052640) に便乗。これの複数行対応ver. の関数を作ってみました。
＊今回作った関数は[The Nerd Commenter](https://github.com/scrooloose/nerdcommenter)に依存してます。


先のリンクにあるように元のコードをコメントアウトしつつ、複製したい事はよくあると思います。

```rb:before.rb
hello(name)
  puts 'hello' + name
end

hi(name)
  puts 'hi!' + name
end
```

以下のようにしたい。でもこれって結構面倒くさいんですよね。ビジュアルモードで複数選択してyしてPして元のコードのところに行ってコメントアウトしてッて感じで…。

```rb:after.rb

hello(name)
  puts 'hello' + name
end
# hello(name)
  # puts 'hello' + name
# end

hi(name)
  puts 'hi!' + name
end
```

これを可能にするvimscriptの関数をざっと作ってみました。
以下を.vimrc に書いて、VでのビジュアルモードでCtrl + d すれば選択したものが複製されつつ元の分がコメントアウトされます。冗長で動作検証も詳しくしてないので、もっと良い書き方あれば教えて下さい。

```vim:.vimrc
vnoremap <silent> <C-d> :call DupLines()<CR>
  function! DupLines()  range "{{{
    let selected_num = line("'>") - line("'<") + 1
    let ori_pos = line("'<")

    " 選択中の行をyank
    normal! ""gvy
    " yankした物をPする
    normal P
    " 元のコードを選択
    execute 'normal '.selected_num.'j'
    execute 'normal V'.selected_num.'j'
    " コメントアウトする
    call NERDComment(1, 'norm')
    " ビジュアルモードからエスケープ
    execute "normal! \e\e"
    " 元の位置に戻る
    execute 'normal '.ori_pos.'gg'
  endfunction "}}}
```
How to install rails4 on Ubuntu Server 13.04

`sshd` はインストールされているものとします。

* パッケージのアップデートをします。カーネルをアップデートしたら、リブートが必要です。

```shell-session
$ sudo apt-get update
$ sudo apt-get -y upgrade
$ sudo reboot
```

* 必要なライブラリを入手し、ruby を `make` します。ドキュメント作成はしません。

```shell-session
$ sudo apt-get -y install gcc make build-essential zlib1g-dev libssl-dev \
    libreadline6-dev libyaml-dev libxslt-dev libxml2-dev libsqlite3-dev \
    nodejs
$ wget http://cache.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p247.tar.bz2
$ tar jxvf ruby-2.0.0-p247.tar.bz2
$ cd ruby-2.0.0-p247/
$ ./configure --disable-install-doc
$ make
$ make test
$ sudo make install
```

* デフォルトでドキュメント作成をしないように設定し、rails を含む必要な gem を入手します。

```shell-session
$ cd
$ cat > .gemrc
gem: --no-document
gem: --no-ri --no-rdoc
$ sudo gem update --system
$ sudo gem update
$ sudo gem install rails
```

* テスト用にアプリを作ります。

```shell-session
$ rails new rtest
$ cd rtest
$ rails server
```
proxmoxでkvmの仮想イメージを他のサーバーに移す手順

コンフィグの引っ越し
==================
1. 前のサーバーからコンフィグを取得 `/etc/pve/nodes/<oldserver>/qemu-server/100.conf`
1. 新しいサーバーにコンフィグを移す `/etc/pve/nodes/<newserver>/qemu-server/<任意の数字>.conf`

```bash:以下エラーが出ることもあるが無視
/etc/pve/nodes/<newserver>/qemu-server# mv ~/113.conf
mv: failed to preserve ownership for `./113.conf': Function not implemented
mv: preserving permissions for `./113.conf': Function not implemented
```

仮想イメージの引っ越し
==================

イメージファイル
--------------------
コンフィグファイルに仮想イメージの場所が書いてあるので探す。

```bash:
$ grep size 100.conf | grep -v iso
110.conf:virtio0: local:vm-110-disk-1,size=10G
111.conf:sata0: local:vm-111-disk-1,size=32G
..
```

新しいサーバーにそのままコピーします。
なお稼働中のサーバーイメージもサーバーを落とさずそのまま`rsync`でコピーして大丈夫でした。


物理デバイスを使用している場合
--------------------------------------
kvmは実パーティションをディスクとして利用ができます。

```bash:111.conf
sata0: vg001:vm-111-disk-1,size=32G
```

のような場合、実体を探します。

```bash:
# ls -l /dev/vg001/vm-11*
lrwxrwxrwx 1 root root 7 Sep 19 09:57 /dev/vg001/vm-110-disk-1 -> ../dm-6
lrwxrwxrwx 1 root root 7 Sep 19 09:56 /dev/vg001/vm-111-disk-1 -> ../dm-3
```

`dd`を使ってrawイメージに落として使います。(同じ環境を作るのは面倒なので)


仮想イメージの引っ越し(イメージファイル)
=================================

1. 前のサーバーから仮想イメージを取得し新しいサーバーに移す。

WebUIで起動できることを確認
=======================
* 起動できない場合は仮想イメージが見当たらない可能性がある。画面下のタスクタブにてエラーを確認。
ZooKeeper Serverが起動しているか確認するクールな一つの方法

ZooKeepeerはなんだか謎の多い製品で、今はもう直ってるのか知らないですが、起動成功時と起動失敗時のメッセージが全く同一という狂気じみた仕様だったりもしました。

ZooKeeperが吐く起動メッセージなんて信用できないので、ZooKeeperのサービスが行われているかどうか動作しているサービスに聞くと良いです。

その専用のコマンド、ruok(多分are you ok?の意味)が用意されています。

```shell-session
$  telnet localhost 2181
して
ruok
```

と打ち込むと

```shell-session
imokConnection closed by foreign host.
```

と帰ってきます。わかりにくいですが「imok」と帰ってきています。
作ったgemをリリースするまで


メモ

### 作成したソースを諸々コミットする

```
$ git add .
$ gc -m 'version 0.1'
```
### パッケージを作成する

```
$ bundle exec rake build
```
→pkgフォルダおよび、その下にxxxxxxxx-x.x.xgemファイルが作成される

## rubygems.orgのアカウントを取得
[rubygems](https://rubygems.org/)

1.「sign up」からアカウントを作成
2. アカウント作成後、Edit profile(https://rubygems.org/profile/edit) に移動
3.APIアクセス用の鍵を作成（以下のコマンドが用意されている）

```
$ curl -u Username https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials
```

## githubにリポジトリを作り、ソースをアップロード
割愛

## リリース（rubygemsへアップロード）

```
$ bundle exec rake release
```

以後のバージョンアップはgithubへアップ→リリースを繰り返す。
圧縮転送(scp -C)、中断した転送をレジューム

## 圧縮転送(scp -C)

```ruby:
$ scp -C huge.dumpfile 192.168.11.6:
```

100Mbpsの環境で`10MB/s`だったのが`30MB/s`前後になりました。

## 中断した転送をレジューム

* 数GBのファイルの転送に失敗した時の続行方法
* [scp で中断したファイル転送をrsync --partial option でレジューム - matoken’s meme -hatena-](http://d.hatena.ne.jp/matoken/20110525/1306335511)

```ruby:vなしでも。
$ rsync -e ssh --partial *.dump 192.168.11.6:./a/
```

```ruby:vつけて詳細ログでも
$ rsync -vvve ssh --partial *.dump 192.168.11.6:./a/
```
HomebrewでPostgresql9.1から9.3へアップデート


きちんとバックアップとってる人は [Upgrading from PostgreSQL 9.1.x to 9.2.x with Homebrew](http://anti-pattern.com/upgrading-from-postgresql-9-1-x-to-9-2-x-with-homebrew) ここに書いてある通りやるだけ。

```bash:zsh
brew update
brew upgrade postgresql
launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
mv /usr/local/var/postgres /usr/local/var/postgres91
initdb /usr/local/var/postgres -E utf8
pg_upgrade \
  -b /usr/local/Cellar/postgresql/9.1.x/bin \
  -B /usr/local/Cellar/postgresql/9.2.x/bin \
  -d /usr/local/var/postgres91 \
  -D /usr/local/var/postgres
cp /usr/local/Cellar/postgresql/9.2.x/homebrew.mxcl.postgresql.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
```

私のように`brew upgrade`をバックアップせずやっちゃううっかりさんのために。

## 古いバージョン (Postgresql 9.1)のインストール

ここによると、[Homebrew install specific version of formula? - Stack Overflow](http://stackoverflow.com/questions/3987683/homebrew-install-specific-version-of-formula)　`homebrew-versions` という機能が追加されている。

### 1) homebrew-versionsの機能を有効にする
``` bash:zsh
➜  ~  brew tap homebrew/versions
Cloning into '/usr/local/Library/Taps/homebrew-versions'...
remote: Counting objects: 1277, done.
remote: Compressing objects: 100% (783/783), done.
remote: Total 1277 (delta 694), reused 1036 (delta 494)
Receiving objects: 100% (1277/1277), 339.55 KiB | 244.00 KiB/s, done.
Resolving deltas: 100% (694/694), done.
Checking connectivity... done
Tapped 117 formula
```
### 2) インストールできるバージョンの確認
```bash:zsh
➜  ~  brew search postgresql
postgresql     postgresql8    postgresql9    postgresql91   postgresql92
```

### 3) インストール
```bash:zsh
➜  ~  brew install postgresql9
```

### 4) アップデートする
冒頭の通りです。

## 勘所
`homebrew-versions`すげー便利。種類も豊富。
[Homebrew/homebrew-versions](https://github.com/Homebrew/homebrew-versions)
weakify/strongify マクロを使うと weak self パターンが簡単に書ける

ブロックの外で定義された変数をブロック内で使うとき、その変数はブロック内に `strong` 参照でキャプチャされる。場合によってはこれが循環参照を引き起こすことがある：

```objc
// self が block を strong 参照→ block が self をキャプチャ（strong 参照）
self.aStrongProperty = ^{
    NSLog(@"self = %@", self);
};
```

これを回避するには、問題となる変数の `weak` 参照をブロックに渡すことになる：

```objc
__weak typeof(self) wself = self;
// __weak TheClass *wself = self; // If Xcode < 4.4

self.aStrongProperty = ^{
    NSLog(@"self = %@", wself);
};
```

[libextobjc](https://github.com/jspahrsummers/libextobjc) はこのパターンを簡単にする [weakify/strongify マクロ](https://github.com/jspahrsummers/libextobjc/blob/master/extobjc/EXTScope.h)を提供している。ブロックの外で、 `weak` 参照にしたい変数を引数に `@weakify()` を呼び、ブロックの中で先ほどの変数を引数に `@strongify()` を呼べばよい：

```objc
#import <libextobjc/EXTScope.h>

...

- (void)weakSelfPattern {
    @weakify(self);
    self.aStrongProperty = ^{
        @strongify(self);
        NSLog(@"self = %@", self);
    };
}
```

マクロの引数には `@weakify(var1, var2, var3)` のように複数の変数を渡せる。また `unsafe_unretained` 参照を作る `@unsafeify()` マクロも用意されている。

`wself = self` パターンと異なり、同名の変数をそのまま使えるので、ブロック内で `wself` の代わりに `self` を使ってしまうミスは起こりえない。

蛇足：マクロ名が `@` で始まっているが、これは Objective-C の組み込みのディレクティブではない。マクロ定義の先頭に空の autoreleasepool 文を置くことでディレクティブのような見た目のマクロを作るテクニックを使っている：

```objc
#define strongify(...) \
    autoreleasepool {} \
    《マクロ本体》

// `@strongify()` が `@autoreleasepool {} 《マクロ本体》` に展開される
```
アクセスしているページのコントローラに関する名称を取得

`controllers/application_controller.rb`や`views/layouts/application.html.erb`なんかで、画面毎に処理を分けたい場合に有効。
`controller.controller_name`は純粋にコントローラ名しか取れないので、
名前空間(モジュール？)を使っている場合には同名のコントローラ名が存在する可能性がある。
なので、判定にはモジュール名も併せてみるか、コントローラクラス名を使うと確実かも。


**コントローラが入っているモジュール名**
`controller.class.parent.name`

**コントローラクラス名**
`controller.class.to_s`

**コントローラ名**
`controller.controller_name`

**アクセスしているアクション名**
`controller.action_name`
三角関数とか使ったメモ


[http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_10_B](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_10_B)
ココの出題で必要になったので

サンプルで与えられている値は、
a の長さ, b の長さ, Cの大きさ　が、
4 3 90
となっている。
コレはサンプルの値ですし、abの間の角も90度と非常に都合のいい角度なので、sinとかcosとか計算する必要はなし。
テストケースではそうではなくなってくるのでsinやcosでの計算が必要になる。

```(python):sankaku.py
#sin,cosのために必要
#平方根の計算はx**0.5でも代用出来てるっぽい
import math
 
#ここで値を受け取る
(a,b,C) = map(float, raw_input().split())
#角度Cをラジアン数に変える。
#ラジアン数とは何か不明
cs=math.radians©
#ここで余弦定理で残る3辺目の長さを求める。
#公式は、a^2=b^2+c^2-2ab*cosA
#ここではmath.sqrtですぐに辺の長さを出しています。
c=math.sqrt(a**2+b**2-2*a*b*math.cos(cs))
#正弦定理でmを底辺とした時の高さを出しています。
h=b*math.sin(c)
#3辺の長さから三角形の面積を。今回は使わず落書き状態。
#ans=(s*(s-b)*(s-n)*(s-o))**0.5
#print ((a-o)**2 + (b-p)**2)**0.5
#print ans
#面積と辺の長さの合計を計算して出力。
S=h*n/2
L=a+b+c
print S
print L
print h
```


今回の三角形のイメージ図
![三角形](http://www.nowshika.com/joso/img10160001.png)

3辺は小文字のa,b,cで定める。辺a,bに挟まれる(辺cと向かい合わせになる)角は∠Cと定める というルール付けを中学・高校で習った気がする。
そしてせっかくペイント起動したのに高さのhを書き忘れた悲しみ。
いつか修正します。。。

ラジアンは弧度法とも言われるらしい。↓度数法との対応表。

| 度数法 |0°|30°|45°|60°|90°|180°|360°|
|:----:|:-:|:-:|:-:|:-:|:-:|:--:|:--:|
| 弧度法 |0|π/6|π/4|π/3|π/2|π| 2π|
このテーブルの記法って上段は太字になってしまうのかな。
それとも回避法あるのに私が調べたりないかな。まぁ度数法ならよく馴染みがありますよね！と強調してるってことで。
ラジアン数は何故生まれたのか、どんな時にどんな風に使うかを詰めていくとアレなので詳細はパスで。

度数法の表記などは ° や deg などが用いられることもあるらしい。きれいなコード書いている方のを拝見した際に deg という変数があったらおそらくは度数法での角度のことでしょう。
弧度法のラジアン数の表記で rad となっているらしい。πはソースコードの中では残念に使えない文字。英語表記だとpiですが math.pi と被るので変数名に使うのは避けたほうが良さそうっぽい。

2辺の長さとその間の角が与えられれば、三角形の面積と3辺の長さが出るとこまで以外にもう少し書いていく予定。

13/10/15 23時過ぎくらい
ごちゃまぜ表記を修正すみ。ラジアン数について少し補足。

ここまで殴り書き　13/10/15 3時過ぎくらい
後で修正しますメモ
n,m,oとかa,b,cとかごちゃまぜなのを表記を統一する。
図がないと誰かがせっかく読んでくれても分かりにくい。自分で後で読んでも分からなくなるので図をつける。
fprintfで\nがコンパイラによってLFだったりCRLFだったりするという話を聞いたので軽く調べた結果

安定のWikipediaさんに納得の回答が。

http://ja.wikipedia.org/wiki/%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89

> プログラミングにおける改行コード
> 
> ポータブルなプログラムを記述するために、プログラミング言語は異なる改行コードを扱うためにある程度の抽象性を提供している。
C言語では'\n'（改行）、'\r'（復帰）の二つのエスケープシーケンスを提供している。言語処理系はこれらのエスケープシーケンスをそれぞれ異なった環境依存のchar型に収まる範囲の数字（例えばUNIXやWindows上の一般的な処理系においては、それぞれ、0x0A、0x0D）に変換する。
ただし、よく使われる出力関数のprintf、puts、入力関数のfgetsなどでは、'\n'に相当する数値（上記の例では0x0A）は特殊な値として処理される。これらの出力関数ではテキストモードで開かれたファイルにデータを出力する時、'\n'の部分がシステムで使用されている改行コード列に変換された文字列がファイルに出力される。例えば、UNIXでは、改行コード列は「0x0A」であり、Windowsでは「0x0D 0x0A」、Macintoshでは「0x0D」である。また、入力関数fgetsはテキストモードで開かれたファイルからデータを読み込む場合、ファイル中にシステム依存の改行コード列があれば、その部分を'\n'に対応する数値に変換したものを変数に格納する。ファイルがバイナリモードで開かれている場合には、どの入出力関数も数値を変換をせずそのままの値として読み書きする。
これらの関数は、「0x0D 0x0A」の使用を要求する通信プロトコルを使ってテキストをやりとりする場合に問題になる。そのようなストリームに対し、printf関数などを使い'\n'を出力すると、Windowsシステムにおいては期待通り「0x0D 0x0A」が送信されるが、UNIXにおいては「0x0A」しか送信されないため、問題となる。解決策として、バイナリモードを使って目的の数値（0x0D 0x0A）を直接送るとどのような場合も正しく動作する。
Java言語でも'\n'（改行）、'\r'（復帰）の二つのエスケープシーケンスを提供している。言語処理系はこれらのエスケープシーケンスを、それぞれ、16ビットの数値0x000A、0x000Dに変換する。（Java言語の char型 は16ビットUTF-16である。）
よく使われるjava.io.PrintStreamクラスのprintメソッドやprintlnメソッド、printfメソッドは、C言語の printf 関数とは異なり、これらの数値を特別扱いせず、環境依存の改行コードに変換しない。ただし、printfメソッドで使われる書式文字列中では「改行」を表現するための特殊な表記として「%n」を使える。printfメソッドはこの部分を実行環境依存の改行コードに置換した文字列を出力する。また、いずれのメソッドでも、出力されるバイト数、バイト順については設定された文字符号化方式に依存する。

つまりバイナリモードで開いていたらLF固定で、テキストモードの場合は環境などによってCRLFまたはLFになるという話。でいいのかな。
どのコンパイラとOSの組み合わせがどうなるかまでは知らない。
強化学習・メタヒューリスティクス

## 機械学習の枠組み
- 教師あり学習
    - SVD
    - ナイーブベイズ
- 教師なし学習: データにラベル付けがされておらず、エラーも報酬もない。
    - クラスタリング
        - 階層型クラスタリング
            - 最短距離法
            - 最長距離法
        - 非階層型クラスタリング
            - K-means
- 強化学習 (日本の wikipedia では教師なし学習の一種という位置づけ)
    - 動的計画法
    - モンテカルロ法
    - TD (Temporal Difference: 時間差分) 学習
        - 方策 ON: sarsa
        - 方策 OFF: Q-learning
    
### 参考文献
- http://www.eb.waseda.ac.jp/murata/ryotaro.nishino/openhouse/reinforce.php
- http://www.eb.waseda.ac.jp/murata/mituhiro.seki/openhouse/RL_abs.php
- http://www.eb.waseda.ac.jp/murata/mituhiro.seki/openhouse/RL_algorithm.php


## 強化学習とは
参考: http://sysplan.nams.kyushu-u.ac.jp/gen/edu/RL_intro.html
エージェントと環境のやりとり（試行錯誤）によって、環境に適応する方法を学習する枠組み。

1. エージェントは時刻 t における状態観測 s(t) に応じて意思決定を行い、行動 a(t) を出力する
2. エージェントの行動により、環境は状態 s(t+1) へ遷移する。環境はその遷移に応じた報酬 r(t) をエージェントに与える
3. 時刻を t+1  に進める。

上記のプロセスを通じて、利得最大化を目的として状態観測から行動出力へのマッピング(=方策、Policy、π)を獲得する。

### マルコフ決定過程とはなにか
強化学習の枠組みでは、エージェントが存在する環境をマルコフ決定過程によってモデル化し、アルゴリズムの解析を行う。

#### マルコフ過程
未来の挙動が現在の値のみで決定される性質をもつ確率過程のこと。過去の挙動とは無関係

- 単純マルコフ過程: ただひとつの状態から次に起こる事象が決定されるマルコフ過程。単純に「マルコフ過程」といった場合はこれ。
- N 階マルコフ過程: N 個の状態系列から次の事象が決定されるマルコフ過程。

#### マルコフ決定過程
マルコフ過程に意思決定のプロセスが加わったもの。


### Ｑ学習とはなにか
- 状態 State: s = {s_1, s_2, …, s_n}
- 行動 Action: a = {a_1, a_2, …, a_m}
- 遷移確率 Probability: P^a(s, s') = P(s_{t+1}=s'|s_{t}=s, a_{t}=a)
- この時に与えられる報酬 Return: r_t
- 報酬の期待値 Expected Return: R^a(s, s') = E(r_{t}|s_{t}=s, a_{t}=a, s_{t+1}=s')
- エージェントの各時刻 t における意思決定 Poilcy: \pi(s, a) = P(a_{t}=a|s_{t}=s)
- 利得（エージェントが将来にわたって受け取る報酬の時系列評価） Value: V_t = r_t + \gamma r_{t+1} + … 

ここで、もし \pi が時間に関わらず不変（定常政策という）であれば、行動はその時の状態によってのみ選択される。したがって、利得も状態 s の関数になるので、State-Value 関数 V^{\pi}(s) となる。


### 探索戦略

## メタヒューリスティクスとはなにか




### 実装してみよう！
http://studywolf.wordpress.com/2012/11/25/reinforcement-learning-q-learning-and-exploration/


## このタスクについて
下記のことをアピールするためのものである。その目的を達成する過程で、自分自身の理解を深める。

- メタヒューリスティクスについてひと通り理解している
- 強化学習についてひと通り枠組みを理解している
- 簡単なエージェントなら実装可能
Development for ASP.NET MVC with Bootstrap made simple.

ウェブサイト開発で[Bootstrap](http://www.sitepoint.com/11-reasons-to-use-twitter-bootstrap/)を使う多くの理由があるかと思います。 もし、あなたが使われているサーバー側の技術が ASP.NET MVC,であれば [TwitterBootstrapMVC](https://www.twitterbootstrapmvc.com/).をお使い頂く事で開発速度を上げる事ができます。 「ちなみに」ですが、Bootstrap 2を使っているのであればTwitterBootstrapMVCを無料でお使い頂けますので 新しいシンタックスをご確認下さい。

```
using (var f = Html.Bootstrap().Begin(new Form().Type(FormType.Horizontal)))
{
    @f.ControlGroup().TextBoxFor(m => m.UserName)
    @f.ControlGroup().PasswordFor(m => m.Password)
    @(f.ControlGroup().CustomControls(
        Html.Bootstrap().CheckBoxFor(m => m.RememberMe).Label(),
        Html.Bootstrap().SubmitButton())
    )
}
```
QtでOpenGLの画像を保存する．

# OpenGLをQtから使っている時に，OpenGLの表示を画像として保存する方法．

QGLWidgetを継承したクラスGLWidgetがある．

```cpp
GLWidget::GLWidget(QWidget *parent)
    : QGLWidget(QGLFormat(QGL::SampleBuffers), parent) {
}
```

GLWidgetで描画されている画面を画像として保存するにはこんな感じ．

```cpp
void GLWidget::saveImage() {
	QImage img = QImage(this->size(), QImage::Format_ARGB32_Premultiplied);
	glReadPixels(0, 0, this->width(), this->height(), GL_RGBA, GL_UNSIGNED_BYTE, img.bits());
	img = img.rgbSwapped();
	img = img.mirrored();
	img.save("file.jpg");
}
```

`rgbSwapped()`はRGB→BGRに効率的に変換する．OpenGLをQtに合わせるため．
`mirrored()`は画像をミラーする．グラフィックスの座標をOpenGLの座標からQtの座標に移すため．

# 追記
@shimacpyon さんがコメント欄でシンプルな方法を教えて下さいました
>特にこだわりがなければ grabFrameBuffer を使ったほうがシンプルかもしれません

```cpp
void GLWidget::saveImage() {
    grabFrameBuffer(false).save("file.jpg");
}
```
回文の発掘

まあ、解かせていただいている身ですし、採点プログラムを書き直すことにしました。
https://github.com/cielavenir/procon/blob/master/tyama_hena_validator.rb
今後テキスト版は不要になりました。尤もtableタグの中身が変わった時に対応できなくなる可能性はありますけどね…。

解答自体は生物情報でよくあるネタの<del>ローカルアラインメントというもの</del>グローバルアラインメントを改変してギャップペナルティを0にしたものです。少し変更すれば最長回文(の一つ)を出せるようにできます。

```rb:hena15pre.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/0b56395d4c9e7c64b230
#http://nabetani.sakura.ne.jp/hena/ord15subpalin/
def local_alignment(x, y)
	#initialize
	a = Array.new(x.size+1){Array.new(y.size+1, 0)}
	back = Array.new(x.size+1){Array.new(y.size+1, 0)}
	tx = ""; ty = ""; t=""

	#DP
	1.step(a.size-1){|i| a[i][0] = a[i-1][0] - 0;back[i][0]=[i-1,0,  "a"]}
	1.step(a[0].size-1){|j| a[0][j] = a[0][j-1] - 0;back[0][j]=[0,  j-1,"b"]}
	1.step(a.size-1){|i|
		1.step(a[0].size-1){|j|
			z = [a[i-1][j-1] + (x[i-1,1]==y[j-1,1] ? 1 : 0), a[i-1][j], a[i][j-1]].each_with_index.to_a.max
			a[i][j]=z[0];
			if a[i][j]>0
				case z[1]
					when 0 then back[i][j]=[i-1,j-1,"c"]
					when 1 then back[i][j]=[i-1,j,  "a"]
					when 2 then back[i][j]=[i,  j-1,"b"]
				end
			else
				a[i][j]=0
			end
		}
	}

	#trace-back
	n=0;m=0;max=0
	(x.size+1).times{|i|
		(y.size+1).times{|j|
			if a[i][j]>max
				max=a[i][j]
				n=i
				m=j
			end
		}
	}
	return max
=begin
	_n=n
	_m=m

	while a[n][m]>0 do
		t+=back[n][m][2]
		n,m = back[n][m][0],back[n][m][1]
	end
	t.reverse!

	#output
	i=n;j=m
	t.chars{|c|
		case c
			when "c" then tx+=x[i].chr; i+=1; ty+=y[j].chr; j+=1;
			when "a" then tx+=x[i].chr; i+=1; ty+="";
			when "b" then tx+="";            ty+=y[j].chr; j+=1;
		end
	}

	p a[_n][_m]
	puts tx
	puts ty
=end
end

STDOUT.sync=true
while gets
	l=$_.chomp
	p [
		(l.size-1).times.map{|i|local_alignment(l[0,i].reverse,l[i+1..-1])*2+1}.max||1,
		(l.size).times.map{|i|local_alignment(l[0,i].reverse,l[i..-1])*2}.max,
	].max
end
```
play 2.2.0 upgradeの際に出る「play#sbt-plugin;2.2.0: not found」エラーの対処

普通はこんな感じで行ける。
http://www.playframework.com/documentation/2.1.3/Migration

project/build.properties
project/plugins.sbt
この２つのバージョン番号書き換えによるバージョンアップ。
あとはclean, runでうまくいく予定だった。



でもsbt 0.13.0, Scala 2.10.3 の組み合わせでの
2.1.3 -> 2.2.0のときは下記のエラーが出て、苦しんだ。

> [warn] ==== public: tried
> [warn]   http://repo1.maven.org/maven2/play/sbt-plugin_2.9.2_0.12/2.2.0/sbt-plugin-2.2.0.pom
> [warn] 	::::::::::::::::::::::::::::::::::::::::::::::
> [warn] 	::          UNRESOLVED DEPENDENCIES         ::
> [warn] 	::::::::::::::::::::::::::::::::::::::::::::::
> [warn] 	:: play#sbt-plugin;2.2.0: not found
> [warn] 	::::::::::::::::::::::::::::::::::::::::::::::
> [warn] 
> [warn] 	Note: Some unresolved dependencies have extra attributes.  Check that these dependencies exist with the requested attributes.
> [warn] 		play:sbt-plugin:2.2.0 (sbtVersion=0.12, scalaVersion=2.9.2)
> [warn] 
> sbt.ResolveException: unresolved dependency: play#sbt-plugin;2.2.0: not found



http://stackoverflow.com/questions/13737926/unresolved-dependency-sbt-org-scala-sbtsbt-2-9-10-12-1-not-found-play-exampl
http://stackoverflow.com/questions/19045124/upgrading-project-to-version-2-2-0-of-the-play-framework
この辺りが参考になりますが
結論としては


###project/plugins.sbt

```scala
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.0")
```


###project/build.properties
```scala
sbt.version=0.13.0
```


あとは

```bash
play clean
play ~run
```
これでいけました。
観測値と期待値のズレが妥当かどうかをカイ二乗検定を使ってテストするモジュールを書いてみた

一定の確率で何かが起きるメソッドが、ホントにその確率で起きているかテストしたくなったので書いてみた。統計確率とか分からんので、いろいろと調べながらなので全く自信ない！ まるっと間違えてる可能性あるw ツッコミ大歓迎。

[vkgtaro / p5-Test-ChiSquare](https://github.com/vkgtaro/p5-Test-ChiSquare)



## 使い方

```dice.t
use Test::ChiSquare;

chisquare_ok( [[23, 20], [16, 20], [21, 20], [19, 20], [13, 20], [28, 20]], 0.05, 'dice' );

done_testing();
```

サイコロを121回振っていたので修正しました >_<

chisquare_ok の第一引数は、 ```[観測値, 期待値]``` の配列。
上の例はさいころを120回振ったときのそれぞれの目の観測値と期待値を配列にしてる。120回振ったらそれぞれの目の期待値は一律20だよね？
第2引数は有意水準。


## 内部の動き

1. カイ二乗検定の式に従ってカイ二乗値を求める
2. 項目数 - 1 で自由度 k を求める。今回は項目数が6なので5。
3. カイ二乗分布の式で、自由度 k と有意水準から値を求める
 * 今回は 自由度 5 で 有意水準が 5% なので、11.07
4. 1 で求めたカイ二乗値が 3 で求めた値より小さければ ok。（観測値は期待値に近しいと言える）

実際に、 rand() つかってさいころ作って試してみたけど何度か test が fail した。さいころを振る回数（試行回数）が少ないのかも。


## 参考

* [カイ二乗検定 (wikipedia)](http://ja.wikipedia.org/wiki/%E3%82%AB%E3%82%A4%E4%BA%8C%E4%B9%97%E6%A4%9C%E5%AE%9A)
  * [カイ二乗分布(wikipedia)](http://ja.wikipedia.org/wiki/%E3%82%AB%E3%82%A4%E4%BA%8C%E4%B9%97%E5%88%86%E5%B8%83)
* [ランダムに振る舞う機能を JUnit する #渋谷Java 第３回](http://sssslide.com/speakerdeck.com/komiya_atsushi/randamunizhen-ruwu-uji-neng-wo-junit-suru-number-shibui-gu-java-di-3hui)
  * [実例: ChiSquaredTestMatcher.java](https://gist.github.com/komiya-atsushi/6736271)
* [Statistics::Distributions (CPAN)](http://search.cpan.org/~mikek/Statistics-Distributions-1.02/Distributions.pm)
  * 統計で使う公式っぽいのがたくさん入ってるっぽい
  * カイ二乗分布は chisqrdistr で求められる……と思う。
  * そもそもここが間違えていたら残念なことにw

そもそもカイ二乗を求めるっぽいその名の通りのモジュール ( [Statistics::ChiSquare](http://search.cpan.org/~dcantrell/Statistics-ChiSquare-0.6/lib/Statistics/ChiSquare.pm) ) もあったんだけど、カイ二乗分布の表を二次元配列で持っていたりとか、返って来る結果がメッセージだったりとかでスルーした。
仮想環境上のCentOS 6の名前解決をmDNSで手軽に実施する

Oracle  VM VirtualBoxなどの仮想環境としてCentOS 6を作成したときにホストOS側からゲストOSの名前解決を手軽に実施する方法。

## 手順

1.  EPELリポジトリにある「nss-mdns」パッケージをインストールする
2. system-config-firewall-tuiなどで「Multicast DNS (mDNS)」を許可する
3. rebootする

rebootはAvahiデーモンの起動やiptablesの設定再読み込みなどでも代替できるが、*手軽に*ということでrebootする。

## 解説

### nss-mdnsパッケージのインストール

EPELリポジトリを登録していない場合は「nss-mdns」パッケージのあるURLを指定してインストールしてやってもOK。（avahiなどもインストールする必要があるのでyumに渡すと手っ取り早い）

```
$ sudo yum install http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/6/x86_64/nss-mdns-0.10-8.el6.x86_64.rpm
```

名前解決の方法として使うために/etc/nsswitch.confの修正が必要だが、EPELにあるパッケージだとに自動で以下のように追加してくれる。順番が気に入らない場合は手をいれると良い。

```
 grep ^host /etc/nsswitch.conf
hosts:      files mdns4_minimal [NOTFOUND=return] dns
```

### mDNS

どういうものかを知りたい場合は http://multicastdns.org/ あたりを読めばよいと思うよ。CentOSではAvahiという実装が搭載されています。

以下のように「ホスト名.local」という名前で解決できるように動いているはず。

```
$ ps auxwww|grep local |grep ^avahi
avahi     1242  0.0  0.0  27784  1640 ?        S    22:34   0:00 avahi-daemon: running [cent6u.local]
```

### iptables

mDNSで名前解決するときにはIPアドレス「224.0.0.251」の5353ポートを使うので、それを許可するようにする。

system-config-firewall-tuiだとudpしか許可させないので、必要に応じてtcpも許可しておくと良い。
urllib.parse.quote関数使用時の注意


URLエンコードする際に使用するurllib.parse.quote関数(Python2ではurllib.quote関数)は、デフォルトではパス区切り文字(/)をエンコード対象にしない。

```quote_help
>>> help(urllib.parse.quote)

# 引数safeで指定された文字列はエンコード対象外となる。
quote(string, safe='/', encoding=None, errors=None)
    quote('abc def') -> 'abc%20def'
    
(…)

    By default, the quote function is intended for quoting the path
    section of a URL.  Thus, it will not encode '/'.  This character
    is reserved, but in typical usage the quote function is being
    called on a path where the existing slash characters are used as
    reserved characters.
```

そのため、TwitterAPIなどでURLを含む文字列をエンコードする場合、第二引数(あるいは名前付引数safe)を`''(空文字)`に設定する必要がある。

```python:quote_safe
# パス区切り文字(/)がエンコードされない
>>> urllib.parse.quote('http://hoge.com/api')
'http%3A//hoge.com/api'

# パス区切り文字(/)がエンコードされる
>>> urllib.parse.quote('http://hoge.com/api', '')
'http%3A%2F%2Fhoge.com%2Fapi'
>>> urllib.parse.quote('http://hoge.com/api', safe='')
'http%3A%2F%2Fhoge.com%2Fapi'
```
オートフォーカスしてカーソルを末尾に移動させる小技

**【2021/10/15 追記】**
**この記事は更新が停止されています。現在ではブラウザの動作が変化している面もありますので，過去の記事として参考程度にご覧ください。**

HTML5の **autofocus** 属性を使うとChrome以外でうまく動作しないので別の方法を採用しました。
jQueryを使ったほうが短く書けますが、ここでは使わずに書いてみます。

```php:PHP
$val = isset($_GET['val']) && is_string($_GET['val']) ? $_GET['val'] : '';
$val = htmlspecialchars($val, ENT_QUOTES, 'UTF-8');
```

```javascript:JavaScript
function load_focus() {
  var elm = document.test_form.test_text;
  var val = elm.value;
  elm.value = '';
  elm.focus();
  elm.value = val;
}
```

```html:HTML
<body onload="load_focus()">
<form name="test_form" method="get" action="">
<label>TestText: <input type="text" name="test_text" value="<?=val?>"></label>
<label><input type="submit" value="送信"></label>
</form>
</body>
```

- 入力済みのvalueがある場合は一度空にする
- フォーカスしてから値をセットする

この2点を守るのがポイントです。
これで

- Internet Explorer
- Mozilla Firefox
- Google Chrome

3ブラウザとも動作確認できました。
kaibun.c

問題はこちら
http://nabetani.sakura.ne.jp/hena/ord15subpalin/
他の解答例はこちら
http://qiita.com/Nabetani/items/0b56395d4c9e7c64b230

```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int search(const char *in, int s, int e, int d)
{
	int r = d;
	for(int j=s; in[j]; j++ ) {
		for(int i=e; i>=j; i-- ) {
			if( in[j] == in[i] ) {
				int tr = search(in, j+1, i-1, (j==i) ? d+1: d+2);
				if( tr > r ) r = tr;
				break;
			}
		}
	}
	return r;
}

int solve(const char *in)
{
	return search(in, 0, strlen(in), 0);
}

void test(const char *in, const char *a)
{
	int r = solve(in);
	printf("%d\t%s\n", r, (atoi(a)==r) ? "ok": "***NG***");
}

int main()
{
/*0*/ test( "I_believe_you_can_solve", "9" );    
/*1*/ test( "a", "1" );    
/*2*/ test( "aa", "2" );    
/*3*/ test( "aaa", "3" );    
/*4*/ test( "ab", "1" );    
/*5*/ test( "aabb", "2" );    
/*6*/ test( "ABBA", "4" );    
/*7*/ test( "Abba", "2" );    
/*8*/ test( "1234567890", "1" );    
/*9*/ test( "1234567890987654321", "19" );    
/*10*/ test( "abcdcba", "7" );    
/*11*/ test( "0a1b2c3d4c5b6a7", "7" );    
/*12*/ test( "abcdcba0123210", "7" );    
/*13*/ test( "abcdcba_123210", "7" );    
/*14*/ test( "_bcdcba0123210", "7" );    
/*15*/ test( "abcddcba0123210", "8" );    
/*16*/ test( "abcdcba01233210", "8" );    
/*17*/ test( "a0bc1dc2ba3210a", "9" );    
/*18*/ test( "a0bc1ddc2ba3210", "8" );    
/*19*/ test( "3a0bc1ddc2ba3210", "10" );    
/*20*/ test( "11oooo1111o1oo1o111ooooooooooo", "20" );    
/*21*/ test( "11o1111o1111oo11ooo11111ooo1oo", "20" );    
/*22*/ test( "111111oo11o111ooo1o1ooo11ooo1o", "21" );    
/*23*/ test( "11o1o1o11oo11o11oo111o1o1o11oo", "27" );    
/*24*/ test( "oo111o1o11o1oo1ooo11o1o11o1o1o", "27" );    
/*25*/ test( "1o1oo11111o1o1oo1o1o1111oo1o1o", "28" );    
/*26*/ test( "QQooooQooooQQyQoyQQQyyyyQQoyoy", "15" );    
/*27*/ test( "oQoooQooooQyoyQoyoyyyQQyQQQQoQ", "16" );    
/*28*/ test( "yyyyyooyQyyyoyyQyyooyQoQoQQoQy", "17" );    
/*29*/ test( "yyQoyQoyyQyQQoyooooyyQQyQyooQy", "24" );    
/*30*/ test( "oQQooQoQyQQoyoQQoQyQyQyQoQoooo", "24" );    
/*31*/ test( "oQQyQQyyQyQQoooyQQyyyQQQyyQQoy", "25" );    
/*32*/ test( "WAk9iHI4jVDlStyudwTNqE138kwan2", "3" );    
/*33*/ test( "c43fIu1Mlz0K9hEVOgGcUdbeB5ksa7", "3" );    
/*34*/ test( "CAbYcW5VqHjzFdIkH_61PM0TsyRuie", "3" );    
/*35*/ test( "jInQnUvSayrJTsQWujovbbqW0STvoj", "10" );    
/*36*/ test( "iZDrvpUKgtj3FrZsZ4CLjrEgUdZzQG", "11" );    
/*37*/ test( "ROgYUOu6er_DA7nB6UGquO1GUHC62R", "11" );    
/*38*/ test( "Oh_be_a_fine_girl_kiss_me", "9" );    
/*39*/ test( "8086_6502_6809_Z80", "11" );    
/*40*/ test( "xcode_visualstudio_eclipse", "11" );    
/*41*/ test( "word_excel_powerpoint_outlook", "9" );    
/*42*/ test( "abcdefghijklmnopqrstuvwxyz0123", "1" );  
	return 0;
}
```
インデントレベルが同じ行を探して移動する

``}``で次へ、``{``で前へ移動。Cなんて最近書かないのでキーバインドは思い切りました。
地味だけど便利。

```vim
func! s:IndentSensitive(backward)
  let lineNum = line('.')
  let line = getline(lineNum)
  let col = col('.')
  call cursor(lineNum, 1)
  let indentLevel = s:getIndentLevel(line)
  let nextLine = getline(lineNum + (a:backward ? -1 : 1))
  let nextIndentLevel = s:getIndentLevel(nextLine)

  let pattern = printf('^[ \t]\{%d}[^ \t]', indentLevel)
  if indentLevel != nextIndentLevel
    let hitLineNum = search(pattern, 'n' . (a:backward ? 'b' : ''))
  else
    let lastLineNum = line('$')
    let hitLineNum = lineNum
    while 1 <= lineNum && lineNum <= lastLineNum
      let lineNum += a:backward ? -1 : 1
      if lineNum < 1
        break
      endif
      if s:getIndentLevel(getline(lineNum)) != indentLevel
        break
      end
      let hitLineNum = lineNum
    endwhile
  endif

  call cursor(hitLineNum, col)
endfunc

func! s:getIndentLevel(str)
  return len(matchstr(a:str, '^[ \t]*'))
endfunc


func! IndentSensitivePrev()
  call s:IndentSensitive(1)
endfunc

func! IndentSensitiveNext()
  call s:IndentSensitive(0)
endfunc

nnoremap <silent> { :call IndentSensitivePrev()<CR>
nnoremap <silent> } :call IndentSensitiveNext()<CR>
```
VimScriptのドキュメントは8年前くらいにみたわー状態なので書き方は変かも。
Dockerを使った並列テスト 

みなさん、Dockerを知っていますか？DockerはLinuxコンテナの使用を劇的に簡単にしてくれるツールです。最近、じわじわと人気が出てきてて、QiitaでもいくつかDockerについて記事を書いている人もいます。

* [dockerインストール](http://qiita.com/tukiyo/items/b0821c2ff8cfffaa7f4e "dockerインストール")
* [docker を利用開始するまでのメモ](http://qiita.com/libero_18/items/5c0d374233653b8d93fc "docker を利用開始するまでのメモ")

DockerはコンテナベースのVM(のようなもの)を提供してくれます。VMが手軽に欲しいならVagrant使えば？とか考えると思いますが、コンテナはVMよりも軽量という利点があります。

**軽量**の利点は主にふたつあります。

**瞬間起動**: マシンの起動/停止がめちゃくちゃ早いです。VMなら停止した状態からアプリケーションを実行するまでOSをブートする時間がかかりますが、Linuxコンテナはそんなの全然ありません。マシンを起動した瞬間にアプリケーションを走らせることができます。

**複数同時起動**: 一度に沢山のインスタンスを起動することができます。VMであれば、いくら動かすアプリケーションを限定してもOSはロードされなければいけないので、それなりにメモリを食います。だから、ひとつのホストで沢山VMを同時に走らせることはできません。Linuxコンテナならできます。もちろん、ホストマシンの性能にもよりますが、VMよりは遥かに沢山です。

### Dockerの使いどころ
これらの利点を何に活かすことができるかな？？と考えた時、テストの実行環境に使うことを真っ先に思いつきました。テストはできるだけ独立した環境で実行されるのが望ましいので、VMを生成 -> テスト実行 -> 削除 という方法をしている人もいると思いますが、欠点はVMの生成/削除は重いので時間がかかってしまいます。なので、並列でやりたくなりますが前述したようにリソースを食うので沢山のマシンが必要になってしまいます。Dockerなら二つの問題を一気に解決してくれます。

### CucumberテストをDockerで並列実行してみよう
Dockerのインストールやイメージの作成は他の人も書いているので省略します。ここでは、イメージからコンテナを起動して、各コンテナにひとつのcucumber featureを実行させるというのをシェルスクリプトをつかってやる方法を紹介します。

**前提**

* kimh/ruby-baseというイメージが存在する
* kimh/ruby-baseにはテストと実行環境が整っている。(つまり、ログインしてbundle exec cucumberとやればテストを実行できる)
* ローカルマシンの ./features ディレクトリと同じ内容のファイルが kimh/ruby-baseの/git/your_app/features ディレクトリ配下にある
* １コンテナ / １feature で実行する

以下のような簡単なシェルスクリプトで実現できます。

```bash
DID=""
container="kimh/ruby-base"
dir="/git/your_repo"

for feature in `find  ./features/`
do
  DID=$DID" "`docker run -d $container /bin/bash -c "
  source /etc/profile
  cd $dir
  export LC_CTYPE="ja_JP.UTF-8"
  export RAILS_ENV=test
  bundle exec cucumber $feature -r features/
  "`
done
docker wait $DID
```

やっていることをまとめると

**1.** ./featutes以下にあるファイルを各featureファイルに分割して、feature変数に入れてイテレートする

```bash
for feature in `find  ./features/`
```

**2.** コンテナを起動して、feature変数のcucumber featureを実行するコマンドを実行して、コンテナIDを変数に格納します。

```bash
DID=$DID" "`docker run -d $container /bin/bash -c "
  source /etc/profile
  cd $dir
  export LC_CTYPE="ja_JP.UTF-8"
  export RAILS_ENV=test
  bundle exec cucumber $feature -r features/
  "`
```
`-d` はバックグランドでコンテナを起動します。`docker run`の戻り値はコンテナのIDです。後から状態を確認するのに必要になります。イテレートが終わった時点でDID変数はスペースで区切られたコンテナIDを複数もっています。こんな感じ `e106b9fea6c8 20a5059fea048 llff6orfea0dkd`

**3.** すべてのコンテナが終了するまでブロックします

```bash
docker wait $DID
```

`docker wait`コマンドは与えられたコンテナIDが停止するまで処理をブロックします。全部停止すると各コンテナの最終ステータスコードを表示します。こんな感じ。

```bash
$ docker wait e106b9fea6c8 20a5059fea048 llff6orfea0dkd
0
1
0
```
cucumberはテスト結果をステータスコードで返すので、これだけでどのコンテナのテストが成功/失敗したのかがわかりますね。

### 詳細を見る
しかし、ステータスコードだけじゃ何が失敗したのかわかりません。
詳細を見るのは`docker logs コンテナID`です。
コンテナの出力を全部見れるので、cucumberの実行ログを見ることができます。今回の例にはないですが、ステータスコードが0でなければ、そのコンテナのログを見るような処理を書けば、何が失敗したのかすぐわかるので便利だと思います。

#### まとめ
プリミティブな例でしたが、Dockerを使った並列テスト実行のイメージは掴んでもらえたでしょうか？
今回はシェルスクリプトを使ったので沢山のことはできませんが、DockerはRemote APIがあるのでこれを使えばもっと高度なこともできるます。

というわけで[baleen](https://github.com/kimh/baleen "baleen")というruby gemを作ってみました。今のバージョンではcucumberのテストを並列実行するだけですが、将来的には他の種類のテストも実行することができる、並列テスト実行ツールを目指して開発しています。

次の記事ではbaleenについて書きたいと思います。

Enjoy Docker!!
markdown使えるchat作ってみた


markdownつかえるchat作ってみました
[デモ](http://markdown-chat.herokuapp.com/)

[ソースコード](https://github.com/furushchev/markdown-chat)

やってることは単純。
* markdownのレンダリングはgithubのapiを利用
* 実装はnodejs
* chatは[socket.io](http://socket.io/)使って実装
* DBはmongo使って永続化
* 全文検索は非常にナイーブな実装方法

部屋を作る機能とかはこれから
Chefの基本



##Chefとは
サーバ設定や更新を自動化するツール。

レポジトリ＞クックブック＞レシピ
という階層で管理する。

一つのシステムにつきレポジトリ一つ、という粒度。

利用形態には以下の二つがある。
####Chef-Server + Chef-Client
→Chef ClientがChef Serverからhttpで必要な情報をGETし、実行する。ChefServerの管理はちょっと大変。

####Chef-Solo
→サーバ管理を必要としないスタンドアロン版。

##Chefのインストール

```sh
$ curl -L http://www.opscode.com/chef/install.sh | sudo bash
```
もしくは

```sh
$ gem install chef
```

## レポジトリ作成
OpsCodeがgithubに公開しているレポジトリのひな形
（後述のknife-soloを使えばそちらで肩代わりできる。）

```sh
$ git clone git://github.com/opscode/chef-repo.git
```
## クックブック作成

knifeを用いる

##knifeとは

chefレポジトリを操作するためのツール。
クックブックの作成はこれで行う。

chef solo環境で利用するのは主に以下の二つ
・knife cookbook（クックブックの作成）
・knife solo

##knifeの初期設定

```
$ knife configure
```
諸々の質問事項は全てデフォルトでok。
初期化が完了すると
~/.chef/knife.rbに設定ファイルが保存される。

##クックブックの作成
```
$ cd chef-repo
$ knife cookbook reate hello -o cookbooks
```
cookbooksディレクトリ内にhelloというクックブックを作成。

##レシピの作成
クックブック作成時点でレシピのひな形は作成済となる。

```
$ vi cookbooks/hello/recipes/default.rb
```

"Hello, Chef!"を出力するだけのレシピ。

```
log "Hello, Chef!"
```

##Chef Soloの実行
Chef Solo実行時に実行するレシピを記述するJSONファイルを用意する。
chef-repoディレクトリ直下に配置する。


```localhost.json
{
	"run_list":[
		"recipe[hello]"
	]
}
```

Chefが利用するテンポラリディレクトリやクックブックのパスを指定する設定ファイルも必要。同じくchef-repoディレクトリ直下に配置する。

```solo.rb
file_cache_path "/tmp/chef-solo"
cookbook_path ["/home/ec2-user/chef-repo/cookbooks"]
```
##実行

```
$ sudo chef-solo -c solo.rb -j ./localhost.json
```
##chef-soloの流れまとめ
・レシピを作る
・JSONファイル内で、実行レシピを指定する
・chef-soloコマンドで実行する

##レシピサンプル

###特定パッケージのインストール

```default.rb
package "zsh" do
	action :install
end
```
###複数パッケージをまとめてインストール

```default.rb
%w{zsh gcc make readline-devel}.each do |pkg|
	package pkg do
		actoin :install
	end
end
```

##iptablesをオフに

```default.rb
service 'iptables' do
	action [:disable, :stop]
end
```



※chefは何度実行しても、エラー等は発生しない。
→冪等性（何度操作を行っても、結果が同じであること）がある。


##Resourceとは

Chefが提供するDSL（Ruby組み込みの文法ではない）。
レシピ内で用いる、「サーバの状態に何らかの影響を与える命令」のこと。
log、packageなど

##ノード（node）とは

管理対象の各サーバのこと。
※その文脈で言うと、JSONファイルに書くのは特定のノードの「状態」となる。

JSONファイル内のデータ構造をNode Objectと呼び、そのプロパティとして、以下の2つを列挙する。
・そのノードに適用するべきレシピ
・そのノードが持っている変数（Attribute）

Chef Serverを用いる場合にはChef Serverに格納しておくが、
Chef Soloの場合はその格納場所がないので、ローカルにJSONファイルとして書いておく。

## knife-soloを用いた実用例はこちら

knife-soloによるChefの実行
http://qiita.com/kidachi_/items/b222fb2892e6108c46d5
第15回オフラインリアルタイムどう書くの参考問題


オフラインでリアルタイムに「どう書く」をやるイベント
http://atnd.org/events/43825
をやります。

現時点では、まだまだ空きがありますので是非。
で。

今回の参考問題は「回文の発掘」という名前で、
http://nabetani.sakura.ne.jp/hena/ord15subpalin/
です。

当日出す問題の難易度と分量はこれを目安に考えると良いと思います。
とはいえ、これよりは若干簡単にすると思います。

参加予定の方は、何分で解けたとかいう情報を付けてくださると、本番用の問題の参考になりますのでできればお願いします。

ちなみに。
本番用の問題はこれから考えます。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
vagrant + saltでpythonの開発環境を作る(salty-vagrantの導入)

vagrantとchefの組み合わせについてはいろいろ記事がありますが、saltについてはなさそうなので、簡単にまとめてみます。

#公式サイト
Vagrant: http://www.vagrantup.com/
Salt: http://docs.saltstack.com/index.html

# この記事の内容
この記事では主にSaltを使った環境構築をメインで記載します。
Vagrantについては様々な良記事がありますので、そちらをご参照ください。
いくつかの記事に分けてVagrant + Saltでの開発環境構築をやってみたいと思います。
まず手始めにマスターなし、ミニオン１つだけのVMを立ててみます。

# Vagrant-Saltのインストール
実はVagrantにはSalt用のプラグインがありますので、これを使っちゃいましょう。
https://github.com/saltstack/salty-vagrant
↑のページの「Masterless (Quick Start)」を一通りこなせば環境構築は終了です...　では流石に味気ないので以下に手順を記載していきます。(Vagrantは入っていることが前提で進めます）

* VMを立ち上げるフォルダに移動します。(ここではsalt-sampleフォルダとします)

```shell-session
cd salt-sample
```

* salty-vagrantをインストールします

```shell-session
vagrant plugin install vagrant-salt
```

* vagrantにboxを追加します

```shell-session
vagrant box add precise64 http://files.vagrantup.com/precise64.box
```

* salt-sample以下にVagrantfileを作成します。

```rb
Vagrant.configure("2") do |config|
  ## 使用するBoxを指定します。
  config.vm.box = "precise64"

  ## salt関連のファイルを同期するためのフォルダを指定します。
  config.vm.synced_folder "salt/roots/", "/srv/salt/"

  ## Use all the defaults:
  config.vm.provision :salt do |salt|
    ## ミニオンの設定ファイルのパスを指定します。
    salt.minion_config = "salt/minion"
    ## 実行時にstate.highstateを実行するための設定です。
    salt.run_highstate = true

  end
end
```
※highstateは設定ファイル通りにPCをセッティングする命令だと思ってください。


* 設定ファイルを配置するためのディレクトリを作っておきます。

```shell-session
mkdir salt
mkdir salt/roots
```

* salt-sample/salt以下にminionファイルを作成します

salt-sample/salt/minionに以下の内容をコピーしてください。

```shell-session
file_client: local
```

* vagrantを起動します。

```shell-session
vagrant up
```

# まとめ
ひとまずこれでミニオン１台のみの立ち上げが完了しました。
現状では設定ファイルが一切ないので、起動してもSaltが入っただけのすっぴんのVMが立ち上がります。
次は実際にソフトウェアをインストールしていきます。
XOOPS2系からXOOPS Cube Legacy2.1 へのアップグレード時にmailjob 関連テーブルが作成されない


XOOPS2系からXOOPS Cube Legacy2.1系へアップグレードしたときに、mailjob 関連のテーブルが作成されず、メールジョブでメールを送信しようとすると「データベースの更新に失敗しました」というメッセージが表示されることがありました。

modules/user/sql/mysql.sql を参考にmailjob関連テーブルを2つ作成したら解決したんですが、もしかしたらXOOPS2系からアップグレードするときに同じようにはまる人がいるかもしれないのでメモとして残しておきます。（もしかしたら私のアップグレード手順がどこかまずかっただけかもしれませんが）
ansible導入してみた

macの場合
============

`sudo easy_install ansible`で失敗する場合は以下でeasy_installのバージョンを更新するとよい。

```bash:
curl http://python-distribute.org/distribute_setup.py | sudo python
```

```bash:ansible実行
% ansible all -m ping
127.0.0.1 | success >> {
    "changed": false, 
    "ping": "pong"
}
```

```bash:ホストの追加
% ssh-copy-id 192.168.11.4
% echo 192.168.11.4 >> ~/ansible_hosts
% ansible all -m ping
192.168.11.4 | success >> {
    "changed": false, 
    "ping": "pong"
}

127.0.0.1 | success >> {
    "changed": false, 
    "ping": "pong"
}
```

## playbookを作る

```bash:hosts
[srv]
192.168.11.4
```


```bash:localhost.yml
- hosts: srv
  user: root
  become: yes

  tasks:
    - apt: pkg=mysql-server state=present
    - apt: pkg=mysql-client state=present
    - apt: pkg=python-pip state=present
    - apt: pkg=python-dev state=present
    - apt: pkg=python-mysqldb state=present
    - copy: src="etc/mysql/my.cnf" dest="/etc/mysql/my.cnf" owner=root group=root mode=0644
    - service: name=mysql state=restarted
```

```bash:run.sh
if [ ! -e /usr/sbin/ansible-playbook ];then
    sudo apt install -y ansible
fi
ansible-playbook -i hosts main.yml  -v
```

```bash:適用
sh run.sh
```

* [ansible公式ドキュメント](http://www.ansibleworks.com/docs/modules.html#)
* [Ansible Tutorial](http://yteraoka.github.io/ansible-tutorial/)
* [ansibleアドベントカレンダー](http://qiita.com/advent-calendar/2013/ansible)
配列関数をつかって範囲検索してみよう

PHP にはこれでもかという数の関数やクラスが用意されていますが、今回はその中でも比較的利用されているであろう配列関数の中でも比較的使われていないであろう関数を使って面倒な範囲検索の実装を簡単に済ませてみたいと思います。

例題：　3つの時間帯を0時から8時ならば朝型、9時から16時ならば昼型、17時から23時ならば夜型として、起きている時間が最も多くを占める時間帯を判定せよ

これ、比較を中心に実装すると結構面倒臭いんですよね。if 文ネストしまくったり時間帯の評価指数みたいなものをコントロールするのに明確な終わりを意味づけにくかったり。でも、`array_intersect()` を使えばすべて解決します。

```php
<?php
// 8時から23時まで起きている
$activeTime = range(8, 23);
$timeZone = array();
$timeZone['morning'] = count(array_intersect($activeTime, range(0, 8)));
$timeZone['afternoon'] = count(array_intersect($activeTime, range(9, 16)));
$timeZone['night'] = count(array_intersect($activeTime, range(17, 23)));
arsort($timeZone);
printf('You are the %s guy!', key($timeZone));
```

このように取り扱う値2進化 + 配列化することで範囲検索だとか複合検索のように複雑な実装が必要な検索処理を PHP の組み込み関数にまかせることができます。2進数の演算とかお手の物だという方にとっては冗長なアプローチだと思いますが…
因みに `array_intersect()` を繰り返すことで積が求められますし、対象となる要素を先に `array_merge()` することで和が求められますし、`array_diff()` を使えば差も求められますので、ちょっとした検索機能ならばデータベースにクエリ投げるよりも変数展開したデータを配列関数で評価した方が高速ですし実装の手間も少ないです。お試し下さい。PHP は素晴らしいですね。
Qt+OpenGLの環境を整備する


# QtのOpenGLの歴史
- Qt4系では QGLWidget などの QGL... というクラス群が用意されていた。
	- OpenGLとOpenGL ESの差異はユーザー側で吸収する必要がある。
- Qt5ではQOpenGLで始まるクラス群が追加された

ここではQt4系のQGL...のクラスを使う方法について説明する。

# Hello Qt+OpenGL

## 概要
QGLWidgetを継承したクラスをプロジェクトに追加し、

- initializeGL
- resizeGL
- paintGL

の３つのvirtual functionを実装する。

## 手順

http://www.youtube.com/watch?v=1nzHSkY4K18 の手順を参考に。

- QtGUIアプリケーションを新規作成
- .proを編集。QTに opengl を追加する
- QGLWidget を継承したクラス（ここではMyGLWidgetとする）を追加
	- Projectを右クリックし、クラスを追加。
		- 基底クラスをQGLWidgetにする
		- 型情報で QWidgetを継承を選択
- MyGLWidgetクラスに initializeGL, resizeGL, paintGLの３つの仮想関数の実装を追加する。

```cpp:myglwidget.h
...
public:
    explicit MyGLWidget(QWidget *parent = 0);
    virtual void initializeGL();
    virtual void resizeGL(int w, int h);
    virtual void paintGL();
...
```

```cpp:myglwidget.cpp
void MyGLWidget::initializeGL() {
}

void MyGLWidget::paintGL() {
}

void MyGLWidget::resizeGL(int w, int h) {
}

```

- UIにwidgetを追加。widgetを右クリックして「格上げ先を指定」し、MyGLWidgetを追加
	- この時点でビルドするとwidget部分には化けたような画像が表示される。適切にOpenGLを初期化していないため

- initializeGL, paintGLを実装

```cpp:myglwidget.cpp
void MyGLWidget::initializeGL() {
    glClearColor(0.1, 0.1, 0.1, 1);
}

void MyGLWidget::paintGL() {
    glClear(GL_COLOR_BUFFER_BIT);

    glBegin(GL_TRIANGLES);
    glColor3f(1,0,0);
    glVertex3f(-0.5, -0.5, 0);
    glColor3f(0,1,0);
    glVertex3f( 0.5,-0.5,  0);
    glColor3f(0,0,1);
    glVertex3f( 0, 0.5, 0);
    glEnd();

}

void MyGLWidget::resizeGL(int w, int h) {
}
```

- このような画像が描画される

![kobito.1381728084.266932.png](https://qiita-image-store.s3.amazonaws.com/0/28792/65b564d7-4945-cf37-bb38-53af0c4fe074.png "kobito.1381728084.266932.png")

- 今回のソースは https://bitbucket.org/yohm/helloqtgl に置いた。
tumblrのテンプレートをつくろう


なんか作ることになったので、
さらに言えばtumblr大好きなので、
ちょっくら調べた。

## 参考
 - [Creating a custom HTML theme | Tumblr](http://www.tumblr.com/docs/en/custom_themes)
   - 公式ドキュメント

 - [オリジナルのtumblrテーマ作りに挑戦](http://original-blog-theme.tumblr.com/)
   - いいかんじの日本語資料

## 基本
tumblrには、

 - 投稿一覧:  ```/```
 - 投稿詳細:  ```/posts/{投稿ID}```
 - タグごとの投稿一覧: ```/tagged/{タグ名}```
 - 日付ごとの投稿一覧: ```/day/{年}/{月}/{日}```
 - 検索ページ: ```/search/{検索ワード}```

と5種類のページがある。

WordpressやMTならば、このそれぞれにテンプレートを作成していくカタチだが、
tumblrの場合、 **テンプレートはひとつしかない**。
(ブログ設定画面 → テーマのカスタマイズ → 「HTMLを編集」で出るもの)

ひとつのテンプレートの中で、
現在のコンテキストを判別するblockタグをいろいろ使って、表示するものを決めていく。

主軸になるのは ```{block:Posts}…{/block:Posts}``` というタグ。
このなかには、

 - 投稿一覧ならば、最新の投稿数件
 - 投稿詳細ならば、その投稿
 - タグごとの投稿一覧ならば、そのタグのついた投稿数件
 - 日付ごとの投稿一覧ならば、その日の投稿数件
 - 検索ページなら、検索でマッチした投稿数件

というように投稿が入ってくる。
(こまかいことを言えば、それぞれの投稿のコンテキストがループされて入ってくる)

なお、そういう仕様なので、
CSSは外部ファイルにせず、テンプレートファイルの中に埋め込んでしまうケースが多いようです。

## こういうこともできる

### 投稿一覧ページ(トップページ)でだけ表示するコンテンツ

```{block:IndexPage}…{/block:IndexPage}``` で囲むと、投稿一覧ページでだけ表示する部分を作れる。

この部分にがっつり要素を置けば、
いわゆるタンブラーっぽくない、階層のあるサイトも作ることができる。

### 投稿詳細でだけ表示するコンテンツ

```{block:PermalinkPage}…{block:PermalinkPage}```で囲むと、
ページのURL = その投稿のURL となっている時だけ表示してくれるみたい。

### 「もっと読む」
「もっと読む」が設定されている投稿のコンテキストでは、
```{block:More}…{block:More}```が表示されるので、これを使う。
このなかで、投稿の固有URIへのリンク(```{Permalink}```)を置けばよい。
(投稿詳細では、かならず投稿全文が表示される模様)

### テーマユーザーがカスタマイズできる項目を作る
テーマですべてを決めてしまうのではなく、テーマを使うユーザーがカスタマイズできる部分もいろいろ作れるみたい。

 - [Appearance Options](http://www.tumblr.com/docs/en/custom_themes#appearance-options)

## こういうことできなさそう
### 投稿の種類ごとの一覧ページをつくる
   - たとえば、動画投稿のみをまとめたページをつくるとか
   - トップページでは、動画の投稿しか表示しないようにする、ということは可能。その場合、全種類の投稿を一覧できるページはなくなってしまうけど。

### トップページ等で、タグごとに整理して投稿を表示
   - 投稿のコンテキストで、「この投稿に、あるタグが付いているかどうか」を判別する手段はないので、これは無理
   - とりあえず混ぜこぜで並べてしまって、Javascriptでむりやり引き剥がすとかいうのはあり。だいぶ無茶だけど。

### 写真の引用元情報の参照
 - ```{Caption}```にとりこまれて表示されちゃうみたい。

## カスタムページに関するあれこれ
テーマカスタマイズから追加ができる、カスタムページ。
こちらで「テーマ準拠デザイン」を選んだ場合、ページはどのように表示されるのか?

正解は 「テキスト投稿と全く同じ」、だった。
つまるところカスタムページは、 **きれいなURLを付けられるテキスト投稿**でしかないみたい。ぬー。

したがって、カスタムページを表示するレイアウトをカスタマイズしたい場合は、テキスト投稿のpermalinkページをつくる場合と全く変わらない。

```
{block:PermalinkPage}
{block:Posts}{block:Text}
{block:Title}{Title}{/block:Title}
{Body}
{/block:Text}{/block:Posts}
{/block:PermalinkPage}
```

またこの仕様からか、普通のテキスト投稿と同様、カスタムページに入力したHTMLは、 **一部タグが欠落してしまう** ようだ。
(自分が見つけた限りでは、 ```section```・```table```など)

そのため、複雑なHTML・CSSを使いたいページがあるときは、カスタムページを使うと不具合が出る可能性もある。
openVZのコンテナにログイン

TurnKeyのTemplateをダウンロードして実行するとログインができなかった・・・。
WebUIが不要になるかも。

```bash:
$ sudo vzctl start 100
$ vzlist
$ vzctl enter 100
```

deviceのpassthrough
=================

```bash:アクセス許可
# vzctl set 100 --devnodes /bus/usb/002/002:rw --save 
Setting devices
CT configuration saved to /etc/pve/openvz/100.conf
```

```bash:設定ファイルに追記される。
# tail -n 1 /etc/pve/openvz/100.conf
DEVNODES="/bus/usb/002/002:rw "
```

```bash:デバイスにアクセスできるか確認
# lsusb
```
[Go言語] httpハンドラの共通部分を取り出していい感じにする


ハンドラをラップするようなハンドラを作る関数つくればいい。

```
package main

import (
    "fmt"
    "log"
    "net/http"
)

func baseHandlerFunc(handler func(w http.ResponseWriter, r *http.Request)) http.Handler {
    return baseHandler(http.HandlerFunc(handler))
}

func baseHandler(handler http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // common
        log.Println(r.URL, r.Method)
        handler.ServeHTTP(w, r)
    })
}

// handler
func index(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "hello")
}

func main() {
    http.Handle("/", baseHandlerFunc(index))
    http.ListenAndServe(":8080", nil)
}
```
pythonist にわかりやすい C#メモ(基本的なものしかないよ)


## variable
```python
# int
num = 10
# str
name = 'nobjas'
# float
rate = 10.5
# bool
is_people = True
```

```csharp
int num = 10;
string name = "nobjas";
float rate = 10.4f;
double rate2 = 10.5d;
bool isPeople = true;
```

## list
```python
int_list = list(1,2,3,4,5)
int_list.append(6)
```

```csharp
List<int> intList = new List<int>() {1,2,3,4,5};
intList.Add(6);
```

### value in list
```python
# return True
if 2 in int_list:
    return True
else:
    return False
```

```csharp
// return true
if (intList.Contains(2)) {
    return true;
} else {
    return false;
}
```

### map
```python
filterd_list = [x + 1 for x in intList]
```

```csharp
using System.Linq;
intList = intList.Select(x => x+1);
```
でもまだLinqは制限がある場合があるので、下記のように書いた方が安全かも

```csharp
List<int> filteredList = new List<int>();
foreach (var val in intList) {
    filteredList.Add(val + 1);
}
```


## dict
```python
str_int = dict(
    hoge = 10,
    huga = 20,
    )
str_int['moge'] = 30;
str_int['hoge'] += 10;
```

```csharp
Dictionary<string, int> strInt = new Dictionary<string, int>() {
    {"hoge",10}, 
    {"huga", 20},
};
strInt.Add("moge", 30);
strInt["hoge"] += 10;
```

## if
```python
name = "nobjas"
if name == "noble jasper":
    print "full name"
elif name == "nobjas":
    print "short name"
else:
    print "unknown"
```

```csharp
using System;
string name = "nobjas";
if (name == "noble jasper") {
    Console.WriteLine("full name");
} else if (name == "nobjas") {
    Console.WriteLine("short name");
} else {
    Console.WriteLine("unknown");
}
```

## loop
```python
sample_list = range(10);
for n in sample_list:
    print n
```

```csharp
using System;
using System.Linq;
IEnumerable<int> sampleList = Enumerable.Range(0, 10);
foreach (int n in sampleList) {
    Console.WriteLine(n);
}
```
Wordpress+All in One SEO Pack+MarsEditで気をつけたいこと


# はじめに

Wordpressを使っている方の中には、SEO対策のためにAll in One SEO Packというプラグインを入れて活用されている方も多いかと思います。そのプラグインが提供する、以下のカスタムフィールドをMarsEdit等のブログソフトウェアで書き換えるためには、Wordpressの初期インストール時、及び更新時に`meta.php`の編集をしておく必要があります。その方法をメモとして残します。

- `_aioseop_title`
- `_aioseop_description`
- `_aioseop_keywords`

# 書き換え前

```php:(Wordpressのインストールディレクトリ)/wp-includes/meta.php
function is_protected_meta( $meta_key, $meta_type = null ) {
	$protected = ( '_' == $meta_key[0] );

	return apply_filters( 'is_protected_meta', $protected, $meta_key, $meta_type );
}
```

# 書き換え後
```php:(Wordpressのインストールディレクトリ)/wp-includes/meta.php
function is_protected_meta( $meta_key, $meta_type = null ) {
	//$protected = ( '_' == $meta_key[0] );
	$protected = (( '_' == $meta_key[0] ) && ( strpos($meta_key, "_aioseop") !== 0));

	return apply_filters( 'is_protected_meta', $protected, $meta_key, $meta_type );
}
```

大事なことなので何度でも書きますが、**Wordpressの更新の度に書き換えが必要になります**。私は何日かハマりました。