OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyのコードを読むのが捗る技 (Vim)

Rubyでソースコードを読む時の小技について書いてみようと思う。

この投稿も参考になる。
Rubyでメソッドの定義場所を見つける方法 #Ruby - Qiita http://qiita.com/items/fc8a61b421d026a23ffe

ちなみに、私はVimmerなので、Vimに寄った話です。
emacsについては身近にemacsユーザーに聞きましょう。

## ctagsを活用する
ctagsでtagsファイルを出力しておけば、メソッドの定義元に飛ぶのが非常に楽になります。
Railsで開発しているなら、Railsのプロジェクトルートで以下のようなコマンドを打ちます。

```sh
ctags --langmap=RUBY:.rb --exclude="*.js"  --exclude=".git*" -R .
```
(bundlerでプロジェクト内にGemがある場合を想定)

langmapとかは別に無くても大丈夫だと思いますが。
--excludeを付けずにctagsを実行するとjavascriptのライブラリもタグ付けされて、
ノイズが多くなるので除外しておきます。

VimでRubyのコードを開きます。
この時、カレントディレクトリはtagsのあるディレクトリに揃えておきます。

定義元を知りたいメソッドにカーソルを合わせて、`<CTRL-]>`をタイプすると、
定義元にジャンプできます。
戻りたい時は、`<CTRL-T>`をタイプします。スタックを辿って戻っていけます。

マッチ対象が複数ある場合は、最初にヒットした箇所へ飛ぶので、
選択して飛び先を決定したい場合は、tjumpコマンドを使います。
CTRL-Tで飛んでから場所が違うなと思ったら、そのままtjumpコマンドで、
今飛んできたタグで飛べるリストが出てきます。

また、unite-tagを使うことで、uniteのインターフェースからtagsを検索できます。
ただし、最初に検索する時にtagsを読み込んでキャッシュするため、
tagsのファイルサイズが大きいと初回の読み込みにかなり時間がかかります。

## vim-refを活用する
vim-refというvimでリファレンスマニュアルを参照するためのプラグインがあります。
vim-refには、デフォルトでrefeを見るための定義があるのですが、
refeを入れてPATH通すのが若干面倒なので、最近はmyruremaを使ってます。
ただ、myruremaはrefeと出力が一緒なので、実はvim-refで普通に使うことができます。

```vim
" ref.vim
let g:ref_open = 'vsplit'
let g:ref_refe_cmd = "rurema"
let g:ref_refe_version = 2

nnoremap ,rr :<C-U>Ref refe<Space>
```

こんな感じで設定しておけば、Rubyのリファレンスをvimからすぐに確認できます。
しばしば出力の形式の問題か、上手く表示できないメソッドがあったりしますが。

vim-refの画面では、Enterで関連するrefにジャンプしたり、
CTRL-Tで前のrefに戻ったりすることが可能です。

また、uniteのソースにも対応しているので、uniteインターフェースからクラス名を検索して、
メソッドの一覧を出したりできます。

vim-ref-riというプラグインもあり、インストールされているriドキュメントをvimから検索して読むことができます。
ref-refeよりもこっちの方がいいかもしれません。こちらもuniteに対応してます。

## pryやdebuggerを活用する
ctags等で定義元のgemを調べている時に動作がいまいち良く分からんということがあれば、
gemを直接いじって確認用のコードを埋めこんでしまいます。
`pry`の`binding.pry`メソッドや`ruby-debug`の`debugger`メソッド、後は`tapp`や`awesome_print`等のgemが便利です。
変に触って戻せなくなっても、bundlerなら入れ直すのは簡単ですし、
システムに入ってるgemも、`gem pristine`というコマンドでレストアできます。
なので、調査中のgemはガンガンいじっても大丈夫です。

## 参考
taka84u9/vim-ref-ri https://github.com/taka84u9/vim-ref-ri
thinca/vim-ref https://github.com/thinca/vim-ref
tsukkee/unite-tag https://github.com/tsukkee/unite-tag
OmniAuthのcallback先を動的に変更


```ruby:config/initializers/omniauth.rb

# encoding: utf-8

require 'omniauth-openid'
require 'openid/store/filesystem'

# callback先のドメインを現在のものに合わせる => reverse proxy用
OmniAuth.config.full_host = lambda do |env|
  # http or https
  scheme         = env['rack.url_scheme']

  # アプリケーションサーバーのアドレス
  local_host     = env['HTTP_HOST']

  # リバースプロキシサーバーのアドレス: リバースプロキシ側でヘッダーを送られないと意味がない
  forwarded_host = env['HTTP_X_FORWARDED_HOST']

  # リバースプロキシしてるかどうか
  forwarded_host.blank? ? "#{scheme}://#{local_host}" : "#{scheme}://#{forwarded_host}"
end

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, 'xxx', 'xxx'
  provider :facebook, 'xxx', 'xxx'

  # generic openid
  provider :open_id, :store => OpenID::Store::Filesystem.new('/tmp')
  provider :open_id, :name => 'google', :identifier => 'https://www.google.com/accounts/o8/id'
end

```
選択されたオブジェクトの中に位置を保持したままクリップボードの内容をペースト.jsfl

クリップボードに格納されているインスタンスを、現在選択されているインスタンスの中に位置を保持したままペーストするJSFLです。

## 使用手順

1. 階層を移動したいインスタンスを、コピーまたはカットします。
2. 手順1のインスタンスを格納したいMCをステージ上で選択します。
3. コマンドを実行すると、手順2で選択されたMCの中に手順1のインスタンスが位置を保持したままペーストされます。

「同じMCの階層に配置したけれど、やっぱりこのMCの中の方が良かった！」なんて場合に重宝するコマンドです。

## jsfl

```js
/***
 *	選択されたオブジェクトの中に、位置を保持したままクリップボードの内容をペーストします。
 *
 *  @since 2009.09.25
 *  @author m_makino
 */

main();

function main() {
  fl.trace("");
  fl.trace("Paste object keeping position in selected MovieClip .....");

  var doc = fl.getDocumentDOM();
  var lib = doc.library;
  var selectedClip = doc.selection;

  if (selectedClip.length != 1) {
    alert("複数のシンボルにはペーストできません");
    return;
  }

  var n = selectedClip.length;

  for (var i = 0; i < n; i++) {
    //現在の座標を記憶
    var tmpMatrix = doc.selection[0].matrix;
    var tmpX = tmpMatrix.tx;
    var tmpY = tmpMatrix.ty;

    doc.enterEditMode("inPlace"); //編集開始

    //レイヤーを追加
    var timeline = doc.getTimeline();
    timeline.addNewLayer("pasted objects by command", "normal");

    //ペースト
    doc.clipPaste(true); //位置を保持したままペースト
    doc.moveSelectionBy({ x: -tmpX, y: -tmpY }); //ペーストした内容を移動

    doc.exitEditMode(); //編集終了
  }
  
  fl.trace("Command Complete.");
}
```
原点を親MCにあわせる.jsfl

選択しているシンボルの座標原点を、現在の階層の座標原点に合わせるJSFLです。

Illustratorからコピー&ペーストしてきたシンボルの原点を、一括でそろえる時に活躍します。

## JSFL

```js
/***
 * 選択されたオブジェクトの原点を、親MCの原点とあわせます。
 * @version 2009.09.25 タイムラインにまたがったシンボルの移動に対応
 * @@@BUILDINFO@@@ 原点を親MCにあわせる.jsfl !Version! Tue Feb 03 2009 11:45:38 GMT+0900
 * */
main();
function main() {
  fl.trace("");
  fl.trace("Move Origin .....");
  var doc = fl.getDocumentDOM();
  var lib = doc.library;
  var selectedClip = doc.selection;
  if (selectedClip.length) {
    var n = selectedClip.length;
    for (var i = 0; i < n; i++) {
      var currentClip = selectedClip[i];
      //現在の座標を記憶
      var tmpMatrix = currentClip.matrix;
      var tmpX = tmpMatrix.tx;
      var tmpY = tmpMatrix.ty;
      doc.selectNone();
      doc.selection = [currentClip];
      //クリップの中身を移動
      doc.enterEditMode("inPlace");
      var timeLine = doc.getTimeline();
      for (var j = 0; j < timeLine.frameCount; j++) {
        timeLine.currentFrame = j;
        doc.selectAll();
        if (doc.selection.length == 0) {
          continue;
        }
        var rect = doc.getSelectionRect();
        fl.getDocumentDOM().moveSelectionBy({ x: tmpX, y: tmpY });
        doc.selectNone();
      }
      doc.exitEditMode();
      //自分自身を変更
      doc.selectNone();
      doc.selection = [currentClip];
      doc.moveSelectionBy({ x: -tmpX, y: -tmpY });
      doc.setTransformationPoint({ x: 0, y: 0 });
    }
  }
  fl.trace("Command Complete.");
}
```
画像をグラフィックシンボルに変換.jsfl

