OmniAICreator/Qiita-1.07M huggingface dataset:
アイコンのダブルクリックでシェルスクリプトを実行する


- Automator で「アプリケーション」を作成
- アクションの「ユーティリティ」-「シェルスクリプトを実行」を右側のペインにドラッグ＆ドロップ
- スクリプトを書く
- 作成したアプリケーションを適当な場所に保存する

### 参考
[Creating Shell Script Actions](https://developer.apple.com/library/mac/#documentation/appleapplications/conceptual/automatorconcepts/Articles/ShellScriptActions.html)
[AutomatorでシェルスクリプトをGUI化](http://labs.torques.jp/2010/10/19/1431/)
CSSで画像をグレースケールにする


```CSS
img {
  -webkit-filter: grayscale(100%);
  filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale");
  filter: gray;
}
```

1行目がwebkit系
2行目がFirefox
3行目がIE

■確認できたブラウザ
・Google Chrome
・Safari
・Firefox
・IE7〜9

※Opera、IE6はダメでした。
※IE10は未確認。
Rubyコレクション

## [N]

* 外部のファイルロード
* 文字列操作
* File操作
* 繰り返し操作/コレクションの操作

## [N+]

* オープンクラス
* 無名関数
* オブジェクト指向(継承とmixin)
* **キーワード引数(新カード登場！)**

## [R]

* エンコーディング(最近登場したカード)
* スレッド、Fiber
* `Enumerable::Enumerator`
* `method_missing`
* **prepend(新カード登場！)**

## [R+]

* **`Enumerator::Lazy`(新カード登場！)**
* `define_method`
* `included` などフックメソッド
* 「クラスマクロ」
* 継続

## [SR]

* `instance_eval` 他eval族
* **Refinements(新カード登場！)**

## [UR]

* C での実装部分

## 異論反論は

受け付けます
ブラウザにファイルを強制ダウンロードさせるContent-Type


ブラウザでリンクを開くと自動的にファイルダウンロードを開始させる方法。レスポンスヘッダのContent-Typeに**application/force-download**を指定しておくと、ファイル形式に関係なくダウンロードを開始させられる。

例えば、 http://[ドメイン]/downloadpdf にアクセスが来るとPDFファイルをダウンロードさせたい時のコード。

```java:PDFファイルを返すController
@RequestMapping(value = "/downloadpdf", method = RequestMethod.GET)
public void downloadPdf(HttpServletResponse response) throws Exception {

     response.setContentType("application/pdf");

     InputStream in = new FileInputStream(
          new File("/Users/horimislime/Desktop/sample.pdf"));
     OutputStream out = response.getOutputStream();

     IOUtils.copy(in, out); //PDFファイルをレスポンスで返す
}
```

ChromeなどPDFのインライン表示をサポートしているブラウザでは、/downloadpdfを開くとファイルをダウンロードせずブラウザ上に表示してしまう。以下のようにContent-Typeを指定するとダウンロードを強制させられる。

```java:　
response.setContentType("application/force-download");
```
プロジェクトで除外するファイルとローカルで除外するファイルの使い分け


## プロジェクトで除外
.gitignore に記述する

## ローカル環境で除外
.git/info/exclude に記述する。

```.git/info/exclude
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
target
```

または

``` shell
$ git config --global core.excludesfile target
``` 
に書く。
JavaHL v/s SVNKit（随時更新）

Eclipse で Subversion につなぐための Connector である JavaHL と SVNKit とをいろんな観点で比較。

svn+ssh:// について
-------------------

* JavaHL では、環境変数 SVN_SSH を設定しないとエラーになる。

      ```
ロケーションを検証中にエラー: "org.apache.subversion.javahl.ClientException: （文字化け）
svn: Unable to connect to a repository at URL 'svn+ssh://xxxxxxx'
svn: Can't create tunnel: 指定"
      ```

* SVNKit では、設定しなくても大丈夫。

JavaHL なり SVNKit なりをアンインストールするには
-------------------------------------------------

Help > About Eclipse > Installation Details でそれっぽいのを選んでアンインストールする。

参考リンク
----------

* [SVN Connectorsはどれを選べば良いか « 日本の天ぷら情報](http://tmpla.info/archives/1092)
VimShell のコマンドラインで <C-d> をエミュレートしてみる

zsh や bash では，コマンドラインで文字入力中は `<C-d>` でカーソル右の文字を削除（Emacs と同じ）し，コマンドラインが空の時は EOF を送ってシェルを終了させます．
普段 `<C-d>` でシェルを終了させているので，VimShell でも同じことが設定したくなりました．

```vim
autocmd FileType vimshell imap 
    \ <buffer><silent><expr><C-d>
    \ vimshell#get_cur_text()=='' ? "\<Esc>\<Plug>(vimshell_exit)" : "\<Del>"
```

`get_cur_text()` で入力中の文字列を取得し，何も入力されていなければ VimShell を終了，そうでなければ `<Del>` を入力します．
mapとかに関数を渡す

たとえば数字のリストから文字列のリストを作る時

```
list = [1, 2, 3, 4, 5]
list.map{|i| i.to_s} #=> ["1", "2", "3", "4", "5"]
```

とか指定するけど、Ruby1.9以降なら

```
list = [1, 2, 3, 4, 5]
list.map(&:to_s)
```

とすると全要素にシンボルで指定した関数を実行できる

---

Symbol#to_proc を使っているとのこと

詳しい解説はこのページがみやすい
[Rubyで .map(&:first) と .map{|e| e.first } が同じになる理由は？](http://d.hatena.ne.jp/yoshidaa/20110515/1305431262)
RakefileでJekyllの生成されたページをさくらVPSにデプロイする


RakefileでさくらVPSの公開フォルダにデプロイするために、参考ページを参考にRakefileを作った。

```ruby:Rakefile
# Usage: rake preveiw
desc "Launch preview environment"
task :preview do
	sh "jekyll --server --auto"
end

task :deploy do
	sh "jekyll"
	sh 'rsync -e "ssh -p port" -avz --delete _site/ user@hogehoge:/home/usr/jekyll/_site'
end

# Usage: rake post["new-post-name"]
desc "Given a title as an argument, create a new post file"
task :post, [:title] do |t, args|
	dirname = File.join(".", "_posts")
	if not FileTest.directory?(dirname)
		abort("rake aborted: #{dirname} directory is not found.")
	end
	date = Time.now.strftime('%Y-%m-%d')
	slug = args.title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
	filename = "#{date}-#{slug}.md"
	fullpath = File.join(dirname, filename)
	if File.exist?(fullpath)
		abort("rake aborted: #{fullpath} already exists.")
	end
	File.open(fullpath, 'w') do |post|
		post.puts "---"
		post.puts "layout: post"
		post.puts "category: "
		post.puts "title: #{args.title}"
		post.puts "date: #{date}"
		post.puts "summary: "
		post.puts "---"
	end
	puts "Open #{fullpath} in an editor."
end
```

このRakefileをJekyllフォルダの直下に置くと、jekyllコマンドでRakefileも公開されてしまう。

これを防ぐには、_config.ymlに 以下の記述を追加する。

```_config.yml
exclude: [Rakefile]
```


####参考
[Jekyll のデプロイ手順を改めた - tech.portalshit.net](http://tech.portalshit.net/2012/09/22/changed_the_way_to_deploy_site/)
WebDAVの設定


####WebDAV用ディレクトリ作成

```
mkdir /var/www/html/webdav
```

####WebDAV用パーミッション

```
chown daemon:daemon /var/www/html/webdav
chmod 700 /var/www/html/webdav
chown daemon:daemon /var/lib/dav
chmod 700 /var/lib/dav
```

上これだと、accessエラーになった
代わりに以下のコマンドを叩いた

```
chown apache:apache /var/www/html/webdav
chown apache:apache /var/lib/dav
```


####参考コマンド
ユーザ一覧

```
cat /etc/passwd
```
ニュートン法による平方根計算

```
#import <Foundation/Foundation.h>

double newton_sqrt(double n)
{
    if(n < 0.0)
    {
        return nan(NULL);
    }
    const double A = n;
    double a = A;
    for(int i = 0 ; i < 10 ; ++i)
    {
        double minus = (a * a - A) / (2.0 * a);
        a = a - minus;
        if(minus <= DBL_EPSILON)
        {
            break;
        }
    }
    return a;
}
int main(int argc, const char * argv[])
{
    for(int i = 0 ; i < 10000 ; ++i)
    {
        double a = sqrt(i);
        double b = newton_sqrt(i);
        double diff = ABS(a - b);
        printf("n = %i, result = %f, %f, diff = %f\n", i, a, b, diff);
    }
    return 0;
}

```

キチンと考え方を書きたい。そうしないとこんなのはただのマスターベーションで終わってしまう。
ちゃんと図をつくったら書きます。（とかなんとかいってほったらかしてすんません
しかしニュートン法とかいうかっこいい名前の割にコードを見ると拍子抜けするくらい短いものである
Play2.0 / Scala で動的に設定値を追加


いろいろ方法があるとは思いますが、紹介するのは文字列をパースして追加する方法です。

com.typesafe.config.ConfigFactory は内部的に利用されているので何もしなくても import 出来ます。

```
 play console                                                                            [info] Loading project definition from /private/tmp/todolist/project
[info] Set current project to todolist (in build file:/private/tmp/todolist/)
[info] Starting scala interpreter...
[info] 
Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_35).
Type in expressions to have them evaluated.
Type :help for more information.

scala> new play.core.StaticApplication(new java.io.File("."))
[info] play - database [default] connected at jdbc:postgresql://localhost:5432/todolist
[info] play - Application started (Prod)
res0: play.core.StaticApplication = play.core.StaticApplication@757d5b2a

scala> import com.typesafe.config.ConfigFactory
import com.typesafe.config.ConfigFactory

scala> ConfigFactory.parseString(
     | """
     | hoge.fuga="moge"
     | """
     | )
res1: com.typesafe.config.Config = Config(SimpleConfigObject({"hoge" : {"fuga" : "moge"}}))

scala> val config = play.api.Play.current.configuration ++ play.api.Configuration(res1)
config: play.api.Configuration = Configuration(Config(SimpleConfigObject({"db" : {"default" : {"driver" : "org.postgresql.Driver","user" : "postgres","password" : "","url" : "jdbc:postgresql://localhost:5432/todolist"}},"os" : {"arch" : "x86_64","name" : "Mac OS X","version" : "10.7.4"},"application" : {"langs" : "en","secret" : "ytfSWO;?II/emj]W:xbig/rXH1[1VSVo>J?5GSmgFVem_KOHT?r6k9l?et71S@?A"},"mrj" : {"build" : "11M3811","version" : "1070.1.6.0_35-428"},"sbt" : {"boot" : {"properties" : "/usr/local/bin/../Cellar/play/2.0.3/bin/../libexec/framework/sbt/sbt.boot.properties"},"ivy" : {"home" : "/usr/local/bin/../Cellar/play/2.0.3/bin/../libexec/framework/../repository"}},"play" : {"home" : "/usr/local/bin/../Cellar/play/2.0.3/bin/../libexec/framework","version" : "2.0.3","akka" : {"loglevel"...
scala> config.getString("hoge.fuga").get
res2: String = moge

scala> 

```
play console で model の動作などを確認したい場合


play.core.StaticApplication を new すると良い様です

参照：
https://groups.google.com/d/msg/play-framework/EFYnWC1yYsg/30TGLEQ-q68J

```
$ play console                                                                         
[info] Loading project definition from /private/tmp/todolist/project
[info] Set current project to todolist (in build file:/private/tmp/todolist/)
[info] Starting scala interpreter...
[info] 
Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_35).
Type in expressions to have them evaluated.
Type :help for more information.

scala> new play.core.StaticApplication(new java.io.File("."))
[info] play - database [default] connected at jdbc:postgresql://localhost:5432/todolist
[info] play - Application started (Prod)
res0: play.core.StaticApplication = play.core.StaticApplication@4cdd09a6

scala> models.Task.all()
res1: List[models.Task] = List(Task(1,Complete the tutorial))

scala> 

```
チカチカページ

Chrome拡張機能として、ページをスクロールすると色が出てきてチカチカする拡張機能を作りました。
Android4.x系から追加された開発者向けオプションの、"表示面の更新を表示"をチェックしたときに表示されるあのチカチカがとても良かったので作ってみました。
さすがにこれをChrome web storeに配信するのはどうなのかと思ったので、githubに上げました。
cloneするかzipで落としてきて、chromeの設定から拡張機能とかで追加するとチカチカするようになります。
[github](https://github.com/henteko/tikatika)
httpのページしか現状チカチカしなくて、httpsとかだとダメです。
更新するごとに色がランダムで変わります。
もしかしたら気持ち悪くなる方が出るかもしれないので、自己責任でお願いします。

[sampleページ](http://henteko07.com/tikatika/sample.html)
Easel.jsでBitmapAnimation使用時の注意	


BitmapAnimationに渡すanimations設定で、frequencyの値を1(指定なしの場合は1になる)にした場合、gotoAndPlayするとなぜか開始フレームの次のフレームから再生される。
色々と調べて一応解決したのでメモ。

```javascript
//animationsの設定
animations : {
	"start": [2, 7, false, 1]
}

//再生
movieClip.gotoAndPlay('start')

```
上記の場合、
2フレームから再生されるはずが3フレームから再生される。

簡単な解決方法としてはfrequencyの値を2（上記の場合"start"の第4引数=1）にすれば開始フレームから再生されるけど、stageの画面更新タイミングが2回のうち1回の描画になるので、動きが遅くなる。
FPSを調整すれば速さを変えられるので、シビアな環境でなければこれで良いと思う。

スマートフォン環境ではFPSを10程度に押さえたいのでfrequencyの値は1のままなんとかしたい。
Easel.jsのソースを読むと、なぜか開始フレームを1プラスしてから再生するように書かれている。
しかも複数のBitmapAnimationを使用していると、ちゃんと開始フレームから再生されるのと、開始フレーム+1から再生されるのがある。。

##解決方法
良い解決方法ではないけど、BitmapAnimationを継承して無理やり開始フレームから再生されるようにした。
元のソースを読んだ感じだとdraw → _tickの順番で実行されれば問題ないぽいけど、実際には_tick → drawの順番で実行される（複数BitmapAnimationの場合だとたまにdraw → _tickがある）。
実行順を変えるのは大変そうなので、他の方法で。
簡潔に言うとは開始画像の描画前にthis.advance()が実行されているのが問題なので、
フラグを立てて、最初の画像を描画するまでthis.advance()を実行しないようにした。
上書き部分のみ書き出し。

```javascript
gotoAndPlay: function(a) {
	this.paused = false;
	this._goto(a);
	//再生スタート時にfalseにする
	this.isFirstPlay = false;
},
draw : function(a, b) {
	//先にdrawから実行された場合 _tickを実行
	if(!this.isFirstPlay) this._tick();

	if(this.DisplayObject_draw(a, b)) return true;
	this._normalizeFrame();
	var c = this.spriteSheet.getFrame(this.currentFrame);
	if(c != null) {
		var d = c.rect;
		a.drawImage(c.image, d.x, d.y, d.width, d.height, -c.regX, -c.regY, d.width, d.height);
		return true
	}
},
_tick : function(params) {
	var f = this._animation ? this._animation.frequency : 1;
	
	if (this.isFirstPlay && !this.paused && ((++this._advanceCount)+this.offset)%f == 0) {
		//これが実行されると開始フレームが+1されてしまう
		this.advance();
	}
	this.DisplayObject__tick(params);
	//１回でも_tickが実行されたらtrueにする
	this.isFirstPlay = true;
}
```
【PRML演習11.3】コーシー分布の不定積分の逆関数をtanを用いて表す 

TeX記法の練習がてら。

----
コーシー分布 (Cauthy distribution)
　![equation](http://chart.apis.google.com/chart?cht=tx&chl=%5Cdisplaystyle%20p(y%29%3D%5Cfrac1%5Cpi%5Cfrac1%7B1%2By%5E2%7D)
（式 (11.8)）の不定積分の逆関数をtanを用いて表したい。（PRML演習11.3）

> __11.3 (基本)__　区間 (0, 1) 上で一様分布する確率変数 z が与えられたとき、y が (11.8) で与えられるコーシー分布を持つようにする変換 y=f(z) を求めよ。

![cauthy_pdf](http://www1419ue.sakura.ne.jp/prml/11_1_1/cauthy_pdf.png)

----
![equation](http://chart.apis.google.com/chart?cht=tx&chl=%5Cdisplaystyle%5Cint%5Cfrac1%5Cpi%5Cfrac1%7B1%2Bx%5E2%7Ddx%3D%5Cfrac1%5Cpi%20tan%5E%7B-1%7Dx%2BC)

![equation](http://chart.apis.google.com/chart?cht=tx&chl=%5Cdisplaystyle%20z%3Dh(y%29%3D%5Cint_%7B-%5Cinfty%7D%5Eyp(%5Chat%7By%7D%29d%5Chat%7By%7D)
　![equation](http://chart.apis.google.com/chart?cht=tx&chl=%5Cdisplaystyle%3D%5Cint_%7B-%5Cinfty%7D%5Ey%5Cfrac1%5Cpi%5Cfrac1%7B1%2B%5Chat%7By%7D%5E2%7Dd%5Chat%7By%7D)
　![equation](http://chart.apis.google.com/chart?cht=tx&chl=%5Cdisplaystyle%3D%5Cfrac1%5Cpi(tan%5E%7B-1%7D(y%29-tan%5E%7B-1%7D(%7B-%5Cinfty%7D%29%29)
　![equation](http://chart.apis.google.com/chart?cht=tx&chl=%5Cdisplaystyle%3D%5Cfrac1%5Cpi(tan%5E%7B-1%7D(y%29-(-%5Cfrac%5C12%5Cpi%29%29)
　![equation](http://chart.apis.google.com/chart?cht=tx&chl=%5Cdisplaystyle%3D%5Cfrac1%5Cpi%20tan%5E%7B-1%7D(y%29%2B%5Cfrac12)

![equation](http://chart.apis.google.com/chart?cht=tx&chl=%5Cdisplaystyle%20y%3Dh%5E%7B-1%7D(z%29%3Dtan(%5Cpi(z-%5Cfrac12%29%29)

z が区間 (0, 1) 上で一様分布する確率変数なら、yはCauthy分布に従う。
![cauthy_pdf](http://www1419ue.sakura.ne.jp/prml/11_1_1/cauthy_rand_hist.png)

```octave
1;
%
% コーシー分布 Cauthy distribution のpdf
%
function p = CauthyDistributionPDF(y)
  p = arrayfun(@(x) 1.0/(pi*(1+x^2)), y);
endfunction

%
% コーシー分布に従う乱数
%
function z = CauthyDistributionRand(x=1, y=x)
  z = tan(pi*(rand(x,y)-1/2));
endfunction


x = linspace(-10, 10, 100);
plot(x, CauthyDistributionPDF(x))
pause

hist(CauthyDistributionRand(100,1), 100, "facecolor", "r", "edgecolor", "b")
```
String.prototype.match の返り値が IE8 だけ異なる


JavaScript の String.prototype.match で、マッチしなかった `()` の値が IE だけ異なる。

```javascript
// foo または数字にマッチし、数字だったら後方参照したい
pattern = /foo|(\d+)/;

// () にマッチする場合は期待通り
number = "123";
number.match(pattern); // ["123", "123"]

// () にマッチしない場合は IE だけ異なる
text = "foo";
text.match(pattern);
// ["foo", undefined] (Chrome 23, Safari 6, Firefox 17, Opera 12, IE9)
// ["foo", ""] (IE8)
```

IE10 は環境が手元にないので未検証。
ECMAScript 3 / 5 では undefined になるのが正しい挙動 (コメント参照) で、IE8 の挙動がおかしい。
Wekbit で Canvas を背景に使う


Webkit では `-webkit-canvas` と `document.getCSSCanvasContext` を使って、canvas を背景に使うことができます。
グラフィックソフトを立ち上げる手間を省いたり、背景を動的に生成したりすることができますね。

以下、例はランダムな背景です。

```css
body {
    background: #fff -webkit-canvas(random) 0 0 repeat;
}​
```

```js
var w = 100;
var h = 100;
console.log(1);
var ctx = document.getCSSCanvasContext('2d', 'random', w, h);
for (var j = 0; j < 3; j++) {
    ctx.beginPath();
    for (var i = 0; i < 3; i++) {
        if (i === 0) {
            ctx.moveTo(Math.random() * w, Math.random() * h);
        } else {
            ctx.lineTo(Math.random() * w, Math.random() * h);
        }
    }
    var hue = Math.random() * 255;
    ctx.fillStyle = 'hsla(' + hue + ', 100%, 50%, 0.5)';
    ctx.fill();
    ctx.strokeStyle = '#000';
}
```


[jsFiddle 上のデモ](http://jsfiddle.net/shuhei/5e5EN/)

参考
http://stackoverflow.com/questions/3397334/use-canvas-as-a-css-background
HomeBrewでのMySQLのインストール


## Proxyの設定
dolipo使っているので、以下のPorxy設定をターミナルで入力

```zsh
% export http_proxy="http://127.0.0.1:8123"
% export HTTPS_PROXY=$http_proxy
```

## インストール
以下のコマンドを実行

```zsh
% brew install mysql
```

##　セットアップ
基本的には、ターミナルに表示されていることを実行していく。
内容は、

```zsh
% brew info mysql
```

でも表示される。

### 初期DB

```zsh
% unset TMPDIR
% mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp
```

### データベース起動

```zsh
$ mysql.server start
Starting MySQL
.. SUCCESS! 
```

SUCCESS!が表示されてないときは、上記手順を見直す

### rootのパスワード設定
MySQLのrootのパスワードを設定します。

```zsh
% mysqladmin -u root password 'new-password'
```

new-passwordのところは、ご自身で適当に。

### 起動用のスクリプト

```zsh
% cp /usr/local/Cellar/mysql/5.5.28/homebrew.mxcl.mysql.plist ˜/Library/LaunchAgents/
```

起動用のスクリプトをコピーし終えたら、少しだけ編集します。

まずは、ターミナルからFinderを開きます。

```zsh
% cd ˜/Library/LaunchAgents/
% open .
```

開いたFinderに、homebrew.mxcl.mysql.plistというファイルが有るはずなので、ファイルをXcodeで開きます。

Xcode上で、KeepAliveのところを、**Yes**から**No**に変更します。

![Xcode](http://img.00west.com/121129-0001.png "Xcode")

設定が完了したら、ターミナルで以下を入力します。

```zsh
%launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
```

###設定
/usr/local/var/mysql/my.cnfを作成し、以下のように設定を記述する。
サンプルは、/usr/local/Cellar/mysql/5.5.28/support-filesにあります。

```zsh
% cp /usr/local/Cellar/mysql/5.5.28/support-filesmy-small.cnf /usr/local/var/mysql/my.cnf
```

```conf:my.cnf
[client]
port		= 3306
socket		= /tmp/mysql.sock
[mysqld]
port		= 3306
socket		= /tmp/mysql.sock
skip-external-locking
key_buffer_size = 16K
max_allowed_packet = 1M
table_open_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 128K
character-set-server = utf8
innodb_file_per_table
server-id	= 1
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
aracter-set = utf8
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
[mysqlhotcopy]
interactive-timeout
```

とりあえずの初期設定ですので、パラメーターは必要に応じて変更します。

###コマンド
起動は、

```zsh
% mysql.server start
```

終了は、

```zsh
% mysql.server stop
```
Coffee Booleans


```boolean.coffee
# In Coffee Script
# `is` will be converted to `===`
# `==` will be converted to `===`
#
# Important thing in JavaScript
# undefined is not null
# http://d.hatena.ne.jp/nishiohirokazu/20120316/1331906887
# "今彼氏がいないのと、生まれてからずっと彼氏がいないのは別じゃない？"

# String vs String
"string" is "string"             # => true
"string" is new String("string") # => false

# Array vs Array
[1..2] is [1..2] # => false

# Object vs Object
{a: 1} is {a: 1} # => false

# String vs Number
# In JavaScript "0" == 0 returns true
"0" is 0 # => false

# Empty string vs Boolean
# In JavaScript "" == false
"" is false # => false
"" is true  # => false

# Number vs Boolean
# In JavaScript 0 == false returns true
# In JavaScript 1 == true returns true
0 is false # => false
1 is true  # => false

# undefind vs null
# In JavaScript undefined == null returns true
undefined is null # => false

# NaN vs undefined/null/NaN
# These are same as JavaScript
NaN is undefined # => false
NaN is null      # => false
NaN is NaN       # => false
```
fork した git リポジトリで本家を取り込みながらオレオレ版開発をする

私家版 mruby の開発で実際にやっている手順の要約．
実際は git flow など使っていたり，github と bitbucket を跨いだりしていもう少し複雑．

1. 本家は ```` git://github.com/mruby/mruby.git ````

2. forkする．

3. 私家版は ```` git@github.com:{username}/mruby.git ```` となった．

4. 両方を見るローカルリポジトリを作る

```
$ git clone git://github.com/{username}/mruby.git
$ cd mruby
$ git remote add mruby git://github.com/mruby/mruby.git
$ git fetch mruby
$ git branch original --set-upstream mruby/master
```

5. pull すると，original ブランチに本家の内容が溜まっていく．
権限がなければ，original ブランチからは push できない(当然)．

6. master 上で，普通に開発していく．

7. 開発する集中力が途切れたら, master ブランチで，original ブランチをマージする．

````
$ git merge original
````

8. コンフリクトしたら，その都度対策を考える．

9. 5〜8 を延々と繰り返す．
Go言語でTwitter Bot

[mrjones氏のGoで実装したOAuthライブラリ](https://github.com/mrjones/oauth)でTwitterAPIを利用するサンプルが公開されていますが、そのままではBotとして利用できないので、ソースを見ながらつぶやきとホームタイムラインが取得できるまでをやってみました。

- - -

最初に、ライブラリをインストールします。環境によっては先頭にsudoをつける必要があります。

```terminal:terminal
go get github.com/mrjones/oauth
```

OAuthに必要なoauth.Consumerとoauth.AccessTokenを保持するstructと、その生成関数です。

```go:main.go
package main

import (
	"encoding/json"
	"fmt"
	"github.com/mrjones/oauth"
	"io/ioutil"
	"log"
)

type Twitter struct {
	consumer    *oauth.Consumer
	accessToken *oauth.AccessToken
}

func NewTwitter(consumerKey, consumerSecret, accessToken, accessTokenSecret string) *Twitter {
	twitter := new(Twitter)
	twitter.consumer = oauth.NewConsumer(
		consumerKey,
		consumerSecret,
		oauth.ServiceProvider{
			RequestTokenUrl:   "http://api.twitter.com/oauth/request_token",
			AuthorizeTokenUrl: "https://api.twitter.com/oauth/authorize",
			AccessTokenUrl:    "https://api.twitter.com/oauth/access_token",
		})
	twitter.accessToken = &oauth.AccessToken{accessToken, accessTokenSecret}
	return twitter
}
```

次に、GETとPOSTを行う関数です。関数の最初の行以外は同じコードになっています。
responseを取得し、ioutil.ReadAllで読み込んだ後、jsonデコードを行います。
戻り値として、なんでもあり？のinterface{}を返します。

```
func (t *Twitter) Get(url string, params map[string]string) (interface{}, error) {
	response, err := t.consumer.Get(url, params, t.accessToken)
	if err != nil {
		return nil, err
	}
	defer response.Body.Close()

	b, err := ioutil.ReadAll(response.Body)
	if err != nil {
		return nil, err
	}

	// decode
	var result interface{}
	err = json.Unmarshal(b, &result)
	return result, err
}

func (t *Twitter) Post(url string, params map[string]string) (interface{}, error) {
	response, err := t.consumer.Post(url, params, t.accessToken)
	/* 以下Getと同じため省略 */
}
```

やっと、つぶやきます。NewTwitterの引数には各自値を入れて下さい。
twitter.Postの第1引数は、使用するAPIのURL [Twitter APIを参照してください](https://dev.twitter.com/docs/api/1.1)。
第2引数は、パラメータです。testとつぶやくので、keyにstatus、valueにtestとなっています。

```
func main() {
	twitter := NewTwitter("CONSUMER_KEY",　"CONSUMER_SECRET",　"ACCESS_TOKEN",　"ACCESS_TOKEN_SECRET")

	// testとつぶやく
	res, err := twitter.Post(
		"https://api.twitter.com/1.1/statuses/update.json", // Resource URL
		map[string]string{"status": "test"})                // Parameters
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(res)
}
```

最後に、ホームタイムラインを取得します。今回はGet関数を使用します。
第2引数は、何も指定しないので空のmapにしています。
タイムラインの表示では、resをinterface{}の配列である[]interface{}に変換し、forでまわしています。forの中ではさらに、interface{}をmap[string]interface{}に変換した後、textを取り出して表示しています。

```
func main() {
    twitter := NewTwitter("CONSUMER_KEY",　"CONSUMER_SECRET",　"ACCESS_TOKEN",　"ACCESS_TOKEN_SECRET")
    
    res, err := twitter.Get(
		"https://api.twitter.com/1.1/statuses/home_timeline.json", // Resource URL
		map[string]string{})                                       // Parameters
	if err != nil {
		log.Fatal(err)
	}
	
    // タイムラインを表示
	for _, val := range res.([]interface{}) { 
	    tweet, _ := val.(map[string]interface{})
	    fmt.Println(tweet["text"])
	}
}
```

JSONをdecodeするときに、あらかじめ定義したstructを渡せば、最後のinterface{}の面倒な処理はいらないのですが、APIごとに結果がことなる場合にそれぞれstructを作るのは大変なのでこのような処理にしました。
interfaceの使い方が間違っていたら、じゃんじゃんツッコミください。
最近話題のゼロ除算


Objective-Cでやるとどうなるのか、何となく気になってやってみました。

``` objective-c:やってみた1

- (void)hoge {

	NSLog("わります:%i",10000/0);

}


```

出力は ``` 2012-11-29 01:02:01.692 hoge[17496:907] わります:2 ``` でした、何これ怖い。

続きましてこちら。

``` objective-c:やってみた2

- (void)hoge {

    int result = 10000/0;
    NSLog(@"わります:%i",result);

}


```

出力は ``` 2012-11-29 01:09:36.248 hoge[17529:907] わります:6 ``` さっきは2って言ったのに…。


最後にこちら。

``` objective-c:やってみた3

- (void)hoge {

    NSLog(@"わります1:%i",100/0);
    NSLog(@"わります2:%i",10/0);
    NSLog(@"わります3:%i",1/0);

}

```

``` 2012-11-29 01:13:31.333 hoge[17583:907] わります1:2 ```
``` 2012-11-29 01:13:31.335 hoge[17583:907] わります2:515551232 ```
``` 2012-11-29 01:13:31.336 hoge[17583:907] わります3:515551232 ```
もうやだ。


結論
別にアプリケーションの強制終了とかはしないけど
#よい子もわるい子もゼロ除算をしてはいけません。
ファイルの形式を判定する


[mime-util](http://sourceforge.net/projects/mime-util/)というライブラリを利用すると、拡張子等に関わらずファイルヘッダからMIMEタイプを判定してくれる。以下利用例。

```java
MimeUtil.registerMimeDetector(
    "eu.medsea.mimeutil.detector.MagicMimeMimeDetector");

File file = new File("/Users/horimislime/Desktop/image.jpeg");  //ホントはpng
Collection<String> mimeTypes = MimeUtil.getMimeTypes(file);
```
mimeTypesには"image/png"が入る。1行目で指定しているクラスはMIMEタイプの判定器で、ここではファイルヘッダから形式を判定してくれるMagicMimeMimeDetectorを選択。他にも拡張子を元に判定を行うExtensionMimeDetector等いろいろあるけど、ここでは省略。


ローカルファイルだけでなく、Web上のファイルURLも直接指定できる。

```java
URL myPicture = 
    new URL("https://si0.twimg.com/profile_images/2519939119/bk1_normal.png");

Collection<String> mimeTypes = MimeUtil.getMimeTypes(myPicture); // image/png
```

FileやURL以外にも、InputStreamやbyte配列も引数に渡せて使いやすい。
ライセンスのスニペット

```xml
<snippet>
  <content><![CDATA[
The MIT License

Copyright (c) ${1:year} ${2:author} <${3:hoge}@${4:gmail.com}>

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
]]></content>
  <!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
  <tabTrigger>mit</tabTrigger>
  <!-- Optional: Set a scope to limit where the snippet will trigger -->
  <!-- <scope>source.python</scope> -->
</snippet>
```

これはたしかに楽。
symfony1.2で更新処理時に「Cannot insert a value for auto-increment primary key」エラーが出る 



symfony 1.2.12  Propel
PHP 5.3.6


エラーログ

```
Cannot insert a value for auto-increment primary key (fuge.ID)
```

訳：自動インクリメントの主キー（fuge.ID）の値を挿入することはできません


問題箇所

```php:lib/model/Fuge.php

public function updateNumber($updateNum)
{
    return $this
        ->setNumber($updateNum)
        ->save();
}

```

特に挿入は行っていない。。
updateのはずなのにinsertを行っていますね


saveで行っている処理を確認

``` php:lib/model/om/BaseFuge.php
public function save(PropelPDO $con = null)
{
~~~略~~~
  $con->beginTransaction();
  try {
    $affectedRows = $this->doSave($con);
    $con->commit();
  foreach (sfMixer::getCallables('BaseFuge:save:post') as $callable)
  {
    call_user_func($callable, $this, $con, $affectedRows);
  }

    FugePeer::addInstanceToPool($this);
    return $affectedRows;
  } catch (PropelException $e) {
    $con->rollBack();
    throw $e;
  }
~~~略~~~
}
```

saveの中ではinsert,updateは区別してないくさい
transactionしてcommitしてる
中のdoSaveを見てみる



``` php:lib/model/om/BaseFuge.php
protected function doSave(PropelPDO $con)
{
~~~略~~~
  if ($this->isNew() ) {
    $this->modifiedColumns[] = FugePeer::ID;
  }

  // If this object has been modified, then save it to the database.
  if ($this->isModified()) {
    if ($this->isNew()) {
      $pk = FugePeer::doInsert($this, $con);
      $affectedRows += 1; // we are assuming that there is only 1 row per doInsert() which
             // should always be true here (even though technically
             // BasePeer::doInsert() can insert multiple rows).

      $this->setId($pk);  //[IMV] update autoincrement primary key

      $this->setNew(false);
    } else {
      $affectedRows += FugePeer::doUpdate($this, $con);
    }

    $this->resetModified(); // [HL] After being saved an object is no longer 'modified'
  }
~~~略~~~
}
```

$this->isNew()で `FugePeer::doInsert` `FugePeer::doUpdate` を区別している
isNewがちゃんと機能していない?
isNewはどこにあるのか

``` php:/symfony/plugins/sfPropelPlugin/lib/vendor/propel/om/BaseObject.php

  private $_new = true;

~~~略~~~

  public function isNew()
  {
    return $this->_new;
  }
```

へー、標準trueだからどっかでfalseに変えてるのかな？
というかisNewオーバーライドしてた。。

```php:lib/model/Fuge.php
    /**
     * @return bool
     */
    public function isNew()
    {
        return (strtotime($this->getStartAt() . '+' . sfConfig::get('app_fuge_newAt') . ' day') >= strtotime('now'));
    }
```

オーバーライドしたisNewをisNewStartAtなんなりにして解決
ある程度使っているclassで宣言しているものは把握しておくべきですね。
ディレクトリ構造を維持しつつ特定のファイルのみコピー

例えば /var/log 以下のログファイルを一括でコピーしたい、でも /var/log/apache2 以下は要らないや、という場合。
cp --parent を使います。

```sh
for f in $(find /var/log | grep -v 'apache2' | grep 'log$'); do
cp --parents $f ~/
done
```

~/ 以下に var/log ディレクトリができ、ヒットしたログのみツリー構造が維持されてコピーされます。
FactoryGirlでModel作成時のValidationをスキップする方法


実装の都合上、どうしてもFactoryGirlでModel作成時のValidationを避けたいときの回避策はこんな感じです。

````ruby
# spec/factories.rb
FactoryGirl.define do
  factory :user do
    email 'foobar@hogehoge.com'

    # save時にvalidationをスキップする
    to_create do |instance|
      instance.save validate: false
    end 
  end
end
````

###参考サイト
[Bypass Rails validations when creating FactoryGirl objects](http://stackoverflow.com/questions/7652956/bypass-rails-validations-when-creating-factorygirl-objects)
日本語でCucumberのフィーチャ書くときのキーワード


cucumber 1.2.1 で `cucumber --i18n ja` を実行して確認。

|キーワード          |対応する日本語                                        |
|------------------|----------------------------------------------------|
| feature          | "フィーチャ", "機能"                                  |
| background       | "背景"                                           |
| scenario         | "シナリオ"                                         |
| scenario_outline | "シナリオアウトライン", "シナリオテンプレート", "テンプレ", "シナリオテンプレ" |
| examples         | "例", "サンプル"                                    |
| given            | "* ", "前提"                                     |
| when             | "* ", "もし"                                     |
| then             | "* ", "ならば"                                    |
| and              | "* ", "かつ"                                     |
| but              | "* ", "しかし", "但し", "ただし"                       |
| given (code)     | "前提"                                           |
| when (code)      | "もし"                                           |
| then (code)      | "ならば"                                          |
| and (code)       | "かつ"                                           |
| but (code)       | "しかし", "但し", "ただし"                             |

フィーチャファイルを日本語で書く場合、ファイルの先頭に

```
# language: ja
```

と記述が必要
総ページ数の計算方法

## 概要
Linqを使うと、あら不思議。

```
var pages = collection
   .Skip(itemsInPage)
   .Count()
;
```

ここで

- pages: 総ページ数 
- collection: 全要素含むコレクション
- itemsInPage: １ページ内の要素数

## 説明（見たまんまだけど・・・）
Skip(itemsInPage)で各ページの先頭要素が取れるので、それを数え上げれば、ページ数っていう仕組み。
ループするページ番号の計算方法

## 概要
最終ページの次ページが先頭ページに、または先頭ページの前ページが最終ページとなるようなページ番号がループする場合に関してのページ番号の計算方法の覚え書き

```
var nextPage = (currentPage + pages + (step % pages)) % pages // (1)
```

ここで

- nextPage: 次のページ番号
- currentPage: 現在のページ番号
- pages: 総ページ数
- step: 進める（戻す）ページ数

## 説明
stepの絶対値がpages以下であれば、

```
var nextPage = (currentPage + pages + step) % pages // (2)
```

でも計算できますが、

```
currentPage + pages < Math.Abs(step) // ただしstep < 0
```

の場合に、nextPageがマイナスとなってしまうため、(1)のような面倒な計算式となってます。
逆に、stepの絶対値、ページ数超えねーよというのであれば、(2)で十分です。

## 追記 (2012/12/12)
C#のプロパティ機構を通して変更する場合、

```
++hoge.Page;
```

プロパティへは加算された値が渡されるため、(3)のようにすればよいと思います。

```
var nextPage = (pages + (value % pages)) % pages // (3)
```

ここで

- value ：プロパティ機構を通して渡された値
MySQLで秘密のトークンを0と比較したら危険だけど AR (>= 3.2.12) 経由なら安全

```ruby:
User.create!(:token => "c4a307708d83f6af91daee857a089587")
User.where(:token => 0) # => [#<User id: 1, token: "c4a307708d83f6af91daee857a089587">]
```

秘密のtokenに 0 で比較するとレコードが出てくる。

MySQLだと 'a' = 0 は 'a'.to_f == 0 相当をやってるっぽい。

```shell:
$ mysql -e "select 'a' = 0"
+---------+
| 'a' = 0 |
+---------+
|       1 |
+---------+
```

sqlite3 は、安心。

```shell:
$ sqlite3 /dev/null "select 'a' = 0"
0
```

2013-02-12 追記

ActiveRecord (>= 3.2.12) から文字列型のカラムには文字列にキャストして比較するようになってました。

```ruby:
ActiveRecord::VERSION::STRING # => "3.2.11"
User.create!(:token => "xxx")
User.where(:token => 0)       # => [#<User id: 1, token: "xxx">]
# >>   SQL (0.7ms)  INSERT INTO `users` (`token`) VALUES ('xxx')
# >>   User Load (0.7ms)  SELECT `users`.* FROM `users` WHERE `users`.`token` = 0
```

```ruby:
ActiveRecord::VERSION::STRING # => "3.2.12"
User.create!(:token => "xxx")
User.where(:token => 0)       # => []
# >>   SQL (0.7ms)  INSERT INTO `users` (`token`) VALUES ('xxx')
# >>   User Load (0.3ms)  SELECT `users`.* FROM `users` WHERE `users`.`token` = '0'
```
Mac OS X で Fluentd を使って MongoDB にログ出力してみる


## 前回記事
[Mac OS X に Fluentd をインストールして Ruby からログ出力してみる](http://qiita.com/items/2dd7d135671c36fc9a20)

## 前提
[MongoDB](http://www.mongodb.org) をインストールしておいてください。ここでは [Homebrew](http://mxcl.github.com/homebrew/) で入れたものを使って行っています。

## MongoDB プラグインのインストール

gem で [fluent-plugin-mongo](https://github.com/fluent/fluent-plugin-mongo) をインストールします。

```
$ gem install fluent-plugin-mongo
```

このまま Fluentd を起動すると、

```
**Notice: C extension not loaded. This is required for optimum MongoDB Ruby driver performance.
  You can install the extension as follows:
  gem install bson_ext

If you continue to receive this message after installing, make sure that the bson_ext gem is in your load path and that the bson_ext and mongo gems are of the same version.
```

と言われたので、`mongo` と同じバージョンの `bson_ext` もインストールしました。

```
$ gem install bson_ext
```


## Fluentd の設定

デフォルトの設定の `debug.**` の部分を以下のように変えて、標準出力と MongoDB の両方にログを飛ばすようにしてみました。

```
<match debug.**>
  type copy
  <store>
    type stdout
  </store>
  <store>
    type mongo
    host localhost
    database fluent
    collection debug
  </store>
</match>
```

## MongoDB にログ出力してみる

上記設定で Fluentd を起動します。

```
$ fluentd -c ./fluent/fluent.conf
2012-11-28 14:53:10 +0900: starting fluentd-0.10.29
2012-11-28 14:53:10 +0900: reading config file path="./fluent/fluent.conf"
2012-11-28 14:53:10 +0900: adding source type="forward"
2012-11-28 14:53:10 +0900: adding source type="http"
2012-11-28 14:53:10 +0900: adding source type="debug_agent"
2012-11-28 14:53:10 +0900: adding match pattern="debug.**" type="copy"
2012-11-28 14:53:10 +0900: listening fluent socket on 0.0.0.0:24224
2012-11-28 14:53:10 +0900: listening dRuby uri="druby://0.0.0.0:24230" object="Engine"
```

すると、ローカルの MongoDB に `fluent` データベース、`debug` コレクションが自動で作られました。

そして、

```
$ echo '{"hoge":"fuga"}' | fluent-cat debug.test
```

などと出力すると、標準出力に

```
2012-11-28 14:58:12 +0900 debug.test: {"hoge":"fuga"}
```

と表示され、MongoDB の方にも、

```
$ mongo fluent
MongoDB shell version: 2.2.1
connecting to: fluent
> db.debug.find()
{ "_id" : ObjectId("50b5a7f7e0395a29bd000001"), "hoge" : "fuga", "time" : ISODate("2012-11-28T05:58:12Z") }
```

という形で格納されました。
Cucumberのシナリオに現れる表記ゆれ対策


[「はじめる！Cucumber」（諸橋恭介、達人出版会）](http://tatsu-zine.com/books/cuke)より引用


> ・相対日付や単位など、他の箇所でも使えると便利なものは Transform を定義する

> ・本質的に同じ処理をする場合の表記揺れは、正規表現でカバーする
> ・将来、異なる処理になりそうな場合は簡単であっても別のステップ定義を使う
Mac OS X に Fluentd をインストールして Ruby からログ出力してみる


## [Fluentd](http://fluentd.org) とは
> "Fluentd" is a lightweight and flexible log collector. Fluentd receives logs as JSON streams, buffers them, and sends them to other systems like Amazon S3, MongoDB, Hadoop, or other Fluends.

## 前提
Ruby >= 1.9.2 が必要です。
ここでは [RVM](https://rvm.io/rvm/install/) で入れた 1.9.3 を使って行いました。

```
$ ruby -v
ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-darwin12.2.0]
```

## インストール & セットアップ
gem を使って fluentd をインストールします。

```
$ gem install fluentd
```

設定ファイルを作成します。

```
$ fluentd --setup ./fluent
Installed ./fluent/fluent.conf.
```

これで `./fluent/fluent.conf` に設定ファイルができました。

デフォルトでは、TCP(24224), HTTP(8888) の入力を受けつけ、`debug.**` というタグを持ったメッセージを標準出力に出力するように設定されています。

```fluent.conf
## built-in TCP input
## $ echo <json> | fluent-cat <tag>
<source>
  type forward
</source>

# HTTP input
# http://localhost:8888/<tag>?json=<json>
<source>
  type http
  port 8888
</source>

## match tag=debug.** and dump to console
<match debug.**>
  type stdout
</match>
```

## 起動して試してみる

```
$ fluentd -c ./fluent/fluent.conf
```
とすると Fluentd が起動します。

```
2012-11-28 12:39:28 +0900: starting fluentd-0.10.29
2012-11-28 12:39:28 +0900: reading config file path="./fluent/fluent.conf"
2012-11-28 12:39:28 +0900: adding source type="forward"
2012-11-28 12:39:28 +0900: adding source type="http"
2012-11-28 12:39:28 +0900: adding source type="debug_agent"
2012-11-28 12:39:28 +0900: adding match pattern="debug.**" type="stdout"
2012-11-28 12:39:28 +0900: listening fluent socket on 0.0.0.0:24224
2012-11-28 12:39:28 +0900: listening dRuby uri="druby://0.0.0.0:24230" object="Engine"
```

試しに、別のシェルから

```
$ echo '{"hoge":"fuga"}' | fluent-cat debug.forward
```

とすると、元のシェルの方に

```
2012-11-28 12:40:47 +0900 debug.forward: {"hoge":"fuga"}
```

というようにログが出力されるかと思います。
これが、`debug.forward` という**タグ**と、`{"hoge":"fuga"}` とい**うメッセージ**を持った Fluentd のログになります。

HTTP でも投げてみましょう。

```
$ curl http://localhost:8888/debug.http -F 'json={"foo":"bar"}'
```
とすれば、

```
2012-11-28 12:42:51 +0900 debug.http: {"foo":"bar"}
```

のように出力が確認できると思います。


## Ruby からログ出力してみる

まず、gem で fluent-logger をインストールしておきます。

```
$ gem install fluent-logger
```

それでは irb からログ出力をしてみます。

```
> require 'fluent-logger'
> Fluent::Logger::FluentLogger.open(nil, host: 'localhost', port: 24224)
> Fluent::Logger.post('debug.ruby', { hoge: 'fuga', foo: 'bar' })
```

これで、Fluend を動かしているシェルに

```
2012-11-28 11:58:22 +0900 debug.ruby: {"hoge":"fuga","foo":"bar"}
```

というようなログが出力されました。
SQLAlchemy BaseModel

お腹すいた

```python:basemodel.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base, DeclarativeMeta
from sqlalchemy.orm import sessionmaker, scoped_session
from shimehari.configuration import ConfigManager
from formencode import Invalid

config = ConfigManager.getConfig()
url = 'mysql://' + config['MYSQL_USER'] + ':' + config['MYSQL_PWD'] + '@' + config['MYSQL_HOST'] + '/' + config['MYSQL_NAME'] + '?charset=utf8'
engine = create_engine(url, encoding='utf-8', echo=True)
Session = scoped_session(sessionmaker(autoflush=True, bind=engine))


class Model(object):
    id = Column(Integer, primary_key=True)

    errors = {}
    query = None

    u"""
    インスタンス化済みの Session を使おうとすると
    Session ID がおっかしょなるのでその対策
    """
    @property
    def session(self):
        return self.query.session

    def __init__(self):
        self.schema = None

    def validate(self, attributes):
        try:
            return self.schema.to_python(attributes)
        except Invalid, e:
            self.errors.update(e.error_dict)
            raise

    def publish(self):
        try:
            self.session.add(self)
            self.session.commit()
        except:
            self.session.rollback()
            raise

    def update(self, attributes):
        for k, v in attributes.iteritems():
            setattr(self, k, v)
        self.publish()

    def delete(self):
        try:
            self.session.delete(self)
            self.session.commit()
        except:
            self.sesssion.rollback()
            raise


def session_mapper(cls):
    cls.query = Session.query(cls)


class BaseDeclarativeMeta(DeclarativeMeta):
    def __init__(cls, classname, bases, dict_):
        DeclarativeMeta.__init__(cls, classname, bases, dict_)
        if not Model in bases:
            session_mapper(cls)

BaseModel = declarative_base(engine, metaclass=BaseDeclarativeMeta, cls=Model)
```
PRML図3.7の再現コード

（誰得OctaveコードをQiitaに貼り付けていくプロジェクト）

```octave
1;

function g = gaussian(x, mu,sigma)
  g = 1/sqrt(2*pi*sigma^2) * exp(-1/(2*sigma^2)*(x-mu)^2);
endfunction

function g = gaussian2(x, mu,Sigma)
  g = 1/(2*pi*sqrt(det(Sigma))) * exp(-1/2*(x-mu)'*inv(Sigma)*(x-mu));
endfunction

function plotfun2(fun, param)
  x = linspace(-1, 1, 3);
  plot(x, arrayfun(fun, x), param);
endfunction

function plotfun3(fun)
  [xx, yy] = meshgrid(linspace(-1, 1, 51));
  mesh(xx, yy, arrayfun(fun, xx, yy));
  view(-15, 80);
endfunction

function savegif(id)
  filename = sprintf("fig37_%03d.gif", id);
  print(filename, "-dgif");
endfunction

N = 20;
a = [-0.3 0.5];

xs = rand(N, 1)*2-1; % U(x|-1,1)
ts = arrayfun(@(x)[1 x]*a', xs) + 0.2*randn(N, 1);

alpha = 2.0;
beta  = 25; % = (1/0.2)^2

%% 初期値
mu       = [0; 0];
Sigma    = eye(2);
invSigma = inv(Sigma);

for i = 1:N
  printf("w空間の事前分布¥n");
  clf;
  hold on;
  title("prior/posterior");
  xlabel("w0");
  ylabel("w1");
  plot3(a(1), a(2), 0, 'x');
  plotfun3(@(w0,w1) gaussian2([w0;w1],mu,Sigma));
  hold off;
  % savegif((i-1)*3+1);
  pause

  printf("現在の事前分布から w をランダムに6個選んで y(x,w) をプロット¥n");
  clf;
  hold on;
  axis([-1, 1, -1, 1])
  title("6 samples from w");
  xlabel("x");
  ylabel("y");
  for j = 1:6
    %% 二次元ガウス分布 N(_mu,_Sigma) に従う乱数を求める
    L = chol(Sigma);
    w = mu + L*rand(2, 1);
    plotfun2(@(x) [1 x]*w, 'r');
  endfor
  plot(xs(1:i), ts(1:i), 'o');
  drawnow()
  % savegif((i-1)*3+2);
  hold off;
  pause

  xi = xs(i);
  ti = ts(i);
  phi = [1 xi]; % 計画行列 Φ は単純に [1 x] で

  printf("尤度関数 p(t|x, w) を wの関数としてプロット¥n");
  clf;
  hold on;
  title("likelihood");
  xlabel("w0");
  ylabel("w1");
  plotfun3(@(w0,w1) gaussian(ti, phi*[w0;w1], 1/beta));
  % savegif((i-1)*3+3);
  hold off;
  pause

  printf("「事後分布 = 事前分布 × 尤度」¥n");
  % 式 (3.50) (3.51) で分布の μ と Σ を更新
  next_invSigma = invSigma + beta*phi'*phi;
  next_Sigma    = inv(next_invSigma);
  next_mu       = next_Sigma * (invSigma*mu + beta*phi'*ti);

  Sigma    = next_Sigma;
  invSigma = next_invSigma;
  mu       = next_mu;
endfor
```

### アニメーションGIF化

```
$ convert -delay 100 fig37_*.gif -loop 0 fig37_anim.gif
```
![fig37_anim](http://www1419ue.sakura.ne.jp/fig37_anim.gif)
HBaseのシェルから特定の文字列の含まれるRowを抽出する時のコピペ


```
import org.apache.hadoop.hbase.filter.CompareFilter
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter
import org.apache.hadoop.hbase.filter.SubstringComparator
import org.apache.hadoop.hbase.util.Bytes

## カラムファミリ
family = 'family'

## 検索したいカラム名
column = 'column'

## 検索したい
value  = 'ほげ'

## テーブル名
table  = 'table_name'

## 変更不要
scan table, { 
  FILTER => SingleColumnValueFilter.new ( 
    Bytes.toBytes(family), 
    Bytes.toBytes(column), 
    CompareFilter::CompareOp.valueOf('EQUAL'),
    SubstringComparator.new(value))
}
```
webdriverのタイムアウトを設定する

```
require "selenium-webdriver"

client = Selenium::WebDriver::Remote::Http::Default.new
client.timeout = 120
driver = Selenium::WebDriver.for :chrome, :http_client => client
```
これで120秒後にタイムアウトする。

ちなみに設定しないと60秒でタイムアウトになってしまうので
長い処理が必要な時は必須。
ログイン／ログアウト時に実行するスクリプトを設定する


OS X へのログイン時にスクリプトを実行するには LoginHook という仕組みを使う。

### 既に設定されている LoginHook を確認する

```
sudo defaults read com.apple.loginwindow LoginHook
```

### LoginHook を設定する

```
sudo defaults write com.apple.loginwindow LoginHook /path/to/script
```

スクリプトのパスはどこでも良い。
とりあえず、`/usr/local/etc/login_hook` とかにした。

ログアウト時に同じ事をするには、上記の`LoginHook`を`LogoutHook`に読み替えて同じ手順を実行すれば良い。

### LoginHook を解除する

```
sudo defaults delete com.apple.loginwindow LoginHook
```

### 注意点

スクリプトの実行は root 権限で実行されるため、root ユーザが実行可能な権限設定を行う必要がある。



## 参考
- [Mac OS X: Creating a login hook](http://support.apple.com/kb/HT2420)
- [Mac OS Xで使って便利な「ログインフック」](http://builder.japan.zdnet.com/os-admin/sp_snow-leopard-09/20423879/)
- [mac OS X：LoginHookとLogoutHookを使って起動音を消す](http://www.ls-l.jp/?p=30)
ブロックコメント

[ブロックコメントの工夫 ](http://qiita.com/items/de8c44520d5aa9268ac7)と似たテクニック。

```js
/* */
console.log(1);
/* */

/* *
console.log(2);
/* */
```

この方法だとCSSでも使える。

```css
/* */
color: red;
/* */

/* *
color: blue;
/* */
```
bulletinの特定のカテゴリの記事1件をテンプレートで表示する


問合せフォームにbulletinに書いてる営業日のお知らせを掲載したくて作成。

* 下記の例では、bulletinのディレクトリ名をnewsにしてインストールしてます。
* カテゴリはtopicidで指定 topicid=5を変更すれば他のカテゴリでもOk


```Smarty
<{php}>
global $xoopsDB;
$sql = sprintf("SELECT * FROM %s WHERE topicid=5 AND published < UNIX_TIMESTAMP(NOW()) AND expired > UNIX_TIMESTAMP(NOW()) ORDER BY published DESC", $xoopsDB->prefix('news_stories'));
$result = $xoopsDB->query($sql, 1);
$news = $xoopsDB->fetchArray($result);
$this->assign('news', $news);
<{/php}>

<div style="border:1px solid #999;padding:10px">
	<div style="font-weight:bold"><{$news.title}></div>
	<{$news.hometext|escape|nl2br}>
	<{$news.bodytext|escape|nl2br}>
</div>
```

# 追記
* escapeプラグインサニタイズするようにした（HTML表示したければ外す）
* 掲載日、掲載期限にも対応させた
Octaveでmapとかlambdaとか

## map

```scheme
(map fun lis)
(map fun li1 li2)
```

のような map は

```octave
result = arrayfun(@fun, lis)
result = arrayfun(@fun, li1, li2)
```

と書ける。

関数の引数に関数を渡す時には @ を付ける。
上の例で`@fun`ではなく`fun`とすると、その場でのfunの呼び出しと見なされるため「関数funの引数が無い！」と怒られる。

で、`arrayfun()`に無名関数を渡せると捗るよね。

## lambda

```scheme
(lambda (x) (+ x 1))
```

のような無名関数はOctaveでは

```octave
@(x) x+1
```

と書ける。

無名関数の中では、通常のOctave関数とは違い、引数以外の（無名関数の外側の）変数が使える。

```octave
a = [-0.3 0.5];
xs = rand(N, 1)*2 - 1;
ts = arrayfun(@(x)[1 x]*a', xs) + 0.2*randn(N, 1);
```

## 通常のOctave関数での「外側の変数」

動かない例。こういう風にクロージャ出来たら嬉しいんだけど出来ない。

```octave
a = 3;
function y = foo(x)
  y = a*x;
endfunction
```

動く例。PHPみたいで嬉しくない。

```octave
global a = 3;
function y = foo(x)
  global a;
  y = a*x;
endfunction
```
git commit --amendをキャンセルする

amendによるものはいったんcommitして、次に

```sh:
$ git reset --soft HEAD@{1}
```

他の方法では

```sh:
$ git reflog
```

などでも復帰はできそう

数年使って初めてキャンセルしよう考えたので覚える必要全く無し。
なので戻すことは可能ということだけ覚えた。

[参考:How to undo git commit amend](http://stackoverflow.com/questions/1459150/how-to-undo-git-commit-amend-done-instead-of-git-commit)
Twitter UserStreamのハッシュタグフィルター

RubyGemsの[twitter-stream](http://rubygems.org/gems/twitter-stream)を使って、ハッシュタグでフィルターかけたかったのだけど、細かい所で詰まった。

最初、こんな風に書いてたけどダメだった。

```ruby
CONF = Hash.new
CONF[:host] = "userstream.twitter.com"
CONF[:path] = "/1.1/statuses/filter.json?track=#animation_twitter"
CONF[:oauth] = Hash.new
CONF[:oauth][:consumer_key]    = KEY
CONF[:oauth][:consumer_secret] = SEC
CONF[:oauth][:access_key]      = TOKEN
CONF[:oauth][:access_secret]   = TSEC
```

\#部分がエスケープされてなくて、#animation_twitterでつぶやいても引っかからなかった。
なので、\#を%23に変えたら出来た。

```ruby
CONF = Hash.new
CONF[:host] = "userstream.twitter.com"
CONF[:path] = "/1.1/statuses/filter.json?track=%23animation_twitter"
CONF[:oauth] = Hash.new
CONF[:oauth][:consumer_key]    = KEY
CONF[:oauth][:consumer_secret] = SEC
CONF[:oauth][:access_key]      = TOKEN
CONF[:oauth][:access_secret]   = TSEC
```

エスケープのこと忘れてた。
ブロックコメントの工夫

`/* ～ //*/` の形式で書いておくと、コメントにしたりコメントを外したりが簡単に切り替えられて便利。

## コメントにしたいとき。

```javascript
/*
hogehoge();
fugafuga();
//*/
```

## コメントを外したいとき。
先頭の`/*`を`//*`にするだけで切り替わる。スラッシュ一文字を消したりつけたりするだけ。

```javascript
//*
hogehoge();
fugafuga();
//*/
```
constructorプロパティについて


オブジェクトの初期化で使用されたコンストラクタ関数を参照するconstructorプロパティ。
constructorプロパティはコンストラクタのprototypeのプロパティであり、インスタンスからはprototypeを通じてアクセスすることができる。
コンストラクタのprototypeにプロパティ/メソッドを追加する方法によってconstructorプロパティに入る値が変わるので注意。

## 1,コンストラクタのconstructorプロパティが削除される
```
function ClassA(){};
ClassA.prototype = {
    say : function(){}
};

var a = new ClassA();
console.log(a.constructor); // Object
```
ClassA.prototypeに新しいオブジェクトを代入するとClassAのprototypeがconstructorプロパティごと上書きされ、constructorプロパティにはプロトタイプチェーンを遡りObjectが入る。

## 2,コンストラクタのconstructorプロパティが保持される
```
function ClassB(){};
ClassB.prototype.say = function(){};

var b = new ClassB();
console.log(b.constructor); //ClassB
```
新しいオブジェクトを代入せず、ClassB.prototypeに直接プロパティ/メソッドを定義する方法であればClassBのconstructorプロパティが保持される

## 3,constructorプロパティを直接定義する
```
function ClassC(){};
ClassC.prototype = {
    say : function(){},
    constructor : ClassC
};

var c = new ClassC();
console.log(c.constructor); //ClassC
for(var p in c){
    console.log(p); //consructorが列挙される
}
```
ClassC.prototypeに新しいオブジェクトを代入し、その中でconstructorプロパティを定義し値をClassCとすればconstructorプロパティを設定できるが、constructorプロパティがfor-inで列挙されてしまう。

## 4,constructorプロパティを直接定義する方法で、for-in時に列挙されないようにする
```
function ClassD(){};
ClassD.prototype = {
    say : function(){}
};
Object.defineProperty(ClassD.prototype, 'constructor', {
    value : ClassD,
    enumerable : false
});

var d = new ClassD();
console.log(d.constructor); //ClassD
for(var p in d){
    console.log(p); //consructorが列挙されない
}
```
ECMA-262 5th editionで導入されているObject.definePropertyを使用してfor-in時に列挙されないようenumerableの値をfalseにする


## 雑感

普段あまり意識しないconstructorプロパティ。
使いどころもそんなに無いと思うけどクラス生成メソッド等を作る時は意識するようにしないと。
個人的にはシンプルに「2」で良いかなと思うけど、prototypeっていちいち書くのがめんどくさければ即時関数に入れちゃう方法もある。

```
function ClassE(){}
(function(p){
    p.say = function(){};
})(ClassE.prototype);

var e = new ClassE();
console.log(e.constructor); //ClassE
```
[MacPorts] inactiveなportを一括でアンインストールする


既にインストールされているportをアップデートした場合、古いバージョンは削除されずに、`inactive`なportとして残ってしまいます。

もしバージョンを前に戻したりしないのであれば、次第にMacPortsがディスク容量を圧迫することに。

以下のコマンドを実行すればもう安心。`inactive`なすべてのportを一括でアンインストールすることができます。

```
$ sudo port uninstall inactive
```
PHPで固定型のコレクションクラスを作る

PHPの通常の配列は何でも投入できる。
同じ型の要素だけが含まれる配列であると保証したい場合、setterで制限を掛けるとよい。

ArrayObjectをextendsするのが楽。

```php
<?php
// intだけに制限する
class IntArray extends ArrayObject
{
  function offsetSet($offset, $value) {
    if (is_int($value)) {
      return parent::offsetSet($offset, $value);
    }
    throw new InvalidArgumentException;
  }
}

// Hogeクラスのインスタンスだけに制限する
class HogeArray extends ArrayObject
{
  function offsetSet($offset, $value) {
    if ($value instanceof Hoge) {
      return parent::offsetSet($offset, $value);
    }
    throw new InvalidArgumentException;
  }
}
```

ちょっとかっちりしたクラスになる。