OmniAICreator/Qiita-1.07M huggingface dataset:
お酒とお寿司のお礼

[Qiita/Kobito Meetup #1](http://atnd.org/events/30454) をやってたので出ました。お酒とお寿司ごちそうさまでした！

最後の最後に Qiita と他のブログサービスの棲み分けについてどう考えているか聞いてみたところ、現在何らかのソリューションを考えているとのことで安心しました。

次回以降もありそうなので、Qiita使ってる人は参加してQiitaに感想でも書けばいいと思います。
pow + rbenvで手軽なRack環境構築 

# pow + rbenvで手軽なRack環境構築

MacOSXでRack環境をlocalに手軽に準備するものとして `pow` があるのですが、これを `brew`で構築する方法を紹介します。

## インストール

`node.js`と`npm`がインストールされてない場合は別途必要となります。まだ入れてない場合には `brew`経由の場合には以下のようにすることでインストール出来ます。

```bash
$ brew install nodejs 
$ export NODE_PATH=/usr/local/lib/node_modules 
$ curl http://npmjs.org/install.sh | sh
```

NODE_PATH を .bashrc などに追加しておくことを忘れないようにしてください。

そしてpowのインストールもbrewを使うのであれば手軽に実行出来ます。5ステップで終わります。また `brew install pow` 以降のステップは `brew info pow` で確認出来ます。

```bash
$ brew install pow
$ sudo pow --install-system
$ pow --install-local
$ sudo launchctl load -w /Library/LaunchDaemons/cx.pow.firewall.plist
$ launchctl load -w ~/Library/LaunchAgents/cx.pow.powd.plist
```

## 環境設定

（2012/07/30 追記はじめ）

MoutainLionでインストールをしたところ、`POW_HOST_ROOT` が作成されないようですので、以下のステップが必要になりました。

```bash
$ eval $(pow --print-config)
$ mkdir  "`echo $POW_HOST_ROOT`" 
```
（2012/07/30 追記おわり）

`brew`経由だと `~/.pow` が作成されないので、別途作成する必要がありますが、以下の2ステップで終わります。（2012/07/20時点)

```bash
$ eval $(pow --print-config)
$ ln -s "`echo $POW_HOST_ROOT`" ~/.pow
```

## インストール確認

以下のコマンドで `{"pid":20226,"version":"0.4.0","requestCount":3}` のような表示が出ることを確認してください。表示されれば正常に動作しています。
エラーが出る場合は web共有がonになってないかチェックしてください。

```bash
$ curl -H Host:pow http://localhost/status.json
```
（2012/07/30 追記はじめ）

MoutainLionでインストールをしたところ、上記コマンドが `Empty reply from server` とエラーを返すようになりました。現時点で対策は分かりません。その代わり次のコマンドで `/System/Library/CoreServices/powerd.bundle/powerd` が表示されることを確認してください。

```bash
$ ps ax|grep -i pow
```
（2012/07/30 追記おわり）


## 動かし方

以下の2ステップです。

```bash
$ cd ~/.pow
$ ln -s /path/to/rackapp
```

これでRackアプリの最後のPath名が例えば `rackapp` であるならば、 `http://racpapp.dev` でアクセス出来るようになります。

```bash
$ open http://rackapp.dev
```

## rbenvとの連携について

特に必要なく動かせますが、 もし動作しないようならrbenvが動作している環境で

```bash
$ echo "export PATH=$PATH" >> ~/.powconfig
```

とすることで解決出来るかもしれません。
また、 `rbenv local 1.9.3-p194` 等とすることで、そのディレクトリ以下では指定したバージョンが動作するようです。

## 3rd party tools

次に `pow` を便利に利用するために `Powder` をインストールします。似たツールに `Powify` や `Showoff` などもありますが、お好きなものを選んでください。
ここでは `powder` を紹介します。

```bash
$ gem install powder
$ rbenv rehash
```

これらのツールを利用することで、インターネットコネクションが無い場合にはDNSにつながらないなどの理由で接続に失敗しする場合などに、`/etc/hosts` に `pow` で利用するホスト名を更新することで回避出来るのですが、これを手軽に利用することができます。

`powder`では以下のコマンドで行えます。

```bash
$ powder host        # /etc/hosts に powで利用するホスト名を追加
$ powder unhost      # /etc/hosts に powで利用するホスト名を削除
```

`pow`の一覧は以下で確認出来ます。

```bash
$ powder list
```

他、powのプロセスを再起動する場合には以下で行えます。

```bash
$ sudo powder respawn 
```

以下のコマンドでは Rack環境下でのみ実行できますが、それぞれステータス、Rack再起動、ログ表示が行えます。他にも便利な機能があるのでヘルプを見てください
（ただし、powderコマンドによるpowのインストール、アンインストールなどはbrew経由では無いので実施はしない方が良いと思われます）

```bash
$ powder status
$ powder restart
$ powder applog
```

## Q&A（らしきもの）

Q. 何が嬉しいの？
A. ブラウザで独自ドメイン(デフォルトでは`.dev`)で見れるようになりcookieなどもRackアプリごとに分ける必要が無くなります。

Q. メモリたくさん使うのでは？
A. アクセスしてから暫くの間のみプロセスが起動する事から影響は軽微だと思われます。

Q. トップレベルドメインは `.dev` 固定？
A. 例えば`.test`を使いたい場合には `.powconfig` に `export POW_DOMAINS=test` として、`powder respawn`で`pow`の再起動を行い、もし `/etc/resolver` 以下にファイルが有る場合はその名前を`test`にリネーム。また`/ets/hosts`に`pow`のホスト名が存在している場合には `powder host` で`/etc/hosts` を更新をすることで対応可能です。

Q. 手軽？
A. たぶん手軽です。
launchd のメモ


## launchd って?
init と rc と cron と inetd と watchdogd を足したようなスーパーデーモン。
Apple が開発し、たしか Tiger の頃に導入された。
Linux などにも移植されている。

## Agent と Daemon

## launchctl
#### 設定を有効にする
> launchctl load hoge.plist

#### 設定を無効にする
> launchctl unload hoge.plist

#### 設定の一覧を取得する
> launchctl list


## launchd 設定ファイル

TBD

### ファイル／ディレクトリの変更を監視する : WatchPaths

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<!-- 名前。ファイル名はcom.example.filewatch.plist とする (慣習) -->
	<key>Label</key>
	<string>com.example.filewatch</string>
	<!-- 実行するコマンド。これを argv として exec される -->
	<key>ProgramArguments</key>
	<array>
		<string>touch</string>
		<string>/tmp/hogehoge</string>
		<string>/tmp/fugafuga</string>
	</array>
	<!-- 変更を監視するファイル/フォルダのパス -->
	<!-- サブディレクトリの変更は追跡できない -->
	<!-- 例えば touch ~user1/hogehoge/sub/1 には反応しない -->
	<key>WatchPaths</key>
	<array>
		<string>/Users/user1/hogehoge</string>
	</array>
</dict>
</plist>
```

### 定期的に実行する : StartCalendarInterval

### 何かがマウントされたときに実行する : StartOnMount

```xml
<dict>
    ...
    <key>StartOnMount</key>
    <true/>
</dict>
```
抽象ドット密度tvdpiをもつエミュレータAVDをつくる

213dpiの端末をエミュレートするには下記の設定でAVDをつくる。
詳細：http://yuki312.blogspot.jp/2012/07/androidtvdpi.html

Skin Resolution：1280x800  or 600x960(Nexus7)
Abstract LCD：213
gitのリモートリポジトリを追加してバックアップ

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

共用のリポジトリに上げるほどでも無い運用ツールなどをgitのリモートを使って適当にBackupする。
下手にアーカイブなんかを作るよりも使い勝手が良いのでhookも使って自動化しておくのがよい。


## リモート側受け入れ準備
まず取りたい場所に空のリポジトリを作成します。
リモートにはURLを指定出来るので、リソースとして使用出来るところならどこでも良い。ディレクトリを作ってgit initする。

```bash:git_initialize
mkdir repo01 &&  cd repo01
git init
git config --add receive.denyCurrentBranch ignore
```

denyCurrentBranch をしてPushを受け入れるようにしたらとりあえず準備OK。

## ローカルでリモート追加

作業中のリポジトリで、リモートを追加しよう。urlで指定。

    git remote add remote1 file:///mnt/repo1
    git remote add remote2 ssh://your_server/opt/repo1

ローカルファイル、マウントしたNFSやssh越しなどお好みで。

addしたら remote show で接続できているか確認する。情報が取れたらOK。

```bash:CUI_output(Local)
  $ git remote show remote2
