OmniAICreator/Qiita-1.07M huggingface dataset:
[Flash Pro] 空フォルダを削除する君.jsfl

Flash Proの［ライブラリ］パネルで、要素が0個のフォルダを削除してするJSFLです。

```javascript
function cleanLibraryFolder(){
	var lib = fl.getDocumentDOM().library;
	var folders = {};
	for(var i=0; i<lib.items.length; i++){
		var o = lib.items[i];
		var n = o.name;
		var obj = getItemObject(o.name);
		
		if(o.itemType == "folder"){
			folders[o.name] = 0;
		}
		
		folders[obj.folder]++;
	}
	
	var cnt = 0;
	
	fl.trace("");
	fl.trace("----- Clean Library Folder -----");
	for(var p in folders){
		if(folders[p] == 0){
			cnt++;
			lib.deleteItem(p);
			fl.trace("Delete: '" + p + "'");
		}
	}
	fl.trace("");
	fl.trace(cnt + " folder is deleted.");
	fl.trace("");
}

function getItemObject(path){
    var arr = path.split("/");
    var n = arr.pop();
    return {
        folder: arr.join("/"),
        name: n
    }
}

cleanLibraryFolder();

```
整数をビットの数列に分解する関数 ( 7 を渡したら [1, 2, 4] に分解するやつ )

```php
<?php 

function decToBits($dec)
{
	$bin  = decbin($dec);
	$bits = str_split($bin);
	$bits = array_reverse($bits);
	$bits = array_filter($bits);

	foreach ( $bits as $pos => $bit ) {
		$bits[$pos] = pow(2, $pos);
	}

	$bits = array_values($bits);

	return $bits;
}

// テスト用関数
function test()
{
	$bits = func_get_args();
	$sum  = array_sum($bits);

	echo sprintf('Case: %s = %s', $sum, implode(', ', $bits)), PHP_EOL;
	echo json_encode(decToBits($sum)), PHP_EOL;
	echo '---------', PHP_EOL;
}


test(1);
test(1, 2);
test(2, 4);
test(1, 4);
test(1, 2, 4, 8);
test(4, 8);
test(8);
```

```text:実行結果
Case: 1 = 1
[1]
---------
Case: 3 = 1, 2
[1,2]
---------
Case: 6 = 2, 4
[2,4]
---------
Case: 5 = 1, 4
[1,4]
---------
Case: 15 = 1, 2, 4, 8
[1,2,4,8]
---------
Case: 12 = 4, 8
[4,8]
---------
Case: 8 = 8
[8]
---------
```
フォントサイズをemで指定するときにpx換算しやすい方法

厳密には若干差が現れますが、ほぼ大差ないのでよく使っています。

bodyにフォントサイズを62.5％で設定します。
あとは各要素でサイズを指定するときに、12px→1.2em、14px→1.4emとします。

```stylesheet.css
body{  font-size: 62.5% ; } /* 1.0em = 10px  */
p{ font-size: 1.2em; } /* 12px */
a{ font-size: 1.4em; } /* 14px */
```
リモートマシンの長いコマンドが終了したらGrowl通知

ローカルの開発ならtypesterさんの