ライブラリ上の画像をグラフィックシンボルに変換するJSFLコマンドです。

画像左上を原点にしたグラフィックシンボルを生成する場合はこちらのコマンドを使用してください。

```js
/**
 * ビットマップからグラフィックシンボルを生成するjsfl
 *
 * 使用方法	ライブラリでビットマップオブジェクトを選択してコマンドを実行する
 * 原点は左上端で固定
 *
 * @since 2009.09.24
 **/

var doc;
var lib;

main();

function main() {
  var doc = fl.getDocumentDOM();
  if (doc) {
    lib = doc.library; // ライブラリ
    var selItems = lib.getSelectedItems(); // 選択中のアイテム
    var num = selItems.length; // アイテム数

    if (num == 0) {
      alert("ライブラリのアイテムを選択してください");
      return;
    }

    //MCの生成---------------------

    for (var i = 0; i < num; i++) {
      var clipName = selItems[i].name + "_gra";
      var isCreated = lib.addNewItem("graphic", clipName);
      //if(!isCreated){ return; }

      lib.selectItem(clipName);
      lib.editItem();
      lib.selectItem(selItems[i].name);
      lib.addItemToDocument({ x: 0, y: 0 });
      doc.mouseClick({ x: 0, y: 0 }, false, true);
      doc.selection[0].x = 0;
      doc.selection[0].y = 0;
      doc.selection[0].width = doc.selection[0].hPixels;
      doc.selection[0].height = doc.selection[0].vPixels;
      doc.selection[0].x = 0;
      doc.selection[0].y = 0;
    }
  }
}
```

画像中央を原点にしたグラフィックシンボルを生成する場合はこちらのコマンドを使用してください。

```js
/**
 * ビットマップから中央原点のグラフィックシンボルを生成するjsfl
 *
 * 使用方法	ライブラリでビットマップオブジェクトを選択してコマンドを実行する
 * 原点は中央で固定
 *
 * @since 2009.09.24
 */

var doc;
var lib;

main();

function main() {
  var doc = fl.getDocumentDOM();
  if (doc) {
    lib = doc.library; // ライブラリ
    var selItems = lib.getSelectedItems(); // 選択中のアイテム
    var num = selItems.length; // アイテム数

    if (num == 0) {
      alert("ライブラリのアイテムを選択してください");
      return;
    }

    //MCの生成---------------------

    for (var i = 0; i < num; i++) {
      var clipName = selItems[i].name + "_gra";
      var isCreated = lib.addNewItem("graphic", clipName);
      //if(!isCreated){ return; }

      lib.selectItem(clipName);
      lib.editItem();
      lib.selectItem(selItems[i].name);
      lib.addItemToDocument({ x: 0, y: 0 });
      doc.mouseClick({ x: 0, y: 0 }, false, true);
      doc.selection[0].x = 0;
      doc.selection[0].y = 0;
      doc.selection[0].width = doc.selection[0].hPixels;
      doc.selection[0].height = doc.selection[0].vPixels;
      doc.selection[0].x = -doc.selection[0].hPixels / 2;
      doc.selection[0].y = -doc.selection[0].vPixels / 2;
    }
  }
}
```
タイムライン上のインスタンスをランダムに入れ替え.jsfl



[add some](http://homepage2.nifty.com/addsome/index.html)様が公開しているjsfl、[SwapInstances](http://homepage2.nifty.com/addsome/files/SwapInstances.zip)を一部改変したものです。
大量の写真素材をタイムライン上でレイアウトしなくてはいけない場面などで活用しています。

使用方法の例

1. 写真素材と同じサイズのダミー画像を用意し、ステージ上に配置する。
2. 写真素材をライブラリに登録する。
3. 1のダミー素材と、2のライブラリ画像を選択し、コマンドを実行する。

これでざっくりとした素材の配置ができます。

```js
///////////////////////////////////////////////////
//Flashコマンド「SwapInstances」
//制作者：eiji saito
//ライセンスフリーです。配布なども自由です。但し、利用者自身の責任において御使用頂きますようお願い致します。 
//いかなる損害についても制作者はその保証義務を一切負わないものとします。 
//ご意見やご感想、または不具合などの報告などはメールにてお寄せください。
//制作者：eiji saito
//WebSite：http://addsome-smile.com
//　　　　　http://homepage2.nifty.com/addsome/ 
//Mail：addsome-smile@nifty.com
///////////////////////////////////////////////////

/**
*	2009/10/05加筆
*	選択中のライブラリアイテムから変更先をランダムに抽出するよう変更
*/


/*
複数選択中のインスタンスの入れ替え
	シンボル→シンボル
	ビットマップ→ビットマップ
	
	入れ替え可能なフラグ判定条
	noBMP=選択アイテムとライブラリが共にビットマップを含まない時
	yesBMP=選択中アイテムがビットマップのみで、選択中ライブラリアイテムもビットマップの時
*/


//フラグ

var docBMP=false;//選択中のビットマップ判定
var libBMP=false;//ライブラリのビットマップ判定
var onlyBMP=false;//ビットマップのみかどうか

//選択中ビットマップのカウント
var cntBMP=0;

var _doc=fl.getDocumentDOM();

//選択中のアイテムの数
var docSel=_doc.selection;
var selLength=docSel.length;

if(docSel[0]==undefined){
	//何も選択されていない時はアラートのみ
	alert("インスタンスが選択されていません。");
//メイン処理-----------------------------------
}
else{
	//選択中のアイテムからビットマップを探す
	for(var i=0 ; i<selLength ; i++){
		var obj=docSel[i];
		if(obj=="[object Bitmap]"){
			cntBMP++;
			docBMP=true;
		}
	}
	//選択中アイテムが全てビットマップの時
	if(cntBMP==selLength){
		onlyBMP=true;
	}
	//
	//ライブラリ内の判定------------------------------------------------
	//
	//選択中のライブラリアイテム
	var libSelItem=_doc.library.getSelectedItems();
	
	if(libSelItem.length<1){
		//ライブラリアイテムを選択していない場合
		alert("ライブラリアイテムが選択されていません。");
	}else{
		//ライブラリアイテムを１つだけ選択しているときに実行する
		//選択中のライブラリアイテムがビットマップの時
		var libItemType=libSelItem[0].itemType;
		if(libItemType=="bitmap"){
			libBMP=true;
		}
		if(libItemType!="folder"){
			//入れ替え可能なフラグ判定条件
			//noBMP=選択アイテムとライブラリが共にビットマップを含まない時
			//yesBMP=選択中アイテムがビットマップのみで、選択中ライブラリアイテムもビットマップの時
			var noBMP = (docBMP==false && libBMP==false);
			var yesBMP = onlyBMP==true && (docBMP==true && libBMP==true);
			//
			if(noBMP || yesBMP){
				
				//var libItem=String(libSelItem[randomIndex].name);
				//fl.getDocumentDOM().swapElement(libItem);
				for(i=0 ; i<selLength ; i++){
					var randomIndex =Math.floor(Math.random()*libSelItem.length);
					obj=docSel[i];
					obj.libraryItem = libSelItem[randomIndex];
				}
								
				}else{
				//条件にあわないときはアラート
				if(docBMP==false && libBMP==true){
					alert("ライブラリでビットマップが選択されています。");
				}else{
					alert("ビットマップが選択されています。");
				}
			}
		}else{
			alert("ライブラリアイテムが選択されていません。");
		}
	}
}
```
bundle install でのエラー対応メモ


bundle installコマンドで下記エラーが発生したのでrbenvインストールを見なおした

```
$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/./Users/hoge/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/net/http.rb:799: [BUG] Segmentation fault
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin12.1.0]

-- Control frame information -----------------------------------------------
c:0043 p:---- s:0236 b:0236 l:000235 d:000235 CFUNC  :connect
c:0042 p:0011 s:0233 b:0233 l:0001a0 d:000232 BLOCK  /Users/hoge/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/net/http.rb:799
```

上記対応をした、rbenv installコマンド

macport版

```
# port selfupdate
# port install openssl
# port install libyaml

#rbenv 
$ CONFIGURE_OPTS='--with-openssl-dir=/opt/local --with-opt-dir=/opt/local' rbenv install 1.9.3-p194
```

brew版

```
# brew update
# brew install openssl


# rbenv
$ CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl`" rbenv install 1.9.3-p194
```
StoryBoard上の画面(ViewController)のインスタンスを作る


よく忘れてググったり昔のコード見たりするので自分に備忘録として。

```
UIViewController *controller = [[self storyboard] instantiateViewControllerWithIdentifier:@"hoge"];
```
@"hoge"の部分はStoryBoardのViewControllerの呼び出したいもののIdenftifierに予め入力しておいた名前を入れる。

StoryBoardを使わない場合、

```
[[UIViewController alloc]initWithNibName:@"hoge" bundle:nil];
```

で呼び出すが、StoryBoardの場合、この記述は使えない模様。
コードにより動的な画面生成をする方法を検索すると、initWithNibNameを使うやり方がよくヒットするが、StoryBoardを使っているのであれば上の記述を使えば良い。

##おまけ
こっちもよく忘れるので
###画面遷移時に次の画面に値を渡すとか

```
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    MyViewController *controller = [segue destinationViewController];
	controller.nanika = @"hogehoge";
}
```
※ MyViewControllerとnanikaというプロパティが定義済みの例
DMMのAPIを叩くクラス

DMMのAPIの仕様はこちら
https://affiliate.dmm.com/api/
XML返ってくるだけなので、後はパースするなり何するなりお好きに・・・

```python