* remote remote2
  Fetch URL: ssh://your_server/opt/repo1
  Push  URL: ssh://your_server/opt/repo1
  HEAD branch: (unknown)
```


## pushする

remote1にmasterをPushする。

    git push remote1 master


### pushされた内容の反映
pushだけでは見える形で反映されないのでresetしてあげる。
git statusを見れば理由がわかるので詳しいことは省略。

```bash:CUI_output(Remote)
$ ls -a
./  ../ .git

$ git reset --hard HEAD
$ ls -a
./  ../ README .git

```


## hookで自動化

### リモートで自動 reset --hard
サンプルからpost-receiveを用意。

    cp .git/hooks/post-receive.sample .git/hooks/post-receive
    chmod +x .git/hooks/post-receive

最後にこんなかんじで追記しておくとpush完了後にresetがかかる。

```bash:post-receive
-- snip --
cd ..
git --git-dir=.git reset --hard HEAD
````


### ローカルコミット時に自動push
ローカルの方はpost-commitに書いておく。

```bash:post-commit
-- snip --
git push remote1 master
```
補完候補を一覧で表示: auto-complete.el

テキスト入力中に補完候補を出してくれる`auto-complete.el`をいれましました。

インストールは、[こちら](http://qiita.com/items/e81fca7a9797fe203e9f)の設定がしてあれば、`M-x package-list-packages`の一覧から`auto-complete`をインストールします。

設定ファイルに下記を追加します。

```common-lisp:.emacs.d/init.el
(require 'auto-complete-config)
(global-auto-complete-mode 1)
```

これで文字を入力していくと、`dabbrev-expand`の候補がポップアップで一覧が表示されるようになります。

[ここ](http://d.hatena.ne.jp/tkng/20090207/1234020003)を参考に、rubyのコードを補完できる`auto-complete-ruby`をいれたかったのですが、`auto-complete-ruby`のページがNot Foundになってしまっていますね。便利そうなのにな。
Fabricは直列、Capistranoは並列

[Fabric](http://docs.fabfile.org/en/latest/index.html) でも [Capistrano](https://github.com/capistrano/capistrano/wiki/) でも

```
run("echo stop")
run("echo modify")
run("echo start")
```

っていう感じで書けるんですが、複数サーバで実行する場合の順序が全然違うので要注意です。ロードバランサから外して、更新して、戻すなんてことを考えてると、Capistrano で死にます。

Fabric の場合:

 * サーバAをロードバランサから外す
 * サーバAを更新する
 * サーバAをロードバランサに戻す
 * サーバBをロードバランサから外す
 * サーバBを更新する
 * サーバBをロードバランサに戻す

Capistrano の場合:

 * サーバAをロードバランサから外す
 * サーバBをロードバランサから外す
 * サーバAを更新する
 * サーバBを更新する
 * サーバAをロードバランサに戻す
 * サーバBをロードバランサに戻す

Capistrano で Fabric の実行順序にするきれいな方法があればいいんですが。きれいな、というからには、汚い方法はあって、[Can Capistrano Execute Tasks on Hosts Consecutively? - Stack Overflow](http://stackoverflow.com/questions/4110602/can-capistrano-execute-tasks-on-hosts-consecutively) にいくつかの解決策が示されています。でもなー、これ cap っぽくないよなー、うーん。
WebViewでasset内の別のHTMLへのリンクが効かなくなることがある

1回目では遷移するが、2回目以降同じページを表示してからリンクをタップしても無反応になる。
戻るボタンで画面を終了させてもダメで、プロセスを落とさないと直らない。

どうやらリンクに```target="_blank"```が指定されているとダメな模様。

以下予測。
1回目は別ウィンドウが新規に開いたものとみなされて表示される。
2回目は、見えない別ウィンドウに表示されているのだろうが、そのウィンドウを手前に持ってくる処理がなされていないため、飛ばないように見えるようだ。
":w"みたいなコロン付きのファイルをgit rmする


Vimの操作を間違って、`:w`なんてファイルを作ってしまい、さらにそれを`git add`してしまいました。
こういうファイルをgitの管理外とするためには

````
git rm --cached '\:w'
````

と入力します。
で、コロンをうまくエスケープさせようしたときの試行錯誤をシミュレートすると、こんな感じになります。

````Bash
$ touch :w
$ ls
:w              Rakefile        config.ru       log             vendor
Gemfile         app             db              public          webrat.log
Gemfile.lock    bin             doc             script
README.markdown config          lib             spec
$ git add .
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	new file:   :w
#
$ git rm --cached :w
fatal: pathspec 'w' did not match any files
$ git rm --cached \:w
fatal: pathspec 'w' did not match any files
$ git rm --cached ':w'
fatal: pathspec 'w' did not match any files
$ git rm --cached '\:w'
rm ':w'
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	:w
nothing added to commit but untracked files present (use "git add" to track)
$ rm :w
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
````
dump先を標準出力に


dumpコマンドでファイルシステムのバックアップを行う際、データを標準出力に向けるには'-'を指定する。

```
# dump -0f - /dev/sda1 > backup.dump
```

もちろん圧縮もできる。

```
# dump -0f - /dev/sda1 | gzip > backup.dump.gz
```

参照 - http://ryouto.jp/linux/linux_20.html
C# で シングルトンパターン

# C# で シングルトンパターン

時々使うけど、すぐ忘れるのでメモ。

デザインパターンのうち、Singletonパターン（１つしかインスタンスを生成しない）

コンストラクタのスコープを private に変更し、
GetInstance()メソッドでインスタンスを取得するようにするのが肝です。

```csharp:sample_singleton.cs
// Singletonパターン
public sealed class SingletonClass
{
	private static SingletonClass _singleInstance = new SingletonClass();

	public static SingletonClass GetInstance()
	{
		return _singleInstance;
	}

	private SingletonClass()
	{
	    //TODO: initialization
	}
}
```

# 参考

* [C# - Singleton（たった１つのインスタンス）](http://hccweb1.bai.ne.jp/tsune-1/CSharp/singleton.html)

# 追記

SharpDevelopなら、新規作成→（中略）→シングルトンクラス を選択すると、
一瞬で以下のように生成してくれるじゃないですかーやだ恥ずかしー(赤面)

```csharp:SamplaSingletonClass.cs
using System;

namespace SampleLog4Net
{
	/// <summary>
	/// Description of ClassNullLogger.
	/// </summary>
	public sealed class ClassNullLogger
	{
		private static ClassNullLogger instance = new ClassNullLogger();
		
		public static ClassNullLogger Instance {
			get {
				return instance;
			}
		}
		
		private ClassNullLogger()
		{
		}
	}
}
```
TextMate2さん、さようなら、SublimeText2さん、こんにちは！


最近になって、急に騒がれ始めた感があるエディタ、[SublimeText2](http://www.sublimetext.com/2)ですが、皆さんは既にお試し頂けたでしょうか？

## TextMate2の正式リリースまだ？

私は今まで、[TextMate2](http://blog.macromates.com/2011/textmate-2-0-alpha/)を常用していました。TextMate2と言っても、現時点(2012/07)では、まだα版となっていて、正式にはリリースされていません。日本語入力にも、若干、問題があるし。一体いつ正式リリースされるんだ？と首を長くして待っていたんですが・・・。

## SublimeText2が良いだと？

そこに、突如、SublimeText2と言われるエディタが良いらしいという噂が舞い込んで来ました。早速、ダウンロードして少し試してみると、まー、なんというか、これがまた、TextMate2にそっくりなんですよね。もう、これはTextMate2の後継と呼んでもおかしくないです。では、勝手に良かれと思う点について、まとめてみましょう。

### めっちゃ軽い

TextMate2も割りと軽かった気がしますが、たまに、グルグル頭を悩ませてフリーズして落ちる事が多々ありました。しかし、SublimeText2はめっちゃ軽いです。動作が軽快と言った方が良いかもしれません。

### TextMate2のバンドルが流用可能

TextMate2では、独自のバンドルを追加する事で、機能を拡張してカスタマイズする事が可能でした。SublimeText2では、なんと、TextMate2で利用していたバンドルがそのまま流用可能となっています。あのバンドルや、このバンドルがSublimeText2上でも動作しますので、乗り換えの敷居を低くしていますね。

### 設定ファイルがJSON

よくある設定ファイルが、なんとJSON形式なんです。これは、つまり、設定ファイルをGitHubに上げておけば、いつでも、どこでも、最新の設定ファイルを複数マシンで共有出来ちゃうって事なんですよね。つーか、設定ファイルがJSONって、あんまり聞かないのでビックリしました。

### TextMate2っぽい操作感

TextMate2のファイル検索が凄く好きで愛用していたんですが、全く同一の操作がSublimeText2でも実装されていました。1年以上もTextMate2を愛用していたのに、一瞬にして乗り換えが可能だったのは、きっと、操作感がとても似ていたからだと思います。

## For Rails Developers

さて、SublimeText2でRailsの開発をするのに、手っ取り早い方法があります。それは、かの有名な[RailsTutorial](http://ruby.railstutorial.org/)の著者さんが、なんと、SublimeText2のRails仕様パッケージを提供してくれているんですね。感謝、感謝！

* [rails_tutorial_sublime_text](https://github.com/mhartl/rails_tutorial_sublime_text)

[RailsCasts](http://railscasts.com/)のテーマや、RailsTutorial製のスニペット、その他、オススメのパッケージとかもあったりします。詳しくは、[別エントリー](http://qiita.com/items/41b2a6646e4f36de09bf)で書いていますので、そちらも合わせて参考にしてみて下さい。

## まとめ

TextMate2を愛用していたエンジニアは、すんなりとSublimeText2に移行する事が出来るので、まずは、一度お試しあれ。Vimを愛用しているエンジニアの為に、Vimっぽいモードとかありますが、そもそも、Vim使いならば、Vimを使った方が気持ち良いですね、きっと。
jQuery Deferred の実装を調べてみた


## $.Deferred

コンストラクタである `$.Deferred()` 内では、まず `Promise` が作られ、それをクローンして `resolve()`, `reject()`, `progress()` を足した `Deferred` が返される。

以下は https://github.com/jquery/jquery/blob/1.7.2/src/deferred.js から抜粋。

```javascript
jQuery.extend({
  Deferred: function( func ) {
    var doneList = jQuery.Callbacks( "once memory" ),
        failList = jQuery.Callbacks( "once memory" ),
        progressList = jQuery.Callbacks( "memory" ),
        state = "pending",
        lists = {
          resolve: doneList,
          reject: failList,
          notify: progressList
        },
        promise = {
          done: doneList.add,
          fail: failList.add,
          progress: progressList.add,
          // 中略...
        },
        deferred = promise.promise({}),
        key;

    for ( key in lists ) {
      deferred[ key ] = lists[ key ].fire;
      deferred[ key + "With" ] = lists[ key ].fireWith;
    }

    // 中略...

    return deferred;
  }
  // 後略...
});
```

この `Promise` と `Deferred` はクロージャ内の同じ変数を操作する。つまり、インターフェイスは異なるが、持っている *状態* は同じ。ここでいう *状態* とは、基本的には `resolve()`, `reject()`, `progress()` に対応した `doneList`, `failList`, `progressList` という三つの $.Callbacks のこと。

## $.Callbacks

ここで出てきた `Callbacks` とは、jQuery 1.7 から導入された、複数のコールバックを管理してくれるオブジェクト。ざっくり言うと `add()` でコールバック関数を追加し、`fire()` で実行する。ちなみに `Callbacks` のメソッドは `this` を返すので、メソッドチェーンできる。

```javascript
function echo(message) {
  console.log(message);
}
$.Callbacks()
  .add(echo)
  .fire('hello');
// => hello と表示される。
```

### フラグ
コンストラクタである `$.Callbacks()` には、挙動を変えるためのフラグを引数として渡すことができる。複数のフラグが指定可能。`$.Deferred` の実装で使われている `once` と `memory` だけ見てみる。

#### once フラグ
一回しか `fire()` できない `Callbacks` になる。

```javascript
$.Callbacks('once')
  .add(echo)
  .fire('hello')
  .fire('world');
// => hello しか表示されない。
```

#### memory フラグ
最後の `fire()` の実行を覚えていて、その後に `add()` しても、コールバックが実行される。なお、事前に複数回 `fire()` されていても、コールバックは一回しか実行されない。引数は最後に実行された `fire()` のものが使われる。

```javascript
$.Callbacks('memory')
  .fire('hello')
  .fire('world')
  .add(echo);
// => world とだけ表示される。
```

### disable() と lock() の違い
`disable()` と `lock()` は、`$.Deferred` の実装の中で使われており、`Callbacks` を無効にするらしいが、ドキュメントを読んでもいまいち違いがよくわからなかった。ソースを見ると `memory` フラグがある時の挙動が違う様子。`disable()` するとコールバックがいっさい実行されなくなるのに対して、`lock()` の後に `add()` した場合はコールバックが実行される。

```javascript
$.Callbacks('memory')
  .fire('hello')
  .disable()
  .add(echo);
// => 何も表示されない。
$.Callbacks('memory')
  .fire('hello')
  .lock()
  .add(echo);
// => hello と表示される。
```

## $.Deferred での $.Callbacks の使われ方

`resolve()`, `reject()`, `progress()` の主な働きは、対応する `Callbacks` を `fire()` すること。

Deferred は一度しか `resolve()`/`reject()` できないようになっている。`doneList`, `failList` は `once` 指定されているので一回しか `fire()` できない。さらに `resolve()`/`reject()` は、他方の $.Callbacks を `disable()` し、`progressList` を `lock()` する。

ただし、三つの Callbacks は memory フラグが指定されているので、`fire()` された後も `add()` されればコールバックが実行される。このため `resolve()` した後でも `done()` などで足したコールバック関数は即座に実行される。
HerokuでphpをXdebugする


- heroku上でコンパイルしてもデプロイする度にインスタンスが新しくなってしまうので利用できない
- [Buildpacks](https://devcenter.heroku.com/articles/buildpacks)は誰かやって下さい

## 以下僕でも出来る方法

```
$ heroku run bash

$ uname -a
Linux 5d374fa1-800d-4209-82c0-f5b99683d1d7 2.6.32-343-ec2 #45+lp929941v1 SMP Tue Feb 21 14:07:44 UTC 2012 x86_64 GNU/Linux
```

[Komodo Remote Debugging Package Downloads](http://code.activestate.com/komodo/remotedebugging/)から

[PHP Remote Debugging Client Linux (x86_64)](http://downloads.activestate.com/Komodo/releases/7.1.0/remotedebugging/Komodo-PHPRemoteDebugging-7.1.0-72530-linux-x86_64.tar.gz)をダウンロード

解凍してphpのバージョンが合うものをherokuアプリのルートに置く

php.iniを作成して以下を追記（必要なオプションも追記）

```
zend_extension=/app/www/xdebug.so
```

git pushしてphpinfoを確認

![phpinfo](http://img.skitch.com/20120719-jnim7tgbyw5saperfykpykte66.png)

無事動作を確認
Github 公式の .gitignore 集

https://github.com/github/gitignore

プロジェクトや使用言語，フレームワークなどによって中身がまったく違う .gitignore ですが，上記のリポジトリに各言語やフレームワークごとの .gitignore の一例が置かれています．
.gitignore を書く際にすごく参考になります．
FQLで非indexableカラムを検索条件に加える方法


FQLは、SQLと違いFacebook側で"indexable"と指定されているカラムしか、基本的にはWHERE節の条件に使えません。(日時カラムなど一部例外)
https://developers.facebook.com/docs/reference/fql/

実際、次のようなクエリーにはエラーが帰ってきます。

```sql
SELECT eid, rsvp_status, start_time, uid
FROM event_member
WHERE
	uid = 131130253626713 AND
	1342585934 < start_time AND
	rsvp_status = "attending"
```

これは、[ドキュメント](https://developers.facebook.com/docs/reference/fql/event_member/)にあるように、event_memberテーブルでは```uid```と```eid```のみがindexable(インデックス可能)なためです。```rsvp_status```は検索条件の対象外ということになります。

※```start_time```は、indexableになってませんが例外のようです。ドキュメントにも使える旨書いてありますね。ちょっと不思議...。
※ちなみに、131130253626713は[下北沢オープンソースCafe](https://www.facebook.com/shimokitazawa.osscafe)の```uid```です。

## 解決策

しかし、これはあまりにも不便! ということで、何とかする方法が一応ありました。

```sql
SELECT eid, rsvp_status, start_time, uid
FROM event_member
WHERE
	rsvp_status = "attending" AND
	eid IN (
		SELECT eid 
		FROM event_member 
		WHERE uid = 131130253626713 AND 1342585934 < start_time)
```

このように、同じテーブルの検索なんですが、わざわざ2段階にするとOKです。

## 何でOKなの?

蛇足ですが、ドキュメントにあまり書かれていないので、以下推察。

### 推察1

FQLではindexableかどうかと同時に、パーミッションの有無が重要です。

0. いきなり検索条件に```rsvp_status```を加えると、(レコードによっては)パーミッションがなくて怒られる。
0. そこで、先に```uid = 131130253626713```として、パーミッション的に問題ない範囲に限定。
0. そうすると、```rsvp_status```指定しても、パーミッションのエラーが返らないので、クエリーが通る。

といった感じなのかなと。

### 推察2

もう一案。こっちかも。

0. ```IN (SELECT ...)```が条件節に設定されると、実はテンポラリテーブルが生成されている。
0. テンポラリテーブル内は、どのカラムも検索可能。

※くどいようですが、推察です。
Rails 3.2 のプロジェクトに jasmine 導入して CoffeeScript でテスト書くまで


(evergreen gem を使ったより簡単な方法を http://qiita.com/items/077d4bbe12adb22c7637 に書いています)

Rails プロジェクトで使用する JavaScript / CoffeeScript をテストするため、jasmine を導入する。

# jasmine gem 導入

```ruby
# Gemfile
gem "jasmine"
```

```bash
bundle
rails g jasmine:install
rails g jasmine:examples
rake jasmine
# Open browser
open http://localhost:8888/
```

rails g jasmine:examples で生成したスクリプトは削除してよい。

## spec の書き方

ここでは coffeescript で書いてるので後述の「spec を coffeescript で書く」参照。

```coffeescript
describe "true", ->
  it "should be truthy", ->
    # shouldBeTruthy はメソッドなので最後の () は省略不可
    expect(true).toBeTruthy()
```

## matcher の一覧

https://github.com/pivotal/jasmine/wiki/Matchers


# jasmine-jquery 導入

jasmine のみだと dom の絡む機能のテストを書く際に、createElement などでせっせと dom ツリーを作らないといけないし、関連するマッチャも用意しないといけない。

そのへんを省力化するためのツールが jasmine-jquery。

https://github.com/velesin/jasmine-jquery/downloads から jasmine-jquery-1.3.1.js をダウンロード、spec/javascripts/helpers へコピー。

## 追加される matcher

https://github.com/velesin/jasmine-jquery#jquery-matchers

## fixture

spec/javascripts/fixtures 下に html ファイルを作成する (内容は HTML フラグメント)。

test 中では `loadFixtures(ファイル名);` でページ中のフィクスチャ用コンテナ内にロードされる (ので fixture の要素には id つけとくべき)。

フィクスチャ用コンテナはテストごとに再作成される。

### その他の関数

* appendLoadFixtures(ファイル名, …): フィクスチャコンテナに追加
* readFixtures(ファイル名, …): フィクスチャの内容を文字列で返す
* setFixtures(html): 文字列か jQuery エレメントでフィクスチャコンテナの内容を置き換え
* appendSetFixtures(html): 文字列か jQuery エレメントでフィクスチャコンテナの内容を追加
* sandbox({attributeName: value, …}): div エレメントの作成、id がなければ sandbox になる。

# spec を coffeescript で書く

app/assets 下などは rails がコンパイルしてくれるので気にしなくてよいが、spec は自前でコンパイルする必要がある。

http://pivotallabs.com/users/mgehard/blog/articles/1683-using-jasmine-to-test-coffeescript-in-a-rails-3-1-app

```ruby
# Gemfile
gem "guard-coffeescript"
```

```bash
bundle
# Guardfile なければ
guard init
# guard init coffeescript してもいいけどどうせすぐ書き換える
```

```ruby
# Guardfile
guard "coffeescript", output: "spec/javascripts/compiled" do
  watch(%r{^spec/javascripts/(.*).coffee})
end
```

# livereload

テスト書き換えるたび手動でブラウザリロードするのはめんどくさいので guard-livereload で自動化する。

```ruby
# Gemfile
gem "guard-livereload"
```

```bash
bundle
guard init livereload
```

.coffee はチェックせず .js のみチェックすることで、コンパイル後のタイミングでリロードする。

```ruby
# Guardfile
guard 'livereload' do
  # 下記の 1 行を追加
  watch(%r{spec/javascripts/.+\.js})
end
```

ブラウザの extension は https://github.com/mockko/livereload/blob/master/README-old.md から。
Tclの配列を簡単にシリアライズする方法

array get と array set を使う。

シリアライズ側

```tcl
puts $fp [array get x] ;# 配列xをファイルへ書き出し
```

デシリアライズ側

```tcl
gets $fp buf
array set x $buf ;# 配列xの復元
```
サーバーにデータを送信できる読み取り専用フォームを作る


## 動機
入力画面 → 確認画面 → 登録完了画面というような画面遷移をするWebアプリケーションを作る際に、できるだけ入力画面と確認画面を共通化したい。
さらに確認画面から登録完了画面に遷移するタイミングでデータを更新するので、入力画面からだけではなく確認画面からも入力値をサーバーに送信する必要がある。

## 解決策
入力画面と確認画面は同じHTMLフォームを使いつつ、確認画面ではユーザーがフォームに表示されているデータを変更できないようにする。

### 確認環境
Mac

- Safari 5.1.7
- Chrome 20.0.1132.57
- Firefox 14.0.1

Windows

- IE9
- IE8
- IE7

### テキストボックス/テキストエリアの場合
readonly属性を付ける。なお、disabled属性を付けるとサーバーにデータが送信できないので、今回の動機を充たさない。

````html
<input name="a" type="text" value="hoge" readonly="readonly" />
<textarea name="b" readonly="readonly">piyo</textarea>
````

テキストボックスとテキストエリア以外はreadonly属性が使えないのでJavaScript(CoffeeScript)でユーザーの操作を無効化する等の工夫が必要になる。

### セレクトボックスの場合
onfocusイベントで変更前の値を保存し、onchangeイベントで強制的に変更前の値に戻す。
ここでは画面内の全セレクトボックスにそのような処理を付加するjQuery + CoffeeScriptの例を示す。

````coffeescript
$('select').live 'focus', ->
  this.previous_value = this.value

$('select').live 'change', ->
  this.value = this.previous_value
````

### ラジオボタンの場合
チェックされていないラジオボタンにdisabled属性を付けることで、「1つしか選択できないラジオボタン」を作る。
HTMLタグに直接disabled属性を付ける方法もあるが、ここでは画面内の全ラジオボタンに一括でdisabled属性を付与するjQuery + CoffeeScriptの例を示す。

````coffeescript
$(':radio:not(:checked)').attr('disabled', true)
````

### チェックボックスの場合
jQueryのpreventDefaultメソッドを使って、onclickイベントを無効化する。

````coffeescript
$(':checkbox').live 'click', (e) ->
  e.preventDefault()
````

## 参考情報
### 画面のデザインについて
値の変更を抑制するだけではなく、フォームが読み取り専用になっていることがわかるように、視覚的な変化を加えることが望ましい。

### 参考にしたWebサイト
http://www.koikikukan.com/archives/2009/04/26-003300.php

http://stackoverflow.com/questions/1953017/why-cant-radio-buttons-be-readonly

http://stackoverflow.com/questions/7427097/not-disabled-read-only-checkbox-in-jquery
jQuery Deferred を使って対象の違うアニメーションを順番に実行


(jQuery 1.7.2 を対象としています。1.8pre では `then()` が `pipe()` と同じものになっているので、かわりに `then()` を使っても動くようです。)

対象の要素が同じであれば、以下のように `animate()` を連続して呼ぶと queue にアニメーションが溜まり、順番に実行されます。

```javascript
$elem1.animate({left: 500}, 1000)
  .animate({top: 300}, 1000)
  .animate({left: 0}, 1000);
```

ところが queue は要素ごとであるため、対象の要素が違う場合は同じようにはいきません。そこで `$.Deferred` を使うことで同様のことが実現できます。

```javascript
$.Deferred(function(dfd) {
  dfd.pipe(function() { return $elem1.animate({left: 500}, 1000); })
     .pipe(function() { return $elem2.animate({top: 300}, 1000); })
     .pipe(function() { return $elem1.animate({left: 0}, 1000); });
}).resolve();
```

`pipe()` は、引数の関数の戻り値が observable である、つまり `promise()` という関数プロパティを持っていると、その戻り値の `Promise` を使って待ってくれます。`animate()` は jQuery オブジェクトを返しますが、jQuery オブジェクトの `promise()` は、要素のアニメーションが全て終わった時に `resolve` される `Promise` を返します。このため、アニメーションが順番に実行されるのです。

詳しくは以下を参照。

- http://api.jquery.com/deferred.pipe/
- http://api.jquery.com/promise/
- https://github.com/jquery/jquery/blob/1.7.2/src/deferred.js
ddの途中経過を表示する

ddコマンドのプロセスはSIGUSR1を受け取ると現在の進捗と速度(MB/sec)を標準エラー出力に出力する。

```bash
pidof dd | xargs kill -USR1
```

MacOS Xの場合はSIGUSR1ではなくSIGINFOで同様のことができる。
また、Ctrl+Tを入力するだけでも同様に進捗を表示してくれる。

```bash
pidof dd | xargs kill -INFO
```
ブロードキャストを受信するコンポーネントを調べる方法

特定のBroadcastIntentを受信するBroadcastReceiverの一覧を調べるには次のコマンド
を使用します。
詳細：http://yuki312.blogspot.jp/2012/07/android_18.html

```shell:コマンド
$ adb shell dumpsys activity 
```
html中の指定のタグを独自のロジックで置換

```php
<?php

/**
 * html中の指定のタグを独自のロジックで置換
 *
 * [変換前]
 *   <div><img src="http://google.com/" /></div>
 *   <p><img src="http://google.com/" /></p>
 *
 * [変換後]
 *  <div><iframe src="http://google.com/"></iframe></div>
 *  <p><iframe src="http://google.com/"></iframe></p> 
 *
 * @param string $html
 * @return string
 */
function convTag($html)
{
    return preg_replace_callback('/<img[^>]*>/', function($matches) {

        $img = $matches[0];

        if (strpos($img, 'src') === false) {
            return $img;
        }
        preg_match('/src="(.*)"/', $img, $src_matches);
        return '<iframe src="' . $src_matches[1] . '"></iframe>';

    }, $html);
}

$html = <<<HTML
<div><img src="http://google.com/" /></div>
<p><img src="http://google.com/" /></p>
HTML;

echo convTag($html);
```
FactoryGirlが用意してくれているCucumberステップ

FactoryGirlをCucumberから使うときに、step definitionを書く必要があるけれども、実はFactoryGirlに基本的な物が含まれているという話。でも英語だけなのが残念です。

## 基本手順

 フィーチャにてレコードを1個追加

```ruby:feature/mypost.feature
  Senario: really simple feature for Post
    Given the following post exists:
      | Title       | Body                |
      | a fun title | here is the content |
```

 対応する Factory を書く

```ruby:spec/factory_girl/mypost_factory.rb
  FactoryGirl.define do
    factory :post do
    end
  end
```

以上。

## フィーチャを書くときの注意

* クラス名は小文字で
* アンダーバーではなくスペースにする
* 単数と複数に注意

``` example.feature
  # AdminUserモデルで name 属性を "Mother" にする
  Given a admin user exists with a name of "Mother"

　# ２つの Post モデルを作る
  And 2 posts exists

  # 同じ Tag を 10 個作る
  Given 10 tags exist with a name of "crazy"

  # テーブルをもとに複数ユーザを追加
  And the following users exist:
    | Name | Email       |
    | hoge | hoge@me.com |
    | fuga |             |
```

## フィーチャを書くときの小技

* インスタンスが少ないのであれば、１行でできる。

```ruby:one_line
    Given a user exists with a name of "norobust"
```

* 関連(association)

```ruby:assoc
  Given the following Author exists
    | ID | Name     |
    | 12 | norobust |
  And the following Posts exists
    | Title      | Author         |
    | Thanks God | Name: norobust | 
```

* 関連(foreign key 指定してる場合)

ここでは、```has_many :posts, :foreign_key => :watcher_id``` みたいなのを前提に。

```ruby:assoc
  Given the following Author exists
    | ID | Name     |
    | 12 | Carmit   |
  And the following Posts exists
    | Title      | watcher_id |
    | Thanks God | ID: 14     | 
```

もちろん ```Name: Carmit``` でも大丈夫。

## ファクトリーを書くときの注意

```Given the following XXX exists``` の XXX が factory の名前になるようにします。

```ruby:feature
  Given a guest user exists
```
```ruby:factory
FactoryGirl.define do
  factory :guest_user, :class => User do
  end
end
```

## おまけ

FactoryGirlに同梱のfeatureより。

```ruby:feature
  Scenario: the user, norobust, exists
    When a user exists with name of "norobust"
    Then I should find the following for the last user:
    | Name     |
    | norobust |
```

要するに norobust ユーザを登録したら、最後のレコード(User.last)に norobust ユーザが居ますよというものです。
これをやるには、ステップを追加します。

```ruby:step_definitions/database_steps.rb
Then /^I should find the following for the last (.*):$/ do |model, table|
  model_class = model.gsub(" ","_").camelize.constantize
  last_instance = model_class.last or raise "No #{model.pluralize} exist"
  table.hashes.first.each do |key, value|
     last_instance.attributes[key.underscore].to_s.should == value
  end
end
```
Rail用のスニペット: yasnippet-rails

yasnippetにはruby-mode用のスニペットは標準でついているのですが、Railsには最適されていないので別途いれます。

まず、rhtml編集用のモードをいれます。

インストールはMELPAでパッケージがなかったので手動でいれます。[こちら](http://qiita.com/items/4c652ad4afccae5fe2ef)の設定をしているディレクトリにcloneします。

```
$ cd .emacs.d/eslip
$ git clone git://github.com/eschulte/rhtml.git
```

設定ファイルに下記を追加します。

```common-lisp:.emacs.d/init.e
;;; rhtml-mode
(require 'rhtml-mode)
```

次に、yasnippet-railsをいれます。インストールするディレクトリは`.emacs.d/snippets`にいれる事にしました。

```
$ cd .emacs.d/snippets
$ git clone https://github.com/eschulte/yasnippets-rails.git
```

設定ファイルに下記を追加します。

```common-lisp:.emacs.d/init.e
; yasnippets-rails
(yas/load-directory "~/.emacs.d/snippets/yasnippets-rails")
```

rhtml-modeでファイルを開いて、`%if`と入力して`TAB`を押すと以下で補完されます。

```ruby
<% if cond -%>

<% end -%>
```

ただ、なぜか同じ内容の候補が2つでます。これは、`~/.emacs.d/snippets/yasnippets-rails/rails-snippets`で`html-mode`が`rhtml-mode`にシンボリックリンクされているからのようです。私の場合は、`html-mode`では使わないのでシンボリックリンクを削除しました。そうすると候補が2つ出てこなくなります。
特定のディレクトリ配下のディレクトリをload-pathに追加する

手動でelispをいれる際に、いちいちload-pathを指定するのが面倒だったので下記の設定をしました。

```common-lisp:~/.emacs.d/init.el
;;; load-pathを追加する関数を定義
(defun add-to-load-path (&rest paths)
  (let (path)
    (dolist (path paths paths)
     (let ((default-directory (expand-file-name (concat user-emacs-directory path))))
        (add-to-list 'load-path default-directory)
         (if (fboundp 'normal-top-level-add-subdirs-to-load-path)
             (normal-top-level-add-subdirs-to-load-path))))))

;;; ディレクトリをサブディレクトリごとload-pathに追加
(add-to-load-path "elisp")
```

これで、`.emacs.d/elisp`以下にいれればload-pathに追加します。
HerokuのPostgreSQLのデータのエクスポート


[PG Backups](https://addons.heroku.com/pgbackups)というアドオンを使うとHeroku上のPostgreSQLからデータをバックアップしたり、エクスポート・インポートしたりできる。

使い方は[Dev Center](https://devcenter.heroku.com/articles/pgbackups)に載っている通り。

ここではデフォルトで提供される`DATABASE_URL`なDBに入っているデータをローカルのPostgreSQLに入れる手順をメモっておく。

## インストール

	$ heroku addons:add pgbackups
	----> Adding pgbackups to poison-beta... done, v319 (free)
      You can now use "pgbackups" to backup your databases or import an external backup.

## バックアップ

	$ heroku pgbackups:capture
	SHARED_DATABASE (DATABASE_URL)  ----backup--->  b001

このとき表示された`b001`というのがバックアップしたデータのID。

## バックアップ一覧

	$ heroku pgbackups

## ファイルに落とす

	$ heroku pgbackups:url b001
	"https://s3.amazonaws.com/hkpgbackups/...."

AWS S3上のURLが表示されるので、ここにアクセスするとPostgreSQLからダンプされたファイルをダウンロードできる。10分間だけ有効。

落としてきたデータはps_restoreを使うことでローカルのPostgreSQLにインポートできる。

	$ pg_restore --verbose --clean --no-acl --no-owner -h myhost -U myuser -d mydb b001.dump



## （ちなみに）バックアップからレストア

	$ heroku pgbackups:restore DATABASE b001

## （ちなみに）バックアップを削除する

	$ heroku pgbackups:destroy b001
samba3.6 最小設置 @ubuntu server 12.04

ちょっと共有が必要だったので日経linux 2011年12月号を参考にしながら設定しました

## 1 前提
  virtual box
  osインストール時にsamba server とopen ssh serverを選択
  バージョン確認
  
```
sudo smbd -v
```

  Version 3.6.3

## 2 /etc/samba/smb.confの編集
  [global]に追記  

```
  max protocol = SMB2
```
  
コメントアウト

```
  security = user
```

追記

```
  [ユーザ名]
    comment = 
    path = /home/ユーザー名/共有するディレクトリ
    public = no
    writable = yes
    printable = no
```

文法確認

```
  testparm -s 
```
 
## 3 sambaユーザーの設定

```
  sudo pdbedit -a -u ユーザー名
```
 
 *securty = userを設定しているので実存するunixユーザー名を使う

## 4 sambaサーバ をリスタート

```
  sudo service smbd restart
```
BOOL（YesOrNo）をNSNumberにしたり戻したり


``` objc:NSNumberSample

@implementation NSNumberSample

- (NSNumber *)toNumber:(BOOL)YesOrNo{
    return [NSNumber numberWithBool:YesOrNo];
}

- (BOOL)toBool:(NSNumber *)number{
	 // numberが0の時だけNO、それ以外はYESを返す
    return [number boolValue];
}

@end

```
Windows のワイルドカード文字列を正規表現に変換するメソッド

```
//
public static Regex WildCardToRegex(string wildCard) {
    if (wildCard == null) {
        throw new ArgumentNullException("wildCard");
    }
    if (wildCard == "") {
        throw new ArgumentException("wildCard");
    }
    CheckInvalidPathChars(wildCard);	//	throws ArgumentException();

    StringBuilder sb = new StringBuilder();

    var splitResult = wildCard.Split(Win32Path.PathSeparator);
    Debug.Assert(splitResult.Length > 0);

    foreach (var separated in splitResult) {
        var temp = separated;

        temp = Regex.Replace(temp, @"([$^\|.{}\[\]()+\\])", @"\$1");
        temp = Regex.Replace(temp, @"\*", @".*");
        temp = Regex.Replace(temp, @"\?", @".");

        sb.AppendFormat("|(?:{0})", temp);
    }
    sb.Remove(0, 1);
    string pattern = @"\\(" + sb.ToString() + ")$";

    return new Regex(pattern, RegexOptions.IgnoreCase);
}
```
__init__.pyをエスケープ

__init__.py …… あれ？init が太字？アンスコどこいったの？

そう、Markdown では `__` で囲むと太字になってしまうのです。Pythonista 殺しですね。じゃぁどうするか……

1. コード扱いする
------------------

    `__init__.py`

というように、バッククオートで囲んでコード扱いする案。結果は `__init__.py` となります。これが手数少ないし、コードの可読性も高いし、これでいいかなぁと思ってます。

欠点は、「`__init__.py` と app.py をコピーします」といった感じで、見た目において他の .py との一貫性がなくなってしまうこと。これが気にならないならこれで。

2. エスケープする
-----------------

    \_\_init\_\_.py

バックスラッシュ（円マーク）を使ったエスケープ。結果は \_\_init\_\_.py となります。通常の文章と同じ見た目になりますね。

欠点は……コードを書きにくいし、見づらいところ。


そういえば、たまたま `__init__.py` で気づいたからこんな事書いてますが、`__str__` とか `__repr__` でも同じ問題起こりますね。でもこれはコードなので、バッククオート一択ですね。
Windows のエクスプローラ(シェルがおかしくなった時は)

Twitter で困っている人を見かけたので。
Windows を使っているとたまにエクスプローラがおかしくなることがあります。
新しくフォルダを開けなくなったり、メニューが文字化けしたり、反応が悪くなったり・・・

こんな時は次の手順でエクスプローラを手動で再起動してみましょう。
コマンドプロンプトで次の順に操作します。

1. プロセス ID の確認

    ```cmd
    tasklist | findstr explorer
    ````

    左から2番目の数字がプロセス ID です。
    覚えておきましょう。

2. エクスプローラの強制終了

    ```cmd
    taskkill /f /pid (さっき確認したプロセスID)
    ```

3. エクスプローラの手動起動

    ```cmd
    start explorer
    ```
pow + xip.ioでページが開けない場合


## 症状
pow(powder)を使っているRailsアプリケーションで、http://myapp.dev は開くのに、http://myapp.10.0.0.1.xip.io は「サーバーが見つかりません」になってしまう。
同様にxip.ioのWebサイト( http://xip.io )も開くことができない。

## 原因
DNSの名前解決がうまくいっていない。

## 対処方法
Google Public DNSを利用してみる。
具体的にはDNSサーバーを 8.8.8.8 もしくは 8.8.4.4 に変更してみる。

## 参考にしたサイト
http://tomozo.hatenablog.com/entry/2012/06/21/124811

http://diary.holygrail.dj/entry/2012/06/28/173734

https://developers.google.com/speed/public-dns/docs/using
Amazon EC2 で play framework 1.2.5 を port 80 で 動かす

port80にするために、conf/application.confにて

```conf/application.conf
http.port=80
```

と設定したが、Could not bind on port 80 とエラーが出て強制終了されてしまう。
・セキュリティグループの設定が正しく80を開けていることを確認したか
・rootユーザで`play run`しているか確認
して、問題なく80で動作できた。
エイリアスを使ったマルチスクリーン対応

レイアウト別名をつけて、マルチスクリーンに対応する方法。
詳細：http://yuki312.blogspot.jp/2012/07/android.html


まずは下記2ファイルを用意します。
・res/layout/one_panels.xml (1パネル用)
・res/layout/two_panels.xml (2パネル用)

次に、それぞれのリソース修飾子毎にエイリアス指定したファイルを用意します。

```xml:res/values/layout.xml
<resources>
    <item name="main" type="layout">@layout/one_panels</item>
</resources>
```

```xml:res/values-sw600dp/layout.xml
<resources>
    <item name="main" type="layout">@layout/two_panels</item>
</resources>
```

```xml:res/values-large/layout.xml
<resources>
    <item name="main" type="layout">@layout/two_panels</item>
</resources>
```

javaコード側からはmainレイアウトを読み込むだけで、端末形状にあった
パネル数のレイアウトリソースが読み込まれます。
任意の配列キーで昇順ソート

```php
<?php
usort($data, function ($a, $b) {
       return ($a['unixtime'] < $b['unixtime']);
});
```

```php
<?php
// こういう配列を昇順で並べれる。
$data = array(
    array(
        'id' => 1
        'unixtime' => 12345678
    ),
    array(
        'id' => 2
        'unixtime' => 22345678
    ),
    array(
        'id' => 2
        'unixtime' => 32345678
    )
);
```
一覧でよくあるNEWマークを出すかどうかの判定

```php
<?php
    /**
     * 一覧でよくあるNEWマークを出すかどうかの判定
     *
     * @param int $datetime
     * @param int $range
     * @return bool
     */
    public function isNew($datetime, $range = 14/*2週間*/)
    {
        if (is_string($datetime)) {
            $datetime = strtotime($datetime);
        }
        return (round((time() - $datetime) / (60 * 60 * 24)) <= $range);
    }
```
簡単なCSVを取得するメソッド

```php
<?php
    /**
     * 簡単なCSVを取得するメソッド
     *
     * csvなのでShift_JIS+CRLFだが、utf8でもLFでも動く親切仕様。
     *
     * @param string $path
     * @return array|false
     */
    private function getCsv($path)
    {
        if (!file_exists($path)) {
            throw new Exception("{$path}が見つかりませんでした。");
        }
        $csv = file_get_contents($path);
        if (!$csv) {
            return false;
        }

        // UTF-8に変換
        $csv_encoding = mb_detect_encoding($csv);
        if (!in_array($csv_encoding, array('UTF-8', 'ASCII'))) {
            $csv = mb_convert_encoding($csv, 'UTF-8', $csv_encoding);
        }
        // 改行コードをLFに統一し、配列化
        $csv = str_replace(array("\r\n", "\r"), "\n", $csv);
        $csv_rows = explode("\n", $csv);

        // ヘッダーを削除
        array_shift($csv_rows);
        return $csv_rows;
    }
```
$.ajax で SVG の読み込み


SVG など拡張子が `.xml` でない XML を `$.ajax()` で読み込もうとすると、IE で結果がちゃんとパースされません。サーバで Content-Type を `image/svg+xml` に設定するか、拡張子を xml すると正常に読み込めるようになります。

http://stackoverflow.com/questions/3862850/external-loaded-svg-broken-in-ie-raphael-js
略語から定型文を入力する: yasnippet

定型文を入力できるようにyasnippetをいれます。

インストールは、[こちら](http://qiita.com/items/e81fca7a9797fe203e9f)の設定がしてあれば、`M-x package-list-packages`の一覧から`yasnippet-bundle`をインストールします。

設定ファイルに下記を追加します。

```common-lisp:.emacs.d/init.el
;;; yasnippet
(require 'yasnippet-bundle)
```

デフォルトでいろんなmode毎にスニペットが用意されています。

ここでは、ruby-modeでファイルを開いて、`if`を入力して`TAB`を押してみます。

そうすると、下記の様なコードが入力されます。カーソルもconditionの前に移動してくれます。

```ruby
if condition

end
```

これでだいぶプログラムする際の入力の手間が減らせそうです。
メモリ使用量についてのメモ


最近、ちょっと調べてみたのでメモ。

# 全体のメモリ使用量
```console
$ free
             total       used       free     shared    buffers     cached
Mem:       1697880     217852    1480028          0       9736      68932
-/+ buffers/cache:     139184    1558696
Swap:       917500         16     917484
```

こんな感じで表示される

`-/+ buffers/cache`

の`used`が実際に使用されているメモリ。

# プロセス毎のメモリ使用量

- RSSでソート

```console
$ ps aux --sort -rss
```

- VSZでソート

```console
$ ps aux --sort -vsize
```

これでメモリを食ってるプロセスを特定できる。

- RSSの合計

```console
$ ps aux | tail -n +2 | awk -F' ' '{sum += $6} END {print sum}'
```

で計算できる。(共有メモリとかもあるだろうから実際よりも多めな数字)

# それでもメモリが少ない？

Zabbixを見るとやたら`Used`が少ないマシンがあった。

役割が同じ別のマシンをみるともっと`Used`は少ない。

psでプロセス毎の使用量見てみると差がなかった。

- meminfoを見てみる

```console
$ cat /proc/meminfo
MemTotal:        1697880 kB
MemFree:         1476812 kB
Buffers:           11360 kB
Cached:            70192 kB
SwapCached:           12 kB
Active:           149724 kB
Inactive:          34712 kB
Active(anon):      89184 kB
Inactive(anon):    13996 kB
Active(file):      60540 kB
Inactive(file):    20716 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:        917500 kB
SwapFree:         917484 kB
Dirty:             31400 kB
Writeback:             0 kB
AnonPages:        102900 kB
Mapped:            58332 kB
Shmem:               296 kB
Slab:              16120 kB
SReclaimable:       8636 kB
SUnreclaim:         7484 kB
KernelStack:         784 kB
PageTables:         7008 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     1766440 kB
Committed_AS:     240912 kB
VmallocTotal:   34359738367 kB
VmallocUsed:        9272 kB
VmallocChunk:   34359727456 kB
```

これをみた時に`Slab`の値が大きく違った。(Usedの差分とほぼ同じくらい)

これはカーネル内のメモリ領域らしい。

だから、別に異常な状態ではなかった。

# キャッシュ周りを解放する

別に解放しなくてもいいのだけど一応手順を。

- ページキャッシュのみ解放

```console
# echo 1 > /proc/sys/vm/drop_caches
```

- Slabキャッシュのみ解放

```console
# echo 2 > /proc/sys/vm/drop_caches
```

- ページキャッシュとSlabキャッシュを解放

```console
# echo 3 > /proc/sys/vm/drop_caches
```
NamedNodeMap の要素へのアクセス


DOM 要素の attributes などは、キーでアクセスできる通常の Object ではなく、NamedNodeMap という配列のようなデータ構造になっています。

まず、配列のようにインデックスでのアクセス。小要素は `name` と `value` というプロパティを持っています。

```javascript
for (var i = 0; i < elem.attributes.length; i++) {
  var node = elem.attributes[i],
      key = node.name,
      value = node.value;
}
```

それからキー名でのアクセス。Chrome なら

```javascript
var title = elem.attributes['title'].value;
```

または

```javascript
var title = elem.attributes.title.value;
```

とできますが、IE ではエラーが出ます。`getNamedItem()` を使うのが正しいのでした。

```javascript
var title = elem.attributes.getNamedItem('title').value;
```
MakefileのTips (覚え書き)

今度ちゃんとまとめます

- 中間ファイルを自動的に削除しないようにしたい
-- .PRECIOUSまたは.SECONDARYを使用
- %がマッチしない
-- 次の行に空のコマンド行を追加してみる
- 関数は何がある
-- http://quruli.ivory.ne.jp/document/make_3.79.1/make-jp_14.html
- シェルの変数が動かない
-- $は$$と2度書く
- %にマッチした部分は何
-- $*
- makeの並列化をしたい
-- make -j コア数
- 自動変数は他に何がある
-- http://quruli.ivory.ne.jp/document/make_3.79.1/make-jp_9.html#Automatic
- 他の特殊なターゲットは何がある
-- http://theory.uwinnipeg.ca/localfiles/infofiles/make/make_36.html
ファイル監視にwatchdogがかなり便利な件

win32apiを叩くのはナンセンスだし、何より手軽に書きたかったのでpypiで探索していたら[watchdog](http://packages.python.org/watchdog/)というものを知りました。

以下が「*.jpg, *.png, *.txtの3つのファイルが、作成・編集・削除された時にそれを知らせる」コードです。

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

import time
import os

from watchdog.events import FileSystemEventHandler
from watchdog.observers import Observer

BASEDIR = os.path.abspath(os.path.dirname(__file__))

def getext(filename):
    return os.path.splitext(filename)[-1].lower()

class ChangeHandler(FileSystemEventHandler):

    def on_created(self, event):
        if event.is_directory:
            return
        if getext(event.src_path) in ('.jpg','.png','.txt'):
            print('%s has been created.' % event.src_path)

    def on_modified(self, event):
        if event.is_directory:
            return
        if getext(event.src_path) in ('.jpg','.png','.txt'):
            print('%s has been modified.' % event.src_path)

    def on_deleted(self, event):
        if event.is_directory:
            return
        if getext(event.src_path) in ('.jpg','.png','.txt'):
            print('%s has been deleted.' % event.src_path)

if __name__ in '__main__':
    while 1:
        event_handler = ChangeHandler()
        observer = Observer()
        observer.schedule(event_handler,BASEDIR,recursive=True)
        observer.start()
        try:
            while True:
                time.sleep(1)
        except KeyboardInterrupt:
            observer.stop()
        observer.join()

```

on_created, on_modified, on_deletedに自分が実行したい処理を書いていけばいいかと思います。

例えばdocを編集していちいち自分でmake htmlとせずともwatchdogを使えば自動化できてしまいます。

ただちょっと触って気になったところが、ファイル作成時にon_any_eventだと2回実行してしまうことです。

このコードを使ってみればわかると思うのですが、どうやら作成イベントは on_created, on_modifiedの順で実行されているためのようです。

OS内部のことはわからないのであくまで推定ですが。
Rubyスクリプトでサーバ証明書の期限をチェック

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

SSLコネクション用のサーバ証明書の期限をチェックして、OKなら0,NGなら2で終了するNagiosプラグイン的なスクリプト。


```ruby:check_cert_period.rb
#!/usr/bin/env ruby
# -*- coding:utf-8 -*-
require 'socket'
require 'openssl'
require 'timeout'
include OpenSSL

timeout=15

r_host = ARGV[0] || "google.com"
r_date = ARGV[1] || 30
r_port = ARGV[2] || 443
r_date_s = r_date.to_i * 60 * 60 * 24

# set SSL config
ssl_conf = SSL::SSLContext.new()
# ssl_conf.verify_mode=SSL::VERIFY_PEER

# create ssl connection.
begin
  timeout(timeout) {
    @soc = TCPSocket.new(r_host.to_s, r_port.to_i)
    @ssl = SSL::SSLSocket.new(@soc, ssl_conf)
    @ssl.connect
  }

rescue Timeout::Error => e
  puts "CRITICAL - #{e.class} couldn't connext to #{r_host.to_s}:#{r_port.to_i}"
  exit 2
rescue => e
  puts "CRITICAL - #{e.class} #{e.message}"
  exit 2
end

# check period.
if (@ssl.peer_cert.not_after - Time.now) < r_date_s
  puts "CRITICAL - Certificate expired on #{@ssl.peer_cert.not_after}"
  exit 2
else
  puts "OK - Certificate will expire on #{@ssl.peer_cert.not_after}"
end
  
@ssl.close
@soc.close
```


## 実行結果

第2引数に期限、3つ目にポートをオプションで。

    $ ./check_cert_period.rb google.com 30 
    OK - Certificate will expire on 2013-06-07 19:43:27 UTC
    $ ./check_cert_period.rb google.com 360
    CRITICAL - Certificate expired on 2013-06-07 19:43:27 UTC
    $ echo $?
    2
xcodeで最新のChildBrowserを使う方法について記事を書いてみた

やあ、みなさんどうも...

暇だったので、xcodeで最新のChildBrowserを使う方法について記事を書きました。

しかも、英語というｗｗ（要望がれば、日本語のTipsも書くかもしれないry

誰かの助けになれたらいいなって思います.

記事：[Installing the ChildBrowser for iOS/xcode with PhoneGap/Cordova 1.8.1 and 1.9.0](http://www.3ch.me/2012/07/newest-way-to-installing-childbrowser.html)
Hashいろいろ

俺俺レシピブック的なメモ。

###1. ハッシュの値を全てStringにする

```ruby:hash_to_string.rb
data = {
        showa: 1926,
        meiji: 1868,
        taisho: 1912,
        heisei: 1989,
  }

Hash[*data.to_a.map{|x| [x.first, x.last.to_s]}]
# => {:showa => “1926”, :meiji => “1868”,...}
```

###2. ハッシュを値でソートしてキーを返す

```ruby:sort_by_values.rb
data = {
        showa: 1926,
        meiji: 1868,
        taisho: 1912,
        heisei: 1989,
  }

data.invert.sort.map{|x| x.last}
# => [:meiji, :taisho, :showa, :heisei]
```

###3. 二つのArrayからHashを作成

```ruby:array_to_hash.rb
array_a = [:meiji, :taisho, :showa, :heisei]
array_b = [1868, 1912, 1926, 1989]

Hash[*array_a.map{
    |x| [x, array_b[array_a.index(x)]]
  }.flatten]
# => {:meiji => 1868, :taisho => 1912,...}
```

###4. 二つのHashをマージして値の大きい方を残す

```ruby:merge_hash.rb
hash_a = {
        meiji: 45,
        taisho: 1926,
        showa: 64,
        heisei: 2012
}

hash_b = {
        meiji: 1912,
        taisho: 15,
        showa: 1989,
        heisei: 24
}

hash_a.merge(hash_b){|k,a,b| [a,b].sort.last}
# => {:meiji => 1912, :taisho => 1926,...}
```
iOSと連携しているSNSのアカウント情報取得方法


今はTwitterだけだけど、iOS6でFacebookとか増えるので。
詳しくは
https://developer.apple.com/library/ios/#documentation/Accounts/Reference/ACAccountStoreClassRef/Reference/Reference.html
https://developer.apple.com/library/ios/#documentation/Accounts/Reference/ACAccountClassRef/Reference/Reference.html


``` objc:ACSample

@implementation ACSample

- (void)sample {
    ACAccountStore *accountStore = [[ACAccountStore alloc] init];
    // 今回はTwitterのアカウント取得するよ
    ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];

    [accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) {
        if (granted) {
            NSArray *accountsArray = [accountStore accountsWithAccountType:accountType];

            if ([accountsArray count] > 0) {
                // 複数連携されてる場合もあるよ
                ACAccount *twitterAccount = [accountsArray objectAtIndex:0];
            }
        } else {
            // ユーザーにアカウントへのアクセス拒否されたりするとこっちに来るよ
        }
    }];
}

@end

```
Cocos2d version 2.0で縦表示にする方法


## AppDelegate.m
```objective-c:AppDelegate.m
// Supported orientations: Landscape. Customize it for your own needs
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
	//return UIInterfaceOrientationIsLandscape(interfaceOrientation);
    return false;
}
```
bashのfunctionを外部に置いてcurlで取り込む

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

bashスクリプト間で関数を共通化したい時、ファイルならsourceやドットコマンドでやるところをGist等からcurlで取ってきたい時。


## Gistにサンプルのファンクション
<script src="https://gist.github.com/3126623.js?file=sample.func"></script>


## curlでgistのrawフォーマットを取り込むコード
ダブルクォートでevalを実行。

```bash:sample.sh 
#!/bin/bash

EXT=`curl -f -k -s https://raw.github.com/gist/3126623/35571a9e7ef8a7782368d5c39c2b0f03edf7b393/sample.func`
eval "$EXT"

pp
```

## 実行してみる

    $ ./sample.sh 
    pretty


Curlが対応しているurlなら同様の手順でOKのはず、特定環境内のコードを適当なWEBサーバで共有するのもよいだろう。
Cocos2d version2.0で推奨しない処理


## CCMenuItemFont

```
    // version 2.0
    CCMenuItemFont* menu = [CCMenuItemFont itemWithString:@"menu" target:self selector:@selector(onDo:)];

    // version 0.9
    CCMenuItemFont * menu = [CCMenuItemFont itemFromString:@"menu" target:self selector: @selector(onDo:)];
```

## CCDirector

```
    // version 2.0
    [[CCDirector sharedDirector] addChildViewController:viewController];


    // version 0.9
    [[[CCDirector sharedDirector] openGLView] addSubview:viewController.view];

```

## CCTouchDispatcher

```
    // version 2.0
    [[CCDirector sharedDirector] touchDispatcher];

    // version 0.9
    [CCTouchDispatcher sharedDispatcher];


```

## ここも合わせて読む
 * http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:migrate_to_v2.0
MacBook Pro Retinaディスプレイモデル + VirtualBoxにWindows7をインストールする


今まではMacBook + BootcampでWindows7を動かしていましたが、再起動が面倒なので、新しいMacBook Pro Retinaディスプレイモデルには仮想化ソフトを使ってインストールすることにしました。
最初はVMwareを使おうと思ったのですが、どうやらMacには無償版がないようなので、VirtualBoxを使うことにしました。

## 確認環境
* VirtualBox 4.1.18
* Windows7 Home Premium 64bit (DVD)
* Mac OS X 10.7.4
* MacBook Pro Retinaモデル

## 作業メモ等
### インストール用DVDのアクセス方法ついて
手順は基本的に[こちらのページ](http://idita.blog11.fc2.com/blog-entry-147.html)を参考にさせてもらいました。

ただし、MBPにはDVDドライブが付属していないので別のMacにてインストール用DVDのisoイメージを作成し、それをMBPにコピーしました。
isoイメージの作成方法は[こちらのページ](http://macfan.jp/guide/2009/08/13/windowsiso.html)を参考にしてください。

また、isoイメージのサイズは3GBオーバーになり、ネットワーク越しのファイルのコピーに何度も失敗したので、UNIXのsplitコマンドを使ってファイルを256MB程度に分割してから、共有フォルダ経由でMBPにコピーしました。

````bash
# コピー元のMac側
$ split -b 256m [isoイメージファイル名]
$ ls
xaa xab xac ...
````

````bash
# MBP側 - /Volumes/Publicをコピー元の共有フォルダとしている場合
$ cd [コピー先のディレクトリ]
$ cp $(ls /Volumes/Public/x*) .
# 分割したファイルを結合
$ cat x* > [isoイメージファイル名]
````

VirtualBoxで「インストールメディアを選択」する場合はこのisoイメージファイルを選択します。

### ライセンス認証について
過去にMacBookにインストールしたDVDを使ったので、ライセンス認証は電話を使った認証を要求されるのかと思いましたが、意外とインターネットを使用した認証だけで終了しました。
ライセンス認証の方法については[こちらのページ](http://windows.microsoft.com/ja-JP/windows7/activate-windows-7-on-this-computer)を参照してください。

### 画面表示について
さすがにRetinaに最適化はされていないので、フォント表示等はボンヤリ＆カクカクしていますが、Webページのデザイン崩れを確認する程度ならこれぐらいでも十分かなと思います。

### メモリの割当てについて
なお、メモリの割当ては最初2GBにしていましたが、起動するだけでがっぽりMac側のメモリを食ってしまうので、1GBに下げました。

### ディスクイメージの容量について
可変サイズにしていますが、OSインストール直後でvdiファイルのサイズが9GBちょっとです。
ブラウザしか使わないなら、20GBぐらいで十分かもしれません。