OmniAICreator/Qiita-1.07M huggingface dataset:
YAML <-> JSON 変換 (Rubyで実装)

YAML-JSON 変換するコマンドを Ruby で実装するメモです。

# YAML to JSON 変換
はりきって作ろうと思ったのですが、以下の実装で十分でした。

```rb:yaml2json.rb
#!/usr/bin/env ruby

require 'yaml'
require 'json'

puts JSON.pretty_generate YAML.load ARGF.read

# vi:set ts=2 sw=2 et:
```

これだけで済むんですね。ググっても該当コマンドが無いわけです。

# JSON to YAML 変換
一応、こっちも掲載。

```rb:json2yaml.rb
#!/usr/bin/env ruby

require 'yaml'
require 'json'

puts YAML.dump JSON.load ARGF.read

# vi:set ts=2 sw=2 et:
```

#付記
上のスクリプトは Ruby 2.1.5 で確認しています。
入力ファイルが日本語の場合、Ruby のバージョンにより、以下のような対処が必要かも知れません。(が、確認してません)

~~Ruby 1.9.x の場合は、先頭行、または shebang の次の行にマジックコメントを付ける。~~
@otn さんからご指摘いただきました。(コメント欄を参照ください)
マジックコメントは IO のエンコーディングと関係ありません。

- (参考) http://docs.ruby-lang.org/ja/1.9.3/class/IO.html#io_encoding

---
Ruby 1.8.x 以前の場合は、$KCODE を設定する。

```rb
$KCODE = 'UTF-8' if RUBY_VERSION < '1.9'
```

# もう少しましな版
(※ 2014.12.20 追記)

一つのスクリプトにまとめました。以下のモードを持ちます。

- YAML -> JSON 変換モード .......... YAML を入力、JSON を出力
- YAML -> JSON 変換モード (非pp) ... YAML を入力、JSON(非整形)を出力
- JSON -> YAML 変換モード .......... JSON を入力、YAML を出力
- 無変換モード ..................... 入出力を変換しない

変換モードのデフォルトは、ファイル名で決まります。
- yj.* の場合、デフォルトは YAML -> JSON 変換モード
- jy.* の場合、デフォルトは JSON -> YAML 変換モード
- 上記以外、デフォルトは 無変換モード

私は、パスの通ったディレクトリにシンボリックリンクを張って使っています。

```shell-session
$ cd ~/bin/              # 私の環境ではここにパスが通っています
$ ls yb.rb
yb.rb
$ chmod +x yj.rb
$ ln -s yj.rb yj         # 「yj」という名前のコマンドとして使う
$ ln -s yj.rb jy         # 「jy」という名前のコマンドとして使う
```

変換モードのデフォルトに関わらず、オプションでモードを指定できます。
- --yj  ...... YAML -> JSON 変換モード
- --yJ ....... YAML -> JSON 変換モード (非pp)
- --jy ....... JSON -> YAML 変換モード
- -n ......... 無変換モード

cat コマンドと同じく、標準入力または引数で指定したファイルの内容を、上記の変換モードで変換して標準出力に出力します。
入力ファイルは複数指定できます。それぞれのファイル単位で変換をします。ただし、出力が混ざってしまうので、複数ファイルの指定は実用的ではありません。

'open-uri' ライブラリの仕様に従い、ファイル名として URI が指定された場合は、HTTP GET します。

下は、指定の URI にある JSONファイルを YAML に変換して標準出力に表示する例です。

```shell-session
$ ruby yj.rb --jy http://localhost/some.json
```

スクリプトは以下です。

```rb:yj.rb
#!/usr/bin/env ruby

require 'open-uri'
require 'optparse'
require 'yaml'
require 'json'

fi = fo = -> s { s }
yj_mode = -> { fi = YAML.method:load ; fo = JSON.method:pretty_generate }
yJ_mode = -> { fi = YAML.method:load ; fo = JSON.method:generate }
jy_mode = -> { fi = JSON.method:load ; fo = YAML.method:dump }

case File.basename $0, '.*'
  when 'yj' ; yj_mode.()
  when 'jy' ; jy_mode.()
end

OptionParser.new.instance_eval do
  on('--yj', 'YAML -> JSON モード       ')  { yj_mode.() }
  on('--yJ', 'YAML -> JSON モード (非pp)')  { yJ_mode.() }
  on('--jy', 'JSON -> YAML モード       ')  { jy_mode.() }
  on('-n'  , '無変換 モード              ')  { fi = fo = -> s { s } }
  parse!
end

fp = -> s { print fo.(fi.(s)) }

if ARGV.empty?
  fp.($<.read)
else
  ARGV.each {|fname| open(fname) {|f| fp.(f.read) }}
end
```
nginx-buildでOpenRestyをビルドしよう

