OmniAICreator/Qiita-1.07M huggingface dataset:
Rで多項式曲線フィッティング

PRML演習1.1に従って係数を求め、図1.3 多項式曲線フィッティングと同様の図を描きます。

![1.PolynomialFitting.png](https://qiita-image-store.s3.amazonaws.com/0/12670/5668c704-f030-d35c-b403-9a5598dccd3d.png)


```r
set.seed(0)
x<-seq(0.05,1,0.1)
t<-sin(2*pi*x)+rnorm(10,0,0.5)
makeA<-function(m){
    A<-matrix(nrow=m+1,ncol=m+1)
	for (i in 0:m) {
		for (j in 0:m) {
			A[1+i,1+j]<-sum(x^(i+j))
		}
	}
	A
}
makeB<-function(m){
	b<-0:m
	for (i in 0:m) {
		b[i+1]<-sum(x^i*t)
	}
	b
}
xrange<-c(-0.5,1.5)
yrange<-c(-2,2)
plot(x,t,xlim=xrange,ylim=yrange)
mrange=1:9
for (M in mrange) {
	A<-makeA(M)
	b<-makeB(M)
	w<-solve(A,b)
	estimate<-function(x){
		i <- 0:(length(w)-1)
		(sapply(x,function(xn){ (sum(w*xn^i)) })) # (w[1]+w[2]*x+w[3]*x^2+w[4]*x^3...)
	}
	par(new=T)
	curve(estimate,type="l",xlim=xrange,ylim=yrange,col=M)
}
legend("topleft",legend=mrange,col=mrange,lty=1,cex=0.5)
```

多項式$y(x,\mathbf{w}) = w_0 + w_1 x + w_2 x^2 + \ldots + w_M x^M = \sum_{j=0}^{M} w_j x^j$に観測値をフィッティングする。目標値（観測値）$t_n$、予測値$y(x_n,\mathbf{w})$として、最適な$\mathbf{w}$は、次の二乗和誤差を最小化するもの。

```math
{\displaystyle E(\mathbf{w}) = \frac{1}{2} \sum_{n=1}^N \Bigl(y(x_n,\mathbf{w}) - t_n\Bigr)^2}
```

二乗和誤差の$\mathbf{w}$についての微分が$\mathbf{0}$となる$\mathbf{w}$を求める。

```math
\begin{aligned}

\frac{\partial}{\partial w_i}E(\mathbf{w}) &= \frac{1}{2} \cdot 2 \sum_{n=1}^N \Bigl\{y(x_n,\mathbf{w}) - t_n\Bigr\}\frac{\partial}{\partial w_i}y(x_n,\mathbf{w})\\

&= \sum_{n=1}^N \biggl( \Bigl(\sum_{j=0}^M w_j x_n^j -t_n\Bigr)\frac{\partial}{\partial w_i}\sum_{j=0}^M w_j x_n^j\biggr)
\\

&= \sum_{n=1}^N \biggl( \Bigl(\sum_{j=0}^M w_j x_n^j -t_n\Bigr) x_n^i \biggr)\\

&= \sum_{n=1}^N \Bigl(x_n^i \sum_{j=0}^M w_j x_n^j - x_n^i t_n\Bigr) = 0\\

\sum_{n=1}^N \Bigl(x_n^i \sum_{j=0}^M w_j x_n^j \Bigr) &= \sum_{n=1}^N x_n^i t_n\\

\sum_{j=0}^M w_j \sum_{n=1}^N x_n^{i+j} &= \sum_{n=1}^N x_n^i t_n

\end{aligned}
```

$\mathbf{w}$についての連立方程式$\mathbf{A w} = \mathbf{b}$を解く。

```math
\begin{aligned}
\mathbf{A}&=\sum_{n=1}^N \begin{bmatrix} x_n^0 && x_n^1 && \cdots && x_n^M \\ \vdots && \vdots && \ddots && \vdots \\ x_n^M && x_n^{M+1} && \cdots && x_n^{M+M}\end{bmatrix}\\

\mathbf{w}&=\begin{bmatrix}w_0 \\ \vdots \\ w_M\end{bmatrix}\\

\mathbf{b}&=\sum_{n=1}^N \begin{bmatrix} x_n^0 t_n \\ \vdots \\ x_n^M t_n\end{bmatrix}
\end{aligned}
```

[Dropbox](http://goo.gl/Pdvp0) にも資料を置いています。
#Effective C# 4.0のもくじ

## Chapter 1　イディオム
* アクセス可能なデータメンバの代わりに常にプロパティを使用すること
* constよりもreadonlyを使用する
* キャスト時にはisあるいはas演算子を使用すること
* #ifの代わりにConditional属性を使用する
* ToString()を常に実装すること
* さまざまな同値性メソッドの関係を把握する
* GetHashCode()の罠に注意する
* ループの代わりにクエリ構文を使用すること
* 独自のAPIでは変換演算子を定義しないこと
* メソッドのオーバーロードを最小限にするよう、オプション引数を使用する
* 機能を最小限かつシンプルにすること

## Chapter 2　リソース管理
* 割り当て演算子よりもメンバ初期化子を使用すること
* staticメンバは適切に初期化する
* 初期化ロジックの重複を最小化する
* usingおよびtry...finallyを使用してリソースの後処理を行う
* 不必要なオブジェクトの生成を避けること
* Disposeパターンの標準的な実装
* 値型と参照型の違い
* 値型における0を正常な状態とすること
* 値型は不変かつアトミックにすること

## Chapter 3　デザインの表現
* 型の可視性を制限すること
* 継承よりもインターフェイスの定義および実装を行うこと
* インターフェイスメソッドとかそうメソッドの違いを理解する
* デリゲートを使用してコールバックを実現する
* イベントパターンの実装により通知を行うこと
* クラス内オブジェクトの参照を返さないようにすること
* 型はできるだけシリアル化可能にすること
* 粒度の粗いインターネットサービスAPIを作成する
* ジェネリックの共変性と半変性をサポートする

## Chapter 4　フレームワークの活用
* イベントハンドラよりもオーバーライドを優先すること
* IComparable<T>とIComparer<T>を実装して順序関係をサポートする
* ICloneableを使用しないこと
* 親クラスの変更に応じる場合のみnew修飾子を使用すること
* 基本クラスに定義されたメソッドをオーバーロードしないこと
* PLINQが並列アルゴリズムを実装する方法
* I/Oのコストが高い処理に対してPLINQを使用する方法
* 例外を考慮した並列アルゴリズムを構成すること

## Chapter 5　動的プログラミング
* dynamicの利点と欠点を把握する
* ジェネリック型引数の実行時型を活用するためにdynamicを使用する
* 匿名型を引数にとれるようdynamicを使用する
* DynamicObjectあるいはIDynamicMetaObjectProviderを使用してデータ駆動のdynamic型を作成する
* Expression　APIを活用する方法を把握する
* 式を利用して事前バインディングを遅延バインディングに切り替える
* 公開するAPIでは動的オブジェクトを最小限に抑えること

## Chapter 6　その他
* ボックス化、ボックス化解除を最小限に抑える
* 完全にアプリケーション固有の例外クラスを作成する
* 例外を強く保証すること
* 安全なコードを採用すること
* CLS互換性のあるアセンブリを作成すること
* より小さく凝集したアセンブリを作成すること
More Effective C#のもくじ

## Chapter 1　ジェネリック
* 1.xフレームワークAPIのクラスではなく、ジェネリッククラスを使え
* 制約は必要最小限にして十分なものを定義せよ
* 実行型チェックを使ってジェネリックアルゴリズムを特化せよ
* ジェネリックを使ってコンパイル時型インターフェイスを強制せよ
* ジェネリッククラスは、IDisposableを実装する型パラメータのサポートを忘れるな
* 型パラメータのメソッド制約の定義にはデリゲートを使え
* 規定クラスやインターフェイスのためにジェネリックな特別バージョンを書くな
* 型パラメータがインスタンスフィールドでない限り、ジェネリックメソッドを選べ
* out、ref引数よりもジェネリックタプルを使え
* ジェネリックなインターフェイスとともに古いインターフェイスも実装せよ

## Chapter 2　C#におけるマルチスレッド
* スレッドを作らずにスレッドプールを使え
* スレッド間通信のためにBackgroundWorkerを利用せよ
* 同期のためにはまずlock()を使え
* ロックハンドルのためにはできる限り小さなスコープを使え
* ロックされたセクションからは未知のコードを呼び出すな
* WindowsフォームとWPFのスレッド間呼び出しを理解せよ

## Chapter 3　C#の設計実践
* シーケンスのためには合成できるAPIを作れ
* アクション、述語、関数から反復処理を切り離せ
* シーケンスの要素は要求されたときに生成せよ
* 関数引数を使って結合を緩めよ
* メソッドグループは明快で完全なものを最小限の規模で作れ
* 演算子の多重定義よりもメソッドの定義を優先せよ
* イベントはオブジェクトを実行時に密結合することを理解せよ
* イベントはvirtual宣言するな
* 例外はメソッドの約束ごとが守れなかったときに使え
* プロパティはデータふらしくふるまうように作れ
* 継承と合成を区別せよ

## Chapter 4　C# 3.0の新機能
* 拡張メソッドでインターフェイスの最小限の約束を補え
* 拡張メソッドでクローズジェネリック型を拡張せよ
* ローカル変数はできる限り暗黙の型付けに委ねよ
* 無名型を使って型のスコープを制限せよ
* 外部コンポーネントに対する合成可能APIを作れ
* 束縛変数の変更を避けよ
* 無名型を使ってローカル関数を定義せよ
* 拡張メソッドを多重定義してはならない

## Chapter 5　LINQの操作
* クエリ式からメソッド呼び出しの変換がどのように行われるかを理解せよ
* 遅延評価クエリーを使うようにせよ
* メソッドよりもラムダ式を使うようにせよ
* 関数やアクションで例外を投げるな
* 遅延実行と先行実行を区別せよ
* 高価なリソースを抱え込まないようにせよ
* IEnumerableデータソースとIQueryableデータソースを区別せよ
* Single()とFirst()を使ってクエリのセマンティクスを指定せよ
* Func<>ではなくExpression<>を格納するようにせよ

## Chapter 6　その他
* null許容値のスコープはできるだけ狭くせよ
* コンストラクタ、ミューテータ、イベントハンドラのために部分クラス、部分メソッドを使え
* 配列引数を使わず、Params配列を使え
* コンストラクタで仮想関数を呼び出すのを避けよ
* 大規模なオブジェクトでは弱参照を検討せよ
* ミュータブルでシリアライズできないデータは自動実装プロパティにせよ
Effective C#のもくじ

## Chapter 1　C#言語
* アクセス可能なデータメンバの代わりに常にプロパティを使用すること
* constよりもreadonlyを使用する
* キャスト時にはisあるいはas演算子を使用すること
* #ifの代わりにConditional属性を使用する
* ToString()を常に実装すること
* 値型と参照型の違い
* 値型は不変かつアトミックにすること
* 値型における0を正常な状態とすること
* ReferenceEquals()とstaticメソッドのEquals()、インスタンスメソッドのEquals()、等号演算子==の関係を把握する
* GetHashCode()の罠に注意する
* foreachループを使用すること

## Chaptert 2　.NETにおけるリソース管理
* 割り当て演算子よりも変数初期化子を使用すること
* staticメンバはstaticコンストラクタで初期化する
* コンストラクタの連鎖を活用する
* usingおよびtry...finallyを使用してリソースの後処理を行う
* ゴミの量を最小限に抑えること
* ボックス化、ボックス化解除を最小限に抑える
* Disposeパターンの標準的な実装

## Chapter 3　C#によるソフトウェアデザインの表現
* 継承よりもインターフェイスの定義および実装を行うこと
* インターフェイスを実装することと仮想関数をオーバーライドすることの違い
* デリゲートを使用してコールバックを実現する
* イベントにより発信インターフェイスを定義する
* クラス内オブジェクトの参照を返さないようにすること
* 命令形プログラミングよりも宣言型プログラミングを選択する
* 型はできるだけシリアル化可能とすること
* IComparableとIComparerを実装して順序関係をサポートする
* ICloneableを使用しないこと
* 変換演算子は使用しないこと
* 親クラスの変更による指示がない限りnew修飾子は使用しないこと

## Chapter 4　バイナリコンポーネントを作成する
* CLS互換性のあるアセンブリを作成すること
* 機能を最小限かつシンプルにすること
* より小さく凝集したアセンブリを作成すること
* 型の可視性を制限すること
* 粒度の粗いWeb APIを作成する

## Chapter 5　フレームワークを活用する
* イベントハンドラよりもオーバーライドを優先すること
* .NETランタイムの診断機能を利用する
* 標準の設定メカニズムを使用すること
* データベインドを活用およびサポートすること
* .NETの検証機能を使用すること
* ニーズに一致したコレクションを用意すること
* 独自のデータ構造よりもDataSetを利用する
* リフレクションを単純化するために属性を使用する
* リフレクションを使用しすぎないこと
* 完全にアプリケーション固有の例外クラスを作成する

## Chapter 6　その他
* 例外を強く保証すること
* 相互運用を最小限にすること
* 安全なコードを選ぶ
* ツールとリソースについて選ぶ
* C# 2.0への準備
* ECMA標準について学ぶ
読み込んだgemのバージョンによって処理を分ける


バージョンによるAPIの違いを吸収するような時に。

## gem_version_more?(name, version)

```ruby
require 'rubygems'

# gem_version_more?('rroonga', '2.1.0')  #=> rroongaが2.1.0以上ならtrue
def gem_version_more?(name, version)
  Gem.loaded_specs[name].version >= Gem::Version.new(version)
end
```

* `Gem.loaded_specs`から指定した名前のgemのバージョンを取得
* `Gem::Version`を使って文字列からバージョン情報の作成

## 使用例

`rroonga2.1.0`から`Groonga::Table#sort`の返り値が`Array`から`Groonga::Array`に変更となったため、以下の関数で違いを吸収しました。

```milkode/lib/milkode/common/util.rb
# 互換性保持のため
def groonga_table_sort(table, keys, options = {})
  if gem_version_more?('rroonga', '2.1.0')
    table.sort(keys, options).map{|r| r.value}
  else
    table.sort(keys, options)
  end
end
MySQLのデータを抜き出して、それを別ファイルに保存し、in句としてくわせる

データ量が多い時のMySQLでJOINする重たいクエリを投げるのが嫌な場合があったので、メモ

```
mysql> select * from user_data;
+----+---------+------+
| id | user_id | data |
+----+---------+------+
|  1 |       1 |  100 |
|  2 |       1 |  200 |
|  3 |       2 |  250 |
|  4 |       1 |  400 |
|  5 |       2 |  150 |
… 省略 …
+----+---------+------+
```
↑のようなデータがあった場合

```
$ echo 'select user_id, sum(data) as data from user_data group by user_id order by data desc;' | mampsql -N test_db > sample.sql
```
で取り出す。
DBに繋ぐところは、適当に置き換えてください。mysql -uroot -ppasswordとか
(ローカルのmampにつないでるので、残念なaliasになってます)

結果を出力してみると、以下のような感じにでタブ区切りでuser_idと合計値の昇順に並んでます。

```
$ head sample.sql 
1	1700
4	1500
3	800
2	600
```
で、こいつをカンマ区切りに変更。

```
$ cat sample.sql | awk '{print $1}' | sed ':loop; N; $!b loop; ;s/\n/,/g' > comma_sample.sql
$ head comma_sample.sql
1,4,3,2
```
あとは、こいつを食わせるSQLを投げるだけ

```
awk '{printf("select id,count(*) from member_list where user_id = %s ;"),$1}' d comma_sample.sql | mampsql -N > result.sql
```

一行ずつ食わせる場合は、sedせずに%dにして実行すればOK。
Examples of Metaprogramming in Ruby


## Define a method if it's not already defined

Code could be found in the i18n gem.

[https://github.com/svenfuchs/i18n/blob/master/lib/i18n/core_ext/hash.rb](https://github.com/svenfuchs/i18n/blob/master/lib/i18n/core_ext/hash.rb)

```ruby
class Hash

  …

  def deep_merge!(data)
    merge!(data, &MERGER)
  end unless Hash.method_defined?(:deep_merge!)

  …

end
```

By adding `unless Hash.method_defined?(:deep_merge!)` after the `end` of the method, `Hash.deep_merge!` will be defined if it's not already defined.
This prevents monkey patch.
In Rails, active_support also defines `Hash.deep_merge!`. So i18n doesn't override that method.
map, grepの中でreturn

map, grepのブロックの中でreturnするとそのブロックではなくその外側のブロック(サブルーチンなど)からreturnする。
perl v5.14.2で確認。

```perl:return.pl
use strict;
use warnings;
use feature qw(say);
use List::Util qw(first reduce);

sub custom1(&) {
    shift->();
}

sub custom2(&@) {
    shift->();
}

sub test_grep {
    my @a = (1);
    @a = grep { return 'from inside grep' } @a;
    return 'from outside grep';
}

sub test_map {
    my @a = (1);
    @a = map { return 'from inside map' } @a;
    return 'from outside map';
}

sub test_eval {
    eval { return 'from inside eval' };
    return 'from outside eval';
}

sub test_first {
    my @a = (1);
    @a = first { return 'from inside first' } @a;
    return 'from outside first';
}

sub test_reduce {
    my @a = (1);
    @a = reduce { return 'from inside reduce' } @a;
    return 'from outside reduce';
}

sub test_custom1 {
    custom1 { return 'from inside custom1' };
    return 'from outside custom1';
}

sub test_custom2 {
    my @a = (1);
    @a = custom2 { return 'from inside custom2' } @a;
    return 'from outside custom2'
}

say test_grep;
say test_map;
say test_eval;
say test_first;
say test_reduce;
say test_custom1;
say test_custom2;
```

上のコードを実行すると、結果は

```
from inside grep
from inside map
from outside eval
from outside first
from outside reduce
from outside custom1
from outside custom2
```

evalやコードブロックを取るユーザ関数はreturnでブロックを抜けるが、grep,mapは違う。見た目はほとんど変わらないのに。まあ、そういうものだと思うしかないか。
オフラインリアルタイムどう書く第7回の参考問題をscalaで解く

問題はこちら
http://nabetani.sakura.ne.jp/hena/ord7xysort/
で、Rubyで解いた
http://qiita.com/items/f3b36e69f831599d947f
をベタにscalaに移植。
scalaリハビリ中。関数型っぽく書けるようになりたい。

```scala
object Q7r extends App {
	val BASE =
	  List(
	    List(4,1,4,2,1,3),
		List(7,3,2,0,5,0),
		List(2,3,6,0,6,7),
		List(6,4,5,7,5,1),
		List(3,1,6,6,2,4),
		List(6,0,5,5,5,1)
	  )
	val ROWS = "ABCDEF"
	val COLS = "uvwxyz"

	def solve(q:String):String = {
		var list = BASE
		q.foreach{c =>
			if (ROWS.indexOf(c) >= 0) list = list.transpose
			var pos = List(ROWS.indexOf(c),COLS.indexOf(c)).max
			list = list.sortBy(_(pos))
			if (ROWS.indexOf(c) >= 0) list = list.transpose
		}
		list.head.mkString
	}

	probs.split("\n").foreach(line => line.split("\\s+").toList match {
		case List(no,q,a) => {
			var ans = solve(q)
		 	println(no + "\t" + ans + "\t" + (if (ans==a) "o" else "x"))
		 }
		 case _ =>
	})

	def probs =
	"""
0	AvEx	305027
1	A	112344
2	C	241413
3	F	134214
4	u	236067
5	w	732050
6	y	414213
7	yx	732050
8	ux	236067
9	EF	131424
10	DF	134124
11	Au	055165
12	uA	023667
13	By	234114
14	yB	114342
15	yBy	357020
16	yByB	350072
17	AuBvCw	131244
18	FAuFBvFCw	300527
19	AuBv	112344
20	CwDx	515056
21	FzyE	324114
22	uAwDyB	114324
23	zExCvF	073520
24	uFxEv	002357
25	DyCwB	076362
	"""
}
```
fuelphpでgeometry型を扱う

MySQLのviewを使うことで実現してみた。

ここではSpotという、名前と説明と位置情報を持つデータを考えてみる。

scaffoldでは、geometryを指定

```php oil g scaffold -f spots title:string description:string location:geometry```

できあがったmigrationファイルのup()関数内で

```php
\DBUtil::create_index('spots', 'location', 'sp_index', 'spatial');
\DB::query("create view spots_all_view as select id, title, description, ASTEXT(location) as location, created_at, updated_at from spots")->execute();
```

自動生成されたSpotの定義内の$_observersに、

```php
'Model_Spot_Observer' => array(
                                 'events' => array('before_save', 'after_load'),
                              );
```

を追加。

で、Model_Spot_Observerの実態は

```php
class Model_Spot_Observer extends Orm\Observer
{
    public function before_save(Model_Spot $obj)
    {
        $location = $obj->location;
        $obj->set('location', \DB::expr('GeomFromText("POINT('.$location[0].' '.$location[1].')")'));
    }


    public function after_load(Model_Spot $obj)
    {
        $location = $obj->location;
        preg_match('/POINT\((.+)\s(.+)\)/', $location, $matches);
        $obj->location = array($matches[1], $matches[2]);

    }
}
```

before_saveは、値がDBに保存される前処理。ここで、controllerから配列形式で渡した緯度経度情報を基にGeomFromText関数の呼び出し形式の文字列を生成し、locationに設定する。

after_loadはDBから値を読み込んだ時の後処理。MySQLのviewの定義を見るとわかるように、ASTEXT(location) as locationとしているので、DBから読み込んだ値は"POINT(経度 緯度)"という文字列になる。ここままでは非常に扱いにくいのafter_load関数でその値を配列にしてあげる。

これによって、controller、viewから見れば、緯度経度情報が配列で扱えるようになる。

もっとうまいやり方があるのかもしれないが、とりあえずはこれで動くといえば動く。
rbenv install直後に捗る方法


rbenvいいですよね
ただrbenv installする毎にgemを入れ直すのが面倒…
そんな問題を解決するpluginが出てました

[sstephenson/rbenv-default-gems · GitHub](https://github.com/sstephenson/rbenv-default-gems)

作者はrbenvのsstephenson  
ruby-buildを実行した際に指定したgemを同時に入れてくれるプラグインです

使い方
---

rbenv-default-gemsをインストールします

```
brew install rbenv-default-gems
```

~/.rbenv/default-gems に以下のような内容を書きます

``` ~/.rbenv/default-gems
bundler
pry
```

あとはいつも通りrbenv installをするだけ

```
$ CONFIGURE_OPTS="--with-readline-dir=/usr/local --with-openssl-dir=/usr/local --enable-shared" rbenv install 1.9.3-p385

Downloading yaml-0.1.4.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/36c852831d02cf90508c29852361d01b
Installing yaml-0.1.4...
Installed yaml-0.1.4 to /Users/chiastolite/.rbenv/versions/1.9.3-p385

Downloading ruby-1.9.3-p385.tar.gz...
-> http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p385.tar.gz
Installing ruby-1.9.3-p385...
Installed ruby-1.9.3-p385 to /Users/chiastolite/.rbenv/versions/1.9.3-p385

Fetching: bundler-1.2.3.gem (100%)
Successfully installed bundler-1.2.3
1 gem installed
Fetching: coderay-1.0.8.gem (100%)
Fetching: slop-3.4.3.gem (100%)
Fetching: method_source-0.8.1.gem (100%)
Fetching: pry-0.9.11.4.gem (100%)
Successfully installed coderay-1.0.8
Successfully installed slop-3.4.3
Successfully installed method_source-0.8.1
Successfully installed pry-0.9.11.4
4 gems installed
```

指定したgemが入ってますね
正直、毎回 gem install bundlerやるのも面倒だなと思っていたのでこれですぐ開発に集中できます
Vim移動 for Ruby

|Center|Left|
|:--|:--|
|[m|def ジャンプ 次へ|
|]m|def ジャンプ 前へ|
|]M|end ジャンプ 次へ|
|[M|end ジャンプ 前へ|

つーか

> $VIMRUNTIME/ftplugin/ruby.vim

Ruby on Rails の移動も忘れやすいので必要なときに書く
C# like delegate implementation for CoffeeScript


Today, I wrote C# like delegate class for CoffeeScript. This class executes the series callbacks step by step. Node.js requires devepolers to design non-blocking programs. So this implemtation is desinged using closures as the output of callbacks. If you are familiar to C# delegates, you may feels odd.


NOTICE: This class is a very simple implementation. If you are finding more powerful library like this, I suggest that you try [async].

```coffee:delegate.coffee
class Delegate
	constructor: ()->
		@callbacks = []
	add: (callback)->
		@callbacks.push(callback)
	execute: (parameters, finalCallback)->
		index = 0
		parameters.unshift (error)=>
			return finalCallback(error) if error
			index += 1
			if @callbacks[index]
				@callbacks[index] parameters...
			else
				finalCallback(null)
		@callbacks[index] parameters...
```

Basic usage:

```coffee:example.coffee
delegate = new Delegate()
delegate.add (next, arg1, arg2)->
	setTimeout ()->
		console.log '#1', arg1, arg2
		next()
	, 500
delegate.add (next, arg1, arg2)->
	setTimeout ()->
		console.log '#2', arg1, arg2
		next()
	, 500
delegate.add (next, arg1, arg2)->
	setTimeout ()->
		console.log '#3', arg1, arg2
		next()
	, 500

delegate.execute ['hello', 'world!'], (error)->
	console.log "#finial", error
```

This output is:

```
#1 hello world!
#2 hello world!
#3 hello world!
#finial null
```

This class stops executing callbacks when detects an error in the middle.

```coffee:error-example.coffee
delegate = new Delegate()
delegate.add (next)->
	console.log '#2-1'
	next(new Error("Something wrong..."))
delegate.add (next)->
	console.log '#2-2'
	next()
delegate.add (next)->
	console.log '#2-3'
	next()

delegate.execute [], (error)->
	console.log "#2-finial", error
```

The output of this becomes like:

```
#2-1
#2-finial [Error: Something wrong...]
```

[async]: https://github.com/caolan/async
TopazとRubyとPythonでHashの速度を比較してみた


RPythonを使って速くなるという噂のRubyの実装、Topazを使ってHashの速度を比較してみました。

RubyのHashって[他の言語に比べて遅い](http://incise.org/hash-table-benchmarks.html)という指摘があるんですよね。サイズが大きくなるとPerlやPythonよりも遅いという話です。(Perlとの比較がどこにあったか忘れた）

で、Topaz使えば速くなるかなーと淡い期待をして比較してみました。

Topazの導入は[RPythonで書かれたRuby処理系Topazで遊ぶ - グニャラくんのwktk運営日記](http://blog.wktk.co.jp/archives/328)を参考にしました。

比較用に使ったコードは[Github](https://github.com/chezou/hash_bench)にあります。
今回は手抜きをして、平均とったりしてません。参考値ということで。

環境は
MacOS X 10.8.2
Intel Core i5 2.5GHz
8GB RAM

```bash:
$ ruby -v
ruby 1.9.3p362 (2012-12-25 revision 38607) [x86_64-darwin12.2.1]
$ python --version
Python 2.7.3
$ bin/topaz -v
topaz (ruby-1.9.3p125) [x86_64-darwin]
```

# SequentialなHashの作成速度

単位は秒

|size	|Ruby1.9.3(int)|Ruby1.9.3(string)|topaz(int)|topaz(string)|	Python2.7.3(int)|Python2.7.3(string)|
|----:|----:|-----:|----:|----:|----:|----:|
|5000000	|4.617856	|8.087801	|2.649405	|11.485846	|0.702034	|2.473861|
|10000000	|10.74621	|19.092902	|8.377534	|36.823358|	1.361577	|5.112283|
|15000000	|17.081968	|29.101156	|18.608418	|80.467088|	2.262289	|8.392108|
|20000000	|24.308324	|39.974923	|29.239815	|129.432628|	2.712998	|10.639115|
|25000000	|31.778632	|51.38185	|49.467747	|303.785251	|4.048304	|15.097062|
|30000000	|39.180657	|60.673959	|67.91127	|342.049215	|4.510771	|17.036763|


グラフにすると、こんな感じ。
![Creating Hash(int)](https://docs.google.com/spreadsheet/oimg?key=0AnhS1hBhz6VMdFN2VDNaa0ZSaU1ibHJNaUExeXNTOVE&oid=3&zx=b8qigzmhc2b5)

![Creating Hash(string)](https://docs.google.com/spreadsheet/oimg?key=0AnhS1hBhz6VMdFN2VDNaa0ZSaU1ibHJNaUExeXNTOVE&oid=4&zx=xd1jk8m7ec8j)

うーん、Topazが思ったより速くない。。。

# Lookupの速度

単位は秒

|size	|Ruby1.9.3(int)|Ruby1.9.3(string)|topaz(int)|topaz(string)|	Python2.7.3(int)|Python2.7.3(string)|
|----:|----:|-----:|----:|----:|----:|----:|
|5000000|	0.600543|	0.908508|	0.442561|	0.678826|	0.164233|	0.456206|
|10000000|	0.631404	|1.027941|	0.49407	|0.738537|	0.165629|	0.457019|
|15000000|	0.665743|	0.913473|	0.585652|	0.883217|	0.157661|	0.462758|
|20000000	|0.72521|	1.288778|	0.599958|	0.93315|	0.19554	|0.452863|
|25000000	|0.561795|	0.877556|	0.780173|	1.232231|	0.163047|	0.478319|
|30000000	|0.657025|	1.296413|	0.783736|	1.353858|	0.160251|	0.456952|

グラフはこちら
![Lookup Hash(int)](https://docs.google.com/spreadsheet/oimg?key=0AnhS1hBhz6VMdFN2VDNaa0ZSaU1ibHJNaUExeXNTOVE&oid=5&zx=9qt09r5imu9o)

![Lookup Hash(string)](https://docs.google.com/spreadsheet/oimg?key=0AnhS1hBhz6VMdFN2VDNaa0ZSaU1ibHJNaUExeXNTOVE&oid=6&zx=lf0d096ov7t)


# やってみて思ったこと
Topazは今後速くなる可能性があって楽しみではありますが、現状では

* Kernel#randに引数渡せない
* Benchmarkが使えない
* 正規表現が使えない
* 'p'もできない

などなど色々と厳しいところもあります。
今後の発展に期待です。
WebDriverのサンプル(古いかも)

自サイトより転載

```java:sample.java
//ドライバー。どっかでインスタンス化しておくこと。
private InternetExplorerDriver driver = null;

～～～省略～～～
/** 
 * アラートを閉じる。alertでもconfirmでも使えるが、 
 * beforeUnloadの際の確認ダイアログに対しては無効。 
 */
private void alertClose(){
     //キャンセルの場合はこっち     
     driver.switchTo().alert().dismiss();     
     //ＯＫの場合はこっち     
     //driver.switchTo().alert.accept();
}
/**
 *
 指定された要素でエンターキーを押す。
 * @param element
 */
private void pressEnter(WebElement element){
     //keydown/keyup出来るキーはSHIFT、ALT、CONTROLのみ。
     element.click();
    driver.getKeyboard().pressKey(Keys.ENTER);
}
/**
 * ESCキーを押す。
 */
private void pressEscape(){
     driver.getKeyboard().pressKey(Keys.ESCAPE);
}

/**
 * 指定した要素をダブルクリックする。
 * @param element
 */
private void dblClick(WebElement element){
     DoubleClickAction dblClick = 
　　　　　　　new DoubleClickAction(driver.getMouse(), (Locatable) element);
     dblClick.perform();
}

//ajaxで要素が出てくるまでの待ち合わせ時間を設定
driver.manage().timeouts().implicitlyWait(90,TimeUnit.SECONDS);
```
Markdown ドキュメントをとっても簡単にリアルタイムプレビュー編集できるサービス

みんな大好き Markdown ドキュメントを、 **自分好みのエディタ（Emacs や Vim など）で編集しながらお手軽にブラウザでリアルタイムプレビュー** できちゃうサービスを作ったので、Qiita でも共有しておきます。

[Markdown Previewer](http://playground.k11i.biz/mp/)

使い方はとっても簡単。上記サイトにアクセスして、「Drop your markdown file here」と書かれたエリアにローカルファイルシステム上の Markdown ファイルをドラッグ＆ドロップするだけ。ドロップすると、即座にレンダリング結果をプレビュー表示してくれます。

ローカルファイルの編集にも追随し、ファイルを更新・保存するたびに内容を自動リロードしてプレビュー表示を更新してくれます。

リアルタイムプレビューの仕組みについては以下ブログのエントリに軽く記載しています。

[楽して Markdown ファイルをリアルタイムプレビューできる仕組みを作ったった](http://blog.k11i.biz/2013/02/markdown.html)
インストール済みパッケージの再現

同じ emacs の設定使いたいけど、`init.el` が大量のパッケージと依存してて、今の設定を他で再現するのつらい・・・死にたい・・・って時に生きる努力をする。

```scm
(defun package-require (feature &optional filename packagename noerror)
  "`require' の代わりに使う関数。
PACKAGENAME(or FEATURE) が未インストール時は、`require' する前に
`package-install' によるパッケージインストールを試みる。
NOERROR が non-nil ならば、PACKAGENAME(or FEATURE) が存在しなかったり、
`require' が失敗した時に `error' ではなく、nil を返す。
（`require' の第三引数相当の挙動）"
  (unless package--initialized (package-initialize))
  (unless package-archive-contents (package-refresh-contents))
  (let ((pname (or packagename feature)))
    (if (assq pname package-archive-contents)
        (let nil
          (unless (package-installed-p pname)
            (unless package-archive-contents (package-refresh-contents))
            ;; TODO パッケージ配信鯖が死んでるときの対処
            (package-install pname))
          (or (require feature filename t)
              (if noerror nil
                (error "Package `%s' does not provide the feature `%s'"
                       (symbol-name pname) (symbol-name feature)))))
      (if noerror nil
        (error "Package `%s' is not available for installation"
               (symbol-name feature))))))