#coding:utf-8
import urllib2
import time

"""
DMM APIを使って商品情報を取得する
"""

class Dmm:
    def __init__(self, api_id, affiliate_id):
        """コンストラクタ"""
        self.baseurl = "http://affiliate-api.dmm.com/"
        self.proxy_host = None
        self.proxy_port = None
        self.api_id = api_id
        self.affiliate_id = affiliate_id
        self.version = "1.0.0"
        self.site = 'DMM.co.jp'
        self.service = 'digital'
        self.operation = 'ItemList'
        
        self.url = None
    
    def setProxy(self, host, port=8080):
        """プロキシをセット"""
        self.proxy_host = host
        self.proxy_port = port
    
    def setVersion(self, version):
        """バージョンをセット"""
        self.version = version
    def setSite(self, site):
        """Siteをセット"""
        self.site = site
    def setService(self, service):
        """Serviceをセット"""
        self.service = service
    
    def keywordSearch(self, keyword, **options):
        """アイテムを検索"""
        params = options
        params["keyword"] = keyword
        return unicode(self.sendRequest(params),'euc-jp')
        #return self.buildURL(params)
    
    def buildURL(self, params):
        """RESTリクエストのURLアドレスを構築"""
        params["api_id"] = self.api_id
        params["affiliate_id"] = self.affiliate_id
        params["version"] = self.version
        params["site"] = self.site
        params["service"] = self.service
        params["operation"] = self.operation
        params["timestamp"] = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
        sorted_params = sorted(params.items())
        
        # paramsのハッシュを展開
        request = []
        for p in sorted_params:
            pair = "%s=%s" % (p[0], urllib2.quote(p[1].encode("euc-jp")))
            request.append(pair)
        
        url = self.baseurl + "?" + "&".join(request)
        
        return url
        
    def sendRequest(self, params):
        """DMMにリクエストを送付し、取得したXMLを返す"""
        self.url = self.buildURL(params)
        if self.proxy_host:
            proxy_handler = urllib2.ProxyHandler({"http":"http://%s:%s/" % (self.proxy_host, self.proxy_port)})
            opener = urllib2.build_opener(proxy_handler)
        else:
            opener = urllib2.build_opener()
        return opener.open(self.url).read()
    
def _test():
    dmm = Dmm('APIキー', 'アフィコード')
    print dmm.keywordSearch('sex',hits='100')

if __name__ == '__main__':
    _test()
```
Test::Unitで実行中のテストケースを表示する


普通に実行してしまうと、実行中のテストケースを表示してくれない。

    $ bundle exec ruby some_test.rb
    Run options: 

    # Running tests:

    ...

    Finished tests in 1.017405s, 2.9487 tests/s, 1.9658 assertions/s.

普通はこれでも十分なんですが、セグメンテーションフォールトとかの低レベルなバグを追っているときだとちょっとつらい。

そういうときは<code>-v</code>オプションを使ってやればいい。

    $ bundle exec ruby some_test.rb -v
    Run options: -v

    # Running tests:
 
    SomeTest#test_a = 0.00 s = .
    SomeTest#test_b = 1.01 s = .
    SomeTest#test_c = 0.01 s = .

    Finished tests in 1.017389s, 2.9487 tests/s, 1.9658 assertions/s.

    3 tests, 2 assertions, 0 failures, 0 errors, 0 skips

<code>rake test</code>の場合は<code>TEST_OPTS</code>環境変数を設定してやればいい。

    $ TEST_OPTS='-v' bundle exec rake test
データベースを使う & URL を持つ WordPress プラグインの作り方


## DB テーブルの作成/更新

`register_activation_hook` でプラグインの有効化時に DB テーブルの作成/更新を行います。

また、プラグインのアップグレードで DB テーブルの構造が変わることもあると思います。現状ではプラグインのアップグレード時に呼ばれるフックはないので、`plugins_loaded` アクションのフックでもチェックするようにします。

テーブルの作成/更新には `dbDelta()` が便利です。テーブルを作るだけでなく、すでにテーブルがある場合には `ALTER TABLE` を発行してくれます。ただ `dbDelta()` が受け付ける SQL には、一行あたり一カラム宣言、`PRIMARY KEY` のあとにスペースを二つ空けるなどの制限があるので注意しましょう。

参考
http://codex.wordpress.org/Creating_Tables_with_Plugins

## URL を持つ

template_redirect アクションをフックすることで、特定の URL に対する処理を記述することができます。

## ひな形

上記をまとめると、だいたい以下のような感じです。

```php
<?php
/*
Plugin Name: Foo
Description: Foo plugin
Version: 1.0
Author: Foo Bar
*/

global $foo_db_version;
$foo_db_version = '1.0';

// Create/update db table for foo count
function foo_install() {
  global $foo_db_version;
  global $wpdb;

  $installed_ver = get_option("foo_db_version");
  if ($installed_ver != $foo_db_version) {
    $table_name = $wpdb->prefix . 'foo';
    $sql = "CREATE TABLE $table_name (
      id bigint(20) NOT NULL,
      ...
      PRIMARY KEY  (id)
    );";
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);

    add_option("foo_db_version", $foo_db_version);
  }
}
// Create DB table when activated
register_activation_hook(__FILE__, 'foo_install');
// Check DB version in preparation to upgrades when load
add_action('plugins_loaded', 'foo_install');

// Request handler
function foo_redirect() {
  // Handle only a certain URL
  if (stripos($_SERVER['REQUEST_URI'], '/foo') === FALSE) {
      return;
  }

  // Do something and make response
  status_header(200);
  echo 'Hello, World!';
  exit(); // Make sure to exit
}
add_action('template_redirect', 'foo_redirect', 1);

?>
```
Sass の @each


Sass の @each を使うとリストを使った繰り返し処理ができます。

```scss
$foo-list: foo, bar, baz;
$foo-index: 0;

@each $word in $foo-list {
  ##{$word} {
    top: @foo-index * 30px;
  }
  $foo-index: $foo-index + 1;
}
```

とすると以下のような CSS になります。

```css
#foo {
  top: 0px;
}
#bar {
  top: 30px;
}
#baz {
  top: 60px;
}
```

以下のようにできればもっと便利なんですけどね。

```scss
@each $word, $index in $foo-list {
}
```
正規表現にマッチする部分を区切りとしてNSStringを分割

ちなみに、以下のようなことをするメソッドはすでにあった。

 + 文字列をデリミタとして分割する
 + 文字集合(NSCharacterSet)にマッチする部分を区切りとして分割する
 + 正規表現にマッチした部分全ての配列を返す。rubyとかでいうところのString#scan。あるいはマッチした部分を引数にとるブロックを実行する。

だけども正規表現にマッチするとこを区切りとして分割するメソッドがなかったので実装してみた。

```objc
#import "Foundation/Foundation.h"

