OmniAICreator/Qiita-1.07M huggingface dataset:
cddで別セッションのディレクトリに手軽に移動する

ファイルの編集やコンパイル、デバッグなど作業に応じて複数の端末を開く場合、ローカル環境ではターミナルエミュレータのタブ機能で十分ですが、より柔軟な端末操作を求めてターミナルマルチプレクサを使う事が多いと思います。

ここではターミナルマルチプレクサを使って複数の端末で作業するときのディレクトリ移動にとても便利な `cdd` を紹介します。

`chpwd_recent_dirs` の設定と `cdr` 関数によってディレクトリの移動履歴は別セッションでも手軽に利用できますが、すぐ直前のディレクトリに移動するときには補完候補を絞り込む必要があります。また `SHARE_HISTORY` を有効にしてヒストリファイルを共有している場合でも、そのディレクトリに `cd` したときの履歴を絞り込む手間が発生します。

思うことは同じで、GNU Screen との組み合わせでディレクトリ移動を楽にするスクリプトが公開されています。

* [cdd - screen の別WINDOWのカレントディレクトリに移動する zsh スクリプト - 2nd life](http://d.hatena.ne.jp/secondlife/20080218/1203303528)

> screen を使ってると、別の作業している WINDOW のカレントディレクトリに移動したくなることってありませんか？私は月1000回ぐらいあります。

さらにこれをベースに補完システムを compsys に変更して tmux にも対応し、セッション名ごとに異なる履歴を保存するようにして bash でも動作するように機能拡張されたものが公開されています。

* 
[cdd を tmux, bash, multi session +α に対応した - カワイイはつくれる](http://blog.m4i.jp/entry/2012/01/26/064329)

> screen を使う上でほぼ必須とも言っていいコマンド cdd を tmux 対応にし機能をいくつか追加しました。

今回はこちらのバージョンを GNU Screen と zsh で使う場合を例に説明します。

```bash:zsh
% git clone git://github.com/m4i/cdd
```

```.zshrc
autoload -Uz compinit && compinit

zstyle ':completion:*' menu select
zstyle ':completion:*:descriptions' format '%BCompleting%b %U%d%u'

source cdd/cdd

typeset -ga chpwd_functions
chpwd_functions+=_cdd_chpwd
```

このように設定して複数のシェルを開いていろいろ作業している状態で `cdd <TAB>` すると、

```bash:zsh
% cdd <TAB>
Completing cdd directory
1        -- ~/.vim/bundle/vimproc
2        -- ~/dotfiles/dot.vim
3        -- /System/Library/Frameworks/JavaVM.framework/Versions
4        -- /Volumes
5        -- ~/dotfiles/dot.screen
6        -- ~
7        -- ~/dotfiles
8        -- ~/git
last  0  -- ~/work
Completing cdd command
add     -- add the directory to ~/.zsh_cdd_pwd_list
delete  -- delete the directory from ~/.zsh_cdd_pwd_list
```

こんな感じに各端末で最後に移動したときに記録されたディレクトリが補完候補として出てきます。数字を続けて入力して `ENTER` でそのディレクトリに `cd` できます。もちろんメニュー補完としても動作します。

特に便利なのが、引数を入力せずに `cdd<ENTER>` で最後に記録されたディレクトリに移動する機能です。（上記の例では `last` と表示されている `~/work` に移動する）

あるディレクトリでファイルを編集していて、エディタの外からそれに対するコマンドなどを実行しようとしたときに、新しい端末を開いてすぐに移動できます。（ここでは、それエディタの○○機能でできるよ、という話はしません）

他にもディレクトリを記録したファイル `$CDD_FILE` を編集することなく `cdd delete 数字` で削除したり、`cdd add /tmp` などとして任意のディレクトリをその名前で登録したりできます。

日々の作業に欠かせません。

grep で行番号を表示するオプション `-n` をエイリアスなどで付けているとエラーになる場合があります。そのような時は [このような修正](https://github.com/yoshikaw/cdd/commit/38f14a7eeb77d8f5868ca8d1f24916c7fb68e2c7) で動きます。
ActiveStrategy 作った

たいてい太るモデルといえば User ですよね。デブモデル1位だと思う。

でたいてい `User.login` とかよくわからんそれモデルの責務じゃないだろアホかよみたいなメソッドが生えてるのがデブ化の要因だと思います。

僕は女性もモデルもスリムな方が好きなので、実装を外出しするための Gem を書きました。

https://github.com/rosylilly/active_strategy

Ruby 1.8.x / 1.9.x / head 、Rails 3.0.x / 3.1.x / 3.2.x はテスト済みです。

## 使い方

Gemfile に `gem 'active_strategy'` を書きましょう。まだ rubygems に上がってないので `:git => 'git://github.com/rosylilly/active_strategy.git'` も必要です。

bundle install したら `$ rails g strategy login` とかします。`app/strategies/login_strategy.rb` ができるはず。

できたらその Strategy を使うクラスに以下のように書きます。

```ruby
class User
  include ActiveStrategy::Context

  strategy :login, class_method: true
end
```

これで `User.login` を叩くと `LoginStrategy#login` が叩かれるようになりました。やったね。

あとは `LoginStrategy#login` にログインな実装を書きましょう。この場合はクラスメソッドなので `@class` に `User` が渡っています。これがインスタンスメソッドの時は `@user` に User インスタンスが渡ってきます。

## 嬉しいこと

- デブ化を防げる
- 挙動ごとに実装部分を切り分けられる
- 同じ挙動を使いまわせる(別のモデルにも `strategy` を書けば良い)
- 特定の挙動だけテスト時に入れ替えたりできる
RequireJS と mocha を一緒に使う


mocha をブラウザで使う場合、`mocha.setup()` で BDD, TDD などのスタイルを指定し、それに応じて `describe`/`it`, `suite`/`test` などの関数が `window` に登録されます。RequireJS と一緒に使う場合、テストコードが評価される際に `mocha.setup()` が呼ばれていないと、`describe` などが定義されておらずエラーになってしまいます。

そこでまず思いつくのは `require()` を入れ子状に呼ぶことですが、いまいちイケていません。

```js
require(['mocha'], function () {
  mocha.setup('bdd');
  require(['test/foo_test'], function () {
    mocha.run();
  });
});
```

そこで、[Stackoverflow にも書いた](http://stackoverflow.com/a/13988317/822317)のですが、[shim config の `init` プロパティ](https://github.com/jrburke/requirejs/wiki/Upgrading-to-RequireJS-2.1#wiki-breaking-shim)を使うと、`require` を入れ子にしたりしなくてもうまくいきます。mocha が export される前に `mocha.setup()` を呼ぶことができるためです。

```js
requirejs.config({
  shim: {
    'mocha': {
      init: function () {
        this.mocha.setup('bdd');
        return this.mocha;
      }
    }
  }
});

require(['mocha', 'test/some_test'], function (mocha) {
  mocha.run();
});
```

テストコードでは mocha を `require` しましょう。

```js
define(['mocha'], function (mocha) {    
  describe('Something', function () {
    // ...
  });
});
```
Dictionary.FirstOrDefault() で値が取得できたか判別する方法

LINQで少しつまづいたのでメモ。

以下のように、default(Dictionary<T,T>) と等しいかどうか比較することで判別できます。

```csharp:FirstOrDefault.cs
// ディクショナリから、条件に合致する値のペアを取得する
var matchedPair = myDict.FirstOrDefault(item => item.Key.Match(name).Success);

// 取得できなかったら中断
if (matchedPair.Equals(default(Dictionary<Regex,string>)))
    return "";

//if (matchedPair == null) // ← これだとエラーになる
//    return "";
```
Sencha Touchの役立つリンク集 


[Sencha Advent Calendar 2012](http://www.adventar.org/calendars/23)の22日目担当の神代です

今回は参考になるリンク集の紹介します
（手抜きでごめんなさい。。。。）

# 公式サイト
sencha Inc.公式サイトのリンク
色々あるので改めてまとめます

## Forum

http://www.sencha.com/forum/

悩んだら、こちらで投稿したり、過去の投稿を見たりすると解決してくれるかも！

また、他投稿している人に回答するのも勉強になるかもです

## App Gallery

http://www.sencha.com/apps/

ギャラリーとして様々なアプリが公開されています
自分のアプリをこのページに載せれるように申請もできます

## Blog

http://www.sencha.com/blog/

日々の情報収集に欠かせないブログ

## Learn

http://www.sencha.com/learn/touch/

チュートリアル系として様々なものが紹介されています
はじめはこのへんを、ぼーと眺めるだけでも勉強になると思います

## Try

http://try.sencha.com/

自分の作った独自コンポーネントを紹介できるサイト
「こんなコンポーネントないかなぁー」と思ったら自分で作る前にここを検索するとすでにあるかも！

# 海外のサイト

## swarmonline

http://www.swarmonline.com/

イギリスの制作会社のサイト

ブログのページにsencha touchにかぎらずExt関連のポストやサンプルが紹介されているの一読するのもいいいかと思います

## superdit.com

http://superdit.com/

技術系のブログ

[Sencha Touch](http://superdit.com/category/sencha-touch/)で絞り込むと有益なサンプルがたくさん紹介されています。

## mindsaur.com

http://mindsaur.com/m/

ウクライナのサイト

モバイル版のサイトそのものがSencha Touchで制作されています
[showcases](http://mindsaur.com/m/#page/Showcases)には多くのサンプルが公開されています
シェル内でセパレータを引く

シェル内でログとログの間や作業と作業の間を分かりやすくするために横線を引いてセパレータにしたいことがたまにあります．
そこで簡単なコマンド `separate` を作ってみました．

```sh
function separate(){
    echo -n $fg_bold[yellow]
    for i in $(seq 1 $COLUMNS); do
        echo -n '~'
    done
    echo -n $reset_color
}
```

シェルで `separate` と打つと黄色い波線が表示されて，コマンドラインの区切りをわかりやすくします．

![separator](https://raw.github.com/rhysd/others/master/captures/separator.zsh.jpg)

線の色を変えたり，線のパターンを単なる `~` の繰り返しではなく顔文字にしたりするともっと色々楽しめそうですね（セパレータという本来の意味を失いそうですが）
なお，`$fg_bold` のために zsh の `colors` モジュールをロードしています．
Unityチュートリある 2日目


[参考] チュートリある(動詞：チュートリアルを実行すること)

## やっぱりギークハウス小杉ではUnityクリエイターを養成しています

どうもえいやです。

今日もUnityやって行きましょう。

[昨日まで](http://qiita.com/items/f242565a83a4ef5d6e1a)でUnityのインストールと各画面の操作の基本を勉強しました。

なお、インストールしたあとのデフォルトからTutorial2までの画面操作の結果、Unityの画面は、
![操作画面SC](https://www.dropbox.com/s/9ktx7uf2z038zdi/Screen%20Shot%202012-12-22%20at%2012.58.47.png?dl=1)
のようになっています。

さて、引き続いてチュートリあってみましょう。

### Tutorial 3: [The Inspector](http://unity3d.com/support/documentation/video/3.html)

このチュートリアルでは、InspectorViewについて説明しています。

InspectorViewは、上の図の画面で右の方に表示されている、選択中のオブジェクトの詳細を表示するための場所です。上の図では何も選択していないので何も表示されていません。

#### 新規プロジェクトの作成

チュートリアルの最初の状態にするために、新規プロジェクトを作成します。
プロジェクト名はTutorial3とでもして、適当なディレクトリを作って配置しましょう。

File > New Project
![New Project](https://www.dropbox.com/s/7z7f6ixhh1gnzuy/Screen%20Shot%202012-12-22%20at%2013.29.18.png?dl=1)

![適当な場所に作る](https://www.dropbox.com/s/3lxpc9ubwadxxut/Screen%20Shot%202012-12-22%20at%2013.33.02.png?dl=1)

こうすると空っぽのプロジェクトが作成されます。

#### 初めの状態にする

Tutorial3では、最初にPlaneとCubeが置かれていますので、空っぽのプロジェクトにこれらのオブジェクトを追加します。

GameObject > Create Other > Plane (Cube)
![Plane](https://www.dropbox.com/s/4ia5tvh975eab5x/Screen%20Shot%202012-12-22%20at%2013.39.07.png?dl=1)

それぞれを追加した状態がコレです。CubeはPlaneと大体接する位置にy方向について移動させています。
![Plane＆Cube設置完了](https://www.dropbox.com/s/9bm2rujb2dwtky6/Screen%20Shot%202012-12-22%20at%2013.48.08.png?dl=1)

メインカメラも移動・回転させて、大体オブジェクトが見える位置まで持っていきます。
![カメラ移動後](https://www.dropbox.com/s/xaniqmir230ek54/Screen%20Shot%202012-12-22%20at%2014.05.22.png?dl=1)

#### 準備完了、チュートリあって行きます

* まず、最初の状態ではGemeViewにしたとき、Cubeはよく見えない状態です。
* なので、光源を追加してCubeが見えるようにしてみましょう。

![点光源設置](https://www.dropbox.com/s/fgrsfr9fs9387s6/Screen%20Shot%202012-12-22%20at%2014.10.13.png?dl=1)

* 設置した点光源を選択して、InspectorViewを見てみましょう。
* Transformの項目には、光源の位置、回転、大きさが表示されています。
* Lightの項目には、オブジェクトの光源としての振る舞いを示す内容が記載されています。
* 別のオブジェクトを選択すると、オブジェクトの種別ごとに特徴のある項目がInspectorViewに表示されます。
* 光源のオブジェクトを選択して、Lightの項目を変更してみましょう。
* 光の届く長さを数値で指定したり、ドラッグで指定したりできます。
* 光の色の指定も変更してみます。こちらも数値でも選択やドラッグで指定もできます。
* TransformやLightといった各コンポーネントの右上のコマンド選択からresetを選ぶことで、値をリセットできます。

以上、Tutorial3でした。
NYXImagesKitを使ってみた


NYXImagesKitという便利なUIImageのカテゴリ拡張ライブラリがあるので使ってみた。

## 使い方
```
git submodule add git://github.com/Nyx0uf/NYXImagesKit.git
```

サブモジュールとして追加した後は、XcodeにてプロジェクトへNYXImagesKit全体を追加します。

あとは以下のライブラリをリンクして、NYXImagesKitをビルドしてください。

* Accelerate
* AssetsLibrary
* ImageIO
* MobileCoreServices
* QuartzCore
* CoreImage

その後、プロジェクトにNYXImagesKitをリンクすれば利用できます。

iOS上で使える画像処理系のライブラリの中では非常に高速な方かもしれません。

## 使用例

```
// GrayScale
[image grayscale];
// GaussianBlur
[image gaussianBlurWithBias:10];
// エッジ抽出
[image edgeDetectionWithBias:10];
// エンボス加工
[image embossWithBias:10];
```
Start Scala


List 処理の観点から。

PHP,Java向けの人。

要は Scala はcode短いだけ


## ほんとに短い？

1. Sum

	Ruby、Scala,JS,Java,.

	Java: Int どんだけ書く？
	PHP: $ どんだけ書く？(金かよ、おい）
	JS: var が気になる
	Ruby: まぁエレガント
	Scala: まぁいいよね

``` scala
		array = Array(1,2,3)
		for (x <= array) { sum = sum + x }
		array foreach { sum += _ }
```

2. Reduce
	
	Ruby, Scala, JS, PHP, Java
	
	Java: Reduce ねー
	PHP: ちょっとわかりにくくなっちゃうよね
	JS: Array.reduce… forのほうが短いね
	Ruby: sum = array.reduce(&:+) エレガントよね
	Scala: val sum = array.reduce(_+_)
		
		_ は引数の事

		One More think

		var sum = array.sum
			数値のみ

 学ぶに連れてcodeは良くなるよ

## クラスのことね

短くなるよ

## Scala

- Objective + Functional
	- Hybrid
- Run on JVM 
- A Lot of Java Lib
- Scalavirity
	
	Imperative


	```scala
	
		do A -> state++,
		do B -> state++, ...
	```


	Functional

	```scala
		in1 -> f(x) -> out1
		in2 -> g(x) -> out2
	```

## Scala2.10

まぁ、しばらく使わない機能多い気がする

いつ移行してもいいかと。
MacBook Air でPrintScreenキーを押すには[fn]+[左shift]+[F11]

MacBook Air 上で Windows(Bootcamp) を使用している際に[PrintScreen]キーを押したいこと、度々あると思います。
[fn]+[左shift]+[F11] キーを押すと、[PrintScreen]キーを押したのと同じ事になります。

# 参考

* [BootCamp で Windows を起動したときの Print Screen - Solr, Python, MacBook Air in Aoyama](http://d.hatena.ne.jp/knaka20blue/20081110/1226309788)
Yii CListViewのitemViewプロパティを自動指定するための3つの方法

views/hoge/index.php で CListView を使っているなら itemView プロパティを指定しなくても自動で _index.php にする方法はないか、を考えてみました。_post.php や _list.php というファイル名にするよりもパっと見てわかりやすいような気もしますし。

---

ひとつめ。親コントローラで CWidgetFactory を動的に変更するメソッドを作る方法。

```php:Controller.php
<?php
class Controller extends CController
{
	...
	public function setItemViewAuto()
	{
		Yii::app()->widgetFactory->widgets['CListView']['itemView'] = '_'.$this->action->id;
	}
	...
}
```

あとは CListView を使うアクションでこのメソッドを呼び出せば良い感じにしてくれます。ダメなところは CListView を使うアクションで毎回このメソッドを呼び出さないといけないこと。もうひとつはウィジェットの初期値を一元化できなくなってしまうところ。

---

ふたつめ。CController::beforeRender() でやる方法。これも親コントローラでやります。

```php:Controller.php
<?php
class Controller extends CController
{
	...
	protected function beforeRender($view)
	{
		Yii::app()->widgetFactory->widgets['CListView']['itemView'] = '_'.$view;
		return true;
	}
	...
```

前の方法とは違って CListView を使うアクションで呼びださなくてもいいので楽ちんです。ただ全アクションでこのメソッドが自動で呼ばれる感じなので、決して綺麗だとは言えず、リスクもやや高いかなと。

---

みっつめ。CListView を拡張する方法。

```php:ListView.php
<?php
class ListView extends CListView
{
	...
	public function init()
	{
		if($this->itemView===null)
			$this->itemView = '_'.Yii::app()->controller->action->id;
		parent::init();
		...
```

CListView は itemView プロパティが null の場合に例外を投げてしまう感じだったので、そこを変更してみました。他 2 つの方法と違って、コントローラに何かコードを追加するわけでもないので楽ちんです。ただこれだけのためにコアのウィジェットを拡張するのは少し大げさな気もします。また Yii のバージョンが上がってウィジェットの仕様が変わる場合には修正の必要も出てくるかもしれません。まぁマイナーなバージョンアップくらいだと仕様が極端に変わることはないと思いますが。

---

## まとめ

CWidgetFactory::widgets に指定できない動的なものをどう自動化させるか悩んでみました。皆さんならどう作りますか？また他に楽ちんな方法があれば是非教えてください！
emacs で動く Elserv という HTTP サーバを見つけました

emacs で動く Elserv という HTTP サーバを見つけました。Wanderlust で有名な Yuuichi Teranishi さん作です。elisp を学ぶうえでの参考になるかもしれません。ソースコードは[公式ページ](http://elserv.sourceforge.net/index.ja.html) からダウンロードできないようです。Ubuntu ならパッケージ化されているため、apt でインストールできます。ちなみに sudo apt-get source elserv でソースを取得できます。

```
$ sudo apt-get install elserv 
...
以下の特別パッケージがインストールされます:
  flim
提案パッケージ:
  emacs-wiki mhc xemacs21-bin semi wl wl-beta
以下のパッケージが新たにインストールされます:
  elserv flim
...
続行しますか [Y/n]? 
```

emacs23 でも、以下の設定で動作を確認できました。

```scheme
(require 'elserv)
(elserv-start 8088)
(require 'es-monitor)
(require 'es-wiki)
(elserv-package-publish (elserv-find-process) "/wiki" "wiki")
(require 'es-demo)
```

試しに、以下を評価して、http://localhost:8088/ へアクセスすると、foo と表示されました。

```scheme
(elserv-publish (elserv-find-process 8088) "/"
                :string "foo"
                :content-type "text/plain")
```

README.ja を引用します。

```
Elserv -- Yet Another HTTP Server on Emacsen

Elserv は Emacs 上で常駐して動く HTTP サーバです。

Emacs 自身にはサーバの機能がありませんので、専用のサーバプロセス
(ruby スクリプト)をバックエンドで立ち上げ、そのプロセスと通信することに
よってサーバ機能を実現しています。

特徴：

* 手軽に Web サーバを立ち上げられる (Emacs のコマンドを実行するだけ)。
* Emacs lisp で動的コンテンツを作成できる。
* コンテンツの置き換えは eval するだけで OK。
* HTTP 1.1 GET, HEAD, POST に対応。

必要なもの：

* Emacs (Emacs 20 or XEmacs)
* APEL, FLIM
* ruby (1.6.3 or later)

インストール：

* アーカイブを適当なところで展開します。
* `make install' を実行します。
(XEmacs パッケージとしてインストールする場合は `make install-package'
 を実行します。)

使い方：

(require 'elserv) したあと関数 elserv-start を実行すると
サーバが立ち上がります。
デフォルトのままだとポート番号は 8000 番となります。

そのままではほとんどコンテンツがありませんので、
関数 elserv-publish を使ってコンテンツを登録してください。

es- で始まるファイルに定義されたアプリケーションは、
関数 elserv-package-publish で登録できます。
例えば、es-wiki.el に定義された wiki サーバを /wiki に登録するには
以下を実行します。

(elserv-package-publish (elserv-find-process) "/wiki" "wiki")

関数 elserv-stop を実行するか、バッファ "*elserv*.." を消すと
サーバプロセスが終了します。

"*Log of elserv*..." というバッファにアクセスログが残ります。

アプリケーション：

es-demo.el:    デモ用のサンプルサーバです。
es-wiki.el:    emacs-wiki を使った Wiki サーバです。
es-mhc.el:     MHC を使ったスケジュールサーバです。
es-monitor.el: publish されているコンテンツの一覧を表示します。
               デフォルトで /monitor に publish されています。

remote.el:     web ブラウザ経由で Emacs を操作するためのサーバです。
web-custom.el: web ブラウザ経由で Emacs をカスタマイズするためのサーバです。
```

同様のツールに、[elnode](https://github.com/nicferrier/elnode) というのもあるようです。
Angular.jsでプルダウンにデータバインド

例えば以下のようなjson形式のデータが返ってくるとする。
dataList: [{key: "1",value: "テスト1"},{key: "2",value: "テスト2"}]

★javaScript側(※コントローラの中)

```javascript:
var SampleCtrl = function() {
         $scope.results = dataList
}
```
★HTML側

```html:
<select id="sample_id" ng-model="samle_id" 
        ng-options="result.key as result.value for result in results"  ng-change="doEventSearch()">
```
※ HTML側にAngular.jsと読みこんでコントローラの定義などお忘れなく

上記のようにHTML側の変数名"results"にAPIから取得したjsonデータがセットされてプルダウンにデータバインドすることができる。

順番が逆になってしまったけど、次の投稿でAngular.jsの導入方法についてまとめようと思う。
Alloy でカスタムフォントを使う方法

app/assets/fonts/ フォルダにカスタムフォントファイルを置き、tiapp.xml にフォントのパスを登録しておく（Info.plist の UIAppFonts キー）。

Titanium の 2.x 系から、tiapp.xml の <iphone> は deprecated になっていて <ios> に直すべきらしい。

例:
/app/assets/fonts/Ricty-Regular.ttf

```xml:tiapp.xml
<ti:app xmlns:ti="http://ti.appcelerator.org">
  <...>
  <ios>
    <plist>
      <dict>
        <key>UIAppFonts</key>
        <array>
          <string>fonts/Ricty-Regular.ttf</string>
        </array>
      </dict>
    </plist>
    <orientations device="iphone">
      <orientation>Ti.UI.PORTRAIT</orientation>
    </orientations>
    <orientations device="ipad">
      <orientation>Ti.UI.PORTRAIT</orientation>
      <orientation>Ti.UI.UPSIDE_PORTRAIT</orientation>
      <orientation>Ti.UI.LANDSCAPE_LEFT</orientation>
      <orientation>Ti.UI.LANDSCAPE_RIGHT</orientation>
    </orientations>
  </ios>
  <android xmlns:android="http://schemas.android.com/apk/res/android"/>
  <...>
  <sdk-version>3.0.0.GA</sdk-version>
  <plugins>
    <plugin version="1.0">ti.alloy</plugin>
  </plugins>
</ti:app>
```
Yii CListViewなどでページネーションするときにページトップへスクロールする方法

```php:main.php
<?php
return array(
	...
	'components'=>array(
		'widgetFactory' => array(
			'widgets' => array(
				'CListView' => array(
					'itemView' => '_list',
					'afterAjaxUpdate' => 'function(){$("html,body").animate({scrollTop:0},"fast");}',
					//'ajaxUpdate' => false,
					...
```

afterAjaxUpdate オプションでやる方法。もうひとつは ajaxUpdate を false にする方法。
git logからコミットハッシュを取得するzawソース

zshの Advent Calendar を見て使い始めたにわかzawユーザですが、zawのsourceを作ってみました。

機能としては単純で、``git log``の出力を見ながらコミットを選択し、選択したコミットのハッシュ値を取得するというもの。
名前はとりあえず、zaw-git-log としました。


``git checkout`` や ``git diff`` 、``git rebase``などと一緒に使用すると良い感じに使えるかと思います。

以下使用イメージ

コミットを1つ選択
![screenshot01](https://raw.github.com/yonchu/zaw-src-git-log/master/img/usage01.png)

![screenshot02](https://raw.github.com/yonchu/zaw-src-git-log/master/img/usage02.png)


コミットを2つ選択
![screeenshot03](https://raw.github.com/yonchu/zaw-src-git-log/master/img/usage03.png)

![screenshot04](https://raw.github.com/yonchu/zaw-src-git-log/master/img/usage04.png)


3つ以上選択した場合は、空白区切りで出力します。


複数選択はzaw共通の機能で、デフォルトでは``^@``キーに割り当てられています。

変更する場合は、以下のように設定します。
(``^@``の部分を適当に書き換えて下さい)

```sh
bindkey -M filterselect '^@' set-mark-command
```

コードは以下

```sh
#
# zaw-src-git-log
#
#   zaw source for git log.
#   https://gist.github.com/4350604
#
#   zaw : https://github.com/nakamuray/zaw
#

# git log pretty format: For detail, refer to "man git-log"
ZAW_SRC_GIT_LOG_LOG_FORMAT=${ZAW_SRC_GIT_LOG_LOG_FORMAT:-'%ad | %s %d[%an]'}

# If true, print full SHA.
ZAW_SRC_GIT_LOG_NO_ABBREV=${ZAW_SRC_GIT_LOG_NO_ABBREV:-'false'}

# Limit the number of commits to output.
# If set the value less than 1, output unlimitedly.
ZAW_SRC_GIT_LOG_MAX_COUNT=${ZAW_SRC_GIT_LOG_MAX_COUNT:-100}

# Date style (relative, local, iso, rfc, short, raw, default)
ZAW_SRC_GIT_LOG_DATE_STYLE=${ZAW_SRC_GIT_LOG_DATE_STYLE:-'short'}

# The function to regiter to zaw.
function zaw-src-git-log () {
    # Check git directory.
    git rev-parse -q --is-inside-work-tree > /dev/null 2>&1 || return 1

    # Set up option.
    local -a opt
    opt=("--pretty=format:%h $ZAW_SRC_GIT_LOG_LOG_FORMAT")
    if [ "$ZAW_SRC_GIT_LOG_NO_ABBREV" != 'false' ]; then
        opt+=('--no-abbrev')
    fi
    if [ $ZAW_SRC_GIT_LOG_MAX_COUNT -gt 0 ]; then
        opt+=("--max-count=$ZAW_SRC_GIT_LOG_MAX_COUNT")
    fi
    if [ -n "$ZAW_SRC_GIT_LOG_DATE_STYLE" ]; then
        opt+=("--date=$ZAW_SRC_GIT_LOG_DATE_STYLE")
    fi

    # Get git log.
    local log="$(git log "${opt[@]}")"

    # Set candidates.
    candidates+=(${(f)log})
    actions=("zaw-src-git-log-append-to-buffer")
    act_descriptions=("git-log for zaw")
    # Enale multi marker.
    options+=(-m)
}
# Action function.
function zaw-src-git-log-append-to-buffer () {
    local list
    local item
    for item in "$@"; do
        list+="$(echo "$item" | cut -d ' ' -f 1) "
    done
    set -- $list

    local buf=
    if [ $# -eq 2 ]; then
        # To diff.
        buf+="$1..$2"
    else
        # 1 or 3 or more items.
        buf+="${(j: :)@}"
    fi
    # Append left buffer.
    LBUFFER+="$buf"
}
# Register this src to zaw.
zaw-register-src -n git-log zaw-src-git-log
```

コードをコピペして``.zshrc``に貼り付けるか、別ファイルに保存して``source``するか、zawの``source``ディレクトリに入れるなどして使用して下さい。

また、``git log``のフォーマットはそれぞれ好みがあると思うので、適当に変更してご使用下さい。
先頭にハッシュ値+空白さえあれば動くはずなので。


一応Githubにも上げています。
[yonchu/zaw-src-git-log · GitHub](https://github.com/yonchu/zaw-src-git-log)


##おわり
zawはまだ使い始めて数日ですが、非常に使い勝手がいいですね。
sourceの作成が簡単で、単純なものなら数行で作れそうです。
zshの補完関数よりも手軽に書けるので、自分しか使わないような微妙なものを作るのにも良さそう。
DropBoxのPublicフォルダ機能がなくなっている件について


なんか2012年10月4日以降に作成したアカウントでは、[Publicフォルダ機能が使えなくなっている](https://www.dropbox.com/help/16/en)ので困っていました。

問題は、代わりのリンクって機能だと画像への直リンURIが取得できなかったことです。

Qiitaに投稿する場合のスクリーンショットとかDropBoxにあげようと思っていたのに……。

で、色々試行錯誤して代替の方法を発見しました。

## Share linkで取得したURIに?dl=1ってつけるとOK

右のShare link(鎖アイコン)をクリックすると、公開用にリンクが作成されます。

![Share link](https://www.dropbox.com/s/90fjp3i178s9o0t/Screen%20Shot%202012-12-22%20at%201.21.07.png?dl=1)

リンク作成と同時に以下のポップアップが表示されます。
Get linkをクリックすると、クリップボードにURIがコピーされます。

![Get link](https://www.dropbox.com/s/dmkdpf76dchxnmh/Screen%20Shot%202012-12-22%20at%201.24.30.png?dl=1)


このURIは、下のようになっています。
https://www.dropbox.com/s/dmkdpf76dchxnmh/Screen%20Shot%202012-12-22%20at%201.24.30.png

リンクを開くとわかりますが、pngと言いつつDropBoxのページです。

なので、画像を表示しようと、以下の様に書いても。

```
![hogehoge](https://www.dropbox.com/s/dmkdpf76dchxnmh/Screen%20Shot%202012-12-22%20at%201.24.30.png)
```

![hogehoge](https://www.dropbox.com/s/dmkdpf76dchxnmh/Screen%20Shot%202012-12-22%20at%201.24.30.png)

とこのように、画像は表示されません。

ですが、以下のように?dl=1と後ろにつけると、

https://www.dropbox.com/s/dmkdpf76dchxnmh/Screen%20Shot%202012-12-22%20at%201.24.30.png?dl=1

ちゃんと画像がDLされます。

そして以下のように書くと、

```
![hogehoge](https://www.dropbox.com/s/dmkdpf76dchxnmh/Screen%20Shot%202012-12-22%20at%201.24.30.png?dl=1)
```

ちゃんと以下のように画像が表示されます。

![hogehoge](https://www.dropbox.com/s/dmkdpf76dchxnmh/Screen%20Shot%202012-12-22%20at%201.24.30.png?dl=1)

## ずっと使える方法なの？

わかりません。

適当にやってるうちに発見したので、どうしてこういうことが出来る(許されている)かは分かってません。
もしかしたら、Publicが廃止された理由と一緒でそのうち禁止になるかも知れません。
このテクがいつまで使えるか不明ですが、一旦はこの方法でやってようかと思います。

詳しい人いたら教えてプリーズ。

以上です。
Objective-Cでドット繋ぎでメソッドチェインを行う

Objective-C Advent calendar 22日目。

NSArrayなんかにmapやfilterといったメソッドをカテゴリで生やして、それぞれのメソッドを繋ぎあわせて処理をしたいといった時(そんな時があるのか甚だ疑問ではありますが)、通常のメソッド呼び出しだとこんな実装になると思います。

```objectivec
@interface NSArray (functional)
- (NSArray*)filter:(BOOL(^)(id))block;
- (NSArray*)map:(id(^)(id))block;
@end
```

```objectivec
@implementation NSArray (functional)

- (NSArray*)filter:(BOOL(^)(id))block
{
    NSMutableArray *arr = [NSMutableArray array];
    for(id obj in self) {
        if(block(obj)) {
            [arr addObject:obj];
        }
    }
    return arr;
}

- (NSArray*)map:(id(^)(id))block
{
    NSMutableArray *arr = [NSMutableArray array];
    for(id obj in self) {
        id ret  = block(obj);
        if(ret) {
            [arr addObject:ret];
        }
    }
    return arr;
}

@end
```

で、コレを使って配列の要素を2倍して、特定条件でフィルタしたいとすると、

```objective-c
    NSArray *ret = [[@[@100, @200, @300, @400] map:^id(id num) {
        return [NSNumber numberWithInt:[num intValue] * 2];
    }] filter:^BOOL(id num) {
        return [num intValue] > 400;
    }];
    NSLog(@"%@", ret);  // ==> (600, 800)
```

といった感じになります。メソッド2つ噛ませる程度ならコレでも良いんですが、これが3つも4つもとなると、

```objective-c
    [[[[@[@100, @200, @300, @400] map:^id(id num) {
        // アレして
    }] filter:^BOOL(id num) {
        // コレして
    }] map:^id(id num) {
        // ソウして
    }] filter:^BOOL(id num) {
        // ファイヤー
    }];
```

といった感じでObjective-Cの構文上メソッドチェインしようとすると、先頭行辺りに括弧が集結してしまい、非常に可読性が悪くなります。

そこでpropertyとblockを使ったメソッドチェインの実装方法を紹介します。

Objective-Cのpropertyは```object.property```といった形でオブジェクトにドットを付けた記述方法でアクセサメソッドを実行することができます。なので、上記の```map```や```filter```メソッドもプロパティの形で実装すれば、括弧で囲まずにメソッドを実行することができるわけです。

しかし、通常のgetterは引数を取ることができず、逆にsetterは戻り値を設定することができないたメソッドを繋げることができません。

そこで、blockを返すgetterを宣言します。

```objective-c
@interface NSArray (functional)
@property (readonly) NSArray*(^filter)(BOOL(^)(id));
@property (readonly) NSArray*(^map)(id(^)(id));
@end
```

実装はこんな感じ。(汚い)

```objective-c
@implementation NSArray (functional)

- (NSArray *(^)(BOOL (^)(id)))filter
{
    return ^(BOOL (^block)(id)) {
        NSMutableArray *arr = [NSMutableArray array];
        for(id obj in self) {
            if(block(obj)) {
                [arr addObject:obj];
            }
        }
        return arr;
    };
}

- (NSArray *(^)(id (^)(id)))map
{
    return ^(id (^block)(id)) {
        NSMutableArray *arr = [NSMutableArray array];
        for(id obj in self) {
            id ret  = block(obj);
            if(ret) {
                [arr addObject:ret];
            }
        }
        return arr;        
    };
}
```

blockの呼び出しはC言語の関数呼び出しと同じ記述方法のため、```arr.map().filter()```といった形でドットを使って数珠つなぎにメソッドを実行していくことが可能になります。

使用例。

```objective-c
    NSArray *ret = @[@100, @200, @300, @400]
    .map(^id(id num) {
        return [NSNumber numberWithInt:[num intValue] * 2];
    })
    .filter(^BOOL(id num) {
        return [num intValue] > 400;
    });
    NSLog(@"%@", ret);  // ==> (600, 800)
```

ドットで繋げていくだけなので、もう括弧の呪縛に悩む必要はありませんね！

ちなみにこんな感じの実装で有名なのは[underscore.m](http://underscorem.org/)ですね。
拙作の[STDeferred](https://github.com/saiten/STDeferred)でも最近似たような実装を入れましたー（ステマ）
Unityはじめまんた


## ギークハウス武蔵小杉では、Unityクリエイターを養成しています。

というわけで、ボクもUnityを覚えるべく始めました。

とりあえず、Free版で操作などを覚えていきます。

## まずは導入することから

1. [ダウンロード](http://unity3d.com/unity/download/)する
1. インストールする
1. アカウントを登録する
1. 承認メールを確認してアカウントを承認する
1. [参考画像1]質問に答える
1. [参考画像2]Start using Unity!
1. [参考画像3]折角なので[Video Tutorials](http://unity3d.com/support/documentation/video/)を見てみる
1. 以降Video Turorialsに従って、最初のアプリを作ってみましょう

なんか分かりづらいけど縦長のフォームです。ジェスチャーとかないとスクロールできない
[参考画像1]
![参考画像1](https://www.dropbox.com/s/36zfumrsik7iopd/Screen%20Shot%202012-12-22%20at%200.33.11.png?dl=1)

[参考画像2]
![参考画像2](https://www.dropbox.com/s/4q1i3ads7gdy013/Screen%20Shot%202012-12-22%20at%202.26.15.png?dl=1)

[参考画像3]
![参考画像3](https://www.dropbox.com/s/kxinzxee1kvzk99/Screen%20Shot%202012-12-22%20at%202.29.31.png?dl=1)

## Video Turorialsを見ながら色々やってみる

Video Tutorialsはえらくゆっくり簡単な英語を使って喋ってくれるので、英語が苦手でもなんとかなると思います。

このレベルの英語がわからないとプログラマとしてはヤバいレベルです。(煽)

以下意訳+αな感じ。

### Tutorial 1: Introduction

Unityの標準Windowの操作方法の説明になります。
操作する画面の要素について説明してくれています。

* 左側のSceneViewは、今選択中のSceneの全てのオブジェクトの画像が表示されるところです。
* 真ん中上半分にあるHierarchyViewは、Show the game All the Object in the Scene but here in a list form.
* 真ん中下半分にあるProjectViewは、各Unityプロジェクトのファイル構成を表示しています。
* 右の、InspectorViewは、選択中のオブジェクトの詳細を表示しています。
* SeneViewの隣にあるタブを選択すると表示されるGameViewは、メインカメラから見た今のシーンを表示します。

以降、レイアウト変更の方法の説明。

### Tutorial 2: Scene View

Scene Viewの操作を教えてくれます。

#### オブジェクトの移動

* 選択中のオブジェクトは中心の四角形の領域をドラッグ＆ドロップで自由に動かせます。
* 3方向の矢印をドラッグすると、その矢印方向のみに移動させられます。

#### オブジェクトの回転

* 上部のツールボックスから、回転アイコンを選ぶと、オブジェクトを回転させられるモードに変えられます。
* 回転させられるモードでは、オブジェクトを囲む球をドラッグして自由な方向に回転させられます。
* オブジェクトを囲む球上の円を描く線をドラッグすれば、その円の方向にのみ回転させられます。

#### オブジェクトの拡大縮小

* 同じように、スケールアイコンを選ぶと、拡大縮小できるモードに変えられます。
* 拡大縮小できるモードでは、オブジェクトの中心の立方体のアイコンをドラッグすることで拡大縮小ができます。
* オブジェクトの中心から軸方向に伸びた線の先端にある立方体のアイコンをドラッグすれば一軸方向への拡大縮小ができます。

#### 視点(ナビゲーション)の操作

* ALT+左マウスドボタンラッグで、視点方向を変えられます。
* ALT+中マウスボタンドラッグで、視点の位置を変えられます。
* ALT+右マウスボタンドラッグで、視点の中心へのズームを変えられます。

##### Gizmoによる視点の変更

* 視点を方向変更する方法は、SecenViewの右上にあるGizmo(円錐を突き合わせたようなアイコン)を使うこともできます。
* ｘ,y,zのそれぞれの方向からの視点に変更できます。

##### オブジェクトの追跡

* 遠くに行って位置が分からなくなったオブジェクトは、HierarchyViewで選択したあと、SecenViewに戻って"F"キーを押すと、そのオブジェクトを中心にする位置まで視点が移動します。
ActiveRecordでINNER JOINするとsaveできなくなる（解決策あり）

ActiveRecordでクエリーを組み立てる時に、`joins`メソッドを使って`INNER JOIN`句を付けると、取ってきたレコードを`save`できなくなります。
その検証と、`save`できるようにする、方法。

```ruby
require 'logger'
require 'active_record'

# テーブル定義
class CreateShelves < ActiveRecord::Migration
  def change
    create_table :shelves
  end
end

class CreateBooks < ActiveRecord::Migration
  def change
    create_table :books do |t|
      t.integer :shelf_id
    end
  end
end

# モデル定義
class Shelf < ActiveRecord::Base
  has_many :books
end

class Book < ActiveRecord::Base
  belongs_to :shelf
end

# ActiveRecordのセットアップ
logger = Logger.new($stderr)
ActiveRecord::Base.logger = logger # SQLをログに出すようにする
ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'

# テーブル作成
CreateShelves.new.change
CreateBooks.new.change

# レコード作成
shelf = Shelf.create
shelf.books << Book.new

# やっと本題
# これだとreadonlyになる
shelves = Shelf.joins(:books)
begin
  shelves.first.save
rescue => err
  logger.error "#{err.class} (#{err.message})" # => ActiveRecord::ReadOnlyRecord (ActiveRecord::ReadOnlyRecord)
end

# こうすればsaveできる
shelves = Shelf.joins(:books).readonly(false)
shelves.first.save # => true
```

`save!`じゃなくて`save`なのに例外を起こすからいやな感じですね。
Ember.ObjectからJSONを抽出する

Ember.Objectからjsonを抽出する方法です。

* Jsonable Mixinを定義する

```coffeescript
App.Jsonable = Ember.Mixin.create
  getJson: (->
    ret = [] 
    for key of this
      if (@hasOwnProperty(key))
        v = this[key]
        if (v == 'toString')
          continue
        if (Ember.typeOf(v) == 'function')
          continue
        ret.push(key)
    return @getProperties.apply(this, ret)
  )
```

* Ember.Object作成時にJsonableを組み込む

```coffeescript
App.article = Ember.Object.create App.Jsonable,
  author: 'Bob',
  title: 'My first article',
  published_on: '2012-12-21',
  body: 'Hello, World!'

App.article.getJson() # => {author: 'Bob'
```

* getJson() メソッドでJSON用オブジェクトを抽出できます。

```coffeescript
JSON.stringify(App.article.getJson()) # => "{author: 'Bob', ...}"
```

この方法は、以下のサイトで紹介されてました。

http://stackoverflow.com/questions/8669340/ember-model-to-json
MacにCoffeeScriptの環境を整えたメモ

普段はrubyruby言ってますがいい加減JavaScriptから逃げ続けるのも限界らしく、webアプリケーションを作る限り避けられなさそうなので勉強し始めました。
手始めは開発環境の構築な訳ですが、忘れそうなのでメモしておきます。

####なんでJSじゃなくてCoffeeScript?
`()とか{}とか;とかvarとかfunction`とか見たくないからです。簡潔なのは素敵なことなのです。

####導入
取り敢えずNode.jsが必要らしいので入れましょう。普段通り`brew`を使用します。

```bash
$ brew update
$ brew install node
$ node -v
v0.8.16 # ちゃんと最新バージョンが入る素敵
$ npm install --global coffee-script # CoffeeScriptをシステム全体に入れます
$ coffee -v
-bash: coffee: command not found # pathが通ってない…
$ vim .bash_profile
+ export PATH=/usr/local/share/npm/bin:$PATH # bash周辺まだイマイチ理解しきれてないから不安
$ coffee -v
CoffeeScript version 1.4.0 # わあい通った
$ npm ls -g
/usr/local/share/npm/lib
└── coffee-script@1.4.0
$vim .bash_profile # NODE_PATHにnpmモジュールを追加しておくと良いらしい
+ export NODE_PATH=/usr/local/share/npm/lib/node_modules
```

`coffee`でirb的な物が立ち上がりました！いろいろ遊んでみようと思います。

####追記
syntax highlightが効かなかったので
[kchmck / vim-coffee-script](https://github.com/kchmck/vim-coffee-script)
入れました。

```bash
$ cd ~/.vim/bundle
$ git clone https://github.com/kchmck/vim-coffee-script.git
```

yay!
Emacs のバッファ名にヒントを追加する

# Emacs のバッファ名
Emacs のバッファ名は基本的にファイル名になります．しかし，バッファ名がファイル名のみだとわかりにくい場合もあります．そこでヒントとなるような文字列を追加してわかりやすくしてみます．
## Dired バッファに [Dired] を追加する
Emacs 内蔵のファイラーである dired ですが，通常のバッファ名は単純なディレクトリ名になります．このままではわかりにくいので，バッファ名にヒントを追加します．

```common-lisp:dired-my-append-buffer-name-hint
(defun dired-my-append-buffer-name-hint ()
  "Append a auxiliary string to a name of dired buffer."
  (when (eq major-mode 'dired-mode)
    (let* ((dir (expand-file-name list-buffers-directory))
           (drive (if (and (eq 'system-type 'windows-nt) ;; Windows の場合はドライブレターを追加
                           (string-match "^\\([a-zA-Z]:\\)/" dir))
                      (match-string 1 dir) "")))
      (rename-buffer (concat (buffer-name) " [" drive "Dired]") t))))
(add-hook 'dired-mode-hook 'dired-my-append-buffer-name-hint)
```

このコードを init.el に追加すればバッファ名の末尾に " [Dired]" を追加します．Windows の場合（Cygwin 除く）はドライブレターも追加します．
## Tramp バッファにユーザ名とホスト名を追加する
Emacs でリモートファイルを編集できる tramp なんですが，これまた基本的なファイル名しか表示されません．ローカルファイルを編集してるつもりが実はリモートファイルでした，なんてことが起きないようにバッファ名にユーザ名とホスト名を追加します．

```common-lisp:tramp-my-append-buffer-name-hint
(defun tramp-my-append-buffer-name-hint ()
  "Append a hint (user, hostname) to a buffer name if visiting
file is a remote file (include directory)."
  (let ((name (or list-buffers-directory (buffer-file-name))))
    (when (and name (tramp-tramp-file-p name))
      (let* ((tramp-vec (tramp-dissect-file-name name))
             (method (tramp-file-name-method tramp-vec))
             (host (tramp-file-name-real-host tramp-vec))
             (user (or (tramp-file-name-real-user tramp-vec)
                       (nth 2 (assoc method tramp-default-user-alist))
                       tramp-default-user
                       user-real-login-name)))
        (rename-buffer (concat (buffer-name) " <" user "@" host ">") t)))))
(add-to-list 'find-file-hook 'tramp-my-append-buffer-name-hint)
(add-to-list 'dired-mode-hook 'tramp-my-append-buffer-name-hint)
```

これで tramp で開いたファイル（ディレクトリ含む）のバッファ名の末尾に " \<user@hostname\>" が追加されます．
## まとめ
バッファ名にヒントを追加してわかりやすくしてみようと試みました．anything (or helm) でバッファ切り替えをしていれば，ヒントをもとにバッファを絞り込めるので非常に便利です．

- (buffer-file-name) でバッファに結びついているファイル名を取得
- list-buffers-directory で Dired バッファに結びついているディレクトリ名を取得
- (buffer-name) で現在のバッファ名を取得
- (rename-buffer "string") でバッファ名の変更

ができるので，自分の好きなヒントを作ってみて find-file-hook や dired-mode-hook に引っ掛ければいいかと思います．VCS 下のファイルにブランチとリビジョンを追加するとか，プロジェクト下のファイルにプロジェクト名を追加など役に立ちそうな気がしています．
zxcvbn をつかって Rails のパスワードバリデーションを強化してみる

脆弱なパスワードを放置すると、ユーザーのアカウントは常に危険にさらされます。
アカウントの乗っ取りが起こった場合にはウェブサービスの信頼性を疑われることにもなりかねません。

これらの問題に対処するためのライブラリ zxcvbn をつかって、信頼性低下を予防しましょう。

# なにができるの？

脆弱なパスワードが設定された場合、以下の画像のように、「このパスワードは数分で破られます」といった具体的なメッセージを表示することができます。
強力なパスワードを使用する理由がユーザーに伝わりやすくなり、モチベーションをあまり低下させずに再入力を促すことができるようになります。

![使用例](http://f.cl.ly/items/272X151E1b3u3n3z3Q0h/zxcvbn_validator_01.png)

zxcvbn について、より詳しい情報は以下を閲覧してください。
http://tech.dropbox.com/?p=165
https://github.com/lowe/zxcvbn

# Rails アプリケーションに組み込んでみる

では、実際に Rails アプリケーションに組み込んでみましょう。
まず zxcvbn-ruby という素晴らしい gem をインストールします。

```Gemfile:Gemfile
gem "zxcvbn-ruby", :require => 'zxcvbn'
```

```shell:shell
bundle
```

モデルから簡単に使えるよう、バリデータつくってみましたんでコピペしてください。

```ruby:app/validators/zxcvbn_validator.rb
require 'zxcvbn'

class ZxcvbnValidator < ActiveModel::EachValidator
  attr_reader :record, :attribute, :value

  SCORE_RANGE = (1..4).freeze

  def initialize(options)
    unless SCORE_RANGE.include? options[:score]
      raise ArgumentError, ":range must be a #{SCORE_RANGE.to_s.gsub('..', ' to ')}"
    end

    super
  end

  def validate_each(record, attribute, value)
    @record, @attribute, @value = record, attribute, value

    @score = options[:score]
    add_error unless valid?
  end

  private

  def valid?
    @messages_options = {}
    week_keywords = []

    for key, val in @record.attributes
      next if %w[password password_confirmation encrypted_password].include?(key)
      next unless val.kind_of?(String)

      week_keywords.push val if val

      for splited_val in val.split(/[@._]/)
        week_keywords.push splited_val
      end
    end

    result = Zxcvbn.test(value, week_keywords)
    @messages_options[:crack_time] = display_time result.crack_time
    result.score >= @score
  end

  def add_error
    if message = options[:message]
      record.errors[attribute] << message
    else
      record.errors.add attribute, :week_password, @messages_options
    end
  end

  def display_time(seconds)
    minute  = 60
    hour    = minute * 60
    day     = hour * 24
    month   = day * 31
    year    = month * 12
    century = year * 100

    case
    when seconds < minute
      unit = 'x_seconds'
      count = 1 + seconds.ceil
    when seconds < hour
      unit = 'x_minutes'
      count = 1 + (seconds / minute).ceil
    when seconds < day
      unit = 'about_x_hours'
      count = 1 + (seconds / hour).ceil
    when seconds < month
      unit = 'x_days'
      count = 1 + (seconds / day).ceil
    when seconds < year
      unit = 'x_months'
      count = 1 + (seconds / month).ceil
    when seconds < century
      unit = 'x_years'
      count = 1 + (seconds / year).ceil
    end

    I18n.t "#{unit}.other", scope: [:datetime, :distance_in_words], count: count
  end

end
```
パスワードの強度を単純に評価するだけでなく、
モデルに紐付く情報、たとえばユーザ名やメールアドレスなどに含まれる単語から
推測されるパスワードも強度が低いと判定されるようになっています。

メッセージも忘れずにどうぞ。

```yaml:config/locales/ja.yml
ja:
  errors:
    messages:
      week_password: より複雑な%{attribute}を入力してください。あなたの%{attribute}は%{crack_time}で破られます。
```

ユーザモデルに追加する場合。強度は1から4まで指定できます。

```rb:app/models/user.rb
  validates :password, zxcvbn: {score: 3}
```
Markdownでのイタリックフォントを無効にする。

VimでMarkdownを編集する時、アンダーバーやアスタリスクを記述することによって、
それ以降がイタリックになってしまう。
なので、下記のコードを.vimrcに記述すればイタリックを無効できる。

> autocmd! FileType markdown hi! def link markdownItalic LineNr

`LineNr`の部分は`Normal`とかお好なハイライトに設定してください。
Google Maps Android API v2 で大圏コースを表示する


GoogleMap は[メルカトル図法](http://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%AB%E3%82%AB%E3%83%88%E3%83%AB%E5%9B%B3%E6%B3%95)なので、地図上の２点間を結んだ直線は最短距離になりません。(メルカトル図法で正しいのは角度だけ、でしたよね。)

地球上の２点間の最短距離は「[大圏コース](http://ja.wikipedia.org/wiki/%E5%A4%A7%E5%9C%8F%E3%82%B3%E3%83%BC%E3%82%B9)」と呼ばれます。

で、Android 版の新しい API を使うと、この大圏コースを簡単に表示することができます。

こんな感じ、赤がただの直線、青が大圏コースです。

![greatcircle](https://dl.dropbox.com/u/264530/qiita/greatcircle.png)

やり方は以下のとおりです。
```geodesic``` を ```true``` にすれば大圏コースになります。

```java:GeodesicPolyline.java
GoogleMap mMap;

final LatLng TOKYO = new LatLng(35.691, 139.693);
final LatLng HAWAII = new LatLng(19.87, -155.56);

// ただの直線
mMap.addPolyline(new PolylineOptions()
	.add(TOKYO, HAWAII)
    .width(5)
    .color(Color.RED)
    .geodesic(false));

// 大圏コース
mMap.addPolyline(new PolylineOptions()
	.add(TOKYO, HAWAII)
    .width(5)
    .color(Color.BLUE)
    .geodesic(true));
```

Developper Guide に説明があります。

* [Polylines and Polygons - Google Maps Android API v2](https://developers.google.com/maps/documentation/android/lines#geodesic_and_non-geodesic_lines)

> A Geodesic line is a line that follows the curvature of the earth. In contrast, a non-geodesic line will be drawn using the coordinate system of your screen. By Default, Polyline and Polygon objects will draw non-geodesic lines. You can change any Polyline or Polygon to use geodesic lines by setting the geodesic property to true.

> 適当訳
> Geodesic なラインとは地球上の曲がった線のことです。non-geodesic ってやつは画面座標系で描いた線で、これがデフォルトです。Polyline や Polygon を geodesic にしたければ geodesic プロパティを true にするとよろし。

ちなみにこの「２点間の最短距離」は [Location.distanceBetween](http://developer.android.com/reference/android/location/Location.html#distanceBetween(double, double, double, double, float[]) メソッドで求められます。

どうやら、Javascript 版にはもともとこの機能があったようで、以下のサイトに例があります。

* [Googleマップで大圏コースを表示する](http://user.numazu-ct.ac.jp/~tsato/tsato/geoweb/googlemaps/great-circle/)

あと、iOS 版の Google Maps API にもあるみた…あれ、ないや。
(余談ですが iOS 版の API には Polygon を描く機能もないんですね)
 
* [Polylines - Google Maps SDK for iOS](https://developers.google.com/maps/documentation/ios/lines)

## その他
つか、Android の GoogleMap さん、思いっきり縮小しても世界が画面内に収まらないので、大圏コースの例が見せにくいわ。
jUnit で非同期処理のテストがちょっと楽になるクラス作ってみた


非同期メソッドのテストって、皆さんどうやってるんでしょう？
ちょっとググってみたけど「```Object.wait``` とか ```CountDownLatch``` とか ```Future``` で待て」とかあんまり良い答えが見つからなかったので、自分でユーティリティクラス作ってみた。

まあ CountDownLatch で待ってるだけなんですけども。

2013.1.10 修正:メソッドに全部 ``synchronized`` つけたら動かんやん、恥ずかし…

```java:FutureResult.java
/**
 * success または error が呼ばれるまで get() で待ってる Future みたいなクラス
 * 
 * @author @amay077
 */
public class FutureResult<T> {
	private final int TIMEOUT = 10;
	private final TimeUnit TIMEOUT_UNIT = TimeUnit.SECONDS;
	
	private final CountDownLatch _latch = new CountDownLatch(1);
	private T _value;
	private Exception _error;

	public static class FutureResultException extends Exception {
		private static final long serialVersionUID = 1L;

		public FutureResultException(Exception detailException) {
			super(detailException);
		}
	}
	
	/**
	 * 非同期処理が成功したら呼ぶメソッド
	 */
	public synchronized void success(T value) {
		_value = value;
		_latch.countDown();
	}

	/**
	 * 非同期処理が失敗したら呼ぶメソッド
	 */
	public synchronized void error(Exception ex) {
		_error = ex;
		_latch.countDown();
	}

	/**
	 * 非同期処理が終わるまで待って結果を返す。
	 * エラーだったら例外を投げる。
	 */
	public T get() throws Exception {
		try {
			if (!_latch.await(TIMEOUT, TIMEOUT_UNIT)) {
				throw new FutureResultException(new TimeoutException());
			}
		} catch (Exception ex) {
			throw new FutureResultException(ex);
		}
		
		if (_error != null) {
			throw _error;
		}
		
		return _value;
	}

}
```

Future インターフェースを implements しようと思ったけど数が多くてやめたｗ
使い方はこんな感じ。

```java:AsyncMethodTest.java
public void testAsyncMethod() {
	final FutureResult<Integer> result = new FutureResult<Integer>();
	
	// 非同期なメソッドを実行
	hoge.asyncMethod(new OnReceiveListener() {
		@Override
		public void onReceive(Integer data) {
			// 正そうな値を受信しtら success を呼ぶ
			result.success(data);
		}
		
		@Override
		public void onError(Exception ex) {
			// エラーを受信した場合は error を呼ぶ
			result.error(ex);
		}
	});
	
	// 検証
	try {
		// get で success か error かタイムアウトするまで待ってる。
		Assert.assertEquals(0, result.get()); 
	} catch (Exception e) {
		fail(e.getMessage());
	}
}

```

## 参考

なんて記事を書いたあとにもっかいググってみたらこんなライブラリがあるようで。詳細はまだ見てない。

* [Awaitility](http://code.google.com/p/awaitility/) - Awaitility is a small Java-based DSL for synchronizing asynchronous operations. It makes it easy to test asynchronous code. - Google Project Hosting
リストの中の最大値を求める

Tclで科学技術計算をする時に、リストに入っているデータから最大値を求めたい時がありますよね。expr max($l) で出来そうなのですが、max関数は引数が,区切りで無いと受け付けてくれません。そこで、全データを調べる方法と、ソートする方法、区切り文字を変えてmax関数を使う方法で、どれが一番速いかを試しました。

```tcl:max.tcl
# テストデータの作成
set l ""
for {set i 0} { $i<1000000 } {incr i} {
    lappend l [expr rand()]
}

# 方法1 自力で比較
set s0 [clock clicks -milliseconds]
set max [lindex $l 0]
foreach x $l {
    if { $max < $x } {
	set max $x
    }
}
set s1 [clock clicks -milliseconds]
puts "1: max $max time [expr $s1 - $s0] ms"

# 方法2 ソートを使う
set s0 [clock clicks -milliseconds]
set max [lindex [lsort -decreasing -real $l] 0]
set s1 [clock clicks -milliseconds]
puts "2: max $max time [expr $s1 - $s0] ms"

# 方法3 区切りを変えてmax関数を使う
set s0 [clock clicks -milliseconds]
set max [expr max([regsub -all { } $l {,}])]
set s1 [clock clicks -milliseconds]
puts "3: max $max time [expr $s1 - $s0] ms"
```

実行するとこのようになります。

```
1: max 0.9999997345730661 time 339 ms
2: max 0.9999997345730661 time 419 ms
3: max 0.9999997345730661 time 4978 ms
```

区切り文字を変えて組込のmax関数が速いと思ったのですが、自分で計算する方が速いですね。
XOOPS のテーマ雛形を生成する

[XOOPS Themes and Templates Advent Calendar 2012](http://qiita.com/advent-calendar/2012/xoops-themes-templates/participants)

XOOPS のテーマを作ってみたいけど、どっから手を付けていいのか、あるいは何かベースになるようなシンプルなテーマはないか、最近流行の Twitter Bootstrap を組み込んだテーマを作りたい、そんな方に使ってみていただきたいのが、本日ご紹介する XOOPS Cube Legacy テーマ生成サービス [Themaker](http://jp.xoopsdev.com/modules/themaker/) です。

ユーザ登録さえしていただければ、どなたでも無料で利用いただけます。
http://jp.xoopsdev.com/modules/themaker/

### 生成オプション設定画面
![作成画面](http://jp.xoopsdev.com/doc/images/themaker-01.png)

Themaker では、レイアウト、カラム数、配色などのパラメタを選んでいくことで、それに沿ったテーマの雛形を生成します。生成したテーマはダウンロードしてテーマフォルダに置くことでそのままテーマとして使うこともできます。あれこれ迷わなければ、１分もあればテーマができてしまいます。

###ダウンロード画面
![ダウンロード画面](http://jp.xoopsdev.com/doc/images/themaker-02.png)

生成したテーマは一般のテーマと同様、html, css, javascript, 画像ファイルよりなりますので、これらを編集することで、独自テーマに仕立てていくこともできます（というか、そういう使い方がメインになると思います）。

## どんなテーマを生成できるの？

### レイアウト
大きく分けて、960pxの固定幅のテーマ（xhtml）と、Twitter Bootstrap をベースにしたテーマ（html5）を作ることができます。

### カラム数
それぞれ、カラム数を１カラム、２カラム、３カラムから選ぶことができ、カラム数はトップページとサブページで分けることができます。

### カラースキーム
[Color Scheme Designer](http://colorschemedesigner.com/) を利用して色を選び、XML 形式で「export」したものをフォームに貼り付けて設定できるようになっています。

![カラースキーム](http://jp.xoopsdev.com/doc/images/themaker-04.png)

### 配色
カラースキームを設定すると、それにしたがって自動的に各要素に色が割り当てられます。
例えば、テーブルの見出し行の背景にどのカラーを割り当てるか、リンク色、リンクのホバー色、メニューの背景色など、たくさんの割り当て対象があります。
細かく制御したい方は、これも変更することが可能です。
以下に、[Google Docs  のスプレッドシート](https://docs.google.com/spreadsheet/ccc?key=0AnciFICRNnxEdEoxU08xOWdoVGF4YW1HZkota3FFR1E#gid=0) を作ることで、独自の配色パターンを作ることができます（シートlightをコピーして作ってください） 

## 作ったテーマのサンプル
![作成サンプル](http://jp.xoopsdev.com/doc/images/themaker-03.png)
bootstrapベースのテーマの例です。

## Themaker 自体をカスタマイズしたい
Github にソースコードがありますので、Fork するなりしてご利用ください。
ご要望などありましたら、Issue に内容を書いてお送りください。
[Github/Themaker](https://github.com/kilica/themaker)

## Themaker についてもっと知りたい
[XOOPS Cube Developper's Site](http://jp.xoopsdev.com/modules/wiki/?Menu%2Fthemes%2Fgenerator) も御覧ください
JasmineでbeforeEachを丁寧に使った方が良い理由

次のような簡単なクラスがあるとする。`index`というプロパティを持ち、そのプロパティを増やす`incrementIndex()`とプロパティを減らす`decrementIndex()`というメソッドを持つ。なお、クラスはテストから見えるようにexportしている。

```coffeescript:
root = exports ? this
class root.SomeClass
  constructor: ->
    @index = 0
  incrementIndex: -> @index++
  decrementIndex: -> @index--
```

`beforeEach`を意識しないでテストを書くと以下のようになるだろう。ここではまず`index`プロパティに`3`を代入し、それを１増やしたら`4`になるべきだというテストを書いている。次に逆に1減らすと`2`になるべきだというテストを書いている。

```coffeescript
describe "Object", ->
  object = new SomeClass

  describe ".index", ->
    describe "when index = 3", ->
      object.index = 3

      describe "when next button is clicked", ->
        object.incrementIndex()
        it "returns 4", ->
          expect(object.index).toBe 4

      describe "when previous button is clicked", ->
        object.decrementIndex()
        it "returns 3", ->
          expect(object.index).toBe 2
```

しかし、このテストは次のように失敗する。

    Failing 2 specs

    Photos initialized .index when index = 3 when next button is clicked returns 4.
    Expected 3 to be 4.

    Photos initialized .index when index = 3 when previous button is clicked returns 3.
    Expected 3 to be 2.

さらに、ここでテストコードの最後の4行を削除すると、**テストは成功する**。

中で何が起きているのかよくわからないが、上のテストの`describe`同士はお互いに影響を及ぼしあっていることがわかる（わかる方コメントください涙）。

そこで`beforeEach`を使って書きなおす。

```coffeescript
describe "SomeClass", ->
  object = undefined
  beforeEach ->
    object = new SomeClass

  describe ".index", ->
    describe "when index = 3", ->
      beforeEach ->
        object.index = 3

      describe "when next button is clicked", ->
        beforeEach ->
          object.incrementIndex()
        it "returns 4", ->
          expect(object.index).toBe 4

      describe "when previous button is clicked", ->
        beforeEach ->
          object.decrementIndex()
        it "returns 3", ->
          expect(object.index).toBe 2
```

すると、テストは無事成功する。丁寧に`beforeEach`を使っておいた方が良さそうだとわかる。

-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
rails g scaffold のカスタマイズ


参考: http://guides.rubyonrails.org/generators.html

# テンプレートのカスタマイズ

`rake -T` では出てこないけど、下記のタスクを使う

```ruby
rake rails:templates:copy
```

すると下記のファイルが生成される。

```
lib
└── templates
    ├── erb
    │   ├── controller
    │   │   └── view.html.erb # rails g controlle で使われる
    │   ├── mailer
    │   │   └── view.text.erb # rails g mailer で使われる
    │   └── scaffold
    │       ├── _form.html.erb
    │       ├── edit.html.erb
    │       ├── index.html.erb
    │       ├── new.html.erb
    │       └── show.html.erb
    └── rails
        ├── assets
        │   ├── javascript.js
        │   └── stylesheet.css
        ├── controller
        │   └── controller.rb # rails g controller で使われる
        ├── helper
        │   └── helper.rb
        └── scaffold_controller
            └── controller.rb
```

上でコメントしたもの以外は `rails g scaffold` で使用される。
ここでたとえば `lib/templates/scaffold/show.html.erb` を変更すれば次に `rails g scaffold` した際に反映される。

# Haml を生成

scaffold で Haml を生成する場合 generator をつくる必要がある (`rake rails:templates:copy` は必要ない)。


```bash
rails g generator haml/scaffold
```

```
lib
└── generators
    └── haml
        └── scaffold
            ├── USAGE
            ├── scaffold_generator.rb
            └── templates
```

scaffold_generator.rb を下記のように修正する。

```ruby
require "rails/generators/erb/scaffold/scaffold_generator"
# erb 用の generator を継承する
class Haml::ScaffoldGenerator < Erb::Generators::ScaffoldGenerator
  source_root File.expand_path('../templates', __FILE__)

  protected
  def handler
    :haml
  end
end
```
`lib/generators/haml/scaffold/templates` 下に _form.haml, edit.haml, index.haml, new.haml, show.haml を用意する。

これらは erb として評価される。`rake rails:templates:copy` で生成される `lib/templates/erb/scaffold/*.html.erb` を参考に。

config/application.rb で、使用する generator を指定する。

```ruby
# config/application.rb
module Foo
  class Application < Rails::Application
    config.generators do |g|
      g.template_engine :haml
      # 下記も指定しておくと無駄な helper / js / css が生成されない
      # g.helper false
      # g.stylesheets false
      # g.javascripts false
    end
    # ...
  end
end
```
Opscode Chef clientの公式ワンライナーインストール

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

参照元：[http://www.opscode.com/chef/install/](http://www.opscode.com/chef/install/)



## 公式のinstall.sh

```
$ curl -k -L https://www.opscode.com/chef/install.sh | (sudo) bash
```

スクリプト内でプラットフォームを判別し、出来る範囲でインストールしてくれる。Rubyも組み込みで入っているのでとりあえずのchef-soloなどにちょうどいい。

もちろん`client.rb`とpemを用意すればchef-clientが動作する。


### cehf-serverを使っている場合

ホスティングでも自前でも、ServerがあるならBootstrapで作るほうがいい。

```
$ knife bootstrap FQDN (options)
```

bootstrapのテンプレートを見るとわかるが、プラットフォームによっては前述の`install.sh`が呼ばれることもある。
browsing remote bam file on local igv


`http://localhost:#{portnumber}/load?file=#{fileURL}&locus=#{locus}&genome=#{genome}`

Example
`http://localhost:60151/load?file=http://www.broadinstitute.org/igvdata/annotations/hg18/conservation/pi.12mer.wig.tdf&locus=egfr&genome=hg18`
Node.js の最新版を使ってみる


Node 0.10.0 では、Streaming API が新しくなるそうですね。
http://blog.nodejs.org/2012/12/21/streams2/

日頃 NVM を使っているけれど、NVM ではまだ入れられない最新の Node を使ってみたい、というときに。以下、Mac での手順です。

```
git clone git://github.com/joyent/node.git
./cofigure
make
make install
```

Node が `/usr/local` に入ります。インストールした Node を使いたいときには、NVM を現在のシェルで使わないようにします。

```
nvm deactivate
```

蛇足ですが `make install` の結果を保存しておくとアンインストールするときに助かるかもしれません。
浮動小数点数の乱数を生成する


    #define ARC4RANDOM_MAX      0x100000000

を定義しておいて、

    float randFloat(float a, float b)
    {
        return ((b-a)*((float)arc4random()/ARC4RANDOM_MAX))+a;
    }

これで `randFloat(0.0, 6.28);` みたいな感じで、 a から b の範囲の浮動小数点乱数を生成できます。

`arc4random()` の結果を `RAND_MAX` ではなく`ARC4RANDOM_MAX`で割るのがポイント。
俺の修正した issue#88 のファイルの一覧がほしいんだよぉお というとき

```git log --author=mkkproject --grep=#88 --stat
```
差分も欲しい時は `-p`
```git log --author=mkkproject --grep=#88 --stat -p
```

参考 http://git-scm.com/book/ja/Git-の基本-コミット履歴の閲覧
Xcode ビルド後に Growl 通知してみる

まず、growlnotify をインストール。Growl インストールパッケージの Extras フォルダに .pkg が入っている。

Xcode プロジェクトの Edit Scheme > Build > Post-actions に Run Script を追加して以下を記述：

```sh
/usr/local/bin/growlnotify --image /Applications/Xcode.app/Contents/Resources/Xcode.icns -t "Xcode" -m ${FULL_PRODUCT_NAME}
```