```

↑みたいな関数を用意して、`init.el` で↓こんな感じで使う:

```scm
;; package-archives の追加するなら、必ず `package-require' の上に書く
(require 'package)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.milkbox.net/packages/") t)
(add-to-list 'package-archives
             '("marmalade" . "http://marmalade-repo.org/packages/"))
(package-initialize)

...

(when (package-require 'tabbar nil nil t)
  ... ;; tabbar の設定色々
  (global-set-key [(control tab)] 'tabbar-forward)
  (global-set-key [(control shift iso-lefttab)] 'tabbar-backward) ;; for x window system
  )

(when (and (package-require 'anything nil nil t)
           (package-require 'anything-obsolete nil nil t)
           (package-require 'anything-config nil nil t)
           (package-require 'anything-match-plugin nil nil t)
           (package-require 'anything-complete nil nil t))
  ... ;; anything の設定色々
  (global-set-key "\M-x" 'anything-M-x)
  )

```

これで、`init.el` 次回起動時に勝手にインストールして `require` してくれる。仮にパッケージ消えててインストールがコケても、`when' のボディー部分が走らないだけになる。

### たくさんパッケージインストールしてると・・・

初回起動に時間かかる上に、大量のコンパイルログのバッファがボコボコ出てくる。これが個人的に気になるので、大量にインストールしそうな時は:

```sh
$ emacs --batch -l ~/.emacs.d/init.el
```

と、インストールのロジックだけ走らせてパッケージの再現をする。

### TODO パッケージ配信鯖が死んでるときの対処

`package-install` しようとして、パッケージ配信してるサーバが死んでいて失敗すると、`init.el` の処理が止まってしまうのでどうにかしたい。
可変長のフィールドをLTSVを使う上で悩んでいる


# LTSVって何？
LTSVとはLabeled Tab-separated Valuesというテキストフォーマットです。
id:naoyaさんの[LTSV FAQ - LTSV って何? どういうところが良いの? - naoyaのはてなダイアリー](http://d.hatena.ne.jp/naoya/20130209/1360381374)がわかりやすいです。

例えば、
``url:http://qiita.com<TAB>title:some title<TAB>tab:LTSV``
みたいな、
``key1:value1<TAB>key2:value2<TAB>…``
という形式で、httpdのログとかに便利だよね、と話題になっています。

# LTSVの何が嬉しいの？

* 特別なパーサがなくても簡単にparseできる。Pythonだと``{ elem[0]:elem[1] for elem in [ f.split(":",2) for f in s.split("\t")]}``とか
* 行指向なので、fulentdやMapReduceなどいろいろ扱いやすい
* [ltsview](http://d.hatena.ne.jp/naoya/20130207/1360229220)なんかを使うと人にも見やすくできる
* [ltsv.org](http://ltsv.org/)でいろんな言語の実装もある

# LTSVで可変長フィールドを扱いたいがどうすればいいんだ

可変長のフィールドがあるとき、どう表現すればいいか悩ましいのです。
例えば、qiitaのtagのようなものであったりとか、HTMLからテキスト取り出して文単位で並べたい場合とか。後者だと順序も保持したくなる。

今回は、TSVの時代にこういう形式で保存されているデータがあったとします。
``url<TAB>date<TAB>sentence<TAB>sentence<TAB>…``

具体的にはこんな感じ
``http://qiita.com<TAB>05/Feb/2013:15:34:47 +0000<TAB>foo<TAB>bar``

## Idea 1) 可変長のフィールドを１フィールドとしてtabをエスケープする

YAMLで表現するとこうなる。

```
url: http://qiita.com
date: 05/Feb/2013:15:34:47 +0000
sentence: foo\\tbar
```

こういうLTSVで保持する。
``url:http://qiita.com<TAB>date:05/Feb/2013:15:34:47 +0000<TAB>sentence:foo\\tbar``

難点。エスケープが仕様で決まっておらず、parseも面倒になる。
エスケープは[あえて仕様に入れていない](http://d.hatena.ne.jp/naoya/20130209/1360381374)そうです。

ただ、Rubyの[ltsv gem](https://rubygems.org/gems/ltsv)とかでもescapeしていたりするので、そのうちデファクトスタンダードができないかなーとも思います。

後、[httpdのログにはタブは出ないそう](http://d.hatena.ne.jp/kazuhooku/20130208/1360322477)なのですが、一般のテキストになるとタブ出てくる可能性が高いので、そこをどう割り切るかが必要です。

このアイデアの亜種として、CSVのようにダブルクォートでクォートするとかもありますが、これも面倒です。

## Idea 2) 同じkeyが出てきたら、配列に入れる
YAMLで表現するとこういう表現に落とせるようにする。

```
url: http://qiita.com
date: 05/Feb/2013:15:34:47 +0000
sentence:
  - foo
  - bar
