OmniAICreator/Qiita-1.07M huggingface dataset:
回転行列⇔角度の変換

カメラキャリブレーションにおいて外部パラメータである回転行列(Rotation Matrix)を扱う時，
3 * 3の行列で表したい時と，各軸(x軸，y軸，z軸)に対する角度で表したい時がある．

この時の相互変換行列のメモ．間違っていても責めないでください．
（回転行列⇒角度の場合は一意に求まらない場合があるので，多少の注意は必要．）

ただし，今回は右手座標系において，各軸に対する変換は以下のように定めており，
回転行列R = Rz * Rx * Ryとする．（掛け合わせる順序が変わると式が変わる．）
x, y, zは各軸の回転角（ラジアン）とする．

+ x軸周りの回転行列

```cpp
Rx = ( 1, 0, 0,
     0, cos(x), -sin(x),
     0, sin(x), cos(x) )
```

+ y軸周りの回転行列

```cpp
Ry = ( cos(y), 0, sin(y),
     0, 1, 0,
     -sin(y), 0, cos(y) )
```

+ z軸周りの回転行列

```cpp
Rz = ( cos(z), -sin(z), 0,
     sin(z), cos(z), 0,
     0, 0, 1 )
```

+ 回転行列（Rz * Rx * Ry）

```cpp
R = cos(y)cos(z) - sin(x)sin(y)sin(z), -cos(x)sin(z), sin(y)cos(z) + sin(x)cos(y)sin(z),
      cos(y)sin(z) + sin(x)sin(y)cos(z), cos(x)cos(z), sin(z)sin(y) - sin(z)cos(y)cos(z),
      -cos(x)sin(y), sin(x), cos(x)cos(y)
```

なので，
角度⇒回転行列

```cpp
void computeMatrixFromAngles(
     cv::Mat & R,
     double x,
     double y,
     double z){

  R.row(0).col(0) = cos(y)*cos(z) - sin(x)*sin(y)*sin(z);
  R.row(0).col(1) = -cos(x)*sin(z);
  R.row(0).col(2) = sin(y)*cos(z) + sin(x)*cos(y)*sin(z);
  R.row(1).col(0) = cos(y)*sin(z) + sin(x)*sin(y)*cos(z);
  R.row(1).col(1) = cos(x)*cos(z);
  R.row(1).col(2) = sin(y)*sin(z) - sin(x)*cos(y)*cos(z);
  R.row(2).col(0) = - cos(x)*sin(y);
  R.row(2).col(1) = sin(x);
  R.row(2).col(2) = cos(x)*cos(y);
}
```

回転行列⇒角度

```cpp
void computeAnglesFromMatrix(
			     cv::Mat R,
			     double & angle_x,
			     double & angle_y,
			     double & angle_z
			     ){
 
  double threshold = 0.001;

  if(abs(R.at<double>(2,1) - 1.0) < threshold){ // R(2,1) = sin(x) = 1の時
    angle_x = PI / 2;
    angle_y = 0;
    angle_z = atan2(R.at<double>(1,0), R.at<double>(0,0));
  }else if(abs(R.at<double>(2,1) + 1.0) < threshold){ // R(2,1) = sin(x) = -1の時
    angle_x = - PI / 2;
    angle_y = 0;
    angle_z = atan2(R.at<double>(1,0), R.at<double>(0,0));
  }else{
    angle_x = asin(R.at<double>(2,1));
    angle_y = atan2(-R.at<double>(2,0), R.at<double>(2,2));
    angle_z = atan2(-R.at<double>(0,1), R.at<double>(1,1));
  }
}
```

参考サイト
+ http://d.hatena.ne.jp/It_lives_vainly/20070829/1188384519
（↑のサイトは回転行列の表現がちょっと間違ってる？）
Deviseのviewsでhamlを使う


## 使用gem

```
$ gem install html2haml
```


## コマンド
deviseのセッティング後、通常通り、

```
$ rails g devise:views
```
で、viewsを作成する。

その後、ターミナルで、

```
$ for file in app/views/devise/**/*.erb; do html2haml -e $file ${file%erb}haml && rm $file; done
```
を叩いたら、erbはすべて消え、hamlのみ残る。

