OmniAICreator/Qiita-1.07M huggingface dataset:
Modelの一対多を実装する

例えば、Blogテーブルにuser_idカラムがあり、これがUserテーブルへの外部キー制約になっているような場合、WebフレームワークではBlogモデルにuserフィールドを持たせて、そのフィールドにメッセージを送ると、参照しているUserモデルのインスタンスを返してくれるようになっている場合が多いと思います。
このような関係をBackbone.jsで実現しようと思い、つい以下のように書きたくなってしまうかも知れません。

```js
var User = Backbone.Model.extend({});
var author = new User({id: $(".user_id").html()});
var Blog = Backbone.Model.extend({});
var entry = new Backbone({text: $(".text").html(), user_id: author.id, user: author});
```

こうすれば確かに ` entry.get("user")` で`author` へのリファレンスを得ることができます。
僕も以前はこのような書き方をしたことがあったのですが、どうやらこれはBackbone.js的には正しくない使い方のようです。その理由はModelの`toJSON`メソッドの実装を見てみると分かります。

```js
// Backbone.js 0.5.3 から改変して抜粋
_.extend(Backbone.Model.prototype, {
  toJSON: function () {
    return _.clone(this.attributes);
  }
});
```

ここで`attributes`はModelに対して`set`や`get`メソッドで取得する属性が実際に格納されている場所です。つまり、上記のentryオブジェクトのattributesは以下のようになっているわけです

```js
entry.attributes == {text: $(".text").html(), user_id: author.id, user: author}
```

ここではModelであるはずのauthorに対して、再帰的にtoJSONを呼び出すという処理を行なっていませんね。
Backbone.syncでModelをWebサーバど同期するためにRESTful APIを呼び出す際にModelオブジェクトに`toJSON`メソッドを呼び、その返り値を`JSON.stringify`したものをAPIに投げるという処理を行なっています。
authorも同様にattributesなどを持っているので、これではUserテーブルにattributesカラムがあるかのようにAPIを呼び出していることになってしまいます。実際、scaffoldで作ったAPIに対してこのようなリクエストを発行してもRailsはエラーを出します。
回避方法は大きく分けて二通りあります。

##toJSONをオーバーライドする

BlogのtoJSONメソッドをオーバーライドしてuserを返り値から取り除けば回避できます。

```js
var Blog = Backbone.Model.extend({
  toJSON: function () {
    var json = _.clone(this.attributes);
    delete json.user;
    return json;
  }
});
```

これでも動きますが、次のおそらく意図しているであろう使い方の方が適当だと思います。

##メソッドにする

そもそもの悪の元凶は、userをattributesに入れてしまったことです。UserインスタンスをIDと紐付けて管理するオブジェクトを用意して、それに問い合わせるようにしてみます。

```js
var users = {};
users[author.id] = author;
var Blog = Backbone.Model.extend({
  getUser: function () {
    return users[this.get("user_id")];
  }
});
var entry = new Blog({user_id: author.id});
entry.getUser(); // => author
```

###Collectionを使う

Backbone.jsで複数のModelを管理するなら、Collectionを使うほうが適当だと思われます。

```js
var UserList = Backbone.Collection.extend({
  model: User
});
var users = new UserList([author]);
var Blog = Backbone.Model.extend({
  userList: users,
  getUser: function () {
    return this.userList.get(this.get("user_id"));
  }
});
var entry = new Blog({user_id: author.id});
entry.getUser(); // => author
```

##User側から参照しているBlogの一覧を取得する

Userインスタンスに対して、このユーザが作ったBlogの一覧を取得したいことが考えられます。これもBlogのCollectionを作るのがいいと思います。

```js
var BlogList = Backbone.Collection.extend({
  model: Blog
});
var blogs = new BlogList([entry]);
var User = Backbone.Model.extend({
  blogList: blogs,
  getBlogs: function () {
    return this.blogList.filter(function (blog) { return blog.get("user_id") == this.id }, this);
  }
});
```

余談ですが、ここCollectionインスタンスに`filter`メソッドを呼び出しています。同様に`each`、`reduce`、`find`などのunderscoreのメソッドが定義されており、これらは全てCollectionに追加されているModelの配列に対して呼び出されます。

##まとめ

Modelの一対多を表現する場合は、リファレンスを属性として保持するのではなく、リファレンスを返すメソッドを実装し、内部ではCollectionを使うのが、意図されている実装方法なのではないかと思います。
JavaScriptでページ離脱のイベントを補足する方法

よく「このページから離れても大丈夫ですか？」
というアラートが出るサイトがありますが、
そういったアラートを実装したいと思った場合、JavaScriptでページの離脱のイベントを補足するにはどうしたら良いでしょうか？
Yahoo!検索API経由でページの本文を取得するサンプル

Zend\_Rest\_Clientを使っています。

```php
<?php
require_once 'Zend/Rest/Client.php';

//アプリケーションIDは各自で取得したものを使ってください。
$appid = 'プレミアム検索対応のアプリケーションIDをここに記入';

//APIのベースURLを指定する
$client = new Zend_Rest_Client('http://search.yahooapis.jp/PremiumWebSearchService/V1/webSearch');

//パラメータを設定
$client
    ->appid($appid)
    ->query('知恵袋')
;

//リクエスト！
$response = $client->get();

//レスポンスからURLだけを収集
foreach ($response->Result as $res) {
    $urls[(string)$res->Title] = (string)$res->Url;
}
//(デバッグ出力) 
var_dump($urls);


//ひとつひとつ実際の本文を取得
foreach ($urls as $title => $url) {
    echo PHP_EOL,"$title:",PHP_EOL;

    //本文はHTMLなのでXML専用のZend_Rest_Clientは使わず、
    //Zend_Http_Clientを使用する。
    $client = new Zend_Http_Client($url);
    $responseObj = $client->request();

    //本文抽出
    var_dump($responseObj->getBody());
}
```
h3. 参考

http://developer.yahoo.co.jp/webapi/search/premium.html
http://framework.zend.com/manual/ja/zend.rest.client.html
プロセスが終了したのをGrowlで教えてくれるやつ

```shell:notify-process-end
#!/bin/sh
if [ $# -ne 1 ]; then
	echo "usage: $0 <pid>"
	exit 1
fi

while true
do
	EXISTS=1
	ps -f $1 1>/dev/null 2>&1 || EXISTS=0

	if [ $EXISTS -eq 0 ]; then
		growlnotify -m "Finish!!"
		exit
	fi

	sleep 1
done
```

```ps``` コマンドでプロセスID探して ```notify-process-end 1234``` と叩くだけ。

というのを作った思ったけど

```
sh loooooong_process.sh;  growlnotify -m "Owattayo!"
```

とかでも同じことができるなー
PHPでロードアベレージのログを取るワンライナー

ver2はこちら：http://qiita.com/items/1600

```shell
php -r "echo date('Y-m-d H:i:s'),',',implode(',', sys_getloadavg()),PHP_EOL;"  >> /var/log/uptime.log
```

こんな感じでたまる

```
2011-12-09 09:16:46,0.28,0.29,0.32
2011-12-09 09:16:50,0.26,0.29,0.32
2011-12-09 09:16:52,0.26,0.29,0.32
2011-12-09 09:16:54,0.24,0.28,0.31
```

cronに仕込むときは、which php で phpコマンドの絶対パスを調べて指定するのが吉。
Timerは一回cancelすると、再利用できない

Androidで使用しているTimerは一度キャンセルしてしまうと再利用できない。
まあ、常識かもしれないけど。

＃NGなコード
Timer mTimer = new Timer(true);
mTimer.schedule(checkTimetask, checkInterval, checkInterval);

mTimer.cancel();
mtimer..schedule(checkTimetask, checkInterval, checkInterval); //→ここでException発生する

＃直したコード
mTimer.cancel();
Timer mTimer = new Timer(true);//再度newしないと駄目。
mtimer..schedule(checkTimetask, checkInterval, checkInterval);
/dev/urandomで予測困難なトークンを作成

徳丸本より引用。PHPのrand()を使うより予測困難性が高いらしい。

```php
<?php
function getToken() {
  $s = file_get_contents('/dev/urandom', false, NULL, 0, 24);
  return base64_encode($s);
}
```

おそらくrand()を使うよりは遅いので、セキュリティ用途のものを作るときだけ、など使い分けるといい。
PHPUnitで定数のテストをするときは@runInSeparateProcessで別プロセスに

定数を動的に定義するようなプログラムを一つのテストプロセスでやってしまうと、定数は上書きできないためうまくテストできない。

そんなときはテストを別プロセスにすることでテスタブルになる。

やり方は ```@runInSeparateProcess``` アノテーションを別プロセスにしたいテストにつけるだけ。