@interface NSString (RegularExpression)
// 正規表現で分割した文字列の配列を返す
- (NSArray *)componentsSeparatedByRegularExpression:(NSRegularExpression *)regexp;
// 正規表現で分割した文字列を引数にとるブロックを実行する
- (void)componentsSeparatedByRegularExpression:(NSRegularExpression *)regexp
                                    usingBlock:(void (^)(NSString *))block;
@end

@implementation NSString (RegularExpression)
- (NSArray *)componentsSeparatedByRegularExpression:(NSRegularExpression *)regexp {
    NSMutableArray *result = [NSMutableArray array];
    [self componentsSeparatedByRegularExpression:regexp
                                      usingBlock:^(NSString *component) {
            [result addObject:component];
        }];
    return result;
}

- (void)componentsSeparatedByRegularExpression:(NSRegularExpression *)regexp
                                         usingBlock:(void (^)(NSString *))block {
    __block int startPage = 0;
    [regexp enumerateMatchesInString:self
                             options:0
                               range:NSMakeRange(0, self.length)
                          usingBlock:^(NSTextCheckingResult *match,
                                       NSMatchingFlags flag,
                                       BOOL *stop) {
            NSUInteger matchLocation = match.range.location;
            NSUInteger matchLength   = match.range.length;

            block([self substringWithRange:NSMakeRange(startPage, matchLocation - startPage)]);
            startPage = matchLocation + matchLength;
        }];
    block([self substringWithRange:NSMakeRange(startPage, self.length - startPage)]);
}
@end

// 使用例
int main(int argc, char **argv) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSError *error = nil;
    NSRegularExpression *re =
        [NSRegularExpression regularExpressionWithPattern:@"-{2,}\n"
                                                  options:NSRegularExpressionDotMatchesLineSeparators
                                                    error:&error];
    NSString *text = @""
        "あああ\n"
        "----\n"
        "いいい\n"
        "いいい\n"
        "いいい\n"
        "----\n"
        "いいい\n";
    
    [text componentsSeparatedByRegularExpression:re
                                      usingBlock:^(NSString *component) {
            NSLog(@"%@", component);
        }];

    for (NSString *component in [text componentsSeparatedByRegularExpression:re]) {
        NSLog(@"%@", component);
    }
    
    [pool release];

    return 0;
}