## 参考
[How To: Create Haml and Slim Views](https://github.com/plataformatec/devise/wiki/How-To:-Create-Haml-and-Slim-Views)
コンストラクタに配列を展開して渡したい

Arrayっぽいこんなクラスがあったとする

```js
function Arraylike() {
	for (var i = 0, len = arguments.length; i < len; i++) {
		this[i] = arguments[i];
	}
	this.length = len;
}

Arraylike.prototype.join = function(separator) {
	return [].join.call(this, separator);
}

// new Arraylike(1, 2, 3).join(', ') => "1, 2, 3"
```

`var array = [1, 2, 3]` みたいな配列があって、これを`Arraylike`のコンストラクタに渡したいとき、どうしたらよいのか。

簡単にできそうでできないのでわりと困るけど、何個かそれっぽいやりかたはある。

## Function.prototype.bind を使う方法

ES5で定義された`Function.prototype.bind`を使えば、実はうまいことできる。

```js
var Binded = Arraylike.bind.apply(Arraylike, [null].concat(array));
var instance = new Binded();

console.log(instance.join(', ')); //=> "1, 2, 3"
console.log(instance instanceof Arraylike); //=> true
```

ただし、この方法はちょっと古い iOS や Android、IE8では使えない模様。

http://kangax.github.io/es5-compat-table/
http://d.hatena.ne.jp/zentoo/20120819/1345378440

##  ダミーのコンストラクタを作る方法

プロトタイプを空のコンストラクタに付け替える方法。
ただし、この方法では組み込みクラスで使えなかったりする。

```js
function Dummy() {}
Dummy.prototype = Arraylike.prototype;
var instance = new Dummy();
Arraylike.apply(instance, array);

console.log(instance.join(', ')); //=> "1, 2, 3"
console.log(instance instanceof Arraylike); //=> true
```

## evalする方法

弾先生のブログにヒントが
http://blog.livedoor.jp/dankogai/archives/51758978.html

```js
var argsValue = array.map(function(v, i){
    return 'args[' + i + ']';
}).join(', ');

var instance = Function('ctor', 'args',
    'return new ctor(' + argsValue + ');')(Arraylike, array);

console.log(instance.join(', ')); //=> "1, 2, 3"
console.log(instance instanceof Arraylike); //=> true
```

## 結論

`eval`する方法が一番対応ブラウザ多くて素直だと思う。
ネックは速度だろうけど、生成した関数をキャッシュしておけば解決できそう。
Functionにメソッド追加して、こんな感じでどうでしょうか。

なにか問題があったり、もっとスマートなやり方があれば教えてください。

```js
Object.defineProperty(Function.prototype, 'applyConstructor', (function(){
	var cache = {};

	function generate(len) {
		var argsValue = [];
		for (var i = 0; i < len; i++) {
			argsValue.push('args[' + i + ']');
		}
		return Function('ctor', 'args', 'return new ctor(' + argsValue.join(',') + ')');
	}

	return {
		value: function(args) {
			var len = (args != null && args.length) || 0;
			return (cache[len] || (cache[len] = generate(len)))(this, args);
		}
	};
}()));

console.log(Arraylike.applyConstructor(array).join(', ')); // => 1, 2, 3
```
Google Test の始め方

C++を勉強するにあたってテストコードの書き方を知っておいたほうがいいかなと思い、
トレンドな雰囲気があるgoogle testを試してみた。

試した環境はLinux Mint Debian Edition。あわせて最近勉強中の cmakeを使っている。


# googletestを入手する

次のサイトからzipファイルで入手する。

http://code.google.com/p/googletest/


# googletestをビルドする

googletestのソースの置き場を `$HOME/usr/src` としている。

zipを展開する。

```bash
$ unzip gtest-1.7.0.zip
$ cp -r gtest-1.7.0.zip ~/usr/src
```

cmakeでビルドする。ビルド用のMakefileの置き場は
`$HOME/usr/src/gtest-1.7.0/build` としている

```bash
$ cd ~/usr/src/gtest-1.7.0
$ mkdir build
$ cd build
$ cmake ..
$ make
```

これで `build` ディレクトリのなかに
`libgtest.a` と `libgtest_main.a` が作られる。


# テスト用プロジェクトとテストコードを書く

プロジェクトのディレクトリの内容は以下の通り。

    GoogleTestExample
    ├── CMakeLists.txt
    └── GoogleTestExample
        ├── CMakeLists.txt
        └── gtest_example.cpp

    1 directory, 3 files


テストコード。

```cpp:GoogleTestExample/GoogleTestExample/gtest_example.cpp
#include <gtest/gtest.h>

int add(int x, int y)
{
    return x + y;
}

TEST(AddTest, Test1)
{
    ASSERT_EQ(2, add(1, 1));
}
```


ビルド用のCMakeLists.txt

```cmake:GoogleTestExample/CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
add_subdirectory(GoogleTestExample)
```

`include_directories` でgoogletestのヘッダファイルの置き場所を指定し、
`target_link_libraries` でリンクするライブラリを指定している。

pthreadへのリンクが必要なのかはわからないが、ないとエラーでビルドできなかった。

```cmake:GoogleTestExample/GoogleTestExample/CMakeLists.txt
set(GTEST_ROOT $ENV{HOME}/usr/src/gtest-1.7.0)
include_directories(
	${GTEST_ROOT}/include
	)
add_executable(gtest_example gtest_example.cpp)
target_link_libraries(gtest_example
	pthread
	${GTEST_ROOT}/build/libgtest.a
	${GTEST_ROOT}/build/libgtest_main.a
	)
```


# ビルド/実行

ビルドして実行してみる。

```bash
cd GoogleTestExample
mkdir build
cd build
cmake ..
make
./GoogleTestExample/gtest_example
```


次のように実行結果が得られる。

    Running main() from gtest_main.cc
    [==========] Running 1 test from 1 test case.
    [----------] Global test environment set-up.
    [----------] 1 test from AddTest
    [ RUN      ] AddTest.Test1
    [       OK ] AddTest.Test1 (0 ms)
    [----------] 1 test from AddTest (0 ms total)

    [----------] Global test environment tear-down
    [==========] 1 test from 1 test case ran. (0 ms total)
    [  PASSED  ] 1 test.


pythonとphpくらいでしかテストコードを書いたことないけど、とりあえず同じような感
覚でC++でもテストコードを書けそうだとわかった。ちょっとここに至るまでのステップ
が長い気がするけど、しょうがないのかな。
iOS7でPage Visibility APIを使う

iOS7のSafariから[Page Visibility API](http://www.w3.org/TR/2011/WD-page-visibility-20110602/)が使える様になったとのことなので試してみました。

```js
var count = 0,
    increase = false,
    countEl = document.getElementById('count');

setInterval(function() {
    increase && (countEl.innerText = ++count);
}, 100);

document.addEventListener('visibilitychange', function() {
    increase = document.hidden;
});
```
[実機での確認はこちらから](http://jsrun.it/t93/9rp9)

Chromeではプレフィックスが付いて`webkitvisibilitychange`,
 `document.webkitHidden`でしたが、iOS7のsafariでは不要のようです。

実機で動かしてみると右下のボタンを押してタブ選択中の状態でのみ
countが加算されます。

シングルページのWebアプリなどで画面を離れて一定時間以上経ったら
戻ってきたときにデータを更新するとか、色々と使い道はありそうな予感です。
ディレクトリ内のファイル数をカウントする

[連番の空ファイルを生成するワンライナー](http://qiita.com/stc1988/items/dd4420897d063028077b)でファイルを作成したものの、
ウン十万・ウン百万個以上のファイルを作成するとlsするだけでも時間がかかる。

## 1. lsを使ってカウント

```bash
$ ls -1 | wc -l
````
-1オプションで1行に1ファイル表示させ、`wc -l`で行数をカウントする

行数でなく単語数（ファイル数）でカウントしてもよい
 
```bash
$ ls | wc -w
```

## 2. findを使ってカウント
```bash
$ find . -type f | wc -l
```

## カウント速度を比較してみる
10万ファイルを作成し比較

>
$ seq -f "file_%06g" 100000 | xargs touch
$ time ls -1 | wc -l
100000
>
real	0m0.357s
user	0m0.320s
sys	0m0.044s
>
$ time find . -type f |wc -l
100000
>
real	0m0.162s
user	0m0.020s
sys	0m0.152s

## lsの方が遅いのか？

lsはデフォルトでソートを実施するので時間がかかる。
そこで、`-U`オプションを用いるとソートを実施しないようにする

```bash
$ ls -U1 | wc -l
```

カウント速度を計測
>
$ time ls -U1 | wc -l
100000
>
real	0m0.068s
user	0m0.020s
sys	0m0.052s

findよりも早くなりました。


__(※13/10/02 追記)__
lsでサブディレクトリを考慮して厳密にカウントするなら、下記のようにしたほうがよいとコメントを頂きました。

```bash
ls -F | grep -v / | wc -l
```
xargsのオプション無し、-Iオプション、-0オプションの挙動に関する勘違い

# 概要
xargsの挙動について激しく勘違いしててはまったので、どう勘違いしてて実際どうなのかをまとめる。

# オプション無し勘違い
今まで

```
$ echo 'a b c' | xargs echo
```

と書いたら、

```
$ echo a
$ echo b
$ echo c
```

と挙動が同じになると思ってた。本当は

```
$ echo a b c
```

になるのね。もっと言うと

```
$ echo "a b\nc\td     e" | xargs echo
```

は

```
$ echo a b c d e
```

と同じになるのね。このデフォルトのデリミタはスペース、タブ、改行、EOF。

# -I オプションの勘違い
`xargs`に`-I`オプションってあるじゃないですか。これって、

```
$ echo "a b\nc\td     e" | xargs -I{} echo {}
```

ってやると、

```
$ echo "a b\nc\td     e" | xargs echo
```

と同じだと思ってた。実際に実行させてみると

```
$ echo "a b\nc\td     e" | xargs -I{} echo {}
a b
c d e
$ echo "a b\nc\td     e" | xargs echo
a b c d e
```

違う。
manを見ると、確かに改行ごとにxargsの後ろのコマンドを実行する、と書いてある。つまり、

```
$ echo "a b\nc\td     e" | xargs -I{} echo {}
```

は

```
$ echo "a b" | xargs echo
$ echo "c\td     e" | xargs echo
```

とほぼ等価である。

# -0オプションの勘違い
`-0`オプションはデリミタをヌル文字にするオプション。なので、

```
$ echo "a b\nc\td     e" | xargs -I{} echo {}
```

と、上記コマンドの`\n`をヌル文字にして`-0`オプションを付けた

```
$ echo "a b\0c\td     e" | xargs -0 -I{} echo {}
```

は同じ、だと思っていた。が、違う。

```
$ echo "a b\nc\td     e" | xargs -I{} echo {}
a b
c d e
$ echo "a b\0c\td     e" | xargs -0 -I{} echo {}
a b
c	d     e
```

つまり、

```
$ echo "a b\nc\td     e" | xargs -I{} echo {}
```

は

```
$ echo "a b" | xargs echo
$ echo "c\td     e" | xargs echo
```

とほぼ等価で（これは前項のとおり）、

```
$ echo "a b\0c\td     e" | xargs -0 -I{} echo {}
```

は

```
$ echo "a b"
$ echo "c\td     e"
```

とほぼ等価になる。
後ろのxargs echoが消えたわけではなく、xargsに渡される文字列の空白文字が全部半角スペースに変換されずにそのままechoに渡される（例のコマンドにechoを2回使ってるせいで分かりづらいけど直すのめんどくさいからこのままで...）

# あんまり関係ないけど
`xargs` って第一引数省略すると`echo`になるのね
つまり

```
echo "a b\nc\td     e" | xargs echo
```

は

```
echo "a b\nc\td     e" | xargs
```

と等価。
htmlで属性の付け忘れ防止の警告（開発時用）

jQueryを使い、開発時に、htmlで特定の属性（ここではmaxlength)を付け忘れた要素が存在する場合に警告を表示します。
サーバー側で、開発モードでのみスクリプトがクライアントで生成されるようにすればきっとよりよいでしょう。

```html
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>htmlで属性の付け忘れ防止の警告（開発時用）</title>
	<link href="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet">
        <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/themes/ui-lightness/jquery-ui.css">
</head>
<body>

	<h4>htmlで属性の付け忘れ防止の警告（開発時用）</h4>
		<label for="date1">maxlengthあり</label>
		<input type="text" value="123" name="hasMaxlength" maxlength="3">
		<label for="date2">maxlengthなし</label>
		<input type="text" value="12345" name="withoutMaxlength">
		
		<hr>
		<div id="warningAlert" class="alert alert-warning"></div>
	<!-- script -->
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>
    <script src="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
	<script>
		$(function(){
			var $target = $("input").filter("input:text:not([maxlength])");
			if (0 < $target.length){
				$target.css("background-color","pink");
				$("#warningAlert").text($target.length + "個のmaxlengthがないテキストボックスが存在します。");
			}
		})
	</script>
</body>
</html>
```
jQuery-UIのdatePickerのボタンイメージにBootstrapのGlyphiconsを使う

```html
<!DOCTYPE html>
<html>
<head>
	<title></title>
	<link href="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/themes/ui-lightness/jquery-ui.css">
</head>
<body>

	<h4>jQuery-UIのdatePickerのボタンイメージにBootstrapのGlyphiconsを使う</h4>
		<label for="date1">標準ボタン</label>
		<input type="text" value="" name="date1" id="date1" class="datepicker">
		<label for="date2">Bootstrap3</label>
		<input type="text" value="" name="date2" id="date2" class="datepicker">
	
	<!-- script -->
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>
	<script src="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
	<script>
		$(function(){
			var $datepicker = $(".datepicker")
			$datepicker.datepicker(
				{showOn:'button'}
			);
			
			$("#date1").next("button.ui-datepicker-trigger").html("<span class='glyphicon glyphicon-calendar'></span>");
			
		})
	</script>
</body>
</html>
```
Windowsに複数バージョンのApacheをインストールする

検証などの関係で、一台のPCに複数バージョンのApacheを入れたいことがあったりする。
そんな時、普通にインストールしようとすると「あなたのPCには既にApacheが・・・」というメッセージが出てきてインストールできない(ウルサイそんなことは分かっているんだ)。

というわけで、複数バージョンをインストールする方法。

## 1.最初は普通にインストールする
複数バージョンの最初の一台は、普通にインストールする。これは、普通にインストールしないとhttpd.confなどの設定ファイルが作成されないためだ。

## 2.コマンドラインからインストールを行い、msiファイルを展開する
次に、別バージョンのインストール。
落としてきたmsiファイルを、下記のコマンドで解凍する(msiファイル名とTARGETDIRは適宜読み替え)。
`msiexec /a apache.msi /qb TARGETDIR=C:\Apache`

これを実行すると幾つかフォルダができるが、その中のprogram filesのフォルダにApacheのフォルダがある。これをコピーして適当なフォルダに配置する。

## 3.設定ファイルのコピーと書き換え
コマンドラインインストールした場合、confのなかは空っぽになっているので、1の手順で普通にインストールしたApacheのconfファイルをコピーする。
`ServerRoot`や`DocumentRoot`は当然コピー元のApacheで設定されているので、これは適宜書き換えを行う(置換してしまえばOK)。
あとは、ルートディレクトリにlogsのフォルダを作成すれば、作業完了。

## 注意点
Apacheはメジャーバージョンが異なるとLoadModuleの名前が変わっていたりするので（2.0->2.2ではmod_accessがmod_authz_hostになったりとか・・・）、この方法で複数バージョンやろうとするとhttpd.confでエラーが発生する可能性がある。
その際は公式ページを見ながらモジュールを書き換え都度頑張るか、もうやだ、となった場合はおとなしくアンインストール/インストールする。アンインストールしてもconfファイルは残るので、2以降の手順で複数バージョンインストールは行うことができる。

＜参考＞
[Multiple Apache HTTPD versions in Windows](http://splike.com/wiki/Multiple_Apache_HTTPD_versions_in_Windows)
Zshには組み込みでテトリスがインストールされている

![tetris](https://dl.dropboxusercontent.com/u/2184634/images/tetris.gif)

```zsh
% autoload -Uz tetris
```

を実行して `M-x tetris`（Macだと `esc+x` 後にtetrisと入力する。上のgifではこの方法を用いている）とするか、上記に加えて

```zsh
% zle -N tetris
% bindkey '...' tetris
```

を実行してから `...` と入力するとターミナルでテトリスを遊べます。

# 参考

- [.zshrcで見かけるautoloadの意味と使い方](http://qiita.com/yuku_t/items/77c23390e52168a2754a)

一言で言えば `autoload` は `$fpath` のディレクトリに置いてあるzshスクリプトを関数として実行できるようにするものです。デフォルトで `$fpath` に指定されているディレクトリには800を超える関数が登録されていて（大半は補完機能のためのものですが）、その中の1つに tetris があります

```zsh
% echo $fpath
/usr/share/zsh/5.0.2/share/zsh/functions
% head -n 7 /usr/share/zsh/5.0.2/share/zsh/functions/tetris
# Someone once accused zsh of not being as complete as Emacs, because it
# lacks Tetris and an adventure game.
#
# autoload -Uz tetris
# zle -N tetris
# bindkey '...' tetris
```

意訳

> zshにはEmacsみたいにテトリスとかアドベンチャーゲームがないからクソだって言っているやつがいたからカッとなって作った
backbone.marionetteのViewsについて

各ビューの違いについて以下の動画が図入りでわかりやすかった

Episode 03 - Marionette JS on Vimeo | http://vimeo.com/album/2489601/video/58797363


下記は動画から引用

> - ItemView
>   - Single Entity (model/collection)
> 
> - CollectionView
>   - Manages Collection
> 
> - CompositeView
>   - CollectionView + Template
> 
> - Layout
>   - Region Manager
HTTPSを無効にしてGoogle検索する

わけありの人用。

``` 
nslookup nosslsearch.google.com | sed -n "6,6p" | sed -e "s/Address: \(.*\)/http:\/\/\1/g" | xargs open
```

くわしくは以下

[学校での Google セーフサーチと SSL 検索 - ウェブ検索 ヘルプ](https://support.google.com/websearch/answer/186669?hl=ja "学校での Google セーフサーチと SSL 検索 - ウェブ検索 ヘルプ")
Go でバイナリ処理

Go でバイナリをゴリゴリ処理するときに覚えておくと良さそうなもの。

# 進数表示

```go
fmt.Printf("%b", 10) // 1010
fmt.Printf("%d", 10) // 10
fmt.Printf("%x", 10) // a
fmt.Printf("%X", 10) // A
```

# byte

byte 自体は uint8 のエイリアス
オクテットストリームは []byte が基本

```go
b := []byte{0x01, 0x02, 0x03}
```

単なるスライスなので、 Array を直で触るのでなければ、
これが一番低レベルな表現と言える。

# bytes

bytes は []byte を操作するための便利メソッドを提供する。

```go
bytes.Equal([]byte{1,2,3}, []byte{4,5}) // false
```

ちなみに、バイトを文字とみなせば string なので、
bytes の関数は strings とインタフェースが似ている。


# bytes.Buffer

bytes に含まれるが、 []byte をラップして Read(), Write() などを付けるもの。
つまり Buffer にすれば io.ReadWriter を満たすので、
io.ReadWriter を引数にするライブラリなどで使える。(ioutil / bufio etc)

```go
func main() {
	buf := bytes.NewBuffer([]byte{1, 2, 3})

	buf.Write([]byte{4, 5, 6})

	b := make([]byte, 3)
	buf.Read(b)                 // 1, 2, 3

	log.Println(b, buf.Bytes()) // 4, 5, 6
}
```

一旦読んでから、読んだ分を戻すことができる UnreadByte() と
中の []byte が取り出せる Bytes() を覚えとくと良い。

# bytes.Reader

Buffer と違い readonly
io.Reader と io.Seeker  etc があり、 Read(), Seek() ができる。


# encoding/binary

[]byte と固定長型の変数(unit64 とか) 間でエンコード/デコードできる。
エンディアンも指定できる。

ネットワークプロトコルのパーサとか書く場合は必須。
例えば、 4byte づつ key, val を表すプロトコルがあった場合。


```go
type Row struct {
	Key uint16
	Val uint16
}

func (r Row) String() string {
	return fmt.Sprintf("(%s: %v)", string(r.Key), r.Val)
}

func main() {
	buf := bytes.NewBuffer([]byte{0x0, 97, 0x3, 0x1})
	row := Row{}
	binary.Read(buf, binary.BigEndian, &row.Key)
	binary.Read(buf, binary.BigEndian, &row.Val)

	log.Println(row)
}

```
ポーカーの残り＋

https://github.com/cielavenir/procon/commit/33a32d00b5b92d701f70436f321b6a6bcba42591

コーナーケースとなりますが、

```c
/*53:corner*/ test("2d2h3s4d5c","4S");
/*54:corner*/ test("2d2h3s4dAc","4S");
```
も必要と思われます。4Fが決まってから4SFを判定するのはさほど難しくないものの、4Sの判定は結構面倒です。

```rb:hena10pre.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/d819d1e5f2378317511e
#http://nabetani.sakura.ne.jp/hena/ord10pokarest/
STDOUT.sync=true
T={'2'=>2,'3'=>3,'4'=>4,'5'=>5,'6'=>6,'7'=>7,'8'=>8,'9'=>9,'1'=>10,'J'=>11,'Q'=>12,'K'=>13,'A'=>14}
while gets
	a=$_.chomp.gsub('0','').scan(/../).map{|e|[T[e[0,1]],e[1,1]]}.sort
	number=a.map{|e|e[0]}.uniq
	if a.none?{|e|e[1]!=a[0][1]} #flash
		if a[0][0]==10&&a[1][0]==11&&a[2][0]==12&&a[3][0]==13&&a[4][0]==14
			puts 'RF'
		elsif
			a[0][0]==2&&a[1][0]==3&&a[2][0]==4&&a[3][0]==5&&a[4][0]==14 ||
			0.step(3).all?{|i|a[i+1][0]-a[i][0]==a[1][0]-a[0][0]}
			puts 'SF'
		else
			puts 'FL'
		end
	elsif
		a[0][0]==2&&a[1][0]==3&&a[2][0]==4&&a[3][0]==5&&a[4][0]==14 ||
		4.times.all?{|i|a[i+1][0]-a[i][0]==a[1][0]-a[0][0]}
		puts 'ST'
	elsif (f=a.one?{|e|e[1]!=a[0][1]}) || a.one?{|e|e[1]!=a[1][1]} #4flash
		idx=f ? a.index{|e|e[1]!=a[0][1]} : 0
		a.delete_at(idx)
		if
			a[0][0]==2&&a[1][0]==3&&a[2][0]==4&&a[3][0]==14 ||
			0.step(2).all?{|i|a[i+1][0]-a[i][0]==a[1][0]-a[0][0]}
			puts '4SF'
		else
			puts '4F'
		end
	else
		if number.size==5 && (
			number[0]==2&&number[1]==3&&number[2]==4&&number[4]==14 ||
			0.step(2).all?{|i|number[i+1]-number[i]==number[1]-number[0]} ||
			1.step(3).all?{|i|number[i+1]-number[i]==number[2]-number[1]}
		) then puts '4S'
		elsif number.size==4 && (
			number[0]==2&&number[1]==3&&number[2]==4&&number[3]==14 ||
			0.step(2).all?{|i|number[i+1]-number[i]==number[1]-number[0]}
		) then puts '4S'
		else
			puts '-'
		end
	end
end
```
Symfony2(monolog)のfluentdでのformatのregexp

```
<source>
  type tail_multiline
	format /^\[(?<time>[0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+:[0-9]+)\] (?<type>[^\.]*).(?<level>[^:]*): (?<message>.*)$/
	path xxxx
	pos_file xxxx
	tag xxxx
</source>
```

こんなかんじです。プラグインのtail_multilineを使います。

最後の [] []が意味不明なので命名が意味不明になってます。
第13章：ScalaのMapリファレンス

今回は「Map」について、リファレンス風に紹介するよ！

入門編としてこちらも読んでね(^^)v
[ 第8章：Scalaのコレクション(Seq, Set, Map)入門](http://qiita.com/f81@github/items/dc79819d23ce4889d552)

# scala.collection.immutable.Map
キーで値(要素)を特定することができる箱だ。
キーの重複はできないからね。

代表的なメソッドを使ってみたよ。

## ルックアップ
### get
キーに対応する値をOptionで返す

```scala
scala> Map(1 -> "a", 2 -> "b", 3 -> "c") get (1)
res0: Option[String] = Some(a)
```

### (key)
キーに対応する値を返す

```scala
scala> Map(1 -> "a", 2 -> "b", 3 -> "c") (1)
res1: String = a
```

### getOrElse
キーに対応する値を返す。なければデフォルト値を返す

```scala
scala> Map(1 -> "a", 2 -> "b", 3 -> "c") getOrElse (1, "d")
res2: String = a

scala> Map(1 -> "a", 2 -> "b", 3 -> "c") getOrElse (4, "d")
res3: String = d
```

### isDefinedAt
キーを含んでいるか判定する

```scala
scala> Map(1 -> "a", 2 -> "b", 3 -> "c") isDefinedAt (1)
res4: Boolean = true

scala> Map(1 -> "a", 2 -> "b", 3 -> "c") isDefinedAt (4)
res5: Boolean = false
```

## 追加と更新
### +
新しいキーバリューのペアを含む新しいMapを返す

```scala
scala> Map(1 -> "a", 2 -> "b", 3 -> "c") + (4 -> "d")
res6: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4 -> d)
```

### ++
全てのキーバリューのペアを含む新しいMapを返す

```scala
scala> Map(1 -> "a", 2 -> "b", 3 -> "c") ++ Map(4 -> "d", 5 -> "e")
res7: scala.collection.immutable.Map[Int,String] = Map(5 -> e, 1 -> a, 2 -> b, 3 -> c, 4 -> d)
```

### updated
+と同じ

```scala
scala> Map(1 -> "a", 2 -> "b", 3 -> "c") updated (1, "d")
res8: scala.collection.immutable.Map[Int,String] = Map(1 -> d, 2 -> b, 3 -> c)
```

## 削除
### -
キーを取り除いた新しいMapを返す

```scala
scala> Map(1 -> "a", 2 -> "b", 3 -> "c") - 1
res9: scala.collection.immutable.Map[Int,String] = Map(2 -> b, 3 -> c)
```

### --
キーを取り除いた新しいMapを返す

```scala
scala> Map(1 -> "a", 2 -> "b", 3 -> "c") -- Traversable(1, 2)
res10: scala.collection.immutable.Map[Int,String] = Map(3 -> c)
```

## サブコレクション作成
### keys
キーのIterableを返す

```scala
scala> Map(1 -> "a", 2 -> "b", 3 -> "c") keys
res11: Iterable[Int] = Set(1, 2, 3)
```

### values
値のIterableを返す

```scala
scala> Map(1 -> "a", 2 -> "b", 3 -> "c").values
res12: Iterable[String] = MapLike(a, b, c)
```

## 変形
### filterKeys
関数を満たすものだけのMapを返す

```scala
scala> Map(1 -> "a", 2 -> "b", 3 -> "c") filterKeys (_ % 2 == 1)
res13: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 3 -> c)
```

### mapValues
関数を適用したMapを返す

```scala
scala> Map(1 -> "a", 2 -> "b", 3 -> "c") mapValues (_ + "d")
res14: scala.collection.immutable.Map[Int,String] = Map(1 -> ad, 2 -> bd, 3 -> cd)
```

# まとめ
今回は、 コレクションのMapトレイトのメソッドについて語ってみた。

ところで、ここ3回で __Seq__ 、 __Set__ 、 __Map__ の代表的なメソッドについて紹介してみたけど
どうだった？

ここのところずっと言っているけど、使いこなすにはソースを書いて動かしてみるのが
一番速いと思うよ。

今回も
__体で感じてくれたかな？__
第12章：ScalaのSetリファレンス

今回は「Set」について、リファレンス風に紹介するよ！

入門編としてこちらも読んでね(^^)v
[ 第8章：Scalaのコレクション(Seq, Set, Map)入門](http://qiita.com/f81@github/items/dc79819d23ce4889d552)

# scala.collection.immutable.Set
集合を現す箱。
要素の重複を許さない箱だ。

よって、要素の重複をなくしたり、存在判定をするときに使えるね。

## テスト
### (x)
xが存在するか判定する

```scala
scala> Set(1, 2, 3)(2)
res0: Boolean = true

scala> Set(1, 2, 3)(4)
res1: Boolean = false
```

### contains
(x)と同じ

```scala
scala> Set(1, 2, 3) contains(2)
res2: Boolean = true

scala> Set(1, 2, 3) contains(4)
res3: Boolean = false
```

### subsetOf
部分集合か判定する

```scala
scala> Set(1, 2) subsetOf Set(1, 2, 3)
res4: Boolean = true

scala> Set(3, 4) subsetOf Set(1, 2, 3)
res5: Boolean = false
```

## 追加
### +
指定した要素を追加した新しいSetを返す

```scala
scala> Set(1, 2, 3) + 4
res6: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 4)

scala> Set(1, 2, 3) + 3
res7: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
```

ここでようやく重複排除をみることができたね。
既に要素3がSetに存在しているので、3を追加しても
複数の要素が存在することはないんだよ！

### ++
指定したSetを追加した新しいSetを返す

```scala
scala> Set(1, 2, 3) ++ Set(4, 5)
res8: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4)
```

## 削除
### -
指定した要素を削除した新しいSetを返す

```scala
scala> Set(1, 2, 3) - 3
res9: scala.collection.immutable.Set[Int] = Set(1, 2)
```

### --
指定したSetを削除した新しいSetを返す

```scala
scala> Set(1, 2, 3) -- Set(1, 2)
res10: scala.collection.immutable.Set[Int] = Set(3)
```

### empty
空集合を返す

```scala
scala> val set = Set(1, 2, 3)
set: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

scala> set empty
res11: scala.collection.immutable.Set[Int] = Set()

scala> set
res12: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
```

## 二項演算
### &
積集合を返す

```scala
scala> Set(1, 2, 3) & Set(1, 5)
res13: scala.collection.immutable.Set[Int] = Set(1)
```

### intersect
&と同じ

```scala
scala> Set(1, 2, 3) intersect Set(1, 5)
res14: scala.collection.immutable.Set[Int] = Set(1)
```

### |
和集合を返す

```scala
scala> Set(1, 2, 3) | Set(1, 5)
res15: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 5)
```

### union
|と同じ

```scala
scala> Set(1, 2, 3) union Set(1, 5)
res16: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 5)
```
### &~
差集合を返す

```scala
scala> Set(1, 2, 3) &~ Set(1, 5)
res17: scala.collection.immutable.Set[Int] = Set(2, 3)
```

### diff
&~と同じ

```scala
scala> Set(1, 2, 3) diff Set(1, 5)
res18: scala.collection.immutable.Set[Int] = Set(2, 3)
```

# まとめ
今回は、 コレクションのSetトレイトのメソッドについて語ってみたけどどうだった？

過去2回と同じで、やっぱりこの辺は体を動かさないとわからないね。
どのような場面で使うかを想像しながら、ソースを書いて動かしてみてね。

今回も
__体で感じてくれたかな？__
ポーカー

group_by使用。雑。

```rb:hena1pre.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/cbc3af152ee3f50a822f
#STDOUT.sync=true
T={'2'=>2,'3'=>3,'4'=>4,'5'=>5,'6'=>6,'7'=>7,'8'=>8,'9'=>9,'1'=>10,'J'=>11,'Q'=>12,'K'=>13,'A'=>14}
while gets
	a=$_.chomp.gsub('0','').scan(/../).map{|e|[T[e[1,1]],e[0,1]]}.sort
	size=a.group_by{|e|e[0]}.values.map(&:size).sort
	if size==[1,4]
		puts '4K'
	elsif size==[2,3]
		puts 'FH'
	elsif size==[1,1,3]
		puts '3K'
	elsif size==[1,2,2]
		puts '2P'
	elsif size==[1,1,1,2]
		puts '1P'
	else
		puts '--'
	end
