OmniAICreator/Qiita-1.07M huggingface dataset:
Kiwi で非同期テストを行う


最近 [Kiwi](https://github.com/allending/Kiwi)で TDD やってます。Objective-C のテストってすごく書きづらいイメージでしたが、Kiwi はかなり使いやすくてお勧めです。

非同期メソッドを呼んで、そのメソッド内で変更された値をチェックするといったことも簡単にできます。

```objective-c:test.m
describe(@"SimpleRemoteObject", ^{
    context(@"read remote post object using POST", ^{
        beforeAll(^{
            [SRRemoteConfig defaultConfig].baseurl = @"http://localhost:2000/";
        });
        
        it(@"should get object using POST method", ^{
            NSDictionary *params = @{@"key":@"value"};
            __block NSArray *ret;
            [PostObj postAsyncWithParams:params async:^(NSArray *allRemote, NSError *error){
                ret = allRemote;
            }];
            [[expectFutureValue(ret) shouldEventually] beNonNil];
            [[expectFutureValue(ret) shouldEventually] haveCountOf:1];
            [[expectFutureValue(((PostObj *)[ret objectAtIndex:0]).key) shouldEventually] equal:@"value"];
        });
    });
});

```

上記は先日公開したライブラリ、[SimpleRemoteObject](http://qiita.com/items/049b9c4584769fe37896)で使っている実際のテストケースですが、
`PostObj:postAsyncWithParams:async:` というメソッドは、SimpleRemoteObject がサーバからデータを取ってきて自分のインスタンスを作成、プロパティに値をマッピングして返すメソッドです。データ取得後に async で渡したブロックの中身が評価されます。

サーバはRequestの内容を echo しているだけなので、key プロパティに "value" が入っていればテストが成功するはずです。

このような場合、ブロックの中でセットされている ret をいきなり `[[ret should] beNonNil];` などとしてしまうと、この式の評価の時点で値が入っていないのでテストは失敗します。
そこで、**expectFutureValue()** と **shouldEventually** を組み合わせて、`[[expectFutureValue(ret) shouldEventually] beNonNil];`としてやることで、評価を遅延実行してくれます。
[解説ページ](https://github.com/allending/Kiwi/wiki/Asynchronous-Testing)によると、単純に1秒待ってテストするようです。

処理がもっと長く掛かる場合は、**shouldEventually** の代わりに **shouldEventuallyBeforeTimingOutAfter()** を使います。
また、「2秒経ったらタイムアウトすること」みたいなテストも以下のように書けます。

```objective-c:test.m
SPEC_BEGIN(PropertyUtil)

describe(@"SimpleRemoteObject", ^{
    context(@"read timeout", ^{
        beforeAll(^{
            [SRRemoteConfig defaultConfig].baseurl = @"http://localhost:2000/";
            [SRRemoteConfig defaultConfig].timeout = 2;
        });
        
        it(@"should timeout with specified second", ^{
            __block NSError *ret;
            [TimeoutObj fetchAsync:^(NSArray *allRemote, NSError *error) {
                ret = error;
            }];
            [[expectFutureValue(ret) shouldEventuallyBeforeTimingOutAfter(3.0)] beNonNil];
            [[expectFutureValue(ret.localizedDescription) shouldEventuallyBeforeTimingOutAfter(3.0)] equal:@"The request timed out."];
        });
    });
});

SPEC_END
```

上記だと2秒でタイムアウトを行うようにしているのですが、shouldEventuallyBeforeTimingOutAfter(3.0)を使うことで、3秒間待ってから評価を実行しています。こうすることによって、確実にタイムアウトが発生するようにしているというわけです。
Objective C のコールバックの仕組みまとめ


(参考: Objective-C Programming: The Big Nerd Ranch Guide)

OSX や iOS には、**NSRunLoop** というオブジェクトがいて、そいつがマウスの動作、イベント、タイマー、ネットワークなどを監視している。

何かが発生すると、NSRunLoop は「コールバック」を発生させる。コールバックの種類は３つ。


### Target-Action

「□□イベントが発生したら、○○オブジェクトに△△メッセージを送ってくださいね」

○○ = Target, △△ = Action

### Helper オブジェクト

「お宅のプロトコルに対応した Helper オブジェクトを作っときましたよ。何かあったらここに各種メッセージを送ってくださいね」

Helper オブジェクト = Delegates, Data Sources

### Notification 

「Notification Center さん、このオブジェクトがこんな種類の通知を待ってます。この手の通知が来たら、このメッセージをそいつに送ってやってください」

イベントが発生すると、オブジェクトは通知を Notification Center に送って、Notification Center は通知を待っているオブジェクトにそれを回送する。
Android で Proguard を使う(ADT17以降)


割とハマったのでメモ。

## Proguard.cfg を使う方法はもう古い

* [Androidに統合されたProGuardに関する改善点(ADT17) - Android(アンドロイド)情報-ブリリアントサービス](http://d.hatena.ne.jp/bs-android/20120325/1332662384)
更新日-2012/03/25

にあるように、ADT17 以降では、既定の難読化設定は SDK のディレクトリにありそれを参照するようになっている。
プロジェクト固有の設定は proguard-project.txt に書くように既定で準備されている。

Android proguard でググって出てくる情報は、大抵は Proguard.cfg として説明されているので、その情報は断片的には使えるだろうが、古い情報として注意して参照したほうがよい。


## -libraryjars について
外部ライブラリを使っている(/libs に jar を入れてる)場合、それらを -libraryjars xxx.jar と列挙しなければならないと **思っていた** が不要らしい。

-libraryjars に列挙したら最初の一つしか library jar として認識してくれなくて「なにこれ？」と思ってググったら、

* [Using ProGuard with Android - StackOverflow]
(http://stackoverflow.com/questions/11246842/using-proguard-with-android/11249755#11249755) 回答日-2012/06/28

>1) ProGuard manual > Troubleshooting > Note: duplicate definition of program/library class
>
>The Android Ant/Eclipse builds already specify -injars/-libraryjars for you. If you specify them again in your configuration, ProGuard notes that they are duplicated. So don't specify -injars/-libraryjars.

libs配下は既定で定義済だから proguard-project.txt の方で再定義しなくてよいらしい。

## -dontwarn とか -dontnote とか
* [Proguardでcan't find referenced class - そこはかとなく書くよ。](http://d.hatena.ne.jp/rudi/20110205/1296914415)

「ほんとかなぁ」に同意。warning潰すのがデファクトなツールで良いの？

### (私が)未解決な問題
とあるメソッドの引数 ``Hoge<Piyo> arg``  から、 ``Class#getGenericInterfaces()`` で ``Piyo`` を取得していたのだけど、Proguard かけたら、 ``Hoge<Piyo>`` が ``Hoge`` だけになって取れなくなってしまった。

Java のイレイジャ云々か？とも思ったけど、メソッドの引数ならいけるはずだし…

* [イレイジャではジェネリクスの何が消えるのか](http://blogs.wankuma.com/nagise/archive/2008/10/13/158708.aspx) 

StackOverflow さんによると、

* [Google Drive API doesn't play well with ProGuard (NPE)](http://stackoverflow.com/a/14449289/789062)

``-keepattributes *Annotation*`` をつけるといいよ的な事が書いてあるんだけど、うまくいかなかった。

## 雑感
情報が新旧錯綜してる発展途上なツールを苦労して使って、設定も実装に依存するし(自動化できない)、運用時もデバッグしづらいし、この難読化って作業、コスパどうなんすかね？ 所詮 Webサービスのフロントエンドである Java プログラムに、そこまで難読化にこだわることはないんじゃないかなーという私見です。

## 参考
* [ProGuardで-keepオプションのメモ - superdry memorandum :-D](http://d.hatena.ne.jp/Superdry/20110121/1295641171)
Rails Best Practices | the Law of Demeter

[Rails Best Practices | the Law of Demeter](http://rails-bestpractices.com/posts/15-the-law-of-demeter)

## delegate設定

app/models/item.rb

```rb
  belongs_to :user

  delegate :name, to: :user, prefix: true, allow_nil: true
```

## userが存在しないitem

```rb
Item.first.user.tapp
  Item Load (0.3ms)  SELECT "items".* FROM "items" LIMIT 1
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 0 LIMIT 1
nil
=> nil
```

## delegateを介してuser.nameを呼ぶ

```rb
Item.first.user_name.tapp
  Item Load (0.4ms)  SELECT "items".* FROM "items" LIMIT 1
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 0 LIMIT 1
nil
=> nil
```

## delegateを介さずにuser.nameを呼ぶ

```rb
Item.first.user.name.tapp
  Item Load (0.1ms)  SELECT "items".* FROM "items" LIMIT 1
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 0 LIMIT 1
NoMethodError: undefined method `name' for nil:NilClass
	from (irb):149
	from /Users/shu/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/railties-3.2.12/lib/rails/commands/console.rb:47:in `start'
	from /Users/shu/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/railties-3.2.12/lib/rails/commands/console.rb:8:in `start'
	from /Users/shu/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/railties-3.2.12/lib/rails/commands.rb:41:in `<top (required)>'
	from script/rails:6:in `require'
	from script/rails:6:in `<main>'
```
Mac(Mountain Lion)にMacTeX-2012を入れてみる


さすがに、そろそろ論文を書かなきゃということでTeXを入れる。

**MacTeX**はTeXのGUIソフトのTeXShopとかその他いろいろなものをパッケージしてくれてるものらしい。

##インストール
[ここ](http://tug.org/mactex/ "MacTeX ")でMacTeX.pkg をダウンロードしてきて、インストール。

##Hello World
``hello.tex``を以下の内容で作成

```hello.tex
\documentclass{jarticle}
\begin{document}
Hello, world!
\end{document}
```

ターミナルで

```
$ platex hello.tex
```

※ ``/usr/texbin``にbashのパスが通ってなかったので、``.bashrc``にパスを追加。（[ここ](http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Mac#t244993f "TeX Wiki Mac")には手動でパスを通す必要はないって書いてあったけど・・・。）

これで、``hello.tex``と同じディレクトリに``hello.dvi``、``hello.aux``、``hello.log``の3つのファイルが作成される。

ターミナルで

```
$ dvipdfmx hello.dvi
```

すると、hello.pdfが作成される。


##参照
・[MacTeX 2012 で日本語](http://www.clas.kitasato-u.ac.jp/~fujiwara/MacTeX/ "MacTeX 2012 で日本語")
・[TeX Wiki Mac](http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Mac#t244993f "TeX Wiki Mac")
・[2012年、Mac(Lion)とTeXと日本語と、あとhomebrew](http://toggtc.hatenablog.com/entry/2012/02/20/230500 "2012年、Mac(Lion)とTeXと日本語と、あとhomebrew")
メモ：経験分布から平均、分散を求める

詳しくはこちら → http://rpubs.com/hoxo_m/5093

```r
x <- rnorm(100)

library(pracma)

Fn <- ecdf(x)
xFn <- function(x) x*Fn(x)

SFn <- do.call(quad, c(list(Fn), range(x)))
SxFn <- do.call(quad, c(list(xFn), range(x)))

mean.h <- mean(x)
var.h <- var(x)
sd.h <- sd(x)

mean.t <- max(x) - SFn
var.t <- max(x)^2 - 2* SxFn - mean.t^2
sd.t <- sqrt(var.t)

mean.h
mean.t

var.h
var.t

sd.h
sd.t
```
MSSQLのデータサイズをLINQで求めてみた

完璧に網羅はしていませんが・・・。

```csharp:this
			lbFieldCount.Text = dt.Rows.OfType<DataRow>().Sum( c =>
			{
				int iDec = 0;
				int.TryParse( c["Size"].ToString(), out iDec );
				switch( c["Type"].ToString() ) {
					case "bigint":		return 8;
					case "int":			return 4;
					case "smallmoney":	return 2;
					case "tinyint":		return 1;
					case "numeric":
					case "decimal":
						if( iDec >=  1 && iDec <=  9 )	return  5;
						if( iDec >= 10 && iDec <= 19 )	return  9;
						if( iDec >= 20 && iDec <= 28 )	return 13;
						if( iDec >= 29 && iDec <= 38 )	return 17;
						break;
					case "bit":			return 1;
					case "smallint":	return 4;
					case "money":		return 8;

					case "float":
						if( iDec >=  1 && iDec <= 24 )	return 4;
						if( iDec >= 25 && iDec <= 53 )	return 8;
							break;
					case "real":		return 4;
					case "date":		return 3;
					case "datetimeoffset":
						if( iDec >=  0 && iDec <=  2 )	return  8;
						if( iDec >=  3 && iDec <=  4 )	return  9;
						if( iDec >=  5 && iDec <=  7 )	return 10;
						return 10;
					case "datetime2":
						if( iDec >= 0 && iDec <= 2 )	return 6;
						if( iDec >= 3 && iDec <= 4 )	return 7;
						return 8;
					case "smalldatetime":				return 4;
					case "datetime":					return 8;
					case "time":
						if( iDec >=  0 && iDec <=  2 )	return  3;
						if( iDec >=  3 && iDec <=  4 )	return  4;
						if( iDec >=  5 && iDec <=  7 )	return  5;
						return 5;
					case "char":		return iDec;
					case "varchar":		return iDec + 2;
					case "text":		return 0;//			2147483646;
					case "nchar":		return iDec * 2;
					case "nvarchar":	return iDec * 2 + 2;
					case "ntext":		return 0;//			2147483646;
					case "binary":		return iDec;
					case "varbinary":	return iDec + 2;
					case "image":		return 0;//			2147483646;

					}
				return 0;
			}).ToString();
```

ちなみに ```return 0;//	2147483646;``` は ```return 2147483646;``` としたら落ちたのでやめました。

こんな書き方でいいんでしょうか？
さくらサーバーにJoomla!3.0をインストール


URLのRewriteを設定しないと動かなかった。トップページが表示されるけど、その下は"No input file specified."と表示されて真っ白になってしまう。


www/site

以下にJoomlaをインストール。

```.htaccss
 RewriteBase /site/
```

に設定。

Joomla!の管理画面から「URLリライトの使用」を「はい」にして完了。
これでサイトのページにアクセスできるようになった。
別のgitリポジトリから取ってきたパッチをgit apply/amしたいとき

別のgitリポジトリから持ってきたmbox形式のパッチをapplyで当てるには、--directory=でパッチを当てるディレクトリを指定すると良いみたい。

例。
kernelへのパッチあて

```
$ git apply --directory=kernel path/to/patch
```

androidへのパッチあて

```
$ git apply --directory=android/frameworks/base path/to/patch
```

applyの代わりにamでも同様に使えます。

```
$ git am --directory=kernel path/to/patch
```

```
$ git am --directory=android/frameworks/base path/to/patch
```

コミットメッセージやDate,Authorをそのまま残したい場合はamで、そうでない場合はapplyを使うと良いようです。
Ruby 2.0.0-p0アップデート(Amazon Linux)


* Linuxバージョン確認

```
cat /etc/system-release
----------
Amazon Linux AMI release 2012.09
----------
```

```
cat /proc/version
----------
Linux version 3.2.36-1.46.amzn1.x86_64 (mockbuild@gobi-build-31003) (gcc version 4.6.2 20111027 (Red Hat 4.6.2-2) (GCC) ) #1 SMP Mon Jan 14 04:42:23 UTC 2013
----------
```

* ruby-build更新

```
cd ~/.rbenv/plugins/ruby-build
git pull
```

```
sudo ./install.sh
※パスワード入力
```

```
rbenv install -l | grep 2.0.0-p0
----------
  2.0.0-p0
----------
```

* Ruby2.0.0-p0インストール

```
rbenv install 2.0.0-p0
----------
Downloading ruby-2.0.0-p0.tar.gz...
-> http://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p0.tar.gz
Installing ruby-2.0.0-p0...

Installed ruby-2.0.0-p0 to /home/user_name/.rbenv/versions/2.0.0-p0
----------
```

```
rbenv rehash
```

```
rbenv global 2.0.0-p0
ruby -v
----------
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-linux]
----------
```

```
gem i bundler
----------
Fetching: bundler-1.3.4.gem (100%)
Successfully installed bundler-1.3.4
Parsing documentation for bundler-1.3.4
Installing ri documentation for bundler-1.3.4
Done installing documentation for bundler (7 sec).
1 gem installed
----------
```

```
rbenv rehash
```

```
cd ~/RAILS_APP
bundle install
```
ruby1.9でのruby-debugインストール時のエラーについて

エラーになる場合

```shell
$ gem install ruby-debug

Building native extensions.  This could take a while...
ERROR:  Error installing ruby-debug:
	ERROR: Failed to build gem native extension.

        /Users/kohgami/.rvm/rubies/ruby-1.9.3-p362/bin/ruby extconf.rb
Can't handle 1.9.x yet
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
	--with-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/kohgami/.rvm/rubies/ruby-1.9.3-p362/bin/ruby


Gem files will remain installed in /Users/kohgami/.rvm/gems/ruby-1.9.3-p362/gems/linecache-0.46 for inspection.
Results logged to /Users/kohgami/.rvm/gems/ruby-1.9.3-p362/gems/linecache-0.46/ext/gem_make.out
```

エラーになった場合は、指定を変えてあげる。


```shell
$ gem install ruby-debug19

Fetching: archive-tar-minitar-0.5.2.gem (100%)
Fetching: ruby_core_source-0.1.5.gem (100%)
Fetching: linecache19-0.5.12.gem (100%)
Building native extensions.  This could take a while...
Fetching: ruby-debug-base19-0.11.25.gem (100%)
Building native extensions.  This could take a while...
Fetching: ruby-debug19-0.11.6.gem (100%)
Successfully installed archive-tar-minitar-0.5.2
Successfully installed ruby_core_source-0.1.5
Successfully installed linecache19-0.5.12
Successfully installed ruby-debug-base19-0.11.25
Successfully installed ruby-debug19-0.11.6
5 gems installed
Installing ri documentation for archive-tar-minitar-0.5.2...
Installing ri documentation for ruby_core_source-0.1.5...
Installing ri documentation for linecache19-0.5.12...
Installing ri documentation for ruby-debug-base19-0.11.25...
Installing ri documentation for ruby-debug19-0.11.6...
Installing RDoc documentation for archive-tar-minitar-0.5.2...
Installing RDoc documentation for ruby_core_source-0.1.5...
Installing RDoc documentation for linecache19-0.5.12...
Installing RDoc documentation for ruby-debug-base19-0.11.25...
Installing RDoc documentation for ruby-debug19-0.11.6...

```

成功。


追記。
rvmに対してgem ファイルからインストール

```bash
gem install /tmp/ruby-debug-base19-0.11.26.gem -- --with-ruby-include=/usr/local/rvm/rubies/ruby-1.9.3-p392/include/ruby-1.9.1/ruby-1.9.3-p392/
```
Javascriptでのオブジェクト定義覚え書き#1

Javascriptでのオブジェクト定義方法として、prototypeチェーンを使うのが一般的。

多少の変形があるが、おおよそは下記のような構造での継承の仕組みをCoffeeScriptのようなトランスレータやPrototype.js, jQueryのようなフレームワークなどでも使用している
（CoffeeScriptなどでは直接規定オブジェクトのインスタンスを生成せず、継承の実現方法にいわゆる「extend」関数を使っているはず）

- コンストラクタ関数を定義
 - 継承にて基底オブジェクトとして使用する場合、引数0個でのオブジェクト生成できるようにするのがよさそう
 - ECMAScript 5th対応であれば、Object.create(MyObject.prorotype)でもよい。
- (派生オブジェクトを作る場合)
 - prototypeプロパティに基底オブジェクトのインスタンスを作成し、設定する。
 - prototype.constructorプロパティにコンストラクタ関数を設定する。
- prototypeプロパティにインスタンスメソッドとして関数オブジェクトを追加する

CoffeeScriptなどでは対処されているが、下記のような手動での継承方法では

1. **staticメソッド相当の関数を派生オブジェクト側で取り込んでいない**
 - `MyObject.static_methodをMyObjectDerived.static_methodとしてcallできない
2. **継承を実現するための仕組みをコードを書く側が常に意識して記述しないといけない**
 - コンストラクタ関数のarguments.length == 0の場合の特別扱い
 - 派生オブジェクト側での\_\_chain__変数定義、
 - 派生オブジェクト側でのprototype.constructorの復元

```javascript:plain_old_derived.js

var MyObject = (function() {
    function MyObject(aName){
        this.name = "";
        if (arguments.length > 0) {
            this.name = aName;
        }
    }
    
    MyObject.prototype.sayHello = function () {
        alert("Hello! " + this.name);
    }
    
    return MyObject;
})();

var MyObjectDerived = (function() {
    function MyObjectDerived(aName, aNumber){
        this.name = "";
        this.number = 0;
        
        if (arguments.length > 0) {
            this.name   = aName;
            this.number = aNumber;
        }
    }
    
    // 「extend」関数相当
    var __chain__ = MyObject.prototype;
    MyObjectDerived.prototype = new MyObject;
    MyObjectDerived.prototype.constructor = MyObjectDerived;

    MyObjectDerived.prototype.sayHello = function () {
        __chain__.sayHello.call(this);
        
        for (var index = 0, length = this.number; index < length; ++index) {
            alert("Goodbye! " + this.name);
        }
    }
    
    return MyObjectDerived;
})();

var o1 = new MyObject("name 1");
o1.sayHello();

var o2 = new MyObjectDerived("name 2", 1);
o2.sayHello();


```
svn2gitでsvn側が更新された場合の対処

gitに移行したいけど、まだsvn側でのcommitが続くときの話。

git側でリモートbranch扱いになっているのを確認

```
git branch -r
  svn/trunk
```

git側で該当ローカルブランチを作成

```
git checkout -b svn-trunk svn/trunk
```

ブランチにいるのを確認してsvn fetchしてmergeすれば最新にかわるよ！

```
git branch
* svn-trunk
git svn fetch
git merge svn/trunk
```

masterにmergeしたければmaster branch からgit merge svn-trunkでどうぞ。
pListファイルを書き換え可能な状態で辞書に読み込む

pListファイルは、以下のようにNSDictionaryに簡単に読み込むことが可能です。

NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:@"ファイルパス"];

しかしながら、NSDictionaryはimmutableなオブジェクト、つまり書き換え不可能なクラスなので、中身を編集したい、という用途ではいちいち作り直さないといけません。
しかも必要であれば表面だけでなく再帰的にやらないといけません。

できることなら読み込んだ瞬間からmutableでやりたいですね。パフォーマンス的にも、コードのシンプルさとしても。

というわけで方法があります。

```

NSString *errorDesc;
NSMutableDictionary *dic = [NSPropertyListSerialization propertyListFromData:[NSData dataWithContentsOfFile:@"ファイルパス"]
                                                                                              mutabilityOption:NSPropertyListMutableContainers
                                                                                                              format:nil 
                                                                                               errorDescription:&errorDesc];

```

この方法の良いところは、再帰的に内部のコンテナを全部編集可能な(Mutableな）クラスで読み込んでくれるという点です。
NSDictionaryではなく、NSMutableDictionary
NSArrayではなく、NSMutableArray
にしてくれるわけです。

NSPropertyListMutableContainersがその指定です。
指定するフラグはもう数種類あるので確認してみると良いとおもいます。
boost::threadでUndefined symbolsが出た

boost::threadをインクルードしようとしたら
Undefined symbolsとか出てきたのでメモ．

解決法

```basemake:Makefile
...
$(GPP) $(OBJS) -o $(PROGRAM) $(INCLUDEPATH) $(LIB) -lboost_system -lboost_thread
...
```

property_treeとかはリンク指定しなくてもいけたのに．
LaravelでDecryption error. Padding is invalid. とエラーが出た時の対処法

Laravelで開発しているとたまに、 Unhandled Expection Decryption error.Padding is invalid. というエラーメッセージが表示されることがあります。

やっかいなことに、これが一度でてしまうと別の画面を開いても同じエラーが表示されてしまい、全然動かなくなってしまいます。

セッションのCookieを消すことでまた復活するのですが、そんなことまさかユーザにお願いできないし、そもそも自分でも面倒です。

そういうかんじでこの問題は結構クリティカルです。

というわけで対処法。

```php:application/config/session.php
'driver' => 'file'
```

セッションの管理をCookieからファイルに変えるだけ。簡単です。

http://laravel.com/docs/session/config
こちらを読むとCookieは４キロバイトの制限があるからデータを沢山扱う場合にはCookie以外の方法を選択してね、ということだったようです。
もっと重いトラフィックの場合は、DBかMemcachedを使いなさいとのこと。

参考URL
http://forums.laravel.io/viewtopic.php?id=4410
ElasticSearch で kuromoji を使う (ES 0.90.Beta1 + kuromoji 1.2.0篇)


なんか ES + kuromoji の使い方のドキュメントが古かったりしたので防備録。ES 0.90.Beta1 + kuromoji 1.2.0 の話しです。なおこの情報もすぐ古くなるかもしれないので注意な！

# インストール
適当に

```
brew install https://gist.github.com/hotchpotch/5133549/raw/bdeea58fa72c33f74131f27ec78758556182d7ba/elasticsearch.rb
/usr/local/opt/elasticsearch/bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/1.2.0
```

# kuromoji
各種インターネッツのドキュメントには analyzer や tokenizer を analysis で指定してますが、ソースコードを見ると必要はありません。

- https://github.com/elasticsearch/elasticsearch-analysis-kuromoji/blob/master/src/main/java/org/elasticsearch/plugin/analysis/kuromoji/AnalysisKuromojiPlugin.java#L51

```java
module.addAnalyzer("kuromoji", KuromojiAnalyzerProvider.class);
module.addTokenizer("kuromoji_tokenizer", KuromojiTokenizerFactory.class);
module.addTokenFilter("kuromoji_baseform", KuromojiBaseFormFilterFactory.class);
module.addTokenFilter("kuromoji_part_of_speech", KuromojiPartOfSpeechFilterFactory.class);
module.addTokenFilter("kuromoji_readingform", KuromojiReadingFormFilterFactory.class);
module.addTokenFilter("kuromoji_stemmer", KuromojiKatakanaStemmerFactory.class);
```

と plugin ですでに kuromoji という analyzer, kuromoji_tokenizer という tokenizer が指定してあります。そのため別途 analysis を指定する必要はありません。

```
$ curl -XPUT 'localhost:9200/kuromoji_checker/' -d '{}'
{"ok":true,"acknowledged":true}
$ curl -XGET 'localhost:9200/kuromoji_checker/_analyze?analyzer=kuromoji&pretty' -d '関西国際空港'
{
  "tokens" : [ {
    "token" : "関西",
    "start_offset" : 0,
    "end_offset" : 2,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "関西国際空港",
```

# ハマったところ
index の mapping で analyzer を指定するとき、すべての analyzer に kuromoji 指定してない場合、検索クエリで match:_all 的なクエリを発行するときに、日本語だけ引っかからない現象が発生します。

例
- body は analyzer: 'kuromoji'
- created_at は analyzer 指定無し

この場合、match:_all なクエリで 'hello' のような場合は引っかかりますが、'こんにちは' では引っかかりません。対処法としては、default の analyzer を kuromoji に指定するか、match で適切に match: body のように設定する必要があります。
sbt 実行時に文字コードを UTF-8 に設定する

先日、久しぶりに scala + sbt でコードを書いていたら、どうにも compile が通らないという事態がありまして。

状況としては、JVM のデフォルトの文字コードが SJIS やらだったがために、UnmappableCharacterException が発生してしまっていたというもの。

```
   java.nio.charset.UnmappableCharacterException: Input length = 2
at java.nio.charset.CoderResult.throwException(CoderResult.java:261)
...
```

java実行時のオプションとして、文字コード UTF-8 を指定することで解決しました。

>-Dfile.encoding=UTF-8

sbt 起動する度にオプションで指定するのも微妙なので、sbt の設定ファイルに記述しておくことに。

#### Windows

コンソールからデフォルトの設定を確認。
Scala 2.9.2 + sbt 0.12.2

```
$ sbt console

scala> scala.io.Codec.default.charSet
res0: java.nio.charset.Charset = windows-31j
```

sbt/sbtconfig.txt に

>-Dfile.encoding=UTF-8

を追加。

```sbt/sbtconfig.txt
# Set the java args to high

-Dfile.encoding=UTF-8  

-Xmx512M

-XX:MaxPermSize=256m

-XX:ReservedCodeCacheSize=128m



# Set the extra SBT options

-Dsbt.log.format=true
```

設定できているか確認。

```
$ sbt console

scala> scala.io.Codec.default.charSet
res0: java.nio.charset.Charset = UTF-8
```


#### Mac

(3/22 追記)
コメントで指摘していただいたように、起動スクリプトを直接いじるよりは ~/.sbtconfig に設定を記述するほうがスマートだと思います。

 http://d.hatena.ne.jp/Yoshiori/20111212/1323691923

(追記ここまで)

コンソールからデフォルトの設定を確認。
Scala 2.10.0 + sbt 0.12.1

```
$ sbt console

scala> scala.io.Codec.default.charSet
res0: java.nio.charset.Charset = Shift_JIS
```

sbt 実行ファイル内に

>-Dfile.encoding=UTF-8

を追加。

```/usr/local/bin/sbt
#!/bin/sh
test -f ~/.sbtconfig && . ~/.sbtconfig
exec java -Dfile.encoding=UTF-8 -Xmx512M ${SBT_OPTS} -jar /usr/local/Cellar/sbt/0.12.1/libexec/sbt-launch.jar "$@"
```

確認は Win と同様に。



Java周りの設定に不慣れなのもあって結構寄り道しちゃったけども、解決方法を調べるのは楽しかった。
これで本筋に戻れる！
Homebrewを使ってrubyでmecab(形態素解析用ツール）を使えるようにする（Mac OS X Lion）

まずはmecab-rubyを使うためにmecab関連のパッケージを検索

>$ brew search mecab
mecab mecab-ipadic

調べてみると上で出てきた２つは必要らしいので２つともインストール

>$ brew install mecab
$ brew install mecab-ipadic

以上でterminal上でmecabは使えるようになった。

>$ mecab
>何て日だっ！
>
何	名詞,代名詞,一般,*,*,*,何,ナニ,ナニ
て	助詞,格助詞,連語,*,*,*,て,テ,テ
日	名詞,非自立,副詞可能,*,*,*,日,ヒ,ヒ
だっ	助動詞,*,*,*,特殊・ダ,連用タ接続,だ,ダッ,ダッ
！	記号,一般,*,*,*,*,！,！,！
EOS

次にrubyで使えるようにmecab-rubyをインストールします。

rubyのversion確認

>$ ruby -v
ruby 1.9.3p362 (2012-12-25 revision 38607) [x86_64-darwin12.2.0]

gemを検索

>$ gem search -r mecab-ruby

でヒットしないのでソースを落としてきます。
[Google Code](https://code.google.com/p/mecab/downloads/list)のリストで最新版を確認してダウンロードします。

>$ curl -o mecab-ruby-0.996.tar.gz https://mecab.googlecode.com/files/mecab-ruby-0.996.tar.gz

tarファイルを解凍してbuildからinstallまでしてみる。

>$ tar -zxvf mecab-ruby-0.99.tar.gz
>$ cd mecab-ruby-0.994
>$ gem build mecab-ruby.gemspec
>$ gem install mecab-ruby-0.99.gem

とするとエラーが出ます。

どうやらmecabの0.996はコンパイルが上手くいかないらしいので、0.994をインストール

>$ curl -o mecab-ruby-0.994.tar.gz https://mecab.googlecode.com/files/mecab-ruby-0.994.tar.gz

extconf.rbの$CFLAGS下に

```extconf.rb
$CFLAGS += ' ' + `#{mecab_config} --cflags`.chomp
$LDFLAGS = '-L/usr/local/lib'
have_header('mecab.h') && create_makefile('MeCab')
```

を追記

そして

>$ ruby extconf.rb
$ sudo make install

とすると上手くいきました。
ということで動作確認
test.rbファイルが自動生成されているので

>ruby test.rb

とすると上手く出力されました。



##参考サイト
・[mecab-rubyを使ってみた](http://d.hatena.ne.jp/shio_chan/20110814/1313248077)

・[Ubuntu 10.04でMeCabをRubyから使えるようにする](http://d.hatena.ne.jp/mickey24/20120506/ubuntu_mecab_ruby)

・[[Mac][MeCab]snow leopardにmecabとrubyバインディングインストール](http://d.hatena.ne.jp/shokai/20110114/1295022616)
FuelPHP ルーティングで管理画面とアプリの共存


運用方法によって賛否両論ですが、アプリの設定ファイルを管理画面でも参照したい場合にアプリと管理画面を同一のリポジトリに同居させたい場合があるのでそういう場合の設定をルーティングとenvの切り替えで実現するためのメモ

## 環境

* centos6.3
* fuelPHP1.5.3

## 事前準備に必要なもの
* php5.3以上
* mysql
* fuelPHPがインストール済みであること　していない場合は[CRUDを作った時のメモ(インストールからCRUD作成まで)](http://qiita.com/items/ae107a96699745a02560)を参考に作成してください

## 参考にしたサイト
* [日本語版ドキュメント(1.5ドキュメント)](http://fuelphp.jp/docs/1.5/)


## bootstrap.phpに環境変数にadmin_developmentを追加する

fuelPHPのデフォルトの環境変数はdevelopment,test,staging,productionの４つですがそれ以外に追加しても（今回の例ではadmin_development,admin_production）configなどは環境変数名でオーバーライドしてくれます。
環境変数をbootstrap.phpに定義してみます

```php:fuel/app/bootstrap.php
Fuel::$env = (isset($_SERVER['FUEL_ENV']) ? $_SERVER['FUEL_ENV'] :'admin_development');
```

## 設定ファイル(fuel/app/config/admin_development/db.php)の作成

今回はサンプルでCRUD環境を作成するのでfuel/app/config/admin_development/db.phpを作成します。

```php:fuel/app/bootstrap.php
<?php
return array(
	'default' => array(
		'type' => 'mysqli',
		'connection'  => array(
			'hostname' => 'ホスト名',
			'port' => 'ポート名',
			'database' => 'データベース名',
			'username'   => 'ユーザ名',
			'password' => 'パスワード',
			'presistent' => false
		),
		'enable_cache' => false,
		'profiling' => true,
	),
);

```

## ルーティング設定ファイルの編集

ルーティングの設定でenvがadmin_development又はadmin_production以外の場合は例外を出力するように設定します

```php:fuel/app/config/routes.php
<?php
return array(
	'_root_'  => 'welcome/index',  // The default route
	'_404_'   => 'welcome/404',    // The main 404 route
	//追加する
	'admin' => function (){
		if (\Fuel::$env != 'admin_development' || \Fuel::$env != 'admin_production')
		{
			throw new HttpNotFoundException('not found');
		}
		return \Request::forge('admin/$1', false)->execute();
	},
);
```


## サンプルでCRUD環境を作る

```shell
php oil g scaffold admin name:string description:text
	Creating migration: /home/web/lo.fuel.master.org/fuel/app/migrations/003_create_admins.php
	Creating model: /home/web/lo.fuel.master.org/fuel/app/classes/model/admin.php
	Creating controller: /home/web/lo.fuel.master.org/fuel/app/classes/controller/admin.php
	Creating view: /home/web/lo.fuel.master.org/fuel/app/views/admin/index.php
	Creating view: /home/web/lo.fuel.master.org/fuel/app/views/admin/view.php
	Creating view: /home/web/lo.fuel.master.org/fuel/app/views/admin/create.php
	Creating view: /home/web/lo.fuel.master.org/fuel/app/views/admin/edit.php
	Creating view: /home/web/lo.fuel.master.org/fuel/app/views/admin/_form.php
```

## マイグレーション(migrate)の実行


```shell
php oil refine migrate
```

## http://localhost/adminにアクセスする

CRUD画面が表示されてcreate,read,update,delete画面が表示されてるはずです。


## bootstrap.phpの値をdevelopmentに戻してアクセスしてみる

```php:fuel/app/bootstrap.php
Fuel::$env = (isset($_SERVER['FUEL_ENV']) ? $_SERVER['FUEL_ENV'] : Fuel::DEVELOPMENT);↲
```

http://localhost/adminにアクセスするとエラー画面に表示されるはずです。

実際の運用レベルですとfuel/app/bootstrap.phpにenvの記載をするのではなく
apache又はnginx側でenvを設定すればソースをいじらずにアプリ側と管理画面側でリポジトリを共有できます。
わたしたちがDDDを実践するに当たってDoctrineをやめようと決断した動機


断り書き:自分たちがやりたいDDDにDoctrineが必ずしも向いていないという判断をしたものです。Doctrineには非常にお世話になっており、批判するものではありません。どのツールにも適材適所があると思います。

* 機械的なORMでエレガントに表現できないものがあった（ValueObjectなど）

* Entityが1テーブルに固く対応していて、さらにその知識がインフラストラクチャレイヤからドメインレイヤに漏れ出していて、密結合が発生していた

* Doctrineロックから脱出したい。Domain ServiceはRepositoryに依存しており、RepositoryはDoctrineに依存している。Doctrineが破滅への道を歩めば、アプリの心臓であるDomainも道連れとなる。

* ストレージロックを脱出したい。ドメインレイヤがある具体的なRepositoryに依存していると、簡単にストレージを交換することができない。

* インフラストラクチャレイヤはドメインレイヤに依存すべきと学んだ（ここが一番おおきな転換点）。普通の伝統的な設計では、下記図のような依存関係を作る。

![](https://dl.dropbox.com/u/949822/qiita.com/130319-stop-doctrine/1.jpg)

このままでは、インフラレイヤの呪縛から逃れられない。[Implementing Domain-Driven-Design] では下記図のように、依存関係を逆転させること、Dependency Inversion Principle*1を実践することを強く提唱している。

![](https://dl.dropbox.com/u/949822/qiita.com/130319-stop-doctrine/2.jpg)

Doctrine ORMを使っている限り、ドメインはインフラに依存しつづけるので、Doctrine ORMはやめて、独自でRepositoryを作ることにした。

このアーキテクチャでは、初期工程でストレージについて一切議論しない。ストレージなんてMySQLだろうがMongoDBだろうがなんでもいい、そんつぁもん一番 後に決めればいいねっか！ポッペンディークも[Lean Software Development]で「決定を遅らせる」ことはいいことだと言っている。

その代わり、最も重要なドメインを先に設計し、ドメインがインフラに対して必要とするインターフェイスを定義する。最後の工程で、インフラはそのインターフェイスにしたがって、必要なリソースを提供できるストレージを選択する。

----------------------

*1 Dependency Inversion Principle は、ロバート・C・マーチンが提唱している、セパレートインターフェイス[[Fowler, PoEAA]]を使った依存関係の逆転を行う指針だ。同氏は他にも同様の指針を、SOLID (SRP, OCP, LSP, ISP, DIP)として定義している。


[Implementing Domain-Driven-Design]: http://www.amazon.co.jp/gp/product/0321834577?ie=UTF8&camp=1207&creative=8411&creativeASIN=0321834577&linkCode=shr&tag=suinyeze-22&=english-books&qid=1363623102&sr=1-1
[Fowler, PoEAA]: http://www.amazon.co.jp/gp/product/4798105538?ie=UTF8&camp=1207&creative=8411&creativeASIN=4798105538&linkCode=shr&tag=suinyeze-22
[Lean Software Development]: http://www.amazon.co.jp/gp/product/482228350X?ie=UTF8&camp=1207&creative=8411&creativeASIN=482228350X&linkCode=shr&tag=suinyeze-22
第9回オフラインリアルタイムどう書くの参考問題をScalaで解く

問題はこちら。
http://qiita.com/items/7c46e8409c456e8fabd1

Ruby版
http://qiita.com/items/68e0bfd3f3933b464db7
を、ほぼそのまま移植。

```scala
object Main extends App{
	
  def solve(q:String):String = {
    val divQ = q.split(":")
	val pos = divQ.first.toInt
	val ns = divQ.last.map{c => if(c=='6') List(6,9) else List(c.toString.toInt)}.flatten
	val num6 = ns.count(_==6)
	val pm = ns.permutations
	           .toList
	           .filter(_(0) != 0)
	           .map(_.take(4))
	           .filter(_.count(n => n==6 || n==9)<=num6)
	           .map(_.mkString)
	           .sortBy(x=>x)
	           .distinct
	if(pm.size<pos) "-" else pm(pos-1)
  }

  probs.split("\n").foreach(line => line.split("\\s+").toList match {
	case List(no,q,a) => {
	  var ans = solve(q)
	  println(no + "\t" + ans + "\t" + (if(ans==a) "o" else "x"))
	}
	case _ =>
  })

  def probs =
  """
0	13:01167	1109
1	1:1234	1234
2	2:1234	1243
3	7:1234	2134
  """
}
```
フォーム中の全テキストボックスに条件付き書式を一括設定


[フォームでフォーカスされているコントロールの書式を変更する](http://www.moug.net/tech/acopr/0051002.html)


などで紹介されているように、フォーム中のテキストボックスには「フィールドにフォーカスがあれば背景色を変える」のような条件付き書式を設定できる。ちょうど jQuery の .focus イベントで実現できるような「クリックしたテキストボックスは背景色が変わる」のようなイメージ。

あるフォームにたくさん(*)テキストボックスがある場合、これらに一括でこの条件付き書式を設定したいことがある。通常は：

- GUI 上でテキストボックスをマウスクリックで（複数）選択
- 書式メニューから条件付き書式を選択して希望の条件を設定

となるのだけれど、(*)数が多いと面倒だし、設定後に色を変えたくなったりした場合はさらに面倒。

これを VBA で楽して設定する方法がこちら（acFieldHasFocus がポイント、バージョン 2000 以降なら有効と思います）：

```vbnet:単票形式、非連結「フォーム1」のテキストボックスとコンボボックスに「フォーカスのあるフィールド」条件付き書式を設定
Sub Form_Load()
Dim ctl As Control
  ' フォーム1にある全コントロールが対象
  For Each ctl In Me.[フォーム1].Controls
  With ctl
    ' テキストボックスまたはコンボボックスの場合
    If .ControlType = acTextBox Or .ControlType = acComboBox Then
      ' いったん条件付き書式を削除
      ctl.FormatConditions.Delete
      ' 「フォーカスのあるフィールド」条件付き書式を設定
      ctl.FormatConditions.Add (acFieldHasFocus)

      With ctl.FormatConditions(0)
        .BackColor = RGB(100, 100, 255) ' 青色 
        ' 他に設定したい書式があればここに
      End With
    End If
  End With
  Next ctl
End Sub
```

#### 参考
[jQueryを使って入力フォームでフォーカス時に背景色を変えるスクリプトのサンプル](http://black-flag.net/jquery/20110223-2654.html)

```css
.focus {
	background: #ccccff;
}
```

```js:JavaScript
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
	$('input[type=text],textarea').focus(function(){
		$(this).addClass('focus');
	}).blur(function(){
		$(this).removeClass('focus');
	});
});
</script>
```
フォーム中の全テキストボックスに条件付き書式を一括設定

[フォームでフォーカスされているコントロールの書式を変更する](http://www.moug.net/tech/acopr/0051002.html)

などで紹介されているように、フォーム中のテキストボックスには「フォーカルのあるフィールドであれば背景色を変える」のような条件付き書式を設定できる。ちょうど jQuery の .focus イベントで実現できるような「クリックしたテキストボックスは背景色が変わる」のようなイメージ。

あるフォームにたくさん(*)テキストボックスがある場合、これらに一括でこの条件付き書式を設定したいことがある。通常は：

- GUI 上でテキストボックスをマウスクリックで（複数）選択
- 書式メニューから条件付き書式を選択して希望の条件を設定

となるのだけれど、(*)数が多いと面倒だし、設定後に色を変えたくなったりした場合はさらに面倒。

これを VBA で楽して設定する方法がこちら（acFieldHasFocus がポイント、バージョン 2000 以降なら有効と思います）：

```vb:単票形式、非連結「myForm1」のテキストボックスとコンボボックスに「フォーカスのあるフィールド」条件付き書式を設定
Sub Form_Load()
Dim ctl As Control
  ' myForm1 にある全コントロールが対象
  For Each ctl In Me.[myForm1].Controls
  With ctl
    ' テキストボックスまたはコンボボックスの場合
    If .ControlType = acTextBox Or .ControlType = acComboBox Then
      ' いったん条件付き書式を削除
      ctl.FormatConditions.Delete
      ' 「フォーカスのあるフィールド」条件付き書式を設定
      ctl.FormatConditions.Add (acFieldHasFocus)

      With ctl.FormatConditions(0)
        .BackColor = RGB(100, 100, 255) ' 青色 
        ' 他に設定したい書式があればここに
      End With
    End If
  End With
  Next ctl
End Sub
```

#### 参考
[jQueryを使って入力フォームでフォーカス時に背景色を変えるスクリプトのサンプル](http://black-flag.net/jquery/20110223-2654.html)

```css
.focus {
	background: #ccccff;
}
```

```html:JavaScript
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
	$('input[type=text],textarea').focus(function(){
		$(this).addClass('focus');
	}).blur(function(){
		$(this).removeClass('focus');
	});
});
</script>
```
C99 の bool と int の振る舞い

C99 でようやく bool型 ( _Bool 型 ) が導入された。
わざわざ導入されたからにはやはり int とは振る舞いが異なる。

```c:c99bool.c
//  compiled with "-std=c99"

#include <stdio.h>
#include <stdbool.h>

int main()
{
    bool boolval=2; // _Bool型 に 0 以外の値を入れると 1 になる。
    printf( "%d\n", boolval ); //=> 1
    ++boolval; // ++ はエラーにならないが、1のまま。
    printf( "%d\n", boolval ); //=> 1
    --boolval; // 1 に対して -- すると、0 になる。
    printf( "%d\n", boolval ); //=> 0
    --boolval; // 0 に対して -- しでも -1 にはなれないので、1 になる。
    printf( "%d\n", boolval ); //=> 1
    boolval ^= 5; // ビットの順序とは関係なく「0以外を代入すると1になる」ので、1になる。
    printf( "%d\n", boolval ); //=> 1
    boolval<<=1; // シフトでも「0以外を代入すると1になる」というルールにより、1になる。
    printf( "%d\n", boolval ); //=> 1
    boolval = 0.01; // (int)0.01 は 0 だが、bool に入れると 1 になる。
    printf( "%d\n", boolval ); //=> 1

    return 0;
}
```

`_Bool` 型の変数は、値が 0 か 1 のいずれかにしかならない。
`BOOL` 型の引数が 0, 1 以外の値を取りうることを利用したコードを見てぐったりしたことがあるが、`_Bool` ならそういう心配がない。

桁あふれした場合の動作が他の整数型と違うので、そこに注目すると気持ち悪い感じもするが、よく考えるとまあこうする他ない。と思う。
Ethna_MailSenderの旧字対応

EthnaでEthna_MailSenderを使ってメール送信したら「髙」（高の旧字）が出ない！！
文字化けとかじゃなくてブランクになる！
でハマって色々ぐぐったけど調べるのが下手なのか解決できず。。。
結局Ethna_MailSender.phpを直接いじるという。。。

Ethna_MailSender.phpの_parseの262行目らへんで

$body = mb_convert_encoding($body, "ISO-2022-JP");

あれ？

http://www-01.ibm.com/support/docview.wss?uid=swg21465915
「髙」は Shift JIS コードに含まれていないため、ISO-2022-JP で表現できる文字ではありません。

Σ(・∀・；)

$body = mb_convert_encoding($body, "utf-8");

に変更して、無事旧字も送れるようになりました〜！

subjectに「髙」が入ってたら。。。
もう調べるの疲れたんでほっときます。。。


追記　2013年3月19日

メールが文字化けする！！っていうんでよくよく見たら、188行目の
$attach === null ? 'text/plain; charset=iso-2022-jp'
を
$attach === null ? 'text/plain; charset=utf-8'
に変換しておかないとダメでした。。。

添付ファイルある場合を試してないけど、140行目の
"Content-Type: text/plain; charset=iso-2022-jp\n" 
も修正しないとなのかな〜
Objective-C 例外処理(try-catch-finally)


例外処理のtry-catch-finallyの流れの確認です。

## サンプルコード

NSMutableStringで範囲外の例外を起こします。

```objectivec:Test.m
- (void)test
{    
    NSMutableString *str = [@"01234" mutableCopy];
    
    /* 常に実行される */
    @try {
        // 範囲外の例外(NSRangeException)を起こす
        [str replaceCharactersInRange:NSMakeRange(0, 6) withString:@"x"];
        NSLog(@"%@", str); // 01234 (リプレースされないでそのまま)
     }

    /* 例外が起きると実行される */
    @catch (NSException *exception) {
        NSLog(@"[ERROR]\nstr[%@]\nexception[%@]", str, exception);

        /* 本来の例外処理に投げる (@throwしなければクラッシュされない。@finallyが実行されstrは元の@"01234"の値のまま) */
        @throw exception;
        /* @finallyが実行された後に本来の例外ログが表示されクラッシュ
         
            *** Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFString replaceCharactersInRange:withString:]: Range or index out of bounds'
            *** First throw call stack:
            (0x1c8d012 0x10cae7e 0x1c8cdeb 0x1ce94ca 0x2f61 0x10de705 0x15920 0x158b8 0xd6671 0xd6bcf 0xd5d38 0x4533f 0x45552 0x233aa 0x14cf8 0x1be8df9 0x1be8ad0 0x1c02bf5 0x1c02962 0x1c33bb6 0x1c32f44 0x1c32e1b 0x1be77e3 0x1be7668 0x1265c 0x2b4d 0x2a75)
            libc++abi.dylib: terminate called throwing an exception
         
         */
    }

    /* 常に実行される */
    @finally {
        NSLog(@"*** finally ***");
    }
    
    NSLog(@"check"); // 実行されない
}
```

### おまけ
try-catch-finallyは実行コストが高いので、DEBUG時のみ実行したいときは下記のように書けばいいかと思います。

```objectivec:Test.m
- (void)test
{    
    NSMutableString *str = [@"01234" mutableCopy];
    
    /* 常に実行される */
#if DEBUG
    @try {
#endif
        // 範囲外の例外(NSRangeException)を起こす
        [str replaceCharactersInRange:NSMakeRange(0, 6) withString:@"x"];
        NSLog(@"%@", str); // 01234 (リプレースされないでそのまま)
#if DEBUG
     }
    /* 例外が起きると実行される */
    @catch (NSException *exception) {
        NSLog(@"[ERROR]\nstr[%@]\nexception[%@]", str, exception);

        /* 本来の例外処理に投げる (@throwしなければクラッシュせずに@finallyが実行されstrは元の@"01234"の値のまま) */
        @throw exception;
        /* @finallyが実行された後に本来の例外ログが表示されクラッシュ
         
            *** Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFString replaceCharactersInRange:withString:]: Range or index out of bounds'
            *** First throw call stack:
            (0x1c8d012 0x10cae7e 0x1c8cdeb 0x1ce94ca 0x2f61 0x10de705 0x15920 0x158b8 0xd6671 0xd6bcf 0xd5d38 0x4533f 0x45552 0x233aa 0x14cf8 0x1be8df9 0x1be8ad0 0x1c02bf5 0x1c02962 0x1c33bb6 0x1c32f44 0x1c32e1b 0x1be77e3 0x1be7668 0x1265c 0x2b4d 0x2a75)
            libc++abi.dylib: terminate called throwing an exception
         
         */
    }
    /* 常に実行される */
    @finally {
        NSLog(@"*** finally ***");
    }
#endif
    NSLog(@"check");
}
```

## 参考
http://www.tetsuyanbo.net/tetsuyanblog/9885
再帰 with promise pattern

* ふと思いついたのでメモ代わりに
* promiseの実装としてjQuery.Deferredを使用

```javascript
function fact(n) {
  var d = $.Deferred();
  setTimeout(function() {
    function onResolved(result) {
      d.resolve(result * n);
    }
    n > 1 ? fact(n - 1).then(onResolved) : d.resolve(n);
  }, 100);
  return d.promise();
}

fact(5).then(console.log.bind(console)); // 120
```

---

追記(非同期じゃなくても書けた)

```javascript
function fact(n) {
  var d = $.Deferred();
  n > 1 ?  fact(n -1).then(function(result) { d.resolve(result * n) }) : d.resolve(n);
  return d.promise();
}

fact(5).then(console.log.bind(console)); // 120
```

でも普通はこう書く

```js:
function fact(n) {
  return $.Deferred().resolve(function fact(n) {
    return n > 1 ? fact(n - 1) * n : n;
  }(n));
}
```

一般的にPromiseを返す関数にしたければ

```js:
function toPromise(fn) {
  return function() {
    var d = $.Deferred();
    try {
      d.resolve(fn.apply(null, arguments));
    } catch (e) {
      d.reject(e);
    }
    return d.promise();
  };
}

toPromise(function fact(n) { return n > 1 ? fact(n - 1) * n : n })(5).then(console.log.bind(console));
```
QuickFixを使う

vimgrepやmakeなどの結果をQuickFixで表示させることが多いのですが、検索結果を表示するためにいちいちcopenを打つのは面倒です。QuickfixCmdPostに書くと良いらしいです。

```vim:.vimrc
autocmd QuickfixCmdPost make,vimgrep copen
```

あと、Quickfixのウィンドウだけ最後になってしまうことがあり、どうにかならないのかなと思って調べてみた。下の例は、画面が1個でそのバッファがquickfixなら閉じるという結構強引な感じで書いてます。いい方法ありますか?

```vim:.vimrc
function s:QuickFix_Exit_OnlyWindow()                                            if winnr('$') == 1 
    if (getbufvar(winbufnr(0), '&buftype')) == 'quickfix'
      quit
    endif
  endif
endfunction
autocmd WinEnter * call s:QuickFix_Exit_OnlyWindow()
```
ざっとhelpなどを読んだものをまとめると、winnr('$')は現在表示中の画面数です。
Quickfixのhelpを読むとbuftypeに'quickfix'という名前がついていると書いてあったので↑のようにしてみた。ざっと動かした感じでは、大丈夫そうでしたので、これから使い込んでいこうと思います。
XcodeのアップデートでMacrubyのIB接続が不具合になったときの解決法

MacrubyをXcode環境で開発をしている状況で、Xcodeをアップデートすると、 インターフェースビルダー(InterfaceBuilder,IB)のアクションやアウトレット接続がエラーになる。新規にAppDelegate等のアクセサをリンクづけることもできなくなる。今回はXcode 4.6 から4.6.1にバージョンアップしたときにこの問題に遭遇したが、他のバージョンでも同様な問題があるよう。この問題は

1. Xcodeのバージョンアップ
2. Macrubyの再インストール(pkgからふつうにインストール)
3. コンピュータの再起動

で解決できる。英語サイトではちらほら指摘されているようだけど、日本語サイトですぐにたどり着けなかったので、ここにメモしておく。
Linuxで半角/全角キーで日本語入力できない

我が家では、Fedora17を使ってます。入力切り替えには、i-busというものを使っています。yum updateなどするとたまに発生する問題なのですが、タイトル通り、半角/全角キーで日本語入力できなくなってしまうことがあります。i-busでは、<Control>-Spaceがデフォルトの文字入力の変換キーに割り当てられているようです。i-busの設定に「Zenkaku_Hankaku」を追加することで、上記問題が解決しました。
Setup nginx with virtual server on ubuntu


## Install nginx

```bash
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install nginx
```

## Start nginx service

```bash
$ sudo service nginx start
```

## Make sure nginx will start after server reboot

```bash
$ sudo update-rc.d nginx defaults

# should see sth like:
# System start/stop links for /etc/init.d/nginx already exist.
```

## Configuration for virtual servers

Let's say there's an user called `www-data` for the websites directories, and nginx's default root directory is under `/usr/share/nginx/www`…

These pre-conditions will be used in these steps below:

### Create directory for your site

```bash
$ sudo mkdir -p /usr/share/nginx/www/your-site.com/pubic_html
```

This will create a directory for `your-site.com` domain and we will put all website files under it.

### Change owner and permissions

```bash
$ sudo chown -R www-data:www-data /usr/share/nginx/www/your-site.com/pubic_html
$ sudo chmod 755 /usr/share/nginx/www
```

#### Create a simple index.html

In order to test our virtual host, we can create a simple index.html to see if it's works.

You can use any editor to do this, as long as you make sure index.html is placed under:`/usr/share/nginx/www/your-site.com/pubic_html/index.html`

### Create the new virtual host configuration file

Nginx has provide a example configuration file, we can copy this:

```bash
$ cp /etc/nginx/sites-available/default /etc/nginx/sites-available/your-site.com
```

or, you can create a blank file and fill these content below in it:

```bash:your-site.com
server {
	listen		80; ## listen for ipv4; this line is default and implied
	#listen		[::]:80 default_server ipv6only=on; ## listen for ipv6

	root /usr/share/nginx/www/your-site.com;

	index index.html index.htm;

	server_name your-site.com;
}
```

Save and Exit.

### Make a symbolic link

```bash
$ sudo ln -s /etc/nginx/sites-available/your-site.com /etc/nginx/sites-enabled/your-site.com
```

…and make sure to delete the default configuration file:

```bash
$ sudo rm /etc/nginx/sites-enabled/default
```

…after all, restart the nginx server:

```bash
$ sudo service nginx restart
```
bool型のtrue,falseはintです。

今日は、新たな発見がありました。
stdbool.hの中で定義されているbool型用のtrue,falseについてです。stdbool.hには下記ようのに定義されています。

```c:stdbool.h
#ifndef __cplusplus

#define bool    _Bool
#define true    1
#define false   0

#else /* __cplusplus */
以下省略
```

c言語で利用する場合は、__cplusplusが定義されていないので、true,falseはint型です。下のように書いても問題ないはず。

```c:sample.c
#include <stdio.h>
#include <stdbool.h>

static int s_value = 0;
void func(bool state )
{
    s_value = state;
}

int main( int argc, char *argv[] )
{
    func(false);
    printf("value=%d\n", s_value);
    return 0;
}
```
オブジェクトを文字列化するときの書式を変える

NSDateクラスの内容を任意の書式で文字列化したいとき、毎度毎度NSDateFormatterクラスを通すのはしんどいです。
かと言って、カテゴリで新たにメソッドを実装しても、毎度毎度それを呼び出すのは正直面倒いです。これはひどい。

NSObjectクラスは、文字列化されるときこっそりと`description`メソッドを呼び出します。
MethodSwizzlingでそれを差し替えてやれば、デフォルトの書式を変えられそう。

```objectivec
#import <Foundation/Foundation.h>
#import <objc/runtime.h>

int main(int argc, char *argv[]) {
    @autoreleasepool {
        NSLog(@"%@", [NSDate distantFuture]); // 4001-01-01 00:00:00 +0000
        
        Class nsdate = [NSDate class];

        // と言いつつ今回差し替えるのは`descriptionWithLocale:`
        // NSDateは他に`description`と`descriptionWithCalendarFormat:timeZone:locale:`がある
        SEL name = @selector(descriptionWithLocale:);

        // 新しい`descriptionWithLocale:`メソッド、Blocksの第一引数が`self`の代わりになる
        IMP description = imp_implementationWithBlock(^NSString*(id obj, id locale) {
            NSDateFormatter* format = [[NSDateFormatter alloc] init];
            [format setDateFormat:@"yyyy/MM/dd HH:mm:ss"];
            return [format stringFromDate:obj];
        });
        
        class_replaceMethod(nsdate, name, description,
            method_getTypeEncoding(class_getInstanceMethod(nsdate, name)));
        
        NSLog(@"%@", [NSDate distantFuture]); // 4001/01/01 09:00:00
        
        return 0;
    }
}
```

実用性は投げ捨てるもの。

[BlockからSelector(メソッド)を作る - Qiita](http://qiita.com/items/a0184fdbb9794f741f08)
[Methodの処理を差し替える - MethodSwizzling - Qiita](http://qiita.com/items/1dfd6927e13745920b63)
[NSDate Class Reference - Mac Developer Library](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/Reference/Reference.html)
XcodeのカラーテーマをSolarizedに変更


基本的には[ここ](https://github.com/brianmichel/solarized/tree/master/apple-xcode4-solarized　"brianmichel / solarized")に書いてある通り。

"Solarized - Dark.dvtcolortheme"を`~/Library/Developer/Xcode/UserData/FontAndColorThemes`にコピー

XcodeのPreference>Fonts & Colorsに`Solarized - Dark`が追加されてる。

###参照
・[Solarized - Xcode 4 Color Presets](https://github.com/brianmichel/solarized/tree/master/apple-xcode4-solarized　"brianmichel / solarized")
・[XcodeのSolarizedを入れ替えた]( http://blog.ishkawa.org/blog/2013/03/12/xcode-solarized/"XcodeのSolarizedを入れ替えた")
routes.rb - namespace／scope module:／scope


## namespace

```rb
namespace :admin do
  resources :posts
end
```

↓

```
admin_posts_path      GET     /admin/posts(.:format)           admin/posts#index
                      POST    /admin/posts(.:format)           admin/posts#create
new_admin_post_path   GET     /admin/posts/new(.:format)       admin/posts#new
edit_admin_post_path  GET     /admin/posts/:id/edit(.:format)  admin/posts#edit
admin_post_path       GET     /admin/posts/:id(.:format)       admin/posts#show
                      PUT     /admin/posts/:id(.:format)       admin/posts#update
                      DELETE  /admin/posts/:id(.:format)       admin/posts#destroy
```

## scope module:

```rb
scope module: "admin" do
  resources :posts
end
```

↓

```
posts_path      GET     /posts(.:format)           admin/posts#index
                POST    /posts(.:format)           admin/posts#create
new_post_path   GET     /posts/new(.:format)       admin/posts#new
edit_post_path  GET     /posts/:id/edit(.:format)  admin/posts#edit
post_path       GET     /posts/:id(.:format)       admin/posts#show
                PUT     /posts/:id(.:format)       admin/posts#update
                DELETE  /posts/:id(.:format)       admin/posts#destroy
```

## scope

```rb
scope "/admin" do
  resources :posts
end
```

↓

```
posts_path      GET     /admin/posts(.:format)           posts#index
                POST    /admin/posts(.:format)           posts#create
new_post_path   GET     /admin/posts/new(.:format)       posts#new
edit_post_path  GET     /admin/posts/:id/edit(.:format)  posts#edit
post_path       GET     /admin/posts/:id(.:format)       posts#show
                PUT     /admin/posts/:id(.:format)       posts#update
                DELETE  /admin/posts/:id(.:format)       posts#destroy
```
多言語化設定での落とし穴

Xcode4以降から多言語化する際に、ProjectのInfoタブから言語を追加する仕様に変更されました。
言語を追加する際は問題ないのですが、言語を削除する際に多言語化されたファイルも削除されてしまうという問題が発生します。
そうすると、MainStoryboardがプロジェクトから消えてしまい、Xcodeからシミュレータや端末に転送する際は問題ないのですが、TestFlightからアプリをインストールしようとすると、アプリにMainStoryboardが追加されず起動できなくなってしまいます。
多言語対応する際に、気をつけておく必要があるようなので、Tipsとして投稿しておきます。