```
flymake のエラーを見やすくする

![flymake のエラーメッセージを popup.el に表示してるスクリーンショット](http://24.media.tumblr.com/tumblr_magxpwfs7A1qz64n4o1_r2_1280.png)

↑こんな感じにする。

導入方法
---------

* [miyucy's gist: 292827 — Gist](https://gist.github.com/292827) 

これを、`.emacs` なり `init.el` にコピペ。

表示に使ってる `popup.el` は、`auto-complete.el` にも使われてる。なので、`auto-complete.el` 使ってる人は、上記 Gist の elisp 以外に導入するものないはず。

念の為 `(when (require 'popup nil t) ... )` で括ると良いかも。

使い方
----------

スクリーンショットのように、赤いところにカーソル置いて少し待つと、黄色いツールチップでエラーメッセージでてくる。

困ってる
-----------

見づらいけど、スクリーンショットの右端見る通り、現在列ハイライトと相性悪い。
PDOの使い方

phpでPDOを使ったので忘れないようにメモ。
PDOってそもそも何よ？
→PHP Data Objects の略で、「PHP の中からデータベースにアクセスするための軽量で高性能な インターフェイスを定義します」らしい。

■まずはDBへの接続方法(MySQLの場合）
$dbh = new PDO('mysql:host=ホスト名;dbname=DB名', ユーザ名, パスワード);
これでPDO基底クラスのインスタンスが作成される。
※DBへの接続を閉じる場合は、$dbhにnullを入れてやればよい。

■で、DB操作するにはどうするの？
こんな感じでSQL文を作って実行する。
　$sql = 'select dataname from table where ? is ?';
   $sth = $dbh->prepare($sql);
   $sth ->execute(array('query','foo'));
   $result = $sth->fetchAll();
ポップオーバーの外側クリックで閉じるようにするには


bootstrap標準のポップオーバーはボタンのクリックで表示/非表示が切り替わるようになっていますが、
iPadのポップオーバーみたいに外側をクリックすると閉じてくれた方が親切な気がします。

その場合、以下のようにtriggerをmanualにして、クリックイベントでポップオーバーのshow/hideを切り替えます。

```HTML:
<a href="#" class="btn" id="show-popup">ポップアップ表示</a>
```

```JavaScript:
$("#show-popup").popover({
  placement: 'right',
  title: 'title',
  content: 'hogehoge',
  trigger: 'manual'
});

$('#show-popup').click(function(evt) {
  evt.stopPropagation();
  $(this).popover('show');
});
  
$('.popover').live('click', function(evt) {
  evt.stopPropagation();
});
  
$('html').live('click', function() {
  $('#show-popup').popover('hide');
});
```

html全体に対してクリックでhideさせるようにしておき、ポップオーバーの中だったらstopPropagationでそれを無効化する、というやり方です。
注意点として、ポップオーバーはボタンクリックされるまでは存在しないので、bindではなくliveにする必要があります。
また、liveよりもbindで設定したハンドラの方が優先して実行されるため、htmlに対してのハンドラもliveにする必要があります。

http://jsfiddle.net/yuch/ubfrK/
ubuntuのapacheユーザーとグループ

RH系ならば `cat /etc/passwd | grep apache` とかやって調べられるが、ubuntuの場合は何度grepしてもでてこない。どれだけ媚ながらgrepしてもでてこない。

なぜでてこないのかと言うとubuntuの場合は `www-data` というユーザーとグループがapacheを動かしているため。

`/etc/apache2/envvars` にその設定が書かれているので、もしapacheを動かすユーザーを変更したいのであれば、そこを変えてやればいい。
Copy instance names.jsfl

Flash Proでタイムライン上に配置されたインスタンスの名前をクリップボードにコピーするJSFLを三種ご紹介します。
タイムライン上のインスタンスを外部ASファイルで操作する際などにご利用ください。

複数選択されたMCインスタンスの名前を配列形式でコピーする。

```js

///////////////////////////////////////////////////
//
//Flashコマンド「クリップボードに選択中のインスタンス名を配列でコピー」
//
//@since 2009.10.07
//@author Masato Makino
//
///////////////////////////////////////////////////

var _doc=fl.getDocumentDOM();
var names ="[ ";

//選択中のアイテムの数
var docSel=_doc.selection;
var selLength=docSel.length;
var targets = new Array();

main();

function main(){
	if(docSel[0]==undefined){
		//何も選択されていない時はアラートのみ
		alert("インスタンスが選択されていません。");
		return;
	}
	
	for(i = 0; i < selLength; i++){
		targets.push(docSel[i].name);
	}
	
	targets.sort();
	
	for(var i=0 ; i<selLength ; i++){
		names += targets[i];
		if( i != selLength -1) {
			names += ", "
		}
	}
	names += " ];"
	fl.clipCopyString(names);
}

```

複数選択されたMCインスタンスの名前をthis["name"]形式でコピーする。

```js

///////////////////////////////////////////////////
//
//Flashコマンド「クリップボードに選択中のインスタンス名を this["name"] の書式でコピー」
//
//@since 2009.10.07
//@author Masato Makino
//
///////////////////////////////////////////////////

var _doc=fl.getDocumentDOM();
var names ="";

//選択中のアイテムの数
var docSel=_doc.selection;
var selLength=docSel.length;
var targets = new Array();

main();

function main(){
	if(docSel[0]==undefined){
		//何も選択されていない時はアラートのみ
		alert("インスタンスが選択されていません。");
		return;
	}
	
	for(i = 0; i < selLength; i++){
		targets.push(docSel[i].name);
	}
	
	targets.sort();
	
	for(var i=0 ; i<selLength ; i++){
		
		names += " = this[\"";
		names += targets[i];
		names += "\"];\n"
	}
	
	fl.clipCopyString(names);
}

```

複数選択されたMCインスタンスの名前をメンバー変数宣言の形式でコピーする。

```js

///////////////////////////////////////////////////
//
//Flashコマンド「クリップボードに選択中のインスタンス名を public var :MovieClip の書式でコピー」
//
//@since 2009.10.07
//@author Masato Makino
//
///////////////////////////////////////////////////

var _doc=fl.getDocumentDOM();
var names ="";

//選択中のアイテムの数
var docSel=_doc.selection;
var selLength=docSel.length;
var targets = new Array();

main();

function main(){
	if(docSel[0]==undefined){
		//何も選択されていない時はアラートのみ
		alert("インスタンスが選択されていません。");
		return;
	}
	
	for(i = 0; i < selLength; i++){
		targets.push(docSel[i].name);
	}
	
	targets.sort();
	
	for(var i=0 ; i<selLength ; i++){
		
		names += "public var ";
		names += targets[i];
		names += ":MovieClip;\n"
	}
	
	fl.clipCopyString(names);
}

```
Emacs の Commands History を再起動後も使用する

以下を .emacs に記述することで M-x のコマンド履歴を永続的に残すことができる。anything なんかを使っていると、Emacs Commands History が Emacs を再起動しても残るためちょっと便利。

```common-lisp
(setq desktop-globals-to-save '(extended-command-history))
(setq desktop-files-not-to-save "")
(desktop-save-mode 1)
```

desktop-save-mode というものが Emacs で標準に付いているのだが、標準だと Commands History 以外の情報まで永続的に残してしまうので、上2行で他の情報を保存しないようにしている。desktop-save-mode ではバッファなども保存可能なので、詳しく知りたい人は https://www.emacswiki.org/emacs/Desktop を読んでみるといいだろう。
ビットマップからナインスライスMCを生成.jsfl


FlashProのライブラリ上の画像を使ってナインスライスMCを生成するJSFLです。

ビットマップ画像を使用したナインスライスMCは、画像をあらかじめスライスしておかないと正しく伸縮しません。また、画像の境界に正確にスライスガイドを設置しないと伸縮に失敗します。
このJSFLを使用すれば、手動でスライスガイドを設置する必要がなくなります。

```js
/**
* ドロップシャドウなど、矩形の周囲を覆うナインスライスクリップを生成するjsfl
*
* 使用方法	ライブラリでビットマップなどのオブジェクトを8もしくは9個選択してコマンドを実行する。
*		8つ指定した場合は中央の画像が無い状態のMCが作成される。
*
* 注意点		1.原点は中央の画像の左上に固定されています。
*		　変更したい場合は文中のコメントに従ってオフセット処理を追加するか、Flash Pro上で画像とスライスガイドを移動してください。
*		2.画像はライブラリ名順に配置されます。予め画像のライブラリ名の末尾に連番を割り当ててください。
*
* @since 2009.09.24
*/

var doc;
var lib;

main();
	
function main()
{
	var doc = fl.getDocumentDOM();
	if(doc){
		
		lib = doc.library;// ライブラリ
		var selItems = lib.getSelectedItems();	// 選択中のアイテム
		var num = selItems.length;	// アイテム数
	
		if(num != 9 && num != 8){
			alert("ライブラリのアイテムを選択してください");
			return;	
		}
	
		var clipName = prompt("MovieClipの名前を指定してください", "SliceClip_mc");
		
		if( !clipName ){
			alert("処理を中断します");
			return;
		}
		
		//MCの生成---------------------
		var isCreated = lib.addNewItem("movie clip" , clipName );
		if(!isCreated){ return; }
		
		//配列の再編成---------------------
		var center;			//中央のビットマップ
		var arounds = [];		//周囲のビットマップライブラリアイテム
		
		if( num == 8 ){
			arounds = selItems;
		} 
		else if ( num == 9 ){
			center = selItems[5];
			selItems.splice( 5, 1 );
			arounds = selItems;
		}
		
		//ライブラリ名順にソート
		arounds = arounds.sort( function(a, b) { return (a.name > b.name)? 1:-1 } );
		
		//MCの編集開始---------------------
		
		lib.selectItem( clipName );
		lib.editItem();
		
		var aroundObj = [];	//配置されたアイテム
		
		var n = arounds.length;
		for ( var i =0; i < n; i++ ){
			lib.selectItem(arounds[i].name);
			lib.addItemToDocument( {x:0, y:0} ) ;
			doc.mouseClick({x:0, y:0}, false, true);
			aroundObj.push(doc.selection[0]);
			doc.selectNone();			
		}
		
		aroundObj[0].x = -aroundObj[0].width;
		aroundObj[0].y = -aroundObj[0].height;
		
		aroundObj[1].x = 0;
		aroundObj[1].y = -aroundObj[1].height;
		
		aroundObj[2].x = aroundObj[1].width;
		aroundObj[2].y = -aroundObj[2].height;
		
		aroundObj[3].x = -aroundObj[3].width;
		aroundObj[3].y = 0;
		
		aroundObj[4].x = aroundObj[1].width;
		aroundObj[4].y = 0;
		
		aroundObj[5].x = -aroundObj[5].width;
		aroundObj[5].y = aroundObj[3].height;
		
		aroundObj[6].x = 0;
		aroundObj[6].y = aroundObj[3].height;
		
		aroundObj[7].x = aroundObj[1].width;
		aroundObj[7].y = aroundObj[3].height;
		
		if( center )
		{
			lib.selectItem(center.name);
			lib.addItemToDocument( {x:0, y:0} ) ;
			doc.mouseClick({x:0, y:0}, false, true);
			doc.selection[0].x =0;
			doc.selection[0].y =0;
			doc.selectNone();
		}
		
		//配置をオフセットしたい場合はここに処理を追加してください。
		//
		/*
		doc.selectAll();
		*/
		
		//ナインスライスの矩形を指定---------------
		lib.selectItem( clipName );
		lib.setItemProperty ("scalingGrid" , true);
		lib.setItemProperty ("scalingGridRect",
			{
				left:aroundObj[1].x, 
				top:aroundObj[3].y,
				right:aroundObj[1].x + aroundObj[1].width,
				bottom:aroundObj[3].y + aroundObj[3].height
			}
		);
	}
}
```
オフラインリアルタイムどう書く第四回の参考問題 解答(Ruby)

オフラインリアルタイムどう書く第四回の参考問題のrubyでの解答です。
問題はこちら http://qiita.com/items/9c514267214d3917edf2

```ruby
class Route
  def initialize(sz)
    @sz = sz
    @nodes = []
    (sz * sz).times do |i|
      node = []
      node << (i - 1) unless (i % sz) == 0
      node << (i + 1) unless (i % sz) == (sz - 1)
      node << (i - sz) if i > sz
      node << (i + sz) if i < (sz * (sz - 1)) 
      @nodes << node
    end
  end

  def solve(xs)
    xs.split(' ').each do |x|
      i1, i2 = x.split('').map{|e| ('a'..'y').to_a.index(e)}
      @nodes[i1].delete(i2)
      @nodes[i2].delete(i1)
    end

    @done = {}
    @count = 0
    move(0)
    @count
  end

  def move(i)
    return if @done[i]
    if i == @sz * @sz - 1
      @count += 1
      return
    end
    @done[i] = true
    @nodes[i].each do |j|
      move(j)
    end
    @done[i] = false
  end
end

DATA.readlines.each do |line|
  puts Route.new(5).solve(line.split(' -> ').first.gsub('"',''))
end

__END__
"" -> 8512 #そのまま。これが最大値。
"af" -> 4256 #対称性より半分になる
"xy" -> 4256 #対称性より半分になる
"pq qr rs st di in ns sx" -> 184 #3x3マスと同値
"af pq qr rs st di in ns sx" -> 92 #3x3マスのパターンの半分
"bg ch di ij no st" -> 185 #3x3マスのパターン +1
"bc af ch di no kp mr ns ot pu rs" -> 16 #4x2x2
"ab af" -> 0 #入口を塞いだ
"ty xy" -> 0 #出口を塞いだ
"bg ch ej gh lm lq mr ot rs sx" -> 11 #2x4+3
"ty ch hi mn kp mr rs sx" -> 18 #6*3
"xy ch hi mn kp mr rs sx" -> 32 #4*8
"ch hi mn kp mr rs sx" -> 50 #6*3+4*8
"ab cd uv wx" -> 621 
"gh mn st lq qr" -> 685 
"fg gl lm mr rs" -> 171
```
Nodev0.8.x以降のパッケージのインストールパスがちょっと変だったので対処したメモ


***※自分用なので参考にならないかもしれません。***

`npm install -g`を使って新しいパッケージをインストールしてみたら、なぜかコマンドが見つからない状態になってた。

##環境

- MacOSX v10.8.1 (Mountain Lion)
- Node v0.8.8 (Homebrewでインストール)
- NPM v1.1.59

##どこいった?

`npm ls yeoman`と実行してみると、

```
$ npm ls -g yeoman
[…]
/usr/local/share/npm/lib
└── yeoman@0.9.1 
```

もともと Node v0.6でグローバルインストールしていたExpressでは、

```
$ npm ls -g express                                                                                                                             
[…]
/usr/local/share/npm/lib
└── (empty)
```

`(empty)`なはずはないのでおかしい。

```
$ npm bin -g
/usr/local/share/npm/bin
$ npm prefix -g
/usr/local/share/npm
```

`/usr/local/bin/`とかではなく、`/usr/local/share/npm/bin/`におかれてしまっている

```
$ ls /usr/local/share/npm/bin/
_yeomaninsight yeoman
```

##気になること

`Homebrew`のオプションで、`--without-npm`っていうのがあるが、これを指定せずにアップデートしていて、いままで使っていた`curl`コマンドでインストールしているものと置き換わったからパスが変わったのか?

```brewinfo.sh
$ brew info node                                                                                                                                node: stable 0.8.8, HEAD
http://nodejs.org/
/usr/local/Cellar/node/0.8.8 (846 files, 13M) *
https://github.com/mxcl/homebrew/commits/master/Library/Formula/node.rb
==> Options
--without-npm
        npm will not be installed
--enable-debug
        Build with debugger hooks
```


##対応

いまとなっては確かめようがないので、`NODE_PATH`環境変数とPATHを修正した。

###NODE_PATH

新しいパス`npm prefix -g`の結果を追加

```zshenv
export NODE_PATH=$NODE_PATH:$(npm prefix -g 2>/dev/null)/lib/node_modules
```

###PATH

`npm bin -g`の結果を追加

```zshenv
export PATH=$PATH:$(npm bin -g 2>/dev/null)
```
macの移行アシスタントで移行できなかったもの


MacBook AirにMountain Lionをクリーンインストールした時に，
移行アシスタントを使ってMac miniの設定とかを持ってきたのだけど，移行できてない所があった.

### XcodeのCommand Line Tools
- Xcodeはあったけどcommand line toolsは消えてた

### Homebrew
- `/usr/local/` 以下の所有者・グループがroot wheelになってた
WordPress のデバッグ


`WP_DEBUG_LOG` を使うと、エラーログや任意のログを `wp-content/debug.log` に出力できます。

```wp-config.php
define('WP_DEBUG', true);
define('WP_DEBUG_DISPLAY', false);
define('WP_DEBUG_LOG', true);
```

```functions.php
if(!function_exists('_log')){
  function _log($message) {
    if (WP_DEBUG === true) {
      if (is_array($message) || is_object($message)) {
        error_log(print_r($message, true));
      } else {
        error_log($message);
      }
    }
  }
}
```

としておいて、以下のようにすると使えます。

```php
_log("Hello, World!");
```

ログファイルが外から見える場所なので、本番環境では使わない方がよさそうです。

参考
http://codex.wordpress.org/Debugging_in_WordPress
ディレクトリ名にファイル・ディレクトリ数を追加する

下位のディレクトリ内のファイル・ディレクトリ数を追加するPowerShellスクリプトを書いてみた。
InboxというディレクトリがInbox(10)となる感じ。

```PowerShell:Recause-Item.ps1
$dir = $args[0]

## カレントディレクトリがInbox(10)みたいな時、引数がInbox, 10の二つに分かれるため
if ($args.Length -eq 2) {
   $dir = $dir + "(" + $args[1] + ")"
}

if ((Test-Path $dir) -eq $false) {
    Write-Output $dir
    Exit
}

function Recurse-Item($dir)
{
    foreach ($f in Get-ChildItem $dir | Where-Object { $_.GetType().Name -eq "DirectoryInfo" }) {
        Recurse-Item($f.FullName)

        $cnt = @(Get-ChildItem  $f.FullName).Length

        if ($cnt -eq 0) {
            Remove-Item $f.FullName
        ##  Write-Output $f.FullName
        } else {
            $name = $f.Name -replace "^(.+)\(\d+\)", "`$1"
            $name = $name + "(" + $cnt + ")"

            if ($f.Name -ne $name) {
                Rename-Item $f.FullName $name
            ##  Write-Output $name
            }
        }

    }
}