end
```
Numpy +atlas のinstallでこける

```sh
sudo port install numpy +atlas
```

でこける。　

```
ERROR: Failed to install atlas
```

どうも、ビルドする際に使うgccのversionが、atlasのデフォルトのbuild optionと違うらしい。
しかたないので、atlasを入れなおす。

```
sudo port uninstall atlas
sudo port clean atlas
sudo port install atlas +gcc48
```

buildする際のgccのversionは、numpyをbuildする際のgccのデフォルトに合わせるために、gcc48に指定。

これで、numpyのinstallが通る。

gccのversionのどれがどうとか全くわからないので、参考サイトご存知アレば、コメントください。
ProGuardとLogCatとAdMobが織りなす罠

アンドロイド開発においてログを吐く事は保守性が良くなるが、実際にこのコードを放置するとアプリケーションのパフォーマンスも落ちるし情報もだだ漏れ。

そのため存続のコードではガシガシログを吐いてリリースビルドでLogCatを吐かないようにProGuardで

-assumenosideeffects class android.util.Log \{ \<methods\>; \}

とやるとログを吐かなくなる。

が、これが落とし穴だった。

これをするとAdMobが常にネットワークエラーだと言い出す。
これはSDKをデコンパイルしてみて見るとLog.isLoggableの戻り値を利用しているからだと解った。

すでに難読化されたクローズドソースなので分かりづらいクラス名だが、
com.google.ads.utilのパッケージ中のaとbというクラスで使われている。

-assumenosideeffects class android.util.Log {
	public static *** v(...);
	public static *** d(...);
	public static *** i(...);
	public static *** w(...);
	public static *** e(...);
}

とすればモーマンタイ。
Frankのtouchで"some views could not be touched"エラーが出たときの対処法

## はじめに
* Frankでテストを書いているとtouchするときに以下のエラーがでた
 * some views could not be touched (probably because they are not within the current viewport) (RuntimeError)

## 対策
* このエラーはtouchするターゲットが取得できていないときに発生する
 * SeleniumではElement not found的な感じ
 * 自動で取得するまで待ってはくれないので待機時間を挟む必要がある
* 以下のように対策した
 * touchをオーバーライドした
 * 不正なセレクタを渡したときのエラーはそのまま(エラーとして出す)
 * 早すぎてとれていないという場合にのみリトライをするようにした

```rb
module Frank
  module Cucumber
    module FrankHelper
      def touch( uiquery )
        views_touched = frankly_map( uiquery, 'touch' )
        raise "could not find anything matching [#{uiquery}] to touch" if views_touched.empty?
        self.touch(uiquery) if views_touched.first == false # この1行を追加
      end
    end
  end
