OmniAICreator/Qiita-1.07M huggingface dataset:
rescue節で例外の型を指定しない場合に補足できるのはStandardErrorとそのサブクラスだけ


Javaや.NETをやってた人にしてみると、`Exception`クラスは普通の例外の代表のように考えてしまうかもしれません。
しかしRubyの`Exception`は`NoMemoryError`等の致命的な例外の親クラスにもなっているため、例外の型を指定しない`rescue`節では補足されません。
補足されるのは通常の実行時エラーを表す`StandardError`とそのサブクラス(`ArgumentError`等)になります。

````ruby
require 'rspec'

describe 'rescue' do
  shared_examples_for 'rescue StandardError' do
    it 'should rescue StandardError' do
      -> { subject.call(StandardError) }.should_not raise_error
    end
  end

  context 'when not specify exception' do
    subject do
      ->(e) {
        begin
          raise e
        rescue
        end
      }
    end

    it 'should not rescue Exception' do
      -> { subject.call(Exception) }.should raise_error(Exception)
    end

    it_should_behave_like 'rescue StandardError'
  end

  context 'when specify exception' do
    subject do
      ->(e) {
        begin
          raise e
        rescue Exception
        end
      }
    end

    it 'should rescue Exception' do
      -> { subject.call(Exception) }.should_not raise_error
    end

    it_should_behave_like 'rescue StandardError'
  end
end
````
````
$ rspec rescue_spec.rb
....

Finished in 0.00162 seconds
4 examples, 0 failures
````

Rubyの例外の階層関係についてはこちらのページの図がわかりやすいです。

http://rubylearning.com/satishtalim/ruby_exceptions.html


例外クラスを自分で定義する場合も通常は`Exception`クラスではなく、`StandardError`クラスのサブクラスにすべき、ということになりますね。

###参考ページ

http://www.ruby-lang.org/ja/old-man/html/_C0A9B8E6B9BDC2A4.html#begin
Hashの値が80以外だったらある処理を実行する、という場合、どの書き方が一番わかりやすいか？


個人的にぱっと見て挙動が予想しやすいのは3。
1は何が起こるか分からない。
2も理解するのに時間がかかる。
4は短く書けるけど、書き手の意図がわかりにくい。

````ruby
require 'rspec'
require 'active_support/core_ext/string'

describe "convert hash value to integer if the value is not '80'" do
  let(:hash) { {to_exclude: '80', to_include1: '8080', to_include2: '3000'} }

  shared_examples_for 'samples' do
    specify { subject.call(:to_include1).should == 8080 }
    specify { subject.call(:to_include2).should == 3000 }
    specify { subject.call(:to_exclude).should be_nil }
    specify { subject.call(:not_defined).should be_nil }
  end

  describe '1. use unless/or' do
    it_should_behave_like 'samples' do
      subject { ->(key) { hash[key].to_i unless hash[key].blank? or hash[key] == '80' } }
    end
  end

  describe '2. use if/not/or' do
    it_should_behave_like 'samples' do
      subject { ->(key) { hash[key].to_i if not(hash[key].blank? or hash[key] == '80') } }
    end
  end

  describe '3. use if/and' do
    it_should_behave_like 'samples' do
      subject { ->(key) { hash[key].to_i if hash[key].present? and hash[key] != '80' } }
    end
  end

  describe '4. use unless/include?' do
    it_should_behave_like 'samples' do
      subject { ->(key) { hash[key].to_i unless [nil, '80'].include? hash[key] } }
    end
  end
end
````

````
$ rspec sample_spec.rb
................

Finished in 0.004 seconds
16 examples, 0 failures
````

え？そもそもこのRSpecがわかりにくい？
C言語での関数の引数の配列はポインタ渡しである

久しぶりにやったらド忘れしていたのでメモ。

```c
void func(int a[],int n){
    //process
}
```

しばしば関数の引数に配列と要素数を渡す関数がある。
このaは配列そのものではなく、配列の先頭要素へのポインタである。
そのため、関数側で要素数を調べることができないので、要素数も渡している。


※aがもし配列そのものなら

```c
int n = sizeof(a)/sizeof(a[0])
```

で取得できるはずだが、関数の引数にはポインタとして渡ってきているので、この方法は使えない
インストールしたQuickLookプラグインのメモ


MacBook Pro RetinaにインストールしたQuicklookプラグインのメモ。


