OmniAICreator/Qiita-1.07M huggingface dataset:
乱立するRubyの２ちゃんねる関連ライブラリの比較

いずれのライブラリも書き込み機能はなく、2015年3月から導入された2ch.netのAPIにも対応していない。

特記がない限り以下の機能を持つ。

  * 掲示板の一覧を取得（[http://menu.2ch.net/bbsmenu.html](http://menu.2ch.net/bbsmenu.html)をパース）
  * スレッド一覧を取得（subject.txtをパース）
  * スレッドのレスを取得（DATファイルをパース）
    * :warning: 2ch.netでは2015年3月13日からdatへのアクセスができなくなった。
  * gzipによるレスポンスの圧縮に対応。

## x2ch
* [rubygems.org](http://rubygems.org/gems/x2ch)
* [xmisao/x2ch - GitHub](https://github.com/xmisao/x2ch)
* バージョン: 0.9.3 (2015/03/26)
* 自動テスト: なし
* サポートしている掲示板: ２ちゃんねる（デフォルトで2ch.scを参照）, まちＢＢＳ
* ID、BE、書き込み日時: DATの3列目のフィールドをそのまま使用する（`X2CH::Post#metadata #=> "2014/01/11(土) 10:10:00.00 ID:xxxxxxxxx"`）ので、これらのデータを使いたい場合には自前でパースする必要がある。

DATファイルについては`Range`ヘッダーによる差分取得や`If-Modified-Since`ヘッダーなども利用できる。

* [x2chタグのエントリ一覧 -- ぺけみさお](http://www.xmisao.com/tags/x2ch/) - 作者による解説

## bbs2ch
* [rubygems.org](http://rubygems.org/gems/bbs2ch)
* [fukayatsu/bbs2ch - GitHub](https://github.com/fukayatsu/bbs2ch)
* バージョン: 0.1.1 (2013/09/12)
* 自動テスト: あり(rspec)
* サポートしている掲示板: ２ちゃんねる（デフォルトで2ch.netを参照）
* ID、BE、書き込み日時: それぞれパースを行う（書き込み日時のパースには`Time.parse`を使用）。

DAT、subject.txt、bbsmenu.htmlについては、ダウンロードとパースが一つのメソッド内でまとめて実行されるので、ローカルに置いているデータをパースする用途には不向き。

## Manbo-/bot2ch
* rubygems.org - 登録されていない。
* [Manbo-/bot2ch - GitHub](https://github.com/Manbo-/bot2ch)
* バージョン: 0.9.1 (2014/01/13)
* 自動テスト: あり(rspec)
* サポートしている掲示板: ２ちゃんねる（デフォルトで2ch.netを参照）, したらば
* ID、BE、書き込み日時: ID、書き込み日時のパースを行う（書き込み日時のパースはDATの3列目のフィールドから数字をスキャンして`Time.local`に渡すという手法）。BE IDは取得できない。

テスト周りが充実しており、Guard::RSpecによってファイルの更新時に自動でテストを走らせることができる。VCRによってレスポンスをキャッシュしているのでサーバーの負荷を気にする必要はない。

指定したスレッド内の画像をまとめてダウンロードするコマンドラインツール[Manbo-/bot2ch-downloader](https://github.com/Manbo-/bot2ch-downloader)が公開されている。

### インストール

gemになっているのでBundlerを使うか`rake install`でインストールすることで利用できる。

文字コードの変換のため[Manbo-/faraday-response-encoder](https://github.com/Manbo-/faraday-response-encoder)を使用しているが、rubygems.orgに登録されていないので手動でインストールする必要がある。

## ruby2ch
* [rubygems.org](http://rubygems.org/gems/ruby2ch)
* [onodes/ruby2ch - GitHub](https://github.com/onodes/ruby2ch)
* バージョン: 0.1.2 (2011/12/13)
* 自動テスト: なし
* サポートしている掲示板: ２ちゃんねる（デフォルトで2ch.netを参照）

rubygems.orgに記載されている累計ダウンロード数はもっとも多いが、現状では正常に動作しない箇所が多いため、素人にはお薦めできない。

`Ruby2ch::Board.new(url)`でスレッド一覧を取得できる。ただし、ニュース速報板以外のスレッド一覧は正常に取得できない。

`Ruby2ch::Dat.new(url, title)`で、DATファイルをダウンロードしてパースした結果が取得できる。DATはbg20サーバーから取得する。パース用の正規表現がマッチせず、パースに失敗する場合がある。`Ruby2ch::Board#new`で利用されることを意図して作られており、`title`にはsubback.htmlのスレッドへのリンクのラベルを渡すようになっている。ただし、ラベルからスレッドのタイトルを取り出す正規表現は現在の形式に対応していない。`Ruby2ch::Dat#impetus`でスレッドの勢いを取得できる。

`Ruby2ch::Thre.new(url)`でスレッドを読み込むと、MechanizeによってスレッドのHTMLを取得し、パースを行う。レスの本文は`@res`という配列に入れられ、投稿者名は`@name`という配列に入れられる、といった作りになっている。`Ruby2ch::Thre#impetus`でスレッドの勢いを取得できる。

---

<p>
  This document is licensed under
  <a rel="license"
     href="http://creativecommons.org/publicdomain/zero/1.0/">CC0</a>.
</p>
watchmedo(watchdog)を使ってエディタでファイルを保存する度にテストを実行する時の設定

エディタでファイルを保存する度にタスクを実行したい時、RubyであればGuard、JSを書いている時であればGruntを使えば良いのだが、Pythonのコードを書いている時はその手のツールもPython製の物を使いたい。ここでは[watchdog](https://github.com/gorakhargosh/watchdog)を使う。

導入は

```bash
pip install watchdog
```

するとコマンドラインユーティリティのwatchmedoコマンドが使えるようになる。ファイルシステムのイベントを監視して、特定のコマンドを実行したい場合はこんな感じ

```bash
watchmedo shell-command --patterns="*.py" --recursive --command='echo "${watch_src_path} is saved"' .
```

## vimの設定
[watchdog](https://github.com/gorakhargosh/watchdog)のReadmeにある通り、MacOSX + ターミナル上でvimを使っているとファイルシステムイベントを取れない。スワップファイルを作らないように、vimの次の設定を変えると良い。自分の.vimrcは次の通りにしてある。もしくは _.*.swp_ファイルを監視対象にしてしまえば動作する。

```.vimrc
let OSTYPE = system('uname')
if OSTYPE == "Darwin\n"
    set noswapfile
    set nowritebackup
endif
```

##テストを実行するwatchタスクを作る
例えばMakefileにtestタスクがあり、ファイル保存時にtestタスクを実行するwatchタスクを追加したい場合

```mf:Makefile
watch:
	# appディレクトリ以下の*.pyファイルのイベントを監視してmake testを実行する
	@echo Watch file changes and run test
	watchmedo shell-command --interval=5 --patterns="*.py" -R -W -D --command='make test' app

test:
	# (例) Djangoのテストを実行する
	python app/manage.py test;
```
ファイルシステムイベントが複数飛んだ時に、テストが何度も実行されるのを抑止するための二重起動防止オプションが必要。
brew update したら「error: unable to unlink old 'XXXXXXX' (Permission denied)」

```
$ brew update
error: unable to unlink old 'SUPPORTERS.md' (Permission denied)
Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master
```

```
$ sudo chown -R `whoami` /usr/local
$ cd /usr/local
$ git stash
$ git reset --hard
$ brew update
```
vim + Node.js で、JavaScriptファイルの構文チェックする

[vim-nodejs-errorformat](https://github.com/felixge/vim-nodejs-errorformat) pluginを使うと実現できる。

pluginを、サイトのReadmeにしたがってインストールする。
もしくはNeoBundleを使っているなら、以下のようにvimrcに追記しても良い。

```vim
NeoBundle 'felixge/vim-nodejs-errorformat'
```

.js ファイルを開いた状態で ```:make``` と入力すると、nodeを実行し、構文エラーがあればエラーを強調表示してくれます。

![エラー表示](https://qiita-image-store.s3.amazonaws.com/0/529/31c0a4af-6d98-82d2-13eb-a5682e34c114.jpeg)

```:cw<Enter>``` と入力して、Quickfixウインドウを開くと、エラー一覧を確認できます。
Quickfixウインドウでエラーを選択してEnterすると、エラー行にジャンプできます。

![Quickfix](https://qiita-image-store.s3.amazonaws.com/0/529/15c84d9c-0914-1f78-c8c3-8dc03a76e6d6.jpeg)
第33回 #ProofCafe での練習問題のssreflectを使った解答例。

第33回 #ProofCafe での練習問題のssreflectを使った解答例。

```coq:Equiv_J.v
Require Import ssreflect.
(* **** Exercise: 3 stars (swap_if_branches) *)
(** **** 練習問題: ★★★ (swap_if_branches) *)
Theorem swap_if_branches: forall b e1 e2,
  cequiv
    (IFB b THEN e1 ELSE e2 FI)
    (IFB BNot b THEN e2 ELSE e1 FI).
Proof.
  move => b e1 e2.
  split => H.
  - inversion H; subst.
    + by apply E_IfFalse; [simpl; rewrite H5 |].
    + by apply E_IfTrue;  [simpl; rewrite H5 |].
  - inversion H; subst.
    + apply E_IfFalse; [| assumption].
      rewrite  (negb_involutive_reverse (beval st b)).
      simpl in H5. by rewrite H5.
    + apply E_IfTrue; [| assumption].
      rewrite (negb_involutive_reverse (beval st b)).
      simpl in H5. by rewrite H5.
Qed. 
```

ProofCafe: http://proofcafe.org/wiki/
dockerで"Unable to mount using aufs"エラーの対処法

今まで問題なくDockerコンテナを起動できていたのに、突如

```
Unable to mount using aufs
```

というエラーで起動できなくなった。調べてみるとこれは、AUFSでファイルシステムををスタックできる限界値に到達したかららしい。限界値は **42** らしい。

これを回避する方法はVersion 0.64の時点ではない。ワークアラウンドとして、exportコマンドでcontainerをtarに出力して、それをimportする。

例：

```bash
# kimh/aufs-limit というイメージがAUFSの限界に達したとする

# 一度aufs-limiitからコンテナを起動する
container_id=$(docker run -d kimh/aufs-limit /bin/bash -c "")
# tarにexportする
docker export $container_id > aufs-limit.tar
# tarからimportする
new_image_id=$(docker import - < aufs-limit.tar)
# 既存のイメージを削除する
docker rmi aufs-limitのImageID
# importしたイメージにtagをつける
docker tag $new_image_id kimh/aufu-limit
```

これでkimh/aufs-limitは元通りになるけどメタデータは失われてしまう。今のところはこれは避けられない。
[phiary] jQuery の代わりに Selectors API の querySelector/querySelectorAll を使うと良いかもよ♪

**本家ブログ『[phiary](http://phiary.me)』からの転載になります**
**もしよければこちらからご覧ください -> http://phiary.me/jquery-selector-api-query-selector-all/**


<br />
<br />


今回は Selectors API の `querySelector`/`querySelectorAll` についてサクッとメモ.

このメソッドを使えば `getElementById` や `getElementsByClassName` の代わりに使えて
CSS セレクタでマッチした要素を取得することができます.

jQuery を使うまでもないけど DOM 操作したいなぁなんて時に使えます.

## Usage

document のメンバメソッドです.

```js

document.querySelector("#hoge");                // id が hoge の要素を取得
document.querySelector("section>h2");           // section 直下の h2 を取得
document.querySelector("input[type='submit]");  // type が submit の要素を取得
document.querySelector(".foo");                 // class が foo の最初の要素を取得
document.querySelectorAll(".foo");              // class が foo の要素を配列として全て取得
document.querySelectorAll(".foo, .bar");        // class が foo もしくは bar の要素を配列として全て取得

```

## Tips

jQuery っぽく使う

```js
if (window.$ === undefined) {
    window.$ = function(q) {
        return document.querySelector(q);
    }
}
 
// id が hoge の要素を取得
$("#hoge");
```


## Reference

自分のエントリーw

 - [Selectors API の querySelector/querySelectorAll を使ってみよう](http://tmlife.net/programming/javascript/selectors-api-queryselector-queryselectorall-use.html)
iOSアプリの署名を付け替える

業務で iOSアプリの開発をしていると、品質保証のためのテストや第三者検証のために、事前にデバイス登録をした機器にだけインストールできる AdHoc配布用の ipaファイルをテストチームにリリースすることが多いと思います。この ipaファイルは、AdHoc専用の証明書を使ってデジタル署名を行って作成します。

一方、実際に AppStoreに出す時は、Store用の証明書で署名を付けることになります。

AdHoc用の ipaを使ってテストを回し、これが全部終わって出荷可能の判断がくだされた後、Store用にビルドをしなおして Storeに上げる、という運用をしていることもあるでしょう。

もちろんこの場合も「全く同じソースコードベース」で「全く同じビルド設定」でビルドをして、Provisioning Profile と署名用証明書だけが異なるようにすれば理論的には問題ありません。ソースコードだけでいえば、Subversion や Git などのSCMを使っていれば、同じコードベースからのビルドであることはほぼ保証できるでしょう。

ビルド設定についてはどうでしょう。異なる署名でビルドする為にビルド構成（Debug, Release の他に Release_For_Storeを作るとか）を増やしたり、対応するSchemeを増やしたりすることになります。しかしこの方法だと、ビルド設定を変える必要が生じた時に忘れずに Release と Release_For_Store の両方に同じ変更を加える必要がでてきたりして、 **人為ミスが入りこむ余地が生じ、メンテナンスリスクが存在**します。

そうではなく、 **Store用の署名をした ipaをベースに、署名だけを AdHoc用に付け替える**ことができれば、テスト対象にしたipaと、実際に Storeにアップロードする **ipaの実行バイナリ同一性**を担保できます。

ここでは、その方法を説明してみます。

## Step1:Store用署名をした ipaファイルを zip展開する

```bash
% unzip TheApplication.ForStore.ipa
```

ipa ファイルは実際にはzip圧縮されたデータですので、まずはこれを展開します。展開すると `Payload` という名前のディレクトリが出来るはずです。このディレクトリの中に、実際のアプリケーションパッケージ(ここでは `Payload/TheApplication.app`)があり、署名はそのパッケージ全体に対して付されています。

## Step2:アプリケーションパッケージの中の Provisioning Profileを置き換える

```bash
% cp ForAdHoc.mobileprovision Payload/TheApplication.app/embedded.mobileprovision
```

アプリケーションパッケージの中にはビルド時に参照した Provisioning Profileも格納されています。署名を付け替えるのであれば、この Provisioning Profileに紐付けられた証明書と整合してなければ最終的に実機でアプリを起動できません。よって、署名を付け替える前に AdHoc配布用の Provisioning Profileのファイルで上書き置換をする必要があります。ファイル名は `embedded.mobileprovision`という名前決め打ちです。

## Step3:署名をし直す

```bash
% codesign --force --sign 'iPhone Distribution: MyCompany ForAdHoc (XXXXXX)' --resource-rules 'Payload/TheAppliation.app/ResourceRules.plist' 'Payload/TheApplication.app'
```

`codesign`コマンドを使って署名をし直しましょう。--force オプションはすでに署名がされていても、それを消して署名を上書きするためのオプションで、今回は必須です。--resource-rules オプションは署名の際に参照されるルールファイルの指定で、これもアプリケーションパッケージの中に格納されています。

なお、署名に使う証明書の識別子を --sign オプションの引数に渡しますが、当該マシンに入っていて、署名に使うことができる証明書（証明書に対応する秘密鍵も存在している状態のもの）の識別子リストは、下記のコマンドで一覧を得られます。（今回の例では仮に `iPhone Distribution: MyCompany ForAdHoc (XXXXXX)`という識別子を想定しています）

また、`security`コマンドではなく、キーチェーンアクセスからGUI上で確認することもできます。

```bash
% security find-identity -p codesigning -v
``` 

## Step4:圧縮&アーカイブして AdHoc用 ipaファイルにする

```bash
% zip -ry TheApplication.ForAdHoc.ipa Payload
```

`Payload`ディレクトリを zip圧縮して AdHoc用ipaを作ります。ダイナミックリンクライブラリなどによっては パッケージの中に相対参照のシンボリックリンクファイルが存在する可能性があるので、 zipコマンドの -y オプションを念の為に付けています。自分のアプリでは不要であればこのオプションは付けなくてもよいでしょう。

* * *

署名付け替えのステップは以上です。

私の現場では、これをさらに Jenkinsに組みこみ、普段は AdHoc用の ipaだけが生成されるが、任意のタイミングで Store用／AdHoc用両方を生成できる仕組みも構築しています。

Jenkinsのパラメータ付きビルドの仕組みを使って、必要な時だけ署名用証明書の秘密鍵をアップロードすることで実現しているのですが、これについてもいずれ機会があれば書いてみたいと思います。
Mac OS X LionからMavericksにアップデートしたときのメモ


## Mavericksにアップデート
なにも考えずにMavericksをダウンロード、インストール。

## Xcode
Xcodeがもともと古かったので最新(5.0.1)のをインストールした。

そのあとberkshelfというgemをインストールしようとすると

```
You have to install development tools first.
```

と言われた。

これはXcodeをアップデートしたのが原因だった。

原因を調べるために ~/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/nio4r-0.5.0/ext/nio4r/mkmf.log を見た。

```
sh: gcc-4.2: command not found
```

gcc-4.2がなかった。アップデートしたXcodeではgcc-4.2からgccに改名されているのが原因。シンボリックリンクを貼ることで解決する。

```
$ sudo ln -s /usr/bin/gcc /usr/bin/gcc-4.2
```

参考 http://qiita.com/mah_lab/items/e3493a99af31d61c81be
参考 http://stackoverflow.com/questions/10344821/gem-install-pg-doesnt-work-on-osx-lion



## Vagrant

1. Vagrant upしたらエラーが出ることを確認
2. VirtualBoxの最新4.2.18をインストール
3. Vagrant upしたら問題なく起動した

そのあと、Vagrantのバージョンが1.0と古かったので1.3.5にしたところ、

```
Progress state: NS_ERROR_FAILURE
VBoxManage: error: Failed to create the host-only adapter
VBoxManage: error: VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory

VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component HostNetworkInterface, interface IHostNetworkInterface
VBoxManage: error: Context: "int handleCreate(HandlerArg*, int, int*)" at line 68 of file VBoxManageHostonly.cpp
```

などというエラーが発生。

しらべたところこの記事がヒット。 http://firegoby.jp/archives/5182

VirtualBoxをアンインストールして再インストール。

直った。

## ShiftIt
ShiftItを使おうとしたら Please check the option for “Enable access for assistive devices” と言われた。

http://www.tekrevue.com/2013/06/25/how-to-enable-access-for-assistive-devices-in-os-x-mavericks/ の指示通りに、システム環境設定＞セキュリティとプライバシー＞プライバシー＞アクセシビリティでShiftIt.appを見つける。コンピュータの制御を許可しようとしたら、X11がないので入れろ、との指示をもらう。 http://support.apple.com/kb/HT5293

言われるがまま[XQuartz](http://xquartz.macosforge.org/landing/)をインストール。

ShifItが動くようになった。
## Tmux
tmuxを起動したら

```
warning: unsupported new OS, trying as if it were 10.6-10.7
```

なる表示。

```
$ brew info tmux
```

で新しいバージョンがあることを知る。

```
$ brew upgrade tmux
```

で新しいバージョンを入手。
でも

```
warning: unsupported new OS, trying as if it were 10.6-10.7
```

の表示は変わらなかった。
MavericksでもEmacsでIMEと仲良くしたい

[EmacsでIMEと仲良くする - Qiita [キータ]](http://qiita.com/catatsuy/items/886f1e0632c0b2760fb4)

この記事に Mac で IME の有効無効でカーソルの色を変えるという記事を書きましたが，Mavericks では入力ソースから US を消すことができないので Google 日本語入力の直接入力を OFF にする人が大半だと思います

そういう人におすすめの設定です

```el:cocoa-emacs-ime.el
(mac-set-input-method-parameter "com.google.inputmethod.Japanese.base" `cursor-color "red")
(mac-set-input-method-parameter "com.apple.keylayout.US" `cursor-color "blue")
```
OS X 10.9 Mavericks環境構築メモ


# はじめに
2013年10月23日にリリースされたOS X 10.9 Mavericks。環境構築に関するTipを記しておきます。

# インストールメディアを作る

Mavericksをインストールするには、Mac App StoreからMavericksをダウンロードしますが、5GB以上あるので結構時間がかかります。再ダウンロードも時間がかかるので、インストールメディアを作っておいたほうが良いでしょう。

すべてのデータが消えても良い6GB以上のUSBメモリなどを用意して、 **インストール処理を行う前に**  、ターミナル上で次のコマンドを入力します。

```bash
sudo /Applications/Install\ OS\ X\ Mavericks.app/Contents/Resources/createinstallmedia --volume /Volumes/Untitled --applicationpath /Applications/Install\ OS\ X\ Mavericks.app
```

`/Volumes/Untitled`はUSBメモリなどのメディアの名前を指定します。

プロンプトが返ってきたら作成終了です。あとはUSBにある`OS X Mavericks インストール`をダブルクリックしたらインストールを行うことが出来ます。

# インストールメディアを作る2

[Appleから公式にインストールメディアを作る記事](http://support.apple.com/kb/HT5856)が出ています。ちょっと上のものとはコマンドが違うようです。こちらについては私は試していません。

# インストールにかかる時間

MacBook Air(Late 2010)にインストールした結果、1時間ぐらいで終了しました。
インストール終了直前にiCloudのパスワード入力が求められますので、手元に用意しておくとよいでしょう。

# Keynote/Pages/Numbersのバージョンアップ

同日、Keynote/Pages/Numbersの新バージョンがリリースされましたが、Mac App Storeで購入した人だけでなく、過去にiWork '09（DVD版）を買った人もバージョンアップできるようです。次の手順で行います。

1. 「システム環境設定」の「言語と地域」で「English」を一番上に持ってきます。
1. その後、「すべてを表示」ボタンをクリックすると、再起動するかどうか聞かれますので、再起動します。
1. 「Mac App Store」を開き、「Updates」を開くとKeynote/Pages/Numbersがリストに現れます。
1. Keynote/Pages/Numbersの「Update」をクリックすると、「Apple IDと紐付ける」云々なダイアログが出ますので、Apple IDとパスワードを入力するとアップデートが出来ます。
1. 「システム環境設定」の「言語と地域」で「日本語」を一番上に持ってきます。

複数台Macを持っている人は、一度別のMacで上記の操作を行うと購入済みのステータスとなるので、これからはMac App Storeで「購入済み」のなかに最新版のKeynote/Pages/Numbersが出てきます。

# homebrew

`brew doctor`コマンドを打つと`Warning: No developer tools installed.`という警告が現れることがあります。

[Apple DevCenter](https://developer.apple.com/downloads/)からMavericks用のCommand Line Toolsをダウンロードしてインストールすると解決します。

# 参考したサイト

本エントリーを書くに当たり、以下のサイトが大変参考になりました。ありがとうございます。

* [OS X 10.9 Mavericks のインストールメディアを作る](http://blog.niw.at/post/64820661489)
* [パッケージ版 iWork・Aperture を「Mac App Store」に登録して無料アップデートする方法 ](http://applembp.blogspot.com/2013/10/iWork-Aperture-Mac-App-Store-Update-Package-Keynote-Numbers.html)
プロビジョンの更新で"You are not allowed to perform this operation"と出る

プロビジョンの更新関連がxocde5から大幅に変わりました。

[Xcode5.0] プロビジョニングプロファイルの追加がわかりづらくて困った
http://weblog.ymt2.net/blog/html/2013/09/21/where_is_provisioning_profiles_editor.html

[iOS 7] アプリ開発入門 1からはじめるiOS7 – プロビジョニングプロファイルの作り方
http://dev.classmethod.jp/references/generate-provisioning-ios7/

こういった開発環境の仕様変更は初見殺しなので、いくら悩んでもわからない
GUIぽちぽちしてると直ったりする・・・ってことでいじってたら動いてたのでメモ

一応StackOverFlowにもこんなのがあった。

Xcode Organizer - cannot refresh Provisioning Profiles list
http://stackoverflow.com/questions/13350545/xcode-organizer-cannot-refresh-provisioning-profiles-list

でもやり方は単純。私の環境では以下の手順で大丈夫でした。


>> Organizer 
>> デバイスでadd to member center 
>> view Account 
>> View Details 
>>　下のプロビジョン更新のボタンを押して更新

![スクリーンショット 2013-10-26 14.48.52.png](https://qiita-image-store.s3.amazonaws.com/0/31237/9d08deee-3784-2bfa-3f84-6a7ed34d3862.png)


これだけ!!
あとはいつも道理実行して、馬車馬のごとく働くだけ!
plenv + carton で prove -Mlib::core::only 指定


plenv + carton でテスト時に -M[lib::core::only](http://search.cpan.org/dist/local-lib/lib/lib/core/only.pm) 指定してデプロイ時に module 足りんよ...とかって突っ返されないようにしてるけど、この３者間の PATH 調整がいろいろと面倒。

carton をバージョンアップしたら **-Ilib** オプションが deprecated されててまた迷子になった...Orz。

起動順とかオプションで整合性を合わせられるかと思ったけど、結局のところ、

```perl:.proverc
--exec "plenv exec perl -Mlib::core::only -Mlib=lib -Mlib=local/lib/perl5"
-Pretty
--merge
--failures
--verbose
--recurse
-w
```

のような lib::core::only を全面にした **.proverc** に落ち着いた。

ちなみに、試したバージョンは以下の通り。バージョンアップされるとまた変わるかも...。

 * plenv 1.4.14
 * carton 1.0.12
Xcodeからの実行時にアプリ内の言語を切り替える

## 複数言語のローカライズをサポートする
言語設定を切り替える場合、設定.appから言語を選択しなければなりません。
その際リスプリングも掛かるので少なくない時間を消費します。

そこで実行時引数を利用することでお手軽に言語を切り替える方法を紹介します。

Edit Scheme -> Run **.app 内のArgumentsタブを選択し、
Arguments Passed On Launchに以下の設定を追加します。
(この場合はiOSの設定によらず日本語ローカライズされた状態で起動します。)

```
-AppleLanguages (ja)
```

後はサポートする言語の数だけ先ほどの設定を追加し、チェックボックスで
切り替えることでローカライズの切り替えを実現できます。




---

### 参考
http://useyourloaf.com/blog/2013/07/22/using-launch-arguments-to-test-localizations.html
goでmapのキーをソートする


結論：配列用意してコピー

試しに`reflect`パッケージを利用してキーを取り出してみましたが、キーの型がreflect.Valueになってしまい<del>激遅です</del>ちょっと遅い。

キーソートに限らずmapのカスタムソートはよく行うのでsortパッケージにはもっと頑張って欲しいです。ジェネリクスが導入されると大分変わるのかな・・・
やはりソート済みmapは追加されないんでしょうか。	

でもやっぱりループ回していっこずつ値を追加するのは効率悪い気がするんだよなあ・・・


訂正: メモリ不足で不当に重くなってたみたい。
ついでにmapのkeyをランダムにして毎回初期化するようにし、
かつ全ての値をスキャンするというユースケースに変更しました。
まあでも倍くらいは遅い。



```結果
% go test sort_test.go -test.bench=".*"
testing: warning: no tests to run
PASS
BenchmarkSortByInterface	2000000000	         0.04 ns/op
BenchmarkSortByBuiltin	2000000000	         0.02 ns/op
BenchmarkSortByHeap	2000000000	         0.03 ns/op
ok  	command-line-arguments	1.468s
```

あとはheapを使った実装も試してみた。先頭１００コだけ、とかならheap使ったほうが速いです。

```ソートした後先頭100個だけ取り出す場合
BenchmarkSortByInterface	2000000000	         0.06 ns/op
BenchmarkSortByBuiltin	2000000000	         0.03 ns/op
BenchmarkSortByHeap	2000000000	         0.02 ns/op
```

```go
package my_sort_test

import (
	// "fmt"
	"container/heap"
	"math/rand"
	"reflect"
	"sort"
	"testing"
)

var M map[int]int

func initialize() {
	M = make(map[int]int)
	for i := 0; i < 100000; i++ {
		M[rand.Int()] = i
	}
}

// reflectを使った場合
func BenchmarkSortByInterface(b *testing.B) {
	initialize()
	keys := reflect.ValueOf(M).MapKeys()
	sort.Sort(&IntKeySorter{keys})
	for i := 0; i < len(keys); i++ {
	}
}

// 配列にコピーした場合
func BenchmarkSortByBuiltin(b *testing.B) {
	initialize()
	keys := make([]int, len(M))
	for k, _ := range M {
		keys = append(keys, k)
	}
	sort.Ints(keys)
	for i := 0; i < len(keys); i++ {
	}
}

// heapを使った場合
func BenchmarkSortByHeap(b *testing.B) {
	initialize()
	h := NewIntHeap(len(M))
	for k, _ := range M {
		heap.Push(h, k)
	}
	for h.Len() > 0 {
		heap.Pop(h)
	}
}

type IntKeySorter struct {
	v []reflect.Value
}

func (v *IntKeySorter) Len() int {
	return len(v.v)
}

func (v *IntKeySorter) Swap(i, j int) {
	v.v[i], v.v[j] = v.v[j], v.v[i]
}

func (v *IntKeySorter) Less(i, j int) bool {
	return v.v[i].Int() < v.v[j].Int()
}

// An IntHeap is a min-heap of ints.
type IntHeap struct {
	s []int
	l int
}

func NewIntHeap(size int) *IntHeap {
	return &IntHeap{make([]int, 0, size), 0}
}

func (h *IntHeap) Len() int           { return h.l }
func (h *IntHeap) Less(i, j int) bool { return h.s[i] < h.s[j] }
func (h *IntHeap) Swap(i, j int)      { h.s[i], h.s[j] = h.s[j], h.s[i] }

func (h *IntHeap) Push(x interface{}) {
	h.s = append(h.s, x.(int))
	h.l++
}

func (h *IntHeap) Pop() interface{} {
	x := h.s[h.l-1]
	h.l--
	return x
}
```
ユーザーエージェント、ブラウザ種類を詳しくチェックするスクリプト

ユーザーエージェントや、ブラウザの判別（特にIE）をしたいときに使うスクリプトです。
IEの7/8だけでどうしても分岐せざるを得ない、って場合とかに便利です。
とりあえずこれ書いとけばOKって感じで使ってます。

※ 2014/01/29 IE11用の分岐を追記しました。

```checkUA.js
// ua判定
var uaObj = {
	uaDevice: 'device-pc',	// PC or モバイル
	uaBrouser: false		// ブラウザの種類
};
uaObj.checkUA = function(){
	var userAgent = navigator.userAgent.toLowerCase();
	var appVersion = navigator.appVersion.toLowerCase();
	// デバイス判定
	if (userAgent.indexOf('iphone') > 0 || userAgent.indexOf('ipod') > 0 || userAgent.indexOf('android') > 0) {
		uaObj.uaDevice = 'device-mobile';
	}
	// ブラウザ判定
	if (userAgent.indexOf('opera') != -1) {
	uaObj.uaBrouser = 'opera';
	} else if (userAgent.indexOf("msie") != -1) {
		if (appVersion.indexOf("msie 6.") != -1) {
			uaObj.uaBrouser = 'ie6';
		} else if (appVersion.indexOf("msie 7.") != -1) {
			uaObj.uaBrouser = 'ie7';
		} else if (appVersion.indexOf("msie 8.") != -1) {
			uaObj.uaBrouser = 'ie8';
		} else if (appVersion.indexOf("msie 9.") != -1) {
			uaObj.uaBrouser = 'ie9';
		} else {
			uaObj.uaBrouser = 'ie';
		}
	} else if (userAgent.indexOf('trident') != -1) {
		uaObj.uaBrouser = 'ie11';
	} else if (userAgent.indexOf('chrome') != -1) {
		uaObj.uaBrouser = 'chrome';
	} else if (userAgent.indexOf('safari') != -1) {
		uaObj.uaBrouser = 'safari';
	} else if (userAgent.indexOf('firefox') != -1) {
		uaObj.uaBrouser = 'firefox';
	} else {
		uaObj.uaBrouser = false;
	}
};

```
※ この場合、iPadをモバイルとは判定していません。必要に応じて追加したりしてます。

（追記）
Retinaかどうかを取得する場合は下記。

```checkUA.js
// retinaかどうかをチェック
uaObj.checkDisplay = function(){
	uaObj.pixelRatio = window.devicePixelRatio;
};

// uaObj.pixelRatio > 2 の時はretina、といった分岐を書く
```

##元記事
[ユーザーエージェント、ブラウザ種類を詳しくチェックするスクリプト - rokuro FIre](http://www.rokurofire.info/2013/10/26/js_uacheck/)
CodeKitのTips

プロジェクト内のjavascriptやcssを自動監視して, 変更があるたびにまとめて連結・圧縮してくれるMac専用のGUIツール [CodeKit](http://incident57.com/codekit/ "Codekit")。

有料だし, 最近はGruntみたいにCUIで同等の機能を持ったのも出てきていますが, この手軽さはなかなか捨てがたいかと思います。

日本語の情報があまり無かったので備忘録。

## javascriptの連結
CSS(LESS/SASS含む)はimport文を書いておけばCodekit側で自動判別してまとめて一つのcssファイルにしてくれますが, jsはそうはいきません。

たくさんあるjavascriptファイルを最終的に一つのファイルに連結して欲しいときは, 以下の構文が使えます。

```
@codekit-prepend "someFile.js"
```
または

```
@codekit-append "someFile.js"
```

これをjavascriptファイル内に記載すると, prependは上, appendは下側に該当のjsファイルを連結して吐き出してくれます。
順序も意識できますし, 相対パスで他のディレクトリにあるファイルも連結対象に含めることができます。
__注: 上記の記述は, jsファイル内ではコメントアウトして記述してください！__

## JetBrains系のIDE使用時の注意点
Codekitは一度プロジェクトをD&Dするとあとは自動でファイルの変更を追尾してjsやcssを吐き出してくれる優れモノなのですが, PhpStormやPycharm, RubyMineのようなJeBrains系IDEを開発に使っている場合は注意が必要です。

これらのIDE自身もファイルの変更を監視していてCtrl+Sで保存をしなくても勝手に裏で保存しているため, 少し変更しただけでCodekitが動き, ブラウザがリロードされる…という自体に陥って, 結構鬱陶しく感じるかと思います。

これを防止するためには, IDEの設定→Generalの項目で
__"Use safe write"のチェックをオフに__
すると良いです。

こうすればCtrl+Sを押したタイミングでCodekitが走るようになります。（そのかわりSafe Writeでなくなっているので, IDEが落ちてしまった時のことを考えるてマメに保存するようにした方が良いと思います。）
kobitoに背景画像が欲しかったから

何か一昔前の２ちゃんねる専用ブラウザをカスタマイズしたりするようなノリでやりました。画像は偶然にフレームによって目線が入っております。

弄ったのトカ
/Applications/Kobito.app/Contents/Resources/markdown.css
背景画像をbody部に置いて、ソースコードのハイライト関連がcode-frameらへんなので背景色を
```      background-color: rgba(225, 225, 225, 0.1);```
多分 (R, G, B, 透明度) の順番なのかな。
cssで背景色を透明化させるのにopacityという方法もあるようですが、試しに書いてみた時には反映させることは出来ませんでした・・・ま、まぁ反映させられてもopacityのほうは挙動がframe内の文字にも影響が出るっぽいので悔しくないです。
フォントを本当にこだわっている人は変更したりも出来るんじゃないかと。


```css:marakdown.css
body{
/**  background-image: url("/Users/aya7581026/Pictures/Konachan108462tsubaki_nazuna.jpg");**/
  background-image: url("/Users/xxx/qiita_bg_r.png");
}

.code-frame {
  -webkit-font-smoothing: antialiased;
  -webkit-border-top-left-radius: 3px;
  -webkit-border-top-right-radius: 3px;
  -webkit-border-bottom-right-radius: 3px;
  -webkit-border-bottom-left-radius: 3px;
  -webkit-background-clip: padding-box;
  -moz-border-radius: 3px;
  border-top-left-radius: 3px;
  border-top-right-radius: 3px;
  border-bottom-right-radius: 3px;
  border-bottom-left-radius: 3px;
  margin: 1.0em 0;
  border: solid 1px #f0f0f0; }
  .code-frame .code-lang {
    background: -moz-linear-gradient(top, #fafafa, #e9e9e9);
    background: -webkit-gradient(linear, left top, left bottom, from(#fafafa), to(#e9e9e9));
    background: -o-linear-gradient(top, #fafafa, #e9e9e9);
    background: linear-gradient(top, #fafafa, #e9e9e9);
    -webkit-box-shadow: inset 0px 1px 0px rgba(255, 255, 255, 0.5);
    -moz-box-shadow: inset 0px 1px 0px rgba(255, 255, 255, 0.5);
    box-shadow: inset 0px 1px 0px rgba(255, 255, 255, 0.5);
    color: #7a7a7a;
    padding: 2px 10px;
    border-top: solid 1px #CCCCCC;
    border-right: solid 1px #DDDDDD;
    border-left: solid 1px #CCCCCC;
    text-shadow: 0px 1px 0px #FFFFFF;
/**    background-color: #e9e9e9;**/
    background-color: rgba(225, 225, 225, 0.1);
    font-size: 0.85em; }
  .code-frame .highlight {
/**    background-color: #e9e9e9;**/
    background-color: rgba(225, 225, 225, 0.1);
    border-top: solid 1px #CCCCCC;
    border-right: solid 1px #DDDDDD;
    border-bottom: solid 1px #DDDDDD;
    border-left: solid 1px #CCCCCC; }
    .code-frame .highlight pre {
      overflow: auto;
      background-color: rgba(225, 225, 225, 0.1);
      border-left: solid 1px #DDDDDD;
      padding: 0.5em 1.0em;
      margin-top: 0;
      margin-right: 0;
      margin-bottom: 0;
      margin-left: 3px; }
      .code-frame .highlight pre code {
        padding: 0;
        border: none;
/**        background-color: transparent;**/
      background-color: rgba(225, 225, 225, 0.1);
        font-size: 0.9em;
        font-family: "Monaco", monospace, "Courier", "Inconsolata", "Bitstream Vera Sans Mono"; }
```

弄ったらこうなりました↓

![http://t.co/BzKI4yyEZG](http://t.co/BzKI4yyEZG)
はい、画像が無断転載・使用だったり、公式アプリの一部書き換えとか色々よろしくないので今日の記事は後日に削除することになるかもしれない。。
ActiveRecord で MySQL のインデックスを指定して取得したい

## なぜ

過去の遺産等でインデックスが機能しておらず、整理も困難なのでインデックスを指定したい。

具体的には、ページネーションで利用している [Kaminari](https://github.com/amatsuda/kaminari "Kaminari") が total_count を取得する時にインデックスが指定されなかったため MySQL の ``USE INDEX (...)`` を設定したかった。

## どうやって

以下のスコープをモデルに記述する

```ruby 
scope :use_index, lambda { |*indexes|
 from("#{self.table_name} USE INDEX(#{indexes.join(', ')})")
}
```

インデックスを利用したい時に指定する

``` ruby
Question.use_index(:index_questions_on_id).page.total_count
#   (82.5ms)  SELECT COUNT(*) FROM questions USE INDEX(index_questions_on_id) 
# => 193887
```

## まとめ

運用中でインデックス自体が整理されてない場合とかの応急処置としてはいいと思う。
本来なら不要なインデックスを削除して MySQL が自動で選択してくれるように最適化するのが一番なんだろうなあ。

ここ一ヶ月、久しぶりに Ruby 書いてて楽しいです。
libtoolsが無い、って言われる on OS X

実はMac OS XというかXcodeに同梱しているlibtool（BSD由来）と、GNUのlibtoolがあるそうな。「libtoolize」と言うコマンドはGNU libtool由来のもの。

インストールはhomebrewなどからできる。

```bash
$ brew install libtool
```

ただし、 `glibtool`, `glibtoolize` と言う名前で入っている。なので、aliasなどを設定して g 無しで実行できるようにするのが良さそう。

autogen.sh さんに怒られたときにちょっとだけ便利かも。
Railsでsunspot(solr)を使って全文検索


##インストールから起動まで
```ruby:Gemfile
gem 'sunspot_rails'
gem 'sunspot_solr' 
```

```bash:コンフィグファイルを生成
rails generate sunspot_rails:install
```

```bash:solrを起動
bundle exec rake sunspot:solr:start
```

##既存のデータに対して再Index
modelのsearchableを見てるので
searchableの内容を変更した時も実行しないといけないみたい

```bash:Indexを再作成
bundle exec rake sunspot:solr:reindex
```

##検索
***基本的な使い方***

```ruby:model
has_many :bookmarks

searchable do
  text :title
  text :content
  double :rating
  integer :user_id
    
  string :tags, :multiple => true do
    bookmarks.map {|b| b.tag}
  end    
end
```

```ruby:controller
result = Recipe.search do
  fulltext params[:q]
end
@recipes = result.results
```

***withで追加条件を指定可能***

```ruby:controller
result = Recipe.search do
  fulltext params[:q]

  with :rating, 1
  with :user_id, user_id if user_id.present?
end
@recipes = result.results
```

***様々な条件指定***

```ruby:controller
with :rating, 1 # rating = 1
with(:rating).less_than 1 # rating < 1
with(:rating).less_than_or_equal_to 1 # rating <= 1
with(:rating).greater_than 1 # rating > 1
with(:rating).greater_than_or_equal_to 1 # rating >= 1
```
***multipleなFieldに対する条件指定***

```ruby:controller
with :tags, [1, 2] # 1 or 2
with(:tags).all_of [1, 2]   # 1 and 2
```

***ページングも出来る***

```ruby:controller
result = Recipe.search do
  fulltext params[:q]

  with :user_id, user_id if user_id.present?
  paginate :page => 1, :per_page => 10
end
@recipes = result.results
```
Play! framework を heroku にデプロイ

# Play framework 2.2.0 をherokuで公開する

## 事前準備
### プロジェクト作成

```bash:Git_Bash
play new your-app
```

### Eclipse プロジェクトファイル作成

```bash:Git_Bash
cd your-app
play eclipse
```

## git初期化 ~ deploy

```bash:Git_Bash
git init
heroku create your-app
git add .
git commit -m "create project"
git push heroku master
```

## 確認

```bash:Git_Bash
heroku open
```
最近の Java Web 開発について喋ってきた

[ENRAPT](http://www.enrapt.jp/) さんで行われた「モダン Java 勉強会」で喋ってきました。モダンって何だよって感じなので取り敢えず最近やってる案件についての話をしました。お話としては JAX-RS + Backbone.js で開発してるよって感じです。ちょっと変わった構成で開発してると思うので良ければどうぞ。

* [GLIDE](http://glide.so/monzou/e355a2c425cdad109537)
* [gist](https://gist.github.com/monzou/e355a2c425cdad109537)

構成上の特徴は、将来的にリッチクライアントなどでも使えるように業務レイヤと Web レイヤを完全に分離した点でしょうか。正直ここまでやる必要があるケースって余り無いと思うのですが、一応自分の場合はこんな感じにしています。

要件定義や設計等と並行して 2 - 3 ヶ月かけて技術調査と基盤開発をしたのですが、Web 開発も楽しいなぁと思ったので機会があったらまたやりたいです。

---

ところで。

正直 Web 開発の経験は全然ないのでこれが正解だとは全く思っていませんが、今回はじめて Web 開発をして思ったのは、「業務アプリで Web 開発をするときに決め手になるような WAF が無いなぁ」ということでした。ちょっとしたツールや、それほど複雑な業務ロジックが無い場合は Rails が良いと思うのですが、ある程度以上の規模で複雑なドメインロジック（例えばデリバティブの評価やポジション管理など）を実装しようと思うと Ruby は流石に厳しいと思います。静的に型付けされる言語が欲しい。そう思って Scala を検討はしてみたのですが、互換性問題が解消されない限りプロダクションで採用するのは憚られます。また、（現時点では）Scala には Ruby で言うところの Rails のような「決め手」となる WAF がありません（[skinny-framework](https://github.com/seratch/skinny-framework) にはちょっと期待しています）。今回はたまたま Java を使わないといけない理由があったのですが、とはいえ言語縛りが無い状態であっても他の言語を採用するかというとなかなか難しいなぁと思ったのでした（そりゃまぁ Scala にはしたいですけども）。
cocos2d-x入門 -4-

#スプライトをタップしてみる
まずは駒を配置します。とりあえず、王将だけにしておきます。
makePiecesメソッドを実装します。
駒スプライトのTagに1を設定しておきます。

```c++:GameScene.h
class GameScene : public cocos2d::Layer
{
private:
    void makeBackground();
    void makePieces();
```

```c++:GameScene.cpp
bool GameScene::init()
{
    if (! CCLayer::init()) {
        return false;
    }
    // 背景を作成する.
    makeBackground();
    // 駒を配置する.
    makePieces();
    return true;
}

// 駒を配置する.
void GameScene::makePieces()
{
    Size winSize = Director::getInstance()->getWinSize();
    Sprite *spPiece = Sprite::create("sgl01.png");
    Size pieceSize = spPiece->getContentSize();
    spPiece->setPosition(Point(winSize.width * 0.5, winSize.height * 0.5 - 4 * pieceSize.height));
    spPiece->setTag(1);
    this->addChild(spPiece);
}
```

実行すると、王将が配置されています。

![実行結果](https://lh3.googleusercontent.com/---j-3N_JSXk/UmpHmDFs21I/AAAAAAAAAis/htUacTlLYc8/w594-h456-no/cocos2d-x_006.jpg "実行結果")

さらに、タップして駒を動かすためにメンバ変数とイベントを受け取るメソッドを作成します。
タップ中の駒スプライトのTagを覚えておくmovePieceを追加しています。

```c++:GameScene.h
class GameScene : public cocos2d::Layer
{
private:
    int movePiece;
    
    void makeBackground();
    void makePieces();
    
public:
    static cocos2d::Scene *createScene();
    virtual bool init();
    CREATE_FUNC(GameScene);

    virtual bool onTouchBegan(cocos2d::Touch *pTouch, cocos2d::Event *pEvent);
    virtual void onTouchMoved(cocos2d::Touch *pTouch, cocos2d::Event *pEvent);
    virtual void onTouchEnded(cocos2d::Touch *pTouch, cocos2d::Event *pEvent);
};
```

タップしたときにイベントを受け取れるように、setTouchEnableとsetTouchModeメソッドで設定しています。
今回はシングルタップにしています。

```c++:GameScene.cpp
bool GameScene::init()
{
    if (! CCLayer::init()) {
        return false;
    }
    movePiece = 0;

    setTouchEnabled(true);
    setTouchMode(Touch::DispatchMode::ONE_BY_ONE);
    
    // 背景を作成する.
    makeBackground();
    // 駒を配置する.
    makePieces();
    return true;
}
```

あとは、各イベントに対応する処理を実装します。

```c++:GameScene.cpp
bool GameScene::onTouchBegan(cocos2d::Touch *pTouch, cocos2d::Event *pEvent)
{
    Director *pDirector = Director::getInstance();
    Point touchPoint = pDirector->convertToGL(pTouch->getLocationInView());
    Node *pPiece = this->getChildByTag(1);
    if (! pPiece) {
        return false;
    }
    Rect pieceRect = pPiece->getBoundingBox();
    if (pieceRect.containsPoint(touchPoint)) {
        movePiece = 1;
        return true;
    }
    return false;
}

void GameScene::onTouchMoved(cocos2d::Touch *pTouch, cocos2d::Event *pEvent)
{
    if (movePiece == 0) {
        return;
    }
    Node *pPiece = this->getChildByTag(movePiece);
    if (! pPiece) {
        return;
    }
    Director *pDirector = Director::getInstance();
    Point touchPoint = pDirector->convertToGL(pTouch->getLocationInView());
    pPiece->setPosition(touchPoint);
}
void GameScene::onTouchEnded(cocos2d::Touch *pTouch, cocos2d::Event *pEvent)
{
    movePiece = 0;
}
```

実行すると、このようにタップして駒を移動させることができます。

![実行結果](https://lh3.googleusercontent.com/-Fn-KO61D9Tk/Ump9snPiMmI/AAAAAAAAAi8/R3czgt3OBxg/w594-h456-no/cocos2d-x_007.jpg "実行結果")

今回はここまで。
Ubuntu, CentOSでターミナル（端末）、ディレクトリ、ファイルを双方向に開く

WindowsでTeraTermいままで使っていましたが、いいかげんホストOSに依存する使い方が嫌になってきたので、
SSHアカウント等の管理はUbuntuをメインにしようと思っています。
仮想マシンにしておけばホストマシンが逝ってもバックアップは簡単にとっておけますしね。
そこで、ターミナルとディレクトリの双方向操作の使い勝手が微妙に悪かったので調べてみました。

意外と日本語の情報が見当たらないですね。ググり方が悪い？

* Ubuntu 12.04
* CentOS 6.4

## 現在ターミナルで作業しているが、現在のディレクトリをファイラー(Nautilus)で開きたい

以下のコマンドはどのディストリビューションでも効くらしい。

* ターミナル上でカレントディレクトリを開く

```
xdg-open .
```

* ターミナル上でファイルを開く

```
xdg-open ~/.bash_profile
```

前までは `gnome-open .` をよく使っていたのですが、
最近ではパッケージに見当たらなくなってしまったので代替する方法を探していましたが、
こちらに落ち着きそうです。

## 現在開いているフォルダーをカレントディレクトリとしてターミナルを開きたい

パッケージをインストールする必要があります。

### インストール

#### Ubuntu

```
sudo apt-get -y install nautilus-open-terminal
```

* Nautilus再起動

```
nautilus -q
```

以下のようにNautilusのコンテキストメニューに「端末の中に開く」メニューが表示されるようになりました。

![open_in_terminal_ubuntu.png](https://qiita-image-store.s3.amazonaws.com/0/8511/417429da-bb35-f722-2a60-c2780da363aa.png)

#### CentOS

rootで実行する。

```
yum -y install nautilus-open-terminal
```

* Nautilus再起動

```
killall nautilus
```

以下のようにNautilusのコンテキストメニューに「端末の中に開く」メニューが表示されるようになりました。

![open_in_terminal_centos.png](https://qiita-image-store.s3.amazonaws.com/0/8511/bc95187f-98c7-18a7-82d8-79b4bd949e3c.png)

# 参考サイト

- [Ubuntu Tip:How to open a file manager of the current directory in the terminal | Ubuntu Geek](http://www.ubuntugeek.com/ubuntu-tiphow-to-open-a-file-manager-of-the-current-directory-in-the-terminal.html)
- [Open Terminal Here in Ubuntu | Distro Geeks](http://www.distrogeeks.com/open-terminal-here-ubuntu/)
- [Nautilus “Open in Terminal” on Fedora/CentOS/Red Hat (RHEL)](http://www.if-not-true-then-false.com/2011/nautilus-open-in-terminal-on-fedora-centos-red-hat-rhel/)
AnsibleをUbuntuのローカルで使う

Ansibleを少し触ってみたが、Chefとは違ってクライアントプログラムのインストールが不要で、ファイル・ディレクトリ構成が小規模で自由度が高いので、ローカル環境の管理に向いていると思う。
ついでに言うと、接続先をローカルとするオプションも存在する。

インストール
----
pipを使ってAnsibleをインストールする。
virtualenvなどを使えば仮想的な実行環境を作れるらしいが、今回はシステムワイドにインストールする。

```bash
sudo apt-get install python-pip
sudo pip install ansible
```

Playbook
----
インベントリファイルでホスト変数に`ansible_connection=local`を設定して、ローカルに接続するように設定する。

```:localhost
127.0.0.1 ansible_connection=local
```

とりあえず`apt-get`で`git`をインストールしてみる。

```yaml:site.yml
---
- hosts: 127.0.0.1
  user: itiut
  tasks:
    - name: "apt-get install git"
      apt: pkg=git
      sudo: yes
```

実行
----
オプション`-i`でインベントリファイルを指定し、オプション`-K`もしくは`--ask-sudo-pass`で`sudo`のパスワードを要求するようにする。

```bash
ansible-playbook site.yml -i localhost -K
```
Capistrano multistage の継承先でコールバックを削除する

Capistrano multistage で deploy.rb で宣言したcallback を staging.rb 側で打ち消したい。

# 方法

```rb
callbacks.clear
```
で全てのコールバックを無効化できる

# 理由

before や after の実体は

```
.rbenv/versions/1.9.3-p392/lib/ruby/gems/1.9.1/gems/capistrano-2.15.5/lib/capistrano/configuration/callbacks.rb
```

にある。

そこを見ると、before も after も on メソッドに委譲して、``` callbacks[event] ||=[] ```という実装になっていることがわかる。
つまり ```callbacks[:after]``` や ```callbacks[:before]``` に、配列として格納されている。

```rb
      def before(task_name, *args, &block)
        options = args.last.is_a?(Hash) ? args.pop : {}
        args << options.merge(:only => task_name)
        on :before, *args, &block
      end


      def on(event, *args, &block)
        options = args.last.is_a?(Hash) ? args.pop : {}
        callbacks[event] ||= []

        if args.empty? && block.nil?
          raise ArgumentError, "please specify either a task name or a block to invoke"
        elsif args.any? && block
          raise ArgumentError, "please specify only a task name or a block, but not both"
        elsif block
          callbacks[event] << ProcCallback.new(block, options)
        else
          args = filter_deprecated_tasks(args)
          options[:only] = filter_deprecated_tasks(options[:only])
          options[:except] = filter_deprecated_tasks(options[:except])

          callbacks[event].concat(args.map { |name| TaskCallback.new(self, name, options) })
        end
      end

```

callbacks には下記のキーが存在していた。

```rb
puts callbacks.keys 

load
start
before
after
```


# 課題

初めに```callbacks[:after].delete ```で消そうと思ったのだが、alias_method_chain で繋がっていたので、個別に消す方法はトライしていない。

callbacks.clear すると、load と start にどんな影響があるのかはよくわからない。特に問題がないように思えた。
BEAR.Sundayの使い方がよくわからない

BEAR.Sundayの設置ができたので、[blogチュートリアル](https://code.google.com/p/bearsunday/wiki/blog)をやってみる。

でもいきなり挫折。
[blogチュートリアル(3) 記事リソースの作成](https://code.google.com/p/bearsunday/wiki/blog_get)のページで、

> apps/Sandbox/Resource/App/Blog/Posts.php (最初からあるファイルを上書きします)

・・・と書いてあるのですが、

そもそも`apps/Sandbox/Resource/`このディレクトリがない！
どこにいってしまったんでしょうか。。。

知ってる方いたら教えてください。
フォントインストール(CentOS6.4)

フォントを追加してみたのでメモ

※rootで実行する

1.フォント(TrueTypeフォント)をダウンロード
2./usr/share/fonts/<フォント名>/に、*.ttfファイルをコピー
3.fc-cache -fvを実行

> [root@localhost ~]# fc-cache -fv
> /usr/share/fonts: caching, new cache contents: 0 fonts, 34 dirs
> /usr/share/fonts/abyssinica: caching, new cache contents: 1 fonts, 0 dirs
> /usr/share/fonts/cjkuni-uming: caching, new cache contents: 4 fonts, 0 dirs
> ：

4.fc-listで確認する

> [root@localhost ~]# fc-list|sort
> AR PL UMing CN:style=Light
> AR PL UMing HK:style=Light
> AR PL UMing TW MBE:style=Light
> ：
BEAR.Sundayを設置してみた

[BEAR.Sunday](https://code.google.com/p/bearsunday/)

> BEAR.SundayはアプリケーションをRESTアーキテクチャで構成するリソース指向フレームワークです。

・・・だそうです。

[インストール](https://code.google.com/p/bearsunday/wiki/install)

インストールのページに書かれている通りにやってみるがうまくいかない・・・？

必要要件をよくみてませんでした。
php5.4が必要だったみたいです。

php5.4を入れようとするが、なぜかphp5.4がインストールできない・・・
じゃあ。php5.5でもいっか！ってことで、php5.5にアップグレード

参考にしたのは[ここ](http://qiita.com/pakiln/items/bcddcdd96e94dab96873)。感謝！
うまくいったので、気を取り直してBEAR.Sunday

TeraTerm使って、設置したいディレクトリまで移動して

```
# curl -s http://install.bear-project.net/ | sh -s ./bear
```

```
== Required ==
 OK PHP:5.5.5
 OK Vendor install
== Optional ==
 NG APC:
 NG SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO)DB connect(root/)
== Develop ===
 NG xhprof: ()
 OK Xdebug: 2.2.3
 OK PDO-Sqlite: 1.0.1

BEAR.Sunday env check:  NG
```

なんかいっぱいNGって言われた！
えっと、APCってのが必要みたいです。

```
# sudo yum install --enablerepo=remi --enablerepo=remi-php55 php-pecl-apc
```

つづいてxhprofも入れてみる。

```
# sudo yum install --enablerepo=remi --enablerepo=remi-php55 php-pecl-xhprof
```

`SQLSTATE`のエラーはBEARのインストールページのDB接続の項目に書いてある通りやったらOKになった

```
# export BEAR_DB_ID=root
# export BEAR_DB_PASSWORD=パスワード
# export BEAR_DB_ID_SLAVE=root
# export BEAR_DB_PASSWORD_SLAVE=パスワード

# . ~/.bashrc
```

うまくいったかどうかの確認

```
# php bin/env.php
```

オールOK！！
データ型の変更時にハマった話

データ型を変更する必要が出た時に、最終的にはできたんだけど、イロイロはまって結局2時間くらいかかってしまったので備忘録。

結論としては、PostgreSQL 9.2.4 では、

+ 制約は外しておく
+ USING 句を使って明示的にキャスト条件を指定する
+ 該当カラムを View から参照してたら一旦 DROP しとく

ことで、正常にデータ型変換できた。

今回は、今まで 2 値で良かったものが 4 値必要になったので、データ型を boolean から smallint に変更する仕事。

PostgreSQL のオンラインドキュメントには次のように書いてある。

> 列を異なるデータ型に変換するには以下のようなコマンドを使用してください。
> 
> ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);
> これは、その列の既存の項目が新しい型に暗黙的キャストにより変換できる場合にのみ成功します。 より複雑な変換が必要な場合、古い値から新しい値をどのように計算するかを指定するUSING句を付けることができます。

なるほどねと思いつつ、とりあえずダメもとで USING 句をつけずに実行してみる。

```sql
ALTER TABLE foo ALTER COLUMN bar TYPE smallint;
```

> ERROR:  column "bar" cannot be cast automatically to type smallint

うん、案の定怒られました。
で、ちょっと調べて、USING 句をつけて実行してみる。

```sql
ALTER TABLE foo ALTER COLUMN bar TYPE smallint
 USING CASE
  WHEN bar = TRUE THEN 1
  WHEN bar = FALSE THEN 0
  ELSE null
 END;
```

> ERROR:  default for column "bar" cannot be cast automatically to type smallint

あれ、まだ怒られた。
しばらく考えて気がついたが、NOT NULL 制約と DEFAULT 制約つけてたんだった。
予め外しておく必要があるのか。

```sql
ALTER TABLE foo ALTER COLUMN bar DROP NOT NULL;
ALTER TABLE foo ALTER COLUMN bar DROP DEFAULT;
ALTER TABLE foo ALTER COLUMN bar TYPE smallint
 USING CASE
  WHEN bar = TRUE THEN 1
  WHEN bar = FALSE THEN 0
  ELSE null
 END;
```

> ERROR:  cannot alter type of a column used by a view or rule
> DETAIL:  rule _RETURN on view view_baz depends on column "bar"

今度はわかりやすい。
View で参照してるから変更できないよ、と。
えっと、一旦 DROP して 後から再作成しろってこと？
それ面倒だなぁ...

```sql
DROP VIEW view_baz;
ALTER TABLE foo ALTER COLUMN bar DROP NOT NULL;
ALTER TABLE foo ALTER COLUMN bar DROP DEFAULT;
ALTER TABLE foo ALTER COLUMN bar TYPE smallint
 USING CASE
  WHEN bar = TRUE THEN 1
  WHEN bar = FALSE THEN 0
  ELSE null
 END;
ALTER TABLE foo ALTER COLUMN bar SET DEFAULT 0;
ALTER TABLE foo ALTER COLUMN bar SET NOT NULL;

CREATE OR REPLACE VIEW view_baz AS ...
```

やっと正常実行できた！
Mechanize + WebMockでちょっとハマった

# `Mechanize::File` と `Mechanize::Page`

クローラー作ったりしてるんですが、RSpecでテストする時に

```rb
before(:each) do
  @agent = Mechanize.new
  stub_request(:get, EXAMPLE_URL).
    to_return(:status => 200, :body => EXAMPLE_BODY, :headers => {})
  @agent.get(EXAMPLE_URL)
end
```

とかしてたんですが、何故か`undefined method 'links' for #<Mechanize::File:...`とか言われてしまった訳です。

調べてみたところ、Mechanizeは読み込むコンテンツの種類が分からなかった場合は`Mechanize::Page`ではなく`Mechanize::File`として読み込むため、`@agent.page.links`等が使えなくなるみたいです。

という訳で、ちゃんとヘッダー部分で指定しましょう。

```rb
before(:each) do
  @agent = Mechanize.new
  stub_request(:get, EXAMPLE_URL).
    to_return(:status => 200, :body => EXAMPLE_BODY, :headers => {content_type: 'text/html'})
  @agent.get(EXAMPLE_URL)
end
```

## さんこう
[ruby on rails - How do I convert from a Mechanize::File object to a Mechanize::Page object? - Stack Overflow](http://stackoverflow.com/questions/10286700/how-do-i-convert-from-a-mechanizefile-object-to-a-mechanizepage-object)
Backbone.js でキーボードイベントハンドラをバインドする方法

```search.view.js

var SearchView = Backbone.View.extend({
	el: "#searchForm",

	events: {
		"click #btnSearch": "search",
		"keydown": "keydownHandler",
	},

	initialize: function(){
		this.listenTo(this.model, "change", this.render);
	},

	render: function(){
		$("#resultRows").empty();
		if (this.model.get("word") != "") {
			$("#tmpl_list").tmpl(this.model.attributes).appendTo("#resultRows");
		}
	},

	search: function(){
		this.model.set({
			"word": $("#word").val(),
		});
		this.model.fetch();
	},

	keydownHandler: function(e){
		switch (e.which){
		case 13: // [Enter]
			this.search();
			break;
		}
	}
});
```

初投稿。
onKeydown イベントのイベントハンドラを定義すればよいそうです。
setTimeoutを連続実行してるときにしないといけないこと

アニメーションを管理してるクラスの内部処理を想定してます

    var delay = 0;/*処理中に適度にdelayに値が代入される*/
    var self = this;
    self.timeId = setTimeout(function(){
      clearTimeout(self.timeId);
      //処理中略
    },1000/self.fps + delay);

とclearTimeoutをしないとdelayがうまく動いてくれません。。
iOS 7.0.3からナビゲーションバーにtintColorを指定すると半透明じゃなくなった


iOS7からのUINavigationBarの自動半透明がiOS7.0.3からオフになっているようです。

追記:
iOS7.0.4にしてみましたが半透明じゃないままですね。

## Facebookアプリで違いを見る

Facebookアプリ(v6.6)のスクリーンショットで比較してみるとこんな感じ。
上がiOS7.0.2(iPhone5s)で、
下がiOS7.0.3(iPhone5)です。

![](http://24.media.tumblr.com/8461b04dc3758f13bcc17ad3db3bdcb5/tumblr_mv7u47pM1S1qzzao7o1_500.jpg)

いろいろ調べてみると、標準の写真アプリなどの白背景のナビゲーションバーは半透明になっていて、FacebookやInstagramなどのアプリは半透明がオフになっています。

## 自分でコードを書いて確認してみる
UINavigationBarの新しいプロパティbarTintColrを使って色を変更するコードを書いてみます。

```objectivec:
[UINavigationBar appearance].barTintColor = [UIColor colorWithRed:0.077 green:0.411 blue:0.672 alpha:1.000];
```

実機で試しました。
上がiOS7.0.2(iPhone5s)で、
下がiOS7.0.3(iPhone5)です。

![](http://25.media.tumblr.com/f535486c92471836a9ddd7192e67a8ad/tumblr_mv7uy48ejY1qzzao7o1_500.png)


![](http://24.media.tumblr.com/3922d6ededda5ee52f054fa599524f85/tumblr_mv7us0L3UH1qzzao7o1_500.jpg)

自分でコードを書いて確認してみても再現しますね。どうやらbarTintColorへの設定はiOS7.0.3では半透明処理が行われなくなっています。iPhone4などの旧機種でこのような処理が行われないのは既知の仕様でしたが、iOS7.0.3以降はこのような仕様になったんでしょうか？

## おまけ：超超暫定の対応（オススメしない）

デザインが変わってしまうとデザイナさんやディレクターの意図しないものになってしまうので、iOS7.0.3でもなるべく併せてあげなければしょうがないという時のために、暫定処理を書いておきます。

次のように、Appearanceを使わず、navigationBarのbarTintColorにカラーを設定し、アルファの値を0から1までの値に調整することで半透明にすることが出来ます。

```objectivec:
//UINavigationControllerを継承しているクラスのViewDidLoadなどで設定
self.navigationBar.barTintColor = [UIColor colorWithRed:0.077 green:0.411 blue:0.672 alpha:0.200]
```
アルファを0.2にするととりあえず半透明にはなりますので、ここからRGBを微調整をしていけば同じようになるかもしれません。

![](http://31.media.tumblr.com/d663376af7f64d4546b0ee7ef7dfc3c1/tumblr_mv7vnssMVz1qzzao7o1_500.jpg)

この場合、iOS7.0.2もアルファが反映されてしまうのでiOS7.0.3のみもしくはiOS7.0.3からのような条件が必要になります。若干手間もかかるしiOS7.0.3のバグなのか仕様なのかわからない状態での対応なので全然オススメしませんが...
Jenkinsインストールお試し

手元のPCに入れてあるVMのUbuntuにjenkinsを入れてみたのでメモ。

aptitudeでインストール。
調べると、apt-getの前にリポジトリ情報をwgetしろって記事が多いけど、もう不要っぽい。

```bash
sudo aptitude update
sudo aptitude install jenkins
```

確認する
```bash
dpkg -l | grep jenkins
```

設定とか確認する

Javaのパスとか起動のポートとかを指定したいときは変更する
```bash
vim  /etc/default/jenkins
```

サービスとして実行する
```bash
sudo service jenkins restart
```

Manage jenkins > plugins から 必要なプラグインをインストールする

今回は、gitとgradleとcoberturaいれた

実行するまではこれから
RからExcel

RからODBCでExcelを読む。(書くのも出来るらしいけど、やったことなし)

```r:odbc.r
library(RODBC)
con <- odbcConnectExcel2007("odbc.xlsx")

## テーブル名 = [<シート名>$]
sql <- "select * from [Sheet1$]"
sqlQuery(con, sql)

odbcClose(con)
```
Apache リバースプロキシーと Query String

Apache をリバースプロキシーとして使うことは良くあると思います。マニュアルに従って ProxyPass と ProxyPassReverse を設定すれば動くと思うのですが、私の扱ったケースではクエリー文字列 (URL パラメーター) にサーバー名を含むバックエンドサーバーがいて追加設定が必要でした。

このような時は、下のように Rewrite ルールで QUERY_STRING を見て internal-servername を servername に付け替えます。QUERY_STRING の扱いってこういう風にするのですね...。

```
RewriteEngine on

RewriteCond "%{QUERY_STRING}" "(.*)internal-servername(.*)"
RewriteRule "^/(.*)$"  "/$1?%1servername%2" [R,L]
```
他の Rewrite ルールとのからみで[Nフラグ](http://httpd.apache.org/docs/current/ja/rewrite/flags.html#flag_n)などが必要になるかも知れません。
FILTER_VALIDATE_INT と 0

間抜けな話なのですが、休憩ネタとしてどうぞ。

[WordPress のプラグイン](http://hetarena.com/standard-widget-extensions/)を作っていますが、画面から入力されたオプションの値をチェックするのにハマりました。以下のようにすると 「0」を受け付けてくれないのです。

```php:NG
	if ( ! filter_var( $input['myoption'], FILTER_VALIDATE_INT ) ) {
```

あれ、0 は整数じゃない？ ...いやそれは自然数の話だろ！みたいなことを悩んでいたのですが、これはコードが間違っているのです。

正しくは以下の通り。

```php:Good
	if ( filter_var( $input['myoption'], FILTER_VALIDATE_INT ) === FALSE ) {
```

なぜなら filter_var はチェック成功時にフィルタされた値の 0 を返すからです。ドキュメントはよく確認しましょうということで。
wp-cron を正確な時刻で実行する

wp-cron だとサイトにアクセスがあるまで登録したタスクが起動しないというのがあります。それを正確な時刻で実行したいときの Tips です。

その方法ですが、まず wp-config.php に、

```php
define('DISABLE_WP_CRON', true);
```

と書いてサイトアクセス時の wp_cron 起動を無効化した後、Linux などの crontab の仕組みを使って、

```
wget http://example.com/wp-cron.php
```

のように指定時刻に直接 wp-cron.php にアクセスすればオッケーです。今は wget より curl なのかな。

WordPress を操作するスクリプトを直接 crontab に登録しちゃうという手もありますけど、wp-cron の仕組みをお手軽に使うのも良いと思います。
Djangoのモデルでchoice属性で値を限定しているフィールドの「名前」を取得する方法

こんなモデルがあったとして、

```Python:models.py
from django.db import models


class Example(models.Model):
    EXAMPLE_FOO = ((1, 'foo1'), (2, 'foo2'))
    foo = models.IntegerField(choices=EXAMPLE_FOO)
```

フィールドfooの「名前」、つまり「foo1」とか「foo2」を取得したい場合、自前でコードを書かなくてもget_foo_displayメソッドというのが勝手に定義されているので、これを使うといい。

くれぐれも、foo_nameプロパティとか作って時間を浪費しないように！（例：私）

【参考】
http://stackoverflow.com/questions/4320679/django-display-choice-value
https://docs.djangoproject.com/en/dev/ref/models/instances/#django.db.models.Model.get_FOO_display
CoffeeScriptでヒアドキュメントで変数展開させる


Gruntfile.coffee率が高いのでちょこちょこcoffeescript触ってます。

自前テンプレで相対パスの一括変換をしたかったので、
ヒアドキュメントが使えるcoffeescriptを採用。



```coffeescript:

insert = '展開したいテキスト'

# 出力 → ここに展開したいテキストをいれます。
ex1 = """

ここに#{insert}をいれます。

"""
console.log(ex1);


# 出力 → ここには#{insert}入りません。
ex2 = '''
ここには#{insert}入りません。
'''
console.log(ex2);

```
初期インストールのgemは最新とはずれることがあるっぽい

```
Gem::LoadError: You have already activated json 1.7.7, but your Gemfile requires json 1.8.1. Using bundle exec may solve this.
```

こんな感じのエラーが出ることがある。

```bash
$ gem update json
```

素直にアップグレードする
cocos2d-x入門 -3-

#画像付きのスプライトを表示する
Spriteを使ってシーンに画像スプライトを表示します。

画像はこちらの将棋のものにしてみました。
[将棋画像](http://sozai.7gates.net/docs/japanese-chess/ "将棋画像")
ダウンロードしたzipファイルを展開すると"japanese-chess-b02.jpg"(幅600×高さ640)が入っていますので、これをXcodeのResourcesフォルダにドラッグ＆ドロップで追加します。

画面解像度に合わせていい感じに表示されるようにsetContentScaleFactorメソッドを使います。

```c++:AppDelegate.cpp
bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director
    auto director = Director::getInstance();
    auto eglView = EGLView::getInstance();

    director->setOpenGLView(eglView);
    
    // 将棋盤の高さ640にあわせてみる.
    director->setContentScaleFactor(640.0 / director->getWinSize().height);
```

GameSceneシーンの背景として画像を表示してみます。

```c++:GameScene.cpp
bool GameScene::init()
{
    if (! CCLayer::init()) {
        return false;
    }
    // 背景を作成する.
    makeBackground();
    return true;
}

// 背景を作成する.
void GameScene::makeBackground()
{
    Size winSize = Director::getInstance()->getWinSize();
    Sprite *spBG = Sprite::create("japanese-chess-b02.jpg");
    spBG->setPosition(Point(winSize.width * 0.5, winSize.height * 0.5));
    this->addChild(spBG);
}
```

実行すると、このようになります。

![実行結果](https://lh5.googleusercontent.com/-0SdHvgSRjr0/Umn3Tl2NJhI/AAAAAAAAAiA/lTGbKjCIB-c/w594-h456-no/cocos2d-x_005.jpg "実行結果")

今回はここまで。
シンボリックリンクが壊れたファイルを探す。

シンボリックリンクが壊れたファイルを探すためコマンドを組み合わせてみた。

```bash:自作
for i in $(find . -type l); do [ -e $i ] || echo $i ; done;
```

概要としては 

1. `find -type l` でシンボリックリンクを探す。
1. その結果を for でまわし その対象ファイルの向き先が誤っている場合 ファイル名を出力する。

とかいてみたが、もっと簡単な方法がありそう。