end

```

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
CPUのコア数を調べたい


```
$ nproc
4
```

あくまで論理コア数。Hyperthreading効いてると物理コア数は半分かもしれない。参考になるのは、

```
$ cat /proc/cpuinfo | grep 'physical id'
physical id     : 0
physical id     : 0
physical id     : 0
physical id     : 0
```

……(　´_ゝ｀)

まぁ今これESXi上にいるからなぁ…
physical idが二種類ならHT効いているかもしれない。
DESTROY が何度も呼ばれていたら...

同じ Perl オブジェクトの DESTROY メソッドが何度も呼ばれていたら...

# 本当に同じオブジェクトか?

本当にそれが同じオブジェクトなのかどうかは確かめておきましょう。本来一つしか存在しないはずのオブジェクトでも、何らかの手違いで複数個生成されていたりするかもしれません。

# fork していないか?

オブジェクトを作った後に fork していると親と子の両方でそれぞれ DESTROY が呼ばれることになります。ファイルやプロセスなど外部とのやりとりがあると、 DESTROY だけでなく fork すること自体が悪影響を及ぼしているかもしれないので要注意です。親子プロセスのタイミングに依存して確率的にエラーが発生するなど、何が起こっているのか把握すること自体が難しいかもしれません。

fork してからオブジェクトを作るようにするのが理想的な解決策ですが、そうもいかないこともあるでしょう。親プロセスでだけそのオブジェクトにアクセスするなら、オブジェクトの初期化時の \$\$ を覚えておいて、 DESTROY 時の \$\$ と比較すると親プロセスかどうか判別できます。

あまり無いとは思いますが、複数スレッドを使っている場合も同じことが起こり得ます。その場合はプロセスIDだけでなく、スレッドIDのようなもののチェックも必要です。

# 新しく参照を作っていないか

DESTROY 内で新たに他の変数からそのオブジェクトへの参照を作ると、 DESTROY 後にオブジェクトが破棄されず、次にその参照が消えた時に再び DESTROY が呼ばれることになります。

例: https://gist.github.com/wakaba/6773867

この例では最終的にスクリプト全体の終了時に DESTROY が呼び出されて

```
DESTROY created new reference to dead object 'Package1' during global destruction.
```

... エラーが発生するので気づくことができます。実際には DESTROY の処理がもっと複雑で、こうわかりやすいエラーにはならないかもしれません。
rubyのgsubで \" という文字列の \ はパターンマッチされない

バックスラッシュがエスケープとして解釈されている様子
以下サンプル

```ruby:hoge.rb
hoge = 'hogehoge\"'
p hoge.gsub(/ \ \/,'') # -> "hogehoge\""
```

何で困るかというと、例えば手書きJSONの改行を削除してパースする際にバックスラッシュが残ってしまう
TypeScriptの入力補完・エラーチェックができるSublimeプラグイン


T3Sというプラグインを見つけたので使い方メモ。※まだ全機能を試してません。

# T3Sとは

[T3S](https://github.com/Railk/T3S)

_TypeScript_ の入力補完・エラーチェックなどができるようになる _Sublime Text 2_ および _Sublime Text 3_ のプラグインです。

[Readme](https://github.com/Railk/T3S)に詳しく書かれているので英語がわかればそちらの方がいいです。

* * *

※ _Node.js_ & _npm(Node Packege Manager)_ & _TypeScript_ はインストールされているものとします。

# TypeScript Toolsのインストール

npmから **グローバル** にインストール

```
$ (sudo) npm install -g typescript-tools
```

# T3Sのインストール

## Githubからクローン

```
$ cd **/Sublime\ Text\ 3/packages/
$ git clone git@github.com:Railk/T3S.git
```

## 手動でインストール

[Githubリポジトリ](https://github.com/Railk/T3S)からダウンロードして、 _Sublime Text 3_ の `Packages`ディレクトリにコピーする。ディレクトリ名は一応 `T3S-master`から`T3S`にリネームします。

* * *

**Sublime Text 3を再起動してインストール完了**

* * *

# 機能

![入力補完機能実行中のキャプチャ](https://qiita-image-store.s3.amazonaws.com/0/5548/f384b2fe-aa7a-d4fc-5607-10b166262af9.png "入力補完機能実行中のキャプチャ")

## 入力候補

基本的に設定を何もしなくても、タイプすればプロパティの入力補完がサジェストされます。

- パブリック / プライベート
- ◯メソッド / ●プロパティ
- 引数
- 引数の型 (オーバーロードは最後に定義している型が表示)
- 引数の省略可属性
- 戻り値の型

以上の情報が一目でわかります。グッド。

## エラーチェック

エラー箇所はハイライトされて、行番号の部分に **(!)** マークが表示される。

**(たぶんやり方がわかっていないだけだけど)** 複数にファイルを分けている場合、別ファイルに定義しているクラスなどが **未定義でエラー** となってしまいます。
`/// <reference path="hoge.d.ts" />`を定義しても起こってしまうので、別途設定が必要なのかもしれません。

