OmniAICreator/Qiita-1.07M huggingface dataset:
Reserved Instance って何さ？

適当に纏める。


## リザーブドインスタンス (RI)
「長期契約すると安くしますよ」という仕組みのことだと思っていたのだけど、
本来は「貴方たちのためにリソース抑えますよ」って意味らしい。

支払いが頭金で結構かかることに注意。
その変わり安いが、既に運用しているプロジェクト等への適用は注意した方が良い。
全額一括払いというわけではなく、「頭金」+「使用量に応じた従量課金(安価)」となっている。

EC2、RDSが今のところ対応している。

* 契約期間は1年、または3年。
* 軽度使用RI、中度使用RI、重度使用RIの3種類がある
 * 常時稼働の場合は問答無用で重度使用RI。年間使用率によって最適なものを選ぶ。
 * 詳しくは http://aws.amazon.com/jp/ec2/reserved-instances/

基本的にほぼ常時稼働しているようなシステムの場合(稼働率80%以上)は、基本的に重度使用RIを利用する。


### RIマーケットプレイス
いわゆる中古市場。
舌をかみそうな名前だが、「インスタンス買ったけどもう要らないからあんたらにやるよ」ということが出来る。但し、

* 同リージョン、同AZ(AvailabilityZone)

である必要があるので注意。また期間も中古なので当然ながら任意。

<p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/s/skyriser/20130423/20130423132313.png" alt="f:id:skyriser:20130423132313p:plain" title="f:id:skyriser:20130423132313p:plain" class="hatena-fotolife" itemprop="image"></span></p>

SellerがAWSとなっているものが、新品。3rd Partyとなっているものが中古品。
日本ではほとんどお見かけしないかも。


### EC2のRIとVPCのRIの注意点
それぞれのRIは、目的とするインスタンスに適したものを購入しなければならないらしく、
EC2とRDSのRIで微妙に違う。

|種別|Region|AZ|VPC|
|----|----|----|----|----|
|EC2 RI|指定|指定|指定|
|RDS RI|指定|(省略可)|(省略可)|

という感じ。EC2でVPC内のインスタンスに適用したい場合は注意。


## サービスへの適用について
手順に従ってReserved Instanceを購入すれば、条件に一致していれば自動的に値引きが開始される、ということみたい。

```
使いやすさ: リザーブドインスタンスは使いやすく、EC2 の利用方法を変更する必要はありません。
請求額の計算時に、金額が最小になるように最初にリザーブドインスタンス料金が自動的に適用されます。
ある時間に実行するインスタンスの総量が、お客様が保有する適切なリザーブドインスタンス数を超過する場合には、
そのインスタンス時間がオンデマンド料金で課金されるだけです。
```

例えば、既にオンデマンドインスタンスとして立ち上がっているインスタンスがあって、
新たに条件にあうRIを購入すれば自動的にオンデマンドではなくRIとして動作。
逆にRIの期間が過ぎればオンデマンドの料金に戻るということか。