```php
<?php
class ConstantTest extends PHPUnit_Framework_TestCase
{
	/**
	 * @runInSeparateProcess
	 */
	public function testConstant1()
	{
		define('THIS_IS_CONSTANT', 'foo');
		$this->assertSame('foo', THIS_IS_CONSTANT);
	}

	/**
	 * @runInSeparateProcess
	 */
	public function testConstant2()
	{
		define('THIS_IS_CONSTANT', 'bar');
		$this->assertSame('bar', THIS_IS_CONSTANT);
	}

	/**
	 * @runInSeparateProcess
	 */
	public function testConstant3()
	{
		define('THIS_IS_CONSTANT', 'baz');
		$this->assertSame('baz', THIS_IS_CONSTANT);
	}
}
```

実行結果

```
PHPUnit 3.6.3 by Sebastian Bergmann.

...

Time: 0 seconds, Memory: 4.75Mb

OK (3 tests, 3 assertions)
```
fluxflexを挨拶代わりにハックしてみた

fluxflexというクラウドサービスが便利そうなのですが、ワンクリックインストーラとか使わずにスクラッチからゴリゴリ書きたい派としては、中身がよくわからずブラックボックスです。

お前ら勝手にハックしろ、という意味なのだと解釈しました。

知りたいのは、主要な言語処理系のバージョンとパス。
具体的には、

 - perl, python, ghc, gccのパスとバージョン
 - /usr/localと/usr/lib以下の全ファイルリスト

