OmniAICreator/Qiita-1.07M huggingface dataset:
Git Usage

随時追記という感じで、忘れがちなコマンドを記載していく。
option はそのコマンド推奨を載せる。
引数は具体例を記述。意味は例から読み取る。
option や引数の説明は、わかりにくいところ以外見やすさのため省略。

## 基本 
* 初期化 `git init`

## 必須設定
* `git config --add alias.me 'merge --no--ff'` マージでFast-forwardしない
* `git config --global pull.rebase true` 全追跡ブランチで rebase を使う

    (1.7.8 以前は `git config --global branch.autosetuprebase always`)
    個々のブランチで 'git config branch.<branchname>.rebase false` とするとそちらが優先

## ブランチ
* ブランチ作成 `git co -b develop/1.x`

## タグ
* タグ一覧 `git tag -n`
* タグ作成 `git tag -a release-1.0`
* タグ削除 `git tag -d release-1.0`

## リモートブランチ
* リモートブランチ見る `git branch -r`
* リモートにブランチ作成や変更 `git push -u origin develop/1.x`
* リモートブランチ削除 `git push --delete origin develop/1.x`

    (1.7以前は `git push origin :develop/1.x`)
* リモートブランチからローカルブランチ作成 `git co -b develop/1.x origin/develop/1.x`
* リモートブランチに存在しないゴミを消す ` g fetch --prune`  
  (.git/objectsフォルダのゴミオブジェクト)

## リモートタグ
* リモートにタグ追加 `git push origin refs/tags/v1.0`
* リモートにタグ全て追加 `git push --tags`

## サブモジュール
* 全て最新化する `git submodule foreach 'git pull origin master'; git submodule update`

## マージ、リベース
* マージ、リベースをなかったコトにする。 `git reset --hard ORIG_HEAD` 

## たまに使う
* track されているファイルをローカル環境でのみ無視する `git update-index --assume-unchanged [path]`
* ローカル環境でのみ無視しているファイルを戻す `git update-index --no-assume-unchanged [path]`
OSXをコマンドラインからスリープさせる


**指定時間にスリープ解除**("省エネルギー"→"スケジュール")と組み合わせると便利。

スリープ

```
osascript -e 'tell application "Finder" to sleep'
```

再起動

```
osascript -e 'tell application "Finder" to restart'
```


シャットダウン

```
osascript -e 'tell application "Finder" to shut down'
```


