OmniAICreator/Qiita-1.07M huggingface dataset:
Restart Required ダイアログ問題の最新の状況

昨日，結構古い対策情報を投稿しました ([こちら](http://qiita.com/items/98f7aff249ed2d883dde)) が，本日改めて Issue Tracker の該当する問題のコメントを見ていると比較的新しい投稿 (3 日前) があることに気付きました．

もしかしたら修正自体は出来たのかも？

https://jira.appcelerator.org/browse/TIMOB-9285?focusedCommentId=210304&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-210304

修正と思しき Pull Request．

https://github.com/appcelerator/titanium_mobile/pull/2651

ざっと読んだだけで詳しいことはさっぱりですが，どうも Android 自体のバグ ([Issue 2373 - android - Activity stack behaves incorrectly during the first run of an app when started from Eclipse - Android - An Open Handset Alliance Project - Google Project Hosting](http://code.google.com/p/android/issues/detail?id=2373)) が絡んでいるようで．

どうやって回避したんじゃろ…　英語ちゃんと読めば分かるって？ (´・ω・`)

修正早く反映されると良いなぁ (情弱)．
UILabelで改行された文字列を上手いこと表示する方法


``` objc:UILabelSample

@implementation UILabelSample

- (void)initializeUILabel {
    // 幅と場所だけ決めておく
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 0)];
    label.numberOfLines = 0;
    label.text = @"happy_ryo\nhappy_ryo\nhappy_ryo";
    // 高さを合わせる
    [label sizeToFit];
    [self.view addSubview:label];
}

@end


```
Mocha, chai, sinon で JavaScriptのテスト


## 準備
必要なnpmは以下

* mocha
* chai
* sinon (※ sinon-chai入れてもsinonは別に必要?)
* sinon-chai

```javascript:
var chai      = require('chai'),
    should    = chai.should(),
    sinon     = require('sinon'),
    sinonChai = require('sinon-chai');

chai.use(sinonChai);
```

## 非同期テスト
beforeやitの引数のfunctionはdoneが引数としてとれるので、テストを次に進めていいタイミングで呼び出す。doneを引数としてとらなければ、そのまま進む。

```javascript:asyncronize.js
it("should not raise an error", function(done) {
  fs.readFile("/path/to/text.text", function(err, data) {
    should.not.exist(err);
    done();
  });
})
```

## hooks

### before
テスト実行前に'一度だけ'走る

```javascript:
describe('test', function() {
  before(function(done) {
    console.log('before');
    done();
  });

  it('should be done successfull', function() {
    console.log('it1');
  });

  it('should be done successfull', function() {
    console.log('it2');
  });
});
```

```bash:
before
it1
it2
```

### beforeEach
テスト実行前に'毎it'走る

```javascript:
describe('test', function() {
  beforeEach(function(done) {
    console.log('before');
    done();
  });

  it('should be done successfull', function() {
    console.log('it1');
  });

  it('should be done successfull', function() {
    console.log('it2');
  });
});
```

```bash:
before
it1
before
it2
```

### after
テスト実行後に'一度だけ'はしる
before の対応

### afterEahc
テスト実行後に'毎it'はしる
beforeEach の対応 
## アサーション(chai)
should使う場合のアサーション一覧
http://chaijs.com/api/bdd/

少しだけピックアップ

### deep
Object同士を比べる場合はequalでは無くこちらを使う

```javascript:
var obj = {a: "b"};
obj.should.deep.equal({a: "b"});
```

## stub, mock
sinonを使ってstub(mock)する。

```javascript:
describe('Send data', function() {
  var spy, target;

  before(function() {
    spy = sinon.spy();
    target = new TestTargetModule();
    target._sendData = spy;
  });

  it("should sends data over private _sendData method", function() {
    target.send('data');
    spy.should.have.been.calledWith('data');
  });

  it("should not sends data over private _sendData method", function() {
    target.send('data', {direct: true});
    spy.should.not.have.been.calledWith('data');
  });
});
```
Restart Required ダイアログ対策 (Android Application with Titanium Studio)

参考サイトに従って

* タイトル: メッセージ
* メッセージ: アプリケーションの起動準備を行います
* ボタン: 続ける

と表示するために tiapp.xml に追加するものメモ．

```
<property name="ti.android.bug2373.title">\u30e1\u30c3\u30bb\u30fc\u30b8</property>
<property name="ti.android.bug2373.message">\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u8d77\u52d5\u6e96\u5099\u3092\u884c\u3044\u307e\u3059</property>
<property name="ti.android.bug2373.buttonText">\u7d9a\u3051\u308b</property>
<property name="ti.android.bug2373.backgroundColor">black</property>
```

## 参考

* [MountPosition Inc. &raquo; Titanium アプリ初回起動時のRestart Requiredダイアログ対処法](http://www.mountposition.co.jp/blog/?p=295)
* [Unicode 変換](http://www.kwonline.org/unicode_js.php)
プログラミング言語の拡張可能性について


プログラミング言語の拡張可能性は様々である。

## (1)すべてを拡張可能

拡張可能性の高い言語は、新しい制御構文や定義構文を追加できる。LISPやRuby、Perl6がこのカテゴリに入る。
この種のプログラミング言語は内部DSLを定義するのが得意だ。その結果、DSL文化が発達する。たとえばRubyではRakefileのように優れたDSLを使ったツールが数多く作られた。

以下はRakefileの例である。各種方言のあるMakefileよりも柔軟でmakeごとの互換性に悩まされることもなく、そしてmakeに慣れていれば読むのも難しくない。素晴らしいツールである。

```Ruby
file "prog" => ["a.o", "b.o"] do |t|
  sh "cc -o #{t.name} #{t.prerequisites.join(' ')}" 
end
```

欠点は、その柔軟性ゆえの可読性の低下である。言語組み込みの機能なのかそうでないのかが非常にわかりにくい。これにメタプログラミングが加わると非常にメンテナンス性の悪いプロダクトになってしまう。


## (2)セマンティクスを拡張可能

構文の拡張はできなくとも、セマンティクスの拡張、つまり言語要素のオーバーロードをサポートしている言語もある。PerlやC++がこれにあたる。オーバーロードは強力で、時には可読性を上げる。たとえば、BigIntの演算はメソッドで行うよりも四則演算子を適用したほうが可読性が高い。

欠点は1と同じく、乱用すると可読性が下がることである。これの典型は、 boost::xpressive が挙げられよう。文字列リテラルとして正規表現を書くよりも演算子を使ったほうがコンパイル時に構文チェックができるし、コンパイル時にいくらか処理を済ませておくことで実行時のコンパイル時間も短縮できる。たしかに素晴らしい。しかし、読むのは至難の業である。

http://www.kmonos.net/alang/boost/classes/xpressive.html

```C++
	using namespace boost::xpressive;
	// "static regex"
	// /A([1-9]*|[a-z]*)A/ とおなじ
	sregex r = 'A' >> (*range('1','9') | *range('a','z')) >> 'A';
```


## (3)言語要素は拡張不可能

構文の拡張もオーバーロードもなく、新しく定義できのは新しい関数・メソッドや構造体・クラスのみの言語もある。CやJavaがこれにあたる。この種の言語は誰が書いても同じにようになりやすい。その結果、ある程度のスキルがあれば可読性は保たれる。(1)や(2)が持っていたような、「スキルが高いゆえに可読性の低いコードになる」という欠点がない。

欠点はコード量(1)や(2)に比べて多くなること。


## 結論

実際には綺麗にこの三つに分けられるとは限らない。JavaScriptは(2)と(3)であるし、Cは基本的には(3)だがプリプロセッサを使ってかなり強力に拡張することもできる。

さて、#NextLanguage はどこを目指すべきか。これはプロジェクトごとに正解が異なる議論であると思う。故に、まだ結論は出さない。
Python2.7でTwitter APIのoauth_tokenとoauth_token_secretを取得するコードのサンプル

```
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# oauth2モジュールをインストールする必要がある。
import oauth2 as oauth
from urlparse import parse_qs
import sys

CONSUMER_KEY = 'YOUR-CONSUMER-KEY'        # CONSUMER_KEYを指定する。
CONSUMER_SECRET = 'YOUR-CONSUMER-SECRET'  # CONSUMER_SECRETを指定する。
REQUEST_TOKEN_URL = 'https://api.twitter.com/oauth/request_token'
AUTHORIZE_URL = 'https://api.twitter.com/oauth/authorize'
ACCESS_TOKEN_URL = 'https://api.twitter.com/oauth/access_token'

consumer = oauth.Consumer(key=CONSUMER_KEY, secret=CONSUMER_SECRET)
client = oauth.Client(consumer)
resp, content = client.request(REQUEST_TOKEN_URL, 'GET')
request_token = parse_qs(content)
authorize_url = "%s?oauth_token=%s" % (
        AUTHORIZE_URL,
        request_token['oauth_token'][0]
        )
message = 'Authorize this app at %s and enter the PIN#' % (authorize_url)
oauth_verifier = ''
while len(oauth_verifier) <= 0:
    oauth_verifier = raw_input(message)
else:
    token = oauth.Token(
            request_token['oauth_token'][0],
            request_token['oauth_token_secret'][0]
            )
    client = oauth.Client(consumer, token)
    resp, content = client.request(
            ACCESS_TOKEN_URL,
            "POST",
            body="oauth_verifier=%s" % oauth_verifier
            )
    access_token = parse_qs(content)
    if 'oauth_token' in access_token and 'oauth_token_secret' in access_token:
        print "oauth_token: %s\noauth_token_secret: %s" % (
                access_token['oauth_token'][0],
                access_token['oauth_token_secret'][0]
                )
    else:
        sys.stderr.write('PIN is invalid.\n')
```
BEGIN IMMEDIATE TRANSACTION

Honeycomb以降、SQLiteで使用できるTransactionの種類にImmediateが追加されました。
詳細：http://yuki312.blogspot.jp/2012/07/androidsqlitetransaction.html

```java:Immediateモードでトランザクションを開始
db.beginTransactionNonExclusive();
try {
    // do something.
    db.setTransactionSuccessful();
} finally {
    db.endTransaction();
}
```
GHCI で関数の型宣言をする


先日から [Learn You a Haskell for Great Good!](http://learnyouahaskell.com/) の書籍で Haskell を勉強し始めました。

まだよくわかりませんが、GHCI では `let` をつけないと関数を宣言できないなどいろいろ制約があるようです。[Types and Typeclasses](http://learnyouahaskell.com/types-and-typeclasses) で明示的な関数の型宣言が出てきましたが、GHCI にそのまま打つとエラーになってしまいます。

```haskell
addThree :: Int -> Int -> Int -> Int
addThree x y z = x + y + z
```

単に頭に `let` をつけてもダメ。セミコロンで一行にするとうまく行くようです。

```haskell
let addThree :: Int -> Int -> Int -> Int; addThree x y z = x + y + z
```

参考: [Haskell: Explicit type declarations in GHCI at Mark Needham](http://www.markhneedham.com/blog/2012/05/10/haskell-explicit-type-declarations-in-ghci/)
第二回 オフラインリアルタイムどう書く その2

その1のコードを書いてからさらに30分ほど考えてみた結果。
演算を積算していくところは畳み込み関数が得意とするところなわけですが。実はC++の標準ライブラリにも畳み込み関数があります。`<numeric>`で定義されている`accumulate`関数テンプレートです。で、第4引数に二項演算子を与えるわけですが、せっかくなので（というか外に関数を定義するのが面倒だったので）C++11のラムダ関数を引数に与えています。C++11解禁なら後半もラムダ関数にしてしまえ、というノリで`for_each`とラムダ関数を組み合わせてそろった段の削除をしています。

```C++:

#include <sstream>
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <numeric>

typedef std::vector<unsigned int> Field;

struct Data
{
    const char* input;
    const char* output;
};

const Data data[] =
{
    /* 0*/ { "ff-2f-23-f3-77-7f-3b", "1f-03-00-1c-0d-0f-06" },
    /* 1*/ { "01", "00" },
    /* 2*/ { "00", "00" },
    /* 3*/ { "7a-4e", "0c-02" },
    /* 4*/ { "56-b6", "08-14" },
    /* 5*/ { "12-12-12", "00-00-00" },
    /* 6*/ { "de-ff-7b", "0a-0f-05" },
    /* 7*/ { "95-be-d0", "05-1e-20" },
    /* 8*/ { "7c-b0-bb", "1c-20-2b" },
    /* 9*/ { "7a-b6-31-6a", "3a-56-11-2a" },
    /*10*/ { "32-0e-23-82", "18-06-11-40" },
    /*11*/ { "ff-7f-bf-df-ef", "0f-07-0b-0d-0e" },
    /*12*/ { "75-df-dc-6e-42", "35-5f-5c-2e-02" },
    /*13*/ { "62-51-ef-c7-f8", "22-11-6f-47-78" },
    /*14*/ { "0c-47-8e-dd-5d-17", "04-23-46-6d-2d-0b" },
    /*15*/ { "aa-58-5b-6d-9f-1f", "52-28-2b-35-4f-0f" },
    /*16*/ { "ff-55-d5-75-5d-57", "0f-00-08-04-02-01" },
    /*17*/ { "fe-fd-fb-f7-ef-df-bf", "7e-7d-7b-77-6f-5f-3f" },
    /*18*/ { "fd-fb-f7-ef-df-bf-7f", "7e-7d-7b-77-6f-5f-3f" },
    /*19*/ { "d9-15-b5-d7-1b-9f-de", "69-05-55-67-0b-4f-6e" },
    /*20*/ { "38-15-fd-50-10-96-ba", "18-05-7d-20-00-46-5a" },
    /*21*/ { "fe-fd-fb-f7-ef-df-bf-7f", "fe-fd-fb-f7-ef-df-bf-7f" },
           { 0, 0 }
};

std::istream& operator >> (std::istream& in, Field& field)
{
    in >> std::hex;
    unsigned int n;
    do
    {
        in >> n;
        field.push_back(n);
        char c;
        in >> c;
    } while(in.good());
    return in;
}

std::ostream& operator << (std::ostream& out, const Field& field)
{
    int fill = out.fill('0');
    out << std::hex;
    Field::const_iterator i = field.begin();
    out << std::setw(2) << *i++;
    for(; i != field.end(); ++i)
    {
        out << "-" << std::setw(2) << *i;
    }
    out << std::dec;
    out.fill(fill);
    return out;
}

int main(int, char* [])
{
    for(const Data* d = data; d->input != 0; ++d)
    {
        Field field;
        std::istringstream iss(d->input);
        iss >> field;

        Field::value_type v = std::accumulate(field.begin(), field.end(), 0xffu, [](unsigned int lhs, unsigned int rhs) { return lhs & rhs; });

        for(int i = 7; i >= 0; --i)
        {
            if(((v >> i) & 1) != 0)
            {
                std::for_each(field.begin(), field.end(), [i](unsigned int& f) { f = (f & (0xffu >> (8 - i))) | ((f >> 1) & (0xffu << i)); });
            }
        }

        std::ostringstream oss;
        oss << field;
        std::string result = oss.str();
        std::cout << result << " : " << ((result == d->output) ? "PASSED" : "FAILED") << std::endl;
    }

    return 0;
}
```
第二回 オフラインリアルタイムどう書く その1

今回もQiita上でだけでの参加。

問題：

* http://nabetani.sakura.ne.jp/hena/ord2/

時間を測ってみたところ、問題を読み始めてから結果が出るまでおよそ40分ぐらいでした。

```C++:

#include <sstream>
#include <iostream>
#include <iomanip>
#include <vector>

typedef std::vector<unsigned int> Field;

struct Data
{
    const char* input;
    const char* output;
};

const Data data[] =
{
    /* 0*/ { "ff-2f-23-f3-77-7f-3b", "1f-03-00-1c-0d-0f-06" },
    /* 1*/ { "01", "00" },
    /* 2*/ { "00", "00" },
    /* 3*/ { "7a-4e", "0c-02" },
    /* 4*/ { "56-b6", "08-14" },
    /* 5*/ { "12-12-12", "00-00-00" },
    /* 6*/ { "de-ff-7b", "0a-0f-05" },
    /* 7*/ { "95-be-d0", "05-1e-20" },
    /* 8*/ { "7c-b0-bb", "1c-20-2b" },
    /* 9*/ { "7a-b6-31-6a", "3a-56-11-2a" },
    /*10*/ { "32-0e-23-82", "18-06-11-40" },
    /*11*/ { "ff-7f-bf-df-ef", "0f-07-0b-0d-0e" },
    /*12*/ { "75-df-dc-6e-42", "35-5f-5c-2e-02" },
    /*13*/ { "62-51-ef-c7-f8", "22-11-6f-47-78" },
    /*14*/ { "0c-47-8e-dd-5d-17", "04-23-46-6d-2d-0b" },
    /*15*/ { "aa-58-5b-6d-9f-1f", "52-28-2b-35-4f-0f" },
    /*16*/ { "ff-55-d5-75-5d-57", "0f-00-08-04-02-01" },
    /*17*/ { "fe-fd-fb-f7-ef-df-bf", "7e-7d-7b-77-6f-5f-3f" },
    /*18*/ { "fd-fb-f7-ef-df-bf-7f", "7e-7d-7b-77-6f-5f-3f" },
    /*19*/ { "d9-15-b5-d7-1b-9f-de", "69-05-55-67-0b-4f-6e" },
    /*20*/ { "38-15-fd-50-10-96-ba", "18-05-7d-20-00-46-5a" },
    /*21*/ { "fe-fd-fb-f7-ef-df-bf-7f", "fe-fd-fb-f7-ef-df-bf-7f" },
           { 0, 0 }
};

std::istream& operator >> (std::istream& in, Field& field)
{
    in >> std::hex;
    unsigned int n;
    do
    {
        in >> n;
        field.push_back(n);
        char c;
        in >> c;
    } while(in.good());
    return in;
}

std::ostream& operator << (std::ostream& out, const Field& field)
{
    int fill = out.fill('0');
    out << std::hex;
    Field::const_iterator i = field.begin();
    out << std::setw(2) << *i++;
    for(; i != field.end(); ++i)
    {
        out << "-" << std::setw(2) << *i;
    }
    out << std::dec;
    out.fill(fill);
    return out;
}

int main(int, char* [])
{
    for(const Data* d = data; d->input != 0; ++d)
    {
        Field field;
        std::istringstream iss(d->input);
        iss >> field;

        Field::iterator i = field.begin();
        Field::value_type v = *i++;
        for(; i != field.end(); ++i)
        {
            v &= *i;
        }

        for(int i = 7; i >= 0; --i)
        {
            if(((v >> i) & 1) != 0)
            {
                for(Field::iterator f = field.begin(); f != field.end(); ++f)
                {
                    *f = (*f & (0xffu >> (8 - i))) | ((*f >> 1) & (0xffu << i));
                }
            }
        }

        std::ostringstream oss;
        oss << field;
        std::string result = oss.str();
        std::cout << result << " : " << ((result == d->output) ? "PASSED" : "FAILED") << std::endl;
    }

    return 0;
}
```
Rails+RSpec+SporkにSimpleCovを導入


[README](https://github.com/colszowka/simplecov)を読みながらやってみた。

spec/spec_helper.rb

```
Spork.prefork do
  unless ENV['DRB']
    require 'simplecov'
  end

  # other code ...
end

Spork.each_run do
  if ENV['DRB']
    require 'simplecov'
  end

  # other code ...
end
```

.simplecov

```
SimpleCov.start 'rails' do
  add_filter "/spec/"
end
```
iTerm2のトリガー設定でcoffeescriptのコンパイルエラーの内容と行数をgrowlで通知


##目次
1.coffeescriptのオートコンパイル
2.iTerm2の設定

##1.coffeescriptのオートコンパイル
```
#これで自動監視してコンパイルする
coffee -wc /path/to/*.coffee
```

##2.iTerm2の設定
Preferences->Advanced->Triggers->Edit下記のように設定

###Regular Exporession
```
In .*coffee,(.+) on line (\d+)
```###Action
Send Growl Alert
###Parameters
```
\2:\1
```
yaottiさんの下記の記事を参考にしました
http://qiita.com/items/3764572ea1e1972ba928
正規表現置換をする: C-M-%

正規表現で置換をするキーバインドは`C-M-%`で、これまた押しにくいので、「Emacsテクニックバイブル」を参考に、下記の通り短い別名を定義することにしました。

```common-lisp:~/.emacs.d/init.el
; M-x qrr for query-replace-regexp
(defalias 'qrr 'query-replace-regexp)
```
文字列変換: M-%


前々から文字列置換のキーバインド(`M-%`)が、使用頻度が高いわりには押しづらいと思ってました。

そこで、「Emacsテクニックバイブル」を参考に、`C-c r`に割り当てることにしました。

```common-lisp:~/.emacs.d/init.el
; C-c r aka M-%
(global-set-key (kbd "C-c r") 'query-replace)
```

だいぶ押しやすくなった。
jQueryでCSSの値を複数設定するときの記述

jQueryを使って、CSSを変更することがあるかと思います。
そのたびに、

```script.js
$("p").css("color","red");
$("p").css("font-size","16px");
$("p").css("font-weight","bold");
```

と同じような記述を続けてしまうのはちょっと嫌だなという人には、こちらの記述をオススメ。

```script.js(キャメルケース)
var p_props = {
	color:"red",
	fontSize:"16px",
	fontWeight:"bold"
}
$("p").css(p_props);
```

プロパティの記述をスタイルシートと同じような書き方(≠キャメルケース)にしたいときは、プロパティと値をダブルクォーテーションで括って記述します。


```script.js(スタイルシートと同じような書き方)
var p_props = {
	"color" : "red",
	"font-size" : "16px",
	"font-weight" : "bold"
}
$("p").css(p_props);
```

***


わざわざ変数に値を入れたくないというときはこんな記述。


```script.js
$("p").css({
	color:"red",
	font-size:"16px",
	font-weight:"bold"
});
```
Mac のターミナルで便利なショートカットキー


以前から、ターミナルでカーソルを先頭に持っていく方法ないのかなー、と思っていたのですが、先日教えてもらいました。

- Ctrl+A: カーソルを先頭に移動
- Ctrl+E: カーソルを末尾に移動
- Ctrl+U: カーソルより前を削除

これはとても便利。コマンドを打って sudo を忘れた！オプションを忘れた！というときに役立ちそうです。

参考: [Command Line Keyboard Shortcuts for Mac OS X](http://osxdaily.com/2006/12/19/command-line-keyboard-shortcuts-for-mac-os-x/)
MKMapView: Googleロゴをずらす

# 概要

MapView の左下の Google ロゴ（の一部）が「なにかしら」に覆い隠されてしまっていると、App Store 申請時に却下を食らってしまう。あまり良くはないが「Google ロゴをずらす」対策で却下されずに済む（こともある）。

# 実装

```objectivec
// Google ロゴの位置をずらす
- (void)setupGoogleLogo
{
	if (!self.mapView) return;
	
	NSArray *subviews = [self.mapView subviews];
	if (subviews && [subviews count] >= 2)
	{
		UIView *logoview = [[self.mapView subviews] objectAtIndex:1];
		if ([logoview isKindOfClass:[UIImageView class]] == YES &&
			logoview.frame.size.width == 69 && logoview.frame.size.height == 23)
		{
			// logoview.frame.origin をいじる. yを-方向に移動させる、とか
			return;
		}
	}
}
```
PHPで使うGoFパターン ひとり Advent Calendar - デコレーター


## デコレーターってなに?

要約するとタマネギです。
オニオンパターンとかで覚えておくと良いと思います。


## デコレーターの構造

* 玉葱の芯
* 玉葱の皮

```PHP
<?php

class Inner {
  public function __construct () {
  }
  public function getName () {
     return __CLASS__;
  }
}

class Outer extends Inner {
  protected $_Inner = null;
  public function __construct ( $obj ) {
    $this->_Inner = $obj;
  }

  public function getName () {
    $name = $this->_Inner->getName();
    return $name . ' in Outer';
  }
}

class OuterOfOuter extends Outer {
  protected $_Inner = null;
  public function __construct ( $obj ) {
    $this->_Inner = $obj;
  }
  public function getName () {
    $name = $this->_Inner->getName();
    return $name . ' in OuterOfOuter';
  }
}

class SuperOuterOfOuter extends OuterOfOuter {
  protected $_Inner = null;
  public function __construct ( $obj ) {
    $this->_Inner = $obj;
  }
  public function getName () {
    $name = $this->_Inner->getName();
    return $name . ' in SuperOuterOfOuter';
  }
}

$obj = new OuterOfOuter ( new Outer ( new Inner () ) );
print $obj->getName() . "\n";

$obj = new SuperOuterOfOuter ( new OuterOfOuter ( new Inner () ) );
print $obj->getName() . "\n";

```

## デコレータパターン

のように、集約と汎化の良いところどりで、実に柔軟にメソッドを拡張できるパターンですが、
やり過ぎると実にカオスになって手に負えなくなる諸刃の剣なパターンでもあります。
※ 例を実際的な例ではなくてサンプルコード的なサンプルコードにしたのも、それを伝え易くしたかったためです。

上手く使うと既存システムをユニットテストに組み込む時にも役に立つので、
ご利用は計画的に。
Mountain LionにアップグレードしたらGPGMail警告がうるさい


Mountain LionにアップグレードしてからMacのMailを開く度にGPGプラグインのエラーがでるようになった。
非常にうるさい。

```:Mailのエラーメッセージ
互換性のないプラグインの使用停止

以下のプラグインは使用停止されました：

	GPGMail

プラグインの製造元に、メール 6.0 およびメッセージ 6.0 と互換性のあるバージョンを確認してください。
```

Mountain Lionの対応方法などを探すのが面倒くさいので、削除して。（あんまり使わないし）

```Bash:GPGMail削除
$ sudo rm -rf /Library/Mail/Bundles/GPGMail.mailbundle

```

これですっきりした。
GameCenter


## 設定

### iTunes Storeでアプリを登録する

## 実装

### プレーヤー情報を取得する
* App ID作成
* Provisioning -> DistributionでProfileを作成する
  * 作成したらキーチェーンアクセスを起動してそこに鍵を登録させる


```:AppDeligate.m
#import <GameKit/GameKit.h>

    // GameCenterのプレイヤー情報を取得
    [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:^(NSError *error){}];
```

### 得点送信
```
GKScore *scoreReporter = [[[GKScore alloc] initWithCategory:category]
autorelease];
scoreReporter.value = score;
[scoreReporter reportScoreWithCompletionHandler:^(NSError *error) {
if (error != nil)
{
            // 報告エラーの処理
}
}];
```


## テストユーザTips
* ユーザは新規に作成しておいたほうが無難。どうも既存ユーザはだめっぽい

## リファレンス
* http://d.hatena.ne.jp/Kmusiclife/20110630/1309425193
* http://golog.plus.vc/iphone/2867/
sudo時に発生するdyldによる警告メッセージ

```sh
$ LD_LIBRARY_PATH="/foo" sudo cd
dyld: DYLD_ environment variables being ignored because main executable (/usr/bin/sudo) is setuid or setgid
Password:
```

本来表示されないべき警告が Mountain Lion にアップデート後発生するようになった．結論から言うと現状は解決不能なバグらしい．Apple Support Community にはスレッドがあり (c.f. https://discussions.apple.com/thread/4143805?start=0&tstart=0 )，一応バグとして報告されてはいる模様 (c.f. http://openradar.appspot.com/11894054 )．
JavaScript で mixin 的な何かを作る試み


既存のクラスに動的に直接メソッドを追加していくというよくある方法には（特殊な用途を除いて）実用性が無いので、このエントリでは、メソッドが追加された新しいクラスを生成するというアプローチについて考える。
追加するメソッドを集めたオブジェクトを、便宜的に trait と呼ぶことにする。

```example.js
exports.mixin = new function(){
    function mixin(klass, trait){
        var new_class = function(){};
        new_class.prototype = new function(){
            var f = function(){}
            f.prototype = klass.prototype;
            return extend(new f, trait);
        };
        return new_class;
    }
    function extend(dst, src) {
        for (var key in src) {
            if (src.hasOwnProperty(key))
                dst[key] = src[key];
        }
        return dst;
    }
    return function(klass){
        return [].slice.call(arguments, 1).reduce(mixin, klass);
    }
}
```

mixin(ClassName, TraitA, TraitB, …) という形で記述できる。

```example_test.js
var assert = require('assert');
var mixin = require('./example.js').mixin;
var TraitA = {
    getA: function(){ return "A" }
};
var TraitB = {
    getB: function(){ return "B" }
};
var ClassX = function(){}
ClassX.prototype = {
    getX: function(){ return "X" }
};
var ClassX_with_A_B = mixin(ClassX, TraitA, TraitB);
var x = new ClassX_with_A_B;
assert.equal(x.getX(), "X");
assert.equal(x.getA(), "A");
assert.equal(x.getB(), "B");
```

ClassX に動的にメソッドが加えられた場合、ClassX_with_A_B から生成されたインスタンスにもその変更が反映される ( プロトタイプチェイン )。

```
ClassX.prototype.getX2_defined_dynamically = function(){
    return "X2";
};
assert.equal(x.getX2_defined_dynamically(), "X2");
```

コンストラクタの引数については本題から外れるので省略。

( Kobito アプリからそのまま送信してみるテスト投稿 )
git submodule でブランチ/タグをチェックアウトする

```
cd submodule_directory
git checkout v1.0
cd ..
git add submodule_directory
git commit -m "moved submodule to v1.0"
git push
```

でうまくいった。
stackoverflow++

http://stackoverflow.com/questions/1777854/git-submodules-specify-a-branch-tag
循環参照しているオブジェクト同士では `==` が例外を投げることがある

```python
>>> a = []
>>> a.append(a)
>>> b = []
>>> b.append(b)
>>> a == b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: maximum recursion depth exceeded in cmp
```
Rubyはfalseを返すようだ
irb(main):001:0> a = []
=> []
irb(main):002:0> a.push(a)
=> [[...]]
irb(main):003:0> b = []
=> []
irb(main):004:0> b.push(b)
=> [[...]]
irb(main):005:0> a == b
=> false
How to manage a README for both github and PyPI

First of all, write a README in either Markdown (.md) or ReStructuredText (.rst). Next, convert the README to the other one with pandoc.

    pandoc -f markdown -t rst README.md > README

or

    pandoc -f rst -t markdown README > README.md

Note that PyPI requires not README.rst but README.

For PyPI, you need to set the README content to long_description in setup.py:

    setup(
        ...
        long_description=open('README').read(),
        ...

Then, your PyPI page looks same as github page.
Mountain Lionでのシステムワイド環境変数の設定方法


Moutain Lionでenviroment.plistのサポートがなくなったので
設定方法をメモ

## なにが問題か
従前、環境変数の指定に~/.MacOSX/enviroment.plistを使用しているとMounteain Lionへアップデートした場合、eviroment.plistは参照されない（サポート終了とのこと
http://www.mobileread.com/forums/showthread.php?t=186069
)

環境変数PATHをenviroment.plistで設定していた場合アプリケーションバンドル形式のアプリ例えばEmacs.appから/usr/local/binが見えなくなったよってemacs起動時にwgetが見つからないと怒られるハメに…

コンソール上のプログラムは.bash_profile等で環境変数を指定すれば問題はないが、普通にアイコンクリックしてemacsが使えんと支障があるのでアドホック的に対策をした

/etc/launchd.confに環境変数を記述
============
環境変数を指定する方法をググってみたところ、この方法が一番簡単だった。
しかしシステムワイドで設定されるためマルチユーザー環境では問題ありなのだがサーバで利用しないのでよしとする。

## 準備
 **/etc/launchd.conf** はデフォルトでは作成されていないので
おもむろにtouchコマンドでファイルを作成するか好みのエディタで
launchd.confを/etc以下に作成し設定を記述する
管理者権限がないとダメなので **sudo** を使い **管理者権限** で作業を実施する

例：

``` Shell
$ sudo vi /etc/launchd.conf
```

or

```Shell
$ sudo emacs /etc/launchd.conf
```


## 記述形式
環境変数を指定する場合
setenv key value
となる、その他についてはmanを参照

例：

``` PATHを設定
setenv PATH /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
```
記述後、launchd.confを保存したら再起動し完了
JavaScript で指定した時間の感覚を空けながらループするヤツ

ブラウザ用です。
Google Chrome の FileReader.readDataAsURL のロック周りにバグがあるのか、数十ミリ秒ぐらい感覚を空けないと連続で呼び出せないので書きました。

```js:loopWithInterval.js
(function (window) {
  window.loopWithInterval = function (arr, interval, callback) {
    var callbacks = Array.prototype.reduce.call(arr, function (sum, elem) {
      var i = sum.length;
      sum.push(function () {
        callback(elem, i, arr);
      });
      return sum;
    }, []);
    var intervalId = window.setInterval(function () {
      var f = callbacks.shift();
      f ? f() : window.clearInterval(intervalId);
    }, interval);
  };
})(window);
```

使い方
------

### 呼び方

`void loopWithInterval(ループする配列, 感覚 (ミリ病), コールバック);`

配列は Array じゃなくて配列っぽいオブジェクトでも可。

### コールバックのプロトタイプ

`void callback(要素, 添字, 元の配列);`

参考にしたもの
--------------

https://twitter.com/mizchi/status/229525464362938368

JavaScript 力も CoffeeScript 力も低いのでよく理解できてない可能性が高い (そもそも setTimeout じゃなくて setInterval 使ってるし)

まとめ
------

既存の有名ライブラリとかでとっくに実装されている気がするので、いいのがあれば是非とも教えていただきたいです。
Audioで複数回同時に鳴らす

http://d.hatena.ne.jp/yambi/20110812/1313175138

Audioは当然1回しか同時には鳴らせない。
複数回鳴らすには、鳴らすたびにAudioを生成すればよろしい。
でもURLでリソースを指定すると、そのたびにサーバにアクセスするので遅延が発生しやすい。
よって、Base64で埋め込むことにする。

こちらでエンコードさせていただくことにする。
http://www.kawa.net/works/js/data-scheme/base64.html
ASSMで状態管理


##インストール

```ruby:Gemfile
gem 'aasm'
```

```sh
bundle install
```

##モデル

ファイルをダウンロードして別の箇所にアップロードするための情報を管理する感じ。

```ruby
class DownloadFile < ActiveRecord::Base
  include AASM
  attr_accessible :status, :uri

  # 状態を保存する列
  # 列の型はstringにしないとダメ
  aasm_column :status

  # 使用する状態
  aasm_state :not_donwloaded
  aasm_state :downloaded
  aasm_state :uploaded

  # 初期状態
  aasm_initial_state :not_donwloaded

  # シンボルで指定した名前のメソッドが定義される
  aasm_event :downloaded do
    # このメソッドが実行されるとstatusがdownloadedになる
    # 元の状態がnot_downloadedでない場合、例外が発生する
    transitions to: :downloaded, from: :not_donwloaded
  end

  aasm_event :uploaded do
    transitions to: :uploaded, from: :downloaded
  end

  # 状態を確認するためのメソッド群
  def not_downloaded?
    true if self.status == :not_donwloaded.to_s
  end

  def downloaded?
    true if self.status == :downloaded.to_s
  end

  def uploaded?
    true if self.status == :uploaded.to_s
  end

end
```

##使い方

```ruby
file = DownloadFile.create(uri: "hogehoge")
p file.not_downloaded? # => true

file.downloaded
p file.downloaded? # => true

file.uploaded
p file.uploaded? # => true
```

##参考
http://memo.yomukaku.net/entries/228
http://techblog.heartrails.com/2011/02/rails-aasm.html
デバッグのためのコードであるconsole.logが残ったままだと、IEでバグる


これでドハマりしかけたのでメモ。

散々既出なのかもしれないけど、console.logが残ったままだと、IEでエラーが出る。

```
console undifined
```

みたいな感じで。

なぜかIEだけjavascriptが動かない！という時は注意したい。
カウントダウンタイマーを作るときに、new Dateで作った日付の数値の計算でIEが「NaN」を返してバグる件-その回避方法


カウントダウンタイマーを作っていたら、IEのみNaNを返して困っていたが、単純なミスだった。

件のカウントダウンタイマーは下記

```coountdown.js
<script type="text/javascript">
  $(function() {
    countDown();
    });
    function countDown() {
    var startDateTime = new Date();
    var endDateTime = new Date("8 26,2011 11:00:00");
    var d = Math.floor((endDateTime-startDateTime)/(24*60*60*1000))
    var h = Math.floor(((endDateTime-startDateTime)%(24*60*60*1000))/(60*60*1000))
    var m = Math.floor(((endDateTime-startDateTime)%(24*60*60*1000))/(60*1000))%60
    var s = Math.floor(((endDateTime-startDateTime)%(24*60*60*1000))/1000)%60%60
    $("#TimeLeft").text(d+'日'+h+'時間'+m+'分'+s+'秒');
      setTimeout('countDown()', 1000);
    }
</script>
```

>引用元はこちら
>[グルーポン系サイトでよく見掛けるカウントダウンタイマーのサンプルコード](http://codenote.net/javascript/jquery/458.html)

このコードは,Firefoxだと動くが、IEだと動かない。
各数値でNaNが返る。

引用元のコードと違う点はたったひとつで、
endDateTimeのnew Date()にて、[月]を数字で指定していること。

```javascript
var endDateTime = new Date("8 26,2011 11:00:00");

```

どうやらこれが原因らしい。
バグを回避するには、きちんと英語にて[月]を記入する必要がある。

```javascript
var endDateTime = new Date("August 26,2011 11:00:00");

```

たったこれだけの話。
めんどくさがって(*英語力が足りないからといって*)数字で入力、ダメゼッタイ。
第二回オフラインリアルタイムどう書くの解答

第2回 オフラインリアルタイムどう書く( http://atnd.org/events/30900 )
参加した際に会場で書いたコードを手直ししたものです。
1時間では解けませんでした。
問題（ http://nabetani.sakura.ne.jp/hena/ord2/ ）

縦列も横列もlineと名前をつけていたりと、ややこしくなってしまいました。

``` Tetris.java
public class Tetris {
    public static void main( String[] args ) {
        String[][] test = {
            /* 0*/ {"ff-2f-23-f3-77-7f-3b", "1f-03-00-1c-0d-0f-06" },
            /* 1*/ {"01", "00" },
            /* 2*/ {"00", "00" },
        };
        for ( String[] testItem : test ) {
            String result = Tetris.delete(testItem[0]);
            System.out.println( result );
            if ( !testItem[1].equals(result) ) {
                System.out.println( "Fail: " + testItem[1] );
            }
        }
    }

    private static final String SPLIT_LETTER = "-";
    public static String delete( String blocks ) {
        int[] lines = parseBlocks(blocks);
        int deleteLine = completeBits(lines);
        String[] resultLines = dropBlock(lines, deleteLine );
        String ret = resultLines[0];
        for ( int i = 1; i < resultLines.length; i++ ) {
            ret = ret + SPLIT_LETTER + resultLines[i];
        }
        return ret;
    }

    public static int[] parseBlocks( String blocks ) {
        String[] lines = blocks.split(SPLIT_LETTER);
        int[] ret = new int[lines.length];
        for ( int i = 0; i < lines.length; i++ ) {
            ret[i] = Integer.parseInt(lines[i], 16);
        }
        return ret;
    }

    public static int completeBits( int[] lines ) {
        int bits = 0xFF;
        for ( int line : lines ) {
            bits &= line;
        }
        return bits;
    }

    public static String[] dropBlock( int[] lines, int deleteLine ) {
        String[] ret = new String[lines.length];
        for ( int i = 0; i < lines.length; i++ ) {
            ret[i] = String.format( "%02x",
                                    dropLine( lines[i], deleteLine ) );
        }
        return ret;
    }

    public static int dropLine( int line, int deleteLine ) {
        int ret = 0;
        for ( int mask = 0x80; mask > 0 ; mask = mask>>1 ) {
            if ( (deleteLine & mask) == 0 ) {
                ret = ret << 1;
                if ( (line & mask) != 0 ) {
                    ret |= 1;
                }
            }
        }
        return ret;
    }
}
```
nginxで特定ディレクトリをBasic認証から除外する方法

```nginx
server {
  listen               80;
  auth_basic           "auth";
  auth_basic_user_file /path/to/.htpasswd;
  root                 /path/to/root;
  location /path/to/exception {
    satisfy any;
    allow   all;
  }
}
```
OptionParserでコマンドライン引数を解析する。


```ruby:use_optionparser.rb
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'optparse'
require 'time'

# コマンドライン引数を解析してハッシュに格納する
args = {}
OptionParser.new do |parser|

  # onでTime型が指定された場合の処理
  # 文字列をTimeに変換する
  parser.accept(Time) do |s, |
    begin
      Time.parse(s) if s
    rescue
      raise OptionParser::InvalidArgument, s
    end
  end

  # オプションを指定
  # オプションが引数を取る場合は任意の文字列を設定する
  # ex.--from COPY_FROM
  # 指定しない場合、ブロックに渡される引数は
  # オプションが指定されたかどうかだけとなるためboolとなる
  parser.on('-f', '--from COPY_FROM') {|v| args[:from] = v}
  parser.on('-t', '--to COPY_TO') {|v| args[:to] = v}
  parser.on('-d', '--date DATE', Time) {|v| args[:date] = v}
  parser.parse!(ARGV)
end

p args
```

```sh
ruby ./use_optionparser.rb -f "~/work/from" -t "~/work/to" -d "2012/07/29"
# {:from=>"~/work/from", :to=>"~/work/to", :date=>2012-07-29 00:00:00 +0900}

```
printf の幅指定で "%0*x" を使う 

C言語の printf や ruby の 文字列%配列 などで、`"%0*x"` のような書式指定が使える。

```C:"%0*x"の使用例
for( i=3 ; i<8 ; ++i ){
  printf( "%0*x\n", i, 0x123 );
}
```

を実行すると、

```txt:出力結果
123
0123
00123
000123
0000123
```

となる。
つまり、`"%0*x", 5, 0x123` は、`"%05x", 0x123` と同じ。

古来より使える機能なので %d や %x などが使える書式指定文字列ならみんな使える。
と思っていたのだが。
java の String.format ではサポートされていない模様。残念。
第二回オフラインリアルタイムどう書くの解答例 ruby でもう一回

第2回 オフラインリアルタイムどう書く( http://atnd.org/events/30900 )。
問題は http://nabetani.sakura.ne.jp/hena/ord2/

```ruby
#!ruby

def bitetris2( q )
  s=q.split('-').map{ |i| "%08b"%i.to_i(16) }
  (0...8).each{ |h|
    s.each{ |c| c[h,1]="*" } if s.all?{ |x| x[h,1]=="1" }
  }
  s.map{ |i|
    "%02x" % i.chars.reject{ |c| c=='*' }.join('').to_i(2)
  }.join('-')
end

DATA.each{ |line|
  q,ex=line.split(/\s+/)
  r=bitetris2 q
  p [r==ex, r, ex ]
}
__END__
ff-2f-23-f3-77-7f-3b	1f-03-00-1c-0d-0f-06
```

bit演算を避けて実装しようという方針で書いたもの。

+ "%08b" で 2進数にする
+ ラインが揃っているところに * を入れる
+ chars で配列にしてから reject で * を撤去し、join で文字列に戻す
+ to_i(2) で整数にした後、"%02x" で 16 進数にする。

という流れ。
jQuery UI


```html

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.21/jquery-ui.min.js"></script>
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.14/themes/ui-lightness/jquery-ui.css">

```

http://stacktrace.jp/jquery/ui/widgets/dialog.html
Fugitive Pluginの:Gbrowseコマンドで使用されるブラウザを設定する


GitコマンドをVim上で操作する際に便利な**Fugitive**というPluginがあります。

https://github.com/tpope/vim-fugitive/

この中の`:Gbrowse`というコマンドを使うと、現在開いているファイルに対応するGithub上のURLをWebブラウザで開いてくれます。

しかし、僕のMacでは`:Gbrowse`コマンドを使っても何も反応がありませんでした。

いろいろ調べたところ、`~/.gitconfig`というファイルに設定を追加する必要がありました。
以下は使用するWebブラウザにChromeを指定する場合の設定です。

````~/.gitconfig
[web]
	browser = open
[browser "chrome"]
	cmd = open -a 'Google Chrome.app'
````

`git web--browse`というコマンドを使うと、コマンドライン上から設定もできるようですが、ややこしそうなので直接設定ファイルを変更しました。

詳しくはReadmeファイルのFAQ欄を参考にしてみてください。

https://github.com/tpope/vim-fugitive/blob/master/README.markdown
FreeBSD 9.1-BETA1 セットアップメモ(仮)


![FreeBSD](http://www.freebsd.org/logo/logo-full.png)

(FreeBSD 9.0-RELEASEも同じようにして出来るはず。)

インストーラーは省略

- Keymap: ja106
- Timezone: Tokyo
- *CMOSクロックはUTCにしない*
- シェルはbash, zshがおすすめ

Ports(パッケージ管理)のインストールは
最初にPortmasterを入れると簡単に出来る



```bash
$ cd /usr/ports/ports-mgmt/portmaster
$ make config-recursive install clean

$ portmaster [Portsカテゴリ]/[Ports名]

#例
$ portmaster editors/nano

```

##システム
* editors/nano (vim, emacs等は好みに応じて)
* (shells/zsh)

* ports-mgmt/portupgrade
これを入れることでportsのアンインストールが簡単になる

```bash
$ pkg_deinstall xxx/xxx

#例
$ pkg_deinstall lang/gcc (clangが良い!という人に
```
* japanese/nkf

Linuxバイナリ互換機能を有効に

```
$ kldload linux.ko
```

## Linuxとのバイナリ互換機能の有効化
```bash:/etc/rc.conf
linux_enable="YES"
```
##ネットワーク
* net/samba36

```bash:/usr/local/etc/smb.conf
# workgroup = MYGROUP
workgroup = WORKGROUP
#自分のネットワークのWORKGROUPに

server string = Samba Server
#Windows側から見えるサーバー名

#hosts allow=192.168.0. 127.
#接続を許可するIPアドレスを範囲指定
```

```bash:/etc/rc.conf
samba_enable="YES"
```

```bash:
$ smbpasswd -a [user]
# Sambaで利用するユーザーを追加
```

* dns/unbound
* ftp/wget

* net/mosh
途中でネットワーク接続が切れたり、IPアドレスが変わっても問題なく使える、SSHのラッパー

```bash
$ mosh --ssh="ssh -i [秘密鍵] -p [port]" [user]@[host]
```

##Portsのミラーサーバーの変更

```bash:/etc/portsnap.conf
# portsnap.freebsd.org
portsnap.allbsd.org
# 東京理科大学がミラーを置いている
```

###Portの更新(初回のみ)

```bash
$ portsnap fetch && portsnap extract
```

crontabに下を書き込むことで毎日自動的に更新してくれる

```
0 3 * * * root /usr/sbin/portsnap cron
0 5 * * * root /usr/sbin/portsnap update
```

###SSHの設定
ssh-keygen -t rsa -C "コメント"

sshd_config の場所は /etc/ssh/sshd_config

```bash
$ service sshd restart
```

##Webサーバーなど…
ここからはお好みに応じて
* www/apache24-event-mpm (MPM Preforkでいい場合は www/apache24)
* www/mod_fcgid
* lang/ruby21

* lang/php5
* lang/php5-extensions
* www/pecl-APC
* databases/pecl-memcache

* databases/mariadb-server
* databases/mariadb-client
* databases/phpmyadmin

mysqlのrootのパスワード変更

```
$ mysql
mysql> SET PASSWORD FOR root@localhost=PASSWORD('[password]');
```
* databases/redis

###Apacheの高速化

カーネルモジュールを読み込んで、ネットワークバッファリングを有効にする

```bash
$ kldload accf_data.ko
$ kldload accf_http.ko
````

```bash:/etc/rc.conf
apache24_enable="YES"
apache24_http_accept_enable="YES"
```

##その他

* net/boinc-client

```bash
$ boinc --daemon
$ boinccmd --join_acct_mgr bam.boincstats.com [user] [password]
```

```bash:/etc/rc.conf
boinc_client_enable="YES"
```

**何か色々問題がありそうなので後で修正したい**
Rails consoleでreload!する場合の注意点


`reload!`コマンドを使った時に、ちょっとハマったエピソードです。

## ある日のできごと
あるModelを作りました。

````ruby
class Hoge < ActiveRecord::Base
  def foo
    'Hello'
  end
end
````

`rails c`でRailsのコンソールを立ち上げながら、Modelの挙動を確認しました。

````
> x = Hoge.find 1
> x.foo
 => "Hello"
````

ちょっと訳あってメソッドを修正しました。

````ruby
class Hoge < ActiveRecord::Base
  def foo
    'Bye'
  end
end
````

コンソールを再起動するのは面倒なので、Google先生に尋ねたところ、`reload!`と打てば良いと教えてもらいました。

````
> reload!
Reloading…
  => true
````

では、動作確認。

````
> x.foo
  => "Hello"
````

あれ？変わってない・・・。
悩むこと数十分。そしてギブアップ。

そこで隣にいた松村先生に質問したところ、`reload!`した後に、オブジェクトの再ロードも必要になると教えてもらいました。

````
> x = Hoge.find 1
> x.foo
 => "Bye"
````

というわけで、`reload!`だけではなく、すでに読み込まれているオブジェクトに対してはそちらも再ロードが必要になります。

ちなみにオブジェクトに対して`reload`メッセージを送ってもダメです。

````
> x.reload
> x.foo
  => "Hello"
````

以上、Rails初心者の方はご注意を！
RSpecでバージョン違いのエラーが出る場合の対処法


RSpecって、`rspec spec`って打てばいいんだよね？
っと思ったらこんなエラーが発生。

````
`block in setup': You have already activated rspec-core 2.10.1, but
your Gemfile requires rspec-core 2.8.0. Using bundle exec may solve
this. (Gem::LoadError)
````

エイリアスで

````zsh
alias be= bundle exec
````

と設定しているので、`be rspec spec`って打てば動くだろうと思ったら、同じエラーが出て動かない。

結局、エイリアスを使わずに

````zsh
$ bundle exec rspec spec
````

って打ったら動いた。

````zsh
$ bundle exec rspec
````

でもOK。


しかし、なんでエイリアスを使ったらエラーが出るんだろう？と思ってさらに調べてみた。
なんかエイリアスの設定がおかしかった。。。


````zsh
alias be= bundle exec
````

じゃなくて

````zsh
alias be="bundle exec"
````

とすべきだった。ああ〜。
historyコマンドで最新の数件だけを取得する

##2012.8.5追記
この内容は**oh-my-zsh**を導入している場合には有効ですが、それ以外では`history -20`のようなコマンドを使う方がシンプルで簡単です。
**oh-my-zsh**ユーザーの方は[こちらの記事](http://qiita.com/items/d01b12be2145fd97b504)も参考にしてみてください。

- - -
##本文
普通に`history`って打つと大量に履歴が表示されるので、直前のコマンドだけに絞り込む方法を探していました。

デフォルト(10行)

````zsh
$ history | tail
````

件数を指定する場合

````zsh
$ history | tail -20
````

やり方を見るととてもあっけないですが、Linux/UNIXに慣れていないと、これが意外と思いつかないんですよね〜。
Emacs 初心者はいかにして変態キーバインドを覚えるか

Emacs 使い始めはついついカーソルキーや BS、Enter キーを使ってしまいがちだ。それだと、いつまで経っても Emacs のキーバインドを覚えることはできない。基本的なキーバインドを使えなければ Emacs を使う価値などない。

では Emacs 使い始めの初心者はどのようにキーバインドを覚えればよいか。答えは簡単。普段使っているキーを Emacs で使えないようにすればいいのだ。つまり、Emacs 内では下にカーソルキーを移動するのに C-n 以外のキーの使用を認めないということだ。

そのような厳しい指導をしてくれるのが [鬼軍曹.el](https://github.com/k1LoW/emacs-drill-instructor) である。[Elisp](https://raw.github.com/k1LoW/emacs-drill-instructor/master/drill-instructor.el) をパスのあるところに置き、

```cl
(require 'drill-instructor)
(setq drill-instructor-global t)
```

を記述すると、カーソルキー、BackSpaceキー、Enterキー、TABキーが使用できなくなり、代わりにどのキーを使えばいいかミニバッファに表示してくれる。詳しくは [Wiki](https://github.com/k1LoW/emacs-drill-instructor/wiki/) を見てほしい。

Emacs を使うのであれば、これらの基本キーは必須だ。まだ覚えていない Emacs ユーザは、厳しい教官の指導のもと、是非 Emacs キーバインドをマスターしてほしい。
第２回 オフラインリアルタイムどう書く解答(ruby)

会場から解答。
問題はこちらhttp://nabetani.sakura.ne.jp/hena/ord2/

```ruby
def del_bit(byte, bit_pos)
  byte_a = ("%08b"%byte).split('')
  byte_a.delete_at(bit_pos)
  (["0"] + byte_a).join.to_i(2)
end

def solve(prob)
  bytes = prob.split('-').map{|e| e.to_i(16)}
  to_del_bits = bytes.inject(0xff){|r,b| b&r}
  8.times do |i|
    next if ((0b10000000 >> i) & to_del_bits) == 0
    bytes = bytes.map{|byte| del_bit(byte, i)}
  end
  bytes.map{|i| "%02x"%i}.join('-')
end

DATA.readlines.each do |line|
  no, prob, ans = line.chop.split(/\s/)
  puts "#{no} #{solve(prob)}"
end
__END__
#0	ff-2f-23-f3-77-7f-3b	1f-03-00-1c-0d-0f-06
#1	01	00
#2	00	00
#3	7a-4e	0c-02
#4	56-b6	08-14
#5	12-12-12	00-00-00
#6	de-ff-7b	0a-0f-05
#7	95-be-d0	05-1e-20
#8	7c-b0-bb	1c-20-2b
#9	7a-b6-31-6a	3a-56-11-2a
#10	32-0e-23-82	18-06-11-40
#11	ff-7f-bf-df-ef	0f-07-0b-0d-0e
#12	75-df-dc-6e-42	35-5f-5c-2e-02
#13	62-51-ef-c7-f8	22-11-6f-47-78
#14	0c-47-8e-dd-5d-17	04-23-46-6d-2d-0b
#15	aa-58-5b-6d-9f-1f	52-28-2b-35-4f-0f
#16	ff-55-d5-75-5d-57	0f-00-08-04-02-01
#17	fe-fd-fb-f7-ef-df-bf	7e-7d-7b-77-6f-5f-3f
#18	fd-fb-f7-ef-df-bf-7f	7e-7d-7b-77-6f-5f-3f
#19	d9-15-b5-d7-1b-9f-de	69-05-55-67-0b-4f-6e
#20	38-15-fd-50-10-96-ba	18-05-7d-20-00-46-5a
#21	fe-fd-fb-f7-ef-df-bf-7f	fe-fd-fb-f7-ef-df-bf-7f
```
第二回オフラインリアルタイムどう書くの解答例

第2回 オフラインリアルタイムどう書く( http://atnd.org/events/30900 )。
問題は http://nabetani.sakura.ne.jp/hena/ord2/
まずは、とりあえず書いた ruby。

```ruby
#!ruby

def bitetris( q )
  s=q.split('-').map{ |i| i.to_i(16) }
  lines_to_kill = (0...8).select{ |i|
    s.all?{ |x| x[i]!=0 }
  }
  lines_to_kill.reverse.each{ |b|
    s=s.map{ |x|
      ((x>>1)&(-1<<b)) | (~(-1<<b)&x)
    }
  }
  s.map{ |i| "%02x"%i }.join('-')
end

DATA.each{ |line|
  q,ex=line.split(/\s+/)
  r=bitetris q
  p [r==ex, r, ex ]
}
__END__
ff-2f-23-f3-77-7f-3b   1f-03-00-1c-0d-0f-06
```

テストデータは本当はもっとあるけどここには一個だけで。

普通に bit 演算をするとこんなかんじかなという実装。
Zend Framework 2 サービスの定義 によるオブジェクトの管理 (導入)

Zend Framework 2 のモジュール内でサービスを定義する場合は、'service_manager'キーに定義を記載します。 （一般的には config/module.config.php ）

サービスの生成定義を記載するときに短い方法は、factoriesにクロージャーを設定することです。 サービスを取得するときにクロージャーは実行されます。 このようにしてサービスを遅延して作成することができます。

```php
<?php
return array(
    'service_manager' => array(
        'factories' => array(
            'foo' => function($sm) {
                return new Service();
            }   
        ),
    ),
);
```

また、クロージャ以外でもZend\ServiceManager\FactoryInterfaceを実装したものを用意し、
factoriesにクラス名を記載すればそのFactory経由でサービスが取得されます。

```php
<?php
array(
  'service_manager' => array(
        'factories' => array(
            'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory',
        ),
    ),
)
```

そして、サービスを取得するためには次のように書きます。
```
$this->getServiceLocator()->get('foo'); // コントローラ内の場合
```

デフォルトでは、サービスは共有されます。共有化を止めたい場合は、sharedに同一キー名のサービス名を用意し、falseを設定します。

``` php
<?php
return array(
    'service_manager' => array(
        'factories' => array(
            'foo' => function($sm) {
                return new Service();
            }   
        ),  
        'shared' => array(
            'foo' => false
        ),  
    ),
);
```

参考：Zend\ServiceManager Quick Start
http://packages.zendframework.com/docs/latest/manual/en/modules/zend.service.manager.quick.start.html
参考:http://silex-users-jp.phper.jp/doc/html/services.html#service-definitions
Zend Framework 2 のコーディングスタンダード

PHP Framework Interop Group(php-fig)のPSR-0,1,2に準拠
http://www.php-fig.org/
(リードデペロッパーのweierophinneyがphp-figのメンバーでもあるため)

Zend Framework2自体のコーディングスタンダードは
http://framework.zend.com/wiki/display/ZFDEV2/Coding+Standards

ZF１との違いで大きいのは、protectedメンバーはunderscoreプリフィクス($_foo)ではなくなっています。

※ ZF1で見られた誤解ですが、これはフレームワーク内のみで使用する規約であり、コードを呼び出す側がこれらの規約を守る必要はまったくありません。
Zend Framework2でデバッグツールバーを利用する

zf1ユーザにはZFDebugなどで知られる各種フレームワークにあるデバッグツールバーが
zf2では、公式のzendframeworkチームのリポジトリに用意されました。
https://github.com/zendframework/ZendDeveloperTools

以下は導入方法の例です。

あなたのアプリケーション(ZendSkeletonApplication)ディレクトリトップ内に移動し、
ZendDeveloperToolsをインストールします。
```
php composer.phar require zendframework/zend-developer-tools:dev-master
```

モジュールにて有効にするためにconfig/application.config.phpを編集し、
ZendDeveloperToolsを追記します。

```php
<?php
return array(
    'modules' => array(
        'Application',
        'ZendDeveloperTools',
    ),
    // 以下略
);
```

ZendDeveloperToolsのREADMEにあるとおり、設定をファイルをアプリケーション側にコピーします。

```
cp vendor/zendframework/zend-developer-tools/config/zenddevelopertools.local.php.dist config/autoload/zenddevelopertools.local.php
```

設定ファイルはディストリビューションではデバッグツールバーが有効になっていないため、さきほどの手順でコピーしたzenddevelopertools.local.phpを編集します。

```php
<?php
return array(
    'zdt => array(
// 中略
         /**
          * General Toolbar settings
          */
        'toolbar' => array(
            /**
             * Enables or disables the Toolbar.
             *
             * Expects: boolean
             * Default: false
             */
            'enabled' => true,
// 中略
            )
     )
);
```

ツールーバーを有効にすると下の画像のように表示されるはずです。

![ZendDeveloperTools](http://25.media.tumblr.com/tumblr_m7v2vpIrft1rwlsw1o1_1280.png "ZendDeveloperTools")


細かい設定等はZendDeveloperToolsのREADMEを参照してください。
ZendSkeletonApplicationのメッセージを日本語にする

Zend Framework 2 で標準のWEBアプリケーションの雛形として
ZendSkeletonApplicationが用意されています。
https://github.com/zendframework/ZendSkeletonApplication

ただし、viewにてtranslateヘルパーが使用されていますが、Applicationモジュールのlocal設定では、en_USのみが記述されています。この設定を日本語を使用するようにオーバーライドするには、
config/autoload/global.phpに以下のように設定します。

```php
<?php
return array(
    'translator' => array(
        'locale' => 'ja_JP',
    ),
);
```

日本語がおかしい場合は
https://github.com/zendframework/ZendSkeletonApplication/pull/91
などのPRを参考に訂正依頼をなげてください。
composerでZend Framework 2のコンポーネントを個別に利用する

Zend Framework 2 の最新版では
１の頃から要望の多かったMVC以外のライブラリ（ZendServiceAmazonなど）について個別にソースが利用できるようになっています。
https://github.com/zendframework/repositories

これらのコンポーネントをcomposerで利用するには、
composer.jsonにhttp://packages.zendframework.com/ のリポジトリを記載する必要があります。

以下はzendservice-recaptchaを使う場合です。

```javascript:composer.json
{
    "repositories": [
        {
            "type": "composer",
            "url": "http://packages.zendframework.com/"
        }
    ],
    "require": {
        "php": ">=5.3.3",
        "zendframework/zend-stdlib": ">=2.0.0beta5",
        "zendframework/zend-version": ">=2.0.0beta5",
        "zendframework/zend-loader": ">=2.0.0beta5",
        "zendframework/zend-validator": ">=2.0.0beta5",
        "zendframework/zend-uri": ">=2.0.0beta5",
        "zendframework/zend-http": ">=2.0.0beta5",
        "zendframework/zendservice-recaptcha": ">=2.0.0beta5"
    }
}
```


なお、これまでZend_Service(Zend\Service)だった名前空間だったものはZendServiceに変更されていますので注意してください。
Mountain Lion + Xcode 4.4 で openFrameworks をビルドする


現在の oF 最新版 0071 は、OS X 10.6 SDK でないとビルドできません。しかし、Mountain Lion とともにアップデートされた Xcode 4.4 から OS X 10.6 SDK が含まれなくなってしまいました。

oF フォーラムの [Xcode 4.5 not supporting 10.6 SDK](http://forum.openframeworks.cc/index.php/topic,7621.0.html) によれば、とりあえず何とかする方法がいくつかあるようです。

- OS X 10.6 SDK を用意してビルドする
- oF の OS X 10.6 SDK に依存している部分をコメントアウトして 10.7/10.8 SDK でビルドする
- （Xcode 4.3.3 に戻す。Mountain Lion では Xcode 4.4 は動かないため、Lion のまま Xcode 4.4 にアップデートした人向け。）

そもそもの前提として Xcode 4.4 の Command Line Tools をダウンロードしておきましょう。*Xcode -> Prefereces -> Downloads -> Components* からダウンロードできます。

また Base SDK は *openFrameworksLib.xcodeprj -> Build Settings -> Architectures -> Base SDK* から設定できます。

## 10.6 SDK を用意してビルドする

こっちがおすすめ。ないものは取って来ようということです。

まず 10.6 SDK を用意します。[上記のフォーラム](http://forum.openframeworks.cc/index.php/topic,7621.0.html)にアップしてくれてる人がいます。再配布がライセンス的に OK なのかはわかりませんが・・・。

[Apple の Developer サイトからダウンロードできる Xcode 4.3.3](https://developer.apple.com/downloads/index.action?name=Xcode 4.3.3) の中から取り出すこともできます。こちらは Xcode 丸ごと落とすため 1.8GB もあり、ダウンロードに時間がかかります。落とした .dmg の中には Xcode.app が入っています。その中を掘っていくと *Mac0SX10.6.sdk* ディレクトリが見つかるでしょう。

ともあれ、用意した *Mac0SX10.6.sdk* ディレクトリを */Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs* の中に置くと、Base SDK が OS X 10.6 のままでもビルドできるようになります。

## oF の 10.6 SDK 依存の部分をコメントアウトしてビルドする

こっちは、あまりいい方法とは思いませんが・・・。

10.6 SDK に依存しているのは `ofQuickTimeGrabber` と `ofQuickTimePlayer` だけです。で、これらを使っているのは `ofVideoGrabber` と `ofVideoPlayer` です。ビデオ関係の機能を使わない人であれば 10.7/10.8 SDK でビルドできます。

ビルド時にコンパイルエラーになる行をコメントアウトし、Base SDK を Current OS X, OS X 10.8, OS X 10.7 のどれかにしてビルドします。

ちなみに videoGrabberExample をビルド、実行したらこんなグリッチになりました。

![グリッチ](http://dl.dropbox.com/u/1569777/screenshots/of_glitch.png)
XCodeに登録したCodeSnippetの保存場所と内容


**保存場所**
~/Library/Developer/Xcode/UserData/CodeSnippets/
この下に、*.codesnippet というファイルで保存されていました。

**内容**

```xml:*codesnippet
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>IDECodeSnippetCompletionPrefix</key>
	<string>log</string>
	<key>IDECodeSnippetCompletionScopes</key>
	<array>
		<string>CodeBlock</string>
	</array>
	<key>IDECodeSnippetContents</key>
	<string>NSLog(@"CGPoint: %@", NSStringFromCGPoint(&lt;#point#&gt;)); </string>
	<key>IDECodeSnippetIdentifier</key>
	<string>083C94B4-147D-471B-A4AB-A0F182A79301</string>
	<key>IDECodeSnippetLanguage</key>
	<string>Xcode.SourceCodeLanguage.Objective-C</string>
	<key>IDECodeSnippetSummary</key>
	<string>NSLog(@"CGPoint: %@", NSStringFromCGPoint(&lt;#point#&gt;)); </string>
	<key>IDECodeSnippetTitle</key>
	<string>log CGPoint主力</string>
	<key>IDECodeSnippetUserSnippet</key>
	<true/>
	<key>IDECodeSnippetVersion</key>
	<integer>0</integer>
</dict>
</plist>
```

ファイル名やIDECodeSnippetIdentifierに、ちょっと怖いidがあるのだけど、このディレクトリを共有しておけば、別のMacでも使い回しができるようです。

**参考**
[Xcode: NSLog() の入力が捗る Code Snippet](http://qiita.com/items/3dee91c5404b3c789ddc)
[Xcode 4のスニペットをDropboxで同期する](http://blog.seasons.cc/entry/20110328/1301300189)