OmniAICreator/Qiita-1.07M huggingface dataset:
Consul 0.2.1から0.3.1へのバージョンアップ

Consul-0.3では大きくパフォーマンスが向上しているとのことなので、([参考: About Consul ~In Depth~](https://speakerdeck.com/ijin/about-consul-in-depth)) 手元の 0.2.1 クラスタを 0.3.1 に上げるための事前検証。

公式のドキュメントによれば… [Upgrading Consul - Consul](http://www.consul.io/docs/upgrading.html)

* サーバ群を全て新しいバージョンに更新して停止、再起動
* その後クライアント(agent node)も同様に新バージョンに更新

で完了するとのことです。

まず、サーバ3台、クライアント1台の環境を用意して KVS に値を入れておきます。(consul4 がクライアント)

```
[consul4]$ consul members
consul4  192.168.0.14:8301  alive  role=node,dc=dc1,vsn=1,vsn_min=1,vsn_max=1
consul1  192.168.0.11:8301  alive  role=consul,dc=dc1,vsn=1,vsn_min=1,vsn_max=1,port=8300,bootstrap=1
consul3  192.168.0.13:8301  alive  role=consul,dc=dc1,vsn=1,vsn_min=1,vsn_max=1,port=8300
consul2  192.168.0.12:8301  alive  role=consul,dc=dc1,vsn=1,vsn_min=1,vsn_max=1,port=8300

[consul4]$ curl -X PUT --data-binary "foobar" localhost:8500/v1/kv/foo
true
[consul4]$ curl localhost:8500/v1/kv/foo
[{"CreateIndex":19,"ModifyIndex":24,"Key":"foo","Flags":0,"Value":"Zm9vYmFy"}]
```

consul1をバージョンアップ(停止後、バイナリ入れ替え)して起動

```
[consul4]$ consul members
consul4  192.168.0.14:8301  alive  role=node,dc=dc1,vsn=1,vsn_min=1,vsn_max=1
consul1  192.168.0.11:8301  alive  role=consul,dc=dc1,vsn=2,vsn_min=1,vsn_max=2,build=0.3.1:,port=8300
consul2  192.168.0.12:8301  alive  role=consul,dc=dc1,vsn=1,vsn_min=1,vsn_max=1,port=8300
consul3  192.168.0.13:8301  alive  role=consul,dc=dc1,vsn=1,vsn_min=1,vsn_max=1,port=8300
```

順番に、consul2, 3 もバージョンアップして再起動

```
[consul4]$ consul members
consul4  192.168.0.14:8301  alive  role=node,dc=dc1,vsn=1,vsn_min=1,vsn_max=1
consul1  192.168.0.11:8301  alive  role=consul,dc=dc1,vsn=2,vsn_min=1,vsn_max=2,build=0.3.1:,port=8300
consul2  192.168.0.12:8301  alive  role=consul,dc=dc1,vsn=2,vsn_min=1,vsn_max=2,build=0.3.1:,port=8300
consul3  192.168.0.13:8301  alive  port=8300,role=consul,dc=dc1,vsn=2,vsn_min=1,vsn_max=2,build=0.3.1:
```

最後に consul4 をバージョンアップして再起動

```
[consul4]$ consul members
Node     Address            Status  Type    Build  Protocol
consul4  192.168.0.14:8301  alive   client  0.3.1  2
consul1  192.168.0.11:8301  alive   server  0.3.1  2
consul2  192.168.0.12:8301  alive   server  0.3.1  2
consul3  192.168.0.13:8301  alive   server  0.3.1  2
```

`consul members` の出力結果が変わりましたが、これで全て更新完了。

サーバを入れ替えつつKVSの値を継続的に取得してモニタリングしたところ、leaderがいなくなって新leaderが選出されるタイミングで1,2秒程度取得できない (rpc error: No cluster leader) 現象は出るものの、データを失うことなくローリングアップデートできました。
関数型言語メモ (WIP)


F# 勉強中。

命令型言語に宣言型 (関数型言語) の考え方を持ち込むのと、関数型言語 (宣言型) に命令型の考え方を持ち込むのでは、基本が異なる。その基本となる違いを自分なりにメモ。

# 変数の捉え方

## 代入 (substitution) と束縛 (binding) の違い

### 命令型における代入

代入 (substitution) とは、例えば JavaScript であれば以下のように書く:

```javascript
var x = 100;
```

これは、`x` という変数の箱に、`100` という値を入れておく「箱モデル」。主従関係は、主が変数 `x` であり、従が値 `100` であるという捉え方。

変数 `x` という箱には、いくらでも新しい値を代入可能。これを破壊的代入と呼ぶ。

### 宣言型における束縛

束縛 (binding) とは、例えば F# であれば以下のように書く:

```fsharp
let x = 100;;
```

これは、`100` という値に、`x` というラベルを貼り付ける「名札モデル」。主従関係は、主が値 `100` であり、従が変数 `x` であるという捉え方。

値 `100` には、変数 `x` という名札が束縛されており、この値を呼び出すための一意の識別子として変数 `x` が存在している。これは不変 (= immutable) な関係であり、お互いの関係をすげ替える事はできない。

#### シャドウイング

宣言型において変数と値は不変な関係を持つと言われると、次のような行為が不可能なように思われる:

```fsharp
let x = 100;;
let x = 1;;
```

変数 `x` に値 `100` が束縛された後、変数 `x` に値 `1` を束縛している。これは不正ではなくシャドウイング (shadowing) と呼ばれる捉え方で解釈する。

値 `100` も値 `1` も不変な存在であるため、変数に `x` に束縛される前も後も、その存在は不変である。ただそれらにアクセスするための識別子である変数 `x` という名札がどのように機能するか、そのルールを知れば良い。

シャドウイングというルールにおいては、もっとも後で、束縛されたものが優先される。

つまりこの場合は;

```fsharp
let x = 1;;
```

が優先される束縛となる。故に変数 `x` を参照すると、値 `1` が得られる事となる。

# 高階関数

## カリー化

F# において関数への複数引数の適用は、カリー化と同一である。

長方形の面積を求める関数 `areaOfRectangle` について考える:

```fsharp
let areaOfRectangle w h = w * h
```

上の関数と下の関数は同義となる:

```fsharp
let areaOfRectangle = fun w h -> w * h
```

```fsharp
let areaOfRectangle = (fun w -> (fun h -> w * h))
```

```fsharp
let areaOfRectangle w = fun h -> w * h
```

### 部分適用

この関数を次のように部分適用してやる事が可能:

```fsharp
let areaOfRectangleWithWidth5 = areaOfRectangle 5
```

次の 2 つの関数は同じ値 `50` を返す:

```fsharpi
> areaOfRectangle 5 10 = areaOfRectangleWithWidth5 10;;

val it : bool = true
```

### 引数の順番

> 部分適用を重視し、先に適用できるものがあるとすればそれは何か、最後までその決定を引き延ばしたいものは何かを考えるのです。 [...]
> [...] 付加的な情報を先に与えておいて、最も重要な情報はパイプライン演算子によって最後に流し込むのです。
apache(htaccess)でリバースプロキシー経由のHTTP/HTTPS転送

よくある話なのでメモ。

htaccessを使ってhttpからhttpsに転送する設定です。

```apache
RewriteEngine on
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
```

だけど例外として、リバースプロキシーを経由してhttpsじゃなくなっている場合は上記では動作しません。httpになった状態でリクエストが送られてきますので、この場合だとhttpsへ延々と転送し続けるリダイレクトループが発生します。


その場合は以下のように追加したヘッダーを元に転送する設定にします。httpで/form/から始まるURLならhttpsに転送します。/form/以外はhttpに転送する設定も書きます。

```apache
  RewriteEngine on
  RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
  RewriteCond %{REQUEST_URI} ^/form/
  RewriteRule (.*) https://www.hogehoge.jp%{REQUEST_URI} [R=301,L]

  RewriteCond %{HTTP:X-Forwarded-Proto} ^https$
  RewriteCond %{REQUEST_URI} !^/form/
  RewriteRule (.*) http://www.hogehoge.jp%{REQUEST_URI} [R=301,L]
```



転送元のリバースプロキシー設定はこんな感じです。poundの設定ですが分かると思います。ヘッダの追加がポイントです。

```text
ListenHTTP
  Address xxx.xxx.xxx.xxx
  Port    80
  AddHeader  "X-Forwarded-Proto: http"
  RewriteLocation 0
  Service
    BackEnd
      Address www.hogehoge.jpx
      Port    80
      TimeOut 30
    End
  End
End

ListenHTTPS
  Address xxx.xxx.xxx.xxx
  Port    443
  Cert "/usr/local/etc/pound/ssl/www.hogehoge.jp/ssl.globalsign.com.key_crt_cer"
  xHTTP      0
  AddHeader  "X-Forwarded-Proto: https"
  RewriteLocation 0
  Service
    BackEnd
      Address www.hogehoge.jpx
      port 80
      TimeOut 30
    End
  End
End
```

すっきり。
UITableViewのtableHeaderView/tableFooterViewで高さが合わない問題

#tableHeaderView/tableFooterViewの高さがUITableViewのスクロール領域に反映されないとき

UITableViewを使用しているとtableHeaderView/tableFooterViewに
UIViewが設定できるけど、代入の順番を間違えるとUITableViewのContentSizeに反映されない。

#たとえばフッタに広告を設定するとき
```objc
    // 広告設定
    _bannerView= [[[GADBannerView alloc] init] autorelease];
    _bannerView.backgroundColor = [UIColor blackColor];
    _bannerView.frame = CGRectMake(0,
                                   0,
                                    GAD_SIZE_320x50.width, GAD_SIZE_320x50.height);        
    self.tableView.tableFooterView = _bannerView;
```
Viewのframeを設定してからtableFooterViewに代入すればちゃんとContentSizeにも反映される。

##これはダメ
```objc
    // 広告設定
    _bannerView= [[[GADBannerView alloc] init] autorelease];
    self.tableView.tableFooterView = _bannerView;

    _bannerView.backgroundColor = [UIColor blackColor];
    _bannerView.frame = CGRectMake(0,
                                   0,
                                    GAD_SIZE_320x50.width, GAD_SIZE_320x50.height);        
```
tableFooterViewに代入してからframeを設定し直すと、上のレイヤーであるUITableViewのContentSizeまで変更が伝わらないみたい
nginxで複数のバーチャルホストが設定されている時のデフォルトサーバ


nginx を使って複数のバーチャルホストを設定していて、
IPアドレスや、設定されていないホスト名でアクセスがあった時に表示するデフォルトサーバが、
おかしくなったので調査した事のメモ。

nginx.conf を流用して バーチャルホストの設定を conf.d に追加していくと、
include conf.d/*.conf で.confのつくファイルが全て読み込まれてしまうため、
順番がどうなっているのか分からなくなってしまいます。

バーチャルホストを設定するコンフィグファイルを include する順番を書いておけば、
こういった問題は起こらないと思います。

Apache だと apachectl -S とかで読み込まれたコンフィグの中で、
どのファイルが default server になっているかが確認出来るので便利なのですが、
nginx だとそういうコマンドがあるのか分かりません。

調べたところいくつか設定されたバーチャルホストの設定から、
明示的に default server を指定する方法があったのでメモしておく。

#### http の場合
```
listen       80 default_server;
```

#### https の場合
```
listen       443 ssl default_server;
```

バーチャルホスト設定内の listen ディレクティブに
default_server と書いておくと、
複数あるバーチャルホスト設定の中からその設定をdefault server として使用する。
NVM の nvm.sh を遅延ロードしてシェルの起動を高速化する

NVM のインストール手順は .bashrc や .zshrc に `source ~/.nvm/nvm.sh` を記述するよう指示している。しかし nvm.sh は比較的複雑なので `source` に時間がかかり、インタラクティブシェルの起動がわずかに遅くなる。できればこのタイムロスをなくしたい。

 nvm.sh の大半を占めるコードは `nvm` コマンドに関するものであるため、 `nvm` コマンドを実行するときに初めて nvm.sh をロードするようにしてみる。

```zsh:.bashrc|.zshrc
# 仮の nvm コマンド
nvm() {
	# まず仮の nvm コマンドを unset
	unset -f nvm

	# nvm.sh をロード
	# ここで本物の nvm コマンドが定義される
	source "${NVM_DIR:-$HOME/.nvm}/nvm.sh"

	# 仮の nvm コマンドに渡された引数を本物に受け渡す
	nvm "$@"
}
```

このままでは `nvm` コマンドを実行するまで Node が `$PATH` に追加されない。パスは .bash_profile または .zshenv で明示的にセットする。

```zsh:.bash_profile|.zshenv
# あらかじめ `nvm default vX.Y.Z` してエイリアス "default" を作っておく

PATH=${NVM_DIR:-$HOME/.nvm}/default/bin:$PATH
MANPATH=${NVM_DIR:-$HOME/.nvm}/default/share/man:$MANPATH
export NODE_PATH=${NVM_DIR:-$HOME/.nvm}/default/lib/node_modules

# （以下 Zsh のみ）
# $NODE_PATH にバージョン番号が含まれていないと `yo doctor` が警告を出す
# 次のように書くと $NODE_PATH のシンボリックリンクが展開され、警告が出なくなる
# (Hint: .nvm/default は .nvm/vX.Y.Z へのシンボリックリンク)
NODE_PATH=${NODE_PATH:A}
```
FcitxのIMEをEscapeでOffにする


#なぜIbusではなくFcitxか

## notificationで殺されるIbus

ここ最近、Chromeの通知のたびにIbusが応答しなくなる(Mozcが強制OFFになる) 現象に悩まされていました。
Androidの通知を連動させているので、結構頻繁にIbusが応答しなくなるのは結構辛い。
Slackとかやってらんないっす。
(追記：と思っていたら普通にChrome上だとChromeの通知に殺されるのは変わっていない？)

# そこでFcitxの出番です

## Fcitxのinstall(apt)
`sudo apt-get install fcitx fcitx-mozc`

## Escapeでオフにしたいよ

通常、Fcitxをオフにするホットキー設定は  

    Fcitxの設定 > 全体の設定 > ホットキー > 拡張オプション表示 > 入力メソッドをオフに  

## なんと言うことでしょう
実ははこのUI、Escapeを受け付けてくれません。  
というかEscapeでキャンセルなんだよな。
vimmerだとEscapeでIMEをOffにして、更にInsretモードからCommandモードに切り替えて欲しいはずです。それができない。どうしてこうなった。

(実際VimだとFcitx.vimというプラグインでFcitxの状態を変更可能ですが、こちらはIMEの状態を保持してしまうんですね。毎回OffからOnに戻った時は半角英数にしてほしい。というのが背景にありました。)

## Fcitxのファイルを直編集

まぁそうしますよね。
$HOME/.config/fcitx/config
35行目あたりの`InactivateKey`を探してください。
下記のように書き換えましょう。

```bash
# 入力メソッドをオフに
InactivateKey=ESCAPE CTRL_[
```

これで完了です。

![set_escape.png](https://qiita-image-store.s3.amazonaws.com/0/9296/0d8033c0-6cad-b3d9-2961-cbf8cb69f6eb.png)

GUI側からも設定が正しくされているのがわかります。

Fcitxいいですよね。
地味にCtrl+;のクリップボード履歴とか助かります。

それでは良いFcitxライフを！
再起動後もコンテナを自動起動する

参考: [AWS+CoreOS+Dockerでコンテナの自動起動 1 - Qiita](http://qiita.com/aki/items/979b25ff555eb7ab96fc)

coreosにて確認。

このやり方だとなんでも出来ますね。

`/etc/systemd/system/docker1.service`ファイルを作成

```bash:/etc/systemd/system/docker1.service
[Unit]
Description=docker1
After=docker.service
Requires=docker.service

[Service]
ExecStart=/usr/bin/docker start dbde0d684c85

[Install]
WantedBy=multi-user.target
```

```bash:
$ sudo systemctl enable docker1
ln -s '/etc/systemd/system/docker1.service' '/etc/systemd/system/multi-user.target.wants/docker1.service'
```

```bash:一覧確認
ls -l /etc/systemd/system/multi-user.target.wants/docker*
```

再起動後も自動起動することを確認。

## コンテナ間でlinkしている場合

例: nginxコンテナ が rails にリンクしている場合、
railsから先に立ち上げないとnginxコンテナの起動ができない。

```bash:ダメな例
ExecStart=/usr/bin/docker start nginxのCID railsのCID
```

```bash:良い例
ExecStart=/usr/bin/docker start railsのCID nginxのCID
```
ここ（Windows）に「☭」という名前のファイルがあるじゃろ？

中身も「☭」(UTF8)のはずなんじゃが、そのまま type すると

```
<C:\Opt\gosrc\nyagos>
$ type ☭
笘ｭ
```

だめ。そりゃ、chcp 932 のままだからの。では、nkf32 を使ってはどうか。

```
<C:\Opt\gosrc\nyagos>
$ nkf32 < ☭
笘ｭ
```

うん、ShiftJIS で表現できない文字だからのー。

だが、先日 go で作った [ANSI エスケープシーケンスをカットするだけの cat もどき](http://qiita.com/zetamatta/items/a3f421297970468c3dd9)を通すと、あら不思議

```
<C:\Opt\gosrc\nyagos>
$ ansistrip.exe < ☭
☭
```

ちゃんと表示されるんじゃ。goの標準ライブラリがUTF8をUTF16に変換してAPIに渡してくれるんじゃ。これだけでも go を使う価値ありじゃろ？
AndroidStudio+Checkstyleで循環的複雑度を自動チェックする

[循環的複雑度(CC)](http://ja.wikipedia.org/wiki/%E5%BE%AA%E7%92%B0%E7%9A%84%E8%A4%87%E9%9B%91%E5%BA%A6)とは、20を超えていたら「このコード読めないしどうやってテストすんだよボケ」と中身を読まずにコードレビュで突き返して良い指標、ではなく、そのメソッドをちゃんとテストするのにどれぐらいの量のテストケース数が必要なのかを表す指標です。これが高かったからといって必ずしもクソコードだというわけではないですが、[コードの不吉な臭い](http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E8%87%AD%E3%81%84)を定量化したり自動監視したりするのに使える指標の一つだと言えます。

さてAndroidStudioではCheckstyle([CheckStyle-IDEA](http://plugins.jetbrains.com/plugin/1065))というプラグインを入れることで、様々なコードスタイルのチェックをリアルタイムだったりコミット時だったりに自動でかける事が出来るのですが、循環的複雑度のチェックも含める事が出来ます。

#Checkstyleの設定

[checkstyle - Metrics(CyclomaticComplexity)](http://checkstyle.sourceforge.net/config_metrics.html#CyclomaticComplexity)

```xml
<module name="CyclomaticComplexity">
    <property name="max" value="7"/>
</module>
```

これをCheckstyleの設定ファイル(XML)に追加すれば、循環的複雑度が7を超えたメソッドについて警告を出してくれるようになります。なおデフォルトの許容上限値は10です。

#許容上限値をいくつにするべきか

私は20にしています。デフォルトの10でも良いと思います。

#継続的解析

[Jenkinsを使って継続的に静的コード解析をさせる](http://d.hatena.ne.jp/suzukij/20120611/1339368249)

私はコードレビュ時に人力複雑度チェッカーになるのが嫌で導入しましたが、Jenkinsで回しても良いと思います。

#Checkstyle以外の静的解析ツール

* [Javaを書く新入社員のみなさん、FindBugsは絶対入れよう！](http://d.hatena.ne.jp/hoxo_m/20120405/p1)
* [PMD vs FindBugs](http://works.dgic.co.jp/djwiki/Viewpage.do?pid=@504D442076732046696E6442756773)

FindBugs([FindBugs-IDEA](http://plugins.jetbrains.com/plugin/3847?pr=idea))、PMD([QAPlug - PMD](http://plugins.jetbrains.com/plugin/4596?pr=))あたりが有名みたいですね。

#実際にどんな感じで怒られるのか

![スクリーンショット 2014-07-22 16.54.25.png](https://qiita-image-store.s3.amazonaws.com/0/47823/52d9947f-4b4d-0427-97bd-386424d7d9a6.png)

こんな感じの右寄りのコードがあると(real-time reportで既に赤くなって怒ってるけど)

![スクリーンショット 2014-07-22 16.57.10.png](https://qiita-image-store.s3.amazonaws.com/0/47823/6c4533f5-d343-ba15-75b5-0a43ecef5cbf.png)

許容上限を10に設定してあるので、CCが14になってんぞぼけ、と無事怒られました。

#追記

https://www.jetbrains.com/idea/documentation/inspections.jsp

Android Studio標準のインスペクタでもCCのチェックは出来るらしい。今手元にAndroidStudioが無いのでまだ確認はしてない。thx @masanobuimai
bowerの依存でプライベートなリポジトリを引っ張る

[private-bower](https://www.npmjs.org/package/private-bower "private-bower") を使うという方法もあるけど、大げさなのでhttpsのベーシック認証で軽く済ませたい。


ユーザー名とパスワードは知ってるとして my_repoを引っ張りたい場合

```
bower install https://username:password@github.com/username/my_repo.git 
```

で良いっぽいけど、間違って公開してしまったらパスワード漏れるので注意が必要
NetBeansのサーバー設定のサーバー名の保存場所

NetBeansの「ツール」ー「サーバー」から、NetBeansで制御できるサーバーアプリケーションを登録できますが、なぜかサーバ名を更新できないみたいです。（新規作成時はわかりにくいけど指定できる）

このサーバー名を変更するには、設定ファイルを直接書き換えればいいのですが、どこにその設定ファイルがあるか調べてみました。

よく修正しようとして時間かけて探すのでメモがてら残しておきます。


## linux

~/.netbeans/8.0/config/GlassFishEE6/Instances/.nbattrs

## Mac

~/Library/Application Support/NetBeans/8.0/config/GlassFishEE6/Instances/.nbattrs


.nbattrsみたいな隠しファイルに隠れています。なにか検索で設定ファイルのありかを探すときは隠しファイルも検索に含めるのを忘れないように。
golangのwebサーバでDirectoryIndexを使う

* [Go - クロスコンパイルに感動した - Qiita](http://qiita.com/tukiyo3/items/9475175b3c8f42c03d84)
* [golang - exe実行時コマンドプロンプトを非表示 - Qiita](http://qiita.com/tukiyo3/items/8848ec63e6bce98ed4f4)

```go:document_root.go
package main

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

func main() {
    if runtime.GOOS == "windows" {
        http.Handle("/", http.FileServer(http.Dir("c:/")))
    } else {
        http.Handle("/", http.FileServer(http.Dir("/")))
    }
    fmt.Print("Listening 8080 port")
    //http.ListenAndServe(":8080", nil)
    http.ListenAndServe("127.0.0.1:8080", nil)
}
```

ファイル一覧を読み取り専用で取得できる。

* http://127.0.0.1:8080/
Flex navigateToUrlメソッドによるSecurity Error #3769

##現象
Flexでサーバー上の静的リソースを取得する場合などで
navigateToUrlメソッドを使うとセキュリティエラーが発生する。

##原因
13.0.0.214においてセキュリティーの修正が行われています。
これにより、anvigateToUrlメソッドではrequest headerの変更が禁止されたようです。
例えば、contentTypeをapplication/octet-streamへの変更が不可能になっています。

###参考
[Bug#3759971 - Security error #3769 is too excessive, breaks navigateToUrl()](
https://bugbase.adobe.com/index.cfm?event=bug&id=3759971)

##対応
現状では回避策は無いようです。
私の環境では、POST、contentType無しに修正できたので上記エラーを回避することができました。
turnipの書き方メモ


※この記事はturnipのメモになるので、更新されていく予定です。
良い書き方があったらご教示ください。

~~~feature

Feature: ◯◯ページのリンクが正しく動作する
  Backgroud:
    Given ◯◯ページにアクセスする

  # 内部リンクの時
  Scenario:
    When "内部リンク" をクリックした時
    * パスが "" になっていること
    * 遷移先で "センテンス" という文字列が含まれていること

  # 外部リンクの時
  Scenario:
    When "外部リンク" をクリックした時
    * URLが "http://◯◯.com/" になっていること
    * リンク切れになっていないこと
  
~~~

~~~step
step '○○ページにアクセスする' do
  url = "http://127.0.0.1/"
  visit url
end

step ':click_page をクリックした時' do |click_page|
  click_link click_page
end

step 'パスが :path になっていること' do |path|
  expect(current_path).to eq path
end

step 'URLが :url になっていること' do |url|
  expect(current_url).to eq url
end

step '遷移先で :sentence という文字列が含まれていること' do |sentence|
  expect(page).to have_content sentence
end

step 'リンク切れになっていないこと' do
  expect(response.status).to eq(200)
end
~~~
LaTeXののの話

数式書くのつらくなってきて数式モードの中に「てふかくのつらい」って書いたら,

$$てふかくのつらい$$

のの形おかしくない？

$の$

$$ののののの$$

「TeX 数式モード の」とかで検索しても引っかからないし謎
誰か教えて
AdWordsスクリプト：マッチタイプを絞り込み部分一致に変更する

```マッチタイプを絞り込み部分一致に変更する.js
var LABEL_NAME = '絞り込み部分一致に変更';

function main () {
	executeKeywordWithLabel(LABEL_NAME, function (keyword) {
		// 作成するキーワードの基礎情報
		var broadMatchModifierText = getBroadMatchModifier(keyword.getText());
		var destinationUrl = keyword.getDestinationUrl();
		var maxCpc = keyword.getMaxCpc();
		Logger.log(broadMatchModifierText);

		// 新規のキーワードの登録
		keyword.getAdGroup().createKeyword(broadMatchModifierText, maxCpc, destinationUrl);

		// 既存のキーワードからラベルを除去する
		keyword.removeLabel(LABEL_NAME);

		// 既存のキーワードを停止する
		keyword.pause();
	});
}

/**
 * 元のキーワードを絞り込み部分一致に変更するための関数
 */
function getBroadMatchModifier(text) {
	var str = text.split(" ");
	for (var i = 0; i < str.length; i++) {
		str[i] = "+" + str[i];
	}
	return str.join(" ");
}

function executeKeywordWithLabel(labelName, callback) {
	var keywords = AdWordsApp.keywords().get();
	while (keywords.hasNext()) {
		var keyword = keywords.next();
		var labels = keyword.labels().withCondition('Name = "' + labelName + '"').get();
		if (labels.hasNext()) {
			callback(keyword);
		}
	}
	// var keywords = AdWordsApp.keywords().withCondition("LabelNames CONTAINS '" + labelName + "'").get();
	// while (keywords.hasNext()) {
	// 	var keyword = keywords.next();
	// 	callback(keyword);
	// }
}
```
statubarを20px下げてstatusバーを表示


1.
plistで
View controller-based status bar appearance

を NOにする

Status bar style

を Opaque black style にする

2.
下記コードを実装


    //iOS7以上の場合は、ステータスバー20px分下げる
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        CGRect viewBounds = [self.window bounds];
        viewBounds.origin.y = 20;
        viewBounds.size.height = viewBounds.size.height - 20;
        self.window.frame = viewBounds;
    }
    [UINavigationBar appearance].tintColor = [UIColor blackColor];
    [UINavigationBar appearance].titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor blackColor]};
    

    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
CAKEPHP で リストボックスでページング

サンプル


```php
	(<select>
		<? for ($i = 1; $i < $this->Paginator->counter("{:pages}"); $i++) { ?>
		<option value="<?= $this->Paginator->url(array('page'=>$i)) ?>" <?= $i == $this->Paginator->counter("{:page}") ? "selected" : "" ?>><?= $i ?></option>
		<? } ?>
	</select>
	<?= $this->Paginator->counter("/{:pages}")?>)<br/>
/span>"?>
```

もうすこしごちゃごちゃしないほうほうがあるやも
access_logで指定秒以上かかったログを取得

apacheのaccess_log最終フィールドに`%D`を追加

* %T :秒
* %D :マイクロ秒 (10**6)

```apache:設定例
<IfModule log_config_module>
    # LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    #LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %T" custom
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{User-Agent}i\" %T" custom
</IfModule>

<VirtualHost *:80>
   ...
    CustomLog logs/access.log custom
</VirtualHost>
```

awk

* $NF: 最終フィールド
* $N0: 行全体

```bash:2秒以上かかったログを確認
awk '$NF > 2*10**6 {print $0}' access_log > access_log.slow
```

```bash:2014年の10時にマッチする行に対して
awk '/2014:10:/{ if($NF > 2*10**6) {print $0}}' access_log >> access_log.slow
```
Swiftで条件式にOptional型が渡せる仕組みを調べた


## 2014/08/06 追記

この記事の内容は古くなりました。

Xcode6 Beta5からは`LogicValue`は`BooleanType`に変更されました。
また、`Optional`型は`BooleanType`に準拠しなくなったため、以下はコンパイルエラーになるようになりました。

```swift:
let str: String? = "あいうえお"

if str { // コンパイルエラー
    println("str=\(str)")
}
```

まだ`ImplicitlyUnwrappedOptional`の方は`BooleanType`に準拠しているようですが...

## はじめに

※TwitterやQiitaで疑問に感じられている方がいらっしゃるようなので、日頃薄々感づいていた事と憶測をミックスしてお送りします。

* Xcode6 beta4

## Swiftでは条件式の結果は論理値にする必要がある

Swiftにおいて、ifやwhile、三項演算子の条件式の結果は、Bool値にしないとコンパイルが通らなくなりました。

```swift:
let i = 1

if i { // コンパイルエラー
    println("true")
}

if i != 0 { // こっちはOK
	println("true")
}
```

```text:
Playground execution failed: error: <EXPR>:10:4: error: type 'Int' does not conform to protocol 'LogicValue'
```

で、これはそういう物なんだと覚えておいて、いざ次のようなコードに出会うと「えっ？？」ってなると思います。

```swift:
let str: String? = "あいうえお"

if str {
    println("str=\(str)")
}
```

```text:実行結果
str=Optional("あいうえお")
```

**Bool値じゃないのに何で？？**

## Swiftで条件式を評価するカラクリ

Swiftでは条件式の結果値の型が、`LogicValue`プロトコルに準拠（実装）している必要があります。

```swift:LogicValueプロトコル
protocol LogicValue {
    func getLogicValue() -> Bool
}
```

ご覧の通り、`getLgicValue()`という関数が一つだけ定義されています。

ifなどの条件式では、条件式の結果の値に対して、この関数を呼び出し、その戻り値がtrueかどうかを評価しているようなのです。

`Bool`型もこの関数を実装しています。

```swift:
extension Bool : LogicValue {
    func getLogicValue() -> Bool
    init(_ v: LogicValue)
}
```

おそらく`return self`しているだけでしょう。

`Optional`型についても、この関数を実装しています。

```swift:
enum Optional<T> : LogicValue, Reflectable, NilLiteralConvertible {
    (略)
    /// Allow use in a Boolean context.
    func getLogicValue() -> Bool
    (略)
}
```

おそらく`return self != nil`だとか"Noneじゃない"だとかそういう事が実装されているんだと思います。

というわけで、条件式は「論理値で判断している」、もっと詳しく言えば「getLogicValue()の結果で判断している」という事ですね。
これがOptional型でもエラーにならないワケです。

## 諸先輩方に怒られそうな実装

`LogicValue`プロトコルにさえ準拠していれば良いので、やろうと思えばObjective-C（C言語）の時みたいな事もできます。

```swift:
extension Int : LogicValue {
    public func getLogicValue() -> Bool {
        return self != 0
    }
}

let i = 1

if i { // ←これ
    println("true")
}
```

```text:実行結果
true
```

こういったC言語風の書き方が出来なくなっているのには理由が有ると思いますのでオススメはしません。
何故か、という事情は詳しくありませんのでどなたか教えてください。
（C#など他の言語でも論理値を強制されるものがありますね。）
OpenCVでHSV変換して色抽出

HSVに変換して色抽出する話はそこら中に転がっているのですが，
なんだかんだハマってしまったのでメモ．

http://imagingsolution.blog107.fc2.com/blog-entry-248.html
この通りやればよかったんですが，C++っぽく書き直したかったから書き直した．

## コード
~~~cpp:colorExtraction.cpp
void colorExtraction(cv::Mat* src, cv::Mat* dst,
	int code,
	int ch1Lower, int ch1Upper,
	int ch2Lower, int ch2Upper,
	int ch3Lower, int ch3Upper
	)
{
	cv::Mat colorImage;
	int lower[3];
	int upper[3];

	cv::Mat lut = cv::Mat(256, 1, CV_8UC3);   

	cv::cvtColor(*src, colorImage, code);

	lower[0] = ch1Lower;
	lower[1] = ch2Lower;
	lower[2] = ch3Lower;

	upper[0] = ch1Upper;
	upper[1] = ch2Upper;
	upper[2] = ch3Upper;

	for (int i = 0; i < 256; i++){
		for (int k = 0; k < 3; k++){
			if (lower[k] <= upper[k]){
				if ((lower[k] <= i) && (i <= upper[k])){
					lut.data[i*lut.step+k] = 255;
				}else{
					lut.data[i*lut.step+k] = 0;
				}
			}else{
				if ((i <= upper[k]) || (lower[k] <= i)){
					lut.data[i*lut.step+k] = 255;
				}else{
					lut.data[i*lut.step+k] = 0;
				}
			}
		}
	}

	//LUTを使用して二値化
	cv::LUT(colorImage, lut, colorImage);

	//Channel毎に分解
	std::vector<cv::Mat> planes;
	cv::split(colorImage, planes);

	//マスクを作成
	cv::Mat maskImage;
	cv::bitwise_and(planes[0], planes[1], maskImage);
	cv::bitwise_and(maskImage, planes[2], maskImage);

	//出力
	cv::Mat maskedImage;
	src->copyTo(maskedImage, maskImage);
	*dst = maskedImage;
}
~~~

## ハマりどころ
### LUT
LUT（ルックアップテーブル）の作成がうまくいってなかった．
3chのLUTを生成するとき，3次元の配列を突っ込むのではなくて3倍？でかい配列にする必要がありました．

#### ダメな例
~~~cpp:bad_lut.cpp
int lut[256][3];
for(int i = 0; i < 256; i++){
  for(int k = 0; k < 3; k++){
    lut[i][k] = ...
  }
}
cv::Mat lutMat = cv::Mat( 256, 1, CV_8UC3, lut );

//うまくいかない
cv::LUT(src, lutMat, dst);
~~~

### 画像のマスク
cv::MatのcopyTo(dst, mask)は，どうやらdstに非ゼロの値が入っているとマスクされないようで，
まずdstをゼロで埋める必要があるっぽいです．
今回は新しくcv::Matを用意してやりました．

## 実行例

適当なカラー画像を用意します．
色抽出するときはRGBで範囲を指定するよりもHSVの方が適しているので，
RGBをHSVに変換してから色を抽出します．

OpenCVでは，H,S,Vを以下の範囲で指定してやります．
H:色相 0~180
S:彩度 0~255
V:明度 0~255

~~~cpp:main.cpp
cv::Mat origImage; //適当に画像を突っ込む
cv::Mat extractedImage;

//H:150-165, S:100-255, V:70-255
colorExtraction(&origImage, &extracted, CV_BGR2HSV, 150, 165, 100, 255, 70, 255);
~~~

![color.png](https://qiita-image-store.s3.amazonaws.com/0/11920/4668b21b-5e17-46ee-2cb6-0545b0daf2cb.png)

マスク
![mask.png](https://qiita-image-store.s3.amazonaws.com/0/11920/1e88cf13-8995-44ee-6d3a-d946bb29496d.png)

抽出画像
![extract.png](https://qiita-image-store.s3.amazonaws.com/0/11920/771c6781-bec6-f29c-e683-51a5a88f7b00.png)


背景が少し残ってしまいましたが概ね綺麗に抽出できてます．

## 参考

http://imagingsolution.blog107.fc2.com/blog-entry-248.html
http://docs.opencv.org/modules/core/doc/operations_on_arrays.html
http://www.me.sie.dendai.ac.jp/labWiki/wiki.cgi?page=%B3%AC%C4%B4%CA%D1%B4%B9
Zabbix アクティブチェックについて

ログの監視を行う要件があり、Zabbixのアクティブチェック機能を使う必要がでてきました。
自動登録の設定をしているものでチェックが出来ないパターンがあり、検証しました。

#Zabbix-Agentの登録の定義
①手動
・登録方法
　Zabbix-Serverの管理コンソールにホストを追加する。

・Zabbix-Agentの設定
```Server = Zabbixサーバ or ZabbixProxy のIPアドレス
hostname = エージェントをインストールしたホストのホスト名
ServerActive = Zabbixサーバ or ZabbixProxy のIPアドレス
```

②自動登録（hostname）
・登録方法
　自動登録

・Zabbix-Agentの設定
```Server = Zabbixサーバ or ZabbixProxy のIPアドレス
hostname = 任意の名称
ServerActive = Zabbixサーバ or ZabbixProxy のIPアドレス
HostMetadata=自動登録の判定として定義している名称
```

Zabbixサーバの管理コンソールには「hostnameに記述した名称」が表示される
⇒固定サーバの登録に使う想定。Zabbixサーバの管理コンソールでは重複定義が許されないので、初めから名前わかっているならこっちが良いかと思われます。

③自動登録（HostnameItem）
・登録方法
　自動登録

・Zabbix-Agentの設定
```Server = Zabbixサーバ or ZabbixProxy のIPアドレス
HostnameItem=system.hostname
ServerActive = Zabbixサーバ or ZabbixProxy のIPアドレス
HostMetadata=自動登録の判定として定義している名称
```

Zabbixサーバの管理コンソールには「ホスト名」が表示される
⇒自動的にホストが増える場合（AutoScale）に使う想定

#可能な監視
実験してみたところ下記の通りでした。
Zabbix-Proxy経由でも同様の結果となります。

色々なサイトでHostnameItemを使った自動登録を紹介していますが、アクティブチェックが出来ないので要注意です。

AutoScale環境のログ監視ってやってる人居ないんですかね・・・？
生成時や起動時にzabbix_agentd.confの書き換えしないと駄目っぽいです。

| 監視方法                          |手動登録  |自動登録(Hostname)|自動登録(HostnameItem)|
|:---------------------------------|:-------:|:-------:|:-------:|
|シンプルチェック　　　　　　　　　　　|○        |○        |○        |
|zabbixエージェント監視              |○        |○        |○        |
|zabbixエージェント（アクティブ）監視  |○        |○        |×        |

※上記表の他の項目は実験していません
Scala: sbtでの文字化けを解消したい


sbtのコンソール内で文字化けするとき `-Dfile.encoding=UTF-8` をセットして解消することができるが、この設定をリポジトリに含めてプロジェクトで共有しておきたい。[sbt-extras]を使うと、設定ファイルを作ることができる。

sbt-extrasのシェルスクリプトを入れたら、まず現在の文字コードが何になっているか確認する。

```console
$ ./sbt console

scala> java.nio.charset.Charset.defaultCharset
res0: java.nio.charset.Charset = US-ASCII
```

もしこの結果がUTF-8でなければそれが原因で文字化けしている可能性がある。

.jvmoptsファイルを作る。

```txt:.jvmopts
-Dfile.encoding=UTF-8
```

sbtを起動しなおして、文字コードを確認する

```console
$ ./sbt console

scala> java.nio.charset.Charset.defaultCharset
res0: java.nio.charset.Charset = UTF-8
```

この結果がUTF-8になっていれば設定が読み込まれている。

あとは、.jvmoptsをリポジトリにコミットして共有する。

[sbt-extras]: https://github.com/paulp/sbt-extras
PASSWORD入力ボックスで、オンマウスしたときはパスワードを見せる

セキュリティ的にいいかわるいかは別にして、
オンマウスのときだけパスワードを表示してあげたら便利な場面もあるんじゃないかと思いました。


    <script>
    $(document).ready(function(){
      $('input[type="password"]').bind("mouseenter", function(){
        $(this).attr('type','text');
      });
      $('input[type="password"]').bind("mouseleave", function(){
        $(this).attr('type','password');
      });
    });
    </script>

![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/24553/2feb16fa-6186-9b8c-7d7c-1957180ec1dd.png)
名前解決できないVirtualHostに向けてリクエストを投げる

DNSからは名前解決できないし、なぜかhostsにIP直書きしても名前解決できないホストにcurlでアクセスしたかったので調べた

```bash
curl -H "Host: myvirtualhost" http://localhost/
```

これで、localhostにmyvirtualhostとしてアクセスできる
Docker: ホストからコンテナのIPアドレスを取得したい


`docker inspect`でコンテナの情報をJSON形式で取れる。加えて、`--format`で取得したいキーを絞ることことができる。


```console
$ sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' コンテナIDまたはコンテナ名
172.17.0.8
```
GAE/Goでgenやgopwtなどのツールを利用する


GAE/Goではgoappというコマンドが準備されており、`test`や`build`、`run`はこのgoapp経由で実施します。

普段使いだとそれで十分なのですが、以前紹介した[gen](http://qiita.com/soundTricker/items/72985a17c02f285cf77d)や最近ちょっと気になるGo版power-assertの[gopwt](https://github.com/ToQoz/gopwt)、[ginkgo](https://github.com/onsi/ginkgo)などCLI経由でgoをほげほげするツールを使うときは結構困ったりします。

問題はappengineのコードがコンパイルできない部分だったりするのですが、そんなに難しくなく解決できたので覚書です。

## ざっくりまとめ

やることは

1. appengineのコード落とす
2. GOPATH設定しつつコマンド叩く

です。

## やりかた

### 1. appengineのコード落とす

appengine-goは普通にコードが公開されているので取得してきます。
この時落としてきたコードがGOPATHの規則に乗っ取るよう`src`パッケージ配下に入るようにします。

```bash
$ cd $GOPATH/src
$ hg clone https://code.google.com/p/appengine-go/ appengine-go/src
```



### 2. GOPATH設定しつつコマンド叩く

ここまでできれば後は簡単です。
GOPATHに落としてきた`appengine-go`のパッケージを含めつつCLIを叩きます。
例えばgenであれば

```bash
$ GOPATH=$GOPATH/src/appengine-go:$GOPATH gen
```

の様に叩きます。


これでgoのツール類をGAE/Goでも使えるようになるはずです多分

なお`gopwt`の場合`$GOPATH/src`内にコードがいないと実行できない[バグ](https://github.com/ToQoz/gopwt/issues/7)があるので注意が必要です。

素晴らしいGAE/Goライフを！

# 2014/08/12 追記:

多分Google Cloud SDKの中にあるgorootでもOKっぽいです。
なので

```bash
$ GOPATH=/path/to/google-cloud-sdk/platform/google_appengine/goroot:$GOPATH gen
```

とかでもイケルと思います。
またコレはvim（with gocode）とかでappengineの補完が必要な場合でも同じです。
RubyMineの初期設定とショートカット


vimを色々設定いじってやってたけど、そろそろ別のエディタ使ってみたいと思いRubyがメインなのでRubyMineをDLしてみた。

30日間無料なのでとりあえず使ってみるのはオススメかと。
DLしてから設定を調べながらいじったので、備忘録として残しておきます。

##インストール
とりあえず[公式サイト](http://www.jetbrains.com/ruby/)でインストール
個人だと新規は1万ちょっと。

インストール後立ち上げる。

##初期設定

主には、ショートカットコマンドの調整と細かい設定部分。

####1.tabの設定

![スクリーンショット 2014-07-21 23.47.16.png](https://qiita-image-store.s3.amazonaws.com/0/5365/8d12792d-3fa5-749e-0fd4-d260be068836.png "スクリーンショット 2014-07-21 23.47.16.png")

デフォルトはインデントが4になってたりするので、自分は2に設定した。Tab sizeも1に変えました。

####2.typoの設定

通常だとtypoの場合、下に波線が付くようになってます。
自分で追加したメソッドにも波線が付いてしまうので、dictionaryを登録して抑制するように設定しておきます。

![rubymine設定.png](https://qiita-image-store.s3.amazonaws.com/0/5365/a620dc45-77f6-52cc-3c81-ca1298ff345e.png "rubymine設定.png")

####3.log系のデータの削除

RubyMineでは各ファイルにインデックス化を行うので、logデータが増える度にインデックス化が起こります。
重くなってしまう原因なので、管理下から削除しておきましょう。

![excluded.png](https://qiita-image-store.s3.amazonaws.com/0/5365/b0abde30-2780-d769-bbb4-184638bd71e7.png "excluded.png")

####4.gitの設定
VCS > Enable Version Control Integrationを選択すると、バージョン管理を何でやるのかが出てくるので"Git"を選択。
するとエディタの右下部にリポジトリの変更などが出来る部分が出現。
![git設定.png](https://qiita-image-store.s3.amazonaws.com/0/5365/98d81e11-f1d3-d869-9a09-1f3fd95727de.png "git設定.png")

クリックするとリポジトリを変更したり色々できます。

####5.githubの設定

Create Api Tokenを実施し、Tokenを作成
![スクリーンショット 2014-07-22 1.26.29.png](https://qiita-image-store.s3.amazonaws.com/0/5365/b15ce3e2-2326-34c9-4c85-048be41a3a1a.png "スクリーンショット 2014-07-22 1.26.29.png")

gitの使い方は[ここ](http://pivotallabs.com/everyday-git-commands-in-rubymine/)に詳しくかいてます。

####6.ショートカットの設定
Preferences > Keymap でショートカットの設定が可能です。
Find Action、Fileはかなり使うと思うのでお好みの設定に変えておくのが良さそうです。

####7.pluginの導入
Preferences > pluginsでお好みのプラグインが入れれます。
DashとVimを追加しました。
※vim emulatorは使いずらすぎて辞めましたw

![dash.png](https://qiita-image-store.s3.amazonaws.com/0/5365/f00653c8-0aa9-884f-471c-078f493ef90f.png "dash.png")

こんな感じでインストール後再起動するとtoolsに入ってます。

##ショートカットまとめ(自分用)
※随時更新しますw

| Action Name | command | 概要 |
|:-----------|------------:|:------------:|
| Jump to Source       |        command + ↓ |     メソッドジェンプ     |
| Files     |      command + shift + O |    ファイル名 検索    |
| Find Action       |       command + shift + A |     アクション検索     |
| insert <%= %>       |       command + shift + . |   <%= %>の入力       |


これでFind Action→rails consoleでconsoleを立ち上げたりできます！

##試したい事(自分用)

[RubyMineでファイルを保存した際に自動的にrubocopが走って通知センタに通知するための方法](http://qiita.com/Mahito/items/7e635dd5338ca59bc9d8)
testfairyで開発中のandroidアプリを配布

testflightの運営会社がAppleに買収された影響で、testflightのandroidアプリの配布が
できなくなってました。涙

代替サービスを探していたら、testfairyなるサービスを発見。
gradle用のプラグインも用意されていました。
https://github.com/testfairy/testfairy-gradle-plugin

デプロイもコマンド一発です。

```
gradle testfairyDebug
```

一つ難点はサービスの回線が細いのか、アプリのダウンロードが遅いことですね。
dockerとvirshの状態をWebで表示するの作った

goでWebUIを作ってみたかった。
coreosで動かしておくと便利だと思う。

```bash:coreosのtimezone設定
echo "export TZ='Asia/Tokyo'" >> ~/.profile
```

# download

[tukiyo/host_status](https://github.com/tukiyo/host_status)

* http://localhost:9876/docker
* http://localhost:9876/virsh

# systemctlに登録

```bash:/etc/systemd/system/host_status.service
[Unit]
Description=host_status
After=docker.service
Requires=docker.service

[Service]
ExecStart=/home/core/host_status

[Install]
WantedBy=multi-user.target
```

```bash:
$ sudo systemctl enable host_status
ln -s '/etc/systemd/system/host_status.service' '/etc/systemd/system/multi-user.target.wants/host_status.service'
```

# 処理

```go:host_status.go
package main

import (
    "fmt"
    "net/http"
    "os/exec"
)

func main() {
    http.HandleFunc("/docker", docker)
    http.HandleFunc("/virsh", virsh)
    http.Handle("/", http.FileServer(http.Dir("/")))
    http.ListenAndServe(":9876", nil)
}

func docker(w http.ResponseWriter, r *http.Request) {
    header(w)
    print_hr(w, run("w"))
    print_hr(w, run("free -m"))
    print_hr(w, run("(df -hm | head -n 1) && (df -hm | sort -nr -k2 | head -n 5)"))
    print_hr(w, run("docker ps -a"))
    print_hr(w, run("for i in $(docker ps -a | grep -v '^CONTAINER' | awk '{print $1}'); do echo -n $i': '; docker inspect --format '{{ .NetworkSettings.IPAddress }}' $i;done"))
    print_hr(w, run("docker images"))
    print_hr(w, run("ps aux --sort user,-rss | grep -v '^root'"))
}

func virsh(w http.ResponseWriter, r *http.Request) {
    header(w)
    print_hr(w, run("virsh list --all"))
    print_hr(w, run("virsh net-list"))
    print_hr(w, run("virsh iface-list"))
    print_hr(w, run("virsh nodeinfo"))
    print_hr(w, run("virsh help"))
}

func run(strCommand string) string {
    cmd := exec.Command("/usr/bin/bash", "-c", strCommand)
    d, _ := cmd.Output()
    return string(d)
}

func print_hr(w http.ResponseWriter, stdout string) {
    fmt.Fprintf(w, "<hr>")
    fmt.Fprintf(w, string(stdout))
}

func header(w http.ResponseWriter) {
    w.Header().Add("Content-type", "text/html charset=utf-8")
    fmt.Fprintf(w, "<style>a{padding-right:1em;}</style>")
    fmt.Fprintf(w, "<a href='/docker'>[docker]</a>")
    fmt.Fprintf(w, "<a href='/virsh'>[virsh]</a>")
    fmt.Fprintf(w, "<a href='/var/lib/libvirt/images/'>virsh/images</a>")
    fmt.Fprintf(w, "<a href='/etc/'>/etc/</a>")
    fmt.Fprintf(w, "<a href='/var/log/'>/var/log/</a>")
    fmt.Fprintf(w, "<a href='/var/lib'>/var/lib/</a>")
    fmt.Fprintf(w, "<pre style='font-size:small;'>")
}
```


# 起動方法

```bash:rootにて実行
go run host_status.go
```

docker

![スクリーンショット 2014-07-24 13.31.50.png](https://qiita-image-store.s3.amazonaws.com/0/25728/618286ad-5573-89b8-4fe3-8b3ab350f350.png)

virsh

![スクリーンショット 2014-07-24 13.30.48.png](https://qiita-image-store.s3.amazonaws.com/0/25728/f34842b3-399f-d0b4-a248-fe4c533ef8e1.png)
統計的変化点検出の手法

ログデータの異常検知を行う必要が発生したので、変化点検出の統計的な手法をざっくりと調べてみた。

## 偏差の累積和による方法
各データ点に対して標本平均との偏差の累積和を求め、これが最も大きくなる点を変化点とする方法。

手順は下記の通り。

1. 系列全体の平均値(標本平均)を計算して、各点について平均値との差を求める
2. 平均値との差の累積和を計算し、絶対値が最大になる点を変化点とする。
3. 変化点によって区切られた各区間について、1,2を再帰的に繰り返す。

平均値でなく分散を使うバージョンもある。

### 特徴
* 1次元のデータ列に適用可能。
* 変化していない部分のデータは<b>同一の確率分布</b>に従い、かつ観測値はすべて<b>互いに独立</b>であることを仮定。
* 上記を満たしていれば、データが特定の分布に従うことを仮定しない。
* もちろんデータの独立性が仮定できなければ使えないので、ログのような時間相関のありがちなデータにおいて使える場面は限定的。

### 参考/実装
* [Change-Point Analysis:A Powerful New Tool For Detecting Changes](http://www.variation.com/cpa/tech/changepoint.html)
* [Change Point Analysis](https://sites.google.com/site/changepointanalysis/) Rによる実装1
* [CPAN - Package changepoint](http://cran.r-project.org/web/packages/changepoint/) Rによる実装2

## 統計的検定に基づく手法
自己回帰モデル、多項式回帰モデルといった自己相関を表すデータ生成モデルを使い、「全てのデータ」に対してまとめてフィッティングを行った場合と、「ある点より前のデータ」と「ある点より後のデータ」に対して別々にフィッティングを行った場合とで、得られる予測値と観測値との誤差が変化しているかどうかを検定し、有意に変化している場合、この点を変化点とする手法。

### 特徴
* AR過程などに基づいてデータが生成されていることを仮定
* ARモデルを使う場合、事前に次数を決定する必要がある。
* データNに対する処理時間は$O(N^2)$

「データマイニングによる異常検知」でも言及されている手法だが、全ての候補点に対していちいち統計的検定を行うため計算量が大きくなり、オンライン処理に対して実用的でない。
(これをそのまま実装している例も見つけらなかった・・・。)

### 参考
* [Rで計量時系列分析：AR, MA, ARMA, ARIMAモデル, 予測](http://tjo.hatenablog.com/entry/2013/07/12/184704)

## ChangeFinder
* 統計的検定に基づく手法の応用。ARモデルを用いた時系列モデルの2段階学習。
* ARモデルのパラメータ推定にオンライン忘却アルゴリズムであるSDARを使うことで、計算量をデータ数に対して線形オーダーに抑える。
* 第1段階学習では観測値の外れ値スコアを計算し、これを平滑化してから第2段階学習に入力する。
  * これによってノイズによる変動を除去することができる。

### 特徴
* SDARを使った場合、データ数に対して線形時間で処理可能
* SDARの次数、忘却係数に加えてスムージングの期間を決める必要があり、こいつらのチューニングが結構センシティブ。

### 応用
SDARを別のモデルに置き換えたバージョンも提案されている。

* ARIMAモデル (参考リンク参照)
  * SDARに比べてパラメータにセンシティブでないが、オンラインアルゴリズムでなく毎回フィッティングを行うため計算量が大きい。
* カルマンフィルタ: shima_xさんによる記事 [カルマンフィルタで変化点検知](http://qiita.com/shima_x/items/a42c4b5de23bedb3b828)

### 参考/実装
* [yokkunsの日記 異常検知（変化点検出）のパッケージを作ってみた](http://d.hatena.ne.jp/yokkuns/20120930/1348978641) SDARでなくARIMAモデルを使った実装
* @yokkuns:時系列分析による異常検知入門 http://www.slideshare.net/yokkuns/ss-8425312
* [変化点検出 ChangeFinder](http://cl-www.msi.co.jp/reports/changefinder.html) NTTデータ数理システムによるレポート
* http://argmax.jp/index.php?changefinder Python実装。SDARを使ったChangeFinderと、ARIMAを使ったChangeFinderARIMAが利用可能。
* [fluent-plugin-anomalydetect 作りました](http://muddydixon.hatenablog.com/entry/2013/01/13/033752) Fluentdプラグインとしての実装。SDARを使用。
Preview! Amazon Zocalo アマゾン ゾカロ - セキュアなドキュメントのサービス(レビュー、共有、バージョン管理)

おはようございます、[cloudpack](http://cloudpack.jp) の @dz_ こと大平かづみです。

__Amazon Zocalo__ のリミテッドプレビューが利用できるようになったので、早速試してみました！

![20140722_amazon_zocalo_preview_001_intro.png](https://qiita-image-store.s3.amazonaws.com/0/3812/cbbd2491-00f5-f278-75fa-585afaaffc3a.png)

特徴
------
* エンタープライズ向け
* ユーザ管理
* __VPC__ でも利用可能！
* 既存の　__Active Directory__ と連携可能！
* __レビューシステム__ (feedback)！
* 各々のデバイスでアプリが出ています →　http://amazonzocalo.com/clients
  * デスクトップで同期: iOS, Mac
  * モバイルで: amazon app store, Apple App Store, Google play
  * ブラウザ連携: Google Chrome, Firefox
* 実際に使えたドキュメントの種類(プレビュー版で確認)
  * PDF
  * テキストファイル
  * Microsoft Word
* バージョン管理可能
* 利用料金 - 低価格！?
  * 1ユーザにつき 200GB/月 $5 !
  * フリートライアルは、30日間、50人まで、1ユーザにつき200GBストレージが利用可能！

手順: 管理者としてZocaloを運用する場合
-----
３ステップのみ！

1. Zocaloサイトを作成 (AWSコンソールから数個の設定値)
2. Zocalo サイトにアクセスして、ユーザを招待 (プレビュー版でメールによる招待を確認)
3. 同期アプリなどインストールして、利用開始！

クイックスタート
----------------

![20140722_amazon_zocalo_quickstart.png](https://qiita-image-store.s3.amazonaws.com/0/3812/656091ee-1210-5545-d94a-98cae9fc4f7c.png)

スタンダードセットアップ (DNS, NetBIOS, VPC)
-----------------
こちらが、スタンダードセットアップです。
![20140722_amazon_zocalo_standard_setup.png](https://qiita-image-store.s3.amazonaws.com/0/3812/2054ad08-8f48-b862-b4cd-66f528aa44d7.png)

サイト作成の様子
--------------------
いざサイトを作成します！しばし waiting... ACTIVATE!
![20140722_amazon_zocalo_initialize_site.png](https://qiita-image-store.s3.amazonaws.com/0/3812/c5e80fdc-0ff2-320d-7f33-18089218e809.png)

さっそく、作った Zocalo サイトにアクセス
https:// *xxx* .awsapps.com/zocalo/
![20140722_amazon_zocalo_setup_site.png](https://qiita-image-store.s3.amazonaws.com/0/3812/f8263e98-ebd7-13da-c5e6-58d1d1803794.png)

受信したメールの認証URLへ、名前とパスワードを設定します
![20140722_amazon_zocalo_setup_your_credentials.png](https://qiita-image-store.s3.amazonaws.com/0/3812/4c1c7173-4b68-2781-6bc5-df7498c816b9.png)

ネットワークの不調かリダイレクトしなかったので、再びZocaloサイトにアクセス！シンプル！
![20140722_amazon_zocalo_site.png](https://qiita-image-store.s3.amazonaws.com/0/3812/1a8ead77-7758-8f4d-e9bf-103b2fa12da4.png)

Epilogue
---------------
他にも招待やレビュー機能も少し使ってみました。
また後ほどアップします。
SPNEGO:curlで確認


/etc/krb5.conf

	[libdefaults]
        default_realm = OPENID.LOCAL

	[realms]
        OPENID.LOCAL = {
                kdc = windomain.openid.local
                admin_server = windomain.openid.local
        }


シェルでKerberos TGT(ticket-granting ticket)を取得:

    $ kinit Administrator
    
    Password for Administrator@OPENID.LOCAL: パスワード

TGTキャッシュ:

    $ klist

    Ticket cache: FILE:/tmp/krb5cc_1000
    Default principal: Administrator@OPENID.LOCAL

    Valid starting       Expires              Service principal
    2014-07-22T04:41:12  2014-07-22T14:41:12  krbtgt/OPENID.LOCAL@OPENID.LOCAL
        renew until 2014-07-23T04:41:08

        

オプション指定でcurlでアクセスできる:

	$ curl -I --negotiate -u: http://ubuntu.openid.local/i/info.php -v
    

トレース

    * Hostname was NOT found in DNS cach
    * Connected to ubuntu.openid.local (192.168.1.70) port 80 (#0
    > HEAD /i/info.php HTTP/1.1
    > User-Agent: curl/7.35.0
    > Host: ubuntu.openid.local
    > Accept: */*
    > 
    < HTTP/1.1 401 Unauthorized
    < Date: Mon, 21 Jul 2014 19:47:28 GMT
    * Server Apache/2.4.7 (Ubuntu) is not blackliste
    < Server: Apache/2.4.7 (Ubuntu)
    < WWW-Authenticate: Negotiate
    < Content-Type: text/html; charset=iso-8859-1
        
        
        
    * Connection #0 to host ubuntu.openid.local left intac
    * Issue another request to this URL: 'http://ubuntu.openid.local/i/info.php
    * Found bundle for host ubuntu.openid.local: 0x250a86
    * Re-using existing connection! (#0) with host ubuntu.openid.loca
    * Connected to ubuntu.openid.local (192.168.1.70) port 80 (#0
    * Server auth using GSS-Negotiate with user '
    > HEAD /i/info.php HTTP/1.1
    > Authorization: Negotiate YIIFngYJKoZIhvcSAQICAQBuggWNMIIFiaADAgEFoQ.....(省略)...HmXgPLE=
    > User-Agent: curl/7.35.0
    > Host: ubuntu.openid.local
    > Accept: */*
    > 
    < HTTP/1.1 200 OK
    < Date: Mon, 21 Jul 2014 19:47:28 GMT
    * Server Apache/2.4.7 (Ubuntu) is not blackliste
    < Server: Apache/2.4.7 (Ubuntu)
    < WWW-Authenticate: Negotiate YIGVBgkqhkiG9xIBAgICAG+BhTCBgqADAgEFoQMCAQ+idjB0oAMCAReibQRr2ETxT7sk/FHPLBqpARkq9LjtneuS4FUeCg9jEHv5zGylQjgzmv/xqaWlqUJ3U/hHavXX9OCQeARAF8GiihrmYxnVwZ3jXGbztQkTVLBdHGBxA3J1lh6DbsLLGtiqmg2IV/Brk15Wyynpjdc=
    < X-Powered-By: PHP/5.5.9-1ubuntu4.3
    < Content-Type: text/html
    * Connection #0 to host ubuntu.openid.local left intac
    

ユーザー名:

    $ curl --negotiate -u: http://ubuntu.openid.local/i/info.php | grep REMOTE_USER
    
    <tr><td class="e">REMOTE_USER </td><td class="v">Administrator@OPENID.LOCAL </td></tr>
    <tr><td class="e">_SERVER["REMOTE_USER"]</td><td class="v">Administrator@OPENID.LOCAL</td></tr>
iOSメモ - UITextFieldとNSUserDefaults


```objc

//編集後に呼ばれる
- (void)textFieldDidEndEditing:(UITextField *)textField
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setObject:self.idTextField.text forKey:@"ID"];
}

//View が表示される直前に呼ばれる
-(void)viewWillAppear:(BOOL)animated
{
    //画面開くと"あ、ID登録してあるやん"ってなるやつ
    self.IDtextField.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"ID"];
    NSLog(@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"ID"]);
}
```
量子コンピュータと量子通信 I 演習 3.16 解

そのうち目次用の記事を作ります。

# 演習3.16（計算困難な問題の存在）
計算するのに少なくとも $2^n /n$ 個の論理ゲートを必要とする $n$ 入力の Boole 関数が存在することを示せ。

# 用語
- 論理ゲート

```math
\alpha:\left\{0,1\right\}^k \longrightarrow\left\{0,1\right\}^l\\
```

- Boole 関数

```math
f: \left\{0,1\right\}^n\longrightarrow\left\{0,1\right\}
```
$n$ ビットから $1$ ビットへの関数は全部で $2^{2^n}$ 通りある。

# 戦略
「全ての $n$ について」と読んでしまうと、$n=1$ の時、$not,and,or$ のうちどれか $1$ つ（$\lt2^1/1$）でを使って 1 入力の Boole 関数の全てを記述出来るから、この命題は明らかに誤りである。以下では、「$n$ が十分に大きい時」と解釈して読み進める。

$2^n/n$ 個の論理ゲートによって区別できる Boole 関数の個数を調べ、それが Boole 関数の全部 $2^{2^n}$ 個に満たないことを示す。

# 解
まず、

```math
m=\left[\frac{2^n}{n}\right]
```
とする。ここで、$\left[x\right]$ は $x$ を超えない最大の整数である。

## 使える論理ゲートの種類

```math
\alpha:\left\{0,1\right\}^k \longrightarrow\left\{0,1\right\}^l\\
```
必要ならば入力側、または出力側に補助ビットを加えることで、$k, l$ の値を揃える事ができる。
用意する論理ゲートのうち、この値の一番大きい数を $A$ とする。
この時、考えられる論理ゲートの種類は全部で

```math
(2^A)^{2^A}=2^{A2^A}
```
種類である（$A$ は定数であることに注意）

## 補助ビットを含む入力ビットの上限
補助ビットを含めた入力ビットは、$m$ 個の論理ゲートを横一列に並べた時の入力ビットを超えて用意する必要は無い。その個数は、$Am$ 個である。

## 論理ゲートの配置
$2^{A2^A}$ 種類の 論理ゲートを $m$ 箇所に配置する配置の仕方は、

```math
\left(2^{A2^A}\right)^m=2^{Am2^A}
```
通り。そのそれぞれで、 $Am$ 個の入力値から $A$ 個を選べるので、分類できる Boole 関数の個数は

```math
2^{Am2^A}\cdot {}_{Am}C_A
```
で抑えられる。 $m$ が十分大きい時、

```math
\begin{eqnarray}
{}_{Am}C_A&=&\frac{(Am)!}{A!(A(m-1))!}\\
&\sim&\frac{(Am)^{Am}e^{-Am}}{A!(A(m-1))^{A(m-1)}e^{-A(m-1)}}\\
&=&\frac{1}{A!A^{-A}e^A}\cdot\frac{m^{Am}}{(m-1)^{A(m-1)}}\\
&=&\frac{A^Ae^{-A}}{A!}\cdot\left(\frac{m}{m-1}\right)^{Am}\cdot(m-1)^A\\
&\lt&2^{Am}\cdot \left(\frac{2^n}{n}\right)^A\\
&\lt&2^{Am}\cdot2^{An}
\end{eqnarray}
```

であるから、分類できる Boole 関数の個数（の対数をとった値）は、

```math
\begin{eqnarray}
\log_2\left(2^{Am2^A}\cdot {}_{Am}C_A\right)&\lt&Am2^A + Am + An\\
&=&A2^A\cdot\frac{2^n}{n} + A\cdot\frac{2^n}{n} + An\\
&=&\left(\frac{An}{2^n}+\frac{A2^A+A}{n}\right)\cdot2^n\\
&\lt&2^n
\end{eqnarray}
```
以上により、論理ゲートが $2^n/n$ 個以下では、$n$ が十分大きい時 Boole 関数の全てを記述することは出来ない。
つまり、$n$ が十分大きい時、少なくとも $2^n/n$ 個の論理ゲートを必要とする $n$ 入力の Boole 関数が存在する。
iOSメモ - NSUserDefaultsのvalueを他の画面で取り出す

[[NSUserDefaults standardUserDefaults] objectForKey:@"ID"];

> //standardUserDefaults
> Returns the shared defaults object.

https://github.com/omatty198/NSUserDefaultsSample

参考

http://d.hatena.ne.jp/glass-_-onion/touch/20110920/1316473990
[メモ]SwiftでUIActionSheetを使用する際の注意


SwiftでUIActionSheetを使う際、以下のように生成時に各種情報を指定するコンストラクタを呼ぶと落ちる。

```swift:落ちるコンストラクタ
let actionSheet = UIActionSheet(title: "test", delegate: self, cancelButtonTitle: "cancel", destructiveButtonTitle: "done")
```

[ここ](http://stackoverflow.com/questions/24198233/exc-bad-access-when-trying-to-init-uiactionsheet-in-swift])にあるように、一旦空で生成した後に必要な情報をセットするようにすれば落ちない。

```swift:生成後にセットする
let actionSheet = UIActionSheet()
actionSheet.delegate = self
actionSheet.addButtonWithTitle("ToDoを完了する")
actionSheet.addButtonWithTitle("キャンセル")
actionSheet.destructiveButtonIndex = 0
actionSheet.cancelButtonIndex = 1
actionSheet.showInView(self.view)
```

恐らくバグだと思うのでワークアラウンドとして。
[PHP] 外部のメールサーバーに IMAP で接続してメールの送信内容をテストする

PHP に IMAP サーバーに接続して受信したメール内容を取得できる imap 系の関数が用意されていることを知りました。この機能はエンドツーエンドテストに利用できそうです。

実際に送信したメールの内容をテストしているため、途中で sleep をして受信されるのを待っています。テストの方法としてはベストではないかもしれませんが、取り急ぎテストで保護したい場合に使えるのではないかと思います。

以下のテストコードは Gmail のメールサーバーに接続して、一番新しいメッセージの本文が期待したものになっているかどうかを確かめています。

```EmailTest.php
<?php