```

こういうLTSVで保持する。

```
url:http://qiita.com<TAB>date:05/Feb/2013:15:34:47 +0000<TAB>sentence:foo<TAB>sentence:bar
```

難点。parseが面倒くさくなる。
あと、なんか同じ行に同じラベルがあるのが気持ち悪い、かも。

## Ideat 2') 同じkeyが出てきたら、Hashのvalueにタブ区切りで追加する

多分、これはltsv読み込み時にはエスケープされたタブしかないという前提になるんだろう。

入力ltsvはこうする。

```ltsv:input.ltsv
label1:value1\tlabel2:value2-1\tlabel2:value2-2\tlabel3:value3
```

すると、これくらいでparseできる。

```Ruby:parse.rb
str="label1:value1\tlabel2:value2-1\tlabel2:value2-2\tlabel3:value3"
values = str.split("\t").map{|f| f.split(":", 2)}.inject({}){|h,k| h.has_key?(k[0]) ? h[k[0]] <<"\t" << k[1]  : h[k[0]]=k[1]; h }
values["label2"]                                                                         => "value2-1\tvalue2-2"
```

dumpするときもこれくらい。

```Ruby:dump.rb
values.inject([]){|s, k| s << (k[1].empty? ? k.join(":") : k[1].split("\t").map{|v2| "#{k[0]}:#{v2}" }) ; s }.join("\t")
```

多少面倒だけど、なんとかなるレベルか。

## Idea 3) label名に番号を付加する
```
url:http://qiita.com<TAB>date:05/Feb/2013:15:34:47 +0000<TAB>sentence1:foo<TAB>sentence2:bar
```

これはイヤだ。。。

## Idea 4) 可変長のフィールドの行を分ける

```
url:http://qiita.com<TAB>date:05/Feb/2013:15:34:47 +0000<TAB>sentence:foo<TAB>
url:http://qiita.com<TAB>date:05/Feb/2013:15:34:47 +0000<TAB>sentence:bar
```

オーバーヘッドが大きくなるから流石にこれはない。

# で、どうするか

個人的には、Idea2の方向で拡張かIdea2'だと自分の用途には幸せになれそうという気がしています。
ただ、「特別なパーサがなくてもいいよね」という旨味が減ることが悩み。
この方向でRubyでいうところのネストしたHashやらArrayをどうするのか？とかに進めていくつもりはありません。

お前それjsonで、とか言われそうだけどjsonを１行にしてMapReduceとかね、、、
software foundations Equiv.v [havoc_copy]

```coq
(** **** Exercise: 4 stars (havoc_copy) *)
(* 反例から全称修飾の否定を得る *)
Lemma ex_not_forall {A} (P : A -> Prop) :
  (exists x, ~ P x) -> ~ forall x, P x.
  move => [x Px] H.
  apply Px.
  done.