*  [GNU screen の裏にいる Window で完了したコマンドを Growl 通知したい - unknownplace.org](http://unknownplace.org/memo/2010/03/23/1/) 

で出来るけど、リモートマシンでもコマンドの終了をGrowl通知したい。
現在のところ、以下の方法に落ち着いている。

1. [http://qiita.com/items/1958](http://qiita.com/items/1958) で適当な文字列（ここでは "Finish!" とする）をGrowl通知するようiTermに設定する
2. リモートマシンで終了を通知したいコマンドを実行するさい以下のようにする

```sh:growl.sh
$ some_long_command; echo 'Finish!'  # Finish! をGrowl通知するようiTermに設定しておく
```

これでリモートマシンでも長いコマンドの終了をGrowl通知できる。
なお ; echo 'Finish!' と毎回打つのはだるいので適当なaliasを貼っておくと楽。
[Flash Pro] 日本語のライブラリシンボル名を英語化する君.jsfl

カッとなって作ってしまいました。
Flash ProでXFLを使っているときに、SVNやGITで日本語ファイルが入るのをある程度防ぐことができます。

```javascript
function deleteJapaneseName(){
	var lib = fl.getDocumentDOM().library;
	for(var i=0; i<lib.items.length; i++){
		var o = lib.items[i];
		var obj = getItemObject(o.name);

		var name = obj.name;
		name = name.split("アセット").join("asset");
		name = name.split("シェイプ").join("shape");
		name = name.split("シンボル").join("symbol");
		name = name.split("レイヤー").join("layer");
		name = name.split("グループ").join("group");
		name = name.split("フォント").join("font");
		name = name.split("グラフィック").join("graphic");
		name = name.split("ビデオ").join("video");
		name = name.split("フォルダー").join("folder");
		name = name.split("トゥイーン").join("tween");
		name = name.split("名称未設定").join("Unknown");
		name = name.split("　").join(" ").split(" ").join("_");
		o.name = name;
	}
}

function getItemObject(path){
    var arr = path.split("/");
    var n = arr.pop();
    return {
        folder: arr.join("/"),
        name: n
    }
}

deleteJapaneseName();

```
Liftの404ページ

Liftでページが見つからないとき、指定したページへ飛ばす方法。
Boot.scalaに以下を記述することで、404.htmlへ飛ばすことができる。

```scala
class Boot {
  def boot {
    ...
    LiftRules.uriNotFound.prepend(NamedPF("404handler"){
      case (req,failure) =>
        NotFoundAsTemplate(ParsePath(List("404"),"html",false,false))
    })
    ...
  }
}
```
LiftでHtml5

scalaのwebフレームワークLiftが生成するページをHtml5にしたいときは, Boot.scalaでLiftRulesに設定を追加する。

```scala
class Boot {
  def boot {
    ...
    // html5
    LiftRules.htmlProperties.default.set((r: Req) =>new Html5Properties(r.userAgent))
    ...
  }
}
```
PHPでMySQLの大量の検索結果を扱うためのMySQLResultIterator

10000行をCSVに出力したい。
PDO使えない(´・ω・｀)
10000行なんて、一度にすべてを配列にしたらメモリに乗らない(´・ω・｀)

そんなときは、こんなふうにイテレータにしておくと、
・メモリを節約しながら10000行のレコードを処理でき、
・モデルからイテレータオブジェクトを返すことで、カプセル化とポリモーフィズムも実現できる。


```php
<?php
require_once 'MySQLResultIterator.php';

$result = mysql_query('SELECT * FROM foo'); // 10000行

if ( $result === false ) {
	die;
}

$rows = new MySQLResultIterator($result);

foreach ( $rows as $row ) {
	// ここで行ごとに echo するなり、file_put_contents()するなり
}

```


```php:MySQLResultIterator.php
<?php

/**
 * MySQLの結果イテレータ
 */
class MySQLResultIterator implements SeekableIterator, Countable
{
	/** @var resource */
	protected $result   = null;
	protected $total    = 0;
	protected $position = 0;

	public function __construct($result)
	{
		if ( is_resource($result) === false or get_resource_type($result) !== 'mysql result' ) {
			throw new InvalidArgumentException("Result type must be MySQL result set.");
		}

		$total = mysql_num_rows($result);

		if ( $total === false ) {
			throw new RuntimeException("Failed to detect row count.");
		}

		$this->result = $result;
		$this->total  = $total;
	}

	/**
	 * 最初の行に巻き戻す
	 */
	public function rewind()
	{
		$this->position = 0;

		if ( $this->_isValid(0) === true ) {
			mysql_data_seek($this->result, 0);
		}
	}

	/**
	 * 現在の行を返す
	 * @return array
	 */
	public function current()
	{
		$current = mysql_fetch_assoc($this->result);
		mysql_data_seek($this->result, $this->position); // 進んだぶん、戻す
		return $current;
	}

	/**
	 * 現在の行のキーを返す
	 * @return int
	 */
	public function key()
	{
		return $this->position;
	}

	/**
	 * 次の行に進む
	 * @return void
	 */
	public function next()
	{
		$this->position += 1;

		if ( $this->_isValid($this->position) === false ) {
			return;
		}

		mysql_data_seek($this->result, $this->position);
	}

	/**
	 * 現在位置が有効かどうかを調べる
	 * @return bool
	 */
	public function valid()
	{
		return $this->_isValid($this->position);
	}

	/**
	 * 行数を返す
	 * @return int
	 */
	public function count()
	{
		return $this->total;
	}

	/**
	 * 行を移動する
	 * @param int $position
	 * @throws OutOfBoundsException
	 */
	public function seek($position)
	{
		$position = intval($position);

		if ( $this->_isValid($position) === false ) {
			throw new OutOfBoundsException();
		}

		mysql_data_seek($this->result, $position);
	}

	protected function _isValid($position)
	{
		return ( $position < $this->total );
	}
}
```
PHPのインタラクティブシェルを試す(Mac OSX Lion)

ちょっとした関数の実験に便利なインタラクティブシェル。似たようなものとしてFacebook製の[phpsh](http://www.phpsh.org/)がありますが、あえて、[対話シェル](http://php.net/manual/ja/features.commandline.interactive.php)を試そうと思います。

[PHP5.4 RC](http://qa.php.net/)をダウンロード

コンパイル＆インストール

```
$ ./configure \
	--prefix=/Users/suin/lib/php54 \
	--with-config-file-path=/Users/suin/lib/php54 \
	--with-readline \
	--with-libedit
$ make
$ make install
```

シンボリックリンクはっとく

```
$ ln -s ~/lib/php54/bin/php ~/bin/php54
```

バージョン確認

```
$ php54 --version
PHP 5.4.0RC7 (cli) (built: Feb 17 2012 10:30:46) 
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
```

インタラクティブシェルを ```phpsh``` という名前にしておく

```
$ alias phpsh='php54 -a'
```

試す

```
$ phpsh
Interactive shell

php > var_dump(1);
int(1)
```
Rubequeローカル実行確認用テンプレート

※Rubequeは**『sicuro』**というライブラリを使ってコードを実行しているっぽいので
**『sicuro』**のgemをインストールしてください。  
ローカルでも**『sicuro』**を使った実行確認をしたい場合に使うテンプレートです。
```=== Code Area ===```間にコードを書いて実行します。

```ruby:rubeque_template.rb
require "bundler/setup"
require "sicuro"

TIMELIMIT = 15
MEMLIMIT  = 30

Sicuro.setup(TIMELIMIT, MEMLIMIT)

common = <<CODE
def assert_equal(x, y, message = nil)
  if x != y
    raise message ? message : "The value '\#{x}' does not equal '\#{y}'."
  else
    return true
  end
end
CODE

puts Sicuro.eval(<<CODE)
#{common}
# === Code Area ===

# === Code Area ===
CODE
```
Rubequeサイトでは以下のコードが```FiberError: can't alloc machine stack to fiber```となる。
ローカルではエラーが再現しなかった。

```ruby:prime_factorization.rb
require "bundler/setup"
require "sicuro"

TIMELIMIT = 1
MEMLIMIT  = 1

Sicuro.setup(TIMELIMIT, MEMLIMIT)

common = <<CODE
def assert_equal(x, y, message = nil)
  if x != y
    raise message ? message : "The value '\#{x}' does not equal '\#{y}'."
  else
    return true
  end
end
CODE

puts Sicuro.eval(<<CODE)
#{common}
# === Code Area ===
def prime_factorization(num)

  prime =  Enumerator.new do |y|
    mem = []
    is_prime = lambda { |e| mem.find { |_| e.gcd(_) != 1 } }
    2.upto(num) do |n|
      unless is_prime[n]
        mem << n
        y << n
      end
    end
  end

  o = []
  loop do
    n = prime.next
    if num % n == 0
      num /= n
      o << n
      prime.rewind
    end   
  end
  o

end

p assert_equal prime_factorization(42), [2, 3, 7]
p assert_equal prime_factorization(44), [2, 2, 11]
p assert_equal prime_factorization(75), [3, 5, 5]
p assert_equal prime_factorization(123456), [2, 2, 2, 2, 2, 2, 3, 643]
# === Code Area ===
CODE
```
Herokuとの環境問題っぽいなー
.svnディレクトリをfindから除く

```sh
# xmlファイルを検索、ただし.svnディレクトリ以下は除く
find ./ \
     -type d -name '.svn' -prune \
  -o -type f -name '*.xml'

# xmlファイルを検索、ただし.svnディレクトリ以下は除く
# 検索結果のファイルの内容から、apiを含む行を探す
find ./ \
     -type d -name '.svn' -prune \
  -o -type f -name '*.xml' -print0 \
| xargs -0 grep -n --color 'api'
```
更新時にファイル名の文字の大小が衝突してmercurialが動かないときの対処法

windowsやmacだと文字列の大小を区別しないため、大文字のファイル名と小文字のファイル名があると、同じファイルが二つあると認識して更新時に衝突する
linuxは文字列の大小を区別するので、一端linuxにpullしてから修正してwin/macに戻せばまた使えるようになる
手元にlinuxがない場合に気軽かつ最速でlinuxを最速使うには、ec2がいい。よほどでかくなければ容量も気にしなくていいし、気に入らなかったらそのマシンをterminateすればいいし、お金も大してかからない
ユーザー登録からssh接続するところまで30分かからない。二度目からは鯖作成からssh接続まで5分くらいで作れるようになる。今回の問題解決だけの為に起動して、作業が終了おわったらすぐにstopした
ssh接続したらsudo yum install mercurialすれば環境はできる
mercurialの設定ファイルは、linuxだと/etc/mercurial/hgrc(自分でつくる)
ユーザー設定を忘れずない

####参考
はじめてのアマゾンクラウド①[Amazon Web Services(AWS)のアカウントを開設する]
http://www.delicious.com/redirect?url=http%3A//www.slideshare.net/kentamagawa/3aws

mercurialの文字の大小による衝突について
http://techs-empty.tumblr.com/post/15652264964/mercurial
カスタムURIスキームの設定

アプリケーション記述ファイルのxmlにAndroidとiOSそれぞれ別々に設定を記述します

```xml:Androidの設定
<android>
  <manifestAdditions>
    <![CDATA[
      <manifest>
        <application>
          <activity>
            <intent-filter>
              <action android:name="android.intent.action.MAIN"/>
              <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <intent-filter>
              <action android:name="android.intent.action.VIEW"/>
              <category android:name="android.intent.category.BROWSABLE"/>
              <category android:name="android.intent.category.DEFAULT"/>
              <data android:scheme="test-app"/>
            </intent-filter>
          </activity>
        </application>
      </manifest>
    ]]>
  </manifestAdditions>
</android>
```

```xml:iOSの設定
<iPhone>
      <InfoAdditions><![CDATA[
            <key>CFBundleURLTypes</key> 
            <array> 
                  <dict> 
                        <key>CFBundleURLSchemes</key> 
                        <array> 
                              <string>test-app</string> 
                        </array> 
                        <key>CFBundleURLName</key> 
                        <string>jp.co.piisu.test-app</string> 
                  </dict> 
            </array>
      ]]></InfoAdditions>
</iPhone>
```

以上で、
`<a href="test-app://arg1=funya&arg2=kurage">アプリを起動</a>`
のようなリンクをふんだ場合に、アプリが起動されるようになります。

---
####パラメータの読み込み
NativeApplicationオブジェクトのinvokeイベントを通じて読み込むことができます。

```as3:パラメータの読み込み
var native_app:NativeApplication = NativeApplication.nativeApplication;
native_app.addEventListener(InvokeEvent.INVOKE, function(evt:InvokeEvent):void {
	//通常起動の場合もinvokeイベントが発生し、この場合argumentsのlengthは0なのでチェックを行う
	if(evt.arguments.length > 0) {
		trace(evt.arguments[0].toString());    // "test-app://arg1=funya&arg2=kurage" と出力
	}
});
```

---
####注意
- 他のアプリが同じ名前のスキームを登録していると、既存アプリが優先されてしまう
- StageWebViewではカスタムURIスキームを使用してURLを開くことができない
- AndroidのブラウザにカスタムURIスキームを直入力しても、アプリを起動できない
iPhoneのSafariでフルスクリーンモードで開くように設定


以下のメタタグを入れるだけ。

``<meta name="apple-mobile-web-app-capable" content="yes" />``

これが指定してあると、一旦Webサイトをホーム画面に追加すると、そこから開いた時にSafariのナビゲーションを表示せずにフルスクリーンで開くことが出来る。
さらに、ホームボタン二度押しでマルチタスクでアプリを選択する時に、Safariとしてではなく一つのアプリとして選択できるのでお得。

参考にしたサイト
http://www.u-ziq.com/blog/2011/01/post_61.html
パネルの2分割(F#版)

移植ついでにNode型の定義をリストの組から組のリストに変えてみた。
リストの組だと長さが異なるリストを許容してしまうことになるが、組のリストならその心配はない。
（追記）現在のF#だと内包表記が遅いみたいなので、内包表記をやめてみた。thx rst76

```fsharp:main.fs
type Point =
    {X: int; Y: int;}
    static member ( + ) (p: Point, q: Point) = {X = p.X + q.X; Y = p.Y + q.Y;}
    static member ( - ) (p: Point, q: Point) = {X = p.X - q.X; Y = p.Y - q.Y;}

type Pair = Point * Point

type Node = Pair list

let move ((f, b) : Pair) (p : Point) : Pair =
    (f + p, b - p)

let moves ((pf, pb) : Pair) ((qf, qb) : Pair) : Pair list =
    let forward : Point = pf - qf
    let left : Point = {X = forward.Y; Y = -forward.X;}
    let right : Point = {X = -forward.Y; Y = forward.X;}
    List.map (move (pf, pb)) [forward; left; right;]

let nexts (n: Node) : Node list =
    match n with
    | p1::p0::ps -> List.map (fun p2 -> p2::n) (moves p1 p0)
    | _ -> []

let exists (p : Point) (ps : Pair list) =
    List.exists (fun (pf, pb) -> p = pf || p = pb) ps

let solve (size: int) : Node list =
    let center : Point = {X = size/2; Y = size/2;}
    let p0 : Pair = (center, center)
    let p1 : Pair = move p0 {X = 0; Y = 1;}
    let initial : Node = [p1; p0;]

    let atboundary (p : Point) : bool =
        (p.X = 0) || (p.X = size) || (p.Y = 0) || (p.Y = size)

    let rec solutions (n : Node) : Node list =
        match n with
        | (pf, pb)::ps when atboundary pf -> [n]
        | (pf, pb)::ps when exists pf ps -> []
        | p::ps -> List.collect solutions (nexts n)
        | _ -> []

    solutions initial

printfn "%d" (List.length (solve 8))
```
PHPで特定のMySQLデータベースに接続するクラス

#使い方
クラスを初期化するためには、
- DBユーザー名
- DBパスワード
- DBのホスト名
- DB名
の4つの変数を引数として渡す必要があります。

##実行コード例

```php
//4つの変数に代入する
$dbuser = 'your_name';
$dbpass = 'your_password';
$dbhost = 'localhost';
$dbname = 'test';

//接続を実行する
$db = new connect_db($dbuser,$dbpass,$dbhost,$dbname);

//DB接続時のハンドルをゲットするメソッドを実行
$handle = $db->getHandle();
//上で取得したハンドルを用いてMySQlにリクエストを送る
```

##クラスのソースコード
```php
##データベースに接続するクラス
class connect_db{
	//データベース接続のための変数を宣言
	private $dbuser;
	private $dbpass;
	private $dbhost;
	private $dbname;

	private $handle;


	//コンストラクタでデータベースを設定し自動接続する
	public function __construct($dbuser,$dbpass,$dbhost,$dbname){
		$this->dbuser = $dbuser;
		$this->dbpass = $dbpass;
		$this->dbhost = $dbhost;
		$this->dbname = $dbname;
		$this->connect();
	}

	//データベースに接続
	public function connect(){
		$handle = mysql_connect($this->dbhost, $this->dbuser, $this->dbpass);
		$this->handle = $handle;
		if( mysql_select_db($this->dbname,$this->handle)){
			return 'true';
		}else{
			return'false';
		}
	}
	public function getHandle(){
		return $this->handle;
	}

}
```

ちょっと無駄があるような気がしますが。
また、セキュリティ的にはどうなのか不安です。
1フレーム分の変更をまとめて処理。

コンポーネントとかを自作するときに、パラメータが1つ変更されるごとにgraphicsを消して書き換えみたいなことをやってると重くなるので1フレーム分の変更をまとめて処理。

```as3:CustomComponent.as
package {
	import flash.display.Graphics;
	import flash.display.Sprite;
	import flash.events.Event;
	
	public class CustomComponent extends Sprite {
		private var changed:Boolean = false;
		private var eventType:String;
		
		public function setSize( width:Number, height:Number ):void {
			/* サイズ変更! */
			update();
		}
		public function setBackground( color:uint ):void {
			/* 背景色変更! */
			update();
		}
		
		/* 更新を予約 */
		private function update():void {
			if (! changed ) {
				changed = true;
				if ( stage ) {
					addEventListener( eventType = Event.EXIT_FRAME, _update, false, int.MIN_VALUE );
				}else {
					addEventListener( eventType = Event.ADDED_TO_STAGE, _update );
				}
			}
		}
		private function _update( e:Event ):void {
			removeEventListener( eventType, _update );
			changed = false;
			
			/* ここから下で、画面更新処理 */
			var g:Graphics = graphics;
		}
		
	}
}
```

Event.ENTER_FRAMEじゃなくて、Event.EXIT_FRAMEを使うのがミソ。
画面が描画される寸前に呼び出されるので、画面が変更されるまでのラグが生じにくい。

update関数自体はENTER_FRAMEの段階で呼び出されるようにしておくとさらにGood!
プログラミングコンテスト: パネルの2分割

10年ぐらい前の問題をHaskellで解いてみた。

問題は、「8×8ますの正方形のパネルを同じ形に2分割する分け方はいくつあるか」というもの。

↓のコードは回転同型は考慮しているが鏡像同型は考慮してない。でもすっきりと書けたんじゃないかな。

```haskell:main.hs
type Point = (Int, Int)
type Pair = (Point, Point)
type Node = [Pair]

main :: IO ()
main =  do
  print $ length $ solve 8

plus                   :: Point -> Point -> Point
plus (x1, y1) (x2, y2) =  (x1+x2, y1+y2)

minus                   :: Point -> Point -> Point
minus (x1, y1) (x2, y2) =  (x1-x2, y1-y2)

move          :: Pair -> Point -> Pair
move (f, b) p =  (f `plus` p, b `minus` p)

moves                   :: Pair -> Pair -> [Pair]
moves (pf, pb) (qf, qb) =  map (move (pf, pb)) [f, r, l]
  where
    (dx, dy) = pf `minus` qf
    f = (dx, dy)
    r = (-dy, dx)
    l = (dy, -dx)

nexts            :: Node -> [Node]
nexts (p1:p0:ps) =  [p2:p1:p0:ps | p2 <- moves p1 p0]

exists :: Point -> [Pair] -> Bool
exists p = any (either p)
  where
    either p (pf, pb) = p == pf || p == pb

solve      :: Int -> [Node]
solve size =  solutions initial
  where
    center :: Point
    center =  (size `div` 2, size `div` 2)

    p0 :: Pair
    p0 =  (center, center)

    initial :: Node
    initial = [move p0 (0, 1), p0]

    atboundary        :: Point -> Bool
    atboundary (x, y) =  (x == 0) || (x == size) || (y == 0) || (y == size)

    solutions   :: Node -> [Node]
    solutions n
      | atboundary f = [n]
      | exists f ps  = []
      | otherwise    = [n'' | n' <- nexts n,
                              n'' <- solutions n']
      where
        (f,b):ps = n
```
一時変数を使わずスワップする方法

排他的論理和を使って、一時変数を使わずに、2つの変数の値を交換することができます。

```c:swap.c
#include <stdio.h>
 
int main(void) {
        int x=10,y=20;
        printf("x:%d y:%d\n",x,y);
        x ^= y;
        y ^= x;
        x ^= y;
        printf("x:%d y:%d\n",x,y);
        return 0;
}
```

```bash:output
x:10 y:20
x:20 y:10
```

他の言語でも同様にできるはずです。
coffee-modeのタブ幅を2にする

emacsでcoffeescriptを書く時には下記のcoffee-mode.elを使うのがおすすめ
https://github.com/defunkt/coffee-mode

デフォルトだとタブ幅がひろいので2に変更したい。.emacsに下記のように記述する。
※READMEにある通りに書くと改行動作の時にインデントが引き継がれない

```cl:.emacs
(defun coffee-custom ()
  "coffee-mode-hook"
  (and (set (make-local-variable 'tab-width) 2)
       (set (make-local-variable 'coffee-tab-width) 2))
  )

(add-hook 'coffee-mode-hook
  '(lambda() (coffee-custom)))
```
ピカチュウっぽいセリフの正規表現を作るスクリプト

参照: https://twitter.com/chokudai/status/176877685916712962

自分で書くのが面倒だったのでコンピュータにやってもらいました。

```perl:pika.pl
#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use Regexp::Optimizer;

=for comment

Output:

(?^u:(?:ピ(?:カ(?:ピ(?:カチューッ?|[ーッィ])?|ッ(?:チュ[ーッ]?)?|、ピカチュウ[ーッ]?|[ーァ])?|ッ(?:ピカチュウ[ーッ]?|カピカチュウ[ーッ]?)?|ー(?:カ(?:ピカ[ーッァ]?|[ーッァ])?)?|ィ(?:カ(?:ァ(?:ーチューウ[ーッ]?)?|[ーッ])?)?|ピピ[ーッィ]?)?|ビガ(?:ーッ?|ジューッ?)))

=cut

chomp(my @pika_words = <DATA>);
my @additionals = map {
  my @ws;
  push @ws, $_ . 'ー' unless /ー$/;
  push @ws, $_ . 'ッ' unless /ッ$/;
  push @ws, $_ . 'ァ' if /カ$/;
  push @ws, $_ . 'ィ' if /ピ$/;
  @ws;
} @pika_words;

my $opt = Regexp::Optimizer->new;
my $re = $opt->list2re(@pika_words, @additionals);

binmode STDOUT, ':utf8';
print $re, "\n";

# Pikachu-like lines below are taken from
#   http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1222520562 and
#   modified.

__DATA__
ピ
ピカピ
ピッピカチュウ
ピカピカチュー
ピーカピカ
ピーカ
ピカ
ビガー
ピィカ
ピピピ
ピカッチュ
ピッカピカチュウ
ピカ、ピカチュウ
ピィカァーチューウ
ビガジュー
```
Eclipse の GAE Plugin で Failed to compile jsp files と出たときの対処法

> EclipseのGAE Pluginで "Unable to update app: Failed to compile the generated JSP java files."と出た時の対処方法 (glaswerkという人の報告)． Window→Preferences→Java→Installed JRE's→Addを選ぶ． JRE Typeを選び，Standard VM→Next→Directoryで，JDKのディレクトリを選ぶ． Installed JREに戻ったら，JDKの方にチェックを入れる． JREとJDKのミスマッチらしい．

http://www12.ocn.ne.jp/~yamazaki/repair2010.html
%(剰余)の最適化について

2^nの剰余をビット演算化します
恐らく速度差は10倍以上

```java:optimize

y = x & 1; // x % 2
y = x & 3; // x % 4
y = x & 7; // x % 8
y = x & 15; // x % 16

```

どうしてこうなるかまず10進で考えてみましょう。

123456789 % 100
を計算してみましょう。
わざわざ割り算をする人はいませんよね？
下から二桁を取って89でおしまいです。

__10進数において10のn乗の剰余を計算する時は、
下からn桁だけを取ればいいことになります。__

コンピューターでも同じ事ができます。
コンピューターの場合は0と1の2進なので、
10が2に、100が4に該当します。
つまり2のn乗、

x % 2
x % 4
x % 8
...
x % 1024
などの時に同じテクニックが使えます。

では、下からn桁を取り出したいときにはどうすればいいでしょうか。
これも便利なものがあります。
& (アンド)演算子です。
この演算子を使うと、ビットにマスクをかけることができます。
例えば

00001111 & 00111100
は、1の重なった部分 00001100 を返します。
これを使うと下からn桁の部分を取り出すことができます。
下から3桁を取り出したい場合は　00000111 で
マスクをかけてやればいい事になります。
つまり、

00000100の剰余がほしい場合は、00000011でマスクをかける。
00001000の剰余がほしい場合は、00000111でマスクをかける。
00010000の剰余がほしい場合は、00001111でマスクをかける。
00100000の剰余がほしい場合は、00011111でマスクをかける。

これらを10進に直してみましょう。

4の剰余がほしい場合は、3でマスクをかける。
8の剰余がほしい場合は、7でマスクをかける。
16の剰余がほしい場合は、15でマスクをかける。
32の剰余がほしい場合は、31でマスクをかける。

もう気付いた方も多いのではないのでしょうか。
そう、 __2のn乗 の剰余がほしい場合は、2のn乗 - 1 でマスクをかけてやればいい__のです。
ですので、

x % 2　→　x & 1
x % 4　→　x & 3
x % 8　→　x & 7
x % 16　→　x & 15

と、書き直す事ができるのです。
イベントハンドラのスレッドセーフ性

普通、イベントハンドラを叩き起こす時は

```csharp
public event EventHandler SomeEvent;

public void Raise(EventArgs e)
{
    if (SomeEvent != null)
        SomeEvent(this, e);
}
```

みたいにnullチェックをしてから投げるんですが、マルチスレッドなプログラムだと
nullチェックした後に最後のイベントハンドラが購読解除されていざInvokeするときにはnullになってることがあるので、厳密には

```csharp
public event EventHandler SomeEvent;

public void Raise(EventArgs e)
{
    var sev = SomeEvent;
    if (sev != null)
        sev(this, e);
}
```

とする必要があります。

ちなみにイベントハンドラは

```csharp
public event EventHandler SomeEvent = (o, e) => {};
```

と定義しておくと**クラス内でnullを代入しない限り**nullチェックしなくて済むようになったり。
phpからwgetでPOST

とてもニッチなので必要になる人がいるかわからないネタです。
サーバの都合で、外部サーバとの連携がwgetでしかできないという事がありました。
誰かの役に立てばいいけど。。

```php
<?php
	//POSTされたデータと、$_FILES['filedata']のデータ（jpgを想定）を
	//wgetで他のサーバにPOSTするサンプル
	//※fileの細かいチェックとか、判別とかは省いています。

	$post_target = "https://example.com/hoge.api"

	$postData = "";
	$postFile = "";
	$boundary = "-----=".md5(uniqid(rand()));

	//text data
	foreach( $_POST as $key => $value ){
		$postData .= "--{$boundary}\r\n";
		$postData .= "Content-Disposition: form-data; name='" . escapeshellcmd($key) . "'\r\n\r\n";
		$postData .= escapeshellcmd($value) . "\r\n";
	}

	//image data
	if($_FILES['filedata'] && $_FILES['filedata']['error'] === 0){
		$postData .= "--{$boundary}\r\n";
		$postData .= "Content-Disposition: form-data; name='filedata'; filename='hoge.jpg'\r\n";
		$postData .= "Content-Type: image/jpeg\r\n\r\n";
		$postData .= file_get_contents($_FILES['filedata']['tmp_name'])."\r\n";
	}

	if($postData != ""){
		$postData = $postData . '--' . $boundary . '--';

		//POSTでバイナリを送る場合は、multipart/form-data形式のファイルを作って
		//--post-fileオプションを使わないと送信出来ないみたい。
		$postFile = "tmp/".md5(uniqid(rand())).".data";
		$fp = fopen($postFile, "w");
		fwrite( $fp, $postData, strlen($postData));
		fclose($fp);

		$postData = '--header="Content-Type: multipart/form-data; boundary=' . $boundary . '" --post-file="' . $postFile . '" ';
	}
	

	//sslだった場合、--no-check-certificateオプションをつけないとエラーうまく送信できない。
	//※セキュリティー的に、この処置は暫定的であるべき。
	$https = "";
	if(strpos($post_target, "https://") !== false) $https = "--no-check-certificate ";


	//返りがxmlを想定。一度ファイルに保存する場合は"-O hote.xml"などにする。
	//passthru以外にもexecやsystemが使えるが、
	//返りがバイナリの場合、passthruでないと復元が面倒。
	//ただ、passthruは即出力してしまうので、事前にContent-typeを適宜設定しておかないとうまく動かない。
	//ob_startなどでバッファリングしたデータをチェックすればうまく処理できるかも。
	header('Content-type: text/xml; charset="UTF-8"');
	passthru("wget -O - " . $https . $postData . escapeshellcmd($post_target));

	//ゴミ掃除
	if($postFile && file_exists($postFile)) unlink($postFile);

```
リクエストデータをセッションに登録する

利用する場合は事前にリクエストデータの中身がチェックされていることが前提ですが。リクエストデータ（POSTまたはGET）と同一キーのセッションデータが存在しない場合は、登録します。

```
function setSession() {

    session_start();

    if (count($_REQUEST) > 0) {
        for (reset($_REQUEST); $key = key($_REQUEST); next($_REQUEST)) {
            if ((!empty($_POST[$key]) || !empty($_GET[$key])) && empty($_SESSION[$key])) {
                $_SESSION[$key] = $_REQUEST[$key];
            }
        }
    }
}
```
iOSでCocos3dでNewtonで3D物理演算

[NewtonGameDynamics](http://newtondynamics.com/forum/newton.php)ってあんまり日本では使ってる人を見ませんね。
でも、僕は好きです。

#Newtonをビルド

おもむろにNewtonの最新版をチェックアウト。

core_Library200/projects/mac/OS10_xcode3.2.5/newton.xcodeproj
を開く。

ターゲットの設定から、BaseSDKをiOSに設定。しかし、このままではビルドが通らない。

なぜかプロジェクトに追加されていないソースファイルがあったので、
core_Library200/source/physics/dgMeshEffect2.cpp
core_Library200/source/physics/dgMeshEffect3.cpp
core_Library200/source/physics/dgMeshEffectSolidTree.cpp
あたりを追加。

さらに、core_Library200/source/newton/Newton.hの中からNewtonSceneCollisionCreateProxy()が宣言されている行を探し、これをコメントアウトする。

自分の環境では、LLVM GCC4.2でビルドするとうまく動かなかった。LLVM 3.1でビルドした。

XcodeのSchemeを編集し、iPhone/iPad実機用と、iOS Simulator用に別々にビルドする。
終わったら、ターミナルでビルドディレクトリを開き、armv7とi386のユニバーサルバイナリを作成する。

```sh
lipo -create -output libnewton.a release-iphoneos/libnewton.a release-iossimulator/libnewton.a
```

#Cocos3Dで使う

先ほどビルドしたバイナリを、Cocos3Dプロジェクトに追加する。
core_Library200/source/newton にパスを通す。

core_Library200/projects/mac/iPhoneTranslator/iNewton.h に、Objective-CのNewtonラッパが置いてある。
だがこいつは使えない子。
大人しくNewton.hをインクルードして、通常のCのライブラリとして呼ぶことにする。

CC3Worldを継承したクラスのメンバに、NewtonWorld* newtonを追加して、こんな感じの関数を書く。

```objc:MyWorld.m
@implementation MyWorld

- (void)initializeWorld {
	newton = NewtonCreate();
	NewtonSetSolverModel(newton, 1);
}

- (void)dealloc {
	NewtonDestroyAllBodies(newton);
	NewtonDestroy(newton);
	[super dealloc];
}

- (void)updateBeforeTransform:(CC3NodeUpdatingVisitor*)visitor {
	NewtonUpdate(newton, visitor.deltaTime);
}

@end
```

CC3Nodeを継承したクラスのメンバに、NewtonBody* bodyを追加して、こんな感じの関数を書く。

```objc:MyNode.m
static void NewtonGravityCallback(const NewtonBody* body, float timestep, int thredindex) {
	const float GRAVITY = -9.8f;
	float Ixx, Iyy, Izz, mass;
	
	NewtonBodyGetMassMatrix(body, &mass, &Ixx, &Iyy, &Izz);
	float vector[] = {
		0.0f, GRAVITY * mass, 0.0f
	};
	NewtonBodySetForce(body, vector);
}

static void NewtonTransformCallback(const NewtonBody* body, const float* const matrix, int thredindex) {
	MyNode* node = (MyNode*)NewtonBodyGetUserData(body);
	float matrix[16];
	NewtonBodyGetMatrix(body, matrix);
	float quaternion[4];
	NewtonBodyGetRotation(body, quaternion);

	node.location = CC3VectorMake(matrix[12], matrix[13], matrix[14]);
	node.quaternion = CC3Vector4Make(quaternion[3], quaternion[0], quaternion[1], quaternion[2]);
	// ほんとは行列を直接代入したかったけど、やりかたがよくわからんかった
}

@implementation MyNode

- (void)setupPhysics:(NewtonWorld*)world {
	NewtonCollision* col = NewtonCreateBox(world, 1.0f, 1.0f, 1.0f, 0, NULL);
	body = NewtonCreateBody(world, col, self.transformMatrix.glMatrix);
	NewtonReleaseCollision(world, col);
	
	NewtonBodySetUserData(body, self);
	NewtonBodySetMassMatrix(body, 1.0f, 1.0f, 1.0f, 1.0f);
	NewtonBodySetForceAndTorqueCallback(body, &NewtonGravityCallback);
	NewtonBodySetTransformCallback(body, &NewtonTransformCallback);
}

@end
```

できたー！

#まとめ

NewtonのMac/iOS対応は適当なので、自分でがんばろう！

#追記

Quaternionを使う場合は、どこかで回転方向を逆にしないとうまく動かないかも。
Excel関数で、シート名をセルに表示する方法

Excel関数で、シート名をセルに表示する方法。

```
=RIGHT(
CELL("filename",A1),
LEN(CELL("filename",A1))-FIND("]",CELL("filename",A1)))
```

改行入りなので、セルをダブルクリックしてから貼り付けないと、３行にまたがって貼り付いてしまいます。
tkinterを使ったアプリケーションをcx_freezeで実行ファイルにする

cx_freezeではまったのでメモ。環境はwindow7(64bit)、pythonはPython 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32です。

### setup.py
setup.py のサンプル。

```python:setup.py
import sys

from cx_Freeze import setup, Executable

base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(
        name = "foo",
        version = "0.1",
        description = "foo",
        executables = [Executable("foo.py", base = base)])
```

コマンドラインから、

> python setup.py build 

でexeが作成できます。

### Tclのライブラリが見つからないエラーが出た場合の対処方法。

> _tkinter.TclError: Can't find a usable init.tcl in the following directories: 
>    C:/home/workspace/tawami/software/lib/tcl8.5 C:/lib/tcl8.5 C:/lib/tcl8.5 C:/library C:/library C:/tcl8.5.10/library C:/tcl8.5.10/library

環境変数 TCL_LIBRARY をC:\Python27\tcl\tcl8.5、TK_LIBRARY を C:\Python27\tcl\tk8.5 等、自分の環境に合わせたパスに設定する。

### バージョンコンフリクトのエラーが出たときの対象方法
> version conflict for package "Tcl": have 8.5.10, need exactly 8.5.2 

C:\Python27\tcl\tcl8.5\init.tclとc:/lib/tk8.5/tk.tclのpackage require -exact Tcl 8.5.2をコメントアウトする。
wxWidgets 2.9.3 を C++11 としてコンパイルする (Mac OS X 10.7 Lion)

wxWidgets を静的リンクしたいけども、アプリケーション側では C++11 (libc++) を使いたくて、そうすると wxWidgets もそれにうまく対応させてコンパイルしないとダメだよね、という話。予想外に苦労したのでここに顛末をメモっておきます。 clang のバージョンは 3.0 です。

結論から言うと、 configure する際に以下の指定で出来た:

```bash
./configure CXX="clang++ -std=c++0x -stdlib=libc++ -DwxNO__T -DHAVE_TYPE_TRAITS -Dfinite=isfinite" \
--enable-unicode --enable-debug --disable-shared --disable-webview --with-opengl --with-macosx-sdk=/Developer/SDKs/MacOSX10.7.sdk --with-macosx-version-min=10.7 --with-cocoa
```

以下解説:

* `CXX="clang++ -std=c++0x -stdlib=libc++`: コンパイラと言語モード、標準ライブラリの指定。 CXXFLAGS とかにオプションを指定しなかったのは、 CXXFLAGS を一部無視してビルドする箇所があったため。あと LDFLAGS に `-stdlib=libc++` を指定してしまうと、 C コンパイラを使った時にもそれが使われてしまい、 configure が失敗する。
* `-DwxNO__T`: wxWidgets の `_T` が C++ 標準ライブラリ中の `_T` とコンフリクトしてしまうので、 wxWidgets 側で `_T` を定義しないようにする。
* `-DHAVE_TYPE_TRAITS`: C++11 の type_traits ライブラリを使わせるため。これはこっちで指定しなくても定義されていてよいものだと思うのだが。 (やっぱりこの指定要らないかもしれない)
* `-Dfinite=isfinite`: clang は C++11 モードでないときは finite 関数、 C++11 モードの時は isfinite 関数を使わなければいけないが、 wxWidgets がそれに対応していないので、超その場しのぎで置き換えた。
* `--disable-webview`: webview 周りはコンパイルできません。 Objective-C の id 型が `struct objc_object *` 型であること前提に組まれているコードがあるため。直す気もなかったし webview は今回使わなさそうだったのでスキップ。
* `--with-macosx-sdk=/Developer/SDKs/MacOSX10.7.sdk --with-macosx-version-min=10.7`: libc++ があるのは Lion (と iOS5) からだけです。
* `--with-cocoa`: Cocoa 使おう。
json_encode関数の引数にSImpleXMLElementを渡せる


```
<?php

$xml_string = '
<Employees>
  <Employee Gender="Male" Age="25">
    <FirstName>Keisuke</FirstName>
    <LastName>Oyama</LastName>
    <ID>123</ID>
  </Employee>
  <Employee Gender="Male" Age="30">
    <FirstName>Ichiro</FirstName>
    <LastName>Suzuki</LastName>
    <ID>456</ID>
  </Employee>
  <Employee Gender="Female" Age="40">
    <FirstName>Hanako</FirstName>
    <LastName>Yamada</LastName>
    <ID>789</ID>
  </Employee>
</Employees>
';
var_dump(json_decode(json_encode(simplexml_load_string($xml_string)), true));
/*
array(1) {
  ["Employee"]=>
  array(3) {
    [0]=>
    array(4) {
      ["@attributes"]=>
      array(2) {
        ["Gender"]=>
        string(4) "Male"
        ["Age"]=>
        string(2) "25"
      }
      ["FirstName"]=>
      string(7) "Keisuke"
      ["LastName"]=>
      string(5) "Oyama"
      ["ID"]=>
      string(3) "123"
    }
    [1]=>
    array(4) {
      ["@attributes"]=>
      array(2) {
        ["Gender"]=>
        string(4) "Male"
        ["Age"]=>
        string(2) "30"
      }
      ["FirstName"]=>
      string(6) "Ichiro"
      ["LastName"]=>
      string(6) "Suzuki"
      ["ID"]=>
      string(3) "456"
    }
    [2]=>
    array(4) {
      ["@attributes"]=>
      array(2) {
        ["Gender"]=>
        string(6) "Female"
        ["Age"]=>
        string(2) "40"
      }
      ["FirstName"]=>
      string(6) "Hanako"
      ["LastName"]=>
      string(6) "Yamada"
      ["ID"]=>
      string(3) "789"
    }
  }
}
*/
```
PHP5.4からは配列のコールバックも直接呼べるようになって便利

```php
<?php

class Foo
{
	public static function bar($arg)
	{
		var_dump($arg);
	}
}

$callback = array('Foo', 'bar');
$callback('test'); // 5.3 以下では call_user_func($callback, 'test'); としないといけない
```
【PHPUnitに詳しい人教えて!】 コンストラクタのテスト方法

PDOを継承した自前のPDOクラスのコンストラクタのテストってどうやったらいいんでしょうか？
やりたいのはPHPUnitのモックを使って ```_getDefaultAttributes()``` が1回呼ばれているかをテストすることです。

```php:PDOTest.php
<?php

namespace Suin;

class PDO extends \PDO
{
	/**
	 * Return new PDO object.
	 * @param string $dsn
	 * @param string $username
	 * @param string $password
	 * @param array $options
	 */
	public function __construct($dsn, $username, $password, array $options = array())
	{
		$options = array_merge($this->_getDefaultAttributes(), $options);
		parent::__construct($dsn, $username, $password, $options);
	}

	/**
	 * Return default attributes.
	 * @return array
	 */
	protected function _getDefaultAttributes()
	{
		return array(
			static::ATTR_STATEMENT_CLASS    => array(static::STATEMENT_NORMAL_CLASS),
			static::ATTR_ORACLE_NULLS       => static::NULL_NATURAL, // NULL is available
			static::ATTR_DEFAULT_FETCH_MODE => static::FETCH_ASSOC,
			static::ATTR_ERRMODE            => static::ERRMODE_EXCEPTION,
			static::ATTR_AUTOCOMMIT         => true,
		);
	}
}

class PDOTest extends \PHPUnit_Framework_TestCase
{
	public function test__construct()
	{
		$pdo = $this
			->getMockBuilder('\Suin\PDO')
			->setConstructorArgs(array('mysql:host=127.0.0.1;dbname=testdb;charset=utf8;', 'root', 'root'))
			->setMethods(array('_getDefaultAttributes'))
			->getMock();
		$pdo
			->expects($this->once())
			->method('_getDefaultAttributes')
			->will($this->returnValue(array()));
	}
}
```

getMock() した時点ですでにコンストラクタが呼ばれているので、うまくいきません。

```text:コマンドライン
$ phpunit PDOTest.php 
PHPUnit 3.6.10 by Sebastian Bergmann.

E

Time: 0 seconds, Memory: 3.25Mb

There was 1 error:

1) Suin\PDOTest::test__construct
array_merge(): Argument #1 is not an array

/Users/suin/Desktop/PDOTest.php:16
/Users/suin/Desktop/PDOTest.php:44
/Users/suin/.phpenv/versions/5.4.0pear/bin/phpunit:46

FAILURES!
Tests: 1, Assertions: 0, Errors: 1.
```

ためしに、もともとのコンストラクタをOFFってみましたが、

```php:PDOTest.php
<?php
class PDOTest extends \PHPUnit_Framework_TestCase
{
	public function test__construct()
	{
		$pdo = $this
			->getMockBuilder('\Suin\PDO')
			->setMethods(array('_getDefaultAttributes'))
			->disableOriginalConstructor()
			->getMock();
		$pdo
			->expects($this->once())
			->method('_getDefaultAttributes')
			->will($this->returnValue(array()));

		$pdo->__construct('mysql:host=127.0.0.1;dbname=testdb;charset=utf8;', 'root', 'root');
	}
}

```

PDOではうまいように行かないようです…。

```text:コマンドライン
$ phpunit PDOTest.php 
PHPUnit 3.6.10 by Sebastian Bergmann.

E

Time: 0 seconds, Memory: 3.00Mb

There was 1 error:

1) Suin\PDOTest::test__construct
PDOException: You cannot serialize or unserialize PDO instances

/Users/suin/Desktop/PDOTest.php:44
/Users/suin/.phpenv/versions/5.4.0pear/bin/phpunit:46

FAILURES!
Tests: 1, Assertions: 0, Errors: 1.
```
C#って普通に#if true とか #define とか使えるんだね。

* [C# プリプロセッサ ディレクティブ (C#)](http://msdn.microsoft.com/ja-jp/library/ed8yd1ha%28v=vs.80%29.aspx)
  * [#if (C#)](http://msdn.microsoft.com/ja-jp/library/4y6tbswk%28v=vs.80%29.aspx) 

何となく近代言語ってマクロを嫌っている印象があって、すっかり無いものだと思い込んでおりました。
コードブロックをまとめてコメントアウトする時とかやっぱり便利だよね。
`#if 0`じゃなくて`#if true`とか`#if false`とかしないといけないのに注意。

```csharp:ifdef.rb
#if false
// 実行されない
#else
// 実行される
#endif
```
bundle execを使わずにすむ方法

rbenvの場合は[こちら](http://qiita.com/items/9000280b3c3a0e74a618)

## 前置き
- プロジェクトで使うライブラリはできるだけbundlerで管理したい。
- でも、いちいち`bundle exec rails s`とかやるのめんどい。
- `alias be="bundle exec"`として`be rails s`ってやるのもめんどくさくなってきた。
- なんかいい方法ないの？ってことで調べたら、すぐ見つかったのでご紹介。

## まとめ
1. rvmのフックスクリプトに実行権限を与える
2. `--binstubs`をつけて`bundle install`

## 具体例

```sh
$ cd
$ chmod +x .rvm/hooks/after_cd_bundler
$ cd workspaces/sampleapp
$ vi Gemfile
```

```ruby:Gemfile
source "http://rubygems.org"
gem "heroku"
```

```sh
$ bundle install --path vendor/bundle --binstubs
$ ls
Gemfile Gemfile.lock bin vendor
$ cd
$ cd workspaces/sampleapp
$ heroku --version
heroku-gem/2.20.0
```
## 解説
- `.rvm/hooks/after_cd_bundle`は`.bundle`ディレクトリが存在するプロジェクトに`cd`で移動したとき実行されるスクリプトで、`--binstubs`オプションで生成された`bin`ディレクトリにパスを渡す。
- `--binstubs`オプションは`bundle install`でインストールされたライブラリの実行スクリプトを`bin`ディレクトリのなかに生成する。

## 参考
- http://beginrescueend.com/integration/bundler/
VCRで外部APIとのやりとりを記録する

Railsなどでtestを書く場合、外部APIとのやりとりのあるテストは書きにくい。スピード的にも毎回外部APIにアクセスさせることは避けたい。
VCRを使うとHTTPのリクエストとレスポンスをYAMLファイルに保存してくれ、次回のテスト時にはそのリスクエスト結果が再現される

 ```ruby:Gemfile
gem 'vcr'
gem 'webmock'
```

記録するYAMLが吐かれるディレクトリをtest/vcr_cassettesとすると下記のようにtest_helperで設定する

```ruby:test/test_helper.rb
VCR.configure do |c|
   c.cassette_library_dir = 'test/vcr_cassettes'
   c.allow_http_connections_when_no_cassette = true  #VCRブロック外のHTTP通信は許可する
   c.hook_into :webmock # or :fakeweb
end
```

testファイルにて外部アクセスが走る処理のところをVCR.use_cassetteブロックで囲む。
例えば検索APIにアクセスするメソッドがあったとすると下記のようになる

```ruby:test/unit/search_test.rb
test "search query" do 
  VCR.use_cassette('search_query',:record => :new_episodes) do
    # このブロックで発生するHTTPリスエスト/レスポンスが記録され、次回以降は再生される
    @s = Search.query("foobar")
  end
 assert_equal "foorbar",@s.keyword
end
````
初回実行時に test/vcr_cassettes/search_query.yml が生成され、次回以降はその内容が再現される。
外部APIの結果をキープしておいて、それをもとにメソッドを追加していくような時に有用である。
RailsをUnicornで起動するときのunicornとunicorn_railsの違い

他にもいろいろあるけど。

````sh
$ bundle exec unicorn -E production -c config/unicorn.rb -D
ENV['RAILS_ENV']:

$ bundle exec unicorn_rails -E production -c config/unicorn.rb -D
ENV['RAILS_ENV']: production
````
ニコニコ生放送のコメントを取得する

コメビュを自分で作りたいときなんかに用います

```python:comment.py
#!/usr/bin/python
#-*- coding:utf8 -*-
import os
import re
import yaml
import socket
import cookielib
from mechanize import Browser
from BeautifulSoup import BeautifulSoup

yml = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'config.yaml')
CONFIG = yaml.load(open(yml))

br = Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
br.open('https://secure.nicovideo.jp/secure/login_form')

br.select_form(nr=0)
br['mail'] = CONFIG['mail']
br['password'] = CONFIG['password']
br.submit()

lv = '' # set lv id e.g. lv00000000
br.open('http://watch.live.nicovideo.jp/api/getplayerstatus?v=%s' % lv) 
soup = BeautifulSoup(br.response().read())

thread = int(soup.find('thread').renderContents())
addr = soup.find('addr').renderContents()
port = int(soup.find('port').renderContents())

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((addr, port))
sock.send('<thread thread="%d" version="20061206" res_from="-1"/>¥0' % thread)

data = sock.recv(2048)

while True:
    data = sock.recv(2048)[:-1]
    d = BeautifulSoup(data)
    chat = d.find('chat')
    num = dict(chat.attrs)['no']
    comment = chat.renderContents()
    if not 'mail' in dict(chat.attrs): print num, comment
    else:
        if re.compile('nottalk|hidden').search(dict(chat.attrs)['mail']): continue
        else: print num, comment
    if comment == u"/disconnect": break

```
PHPの変数初期化の癖

やっても大丈夫なんだっけ？とよく混乱するので。。以降、5.3.10、error_reporting(-1)の状態（一番厳しくエラーチェックする）で実行した場合です。バージョン違いで挙動が違うとかあればコメントいただければ幸いです。

## いきなり添え字に代入
してもエラーは発生しない。error_reportingを一番厳しくしてても平気である。勝手に連想配列が生成される。

```php
<?php
$a['foo'] = 'hogehoge';

var_export($a);
//array(
//  'foo' => 'hogehoge'
//)
```

これはnull、false、空文字で初期化していたり、単に宣言しただけでも同じ。

```php:これもエラーにならない
<?php
$a;
$a['foo'] = 'hogehoge';

$b=null;
$b['foo'] = 'hogehoge';
```

0や何らかの文字列で初期化するとエラーが発生するようになるので注意！

## いきなり多重に添え字に代入
さっきの応用。多次元配列風にいきなり代入してもエラーは起きない。必要なだけの配列が生成される。そういえばJavaScriptはこれができないのだった。

```php
<?php
$a[1][2][3] = 'hogehoge';
var_export($a);
/*
array(
  1 => array(
    2 => array(
      3 => 'hogehoge'
    )
  )
)
*/
```

## しかしオブジェクトはStrictError
配列と違い、アロー演算子はちゃんとオブジェクトとして初期化されたものでないとエラーになる。ただしレベルはStrictなので一番低い。

```php:Strictエラーが発生するけれど$aはstdClassとして生成される。
<?php
$a->hoge = 'fuga';
```

## isset()やempty()はどんな変数を突っ込んでもエラーにならない
文法上正しいものであれば、宣言されてないどころか何がくっついていてもOK。これもJavaScriptでできないよね。

```php:エラーにならない
<?php
isset($a->b->c->d[123][321]);
empty($a->b->c->d[123][321]);
```
is_ssl() : HTTPSプロトコルかどうかを返す

なんか大掛かりになったけど、こんなんでいいんじゃないかな…？
ツッコミほしい…。

```php
<?php
/**
 * Determine if the protocol is HTTPS.
 * @return bool
 */
public function is_ssl()
{
	if ( isset($_SERVER['HTTPS']) === true ) // Apache
	{
		return ( $_SERVER['HTTPS'] === 'on' or $_SERVER['HTTPS'] === '1' );
	}
	elseif ( isset($_SERVER['SSL']) === true ) // IIS
	{
		return ( $_SERVER['SSL'] === 'on' );
	}
	elseif ( isset($_SERVER['HTTP_X_FORWARDED_PROTO']) === true ) // Reverse proxy
	{
		return ( strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https' );
	}
	elseif ( isset($_SERVER['HTTP_X_FORWARDED_PORT']) === true ) // Reverse proxy
	{
		return ( $_SERVER['HTTP_X_FORWARDED_PORT'] === '443' );
	}
	elseif ( isset($_SERVER['SERVER_PORT']) === true )
	{
		return ( $_SERVER['SERVER_PORT'] === '443' );
	}

	return false;
}
```
Qiita Markdown で Emacs Lisp のシンタックスハイライト

Scheme としてシンタックスハイライトしてもらう。

つまり

    ```scm
    (require 'cl)
    (message "foo")
    ```

って書くと

```scm
(require 'cl)
(message "foo")
```

`scm` じゃなくて `scheme` でもいける。

参考: [Pygments — Python syntax highlighter](http://pygments.org/docs/lexers/)
traitを使ってObserverパターンを実装してみる

```php:Observable.php
<?php
trait Observable
{
	protected $observers = [];

	/**
	 * Adds an observer to this object.
	 * @param callable $observer
	 * @return Observable
	 */
	public function addObserver(callable $observer)
	{
		$this->observers[] = $observer;
		return $this;
	}

	/**
	 * If this object has changed, then notify all of the observers.
	 */
	protected function _notifyObservers()
	{
		foreach ( $this->observers as $observer )
		{
			call_user_func($observer, $this);
		}
	}
}
```

ためしに、エラー発生時に通知する仕組みをObserverでやるとこんな感じ。
Observerとしてロガーを渡すと幸せ。

```php:ErrorHandler.php
<?php
class ErrorHandler
{
	use Observable;

	/**
	 * Register error handler.
	 * @return ErrorHandler
	 */
	public function register()
	{
		set_error_handler([$this, 'handleError'], E_ALL);
		return $this;
	}

	/**
	 * Handle an error.
	 * @param int $severity
	 * @param string $message
	 * @param string $file
	 * @param int $line
	 * @return void
	 */
	public function handleError($severity, $message, $file, $line)
	{
		if ( ( $severity & error_reporting() ) != $severity )
		{
			return;
		}

		$this->_notifyObservers($severity, $message, $file, $line);
	}

	/**
	 * If this object has changed, then notify all of the observers.
	 * @param int $severity
	 * @param string $message
	 * @param string $file
	 * @param int $line
	 * @return Observable
	 */
	protected function _notifyObservers($severity, $message, $file, $line)
	{
		foreach ( $this->observers as $observer )
		{
			call_user_func($observer, $this);
		}
	}
```

```php
<?php

$logger = function($severity, $message, $file, $line){
	echo sprintf("%sの%u行目で、「%s」っていうエラーがレベル%uで発生したみたいだよ！", $file, $line, $message, $severity), PHP_EOL;
};

$errorHandler = new ErrorHandler();
$errorHandler->addObserver($logger)->register();
```
cocoa emacs の透明度を変更する elisp

M-x set-alpha で mini buffer に透明度を入力すると(80とか90とか)変更できるよ。

```el:emacs.el
(defun set-alpha (alpha-num)
  "set frame parameter 'alpha"
  (interactive "nAlpha: ")
  (set-frame-parameter nil 'alpha (cons alpha-num '(90))))
```
SplFileObjectでオブジェクト指向らしいファイル操作をしてみる


```file_get_contents()``` すごく便利ですが、容量が大きいファイルを扱うときはメモリ消費が心配ですよね。
かと言って ```fopen()``` で古めかしいコードを書くのはイヤ！そんなときこそ、```SplFileObject``` クラスの出番です！

## ファイルの中身は ```foreach()``` で回すだけで取得できる

```php
<?php

$splFileObject = new SplFileObject(__FILE__);

echo 'File name:', PHP_EOL;
echo $splFileObject->getPathname(), PHP_EOL;

echo 'File contents:', PHP_EOL;

foreach ( $splFileObject as $line )
{
	echo $line;
}
```

```text:実行結果
$ php SplFileObject.php 
File name:
/Users/suin/Desktop/SplFileObject.php
File contents:
<?php

$splFileObject = new SplFileObject(__FILE__);

echo 'File name:', PHP_EOL;
echo $splFileObject->getPathname(), PHP_EOL;

echo 'File contents:', PHP_EOL;

foreach ( $splFileObject as $line )
{
	echo $line;
}
```

## もちろんCSVだって ```foreach()``` でできます！

```php
<?php

file_put_contents('foo.csv', "1,2,3\n4,5,6\n7,8,9\n");

$splFileObject = new SplFileObject('foo.csv');

foreach ( $splFileObject as $line )
{
	echo $line;
}

// CSVモードに切り替える
$splFileObject->setFlags(SplFileObject::READ_CSV);

foreach ( $splFileObject as $line )
{
	var_dump($line);
}
```

```text:実行結果
* php SplFileObject.php 
1,2,3
4,5,6
7,8,9
array(3) {
  [0] =>
  string(1) "1"
  [1] =>
  string(1) "2"
  [2] =>
  string(1) "3"
}
array(3) {
  [0] =>
  string(1) "4"
  [1] =>
  string(1) "5"
  [2] =>
  string(1) "6"
}
array(3) {
  [0] =>
  string(1) "7"
  [1] =>
  string(1) "8"
  [2] =>
  string(1) "9"
}
array(1) {
  [0] =>
  NULL
}
```

## 関連

[変則的なCSVを処理する - Qiita](http://qiita.com/suin/items/d1595d87a6aa7ba6492d)
"ゆうべ合コンで会った女が家の前に居る"のイノ子はどうやって>>1の部屋番号を割り出したか

>ゆうべ合コンで会った女が家の前に居る
http://www.negisoku.com/archives/53716555.html

合コンで知り合った女性が>>1の郵便ポストに呪いのブレスレットをいれていた。
>>1や友人は部屋番号をその女性に伝えていないし、ポストに名前もない。
どうやったのか予想してみました。

####すべての郵便ポストにブレスレットを入れた

\>>1のポストかどうかを判別するプログラムよりも全てのポストにブレスレットを投稿するプログラムを書く方が簡単ですね:)
reifyについて

読んでたコードにreifyが出てきたけど、知らなかったので使い方などのメモ。reifyは特定の(クラスではなく)オブジェクトの挙動を変えるような関数。例えばこんな感じ。

```clojure
    (def m {"a" 1})
    (str m) ; "{\"a\" 1}"
    (str (let [x m]
           (reify
    	java.lang.Object
    	(toString [this] "hoge")))) ; "hoge"
```

自信が全くないけど、Rubyの特異メソッドとかが近い?
VWD2010 インテリセンス関連

インテリセンス出てきて欲しかったのに出てきてくれなくてなんかイライラした時のための対処メモ

```javascript:コードヒントでない
function Clazz()
{
	this.value = 'sample';
}

var tdElements = document.getElementsByTagName('td');

(function()
{
	var i = tdElements.length;
	var td;
	while(i--)
	{
		td = tdElements[i]; // td 要素を格納
		td.clazz = new Clazz(); // td 要素のプロパティになんかインスタンス追加したい
		td. // ←ここでドット打った時点でプロパティ候補に class が出てきてくれない
	}
})();
```


```javascript:一応コードヒント出る
function Clazz()
{
	this.value = 'sample';
}

var tdElements = document.getElementsByTagName('td');

(function()
{
	var i = tdElements.length;
	var td;
	while(i--)
	{
		td = tdElements[i] || {}; // td 要素を格納するけど、意味もなく tdElements[i] が無かった時は空のオブジェクト入れるよ、ってしておく
		td.clazz = new Clazz(); // td 要素のプロパティになんかインスタンス追加したい
		td. // ←こうすると とりあえず候補に class っては出てきてくれる
	}
})();
```
smapsの情報をいい感じに合計して出力する

httpdを調べたい場合。

```shell
for i in `pgrep httpd`; do echo "== $i =============="; for j in Rss Shared Private Swap; do printf "%-10s" $j;  grep $j /proc/$i/smaps | awk 'BEGIN{n=0}{n += $2}END{printf "%8s (kB)\n", n}'; done ; done
```

全部見たい場合。

```shell:smaps_add_each_processes.sh
for i in /proc/[0-9]*; do echo "==== $i ===="; for j in Rss Shared Private Swap; do printf "%-10s" $j;  grep $j $i/smaps | awk 'BEGIN{n=0}{n += $2}END{printf "%8s (kB)\n", n}'; done; done
```
syslogの出力をsyslogdのrestart毎にファイル分割する

rsyslogの場合はキーワードが違うのでそのままでは使えません。
messagesのファイル名はRHEL5までのファイル名に合わせてあります。

```shell:split_syslog_restart.sh
FILE="tmp"; for i in messages.4 messages.3 messages.2 messages.1 messages; do while read LINE; do if echo $LINE|grep -q restart; then FILE="`echo $LINE|awk '{ print $1$2$3 }'`.log"; fi; echo $LINE >> $FILE; done < $i; done
```
LVのtableをerrorにしたりlinearに戻したり

今の状態を確認する。

```shell
# dmsetup table
testvg-iscsi1: 0 409600 linear 8:5 2048
```

errorのテーブルを作る。サイズはさっきのに合わせる。

```shell
# cat iscsi1_err.table
0 409600 error
```

元のlinearのtableも作っておく。

```shell
# cat iscsi1.table
0 409600 linear 8:5 2048
```

tableをreloadしてからsuspend、resumeして新しいtableを有効にする。

```shell
# dmsetup reload /dev/mapper/testvg-iscsi1 iscsi1_err.table
# dmsetup suspend /dev/mapper/testvg-iscsi1
# dmsetup resume /dev/mapper/testvg-iscsi1
# dmsetup status /dev/mapper/testvg-iscsi1
0 409600 error
```

元のtableに戻す。

```shell
# dmsetup reload /dev/mapper/testvg-iscsi1 iscsi1.table
# dmsetup suspend /dev/mapper/testvg-iscsi1
# dmsetup resume /dev/mapper/testvg-iscsi1
# dmsetup status /dev/mapper/testvg-iscsi1
0 409600 linear
```
crashでsocketの中身見る

```bash:crash_sample_socket
crash> ps | grep sshd
   3475   3642   0  ffff810012598040  IN   0.6   90120   3380  sshd
   3642      1   0  ffff81001906f7e0  IN   0.2   62616   1212  sshd
   4254   3642   0  ffff81000e60d860  IN   0.6   90120   3376  sshd
crash> net -s 3475
PID: 3475   TASK: ffff810012598040  CPU: 0   COMMAND: "sshd"
FD      SOCKET            SOCK       FAMILY:TYPE SOURCE-PORT DESTINATION-PORT
 3 ffff81000f182800 ffff81000ecbb380 INET:STREAM  xxx.xxx.xxx.xxx-22 yyy.yyy.yyy.yyy-1523
 6 ffff81000ee41840 ffff81000ecbb980 INET:STREAM  127.0.0.1-6010 0.0.0.0-0
crash> struct socket ffff81000f182800
```
zsh で全 256 色を試しに表示みたい

```sh
for c in {000..255}; do echo -n "\e[38;5;${c}m $c" ; [ $(($c%16)) -eq 15 ] && echo;done;echo
```

コピペ実行で

![スクリーンショット](http://24.media.tumblr.com/tumblr_m0b6elL3C11qz64n4o1_500.png)

### 用途

これで以前投稿した "[ユーザ/ホスト毎に決まったプロンプトの色を自動割り当て](http://qiita.com/items/2746)" に使う色が増やせる

### ※ただし

* bash は無理
* `echotc Co` が `256` って帰ってくる環境に限る
PHP5.4.0のtraitのアクセスプライバシーは強制力ないみたい

```php
<?php

trait Foo
{
	public function publicMethod() {}
}

class Bar
{
	use Foo;

	protected function publicMethod() {}
}
```

継承だとエラーになるところだけど↓

```php
<?php

class Foo
{
	public function publicMethod() {}
}

class Bar extends Foo
{
	protected function publicMethod() {} // PHP Fatal error:  Access level to Bar::publicMethod() must be public (as in class Foo) in Trait.php on line 11
}
```
PHP5.4.0のtraitはfinalキーワードは無視されるっぽい。

```php
<?php

trait Foo
{
	final public static function staticMethod()
	{
		echo __METHOD__, PHP_EOL;
	}
}

class Bar
{
	use Foo;

	final public static function staticMethod()
	{
		echo __METHOD__, PHP_EOL;
	}
}

Bar::staticMethod();
```

```text:コマンド
$ php -v
PHP 5.4.0 (cli) (built: Mar  3 2012 16:55:36) 
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
    with Xdebug v2.2.0-dev, Copyright (c) 2002-2012, by Derick Rethans

$ php Trait.php 
Bar::staticMethod
```