## 他

機能がわかり次第追記予定
ReplicationStrategy

調査対象: Cassandra-2.0.1

## SimpleStrategy

レプリカを格納するノードを、データセンターおよびラックを意識せずに決める。
複数のデータセンターがある場合でもデータセンターをまたがってレプリカを持つとは限らない。
同一データセンターに複数のラックがある場合でも、ラックをまたがってレプリカを持つとは限らない。

```
/**
 * This class returns the nodes responsible for a given key but does not respect rack awareness. 
 * Basically returns the RF nodes that lie right next to each other on the ring.
 *
 * このクラスは、与えられた key の担当ノードを、rack の配置を意識せずに返します。
 * 基本的には、リング上に存在する次の RF (Replication Factor..?) ノードを返します。
 */
```

## OldNetworkTopologyStrategy

複数のデータセンターがある場合は、レプリカのひとつを他のデータセンターのノードに格納する。
複数のラックがある場合は、他のレプリカを異なるラックのノードに格納する。
単一データセンターおよび単一ラックの場合は、SimpleStrategy と同じ挙動をする。

```
/**
 * This Replication Strategy returns the nodes responsible for a given key but respects rack awareness. 
 * It places one replica in a different data center from the first (if there is any such data center),
 * the third replica in a different rack in the first datacenter, 
 * and any remaining replicas on the first unused nodes on the ring.
 *
 * このレプリケーション・ストラテジーは、与えられた key の担当ノードを、rack の配置を意識して返します。
 * もし複数のデータセンターがある場合は、レプリカのひとつを異なるデータセンターに格納しようと試みます。
 * 残りのレプリカは、同じデータセンターの異なるラックに格納しようと試みます。
 * それでも、設定されたレプリカ数を満たしていない場合は、SimpleStrategy と同様のロジック (データセンターおよびラックを意識しない) でレプリカを格納します。 
 */
```