1日目に[nginx-buildでnginxをビルドしよう](http://qiita.com/cubicdaiya/items/a0411c190f043a85ad2f)を書いた@cubicdaiyaです。せっかくのカレンダーに穴を開けるのもなんなので、[nginx-build](https://github.com/cubicdaiya/nginx-build)を[OpenResty](http://www.openresty.com/)に対応させた話をサクッと書きます。

## OpenResty

[OpenResty](http://www.openresty.com/)はnginxと便利なサードパーティモジュール一式やLuaとLuaJIT、[ngx_lua](https://github.com/openresty/lua-nginx-module)向けのLuaモジュール(lua-resty-xxx)をバンドルしたアプリケーションフレームワークです。[ngx_lua](https://github.com/openresty/lua-nginx-module)を利用したことがあるなら知っている方も多いのではないかと思います。

### OpenRestyをnginx-buildでビルドする

OpenRestyをnginx-buildでビルドするにはnginx-buildのバージョンが0.2.0以上である必要があります。バージョンが古い場合は`go get -u`でnginx-buildを更新するか、

```
 go get -u github.com/cubicdaiya/nginx-build
```

最新のバイナリを[こちら](https://github.com/cubicdaiya/nginx-build/releases)からダウンロードしてください。

それではnginx-buildでOpenRestyをビルドしてみましょう。

```
$ nginx-build -d work -openresty -pcre
nginx-build: 0.2.0
Compiler: gc go1.3.3
2014/12/06 14:36:51 [warn]configure option is empty.
2014/12/06 14:36:51 Download pcre-8.36.....
2014/12/06 14:36:51 Download ngx_openresty-1.7.4.1.....
2014/12/06 14:36:54 Extract ngx_openresty-1.7.4.1.tar.gz.....
2014/12/06 14:36:57 Extract pcre-8.36.tar.gz.....
2014/12/06 14:36:57 Generate configure script for ngx_openresty-1.7.4.1.....
2014/12/06 14:36:57 Configure ngx_openresty-1.7.4.1.....
2014/12/06 14:37:24 Build ngx_openresty-1.7.4.1.....
2014/12/06 14:37:42 Complete building nginx!


2014/12/06 14:37:42 Enter the following command for install nginx.

   $ cd work/1.7.4.1/ngx_openresty-1.7.4.1
   $ sudo make install
$
```

というわけでnginx-buildをOpenRestyに対応させた話でした。

## 最後に

[nginx Advent Calendar 2014]()はまだ1/3ちょっとしか埋まってないのでまだまだ参加者募集中です。
MacOSXにRをインストール


## 何も考えずにインストール

時代が進んで便利になったらしいのでRを改めてインストール。homebrewで入れます。

```
$ brew update && brew upgrade
$ brew tap homebrew/science
$ brew install R
```

これでひと通りインストールできたはず。コンソールから`R`で起動。


![kobito.1417843924.937022.png](https://qiita-image-store.s3.amazonaws.com/0/41266/4bf77ae7-27ad-01f9-5417-84bd194b5a9e.png "kobito.1417843924.937022.png")

インストール時に出たメッセージがよくわからなかった。

```
To enable rJava support, run the following command:
  R CMD javareconf JAVA_CPPFLAGS=-I/System/Library/Frameworks/JavaVM.framework/Headers
If you've installed a version of Java other than the default, you might need to instead use:
  R CMD javareconf JAVA_CPPFLAGS='-I/System/Library/Frameworks/JavaVM.framework/Headers -I/Library/Java/JavaVirtualMachines/jdk<version>.jdk/'
  (where <version> can be found by running `java -version` or `locate jni.h`)

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
```

rJavaを使うのに必要な設定の方法だと思うんだけど、使う予定がないので放置。いずれ解決するかも。


## R.appをインストール

そういえばR.appなるものがあるみたいなのでそちらもインストール。よく考えると片方でよかったかも。

```
$ brew install caskroom/cask/brew-cask
$ brew cask install r
```

Sublime TextからRを使うために、Package Controllから[R-Box](https://github.com/randy3k/R-Box)を導入しておわり。


***

参考ページ
[MacOSX に homebrew で R をインストール](http://qiita.com/dkkoma/items/8b45ce94c2c5d89d567f)
React.jsのState

昨日は`Prop`について紹介しましたが、`State`は`Prop`がImmutableな値であったのに対してMutableな値を定義することが出来ます。

## 基本的な使い方

基本的には`getIntialState`でstateの初期値を返して、データに変更があった場合に`this.setState`で更新します。

そうするとComponentがrerenderされて表示が更新されます。子のComponentもrerenderされます。

```js
var Counter = React.createClass({
  getInitialState() {
    return {
      count: 0
    };
  },
  onClick() {
    this.setState({ count: this.state.count + 1});
  },
  render() {
    return (
      <div>
        <span>{this.state.count}</span>
        <button onClick={this.onClick}>click</button>
      </div>
    );
  }
});
```

`setState`の第二引数には`setProps`と同様にcallback関数を指定することが出来ます。
また、`setProps`に対しての`replaceProps`のように`replaceState`というstateを置き換える関数もあります。

## Stateを使う場面

一番よく使うのがtext fieldのようなComponent内でユーザーのアクションによって変化する値を管理するような場合です。

また、そのComponentが必要とするデータをComponent内でAjaxで取得し反映する場合なども、Ajaxのcallback関数内でresponseをsetStateするように使います。


## 注意点

stateの値は直接更新してはダメで必ず`setState`経由で更新する必要があります。

これはsetStateが呼ばれることでrerenderされるためで、`this.state`の値自体もImmutableであると考えておくのがいいとされています。

なので、`this.state.list`な値があってlistに要素を追加したい時も、pushしてsetStateするのではなくて`this.setState({ list: this.state.list.concat([val]) })`として新しい値(配列)にしておいた方が`shouldComponentUpdate`でチューニングする際にも都合がいいですし、undoの実装なんかもやりやすくなります。

## Stateは最低限に

Propだけを持っているようなImmutableなComponentの方が扱いやすいしわかりやすいので、基本的にはPropで考えてStateを持つComponentは最低限にしておくのがよいです。

React.jsでは、rootとなるComponentだけにStateを持たせて後は全部Propだけを持ってるImmutableなComponentにして、何か変更があるとrootのComponentでsetStateしてまとめてrerenderするような構成も可能だったりします。その辺りはVirtualDOMのなせる技なのですが、それはまた別の日に...。


--------

明日はPropやStateを使ってのComponent間のやりとりについて書きたいと思います。
IoTの要(かなめ)！BLE通信をMacだけでデバッグできるようになる方法！

この投稿はBluetooth Low Energy Advent Calendar 2014 の6日目の記事です！

ここ数ヶ月間iOSアプリとBLEで通信する機器の開発を行っている @kazuph です。
元々は単なるWebプログラマーだったのですが、いつの間にかマイコンの組込みプログラミングをするまでになりました。

サーバー、アプリ、マイコン含めていわゆる"ソフトウェア"と呼べる部分は全部書いているのですが、その辺の習得までの流れとかはおいおいブログに書いていきたいと思います。

今回は普段仕事でBLE開発をする中で習得した、GATTの内容やアドバタイジングパケット内容をMacだけで確認する方法を書きたいと思います。

## やってみる

何はともあれツールをインストールします。

用いるものは以下の２つです。

- [LightBlue](https://itunes.apple.com/jp/app/lightblue/id639944780?mt=12)
- PacketLogger

### LightBlue

![スクリーンショット 2014-12-06 13.28.24.png](https://qiita-image-store.s3.amazonaws.com/0/4194/9a83c6c9-2023-1d4e-648b-ff38f199a728.png)

AppStoreからインストールしてください。

LightBlueはiOSアプリとしてもあるのですが、Mac版もあるので今回はこれを使います。

インストールして起動すると即座にスキャンを開始して周辺にあるBLE機器のリストを出してくれます。

このままクリックするとGATT（ServiceとCharacteristic）が見えます。読み込み、書き込みも何でもできます！！

![lightblue](http://a3.mzstatic.com/us/r30/Purple2/v4/17/ec/9d/17ec9de5-b7a2-1f32-24ed-f0810fa0b8b4/screen800x500.jpeg)

本来はアプリを使わないと動作させることができない機器をこれで動かしてみてください。「え、今どうやったの！？」って言われたらドヤ顔です( ･`д･´)

あと注意点としてGATTを書き換えながら開発してると、LightBlueが更新されていないときがあります。これはOSレベルでキャッシュしちゃってるのが原因なので、一度MacのBluetoothをOFF→ONして、LightBlueも再起動してください。そうすると直ります（たぶん）。

### PacketLogger

![スクリーンショット 2014-12-06 13.28.15.png](https://qiita-image-store.s3.amazonaws.com/0/4194/0275224c-7b8e-bd2b-b33f-450b02f9ff4d.png)

これは公開されているアプリではなく、AppleのDownloads for Apple Developersからダウンロードする必要があります。Dev登録をしてダウンロードしましょう。URLは以下。

https://developer.apple.com/downloads/index.action

![packetlogger](http://i.gyazo.com/cb0271f31502073f7d1fe5f01a5f38ad.png)

packetで検索すると出ますが、Hardware IO Tools for Xcodeってやつです。

開けるとPacketLoggerが入ってることがわかります。

![packet](http://i.gyazo.com/c6298efc6f00b66f4b102cb4f15d3e6e.png)

起動してみましょう！ちなみにログを流すには管理者権限が必要です。

![log](http://i.gyazo.com/f51b91e745ab868b4c880815196e09e5.png)

あれ、何も出ない？それはMacがBLEのスキャンをしてないからです。
スキャンを開始する方法は簡単です。LightBlueを起動するだけです！！（そのための伏線！！）

色々なログが流れ始めますが、一番おもしろいのは青いログです。
ついでにいうとType2と書いてあったらそれはiBeaconです！！

今回は傍らのiPhoneをiBeaconにできるLocate Beaconというアプリを使いました。

![slack_for_ios_upload.png](http://i.gyazo.com/4a13d8052652da5fc0498e8557f85ee3.png)

では実際にType2のログを展開してみましょう。

![giflog](http://i.gyazo.com/e7b3d6220f122851c4adb82b808b9e09.gif)

以下のような記述があります。

```rb
LE Meta Event - LE Advertising Report - 0 - 9C:F3:87:29:D3:B5  -34 dBm - Type 2
Parameter Length: 42 (0x2A)
LE Advertising Report
Num_Reports: 0X01
Event_Type: Connectable undirected advertising (ADV_IND)
Address_Type: Public Device Address
Peer_Address: 9C:F3:87:29:D3:B5
Length_Data: 0X1E
Flags: 0x1a
Manufacturer Specific Data: -- 
Data: 02 01 1A 1A FF 4C 00 02 15 74 27 8B DA B6 44 45 20 8F 0C 72 0E AF 05 99 35 00 0C 00 63 C5 
RSSI:  -34 dBm
```

Dataの中にあるバイナリが、アドバタイジングパケットです。アドバタイジングしてる内容がわかれば色々なデバッグが可能になりますね！

( ･`д･´)

## おわりに

今回はBLEをデバッグするためのツールの話をしました。特にPacketLoggerを導入した直後は開発がちょっと加速しました。はやり推測よりも観測が重要ですね。

明日の担当も僕です。

お楽しみに！！
Swift (iOS)で日本語変数名が便利だなと思った例

## Swiftは日本語変数名が使える！

Swiftを発表したKeynoteでも発表されていましたように、マルチバイトの文字列がSwiftではどこでもつかえるようになっています。漢字や絵文字まで使い放題です。

ただ、いつ、どういう場面で使えるのかが疑問。
PHPerな私はCakePHP with PHPUnitのテストケースの名前を`public function test入力値は200字以内() {...}` のようにしたことはありますが、Swiftでどんな場合に有用なのか、まとめることにしました。


## UIAlertActionの名前

```swift:SampleViewController.swift

var alertController = UIAlertController(title: "あなたはシカオさんではありませんね？", message:"", preferredStyle: UIAlertControllerStyle.Alert)

let はいAlertAction = UIAlertAction(title: "はい", style: UIAlertActionStyle.Default, handler: {...(略)...})
let いいえAlertAction = UIAlertAction(title: "いいえ", style: UIAlertActionStyle.Cancel, handler: nil)

alertController.addAction(はいAlertAction)
alertController.addAction(いいえAlertAction)
self.presentViewController(alertController, animated: true, completion:nil)

```

「はい」をおした時のAlertActionだから`はいAlertAction`。「いいえ」をおした時のAlertActionだから`いいえAlertAction`。わかりやすいですね。

もしこれが`yesAlertAction``noAlertAction`だと、この質問の仕方だとどっちがはいを押したときのアクションなのか、書き手の意図がややわかりづらくなります。


## （以後追加していきたいと思います）

他にもマルチバイト変数名が有用な場面を発見したら追加していきます。募集中です。
PHPでのPresto結果の後処理 - 処理時間の平均を時系列で出力してみる - 

はてさて、１日遅れてしまいましたがAdventCalendar5日目です。

昨日は社内イベントで盛大に負けてとても勉強になった一日でした。もっとキャッシュ力を高めていこうと思った30歳・冬。
財布には千円しかなかった寂しさを乗り越え、今日も前向きにいきたいと思います。

前回は特定区間の処理時間をpercentileで出力し、なんとなく把握してみようというものをやりました。
グルーピングの条件も特定アクション毎の集計だったのでレンジが長くなればなるほど大雑把になってしまいます。

ああいった処理時間を可視化したい、ということは何かしら変なことが起きていないかわかるようにしたい、ということでもありますので
今日は１日毎かつアクション毎に処理時間の平均を集計し、日付順で並べてみましょう。そうすればもっと変化量が視覚的にわかりやすくなります。

テーブル構成は前回と同じと仮定します

```
select 
    TD_TIME_FORMAT(time, 'yyyy-MM-dd', 'JST') as day, 
    action, 
    avg(elapsed) as average
from 
    access_log
where 
    TD_TIME_RANGE(time, '2014-11-01 00:00', '2014-11-7 23:59:59', 'JST')
group by 
	TD_TIME_FORMAT(time, 'yyyy-MM-dd', 'JST'),
	action
```

これで日付・ページ名・処理時間平均という結果が得られるようになったのですがこのままではグラフに描きづらいので後処理をします。
ここらへんは何でもいいので好きな言語や得意な言語で書くと良いと思います。

この分野はRを使ったほうが断然楽なんですが、PHPでもまとめておくと意外と実用的なのでこういうネタを覚えておくと運用に役立ったりします。

```php
<?php
$data = file_get_contents("a.dat");
$keys = array();
$result = array();
$devs = array();

foreach(explode("\n", $data) as $line) {
	$line = trim($line);
	if (empty($line)) {
		continue;
	}
	$args = explode("\t", $line);
	$result[$args[1]][$args[0]] = $args[2];
	$keys[$args[0]] = $args[0];
}

// 日付     ページ名...
// yyymmdd 平均値...
// というように出力しやすいように積み直しつつデータに抜けがある場合は0を入れる
$rows = array();
foreach ($keys as $d) {
	$tmp = array();
	foreach ($result as $act => $v) {
		if (isset($v[$d])) {
			$tmp[] = $v[$d];
		} else {
			$tmp[] = 0.0;
		}
	}
	$rows[$d] = $tmp;
}

//出力
echo "date\t" . join("\t", array_keys($result)) . PHP_EOL;
foreach ($rows as $d => $row) {
	printf("%s\t%s\n", $d, join("\t", $row));
}
```

これで出力結果をグラフに書くとこんなかんじになります。

![Screenshot_12_6_14__12_54.png](https://qiita-image-store.s3.amazonaws.com/0/24324/8b13791c-b57b-819f-eba9-4cfef333957a.png)


ウッ、項目数が多くて読みづらい…


そんなときは標準偏差を計算してばらつきが大きそうなものだけを表示してみると良いです。
標準偏差の計算方法は平均の差を自乗して足したものを要素数で割ったものをsqrtしてあげると出ます。

```php
function stddev($values) {
	$avg =  array_sum($values) / count($values));
	$r = 0.0;
	foreach ($values as $val) {
		$r += pow($val - $avg, 2);
	}
	return sqrt($r / count($values));
}
```

Presto側でもstddev関数などがあるので前もって計算する事はできるんですが、こうやってあとでごにょごにょするのも楽しいもんです。
標準偏差が一定値以上のページを表示したものが次のグラフです。

![Screenshot_12_6_14__13_44.png](https://qiita-image-store.s3.amazonaws.com/0/24324/bb9196f7-8f8f-e400-01fc-a2237ad9b588.png)


だいぶみやすくなりましたね。

こんな感じで処理結果をごりごりフィルタして書き換えていって突き詰めていくと、だれでも気づけるものは機械に任せていこう、人はもっと素敵なアイデアとか判断ができるように注力しようといったことができるのでやっとくとよかったりします。


え、これTreasureDataに関係なくねって？いやいや、こうやってTreasureDataで集めたデータをどうやって可視化するか、とかをふつうのエンジニアが覚えられると結構べんりなんですよ！
Dockerのプロセス数を表示するmuninプラグインを作る

munin の独自プラグインを作成して監視対象を追加するお話です。
意外と手こずったのでメモとして残しておきます。

# 目的
監視対象となるサーバーの上で現在動作している Docker コンテナの数を munin で監視したい。

再起動やアップデートを行った直後、Docker コンテナが起動していない状態のままうっかり放置してしまうことがあるのでプロセス数が 0 の時に警告を出したいというのが目的です。
あまり複雑なプラグインではなく、単に現在のプロセス数を返せば良い簡単なもので良いです。

#プラグインのコード
慣れの関係から ruby スクリプトで書きました。
何でも好きなもので書けるのがよいですね。

docker ps を実行してその行数を返すだけのものです。
processnum.value %d にプロセスの数が入って表示されます。

なお autoconf は中途半端な状態で省略しています。

```ruby:docker_ps
#!/usr/bin/env ruby

#%# family=other
#%# capabilities=autoconf

# ---- command
if ARGV[0] == 'config' then
   puts "graph_title docker process num"
   puts "processnum.label docker process"
   puts "processnum.type GAUGE"
   puts "processnum.info docker container process"
end

if ARGV[0] == 'autoconf' then
  if File.exists?('/var/run/docker.sock') then
    puts 'yes'
    exit 0
  else
    puts 'no'
    exit 1
  end
end

if ARGV[0] == 'suggest' then
   exit 0
end

# ---- value
num = 0
open("| docker ps -q") do |fp|
  fp.each do |line|
    num += 1
  end
end

# ---- output
printf("processnum.value %d\n", num)
exit 0
```

# munin-node のプラグインとして登録
作成したコードを適当なところに置いてプラグインディレクトリにシンボリックリンクを張ります。
Debian なら /etc/munin/plugins/ の下です。
/usr/share/munin/plugins/ の下に置かないと munin-node-configure に表示したり管理したりできませんが、できなくてもあまり困らないのでこだわらない向きには位置を気にせずとも良いかと。

## 実行ユーザー
該当スクリプトは内部で docker ps コマンドを実行しているので、munin-node は docker を実行する権限を持っている必要があります。
munin-node の実行ユーザーを Docker グループにするよりも、プラグインの実行ユーザーを指定した方が良さそうです。
Debian だと /etc/munin/plugin-conf.d/munin-node にプラグイン毎の実行設定が記述されています。
ここの末尾に

```
[docker_ps]
user root
```

を追加してプラグインが root 等の docker 実行可能なユーザーで呼ばれる様に設定します。

## munin-node サービス再起動
これで munin-node 側の準備は揃いましたので service munin-node restart 等で munin-node を再起動しておきます。

以上で munin-node 側の作業は終了。

# munin サーバー側の設定
ここまでやるとサーバー側に新しいプラグインの情報が表示されるようになっているはずです。

ですがここで一番悩みました。
そのままだと値が 3ミリとかいう単位でしかプロットされなかったのです。

## 単位を揃える
プラグインは単純にプロセス数を整数値で渡しているのですが、それより小さな値で出る場合のお話。
何か設定が悪いのでは無いかとさんざん悩んだのですが、結局は単位の問題でした。
妙にプロット値が小さいときは、期待値の何分の一か計算してみて下さい。私の場合は約 1/300 でした。この値で気がついたのですが、300という数字は 300sec、munin が node を監視する間隔の時間でした。
このような場合、munin-node から与えられる数値は 1sec 単位での累積、時間積分値を期待しているようです。

～～～～
追記
プラグインの config 設定で type が ABSOLUTE だと積分値で出てくる様です。
type を GAUGE に設定すると、value の値がそのままプロットされました。
～～～～

プラグイン側で 300倍するというのはスマートではありません。
サーバーの巡回時間に影響するものなのでサーバー側で設定します。

munin の設定ファイル(debian では /etc/munin/munin.conf)のサーバー設定の中にノード設定を追加します。

```
[ノード名]
        address ノードアドレス
        use_node_name yes
        docker_ps.processnum.cdef processnum,300,*
```

cdef の部分がそれにあたります。
この設定では processnum の値を 300 倍にしています。
アスタリスクは演算子で、割り算等他の四則演算も設定できるようです。

## 警告を出す
今回の目的は、docker が実行中のプロセスを抱えているかどうかの監視なので、もしプロセス数が 0 のときはおかしいとして警告状態にしたいところです。

警告設定はプラグインの config でも指定できるのですが、監視対象はシンプルにロジックはサーバーにというポリシーからサーバー側設定に記述します。

```
[ノード名]
        address ノードアドレス
        use_node_name yes
        docker_ps.processnum.cdef processnum,300,*
        docker_ps.processnum.critical 1:
```

この設定では processnum の値が 1 より小さかった場合(すなわち0)の時に障害扱いとします。
critical 時はメールを出す様に他の箇所で設定したありますので、もし docker がなにもコンテナを実行していないときは警告メールが届くようになりました。

みなさんも色んな物を監視してみて下さい。
gpz.cpp


```cpp:gpz.cpp

#include <iostream>
using namespace std;

class Bike         //クラス定義
{
    int gas;      //燃料
    int speed;      //現在の速度
public:
    Bike(int x);   //コンストラクタ
    void acceleration();   //加速を表す関数
};

//コンストラクタの定義
Bike::Bike(int x) : gas(x), speed(0){}

//加速を表す関数の定義
void Bike::acceleration()
{
    if(gas >= 2){
        speed += 2;
        gas -= 2;
        cout<< "現在の燃料は" << gas << "です。" << endl;
        cout<< "現在の速度は" << speed << "です。" << endl;
    }
    else{
        cout << "燃料切れです。加速できません。停止します。" <<endl;
    }
}

int main()
{
    cout << "GPZをメモリ上につくります。燃料（整数）を入力してください。"<<endl;
    int n;       
    cin >> n;    

    Bike GPZ(n); //これでnの値がコンストラクタの定義のxにコピーされ、
                      //コンストラクタの中身が実行され、gasの値がnの値に
                      //なったロケットGPZ（鳳号）が生成されるわけです。
                      //このGPZをオブジェクトなどとよぶのでした。
    cout<< "加速します。" <<endl;
    GPZ.acceleration();  //GPZに対してaccelerationを使っています
    cout<< "また、加速します。" <<endl;
    GPZ.acceleration();  //GPZに対してaccelerationを使っています
    cout<< "またまた、加速してみます。" <<endl;
    GPZ.acceleration();  //GPZに対してaccelerationを使っています
    cout<< "GPZは停止しました" <<endl;
}
```
パスの設定方法

下記のコマンドでパスが通っている場所を一覧できます。
```echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/vine/bin:/home/zem/bin
```
パスを設定するには、
/etc/profileファイルを開き末尾に、
```PATH=$PATH:/usr/local/pgsql/bin
export PATH
```
と追記。
これをすることにより、サーバーを立ち上げ、各ユーザーの.bash_profileが読み込まれた際に、/etc/profileが読み込まれパスが透。
OpenCV バグ Windows用バイナリ配布バージョンのffmpeg実装はdebugビルドでは使用できない

報告済みのバグ [No ffmpeg debug dll on Windows Binary Archive (Bug #4049)](http://code.opencv.org/issues/4049)

opencv.org からダウンロードできるWindows用バイナリアーカイブには ffmpeg 実装のdebug用dllが含まれない。したがって debug ビルドにおいて cv::VideoCapture による動画ファイルの読み書きなどは動作しない。

OpenCVのWindows用のffmpeg実装はソースツリーに保存している

対処法としては自分でffmepgを使えるように OpenCV をビルドすること。あるいは常にリリースビルドで開発すること。
OpenCV バグ cv::findContours() で std::vector<std::vector<cv::Point> > を使用してはいけない。

報告済みのバグ [Bad C-Cast on matrix.cpp about _InputArray (Bug #4050)](http://code.opencv.org/issues/4050)

以下のコードは Windows 64bit 環境でdebugビルドをするとアサーションフェイルになる。

```cpp
cv::Mat image = someImage();
std::vector<std::vector<cv::Point> > contours;
cv::findContours(image, contours,  CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
```

cv::_InputArray の実装が糞なのが原因。

対処としては出力に std::vector\<cv::Mat> を使用すること。

おそらく std::vector\<T> を許容する cv::_OutputArray を用いた関数すべてで発生する問題。
Flask を触ってみる + Heroku で動かす


## Python を用意する

version は 2 系の最新版を用いる.
Python のバージョン管理には pyenv, ディレクトリごとの環境分離を virtualenv を使う.
Mac を使っているので brew より,

```bash
brew install pyenv
brew install pyenv-virtualenv
```

でインストール.

```bash
$ pyenv install -l | grep 2.7
  2.7
  2.7-dev
  2.7.1
  2.7.2
  2.7.3
  2.7.4
  2.7.5
  2.7.6
  2.7.7
  ironpython-2.7.4
  jython-2.7-beta1
  jython-2.7-beta2
  stackless-2.7-dev
  stackless-2.7.2
  stackless-2.7.3
  stackless-2.7.4
  stackless-2.7.5
  stackless-2.7.6
```

最新版は `2.7.7` のようだ. インストールする.

```bash
pyenv install 2.7.7
```

なお自分は古い pyenv を使ったため以下のエラーが起きた.
[Mac の pyenv で 2 系を入れるときに checksum エラーが起きたときの対処法 - Qiita](http://qiita.com/sqrtxx/items/3b6bcd1e27ea5290d551)
バージョンを変えて確認

```bash
$ pyenv shell 2.7.7
$ python --version
Python 2.7.7
```

OK.

## Flask を導入する

まず開発ディレクトリに移動.

```bash
cd path/to/proj
virtualenv venv27
```

activate (`source` or `.` を忘れずに)

```bash
source venv27/bin/activate
```

Flask, gunicorn の install

```bash
pip install Flask
```

かくにん

```bash
$ pip list
Flask (0.10.1)
itsdangerous (0.24)
Jinja2 (2.7.3)
MarkupSafe (0.23)
pip (1.5.6)
setuptools (3.6)
Werkzeug (0.9.6)
wsgiref (0.1.2)
```

## 開発する

### Hello World!

hello.py を作る.

```python:hello.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()
```

ローカルで走らせる.

```bash
$ python hello.py
 * Running on http://127.0.0.1:5000/
```

http://127.0.0.1:5000/ にアクセスすると表示される:congratulations:

![ 2014-12-06 12.03.03.png](https://qiita-image-store.s3.amazonaws.com/289/29618/acb97f6f-02a5-5d81-656d-e62aec01a931.png " 2014-12-06 12.03.03.png")

## Heroku で動かす

gunicorn を入れる

```bash
pip install gunicorn
```

かくにん

```bash
$ pip list
Flask (0.10.1)
gunicorn (19.1.1)
itsdangerous (0.24)
Jinja2 (2.7.3)
MarkupSafe (0.23)
pip (1.5.6)
setuptools (3.6)
Werkzeug (0.9.6)
wsgiref (0.1.2)
```

Procfile を用意する

[procfile · herokaijp/devcenter Wiki](https://github.com/herokaijp/devcenter/wiki/procfile)

```
web: gunicorn hello:app --log-file -
```

requirements.txt を書き出す

```bash
pip freeze > requirements.txt
```

.gitignore を作る
virtualenv のディレクトリ (`venv27`) を除いておく.

```
*.pyc
*.pyo
venv27
```

git に commit し, push する.

```bash
git add .
git commit -m 'Hello World!'
git push origin master
```

heroku に login し, push する.

```bash
heroku login
heroku create
git push heroku master
```

Web のインスタンス追加

```bash
heroku scale web=1
```

開く

```bash
heroku open
```

![ 2014-12-06 12.35.59.png](https://qiita-image-store.s3.amazonaws.com/289/29618/140edfe5-7fdf-edff-dc0e-c6c704c180c9.png " 2014-12-06 12.35.59.png")

めで鯛


- https://fathomless-stream-3792.herokuapp.com/
- [sqrtxx-playground/flask-sample](https://github.com/sqrtxx-playground/flask-sample)
	- 作業したリポジトリ. playground 用 organization あると便利.

## Reference

- [Installation — Flask Documentation (0.10)](http://flask.pocoo.org/docs/0.10/installation/)
- [Getting Started with Python on Heroku | Heroku Dev Center](https://devcenter.heroku.com/articles/getting-started-with-python-o#start-flask-app-inside-a-virtualenv)
[heroku-examples/python-websockets-chat](https://github.com/heroku-examples/python-websockets-chat)
Emacs: caskでパッケージをアンインストールする方法 (コメント求む)

## 現状

Emacs24からパッケージシステムが標準搭載されました。インストールはいいのですが、アンインストールする方法がよくわかりません。

で、パッケージ管理にcaskを使い始めたわけですが、これを使うと

1. アンインストールしたいパッケージを `~/emacs.d/Cask` から削除
2. `cd ~/.emacs.d && rm -rf .cask && cask`

ということができるようになります。

やってることは全部インストールし直しているということで一応アンインストールと同等のことが出来ます。既存のパッケージがバージョンアップするとかいろいろ副作用はありますがね。

## 問題点
+ Caskにあるパッケージとそれらが依存するパッケージが全部インストールされるので時間がかかる
+ 各リポジトリに負担かかってないか?
+ そもそもスマートでない

ということで、スマートにターゲットのパッケージだけアンインストールする方法はないでしょうか。

## こんな感じで運用すればいい?

1. Caskから削除
2. `rm -rf ~/.emacs.d/.cask/<emacs-version>/elpa/<package-name>`

でいいのかな。でもこれだと依存パッケージが残っちゃいますね。それがいやなんです。でも多少のムダは目をつむり普段はこの方法でやって、ごくたまに全部入れ直しでいいんでしょうかね。

そもそもパッケージのアンインストールなんて滅多にしないんですけど。最近ではzencodingからemmetに乗り換えたくらいです。

読み返してみたらとりとめがないし大した問題でもない気がしてきました。が、投稿してみますw
Maximaで出力したファイルが見つからない時

先日からwxMaximaを使って計算をしてデータを出力させているのですが、その出力したはずのフォルダがWindows7で見つけられないという問題が発生したので、
解決方法と共に私のブログにまとめました。
http://infotech776.blog.fc2.com/blog-entry-63.html
ご参考までに。
Mac の pyenv で 2 系を入れるときに checksum エラーが起きたときの対処法


```bash
pyenv install 2.7.7
```

すると, checksum のエラーが出た.

```bash
checksum mismatch: setuptools-4.0.tar.gz (file is corrupt)
```

元々入れていた pyenv の version が古かったようだ.

[Can't install python 2.7.2 on OS X 10.10 (Build Failed Problem - setuptools checksum fails) · Issue #203 · yyuu/pyenv](https://github.com/yyuu/pyenv/issues/203)

pyenv を upgrade する.

```bash
brew update
brew upgrade pyenv
```

再度インストール

```bash
pyenv install 2.7.7
```
expect使ってみた

## 参考

* [expectコマンドの使い方 – No:158 – Linuxで自宅サーバ構築（新森からの雑記）](http://www.uetyi.mydns.jp/wordpress/command/entry-158.html)

## cronで動かす場合

* [Yura YuWrite: [Shell] crontabでシェルスクリプトのexpectコマンドがうまく動かない](http://yu-write.blogspot.jp/2013/11/shell-crontabexpect.html)

```diff:
- interact
+ expect eof
+ exit
```

## 環境変数の参照の仕方

> $env(HOME)

## ポートフォワード後コマンド実施

```bash:vnc_connect.expect
#!/usr/bin/expect
set timeout 3

spawn ssh -NL 5901:localhost:5901 myserver
spawn vncviewer -bgr233 localhost:5901
expect "Password: "
send "パスワード\n"

interact
```

```bash:rdp_connect.expect
#!/usr/bin/expect
set timeout 3

spawn ssh rdpserver
# ssh接続されるまで時間がかかる場合、sleep入れると解決した
sleep 2
spawn rdesktop localhost:3389 -u user1 -g 1280x960 -a 16 -k ja -r clipboard -r disk:share=$env(HOME)/Downloads

interact
```

## IOS(cisco)の例

```bash:cisco.expect
#!/usr/bin/expect

set timeout 3
spawn telnet cisco-switch

expect "Password: "
send "loginpass\n"

expect "Switch>"
send "en\n"

expect "Password: "
send "en-pass\n"

interact
```

## EQ/OS10の例

```bash:eqos.expect
#!/usr/bin/expect

set timeout 3
spawn ssh eqadmin@equalizer-ip

expect "login: "
send "touch\n"

expect "Password: "
send "touch\n"

#expect "eqcli >"

interact
```

## ScreenOSの例

```bash:screenos.expect
#!/usr/bin/expect

set timeout 3
spawn telnet screenos-ip

expect "login: "
send "netscreen\n"

expect "Password: "
send "netscreen\n"

#expect "hostname(M)-> "

interact
```

# xfce4の`.desktop`と組み合わせる

```bash:screenos.desktop
#!/bin/sh
xfce4-terminal -e "screenos.expect"
```

.desktopアイコンを実行すると自動でログイン完了する。
Google Spreadsheetで行の変更日時を自動的に記録する

E列(5列目)のセルが変更されたら、C列に変更日時を記録する例

```javascript
function onEdit(e) {
  var COL_NUM_TO_WATCH = 5,
      COL_TO_SET_DATE = 'C',
      range = e.range,
      sheet = SpreadsheetApp.getActiveSpreadsheet();

  if(range.getColumn() === COL_NUM_TO_WATCH){
     sheet.getRange(COL_TO_SET_DATE + range.getRow() ).setValue(new Date());
  }
}
```
Flyway の clean は無効にする

Flyway の clean はスキーマにある Table や Index などすべてを消してしまいます。
有名な話なのですが、 Flyway をよく知らない開発チームのメンバーにも Flyway を使わせる場合は、無効にしておいて損は無いはずなのでそうします。

```buiild.gradle
apply plugin: 'flyway'

flywayClean.enabled = false
```
go get で取得したreposのデフォルトremoteパスをhttpsではなくsshにする

* `go get github.com/hoge/huga`で取得したプロジェクトディレクトリ(`$GOPATH/src/github.com/hoge/huga`)は、remoteパスがデフォルトで https://github.com/hoge/huga になる
    * [src/cmd/go/vcs.go のL595](http://golang.org/src/cmd/go/vcs.go)
* httpsだとpush等の際に毎回パスワードを聞かれて面倒臭い ＆ sshだと`~/.ssh/config`で管理できる
   * httpsのままで毎回パスワード問い合わせを回避したい場合は、こちらが参考になる [git を https 経由で使うときのパスワードを保存する - Qiita](http://qiita.com/usamik26/items/c655abcaeee02ea59695)
* `go get`した際にremoteのデフォルトをsshに変更したい

→ `.gitconfig`に下記を追記する

```
[url "git@github.com:"]
    insteadOf = https://github.com/
```
ApacheでUserDir公開の、メモ書き

下記参考。多謝。
http://d.hatena.ne.jp/katano034/20080527/1211865912

基本的にユーザディレクトリを公開したい場合に`UserDir "enable" keyword requires a list of usernames`等と怒られたら下記のアドバイスのように
http://apache-http-server.18135.x6.nabble.com/UserDir-enabled-problem-td4737127.html

`UserDir enabled`を削除する。

また
http://httpd.apache.org/docs/2.2/ja/mod/mod_userdir.html#userdir
にあるように

```
このディレクティブを使うときは注意してください; "UserDir ./" は "/~root" から "/" へマップしますが、 これは望ましい動作ではないでしょう。 "UserDir disabled root" 宣言を 設定の中に含めておくことを強くお薦めします。 追加情報に Directory ディレクティブや セキュリティ Tips のページもご覧下さい。
```

とのことなので注意して利用すること。
YoでASP.NET vNext

ASP.NET が MAC でも標準で開発できるようになるのでASP.NETのプロジェクトを作れる
yeoman generatorを作ってみました。その宣伝の話。

Yeomanとは何か
--------------
[公式ページ](http://yeoman.io/n)には

```
THE WEB'S SCAFFOLDING TOOL FOR MODERN WEBAPPS
```

とあり、実際使ってみるとコマンドベースでソースのひな形を作成してくれます。Visual Studioな人には
ちょっと乱暴な気もしますがProject TemplateとItemTemplateというと分かりやすいかと。

Yeoman自体はYoとGruntとBowerで構成されてます。GruntとBowerはVisual Studio 2015 PreviewのASP.NET vNextで
利用されてるので、Visual Studioな人から色々と情報が上がってくるのではないでしょうか。
Webアプリケーション界隈ではすでに山のように情報が上がってるんですけどね。なんせ観測範囲が違うので。

で、このYoを使ってyoコマンドでASP.NET vNextプロジェクトを作れるようにGeneratorを作りました。

なぜ作ったか
------------
既にgenerator-aspnetっていうGeneratorが話題の(多分)OmniSharpの人らが作ってて、
公式からもリンクが張られてたり言及されてたりします。じゃぁ、それ使えばいいやんって話なんですが
このgeneratorって現状ではConsoleやMVCやNancyなどいくつかの静的な構成を選択できるだけで、
プロジェクト名の設定や.kprojなどの作成などなどをやってくれないのです。

個人的には最近はMACを使ってることも多く、Windowsとコードを共有することも多く
WindowsやったらVisual Studio以外の選択肢なんて全くないので、MACでもVisual Studioの
Project Templateと同等のものが作りたい。じゃ、自分で作ろうって流れで作りました。

どうやって使うか
----------------
Visual Studio 2015 Previewを入れるとnodeもnpmも入るのでまずはコマンドラインでおもむろに

```
npm install -g yo
```

と打ちましょう。これでyoコマンドが使えるようになります。そのあと再びコマンドラインで

```
npm install -g generator-aspnet-proj
```

と打ちましょう。これでyoから今回作ったプロジェクトを作るgeneratorであるaspnet-projが使えるようになります。

で、使う場合はプロジェクトを作りたいディレクトリに移動して、以下のコマンドを打ちます。

```
yo aspnet-proj
```

何個か選択肢を選べば出来上がります。

![aspnet_advent.png](https://qiita-image-store.s3.amazonaws.com/0/16028/d92ce801-bdda-bf6b-fc38-323b968e6f04.png)

この後
------
今現状はほとんどproject.jsonを作るだけですが、以下のようにしたいです。

* MVCのHOMT/Indexあたりまでのシンプルな構成の展開
* Entity Frameworkの展開
* Nancyの展開
* slnファイルの展開や既存のslnへの追加
  * 同時にsrcフォルダとかglobal.jsonとかとか
* library プロジェクトの展開
* console プロジェクトの展開
find_packageの動作

CMake のマニュアルからの抄訳です。

### デバッグのお供に
下記のコマンドで、find_packageが`<package>-config.cmake` を検索したパスを表示できる。
buildディレクトリを削除して、設定値のキャッシュを消す必要があるかもしれない。

```
cmake .. -DCMAKE_FIND_DEBUG_MODE=1
```
`..` の部分は、ソースツリーの場所にあわせて変更すること。

### find_package の検索ロジック

find_package には Module モードと Config モードの２種類のモードがある。
通常は、まず Module モードで検索してから、 Config モードにフォールバックする。

#### Module モード
``Find<package>.cmake`` を検索する。

1. CMakeのインストール先 (e.g. ``/usr/local/share/cmake-2.8/Modules``)
2. 環境変数 ``CMAKE_MODULE_PATH`` に設定したパス

#### Config モード

後述の規定のディレクトリから、``<package>Config.cmake`` または ``<lower-case-package>-config.cmake`` を検索する。

``<package>_DIR`` 変数で検索対象のパスを指定できる。

##### 検索対象のディレクトリ

- ``<prefix>`` については後述。
- ``<name>`` は、``<package>`` または ``NAMES`` オプションで指定した名前

##### Windows

- ``<prefix>/``
- ``<prefix>/(cmake|CMake)``
- ``<prefix>/<name>*/``
- ``<prefix>/<name>*/(cmake|CMake)``

##### Linux

- ``<prefix>/(lib/<arch>|lib|share)/cmake/<name*>/``
- ``<prefix>/(lib/<arch>|lib|share)/<name*>/``
- ``<prefix>/(lib/<arch>|lib|share)/<name*>/cmake/``

##### ``<prefix>`` に使用されるパス
以下のパスが ``<prefix>`` として使用される。

1. cmakeのキャッシュ (cmake のコマンドライン引数に ``-DVAR=value`` 形式で指定する)。 コマンドに ``NO_CMAKE_PATH`` オプションを指定するとスキップされる。
  - ``CMAKE_PREFIX_PATH``
  - ``CMAKE_FRAMEWORK_PATH``
  - ``CMAKE_APPBUNDLE_PATH``

2. cmake 環境変数。コマンドに ``NO_CMAKE_ENVIRONTMENT_PATH`` オプションを指定するとスキップされる。
  - ``<package>_DIR``
  - ``CMAKE_PREFIX_PATH``
  - ``CMAKE_FRAMEWORK_PATH``
  - ``CMAKE_APPBUNDLE_PATH``

3. ``HINTS`` オプションで指定したパス

4. システムの環境変数。``NO_SYSTEM_ENVIRONMENT_PATH`` を指定するとスキップされる。
  環境変数 ``PATH`` のエントリが、``/bin`` か ``/sbin`` で終わる場合はその親ディレクトリに変換される。

5. cmake-gui で設定したプロジェクトビルドツリー (Windows only)

6. User Package Registry に格納されたパス。``NO_CMAKE_PACKAGE_REGISTRY`` を指定するとスキップされる。

7. cmakeのシステムパス

  - ``CMAKE_SYSTEM_PREFIX_PATH``
  - ``CMAKE_SYSTEM_FRAMEWORK_PATH``
  - ``CMAKE_SYSTEM_APPBUNDLE_PATH``

8. System Package Registry に格納されたパス
``NO_CMAKE_SYSTEM_PACKAGE_REGISTRY`` を指定するとスキップされる。

9. ``PATHS`` オプションで指定したパスのリスト。
機械学習をこれから始める人に押さえておいてほしいこと

いしたーです。アルバイトで機械学習やってます。こんにちは。

とある勉強会に出席したときに、「機械学習をやりたいけどわからないことが多い」という意見を聞いたので、いくつかアドバイスを載せておきます。

##読む前の注意
* 研究についてのアドバイスは書いていません。趣味で機械学習をやろうと思っている方が対象です。
* この記事は他の方の意見をまとめたものではありません。私個人の経験に基づいて書いたものです。よって、この記事の内容はほとんど「私の意見」です。

以上2つの注意点を踏まえた上でお読みください。

##「機械学習で何をしたいのか」を決めてほしい
機械学習を学ぶ前に、機械学習を使って何をしたいのかを決めてください。
機械学習は数式がたくさん登場したり、難しい概念を理解しなければならなかったりすることがあります。
やりたいことを決めてから学ぶと、今自分はある目的を達成するために学んでいるんだと思うことができます。これは学習の進み具合に大きく影響します。
学ぶ前に何をしたいのかを決めるべきだというのは、機械学習に限らずプログラミング全体を通して言えることだと思います。

例えば、機械学習を使うと以下のようなことができます。

* 車載カメラの映像から歩行者を検出して車の事故防止に役立てる
* CT画像を解析して病気の原因をコンピュータに探させる
* コンピュータに将棋をさせる
* Siriのような対話インターフェースを作ってコンピュータと会話をする

他にもさまざまなことができます。
機械学習は応用範囲が非常に広いので、自分が本当に作りたいもの、やりたいことが必ず見つかるはずです。ぜひ自分の作りたいものを探して、実際に作ってみてください。

##理論の完璧な理解は後回しでいい
###最初から理論を理解するのは無理
勉強会ではこんなことを聞きました。
「アルゴリズムの実装もやりたいんだけど、その前に理論を理解したい」

アルゴリズムを完璧に理解してからコードを書きたくなるというのはプログラマとしてすごくいい癖(素質)だと思います。
しかし、機械学習に関しては、最初から完璧に理論を理解しようとするのはあまり良くないと私は思います。なぜなら、単純に難しいからです。

機械学習の理論の大半は高度な数式で構成されています。
最も単純なアルゴリズムであるパーセプトロンなら、高校レベルの数学力があれば容易に理解できます。しかし、それより少し性能のいいSVM(サポートベクターマシン)などを理解しようとすると、とたんに難しい部分がたくさん出てきます。
例えば、SVMの最も重要な部分であるカーネル関数の原理を理解しようとすると、非常に高度な数学が必要になります。どのくらい高度か知りたい方は、「カーネル関数　原理」などでググってみて出てくる数式を眺めてみるといいでしょう。

要は、「機械学習をやってみたい」もしくは「機械学習を始めてみた」という方がいきなり理論を完璧に理解するのはまず無理だということです。

###ある程度の理解でいいから、アルゴリズムを実装してみよう
カーネル関数は理論は難しいですが、コード上では1行で実装できます。
例えばガウシアンカーネルはPythonでは以下のようになります。

```py
def gaussian_kernel(x1, x2, sigma):
    return np.exp(-norm(x1-x2)**2 / (2*(sigma**2)))
```

概念は難しくても、コードにするのは難しくありません。
数式さえ読めれば、理論が理解できなくてもアルゴリズムを実装することは可能です。

理論の理解はアルゴリズムを実装してからで十分です。
最初はとにかく作ってみて、そのアルゴリズムがどのような手順で動いているのか、なぜ動くのかを大まかに理解することをおすすめします。
アルゴリズムの動作の大まかな理解が済んだ後に、その動作を数式で表すとどうなるかを学ぶのが良いでしょう。


##入力データをそのまま学習できるわけではない
機械学習ではしばしば「識別」を扱います。
例えば、ブドウとリンゴを見分けたいだとか、防犯カメラに写っている人物が顔を隠しているかどうかを見分けたい、などといったものです。

さて、機械学習には様々な識別アルゴリズムが存在します。先ほど登場したSVMもその一つです。

「じゃあブドウとリンゴを見分けたいんだったらブドウとリンゴの画像をそのままSVMに入力すればいいんだね」

じつはこれは間違いです。

機械学習アルゴリズムは高次元の(有用でない)入力データが与えられると十分なパフォーマンスを発揮できません。
いきなり言われてもよくわからないかもしれないので、解説します。

例えば、5x5の大きさの白黒の画像はこんな感じで表わせます。

```py
[[0 3 3 8 6]
 [5 7 8 0 1]
 [1 8 7 1 4]
 [2 0 8 1 5]
 [9 9 5 7 4]]
```

つまり、画像の縦x横の大きさの配列に、ピクセルごとの明るさを格納すればいいわけです。

これを1次元の配列になおしてみるとこうなります。

```
[0 3 3 8 6 5 7 8 0 1 1 8 7 1 4 2 0 8 1 5 9 9 5 7 4]
```

これはベクトルの形をしていますね。

ところで、多くの機械学習アルゴリズムの入力はベクトルです。つまり、1次元配列の形をしていれば何でも入力することができます。

「じゃあブドウとリンゴを識別したいんだったら、ブドウとリンゴの画像を1次元配列に展開して入力すればいいじゃん」

と思うかもしれませんがそうではないんです。

機械学習アルゴリズムにこのベクトルを入力しても、うまく学習を行うことができません。
画像をベクトルに変換できたし機械学習アルゴリズムに入力して学習させてみよう！と意気込んでやってみると精度が出なくてがっかりします。
これを__次元の呪い__といいます。

なぜこのようなことが起きるかというと、機械学習アルゴリズムは「ブドウとリンゴのどこに着目すれば両者を分類できるか」を判断できないからです。
ブドウとリンゴの色に着目すればいいのか、形に着目すればいいのか。どこを見れば両者を分類できるかを、機械学習アルゴリズムが判定することは基本的にはできません。

よって、ブドウとリンゴのどこを見ればいいのかを、人間が教えてあげる必要があります。
ブドウとリンゴそれぞれの特徴をうまく表現できるものを、我々がベクトルとして取り出さなければなりません。

皆さんならリンゴとブドウを見分けたいとしたら何を頼りに見分けますか？
リンゴは赤い、ブドウは青い。つまり、色で見分けることができますね。
例えばこんなベクトルを抽出してみるとうまく識別できるでしょう。

```
[赤の濃さ 青の濃さ]
```

何千次元もある画像のベクトルをそのまま学習アルゴリズムに入力するより、色という有用な情報を学習アルゴリズムに入力するほうが楽に識別を行えます。

この識別したい物体やデータからより有用な情報を取り出す操作を__特徴抽出__といいます。

機械学習アルゴリズムを使って識別などを行うときには、特徴抽出を行った後のデータをアルゴリズムに入力するということをよく覚えておいてください。

##おわりに
間違っている場所、読んでいて疑問に思った点などがあったら気軽にコメントしてください。
jThree で立方体をひとつ表示させるまでのメモ

#はじめに
jThree は JavaScript で WebGL を簡単に扱うことができるライブラリです。
jThree は 3D キャラクタを動作させる、オーディオ再生など、いろいろすごいです。

ですが、そのあたりは他所のデモ・説明などで見てもらうとして(説明無理...)、ここでは、jThree で立方体をひとつ表示させるまで、をメモします。

jThree は公式サイトからダウンロードできます。(ローカル Web サーバに配置しました)

- http://jthree.jp/ (jThree 公式サイト)


# 立方体を表示させる手順
HTML ですが、以下のようにしました。(Haml で記述してます)

```haml:sample.haml
!!!
%meta(charset="UTF-8")
%title jThree の練習

#stage(style="width: 600px; height: 400px")

%script(src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js")
%script(src="script/jThree.min.js")

%script(src="mygoml.goml" type="text/goml")
```

 - レンダリングする要素を用意 (上の例では id=stage の div 要素)
 - jQuery(.min).js を読み込む (jThree が依存している)
 - jThree(.min).js を読み込む
 - GOML を読み込む (上の例では "mygoml.goml")

jThree で特徴的と思うのは GOML です。
オブジェクト(Mesh, Camera, Light など)は GOML で定義します。
GOML はマークアップ言語で HTML5 のように記述できます。(Haml で記述しました)

```haml:mygoml.ghaml
%goml
  %head
    %geo#g01(type="Cube" param="50 50 50")
    %mtl#m01(type="MeshLambert" param="color: #f00;")

    %rdr(frame="#stage" camera="#c01" param="clearColor: #ccc;")

  %body
    %scene
      %camera#c01(style="position: 100 100 100; lookAt: 0 0 0;")

      %light(type="Amb" style="light-color: #555;")
      %light(type="Dir" style="light-color: #fff; position: 50 200 100;")

      %mesh(geo="#g01" mtl="#m01" style="position: 0 0 0;")
```

head には Geometry, Material, Renderer を定義しています。
body には Scene を定義し、その子要素として Camera, Light, Mesh を定義しました。

GOML は HTML の script 要素として読み込みましたが、JavaScript からも読み込めるようです。この例では、他に動的な処理は行わないので JavaScript スクリプトの自作は不要でした。

以上を用意したら、Haml を HTML、または GOML に変換して、ローカルの Web サーバに配置します。

    $ haml -q sample.haml sample.html
    $ haml -q mygoml.ghaml mygoml.goml

※ 私は手作業で make しています

#表示結果
![jthree-cube.png](https://qiita-image-store.s3.amazonaws.com/0/60624/daef8619-dce4-044f-f877-b14377876c36.png)
※ブラウザ: Chromium バージョン 39.0.2171.65 Ubuntu 14.04 (64-bit)
自動プロキシ設定

動作未確認

```bash:192.168.11.35
yum install -y squid
```

```bash:proxy.pac
function FindProxyForURL(url, host) {
  if ( isInNet(host, "192.168.100.0"   , "255.255.255.0"  )
    return "PROXY 192.168.11.35:3128";
  else
    return "DIRECT";
}
```

`192.168.100.0/24`にアクセスする時のみ`192.168.11.35:3128`のプロキシを使う。
R でランダムに日付を生成する #rstatsj

R でランダムに日付を生成する必要があったので、調べてみたらネットには情報が見つかりませんでした。
私の自己流を紹介します。

2014/12/01 から 2014/12/31 までの日付をランダムに生成するには、普通に考えると次のやり方が思いつきます。

```r:R
date_seq <- seq(as.Date("2014-12-01"), as.Date("2014-12-31"), by="days")
dates <- sample(date_seq, size = 100, replace = TRUE)
print(dates[1:5])
```

```:結果
"2014-12-06" "2014-12-02" "2014-12-11" "2014-12-11" "2014-12-23"
```

まず、日付のシーケンスを作って、それからランダムサンプリングする方法です。

日付だけならこの方法で十分ですが、時刻付きの日付をランダムに生成したいときに困ります。
時刻付きの日付のシーケンスをあらかじめ用意しておくことは難しいからです。

そこで、`Date` 型は数値を加えることによって日付加算できることを思い出します。

```r:R
as.Date("2014-12-01")
as.Date("2014-12-01") + 1
```

```:結果
"2014-12-01"
"2014-12-02"
```

従って、次のようにすればランダムな日付を生成できます。

```r:R
dates <- as.Date("2014-12-01") + sample(0:30, size=100, replace=TRUE)
dates[1:5]
```

```:結果
"2014-12-26" "2014-12-16" "2014-12-07" "2014-12-18" "2014-12-02"
```

これに倣えば、時刻付きの日付をランダム生成することができます。

```r:R
datetimes <- as.POSIXlt("2014-12-01", tz="Japan") + 
               sample(seq(31*24*60*60)-1, size=100, replace=TRUE)
datetimes[1:3]
```

```:結果
"2014-12-29 00:31:47 JST" "2014-12-27 12:20:42 JST" "2014-12-13 12:02:37 JST"
```

`POSIXlt` は、数値を加算すると1秒加算されることに注意してください。

```r:R
as.POSIXlt("2014-12-01", tz="Japan")
as.POSIXlt("2014-12-01", tz="Japan") + 1
```

```:結果
"2014-12-01 JST"
"2014-12-01 00:00:01 JST"
```

`POSIXct` に対しても同様にできます。

```r:R
datetimes <- as.POSIXct("2014-12-01", tz="Japan") + 
               sample(seq(31*24*60*60)-1, size=100, replace=TRUE)
datetimes[1:3]
```

```:結果
"2014-12-15 20:37:52 JST" "2014-12-25 17:08:25 JST" "2014-12-01 18:36:55 JST"
```

ちなみに、時間区切りの日付をランダムに生成したいときは、次のようにすればできます。

```r:R
datetime_seq <- seq(as.POSIXlt("2014-12-01", tz="Japan"), 
                    as.POSIXlt("2015-01-01", tz="Japan"), by="hour")
datetime_seq <- datetime_seq[-length(datetime_seq)]
datetimes <- sample(datetime_seq, size=100, replace=TRUE)
datetimes[1:3]
```

```:結果
"2014-12-11 04:00:00 JST" "2014-12-26 13:00:00 JST" "2014-12-12 06:00:00 JST"
```

以上です。
How to convert `org.apache.hadoop.io.Text` to byte array?



How to convert `org.apache.hadoop.io.Text` to byte array?

This class has a "sweet" method named `getBytes`. Seems we can directly convert it to byte array using this method.

If you have similar idea, don't do that! It takes me almost an hour to find this stupid bug. 

According to official documentation: 

> getBytes():
>
> Returns the raw bytes; however, only data up to getLength() is valid

So the bytes you get may contain invalid data!

I think one solution is through `Bytes.toByte`


```java:stupid.java

Bytes.toByte(text.toString())

```

Who or what kind of application will use the `getBytes` method? I totally have no idea.

What can we learn from this?

As library developer,

- Don't expect everyone will read the whole documentation especially when your library contains tens of thousands of methods.

- Never expose dangerous methods like `getBytes`. Or you can name it differently like `getBytesUnsafe` to call the attention of library users.

As programmer,

- Be familiar with every method you have called.
Cocos2d-x 3.x, iOS用, 手抜きStatic Library作成方法

Cocos2d-xの3を触るようになってから、なんか2よりビルド遅いなーと思ったので、いくつかの方の情報を参考にstatic libraryを作成しようと思いました。

先に言っておきますと真面目な方は下記の方達の情報を参考なさることをお勧めします。

http://qiita.com/g-1/items/01f6c430326dfd125af9
http://qiita.com/KawabataLemon/items/8387b0e54b06308a8693
http://qiita.com/AlecYawata/items/f7077483139c36fef9c9

-----
で自分もつくろうと思ったのですが、そもそも
「Cocos2d-xはCleanされなければ問題ないのでは」
と思ったので寄り道してCocos2d-xをCleanから外す方法を探してみました。

が、見つからない。

標準のCleanコマンドでは見つからないのでやるとしたらカスタムのコマンドを作る必要がありそう。
「まあでもカスタムのコマンドって言ってもビルドされたもの消せばいいだけだし適当にrmすればいけるのでは」

と思って、~/Library/Xcode/DerivedData/ を見てたら、あるじゃないですか、aファイルが。考えてみれば当たり前ですが。

「ん、ここにあるaファイル使えばRakeとか使わなくてもいいのでは」
と思ったので試してみました。

結論からいうと自分の環境では使えました。

-----
手順としては下記のような感じです。

__１．適当なCocos2d-xのプロジェクトを作成する__

```
cocos new DummyProject -p com.company.dummy -l cpp -d ./projects/
```

__２．aファイルが欲しいターゲットを選択してビルド__

デバイスとシミュレータで一つづつ作っておけば足りると思います。
Releaseビルドが欲しい方は必要に応じてEdit Schemeで変更してください。

![58e344c4-370f-7fe7-3744-2558eb4cad66.png](https://qiita-image-store.s3.amazonaws.com/0/19676/90a05fa4-ab3f-e65f-a03a-db7816e77256.png)

__３．~/Library/Xcode/DerivedData/(プロジェクト名)/Build/Products 以下からビルドされたaファイルを探す__
（Xcodeの設定で出力先を変えている場合はそこから）

![39e825a5-442d-9d5f-fbb3-3e54635af77f.png](https://qiita-image-store.s3.amazonaws.com/0/19676/e6f1d8ac-7dd1-396d-4fb7-62461ae1d219.png)

__４．lipoでデバイス用とシミュレータ用のを結合__

```
lipo -create ./Release-iphoneos/libcocos2dx\ iOS.a ./Release-iphonesimulator/libcocos2dx\ iOS.a -output libcocos2dx\ iOS.a
（Cocos2d-x関連の各aファイル全てに行う）
```

__５．使いたいプロジェクトからCocos2d-x関連ビルドのTARGETを削除する__
（ヘッダファイルは使うのと、必要に応じてcocos2d-xのソースを追いたい時があるので、cocos2d_libs.xcodeproj 自体は削除しないで残しておきます）

![334725bf-8e64-ade8-d475-b9b5683bfe3f.png](https://qiita-image-store.s3.amazonaws.com/0/19676/a201ceb2-e316-1a17-40c6-5b201e53ecc6.png)

__６．先ほど作成したaファイルたちをプロジェクトに追加してやる__

![42dd7ada-b5c0-0362-47fe-e673707c6a9a.png](https://qiita-image-store.s3.amazonaws.com/0/19676/bfb4f346-f2f2-34d1-2242-54d3e809cf4a.png)

__７．(ﾟдﾟ)ｳﾏｰ__

-----
この方法のメリット・デメリットは

【メリット】
・Rakeとかxcodebuildの使い方をよくわからなくてもXcodeのGUIでBuildSettingとか設定できる

【デメリット】
・__手順を整理してみるとやっぱRakeの方が楽なんじゃないか感がある__
・Rakeコマンドなどは一度作っておけば以後も一発で出来るので便利

僕はStaticLibなんてそうそう作りなおすことは無いので、とりあえずこれでしばらく使ってみます。

-----
追記：
static libraryに差し替えたあと、場合によっては、リンク時にワーニングが出るかもしれません。
「PIE disabled. Absolute addressing〜〜〜」
こういうのが出た場合は、
Dont create position independent executables を YES にしましょう。

http://stackoverflow.com/questions/22191371/pie-disabled-absolute-addressing-error-ios-7
ping: icmp open socket: 許可されていない操作です

```bash:
$ ping server01
ping: icmp open socket: 許可されていない操作です
```

英語だと
ping: icmp open socket: Operation not permitted

# 修正方法

```bash:centosの場合
ls -l /usr/bin/ping
chmod u+s /usr/bin/ping
ls -l /usr/bin/ping
```

```bash:proxmox4の場合
chmod u+s /bin/ping
```

# 悪い例

```bash:/etc/sudoers
%users  ALL=(ALL) NOPASSWD: /usr/bin/ping
```

```bash:~/.bashrc
alias ping='sudo ping'
```
vncserverで日本語入力

## debian9でibus-anthy

* 日本語入力できた。(変換候補表示される)

```bash:
sudo apt-get install -y \
  ibus-anthy lxpanel openbox tightvncserver
```

```bash:~/.vnc/xstartup 
#!/bin/sh

xrdb $HOME/.Xresources
xsetroot -solid grey
export XKL_XMODMAP_DISABLE=1

export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus
ibus-daemon -d
lxpanel &
openbox &
```


なおibus-mozcでは日本語入力ができなかった。

----

## debian9でuim-anthy

* 日本語入力できた。(しかし変換候補は表示されない)

```bash:
sudo apt-get install -y \
  uim-anthy uim-xim lxpanel openbox tightvncserver
```

```bash:~/.vnc/xstartup 
#!/bin/sh

xrdb $HOME/.Xresources
xsetroot -solid grey
export XKL_XMODMAP_DISABLE=1

export GTK_IM_MODULE=uim
export XMODIFIERS=@im=uim
export QT_IM_MODULE=uim
uim-xim &
lxpanel &
openbox &
```

なおuim-mozcでは日本語入力ができなかった。
remote_fileリソースで認証を越えてアクセスする


[Chef Advent Calendar 2014 - Qiita](http://qiita.com/advent-calendar/2014/chef)の（名目上の）5日目です。

----

Chef 11.6から`remote_file`に`headers`属性が付与できるようになりました。

[Release Notes: chef-client 11.6 — chef-client 11.6 Documentation](http://docs.getchef.com/release/11-6/release_notes.html#resource-remote-file-attributes)

例えば、認証付きのJenkinsからファイルを取得する必要がある場合などに使えます、というか、その用途で使いました。

11.6以前って、みんなどうしてたんだろう……。

例えば、JenkinsサーバーにChefアクセス用のユーザー、foo（パスワードはbar）がいるとして、こんな感じでbase64デコードしてやって、

```
$ echo -n 'foo:bar' | base64 
Zm9vOmJhcg==
```
それをこんな感じで`Authentication`ヘッダに載せてやればオッケーです。

```ruby
remote_file local_file do
  source remote_file
  headers 'Authorization' => 'Basic Zm9vOmJhcg=='
end
```

参考
------------

* [remote_file — Chef Docs](https://docs.getchef.com/resource_remote_file.html)
* [recipe - Opscode Chef: provider remote_file with headers attribute - Stack Overflow](http://stackoverflow.com/questions/17838120/opscode-chef-provider-remote-file-with-headers-attribute)

個人の感想です
--------------

Chefって覚えること多くてしんどくて、ドキュメントが多い割にはアンドキュメントなところも多くて、開発がアクティブだから1年前の情報と違うこと（最近は[encrpyted data bag](http://docs.getchef.com/chef/essentials_data_bags.html#encrypt-a-data-bag-item)より[chef-vault](https://docs.getchef.com/chef_vault.html)のほうがいいの？）が割とあるとかで、なんだか人気に翳りがでてきてるような気がする。
仕事でRails触ってないから想像なんだけど、Railsのバージョンアップについていくのがしんどいんだけどバージョンアップを頑張りたくてRails使ってるわけじゃない的な。インフラ寄りのひとだったら余計にそうだろうなあ。

まだ、Ansibleのほうが覚えること少なくて芽があるんじゃないか、と思ってて（個人の感想です）、わりとみんなもそうだったりするのかな。

そんなChefとAnsibleの対比を考えていて、なぜかWatson (Jenkinsの旧称)がでてくるまえのCIツール群（Cruise control, Damage controlなど）を思い出した。まーでも、Cruise controlとかはキャズムを超えらんなかったけどChefはそうじゃないから、そういう類型化は違うか。

Ansibleですべて解決！とかはまったく思ってないし同じ問題をはらんでいる可能性もあるんだけど、あくまで個人的にはAnsibleのほうが肌に合うな、と思っています。

以上、個人の感想でした。
[Swift] バイブレーションでぶるぶる(((( ´･ω･`)))

### 経緯

iPhoneを小型マッサージ器化し、肩こりを改善したい！

### 準備
プロジェクトの Build Phases -> Link Binary With Libraries に
**AudioToolbox.framework** を追加します。

![ライブラリの追加](https://qiita-image-store.s3.amazonaws.com/0/9760/f1da28a4-7400-eb18-7fb4-f384b3e101e5.png)

### コード

```swift
// ライブラリをインポート
import AudioToolbox

// バイブレーション
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
```

とりあえずブルブルさせてみたい人は、こんな感じで。

```swift

import UIKit
import AudioToolbox

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
    }
}
```

あとは、whileで無限ループさせてあげれば…

### まとめ

肩こりは解消されませんでした((((;´･ω･`)))
[2014年] jQuery等でよくあるメソッドチェーンについて

ふと他の人の記事に触発されたのでメソッドチェーンのお話でも。

知ってる人には当たり前の話ですが、
メソッドチェーンというのは呼び出しもとのオブジェクトをそのまま(あるいは同等のオブジェクトを)returnすることで実現しています。

たとえば、

```js
$(".hoge")
  .addClass("fuga")
  .animate({
    "margin-top": "100"
  }, 4000)
  .css("margin-top", "0");
```

例にあげているような処理だと実はこんな風に置き換えると、
メソッドチェーンの原理が理解しやすいかもしれませんね。

```js
/* ".hoge"のjQueryオブジェクトが返る */
var step1 = $(".hoge");

/* addClassを実行した結果、
   ".fuga"が追加された".hoge"のjQueryオブジェクトを返してくる */
var step2 = step1.addClass("fuga");

/* 同様にやっぱりanimateでcssが書き換えられた
   ".hoge"のjQueryオブジェクトを返してくる */
var step3 = step2.animate({
    "margin-top": "100"
}, 4000);

/* しつこいようだがcssが書き換えられた
   ".hoge"のjQueryオブジェクトを返してくる */
var step4 = step3.css("margin-top", "0");
```

ちなみにfindなど、中には別のエレメントのjQueryオブジェクトを返してくるものもありますのでメソッドチェーンは使いこなすとさらに選択肢が広がります。
(findだとendで前のjQueryオブジェクトを返すのでチェーンを継続したり出来ます)

# つなげられるのはわかったけど結局何がメリットなの？
って人のためにわかりやすいメリットを一つ。

これも知ってる人には常識かもしれませんがjQueryオブジェクトを作成するのには多少のコスト(負荷)がかかります。
一つや二つなら気にならないレベルですが積み重なると無視できないレベルでブラウザのCPU使用率が増えたりします。


```js
// ".hoge"のjQueryオブジェクトを新たに生成してtoggle実行
$(".hoge").toggle();

// 新たに".hoge"のjQueryオブジェクトを生成してtoggle実行
$(".hoge").toggle();

// さらに".hoge"のjQueryオブジェクトを新たに生成してtoggle実行
$(".hoge").toggle();
```

無駄の極みです。同じオブジェクトを毎回作り続けているのは正気の沙汰ではありません。
(そもそもあまり意味のあるコードでもないですが例なのでそこは置いておきます) 

このように、同じオブジェクトを何度も使いたい場合は変数に格納して一度作ったものを使いまわすか、メソッドチェーンを使いましょう。
Webアプリ内で慣性スクロールを実装する


最近iOSネイティブ開発の機会が減ってネタがないのでWebアプリネタを透過します。あくまでhtmlの話です。


#WebKitのスクロール減速速度
UIScrollView#decelerationRate の UIScrollViewDecelerationRateFastと同じ減速速度で、ヌルヌル感がないやや強い設定になっています。
ネイティブで実装する場合はdecelerationRate値を変更するだけなのですが、WebアプリやハイブリッドアプリなどでViewをHTMLで作成した場合はhtmlに細工を施す必要があります。

#実現方法
##div内のoverflowスクロールを利用する
-webkit-overflow-scrollingというベンダープリフィックスプロパティが存在するのでこれをtouchに設定し、divからはみ出た部分をscrollに設定します。
それからスクロール範囲であるdiv自体の高さを適切に調整します。

```css:sample.css
div.fast-scroll {
  -webkit-overflow-scrolling: touch;
  overflow: scroll;
  height: 100%;
}
```

##注意点
WebKit自体はスクロールしないためwindow.onscrollイベントが発生しませんので、これを利用した外部ライブラリは一切使えなくなる可能性があります。
利用には十分ご注意ください。


##Android端末での利用
Android4以上の機種でも、-webkit-overflow-scrollingが使用可能なようですがスクロールのパフォーマンスが劣化する可能性があります。また端末によっては十分にスクロール減速速度は緩やかなので対応機種によっては設定しない方がいいかもしれません。


#Demo
対象端末のブラウザからアクセスしてください。

[慣性スクロール有り](https://dl.dropboxusercontent.com/u/8511076/fstest/fast-scroll.html)
[慣性スクロール無し(標準)](https://dl.dropboxusercontent.com/u/8511076/fstest/normal-scroll.html)