を調べました。結果は[ここ](http://hamukazu.fluxflex.com/specs.txt)に置いてあります。
rubyはパスが通ってないんですが、これをみると２つのバージョンが入っているようですね。

 - /usr/local/rvm/rubies/ruby-1.8.7-p334/bin/ruby
 - /usr/local/rvm/rubies/ruby-1.9.2-p180/bin/ruby

です。

以下コードです

```bash:flx.sh
f=$HOME/public_html/specs.txt
date >$f

for cmd in perl python ghc gcc
do
echo "============================" >>$f 
which $cmd >>$f
$cmd --version >>$f 2>&1
done

echo "============================" >>$f
echo "result of 'find /usr/local' " >>$f
find /usr/local >>$f
 
echo "============================" >>$f
echo "result of 'find /usr/lib' " >>$f
find /usr/lib >>$f
```

```bash:.flx
[setup]

[deploy]

sh $HOME/flx.sh
```

デプロイスクリプトの.flxに全部入れちゃうと環境変数周りでうまくいかないので別ファイルにしました。
あと、これやって気づいたんですけど、pythonだけは標準エラーにバージョン番号吐くんですね。キモいです。
QiitaのJSONのURL

フォロー中の一覧
http://qiita.com/following_tag_items
自分の一覧
http://qiita.com/mime
フォロー中のユーザーの一覧
http://qiita.com/following_user_items?latest_item_id=1468
全体の一覧
http://qiita.com/public
通知一覧の件数
http://qiita.com/api/notifications/count


何に使うのかよく分からないもの。タグのアイコンが変更できるみたい
http://qiita.com/tags/Ruby/edit
カリー化とは

引数が複数ある関数の一つを固定化して、引数が減った状態の関数にするのが、カリー化。何がうれしいか。引数を隠蔽できることがうれしい。同じ引数を毎度毎度入力するのはだるいから、固定化できる部分はカリー化で固定して、変動する部分は引数を入れて使うということなのかな。眠たいからサンプルコードは書かない。関数型言語はかっこいい。
[memo] 当月の日付一覧 （Date.newの引数に負）

Date.newの引数に負の数が使えることを知らなかったのでメモ

```ruby
require "date"

Time.now.to_a[4..5].tap { |month, year| 
  puts [ *Date.new(year, month)..Date.new(year, month, -1) ] 
}
```
再帰とループの可読性について

再帰処理とループ処理は、どういう場面でどちらの方が可読性が高いのでしょうか。体感的なお話でもいいので、場合分けして教えてください。前提として、読み手は、再帰処理にそれなりに慣れ親しんでいるものとします。

個人的には、漸化式が複雑になる場合は再帰処理の方が可読性が高く、単純な場合はループ処理の方がよいのではないかという仮説があります。そもそも何をもって複雑さ、可読性とするかは決めかねるのですが(ネスト？)、そのあたりは個人的な意見でも構わないので教えてください。また、再帰とループの採用の判断基準について、可読性や計算量以外に考慮すべきことがあれば教えてください。
Pythonでテストを書いてプロファイル取ったりカバレッジ調べたり

noseでテストを書いてカバレッジを調べたいなら

``` $ nosetests --with-coverage
```

だけれど、そんなオプションないよと怒られたら
``` $ apt-get install python-coverage
```

する。プロファイラも同じく

``` $ nosetests --with-profiler
```

すればいいけどそんなオプションないよと怒られたら
``` $ apt-get install python-profiler
```
そのまんまですね。

``` $ coverage html
```

って打つとHTMLでカバレッジを出力してくれます綺麗！
自分で定義したBackbone.jsのクラスを拡張する

自分で定義したクラスを拡張する&親クラスのイニシャライザを呼びたいときは以下のようにします．

```js
var childClass = parentClass.extend({
    initialize: function() {
        parentClass.prototype.initialize.apply(this, arguments);
        // ...
    },
});
```

*コメントを受けて修正*
Backbone.jsでRailsのCSFR防止tokenをうまく扱う

## Rails3+Backboneでハマるポイント
Rails 3では，CSRFを防止するためにPOSTリクエストに専用のトークンを要求する仕組みがあります．
このトークンチェックを必須にした場合，Backbone.jsでのsyncやsaveなどで送るデータでもこのトークンをパラメタとして渡す必要があるため，saveなどで毎回`authenticity_token: token`を書かなければいけません．
もし書き忘れると「なぜかPOSTリクエストがうまく送れない」という事態になります．僕はこれによくハマりました…

## 対応
そこでsyncやsaveが内部的に使っているBackbone.syncを書き換え，tokenを必ず渡すようにします．
実際に書き換えるのはBackbonel.Model.toJSONです．JSONを作るときにtokenを差し込むようにします．

```js
var token = $('meta[name="csrf-token"]').attr('content');
Backbone.Model.prototype.toJSON = function() {
    return _(_.clone(this.attributes)).extend({
        authenticity_token: token
    });
};
```

あんまり綺麗なやり方じゃないですが，不要にはまるのを避けられます:D
HTTPClient4.0を使ったファイルアップロードの仕方

HTTPClient4.0を使ったファイルアップロードは以下のように出来る

    	File file = new File("more.txt");
    	DefaultHttpClient httpclient = new DefaultHttpClient();
       //パスワードの設定
    	httpclient.getCredentialsProvider().setCredentials(
                AuthScope.ANY,
                new UsernamePasswordCredentials(userId, password));
    	HttpPost method = new HttpPost(url);
    	MultipartEntity entity = new MultipartEntity();
    	FileBody fileBody = new FileBody(file,"application/octet-stream","UTF-8");
    	FormBodyPart bodyPart = new FormBodyPart("hoge",fileBody);
    	bodyPart.addField("filename",file.getName());
    	entity.addPart(bodyPart);

ヘッダの中身はこんな感じ
[Content-Disposition: form-data; name="hoge"; filename="moge.txt", Content-Type: application/octet-stream; charset=UTF-8, Content-Transfer-Encoding: binary, filename: moge.txt]
PhotoGalleryの写真を新規ファイルとしてアプリ内に保存する

PhotoGalleryから写真選択してアプリ内に新規ファイルとして保存するのに少しハマりました。
指定したファイルが存在しなかった場合createFileをしないといけなかったんですね。それだけです。

未確認ですがカメラなどのMediaでも同様だと思います。

```javascript:mediaNewFileSave.js
Titanium.Media.openPhotoGallery({
    success: function(event) {	        
        // アプリケーションデータディレクトリに出力する。
		var f = Ti.Filesystem.getFile(Titanium.Filesystem.applicationDataDirectory + "/" + 'name.png');
		if (!f.exists()) {
			f.createFile();
		}
		f.write(event.media);
    },
    error: function(error) {
        // notify(e.message);
    },
    cancel: function() {
        // キャンセル時の挙動
    },
    // 撮影データのフォトギャラリーへの保存
	saveToPhotoGallery:true,
    // 選択直後に拡大縮小移動をするか否かのフラグ
    allowEditing: true,
    // 選択可能なメディア種別を配列で指定
    mediaTypes:[Ti.Media.MEDIA_TYPE_PHOTO]
});
```
XXXstat系コマンドをまとめて置き換えるdstatコマンド

WEB+DB PRESS vol.65より．

```sh
dstat --cpu --disk
```

のようにすると，1秒ごとのcpu使用率とdisk I/Oを色付きで表示してくれる．他にも--swapや--netなど．
詳しくはヘルプ(dstat -h)参照．
Backbone.jsのコードがスマフォで読める『CodeLibrary』をリリースしました^^

Backbone.js等、OSSのコードがスマフォで読める『CodeLibrary』をリリースしました^^ ／ 空き時間にスマフォでソースコードが読める『CodeLibrary』をリリースしました！ - hamheiの日記  http://d.hatena.ne.jp/hamhei/20111224/1324734053
Received authentication challenge is nullRelevan／Twitter4Jでログインに失敗する

端末の時間設定が、実際の時間と大きくずれているため、Twitter認証に失敗している。
５分くらいのずれなら問題ないが、１時間くらいずれているとこのエラーが発生する。

Twitterサーバー側ではじかれるので、アプリ側ではこのエラーが出たときにユーザに警告するしかなさそう。

エラー：
E/twitter ( 3682): Received authentication challenge is nullRelevant discussions can be on the Internet at:
E/twitter ( 3682): http://www.google.co.jp/search?q=10f5ada3 or
E/twitter ( 3682): http://www.google.co.jp/search?q=dceba048
E/twitter ( 3682): TwitterException{exceptionCode=[10f5ada3-dceba048 b8c63e52-c088647f], statusCode=-1, retryAfter=-1, rateLimitStatus=null, featureSpecificRateLimitStatus=null, version=2.2.4}

参考：http://stackoverflow.com/questions/6129316/twitter4j-android-authentication-challenge-is-null-exception
Javaでprivateなフィールド＆メソッドにアクセスする方法

```Java:Main.java
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Main {
	public static void main(String[] args)  throws Exception {
		MyClass obj = new MyClass("abc");

//		Compile error
//		obj.print();
		
		Method method = obj.getClass().getDeclaredMethod("print", new Class[] {});
		method.setAccessible(true);
		method.invoke(obj, new Object[] {});

		Field nameField = obj.getClass().getDeclaredField("str");
		nameField.setAccessible(true);
		nameField.set(obj, "def");
		method.invoke(obj, new Object[] {});
	}
}
``` 

```Java:MyClass.java
public class MyClass {
	private final String str;

	public MyClass(String str) {
		this.str = str;
	}

	private void print() {
		System.out.println(str);
	}
}
```
PerlでGmailから添付つきメール

```perl:send_mail_with_attachment.pl
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use Path::Class qw/file/;
use Encode;
use Email::Sender::Simple qw/try_to_sendmail/;
use Email::MIME;
use Email::MIME::Creator;
use Email::Sender::Transport::SMTP::TLS;

my $username = 'gmail-user-name';
my $password = 'gmail-password';

my $from     = "$username\@gmail.com";
my $to       = 'example@example.com';

my $subject  = 'subject';
my $body     = 'body';

my $file     = file('/path/to/attachment');

my $email = Email::MIME->create(
    header => [
        From    => $from,
        To      => $to,
        Subject => Encode::encode('MIME-Header-ISO_2022_JP', $subject),
    ],
    parts => [
        # メール本文
        Email::MIME->create(
            attributes => {
                content_type => 'text/plain',
                charset      => 'iso-2022-jp',
                encoding     => '7bit',
            },
            body_str => $body,
        ),
        # 添付ファイル
        Email::MIME->create(
            attributes => {
                filename     => $file->basename,
                encoding     => 'base64',
                disposition  => "attachment",
            },
            body => scalar $file->slurp,
        ),
    ],
);

try_to_sendmail(
    $email,
    {   
        transport => Email::Sender::Transport::SMTP::TLS->new(
            host     => 'smtp.gmail.com',
            port     => 587,
            username => $username,
            password => $password,
        )
    }
) or do { ... };
```
複雑なHTMLを動的にロードするとき，JSテンプレートを利用するとよい

完全に遅れてしまっていてもはやAdvent Calendarではなくなっている「Backbone.js Advent Calendar」ですが，なんとか25日まで続けます:)
ちなみに昨日までの「Backbone.js入門」シリーズ(by @taka84u9)がとてもわかりやすいので，Backbone.jsを使ったことのない人はまずそちらから読むのがおすすめです．
(http://qiita.com/adcal/backbone の12/11分より)

## はじめに
Ajaxを利用して動的にHTMLをロードするとき，対象HTMLが複雑になってくるとJSだけで作るのはコストが大きくなってきます．(`append`の山)
またぱっとコードを見たときにどういうHTMLになるかわからず，デザイナーと共同作業もやりにくくなります．タグを1つ追加したいだけなのに，JSのコードを読んで追加処理を書くのはかなり面倒です．


## JavaScriptテンプレート
そこでJSテンプレート，例えば[jQuery template(beta)](http://api.jquery.com/jQuery.template/)や[mustache.js](https://github.com/janl/mustache.js)，[underscore.jsの_.template](http://documentcloud.github.com/underscore/#template)などを利用するとこうした問題を解決できます．
以下は_.templateの使い方です．(underscore.jsのドキュメントより引用)

```js
var list = "<% _.each(people, function(name) { %> <li><%= name %></li> <% }); %>";
_.template(list, {people : ['moe', 'curly', 'larry']});
// => "<li>moe</li><li>curly</li><li>larry</li>"
```

実際はこのようにテンプレート内容を文字列で渡すのではなく，以下のように別セクションに分けて記述すると思います．

```html
<script type="text/template" id="my-template">
 // テンプレート内容
</script>
<script type="text/javascript">
_.template($('#my-template').text(), data); // => html
</script>
```

## ちょっとした工夫(キャッシュ)
TwitterやQiitaのようなストリームタイプのページでは，テンプレート化したいブロックが1ページ内に何度も出てきます．そこでテンプレートを利用するときに，アイテムごとに同じテンプレートを毎回JSで処理するのは無駄です．
そこで以下のようにテンプレート処理後のデータをキャッシュしておくことで，処理を1度だけ行わせることができます．ここではunderscore.jsの_.templateを利用しています．
(underscore.jsについては[underscore.js入門](http://qiita.com/items/1284)をどうぞ)

~~~js
// テンプレートの処理は1度だけ実行される
if ($('#my-template').length) {
    templateCache['my-template'] = _.template($('#my-template').html());
}

var myView = Backbone.View.extend({
    template: templateCache['item-box-template'],
    // ...
});
~~~

以上，JSテンプレートのすすめ&ちょっとした工夫でした．(あんまりBackbone.jsに関係ない…)
Rで連続変数からサンプリングした値を階級ごとに集計したい時

結果は一例です。

```r
> Z <- stats::rnorm(10000)
> table(cut(Z, breaks = -6:6))

(-6,-5] (-5,-4] (-4,-3] (-3,-2] (-2,-1]  (-1,0]   (0,1]   (1,2]   (2,3]   (3,4]   (4,5] 
      0       0      12     211    1371    3474    3346    1368     207      11       0 
  (5,6] 
      0 
> as.integer(table(cut(Z, breaks = -6:6)))
 [1]    0    0    8  210 1395 3433 3353 1391  197   12    1    0
```
改行テキストを配列に変換する

```php
$text = 'a
b
c

d

f
';
```

といった空白行まじりの改行テキストを次の処理にかけると

```php
$array = explode("\n", $text); // とりあえず行に分割
$array = array_map('trim', $array); // 各行にtrim()をかける
$array = array_filter($array, 'strlen'); // 文字数が0の行を取り除く
$array = array_values($array); // これはキーを連番に振りなおしてるだけ
```

空白行を取り除いたキレイな配列になる

```
array(5) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "f"
}
```
Rのヘルプの総目次をローカルで見るには(HTML版)

コンソールに

```r
help.start()
```

と打ち込むと、適当なportを通してwebサーバーが起動されてブラウザでヘルプが見られるようになる。
![help.start()](http://cdn-ak.f.st-hatena.com/images/fotolife/w/wakuteka/20111221/20111221135800.png?1324443500)
このport番号は固定ではないので、毎回同じURLでアクセスしたいときは

```r
help.start(remote=paste("file://", R.home(), sep=""))
```

のほうがよい。（ただし、Webサーバーを起動してないのでSearchなどはできなくなる）
Backbone.js入門 「Router と History」 

### 閲覧上の注意

この記事で対象としているバージョン0.5.3は結構古いので注意してください。

その他の割りと新しい情報は [Backbone.js Advent Calendar 2012](http://www.adventar.org/calendars/15) などにあります。

（追記ここまで）

----

Backbone.js入門の最終回は `Router` と `History` です。
[Backbone.js入門 「MVC」](http://qiita.com/items/1376)で述べたように、URL が変更された時に発生する `popstate` または `hashchange` イベントを監視してルーチンを起動するのが `Router` の役目です。`History` は `Router` の裏方で頑張る実体で、直接操作することはほとんどありません。
URL が変更された時にアクセスされるのが `Router` なので、Rails 的な MVC の枠組みで言えばコントローラと言えますし、伝統的な MVC で言えば全てのアンカーとブラウザの進退ボタンを管理するビューだと言えます。`View` がビューとコントローラの役割を両方もっていたように、`Router` も両方の役割を負っていると考えるのが自然でしょう。

##基本的な使い方

```js
MyRouter = Backbone.Router.extend({
    routes: {
        "foo/:hoge": "bar" // (1)
    },
    bar: function (hoge) {
        alert(hoge); // (2)
    }
});

new MyRouter();
Backbone.history.start();
```

このような設定があるとき `<a href="#foo/hogehoge">foo</a>` をクリックすると、URL のハッシュ値が `#foo/hogehoge` に変更されます。
その上で、**(1)** に記述されたルールが適応され `bar` が実行されます。`routes` にある `:hoge` という部分に対応する hogehoge が代入されて `bar` に渡されます。その結果 **(2)** が実行されて hogehoge とアラートされます。

##pushStateを使う

HTML5 の pushState が使えるブラウザではハッシュではなく、pushState を用いたルーティングをするように内部で書き換えることができます。

```js
Backbone.history.start({pushState: true});
```

この時、どこまでが実際の url でどこからがハッシュ値なのかが分からないため root で教えてやる必要があります。

```js
Backbone.history.start({pushState: true, root: "/hoge/"});
```

これにより、pushState によって URL が `/hoge/foo` に変更されるとその際に発生する popstate イベントに反応して **(2)** が実行されるようになります。
上で使った `<a href="#foo/hogehoge">` をクリックすることで popstate をさせたい場合は、jQuery と後述する `navigate` を使って次のように書くことができます。

```js
router = new MyRouter();
$("a[href^=#]").bind("click", function (e) {
    router.navigate($(this).attr("href").substr(1), true);
    e.preventDefault();
});
```

これにより `/hoge/foo/hogehoge` に URL が変わり、hogehoge と アラートされます。

pushState を有効にすることで、リソースを異なるページで管理しているように見せかけることができるようになりますが、以降でユーザが直接その URL にアクセスしてきたとしても同様のページを表示するようにしなければなりません。

##Router#navigate(fragment, [triggerRoute])

明示的にルーティングを変更します。`triggerRoute` に true を渡すと URL の書き換えと同時に、対応するコールバック関数を実行します。

##おわりに

以上で Backbone.js 入門は終わりです。
今回の一連の連載記事で Backbone.js で用いるオブジェクト達の利用方法を一通り見てきました。
これから Backbone.js を使ってみようと思う方の役にたてていれば幸いです。

Backbone.js は世界的に広く使われ始めた JavaScript フレームワークですが、日本ではまだそれほど多くの導入事例があるわけではありません。
一緒に Backbone.js を盛り上げていきましょう！

---

1. [Backbone.js入門 Events](http://qiita.com/items/16b799d0ec0a0ae3f78e)
2. [Backbone.js入門 MVC](http://qiita.com/items/03f49c64d6c4bacdbb26)
3. [Backbone.js入門 View](http://qiita.com/items/8ee2ed1949cd7c337f06)
4. [Backbone.js入門 Model](http://qiita.com/items/5acef8dd49f67fd7813c)
5. [Backbone.js入門 ViewとModelの連携](http://qiita.com/items/7ce4b1ceb5d18c9cef08)
6. [Backbone.js入門 Collection](http://qiita.com/items/c19d2fff0dc23e4015ff)
7. [Backbone.js入門 ViewとModelとCollectionの連携](http://qiita.com/items/7095a32cc5e438172844)
8. Backbone.js入門 RouterとHistory

- [BackboneJS 日本語メーリングリスト](https://groups.google.com/forum/?fromgroups#!forum/backbonejs-ja)
Rでパッケージのインストールディレクトリ以下を確認する方法

```r
> dir(system.file(package="base"),recursive=T)
 [1] "CITATION"                         "demo/error.catching.R"           
 [3] "demo/is.things.R"                 "demo/recursion.R"                
 [5] "demo/scoping.R"                   "DESCRIPTION"                     
 [7] "help/aliases.rds"                 "help/AnIndex"                    
 [9] "help/base.rdb"                    "help/base.rdx"                   
[11] "help/paths.rds"                   "html/00Index.html"               
[13] "html/R.css"                       "INDEX"                           
[15] "Meta/demo.rds"                    "Meta/hsearch.rds"                
[17] "Meta/links.rds"                   "Meta/package.rds"                
[19] "Meta/Rd.rds"                      "po/de/LC_MESSAGES/R-base.mo"     
[21] "po/en@quot/LC_MESSAGES/R-base.mo" "po/fr/LC_MESSAGES/R-base.mo"     
[23] "po/it/LC_MESSAGES/R-base.mo"      "po/ja/LC_MESSAGES/R-base.mo"     
[25] "po/ko/LC_MESSAGES/R-base.mo"      "po/pt_BR/LC_MESSAGES/R-base.mo"  
[27] "po/ru/LC_MESSAGES/R-base.mo"      "po/tr/LC_MESSAGES/R-base.mo"     
[29] "po/zh_CN/LC_MESSAGES/R-base.mo"   "R/base"                          
[31] "R/base.rdb"                       "R/base.rdx"                      
[33] "R/Rprofile" 

```
JavaScriptオブジェクトのディープコピーとシャローコピー

jQuery使うんだけど

```js
// Shallow copy
var newObject = jQuery.extend({}, oldObject);

// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);
```

出典
* http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-clone-a-javascript-object
Backbone.js入門 「Collection」

### 閲覧上の注意

この記事で対象としているバージョン0.5.3は結構古いので注意してください。

その他の割りと新しい情報は [Backbone.js Advent Calendar 2012](http://www.adventar.org/calendars/15) などにあります。

（追記ここまで）

----

今回は `Collection` です。
特に難しいことはなくて、複数の `Model` を扱うためのオブジェクトです。間違っても MVC の C ではないです。

##基本的な使い方

真新しさは特にありません。強いていうなら、`model` に何モデルの集まりを表すものかを指定するくらいです。

```js
var Blog = Backbone.Model.extend({});

var BlogList = Backbone.Collection.extend({
    model: Blog
});
```

インスタンス生成時にモデルを渡すことで初期化することが可能です。渡すのは `Model` インスタンスでも、単なるオブジェクトでも構いません。

```js
var blogA = new Blog({text: "foo"});
var blogs = new BlogList([blogA]);

// 以下でも同じ
var blogs = new BlogList([{text: "foo"}]);
var blogA = blogs.models[0];
```

`Collection#models` は実際の `Model` インスタンスが格納されている場所です。

##add(models, [options])

モデルを追加します。追加するのは上で書いたインスタンス生成の場合と同じく、 `Model` のインスタンスでも、オブジェクトでもかまいません。
add イベントが発生します。抑制するには `options` で silent を true にします。

##remove(models, [options])

モデルを削除します。remove イベントが発生するので、抑制するには silent を使います。

##reset(models, [options])

モデルを一旦全部削除してから、渡されたモデルで初期化します。reset イベントが発生します。抑制するには silent です。

##get(id)

`Model#id` の値を用いて、`Collection` の中からモデルオブジェクトを取得します。

##each, map, filter, etc.

以下の二つは等価です。

```js
_.each(blogs.models, function (blog) {/* do something */});

blogs.each(function (blog) {/* do something */});
```

このようなモデルに対する配列操作をするためのショートカットメソッドが複数用意されています。

##おわりに

`Collection` に関しては以上です。
明日は「Model と View と Collectionの連携」です。
今回は特に難しい話題はありませんでしたが、明日は `View` との連携の中でどのように `Collection` を扱えばよいかに焦点を当てて解説したいと思います。
それではまた明日。

---

1. [Backbone.js入門 Events](http://qiita.com/items/16b799d0ec0a0ae3f78e)
2. [Backbone.js入門 MVC](http://qiita.com/items/03f49c64d6c4bacdbb26)
3. [Backbone.js入門 View](http://qiita.com/items/8ee2ed1949cd7c337f06)
4. [Backbone.js入門 Model](http://qiita.com/items/5acef8dd49f67fd7813c)
5. [Backbone.js入門 ViewとModelの連携](http://qiita.com/items/7ce4b1ceb5d18c9cef08)
6. Backbone.js入門 Collection
7. [Backbone.js入門 ViewとModelとCollectionの連携](http://qiita.com/items/7095a32cc5e438172844)
8. [Backbone.js入門 RouterとHistory](http://qiita.com/items/13f3d1f71d31f3e78123)

- [BackboneJS 日本語メーリングリスト](https://groups.google.com/forum/?fromgroups#!forum/backbonejs-ja)
インストールされている gem を全て削除する。

1. `gem list` でリストを表示し、
2. `cut -d" " -f1` で名前を抽出し、
3. それを `gem uninstall` に投げる。

を下記で実行できる。

```
gem list | cut -d" " -f1 | xargs gem uninstall -aIx
```
バグ予測ツール

>グーグルのバグ予測アルゴリズムを実装したツール「bugspots」、オープンソースで公開 － Publickey - 
>http://www.publickey1.jp/blog/12/bugspots.html

なにこれ　イケメンすぎる　シビれた 週明けに早速会社で導入しよう　mercurial使ってるがgit乗り換えありうる
Special form はどこに定義されているのか

https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Compiler.java
clojure/lang/Compiler.java にある。

[where's let* ? - Clojure | Google グループ](http://groups.google.com/group/clojure/browse_thread/thread/a7e1884df570c9f6)
ターミナルに git のブランチ名を表示させたり、色を変えたり。

```bash:.bashrc
# .git-completion.bash は git のブランチ名の補完などを行なってくれる。
# ファイルは /usr/share/doc/git-VERSION/cntrib/completion/ あるいは、ソースをダウンロードしてきて、 cntrib/completion/ にあるはず。
# 以下では、現在のブランチ名が表示されるようにしている。ついでに、色を変えたり、時間を表示させたりもしている。
if [ -f ~/.git-completion.bash ]; then
    source ~/.git-completion.bash
    if [ -r "$HOME/.git-completion.bash" ]; then
        PS1='\[\033[01;32m\]\u@\h\[\033[01;33m\] \w$(__git_ps1 " (%s)") \n\[\033[00m\]$(date "+%Y/%m/%d %T") \$ ' 
    else  
        PS1="\[\033[01;32m\]\u@\h\[\033[01;33m\] \w \n\[\033[00m\]\$ "                                                                                  
    fi  
fi
```
railsのタグの中でjQueryMobileの属性を指定

当たり前すぎるかもしれませんが、分かってなかったのでメモ。
例えばselectでdata-native-menu="false"としたいとき、


`select_tag(name, @hoge, {:data-native-menu => "false"})`

だとエラーになりますが、

`select_tag(name, @hoge, {"data-native-menu" => "false"})`

だと上手くいきました。
NodeListをSequence化

```clojure
(doseq [u (goog.dom/getElementsByClass "myclass")]
  (...))
```

これをやるとエラー。

    Uncaught Error: No protocol method ISeqable.-seq defined for type object: [object NodeList]

goog.dom/getElementsByClass は NodeList を返すが NodeList は ISeqable を実装していないみたい。
NodeList は array likeなオブジェクトなのでarray の ISeqable を参考に ISeqable を実装した。というかコピーしただけ。
https://github.com/clojure/clojurescript/blob/master/src/cljs/cljs/core.cljs#L338

```clojure
(extend-type js/NodeList
  ISeqable
  (-seq [array] (array-seq array 0)))
```

**追記**
Operaだと動かなかった。
ログアウトはGETではなくPOSTで処理するべきか。

[web development - Logout: GET or POST? - Stack Overflow](http://stackoverflow.com/questions/3521290/logout-get-or-post)
結局どっちにすべきなんだ。

- 副作用があるから POST でやるべき。
- データを変更しないんだったらGETで。するんだったらPOSTで。
- GETだと他サイトのhtmlから`src="<your logout link>"` で勝手にログアウトされてしまう。

最後のは嫌だな。でもCookieを伴う普通のリクエストになるからlogoutになっちゃうな多分。
D2R - MySQLのデータからRDFの出力/SPARQLエンドポイントの設置

D2Rを使うとMySQL等のRDBのデータからRDFを出力することができる。またSPARQLのエンドポイントとしても機能する。
本家サイトはこちら： http://www4.wiwiss.fu-berlin.de/bizer/d2r-server/

動きとしては、RDBのテーブル／カラム構成とRDFでの出力結果をひもづけするマッピングファイルを用意して、それをもとにサーバーを起動する、という形になる。

![How D2R works](http://d2rq.org/images/architecture.png)

## セットアップ

基本的なセットアップは上記公式サイトからtar.gzをダウンロードしてきて展開すればOK

##  マッピングファイルのひな形を出力する

RDBの構成をどうRDFとして出力するかを記述するものがマッピングファイルである。
現状のカラム構成からマッピングファイルのひな形を出力するユーティリティコマンドが用意されている。
例えばlocalhostにあるblogというデータベースからマッピングファイルを出力する場合

```
$ ./generate-mapping -u john -p your_pw -d com.mysql.jdbc.Driver \
-o mapping.n3  jdbc:mysql://localhost/blog
```

## マッピングファイルの編集

マッピングファイルはひな形として出力したものから表示したくないカラムやテーブルを除けば、概ね使える状態になるが、テーブル間のアソシエーションを表現したい場合などは少々手を入れる必要がある。

例えば、一つのブログ記事に複数のコメントが紐づいていて、その情報を出力に加えたい場合は下記のようにd2r:join句を使って表現する

```
map:posts_comment a d2rq:PropertyBridge;
        d2rq:belongsToClassMap map:posts;
        d2rq:property vocab:comments;
        d2rq:uriPattern "http://yourblog.com/comments/@@comments.id@@";
        d2rq:join "posts.id <= comments.post_id";
        .
```

次に、例えば緯度データがミリ秒としてDBに入っているが、出力は度形式にしたい場合などはd2rq:sqlExpressionを使ってSQL文として演算を加える

```
@prefix geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> .

map:posts_lat a d2rq:PropertyBridge;
        d2rq:belongsToClassMap map:posts;
        d2rq:property geo:lat;
        d2rq:propertyDefinitionLabel "posts lat";
        d2rq:sqlExpression "posts.lat / (60.0 * 60.0 * 1000.0)";
        d2rq:datatype xsd:double;
        .
```


## サーバーの起動

変更を加えたマッピングファイルをmapping.n3とすると下記のコマンドでサーバーが立ちあがる

```
$ ./d2r-server -p 80 -b http://yourblog.com mapping.n3
```

ブラウザでアクセウスするとデータ全体をブラウズすることができる。
この場合、SPARQLエンドポイントは`http://yourblog.com/sparql`となる
これはどうにかなりませんかねえ

`Monad m => Maybe (m (Maybe b))`という型がついている物体の、二つのMaybeをエレガントに統合する方法もとむ

```haskell:MainRand.hs
recMapM :: forall a b m. (Data a, Data b, Monad m) => (b -> m b) -> a -> m a
recMapM f x = do
  let recurse = gmapM (recMapM f) x
  case cast x of
    Nothing -> recurse
    Just bx -> do
      z <- f bx
      case cast z of
        Nothing -> recurse
        Just az -> return az
```

c.f.
http://d.hatena.ne.jp/nushio/20120104
http://d.hatena.ne.jp/nushio/20120105
サイコロを振るモナド

モナドトランスフォーマーの練習

```haskell:Dice.hs
{-# OPTIONS -Wall #-}
import Control.Monad
import Control.Monad.Random
import Data.List

sumDice :: (MonadRandom m) => Int -> m Int
sumDice n = liftM sum $ replicateM n $ getRandomR (1,6)

statDice :: (MonadRandom m) => Int -> m [(Int,Int)]
statDice n = do
  liftM histogram $ replicateM n $ sumDice 2
  where
    histogram :: (Ord x) => [x] -> [(x,Int)]
    histogram = map (\xs -> (head xs, length xs)) . group . sort
  
pureStat :: [(Int, Int)]  
pureStat = evalRand (statDice 360000) (mkStdGen 890135)
  
main :: IO ()
main = do
  print pureStat
  statDice 360000 >>= print
```
高性能なAndroidアプリを作る方法

気をつければかなりパフォーマンス上がりそう。難しいけど(´・ω・`)

//Android開発でのパフォーマンスTips
http://labs.techfirm.co.jp/android/cho/1283

//Google Developer Day 2010のレポート
http://d.hatena.ne.jp/nakamura001/20101002/1286015483

//メモリリーク防止策
http://d.hatena.ne.jp/androidzaurus/20090121/1232519066
http://akisute.com/2010/10/android.html
画像ファイルの容量を小さくする(サイズ縮小/グレースケール化)

```sh:resize.sh
# jpgファイルを縦幅1024pxに縮小して上書き保存
mogrify -resize x1024 -unsharp 2x1.4+0.5+0 -verbose *.jpg

# pngファイルを横幅1024pxに縮小して上書き保存
mogrify -resize 1024x -unsharp 2x1.4+0.5+0 -verbose *.png

# pngファイルを80%に縮小して上書き保存
mogrify -resize 80% -unsharp 2x1.4+0.5+0 -verbose *.png
```

```sh:grayscale.sh
# pngファイルをグレースケールへ変換して上書き保存
mogrify -colorspace grayscale -verbose *.png
```
Android初めてのデザイナーさんと組んだ時に読んでもらうやつ

読んでもらうだけでだいぶ違う。共通の言語で進められるようにするのは大事。

//Androidアプリデザインの基礎知識
http://genesixdev.wordpress.com/2011/06/30/android%E3%82%A2%E3%83%97%E3%83%AA%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98/

//プログラマとデザイナが共有すべきUIに関するAndroidの10の機能
http://www.slideshare.net/youten_redo/uiandroid10
タイムゾーンを考慮した date time string <-> unix timestamp 相互変換

手元の適当スクリプトで一番使うやつ

```php:
<?php
/**
 * Usage:
 *
 *  $ php t.php 1324393200
 *      => 2011-12-20 15:00:00
 *  $ php t.php 1324393200 'Asia/Tokyo'
 *      => 2011-12-21 00:00:00
 *  $ php t.php '2011-12-21 00:00:00'
 *      => 1324393200
 *  $ php t.php '2011-12-21 00:00:00' 'UTC'
 *      => 1324425600
 */
if ($argc < 1) {
    exit(255);
}

if (preg_match('/^\d+$/', $argv[1])) {
    $dt = new \DateTime('@' . $argv[1]);
    if (isset($argv[2])) {
        $dt->setTimeZone(new \DateTimeZone($argv[2]));
    }

    echo $dt->format('Y-m-d H:i:s'), PHP_EOL;
} else {
    $dt = new \DateTime($argv[1], new \DateTimeZone(isset($argv[2]) ? $argv[2] : 'Asia/Tokyo'));
    $dt->setTimeZone(new \DateTimeZone('GMT'));
    echo $dt->format('U'), PHP_EOL;
}
```
Spork-testunit - speed up testing of Rails

Testing with Rails3.1 is quite slow.So I tried Spork to speed it up.
Spork is a kind of server for testing. Using that,we can skip initialization of rails app which is too heavy for each testing. 
While Spork is aimed to run with RSpec,I'm using test:unit (it's rails' default,as you know). So I put Spork and Spork-testunit gems in Gemfile.

```ruby:Gemfile
group :test, :development do
  gem 'spork'
  gem 'spork-testunit'
end
```

then,as usual

`$ bundle install`

after that,we have to prepare test_helper.rb for Spork.First,execute the command like this

`$ spork testunit --bootstrap`

Now,in test/test_helpr.rb,you can find Spork.prefork and Spork.each_run block.
So I put some code in those block as follows

```ruby:test_helper.rb
Spork.prefork do
  ENV["RAILS_ENV"] = "test"
  require File.expand_path('../../config/environment', __FILE__)
  require 'rails/test_help'
  
  class ActiveSupport::TestCase
    fixtures :all
    def login(user_id=nil)   
      @request.session[:user_id] = user_id
    end
  end
end

Spork.each_run do
  load "#{Rails.root}/config/routes.rb" 
  Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f }
end
```

Weird thing is that I have to load all the files in each_run block explicitly. However,without that,Spork server couldn't get any changes I've made on models or controllers. It could be bug,no?

Then start Spork server

`$ spork`

To do actual testing,do like this

`$ testdrb -Itest test/units/*rb`

Testing will be executed with Spork server. 
In my case,it took less than half the time of simple "rake test" testing. Worth trying.
PHPでページング

週末（じゃないけど）プログラミングなう。googleの検索結果のように

「前へ<< 1 2 3 4 5 6 7 8 9 10 >>次へ」

みたいなのを作りたく格闘中。ググるとサンプルコードがちらほらあるのだけれど、さてどれが参考になるかな…。
Eclipseでstatic importを簡単に扱う方法

こちらの記事を参考にしました。
http://piotrjagielski.com/blog/working-with-static-imports-in-eclipse/

### 自動的にスタティックインポートする

Eclipseでは、自動的にimport文を追加してくれますが、static importも同様に自動的に
追加する方法があります。

例えば、以下のスタティックメソッドを書くとします。

```java:サンプル
Preconditions.checkNotNull(hoge);
```

このcheckNotNullを、スタティックインポートするには、checkNotNullにカーソルを合わせたてCtrl+Shift+Mを
押します。
そうすると、以下のようにスタティックインポートしてくれます。

```java:サンプル
import static com.google.common.base.Preconditions.*;

...
checkNotNull(hoge);
```

### よく使うクラスはお気に入りへ登録すると更に便利

さらによく使うスタティックメソッドはお気に入りに登録しておくと、メソッド名をいきなり補完できるようになるので、さらに便利です。

そういう時は、「Window -> Preferences -> Java -> Editor -> Content Assist -> Favorites」でスタティックインポートしたいメソッドをお気に入りに設定しておくと良いです。

下記画像は元記事からの参照です。

![Eclipseお気に入り](http://piotrjagielski.com/blog/wp-content/uploads/2010/07/favorites.png "元記事より参照")

例えば、上記のcheckNotNullなどのようなユーティリティメソッドはよく使うので、com.google.common.base.Preconditions.*をお気に入りに登録しておきます。

その状態で、Eclipseのエディタ上で、checkNotNullと入力すると、PreconditionsのcheckNotNullが補完できるようになります。

jUnitのassert系のメソッドを使うときなども便利だと思います。
ドラゴン曲線（TeXブック付録Dのあれ）

過疎ってるので年明けの景気づけに。TeXブック付録Dの`\path`コマンドそのままですが、TeXブックの例に出てくる非実在フォント`\qc`の代わりにハートマークで描いてみました。

pdftex にかけるとこんなん出ます。
http://www.scribd.com/doc/77092245/Dragon-Curve

```tex:dragonheart.tex
%from the TeX book appendix D

\font\qc=cmsy5

\catcode`\ =9 \endlinechar=-1
\newcount\dir \newdimen\y \newdimen\w
\newif\ifvisible \let\B=\visibletrue \let\W=\visiblefalse
\newbox\NE \newbox\NW \newbox\SE \newbox\SW \newbox\NS \newbox\EW
\setbox\SW=\hbox{\qc \char'176} \setbox\NW=\hbox{\qc \char'176}
\setbox\NE=\hbox{\qc \char'176} \setbox\SE=\hbox{\qc \char'176}
\w=\wd\SW \dimen0=\fontdimen1\qc

\setbox\EW=\hbox{\kern-\dp\SW \vrule height\dimen0 width\wd\SW} \wd\EW=\w
\setbox\NS=\hbox{\vrule height\ht\SW depth\dp\SW width\dimen0}  \wd\NS=\w
\def\L{\ifcase\dir \dy+\NW \or\dx-\SW \or\dy-\SE \or\dx+\NE\dd-4\fi \dd+1}
\def\S{\ifcase\dir \dx+\EW \or\dy+\NS \or\dx-\EW \or\dy-\NW\fi}
\def\R{\ifcase\dir \dy-\SW\dd+4 \or\dx+\SE \or\dy+\NE \or\dx-\NW\fi \dd-1}
\def\T{\ifcase\dir\kern-\w\dd+2 \or\ey-\dd+2 \or\kern\w\dd-2 \or\ey+\dd-2\fi}
\edef\dd#1#2{\global\advance\dir#1#2\space}
\def\dx#1#2{\ifvisible\raise\y\copy#2 \if#1-\kern-2\w\fi\else\kern#1\w\fi}
\def\dy#1#2{\ifvisible\raise\y\copy#2 \kern-\w \fi \global\advance\y#1\w}
\def\ey#1{\global\advance\y#1\w}
\def\path#1{\hbox{\B \dir=0 \y=0pt #1}}
\catcode`\ 10

\endlinechar=`\^^M

\newcount\n
\def\dragon{\ifnum\n>0{\advance\n-1 \dragon\L\nogard}\fi}
\def\nogard{\ifnum\n>0{\advance\n-1 \dragon\R\nogard}\fi}

\hskip10mm\path{\dir=2 \n=13 \dragon}

\end
```
複数ファイルの名前をまとめて変更する

Linux/Mac で複数ファイルをリネームする場合 `rename` コマンドとかリネームソフト使うって手もありますがZsh使いなら `zmv` ですよねってことで `man zsh-lovers` からよく使うものをまとめてみました。

```sh:zmv-examples.sh
## 準備
# zmv を使用する前には `autoload zmv` する必要がある
# `man zshexpn` の PARAMETER EXPANSION とかも見ておくと捗る
# zmv の使用例については `man zsh-lovers` にたくさんあります

## 便利なオプション
## zmv のオプションについては `man zshcontrib` で調べることができる。
# zmv -n (実際にリネームする前に結果を確認)
zmv -n '*' '$f[5,-1]' # 例は頭4文字削除
# zmv -W ('(*)' '$1' を '*' で済ませられる)
zmv -W '*.sh' '*.pl' # 例は拡張子の変更
zmv '(*).sh' '$1.pl' # -W を使用しなかった場合

## ファイル名の一部を置換したい時
# 例) "file-hell.name" -> "file-heaven.name"
zmv '(*)hell(*)' '${1}heaven${2}'
# もしくは
zmv '*' '$f:s/hell/heaven/'

## 括弧の除去
# 例) foo-(bar).avi -> foo-bar.avi
zmv '*' '${f//[()]/}'

## 連番リネーム
# 例) foo.jpg > 1.jpg, fnord.jpg > 2.jpg, ..
c=1 zmv '*.jpg' '$((c++)).jpg'

## 連番リネーム(0埋め3桁)
# 例) foo.jpg > 001.jpg, fnord.jpg > 002.jpg, ..
c=1; zmv '*.jpg' '${(l:3::0:)$((c++))}.$1'

## 連番ファイルを0埋め桁揃え
# 例) 1.jpg -> 001.jpg, 2.jpg -> 002.jpg, ..
zmv '(<1->).jpg' '${(l:3::0:)1}.jpg'
# 例) pic1.jpg -> pic0001.jpg, pic2.jpg -> pic0002.jpg, ..
zmv 'pic(*).jpg' 'pic${(l:4::0:)1}.jpg'

## 拡張子をすべて小文字に揃える
# 例) 001.JPG > 001.jpg, 002.Jpg > 002.jpg, ..
zmv  '(*).(#i)jpg' '$1.jpg'

## スペースをハイフンに置換
# 例) foo bar baz.txt -> foo-bar-baz.txt
zmv '* *' '$f:gs/ /-'

## 小文字/大文字 に統一
zmv '(*)' '${(L)1}' # 小文字
zmv '(*)' '${(U)1}' # 大文字
```
名前空間の循環参照はできない

```clojure:foo.clj
(ns foo
  (require [bar]))
```

```clojure:bar.clj
(ns bar
  (require [foo]))
```

これはできない。slime で継ぎ足し継ぎ足し評価しているとエラーに気付きにくい。
nsマクロの後に in-ns と declare 関数でできそうな気もするがトリッキーなのでやっていない。
循環参照が起きる時点で名前空間の分け方がおかしいのかもしれない。

[Cyclic load dependency - Clojure | Google グループ](http://groups.google.com/group/clojure/browse_thread/thread/9aef135dafa6fe15)
DOM Element を def で束縛する

DOM操作は基本的にはページを読み込んでからしかできないので、

```clojure
(def main (goog.dom/getElement "main"))

(def mydiv (goog.dom/createDom "div"))

(goog.dom/appendChild main mydiv)

(defn change-color-mydiv []
  (... mydiv)))
```
これだと失敗する。
イベントにフックしておく。

```clojure
(defn init []

  (def main (goog.dom/getElement "main"))

  (def mydiv (goog.dom/createDom "div"))

  (goog.dom/appendChild main mydiv)

  (defn change-color-mydiv []
    (... mydiv)))

(goog.events/listen js/window goog.events.EventType/LOAD init)
```
def を関数内に書くのはClojure的じゃないが仕方ない。
他にはbodyタグを閉じる直前にscriptタグを書いておくテクニックもある。ちょっとトリッキー。

[Wrapping all def into a load event handler - Clojure | Google Groups](http://groups.google.com/group/clojure/browse_thread/thread/03df6bfc11ea024a?hl=en)
::-webkit-scrollbarをページ全体のスクロールバーに適用する

CSSにタグを指名しないで ::-webkit-scrollbar を書くとページ全体のスクロールバーに適用されることはされるんだけど、スクロールするとグチャグチャな表示になってしまう。

[::-webkit-scrollbarをページ全体のスクロールバーに適用する](http://less.carbonfairy.org/post/597327393)
このbodyに適用するテクニックだと、ページを開いてすぐのbodyにフォーカスがない段階でスペースでのスクロールが出来ないのが嫌。
解決策はなし。
Firefox は textarea の rows に常に1足してしまうそう。

開発者がブラウザのバグにはなるべく対応しない事が標準的な動作を促すんじゃないだろうか。
参考
[html - Height of textarea does not match the rows in Firefox - Stack Overflow]
(http://stackoverflow.com/questions/7695945/height-of-textarea-does-not-match-the-rows-in-firefox)
[html - One-row textarea in Firefox refuses to show vertical scrollbar - Stack Overflow](http://stackoverflow.com/questions/981193/one-row-textarea-in-firefox-refuses-to-show-vertical-scrollbar)
履歴のインクリメンタル検索でワイルドカードを使えるようにする

```sh:.zshrc
if zle -la | grep -q '^history-incremental-pattern-search'; then
  # zsh 4.3.10 以降でのみ有効
  bindkey '^R' history-incremental-pattern-search-backward
  bindkey '^S' history-incremental-pattern-search-forward
fi
```
アダルト動画ブックマークの動画上の広告を削除するブックマークレット

何度消しても表示してきてうっとうしいので書きました。
適当なブックマークのURL入力欄に下記をペーストして使ってください。
もしかしたらchromeのプラグインにするかもしれません。

```javascript:adbkm_remove_add.js
javascript:(function(d){var ad = d.getElementById('adlyr'); ad.parentNode.removeChild(ad)})(document)
もうORマッパーの作法を覚えるのが嫌だ、SQLの知識を活かせるORマッパーってないかな

基本的なSQLはこんな感じでPDO的にサクッとかけて

```php
<?php
$psql = new PrototypeSQL("SELECT * FROM users WHERE gender = :gender");
$psql->bindValue(':gender', '男');
$result = $psql->execute();
```

それでいて、動的な改変もできたりして

```php
<?php

$psql = new PrototypeSQL("SELECT * FROM hoge_table WHERE gender = :gender");
$psql->changeTable('users'); // テーブル名を動的に変えたり

if ( $minAge > 0 )
{
	$psql->addWhere('age', '>=', $minAge); // WHERE句に age (年齢）を追加したり
}

$psql->bindValue(':gender', '男');
$result = $psql->execute();
```

どんなリクエストもSQL的な言語でかけて
それでいて特定のRDBMSに依存しないORマッパーってないだろうか？
PHPUnitのgetMockでモッククラス名にnamespaceを指定する方法が分からない

```php:TestCase.php
<?php
    /**
     * Returns a mock object for the specified class.
     *
     * @param  string  $originalClassName
     * @param  array   $methods
     * @param  array   $arguments
     * @param  string  $mockClassName
     * @param  boolean $callOriginalConstructor
     * @param  boolean $callOriginalClone
     * @param  boolean $callAutoload
     * @return PHPUnit_Framework_MockObject_MockObject
     * @throws InvalidArgumentException
     * @since  Method available since Release 3.0.0
     */
    public function getMock($originalClassName, $methods = array(), array $arguments = array(), $mockClassName = '', $callOriginalConstructor = TRUE, $callOriginalClone = TRUE, $callAutoload = TRUE);
```

```PHPUnit_Framework_TestCase::getMock()``` の第4引数 ```$mockClassName``` で、生成されるモックオブジェクトのクラス名を指定できるようになっているけど、 ```$mockClassName``` に ```'\Foo\Bar\BazMock'``` のような名前空間付きのクラス名を指定するとFatalになってしまう。

正しいやり方があるのかもしれないけど、分からないので ```eval()``` でごまかした…。

```php
<?php

class FooTest extends PHPUnit_Framework_TestCase
{
	public function testFoo()
	{
		eval('
			namespace \Foo\Bar;
			
			class BazMock extends \Foo
			{
			}
		');

		$mock = new \Foo\Bar\BazMock();
		
		// … assert 
	}
}
```
メソッド内でパラメータの値チェックを行う

Google GuavaライブラリのPreconditionsクラスのメソッド達が便利です。
http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/base/Preconditions.html

### nullチェック

例えば、こんな感じでメソッドの先頭でパラメータの値がnullかどうかをチェックしたい事はよくあると思います。

```java:if文を使ってパラメータチェックをする場合
public void doSomething(String message) {
	if(message == null) {
		throw new NullPointerException("message must not be null.");
	}
	this.message = message;
}
```

いちいちif文を書くのが面倒ですが、Guavaライブラリを使うとこんな感じですっきり書くことが出来るようになります。

```java:checkNotNullを使用する場合
public void doSomething(String message) {
	this.message = checkNotNull(message, "message must not be null");
}
```

もし、messageがnullだった場合は、checkNotNullの第2引数をエラーメッセージとしたNullPointerExceptionが投げられます。

さらに、nullではなかった場合は、messageの値をそのまま返してくれるので、続けてcheckNotNullの返り値を使うことも出来ます。

### bool値を返す式によるチェック

他にも、bool値を返す式を引数に渡し、それが偽だった場合は例外を投げてくれるcheckArgumentのようなメソッドも用意されています。

```java:checkArgument
public void doSomethingElse(int value) {
    checkArgument(value > 0, "Expected positive but value was %s", value);
}
```
これは、valueに0以下の値が渡された場合、IllegalArgumentExceptionが投げられます。

### おまけ

Preconditionsで定義されている上記のメソッドはスタティックメソッドなので、static import剃る必要があります。
Eclipseでstatic importを簡単に書く方法はこちらにまとめています。
[Eclipseでstatic importを簡単に扱う方法](http://qiita.com/items/8c160e2f9ad6008d53ca)
RailsでBackbone.jsを使うときに使えるライブラリや資料など

Backbone.js Advent Calendar最終日です．他のエントリは[こちら](http://qiita.com/adcal/backbone)をどうぞ．

最後ということで，実際にBackbone.jsを使い始めるのに便利なリンクをまとめておきます．

# RailsでBackbone.jsを使うときに利用できるライブラリ
どちらも`rails g backbone:install`や`rails g backbone:scaffold`などを提供する

## [codebrew/backbone-rails - GitHub](https://github.com/codebrew/backbone-rails)
- modelやrouterのgeneratorも提供している

## [meleyal / backbone-on-rails - GitHub](https://github.com/meleyal/backbone-on-rails)
- [thoughtbot workshops](https://workshops.thoughtbot.com/backbone-js-on-rails)の思想を実現している
- デフォルトではcoffeescriptで雛形を生成する

これら2つの違いについては https://github.com/meleyal/backbone-on-rails/wiki/How-is-this-gem-different-to-backbone-rails%3F をどうぞ．

# Backbone.js全般
- [Backbone.jsを利用したクライアントサイドMVCの導入についてそろそろ書いておくか - 出町ミスド攻防記](http://d.hatena.ne.jp/kazuk_i/20110407/1302130947)
 - Backbone.js，クライアントサイドMVCについての詳細な説明．
- [Backbone.js のソースコードを読んだ - 刺身☆ブーメランのはてなブログ](http://kyanny.hatenablog.jp/entry/2011/12/31/014659)
 - コードリーディングの記録．
- [『Backbone.jsの1番良いリファレンスを頼む』へのAwesomeな回答を翻訳してみた - hamheiの日記](http://d.hatena.ne.jp/hamhei/20111202/1322814067)
 - [What are some good resources for Backbone.js? - Quora](http://www.quora.com/What-are-some-good-resources-for-Backbone-js)の翻訳+α．多くのリンクが集められており，一通り読むとBackbone.jsについて大体わかると思います
- [Advent Calendar for Backbone.js - Qiita](http://qiita.com/adcal/backbone)
 - 12/11からのBackbone.js入門シリーズはとても貴重な日本語コンテンツ．これからBackbone.jsを試す人は必読．
 - Backbone.jsについて日本一情報が集まった場所だと思う!
How to make a relationship between ticket and current_user.

At first , you should write belongs_to :user in ticket model.
And use merge! method to make a relationship between ticket and current_user in create action of tickets_controller. 

```ruby
  def create
    @ticket = @project.tickets.build(params[:ticket].merge!(:user => current_user))
    if @ticket.save
      flash[:notice] = "Ticket has been created."
      redirect_to [@project,@ticket]
    else
      flash[:alert] = "Ticket has not been created."
      render :action => "new"
    end
  end

```
application.cssのカスタマイズ for me

```scss
* {
  padding: 0px;
  margin: 0px;
}

html {
  background: white;
}

body {
  font: 13pt "Myriad Pro", Helvetica;
  margin: 5px 10% 0px 10%;
  height: 100%;
  padding: 30px;
  -moz-border-radius: 3px;
  -webkit-border-radius: 3px;
}

h1 {
  margin-bottom: 20px;
}

nav {
  margin: 10px 0px 10px 0px;
}

a {
  color: #74CC00;
}

textarea {
  padding: 3px;
  margin-top: 5px;
  margin-bottom: 5px;
}

input[type=file] {
  margin-top: 10px;
  margin-bottom: 10px;
}

.flash {
  padding: 10px;
  -moz-border-radius: 10px;
  -webkit-border-radius: 10px;
  font-weight: bold;
}

#notice {
  background: #85FF00;
  color: black;
}

#alert {
  background: #FF3444;
}


```
簡単にtoString()を実装する

Apache CommonsのCommons LangにToStringBuilderという良いビルダーがあります。

```java:ToStringSample.java
package org.yuichi;

import java.util.Map;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

import com.google.common.collect.Maps;

public class ToStringSample {
    private Map<String, String> map = Maps.newHashMap();

    public ToStringSample() {
        map.put("sample1", "hello");
        map.put("sample2", "world");
    }

    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    }
}
```

例えば、このようにtoString()をオーバーライドするとtoString()はこんな感じになります。

    org.yuichi.ToStringSample@2352544e[
      map={sample1=hello, sample2=world}
    ]

出力の形式はreflectionToString()の第2引数に色々渡すことで、変更できます。
pptファイルを見る方法: ファインダーでpptファイルを選択してスペース

知らないでgoogle docsとかに一旦上げてたりした。
参考 [Mac Viewer for Powerpoint ? - Mac-Forums.com](http://www.mac-forums.com/forums/os-x-operating-system/233585-mac-viewer-powerpoint.html)
cljs-watchを使って吐く javascript を名前空間ごとにバラバラのファイルにする

デフォルトは optimization がかかってるので
resources/public/cljs/bootstrap.js に全て一纏めになって吐き出される。
開発中はchromeのコンソールでファイル名が確認できた方がデバッグしやすいので
名前空間ごとのファイルに出力するよう、optimizationを無効にするオプションを指定しておく。

```bash
cljs-watch src/cljs '{:optimizations nil}'
```

```html
<script src="/cljs/goog/base.js" type="text/javascript"></script>
<script src="/cljs/bootstrap.js" type="text/javascript"></script>
<script type="text/javascript">goog.require('foo');</script>
```
marmalade を使ってelispパッケージのインストールが出来ない時

package.el を load-path に置いて

```elisp:.emacs.el
(require 'package)
(add-to-list 'package-archives
             '("marmalade" . "http://marmalade-repo.org/packages/"))
(package-initialize)
```

を書いたが、package-list-packages をやっても5分ぐらい固まって、marmaladeのパッケージを取得できない現象に当たる。
http://marmalade-repo.org/packages/archive-contents
が proxy error を返しているのが原因だった。メールで連絡したら返事はなかったが次の日には直っていた。自然に直ったのかもしれない。
backbone-localstorage.jsを使うとかなり簡単にデータの保存ができる

Backbone.jsのサンプルの一つに上がってる[todos.js](http://documentcloud.github.com/backbone/docs/todos.html)を読んでみると、どうも[backbone-localstorage.js](http://documentcloud.github.com/backbone/docs/backbone-localstorage.html)を使えばかなり簡単にデータを保存できるらしい。

##### [backbone-localstorage.js](http://documentcloud.github.com/backbone/docs/backbone-localstorage.html)とは 
> A simple module to replace [Backbone.sync](http://documentcloud.github.com/backbone/#Sync) with localStorage-based persistence. Models are given GUIDS, and saved into a JSON object. Simple as that.
> [backbone-localstorage.js](http://documentcloud.github.com/backbone/docs/backbone-localstorage.html)

```js

window.TodoList = Backbone.Collection.extend({
    model: Todo,
    localStorage: new Store("todos"), // これ
    // ...
});

```

で、使い方としては件のtodos.jsだと

```js

    initialize: function() {
      this.input    = this.$("#new-todo");

      Todos.bind('add',   this.addOne, this);
      Todos.bind('reset', this.addAll, this);
      Todos.bind('all',   this.render, this);

      Todos.fetch();
    },

```

こんな感じで初期化処理のときに保存してるtodoをロードしたり、

```js

 createOnEnter: function(e) {
      var text = this.input.val();
      if (!text || e.keyCode != 13) return;
      Todos.create({text: text});
      this.input.val('');
    },

```

こんな感じでデータをlocalStorageにcreateしたりしている模様。