## NetworkTopologyStrategy

各データセンター毎に設定されたレプリカ数を満たすように格納する。
データセンター内に複数のラックがある場合は、ラックをまたがって格納する。
データセンター内に複数のラックがない場合は、同じラックの異なるノードに格納する。

```
/**
 * This Replication Strategy takes a property file that gives the intended replication factor in each datacenter.  
 * The sum total of the datacenter replication factor values should be equal to the keyspace replication factor.
 * <p/>
 * So for example, if the keyspace replication factor is 6, the
 * datacenter replication factors could be 3, 2, and 1 - so 3 replicas in
 * one datacenter, 2 in another, and 1 in another - totalling 6.
 * <p/>
 * This class also caches the Endpoints and invalidates the cache if there is a change in the number of tokens.
 *
 * このレプリケーション・ストラテジーは、各データセンターごとに replication factor を設定します。
 * データセンターの replication factor 値の合計は、keyspace の replication factory と一致するべきです。
 * 
 * 例えば、この keyspace の replication factor が 6 の場合、データセンターのレプリケーションファクターは 3 と 2 と 1 になります。
 * 言い換えれば、3 つのレプリカが 1 つのデータセンターに格納され、2 つのレプリカが他のデータセンターに格納され、1 つのレプリカが他のデータセンターに格納されるので、合計のレプリカ数は 6 になります。
 * 
 * このクラスは endpoint をキャッシュし、さらに token 数に変更が生じた場合にはキャッシュを無効にします。
 */
```

## 関連

Snitch : http://qiita.com/na_ga/items/93e2dff5997281b22fd1
ffmpegを使って2passエンコードする時に一度のコマンド入力で終わらせたい。

ffmpeg を使えば H264 の mp4 に変換もどの環境でも簡単にできるし、
何故かHandbrakeで失敗するファイルも変換できたりする。
クリッピングや時間切り取りなどなんでもできるので便利なffmpegですが、2passでエンコードする時に

```
$ ffmpeg -i input.avi -pass 1 -an output.mp4
$ ffmpeg -i input.avi -pass 2 -ab 128k -y output.mp4
```

と2回コマンドが打つのがめんどくさかったので解決策を探してみた。

## 解決策

```
$ ffmpeg -i input.avi -pass 1 -an output.mp4 && \
    ffmpeg -i input.avi -pass 2 -ab 128k -y output.mp4
```

しておけば一個目のコマンドが成功した時だけ2個めのコマンドが実行される。

そういえばLPICの勉強でやったわこれ。

## 参考

2pass encoding by ffmpeg at once - Unix & Linux Stack Exchange
http://unix.stackexchange.com/questions/93100/2pass-encoding-by-ffmpeg-at-once/93104?noredirect=1#93104
Vimのヴィジュアルモードで、直感的な操作を行う

# 問題

ヴィジュアルモードで複数行にわたって文字列を挿入したい場合、なんかよくわかんない感じになる。以下みたいな。つまり、`<ESC>`押したあとに全部展開されるやつ。もっとわかりやすくしたい。

![](http://gifzo.net/baoC1oU6Jm.gif)

# 解決

[vim-multiple-cursors](https://github.com/terryma/vim-multiple-cursors)を使う。上記の例は、以下のようにわかりやすく操作できる。

![](http://gifzo.net/BFhbfuZeuIM.gif)

# 議論

他にもいろんな使い方ができるので、このエントリであげているのは一例です。
GitをMac上でコンパイルする方法

GitHubからクローン。

```zsh

git clone https://github.com/git/git.git

```

いきなり`./configure`とかしても`configure`を作成出来ない。
gitディレクトリ内の`INSTALL`に書いてあるのだけど、まずautoconfをインストールします。

```zsh
brew install autoconf
```

`configure`を作成、`make`でコンパイル。

```zsh
make configure
make
```

コンパイルされているかの確認。

```zsh
./git --version
git version 1.8.4.474.g128a96c
```
fabric でエラー時のロールバック処理をする


ところで先日、ぼくの投稿を友人に見てもらう機会があったのですが、
「キモイ、写真がキモイ。ほんとキモイよ？今まで誰も指摘してくれなかったの？」
との絶賛コメントをいただきました。

fabric はシンプルでいて、とても強力なツールです。

しかし、それは使い方によっては危険なツールでもあるということです。
特にぼくのような、キモイ人間のクズが使うときには細心の注意を払う必要があります。

今日もぼくが本番環境に妙なものをデプロイしないか、
奇妙な人たち(上司ほか)が手錠をジャラジャラいわせながら監視しています。

気をつけないと。

ただ、どんなに気をつけていてもエラーというやつは起こるわけで、
だから色々ぶっ壊さないようにエラーハンドリングはちゃんとしてあげないといけません。
設定ファイルを編集した後にどこかでエラーが出たら、
ファイルだけ変えてるせいで2度とデーモンが起動しなくなった、とか、
そういうことが無いようにロールバック処理をしないといけません。

そして、何もなかったかのようにもとに戻して立ち去るのです。
まるでぼくのような人間など、はじめから存在していなかったかのように。

どうでもいい前置きが最悪に長くなりましたが、fabric でのロールバックのやり方です。

# 基本のやりかた

fabric でエラー時のロールバック処理の基本は、`env.warn_only=True` でくるむことで
いきなり abort しないようにしといて、エラーが出たら丁寧にロールバック処理をしてあげる、
というやつでしょう。

```python
with settings(warn_only=True):

    backup_important_file()

    run('sed -e "s/foo/bar/g" important_file > tmp_file')
    run('mv tmp_file important_file')

    result = do_something_bad()

    if result.return_code != 0:
        # Rollbacking…
        restore_important_file()
```
しかし、fabric で実行するタスクは複数ある場合が多いです。

もし、それぞれのタスクのエラー時に必要となるロールバック処理が共通であるとして、
それを素直に実装すると、例えばこんな感じです。

```python
env.warn_only=True

def task1():
    result = run('run command1')
    if result.return_code != 0:
        rollback()

def task2():
    result = run('run command2')
    if result.return_code != 0:
        rollback()

def task3():
    result = run('run command3')
    if result.return_code != 0:
        rollback()

def rollback():
    # Rollbacking...
    restore_everything()

@task
def do_it():
    task1()
    task2()
    task3()
```

これで十分な場合も多いでしょうが、もう少し冴えた方法も可能です。

# ラッパーを用意しておくやりかた

ラッパー関数を用意しておき、コンテキストマネージャを活用することで、
複数のタスクのロールバック処理をまとめることが可能です。

ロールバック処理が複数タスクで共通である場合は、
こちらの方がすっきりします。

```python
env.warn_only=False

def task1():
    run('run command1')

def task2():
    run('run command2')

def task3():
    run('run command3')

def rollback():
    # Rollbacking...
    restore_everything()

@contextmanager
def rollbackwrap():
    try:
        yield
    except SystemExit:
        rollback()
        abort("Error has occurred while running task!")

@task
def do_it():
    with rollbackwrap():
        task1()
        task2()
        task3()
        task4()
```

エラー処理を個別で行いたい場所では、

```python
with settings(warn_only=True):
```
を使うと良いでしょう。

## 参考

以下の記事を大変参考にさせてもらいました。
http://awaseroot.wordpress.com/2012/06/05/fabric-wrappers-and-more-error-handling/
GitHubのYour Contributionsが反映されない

最近自分のリポジトリに commit しても Your Contributions （自分のページの下の緑色の）が反映されていないのに気づいた。

どうも、`git config user.email` で設定されているメールアドレスと、
github の Account settings の Emails から設定されているメールアドレスが一致する必要があるらしい。

同じにしたら反映された。
そういえばメールアドレス変更したかも。。。

参考: https://help.github.com/articles/why-are-my-contributions-not-showing-up-on-my-profile
「第1回オフラインリアルタイムどう書くの参考問題」をPHPで解く

http://qiita.com/Nabetani/items/cbc3af152ee3f50a822f

ポーカーの役を求めます。
集計する対象はワンペア、ツーペア、スリーカード、フォーカード、フルハウス。
つまりスートは一切無視してよいということです。

```php
<?php

	class POKER{
		// 役
		private $roles = [
			'4K'=>[4, 1],
			'FH'=>[3, 2],
			'3K'=>[3, 1, 1],
			'2P'=>[2, 2, 1],
			'1P'=>[2, 1, 1, 1],
		];
		
		/**
		* ポーカー
		* @param  String 「D3C3C10D10S3」みたいな文字列
		* @return String 「FH」みたいな文字列
		*/
		public function get($input){
			// 値をカウント
			$cards = array_count_values(explode('-', trim( str_replace(['S', 'H', 'D', 'C'], '-', $input), '-')));
			rsort($cards);
			// 同じ役があるか確認
			foreach($this->roles as $key=>$val){
				if($cards === $val){
					return $key;
				}
			}
			// なかった
			return '--';
		}
	}
	
	// テスト
	$test = [
		['D3C3C10D10S3', 'FH'],
		['S8D10HJS10CJ', '2P'],
		['DASAD10CAHA', '4K'],
		['S10HJDJCJSJ', '4K'],
		['S10HAD10DAC10', 'FH'],
		['HJDJC3SJS3', 'FH'],
		['S3S4H3D3DA', '3K'],
		['S2HADKCKSK', '3K'],
		['SASJDACJS10', '2P'],
		['S2S10H10HKD2', '2P'],
		['CKH10D10H3HJ', '1P'],
		['C3D3S10SKS2', '1P'],
		['S3SJDAC10SQ', '--'],
		['C3C9SAS10D2', '--'],
	];

	$poker = new POKER();
	foreach($test as $key=>$data){
		$answer = $poker->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
```

数字ごとの枚数に一切ぶれがないため、===で簡単にマッチング可能です。
これまでで一番簡単だった気がします。
かかった時間は20分程度。
Xcode5 で Constraints が使えなくなってしまった時の対処法

AutoLayout を有効にすると、 Constraints を設定できるようになりますが、

> The selected views have no constraints. At build time explicit left, top, width, and height constraints will be generated for the view.

と表示されて設定できないことがあります。
こんなときは、まず該当の View Controller (scene) を選択してから、メニューの

Editor > Resolve Auto Layout Issues > Add missing constraints 

を選択すると Constraints が復活します。
マクロで手軽に遅延評価 -- どうあがいても必要だったんだ!

今書いているコード、プランニング問題の探索関連なんですが、
気を付けないとすぐに爆発するので困りものです。
今日実装していて引っかかったのは次のような問題。

    全体の深さNで、深さ n から一つ下るごとに枝の数がO(n)倍になる木。
    つまりノードの数は O(N!) 。

昨日までのコードは小さいNで動作確認をしていたため、特に問題はなかったのですが、
いざ論文用の本番問題に手を出してみると爆発しました。

今まで使っていた手法は

+ 全可能性を列挙する (関数1)
+ 枝刈りする (関数2)

という流れ(どう見てもダメだろ・・・)で、しかもコード全体が結構完成していたので困りました。
明らかな問題点としてまず第一に、可能性を列挙する所でメモリがパンクします。
そのうえ、列挙するまでの時間もむちゃくちゃかかります。

普通の探索の場合、本来枝刈りはノードを展開するたびに行うものですが、
自分のコードはどちらかというと本番プランニングの前処理段階だったので、
それぐらいで爆発しないだろうとたかをくくってたわけです。
しかも、A*に代表される「ノードを展開するたびに・・・」という探索プログラムはステートフルで、関数型ではない。

さてどうしたもんでしょうか。

## 正格評価言語でも マクロがあれば 遅延評価は3分で実装できる

```cl
(defmacro lcons (a b)
  "cons whose cdr is lazy"
  `(cons ,a (lambda () ,b)))

(defmacro llist (a &rest args)
  "list using lcons"
  `(lcons ,a ,(when args `(llist ,@args))))