Recurse-Item($dir)
```
rails cで日本語が通らないときの直し方


Macで漫然とRubyをインストールすると、rails consoleやirbで日本語を使えないことがある。（どうなるかというと、日本語の変換を確定した途端に「\U+FFE3\U+FFAB」みたいにUnicodeのエスケープっぽいものが表示される。）そうなった時の直し方を説明する。

## なぜ日本語を使えないのか

大雑把に言うと、Macに付属しているコマンドライン処理のライブラリ(libedit)が日本語に対応していないから。これを使わず、libreadlineを使うようにすれば直る。

## 誰がlibeditを使っているのか

Rubyをインストールしたディレクトリのどこかにあるreadline.bundleが使っている。findコマンドを使えば見つけられる。例えば、rbenvを使ってRubyをインストールしたなら、下のコマンドで見つかるだろう。

```
$ find ~/.rbenv/versions -name readline.bundle
```

例として、ここでは下のパスにreadline.bundleがあったものとする。

```
~/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin11.3.0/readline.bundle
```

## readlineをインストールする

homebrewやmacportでインストールすればいい。例えば、homebrewなら下のようにする。

```
$ brew install readline
```

## どうやってreadlineを使わせるのか

install_name_toolというコマンドを使う。readline.bundleというのはライブラリのエイリアスみたいなもので、別の場所にある実体を参照しているだけである。よって、install_name_toolでreadline.bundleにreadlineを使わせればいい。同時に、libeditから切り離す必要もある。

install_name_toolを実行するには、readlineとlibeditの正確なパスを知る必要がある。readlineのライブラリファイルは下のようなパスにインストールされたはずだ。

```
/usr/local/Cellar/readline/(readlineのバージョン)/lib/libreadline.dylib
```

例えばreadline-6.2.4をインストールしたなら、下のようになる。

```
/usr/local/Cellar/readline/6.2.4/lib/libreadline.dylib
```

## libeditはどこにあるのか

otoolというコマンドで知ることができる。otoolはLinuxにおけるlddの役割を果たす。つまり、readline.bundleが参照している実体を調べられる。今回の例なら、下のように実行すればいい。

```
$ otool -L ~/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin11.3.0/readline.bundle
```

するとlibedit.dylibのパスが表示される。ここでは以下のように表示されたとする。

```
/usr/lib/libedit.3.dylib
```

このlibeditとreadline.bundle別れさせ、libreadlineとくっつければいい。

## install_name_tool

いよいよ大詰め。install_name_toolではダイナミックライブラリに関する様々な操作が可能だが、今回は-changeというオプションで参照先の変更を行う。文法は下の通り。

```
$ install_name_tool -change 削除するパス 新しいパス bundleファイル
```

今回の例なら下のようになる。

```
$ install_name_tool -change /usr/lib/libedit.3.dylib /usr/local/Cellar/readline/6.2.4/lib/libreadline.dylib ~/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin11.3.0/readline.bundle
```

これでrails cなりirbなり起動してみればいい。日本語を入力すればその通りに表示されるはずである。
オフラインリアルタイムどう書く第四回の参考問題

オフラインでリアルタイムに「どう書く」をやるイベント。
またやります
http://atnd.org/events/32191
で。例によって参考問題。
難易度と分量はこれを目安にと言いたいところだけれども、たぶんこれは難しすぎる。
こんなに難しい問題は出しませんよ、という意味で参考に。

フカシギの数え方( http://www.youtube.com/watch?v=Q4gTV4r0zRs )が余りにも素晴らしかったので、そこから

# フカシギの通行止め

4✕4 のマス目の辺を通っての左上から右下に行く方法は何通りあるか計算する。
※ ビデオに合わせて 4✕4 と書いたが、縦に5本 横にも5本の道があり、頂点数は 25個である。
ただし

* 同じ頂点を二度通ってはいけない。
* ところどころ行き止まりがある。
* ビデオを見るとわかるが、行き止まりなしで 8512通り。
* 不正入力には対処しなくてよい。

行き止まりを表現するために、頂点に a〜y の名前を順につける。
入力文字列が "fg gh" なら、行き止まりは二箇所。fとgの間とgとhの間。

## 入力と出力の例

以下、"入力" -> 出力 # コメント の形式で例を示す

"" -> 8512 #そのまま。これが最大値。
"af" -> 4256 #対称性より半分になる
"xy" -> 4256 #対称性より半分になる
"pq qr rs st di in ns sx" -> 184 #3x3マスと同値
"af pq qr rs st di in ns sx" -> 92 #3x3マスのパターンの半分
"bg ch di ij no st" -> 185 #3x3マスのパターン +1
"bc af ch di no kp mr ns ot pu rs" -> 16 #4x2x2
"ab af" -> 0 #入口を塞いだ
"ty xy" -> 0 #出口を塞いだ
"bg ch ej gh lm lq mr ot rs sx" -> 11 #2x4+3
"ty ch hi mn kp mr rs sx" -> 18 #6*3
"xy ch hi mn kp mr rs sx" -> 32 #4*8
"ch hi mn kp mr rs sx" -> 50 #6*3+4*8
"ab cd uv wx" -> 621 
"gh mn st lq qr" -> 685 
"fg gl lm mr rs" -> 171 

※ 解答例をコメント欄に（ソースではなく）リンクの形で書いてくださるとありがたいです。
※ そのうち ruby か groovy で解答例を投稿するつもり。
cakePHPでHTMLヘルパーでサニタイズを無効にする

cakePHPのリンクヘルパーを使う時って

```link.php
<?php echo $this->Html->link('新規登録', array('controller' => 'users', 'action' => 'add')); ?>
```

みたいに書きます。
するとHtmlでは

```link.html
<a href="users/add">新規登録</a>
```

のようになります。
この時、以下のようにリスト要素\<li>を\<a>の中に入れたいとします。つまり、リスト要素全体をリンクにしたい時。

```link.html
<a href="users/add"><li>新規登録</li></a>
```

cakeで書くと

```link.php
<?php echo $this->Html->link('<li>新規登録</li>', array('controller' => 'users', 'action' => 'add')); ?>
```
としますが、この時、\<li>がサニタイズされてしまい、
\<li>新規登録\</li>
のようにブラウザで表示されてしまいます。
なので次のように書きます。

```link.php
<?php echo $this->Html->link('<li>新規登録</li>', array('controller' => 'users', 'action' => 'add'), array('escape' => false)); ?>
```

すると\<li>のサニタイズが解かれ、

```link.html
<a href="users/add"><li>新規登録</li></a>
```

ブラウザの表示でも
新規登録
のようになります。

-結論-
ヘルパーなどのサニタイズを向こうにするには
array('escape' => false)
をオプションに追加するとよい!!
マルチバイト文字をエスケープする

1行で済んだ。考えすぎてた。

```groovy:
def str = 'Groovyは、JVM上の言語です。'