Qed.
Lemma not_or_and P Q : ~P \/ ~ Q -> ~(P/\Q).
Proof.
  move => [? | ?] H; destruct H; intuition.
Qed.
    
Definition ptwice :=
  HAVOC X; HAVOC Y.

Definition pcopy :=
  HAVOC X; Y ::= AId X.


(* ptwiceの事後条件がpcopyの事後条件より弱い事を利用する *)
Lemma ptwice_intro :
  forall st m n, ptwice / st || update (update st X m) Y n.
  move => *.
  econstructor by constructor.
Qed.

Lemma pcopy_intro :
  forall st m n, m = n -> pcopy / st || update (update st X m) Y n.
  move => *.
  subst.
  econstructor by constructor.
Qed.

(* pcopyの事後条件から制約を得る *)
Lemma pcopy_inv :
  forall st m n, pcopy / st || update (update st X m) Y n -> m = n.
Proof.
  move => st m n.
  case (NPeano.Nat.eq_dec m n); first tauto.
  move => m_neq_n Hpcopy.
  exfalso.

  do 3 match goal with
    [ Hceval : _ / _ || _ |- _ ] => inversion Hceval; clear Hceval end.
  subst; simpl in *.
  match goal with [ Heq : _ = _ |- _ ] => revert Heq end.
  rewrite update_eq.
  repeat match goal with [ n : nat |- _ ] => revert n end.
  move => p H.

  have Heq : forall i, update (update st X p) Y p i = update (update st X m) Y n i by congruence.
  have HeqX := Heq X.
  have HeqY := Heq Y.
  unfold update in HeqX,HeqY.
  rewrite <- beq_id_refl in HeqX,HeqY.
  have ? : p = n by done.

  have ? : p = m.
    move: HeqX.
    have : beq_id Y X = false by unfold X,Y.
    done.
  have ? : m = n by congruence.
  contradiction.