(defmacro ltree (tree)
  (if (consp tree)
      `(llist ,@(mapcar (lambda (e) `(ltree ,e)) tree))
      tree))
```

マクロの手にかかれば遅延評価なんてお手の物。
あ、cdrしか遅延させないのは自分のニーズがそこだけだからです。
遅延評価にthunkなんて概念ひつようなかったんや。 (もちろんそんなことはありません)

```cl
(lcons 0 1) ; --> (cons 0 (lambda () (cons 1 nil)))
(llist 0 1 2) ; --> (cons 0 (lambda () (cons 1 (lambda ...
(ltree (0
        (1 2 3)
        4
        (2
         (3 4 6)
         (7 8 9))
        5))
; --> macroexpand all
(CONS 0
      (LAMBDA ()
        (CONS
         (CONS 1 (LAMBDA () (CONS 2 (LAMBDA () (CONS 3 (LAMBDA () NIL))))))
         (LAMBDA ()
           (CONS 4
                 (LAMBDA ()
                   (CONS
                    (CONS 2
                          (LAMBDA ()
                            (CONS
                             (CONS 3
                                   (LAMBDA ()
                                     (CONS 4
                                           (LAMBDA ()
                                             (CONS 6 (LAMBDA () NIL))))))
                             (LAMBDA ()
                               (CONS
                                (CONS 7
                                      (LAMBDA ()
                                        (CONS 8
                                              (LAMBDA ()
                                                (CONS 9 (LAMBDA () NIL))))))
                                (LAMBDA () NIL))))))
                    (LAMBDA () (CONS 5 (LAMBDA () NIL))))))))))
```

お手軽お手軽。
なお自分のコードの方ではこれ使って捨てたりなにしたりしながら進んでいきます。
書き捨てごめん~
Qiita Markdown 早見メモ

基本は[チートシート](http://qiita.com/Qiita/items/c686397e4a0f4f11683d)ですが、「アレの書き方なんだっけ？」の確認用として、もうちょっと簡素なメモがほしかったので、投稿練習がてら作ってみました。

### コードブロック

~~~md:md
```c:sample.c
// Code Block
```
~~~

```c:sample.c
// Code Block
```
### コードブロック（diff）

~~~md:md
```diff_c:sample.c
- // Code Block
+ // Code Blooock!
```
~~~

```diff_c:sample.c
- // Code Block
+ // Code Blooock!
```


### コードスパン

~~~md:md
this is `Code Span`.
~~~

this is `Code Span`.

### pre
~~~md:md
   4 spaces make pre
~~~

    4 spaces make pre

### 補足

~~~md:md
:::note info
information
:::

:::note warn
warning
:::

:::note alert
alert
:::
~~~

:::note info
information
:::

:::note warn
warning
:::

:::note alert
alert
:::

### ヘッダー

~~~md:md
# h1
## h2
### h3
~~~

# h1
## h2
### h3

### リンク

~~~md:md
[Qiitaトップ](http://qiita.com/)
~~~

[Qiitaトップ](http://qiita.com/)

### 文字装飾

~~~md:md
*ABC* or _ABC_
**太字** or __太字__
~~打ち消し~~
~~~

*ABC* or _ABC_
**太字** or __太字__
~~打ち消し~~

### 引用

~~~md:md
> 1行目
> 2行目
~~~

> 1行目
> 2行目

### 順序なしリスト

~~~md:md
* item1
* item2
~~~

* item1
* item2

### 順序ありリスト

~~~md:md
1. item1
1. item2
~~~

1. item1
1. item2

### エスケープ

`\\（バックスラッシュ）`でMarkdownをエスケープできます


---
_2013/10/09 追記_
コードサンプル部分をpre化しました。
・・・うん、こっちの方がやりやすいですね。
ご助言いただいた、noromanbaさんに感謝

_2024/04/26 追記_
なんか10年ぶりに見に来たら細かいところが変わっていたので更新しました。
ところで、pre構文が公式チートシートから無くなってる・・・？
lodash.jsがコマンドラインからビルドできなくなった

[lodash](https://github.com/lodash/lodash)をnpmでインストールしても
コマンドラインからカスタムビルドができなくなった。

```shell-session
$ npm install -g lodash
$ lodash
zsh: command not found: lodash
```

パスが通ってないかと思ったけど、そもそもlodashの中に/binが無い。
よく見たら、いつの間にかGrunt.jsみたいに
コマンドラインのインターフェースは別パッケージになってました。
[lodash-cli](https://github.com/lodash/lodash-cli)

```shell-session
$ npm install -g lodash-cli
$ lodash
Compressing lodash.min using the Closure Compiler (simple)...
Done. Size: 11258 bytes.
Compressing lodash.min using the Closure Compiler (advanced)...
Done. Size: 11260 bytes.
Compressing lodash.min using UglifyJS...
Done. Size: 11307 bytes.
Compressing lodash.min using hybrid (simple)...
Done. Size: 11087 bytes.
Compressing lodash.min using hybrid (advanced)...
Done. Size: 11085 bytes.
```

[この変更は2.0からのようです。](http://kitcambridge.be/blog/custom-builds-in-lo-dash-2-dot-0/)
ちゃんとチェックしてないとダメですね。
コマンド実行したいけどパスが通ってなくてどこにあるか分からない時に実行ファイルのパスを探すコマンド

`locate`使えばいいよね、って思った。
`COMMAND` ってコマンドのパスを探す場合

```
$ locate "*/COMMAND"
```

そのコマンドがインストールしたばっかりなら

```
# Linuxの場合
$ sudo updatedb

#Macの場合
$ sudo /usr/libexec/locate.updatedb
```

してから（割と時間かかる）
JAVAとJSPのような区切りはPHPにはないの？

Wordpressでphpファイルを触っててちょっと気になったことを検索してもHTML表記を含まない純粋な言語としてのPHPの情報しか出てこないことがちょこちょこあった。

HTMLに組み込みとしてのみ存在するPHPの呼び方、JAVAに対してJSPがあるようなそんな関係のものはないのかと調べたら *`.*phtml`を使うと明示的にすることができるらしい。この拡張子をWordpressで使えるかどうかは知らない。

## 追記

Wordpressでもサーバーの設定さえしとけば `.phtml` も使えるけど非推奨らしい。拡張子で明示的にテンプレートファイルだと伝えたいなら `foo.tpl.php` を使う方法が良さげ。
ちょっとしたことがGroovy「エラーの出るSSL証明書を無視してHTTPSアクセスをテストする」

俺俺証明書だったり、適当に流用してきたSSL証明書で作ったテスト用サイトなんかへのHTTPSアクセスをテストしようとすると、SSL証明書のエラーが起きてテスト不可能です。

以下のようにすると無視できます。

```groovy:ignoreSSLErr.groovy
@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.6')

import groovyx.net.http.*
import static groovyx.net.http.ContentType.*
import static groovyx.net.http.Method.*

import javax.net.ssl.X509TrustManager
import javax.net.ssl.SSLContext
import java.security.cert.X509Certificate
import javax.net.ssl.TrustManager
import java.security.SecureRandom
import org.apache.http.conn.ssl.SSLSocketFactory
import org.apache.http.conn.scheme.Scheme
import org.apache.http.conn.scheme.SchemeRegistry

def printlnErr = System.err.&println
def http = new HTTPBuilder( 'https://mySSLsite.hoge' )

/* 俺俺証明書だとかのSSL証明書のエラーを無視する */
def sslContext = SSLContext.getInstance("SSL")
sslContext.init(null, [
new X509TrustManager(){
  public X509Certificate[] getAcceptedIssuers() {null}
  public void checkClientTrusted(X509Certificate[] certs, String authType) { }
  public void checkServerTrusted(X509Certificate[] certs, String authType) { }
}] as TrustManager[], new SecureRandom())
def sf = new SSLSocketFactory(sslContext, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER)
def httpsScheme = new Scheme("https", sf, 443)
http.client.connectionManager.schemeRegistry.register( httpsScheme )

/* リクエスト */
http.request( GET, JSON ) {
  uri.path = "/admin"
  response.success = {
    println "done 200. ${uri.path}"
  }
  response.failure = {res ->
    printlnErr "error ${res.statusLine.statusCode}. ${uri.path}"
  }
}
```

以下の記事をそのまま流用しています。

http://stackoverflow.com/questions/11638005/is-there-an-easier-way-to-tell-httpbuilder-to-ignore-an-invalid-cert
awscliにヒアドキュメントを渡す

awscliのバージョン1.0で
軽い文章とシェルコマンドの実行結果を
メールの本文で送りたいときに
軽くはまったのでメモ。

awscliにshell形式のヒアドキュメントを
渡しても引数が正しく解釈されずにエラーになる。

```
$ aws ses send-mail --from hoge@mail.com --to fuga@mail.com --subject 'タイトル' --text <<CODE
こんなにいっぱい
`df -h # shell script here`
CODE

usage: aws [options] <command> <subcommand> [parameters]
aws: error: argument --text: expected one argument
```

awscliはPythonでできているためPythonの形式で
ヒアドキュメントを渡してあげると無事出力される。

```
aws ses send-mail --subject "タイトル" --text """\
こんなにいっぱい
`df -h # shell script here`
"""
```

ただしコマンドの実行結果を本文に紛れ込ませたいときは
シェルと同様にバッククォートで埋め込まないと
認識してくれない。謎。
Scaladoc で OutOfMemory が出た時の対処

Scalaのライブラリを使いたいけど、ドキュメント見つからない！  
ってときは、自分で scaladocコマンド で生成します。

ただ、大きなライブラリからドキュメント生成しようとするとOutOfMemoryで失敗することがあります。

```
$ scaladoc -d doc/ -s src/main/scala/**/*.scala
```

実行！

```
uncaught exception during compilation: java.lang.OutOfMemoryError
three errors found
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at scala.reflect.internal.util.HashSet.growTable(HashSet.scala:97)
	at scala.reflect.internal.util.HashSet.findEntryOrUpdate(HashSet.scala:39)
	at scala.reflect.internal.Types$class.unique(Types.scala:3940)
 
...
```

ギャー！

そんなときは、JAVA_OPTS に JVM で利用するメモリ量を指定することで対処できます。

```
$ export JAVA_OPTS="-Xms256m -Xmx1024m"
$ scaladoc -d doc/ -s src/main/scala/**/*.scala
```
Xms は初期 / Xmx は最大ヒープサイズです


## おまけ

scaladoc のコードを追っていくと

```bash
[[ -n "$JAVA_OPTS" ]] || JAVA_OPTS="-Xmx256M -Xms32M"

...

execCommand \
  "${JAVACMD:=java}" \
  $JAVA_OPTS \
  "${java_args[@]}" \
  $(classpathArgs) \
  -Dscala.home="$SCALA_HOME" \
  -Dscala.usejavacp=true \
  $EMACS_OPT \
  $WINDOWS_OPT \
   scala.tools.nsc.ScalaDoc  "$@"
```

という箇所があります。  
JAVA_OPTSが指定されていなければ、デフォルトで最大ヒープサイズ 256MB 使うとなってます。
文字化けで試す文字のメモ

例
￣～∥…￢・￠￡①
∪∩∠⊥≒√∫≡∵ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ
ー長音―ダッシュ－マイナス‐ハイフン＃ゑα┗凸湾癶熙涬釥
scpを使ったシェルを作る


scpはオプションでパスワードを入力することができないのでexpectを使ってパスワードを入力させる。

##expectをインストールする

```
sudo yum install expect
```

##scpを実行するシェルを作成する

```unixscp.sh
HOST=ホスト名
USER=ユーザー名
PASS=パスワード
TARGET_FILE=転送するファイル
TARGET_DIR=転送先のディレクトリ

expect -c "
spawn scp ${TARGET_FILE} ${USER}@${HOST}:${TARGET_DIR}
expect {
\"Are you sure you want to continue connecting (yes/no)? \" {
send \"yes\r\"
expect \"password:\"
send \"${PASS}\r\"
} \"password:\" {
send \"${PASS}\r\"
}
}
interact
"
```

以上。
このやり方はあまり推奨されていない。
基本的にはsshの鍵を使うべきであろう。
VMWareでMacアドレスを変更する方法

# VMWareでMacアドレスを変更する方法

## 必要性

仮想計算機イメージを配布すると、全下層計算機のMacアドレスが同一になってしまう。通常は問題にならないが、同一セグメント内で同時に起動した際に問題となる。起動時に「I Copied It」を選択すれば良いのだが、稀に「I Moved It」を選んでしまう人がいる。

## やりかた

VMWare Playerを起動して、目的のイメージを開く。まだ実行しないこと。ここではLinux版のVMWarePlayer5.0.1の場合について記す。

1. Edit virtual machine settingsをクリック
2. Device欄から「Network Adapter」をクリックし、右下の方にある「Advanced...」をクリック
3. 設定項目の下の方に「MAC Address」欄があるので、その右にある「Generate」をクリック
4. 「Close」をクリック
5. 「Save」をクリック

以上の作業でMacアドレスが変更される。
pythonのfluentdではまりどこ??


```
from fluent import sender
from fluent import event

sender.setup("tag")
event.Event("label", data)
```

みたいにやってる記事が多かった。
違和感があったので実際に実装見てみるとグローバル変数使ってる！
(setupメソッドで_global_senderというグローバル変数を利用 -> Eventの__init__で_global_sender_.emit_with_nameをよびtimestampに現在の時間を渡している)

というわけで

```
from fluent import sender
import time

send = sender.FluentSender("tag", host="localhost", port=24224)
send.emit_with_time("label", int(time.time()), data)
```

だと安心