str = str.replaceAll(/[^\x00-\x7f]/){'\\u'+Integer.toHexString((int)it)}
assert str == 'Groovy\\u306f\\u3001JVM\\u4e0a\\u306e\\u8a00\\u8a9e\\u3067\\u3059\\u3002'
```

ああ、でも、これだとサロゲートペア文字のエスケープができない。
commons.lang.StringEscapeUtilsを使う。

```groovy:
import org.apache.commons.lang.StringEscapeUtils
@Grab('commons-lang:commons-lang:latest.release')

def str = 'Groovyは、JVM上の言語です。'
str = str.replaceAll(/[^\x00-\x7f]+/){ StringEscapeUtils.escapeJava(it) }
assert str == 'Groovy\\u306F\\u3001JVM\\u4E0A\\u306E\\u8A00\\u8A9E\\u3067\\u3059\\u3002'
```
Processing: 四角形を回転させるサンプルプログラム


四角形をrect()で描画して、(角を中心にして)くるくると回転させるProcessingブログラムです。

```java:
void setup() {    
    size(400, 400);    
    frameRate(60);
}

void draw() {    
    background(255);    
    translate(width/2, height/2);    
    rotate(radians(frameCount));    
    rect(0, 0, 60, 60);
}
```

### 疑問: 四角形が 1 回転するまでにかかる時間は？

frameCountが360になったときに、丁度360度回転(1回転)となるのだから、draw()が360回呼び出されるのに必要な時間を求めればいいね。いま、`frameRate(60)` としているから、1秒間に60回draw()が呼ばれることになる。ということは、360(=60*6)回draw()が呼ばれるまでには6秒かかるということなるね。

プログラムを書いて確認してみよう。

```java:
int start;

void setup() {    
    size(400, 400);    
    frameRate(30);    
    start = 0;
}

void draw() {    
    background(255);    
    translate(width/2, height/2);    
    rotate(radians(frameCount));    
    rect(0, 0, 60, 60);    
    if (frameCount % 360 == 0) {        
        println(millis() - start);        
        start = millis();    
    }
}
```

実行結果です。

```
6552
6002
6000
6002
6000
6001
6002
```

1 回転に 6000 ミリ秒かかっている。よし、思った通りだ！

じゃあ、今度は `frameRate(30)` に変えてみよう。そうすると、今度は何秒かかる？

フレームレートを 60 から 30 に変更したのだから、1 回転するまでの時間は、倍の 12 秒かかるはず。

```java:
void setup() {    
    size(400, 400);    
    frameRate(30); // フレームレートを30に変更    
    start = 0;
}
```

実行結果です。

```
12851
12000
12001
12002
12002
12000
12002
```

考えたとおりの結果となったね。
Haskell/Graphics.Gloss

"世界で一番柔軟かつ簡単にグラフィックや入出力ができるライブラリ"である[Graphics.Gloss](http://hackage.haskell.org/package/gloss-1.7.5.2)を使うにあたっての雛形(テンプレート)

```haskell:Main.hs
module Main where

import Graphics.Gloss.Interface.Pure.Game

data World = World { picture :: Picture }

main :: IO ()
main
  = play (InWindow "Templete" (800, 600) (10, 10))
    black
    60
    initWorld
    draw
    handleInput
    (\_ s -> s )

initWorld :: World
initWorld = World { picture = Blank }

draw :: World -> Picture
draw (World _) = Blank

handleInput :: Event -> World -> World
handleInput (EventKey k ks _ _) s = s
handleInput (EventMotion _) s = s
```
なお、キー操作などを必要としないプログラムであればもう少し簡単に書くことが可能。
Excel で * を検索するには ~* と入力する

Excel で `*` という文字をを検索するには、検索語句の欄に `~*` と入力する。(頭に`~`をつける)

今までエスケープする方法を知らなかったのですが、つい最近ふとしたことで知ったので。

# 参考
* [「*」と「?」を検索する：PC Online](http://pc.nikkeibp.co.jp/article/NPC/20060213/229088/)
レイヤーまたはグループを別のファイルにコピー


1. 元のファイルのレイヤーパレットで、コピーしたいレイヤーまたはグループを選択。
2. 右クリックして Duplicate Layer/Group（レイヤー/グループを複製？）を選択。
3. 出てくるダイアログで複製先のファイルを選択できる。

参考
http://forums.adobe.com/thread/661617
Nokogiriでcase-insensitiveなselect

またNokogiriです。
時々タグ内の情報がcase sensitiveな感じで引っかからないので、対策します。

```ruby:sample
doc.xpath("//meta[translate(@name, 'DESCRIPTION', 'description') = 'description']")
```

例はmetaタグ内のdescriptionです。
`@name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', ''abcdefghijklmnopqrstuvwxyz''`
としておけば全文字で大丈夫です。
ですけどこの対策って何かあんまりスマートではないですよね。
phpの情報ではXPath2.0のmatchesファンクションには引数に`'i'`を渡せばcase-insensitiveにやってくれるみたいなんですが、Nokogiriで試してみると
`xmlXPathCompOpEval: function matches not found`
となったので諦めました。

XPathFunctionsをcustomする方法もあるらしく、それがスマートな感じです。

```ruby:sample_from_stackoverflow
class XpathFunctions

  def case_insensitive_equals(node_set, str_to_match)
    node_set.find_all {|node| node.to_s.downcase == str_to_match.to_s.downcase }
  end

end
```

`page.parser.xpath("//meta[case_insensitive_equals(@name,'keywords')]", XpathFunctions.new)`
で使います。