参考: *[【Proton.jp】 Mac OS X の便利なコマンド](http://www.proton.jp/main/etc/command_osx.html)*
UnityでAIキャラクター作成に挑戦

Unityで次のようなテーマのAIキャラクターを作成してみる：

1. 敵キャラの門番は特定の地点を巡回
2. 主人公キャラが一定の距離に近づく
3. 敵キャラが反応して、主人公に向かっていく
+ ただし、背後から迫った等、視界にいない場合は近くても反応しない
4. 至近距離まで近づいてきたら近接攻撃
5. 主人公キャラが逃げていく
6. 敵キャラは近接攻撃をやめるが、追ってくる
7. 一定の距離から離れると、再び巡回の動きに戻る

![AI_Character] (http://1.bp.blogspot.com/-vOza_cj2KXE/URicjMiNGKI/AAAAAAAAAsI/2LRcv1xnfmE/s320/AI_Character.png)
[プロジェクトサンプルのYoutube動画へ] (http://www.youtube.com/watch?v=u2kq0G2tzHE)

# サンプルのダウンロード
ブログの一番下のリンクからUnityプロジェクトの形式でダウンロードできる。Unity 4.0以降でも動作する。

+ [Unityで初めてのAIキャラクター（目次）](http://gamesonytablet.blogspot.com/2013/01/unityai.html)

# 目次
1. [NPC設定の追加](http://gamesonytablet.blogspot.com/2013/01/unityai1npc.html)
2. [巡回点の追加](http://gamesonytablet.blogspot.com/2013/01/unity-ai2.html)
3. [巡回パターンの追加](http://gamesonytablet.blogspot.com/2013/01/unity-ai3.html)
4. [デリゲートの使い方](http://gamesonytablet.blogspot.com/2013/01/unityai4.html)
5. [さあ近づいてこい（距離のチェック）](http://gamesonytablet.blogspot.jp/2013/02/unityai5.html)
6. [見えるようにする（視界のチェック）](http://gamesonytablet.blogspot.jp/2013/02/unityai6.html)

# 特に勉強になるところ

+ 完成プロジェクトをダウンロードしてイメージがつかめる。あとは目次ごとにその段階でのスクリプトがあるので、段階的に学習を進められる

## 巡回点の追加

+ A -> B -> C -> Aなど、循環して巡回する場合、空のゲームオブジェクトをUnity 上で配置するだけなので応用が利く

![Waypoint_Picture] (http://4.bp.blogspot.com/-yOpinr_tEfQ/URim5KRRt9I/AAAAAAAAAtI/geh60xweRrI/s320/AI_waypoint.png)

## さあ近づいてこい（距離のチェック）

+ Vector3.Distance を使用することも出来るが平方根演算は遅いので、sqrMagnitudeを使用して平方根演算をさける。これは [Unity公式マニュアル] (http://docs-jp.unity3d.com/Documentation/Manual/DirectionDistanceFromOneObjectToAnother.html) でも明記されてますね
How to `gem install mysql -v 2.7`


## `TypeError: can't dup NilClass`

If you get an error something like below while `bundle install`

```ruby
Installing mysql (2.7) with native extensions
TypeError: can't dup NilClass
An error occurred while installing mysql (2.7), and Bundler cannot continue.
Make sure that `gem install mysql -v '2.7'` succeeds before bundling.
```

First, check your gem's version by executing

```bash
$ gem -v
```

If it's newer then 1.5.x, like 1.6.x or above, that's your problem.

Newer versions of Rubygems doesn't play well with the mysql gem.

So downgrade the gem, and retry `gem install mysql -v 2.7`.

You can downgrade the gem by:

```bash
$ gem list rubygems-update

*** LOCAL GEMS ***
rubygems-update (1.7.2)

$ sudo gem uninstall -v 1.7.2 rubygems-update # uninstall all the local rubygem-update versions if it's newer then 1.5.x
$ sudo gem install -v 1.5.2 rubygems-update
$ sudo update_rubygems
$ gem -v
1.5.2
```
Emacsにzencoding入れた


超軽い記事です。入れました。
HTML書く時に、いちいちjadeに頼るのも面倒くさくなってきたので…。

## ダウンロード
- [https://github.com/rooney/zencoding](https://github.com/rooney/zencoding)

```
cd ~/.emacs.d/elisp
wget https://raw.github.com/rooney/zencoding/master/zencoding-mode.el
```

## requireとキーバインド

こんな感じにした。

```
;; zencoding-mode
(require 'zencoding-mode)
(add-hook 'sgml-mode-hook 'zencoding-mode)
(define-key zencoding-mode-keymap (kbd "C-i") 'zencoding-expand-line)
```

キーバインド```C-i```には、indent-regionも入れていたんだけど、
ちゃんと両方使えてます。利用シーン違うし問題無し。

## 感想
はやいはやい。

要するにほぼセレクターで書く形なので違和感もないですね。
jade慣れしてたので尚更。

[emmet](https://github.com/emmetio/emmet)も気になるけれど、さらっと見た感じelispおっこちてなかったので、パス。
自前コンテナでaddChildViewController:するときdidMoveToParentViewController:はやはり使うべき


## はじめに
iOS5からUIViewControllerを自前のクラスにaddChildViewController:メソッドで追加できるようになった。

最近では、こういった自前コンテナは主にFacebookやPath2.0のスライドメニュー風のUI開発なんかに使われていると思う。


このaddChildViewController:メソッドの後には必ずdidMoveToParentViewController:メソッドを呼ぶという説明があるが、これの意味がよくわからなかったのでそのメモ。

例えば

```objc:didMoveToParentViewControllerの必要性を疑うコード
//自前コンテナ(self)にchildViewControllerを追加
[self addChildViewController:childViewController];

//その後didMoveToParentViewControllerを実行しなければいけない
[childViewController didMoveToParentViewController:self];
```

この追加(add)したあとになぜ完了(didMove)を明示的に知らせないといけないのか謎という感覚。また、これがなくてもこちらの想定通り動くのでずっと疑問だった。

### 結論としては

自前コンテナでaddChildViewController:を実行した後は、やはり必ずdidMoveToParentViewController:を呼ぶ。これはUIViewController自身が他のコンテナに追加（もしくは削除）されている最中かどうかを知ることで処理を分岐する事もできるようになっていて、それを判断するために完了したことを通知する必要がある。

ちなみに、正しくコードをかけていない場合、追加したViewControllerのviewWillAppear:が動作しない場合がある。

これはどのような事かというと、コンテナのviewを表示したいだけならばViewControllerのviewに対して子ViewControllerのviewをaddSubViewすればいいだけだと思ってしまう。しかしそのViewが表示されたかどうかという判断にはならないためaddChildViewControllerがそもそも必要になってくる。

## 説明
### UIViewControllerの追加サイクル

そもそもUIViewControllerの追加には「開始」と「終了」がかならずセットで必要となる。

・追加: addChildViewController:
・開始: willMoveToParentViewController:(add後に自動で呼ばれる）
・完了: didMoveToParentViewController:(任意のタイミングで呼ぶ）

まず自前コンテナへの追加のためにaddChildViewController:した際に、ViewControllerの追加開始の合図であるwillMoveToParentViewControler:は自動で呼ばれる。


開始は自動で呼ばれるが、それが終了したことをコールするためのdidMoveToParentViewController:メソッドは自動で呼ばれないため必要となる。

### 終了をコールしないと何に困るのか

もともとUIViewControllerは自身が他のコンテナに追加（もしくは削除）されている最中かどうかを知ることで処理を分岐する事もできるようになっていて、これを判断するのに完了を呼ぶ必要がある。

ちなみに、追加されている途中かどうかはUIViewControllerのisMovingToParentViewControllerメソッドによって取得できる。


### didMoveToParentViewController:がなぜ自動で呼ばれないようになっているか

では、なぜdidMoveToParentViewController:が自動で呼ばれないかというと、画面遷移にトランジションを指定したい場合が想定されているからだと思う。

例えば次のコードのように、完了までに時間がかかる（実装者が時間を指定できる）場合に、完了のメソッドが明示的にコールできるようになっていることでその意味が出てくる。

```objc:

/*fromViewControllerはすでにコンテナに追加されているとする*/

//toViewControllerをコンテナに追加する
[self addChildViewController:toViewController];

//fromからtoへ画面遷移のトランジションを行う
[self transitionFromViewController:fromViewController
                   toViewController:toViewController
                           duration:1.0
                            options:UIViewAnimationOptionTransitionNone
                         animations:^{
                             // ここで何かしらの遷移アニメーション
                         }
                         completion:^(BOOL finished) {
                             // 追加完了を明示的に行う
                             [toViewController didMoveToParentViewController:self];
                         }];
```

## まとめ
上記のように、画面遷移のトランジションを使わなくてもaddChildViewController:したらdidMoveToParentViewController:を呼び出すことを忘れないようにしたらよいでしょう。

もし、突っ込みどころ等あればコメントなり編集リクエストがあれば嬉しいです。

## 参考

カスタムContainer View Controllerを作る（ルールが分かりやすく纏められている）
http://qiita.com/edo_m18/items/8b6b457f82b185ab1f6a

Cocoa練習帳: [iOS]独自のコンテナViewController
http://www.bitz.co.jp/weblog/?date=20120923


isMovingToParentViewControllerメソッドについてはiOS View Controllerカタログの「ナビゲーションスタックの変化の監視」
https://developer.apple.com/jp/devcenter/ios/library/documentation/ViewControllerCatalog.pdf
hoogleコマンドに検索パッケージ名を指定


https://github.com/ndmitchell/hoogle/blob/master/docs/Local-Install.md

便利なんだけどドキュメント読んでもよくわからなかった(そもそも読むべきドキュメントがどこにあるんだか・・・)。

xxxx.hoo ってのがパッケージ毎のhoogleのデータベースなんだけど、こいつを読ませるには`--databases`でディレクトリを指定しつつ`+xxxx`でパッケージ名を指定する必要がある。パッケージ名は小文字で始まる必要がある。って辺り、`Hoogle.Query.Parser` を読んだらわかった。

```
% hoogle +pugs initPerl5 --databases=./databases/ --color
Searching for: initPerl5 +pugs
Pugs.Embed.Perl5 initPerl5 :: String -> Maybe Env -> IO PerlInterpreter
```

*.hoo ファイルは Haddock で作れたけど、どう運用するべきなのかよくわからず。`cabal install` では入らない(?)ので、自前で別途ソース持ってきて`runhaskell Setup haddock --hoogle --executables`みたいにビルドして集めとくって感じなんだろうか。
iOS6以上とiOS5の自動回転の制御について


### まずiOS SDK6自体の回転に関する前提

・iOS6以上とiOS5では自動回転のメソッドが違う
・iOS SDK6から以前の回転のメソッドが非推奨になった
・iOS SDKが6以上であっても実行する端末がiOS5に対応するのであればiOS5向けの実装をしないといけない

### 最初に結論

・iOS6の場合、コンテナを使いそれぞれのViewControllerで回転の可否を決めたい場合は工夫が必要

## iOS SDK6からの自動回転

iOS6からの自動回転についてはUIViewControllerのshouldAutorotateメソッドで、そのViewControllerで回転処理が存在するかどうかをBOOLで返し、回転する方向をsupportedInterfaceOrientationsメソッドで指定する。

```objectivec:iOS6のUIViewController自動回転メソッド
//回転処理が存在するかどうかを返す
- (BOOL)shouldAutorotate
{
    return NO;
}

//回転する方向を指定
- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}
```

### コンテナを使っている場合は子供の指定にまかせる

UITabBarControllerやUINavigationControllerなどのようなコンテナを使っていて、そのコンテナに追加している子ViewControllerで回転したい方向をそれぞれで指定したい場合、それぞれの子ViewControllerで処理を任せるようにするのがよさそう。

つまり、コンテナ自体のshouldAutorotateメソッド、supportedInterfaceOrientationsメソッドが呼び出された際、コンテナに追加された子ViewControllerのそれらのメソッドを呼び出すようにする。

具体的には、まずUITabBarControllerを使っている場合、タブで選択されたViewControllerのshouldAutorotateメソッド、supportedInterfaceOrientationsで回転処理の方向を指定させるようにする。

UITabBarControllerには選択されたタブを取得するselectedViewControllerプロパティがあるため、次のようにできる。

```objectivec:UITabBarControllerを継承して実装
//回転させるかどうか
- (BOOL)shouldAutorotate
{
    //タブで選択されたViewController(navigationならnavigation)に任せる
    return [self.selectedViewController shouldAutorotate];
}

//回転させる向きを指定
- (NSUInteger)supportedInterfaceOrientations
{
    //選択したViewController(navigationならnavigation)に任せる
    return [self.selectedViewController supportedInterfaceOrientations];
}
```

UINavigationControllerには表示されているViewControllerを取得するvisibleViewControllerがあるため、次のようにできる。

```objectivec:UINavigationControllerを継承して実装
- (BOOL)shouldAutorotate
{
    //表示しているViewControllerにまかせる
    return [self.visibleViewController shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations
{
   //表示しているViewControllerにまかせる
   return [self.visibleViewController supportedInterfaceOrientations];
}
```


## iOS5の自動回転

iOS5の自動回転についてはUIViewControllerのshouldAutorotateToInterfaceOrientation:メソッドを利用する。

```objectivec:iOS5のUIViewController自動回転メソッド
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
     //interfaceOriaentationで識別子回転する方向であればYESを返す
     return YES;
}
```

iOS6と違い、UITabBarControllerやUINavigationControllerを使っている場合も意識する必要がなく、回転させたいViewController上でshouldAutorotateToInterfaceOrientation:メソッドを実行すれば良い。


###ソースコード

githubに置いてます
https://github.com/yimajo/AutoRotateDemo

突っ込みどころ等あれば編集リクエストなり、コメントなりgit hubのpull requestなりでお願いします。

### 参考

http://d.hatena.ne.jp/oropon/20120926/p1

http://appteam.blog114.fc2.com/blog-entry-242.html

http://blog.livedoor.jp/melodybox/archives/18079532.html
mrubyとISO Ruby (CRuby)の非互換部分(文字列編)

mruby の仕様はまだ未確定であり，仕様変更に伴い，下記の挙動も変更となる可能性が十分にあることに留意．

# 正規表現のサポート

mrubyのコアには正規表現のサポートがない．今後もコアが正規表現をサポートする可能性は低い．
ただし，Regexpクラスを追加するためのフックが存在し，mrbgems で機能追加することが可能となっている．
つまり，CRuby との互換性は，併用する Rexexpクラス用 gem に依存する．

# エンコーディングのサポート

CRuby には存在する String#encode や String#encode! は， mruby には無い． ISO Ruby では文字は ISO646 としているので，ISO Ruby 準拠を基本線としている mruby もまた，エンコーディングのサポートは無い．

# pack/unpackのサポート

CRuby には存在する String#pack, String#unpack が，mruby には用意されていない．ISO Ruby には存在しないため．
右クリックしたときのコンテキストメニューに追加する


* ファイルを選択時のコンテキストメニューに追加する(`*`の部分は`.zip`などの拡張子を限定することも可能)

>HKEY_CLASSES_ROOT\\*\\shell\\《メニュー名》\\command
>名前：（既定）
>種類：REG_SZ
>データ：コマンド

* explorer.exeのコンテキストメニューに追加する

>HKEY_CLASSES_ROOT\\Directory\\Background\\shell\\《メニュー名》\\command
>名前：（既定）
>種類：REG_SZ
>データ：コマンド


[デスクトップの何もない場所を右クリックしたときのコンテキストメニューに追加する](http://homepage2.nifty.com/suyamsoft/Vista/DesktopRightClickMenu/index.html)
gitでバイナリファイルがコンフリクトした時



##バイナリファイルがコンフリクトした時

```ブランチa（マージされる方）の方を採用する場合
git checkout --ours [コンフリクトしたファイル名]
```


```ブランチb（マージする方）の方を採用する場合
git checkout --theirs [コンフリクトしたファイル名]
```

その後`git comiit`。
シェルスクリプトの文字列比較

```bash
if [ -n 'a' ]; then echo unk; fi #=> unk

if [ -n '' ]; then echo unk; fi #=>
```

ここまではいい．

```bash
if [ -n ]; then echo unk; fi #=> unk
```

(゜ω。)？？？？

```bash
if [ -n $1 ]; then
  echo unk;
fi
```

上記のような，引数で受け取った文字列が空だったら…　的な分岐をしたいのですがナムサン！ `[` コマンドが `-n` オプションで引数を受け取れずに爆発四散！ (だと思うのですが…　間違ってたら指摘お願いします)

で結局，

```bash
if [ -n "$1" ]; then
  echo unk;
fi
```

こうでした．シェルスクリプトしんどい＞＜

最近，いちいち Ruby とか使わずとも，確実に組み込みされてる bash で簡単なスクリプトなら書きたい…　な欲求が高まってきているのですがこういうことで時間食いたくない…

今この投稿に至るまでの流れはこんな感じ．

1. `if` コマンドに `[` コマンドを続けてそのオプションとして条件式を渡す，つまりちゃんとスペースを入れないとね．そういう罠にはもうハマらない！ニワカは相手にならんよ！
2. `-eq` オプションって数値のときしか使えないんだったのか…　文字列なら普通に `=` とかそんなん考慮しとらんよ…
3. `if [ $1 = '' ]; ...` って書くと何かエラー起こる．なにこれもー＞＜
4. `if [ = '' ]; ...`　の形になってしまうからダメらしい．変数の展開が先走ってんなー．ルールによっちゃそういうんもええやろけど…
5. 空文字列かどうかは `-n` で判定出来るらしい．
6. 投稿のネタ部分に至る．
7. 地に撒いた種 (失敗) が木々になり… (知識として) 実る頃…　収穫の時 (ハーベストタイム) …！
8. 解決なう

# code snippet

* https://gist.github.com/kaosf/4750383

# 参考

* http://shellscript.sunone.me/if_and_test.html
* http://furyo.on-air.ne.jp/linux/bash.html
* http://x68000.q-e-d.net/~68user/unix/pickup?keyword=unexpected&target=command
Uncrustifyのセッティング (2) 一般設定編

はじめに
--------
前回の投稿がいきなりプリプロセッサ編で始まってしまってなんですが、今回は一般設定オプションについて書いていきます。

一般設定オプション一覧
----------------------

| 設定                | 説明                                                                                                |
|:--------------------|:----------------------------------------------------------------------------------------------------|
| newlines            | 出力に用いる改行コード { auto, lf, crlf, cr }                                                       |
| input_tab_size      | 入力ファイルのタブサイズ { number }                                                                 |
| output_tab_size     | 出力ファイルのタブサイズ { number }                                                                 |
| string_escape_char  | 文字列エスケープ文字に対するASCIIコード (通常は'\'(92)、Pawnの場合'^'(94)) { number }               |
| string_escape_char2 | Pawn用代替文字列エスケープ文字 (クォート文字の直前のみ有効) { number }                              |
| tok_split_gte       | '>='と'>>='を'void f(list\<list\<B>>=val);'のテンプレートの一部と解釈させるかどうか { true, false } |
| utf8_bom            | UTF-8ファイルのBOMコードへの対応 (推奨'remove') { ignore, add, remove, force }                      |
| utf8_byte           | 値128〜255を持つバイトを含むUTF-8でないファイルの場合、出力をUTF-8とするかどうか { true, false }    |
| utf8_force          | 出力エンコーディングを強制的にUTF-8にするかどうか { true, false }                                   |

僕の設定
--------

全般的な設定なので、ここでは自分が整形しようとしているソースコードのことを少し理解しておく必要がある。

```bash:general.cfg
newlines           = crlf
input_tab_size     = 4
output_tab_size    = 4
string_escape_char = 92
tok_split_gte      = false
utf8_bom           = add
utf8_byte          = false
utf8_force         = true
```

まず、TABがスペース何個分を想定してコーディングされているのかを入れおきます。これが間違ってるとうまい事整形してくれない場合があります。
ちなみに、僕はTAB文字は絶対に使用しません。エディタの設定差で、どうにも整形しきれなくなるからです。

それと、改行コードですが、僕は\<CRLF>を使用します。大きな理由は、クロスプラットフォームで開発するコードを書く事が多いからです。Linux(Unix)でも、Mac OS Xで、Windowsでも、ちゃんと開けるファイルにしようと思うなら、一番馬鹿なエディタ、すなわちメモ帳で開けるように改行コードは設定しておくべきだという結論に達しました。

それから、UTF-8にBOMを付けるか付けないかという設定がありますが、これも、Visual Studio 2010などがBOMなしUTF-8をCP932として開こうとしてしまうので、BOMを付けておきます。
本来、UTF-8ってそもそもBOM付けるのは非推奨なのにおかしいですね。

というわけで、僕の設定の多くは、Microsoftの嫌がらせに耐えられるような設定になっているのでした。

これの最大の理由は、実際の関係者な人たちは本当にMicrosoft的な環境でお仕事をされているからです。あー、うまくファイルが開けないーとか文句いわれるよりも、なんとかどこの環境でもギリギリ開けて、文句を言われない設定がこれだと思っています。

XcodeでもEcliseでもvimでもemacsでもNetbeansでもSublimeでも、そして、VCでもメモ帳でも、文字化け、改行崩れなどで不都合になることはありません。
LTSVのパーサ

あんまり面白くなかった(小並感)

```haskell
module Data.LTSV (parseLTSV, parseRecord) where
import qualified Data.HashMap.Strict as HM
import Data.Attoparsec
import Control.Applicative
import Control.Monad
import Data.ByteString (ByteString)
import Data.Maybe (catMaybes)

type Record = HM.HashMap ByteString ByteString

type LTSV = [Record]

parseLTSV :: ByteString -> LTSV
parseLTSV = either error id . parseOnly ltsv

parseRecord :: ByteString -> Record
parseRecord = either error id . parseOnly record

ltsv :: Parser LTSV
ltsv = liftM catMaybes $ option Nothing (Just <$> record) `sepBy` nl

record :: Parser Record
record = HM.fromList <$> field `sepBy` word8 0x09

field :: Parser (ByteString, ByteString)
field = (,) <$> label <*> (word8 0x3A *> fieldValue)

label :: Parser ByteString
label = takeWhile1 (inClass "0-9A-Za-z_.-")

fieldValue :: Parser ByteString
fieldValue = Data.Attoparsec.takeWhile (inClass "\x01-\x08\x0B\x0C\x0E-\xFF")

nl :: Parser ()
nl = option () (void $ word8 0x0D) *> void (word8 0x0A)
```
Rubyのメソッド定義にジャンプ

環境はUbuntu12.04でしか試してない。

exuberant-ctagsをaptからダウンロード。

    sudo aptitude install exuberant-ctags

TAGSファイルを作る

    ctags -e anko_chan_kawaii.rb

タグジャンプは M-. で行い、戻るときは M-* で元にいた場所に戻る。

初回にタグジャンプするときはどこのTAGSファイルを参照するか聞かれるので任意の場所を教えてやる必要がある。

再帰的にctags -eしたいときはeshellを使う。

    ctags -e lib/**/*.rb
VIMのノーマルモードで日本語入力を無効にする

下の設定で出来た。

#設定方法
Ibusの設定 > 一般 
キーボードショートカット
 無効:  Release+Escape 

かなり血迷ったけど、これでいけた。
Vimの挿入モードからEscapeキーを押すとノーマルモードに遷移する
と同時に日本語入力も無効になる

#注意点
* Releaseにチェックを入れること。
* キーコードを取得してくれないので"Escape"と直入力すること

環境 Ubuntu12.10 Ibus/mozc
Confirm booting of Beagleboard-xM


Beagleboardとのシリアル通信を行ったので少しまとめ。

1.デバイスドライバのインストール

[README]("http://beagleboard.org/static/beaglebone/latest/README.htm")
ここから自分のマシンのOSに対応したデバイスドライバをインストールする。この時"Additional FTDI USB to serial/JTAG information"って書いてあるところからもインストールしたけれどこれは必要だったのかな

2.シリアル通信の準備

僕の場合はMacBookAirを使っていたので、RS232CとUSBとの変換ケーブルを使用していた。[REX-USB60F]("http://www.ratocsystems.com/products/subpage/usb60f.html")
これ使ってボードとPCをつなぐ。そうするとデバイスファイルが現れる。

```
$ ls /dev/tty.usb*
/dev/tty.usbserial-00001014
```

3.screenの起動
受信を可能にするためにscreenで接続を行う

```
$ screent /dev/tty.usbserial-00001014 115200

```
115200はボーレート指定。ボーレートって何だろう？

4.OSをブートさせる
ここでかなりはまった。Beagleboard-xMはイメージファイルを読み込んで起動するためにACアダプタを差し込む必要がある。電源ボタンとかないから当たり前か。この3.と4.を順番間違えて、起動しているのかどうか分からなくてかなりはまった

5.起動完了
しばらく待つと以下のメッセージが出てくる。

```
Starting Network connection manager daemon: NetworkManager.
Starting GNOME Display Manager gdm

.-------.                                           
|       |                  .-.                      
|   |   |-----.-----.-----.| |   .----..-----.-----.
|       |     | __  |  ---'| '--.|  .-'|     |     |
|   |   |  |  |     |---  ||  --'|  |  |  '  | | | |
'---'---'--'--'--.  |-----''----''--'  '-----'-'-'-'
                -'  |
                '---'

The Angstrom Distribution beagleboard ttyS2

Angstrom 2010.7-test-20110220 beagleboard ttyS2

beagleboard login: 
```

完了！
（２）EC2＋gitリモートサーバ構築#２｜EC2でgit+RonR+unicorn+nginx+capistrano+Jenkins

##その２｜gitリモートサーバの構築

###１．gitインストール｜EC2-User
１） ec2-userでログイン

２） yumでgitインストール

```
sudo yum -y install git
```

３）リポジトリディレクトリ作成
このディレクトリ以下にリポジトリを作成していく方針。

```
sudo su - gituser
mkdir ~/repos
```

###2．テストしてみる
リモートリポジトリを作成し、ローカルからpushしてみる。

１）ec2-userでログイン

２）gituserでリポジトリを作成

```
sudo su - gituser
cd ~/repos
mkdir test.git
cd test.git
git --bare init
```

３）ローカルリポジトリの作成｜ローカルマシン
gitserverは.ssh/configに登録済み。
[参考：前回の記事](http://qiita.com/items/bed591f7a076cb92ed20)

```
mkdir ~/test
cd ~/test
git init
git remote add origin gitserver:/home/gituser/repos/test.git
```

４）ローカルリポジトリでファイル作成しコミットしpush

```
cd ~/test
echo "this is my first file." > test.txt
git add .
git commit -m "first commit"
git push origin master
```

５）別のローカルディレクトリにpullしてみる。

```
mkdir ~/test2
cd ~/test2
git init
git remote add origin gitserver:/home/gituser/repos/test.git
git pull origin master
```

test.txtが存在していればOK
Steel Bank Common Lisp 1.1.5の変更点

[News - Steel Bank Common Lisp](http://www.sbcl.org/news.html)の内容を日本語訳したものです。内容の正しさは保証しません。

-----

# 互換性のない小さな変更

* SB-SPROF:WITH-PROFILINGがデフォルトではループしなくなりました。

# 新機能

* パッケージローカルなニックネーム。詳しくはマニュアルを見てください。
* SB-EXT:MAP-DIRECTORYがディレクトリの走査に対する強力なインターフェイスを提供します。CL:DIRECTORYのためにSBCLがバックエンドで使っているものです。

# 機能拡張

* IMPORT、EXPORT、USE-PACKAGEの結果で起こる名前の衝突を解決するための、より使いやすいリスタート。
* （訳注：既存の定義と）異なるDEFPACKAGEのフォームが、状況を解決させるためのリスタートを伴ない、きちんとしたエラーを発生させるようになりました。（[#891351](https://bugs.launchpad.net/sbcl/+bug/891351)）
* SB-EXT:*ON-PACKAGE-VARIANCE*を設定することで、異なるDEFPACKAGEのフォームが、状況を解決させるためのリスタートを伴ない、適切にエラーを発生させることができるようになりました。詳しくはマニュアルを見てください。（[#891351](https://bugs.launchpad.net/sbcl/+bug/891351)）
* WindowsでMAKE-RANDOM-STATEがCryptGenRandomをシードとして使うようになりました。（Anton Kovalenkoのおかげです）
* バックトレースの改良
    * 補助的なCLOSのディスパッチ関数がより良いデバッグ名を持つようになりました。（[#503081](https://bugs.launchpad.net/sbcl/+bug/503081)）
    * バックトレースでのより読みやすいメソッド名。SB-DEBUG:*METHOD-FRAME-STYLE*を参照してください。
    * SB-DEBUG:BACKTRACEとSB-DEBUG:BACKTRACE-AS-LISTの前方互換な代替として、SB-DEBUG:PRINT-BACKTRACEとSB-DEBUG:LIST-BACKTRACEが利用できます。
    * 同じ情報がより控え目な形でフレームアノテーションとして提供されるため、SB-DEBUG:*SHOW-ENTRY-POINT-DETAILS*が廃止予定となりました。
* SB-POSIXがMAP-ANONを提供するようになりました。
* テストスイートの結果に色が付くようになりました。失敗は赤、予期しない成功は緑になります。WindowsとANSIエスケープコードをサポートした端末で動作します。

# 最適化

* SB-CONCURRENCY:QUEUEの実装がより効率的になりました。（James M. Lawrenceのおかげです）

# バグ修正

* RESTART-CASEのマクロ展開で未使用変数のスタイル警告が出なくなりました。（[#1113859](https://bugs.launchpad.net/sbcl/+bug/1113859)）
* sb-bsd-sockets.asdをロードしているときの未使用変数のスタイル警告が出なくなりました。（[#1114681](https://bugs.launchpad.net/sbcl/+bug/1114681)）
* パッケージの削除が、ほかのパッケージの[implementation-package](http://www.sbcl.org/manual/#Implementation-Packages)のリストからも、そのパッケージを削除していました。
* たまに発生する「interrupt already pending」問題を修正するものではありませんが、SB-SPROF:WITH-PROFILINGがDarwinのSLIME REPLでも使えるようになりました。
* (setf (documentation 'x 'function))と(setf (documentation #'x t))が違う場所にドキュメンテーションを設定していました。（1.0.43.63からのリグレッションです）
* 新しいglibcでのビルド。（[#1095036](https://bugs.launchpad.net/sbcl/+bug/1095036)）
yieldを使ってみる

正規化されていないDBからデータをひっぱってくるクラスがあるとする。

こんなやつ。

```C#:HogeTbl
public class HogeTbl
{
	public int colKey { get; set; }
	public string Hoge1 { get; set; }
	public string Hoge2 { get; set; }
	public string Hoge3 { get; set; }
	public string Hoge4 { get; set; }
	public string Hoge5 { get; set; }
	public string Hoge6 { get; set; }
	public string Hoge7 { get; set; }
	public string Hoge8 { get; set; }
	public string Hoge9 { get; set; }
	public string Hoge10 { get; set; }
	public string Hoge11 { get; set; }
	public string Hoge12 { get; set; }
	public string Hoge13 { get; set; }
	public string Hoge14 { get; set; }
	public string Hoge15 { get; set; }
	public string Hoge16 { get; set; }
}
```

Hoge1〜Hoge16に対して同じ処理を行いたい場合はIEnumertorを使えれば便利なのでyieldを使ってみる。

```C#:Fuga.cs
public class Fuga
{
	private void fuga(HogeTbl tbl)
	{
		foreach(String hoge in this.getHoge(tbl)
		{
			nya.nyan(hoge);
		}
	}
	private IEnumerator<String> getHoge(HogeTbl tbl)
	{
		if(tbl == null)
		{
			yield break;
		}
		yield return tbl.Hoge1;
		yield return tbl.Hoge2;
		yield return tbl.Hoge3;
		yield return tbl.Hoge4;
		yield return tbl.Hoge5;
		yield return tbl.Hoge6;
		yield return tbl.Hoge7;
		yield return tbl.Hoge8;
		yield return tbl.Hoge9;
		yield return tbl.Hoge10;
		yield return tbl.Hoge11;
		yield return tbl.Hoge12;
		yield return tbl.Hoge13;
		yield return tbl.Hoge14;
		yield return tbl.Hoge15;
		yield return tbl.Hoge16;
	}
}
```

各Hogeに対してどんな処理を行ってるかわかりやすいし、けっこういいんじゃないかなって思ってる。

yieldを使ってみたかったからってわけじゃないんだからねっ。
（１）EC2＋gitリモートサーバ構築#1｜EC2でgit+RonR+unicorn+nginx+capistrano+Jenkins

##その１｜リモート先gituserとssh鍵認証接続

##インスタンス構成
gitリモートサーバとAPサーバ／DBサーバは別のインスタンスにしたかったが、お金がかかるので（そんなにかからないけど…諸事情で…）、今回はインスタンスはスモールインスタンス1個で。

##ユーザ
1. **gituser**
このユーザでリモートリポジトリにローカルから**SSH鍵認証**でアクセス出来るとする

2. **artist**
ローカルからcapistranoでデプロイする時のユーザ。mkdirなどを行うのでsudo出来るようにします

3. **ec2-user**
EC2インスタンスで色々インストールしたりする仕事人


###１）gitリモートサーバ接続準備｜SSH鍵認証
1-1. ｜EC2・ec2-user｜gituserの作成と.sshディレクトリの作成など

```
sudo useradd -m -s /bin/bash gituser
sudo mkdir /home/gituser/.ssh
sudo touch /home/gituser/.ssh/authorized_keys
sudo chown gituser. /home/gituser/.ssh
sudo chown gituser. /home/gituser/.ssh/authorized_keys
sudo chmod 700 /home/gituser/.ssh
sudo chmod 600 /home/gituser/.ssh/authorized_keys
```
  
1-2. ｜ローカル｜
~/.ssh/id_rsa.pubをテキストファイルで開きコピー

1-3.｜EC2・gituser｜
公開鍵の登録。/home/gituser/.ssh/authorized_keysに。
1.2でコピーしていたのをauthorized_keysにペースト。
もちろん、公開鍵ファイルをscp等でアップロードして、catコマンド等で登録しても良い。

```
sudo - gituser
vi /home/gituser/.ssh/authorized_keys
```

1-4．｜ローカル｜ssh接続確認
（仮定）EC2のIPアドレス｜54.345.345.345
ターミナルからssh接続可能か確認。

```
ssh gituser@54.345.345.345 -i ~/.ssh/id_rsa
```

1-5．｜ローカル｜.ssh/configファイルの準備
~/.ssh/にconfigファイルを作成しておいて、リモート先の簡略化

```
touch ~/.ssh/config
vi ~/.ssh/config
```

```config
Host gitserver
  User         gituser
  hostname     54.345.345.345
  identityfile ~/.ssh/id_rsa
```

これでターミナルから下記のコマンドでログイン出来る。

```
ssh gitserver
```
追記専用のファイルでコンフリクトを抑止する


ChangeLog とか Android アプリの string.xml の様に、特定の箇所に行が追加されていくだけのケースで、複数の人が作業すると頻繁にコンフリクトが発生してしまいます。

大抵のバージョン管理システムではファイル毎にマージに使うコマンドを指定できるようになっていますが、 git の場合は .gitattributes ファイルで指定します。

```
$ echo "string.xml  merge=union" >> .gitattributes
$ git add .gitattributes
$ git commit -m "string.xml: merge=union"
```

merge=union の部分がマージドライバーの指定で、 union は順番を気にせずに両方の内容を保存するマージドライバーです。
このドライバーを使うと同じ行を別々の人が追加した時に重複してしまう可能性もあるので、ファイルが壊れたら手動で直せる場合にだけ、注意しながら使ってください。

他にも自分でマージドライバを作ることもできるます。詳しくは `git help attributes` を参照してください。
grepやackよりも速いコード検索ツールのagをローカルビルドインストールする

今まで自分もackを使ってソースコードのgrepを行なっていましたが、ag (the silver searcher)の速さに感動してこちらに乗り換えました。
元のGitHubのリポジトリは https://github.com/ggreer/the_silver_searcher
$HOME/local以下へのインストール手順は以下のとおり。CentOS5系で動作確認済み。

なぜ早いのかの説明は、
ackを捨てて、より高速なag(The Silver Searcher)に切り替えた
http://blog.glidenote.com/blog/2013/02/28/the-silver-searcher-better-than-ack/
を参照のこと。


```sh
$ mkdir -p $HOME/local/source
$ cd $HOME/local/source
$ wget "https://github.com/ggreer/the_silver_searcher/archive/master.zip" --no-check-certificate
$ unzip the_silver_searcher-master.zip
$ cd the_silver_searcher-master
$ sed -i -e "s/configure/configure --prefix=\$HOME\/local/g" build.sh
$ ./build.sh
$ make install
```
これで~/local/bin/agにインストール完了。使う時は、$HOME/local/bin/にパスを通して

```sh
$ ag hogehoge
```
これで高速に検索できます。しかも見た目はackとおなじように一つのファイルごとにうまくまとめられて表示されます。詳しくはGitHubの元のリポジトリの説明を参考に。
素晴らしい。
バージョン管理に使えるenum定義

```cpp
enum tagToolVersion{
    Version1_0 = 0x00000001,
    Version2_0 = 0x00000002,
    Version2_1 = 0x00010002,
    Version3_0 = 0x00000003,
    NowVersion = Version1_0
}ToolVersion;
```

enum定義内に現在のバージョンを記述することで、他の場所で定義したりせず一括で管理できます。
現在のバージョンを取得したい時には
ToolVersion saveVersion = ToolVersion::NowVersion;
のように記述すればOKです。
第8回オフラインリアルタイムどう書く。C による実装例。


問題 : http://nabetani.sakura.ne.jp/hena/ord8biboma/
解答リンク集 : http://qiita.com/items/709d61dff282cff7a890

当日書いた実装。

ruby版( http://qiita.com/items/0a9fbd1d33ccfd533dc6 )と異なり

* 爆弾ごとにループ
* 方向ごとに関数呼び出し
* 一歩ずつ進める

という方針で、あまりビット演算していない。

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

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int nibble( char const * hextext, int bit_pos )
{
    char s[2] = { hextext[ bit_pos / 4 ], 0 };
    return strtol( s, 0, 16 );    
}

int mask( int bit_pos )
{
    return 8>>(bit_pos%4);
}

int bit( char const * hextext, int bit_pos )
{
    return !!( nibble( hextext, bit_pos ) & mask( bit_pos ) );
}

int setbit( char * hextext, int bit_pos )
{
    int new_value = nibble( hextext, bit_pos ) | mask( bit_pos );
    hextext[ bit_pos/4 ] = "0123456789abcdef"[new_value];
}

void explode( int bom, int dx, int dy, char const * src, char * result )
{
    if ( bom<0 || 30<bom || bit( src, bom ) ){
        return;
    }
    setbit( result, bom );
    int x=bom%6  +dx;
    int y=bom/6 + dy;
    if ( 0<=x && x<6 && 0<=y && y<5 ){
        explode( bom+dx+dy*6, dx, dy, src, result );
    }
}

void solve( char const * src, char * result  )
{
    strcpy( result, "00000000" );
    for( int bom=0 ; bom<30 ; ++bom ){
        if ( ! bit( src+9, bom ) ){
            continue;
        }
        explode( bom, 0, 1, src, result );
        explode( bom, 0, -1, src, result );
        explode( bom, 1, 0, src, result );
        explode( bom, -1, 0, src, result );
    }
}

void test( char const * src, char const * expected )
{
    char actual[ 9 ] = {0};
    solve( src, actual );
    _Bool ok = 0==strcmp( actual, expected );
    printf( "%s -> %s ( %s ) : %s\n", src, actual, expected, ok ? "ok" : "***NG***" );
}

int main()
{
/*0*/ test( "802b1200/01400c20", "53c40cfc" );
/*29*/ test( "0c901d38/72602200", "f36da280" );
}
```

いつもどおり、テストデータの大半は省略。

整数を16進数に変換すると言う処理で、sprintf 使うのも嫌だし、strtol の逆の処理の関数思い出せないし、ということでやや乱暴な計算になっている。

あと。関数 bit で行われている !! という演算は2回 not を行う演算で、返戻値を 0 または 1 に強制するためのもの。
http://blog.livedoor.jp/dankogai/archives/51220619.html
で dankogai さんも紹介している。


`#include` から　`solve` の最後までで 52行。
設定を作ったとき onPreferenceChange でエラーが出る。


## 問題
```java:SettingActivity.java
private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
		@Override
ここがエラー→	public boolean onPreferenceChange(Preference preference, Object value) {
　　　//･･･････いろいろ
}
};
```
`onPreferenceChange(Preference preference, Object value)` が スーパークラスをオーバーライドできない 的なエラーで先に進めない。

## 原因のファイルの特定
新規プロジェクトを作成して、原因調査を行ったところ

プロジェクト
+- .setting
　　+- org.eclipse.jdt.core.prefs　これ

```plane:org.eclipse.jdt.core.prefs
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
org.eclipse.jdt.core.compiler.compliance=1.5
org.eclipse.jdt.core.compiler.source=1.5
```

ここが違った。

## 修正
の [1.5]と書いてある物を [1.6]としたら直った。
zshのzでタブ補完を可能にする

あまり知られていないようなので書いときます。

[rupa/z](https://github.com/rupa/z) では、以下のように移動先をタブ補完することができます。

```console
$ _z <TAB>
/to/path/hoge    /to/path/fuga     /to/path/piyo
/to/path/foo     /to/path/bazz     /to/path/bar
```

しかしデフォルトでは``_z``にしか補完関数が設定されていません。

そこで``.zshrc``に以下のような設定を追加することで``_z``以外にも補完関数を適用することができます。

```sh
compctl -U -K _z_zsh_tab_completion z
```

また、``_Z_CMD``でエイリアスを割り当てている場合は以下のように設定するとよいでしょう。

```sh
compctl -U -K _z_zsh_tab_completion "$_Z_CMD"
```
Opencv2.4 画像の2値化処理


```C++:hoge.cpp
// グレースケール画像を読み込む
// カラー画像の場合は、グレースケールに変換する
cv::Mat gray_imag=cv::imread("hoge.png");
cv::Mat bin_img;

// 引数は、入力画像、出力画像、閾値、出力画像の最大値、処理方法
cv::threshold(gray_img, bin_img, 0, 255, THRESH_BINARY);
```
スマートフォンサイトでGoogle Mapsが崩れてたときに疑うところ


Google Maps API で描画されるimgタグは、画像サイズをCSSで指定してあるので、Retina対応でこんなCSSを書いてると盛大に崩れる。

```css
img:not([width]) {
  zoom: .5;
}
```

```css
#map_canvas img {
  zoom: 1;
}
```

とかしておけば、よさそう。
PHPのアレはRubyで書くとコレ

最近、PHPで書かれたコードをRubyに移行している。
(CodeIgniter => Rails)

で、あのコードはどう書くんだろうという奴をつらつらとメモってみる。

※同じ挙動をするという点を今は大事にしているのでRubyらしさは後から。

# 前提

`PHP 5.4` => `Ruby 2.0.0`

`Rails 3.2.x`

# 配列周り

```php
<?php
// 代入
$ids = [];
$ids[] = 1;
$ids[] = 2;
$ids[] = 3;
$ids[] = 4;
$ids[] = 1;

// イテレーション
foreach ($ids as $id) {
  echo "id => {$id}\n";
}

// unique
$ids = array_unique($ids);

```

```ruby
# 代入
ids = []
ids << 1
ids << 2
ids << 3
ids << 4
ids << 1

# イテレーション
ids.each do |id|
  puts "#{id}"
end

ids.map {|id| puts "#{id}"}

ids.map(&method(:puts))

# unique
ids.uniq!
```

# ハッシュ

```php
<?php
$items = [
  "key1" => "value1",
  "key2" => "value2",
  "key3" => "value3"
];

// イテレーション
foreach ($items as $key => $value) {
    echo "{$key} => {$value}\n";
}

// イテレーション2
foreach ($items as $value) {
    echo "{$value}\n";
}
```

```ruby
# シンボル使ってるから厳密には違う
# 大抵、この後JSONにするから問題にならない
items = {
  key1: "value1",
  key2: "value2",
  key3: "value3"
}

# イテレーション
items.each do |key, value|
  puts "#{key} => #{value}"
end

# イテレーション2
items.each_value do |value|
  puts "#{value}"
end
```

# ループ

```php
<?php
// continue
foreach ($ids as $id) {
	if ($id % 2 == 0) continue;
    echo "id => {$id}\n";
}
```

```ruby
# continue
ids.each do |id|
  next if id.even?
  puts "id => #{id}"
end
```

# よくやっている処理

```php
<?php
// idをキーにして配列を初期化しておく
$results = [];
foreach ($ids as $id) {
  $results[$id] = false;
}

// user_idだけ取りたい
$user_ids = [];
foreach ($users as $user) {
    $user_ids[] = $user->id;
}

// user_idだけ取りたい2
$user_ids = array_map(function($v) { return $v->id; }, $users);

// user_idをキーにしたい
$results = [];
foreach ($users as $user) {
    $results[$user->id] = $user;
}
```

```ruby
# idをキーにして配列を初期化しておく
results = {} # PHPの頃の癖で[]にしておかしくなる事が何度も…。
ids.each do |id|
  results[id] = false
end

ids.each_with_object({}) {|id, h| h[id] = false }

results = ids.inject({}) {|h, id| h[id] = false; h }

results = {}.tap {|h| ids.map {|id| h[id] = false}}

# user_idだけ取りたい
user_ids = users.map {|user| user.id }
user_ids = users.map(&:id)

# user_idをキーにしたい(ActiveSupport)
results = users.index_by(&:id)
```
x.y.z の形式のバージョン番号の文字列をソートするワンライナー

```console
$ cat v.txt
5.5.0-a4
5.3.19
5.4.12
5.5.0-a5
5.3.21
5.3.18
5.4.10
5.3.20
5.4.9
5.4.1
5.4.7
5.5.0-a1
5.3.22
5.5.0-a3
5.4.11
5.4.6
5.5.0-a2
```

単にソートすると 5.4.9 よりも 5.4.10 が上に来る

```console
$ cat v.txt | sort
5.3.18
5.3.19
5.3.20
5.3.21
5.3.22
5.4.1
5.4.10
5.4.11
5.4.12
5.4.6
5.4.7
5.4.9
5.5.0-a1
5.5.0-a2
5.5.0-a3
5.5.0-a4
5.5.0-a5
```

ドットを区切り文字にして第１第２第３フィールドを整数比較でソートする

```console
$ cat v.txt | sort -t . -n -k 1,1 -k 2,2 -k 3,3
5.3.18
5.3.19
5.3.20
5.3.21
5.3.22
5.4.1
5.4.6
5.4.7
5.4.9
5.4.10
5.4.11
5.4.12
5.5.0-a1
5.5.0-a2
5.5.0-a3
5.5.0-a4
5.5.0-a5
```

さらに 5 の最新バージョンを取得したり

```console
$ cat v.txt | sort -t . -n -k 1,1 -k 2,2 -k 3,3 | sed s/$/./ | grep '^5\.' | sed s/.$// | tail -1
5.5.0-a5
```

5.3 の最新バージョンを取得したり

```console
$ cat v.txt | sort -t . -n -k 1,1 -k 2,2 -k 3,3 | sed s/$/./ | grep '^5\.3\.' | sed s/.$// | tail -1
5.3.22
```

5.4.1 を指定してみたり（5.4.12 とならないのがミソ）

```console
$ cat v.txt | sort -t . -n -k 1,1 -k 2,2 -k 3,3 | sed s/$/./ | grep '^5\.4\.1\.' | sed s/.$// | tail -1
5.4.1
```

---

> 5.5.0-a5 より 5.5.0 が上に来てるんですが・・・

```console
$ cat vv.txt
5.5.0-a9
5.5.0-b10
5.5.0-p1
5.5.0-a1
5.5.0-rc10
5.5.0-a10
5.4.10
5.4.9
5.5.0-p10
5.5.0
5.5.0-b9
5.5.1
5.5.0-b1
5.4.1
5.5.0-p100
5.5.0-rc1
5.5.0-rc9

$ cat vv.txt | sort -t . -n -k 1,1 -k 2,2 -k 3,3
5.4.1
5.4.9
5.4.10
5.5.0
5.5.0-a1
5.5.0-a10
5.5.0-a9
5.5.0-b1
5.5.0-b10
5.5.0-b9
5.5.0-p1
5.5.0-p10
5.5.0-p100
5.5.0-rc1
5.5.0-rc10
5.5.0-rc9
5.5.1
```

まかせろー(ﾊﾞﾘﾊﾞﾘﾊﾞﾘ)

```console
$ cat vv.txt | php -r '$a=array_map("trim",file("php://stdin"));usort($a,"version_compare");echo(join("\n",$a))."\n";'
5.4.1
5.4.9
5.4.10
5.5.0-a1
5.5.0-a9
5.5.0-a10
5.5.0-b1
5.5.0-b9
5.5.0-b10
5.5.0-rc1
5.5.0-rc9
5.5.0-rc10
5.5.0
5.5.0-p1
5.5.0-p10
5.5.0-p100
5.5.1
```

---

もっと上手い方法があれば教えて欲しいです(>_<)
neosnippetで次のmarkerにjumpする


以下の様な複数のmarkerがあるsnippetを登録しているとする。

```:python.snippet
snippet from
        from ${1:module} import ${2:name}
```

`${1:module}`を入力したあとに、`${2:name}`へ移動したいときは、

```:.vimrc
imap <expr><C-l>
\ neosnippet#expandable() <Bar><Bar> neosnippet#jumpable() ?
\ "\<Plug>(neosnippet_expand_or_jump)" : "\<C-n>"
```

としておくと、insertモード中に`Ctrl + l`で`${2:name}`へjumpできる。

## 参考

+ http://kazuph.hateblo.jp/entry/2012/11/28/105633
+ http://d.hatena.ne.jp/thinca/20130110/1357790456
解决 Git 在 windows 下中文乱码的问题


## 原因

中文乱码的根源在于 windows 基于一些历史原因无法全面支持 utf-8 编码格式，并且也无法通过有效手段令其全面支持。

## 解决方案

1. 安装

2. 设置（以下需要修改的文件，均位于 git 安装目录下的 etc/ 目录中）

2.1. 让 Git 支持 utf-8 编码

在命令行下输入以下命令：

```bash
$ git config --global core.quotepath false			# 显示 status 编码
$ git config --global gui.encoding utf-8			# 图形界面编码
$ git config --global i18n.commit.encoding utf-8	# 提交信息编码
$ git config --global i18n.logoutputencoding utf-8	# 输出 log 编码
$ export LESSCHARSET=utf-8
# 最后一条命令是因为 git log 默认使用 less 分页，所以需要 bash 对 less 命令进行 utf-8 编码
```

2.2. 让 ls 命令可以显示中文名称

修改 git-completion.bash 文件：

```bash
# 在文件末尾处添加一行
alias ls="ls --show-control-chars --color"
```

经过以上折腾之后，基本可以解决中文显示的问题。唯一的麻烦在于输入中文字符时会显示乱码，目前还没有完美的解决方案。

以下描述一个可用的临时方案：

1. 前提条件：`git commit` 时，不用 `-m` 参数，也就是不在命令行下直接输入提交信息，而是敲回车，让 vim 来接管

2. 进入 vim 后，按 `i` 键进入编辑模式，然后输入提交信息。（可多行）

3. 输入完成后按 `esc` 退出编辑模式，然后输入 `:wq`，也就是写入+退出，即可。

4. 如果进入 vim 后发现不能输入中文，那么先按 `esc` 退出编辑模式，然后输入：`:set termencoding=GBK`，即可。（也可能是 GB2312，都试一下）

## 还好我们有 GUI

实在搞不定命令行的童鞋，请直接使用各种 GUI 工具吧！

1. 使用 eclipse IDE的，可以安装 EGit 插件

2. 不使用 IDE 的，可以搜索一个叫做 SmartGit 的 GUI 客户端

That's All!
scrollViewDidScroll:が「呼ばれる」問題

UITableViewのメソッド`scrollToRowAtIndexPath:atScrollPosition:animated:`は、最新のiOS 6.1 doc setによると、

>Invoking this method does not cause the delegate to receive a scrollViewDidScroll: message, as is normal for programmatically-invoked user interface operations.

>(拙訳) このメソッドを呼び出しても、通常のプログラマチックに呼び出されたユーザインタフェース操作のように、デリゲートはscrollViewDidScroll:メッセージを受け取りません。

と書いてありますが、実際には呼び出されてしまいます。
では、ユーザがTableViewをスクロールした時にだけ処理をしたい（したくない）！　という時にはどうしたらいいのか。

- - -

ユーザがTableViewをスクロールする方法には（多分）二つあります。

1. ビュー内部をドラッグする。
2. ステータスバーをタップし、一番上までスクロールする。

このどちらかであることを検出できれば良い訳です。
もちろんサブクラス化してUIResponderのメソッドをオーバーライドしてもできますが、もうちょっと簡単な方法があります。

1については`scrollViewDidScroll:`内部でUIScrollViewのプロパティ`dragging`を調べることで検出します。
2については、スクロール直前に呼び出される`scrollViewShouldScrollToTop:`と直後に呼び出される`scrollViewDidScrollToTop:`でフラグを建てることで検出します。

- - -

こんな感じで実装します。

```objectivec:MyTableViewDelegate

@interface MyTableViewDelegate : NSObject <UITableViewDelegate>
@property (nonatomic) BOOL scrollingToTop;
@end


@implementation MyTableViewDelegate

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.dragging || self.scrollingToTop) {
        ...
    }
}

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView {
    self.scrollingToTop = YES;
    return YES;
}

- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView {
    self.scrollingToTop = NO;
}

@end

```

しかし、ドキュメントはしっかり書いてほしいものですね……
NavigationBarとToolBarを上下に移動させつつ消したり出したり

「押したら上と下にひゅっと逃げて、押したらそこからひゅっと出てくるようにして」
「あー、直ぐ出来ます。多分」
「よろしく」

ということで

```objective-c:viewcontroller.m
- (void) showNavigationToolBar {
    UINavigationBar *navBar = self.navigationController.navigationBar;
    float animationDuration = 0.1;
    [self.navigationController setNavigationBarHidden:NO animated:NO];
    navBar.frame = CGRectMake(navBar.frame.origin.x,
                              -navBar.frame.size.height,
                              navBar.frame.size.width,
                              navBar.frame.size.height);
    
    [UIView animateWithDuration:animationDuration animations:^{
        navBar.frame = CGRectMake(navBar.frame.origin.x,
                                  0,
                                  navBar.frame.size.width,
                                  navBar.frame.size.height);
    }];
    
    
    UIToolbar *toolBar = self.navigationController.toolbar;
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    float height;
    if (UIDeviceOrientationIsPortrait(self.interfaceOrientation))
        height = screenRect.size.height;
    else
        height  = screenRect.size.width;

    [self.navigationController setToolbarHidden:NO animated:NO];
    toolBar.frame = CGRectMake(toolBar.frame.origin.x,
                               height,
                               toolBar.frame.size.width,
                               toolBar.frame.size.height);
    
    [UIView animateWithDuration:animationDuration animations:^{
        toolBar.frame = CGRectMake(toolBar.frame.origin.x,
                                   height - toolBar.frame.size.height,
                                   toolBar.frame.size.width,
                                   toolBar.frame.size.height);
    }];
}

- (void) hideNavigationToolBar {
    UINavigationBar *navBar = self.navigationController.navigationBar;
    float animationDuration = 0.1;
    
    [UIView animateWithDuration:animationDuration animations:^{
        navBar.frame = CGRectMake(navBar.frame.origin.x,
                                      -navBar.frame.size.height,
                                      navBar.frame.size.width,
                                      navBar.frame.size.height);
    } completion:^(BOOL finished) {
        [self.navigationController setNavigationBarHidden:YES animated:NO];
    }];
    
    
    UIToolbar *toolBar = self.navigationController.toolbar;
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    
    [UIView animateWithDuration:animationDuration animations:^{
        toolBar.frame = CGRectMake(toolBar.frame.origin.x,
                                  screenRect.size.height,
                                  toolBar.frame.size.width,
                                  toolBar.frame.size.height);
    } completion:^(BOOL finished) {
        [self.navigationController setToolbarHidden:YES animated:NO];
    }];
}
```

そんな派手な事はしてないんだけど、あんまし検索しても出てこなかったので備忘録として記載。
にんともかんとも
LINQメソッドにShuffleを追加する

アイデアはDOBON.NET(Coding Horror)から。

```csharp
public static IOrderedEnumerable<TSource> Shuffle<TSource>(
	this IEnumerable<TSource> source )
{
	return source.OrderBy( x => Guid.NewGuid( ) );
}
```

使用例:

```csharp
var values = new[ ] { 1, 2, 3, 4, 5 };
foreach ( var value in values.Shuffle( ) )
{
	Console.WriteLine( value );
}

Console.WriteLine( "終了するには何かキーを押して下さい..." );
Console.ReadKey( );
```

実行結果

```
2
5
3
4
1
終了するには何かキーを押して下さい...
```

DOBON.NET: http://dobon.net/vb/dotnet/programing/arrayshuffle.html
Coding Horror: http://www.codinghorror.com/blog/2007/12/shuffling.html
UILocalNotification 毎週指定時間に通知されるローカル通知の設定

UILocalNotification(ローカル通知)は通知したいNSDate(日付)を設定すれば、その時間にアプリの通知を発生させることが出来ます。
毎週繰り返す設定もあるので、指定したNSDateを毎週通知することも出来ます。


### バナー
![SS1](http://f.cl.ly/items/2u0D2b2C0N161i2I3b1D/名称未設定%202.png)

### ダイアログ
![SS2](http://f.cl.ly/items/0l1u0l1o0I0O471q250X/名称未設定.png)

## サンプルコード
指定の時間と曜日を毎週通知するローカル通知のサンプルです。
以前投稿した[指定日以降の1週間を曜日指定で取得するメソッド](http://qiita.com/items/c22d053c48250a242c8b)を使用しています。

```objectivec:ViewController.m
- (void)viewDidLoad
{
    // 月 水 金 のNSDateを取得 (時間はself.datePicker.dateの時間を使用します)
	NSArray *oneweekDate = [self.datePicker.date oneWeekDateWithEnableWeekdayType:YSWeekdayTypeSunday | YSWeekdayTypeTuesday | YSWeekdayTypeFriday];
	// 取得した日付を順次ローカル通知に登録
    for (NSDate *date in oneweekDate) {
        [self configureNotificationWithDate:date];
    }
}

- (void)configureNotificationWithDate:(NSDate*)date
{
    UILocalNotification *notification = [[UILocalNotification alloc] init];
    // 通知する日付
    [notification setFireDate:date];
    // 使用するカレンダー
    notification.repeatCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    // 毎週繰り返す
    notification.repeatInterval = NSWeekCalendarUnit;
    // タイムゾーン
    [notification setTimeZone:[NSTimeZone localTimeZone]];
    // 通知する本文
    [notification setAlertBody:@"通知の本文です"];
    // 通知音(デフォルトを指定)
    [notification setSoundName:UILocalNotificationDefaultSoundName];
    // アラートタイプ(ダイアログ)の通知の場合に使用する決定ボタンの文字列
    [notification setAlertAction:@"アプリを起動"];
    // ローカル通知の登録
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
```
## 結果
self.datePicker.date が 3/2 8:00 だとしたら、毎週月、水、金の 8:00 にローカル通知がされます。
第8回オフラインリアルタイムどう書くの問題をRubyで解きました

問題：http://nabetani.sakura.ne.jp/hena/ord8biboma/
回答例：http://qiita.com/items/709d61dff282cff7a890

コードがごちゃごちゃしてしまった。

```ruby:offline8.rb
#coding:utf-8

Height = 5
Width = 6

def index x,y
  x + Width*y
end

def bother wall, x1, x2, y1, y2
  b = false
  ([x1,x2].min..[x1,x2].max).each do |x|
    ([y1,y2].min..[y1,y2].max).each do |y|
      b = true unless wall[index x,y].zero?
    end
  end
  b
end

def fire wall, bom, x, y
  f = 0
  Width.times do |xx|
    f = 1 unless bom[index xx,y].zero? || bother(wall,x,xx,y,y)
  end
  Height.times do |yy|
    f = 1 unless bom[index x,yy].zero? || bother(wall,x,x,y,yy)
  end
  f
end

def calc s
  wall, bom = s.split("/").map{|m| ("%032b"%m.to_i(16)).chars.map{|m| m.to_i}}
  r = Array.new(32, 0)
  Width.times do |x|
    Height.times do |y|
      r[index x,y] = fire wall, bom, x, y
    end
  end
  sprintf("%08x", r.map{|m| m.to_s}.join.to_i(2))
end

DATA.each do |a|
  n, s, d = a.split
  r = calc s
  t = r==d ? "ok": "ng  #{r}!=#{d}"
  puts "#{n}:  #{t}"
end

__END__
0 802b1200/01400c20 53c40cfc
1 28301068/84080504 d64fef94
2 100a4010/80010004 e241850c
3 81020400/000000fc 0e3cfbfc
4 80225020/7e082080 7fdd24d0
5 01201200/40102008 fe1861fc
6 00201000/01000200 43c48f08
7 00891220/81020408 ff060c1c
8 410033c0/0c300000 3cf0c000
9 00000000/01400a00 7bf7bf78
10  00000000/20000a00 fca2bf28
11  00000000/00000000 00000000
12  00cafe00/00000000 00000000
13  aaabaaaa/50000000 51441040
14  a95a95a8/56a56a54 56a56a54
15  104fc820/80201010 ea30345c
16  4a940214/05000008 05000008
17  00908000/05000200 ff043f48
18  00c48c00/fe1861fc ff3873fc
19  00000004/81020400 fffffff0
20  111028b0/40021100 e08fd744
21  6808490c/01959000 17f7b650
22  30821004/81014040 c75de5f8
23  0004c810/10003100 fe4937c4
24  12022020/88200000 edf08208
25  2aa92098/01160000 45165964
26  00242940/10010004 fc43c43c
27  483c2120/11004c00 33c3de10
28  10140140/44004a04 eda3fe3c
29  0c901d38/72602200 f36da280
```
RailsアプリをSub-URIで動かす

__2013/03/02に投稿ということで古いので、それぞれの最新のバージョンとは動作が異なることがあります（いや、きっと異なります）。__

Rails 3 アプリを各Webサーバーで Sub-URI で使う方法

## Thin

```
thin --prefix /subdir start
```

とすると /subdir で動作はするが css や js のリンクが変わらない prefix 指定では RAILS_RELATIVE_URL_ROOT はセットされないので、起動時に環境変数としてセットし、config.ru で

```
map ActionController::Base.config.relative_url_root || "/" do
  run Test::Application
end
```

> ENV['RAILS_RELATIVE_URL_ROOT'] の値が ActionController::Base.config.relative_url_root にセットされます。

とすることで css や js のリンク先が変わる、ただし、prefix と併用するとアプリは /subdir/subidr/ での動作となり、css や js のリンク先は /subdir/ になってしまう。

期待通りに動作させるためには prefix 指定無しで RAILS_RELATIVE_URL_ROOT をセットし、config.ru で RAILS_RELATIVE_URL_ROOT を扱う必要がある。

`thin --prefix /subdir` と

```
config.assets.prefix = '/subdir/assets'
```

の組み合わせでも動作した。RAILS_RELATIVE_URL_ROOT は使わない。

## Unicorn

unicorn の場合は `--path /subdir` を指定して起動させると RAILS_RELATIVE_URL_ROOT がセットされるので config.ru で RAILS_RELATIVE_URL_ROOT を使ってやると動作する

## Passenger (Rack)

DocumentRoot にアプリの public ディレクトリを subdir という名前でシンボリックリンクをはり、

```
RackBaseURI /subdir
```

とすることで

```
RAILS_RELATIVE_URL_ROOT=/subdir
RACK_BASE_URI=/subdir
```

がアプリに渡される。config.ru で RAILS_RELATIVE_URL_ROOT を扱うと Thin で両方指定した場合と同じように /subdir/subdir/ となってしまうため、config.ru で RAILS_RELATIVE_URL_ROOT を全く扱わないか RACK_BASE_URI に何かセットされていたら RAILS_RELATIVE_URL_ROOT を無視するという設定にする必要がある。

```
if ! ENV['RACK_BASE_URI'] && ENV['RAILS_RELATIVE_URL_ROOT']
  map ENV['RAILS_RELATIVE_URL_ROOT'] || "/" do
    run Test::Application
  end
else
  run Test::Application
end
```

みたいな。

## Passenger (非Rack)

RackBaseURI の代わりに RailsBaseURI を使う

```
RailsBaseURI /subdir
```
こうすると config.ru は使われなくなり、RAILS_RELATIVE_URL_ROOT だけがセットされる。そして、これで期待の動作をする。

## まとめ

実は Ruby ドシロウトです。
Rails (Rack) ってこういうものなんでしょうか？
わざわざ `--prefix` とか `--path` なんてオプションがあるのにそれだけではうまくいかない。アプリの書き方で対応可能？
どの Web サーバーでも書き換えたりしないで動かせればいいのにと思いました。

ツッコミお待ちしております。
[memo] chef-soloのセットアップ

とりあえずインストールできたので、ひとまず参考リンクだけ。

インストール環境
OS: CentOS 6.3 (VMWare Fusion 4.1.4内)
使用shell: bash

http://jedipunkz.github.com/blog/2012/08/18/chef-solo/
全体の流れはこちらを参照。
自分の環境では、サンプルにあったJSONのままでは正しく動かなかった。

https://github.com/sstephenson/rbenv/#installation
rbenv。インストール自体は、これを見れば楽勝。

http://qiita.com/items/16d2827519a152b514cd
インストール前のパッケージなどを参考に。
rails-footnotesとbetter_errorsのリンクをRubyMineで開けるようにする。

Railsの開発効率を劇的に向上するrails-footnotesとbetter_errorsというgemがあります。

今回はそれらのgemとRubyMineに対応させる手順を記します。

※ ちなみにrails-footnotesとbetter_errorsを知らない人へ

[rails-footnotes]
Webページの一番下に、呼び出し元のcontrollerのリンクや、いろいろ役に立ちそうな情報を表示してくれるgem。マジおすすめ！

[better_errors] 
例外が出たらこんな感じのページになるgem。マジおすすめ！

https://a248.e.akamai.net/camo.github.com/f05d967fb90cbe3e686ad794062c2151f7ee19a5/687474703a2f2f692e696d6775722e636f6d2f7a594f58462e706e67

■ 対象環境
Rails 3.2系 (4系は未調査。誰か教えてください)
RubyMine 5.4 # x-mineというプロトコルが5.4からついたようなので、5.4以上に
OS: Mac

■ 手順

RubyMine 5.4からx-mineというプロトコルが開けるように対応されたようで、RubyMine5.4前提で説明します。
※ ryumuさん教えてくれてありがとうございます！

・RubyMine 5.4を用意する
な ん と し て も 手 に 入 れ る んだ ！ 
もし今持ってくても30日くらいは評価版として使うことができるので、ぜひ入れてみて試してみて下さい。

・ Gemfileにrails-footnotesとbetter_errorsを追加

```ruby:Gemfile
# こんな感じで、必ず:developmentで囲う
group :development do
  gem 'better_errors'
  gem 'binding_of_caller'
  gem 'rails-footnotes'
end
```

・ initializersにて設定

```ruby:config/initializers/hogehoge.rb
if defined?(Footnotes) && Rails.env.development?
  Footnotes.run! # first of all
  Footnotes::Filter.prefix = 'x-mine://open?file=%s&line=%d'
end

if defined?(BetterErrors) && Rails.env.development?
  BetterErrors.editor='x-mine://open?file=%{file}&line=%{line}'
end
```

・ 開発中のWebページの一番下、Controllerのリンクをクリック

・ あとはダイアログが出てRubymineと関連つける？みたいな感じのことを言われるので流れのままに

これでうまくリンクがRubyMineで開くことが出来れば完成です！
このgemはrailsでの開発効率がかなり良くなるので、一度試していただければとおもいます！