## 参考
* [【AWS発表】 リザーブドインスタンスに新しい2つの料金モデルを追加](http://aws.typepad.com/aws_japan/2011/12/additional-reserved-instance-options-for-amazon-ec2-.html)

基本的なRIの考え方とかが見やすく。

* [リザーブドインスタンス (EC2)](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/concepts-on-demand-reserved-instances.html)
* [Working with Reserved DB Instances](http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithReservedDBInstances.html)

こっちはマニュアル。
homesickでdotfileを管理


今まで、リポジトリにdotfileは登録して、お手製のリンクはるスクリプトなどで対応してたけど、便利なツールがあれば使いたいのと同時に、ソロソロdotfileを一回整理して、公開（ほぼ社内向けかも）しようと思っていたので、思い切って導入。

## GitHub上にリポジトリを作成
dotfilesという名前のリポジトリを作成します。
他人に知られたらまずい情報を載せる際は、Publicなリポジトリにしないように・・・

homesickでフォルダ使うので、最初に少しリポジトリにファイル作っておく。
どこか適当なフォルダで、以下を実行。

```zsh
% touch README.md
% git init
% git add README.md
% git commit -m 'first commit'
% git remote add origin git@github.com:masateru/dotfiles.git
% git push -u origin master
% mkdir home
% touch home/.zshenv
% touch home/.zshrc
% git add .
% git commit -m 'add home dir'
% giｔ push
```

## homesickをインストール

```zsh
% sudo gem install homesick
```

## ファイルの管理

```zsh
% homesick clone masateru/dotfiles
% homesick symlink masateru/dotfiles
```

変更があれば、pushしたり、pullしたりすればOKです。

## (追記)リモートリポジトリの変更

このままローカルの変更点を、commitしてpushしようとしたところ、以下の様なエラーで怒られた。

```zsh
% homesick push masateru/dotfiles
    git push
fatal: remote error:
  You can't push to git://github.com/masateru/dotfiles.git
  Use https://github.com/masateru/dotfiles.git
```

なので、リモートのリポジトリを変更し直して、再度pushすれば、うまくいった。
git log --oneline のお供に --no-merges

![git-log-graph-oneline](http://img.f.hatena.ne.jp/images/fotolife/h/hattorix0/20130508/20130508171016.jpg)

このようなコミットグラフを描く時、簡潔に表示させようと `--graph` を抜くと、

![git-log-oneline](http://img.f.hatena.ne.jp/images/fotolife/h/hattorix0/20130508/20130508171018.jpg)

と表示されます。

しかし、マージコミットが多く、実際の変更コミットが埋もれてしまいますよね。
そこで `--no-merges` オプションを付けてみましょう。

![git-log-oneline-nomerges](http://img.f.hatena.ne.jp/images/fotolife/h/hattorix0/20130508/20130508171019.jpg)

すごく簡潔になりました！
とはいえ、このままでは情報が少なすぎるので `--pretty` で表示を調整しましょう。

```
$ git log --no-merges --date=short --pretty='format:%C(yellow)%h %C(green)%cd %C(blue)%an%C(red)%d %C(reset)%s'
```

![git-log-nomerges-pretty](http://img.f.hatena.ne.jp/images/fotolife/h/hattorix0/20130508/20130508171017.jpg)

good!

## ちなみに

`--no-merges` の逆に、マージコミットのみにする `--merges` オプションもありますよ。
RubyMotionのAppDelegateに書くべき基本的なViewのテンプレート


## ViewControllerのサンプル

```ruby:main_view_controller.rb
class MainViewController < UIViewController
  def viewDidLoad
    super

    @label = UILabel.new
    @label.frame = [[10, 10], [320, 20]]
    @label.font  = UIFont.boldSystemFontOfSize(16)
    @label.text  = "Hello World"

    view.backgroundColor = UIColor.whiteColor
    view.addSubview(@label)

	# for navigation bar
    navigationItem.title = "Navigation Title"

	# for tab bar
	self.tabBarItem = UITabBarItem.alloc.initWithTitle("Tab1", image: nil, tag: 1)
  end
end
```

## Single View

```ruby:app_delegate.rb
class AppDelegate
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
    @window.rootViewController = MainViewController.new
    @window.makeKeyAndVisible
    true
  end
end
```

## Navigation Bar View

```ruby:app_delegate.rb
class AppDelegate
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)

	nav_controller = UINavigationController.alloc.initWithRootViewController(MainViewController.new)
    @window.rootViewController = nav_controller

    @window.makeKeyAndVisible
    true
  end
end
```

## Tab Bar View

```ruby:app_delegate.rb
class AppDelegate
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)

    tab1 = MainViewController.new
	# tab2 = OtherViewController.new
    tab_controller = UITabBarController.new
    tab_controller.viewControllers = [tab1]

    @window.rootViewController = tab_controller
    @window.makeKeyAndVisible
    true
  end
end
```

## 補足

### newはalloc.initと同じ意味

`MainViewController.new` = `MainViewController.alloc.init`

### tap好きな人用

```ruby:
@window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds).tap do |window|
  window.rootViewController = MainViewController.new
  window.makeKeyAndVisible
end
```
javaアプリケーション(mxmlcなど)の出力をUTF-8に


mxmlcをUTF-8なターミナルで実行すると出力が文字化けするので、以下を .bashrc などに記述する。


```
export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8
```

## 参考
[Mac OS X Lion で javac コマンドが文字化けするのを直す](http://d.hatena.ne.jp/snaka72/20120101/1325403702)
sudoとヒアドキュメントでファイルを作成する小技

```
sudo cat<<EOF > /etc/hogehoge.conf
this is a hove
EOF
```

とやってもエラーになりますよね。

```
sudo tee /etc/hogehoge.conf <<EOF
this is a hove
EOF
```

とやればエラーになりません。もし、標準出力に出るのが嫌ならば、

```
sudo tee /etc/hogehoge.conf <<EOF >/dev/null
this is a hove
EOF
```

などとすれば良いです。
Tips : SourceTree for Windows で SSH key を登録しても認証に失敗する

Gitクライアントには、主にSourceTree for Windowsを使用しています。
そのSourceTreeで引っ掛かった落とし穴を残します。


#追記
@kyanro@githubさんよりコメント頂きました。
0.9.1.1beta以降では起動時に自動でPageantを起動する設定が可能になっているとのことです。

##対処
`Tools > Options > General`の中に、`Automatically start SSh agent when SourceTree opens`という項目があるので、これにチェックを入れる。実にシンプル。

##おまけ
また、当初この記事はバージョン0.9.1.1についての記事として投稿しましたが、どうやらそれが間違っていたようです。(なぜなら、上記設定は0.9.1.1で既に追加されていたから)
混乱を招く記述をしてしまい申し訳ありませんでした。

このような勘違いをした経緯としては、
1. `Help > About` を見ても、Versionに `x.x.x.x` としか表記されない
2. `Help > Check For Updates` を見ても、Current Versionが空欄 
3. `Help > Check For Updates` のLastest Updates が0.9.1.1 betaであった
4. `Help > Check For Updates` の `Update Now` ボタンがdisable
という事からでした。

自動アップデートが使用不可なので、公式よりインストーラをダウンロードしインストールすることで正常にアップデートし、`Help > About` や `Help > Check For Updates` のVersionも表示されるようになりました。

私と同じ状況にある方はどんどん更新から取り残されていっているので、是非手動更新しましょう。設定周りが色々と新しくなってますよ。

#元の記事
##__現象__
SSH鍵をputtyで作成し`Tools > Options > General > SSH Key`に登録したのに認証できない。

##__原因__
Pageant(ページェント)が起動していなかった。
Pageantとは、Puttyに付属しているSSH認証の仲介を担当するアプリケーション。
起動している場合には、タスクトレイに帽子かぶったPCのアイコンが出る。
SourceTreeから起動するには、`Tools > Launch SSH Agent (Pageant)`から出来る。


どうやら、こいつはパスフレーズのスキップをしてくれているらしいです。
多分、ppkファイルをOptionsで設定しただけではパスフレーズ入力の箇所で引っ掛かってるんじゃないかと思ってます。

一度起動するとずっと常駐していますが、Windowsを再起動する際にはその度にPageantを起動し直す必要があります。
面倒であれば、スタートアップに入れておくなどの一手間が必要です。
SourceTreeが起動する時に一緒に起動してくれるといいんですが。
sl コマンド(全く役に立たないやつ)

linux を触り始めてはや一ヶ月、まだまだ慣れません

コマンドが覚えられず、権限とかもまだわからないので悪戦苦闘してます

でも、lsコマンドは一日100回以上使っています

けどよくやるのが、 'ls' を 'sl' と打ち間違えること

そうすると「コマンドが見つかりません」と出ます。

これを回避するので、slコマンドです

これできっとあなたのlinuxコマンドーライフが楽しくなるはず
※ジョークソフトなので、実用性は全くありません

以下、slコマンドの取得方法です

1. $ sudo apt-get install sl

パスワードを求められたら入力します
インストールが始まります

2. 'ls'コマンドを入力

実行されるので画面を良く見ていて下さい
iOSアプリ開発で使っている小技みたいなもの


忘れないうちに自分用メモ。

###開発時のみログ出力

``` Objective
#ifdef DEBUG
#define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#define DLog(...)
#endif
```

###UIColorのマクロ

``` Objective
#define RGB(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1]
#define RGBA(r, g, b, a) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:a]
````

2013.05.08 コメントをもとに修正。

###クラッシュレポートの管理 (crashlytics)
	
プロジェクト内に組み込むことで、クラッシュした時の状態を一元管理できる。今後の為に導入して様子見。

###シュミレータと実機の切り替え
下記プリプロセッサで実現

``` Objective
#if TARGET_IPHONE_SIMULATOR
#warning *** Simulator mode: audio session code works only on a device

#else
some code
#endif

```

###参考情報元
* [デバッグ時だけログを出力させたい](http://d.hatena.ne.jp/watanata2000/20110819/1313713104)
* [iPhone開発 コンソールデバッグ時に便利な関数、変数 NSLog ios 逆引き サンプル](http://blog.77jp.net/iphone%E9%96%8B%E7%99%BA-%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%99%82%E3%81%AB%E4%BE%BF%E5%88%A9%E3%81%AA%E9%96%A2%E6%95%B0%E3%80%81%E5%A4%89%E6%95%B0-nsl)
* [iPhoneアプリ開発　－利用するべきサービス－](http://pplace.jp/2013/03/1418/)
* [crashlytics](https://www.crashlytics.com/)
全ディレクトリを別々の zip に圧縮する

./a
./b
./c 
というディレクトリをそれぞれ別々に圧縮して、
./a.zip
./b.zip
./c.zip 
を作りたいときは、以下のコマンドを使えばいい。

```
$ find . \! -name '*.zip' \! -name '.' -type d -exec zip -r {}.zip {} \;
```
CreateJS始める前に、いろんな記事を集めてみよう



## CreateJSをやってるひとのうわさによると

Flasherならドキュメント読めばなんとなくわかるんだって。  
でもやっぱりいろいろ読んでおきたいから、まとめておこう。



## 公式、ドキュメント

* [CreateJS デベロッパーセンター | Adobe Developer Connection [ADC]](http://www.adobe.com/jp/devnet/createjs.html)  
公式。ドキュメント、チュートリアルへのリンクなど。
* [Docs - CreateJS](http://docs.createjs.jp/)  
過去のバージョンを含めたすべてのドキュメントへのリンク



## できること把握系記事

* [リッチなHTML5コンテンツのためのフレームワーク「CreateJS」が公式サイトを公開 | ClockMaker Blog](http://clockmaker.jp/blog/2012/04/createjs-com/)  
CreateJSとは何か的に俯瞰する記事。
* [CreateJSでゲームを作った感想 | Coremind](http://coremind.jp/blog/archives/44)  
いろいろ注意すべき点が書いてある
* [akihiro kamijo: CreateJSアーカイブ](http://cuaoar.jp/html5/createjs/)  
とりあえずざっとみて出来ることを把握




## 情報系

* [CreateJS.jp | FlashクリエイターのためのJSライブラリ、CreateJSを勉強しよう、そうしよう](http://createjs.jp/)  
東京の勉強会。資料もたくさんある。
* [CreateJS Blog](http://blog.createjs.com/)  
公式ブログ
* [JavaScript | kudox.jp](http://kudox.jp/java-script)  
すげーいっぱい記事が投稿されている
* [CreateJS](https://www.facebook.com/CreateJS)  
ポータル的なノリで、最新情報がたくさん。
* [CreateJSに関する新着投稿 - Qiita [キータ]](http://qiita.com/tags/createjs)  
もっと増えるとうれしい。




## ハマり系/Tips

* [Android × Canvas の即死ポイントとその回避策 | buccchi.jp](http://buccchi.jp/blog/2013/03/android_canvas_deathpoint/)
* [CreateJSでハマったこと - まるちゃんブログ](http://d.hatena.ne.jp/cflat-inc/20130325/1364167648)  
明確に落ちるところがあるようだ
* [CreateJS × Android でハマったこと #JavaScript #HTML5 #CreateJS #HTML #canvas - Qiita [キータ]](http://qiita.com/items/6df5e01a7a29417e55c6)
* [CreateJS をはじめる人が知っておくとラクなこと #JavaScript #HTML5 #CreateJS #HTML #canvas - Qiita [キータ]](http://qiita.com/items/fd3054d1aa7ec5164744)  
Tips




## デモ類

* [EaselJS | Local To Global Demo](http://beta.createjs.com/#!/EaselJS/demos/)  
公式デモ。おもしろいのがたくさんある。
* [CreateJSを使ってインタラクティブなHTML5デモを作ってみた | ICS LAB](http://ics-web.jp/lab/archives/93)
* [HTML5 Canvasでパーティクル表現！パーティクルエンジンParticleEmitterJS | ClockMaker Blog](http://clockmaker.jp/blog/2013/04/createjs-particleemitterjs/)
* [CreateJSデモコンテンツ「日本全国花粉飛散マップ」 | ClockMaker Blog](http://clockmaker.jp/blog/2013/03/createjs-pollenmap/)



## やさしい初級系

* [CreateJSでミニゲームを作ってみた » RIAxDNP](http://www.riaxdnp.jp/?p=3248)
* [Adobe Flash Professional Toolkit for CreateJS とりあえずどんなものか | MUSHIKAGO APPS MEMO](http://mushikago.com/i/?p=815)
* [CreateJSを使って簡単なゲームを作ったのでメモ | SUSH-i LOG](http://blog.sus-happy.net/201303/createjs-game/)  
チュートリアル的に書いてくれてる
* [CreateJSで遊んでみる 1日目 EaselJS | WebDelog](http://webdelog.info/2013/03/web/easeljs/)
* [HTML5のCanvasでつくるダイナミックな表現―CreateJSを使う：連載｜gihyo.jp](http://gihyo.jp/design/serial/01/createjs)
設定ファイルとURLからパラメータを読み込む

##設定ファイル(application.conf)内の値を読み込む
    val config = Configuration(ConfigFactory.load())
    val hoge  = config.getString("hoge.fuga").getOrElse("fuga")

##独自に作った設定ファイル内の値を読み込む
    val config = Configuration(ConfigFactory.load(ConfigFactory.parseFileAnySyntax(new File("conf/hoge.conf"))))
    val hoge = config.getString("hoge.fuga").getOrElse("fuga")

##URLから引数を読み込む
###routesを編集

    #リクエストパラメータで受け取る場合
    GET /messages controllers.Application.messages(id: String, name:String)
     
    #パスで受け取る場合
    GET /messages/:id/:name controllers.Application.messages(id: String, name:String)

###コントローラ(Application.scala)を編集

    def messages(id: String, name: String) = Action {
        ...
    }

##参考
Configurationの内部ではTypesafeのconfigが使用されている
* http://typesafehub.github.io/config/latest/api/
Rspecでメソッドチェーンをstubで使う方法

その名も、stub_chain

```ruby
subject.stub_chain("one.two.three").and_return(:four)
```

(参考)
https://www.relishapp.com/rspec/rspec-mocks/v/2-0/docs/stubs/stub-a-chain-of-methods

mockと組み合わせるとこんな感じ

```ruby
mmock = mock       
subject.stub_chain("one.two.three").and_return(mmock.as_null_object).should_receive(:hogehoge)
```
Railsで<Mysql2::Error: closed MySQL connection> が出た場合に必ず確認すること

■ 確認項目２点
・エラーメッセージ付近で発行されたSQLの文字数を確認する。
・MySQL の max_allowed_packet のサイズを確認する。

SQLのサイズが max_allowed_packet の設定値(デフォルト1MB)以下で有れば今回のエントリは関係有りません。ごめんなさい。

------------------------
以下SQLサイズが1MB以上だった人向け。

MySQLには max_allowed_packet という設定項目が有ります。
これは何かというと、１回に発行するSQLのサイズを設定する項目です。
そして、この制限に引っかかると(Mysql2::Error: closed MySQL connection)とかいうエラーが起きて、正常に動作しません(全然メッセージが合って無い！！とは思いましたが。)。

もしあなたがactiverecord-importとかでデータを一括登録している場合は max_allowed_packet を確認したほうがいいと思います。

というか max_allowed_packet をはじめから8MBとか16MBにしておくといいかも。。

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

[追記] エントリを書き終わってぐぐってみたら、まさに今回エラーが起きてたactiverecord-importの新しいバージョンではmax_allowed_packetを見てSQLを分割してくれるようです。

https://twitter.com/DianthuDia/status/292189887145312256

activerecord-import 。上げなくてわ！
array_map(null, ...) で配列を結合

> @fivestr @shimooka array_map(null, $ids, $names); とかは? Python だと 組み込みの zip() で一撃なんだけど、PHP には array_zip() ないんすね。 
>
>  \- https://twitter.com/heavenshell/status/331705230582501377
>
> > $ids = [0, 1, 2];
> > $names = ['foo', 'bar', 'baz'];
> >
> > から
> >
> > [ [0, 'foo'], [1, 'bar'], [2, 'bar'] ]
> >
> > を組み立ててくれるようなPHPの関数知りませんか？ 
> >
> > \- https://twitter.com/fivestr/status/331702099140308992

`array_map(null)` !? 予想外のリプライが来たので試してみた:

    <?php

    var_dump(array_map(null, [1, 2, 3], ['foo', 'bar', 'baz'], ['x', 'y', 'z']));

結果:

    array(3) {
      [0] =>
      array(3) {
        [0] =>
        int(1)
        [1] =>
        string(3) "foo"
        [2] =>
        string(1) "x"
      }
      [1] =>
      array(3) {
        [0] =>
        int(2)
        [1] =>
        string(3) "bar"
        [2] =>
        string(1) "y"
      }
      [2] =>
      array(3) {
        [0] =>
        int(3)
        [1] =>
        string(3) "baz"
        [2] =>
        string(1) "z"
      }
    }


できてる...。そんな使い方があったのか `array_map`。さすがに知らなかった。


> これか。マニュアルにもあった
> http://www.php.net/manual/ja/function.array-map.php#example-4835
>
> \- https://twitter.com/shimooka/status/331707431379927040 

なるほど、マニュアルにも書いてある模様。。。
unless valとunless val?の違い


`unless val` は、空文字列、`0`, `false`, `null`, `undefined` の場合に `true` になる。一方 `unless val?` は `null`, `undefined` の場合に `true` になる。関数の必須引数チェックのときは `throw new Error('') unless arg?` とすることにする。

テストスクリプト

```coffeescript
vals = ['', '0', 0, 0.0, false, 'false', null, 'null', undefined, 'undefined', [], {}]

console.log ' ', '\t', '?', '\t', 'value'
for val in vals
    console.log(
        (unless val  then 'x' else 'o'),
        '\t',
        (unless val? then 'x' else 'o'),
        '\t',
        JSON.stringify(val)
    )
```

結果

```
 	 ?	 value
x 	 o 	 ""
o 	 o 	 "0"
x 	 o 	 0
x 	 o 	 0
x 	 o 	 false
o 	 o 	 "false"
x 	 x 	 null
o 	 o 	 "null"
x 	 x 	 undefined
o 	 o 	 "undefined"
o 	 o 	 []
o 	 o 	 {}
```
PHPの変数記述を簡易な形にしてvimの関数で展開できたらいいな

PHPの変数って記述が面倒ですよね。

```php:こんなの
$x = $result['Data'][0][$type]['price'];
```

みたいな。

特に自分はシングルクォーテーションをブラインドで打つのによく失敗して`&`とか`(`とか打っちゃって、勢いに乗ってガシガシ打ち込んでる時に興ざめします。

というわけでこんな感じに簡易入力したPHPの変数記述

```php:簡易入力
$result.data.0.$type.price
```

を展開するvim関数を作ってみました。まだプロトタイプのアルファ版の叩き台レベルですけど。

```vim
function! EasyPHP()
  " 親変数の部分:「$result.data」の「$result.」まで
  let s = '\(\$[[:alpha:]_]\)\(\([[:alnum:]_"''\[\]]\|->\)*\)\.'
  " 単純な文字列「$result.data」の「data」
  let s1 = s.'\([[:alpha:]_][[:alnum:]_]*\)'
  " 変数指定もしくは配列の添え字「$result.$i」の「$i」とか「$result.0」の「0」
  let s2 = s.'\(\d\+\|\$[[:alpha:]_][[:alnum:]_]*\)'
  " 変数混在のパターン。先頭と末尾がダブルクォーテーション
  let s3 = s.'"\([[:alpha:]_\$][[:alnum:]\$_{}]*\)"'
  let pos = getpos('.')
  call cursor(1, 1)
  " いくつも繋がっていると1回の変換で全部展開できないので何度もループして変換
  while search(s1, 'nW') || search(s2, 'nW') || search(s3, 'nW')
    silent! execute '%s/'.s1.'/\1\2[''\4'']/g'
    silent! execute '%s/'.s2.'/\1\2[\4]/g'
    silent! execute '%s/'.s3.'/\1\2["\4"]/g'
    call cursor(1, 1)
  endwhile
  call setpos('.', pos)
endfunction
command! -nargs=0 -range -complete=command EasyPHP call EasyPHP()
nnoremap <Leader>ep <ESC>:%EasyPHP<CR>
```

.vimrcなんかにこれを登録してノーマルモードの時に`\``e``p`の順番に打つと、こんな感じに展開できます。

```php:簡易入力を展開
$result.data.0.$type.price → $result['data'][0][$type]['price']
```
```php:こんなのも展開
$user."data_$xxx".$i.point → $user["data_$xxx"][$i]['point'] 
```

vimで関数を書くのはほぼ初めてなのでかなりヘボショボな作りです。変数名も我ながらひどい。あと誤爆が怖いのであまり複雑な書き方には対応してないと思います。

現在のやり方はファイル全体に対して正規表現の置換を繰り返しているだけなので、Zen-Codingみたいに変数入力後にコマンド入力してそれだけ展開みたいな事ができると確認しながらできていいのかなーなんて思いますが、いかんせんvim-scriptはさっぱりなのでそこまでできませんでした。

もっとエレガントに改良してくれる方募集中です。あと、すでにこういった展開を行うスクリプトとかが存在していたら教えて頂きたいなーなんて。
コマンドラインからフレームバッファをpngにして取得したい(要root)

元ネタ：http://d.hatena.ne.jp/kinneko/20130507/p36

フレームバッファの内容をそのまま加工できる画像でほしい時ってあるよね。

rootあるんなら、スクリーンキャプチャでいいんじゃないかって？

いやぁ、2.3だったりするとか、コマンドラインしか使えないってこともあるさ。

あるんだってば。

pnmでいいじゃないかって？

画素数とか、色情報とかないとヘッダ作れないし、めんどくさいでしょ？

そういうときは、fb2pngを使う。

Android-fb2png - Capture framebuffer and save it in png format
https://code.google.com/p/android-fb2png/

バイナリあるからもらってくる。

信用できないって人は、ソースもらってきて眺めてビルドするといいよ。

http://code.google.com/p/android-fb2png/downloads/
https://android-fb2png.googlecode.com/files/fb2png-0.0.2

adb pushで転送して、パーミッション変えて実行、結果の画像をもらってくる。

$ wget https://android-fb2png.googlecode.com/files/fb2png-0.0.2
$ adb push fb2png-0.0.2 /data/data/fb2png
5717 KB/s (34628 bytes in 0.005s)
$ adb shell chmod 755 /data/data/fb2png
$ adb shell /udata/data/fb2png /data/data/fb0.png
Saved to /data/data/fb0.png
$ adb pull /data/data/fb0.png
4264 KB/s (912914 bytes in 0.209s)

おしまい。

簡単だね。

動いている絵は上下半分別の絵になっちゃって、ちゃんと取れないことあるよ。
vmdkファイルをVirtualBoxで開いて 'No volume groups found' と怒られたら

* VirtualBox は、VMware で作成した仮想ハードディスク（vmdk形式）を開くことができます
* 新規仮想マシンを作成するウィザードで、既存の仮想ハードディスクとして、vmdkファイルを選択すると、そのまま起動することができます
 * 詳しくはこのへん: [How to open a .vmdk file in Oracle VirtualBox](http://techathlon.com/how-to-run-a-vmdk-file-in-oracle-virtualbox/)
 * 新規仮想マシンで既存の仮想ハードディスクを利用するとSATAコントローラで接続する設定で作成されます

* CentOS 5.x の vmdk ファイルを VirtualBox で開こうとしたところ、```'No volume groups found'``` と言われてしまいました
 * この場合は、SATAコントローラではなく、SCSIコントローラで扱うようにすると読めることがあるようです

#### 参考

* [VirtualBoxでVolume group "VolGroup00" not found というエラーが発生した場合の対処方法](http://yumewaza.yumemi.co.jp/2011/02/virtualbox_grub_fstab_volgroup00_not_found.html)
 * 他のやり方での解決方法（私は試していません）
NSView scaleUnitSquareToSize:がまるで役に立たない

エディタ系で自由ズームを実装したいのがだが、
拡大縮小で定番のメソッドらしきscaleUnitSquareToSize:がまるで使えない。
表示が崩れる・突然の例外スロー(autolayout系)や、クリック挙動が狂う、等問題だらけで全く意図通り動かない。

CALayerのtransformによりスケールをいじることが可能ではあるが、
NSViewではUIViewのように座標系がついてこない。従ってボタン等は正しく動かない。
見た目だけしか変化がない。

どなたかヒントを知っている方は是非教えていただきたいです。
Linuxのファイル容量調べるコマンドメモ

ちょこちょこ使うけど、忘れるのでメモ

とりあえず、全体の容量確認

```
df -h
```

カレントディレクトリ以下で容量だけを出す

```
du -hs
```

ホームディレクトリ以下で容量だけを出す

```
du -hs ~/
```

カレントディレクトリでサブディレクトリを含めた容量を多い順に並び替えて、上位10件を出す

```
du | sort -nr | head -10
```

headじゃなくて、こっちでもいいかも

```
du | sort -nr | more
```
命令型 vs 宣言型プログラミング

http://latentflip.com/imperative-vs-declarative/

> * **Imperative programming**: telling the "machine" how to do something, and as a result what you want to happen will happen.
* **Declarative programming**: telling the "machine"1 what you would like to happen, and let the computer figure out how to do it.

例えば指定されたフォルダー内の`.coffee`ファイルを表示する簡単なコードを書きます。

命令型：

```coffee-script
fs = require 'fs'
path = require 'path'

dirName = process.argv[2]
dirContents = fs.readdirSync dirName

files = (path.resolve(dirName, file) for file in dirContents when file.indexOf('.coffee') isnt -1)

console.log files
```

宣言型：

```coffee-script
fs = require 'fs'
path = require 'path'

dirName = process.argv[2]
dirContents = fs.readdirSync dirName

files = dirContents
  .filter((file) -> file.indexOf('.coffee') isnt -1)
  .map((file) -> path.resolve(dirName, file))

console.log files
```
CoffeeScript簡単な試し方

#CDN+RequireJS(plugin:cs,domReady)

RequireJS上で、CoffeeScriptを使いたいと思ったら出来たのでメモ。
結局なにが簡単なのかというと

```load-coffee.js
        require(["cs!cf1"],function(module){
            module.hello();
        });
```
上のようにHTML上に書くと、cf1.coffeeのスクリプトを動的に読み込んで、その結果を返してくれる。
type=script-coffeeタグもいらない。
ちなみに"cs!"は、プラグイン呼び出しの際の記述方法。
本家のCoffeeScriptロードプラグインを呼んでます。

以下は、CoffeeScriptモジュール。参考まで。

```cf1.coffee
define(["jquery"] , -> return  {hello : -> console.log("loaded-->" + $)} )
```
----------------

##以下完全コード


```coffee.html
<!DOCTYPE html><html><head><meta charset="UTF-8" />

<script data-main="/require_def" src="//cdnjs.cloudflare.com/ajax/libs/require.js/2.1.5/require.min.js"></script>
<script>
    function require_use(){
        require(["cs!cf1"],function(module){
            module.hello();
        });
    }
</script>

</head><body><h1>CoffeeScript Module</h1></body></html>

```

```require_def.js
(function(){
'use strict';

requirejs.config({
urlArgs : "nocache=" + new Date().getTime(),
shim: {
'cs' : ['coffee-script']
},baseUrl : '/'
,paths : {
  'domReady' : 'https://raw.github.com/requirejs/domReady/latest/domReady'
  ,'jquery' : '//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min'
 ,'cs' : 'https://raw.github.com/jrburke/require-cs/latest/cs'
 ,'coffee-script' : '//jashkenas.github.com/coffee-script/extras/coffee-script'
}
});

require(["domReady"],function(dr){
    dr(require_use);   //RequireJSのdomReady callback
});

})();
```
Rails3.2.13とClient Side Validations3.2.5でリモートバリデーションが動かない

リモートバリデーションを、
利用したライブバリデーションを使っていましたが、

何故か、Rails3.2.13とClient Side Validations3.2.5に、
アップデートしたとたんにライブバリデーションが、
常にエラーを返すようになってしまいました、、


## 原因
クライアントバリデーションのリモートバリデーションは、
ajaxで、/validators/【対象項目】=【値】経由でバリデーションチェックを行っています。

そして、バリデーションチェックの成否として、httpステータスを代用して、
成功は200を、失敗は404を返すようになっています。

この/validators/【対象項目】=【値】が/validators/【対象項目】=【値】.jsonとなっていたため、
アクセス先が不正となり、宛先不明という本来の意味の404が返却され、
それがバリデーションチェックエラーの失敗の意味の404と誤認識してしまい、
結果、バリデーション失敗のエラーとなっていました。


## 修正内容
先述したリモートチェック先のURLを、以下のように修正
/validators/【対象項目】=【値】.json
➡ /validators/【対象項目】=【値】
TopCoderと同バージョンのgcc環境をVMware上で構築

競技プログラミング[TopCoder](http://community.topcoder.com/tc)のコンテストで用いられるC++コンパイル環境と同等の環境を、VMware上で構築した方法のメモです。2013年4月現在の情報です。

通常のAlgorithm SRM(Single Round Match)やAlgorithm MM(Marathon Match)のコンテストに参加する場合、あえてここに記載するように環境を構築する必要はありません。

ただし、実行速度の向上を目的とする一部のMarathon Matchで、コンパイラの生成するアセンブリコードを確認したい場合などでは、この手順で、TopCoderの環境と同バージョンのgccを利用できるようになります。

なお、[TopCoderのC++コンパイラはこちらに記載の通り](http://apps.topcoder.com/wiki/display/tc/Processing+Server+Specifications)、以下のようになっています。

>gcc 4.0.2 (RedHat EL 4)

**追記: コンテスト後の議論を確認したところ、TopCoderは64ビット環境ではなく32ビット環境のようです。ですので、以下の情報は正しくありません。いずれにしても、他の競技者の方もgccのバージョンで苦労されていたようですので、バージョンは合わせておくに越したことはないでしょう。**

以下、構築手順を示します。

- CentOS 4.8 x86_64 のVMware用イメージを適当に探してきてダウンロードします。(CentOS 4.3が入手可能な場合は、そちらを利用したほうがよいでしょう。)
  http://heiserz.com/2012/09/07/centos-vmware-images/
- VMwareに仮想マシンを追加して起動します。なおこの際、イメージをコピーしたか移動したか聞かれるので、｢移動｣と答えます。（「コピー」にすると仮想マシンのMACアドレスが変更される関係上、面倒なことになります。）
- passwdを適当に設定します。
- service iptables stop; chkconfig iptables offでファイアウォールを停止します。
- ifconfigでIPアドレスを確認し、ホストOS側からPuTTY等のSSHクライアントで仮想マシンに接続します。
- /etc/yum.repos.d/CentOS-Base.repo を編集します。（この設定ファイルに元から設定されているレポジトリは、もはや提供されていません。公式の過去バージョンレポジトリは、 http://vault.centos.org/ ですが、yumからのアクセスに失敗することが多いので、適当なミラーに設定します。）

```:/etc/yum.repos.d/CentOS-Base.repo
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&rep
o=os
baseurl=http://mirror.hmc.edu/centos/4.8/os/$basearch/
gpgkey=http://mirror.hmc.edu/centos/RPM-GPG-KEY-centos4

#他も同様に修正
```

- gcc 4と関連RPMをインストールします。（ここで、TopCoderより新しいバージョンのgcc 4がインストールされてしまいます）

```bash
# yum install gcc4 gcc4-c++
```

- TopCoderと同じバージョンのgcc 4をインストールしなおします。

```bash
# wget http://vault.centos.org/4.3/os/x86_64/CentOS/RPMS/gcc4-4.0.2-14.EL4.x86_64.rpm
# wget http://vault.centos.org/4.3/os/x86_64/CentOS/RPMS/gcc4-c++-4.0.2-14.EL4.x86_64.rpm
# rpm -ivh gcc4-4.0.2-14.EL4.x86_64.rpm
# rpm -ivh gcc4-c++-4.0.2-14.EL4.x86_64.rpm
```

思い出しながら書いたので、手順に間違いがあるかもしれません。
OpenGLの使い方:バッファ編

# OpenGLの使い方:バッファ編
## 目標
バッファは用途に応じて扱い方が幾分異なりますが，ここでは個別の扱い方には触れず共通する項目を取り上げます．

## バッファオブジェクト
バッファオブジェクトはバッファの諸々を管理するOpenGLオブジェクトです．
他の例に漏れず， **glGenBuffers** で生成， **glBindBuffer** で *target* にバインド，**glDeleteBuffers** で破棄します．

```c:オブジェクト
// 生成
GLuint buffer;
glGenBuffers(1, &buffer);

// バインド
GLenum target;
glBindBuffer(target, buffer);

// バインドを解除
glBindBuffer(target, 0);

// 破棄
glDeleteBuffers(1, &buffer);
```

以下では特に明示しない限り， *target* にバインドされたバッファが対象になります．

## 領域の確保
**glBufferData** で領域を確保します．確保する大きさを *size* に，初期データを *data* に渡します． *data* が **NULL** であれば領域の確保のみを行い初期化はしません． *usage* は領域へのアクセス頻度や方法に応じて適切な値を指定します．

```c:確保
GLsizeiptr size;
const GLvoid* data;
GLenum usage;
void glBufferData(target, size, data, usage);
```

## マッピング
**glMapBufferRange** は *offset* から *length* バイト分の範囲に対してCPUから領域にアクセスが可能なポインタを返します． *access* はユーザが必要とするアクセス方法などを指定します．
使い終わったら **glUnmapBuffer** でマップしたポインタを無効化します．

```c:マッピング
// マップ
GLintptr offset;
GLsizeiptr length;
GLbitfield access;
void* mapped_data = glMapBufferRange(target, offset, length, access);

// アンマップ
glUnmapBuffer(target);
```

# メモ
## **glBufferData**
*usage* には領域へのアクセス頻度(STATIC, STREAM, DYNAMIC)やその方法(DRAW, READ, COPY)に応じて適切な値を指定します．
実際には，バッファの用途により決めるのが良いと思います．例えば，内容に変化の少ない頂点バッファには **GL_STATIC_DRAW** を，描画処理毎に書き換える必要があるUniformバッファには **GL_DYNAMIC_DRAW** を，パーティクルシステムを構成する変換フィードバックバッファには **GL_STREAM_COPY** を指定する，などです．

## **glMapBufferRange**
*access* に **GL_MAP_WRITE_BIT** と合わせて **GL_MAP_INVALIDATE_RANGE_BIT** または **GL_MAP_INVALIDATE_BUFFER_BIT** を指定することで，マップされるときに領域の一部または全部を無効化することができます．領域を無効化するとそれまでに書き込まれたデータがすべて破棄されますが，領域が最新の状態であるかにかかわらずマップできるので，パフォーマンスの向上が期待できます．
しかし無効化された領域を読み取ろうとすると予期せぬ動作を引き起こすので，無効化された領域は残さず上書きする必要があります．

## 領域の更新
バッファの領域を更新するには **glBufferSubData** を使うことができます． **glBufferSubData** は **glMapBufferRange** と異なり，必要なデータを予めメモリ上に用意しておく必要があります．

## バッファ間コピー
OpenGL3.1以上であれば， **glCopyBufferSubData** によりバッファ間でデータのコピーが可能です．
Padrino アプリケーションに積まれた Rack Middleware を確認する


```
$ padrino -v
Padrino v. 0.11.1
$ padrino g project my_project
```

明示的に use で積んだミドルウェアは`MyProject::App.middleware`
で確認できますが、デフォルトで積まれるミドルウェアはそこには表示されません。

そこで、確認用のRakeタスクを作成してみました。

[stacked_middlewares.rake](https://gist.github.com/tyabe/5518782)

Usage:

```
$ pwd
/my_project
$ mkdir tasks
$ wget https://gist.github.com/tyabe/5518782/raw/9e2751b072b044e4b8ae6fa3acedf46f7c3d2221/stacked_middlewares.rake -P tasks/
$ rake middleware
Application: MyProject::App
    Rack::Session::Cookie
    Padrino::ShowExceptions
    Padrino::Logger::Rack
    Padrino::Reloader::Rack
    Rack::MethodOverride
    Rack::Head
    Rack::Protection::FrameOptions
    Rack::Protection::AuthenticityToken
```

なお、実際にどのような順番で call されていくかは、@udzura さんの書かれた[[Rack Middleware たちがどのように呼ばれるかを見てみよう（e.g. Sinatra）](http://blog.udzura.jp/2011/12/04/inspecting-how-rack-middlewares-are-called/)]が参考になります。

これらを使って確認してみたところ、Padrino内でレシーバの異なる use は以下の順番で使われる様です。

1. Padrino.use
2. _default middlewares_
3. Padrino::Application.use
4. MyProject::App.use

例外が発生した場合はこの逆順で伝搬されるので、例外をキャッチするようなミドルウェアを書いた場合には、どのレシーバを使って積むのが良いかを気にする必要がありそうですね。
SkypeにBotを作ろう(Sevabot導入)

IRCにBotを追加していろんな事をする記事はよく見かけますよね。Skypeでそれをやるにはどうすればいいのか、調べてみました。

## Sevabotを選んだ理由

Botの開発には、GitHubでも使われている[hubot](https://github.com/github/hubot)が有名です。hubotにもSkypeアダプタもあるからこれが良さそう、と思い、まずは試してみました。hubotでもSkypeに追加したBotアカウントに対しコマンドを実行させたりするのは簡単です。しかし、例えばチケットを閉じたイベントをあるチャットルームに流そうと思うと、どのチャットルームに流すのか、チャットのIDがわかってないと指定できません。ちょっと調べてみた感じ、そういうインタフェースが見つかりませんでした。スクリプトで調べようと思えば調べられたりしますが、面倒くさいので今回はやめまました。

少し調べてみると、[Sevabot](https://github.com/opensourcehacker/sevabot)っていうSkypeにBotアカウントを導入するための良い感じのアプリがありました。こいつにはチャットのIDの一覧があり、またチャットルームを指定してつぶやかせるのも簡単だったので、導入手順をまとめます。

## Sevabotとは

SkypeにBotアカウントを導入するためのアプリです。Skype4pyをベースにしています。SevabotにはWebベースの簡易なインタフェースもついています。

Sevabotのベースに利用しているSkype4pyとは、SkypeのPython用のAPIです。起動しているSkypeと通信できるので、Sevabotが受け取ったメッセージをSkype4pyを経由して他のユーザーにメッセージしたり、他のユーザーが入力したコマンドをSkype4pyで受け取ってSevabotが処理を行う、という事ができます。Sevabotが受け取るコマンドも拡張できます。

Sevabotを動かすための制限として下記の2つがあります。

- GUIセッションがいる
- SevabotのためのSkypeアカウントがいる

GUIセッションは、xvfbを使ってやれないこともないです。Sevabotの構築をまとめたwikiでもxvfbを使うようにしていますが、特に問題なければUbuntuのデスクトップ版など、Xがインストールされている環境を用意したほうが楽できるでしょう。

## Sevabotのセットアップ

セットアップの流れは下記のとおりです。

1. Skypeのインストール
1. Sevabotのインストール
1. Skypeの起動、アカウント設定
1. Sevabotの設定
1. Sevabotの起動

今日はUbuntu Desktop 12.04をベースに構築手順をまとめます。

### Skypeのインストール

GUIからログインして下記のコマンドを入力

    $ sudo dpkg --add-architecture i386
    $ sudo add-apt-repository "deb http://archive.canonical.com/ $(lsb_release -sc) partner"
    $ sudo apt-get update && sudo apt-get install skype

### Sevabotのインストール

Sevabotはpypiにアップロードしているので、pipでインストールすると楽。設定ファイルのサンプルや、基本的なコマンドが導入されているmoduleはGitHubのリポジトリのものをそのまま使ったほうが楽なので、それも取得する

    $ sudo apt-get install pip git
    $ pip install sevabot
    $ git clone https://github.com/opensourcehacker/sevabot.git sevabot

### Skypeの起動、アカウント設定

Skypeの設定なので、省略

### Sevabotの設定

    $ cd sevabot
    $ cp settings.py.example settings.py
    $ edit settings.py # settings.pyの設定.

#### settings.pyの設定について

SHARED_SECRET - Webインタフェースのパスワード
ADMINS - botを管理するSkypeアカウント
MODULE_PATH - botのコマンドが格納されているパス。自分で新たにコマンドを作成する場合は、既存のものと見分けをつけやすくするため、別フォルダを作成する。
HTTP_HOST - Webインタフェースでアクセスする場合のホスト名
HTTP_PORT - Webインタフェースのポート名

### Sevabotの起動

    $ sevabot

## コマンドの作り方

簡単。Botはコマンドを受け取ると、UNIXの実行結果である標準出力をSkypeのメッセージに出力する。コマンドは

- Shellスクリプト
- Python, Ruby等など

実行できるものであればなんでもいい。ただし、同名のコマンドがMODULE_PATHに重複しないこと。ビルトインのコマンドであるping等々もこの仕組みで追加されています。例えば自分でコマンドを追加するには下記のとおりに設定します。

1. 自作コマンドを置くための custom/ というフォルダを作りましょう。
1. customをsettings.pyのMODULE_PATHに追加しましょう。
1. 下記のようにcustomフォルダの下にmyscript.shを作成しましょう。

```bash
#!/bin/sh
echo "Hello world from my sevabot command"
```

1. chmod u+x myscript.sh として、実行権限をあたえましょう。
1. Sevabotがいるチャットルームで, !reload というコマンドを実行して全コマンドをリロードしましょう。
1. myscript がコマンド一覧に追加され、 !myscript と入力するとコマンドが実行できるようになるはずです。

なお、上記のスクリプトの実行時にはSKYPE_USERNAME, SKYPE_FULLNAMEという環境変数が追加されます。

## Webインタフェースを経由してメッセージを受け取る

同梱されているexamples/send.shを見ると分かる通り、下記の3つのパラメータをURLにpostするとSevabotが受け取ってSkypeに転送します。

URL - http://HTTP_HOST:HTTP_PORT/msg/

msgの後のスラッシュがないと受け付けません。

chat - チャットルームのID
msg - メッセージ本文
md5 -  chatとmsgとshared_secretを連結してmd5を計算したもの

これであなたもSkypeでBotライフが楽しめます!是非おためしください。
[memo] JenkinsでAndroid Test Projectのカバレッジ取得

メモ書き程度で。

* OS: Ubuntu 12.04-server (VMWare内)
* Java: Oracle JDK 1.7
* Android SDK: r21
* Jenkins: 1.514

Jenkinsのプラグインとして、以下を追加。

* Android Emulator Plugin
* Jenkins Emma plugin
* Jenkins GIT plugin

Android Emulator Plugin使うと、勝手にSDKインストールしてくれるので便利。

プロジェクトで、ざっくり以下を設定。

* Git: 各自の環境で。
* ビルド環境: "Run an Android emulator during build"にチェックを入れて、Androidのテストを実行できるようにする。
* ビルド
* シェルの実行: 本体のプロジェクト、テストプロジェクトそれぞれで"build.xml"を生成するようにandroidコマンド実行。(不要にできるような気もする)
* Antの呼び出し: ターゲット"clean emma debug install test" ビルドファイル"テストプロジェクト/build.xml"

ビルドファイルのパスは、"ワークスペース/プロジェクト名"の直下からの相対パスで良さそう。

* ビルド後の処理
* Emmaカバレッジレポートを記録: レポートのディレクトリ/ファイル"**/bin/coverage.xml"

テストプロジェクトの"bin"配下にファイルが生成される。
これがわからずに少しつまずいた。

上記で、Android JUnitのカバレッジを確認しやすくなる。
Ruby技術者認定試験Gold 必勝合格法

[Silver 必勝合格法](http://qiita.com/items/840422d0960345fedbfd) に続いて、Ruby技術者認定試験Gold 必勝合格法をお届けしますよ。

# ★☆注意☆★

[Ruby 技術者認定試験は 2014/10/1 に改訂されます](http://www.ruby.or.jp/ja/news/20140715.html)。本記事は旧バージョン受験時のものなので、参考にしないほうがいいでしょう。……参考に……し……してもいいけど、どうなっても知りませんよ!

# ~~注意(2013/9/23追記, 2013/12/4, 2014/7/10更新, 2014/8/3 取消し)~~

 ~~現行(2014/7/10現在)の試験は、Gold/Silverとも Ruby 1.8.7 を対象としています。しかし[Ruby 1.8.7 はレガシーになり、公式のサポートはもはや提供されていません](https://www.ruby-lang.org/ja/news/2013/06/30/we-retire-1-8-7/)。Heroku 社によって提供されていた延長サポートも[2014/7/31で終了します](https://www.ruby-lang.org/ja/news/2014/07/01/eol-for-1-8-7-and-1-9-2/)。今から Ruby 1.8.7 を使うのは激しく非推奨です。~~

 ~~ですから、……これは個人的な意見ですが……まじめに勉強したい皆様には、受験の延期を推奨します。~~

 ~~逆にまじめでない (単純に資格をゲットしたいだけの方) なら、今のうちに受験するのがおすすめです。1.9 以降は比較的ややこしくなります (特にStringまわり)。2.0 からはさらにややこしくなります (Refinementsというのが追加されますんで)。単に資格をゲットするだけなら、今のほうが学習量が少なくて済むはずです。~~

※[2014/10/1 から Ruby 2.1 対応の問題に改訂されます](http://www.ruby.or.jp/ja/news/20140715.html)。これで Ruby 1.8 系に触る理由が無くなりましたね。

# Gold 試験の概要

試験は4択問題が50問で、100点満点中75点以上を取れば合格です。Silver と同じですね。

Silver を合格しないと Gold を受験できない、ということはありません。ただ両方に合格しないと "Ruby Association Certified Ruby Programmer Gold" の認定証が届きません。つまり……先に Gold を取るメリットは、ありません。そんなトリッキーなことをするのはやめましょうね。

# 試験範囲

Silver の延長戦上にある部分と、そうでない部分とでできています。前者は過去問をやりながらメソッドや文法をゴリゴリ覚える、という作戦でいけます。

後者はメタプログラミングです。method_missing はもちろん、module を include すると何が起きるのか、特異メソッドを定義すると何が起きるのか、クラス構造にどんな変化が起きて、メソッドコールはどんな順序で実行されて、フガフガ……とにかく細かいところまで詳しく知っておかなければなりません。

# 対策本は必須、だけど足りない! 

対策本は今 (2013/05/06) のところ [「Ruby公式資格教科書 Ruby技術者認定試験 Silver/Gold対応」](http://www.amazon.co.jp/dp/4774150010)一択です。この本しかありません。ですので、まずは何も考えずにこれを買いましょう。

この本、残念ながら誤りが多いので、買ったら必ず[正誤表](http://gihyo.jp/book/2012/978-4-7741-5001-7/support)の内容を反映させてください。

巻末の「Ruby Gold 演習問題」を解けるようになるまで勉強すれば合格できます。概ね実際の問題ソックリの良問が採録されています。これらをなんとなく感覚で解けるレベルではダメです。どうしてそんな解答が正しいのか、どうしてこんな問題が出題されるのか、これを使うとどのくらい良いことが起きるのか、ということまで考えながら解きましょう。

で、どうすれば解けるようになるのか、というところですが……これが極めて難しいのです。ちょちょいと勉強するくらいでは、まるで歯が立ちません。

なにせメタプログラミングを勉強しないといけないのです。そのためにはアタマの作りを少し変える必要があるのです。Rubyでプログラムが書けるかどうかというレベルの話ではないのです。天上の世界へと想像をめぐらせる必要があります。ですから、どうしても専門的な訓練が必要になります。そこで……

# 「メタプログラミングRuby」で強化

[「メタプログラミングRuby」](http://www.amazon.co.jp/dp/4048687158) を読みましょう。メタプログラミング部分に関してはこの本で勉強するほうが良い……というより、この本でないとわからないと思います。試しに今、 Module クラス、Class クラス(そう、クラスクラスです) のリファレンスマニュアルを読んでみてください。……どうですか? わかりますか? わかりませんよね? (わかる人はボクよりアタマのいい人なのでこんな記事なんか読まなくていいですよーだ。)

この本、名著です。資格を取るためと割り切る必要なんかありません。どっぷりと漬かりましょう。Rails の魔法もちゃんとわかるようになりますし、すごく大げさなことを言ってしまうと、いかに Ruby で書くことが幸せなことかが理解できます。

しかし副作用として「思わずメタプログラミングをしたくなってしまう病」にかかってしまいます。どっかの国のことわざで「ハンマーを持った人には何もかもが釘に見える」と言いますが、まさにそれです。これはしかたないことので、気をつけるほかありません。まわりの人にも前もって宣言しておくとよいでしょう。「オレ、メタプロ病にかかるかもしれん……」と。

# 泥沼問題に注意

Silver と同じく、50問中に難問が1〜2問ほど出題されます。参考書に載ってない、どう考えてもわからない、実際にプログラムを走らせてみないとわかる気がしない、そんな問題です。

どういう意図かはわかりませんが、そういう泥沼問題が出てきます。100点を取るのは至難の業です。時間が足りない場合はそんな問題をとっととスルーして、他の問題の見直しに時間を使いましょうね。
Androidでemailのバリデーションを行う

Android SDKにあるみたい。そこらにあるダメなバリデータとは異なり、 `foo+bar@gmail.com` のように+を含むものであっても認めてくれる。

```java
boolean ok = android.util.Patterns.EMAIL_ADDRESS.matcher(input).matches();
```

cf. http://stackoverflow.com/questions/9355899/android-email-edittext-validation
HerokuでRuby2.0を使う方法

Gemfileにいかを書き込んでコミットしてデプロイすればOK

> ruby "2.0.0"

Gitをコミットし、pushする
> $ git add .
> $ git commit -m "Using Ruby 2.0 in production"
> $ git push heroku master


Herokuの公式ブログに普通に書いてあったが忘れないようにメモ
https://blog.heroku.com/archives/2013/3/6/matz_highlights_ruby_2_0_at_waza
jQueryMobileでPopupが出ない時

http://www.openspc2.org/reibun/jQuery_Mobile/1.2.0/popup/0002/sample/index.html
このへんのサンプルを見て「おーこんな簡単ならいっちょやってみるか」
とやってみたのだけど、なぜか自分のアプリでうまく出ない時は

Popupの実体の要素が表示したいページの子として存在しているか

を確かめましょう。idを指定してもちゃんと子要素でないと見てくれない様子。
ちょっと判明までに時間がかかってしまった。だってDialogとかにするとちゃんと出るし。
Google Maps SDK(Android/iOS) で円を描く

[Google Maps Android API v2](https://developers.google.com/maps/documentation/android/) にいつの間にか ``Circle`` が追加されてました。[Google Maps SDK for iOS](https://developers.google.com/maps/documentation/ios/?hl=ja) も同様に。

ということで使ってみました。なぜか Xamarin でｗ
とはいえ、Xamarin.Android の場合、GoogleMaps の jar からラッパーを生成しているので API は Java 版と(ほぼ)同じです。

Xamarin.Android での Google Maps API v2 の使い方は、手前味噌ながら弊ブログをどうぞ。

* [Xamarin.Android で Google Maps Android API v2 を使う - Experiments Never Fail](http://amay077.github.com/blog/2013/03/05/xamarin-android-using-google-maps-android-api-v2/)


今回も、[monodroid-samples](https://github.com/xamarin/monodroid-samples/tree/master/MapsAndLocationDemo_v2/SimpleMapDemo) をベースにします。

SampleMapActivity.cs の、[ここら辺](https://github.com/xamarin/monodroid-samples/blob/master/MapsAndLocationDemo_v2/SimpleMapDemo/SampleMapActivity.cs#L88) に以下のコードを挿入します。

```c#:SampleMapActivity.cs
var ICELAND = new LatLng(64.88, -18.32);
var LIBREVILLE = new LatLng(0.401, 9.459);

_map.AddCircle(new CircleOptions()
               .InvokeCenter(ICELAND)
               .InvokeStrokeColor(Color.Blue.ToArgb())
               .InvokeStrokeWidth(5f)
               .InvokeRadius(5000000)); // 500km

_map.AddCircle(new CircleOptions()
               .InvokeCenter(LIBREVILLE)
               .InvokeStrokeColor(Color.DarkGreen.ToArgb())
               .InvokeStrokeWidth(5f)
               .InvokeRadius(500000)); // 500km
```

Xamarin.Android と Java で違いは無いと言っておきながら、
Java では ``new CircleOptions().center(…).storokeColor(…).`` と書いていた所が、Xamarin では ``new CircleOptions().InvokeCenter(…).InvokeStorokeColor(…).`` になっていますね。[Xamarin の Binding a Java Library (.jar)](http://docs.xamarin.com/guides/android/advanced_topics/java_integration_overview/binding_a_java_library_(.jar) 辺りに情報があるでしょうか。

動かすとこんな感じになります。

![image1](http://blog.amay077.net/assets/images/posts/circle_on_google_maps_sdk.png)

北緯65度付近のアイスランドと、赤道付近のリーブルヴィルという所に、どちらも半径500kmの円を追加していますが、Googleマップはメルカトル表示なので、見ての通り北へ行くほど円が大きくなります。

面白いのは「真円は保たれている事」ですね。逆台形っぽい曲線になるかと思ったのですが。

円をポリゴナイズした多角形と重ねてみると違いが分かるかもしれません。

### 2013.5.8追記:大きな円を描いて調べてみました

大きな円を描いてみたら、ちゃんと geodesic な(北へいけばいくほど距離が長くなる)形状になりました。

![image2](http://blog.amay077.net/assets/images/posts/circle-on-google-maps-sdk2.png)
EventSourcedRootEntityのメモ


```php
<?php
trait EventSourcedRootEntity
{
    /**
     * @var DomainEvent[]
     */
    private $mutatingEvents = [];
    
    public function apply(DomainEvent $event)
    {
        $this->mutatingEvents[] = $event;
        $this->mutateWhen($event);
    }
    
    private function mutateWhen(DomainEvent $domainEvent)
    {
        $eventType = (new \ReflectionClass($domainEvent))->getShortName();
        $mutatorMethodName = 'when'.$eventType;
        
        if (method_exists($this, $mutatorMethodName) === false) {
            throw new \RuntimeException(
                sprintf("Method %s() does not exist", $mutatorMethodName)
            );
        }
        
        try {
            $mutatorMethod = new \ReflectionMethod($this, $mutatorMethodName);
            $mutatorMethod->setAccessible(true);
            $mutatorMethod->invoke($this, $domainEvent);
        } catch (\ReflectionException $e) {
            throw new \RuntimeException(
                sprintf("Method %s() failed", $mutatorMethodName), null, $e
            );
        }
    }
}
```
RubyMotionのテストをGuardで自動化しつつ結果に色を付ける。


##インストール

``Gemfile``に下記を追加して``bundle install --path vendor/bundle``などして必要な``gem``をインストール。

```ruby:Gemfile
group :spec do
  gem 'motion-redgreen'
  gem 'guard-motion'
end
```

##設定

続いて``guard``の設定。
``bundle exec guard init``をするなりして``Guardfile``を作成し、自身の環境に応じて監視するファイルを指定する。

ここでは``app``配下は``controllers``、``models``、``lib``ディレクトリに分けてファイルを配置しているが、``spec``配下はフラットにファイルを配置しているのを想定。

```ruby:Guardfile
guard 'motion' do
  watch(%r{^spec/.+_spec\.rb$})
  watch(%r{^app/controllers/(.+)\.rb$})     { |m| "./spec/#{m[1]}_spec.rb" }
  watch(%r{^app/models/(.+)\.rb$})     { |m| "./spec/#{m[1]}_spec.rb" }
  watch(%r{^app/lib/(.+)\.rb$})     { |m| "./spec/#{m[1]}_spec.rb" }
  watch(%r{^app/(.+)\.rb$})     { |m| "./spec/#{m[1]}_spec.rb" }
end
```

更に``Rakefile``の修正。
テスト時のみ関連の``gem``を読み込むようにする。

``app.redgreen_style``はテスト結果の書式設定。

```ruby:Rakefile
# -*- coding: utf-8 -*-
$:.unshift("/Library/RubyMotion/lib")
require 'motion/project'
require 'bundler'

is_test = ARGV.join(' ') =~ /spec/
if is_test
  require 'guard/motion'
  Bundler.require :default, :spec
else
  Bundler.require
end

Motion::Project::App.setup do |app|
  app.name = 'Hoge'
  if is_test
    app.redgreen_style = :full
  end
end
```

##実行

後は普通に実行するだけ。

```sh
bundle exec guard
```


##参考

- [mordaroso/guard-motion · GitHub](https://github.com/mordaroso/guard-motion)
- [farcaller/motion-redgreen · GitHub](https://github.com/farcaller/motion-redgreen)
- [tkadauke/TinyMon · GitHub](https://github.com/tkadauke/TinyMon)
- [rake specに色をつける #RubyMotion - Qiita [キータ]](http://qiita.com/items/65f9260f2a1adcc4c5bf)
Vagrant1.1以降でユーザーインストールGemを使用する

Vagrantがインストーラー形式でのインストールになってから依存するgemも独自の領域に持つようになってる。
そうなると自分でインストールしたgem群のロードができない。
今回Vagrantの実行時にpryでブレークポイント貼りたかったので、ロードパスにインストールしたgemのロードパスを追加した。

```ruby
$:.concat(Dir.glob("#{`rbenv prefix`.gsub!("\n", "")}/lib/ruby/gems/*/gems/*/lib"))
```
これでVagrantfileで自分でインストールしたgemをrequire出来る。
上記のコードはrbenvを使用している前提です。
ChefNodeJSONでVagrantVMを作成する

Vagrantfile内にjsonをいちいち書くのはだるいので、vagrantコマンドでnodeを指定できるようにした

Vagrantfileのconfig.vm.provisionブロックを編集する

```ruby
unless ENV["NODE"].nil?
  chef.json = JSON.parse(open(File.join(File.expand_path(File.dirname(__FILE__)), 'nodes', "#{ENV["NODE"]}.json")).read)
end
```

これでvagrant指定時にnodejson名を指定すれば、指定したnodeでvmが起動する

```bash
NODE=exmaple.com vagrant up
```

環境変数で指定するのはイケてないんだけど、Vagrantfileの中で第2引数を取得する方法がわからなかった。。。
ホントはこうやりたい

```bash
# こうすればVagrantfileの中でvmの設定も切り替えられるので便利
vagrant up example.com
```

もーちょいvagrantのソース読まないとわからないので断念。
パッと見た感じではVagrantfileにオプション値は渡していないみたいなので、無理な気がしてる
assets:precompile の速度を改善する

*注: この投稿は Rails3.2.x を対象としています*

assets:precompile 遅いですよね。

特にデプロイ時に気になることが多いかと思います。

capfile で頑張るのもいいですが、
turbo-sprockets-rails3 という gem を使うとスマートに解決します。

# 使い方
使い方は簡単。Gemfile に記述するだけ。

```ruby:Gemfile
group :assets do
  ...
  gem 'turbo-sprockets-rails3'
end
```

# 確認

```
bundle
```

```
rake assets:precompile
```

もう一度

```
rake assets:precompile
```

早くなりましたか？

# 動作について①
assets:precompile 時に fingerprint を生成、
以降変更がなければスキップしてます。

# Capistrano
Capistrano にも対応しています。capfile を変更する必要はなく、
普通に cap deploy で意図した通りに動いてくれています。

# 動作について②
Capistrano を利用したデプロイでは、
生成物を「デプロイルートディレクトリ/shared/assets」に配置し、
public/assets から symlink を貼って対応しています。

# Rails4
Rails4 では rails 用に最適化された sprockets-rails を採用することによって
assets:precompile の速度が大幅に向上するようです。

# 参考
* [ndbroadbent/turbo-sprockets-rails3 · GitHub](https://github.com/ndbroadbent/turbo-sprockets-rails3)
* [rails/sprockets-rails · GitHub](https://github.com/rails/sprockets-rails)
Event Sourcingを使ったAggregate Rootの永続化


ドメイン駆動設計の実装方法を詳解するVaughn Vernon氏の著書 [IDDD] に出てくるEvent Sourcingについて、永続化のシーケンスを図に起こしてみた。このシーケンス図は氏の[IDDD_Samples]を元に作っている。

[![SequenceDiagram]][SequenceDiagram]

[IDDD]: http://amzn.to/YmRhoC
[IDDD_cover]: http://ecx.images-amazon.com/images/I/51p16XLhuiL._SS500_.jpg
[IDDD_Samples]: https://github.com/VaughnVernon/IDDD_Samples
[SequenceDiagram]: https://dl.dropboxusercontent.com/u/949822/qiita.com/130506-event-sourcing-aggregate-root-persitence.png
org-modeで索引付き文書の作成

LaTeX経由で、索引付き文書(PDF)を作成します。
ちなみにHTMLに出力しても特に悪影響はないです。

書く内容は、
ヘッダに

```
#+LATEX_HEADER: \usepackage{makeidx}
#+LATEX_HEADER: \makeindex
#+OPTIONS: :makeindex
```

を追加し、本文の索引が必要な部分で

```
#+index: org-mode
```

と書きます。これがLaTeXの`\index{org-mode}`に変換されます。
そして最後に

```
#+LATEX: \printindex
```

と記述すればよいです。

### 例
以下に例を示します。がんばってMarkdown覚えたけどこんな感じでorg-modeで記事書いて変換すれば良かった...。

```
#+TITLE: org-mode 8.0で変わった変数など
#+AUTHOR: @PowerPC7450
#+LATEX_HEADER: \usepackage{makeidx}
#+LATEX_HEADER: \renewcommand{\seename}{$\rightarrow$}
#+LATEX_HEADER: \makeindex
#+OPTIONS: :makeindex toc:nil

* まえがき
GWは気づいたらorgmodeで遊んでた...
#+index: orgmode|see{org-mode}
org-modeを久しぶりに更新したらいくつか動かなくなったのでメモ。
#+index: org-mode

exportまわりが変わりましたね。ファイル名が、 =ox-*.el= という名前空間になったようです。
(例: =org-latex.el= $\rightarrow$ =ox-latex.el= )

=C-c C-e= したときに出てくるバッファもめっちゃ変わりました。DocBookとか
OpenDocument出力とか無くなってるんだけど需要ないのかな...?
#+index: DocBook
#+index: OpenDocument

他にも変わっているかもしれませんが、とりあえず気づいた部分だけ。

* org-latex-pdf-process
org-modeからLaTeX経由でPDFにするプロセスを指定する
#+index: org-mode
#+index: LaTeX
#+index: PDF

7.xまでは、 =org-latex-to-pdf-process= でしたが、8になってからは、
=org-latex-pdf-proces= という変数になったようです。
#+index: org-latex-to-pdf-process
#+index: org-latex-pdf-process

例えば、LaTeXからPDFにするときpdflatexを呼び出すとき、init.elに
#+index: pdflatex

#+BEGIN_SRC emacs-lisp
(setq org-latex-pdf-process
      '("pdflatex %f" "pdflatex %f" "pdflatex %f"))
#+END_SRC
と記述すればよいみたいです。(ちなみにpdflatexだと日本語を含んだ文書のタ
イプセットはできない)

#+LATEX: \printindex

```

なお、直接EmacsからC-c C-e l p/oでPDFを生成させる場合org-latex-pdf-processは

```common-lisp
(setq org-latex-pdf-process '("platex %b" "mendex %b" "platex %b" "dvipdfmx %b"))
```

というように設定します。
(クロスリファレンスや、参考文献などがあるともっとplatexは必要になりますね。latexmk使っても良いですが。)
JIS X 0401 と都道府県の順番

`<select>` タグで都道府県を選択させるUIを作るとします。このとき、どのような並びにするのが正しいのでしょうか?

これ、とくに正しいという何かがあるわけでもありません。べつにどんな順番でもいいです。ただ、一般的には JIS X 0401 の「都道府県コード」順で並べているサイトが圧倒的に多いようです。

```ruby:prefecture.rb
Prefecture = %w(
北海道
青森県
岩手県
宮城県
秋田県
山形県
福島県
茨城県
栃木県
群馬県
埼玉県
千葉県
東京都
神奈川県
新潟県
富山県
石川県
福井県
山梨県
長野県
岐阜県
静岡県
愛知県
三重県
滋賀県
京都府
大阪府
兵庫県
奈良県
和歌山県
鳥取県
島根県
岡山県
広島県
山口県
徳島県
香川県
愛媛県
高知県
福岡県
佐賀県
長崎県
熊本県
大分県
宮崎県
鹿児島県
沖縄県
)
```

なんで都道府県コード順で並べる人が多いのか? 察するに「コラッ! 何故に○○県が××県の後なんじゃぁああア!」とお怒りになられる方がいらっしゃった場合にアンサーとして「JIS X 0401 の並びの通りです、うちが決めた並べ方じゃないです」と言えるようにするためじゃないでしょうか。JIS X 0401 でも納得できない人には「ISO 3166-2:JP のコード順でもあります」と言うこともできます。ISO 3166-2:JP は JIS X 0401 に基づいて採番されていますので。

ちなみに JIS X 0402 には市町村のコードが割り振られています。それに基づいて東京23区をソートすると

```ruby:tokyo23.rb
TokyoDistrict23 = %w(
千代田区
中央区
港区
新宿区
文京区
台東区
墨田区
江東区
品川区
目黒区
大田区
世田谷区
渋谷区
中野区
杉並区
豊島区
北区
荒川区
板橋区
練馬区
足立区
葛飾区
江戸川区
)
```

となります。並べ方の根拠がいまいちわかりません。都道府県コードと違って北から順というわけでもなければ、人口順というわけでもない、なんだか不思議な並べ方です。こころなしか 足立区・葛飾区・江戸川区 あたりが dis られてる気がしないわけでもありません。でもまあ、いいんです。JIS だから。JIS が決めたことですから。ね。「当サイトが順番に恣意的な意味をこめたわけではないんです」と言えればそれで十分なんですから。

ちなみに、この JIS X 0401(都道府県コード) と JIS X 0402 (市町村コード) を連結したものが、おなじみ KEN_ALL.csv の1列目に記載されています。見てみてください。

そもそも重要なことですが、JIS X 0401/0402 のコードはソート順を定義したものではありません。たんにユニークな番号を振った、というものです。が、ソートに使ってはいけないということはありません。ソート順に困ったときにとりあえず使う分にはたいへん便利です。「山梨県は東京都の隣のほうがいいんじゃないか、ぶつぶつ」と考えはじめてしまうと大変ですから、さっさと JIS さん頼みにしてしまいましょう。
D3.jsを使ってランダムなデータセットを作成する

[d3.js](http://d3js.org/) でテスト用に、5000個のランダムなデータセットを作成

```javascript
var w = 1000;
var h = 1000;
var data = d3.range(5000).map(function() {
  return {x: Math.floor(Math.random() * w) , y: Math.floor(Math.random() * h)};
});
```
IntelliJでHaskellプログラミング

IntelliJに[Haskellプラグイン](http://plugins.jetbrains.com/plugin?pr=idea&pluginId=6330)はあるのですが残念ながらIDEA11までしかサポートされていないので最新のIntelliJでは動きません。
ですが最近、[開発サイト](http://code.google.com/p/ideah/)のソースにIDEA12とGHC7.4.2対応のコードが入ったので近々リリースされるかもしれません！
それまで待てないので勝手ビルドを作りました。

https://bitbucket.org/shiena/ideah

勝手ビルドはr283をベースに以下を変更しています。

- ビルドファイルの微修正
- Mac版はJava7でまともに動かないためJava6のAPIに修正

また動作確認した環境は次の通りです。

- Mac OS X 10.8.3
- Intellij IDEA 12.1.2
- Haskell Platform 2012.4.0.0

インストール方法と使い方は[開発サイトのWiki](http://code.google.com/p/ideah/wiki/InstallConfig)が参考になりました。

## 2013/12/12 追記

r289をベースにIDEA12用とIDEA13用をバイナリを追加しました。
IDEA13のMac版がJava7をサポートしたのでビルドもJava7です。
[Selecting the JDK version the IDE will run under](https://intellij-support.jetbrains.com/entries/23455956-Selecting-the-JDK-version-the-IDE-will-run-under)を参考にJava7で起動するように設定を変更してください。
また、GHC 7.6.3向けに変更されていますので、バージョンに気を付けてください。
Github製wikiエンジン"Gollum"インストール


gitでドキュメントと履歴が管理されるwikiエンジンの"Gollum"をインストール。

##推奨環境

- bundler(1.3.5)
- ruby(1.9.3)
- Unix系OS（Windows不可）

##Gollumをインストール & 実行

Githubのレポジトリからクローンしてインストール

```
$ git clone git://github.com/gollum/gollum.git
$ cd gollum
$ bundle install
```

Gollumを起動

```
$ gollum
```

[localhost:4567](http://localhost:4567/)にアクセス

![](http://i.imgur.com/3aT1ry8.png)

##カスタマイズ
http://yukke.hateblo.jp/entry/2013/05/02/224859

##おまけ
herokuでgollumを動かすことはできない。
[herokuのファイルシステムはRead only](http://stackoverflow.com/questions/4047999/deploy-gollum-wiki-to-heroku)だから。
Rubyで2分探索

```ruby:contains.rb
def contains(v, vs)
	if vs.length == 0
		return false;
	end
	left = 0; right = vs.length
	while left + 1 < right
		mid = left + (right - left) / 2;
		if v < vs[mid]
			right = mid
		else
			left = mid
		end
	end
	return v == vs[left];
end
 
vs = [*1..10000000]
p contains(100, vs)
```
org-latex-pdf-processに関数を設定

org-latex-pdf-processはPDFをタイプセットする際に使われる変数(カスタマイズ変数)で、
LaTeXからPDFにタイプセットする際に呼ばれる変数です。
入れる値はシェルコマンド(文字列)のリストです。

```common-lisp
(setq org-latex-pdf-process
      '(("pdflatex %f" "pdflatex %f" "pdflatex %f")))
```

と設定すると、PDFに出力する際にpdflatexが3回呼ばれます。
(ソースを読むとmapcで正規表現で%f,%b,%oを変換して呼んでます。)

余談ですが、%f, %b, %oは下記のように置換されます。

| 置換前 | 置換後 |
|:------:|:------:|
| %f        | 完全なファイル名 |
| %b       | ベースネーム |
| %o       | 出力ディレクトリ |


で、ソースを読んだらorg-latex-pdf-processの値として、上記のようなリストではなく関数も書けるみたいですね。

確認の為に実行してみた。0を返しているのは正常終了の意味。やらなくても良さそう。

```common-lisp
(setq org-latex-pdf-process
      '(lambda (x) (message x) 0))
```

と設定するとミニバッファにTeXファイルのパスが表示され死にました。
(PDF自体は生成されなかったのでエラーが起きた。)

便利なのかな...?何に使えるんだろう