Qed.

(* pcopyの事後条件たりえない状態でもptwiceの事後条件になりうることから同値を仮定した場合に矛盾が発生する *)
Theorem ptwice_cequiv_pcopy :
  cequiv ptwice pcopy \/ ~cequiv ptwice pcopy.
Proof.
  right.
  have : exists m n : nat, m <> n.
    exists 0; exists 1.
    auto with arith.
  move => [m [n H]].
  set st := empty_state.
  set st' := (update (update empty_state X m) Y n).

  apply ex_not_forall.
  exists st.
  apply ex_not_forall.
  exists st'.
  apply not_or_and.

  left => ptwice__pcopy.
  absurd (m = n); first assumption.
  eapply pcopy_inv.
  apply ptwice__pcopy.
  apply ptwice_intro.
Qed.
```
爆速環境構築のためのN個の方法

## PC
ラップトップなら30万，デスクトップなら20万円ぐらい(付属品を除く)が目安じゃないか？CPU，メモリ，SSDにこだわれ！何も考えずにいいPC買え！PCのせいで生産性を落とすな！
大容量がいいからHDDだよね〜とか言ってる場合じゃないぞ！どうせエロ動画で容量が圧迫されてるだけだろ？バカ野郎コノ野郎。それは外付HDDに移動しろ！ はい，Qiita閉じろ！Amazon開け！ポチれ！

## キーボード
なにも考えずに[Happy Hacking Keyboard](http://www.amazon.co.jp/gp/product/B000F8OECM/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B000F8OECM&linkCode=as2&tag=22056-22) か [Real force](http://www.amazon.co.jp/gp/product/B000EQHU6M/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B000EQHU6M&linkCode=as2&tag=22056-22)を買え！ どちらも2万円ぐらいだ！高いか？んなアホな！これでお前の生産性が1割あがるぞ！安いぞ！どっちを買えばいいかわからない？！どっちも買って試せ！ はい，Qiita閉じろ！Amazon開け！ポチれ！


 * * *
 * * *
 * * *
 * * *
 * * *
 * * *
 * * *
 * * *


買ったか？2つとも揃えたか？　よしススメ！

## マウス(トラックパッド)
OSの環境設定でマウスの軌跡を最速にする！？遅い！遅すぎる！
[Mouse Zoom](http://benh57.com/mousezoom.html) を使って限界値を突破しろ！！
OSの最速が1.7に対して，これは10まで速く出来る。もちろん10だ！何も考えずにただただ10に設定しろ！Don't think, use!
![mouse](http://uploda.cc/img/img511715c54fa9a.png)

## キーリピート
マウスと同様にこれもOSの設定を超えた値を設定しろ！
[KeyRemap4MacBook](http://pqrs.org/macosx/keyremap4macbook/index.html.ja) だ！キーが押され続けていると判断する時間，リピートのアイドル時間を細かく設定できる。「速っ！」と思うところまで短くしろ！大丈夫，人間は立派なもんで直ぐに慣れる！！
![KeyRemap4MacBookimg](http://uploda.cc/img/img511715ae97298.png)

## キーマップ
Aの横はCommandだ！Caps lockの生きる場所などキーボードの盤面のどこを見渡してもないぞ！
![os](http://uploda.cc/img/img511715dc9ef22.png)

## ランチャー
コマンド型ランチャーは多機能だが，アプリケーションを立ち上げる or 前面に持ってくるだけならばホットキー型ランチャーがいいぞ！
オススメは [Spark](http://www.shadowlab.org/Software/spark.php) だ！よく使うアプリケーションは，修飾キー&キーで立ち上がるようにしとけ！
![sparkimg](http://uploda.cc/img/img511716292ccc6.png)


**上げろ上げろ速度を上げろ！！！！**
CGLayerの使い方まとめ


CGLayerはオフスクリーンバッファとして使えるオブジェクト。同じ画像を何度も描画したい時などに便利、かつパフォーマンスもいい（らしい）。

CGLayerの生成
-
CGLayerのインスタンスを作るには__CGLayerCreateWithContext()__を使う。

```objectivec
CGLayerRef CGLayerCreateWithContext(CGContextRef context, CGSize size, CFDictionaryRef auxiliaryInfo)
```

contextにはCGLayerが作成するバッファの雛形となるCGContextオブジェクト、通常はウィンドウのグラフィックスコンテキストを渡す。特別な設定を必要としない限り、新たに作る必要はない。
sizeはその名の通りCGLayerの大きさを指定する。
auxiliaryInfoは今のところNULLを渡しておけ、とリファレンスに書いてある。

CGLayerの編集
-
CGLayerはそれぞれのグラフィックスコンテキストを持っているので、それに直接描画していくことでCGLayerの中身をいじくることができる。
グラフィックスコンテキストの取得には__CGLayerGetContext()__を使う。

```objectivec
CGContextRef CGLayerGetContext(CGLayerRef layer)
```

取得したグラフィックスコンテキストは煮るなり焼くなり……
ただし、sizeで指定した領域内しか描画出来ない。はみ出してしまうとその部分が切れてしまう。

CGLayerの描画
-
作成したCGLayerは次の関数で描画出来る。

```objectivec
void CGContextDrawLayerInRect(CGContextRef context, CGRect rect, CGLayerRef layer);
void CGContextDrawLayerAtPoint(CGContextRef context, CGPoint point, CGLayerRef layer);
```

読んで字のごとし、というのか。見たまんま。

参照：
[_Quartz 2D Programming Guide: Core Graphics Layer Drawing_](https://developer.apple.com/library/mac/#documentation/graphicsimaging/conceptual/drawingwithquartz2d/dq_layers/dq_layers.html)
[_CGLayer Reference_](https://developer.apple.com/library/mac/#documentation/graphicsimaging/Reference/CGLayer/Reference/reference.html#//apple_ref/doc/uid/TP40001406)
urllib2をMock化してunittestする

urllib2.urlopen()しているやつをMock化してテストを書いたときに若干はまったので備忘録として。

## まずはやってみる
### テスト対象コード
実際はいろいろやっているコードですが、シンプルにするためにとりあえず以下のような感じに。

```python:target.py
import urllib2