- [BetterZipQL](http://macitbetter.com/BetterZip-Quick-Look-Generator/) ZIP, TAR, GZipなどのアーカイブの内容を表示

- [QLColorCode](http://code.google.com/p/qlcolorcode/) ソースコードをシンタックスハイライト表示

- [QLMarkdown](https://github.com/toland/qlmarkdown) マークダウン文書をプレビュー

- [QLStephen](http://whomwah.github.com/qlstephen/) 拡張子のない(READMEなど)のテキストファイルを表示

- [Suspicious Package](http://www.mothersruin.com/software/SuspiciousPackage/) インストールパッケージの中身を表示

- [quicklook-ipa](http://code.google.com/p/quicklook-ipa/) iOSアプリのアイコン表示

# アプリケーションに同梱されているもの

- [Murasaki - EPUBリーダー](http://itunes.apple.com/jp/app/murasaki-epub-rida/id430300762?mt=12) (Mac App Store)
node-csv-parserで郵便番号処理(spwanで直接iconv)

日本郵便のcsv ( http://www.post.japanpost.jp/zipcode/download.html ) をデータベースへ突っ込んで利用するというのは昔なつかしの『入門Ajax』で書いたことがありますが、最近はNode.jsのCSVパーサーでいきなり利用するってこともできることに気づきました。

てことで、試してみます。

パッケージは、node-csv-parser
https://github.com/wdavidw/node-csv-parser

#インストール

```
npm install csv
```

#文字コードをどうするぅ？
日本郵便のcsvは、Shift_JISなのでutf-8へ直してやる必要があるんだけれど、node-iconvはまだ今一つで、実際に試してみるとやっぱりだめでした。

そこで、チャイルドプロセスのexecかspwanで直接iconvやnkfを使ってファイルのコード変換やろうってことで試したらうまくいきましたのでこれでいきます。

```
var csv = require('csv');
var exec = require('child_process').exec;

var zip = '3001626';//調べたい郵便番号

//入出力ファイル 08IBARAK.CSVから08IBARAK-utf8.CSVを作る
var infile = __dirname+'/08IBARAK.CSV';
var outfile = __dirname+'/08IBARAK-utf8.CSV';

//iconvコマンド
var cmd = 'iconv -f SHIFT_JIS -t UTF-8 -o '+outfile+' '+infile+'';

//文字コード変換 入力ファイルをUTF-8へ変換して出力後CSV処理起動
var child = exec(cmd,
  function (error, stdout, stderr) {
    getCSV();//CSV処理起動
    if (error !== null) {
      console.log('exec error: ' + error);
    }
});

//CSV処理
function getCSV(){
  console.time('bench');
  csv()
    .fromPath(outfile) //読み込むCSVファイル
    .transform(function(data){//絞り込みと変換加工処理
      if(data[2]===zip){
        data[8]=
          data[8]
            .replace('以下に掲載がない場合','')
            .replace('境町の次に番地がくる場合','')
        return data[2]+ ' ' +data[6] +data[7] +data[8];
      }
    })
    .on('data',function(data){
      console.log(data);//変換後のデータを受け取り表示
      console.timeEnd('bench');
    })
    .on('end',function(count){
        console.log('Number of lines: '+count);
    })
    .on('error',function(error){
        console.log(error.message);
    }) 
}
```

#こうなった

```
$ node app.js

3001626 茨城県北相馬郡利根町四季の丘
Number of lines: 2856
```

速度はこの3000件で0.2秒かかってるので、文字コード部分は別処理にすべきかも。

まぁ、DBへ流し込む前のCSVパーサーとして使うのが普通かもしれないけれど、単体でもこんな風に絞り込みにも使えるわけなので、速度を気にしなければ日本郵便のデータ更新への対応のハードルが下がるというメリットもあるかも？

P.S. KEN_ALL.CSVの12万3千件の最後の沖縄の郵便番号9071801を検索したら、9166msだったので、まぁ、数万件ある場合は、やはり実用上はDBへ流し込んで使うべきですね(^^;;

P.S. ちなみに、文字コード変換後のファイルを作らずに、getCSV(stdout);で渡す手もあった。ただし、データが大きくなるとError: maxBuffer exceeded.となるので、たとえば、次のようにmaxBufferを大きくしてみた。

```
var cmd = 'iconv -f SHIFT_JIS -t UTF-8 '+infile+''
//入力ファイルをUTF-8へ変換して出力後CSV処理起動
var child = exec(cmd,{
    maxBuffer: 20000*1024
  },
  function (error, stdout, stderr) {  
    console.log('stderr: ' + stderr);
     getCSV(stdout);//CSV処理起動
```
http のデバッグに nc (netcat) が効く

Webアプリケーション開発者たるもの、時には生 http リクエストと戦わねばならない時があるのです。主に multipart とか multipart とか multipart とか。

そんな時は適当なマシンで

```sh
nc -l 8080 > request_dump.txt
```

で口を開けて待たせておいて、form の投げ先を書き換えて投げつけてやれば、request_dump.txt に 生 http リクエストがダンプされます。(ブラウザは応答待ちのままになるので、ダンプが取れたら nc を kill する)

ダンプしたリクエストを以下のようにしてアプリへ投げつけてやれば、再現試験も簡単。ループでぶん回すのも自由自在。 ( Cookie や、Host など一部のヘッダは投げる前に書き換えが必要)

```sh
cat request_dump.txt | nc $HOSTNAME 80
```

ちなみに、受け側のアプリが https な場合は openssl の助けを借りれば同じことができます。

```sh
cat request_dump.txt | openssl s_client -connect $HOSTNAME:443
```

Enjoy!!
SpringMVCでリダイレクト先ページにパラメータを渡す方法


コントローラのハンドラからハンドラにリダイレクトする際、パラメータを渡してリダイレクト先のJSP等に表示する方法。

##Modelを使う
以下コントローラのサンプル。

```java
//ここにアクセスすると...
@RequestMapping(value = "/from", method = RequestMethod.GET)
public String from(Model model) {
	//メッセージhogehogeを渡す
	model.addAttribute("message", "hogehoge");
	return "redirect:/to";
}

//こっちにリダイレクトする
@RequestMapping(value = "/to", method = RequestMethod.GET)
public String to(@Param(value = "message") String message, Model model) {
	// 受け取ったmessageをJSPなどに表示する
	model.addAttribute("message", message);
	return "view_massage";
}	
```

```html:view_message.jsp
<!-- /to ハンドラが表示するJSP -->
<body>
	<!--hogehogeが表示される-->
	Message=${message}
</body>
```

Model#addAttributeでセットした値は、[URL]/to?message=hogehoge といったように、リダイレクト先URLのGETパラメータに入ってしまうのでちょっときもち悪い。もし日本語などを渡したいときはURLEncodeも意識しないといけないので面倒。

##RedirectAttributesを使う
Spring3.1以降ではRedirectAttributesを使ってよりシンプルに書くことができる。

```java
//ここにアクセスすると...
@RequestMapping(value = "/from", method = RequestMethod.GET)
public String from(RedirectAttributes attributes) {
	//メッセージhogehogeを渡す
	attributes.addFlashAttribute("message","hogehoge");
	return "redirect:/to";
}

//こっちにリダイレクトする
@RequestMapping(value = "/to", method = RequestMethod.GET)
public String to() {
	return "view_massage";
}	
```

3.1ではFlash Scopeというものが導入されていて、RedirectAttributesではそこにデータを格納してリダイレクトするかたち。日本語もencode/decode無しに送れるし、リダイレクト先コントローラでModelに値をセットする作業もいらなくて楽。

※Bean設定に &lt;mvc:annotation-diven /> を書かないとこの機能が有効化されないので注意
LinuxでPythonをビルドするときの --enable-shared オプションについて

Linux で Python をビルドするとき、 `--enable-shared` という configure オプションがありるので、その解説とTipsを紹介します。
具体例として Python を挙げていますが、話の内容のほとんどは他の言語やライブラリでも共通だと思います。

## --enable-shared とはなにか
このオプションを指定しない場合、主要なバイナリファイルとして `python` という実行ファイルと `libpython2.7.a` (Python 2.7の場合) というライブラリファイルができます。
`--enable-shared` をつけた場合、 `libpython2.7.so` というダイナミックリンク用の shared object も生成され、 `python` はこの shared object をダイナミックリンクするようになります。

Debian などの Linux ディストリビューションでは、たいていこのオプションがついた状態で Python がビルドされています。たくさんのプログラムが Python を利用できるようにビルドされていて、 `libpython2.7.a` を直接リンクしてしまうと Python のバージョンアップをするときにそれらを全部アップデートしないといけなくなるからです。

個人で Python をビルドする場合、あまりこの利点は生きてこず、むしろ複数のバージョンを並列して使いたい人にとってはじゃまになることがあるので、 `--enable-shared` はお勧めしません。何らかの理由があって shared object を使いたい人以外は続きは読まなくて大丈夫です。

## --enable-shared を使った時の問題点
`python` 実行ファイルや、 `mod_wsgi` のように Python をライブラリとしてリンクするプログラムが `libpython2.7.so` に依存するようになると、実行しているプログラムが思い通りの `libpython2.7.so` を使ってくれないという状態になる可能性があります。

例えば、 `--prefix=/usr/local/Python-2.7.3` でビルドしてインストールした場合、 `/usr/local/Python-2.7.3/bin/python` を実行すると、設定や環境変数によっては `/usr/lib/libpython2.7.so` や `/usr/local/Python-2.7.2/lib/libpython2.7.so` が使われてしまう可能性があります。

環境変数 LD_LIBRARY_PATH を使うと優先して読み込むライブラリの場所を指定することができますが、複数のバージョンの Python を並列して使っている場合は環境変数の切り替えを自分でやるのも面倒ですし、同じサーバーを他の人も使っている場合はその人が混乱する場合もあります。

## 対策1 rpath を設定する
多分これが正攻法です。
`python` 実行ファイルなど、ダイナミックリンクをする側に、リンクする `libpython2.7.so` の場所をフルパスで記録させてしまいます。

rpathを設定するには、 configure するときに LDFLAGS を指定するのが楽です。

```
$ ./configure --prefix=$HOME/python27 --enable-shared \
    LDFLAGS=-Wl,-rpath,$HOME/python27/lib
```

一点だけ、 rpath を使う欠点として、 cp -r などで Python をまるごと別のディレクトリにコピーして bin/ の中のスクリプトの shebang を書き換えるだけで動くというポータビリティーが犠牲になります。
virtualenv では libpython2.7.so が元の場所にあれば動き続けるので問題ないのですが、 virtualenv を使うといつまで古いバージョンの Python が使われてるかわからなくてなかなか消せなくなるのが嫌だからまるごとコピーして使う、という人にはお勧めできません。

## 対策2 libpython を静的リンクしてしまう
shared object は何らかの目的で必要なんだけど、 python 実行ファイルがそれをダイナミックリンクする必要はない、という人は、 python をビルドするときに `libpython2.7.a` の方をリンクしてしまう方法があります。それには、 configure 後に Makefile を開いて、

```
BLDLIBRARY=     -L. -lpython$(VERSION)
```

となっているところを

```
BLDLIBRARY=     libpython$(VERSION).a
```

に書き換えてやります。

Debian パッケージの python もこれと似たやり方でビルドされているらしく、 libpython2.7.so があるのに python は libpython  を静的リンクしています。
shared object は PIC になっていてパフォーマンスが低かったのが理由らしいです。 (vim で Python 2 と 3 を同時に使えないのもこれが原因)
Java: インナークラスを外で継承し、コンストラクタ内でenclosing instanceをnew

こんなことができるのか… org.eclipse.jdt.core.tests.compiler.regression.InnerEmulationTest.test090 より:

```java:D.java
public class D {
  public void main(String[] args) {
    class Middle {
      class Inner {}
    }
    class M extends Middle.Inner {
      M() { new Middle().super(); } // !!!
    }
    new M();
  }
}
```

インナークラスを外で継承して、コンストラクタの中で(!) enclosing class のインスタンスを生成するという方法。
昨日のポストにかなり関係していそう。
日付が正しいかどうかをチェックする


文字列で渡された日付が、"2012/09/32"といったように不正な値かどうかを確認する方法。

##SimpleDateFormat
```java
DateFormat format=new SimpleDateFormat("yyyy-MM-dd");

try {
	format.parse("2012-09-01");//成功
	format.parse("2012-09-32");//成功

	format.setLenient(false);
	format.parse("2012-09-32");//Exception
} catch (ParseException e) {
	//失敗時の処理…
}
```
SimpleDateFormatはデフォルトでは書式フォーマットのみをチェックするので、32日のような不正値で例外が投げられない。
不正な日付をチェックしたい場合は、setLenientでfalseをセットする。

##Commons DateUtils
commons-langに含まれているDateUtilsを使う場合は以下のように。

```java
try {
	DateUtils.parseDateStrictly("2012-09-01", new String[] {"yyyy-MM-dd"});
	DateUtils.parseDateStrictly("2012-09-32", new String[] {"yyyy-MM-dd"});//Exception
} catch (ParseException e) {
	// エラー処理...
}
```
これも内部的にはSimpleDateFormatを使った実装。こちらは書式フォーマットをString配列で複数指定できるようになっている。
挿入モード、コマンドモードで貼り付ける


挿入モード、コマンドモードのときに、ヤンク（コピー）しているものを貼り付ける方法を紹介します。
※知ってる人にとっては、割りと基本的なことです。
## 対象
* vim弱な人

## 内容
```
 Ctrl + r　レジスタの番号0〜9(直近は0)
```

これだけです。
でも、割とコレを知ると色々応用できます。
例えば
1. ヤンクした文字列を置換
2. ヤンクした文字列で置換
3. ヤンクした文字列で検索( カーソル位置の単語で検索は *)
4. [別Qiita記事 コピーしたものを連続して貼り付け](http://qiita.com/items/8a88be92c0e5b183480f)
などなど

ちなみにレジスタ番号を確認するのは、

```
:reg
```
です。

では、Good Cooking!
Convert hash into recursively key joined hash

Code:

```ruby
def key_join(target)
  result = {}
  joiner = lambda { |hash, joined_key|
    hash.each_pair { |key, value|
      new_joined_key = joined_key.nil? ? key.to_s : "#{joined_key}.#{key}"
      if value.is_a?(Hash)
        joiner.call(value, new_joined_key)
      else
        result[new_joined_key] = value
      end
    }
  }
  joiner.call(target, nil)
  result
end
```

Result:

```ruby
#=> {"aa.bb" => 1, "aa.cc" => 2, "aa.dd.ee" => 3, "ff.gg" => 4, "hh" => 5}
p key_join({aa: {bb: 1, cc: 2, dd: {ee: 3}}, ff: {gg: 4}, hh: 5})
```
正しいcoffee-scriptの環境づくり vim


いまどき生JS書くのは情弱ですよね。
各プラグインの設定を追記

## NeoBundleの設定

```vim:.vimrc
" syntax + 自動compile
NeoBundle 'kchmck/vim-coffee-script'
" js BDDツール
NeoBundle 'claco/jasmine.vim'
" indentの深さに色を付ける
NeoBundle 'nathanaelkane/vim-indent-guides'
```

## vimに記述しなければならない設定

```vim:.vimrc
" vimにcoffeeファイルタイプを認識させる
au BufRead,BufNewFile,BufReadPre *.coffee   set filetype=coffee
" インデントを設定
autocmd FileType coffee     setlocal sw=2 sts=2 ts=2 et
```

## 各プラグインの設定・追記

```vim:.vimrc
" taglistの設定 coffeeを追加
" let g:tlist_coffee_settings = 'coffee;f:function;v:variable'

" QuickRunのcoffee
" let g:quickrun_config['coffee'] = {
"      \'command' : 'coffee',
"      \'exec' : ['%c -cbp %s']
"      \}

"------------------------------------
" vim-coffee-script
"------------------------------------
" 保存時にコンパイル
autocmd BufWritePost *.coffee silent CoffeeMake! -cb | cwindow | redraw!

"------------------------------------
" jasmine.vim
"------------------------------------
" ファイルタイプを変更
function! JasmineSetting()
  au BufRead,BufNewFile *Helper.js,*Spec.js  set filetype=jasmine.javascript
  au BufRead,BufNewFile *Helper.coffee,*Spec.coffee  set filetype=jasmine.coffee
  au BufRead,BufNewFile,BufReadPre *Helper.coffee,*Spec.coffee  let b:quickrun_config = {'type' : 'coffee'}
  call jasmine#load_snippets()
  map <buffer> <leader>m :JasmineRedGreen<CR>
  command! JasmineRedGreen :call jasmine#redgreen()
  command! JasmineMake :call jasmine#make()
endfunction
au BufRead,BufNewFile,BufReadPre *.coffee,*.js call JasmineSetting()

"------------------------------------
" indent_guides
"------------------------------------
" インデントの深さに色を付ける
let g:indent_guides_start_level=2
let g:indent_guides_auto_colors=0
let g:indent_guides_enable_on_vim_startup=0
let g:indent_guides_color_change_percent=20
let g:indent_guides_guide_size=1
let g:indent_guides_space_guides=1

hi IndentGuidesOdd  ctermbg=235
hi IndentGuidesEven ctermbg=237
au FileType coffee,ruby,javascript,python IndentGuidesEnable
nmap <silent><Leader>ig <Plug>IndentGuidesToggle
```
第３回 オフラインリアルタイムどう書く解答(C++)

オフラインリアルタイムどう書く。三度目。
問題は http://nabetani.sakura.ne.jp/hena/ord3ynode/ 。
コードをアップするところまでが勉強会( see http://qiita.com/items/1815701039050f42bbc1 ) ということで、その場で書いた C++11 版を

```c++:ynode.cpp
#include <iostream>
#include <utility>
#include <string>
#include <map>
#include <cassert>

using namespace std;

struct testdata_t
{
  string in;
  string expected;
};
testdata_t testdata[]{
// 略
/*30*/ {"rrrrbllrlrbrbrr", "ACBACABCFDEDADFC" },
};

string turn_r{ "BACBA ADFCAD EBCFEB DABEDA FDEFD" };
string turn_l{ turn_r.rbegin(), turn_r.rend() };

string turn( string const & state, string const & course )
{
  auto pos = course.find( state );
  assert( pos != string::npos );
  return course.substr(pos+2,1);
}

string solv( string const & in )
{
  string r{"BA"};
  for( auto ch : in ){
    string state{ r.end()-2, r.end() };
    switch( ch ){
    case 'b':
      r+=state[0];
      break;
    default:
      r+=turn( state, ch=='r' ? turn_r : turn_l );
      break;
    }
  }
  return {r.begin()+1, r.end()};
}
int main()
{
  for( auto t : testdata ){
    auto actual = solv(t.in);
    cout << t.in << "->" << actual;
    if ( actual != t.expected ){
      cout << "**FAIL** expected : " << t.expected;
    }
    cout << endl;
  }
  return 0;
}
```

turn_r は、右に曲がり続けたらこうなるよというシーケンス。
turn_l は、左。
ということで、turn_r から "AB" を見つけ出すと、その次の文字が AB の後で右に曲がったら到達する Y字路。というロジック。

C++11 の機能をちょっと使ってだいぶ楽をしている。
SublimeText2+waf+dmdでコンパイルする


前に投稿したものとかを参考にしつつ、SublimeText2でD言語のコンパイルをお手軽(Command+B)に出来るようにしよう。

前に投稿したのってこれね。

>* WafでそれっぽいD言語環境構築た際のwscriptの内容について
>http://qiita.com/items/73791b9ff5842d3b8b20

>* SublimeLinterにD言語(他の任意の言語)を追加してハイライト出来るようにする
>http://qiita.com/items/c4e29043e808ac3b19e8


環境は前に投稿したのと一緒で、環境の画像だけペタリ。

![フォルダ環境](http://desmond.yfrog.com/Himg875/scaled.php?tn=0&server=875&filename=9dlq.png&xsize=640&ysize=640)

プロジェクトはwscriptのあるフォルダという状況で考えます。

まずはPackageのあるフォルダを開く。(メニューから選択は以下の画像見て)
![BrowsePackage…](http://a.yfrog.com/img863/6499/hnlb.png)

んで、Packageのあるフォルダの中にDってフォルダがあって、その中にD言語のビルド設定とか、スニペットとかあります。
DのフォルダにD.sublime-buildってファイルがあると思うので、コピペしてDwaf.sublime-buildみたいな名前に変更してから、中身を以下の様に修正する。

```JSON:Dwaf.sublime-build
{
	"cmd": ["./waf", "build"],
	"file_regex": "^\\.\\./(.*?)\\(([0-9]+)\\)",
	"selector": "source.d",
	"working_dir" :  "${project_path:${folder}}"
}
```

これでOK。そうするとSublimeText2のメニューで、[Tools]->[Build System]見るとDwafってのが追加されてます。

あとはそれを選択してCommand+Bすればwafでコンパイルしてくれるし、コンパイルエラーはちゃんと該当のファイル開いて該当の行に飛んでくれる。

file_regexで../を除外してるのは、wafであの環境でコンパイルするとコンパイルエラーがbuildフォルダからの相対パスで出てくるから。
でも、SublimeText2で開くのはプロジェクトフォルダからの相対パスだから、上手く開かないのでが除外してる。
(この状況を何とかする方法あるなら教えて欲しい。色々調べてみたけどダメだった)

というわけで幸せ実現！
第３回 オフラインリアルタイムどう書く解答(haskell)

コードをアップするまでが勉強会、ということで勉強会ではRubyで解いたけれどhaskellで。
問題はこちら。http://nabetani.sakura.ne.jp/hena/ord3ynode/
haskellのIO処理がまだ解っていないので問題はリテラルで埋め込んでます。

```haskell
-- solveの第一引数に問題のリテラルを
main = print $ solve "llllllrllrlbrrr" ('B','A')

route::(Char,Char)->[Char]
route ('A','B') = ['E','C','A']
route ('A','C') = ['B','F','A']
route ('A','D') = ['F','E','A']
route ('B','A') = ['C','D','B']
route ('B','C') = ['F','A','B']
route ('B','E') = ['D','F','B']
route ('C','A') = ['D','B','C']
route ('C','B') = ['A','E','C']
route ('C','F') = ['E','D','C']
route ('D','A') = ['B','C','D']
route ('D','E') = ['F','B','D']
route ('D','F') = ['C','E','D']
route ('E','B') = ['C','A','E']
route ('E','D') = ['A','F','E']
route ('E','F') = ['D','C','E']
route ('F','C') = ['A','B','F']
route ('F','D') = ['E','A','F']
route ('F','E') = ['B','D','F']

conv::Char->Int
conv 'r' = 0
conv 'l' = 1
conv 'b' = 2

solve::String->(Char,Char)->String
solve [] (_, to) = [to]
solve (x:xs) (fm, to) = to:(solve xs (to, (route (fm, to))!!(conv x)))
```
linuxでディスクがフルになったときの調査方法 du df

いきなりdisk fullの警告が出てきて調べた時のメモ

とりあえずdf -hでディスク全体の使用状況がわかる

```
 df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       7.5G  5.2G  2.0G  73% /
udev            238M  4.0K  238M   1% /dev
tmpfs            99M  272K   99M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            246M     0  246M   0% /run/shm
```

つぎにdu -sh /*でルートディレクトリの各ディレクトリのディスクの利用状況がわかる

```
$ sudo du -sh /*
8.7M	/bin
68M	/boot
4.0K	/dev
7.3M	/etc
2.6G	/home

...

```

で、ディスクを多く使用しているディレクトリをdu -sh /var/lib/*と掘り進めていくとどこが原因かわかる

自分の場合は/var/lib/mongodb/journal/がいきなり2gbも占拠してました

追記

sortにパイプすれば一番最後にサイズが大きなディレクトリ・ファイルがきます

```
du -s ./* | sort -n
```
ECJ (eclipse compiler for Java) bug. インナークラスのコンストラクタを外から無名クラスとして継承すると型エラー

この正しいJavaのコードが、eclipse上ではコンパイル時エラーになる。

```java:C.java
public class C {
        public class Inner extends C {}
        public static void main(String[] args) {
                new C().new Inner(){};
        }
}
```

```
$ java -jar /Applications/eclipse/plugins/org.eclipse.jdt.core_3.8.1.v20120531-0637.jar C.java 
----------
1. ERROR in /Users/keigoi/tmp/C.java (at line 9)
	new C().new Inner(){};
	            ^^^^^^^
No enclosing instance of type C is available due to some intermediate constructor invocation
----------
1 problem (1 error)
```

ソースを追ってみたが、何やら

```java:
new C().new Inner() {
  x() {
    super();
  }
```

と展開され(xは無名クラスのコンストラクタか)、ここで super (つまりC.this.Inner())を呼び出そうにも外側クラスのインスタンスが無いから呼び出せないよ、という感じのようだった。実際にはnew C()のインスタンスを渡せればよいはずなのだけど…

追記：ちょっと違うみたい。Innerがenclosing class(ここではC)以外を継承していればコンパイル通る。

ここで報告した．
https://bugs.eclipse.org/bugs/show_bug.cgi?id=388903
Railsで検索をSQLで簡単に実装する方法 

あらかじめ完成しているindexページに検索機能を追加する。今回はSQLでのLIKE演算子を使ったシンプルな検索を実現する。
Viewには

>
<%= form_tag stories_path, :method => "get" do %>
<%= text_field_tag :title, params[:title] %>
<%= submit_tag "検索"%>
<% end %>

と書いておいて、
controllerのindexメソッドには、機能追加前は

>
@products = Produc.all

と書いてあったりするけど、そのかわりに

>
@products = Product.where("title LIKE ?", "%#{params[:title]}%")

を書き足す。

これで完成。
いちおう%#{}%で囲ってエスケープはしてあるけど、もしかしたらSQLインジェクションの穴があるかも。セキュリティチェックが必要。
Grand Central Dispatchの落とし穴

大量の画像を処理するツールを作っていて、せっかくPCに８つコアがあるんだから、
手軽に並列化しちゃおう、とGCDでサクっとやろうとしていました。
しかし、ファイルの数が膨大になるとどうも途中でプログラムが落ちる。

プログラムはもちろんグローバルキューを取得して処理を全部ブロックで一気に投げるというもの。

どうやら原因を考えると、DISPATCH_QUEUE_CONCURRENTのキューではブロックをがんばって並列化しすぎるようだ。　どんどん並列化していって、処理が終わらないのに、どんどん並列化実行開始しちゃって、メモリがパンクしていたようだ。

結局NSOperationQueueで最大並列実行数をmaxConcurrentOperationCountで８つに限定して、addOperationWithBlock:で全部突っ込んだらめでたく解決した。
waitUntilAllOperationsAreFinishedで同期まで簡単であった。

めでたしめでたし。
HTML4とHTML5でのdl,dt,ddの使い分け

先日知ったこと。

HTML4とHTML5では、dl,dt,ddの使い方が違う。

```html:html4.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
</head>
<body>
<h1>更新情報</h1>
  <dl>
    <dt>2012-09-07</dt>
    <dd>投稿したよ！</dd>
  </dl>
</body>
</html>
```

上記はあまりオススメされていない。
HTML4では、dlタグは「definition list(定義リスト)」という定義で、いわゆる教科書等に載っている用語解説を行う際に使用するのが一般的。

しかし、HTML5では、dlタグは「description list(説明リスト)」という定義になっている。少しゆるくなったのかもしれない。
しっかりとは判断が出来ないのだが、説明リストということなので、先程書いた上記のコードはどうなのか気になる所。構造化という目線から見ればリーダブルであると思うけどね。

2012/09/07 20:20 追記
因みに、説明リスト内で用語を定義したい時はdfnタグで用語を囲むことが良いらしいね。
手動でZipalignを行う方法

EclipseやIntelliJなどのIDEで署名無しAPKファイルを作成した場合、自分で"jarsigner"で署名をしたAPKファイルをデベロッパー・コンソールにアップしようとすると、zipalignをするよう警告が出ます。
（各IDEおよびAntで署名付きでビルドした場合は、自動的にzipalignが行われます。）

その場合は、コマンドラインで以下を行います。
ただし、必ず署名をした後で実行しなければいけません。署名の前に実行してしまうと、署名をした際に、align情報が失われてしまいます。

```zipalign.sh
# アラインを設定する
zipalign -v 4 [infile.apk] [outfile.apk]

# アラインが正しく設定されたか確認する
zipalign -c -v 4 [outfile.apk]
```

なおzipalignコマンドは、Android SDKディレクトリのtoolsフォルダにあります。
Markdown簡易まとめ


##Markdown文法
本家: http://daringfireball.net/projects/markdown/syntax
日本語訳: http://blog.2310.net/archives/6
日本語訳: http://technetium.matrix.jp/markdown.html
チートシート: https://gist.github.com/1901278	(これはダウンロードして手元のエディタから参照できるとこに置いておくと便利）

## Windows用エディタ
DownMarker  http://www.forest.impress.co.jp/docs/review/20120229_515192.html
MarkPad	 http://markdownpad.com/

ちょっと使ってみたところDownMakerの方がよさそうです。

## Mac用エディタ
Sublime Text2 + Marked (+Markdown Preview)がお勧め。
Marked: http://markedapp.com/
Markdown Preview: https://github.com/revolunet/sublimetext-markdown-preview

下記設定をしておくと、Alt+mでMarkedでプレビュー、Alt+Shift+mでブラウザでプレビューができる。

```Preference>Key_Bindings-Users
[
{ "keys": ["alt+shift+m"], "command": "markdown_preview", "args": {"target": "browser"} },
{ "keys": ["alt+m"], "command": "marked"}
]
```


なお、githubでは、拡張子が.mdのファイルは自動的にhtmlに変換して表示してくれるようです。
例: https://gist.github.com/1901278
Google Closure LibraryでDeferred


goog.async.Deferred.whenの第一引数はgoog.async.Deferredオブジェクト。ただし、通常の値が渡された場合は即座にcallbackの引数として実行される。

```javascript
var value,
    isImmediate = false;
if (isImmediate) {
    value = 3;
} else {
    value = new goog.async.Deferred();
    setTimeout(function() { value.callback(6); }, 2000);
}

var d = goog.async.Deferred.when(value, alert);
```

jQueryのwhenのように、複数の処理がすべて終わってからなにか処理を実行する。

```javascript
var def1 = new goog.async.Deferred();
var def2 = new goog.async.Deferred();
def1.awaitDeferred(def2);

setTimeout(function () {
    console.log('def1');
    def1.callback();
}, 5000);

setTimeout(function () {
    console.log('def2');
    def2.callback();
}, 7000);

goog.async.Deferred.when(def1, function () {
    alert('ok');
});

// def1
// def2
//=> alert 'OK'
//の順で処理が実行される。
//def1が終わってから、ではなく、同時に処理が走るのがポイント。
```
ディレクトリに存在する、特定パッケージのClassオブジェクトを、サブパッケージ含め、再帰的に取得


```java
	/**
	 * ディレクトリに存在する、特定パッケージのClassオブジェクトを、サブパッケージ含め、再帰的に取得
	 */
	public static List<Class<?>> getClasses(File dir, String dotSeparatedPackage) throws ClassNotFoundException {
		List<Class<?>> classes = new LinkedList<Class<?>>();
		dotSeparatedPackage = 
			(dotSeparatedPackage.endsWith(".")) ? dotSeparatedPackage : dotSeparatedPackage + ".";
		
		String slashSeparatedPackage = dotSeparatedPackage.replaceAll("\\.", "/");
		
		for (File resource : dir.listFiles()) {
			if (resource.isDirectory()) {
				List<Class<?>> subDirClasses = getClasses(resource, dotSeparatedPackage);
				classes.addAll(subDirClasses);
			
			} else {
				if (isClassFile(resource)) {
					Class<?> clazz = getClass(resource, slashSeparatedPackage);
					if (clazz != null) {
						classes.add(clazz);
					}
				}
			}
		}
		return new ArrayList<Class<?>>(classes);
	}

	private static boolean isClassFile(File resource) {
		return (resource.isFile()) && 
					resource.getName().endsWith(".class") ?  true : false; 
	}
	
	private static Class<?> getClass(File file, String slashSeparatedPackage) throws ClassNotFoundException {
		String fqcn = changeFqcn(file, slashSeparatedPackage);
		
		if (fqcn != null) {
			return Class.forName(fqcn);
		} else {			
			return null;
		}
	}
	
	/*
	 * Fileが指定パッケージのクラスだったらFQCNに変換
	 */
	private static String changeFqcn(File classFile, String slashSeparatedPackage) {
		String uri = classFile.toURI().toString();
		int beginIndex = uri.indexOf(slashSeparatedPackage);
		int endIndex = uri.lastIndexOf(".class");
		
		if (beginIndex < 0 || endIndex < 0) {
			return null;
		
		} else {
			String uriSubString = uri.substring(beginIndex, endIndex);
			String fqcn = uriSubString.replaceAll("/", ".");
			return fqcn;
		}
	}

```
flymakeでエラーになり、またバッファーを開こうとするとEmacsが固まるときの対処

あるソースファイルを読み込んだ時にflymakeでエラーになり、またファイルを開こうとするとEmacsがフリーズして使えなくなる状態が起きていました。

どうも次の設定をしておくと幸せになれるみたいです。

```cl:flymake-config.el
(defadvice flymake-post-syntax-check (before flymake-force-check-was-interrupted)
  (setq flymake-check-was-interrupted t))
(ad-activate 'flymake-post-syntax-check)
```

情報の参照元: http://d.hatena.ne.jp/sugyan/20100705/1278306885
clangの最適化でreturn文がないメソッドの返値が変わる

最適化オプションで挙動が変わります。BOOL値を返すメソッドをオーバーライドしたときにreturn書き忘れてはまった…。

```
#import <Foundation/Foundation.h>

@interface Hoge : NSObject
@end

@implementation Hoge

+(BOOL)hoge {
    NSLog(@"Say hoge"); // 何か関数を呼ぶ
    // return 書き忘れる
}

@end

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        
        NSLog(@"Return value: %d", [Hoge hoge]);
    }
    return 0;
}
```

- None [-O0]
 - `Return value: 0`
- Fastest, Smallest [-Os]
 - ` Return value: 51 `

-Osオプションだと最後に呼んだ関数の何かが返る。GCCでもこういうのあるんですかね。
Chrome でブラウザバック時に異なる Content-Type のキャッシュが表示される


Chrome 21 は (おそらく) キャッシュを URL 単位で行っており、Content-Type を考慮していない。これが原因で、意図しないキャッシュが使用されることがある。

下記がテスト用の Sinatra アプリケーション。

```ruby
#!/usr/bin/env ruby

# # Gemfile
# source :rubygems
# gem "sinatra"
# gem "rack-conneg"

require "sinatra"
require "rack/conneg"

use(Rack::Conneg) {|conneg| conneg.provide([:html, :json]) }

get "/" do
  respond_to do |format|
    content_type negotiated_type
    format.html {
      <<-HTML
        <!DOCTYPE html>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
        <script>
          $.getJSON("/"); // 同じ URL を JSON で取得
        </script>
        <a href="/foo">Click me</a>
      HTML
    }
    format.json { %("JSON response") }
  end
end

get "/foo" do
  "Please back"
end
```

これを起動して localhost:4567 へアクセスし、リンクをクリック -> ブラウザバックすると、最初に表示された HTML ではなく JSON が表示されてしまう。

流れはこうなっている。

```
# 1. 最初のアクセス
GET / HTTP/1.1
Accept: text/html

# 1 のレスポンス
# これを / のコンテンツとしてキャッシュ
200 OK
Content-Type: text/html;charset=utf8

<!DOCTYPE html>
...

# 2. 非同期通信
GET / HTTP/1.1
Accept: application/json

# 2 のレスポンス
# これを / のコンテンツとしてキャッシュを上書き!
200 OK
Content-Type: application/json;charset=utf8

"JSON Response"

# この後、リンクをクリックしてページ遷移後、ブラウザバックすると、
# 2 のレスポンスをキャッシュとして表示してしまう。
```

同様に下記の問題も起こる。

1. 非同期通信で JSON を取得
2. 1 と同じ URL へページ遷移 (HTML レスポンスを取得)
3. ブラウザバック
4. 1 と同様に JSON を取得しようとしても 2 のキャッシュ (HTML) を取得してしまう

なお、Safari 6, Firefox 15 では問題は発生しなかった。
HTTP の仕様がどうなっているかは未確認。
Windows eclipse 3.7 NDKビルダー設定

elipse でプロジェクトを右クリック、プロパティ、ビルダーを順にに選択。
新規作成ボタンを押下し以下を入力。

名前：NDK Builder
ロケーション：C:\cygwin\bin\bash.exe
作業ディレクトリ：${workspace_loc:/プロジェクト名}
引数：/cygdrive/C/android/android-ndk-r8b/ndk-build NDK_DEBUG=1

環境タブに移動し、以下の環境変数を新規作成。
名前：PATH
値：/cygdrive/c/cygwin/bin

これでOKボタン押下でビルドが始まる。
なお、環境変数を指定しないと、make がないとぬかす。
FakefsでTest-Drivenな運用スクリプト

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

見せかけのFilesystemを操作して、運用系のRubyスクリプトをテストする。

FakeFS[https://github.com/defunkt/fakefs]


## ディレクトリ・ファイルを操作するサンプルツール

ディレクトリを操作するメソッドを用意、屋上に屋根状態だが実際はあれこれと処理をしてから実行します。

```ruby:app.rb
#!/usr/bin/env ruby
# cording: utf-8

def create_dir(dir_name)
  Dir.mkdir(dir_name)
end

def remove_dir(dir_name)
  Dir.rmdir(dir_name)
end
```

## Fakefsを使ったテストを書く

fakefsは`Dir`やら`File`,`symlink`あたりをオーバーライドして、仮想的なファイルシステム上での操作にしてくれる。

```ruby:test_app.rb
#!/usr/bin/env ruby                                                                                                                                                       # cording: utf-8
require 'bundler/setup'
require 'test/unit'
require 'fakefs'

require "./app"

class AppTest < Test::Unit::TestCase

  def test_create_dir
    create_dir("hoge")
    assert Dir.exists?("hoge") 
  end

  def test_remove_dir
    Dir.mkdir("piyo")
    remove_dir("piyo")
    assert !Dir.exists?("piyo") 
  end
end
```

このテストで`test_create_dir`の後ならディレクトリ`hoge`が残っているはずだが、実ファイルシステム上には存在しない。

## テスト実施

実行のサンプル

```test
$ ./test_app.rb 
Run options: 

# Running tests:

..

Finished tests in 0.007162s, 279.2516 tests/s, 279.2516 assertions/s.

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

```

テストOK、`hoge`も`piyo`も実ファイルシステム上には作られない。
ActiveRecord Validationの書き方メモ


カラムを軸とした場合のvalidationの書き方の例

```ruby:
validates :column,
  :presence => true,  # 必須
  :uniqueness => true, # ユニーク制約
  :uniqueness => {:scope => :column2}, # 複数カラムでのユニーク制約
  :numericality => only_integer, # 整数のみ
  :length => { :in => 10..100 },  # 長さ制約(〜以上、〜以下)
  :length => { :maximum => 100 } # 長さ制約(〜以下)
  :format => { :with => /regex/ } #正規表現マッチ
```

独自定義のメソッドで検証

```ruby:
validate :validate_example

def validate_example
  errors_add
end
```
スムーススクロール

```javascript:smoothscroll
     $('a[href*=#]').click(function() {
	 if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'')
	 && location.hostname == this.hostname) {
	   var $target = $(this.hash);
	   $target = $target.length && $target
	   || $('[name=' + this.hash.slice(1) +']');
	   if ($target.length) {
	  var targetOffset = $target.offset().top;
	  $('html,body')
	  .animate({scrollTop: targetOffset}, 900);
	    return false;
	   }
	  }
	  });
	  
	$('a').click(function(){
		if(this.hostname != location.hostname || $(this).attr("href").match(/http:\/\/ecworkers.jp\/kadai\//) ) {
			this.target = '_blank';
		}
	});

```
xCodeのpng自動最適化

[xcode4.3時点]
xCodeはバンドルで追加したpngを自動で最適化するようですね。
その時に使われるのが、pngcrush。これはアップルが改造を施したもののようで、
-iphone-optimizationsオプション等が使えるようになっている。（どうやらalphaプリマルチ化等やバイトスワップで最適化してるらしい。一般のpngとはかけ離れた状態になるそうだ）
実際かなり描画等高速化されるようだ
ただxCodeのpng最適化が入ると、自分で圧縮率等を設定しても上書きされてしまうので、
自分で設定したい場合もある。
そんなときは、自分でpngcrushを使い、Compress PNG FilesオプションをNOにする、もしくはバイナリファイルとして読み込む、といった手順でやるしかない。

例えば圧縮をやめてサイズよりもpngデコード時間(CPU時間)を減らしたい場合、
pngcrush -iphone-optimizations -rem alla -l 0 
等とするのがいいようだ
-rem alla　余計な情報をけずる
-l 0 圧縮率 0は圧縮しない 1~9で9が高圧縮
ちなみに現在pngcrushは
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/binにあるようだ
古い記事では場所が違っていて見つけるのに時間がかかった
もっともこの記事もそのうち古くなってしまうのだが・・・
Rails.vimでPartialを一瞬で作る方法

テンプレートをPartialに分けるのって面倒くさいですよね
そこでVimのRails開発用プラグインRails.vimを使って簡単にPartialをつくりましょう。

## レシピ
- Partial化したい部分をビジュアルラインモード（V）で選択
- `:Rextract {file_name}`と入力（例えば_post.html.hamlが欲しければ、`:'<,'>Rextract post`)
- ウインドウが分割されるので保存する

Partialファイルが作られるだけでなく元のビューファイルには読み込みのためのrenderもかかれるところが賢いと思います。
C#　+ LINQ でJSONのパースをする

今回はWindowsPhoneです。

JSON.netを利用します。解析対象はFoursquareのexploreAPI。

レスポンスのJSONの内、Venueのみを抽出します。

結論から言うと、シリアライズした方が楽。

まずは結果を保存する`venue.cs`

```c#:venue.cs
namespace ConflimJsonParser
{
    public class Venue
    {
        public string name { get; set; }
        public string address { get; set; }
        public string crossStreet { get; set; }
        public string city { get; set; }
        public string state { get; set; }
        public string country { get; set; }
        public string cc { get; set; }
        public double lat { get; set; }
        public double lng { get; set; }
        public string id { get; set; }
    }
}
```

そして、実際に解析を行う`MyParser.cs`

```c#:MyParser.cs
using System.Linq;
using Newtonsoft.Json.Linq;
using System.Diagnostics;

namespace ConflimJsonParser
{
    public class MyParser
    {
        private string json = "省略";

        public void parse()
        {
            var str = JObject.Parse(json).SelectToken("response.groups").ToString();
            var venues = JArray.Parse(str).SelectMany(groups => groups["items"])
                .Select(items => items["venue"]).Select(venue =>
                {
                    var location = venue["location"];
                    return new Venue()
                    {
                        name = (string)venue["name"],
                        id = (string)venue["id"],
                        address = (string)location["address"],
                        crossStreet = (string)location["crossStreet"],
                        city = (string)location["city"],
                        state = (string)location["state"],
                        country = (string)location["country"],
                        cc = (string)location["cc"],
                        lat = (double)location["lat"],
                        lng = (double)location["lng"],
                    };
                });

            foreach (var venue in venues)
            {
                Debug.WriteLine(venue.name);

            }

        }

    }
}
```

同じ事をAndroidのJsonObjectとかを使ってやろうとすると、
forやifの鬼ネストになるんだろうな。

そういう意味では、すっきりしていてLINQは好きです。

好きだけど、やっぱりパーツの再利用が上手くできないというか何というか。

その辺上手く書けるようになりたいものですね。
Google Closure Libraryでアニメーションメモ


`goog.fx.dom.Slide`クラスからインスタンスを作り、その後にplayメソッドなどでアニメーションを実行するのが基本的な流れ。
引数は、**[element, startPos, endPos, duration, easing-opt]** の順。

easing-optに指定するのは関数で、イージングの状態を制御する関数を渡す。標準的なease-inなどは予め`goog.fx.easing`のプロパティとして、easeIn, easeOut, inAndOutの3つが登録されている。

```javascript
var el = this.getEl(),
    startPos = [0, 0],
    endPos   = [100, 100],
    time     = 3000,
    slide = new goog.fx.dom.Slide(el, startPos, endPos, time);

goog.style.setStyle(el, {
    position: 'absolute'
});
slide.play();
```

定義されている関数は以下の通り。
基本的に0 ≤ t ≤ 1の値を渡すと、0→1に変化する関数を渡せばよさそう。

```javascript
//easeOut
function (t) {
  return 1 - Math.pow(1 - t, 3);
}
```

```javascript
//easeIn
function (t) {
  return t * t * t;
}
```

```javascript
//inAndOut
function (t) {
  return 3 * t * t - 2 * t * t * t;
}
```
railsのインストールで dyld: Library not loaded /usr/local/lib/libmpc.2.dylib 

gemでjsonをインストールしようとすると
dyld: Library not loaded: /usr/local/lib/libmpc.2.dylib
が出た場合の対処。

``` 
brew switch libmpc 0.9

```

多分homebrewでパッケージをアップデートした際にlibmpc.2.dylibのバージョンが上がって
リンクできなかったよう。
時間がなかったので詳細の特定まではやっていないけど、とりあえずbrewでもとに戻して
ことなきを得た。
とりあえず、メモとして残しておく。
Google SpreadSheetで使用されているGIDのテーブル


```javascript
GID_TABLE = {
    'od6': 0, 
    'od7': 1, 
    'od4': 2, 
    'od5': 3, 
    'oda': 4, 
    'odb': 5, 
    'od8': 6, 
    'od9': 7, 
    'ocy': 8, 
    'ocz': 9, 
    'ocw': 10, 
    'ocx': 11, 
    'od2': 12, 
    'od3': 13, 
    'od0': 14, 
    'od1': 15, 
    'ocq': 16, 
    'ocr': 17, 
    'oco': 18, 
    'ocp': 19, 
    'ocu': 20, 
    'ocv': 21, 
    'ocs': 22, 
    'oct': 23, 
    'oci': 24, 
    'ocj': 25, 
    'ocg': 26, 
    'och': 27, 
    'ocm': 28, 
    'ocn': 29, 
    'ock': 30, 
    'ocl': 31, 
    'oe2': 32, 
    'oe3': 33, 
    'oe0': 34, 
    'oe1': 35, 
    'oe6': 36, 
    'oe7': 37, 
    'oe4': 38, 
    'oe5': 39, 
    'odu': 40, 
    'odv': 41, 
    'ods': 42, 
    'odt': 43, 
    'ody': 44, 
    'odz': 45, 
    'odw': 46, 
    'odx': 47, 
    'odm': 48, 
    'odn': 49, 
    'odk': 50, 
    'odl': 51, 
    'odq': 52, 
    'odr': 53, 
    'odo': 54, 
    'odp': 55, 
    'ode': 56, 
    'odf': 57, 
    'odc': 58, 
    'odd': 59, 
    'odi': 60, 
    'odj': 61, 
    'odg': 62, 
    'odh': 63, 
    'obe': 64, 
    'obf': 65, 
    'obc': 66, 
    'obd': 67, 
    'obi': 68, 
    'obj': 69, 
    'obg': 70, 
    'obh': 71, 
    'ob6': 72, 
    'ob7': 73, 
    'ob4': 74, 
    'ob5': 75, 
    'oba': 76, 
    'obb': 77, 
    'ob8': 78, 
    'ob9': 79, 
    'oay': 80, 
    'oaz': 81, 
    'oaw': 82, 
    'oax': 83, 
    'ob2': 84, 
    'ob3': 85, 
    'ob0': 86, 
    'ob1': 87, 
    'oaq': 88, 
    'oar': 89, 
    'oao': 90, 
    'oap': 91, 
    'oau': 92, 
    'oav': 93, 
    'oas': 94, 
    'oat': 95, 
    'oca': 96, 
    'ocb': 97, 
    'oc8': 98, 
    'oc9': 99
};
```
settingslogicで環境によって異なる定数を扱う

settingslogicというgemで環境ごとに異なる定数が使える。

##設定方法
Gemfileに記述して`$ bundle install`

```ruby:Gemfile
gem "settingslogic"
```

設定ファイル用のモデル作成

```ruby:app/model/settings.rb
class Settings < Settingslogic
  source "#{Rails.root}/config/application.yml"
  namespace Rails.env
end
```

続いて、config/application.ymlを作成
　例：locationという定数を設定

```ruby:config/application.yml
development:
  location: "Saitama"

production:
  location: "Tokyo"
```

これでOK。

##使い方
`Settings.設定項目名`で設定した定数が参照可能になる
上記の例だと
　開発環境なら`Settings.location`が"Saitama"、
　本番環境だと"Tokyo"として読み込まれる

参考：http://d.hatena.ne.jp/ramtiga/20110418/p1
　　　http://d.hatena.ne.jp/seiunsky/20100912/1284299997
jQuery Mobileを利用したページでauth認証後のページが表示されないときの解決法

railsのomniauth-facebookで、スマホWebページにfacebookログインを実装していたところ、jQuery Mobileが効かなくなって詰まったのでメモ。

## 原因
コールバックで返ってくるURLに、"#\_=\_"という余計なやつがくっついてくるのがどうやら原因らしい。jQuery Mobileがなぜか効かなくなる。

## 解決法
上記のURLの余計な部分をjavascriptで取り除く。

表示したいページのviewファイルに

```html:hoge.html.erb
<script>
if (window.location.hash == "#_=_") window.location.hash = "";
</script>
```

を加える。これで解決した。

こちらを参考にした。
http://stackoverflow.com/questions/10539983/jquery-mobile-page-wont-load-after-facebook-authentication-in-chrome
Project Euler/problm 2

>Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:

>1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

>By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.

```haskell:problem2.hs
import Data.List

main = print $ foldl1 (+) $ filter even $ takeWhile(<4000000) $ fibList [2..]

fibList::[Int]->[Integer]
fibList = map (\n->round ((((1+sqrt 5)/2)^n - ((1-sqrt 5)/2)^n)/(sqrt 5)))
```

```text:answer
4613732
```
Regexp#+を定義して「または」を簡単に作る

「AまたはB」のような正規表現を簡単に作ろうと思って以下のようにしてみたら、うまくいかなかった。

```ruby
001 > /qiita/ + /kobito/
NoMethodError: undefined method `+' for /qiita/:Regexp
```

意外にも`Regexp#+`が定義されてなかったので、以下のようにクラスを拡張してみた。

```ruby
class Regexp
  def +(other)
    Regexp.new(self.source + '|' + other.source)
  end
end
```

`Regexp#source`はその正規表現の文字列を返すメソッド。で、期待通りにうまくいった。

```ruby
002 > /qiita/ + /kobito/
=> /qiita|kobito/
```
Mac Mountain Lion の Apache 起動、終了方法

/etc/apache2/users/<USER>.conf

に

```
<Directory "/Users/<USER>/Sites/">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
```

と書いて、コンソールで、

```
sudo apachectl start  ←起動
sudo apachectl stop ←終了
sudo apachectl restart ←再起動
```

公開されるフォルダは 

```
/Users/<USER>/Sites/
```
Unicorn with Rails on Heroku (Cedar stack)

という訳でUnicornにしてみました。

以下「取り敢えず動く」セットアップ手順です。
実質
[How to get 4x the performance out of Heroku with Unicorn](http://blog.railsonfire.com/2012/05/06/Unicorn-on-Heroku.html)
の中途半端な和訳です。

-

###Install
`$ gem install unicorn`

```ruby:Gemfile
gem 'unicorn'
```

Procfileを作ります。
`$ vim Procfile`

```Procfile:Procfile
web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
```

config/unicorn.rbを作ります。
`$ vim confing/unicorn.rb`

```ruby:config/unicorn.rb
worker_processes 3
timeout 30
preload_app true

before_fork do |server, worker|
  # Replace with MongoDB or whatever
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.connection.disconnect!
    Rails.logger.info('Disconnected from ActiveRecord')
  end

  # If you are using Redis but not Resque, change this
  if defined?(Resque)
    Resque.redis.quit
    Rails.logger.info('Disconnected from Redis')
  end

  sleep 1
end

after_fork do |server, worker|
  # Replace with MongoDB or whatever
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.establish_connection
    Rails.logger.info('Connected to ActiveRecord')
  end

  # If you are using Redis but not Resque, change this
  if defined?(Resque)
    Resque.redis = ENV['REDIS_URI']
    Rails.logger.info('Connected to Redis')
  end
end
```

Loggingを有効にするため、application.rbに追記します。

```ruby:config/application.rb
config.logger = Logger.new(STDOUT)
```

-

###About Config
詳細なすべての設定パラメータは[Unicorn Documentation](http://unicorn.bogomips.org/Unicorn/Configurator.html)で見つかります。

-
`worker_processes:` Unicorn workerの数を設定します。
`timeout:` 一つのworkerが反応を返さなくなってからリスタートまでの時間です
`preload_app:` forking workerの前にアプリケーションを読み込みます。NewRelicを使う場合はtrueに、設定しない場合はNewRelicで何のdataも見れません。
`before_fork/after_fork:` databaseにbofore_fork内で切断し、after_fork内で再接続します。これらのハンドラーなしではdatabase errorが発生します。

-

`worker_processes`数を変更する際はNewRelic等でメモリの使用状況を確認しながら行いましょう。
一つのDynoにつき512MBが許容範囲なので、それを超える設定をしてしまうとDynoが落ちます。（どこかで1.5GB超えると強制終了とか読んだ気がするがソースがない）
参考元にはDynosの数と`worker_processes`数を同じにしましょう、と書かれているのですが、その辺りは詳しく分かりません。
`worker_processes`は一つのDyno上で動くUnicorn workerの数なのに、Dynosの数と併せる理由って…？

参考元にworker数毎のベンチマーク結果など載ってますので、興味のある方は目を通すのも良いと思います。

試しにNewRelicで確認しながらworker_processesを2から4にしてみた所、綺麗にメモリ使用量が倍になりました。
無料範囲内で遊んでるだけなのでworker Dynoもいない状態でweb Dynoひとつなんですが、これって意味あるのかな。

-

####etc.
設定に関しては
[次世代RailsサーバーUnicornを使ってみた](http://techracho.jp/?p=2075)
[nginx + Unicorn を試してみた](http://d.hatena.ne.jp/milk1000cc/20100804/1280893810)
[Unicorn: Rack HTTP server for fast clients and Unix](http://unicorn.bogomips.org/)
辺りを眺めながら
[How to get 4x the performance out of Heroku with Unicorn](http://blog.railsonfire.com/2012/05/06/Unicorn-on-Heroku.html)
に従って行いました。上の3つはもう少し分かってから詳しく読んで参考にしようかと思います。

-

書き終わってから和訳してる部分と自分の言葉が中途半端に混ざってる部分があって申し訳ない気分になりました。どうせなら全部普通に訳せばよかった。
CentOSにChef Serverを最速でインストールする

# CentOSにChef Serverを最速でインストールする

## 前提
* CentOS 6.x

## 初期設定
* selinuxはオフ
* ポート4000と4040をオープン
  * 4000はAPI
  * 4040はWeb GUI


## RBELの導入

RBELは、http://rbel.frameos.org/ さんが提供してくれているRHEL用のRubyとOpscode Chefレポジトリです。感謝。

```
rpm -Uvh http://rbel.frameos.org/rbel6
```


## chef一式のインストール
```
yum install rubygem-chef-server
```

## セットアップスクリプトの実行

```
setup-chef-server.sh
```

## Web GUIの起動

```
service chef-server-webui start
```

## ブラウザからアクセスする

http://example.org:4040/

* 初期ユーザ admin
* 初期パスワード chef123go

ログインするとパスワードの変更を求められる。
Mac初期化後の「開発」環境構築メモ（2012年9月版）


## 事前設定

[Mac初期化後の「作業」環境構築メモ(2012年9月版)]
(http://qiita.com/items/22b874ab510baf12454e)

## コンセプト

- XAMPPやMAMPは利用しない
- ApacheやPHPはデフォルトのものを利用
- MySQLはbrewやportではなく、パッケージ版を利用
- その他は基本的にhomebrewからインスコ


## 作成環境(+install tools)

- Apache
- PHP
- MySQL
- Ruby(rbenv)
- Rails
- Node.js
- Git
- wget
- curl
- w3m
- tmux
- nkf
- cmake
- coreutils
- readline

## brew install

```bash.sh
$ brew install wget curl w3m tmux nkf cmake coreutils readline node git rbenv ruby-build

$ brew link readline
```

## AMP(Apache + MySQL + PHP)

### Apache

*コンセプト*

- /etc/apache2/http.confの設定
- /etc/apache2/extra/httpd-vhosts.confの設定
- /etc/apache2/other/*.confで各種localhostを管理

```/etc/apache2/http.conf
# 111行目あたり、コメント(行頭の#)を外す
LoadModule php5_module libexec/apache2/libphp5.so

# 623行目あたり、コメント(行頭の#)を外す 
# Virtual hosts
Include /private/etc/apache2/extra/httpd-vhosts.conf
```

```/etc/apache2/extra/httpd-vhosts.conf
# 元から入っているVirtualHostの設定は削除して下記追記
<VirtualHost *:80>                                                                                                                                                               
  ServerName localhost
  DocumentRoot "/Library/WebServer/Documents"
</VirtualHost>
```

デフォルトで /etc/apache2/other/ にある.confファイルはすべて読み込まれるようになっているので、virtualhostが必要になるたびにファイルを作成して下記のような形式で追加していく(/etc/hostsファイルの編集も忘れない。*下記例*)

```dropbox.localhost.conf
<VirtualHost *:80>
  ServerName dropbox.localhost
  DocumentRoot "/Users/username/Dropbox/localhost/htdocs/"
  <Directory /Users/username/Dropbox/localhost/htdocs/>
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>
```

```etc/hosts
127.0.0.1 dropbox.localhost
```

```
httpd -S
# または sudo apachectl restart
```

- システム設定＞共有からWeb共有にチェック

注意: Forbidden(403)が出たら、chmodで権限を変更する。(Documents,DropBoxなどのフォルダを指定する場合など)

---

### MySQL

Download: http://dev.mysql.com/downloads/mysql/

最新のdmgファイルをダウンロード、下記をダブルクリックinstall

- mysql-5.5.27-osx10.6-x86_64.pkg
- MySQLStartupItem.pkg
- MySQL.prefPane(コンピュータ全体用)

PATHを追加

```.bashrc
export PATH=$PATH:/usr/local/mysql/bin
```

---

### PHP

php.iniがないので、php.ini.defaultをコピーして作成する

```
sudo cp /etc/php.ini.default /etc/php.ini
```

```/etc/php.ini
# mysqlのsocket関連をすべて正しいsocketに設定
# 1077行目
pdo_mysql.default_socket=/tmp/mysql.sock
# 1231行目 
mysql.default_socket = /tmp/mysql.sock  
# 1290行目       
mysqli.default_socket = /tmp/mysql.sock 

#最終行の[xdebug]
コメント(行頭「;」)をすべて外して有効化
```

## Ruby,Rails
基本的に下記サイトの手順と同じ。
[Ruby on Rails 3.2 を Mac OS X にインストールする手順をかなり丁寧に説明してみました]
(http://www.oiax.jp/rails/zakkan/rails_3_1_installation_on_macosx.html)

以下の追記を.bashrcにすること

```
export PATH="~/.rbenv/shims:$PATH"
```
Mac初期化後の「作業」環境構築メモ(2012年9月版)


## MacApp
- ClamXav: http://www.clamxav.com/
- googleChrome: http://www.google.co.jp/chrome/intl/ja/landing_ch.html
- firefox: http://mozilla.jp/firefox/
- DropBox: https://www.dropbox.com/
- Skype: http://www.skype.com/intl/ja/get-skype/
- Thunderbird: http://mozilla.jp/thunderbird/
- googleIME: http://www.google.co.jp/ime/index-mac.html
- KeyRemap4MacBook: http://pqrs.org/macosx/keyremap4macbook/index.html.ja
- PCKeyboardHack: http://pqrs.org/macosx/keyremap4macbook/pckeyboardhack.html.ja
- Keynote: from Appstore
- Coda2: App Store
- Mi: http://www.mimikaki.net/
- Filezilla: http://filezilla-project.org/
- FreeMemory: http://itunes.apple.com/jp/app/freememory/id460931672
- Growl: http://growl.info/
- SecondBar: http://blog.boastr.net/?page_id=79
- BetterSnapTool: AppStore
- Dash: Appstore
- Reeder: Appstore
- StuffIt Expander: http://www.act2.com/software/smithmicro/stuffitexpander2011
- Skitch: from AppStore
- Kobito: http://kobitoapp.com/
- AppCleaner: http://www.freemacsoft.net/appcleaner/
- VMwareFusion: http://www.vmware.com/jp/products/desktop_virtualization/fusion/overview.html
- WindowsXP: from Disc
- MacOffice: from Disc

## Firefox-Add-on
- Firebug
- FireMobileSimulator
- ツリー型タブ
- はてなブックマーク
- ColorZilla
- Awesome screenshot


## Xcode
- Xcode: AppStore

=> preference>Download

- iOS simulater
- command line tools


## Programming

- Phonegap: http://phonegap.com/download
- iTerm2: http://www.iterm2.com/#/section/home
- Homebrew: http://mxcl.github.com/homebrew/
- MacVim-kaoriya: http://code.google.com/p/macvim-kaoriya/downloads/list?can=1&q= 


## 開発環境

[Mac初期化後の「開発」環境構築メモ（2012年9月版）]
(http://qiita.com/items/ee7024b41b0818d7542d)
bashでcdの履歴を10個まで遡ることができるスクリプト

http://geocities.com/h2428/petar/bash_acd.htm

.bashrcに書く

cd --で履歴表示、cd -1など数字で行き先指定

```
$ cd --
 0  ~
 1  ~/.rvm/scripts
 2  /usr/bin
 3  /usr/share/ImageMagick-6.6.9
 4  /etc/init.d
 5  /etc/network/if-up.d
 6  /etc/network
 7  /var/log/postgresql
 8  /etc/ssh
 9  /etc/postgresql

```
Mac OS X に Thrift を インストール

```zsh
curl https://dist.apache.org/repos/dist/release/thrift/0.8.0/thrift-0.8.0.tar.gz > thrift.tgz
cd trhrift-0.8.0
./configure --without-ruby
make
sudo make install
```

普通に configure したらrubyのところでエラーになった。
今回は使わんから--without-ruby にして無事終了。


```zsh
hbase thrift start
```

で、thrift 経由で繋ぐことが出来る。

```
hbase  shell
create 't1', 'f1'

thrift --gen php ~/hbase-0.94.1/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift
```

動かすテストコードは以下より拝借して動かしてみたりする

http://kaworu.jpn.org/kaworu/2012-04-02-1.php
Mac OSXで HBaseのインストール

```zsh
curl http://ftp.meisei-u.ac.jp/mirror/apache/dist/hbase/hbase-0.90.5/hbase-0.90.5.tar.gz > hbase.tgz
tar xzvf hbase.tgz
export HBASE_HOME=$HOME/hbase-0.90.5
export PATH=$HBASE_HOME/bin:$PATH
```
で、http://localhost:60010 に アクセスして、なんか表示されればOK