class EmailTest extends PHPUnit_Framework_TestCase{

  public function setUp(){
    mb_language('ja');
    mb_internal_encoding('UTF-8');
    $this->hostname = 'imap.googlemail.com';
    $this->port = '993';
    $this->flags = '/novalidate-cert/imap/ssl';
    $this->username = 'your_username';
    $this->password = 'your_password';
    $this->to = 'your_username@example.com';
  }

  public function testEmail(){
    mb_send_mail($this->to, 'test subject', 'test body');
    sleep(5);
    $mbox = imap_open(
      '{' . $this->hostname . ':' . $this->port . $this->flags . '}INBOX',
      $this->username,
      $this->password
    );  
    $count = imap_num_msg($mbox);
    $actual = mb_convert_encoding(imap_body($mbox, $count), 'UTF-8', 'AUTO');
    imap_close($mbox);
    $expected = 'test body' . "\r\n";
    $this->assertEquals($expected, $actual);
  }
}
```

上記のテストの手順を日本語で書くと下記となります。

1. imap_open 関数で IMAP サーバーに接続します。
2. imap_num_msg 関数でメールサーバーに保存されているメッセージの数を取得します。
3. imap_body 関数でメッセージの本文を取得します。取得したいメッセージの番号を第二引数に渡します。今回試した限りでは、古いメッセージから順番に番号がふられており、最も新しいメッセージの番号はサーバーに保存されているメッセージの数と同じ値になりました。なので、手順 2 でサーバーに保存されているメッセージの数を取得しています。
4. 取得した本文と期待された値が一致しているか確かめます。


下記を参考にしました。ありがとうございます。
http://d.hatena.ne.jp/oniloq/20121129/1354122428
Sencha Fiddle の使い方

# Sencha Fiddle の使い方

Sencha Fiddleについて日本語で書かれた記事がほとんど見当たらなかったので、
ちょっとまとめてみる。


## Sencha Fiddleとは

+ ブラウザ上でJSコードを記述実行できるものです。  
+ Touch/ExtJSの各バージョンで実行できます。  
+ Sencha Forumのアカウントがあれば、Fiddleを使って書いたコードを保存・公開することができます。  
+ Sencha Forumでの質問やバグ報告などでよく使われています。

Sencha Fiddleは[こちら](https://fiddle.sencha.com/)

----

## 画面構成

左側がコードエディター、右側がプレビューの画面になります。

![home_1.png](https://qiita-image-store.s3.amazonaws.com/0/30646/4226c164-e6a8-d272-4d0e-0288feb837bb.png)

### エディター画面

画面構成は下の画像  


![editor_1.png](https://qiita-image-store.s3.amazonaws.com/0/30646/b18484b3-8f4e-7165-270b-86a93d0e4642.png)

----

Frameworkのコンボボックスから、使用するフレームワークのバージョン・テーマが選択できます。

-----

右隅のハンバーガークリックでファイルツリーが表示されます。  
ファイル・フォルダーの追加・削除ができます。  
MVCやMVVMの構造を使って本格的に実験するときにはこちらからファイルを追加して行います。

----

実行ボタンクリックでPreviewタブに結果が表示されます。

----


### 実行エリア

##### Previewタブ

実行されたスクリプトの結果表示エリアです。


##### Layoutタブ
**Show All Triggers**ボタンを押してから実行すると、  
Senchaフレームワークがコンポーネントなどを描画するためにした計算を追うことができます。  
普段はあまり使うことがないでしょうが、表示崩れの原因を調べるときなどにここを見ると原因がわかるかもしれません。  
* ExtJS5系のフレームワーク選択時はきちんと表示されないようです、レイアウトシステムが変わったせいでしょうか（2014/07/21現在）


##### Componentsタブ
**Generate Component Tree**ボタンを押すと、生成されたコンポーネントを  
Tree構造で見ることができます。
細かいプロパティまでは残念ながら見ることができないようです。

##### Performanceタブ

**Update Stats**ボタンを押すと、applicationのinitializeやデータの読み込みにかかった時間を見ることができます。


##### Eventsタブ

**Record**ボタンを押すと、イベントの監視が行えます。
* これもExtJS5系ではうまく動かないようです。

##### JSLintタブ

JSLintを全ファイルに対して実行します。

##### JSHintタブ

JSHintを全ファイルに対して実行します。


## 利点


単純にコードを試すだけでしたら、APIドキュメントにあるLivePreviewの機能でも十分ですが、
事前の準備なしで、様々なバージョンのフレームワークを試すことができること、
コードを保存し、公開できる点がSencha Fiddleを使うメリットだと思います。

#### コードを保存・公開する

+ 画面右上 Loginボタンからログインすると、保存機能が使えるようになります。
	* Sencha Forumアカウントが必要です。

+ タイトルや説明文を入れて保存を実行すると、urlが割り振られます。
	+ **Save with Options**を選択すると、パスワードの設定をすることができます。

+ 保存されたコードはZipでダウンロードすることができます。

公開できるようにしたのが[こちら](https://fiddle.sencha.com/#fiddle/7lb)


## まとめ

まとめる必要あるかって程度の内容ですが一応まとめ。

+ いろんなバージョンが試せる（TouchもExtJSも）
+ 基本的にはapp.jsにコード書いて、previewで結果見る、動かなかったらJSHintとかでシンタックスチェックするくらい。
+ 公開機能は便利
	+ こういう書き方どうっすかとか
	+ こう書いたらこんなバグでましたとか
	+ こんなのできたぜどやぁ!とか