def get(url):
	return urllib2.urlopen().read()
```
 
### 悪い例
安易に最初に書いたコードがこれです。一件すると問題なさそうですが、これを実行すると**1回目のアサーションは通りますが、2回目のアサーションでAssertionError: 'hoge' != ''となりエラー**になります。

```python:bad_test_sample.py
from nose.tools import *
from mock import Mock
from StringIO import StringIO
import urllib2
import target

def test_get():
    urllib2.urlopen = Mock(return_value=StringIO('hoge'))
	eq_('hoge', target.get("http://dummy-url"))
	eq_('hoge', target.get("http://dummy-url"))
```

1回目ならまだしも、2回目以降でエラーになりますので？？？となります。実際のテストはこのように二度実行はしないとでしょうから、明らかにおかしいタイミングでエラーになって見えます。少なくとも自分の時はそうでした。


### 正しい例
結論から言うと**「readが必要->StringIOで作る」が間違っている**ので、それをしないようにして、そこもMockで済ませます。

```python:good_test_sample.py
from nose.tools import *
from mock import Mock
import urllib2
import target

def test_get():
    urllib2.urlopen = Mock()
	urllib2.urlopen.return_value.read.return_value = 'hoge'
	eq_('hoge', target.get("http://dummy-url"))
	eq_('hoge', target.get("http://dummy-url"))
```

## 解説
StringIOで渡した場合、確かにちゃんとしたread()メソッドがついてきますが、逆にちゃんとしているが故に**二度目以降の実行でも同一ストリームを参照し、さらにポインタが既に最後尾にあります**。なので、二度目以降はread()しても何も得られません。やっぱりポインタ周りはプログラマ的には必修だね。
AIRでのsqlite環境をActiveRecordパターンにして快適に！ついでにByteArrayを扱えるように。

AIRでSQLiteを扱うにあたって、太田憲治氏が公開されているAirRecordが大変重宝します。
導入まだの人はぜひこちら！
[ADB開発中！Adobe Developer Box 開発日記　連載4) AIRによるActiveRecordの実装](http://www.adobe.com/jp/devnet/air/articles/adb_howto_develop_ria_part4.html)

AirRecordは、ActiveRecordというデザインパターンにもとづき設計されたライブラリなんですが、データベースの操作をあまり意識させないような作りになっているので、ネイティブのデーターを扱うだけでDBとの連携が出来てしまうという、いちぢるしく使い勝手の良いライブラリです。
そういうふうに書くと、簡単に扱える代わりに機能が限られてるんじゃないの？といぶかしむ人もいるかもしれないですが、アソシエーションの考え方でテーブルの連結なんかも非常に柔軟で強力に行えますし、もちろん、ガツガツとそのままのSQL文を扱うことも出来ます。
AIR開発に導入しない手はないライブラリのひとつです。

AirRecordの使い方は太田憲治氏自ら執筆されている上記のリンク先を読めば簡単にわかると思います。

ただ、最近悩んだのが、AirRecordがByteArrayの保存ができないということです。
sqliteはデータ型としてBLOB型（ビックラージオブジェクト。最後のBは何だ？オブジェクトのオブの部分？）をサポートしているので、ここにそのままByteArrayを放り込みたいところですが、AirRecordを介すると、ByteArrayがString型でSQL文に入れられてしまうのでsql構文エラーが発生してしまいます。
sqlite側の型をTEXTにして、ByteArrayをBase64エンコーディングすればいいじゃないかと思うかもしれませんが、Base64エンコードってわりとマシンパワー食うので、嫌なんです。
せっかくバイナリをそのまま保存して取り出せる仕組みがあるのに、一旦Stringに変換なんてしたくないんです。

ほとほと困っていましたが、対応をアップされている方がいらっしゃいました。
[ActiveRecordは、ByteArrayを保存できない](http://d.hatena.ne.jp/takanemu/20101019/1287502190)
差分ソースを公開されているので、そのように書き換えていくことでAirRecordがByteArrayにも対応する伝説神ライブラリへと昇華します。

ただ、私の環境では、AirRecord1.2に何点か追加で書き加える必要があったので記しておきます。

```ActionScript3:jp.cre8system.framework.airrecord.db.ARDatabase
public function insert(table:String, data:Object, name:String = ""):SQLResult
{
	var driver:ARDriver = this._driver[name];
	var query:String = "INSERT INTO " + table + "(";
	var fields:Array = [];
	var key:String;
	for (key in data)
	{
		fields.push(driver.field(key));
	}
	query = query + fields.join(",") + ") VALUES(";
	var values:Array = [];
	for (key in data)
	{
		values.push(driver.value(key, data[key]));//valueへの第一引数にkeyを追加
	}
	query = query + values.join(",") + ")";
	return this.query(query, name);
}
```

```ActionScript3:jp.cre8system.framework.airrecord.db.ARSQLite
public function createCondition(field:String, value:*):String
{
	return this.field(field) + '=' + this.value(field, value);
}
```

あと、SqlStatementのパラメーターが初期化されなかったので、ここも1行だけ書き足してみました。

```ActionScript3:jp.cre8system.framework.airrecord.db.ARSQLite
public function query(connection:SQLConnection, query:String):SQLResult
{
	//SQLStatementクラスを使用して接続先と
	//実行するSQL構文を書きます
	if (sqlStatement == null || sqlStatement.sqlConnection !== connection)
	{
		sqlStatement = new SQLStatement();
		sqlStatement.sqlConnection = connection;
	}
	sqlStatement.text = query;
	
	// バイナリパラメータの設定
	for(var key:String in _binaryValues) {
		var val:* = _binaryValues[key];
		
		sqlStatement.parameters[":" + key] = val;
	}
	clear_binary_values();
	
	//実行
	sqlStatement.execute();
	//※※クエリを実行した後にパラメーターを消去。
	sqlStatement.clearParameters();
	return sqlStatement.getResult();
}
```

素晴らしいライブラリと、素晴らしい改造に感謝です！
Rails3ではerror_messagesは使えない

Rails2で`error_messages`でバリデートしたエラーをビューで表示させていたけど、
Rails3で廃止になったらしい。

代わりの記述方法を例をメモメモ

```
<% if @ad.errors.any? %>
  <ul>
    <% @ad.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
  </ul>
