OmniAICreator/Qiita-1.07M huggingface dataset:
お前らのコミットフックは間違っている

という話を書こうと思ったんですよ。まあタイトルは釣りなんですけど。

別にたいした話ではないんですが、

##コミット前に××をチェックする
的なフックのサンプルとしてネットで見つかるのが、

```python:precommit.py
def hook(ui, repo, **kwargs):
    ctx = repo[None]
    for file in ctx.files():
        # 何かチェック
```

みたいなコードを`precommit`フックに指定しましょう、っていうのが多いんですね。
この場合の`ctx`って`workingctx`ってやつで、ここには作業ツリー内で変更されてるファイルの情報が入ってる訳ですよ。
それでいいならいいんですが、それだと **コミット対象として選択してないファイルも含まれちゃうよ？** ってことで、

```python:pretxncommit.py
def hook(ui, repo, **kwargs):
    node = kwargs["node"]
    ctx = repo[node]
    for file in ctx.files():
        # 何かチェック
```

みたいなのを、`pretxncommit`フックに指定すれば、`changectx`が取れるから、**ちゃんとコミットに含まれるファイルだけを列挙できますよ**、っていう話。
pretxn～ であんまり時間のかかる処理はしない方がいいよって話もあるんですが、ローカルリポジトリなら大丈夫でしょう。

**と思ったんですが、**
##commit --amendの時はどういう動きになるの？
とふと疑問に思って試してみたら、何と

####precommitフックはcommit --amendのときには実行されない

ということが分かりました。 **マジで！？バグじゃなくて？**

-----

まあいいや、やっぱり`pretxncommit`大勝利だな、と思ったんですが、ためしに`pretxncommit`をFailさせてみる(return Trueする：Mercurialのフックはreturn TrueがFailなのです)と、まあ、なんということでしょう

####作業ツリーが壊れる

という驚きの結果に。

-----