参考：
[How can I create a nokogiri case insensitive Xpath selector?](http://stackoverflow.com/questions/2279513/how-can-i-create-a-nokogiri-case-insensitive-xpath-selector?rq=1)
filecacheを使って作業用ディレクトリのファイルにアクセスする

## filecache?

filecacheとはemacsに標準で付いている使用頻度の高いファイルに簡単にアクセスする為の仕組みです。
通常は特定のディレクトリ(~ とか ~/binとか)に限って使うものなのでディレクトリを再帰的に辿れません。

そこでこのfilecacheをディレクトリを再帰的に辿ってcacheを作る方法です。

### 前提

filecacheは指定されたディレクトリ内のファイル名をキャッシュする為、
ディレクトリを大量に指定すると一気にディスクアクセスが増えます。
その為、再帰的指定するディレクトリは、SSDなどの高速なディスク上にあることを前提にしています。

### 作業用ディレクトリ?

プロジェクトファイルとかgitとかsvnのworking copyとか
ディレクトリが再帰的に一杯あるよね?

## 概要

以下の処理をinit.el内で実行する

1. shellスクリプトで対象ディレクトリを再帰スキャン
1. スキャン結果からディレクトリ一覧のelファイルを作成
1. filecacheの対象リストに追加

## 設定

#### 再帰スキャン用のshellスクリプト

```sh:~/.emacs.d/filecachedir.sh
#!/bin/sh

function abs_path() {
  d=$(dirname $0)
  (cd $d;pwd)
}

TARGET_DIR=~/work
EXCLUDE_DIR="target log logs .git tmp mnt .settings document documents doc .svn *.bak"
OUTPUT="$(basename $0 .sh).el"

EXC=""

for d in $EXCLUDE_DIR; do
  if [ -n "$EXC" ]; then
      EXC="$EXC -o -name $d"
  else
      EXC="-name $d"
  fi
done

cd $(abs_path)
[ -r $OUTPUT ] && rm -f ${OUTPUT}{,c}
echo "(setq my-filedir" >> $OUTPUT
echo " '(" >> $OUTPUT
find $TARGET_DIR \( $EXC \) -prune -o -path "*/git/*" -type d -print0 \
| perl -0 -ne 'chomp;print qq{ "$_"\n}' >> $OUTPUT
echo "))" >> $OUTPUT
```
\$TARGET_DIR以下をfindしてディレクトリ名を一覧
my-filedirデータをセットするelファイルを作る
対象外のファイル・フォルダは$EXCLUDE_DIRで指定する

#### filecacheの設定

```cl:init.el
(require 'filecache)
(let ((prg (concat user-emacs-directory "filecachedir.sh")))
  (when (file-readable-p prg)
    ;; ディレクトリを追加
    ;; ディレクトリの更新は filecachedir.sh を使う
    (call-process prg nil nil nil "")
    (load-file (concat user-emacs-directory "filecachedir.el"))
    (file-cache-add-directory-list
     my-filedir)
    )
  )
```
call-process で ~/.emacs.d/filecachedir.sh を呼び出す
生成された~/.emacs.d/filecachedir.elを読み込んでfilecacheのディレクトリリストに追加する

#### anythingの設定

anythingもfilecacheに対応しているのでソースに足してあげる

```cl:init.el
  (setq anything-sources
        '(
...
          anything-c-source-file-cache
...
          )
        )
```
mv コマンド

    mv <移動先>

で、選択したファイルを<移動先>に移動する。
補完は、cd コマンドのを流用。

```commands.py
class mv(Command):
  """
  :mv <DEST>
  """

  def execute(self):
    from ranger.ext.shell_escape import shell_quote
    self.fm.execute_console('shell mv %s ' + shell_quote(self.rest(1)))

  from ranger.config import commands
  tab = commands.cd.tab
```
Range（範囲）を足す


丸数字は21からコードポイントが離れているので、範囲を足したかった。
Rangeを()で囲めば足せます。

```groovy:
def marusuji = ('\u2460'..'\u2473') + ('\u3251'..'\u325F')
assert marusuji[21] == '㉒'
```
((x, y, z…) ->).length is 0


ここが変だよ CoffeeScript シリーズ

```coffeescript
scalar = (x, y) ->
  Math.sqrt(x * x + y * y)
```

この時の `scalar.length` は `2` になるのはまぁ当然な事のように思えるはずです。

```coffeescript
f = (a, b = 0) ->
  
```

CoffeeScript は上記のイディオムで `y == null` であった場合にデフォルトに指定した　`0` へ代入します。
この場合の `f.length` はどうでしょうか。結果は `2` です。これも、納得できる結果かと思えます
(これも人によっては `1` であるべきじゃないか、という感覚もある)


それでは、平面以上、n次元上 (n > 1) の座標点を汎用的に受け付ける `point` 関数をこのように宣言してみます

```coffeescript
point = (x, y, cs…) ->
	vertex = [x, y].concat cs
```

さて、このときの `point.length` は `2` でしょうか？それとも `3` でしょうか。

**答えは `0` です。**

### コンパイル結果
上で記述した宣言はこのような Javascript に展開されます

```javascript
var point
point = function() {
  var x, y, cs, vertex;
  x = arguments[0], y = arguments[1], cs = 3 <= arguments.length ? __slice.call(arguments, 2) : [];
  return vertex = [x, y].concat cs;
}
```

これは[公式ドキュメントにもちゃんと書いてある](http://coffeescript.org/#splats)ことなので、当然そう変換するという前提でコードを書かれているかと思います。
が、 Javascript 初心者に CoffeeScript を薦めるのは愚行だと各場所で主張する理由はこういう部分が所々にあるからです。(他にもあるけど、それは別の記事で紹介します)

```coffeescript
f = (x, y) ->     # do something
g = (x, y = 0) -> # do something
h = (x, y, z) ->  # do something
k = (x, y, z…) -> # do something

console.log f.length # => 2
console.log g.length # => 2
console.log h.length # => 3
console.log k.length # => 0 (!!!)
```

CoffeeScript のソースコード上でこのような結果は、一見しただけで予想しやすいかとは思えません。

## 困ることある？
### arity が意図していない `0` による弊害 
この仕様で困る事があるかというと、たとえば `printf` のような任意の数の変数を受け取る関数を定義する際に *"必須である引数が充分に渡されていない場合にエラーなどをライブラリ使用者に示す" / "部分関数として残りの引数を待つ関数を作る"* などの処理が実装できません。(素の Javascript で素直に書けばそのようなユーティリティはトリックなしで提供できる)

### `args…` をクロージャ内に配列で不必要に確保することによる弊害
もう一つは、`for` `while` などで繰り返し関数を呼び出す際に、普通に Javascript に書くよりもパフォーマンスが低下します。その原因は使う必要が無くとも、呼び出す度に可変長引数の部分を `var opts = []` としてメモリを確保するので、 GC Event を頻繁に呼ばれる可能性が出てくることによります。書き方次第では GC されにくい故にメモリリークの原因になりえます

```javascript
// javascript でこう書き直したら速度とメモリ肥大が収まった、というケース
var _slice = Array.prototype.slice
var f = function(x, y) {
  if (2 < arguments.length) {
    g.apply(null, _slice.call(arguments));
  } else {
    g(x, y);
  }
};
```

### すごく気づきにくい
あまりそのようなトラブルが起きる事はないと思いますが、これを原因とするバグに直面した際に、原因が `(x, y, z…)` と書かれていた、というのに気づくのは困難かと思われます。 SourceMap に対応したから Chrome でもデバッグしやすくなった、と喜んでも、ここには気付けないかと。

## 対策
### `(a, b, c, others…)` のイディオム使わない
自前で `Array.prototype.slice` のエイリアスを用意して、 CoffeeScript のイディオムを経由しないように工夫する

```coffeescript
_slice = Array::slice
f = (x, y) ->
  # 必要性が出てくるまで cs への代入を記述しないでおく
  cs = if 2 < arguments.length then _slice.call arguments, 2 else []
  # do something
```

この時の `f.length` は `2` となり、「その関数に必要な最低限の引数の数」は正しく宣言することができます。**なお、 *.coffeee の中で `Array.prototype.slice` のエイリアスである `__slice` を直接記述すると文法エラーになります**

でも、ここまでするくらいならそもそも Coffee を選択しない方が賢いって気にさせる一つのトピックでした
AS3 で音量調整


`SoundTransform` を `SoundMixer` にあてるとできます。ミュートするには以下。

```as3
import flash.media.SoundMixer;
import flash.media.SoundTransform;

var muteTransform:SoundTransform = new SoundTransform(0);

SoundMixer.soundTransform = muteTransform;
```