<% end %>
```
Rails Core Dev Memo


## rails-dev-box

- `$ vagrant suspend` suspend VM
- `$ vagrant resume` hack again
- `$ vagrant halt` shut down
- `$ vagrant up` boot it again
- `$ vagrant status` check status
- `$ vagrant destroy # DANGER: all is gone` wipe the virtual machine from the disk destroying all its contents

## Tests

- Runnning single test separately
	- `$ ARCONN=sqlite3 ruby -Itest test/cases/associations/has_many_associations_test.rb -n test_something_working`
	- `--name "full name with spaces"` or `--name /with/` when `test 'something' do … end` syntax 
	- `-v` after the file name will output the test name
- Run tests
	- `$ bundle exec rake test`
- Run sqlite tests(activerecord)
	- `$ bundle exec rake test_sqlite3`
	- Others are `test_mysql`, `test_mysql2`, `test_postgresql`
- Run tests without warnings
	- `$ RUBYOPT=-W0 bundle exec rake test`

## ActiveRecord

### Thread

wtf is it :P

### ::Persistence

- private method, `update_record` and `create_update` are the key methods

### ::Scoping


#### ::Default

- [`relation`](https://github.com/rails/rails/blob/2cb576ef36fdf14c4d4e1b8e66d930af7ad35aeb/activerecord/lib/active_record/scoping/default.rb#L39) seems to be important.
Rack::Test で RAW_POST_DATA 相当のものを送る方法

`post` メソッドの第二引数に Hash ではなく String を渡せば良い。

```app_spec.rb
require './app.rb'
require 'rspec'
require 'rack/test'

set :environment, :test

describe 'App' do
  include Rack::Test::Methods

  def app
    Sinatra::Application
  end

  context "POST / with params" do
    it {
      post "/", { "key1" => "value1" }
      expect(last_response.body).to eq("key1=value1")
    }
  end

  context "POST / with RAW_POST_DATA" do
    it {
      post "/", "key2=value2"
      expect(last_response.body).to eq("key2=value2")
    }
  end
end
```

```app.rb
require 'sinatra'

post '/' do
  if params.empty?
    request.body.read
  else
    params.inject("") { |result, (key, value)| result += "#{key}=#{value}" }
  end
end
```
rake spec で spec/ 以下のテストを実行させるための最小限の設定

* [素でRSpecを使うためのRakefile | ひげろぐ](http://higelog.brassworks.jp/?p=1660)
* [素でRSpecを使うためのspec_helper.rb | ひげろぐ](http://higelog.brassworks.jp/?p=1695)

 のストック代わりにメモ。

```rb:Rakefile
require "rspec/core/rake_task"

RSpec::Core::RakeTask.new("spec")
task :default => :spec
```

```spec/spec_helper.rb
require 'rspec'

Dir["./support/**/*.rb"].each do |f|
  require f
end

RSpec.configure do |config|
end
```

```spec/app_spec.rb
require 'spec_helper'

describe 'app_spec' do
  it {
    expect(1).to eq(1)
  }
end
```

```rb:Gemfile
source 'https://rubygems.org/'

gem 'rake'
gem 'rspec'
```

```
$ rake spec
$ bundle exec rake spec
```
git show-branchからコミットIDを取得するzawソース

以前作った「[git logからコミットハッシュを取得するzawソース #Zsh #git - Qiita](http://qiita.com/items/296ba1e82ab12f397df9)」の``git show-branch``版

- [yonchu/zaw-src-git-show-branch · GitHub](https://github.com/yonchu/zaw-src-git-show-branch)

「[gitのリモートリポジトリの更新を確認する #git - Qiita](http://qiita.com/items/a30387bdd6a0afc1185c)」のコメントにて``git show-branch``が便利だと教えて頂いたので、さっそく活用していこうと思い作ってみた。
(といっても以前と実装がほぼ同じなので数分でさくっと作ったものですが。)

``git show-branch``の詳細は以下を参照下さい。
[git show-branch を使っていないだなんて！ #git - Qiita](http://qiita.com/items/9b6055aa93215cb8bac1)

以下``zaw-src-git-show-branch``の使用イメージ:

その1
![usage01](https://raw.github.com/yonchu/zaw-src-git-show-branch/master/img/usage01.png)
↓
![usage02](https://raw.github.com/yonchu/zaw-src-git-show-branch/master/img/usage02.png)

その2
![usage03](https://raw.github.com/yonchu/zaw-src-git-show-branch/master/img/usage03.png)
↓
![usage04](https://raw.github.com/yonchu/zaw-src-git-show-branch/master/img/usage04.png)

##導入方法

```
$git clo
ne https://github.com/yonchu/zaw-src-git-show-branch.git
$ source zaw-src-git-show-branch zaw-git-show-branch.zsh
```

以下環境変数とそのデフォルト値

```bash
# --more=N の値
ZAW_SRC_GIT_SHOW_BRANCH_MORE=20

# 追加オプション (スペース区切りで複数指定)
ZAW_SRC_GIT_SHOW_BRANCH_EXTRA_OPTION='--all'

# チルダ^のエスケープ
ZAW_SRC_GIT_SHOW_BRANCH_ENABLE_ESCAPE_CHILDA='true'
```

---------

rebase/diff/cherry-pick あたりと相性がよさそうな感じ。
単純にブランチ間の差分を見るのにも便利そう。

zawの候補表示をカラー化できないのだけが残念。
カラー化したらしたで、今度は選択項目を加工するのが面倒になるわけだけど…
SenchaTouchでSASSを利用してデザイン調整

完全に忘れてしまっていたけど、このURLを発掘して進み出した。次は忘れないようにここに貼っておく。
http://www.sencha.com/blog/getting-sassy-with-css

```sh
$ sudo gem install haml
$ sudo gem install compass
```

したら
./resources/
で下記コマンドを叩くべし。

```sh
compass compile sass
```

編集方法はまた別途、その気になったら。
クリーンインストールから間もない頃に Titanium CLI を使おうか→ SDK がインストールされないお…

Ubuntu 12.04 をクリーンインストールして，それから build-essential パッケージやら Oracle の JDK やらをインストール (方法は[こちら](http://qiita.com/items/dbeca6fac63a6e8ec9a6)) して Node.js をビルドして ia32-libs パッケージもインストールして (理由は[こちら](http://qiita.com/items/2518b5236555877b1077))，さぁ Titanium CLI を使おうかと思っていると `titanium setup` コマンドがコケるし `titanium sdk install 3.0.0.GA` などしてもまるで SDK がインストールされていない．

原因は `unzip` パッケージが無いことです…

Let's `sudo aptitude install unzip`

ちなみに，Titanium CLI はバージョン 3.0.23 (現状最新安定版) だと，`titanium setup` コマンドでコケるのに unzip の有無は関係無いです．setup の前に最低一つ `titanium sdk install 3.0.0.GA` などして SDK をインストールしておく必要があります．
IntelliJ IDEAに乗り換えたら最初にやる設定変更

###メニューのPreferencesから変更する。


##キーマップを変更する
###Keymap
Eclipseから乗り換えた人向けの「Ecipse」
そのほかEmacs,Mac Osなどに変更できる。


##行の終わり以降にカーソルが移動しないようにする
###Editor
「Allow placement of caret after end of line」のチェックを外す


##コンソール画面などで発生する日本語の文字化けを修正
###Appearance
「Override default fonts」にチェックを入れるとフォントが変更できる。
日本語が使えるフォントに変更すると文字化けしなくなる。
ただし解消されるのは設定変更後に表示される内容。


ひとまず1週間使ってみて変更したのはこのあたり。
rbenv公式docのショートカット

https://github.com/sstephenson/rbenv
https://github.com/sstephenson/ruby-build

```
#rbenvのインストール
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

#ruby-buildのインストール
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

#反映させる
source .bash_profile

#インストール可能なバージョンが表示される
rbenv install -l

#指定のバージョンをインストール
rbenv install 1.9.3-p385

#bundler入れる
rbenv exec gem install bundler
rbenv rehash
```
jQueryのPlugin Registryは、githubのmushupであった。


## registry公開、やってみました

しばらく前からやってみたい! と思っていた、
[jQuery Plugin registry (公式)](http://plugins.jquery.com/)でのプラグイン公開、やってみました。

- [jQuery – scroll turn | jQuery Plugin Registry](http://plugins.jquery.com/scrollTurn/)

いやはや、簡単というか、手間がないだけに戸惑うというか。

まさか、**githubへの操作だけで公開まで終わる**とは
思ってませんでした。titleはそういう意図です。

スムーズにいけば、plugins.jquery.comに1度もアクセスしなくても
公開作業が終わってしまいます。

## 参考

- [jQuery Plugin Registryにプラグインを登録する | jekylog](http://fingaholic.github.com/posts/2013-01-26-jquery-plugin-registry.html)
  - 細かい説明は、ここを見た方が早いです。分かりやすかた。

## ポイント

記事を書き始めてみたものの、手順の説明は↑の記事が文句なく分かりやすいので、
まずはかいつまんでポイントだけを。

- プラグインというか、プラグインのgithubレポジトリを登録・公開する形
- post-receive hookを使って、レジストリとgithubを連携・同期
- versionはgitのtagと対応させている
- Manifestというのを書く

「できる限り、jQuery側でデータを持たない!!」という思想をひしひしと感じますね。

では一応、手順と気になったところを書いていきます。

## 手順
### 1. 作ったpluginを、githubに投入する。
この段階では、本当にただぶち込んでおくだけ、という感じ。

pluginそのものを、どういう形で入れておくかは自由だし、
レポジトリの名前にも制約はなし。

このplugin registryには、pluginのファイルではなく、
あくまで**pluginのレポジトリを登録する**のである。

たぶん、jQueryのかけらもないレポジトリでも、
後述のManifestさえ書けば登録できるんじゃないかしら。(未確認)

### 2. レポジトリのpost-receiveを設定
post-receiveというのは、githubが提供しているサービスで、
***「このレポジトリにpushがあった時、指定されたURLを叩いて教えてあげるよ!!」***
というやつです。

例えば、この「指定されたURL」に自分の作ったAPIを置いておいて、

- そのきっかけでgit pullして、常にremoteと一致するディレクトリ作るとか、
- そのきっかけでTwitter API叩いて「pullしたぜ!」ってつぶやくとか、

いろいろできるわけです。

そしてpulgin registryは、このpost-receiveのURLに
http://plugins.jquery.com/postreceive-hook
を指定してもらうことで、registryの状態とレポジトリの状態を同期してるわけです。

おもしろいのは、事実上
**post-receiveを登録 = registryへの登録**
となっていることです。

こののち、正しいManifestファイルがpushされ、
対応したtagがpushされたら、
いつの間にかregistryにURLができてます。おそろしや……!


### 3. Manifestを書いてレポジトリのルートに置く

npmのpackage.jsonみたいなものですね。 
ファイル名は**(plugin名).jquery.json**にする必要があります。

- [http://plugins.jquery.com/docs/package-manifest/#sample](http://plugins.jquery.com/docs/package-manifest/#sample)

基本的には、このサンプルを空気読んで書き直していけばけばOK!
ですが、いくつか注意する項目が。

#### name:
plugin名です。Manifestのファイル名と対応している必要がありますし、

そのままURLにもなるので、大事です。

#### title:
registryページのtitleに使われます。

#### download:
ダウンロード用のURLです。

registryページの「Download now」は、ここに直リンクされるので、
zipの置き場所とかをそのまま貼っておいた方が便利です。

#### version:

versionです。
次の「tagを切る」ときには、ここと一致したtagを切らなくちゃいけません。

### 4. tagを切る
version名のタグを切ります。これはまぁそれだけです。
その時点でのレポジトリの状態が登録されることになるので、
見直しはこれより前に!

```
$ git tag 0.0.1
$ git push origin --tags
```

### 5. おわり
ここまでうまくいっていれば、registryにURLができてます。


## まとめ

記事書きながら、
いま公開したpluginのManifestとかコードとかが怪しい気がしてきた…。

まぁ、なんだか作業自体が直接的じゃなくて分かりづらいんですが、
githubと相性良く連携してる感じはしますね。

また何か作ったらやってみます。
Ruby 1.9.3-p385インストール(Mac OS X 10.8.2)

## 1. brewアップデート

```
brew update
----------
First, rewinding head to replay your work on top of it...
Fast-forwarded master to ffc0c3b7a16ef94c6d3ed8187e2542651e27db55.
Updated Homebrew from fe80973e to ffc0c3b7.
〜
----------
```

## 2. ruby-buildアップグレード

```
brew upgrade ruby-build
----------
==> Upgrading ruby-build
==> Installing ruby-build dependency: rbenv
==> Downloading https://github.com/sstephenson/rbenv/tarball/v0.4.0
######################################################################## 100.0%
Warning: The cleaning step did not complete successfully
Still, the installation was successful, so we will link it into your prefix
==> Caveats
To enable shims and autocompletion add to your profile:
  if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi

To use Homebrew's directories rather than ~/.rbenv add to your profile:
  export RBENV_ROOT=/usr/local/opt/rbenv
==> Summary
/usr/local/Cellar/rbenv/0.4.0: 31 files, 160K, built in 4 seconds
==> Installing ruby-build
==> Downloading https://github.com/sstephenson/ruby-build/tarball/v20130208
######################################################################## 100.0%
==> ./install.sh
/usr/local/Cellar/ruby-build/20130208: 68 files, 300K, built in 3 seconds
----------
```

## 3. インストール可能リスト表示確認

```
rbenv install -l
----------
  1.9.3-p385
----------
```

## 4. Rubyインストール

* readline／opensslインストール(未インストールであれば)

```
brew install readline openssl
```

* Rubyインストール

```
CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline) --with-openssl-dir=$(brew --prefix openssl)" rbenv install 1.9.3-p385
----------
Downloading yaml-0.1.4.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/36c852831d02cf90508c29852361d01b
Installing yaml-0.1.4...
Installed yaml-0.1.4 to /Users/shu/.rbenv/versions/1.9.3-p385

Downloading ruby-1.9.3-p385.tar.gz...
-> http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p385.tar.gz
Installing ruby-1.9.3-p385...
Installed ruby-1.9.3-p385 to /Users/shu/.rbenv/versions/1.9.3-p385
----------
```

※`rbenv install 1.9.3-p385`だけだと`BUILD FAILED`する

## 5. デフォルト使用設定

```
rbenv global 1.9.3-p385
ruby -v
----------
ruby 1.9.3p385 (2013-02-06 revision 39114) [x86_64-darwin12.2.1]
----------
```

## 6. バージョン確認

```
rbenv versions
----------
  system
  1.9.3-p327
* 1.9.3-p385 (set by /Users/shu/.rbenv/version)
----------
```

```
rbenv version
----------
1.9.3-p385 (set by /Users/shu/.rbenv/version)
----------
```

## 7. bundler再インストール

```
gem i bundler
----------
Successfully installed bundler-1.2.3
1 gem installed
----------
```

## 8. インストールしたRubyやGemのパスを通す

```
rbenv rehash
```

## 9. 各RailsアプリでGemインストール

```
cd RAILS_ROOT
bundle install
```
Python2.4対応


pythonは全くの素人ですが、一応解決できたのでメモ。

## urlparse

    AttributeError: 'tuple' object has no attribute 'scheme'

Python2.6で動かしていたスクリプトが2.4では上記エラーが出て動かない。

ググったらこのdiffが見つかり、同じような修正をすると動作するようになった。

http://code.google.com/p/pysimplesoap/issues/detail?id=53
http://code.google.com/p/pysimplesoap/source/diff?spec=svn80841894d88d2185751cbacd6eecea2e01e9daaa&name=80841894d88d&r=80841894d88d2185751cbacd6eecea2e01e9daaa&format=side&path=/pysimplesoap/client.py


修正前

    from urlparse import urlparse
    ...
    o = urlparse(url)
    if not o.scheme in ('http','https', 'file'):
    ...
    if o.scheme == 'file':

修正後

    from urlparse import urlsplit
    ...
    url_scheme, netloc, path, query, fragment = urlsplit(url)
	if not url_scheme in ('http','https', 'file'):
    ...
    if url_scheme == 'file':
sedで置換色々


## 標準出力

    $ sed "s/ccc/ddd/g" test.txt


## ファイルを上書きする

test.txt.bak にオリジナルを保存して、test.txtを上書き

    $ sed -i ".bak" "s/ccc/ddd/g" test.txt

## 後方参照

    $ echo 'A12345 6789Z' | sed 's/^A\([0-9]\+ [0-9]\+\)Z$/\1/'
    # 12345 6789