壊れるっていうのはちょっと言いすぎですね。
`hg status` とかで `警告: 作業領域の親 '1187acbad27d' が未知のリビジョンです!` みたいな警告が出るようになって、TortoiseHgとかで見てもこんな状態になってますが、
![thg](http://gyazo.com/cd017b8e19c4f4107be106f4b889fa8c.png)
この時点ではどのファイルも失われていないはずです。
ただ、ここであわてて `hg update -r tip` とかってすると、(**多分**)変更していたファイルは永遠に失われることになりそう。

ここから安全に元の状態に戻す方法を考えたんですが、

1.作業ツリーのファイルをバックアップする
2.`hg update -r tip` を実行する
3.バックアップからファイルを上書きする

とかしか思いつきませんでした。もっといい方法がありそうなら教えてください。

という訳で、

##結論：Mercurialのコミットフックは間違っている
ほんとに？
正直僕が何か間違えてる気がするので、突っ込み歓迎です。

どっちにしろ、せっかくのDVCSなので、**コミットごとにちまちまチェックしなくても中央へのpushのときにガードしとけばいいんじゃないの**、って気はしますね。

Mercurial Advent Calenderの枠もらって書こうと思ったけどあんまりいいオチついてないので野良で。

書き忘れた。
環境は Windows7 32bit
Mercurialのバージョンは 2.4+6-35ba170c0f82
です。

###2012/12/07 追記
precommitがamend時に実行されない件は報告されていました
→ http://bz.selenic.com/show_bug.cgi?id=3609
pretxncommitがFailになると作業コピーが壊れる件は、こちらと同じ原因のようです
→ http://bz.selenic.com/show_bug.cgi?id=3670
使用頻度の低い Git のエイリアスを見つける


いろいろなところで便利な Git のエイリアスを見つけて ~/.gitconfig に追加する生活を送っていると、あまり使わない死んだエイリアスが積もっていくことになります。

不要な設定を取り除くことができれば設定をコンパクトかつ本当に使われている設定のみが残り、自分の設定の価値が向上します。

そこであまり使わない git のエイリアスを可視化してみます。

[history_shell.rb](https://gist.github.com/4183634)

```ruby:history_shell.rb
module History
  module Shell
    def zsh_history_file
      @zsh_history_file ||= File.expand_path('~/.zsh_history')
    end

    def zsh_history
      @zsh_history ||= File.read(zsh_history_file)
    end

    def encoded_zsh_history
      @encoded_zsh_history ||= zsh_history.encode('UTF-8', 'ASCII-8BIT', undef: :replace, invalid: :replace, replace: '')
    end

    def history
      @history ||= encoded_zsh_history.split(/\n/).map(&:strip)
    end

    def command_lines
      @command_lines ||= history.map {|line| line.split(';').last.strip }
    end

    def command_history(pattern = nil)
      (pattern ? command_lines.grep(pattern) : command_lines).map {|command_line| command_line.split(/\s+/) }
    end
  end

  module Statistics
    def stats(population, keys)
      Hash[keys.map {|key| [key, population.count(key)] }]
    end
  end

  module Git
    include Shell
    include Statistics

    extend self

    def git_command_history
      @git_command_history ||= command_history(/^git\s/)
    end

    def git_subcommands
      @git_subcommands ||= git_command_history.map {|command| command.find {|element| element != 'git' && /^\w/ === element } }.compact
    end

    def git_subcommands_stats
      stats(git_subcommands, git_subcommands.uniq)
    end

    def git_aliases
      @git_aliases ||= `git config --global --list | grep '^alias[.]' | cut -d. -f2 | cut -d= -f1`.split(/\n/)
    end

    def git_aliases_stats
      stats(git_subcommands, git_aliases)
    end
  end
end
```

```ruby
git_aliases_stats = History::Git.git_aliases_stats

average_count = git_aliases_stats.values.inject(:+) / git_aliases_stats.count
git_aliases_stats.select {|_, count| count <= average_count }
```

`History::Git#.git_aliases_stats` は Git のエイリアスとヒストリに現れた回数の Hash を返します。

上記のコードでは平均値以下のエイリアスを得ています。

```ruby
git_aliases_stats = History::Git.git_aliases_stats

git_aliases_stats.count
git_aliases_stats.select {|_, count| count <= 0 }
```

次に上記のコードでは一度もヒストリに現れなかったエイリアスを列挙します。

どちらも不要そうなエイリアスを見つけるのに役立ち、非常に便利です。

どうぞご利用ください。
IE9 での互換表示


IE9 はスクロール値の更新頻度が極端に低く（IE7, 8 の 1/3 以下）、パララックスエフェクトなどを使うとガタガタしてしまいどうしようもありません。そこで、IE8 相当の互換モードで表示することにしました。

以下のタグを入れると、IE9 でもドキュメントモードが IE8 になる模様。

```html
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8">
```

ただし、この meta よりも前に script, link などで外部リソースを読み込んでいるとダメらしいです。
http://subtech.g.hatena.ne.jp/mayuki/20110423/1303554462

また、WordPress のデフォルトテーマや HTML5 Boilterplate のようにコンディショナルタグで html に id をつけたりしてると、うまく互換モードにならない模様。これに頼って CSS や JS を書いていたので、しょうがなく PHP で対応しました。

```php
<!DOCTYPE html>
<?php if (preg_match("/Trident\/5\.0/", $_SERVER['HTTP_USER_AGENT'])): ?>
<html id="ie8" <?php language_attributes(); ?>>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8">
<?php else: ?>
<!--[if IE 6]>
<html id="ie6" <?php language_attributes(); ?>>
<![endif]-->
<!--[if IE 7]>
<html id="ie7" <?php language_attributes(); ?>>
<![endif]-->
<!--[if IE 8]>
<html id="ie8" <?php language_attributes(); ?>>
<![endif]-->
<!--[if IE 9]>
<html id="ie9" <?php language_attributes(); ?>>
<![endif]-->
<!--[if !(IE 6) | !(IE 7) | !(IE 8) | !(IE 9) ]><!-->
<html <?php language_attributes(); ?>>
<!--<![endif]-->
<head>
<?php endif; ?>
```

これでなんとかなりました。というか、なぜ最初からこれに気づかなかった・・・。

## PHP での IE9 の判定

ちなみに IE9 の判定は UA 文字列が `/Trident\/5\.0/` にマッチするかでやりました。互換モードでもこの部分は変わらないらしいです。
http://blogs.msdn.com/b/ie/archive/2010/03/23/introducing-ie9-s-user-agent-string.aspx

IE10 では Trident 6.0 になっています。
http://blogs.msdn.com/b/ie/archive/2011/04/15/the-ie10-user-agent-string.aspx
numpyの練習1

numpyのオブジェクトを作る

import numpy
a = numpy.array([1,2,3,4,5])
b = numpy.array([6,7,8,9,10])

numpyで合計，平均，分散，標準偏差を出す
numpy.sum(a)
numpy.average(a)
numpy.var(a)
numpy.std(a)

numpyに要素を追加
numpy.append(a,6)

→ numpy.array([1,2,3,4,5,6])を返す(返り値として返ってくる)
議員の政治的スタンスを記名式投票から見える化する話 

@koh_tです。Machine Learning Advent Calendar 2012 の6日目．
How They vote: Issue-Adjusted Models of Legislative Behavior
Sean Gerrish, David Blei (Princeton University) を紹介します。
http://koh-t.hatenablog.com/entry/2012/12/06/211746
paramがなければModelのValidationをskipすれば良いじゃない

パンがなければおかｓ（ｒｙ

####特定paramのValidationをskipしたい時？
Userモデルが`:name, :email, :password`などを持っていて、各項目にValidationしたい。
でもログインしてるユーザが`:name`だけを変更する時に毎回パスワードを入力させたくない、と言った場合があるかと思います。
`@user.update_attributes(params[:user])`とすると、param[:user][:password]がなくても全体に対するValidationが走ってしまい、エラーとなります。
`@user.update_attribute( :name, "new name" )`とすればvalidationを行わずに更新できますが、それでは`:name`のvalidationが出来ません。
また`validates :password, presence: { on: :create }`
とすれば特定のactionでのみvalidationが走りますが、update時にもvalidateしたいので却下でした。

####Grouping conditional validations
という訳で`with_options`を使う方法に行き着きました。

```ruby:models/user.rb
  with_options if: 'password || new_record?' do |user|
    user.validates :password, presence: true,
                              length: { minimum: 6 },
                              confirmation: true
    user.validates :password_confirmation, presence: true
  end
```

`:password`のパラメータがあればvalidationを行い、無ければスルーします。

追記：
元々`if: :password`だけの条件にしていましたが、これだと会員登録画面でパスワードフォームを削除するとパスワードのValidationをスキップしてしまう、と言う状態になっていました。DBでnull: falseとか指定していれば問題ないんですが、モデルの仕事が出来てない感があるので`if: 'password || new_record?'`としました。

これで「`password`パラメータがあればvalidationを行い、無ければスルー。但し新規作成時は必ずvalidationを行う」と言う条件になります。

コピペして使うとマズいコード載せてたんだな…と戦犯気分の午後でした。
：追記ここまで

検索して見つかった解決法の中ではこれが一番しっくり来るかなぁと思うのですが、他にもいい方法ありそう。

参考：
[Grouping conditional validations](http://guides.rubyonrails.org/active_record_validations_callbacks.html#conditional-validation)
[Rails 3 validates rule based on action](http://stackoverflow.com/questions/5899116/rails-3-validates-rule-based-on-action)
[Rails Override Save To Perform Selective Update](http://stackoverflow.com/questions/13238616/rails-override-save-to-perform-selective-update)
[railsのバリデーションに今さら喧嘩を売る](http://d.hatena.ne.jp/tsuyoshikawa/20090325/1237977001)
ラジアンから角度を求める関数をMathオブジェクトに定義する

degrees関数が標準で入ってないのはなんでなのでしょうか・・・。

```js
    Math.degrees = function(radian){
        if(isNaN(radian)){
           return NaN;
        }
        return radian * 360/(2*Math.PI);
    }
```
ブレイクポイントの編集を使ったちょっと変わったデバッグテク

Chromeの開発者ツールやFirebugのブレイクポイントには、多くのデバッガと同じく特定の条件でだけブレイクする設定をするために編集するという機能があります。
ここには式ならなんでも書けるのでいろんなことができます。

この記事ではChromeの開発者ツールを例に挙げていきます。

## ブレイクポイントを編集する
ブレイクポイントの編集は、追加済みブレイクポイントのコンテキストメニューから行うことができます。


![ブレイクポイントのメニュー](https://raw.github.com/umezo/qiita/master/advent-calendar/2012/javascript-mechanco-tips/01_breakpoint_context_menu.png "ブレイクポイントのメニュー")


選択すると、ブレイク条件を設定するための入力欄が表示されます。ここに入力した式の結果がtrueと評価できる値になる場合だけブレイクするようになります。
通常はここにブレイクするための条件を書きます。以下の図の入力だと常にブレイクします。


![ブレイクポイントの編集](https://raw.github.com/umezo/qiita/master/advent-calendar/2012/javascript-mechanco-tips/02_edit_breakpoint.png "ブレイクポイントの編集")



## 編集を使ったテクニック
さて、ここには好きな式を書くことができるので、ブレイク条件を設定する以外にもいろんなことができます。

### 好きな位置でconsole.log
例えば以下のようにconsole.logを仕込むこともできます。この時最後の式にfalseに設定しておくことで絶対にブレイクさせないように出来ます。
![ブレイクポイントを使ったconsole.log](https://raw.github.com/umezo/qiita/master/advent-calendar/2012/javascript-mechanco-tips/03_freedom_edit.png "ブレイクポイントを使ったconsole.log")


### 変数を任意の値で上書き
実行中の変数を無理やり書き換えることもできます。
ブレイクポイントの編集に書いた式は、その行を実行する **前** に評価されるので、次の図の場合は強制的にelse節を実行するように仕向けることができます。
![ブレイクポイントで値の上書き](https://raw.github.com/umezo/qiita/master/advent-calendar/2012/javascript-mechanco-tips/04_overwrite_value.png "ブレイクポイントで値の上書き")


### コールスタックを保存しておく
他にもいろいろ。コールスタックを保存しておき、別のタイミングでチェックするとかもできます。

```javascript
window.__error = new Error().stack
```



## まとめ
ブレイクポイントの編集を使った、デバッグテクを3つほど紹介しました。

使い所は多くないかもしれませんが例えば、以下のようなシーンで使ってみるというのはあると思います。

- リリースした環境でだけエラーが出ているとき
- 学習目的にいろんなサイトで仕組みを調べるとき

正直頻繁に使うテクニックではないですが、たまーーーーーーに使うと楽な時があります。
よければ頭の隅にでも置いておいてください。
Sublime Text 2 を使ってみる (パッケージ編)


前回に引き続き、チュートリアルビデオからの紹介。

AdvancedNewFile
---------------
[lightning-fast-folder-and-file-creation][1]

Sublimeのデフォルトのファイル作成はCmd-Nでできるけど、ファイル保存ダイアログが開いて結構かったるい。
このパッケージは Option-Cmd-Nで、画面下部にテキストボックスが開き、そこで作成するファイル名が指定できる。
また、パスを指定すると存在しないディレクトリは自動で作ってくれるスグレモノ。

SidebarEnhancements
----------------
[sidebar-enhancements][2]

サイドバー右クリックのメニューを拡張するパッケージ。
ブラウザを開いて確認などの便利なコマンドがある。
デフォルトだとファイルをブラウザで開くので、このパッケージを導入した後、サイドバー右クリック - Project - Edit Project Preview URLs で、設定ファイルに下記のように書くと、F12で任意のURLを開いて確認することが可能。

>ビデオだとprojectの設定ファイルに記載することもできるみたいだが、何故かうまく動かなかった。

```javascript
// SideBarEnhancement.json 
{
    "[プロジェクトのパス]": {
        "url_testing":"http://localhost:9000", // F12で起動
        "url_production":"http://localhost:9000" // Option+F12で起動
    }
}
```

プロジェクト毎の設定
------------------
[all-about-project][3]

Sublimeでフォルダを開いてプロジェクトとして保存すると、``プロジェクト名.sublime-project`` というファイルが作成される。
ここに、プロジェクト毎の設定を記載することができる。

例えばタブサイズを変えたりしたかったら、Preference - Settings Default から設定値をコピーし、このファイルに貼り付けて修正するだけで、プロジェクト毎に設定を変えることができる。



[1]: https://tutsplus.com/lesson/lightning-fast-folder-and-file-creation/
[2]: https://tutsplus.com/lesson/sidebar-enhancements/
[3]: https://tutsplus.com/lesson/all-about-projects/
Clangをビルドするとき、プラグインサンプルも一緒にビルドする方法

毎回stack over flowの記事を探すのが面倒になったので書く。

LLVM+Clangをビルドするには、
LLVMのソースのルート/tools/以下に、Clangのソースのルートフォルダの名前を「Clang」にしてぶち込む。
その後、LLVMのソースのルートと同じ階層で

$mkdir build
$cd build
$../LLVMroot/configure
$make BUILD_EXAMPLES='1'

すればはじめからプラグインのサンプルがmakeされた状態になる。
todo.txtとGit flowのコラボするシェルスクリプト

休みの日に個人でtodo.txtでtodoを管理し、git flowで開発しています。

git flowのブランチ名を考えるのが面倒なので、todo.txtの項目名を
ブランチ名にすることにしました。

>$todo-git.sh -l
git flow feature start
.git exist

1.hhihi : dfjap
2.haohf : dhaohfao
3.poda : wweqf
4.hoge : +todotxt

Select number >>> 4

Switched to a new branch ‘feature/hoge’

詳しくは [todo-git](http://momiji-mac.com/wp/soft/todo_git/)に書きました。
Ubuntu 64bitにSkypeをインストール

Skype禁止の会社から、毎日誰かがSkype使ってる会社に転職になりました。

Skypeホームページにあるやつを普通にインストールしてハマったのでメモ。Skypeホームページにあるやつは、32ビット版なので、デバイスドライバまわりで問題が起こります。僕の場合は、bluetoothヘッドセットが使えなかった。まったく動かない分けではなくて、一部のデバイスで問題がでるのでわかりづらいです。


正しくは、aptレポジトリから64ビット版をとってくる。気づいてしまえばどうってことではないので、ちょいネタです。
以下作業。

1) /etc/apt/sources.listをいじって、以下の部分のコメントアウトを外す（Ubuntu12.10の場合）

~~~
deb http://archive.canonical.com/ubuntu quantal partner
~~~
2) ターミナルから以下を実行

~~~
sudo apt-get update
sudo apt-get install skype
~~~

以上です。

クリスマス、さびしくなったらSkype Test Callにでも電話してみよう！
F#で構造的部分型のマネゴト

F#のジェネリクスに制約をつけて、型パラメータに使える型を制限することができます。
それを使って、構造的部分型(structural subtyping)みたいな動きをさせてみようと思います。

```structuralSubtyping.fs
// target : exec メソッドを持つオブジェクト
// num : exec メソッドに渡す値
let inline exec< ^T when ^T : (member exec : int -> string)> target num =
    (^T : (member exec : int -> string) (target, num))

// exec メソッドを持つインターフェイス
type IExec =
    abstract exec : int -> string

// IExec インターフェイスを実装するクラス
type Hoge() =
    interface IExec with
        member this.exec num = (num * 2).ToString()

// exec メソッドを持つクラス
type Fuga() =
    member self.exec num = (num * (-1)).ToString()

let hoge = Hoge()
exec (hoge :> IExec) 2 // #=> val it : string = "4"

let fuga = Fuga()
exec fuga 2 // #=> val it : string = "-2"
```

個人的には Explicit member constraint の勉強になったので良かったですね。
Sublime Text 2 を使ってみる(基本操作編)


先日インストールしたSublimeを本格的に使ってみるべく、チュートリアルのビデオを順に見ていった。その中で自分が有用だと思ったtipsをメモ。


サービスとして登録する
------------------
[services-and-opening-sublime-from-the-terminal][1]

Sublimeをサービスとして登録するのは、Automataで新規のサービスを作成すればよい。
1. 「ファイルまたはフォルダ」を受け取るようにする
2. 「シェルスクリプトを実行」アクション
3. シェルは "/bin/bash" （ビデオでは /bin/zsh.好みで)
4. 入力の引き渡し方法「引数として」（ビデオでは stdin。bashだとこれでは動かなかった)
5. コマンドラインは ``/Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl -n $@``

これでSublimeを開きたいフォルダを右クリック、サービス -> 保存したサービス名 で開くことができる。

置換とインクリメンタルサーチ
------------------------
[multiple-cursors-and-incremental-search][2]

SublimeをVintageモードにしても、viの置換(:s/before/after/)は残念ながら利用できない。かといって、Replaceはかったるすぎるな・・・と思っていたら、コマンドでできた。

1. 置換したい文字列を選択して、Cmd-Dを押す
2. 同じ文字列の"次の"出現が同じく選択される
3. この状態で文字を打ち込むと、選択した分だけ置換される

(1)の時に Ctrl-Cmd-Dを押すと、全ての出現が選択される。

コマンドパレット
---------------
[the-command-palette][3]

Shift-Cmd-Pを押すと、コマンドパレットが表示される。
ここにはメニューで可能なオペレーションが検索・実行できるので、マウスでメニューバーから操作しなくても、同等のオペレーションが可能。（例えばシンタックスの変更とか）

シンボル
--------
[symbols][4]
go-to-anything (Cmd-P) で@を入力すると、ファイル中のシンボル（関数とか変数とか）にジャンプすることができる。(Cmd-R)を入力すると、この状態でパレットが開く（つまりシンボルを検索できる）
強力なのは、go-to-anythingとこのシンボルサーチを組み合わせることができること。例えば、「んーどこかの.javaに含まれてるxxxfooっていうメソッドにジャンプしたい」というときは、Cmd-Pを押して"java@xxxfoo" と入力すると、一覧を表示してくれる。
(リンク先のビデオを見ると凄さが分かります）これはすごい。

キーバインド
----------
[key-bindings][5]
Sublimeのキーバインドは、Preferences -> Key Bindingsから修正することができる。このとき、Defaultを変更してもSublime更新時に上書きされてしまうので、変更したいキーバインドをUserにコピーして修正する。

便利に使えるようになってきました。

[1]: https://tutsplus.com/lesson/services-and-opening-sublime-from-the-terminal/
[2]: https://tutsplus.com/lesson/multiple-cursors-and-incremental-search/
[3]: https://tutsplus.com/lesson/the-command-palette/
[4]: https://tutsplus.com/lesson/symbols/
[5]: https://tutsplus.com/lesson/key-bindings/
gem Koalaをつかってユーザーが特定のページに「いいね！」しているかどうかをチェック

https://github.com/arsduo/koala
おなじみ、facebookのgraph APIをrubyでイジイジできるgem
チェックしたいユーザーのaccess_token（もちろんパーミッションで「いいね！」を取ってこれるようにしておかないとダメですが）があればOK
https://developers.facebook.com/tools/explorer
Graph　APIエクスプローラーでとりあえず試せるので、「アクセストークンを取得」→「User Data Permissions」タブ「user_likes」にチェックが入っていることを確認し「Get Access Token」
アクセストークンをコピーしておく。

```ruby:fb_like_or_not.rb
require "Koala"
client = Koala::Facebook::API.new(access_token)

#URL先を「いいね！」しているかそうでないかをチェック

url = "http://www.livlis.com/"
client.fql_query("SELECT url FROM url_like WHERE user_id=me()").map do |like|
  like["url"]
end.include?(url) #=> true

#おまけ。「いいね！」している数のチェック
client.fql_query("SELECT like_count FROM link_stat WHERE url=\"#{url}\"").first["like_count"] #=> 285
```
git pull を使った vimperator プラグイン最新化方法

[Vimperator Advent Calendar 2012](http://atnd.org/events/34070) 6日目担当 snaka です。

最近、自分の vimperator 環境が安定してしまってネタが無いにも関わらず Advent Calendar に参加してしまいました。

で、久しぶりに vimperator 環境を見直すためプラグインの最新化する必要があったので、`git pull` コマンドを使ってプラグインを最新化方法ついて書きたいと思います。

ちなみにですが、ここに書くような方法よりもっとお手軽にプラグインの最新化を行う方法として [pluginManager.js](https://github.com/vimpr/vimperator-plugins/blob/master/pluginManager.js) という便利プラグインがありますので、そちらを使うことをオススメします（汗）

自分の場合、各プラグインのコミットログをローカルで参照する目的でこのような方法をとっています。

## git clone する

まず、github からプラグインのリポジトリを`git clone`で適当な場所に clone します。

```
$ cd work
$ git clone https://github.com/vimpr/vimperator-plugins.git
```

上記の例では、`~/work/vimperator-plugins`に各ファイルが格納されます。

## .vimperator/plugins 配下にシンボリックリンクを作成

次に、先ほど clone したプラグインのうち実際に使用するプラグインのみ ~/.vimperator/plugin 配下にシンボリックリンクを作成します。

```
$ cd ~/.vimperator/plugin
$ ln -s ~/work/vimperator-plugins/_libly.js 
$ ln -s ~/work/vimperator-plugins/_smooziee.js 
$ ln -s ~/work/vimperator-plugins/copy.js 
$ ln -s ~/work/vimperator-plugins/statusline-toolbar.js 
```

## vimperator を再起動する

vimperator のコマンドラインで`:restart`で再起動です。

[pluginManager.js](https://github.com/vimpr/vimperator-plugins/blob/master/pluginManager.js) が入っていれば、vimperator のコマンドラインで`:pluginmanager list`でインストールされているプラグインの一覧が確認できます。

![command](http://gyazo.com/af1712db0132d339142cd92d432593a0.png)

これでいつでも、`git pull` でプラグインが最新化できる環境ができました。

といっても、[pluginManager.js](https://github.com/vimpr/vimperator-plugins/blob/master/pluginManager.js) がお手軽なんですけどね。

## リンク

- [vimperator-plugins/pluginManager.js (GitHub)](https://github.com/vimpr/vimperator-plugins/blob/master/pluginManager.js)
どの場面でどのundefined判定を使うか

[パフォーマンス](http://jsperf.com/type-of-undefined-vs-undefined/6)の観点から。

## typeof演算子

```js
if (typeof foo === 'undefined') { /* ... */ }
```

* とりあえずエラーにならない
* firefoxで異様に遅い

## global変数のundefined

```js
if (foo === undefined) { /* ... */ }
```

* 上書きされる可能性あり
* 思ったより遅くない

## local変数のundefined

```js
(function(undef) {
  if (foo === undef) { /* ... */ }
})();
```

* chromeだと異様に遅い
* firefoxだと速い
* 圧縮の恩恵を得られる

## void 0

```js
if (foo === void 0) { /* ... */ }
```

* 大抵のブラウザで割と速度が安定している
* IE10だとやけに速い

## まとめ

まぁ、undefined判定自体そんなに重い処理じゃない気がしますが、[Chrome Web Store](https://chrome.google.com/webstore)、[Firefox Market Place](http://www.mozilla.org/en-US/apps/)用のアプリを作るときに極限までチューニングしたいってときには有用かもしれません。

## 参考

* ["Type of undefined" vs "=== undefined"](http://jsperf.com/type-of-undefined-vs-undefined/6)
* [JavaScript：undefined値の判定](http://blog.tojiru.net/article/205007468.html)
twitter-bootstrap-railsとSlimの組み合わせとModalHelperでハマった問題

twitter-bootstrap-railsは標準でSlimにも対応しています。
その中でModalHelperを使った際に発生した問題があったので、対応法について。

***

公式にあるモーダルのサンプルをそのまま使おうとした際に

```sample.html
    <!-- Button to trigger modal -->
    <a href="#myModal" role="button" class="btn" data-toggle="modal">Launch demo modal</a>
     
    <!-- Modal -->
    <div id="myModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
    <h3 id="myModalLabel">Modal header</h3>
    </div>
    <div class="modal-body">
    <p>One fine body…</p>
    </div>
    <div class="modal-footer">
    <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
    <button class="btn btn-primary">Save changes</button>
    </div>
    </div>
```

をSlimとModalHelperで記述すると、以下のようになります。

```sample1.slim
= modal_toggle({:href=>"#myModal", :role=>"button" }) do "ボタン" end

= modal_dialog({:class=>"modal hide fade", :id=>"myModal",:tabindex=>"-1", "role"=>"dialog", "aria-labelledby"=>"myModalLabel", "aria-hidden"=>"true"}) do
  = modal_header() do
    h3 id="myModalLabel" Modal header
  = modal_body() do
    p One fine body…
  = modal_footer() do
    = modal_cancel_button("Close", {"data-dismiss"=>"modal", "aria-hidden"=>"true"})

```

これだと、初期画面表示時にモーダルが表示されてしまいます。原因は

```modal_helper.rb
  def modal_dialog(options = {}, escape = true, &block)
    default_options = {:class => "bootstrap-modal modal"}
    content_tag :div, nil, options.merge(default_options), escape, &block
  end
```

となっていて、classの内容がdefault_optionsで上書きされるためです。
なので、イケてないですが、下記のようにすればうまく動きました。

```sample2.slim
= modal_toggle({:href=>"#myModal", :role=>"button" }) do "ボタン" end

- default_options = {:class=>"modal hide fade", :id=>"myModal",:tabindex=>"-1", "role"=>"dialog", "aria-labelledby"=>"myModalLabel", "aria-hidden"=>"true"}
= content_tag :div, nil, default_options, true do
  = modal_header() do
    h3 id="myModalLabel" Modal header
  = modal_body() do
    p One fine body…
  = modal_footer() do
    = modal_cancel_button("Close", {"data-dismiss"=>"modal", "aria-hidden"=>"true"})
```
Yii framework Extensions


使ったことあったりまだ使ったことなかったりしてるエクステンション(とかビヘイビアとかヘルパー)達を紹介します。


###[Bootstrap](http://www.yiiframework.com/extension/bootstrap/)
Yiiのデフォルトテーマから決別するための筆頭、twitterBootstrapをYii感じにラップしてデフォルトのウィジェットの書き方でナウいデザインにしてくれるのでありがたい。

###[foundation3](http://www.yiiframework.com/extension/foundation3/)
Bootstrapとかユニクロ装備ワロスｗとかちょっと変わったの使いたいならFaundationはいかがでしょうか。

###[rights](http://www.yiiframework.com/extension/rights/)
シンプルな権限管理がYiiのちょろいとこではありますがもっと細かく管理したいなら。

###[yii-environment](http://www.yiiframework.com/extension/yii-environment)
デフォルトだとproductionとdevの2段階しか環境が分けられないのでもっと細かくstagingとか作りたいならコレで設定ファイル使い分けてくれます

###[yii-debug-toolbar](http://www.yiiframework.com/extension/yii-debug-toolbar/)
$_SERVERや$_REQUESTのダンプ、ログ、SQLがブラウザ出力と一緒に良い感じにして見えるのでとても便利。画面右を占有するのでスマホとかだとアレかも。

###[awecrud](http://www.yiiframework.com/extension/awecrud)
gii拡張はいろいろありますが、Bootstrapに対応してるのでBootStrap使ってるなら使っておきたい。

###[facebook-opengraph](http://www.yiiframework.com/extension/facebook-opengraph/)
yiijanのfacebook認証方式が昔のままだったのでコレにかえました。facebookって3回くらいしか書かない程度にはちょろい。

###[yiimongodbsuite](http://www.yiiframework.com/extension/yiimongodbsuite)
MongoDBのARクラスやGii拡張やらのセット。yiiでmongoやってみたかったセット1

###[mongodbhttpsession](http://www.yiiframework.com/extension/mongodbhttpsession/)
mongodbをセッションストアに。yiiでmongoやってみたかったセット2

###[mongodblogroute](http://www.yiiframework.com/extension/mongodblogroute/)
mongodbでロギング。yiiでmongoやってみたかったセット3

###[wunit](http://www.yiiframework.com/extension/wunit)
Selenium無しでコントローラーのテストができる。

###[wizard-behavior](http://www.yiiframework.com/extension/wizard-behavior/)
段階を踏むウィザード系のフォームを作るのにつかえるビヘイビア。を使おう使おうとおもって未だ機会に恵まれてない

###[yiiJqmHelpter](https://github.com/hoshina85/yiiJqmHelper)
jQueryMobileのHTML書くのが面倒くさかったので書いた自作ヘルパー。今でも動くのかは定かではない…！

実はエクステンション豊富なので探せば大概の物はあるよ！
Yiiでスピーディーな開発をしてね！:)

[Extensions | Yii Framework](http://www.yiiframework.com/extensions/)
Paperclipにおけるpng is not recognized by the 'identify' commandというエラーに関して


大分ハマったのでメモ

結論から言うと、僕のケースではImagemagickの対応形式にpngが含まれなかったために起きていた。

環境は

```
CPU: 8-core 64-bit ivybridge
OS X: 10.8.2-x86_64
Xcode: 4.5.2
HOMEBREW_VERSION: 0.9.3
```
です。


##まず

```
brew doctor
```

を実行して、libpngがunlinkを示すようなことが書かれていた。
うん、まずい。いかにもまずそうだ。

とうことで

```
brew link libpng
```

をして、symlinkを作成。んで

```
brew install imagemagick --build-from-source
```

を実行すればokay。

```
convert -list format | grep PNG 
```
の結果からPNGが含まれていることが確認できる。

その後タイトルのようなエラーは出なくなった。


### Reference

http://rick-brain.sblo.jp/article/54579735.html
https://github.com/mxcl/homebrew/issues/14325
Ember.js 配列を参照するプロパティの定義方法

今日は配列を参照するプロパティの定義方法を説明します。
方法は、propertyメソッドの引数に @each を指定します。

```js   
var obj = Ember.Object.create({
  todos: [
    Ember.Object.create({isDone: true}),
    Ember.Object.create({isDone: true}),
    Ember.Object.create({isDone: false}),
  ],
  remaining: function() {
    var todos = this.get('todos');
    return todos.filterProperty('isDone', false).get('length');
  }.property('todos.@each.isDone')
});

obj.get('remaining'); // => 1
obj.get('todos')[2].set('isDone', true);
obj.get('remaining'); // => 0
```

これで、remainingプロパティは、todosに変更が加えられると、自動的に値が更新されます。remainingをさらにテンプレートから参照していると、todosに含まれるisDone == falseの個数が変わるたびに画面表示も更新されます。
ドキュメントによると、Ember.jsが更新通知処理を行うのは以下のタイミングだそうです。

* The isDone property of any of the objects in the todos array changes.
* An item is added to the todos array.
* An item is removed from the todos array.
* The todos property of the controller is changed to a different array.

以上です。今日は詰まることもなく、動作を確認できました。
Confluence XML-RPC APIを使ってIRCからページ操作してみたら便利だったという話 #augj


※これは [Atlassian Advent Calendar 2012 #augj](http://www.zusaar.com/event/444403) の5日目の記事です。

こんにちはこんばんは [@mtgto](http://twitter.com/mtgto) です。遅刻しました。ごめんなさい。

Confluence、便利です。個人的に便利だと思っているのはこんなところ。

- 誰が書いたかを含む編集履歴が残る
- WYSIWYGなのでWiki記法詳しくない人でも書ける
- ページのURLが固定なのであとでタイトルや階層を変更しても問題ない

大変便利なのですがログインが必須だったりするせいでプログラムからページの編集をするにはちょっと大変だったりします。
本日はそんな人にぴったりなConfluence APIのご紹介です。

Confluence APIにはRESTとXML-RPC、SOAPがあります。

- [Confluence REST API documentation](http://docs.atlassian.com/atlassian-confluence/REST/3.2/)
- [Confluence XML-RPC and SOAP APIs](https://developer.atlassian.com/display/CONFDEV/Confluence+XML-RPC+and+SOAP+APIs)

XML-RPCとSOAPはプロトコルの違いだけでできることは同じです。
RESTはまだプロトタイプらしく、情報取得系（ページデータ、検索結果など）しかありません。

でもXML-RPCやSOAPは「ちょっと遊んでみよう」という人には結構敷居が高く感じるのではないでしょうか。
ですがこれをご覧のScalaプログラマの方には上記のAPIに加えまして、こちら！

https://github.com/mtgto/confluence4s

なんとScalaから簡単に（※個人差があります）

- スペース一覧の取得
- スペース内のページ一覧の取得
- ページの作成
- ページの移動

を行うことができるんです！（ただの宣伝でした）

私の普段の使い所としては毎日のMTGの議事録ページを生成するのに使っています。

（イメージ）

```
12:34 (mtgto) 明日の定例ページ作って
12:34 (irc_bot) 2012/12/07 の定例ページを作成しました
12:34 (irc_bot) http://localhost:2990/pages/viewpage.action?pageId=123456
```

あとは定例ページが一ヶ月分溜まったらまとめる機能もつけました。

```
12:34 (mtgto) 11月の日例まとめて
12:34 (irc_bot) 2012/11 の日例ページをまとめました
```

それまでは毎日人がテンプレページをコピーして、タイトルを日付に変えてやっていたので地味に大変だったのでほぼ自動化されて満足しています。

ConfluenceのAPIはとっつきにくいですが、せっかく便利なツールなのでぜひ試してみてはいかがでしょうか？

明日は（今日になっちゃいましたが）[@taichiw0424](http://twitter.com/taichiw0424)さんです。
SublimeText2にコメントとオプション付きのPHPのvar_dumpを表示するsnippetsを追加する

// TODO コメントと、var_dumpのxdebugの表示制限を大きくする設定、
今のファイルと行数、クラス名と関数名を出力するprintとvar_dumpを表示できる
snippetsを追加します。


以下の内容を、Soichiro Yoshimuraの部分だけ自分の名前に変更にして
.sublime-snippetという拡張子を付けて
Macなら
~/Library/Application\ Support/Sublime\ Text\ 2/Packages/User
Windowsなら
C:\Users\（あなたのパソコンのユーザー名のフォルダ）\AppData\Roaming\Sublime Text 2\Packages\User
に保存をします。


```xml:php_commented_var_dump.sublime-snippet
<snippet>
	<content><![CDATA[
// TODO var_dumpを消す！ by Soichiro Yoshimura
ini_set('xdebug.var_display_max_data', 1048576);
ini_set('xdebug.var_display_max_depth', 20);
print_r("\n!DEBUG! var_dump at " . __FILE__ . "(" . __LINE__ . ")" . ": " . __CLASS__ . "#" . __FUNCTION__ . "\n");
var_dump(${1:varname});
]]></content>
	<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
	<tabTrigger>var_</tabTrigger>
	<!-- Optional: Set a scope to limit where the snippet will trigger -->
	<scope>source.php</scope>
	<description>commented var_dump</description>
</snippet>
```

これで、var_と入力してtabキーを押すことで。

```php
// TODO var_dumpを消す！ by Soichiro Yoshimura
ini_set('xdebug.var_display_max_data', 1048576);
ini_set('xdebug.var_display_max_depth', 20);
print_r("\n!DEBUG! var_dump at " . __FILE__ . "(" . __LINE__ . ")" . ": " . __CLASS__ . "#" . __FUNCTION__ . "\n");
var_dump(varname);
```

がphpのコード内に展開されます。なおカーソルの選択はvarnameにあった状態となっています。
Docutils と Ruby で快適ドキュメント生活

Docutils と Ruby で快適ドキュメント生活
=======================================

まったく新しいネタではないですが、以前作ったものを整理するためにadvent calendarに参加します。

0. reSTが好きです
-----------------

まず私は setext ( structured text ) が好きでした。したがって当然のように reST が好きです。細かいことを言わなければほとんどの場合は Markdown でまかなえたりするのですが、Office ファイルにして印刷用に調整を入れる場合は reST を使っています。

reST なので当然

 * Python
 * docutils

を使います。インストール方法は端折ります。簡単です。

1. rst2html.py + guard でとにかく書く
-------------------------------------

まず最初の段階は「手早くプレビューを回す」です。

そこで reST と同じかそれ以上に好きな Ruby のツールである guard を使います。これはファイルの変更を監視して様々な処理を行うためのライブラリで、ここでは

 1.  guard-shell から rst2html.py を叩いて HTML を生成
 2. できた HTML をブラウザで開いてプレビューするが、HTML の生成を監視して guard-livereload で自動 reload

の二つの仕事を担ってもらいます。実際に利用するライブラリは以下の3つです。

 * [guard/guard](https://github.com/guard/guard)
 * [guard/guard-shell](https://github.com/guard/guard-shell)
 * [guard/guard-livereload](https://github.com/guard/guard-livereload)

Web サーバは適当に Python の SimpleHTTPServer や Ruby の WEBrick などを使います。

 * 以下のような Gemfile, Guard を用意
 * guard を起動
 * 内容はなんでもいいので HTML を生成して、livereload で capture
 * あとはひたすら .rst ファイルを編集しまくるだけ

です。

[reST-writing environment with realtime HTML-preview — Gist](https://gist.github.com/1350638)

<script src="https://gist.github.com/1350638.js"> </script>

2. rst2odt.py + rake で odt を生成して仕上げ
--------------------------------------------

プレビューで内容に問題がなければ今度は拙作の

[wtnabe/rst2odt_stylesheet](https://github.com/wtnabe/rst2odt_stylesheet)

を利用します。これを git clone して対象の rst ファイルを sample.rst に rename して置いておきます。こいつのできることは

 * rst2odt.py を叩いて reST から odt ファイルを生成
 * odt ファイル生成時に利用する stylesheet をコンパイル
     * stylesheet の調整を自分で XML で行うこともできる
 * open コマンドでできあがった odt ファイルを開く

です。残念ながら reST ファイル、odt ファイルとも sample という名前に決め打ちのまま早2年放置となっていますし、open はこれを抽象化するライブラリを利用した方がいいだろうなと思いつつ自分は Mac しか使っていないのでそのままです。

odt ファイルを開いたらあとは印刷用にスタイルの調整をしつつ、この段階で間違いに気づいたら rst ファイルの修正を行い、その都度


    rake open

するという流れになります。

最後は LibreOffice ( OpenOffice.org ) から PDF エクスポートすると共有しやすいと思います。

3. まとめ
---------

あまり統一感はないですし、拙作の rst2odt_stylesheet rake タスクの完成度が低くてアレですが、少なくとも Word でいきなり文章書くよりははるかに楽にドキュメントが書けると思います。

reST は前身の setext の特徴の一つである「メールにそのまま埋め込んでも不自然でない」を体現しつつ table の記法も整理されているので、とても応用範囲の広い記法です。またこの方法で odt に変換したのちに PDF に export すると、最終的にできあがった PDF にも文章構造が反映されるので、長いドキュメントでもそれなりに読みやすくなるのもメリットの一つです。

猫も杓子も Markdown の昨今ですが、ぜひ reST でドキュメントを書いてみてはいかがでしょうか。

惜しいのは Markdown のように処理系が各言語で出そろっていないところでしょうか。実質 Python 専用なので Trac で利用することはできても Redmine から利用するのは難しいと思います。誰か移植しないかなー(ﾁﾗｯﾁﾗｯ
Capybara(selenium)でスクリーンショットを取る

Capybara(selenium-webdriver)でスクリーンショットを取る

```ruby:
page.driver.browser.save_screenshot "tmp/capybara/screenshot#{Time.now.strftime("%Y%m%d%H%M%S")}.png"
```

普段はhtmlを出力する
`save_and_open_page`
で十分な気もする

Capybara 2.0 では`page.save_screenshot 'screenshot.png'`という書き方ができるらしい

[参考:Screenshots with Capybara](http://www.opinionatedprogrammer.com/2012/01/screenshots-with-capybara-selenium/)

前からできることは分かっていたが、あまり使いどころがなく使っていなかった。
使ったきっかけはJenkins(on Ubuntu)でseleniumを動かす際に、ブラウザを画面なしで動かすheadless(xvfb)の環境でデバッグが必要になったため。
Windows環境でtwitter-bootstrap-railsを利用する

Rails＋Rubymine＋Bootstrap＋SlimをWindows環境で開発するためにしたこと。
今回は環境構築

***

twitter-bootstrap-railsはLESSを使用するため、therubyracerが必須となります。

Railsの場合は、Bundleを使ってのGemのインストールすることが基本なので、
ローカルファイルを適用した利用方法についてまとめてみた。

1.V8.dllのインストール
	下記のサイトより「V8.dll」をダウンロードします。ダウンロードしたファイルは、
	Pathが通っているフォルダにコピーします。
	(自分は参考にしたサイトより、C:\Windowsにコピー)
	[V8.dll](https://github.com/downloads/stereobooster/therubyracer/lib_v8.3.11.9.zip "lib_v8.3.11.9.zip")

2.therubyracer-0.11.0beta1-x86-mingw32.gemをローカルに展開
	下記サイトよりWindows版therubyracerをダウンロードしますします。
	[therubyracer-0.11.0beta1-x86-mingw32.gem](https://github.com/downloads/stereobooster/therubyracer/therubyracer-0.11.0beta1-x86-mingw32.gem "therubyracer-0.11.0beta1-x86-mingw32.gem")
	
	ダウンロード後、以下のコマンドを実行して解凍します。
	gem unpack therubyracer-0.11.0beta1-x86-mingw32.gem
	
	できたフォルダ「therubyracer-0.11.0beta1-x86-mingw32」を
	Railsのプロジェクトフォルダの一つ上の階層に配置します。

3.Gemfileの設定
	Railsプロジェクトの作成をして、Gemfileの設定について、以下のとおりにします。


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

gem 'rails', '> 3.2.1'

gem 'sqlite3-ruby', '> 1.2.0', :require => 'sqlite3'

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails',   '~> 3.2.3'
  gem 'coffee-rails', '~> 3.2.1'
  gem 'uglifier', '>= 1.0.3'
end

gem 'jquery-rails'

gem "slim"
gem "slim-rails"

# OSのプラットホームを判定してtherubyracerのインストールを実施するようにします
if RUBY_PLATFORM =~ /mingw/
  # pathでの設定はGemfileを基準とした相対パスでないと
  # うまくいきませんでしたので、以下のようになります
  gem 'therubyracer', :path => '../therubyracer-0.11.0beta1-x86-mingw32'
else
  gem 'libv8'
  gem 'therubyracer'
end

gem 'less'
gem 'less-rails'
gem 'twitter-bootstrap-rails'
```

BundleでGemをインストールします

```console
bundle install --path vendor/bundle
```

これでインストールが実行されます。
インストール時にGitのエラーが発生しますが、原因を調べていません。

```console
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git

これで、Bootstrapが利用可能になりますので、RailsコマンドでBootstrapをassetsにセットしてください。
```

```console
$ rails g bootstrap:install
      insert  app/assets/javascripts/application.js
      create  app/assets/javascripts/bootstrap.js.coffee
      create  app/assets/stylesheets/bootstrap_and_overrides.css.less
        gsub  app/assets/stylesheets/application.css
        gsub  app/assets/stylesheets/application.css
```
既存のレイアウトをslimにします。

```console
$ rails g bootstrap:layout application ﬂuid
      create  app/views/layouts/application.html.slim
```

最後に「bootstrap_and_overrides.css.less」以下の項目を追加します。
(これを追加しないと、bundle exec rake assets:precompileでエラー発生)

```bootstrap_and_overrides.css.less
@fontAwesomeEotPath_iefix: asset-path("fontawesome-webfont.eot#iefix");
```
Unityのサイコロのアセットの紹介

Dice Pack Light
http://u3d.as/content/wyrm-tale-games/dice-pack-light/1tw
このアセットの紹介です．

サイコロのテクスチャとサイコロの目の判定プログラムがセットになっています．
また，サイコロは６面ダイスと１０面ダイスがあります．

importするとDemoもあるのでぜひ見てみてください．

Dice->Resources->Prefabsの中にサイコロのprefabがあります．
この中のd6のprefabに次のScriptを加えてもらうとサイコロの目をConsoleに吐き出せます

using UnityEngine;
using System.Collections;

public class Sample : MonoBehaviour {
	
	public int value;
	private Die_d6 die;
	// Use this for initialization
	void Start () {
		//最初にランダムで回転させる
		transform.rotation = Random.rotation;
		die = gameObject.GetComponent<Die_d6>();
	}
	
	// Update is called once per frame
	void Update () {
		value = die.value;
		Debug.Log(value);
	}
}

と，いうことで，サイコロを使ってボードゲームなどを作ろうと考えている方はぜひこちらのアセットを使ってみてください．
Ember.js Viewの合成

今日はテンプレートを組み合わせて複雑なテンプレートを構築する方法を説明します。

まずJavaScriptのコードを見てみましょう。

```js
var App = Ember.Application.create();

App.UserView = Ember.View.extend({
  templateName: 'user',
  lhs: 8,
  firstName: "Albert",
  lastName: "Hofmann",
  infoView: Ember.View.extend({
    templateName: 'info',
    posts: 25,    hobbies: "Riding bicycles",
    subInfoView: Ember.View.extend({
      templateName: 'subInfo',
      country: 'Japan'
    })
  })
});

App.UserView.create().append();
```

ViewクラスがUserView -> infoView -> subInfoView と階層構造を作っています。
それぞれのViewクラスは、テンプレートを指定するためのテンプレート名をtemplateNameメンバで指定します。
create().append() メソッドチェインで、明示的に描画を行なっています。
次にテンプレートを見てみます。

```html
  <script type="text/x-handlebars" data-template-name="user">
    {{firstName}} {{lastName}}
    <br>
    {{view infoView}}
  </script>

  <script type="text/x-handlebars" data-template-name="info">
    <b>posts:</b> {{view.posts}}
    <br>
    <b>hobbies:</b> {{view.hobbies}}
    <br>
    {{view view.subInfoView}}
  </script>

  <script type="text/x-handlebars" data-template-name="subInfo">
    <b>country:</b> {{view.country}}
  </script>
```

それぞれのViewのためのテンプレートを1つずつ定義しています。
{{view}}ヘルパを使って、子供Viewを指定しています。
子供Viewのテンプレートでは、変数スコープは親Viewのままになります。子供Viewのインスタンスを参照するためには、view変数のメンバにアクセスします。(このあたり、直感に反する動きで、かなり理解に手こずりました。)

> viewのコンテキストの扱いが最近変わったようです。
> https://gist.github.com/2494968

このプログラムは以下のHTMLを出力します。(バインディングのためのマークは省略しています)

```html
    Albert Hofmann
    <br>
    <b>posts:</b> 25
    <br>
    <b>hobbies:</b> Riding bicycles
    <br>
    <b>country:</b> Japan
```

Viewの階層構造を表現するためでなく、テンプレート部品化のためにテンプレートを分けることもできます。
サンプルを見てみましょう。


```js
var App = Ember.Application.create();

App.UserView = Ember.View.extend({
  templateName: 'user',
  lhs: 8,
  firstName: "Albert",
  lastName: "Hofmann",
  posts: 25,
  hobbies: "Riding bicycles",
  country: 'Japan'
});

App.InfoView = Ember.View.extend({
    templateName: 'info'
});

App.SubInfoView = Ember.View.extend({
  templateName: 'subInfo',
});

App.UserView.create().append();
```

テンプレートを指定するためだけに、InfoView, SubInfoViewを定義しています。
続いてテンプレートのコードを見てみましょう。

```html
  <script type="text/x-handlebars" data-template-name="user">
    {{firstName}} {{lastName}}
    <br>
    {{view App.InfoView}}
  </script>

  <script type="text/x-handlebars" data-template-name="info">
    <b>posts:</b> {{posts}}
    <br>
    <b>hobbies:</b> {{hobbies}}
    <br>
    {{view App.SubInfoView}}
  </script>

  <script type="text/x-handlebars" data-template-name="subInfo">
    <b>country:</b> {{country}}
  </script>
```

{{view}}ヘルパの引数には、Viewクラスへのグローバルパスを指定します。
Viewクラス名が大文字で始まっていないと、Ember.jsはグローバルパスと認識しないようなので注意してください。
今回は子供Viewで参照するのは、元ViewであるUserViewのメンバなので、viewメンバ経由でなく、直接変数を参照しています。
このプログラムは以下のHTMLを出力します。(バインディングのためのマークは省略しています)

```html
    Albert Hofmann
    <br>
    <b>posts:</b> 25
    <br>
    <b>hobbies:</b> Riding bicycles
    <br>
    <b>country:</b> Japan
```

今日はViewを階層化する方法について見てきました。
変数のスコープの扱いが私の直感と違っていたため、理解するのに苦労しました。
このあたり、Ember.jsの学習の鬼門になりそうな気がします。
また、テンプレートから実際にはないメンバを指定した時にエラーなどを出力してくれないため、原因の特定に手間取りました。この奥ゆかしい挙動は、バグの原因特定を困難にするので、変えて欲しいところです。
Intel TBBのダミー実装ヘッダファイル

なぜコレを作ったか既に忘れてしまいましたが、[Intel Threading Building Blocks(TBB)](http://threadingbuildingblocks.org/)のダミー実装です。Boost Software Licenseで公開します。

TBBを利用できない開発環境でも、無理やりTBB使用コードをコンパイルしたいときに使えます（tbb::flowなど一部機能は対応しません）。当然シングルスレッド動作にしかなりませんよ！

https://gist.github.com/2280921
RubyOnRailsの「named_scope」をDjangoで実現する方法


## 概要
RubyOnRailsのnamed_scopeみたいなことをDjangoでやってみた

## コード

```python
from django.db.models.query import QuerySet
from django.db import models 

class PlayerScopeMixin(object):
	"""
    Player Class Scope Chain Mixin
	"""

    @property
    def newcomer_time(self):
		"""
		:return: 新規プレイヤー期間のスタート時間(現在から一週間前)
		"""
       date_obj = datetime.datetime.now(utc) - datetime.timedelta(7)
       return date_obj

	def by_active(self):
		"""
		アクティブ状態のレコード取得
		:return: QuerySetのfilter
		"""
		return self.filter(active_flg = True)

    def by_newcomer(self, newcomer_flg=True):
        """
        新規プレイヤー判定によるレコード抽出
		 :param limit_flg: True(新規プレイヤー) / False(非新規プレイヤー) 
        :return: QuerySetのfilter
        """
        return self.filter(created_at__gt=self.active_limit_time)

	def by_active_newcomer(self):
        """
        新規アクティブユーザー
        """
        return self.by_active().by_newcomer()




class PlayerQuerySet(QuerySet, PlayerScopesMixin):
	"""
	PlayerQuerySet
	"""
	pass


class PlayerManager(models.Manager, PlayerScopeMixin):
	"""
	PlayerManager
	"""
	def get_query_set(self):
        return PlayerQuerySet(self.model, using=self._db)


class Player(models.Model):
	class Meta:
		app_label = 'player'
	
	active_flg = models.BooleanField(default=False)
	created_at = models.DateTimeField(auto_now_add=True)
	updated_at = models.DateTimeField(auto_now=True)
```

## コードの実行例
``` python
> Player.by_active_newcommer() == Player.by_active().by_newcomer()
```
Androidでmockitoを使ったJUnitの単体テストを動かす


Androidの開発でmockitoを使おうとして死んだことありませんか? そんな紳士淑女の皆さんに朗報です。dexmakerというライブラリを使うことで、な、なんとmockitoを使った単体テストを動かすことが出来るようになりす。使い方は簡単、dexmakerをダウンロードしてきてmockitoと一緒に外部jarの設定をするだけです。spyとかまでガッチり使い込んだ訳じゃないですが、今のところ普通にモック作って、普通にwhenしたりverifyしたりする分には動いています。Androidでもmockitoしたい方は、一度お試しになっては、いかがでしょうか?

* http://code.google.com/p/dexmaker/ で、それっぽいjarをダウンロードする
* JUnit3系のノリでテストクラスを作るけど、extends TestCaseの代わりに extends InstrumentationTestCase を使う
* Android JUnitから実行する

以下、サンプルソース

``` java
package test;
import java.util.ArrayList;

import android.test.InstrumentationTestCase;
import static org.mockito.Mockito.*;

public class HogeTest extends InstrumentationTestCase {
	public void testHoge () {
      ArrayList hoge = mock(ArrayList.class);
      when(hoge.toString()).thenReturn("hoge");
      assertEquals ( "hoge", hoge.toString() );
    }	
}
```
[1, 2, 3]から[[1, 2], [2, 3]]を得る	

```ruby
a = [1, 2, 3]

# v1
(a.size-1).times.map {|i|
  [a[i], a[i+1]]
}

# v2
a[0..-2].zip(a[1..-1]) # a.size > 0 でないと駄目

# v3 by akicho8さん
a.each_cons(2).to_a # akicho8
```

もっと読みやすい方法を知りたい．→`each_cons`がよさそう
Google Calendar APIをJavaScriptで使う

# 準備
[Google Console](https://code.google.com/apis/console/)にログイン
アプリケーションを登録（Webアプリケーション）
※ただし、Redirect URIsは空にして登録すること！

## 後で使うのは
- Client ID for web applicationsの欄のClient ID
- Simple API Accessの欄のAPI key

# 認証処理

認証用のボタンを用意

``` html
<button id="authorize-button" style="visibility: hidden">Authorize</button>
```

``` javascript
var clientId = '準備したClientID';
var apiKey = '準備したAPI key';

// とりあえず、怖いので、カレンダーを読むだけの設定
// https://www.googleapis.com/auth/plus.meは不要かも。。

var scopes = ['https://www.googleapis.com/auth/plus.me',
                   'https://www.googleapis.com/auth/calendar.readonly'];

function handleClientLoad() {
        // 予めAPI Consoleで設定したAPIキーを設定
        gapi.client.setApiKey(apiKey);

        // すでに認証済みかの確認をする。
        window.setTimeout(checkAuth,1);
}

function checkAuth() {
        // immediateをtrueで指定することで、未認証の場合、ただちにエラーが返り、
        // handleAuthResultが呼び出される。
        gapi.auth.authorize({client_id: clientId, scope: scopes, immediate: true}, handleAuthResult);
}

function handleAuthResult(authResult) {
        var authorizeButton = document.getElementById('authorize-button');
        if (authResult && !authResult.error) {
          authorizeButton.style.visibility = 'hidden';
          makeApiCall();
        } else {
          authorizeButton.style.visibility = '';
          authorizeButton.onclick = handleAuthClick;
        }
}

function handleAuthClick(event) {
        // ここで、ポップアップ画面を表示して、OAuth認証を行う。
        gapi.auth.authorize({client_id: clientId, scope: scopes, immediate: false}, handleAuthResult);
        return false;
}
```

# Google Calendar APIを使う

``` javascript
function makeApiCall() {
        var restRequest = gapi.client.request({
            'path': '/calendar/v3/users/me/calendarList'
        });
        restRequest.execute(function(calendarList) {
          console.dir(calendarList);
        });
}
```

# ただ、現実的には...

カレンダーリストよりカレンダーIDを取得してこのIDを指定してイベントを取得する等の処理
を実装する必要がある。

## さらに

イベントの取得で、デフォルトだと
日付の指定して取得した場合、繰り返しイベントの返され方が
イマイチであったりと、

## そんなわけで、サンプル作ってみた

- https://abrakatabura.hatenablog.com/entry/2012/12/05/065439

# Qiitaの関連する投稿

- [JavaScriptのみでGoogle Driveに動的にテキストや画像等を保存する](https://qiita.com/kjunichi/items/552f13b48685021966e4)

# 関連記事

- [EventFeedDemoがよさげ](https://abrakatabura.hatenablog.com/entry/2009/09/15/224259)
- [herokuでbotkitを動かしGoogle Calendar APIを使う](https://abrakatabura.hatenablog.com/entry/2016/02/08/095744)
- [CORSでGoogle Driveにアクセス](https://abrakatabura.hatenablog.com/entry/2013/03/14/065948)
_.templateを複数回使う時はコンパイルした方がいい

[underscore.js](http://underscorejs.org/) には `_.tempalte` というテンプレートエンジンがついているが、これを使う時にコンパイル結果を使いまわすことができる

```js
var html = '<span><%= name %></span>';

// 利用後そのままコンパイル結果を捨てる
_.tempalte(html, { name: 'qiita' }); //=> <span>qiita</span>

// コンパイルした結果を使いまわす
var tmpl = _.template(html);
tmpl({name: 'qiita'}); //=> <span>qiita</span>
```

直感的にコンパイルしたものは使いまわした方がよいことは分かるが、果たしてどれくらい違うのか？
測定してみた。

## 測定コード

```js:underscore-tempalte-test.js
var html = '\
  <ul>\
    <% _.each(items, function(item) { %>\
      <li><%= item %></li>\
    <% }); %>\
  </ul>';

var items = [];
for (var i = 0; i < 10; i++) { items[items.length] = i; }

JSLitmus.test('with compile', function (count) {
  var tmpl = _.template(html);
  while(count--) { tmpl({items: items}); }
});

JSLitmus.test('without compile', function (count) {
  while(count--) { _.template(html, {items: items}); }
});
```

## 結果

左から Firefox, Opera, Chromeの結果

![](http://cdn-ak.f.st-hatena.com/images/fotolife/y/yuku_t/20121205/20121205180244.png?1354698171)

ちょっと洒落にならないくらい違った。2回以上使うならコンパイルして使いまわすぐらいの気持ちでいくのがよさそう。
そしてやはりChromeは他の2つより純粋な JS の速度が速い。

### 参考

- [JSLitmusを使ってJSの性能測定をする](http://qiita.com/items/590c11c7f87006194e2b)
JSLitmusを使ってJSのパフォーマンス測定をする

計測しないで推測ばかりしているアホの子だったから本腰いれて JavaScript のパフォーマンス測定環境について調べた。
結論として [JSLitmus](http://www.broofa.com/Tools/JSLitmus/) を使うとかなり簡単にできる。

##使い方

1. jslitmus.js をロードする
2. JSLitmus.test の第二引数に測定したい関数を渡す
3. #jslibmut_container エレメントを作る

簡単！

##例

```html
<!DOCTYPE html>
<html>
  <head>
    <script src='jslitmus.js'></script>
    <script src='sample.js'></script>
  </head>
  <body>
    <div id='jslitmus_container'></div>
  </body>
</html>
```

```javascript:sample.js
// グローバル変数とローカル変数に対するアクセス速度の違いを測定する

var global_var = 1;
JSLitmus.test('global', function(count) {
  while (count--) { global_var++; }
});

JSLitmus.test('local', function(count) {
  var local_var = 1;
  while (count--) { local_var++; }
});
```

ここで第二引数に渡された関数の実行時に `count` というのが渡されてそれを `while (count--) { … }` としているが、これは JavaScript の関数呼び出しのコストを抑えるために行う作法のようなものなので基本的にこのフォーマットに従うのがよい。

##実行してみる

先ほど作ったhtmlをブラウザで読み込む。すると以下のようになっているはず。

![](http://cdn-ak.f.st-hatena.com/images/fotolife/y/yuku_t/20121205/20121205173045.png?1354696257)

ここで `Rub Tests` ボタンを押すと何やら動き出して、しばらく経つと以下のようになる。

![](http://cdn-ak.f.st-hatena.com/images/fotolife/y/yuku_t/20121205/20121205173046.png?1354696357)

棒は実行できた回数を表すので長いほど速度が速い（沢山試行できた）ことを意味する。このことからグローバル変数へのアクセスよりローカル変数へのアクセスの方が（Chromeでは）4倍近く速いということが分かる。

##Tips

###自動実行する

デフォルトで `Run Tests` ボタンをクリックしないと計測が開始しない。これを読み込み完了と同時に実行するようにするには

```js
window.onload = function() {
  JSLitmus.runAll();
};
```

とどっかに書いておけばOK.

###複数ブラウザで同時実行

参考： [JSのテストファイルを複数のブラウザで開いて手軽に確認する](http://qiita.com/items/161491a6a324bda3835b)

##おわりに

みんなでどんどん計測しよう！
Twitter 1.1 search API

Twitter 1.1 APIでハマったのでメモ。

## twitterAPI呼出用メソッド
```php
public function api($cmd, $params = array()) {
    $url = "https://api.twitter.com/1.1/" . $cmd;
    try {
        $this->_oauth->setToken("oauth_token", "oauth_token_secret");
        $this->_oauth->fetch($url, $params, OAUTH_HTTP_METHOD_GET);
        $json = json_decode($this->_oauth->getLastResponse(), true);
    } catch (Exception $e) {
    }
    return $json;
}
```

## 間違い
```php
$this->api("/search/tweets.json", array("q" => "test"));
```
$url が https://api.twitter.com/1.1//search/tweets.json の場合
なぜか、検索結果のデータ取得可能。
が、APIのrate limitは減らない。最大15回。（15分で解除）
エラー時（16回目以降）のhttp Response
Invalid auth/bad request (got a 429, expected HTTP/1.1 20X or a redirect)

## 正解
```php
$this->api("search/tweets.json", array("q" => "test"));
```
$url が https://api.twitter.com/1.1/search/tweets.json の場合
もちろん、検索結果のデータ取得可能。
ちゃんと、APIのrate limitも減る。最大180回。（15分で解除）
「今どんな気持ち？」をアレする user script

Facebook が急にうざくなったので

![太一](http://gyazo.udzura.jp/480c33ba468390f81f1384921a529a63.png)

困って書いた。

![太一after](http://gyazo.udzura.jp/992e7fbcccc85aa0a10df1b9c32d45c2.png)

```javascript:kokubun.user.js
// ==UserScript==
// @name ねえねえ今どんな気持ち？
// @namespace http://udzura.jp/kokubun
// @description 国分太一fier
// @include https://www.facebook.com/*
// @version 0.0.1.20121205
// ==/UserScript==

(function () {
  function pingTaichi () {
    var elms = document.getElementsByTagName('textarea');
    if(elms.length != 0) {
      for(i = 0; i < elms.length; i++ ) {
        var elm = elms[i];
        if(elm.getAttribute('placeholder') === '今どんな気持ち？') {
          elm.setAttribute('placeholder', 'ねえねえ今どんな気持ち？');
          elm.value = 'ねえねえ今どんな気持ち？';
        }
      }
    }
  }
  setInterval(pingTaichi, 300);
})();
```

クロ〜ムとファイヤホックスで動いてた気がする。

## install

* https://gist.github.com/raw/4212643/06683a1a9375e5a3bfb5f6be4881993d784daa2c/kokubun.user.js

## fork

文言を変えたい時は

* https://gist.github.com/4212643

をforkしてください

## `document.getElementsByTagName('textarea')`

が、 `forEach` を持ってなくて、代わりに `iterator()` と言うのがあったので使っていたんだけど、FireFoxでしか動かなかった
Plugin load


CakePHP 2.2.3


Plugin にあるクラスを読む方法。

Plugin にある Component のクラスを継承したかったが、 http://book.cakephp.org/2.0/ja/plugins.html には書いてなくてハマったのでメモ書き。




```php
<?php
	// app/Controller/Component/SelfComponent.php
	//   Plugin/hoge/Controller/Component/hogeComponent.php を読み込み、hogeComponent クラスを読む
	App::uses("hogeComponent", "hoge.Controller/Component");
```
Rubyを使ってタイ語の表示文字単位で文字列を区切る

タイ語の"พี่ชาย" (日本語で兄の意味)は表示上は4文字ですが、最初の文字"พี่"が3つのUCS("e1e", "e35", "e48")から構成されており、単純にsplit(//)をしただけでは6文字に分解されてしまいます。

いいやり方が思いつかなかったのでいったん全てばらしたものを再度走査して単独で成立しない文字を直前のものにくっつけて処理しました。
もっと効率的な書き方・Rubyらしい書き方があればご教授ください。

```ruby:disp_ucs_thai.rb
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

ca = "พี่ชาย".split(//) #  ["e1e", "e35", "e48", "e0a", "e32", "e22"]
ca_length = ca.length

i = 0
while i < (ca_length - 1)
  case ca[i+1]
  when "\u0e31", "\u0e34".."\u0e3A", "\u0e47".."\u0e4e" then
    ca[i] = ca[i] + ca[i+1]
    ca.delete_at(i+1)
    ca_length = ca.length
  else
    i = i+1
  end
end

ca.each do |ch|
  clist = ch.each_codepoint.map {|cp| "U+" + cp.to_s(16)}
  puts ch + " [#{clist.join(' ')}]"
end
```

```bash
$ ruby disp_ucs.rb
พี่ [U+e1e U+e35 U+e48]
ช [U+e0a]
า [U+e32]
ย [U+e22]
```

参考 ⇒ [複雑なテキスト配置 - Wikipedia](http://ja.wikipedia.org/wiki/%E8%A4%87%E9%9B%91%E3%81%AA%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E9%85%8D%E7%BD%AE)
Capybara には post するメソッドは無い


Capybara はブラウザ上でのユーザの操作をシミュレートするのを目的としている。
そのため visit は GET メソッドにのみ対応している。

なので POST したい場合は、ユーザインターフェースの操作をシミュレートして click するか、 RackTest のインターフェースを使って POST させるか、素直に RackTest の API を使う。

## 参考
[Capybara and testing APIs — Elabs](http://www.elabs.se/blog/34-capybara-and-testing-apis)