OmniAICreator/Qiita-1.07M huggingface dataset:
Perl で Promise

いろいろあるけど...

- Promises http://search.cpan.org/dist/Promises/lib/Promises.pm https://github.com/stevan/promises-perl
  - [Promise/A+](http://promises-aplus.github.io/promises-spec/) ベース (一部違いあり)
- Future http://search.cpan.org/dist/Future/lib/Future.pm
- Future::Q http://search.cpan.org/dist/Future-Q/lib/Future/Q.pm
  - [Q](http://documentup.com/kriskowal/q/) ベース (一部違いあり)
- Object::Deferred http://search.cpan.org/dist/Object-Deferred/lib/Object/Deferred.pm
  - 「CommonJS promise API specification draft」の実装 (どれのことか?)
  - Moose
- AnyEvent::Promise https://github.com/agjohnson/AnyEvent-Promise/blob/master/lib/AnyEvent/Promise.pm
  - AnyEvent
- AnyEvent::Promise https://github.com/renchenyu/AnyEvent--Promise/blob/master/lib/AnyEvent/Promise.pm
  - AnyEvent
- AnyEvent::Promises http://search.cpan.org/dist/AnyEvent-Promises/lib/AnyEvent/Promises.pm
  - [Promise/A+](http://promises-aplus.github.io/promises-spec/) ベース
- future.pl https://gist.github.com/wakaba/5494059
  - 2013/5 時点での [DOM Future (現 Promise)](http://dom.spec.whatwg.org/#promises) の実装
  - AnyEvent
- Sub::Deferred https://github.com/taiyoh/p5-Sub-Deferred/blob/master/lib/Sub/Deferred.pm
  - jQuery.Deferred ベース
- EventEmitter::Promise https://github.com/timbrody/eventemitter-promise/blob/master/lib/EventEmitter/Promise.pm
  - [node-promise](https://github.com/kriszyp/node-promise) ベースと書いてあるけど機能が少ない
- Async::Defer http://search.cpan.org/dist/Async-Defer/lib/Async/Defer.pm
- Data::Monad::CondVar http://search.cpan.org/dist/Data-Monad-CondVar/lib/Data/Monad/CondVar.pm
  - AnyEvent

ES6/DOM の Promise https://github.com/domenic/promises-unwrapping/ を Perl + AnyEvent に移植したものが大本命だと思っていますが、そういうのはまだないみたいです。
ステータスバーとかcomplitionが用意されていないメソッドでも終了のタイミングを取得

下記はUITableViewのアニメーションの終了タイミングの取得

```objc
[CATransaction begin];

[tableView beginUpdates];

[CATransaction setCompletionBlock: ^{
    // 終了時に行いたい処理
}];

[tableView insertRowsAtIndexPaths: indexPaths
                 withRowAnimation: UITableViewRowAnimationAutomatic];

[tableView endUpdates];

[CATransaction commit];
```




```
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]
```
とかもいける
Blocksの記述パターン

#１．typedef (戻り値)(^ブロック型名)(引数)

```
typedef void(^Test)(NSString*);
Test test = ^void (NSString* str) {// リターンのvoidは省略可
    if(str) {
        NSLog(@"ON");
    }
    else {
        NSLog(@"OFF");
    }
}
```
##typedefを使うとxcodeでコード補完ができない気がする。。。

#２．プロパティでのBlock
```
@property(copy, nonatomic) void (^test)(NSString*);
```

#３．引数でのBlock
```
-(void)blockTest:(void (^)(Test*)) testBlock {

}
```

#４．戻り値でのBlock
```
-(void (^)(Test*))testBlock {
    void (^testBlock) (Test*) = ^(Test* test) {
        test.score = 100;
    };
    
    return testBlock;
};
```
コマンドラインで使用しているTips

##直前に実行したコマンドの引数を再利用する

```
# 最初の引数
!^

# 最後の引数
!$

# 指定の引数(n番目)
!:n

# すべての引数
!*
```

具体的には、以下の様な利用方法が考えられます。以下のコマンドは、フォルダを作成し、作成したフォルダに移動しています。


```
mkdir -p ~/Pictures/applet
 
cd !$
```

この場合、`!$`は`~/Pictures/applet`になっているわけです。

##実行したコマンド自体を利用する

```
# 直前に実行したコマンド
!!

# コマンド履歴を検索して、最初にヒットしたコマンド
!hoge

# 直前に実行したコマンドのfooをbarにして実行
!:s/foo/bar
```
##パスを利用する

```
# 拡張子を除いたパスを取得
!$:r 

# 拡張子だけを取得
!$:e

#パスのディレクトリ部分を取得
!^:h

#ファイル名だけを取得
!^:t
```

##現在地(ドット)

```
# 現在地
.

# Finderで現在地を開く
open .
```

例えば、以下の様な使い方ができます。

```shell:
cp ~/Dropbox/icon_512x512.png .
```

これは、`~/Dropbox/icon_512x512.png`にあるファイルを`pwd`で表示される場所にコピーするというコマンドです。

例えば、`pwd`コマンドを実行すると、`~/Pictures/applet`が表示されるとします。とすれば、`.(ドット)`は`~/Pictures/applet`を意味します。


##iTerm2にフォーカスを戻す

`tell application "iTerm" to activate`という内容のAppleScriptをアプリケーション形式で作成することにより、ターミナルにフォーカスを戻せます。

結構、様々なコマンドとの組み合わせで使用することがあるので、便利です。

以下のコマンドを実行することで、`AppleEditor`を開き、記述すべき内容を書き込めます。

```applescript:
open -a AppleScript\ Editor && echo 'tell application "iTerm" to activate' | pbcopy && echo "
tell application \"AppleScript Editor\"
 activate
  tell application \"System Events\"
   delay 0.4
   keystroke \"v\" using {command down}
   delay 0.4
   keystroke \"s\" using {command down}
  end tell
end tell
" | osascript -
```

あとは、`C-s`でも押して、保存しましょう。保存は、以下の形式に則ってください。

これで、`open -a it2_f.app`とすることで、iTerm2にフォーカスを戻すことができます。

なお、好きな名前を設定した方は、`it2_f.app`の部分を変更します。

Mac起動時に端末にフォーカスしておきたいなら、ログイン項目に登録しましょう。

```
open -a "system preferences"

→ユーザーとグループ
```


コマンドとの組み合わせでは、例えば、`VirtualBox`を起動するときなどに使っています。VirtualBoxを起動すると、やはりフォーカスは当該アプリに移ってしまいますので、それをターミナルに戻します。

```
VBoxManage modifyvm archlinux --vrde on && VBoxManage startvm archlinux && open -a it2_f
```

ちなみに、`osascript -e`でもできるのですが、おすすめはしません。


##アプリケーションのアイコンを変更する

AppleScriptをアプリケーションフォルダに置くと、見栄えがあまり良くありませんので、[アイコン](http://mba-hack.blogspot.jp/2013/09/blog-post_4.html)を変更してみます。


アプリケーションのアイコンを変更する方法は、アイコンに使う画像ファイルを特定のサイズに変換し(16,32,128,256,512)、特定の名前に変更します(icon_512x512.png)。

そして、当該画像ファイルを指定のフォルダに置きます(hoge.iconset)。


最後に指定のフォルダ内にあるファイルを特定のファイル形式に変換します(png→icns)。


```shell:
mkdir -p ~/Pictures/applet.iconset
 
cd !$
 
cp ~/Dropbox/icon_512x512.png .
 
mogrify -resize 512x512! icon_512x512.png
 
cd ..
 
iconutil -c icns applet.iconset
 
open .
```

これで、開いたフォルダに`hoge.icns`というファイルが出来上がっていると思います。

このファイルをアプリケーションのパッケージ内、指定の場所`/Applications/hoge.app/Contents/Resources/`に保存(上書き)します。

ちなみに、上書きするため、`hoge.icns`のファイル名は、`ls /Applications/hoge.app/Contents/Resources/*.icns`の結果にしておいてください。

```
mv applet.icns /Applications/it2_f.app/Contents/Resources/
 
killall Finder
 
open /Applications/
```
最後に、アイコンが変わっているか見てみましょう。
現在開いているファイルと同じディレクトリのファイルを簡単に開く

![](http://gyazo.com/2c14d4d0dc59f4e94b31cf7100e3875c.png)

<leader>eで、現在開いてるファイルのディレクトリまでのパスを保管し、:eを開くようにします。

- 現在のディレクトリパスを%%（任意）にmapします
- <leader>e(任意)に:edit %%をmapします

これで<leader>eで%%(現在のディレクトリパス)を開いてくれます。

```vim
cnoremap %% <C-R>=expand('%:h').'/'<cr>                                                                                                              
map <leader>e :edit %%                                                                                                                               
```
GitでSSH接続のHost Key Verificationを無視する

SSH接続の際に、対象ノード(今回はgithub)に一度も接続したことがなければ、ホスト鍵確認のため、下記のような確認プロンプトが表示される。

```
Initialized empty Git repository in /var/git/example.org/.git/
The authenticity of host 'github.com (12.12123.123)' can't be established.
RSA key fingerprint is 99:99:99:99:99:99:99:99:99:99:99:99:99:99:99:99.
Are you sure you want to continue connecting (yes/no)?
```

環境構築の自動化などをしていると、これを無視する必要がある。

下記コマンドで、github.comへの接続は、厳密なホスト鍵確認をオフにすることができる。これで、(yes/no)は聞かれない。

```
echo -e "Host github.com\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
```

## ssh/configを使わないで無視するには

-o オプションを使用します。

```
ssh -o "StrictHostKeyChecking=no"
```
Rails の ERB を Haml に変換する


Haml に移行する際に、元々存在した app/views/layouts/application.html.erb はどうやって Haml にすればよいのか、悩んだので記録を付ける。

まずは、Gemfile に

```
gem 'erb2haml'
```

を追記し、

```
bundle install
```
を実行する。

```
rake -T
```
してみると、

```
rake haml:convert_erbs      # Perform bulk conversion of all html.erb files to Haml in views folder
rake haml:replace_erbs      # Perform bulk conversion of all html.erb files to Haml in views folder, then remove the converted html.erb files
```
が追加されていることがわかる。.erb を .haml に置き換えたかったので、replace_erbs を実行してみると、

```
$ rake haml:replace_erbs
Looking for ERB files to convert to Haml...
Converting: app/views/layouts/application.html.erb... Done!
Removing: app/views/layouts/application.html.erb... Removed!
```
となり、問題なく ERB から Haml に変換される。
FlexUnitメモ：[Before], [After], [BeforeClass], [AfterClass] の実行順序


以下のような順番で実行される

* BeforeClass
  * Before
     * Test1
  * After
  * Before
     * Test2
  * After
* AfterClass

参考: [Sequences - FlexUnit4 Project Documentation](http://docs.flexunit.org/index.php?title=Sequences)
grep での 正規表現、 プロセスを見るときなどに使うコマンド

プロセスを見るときなど、grep して対象の文字列を除いて検索したりすることがよくあります。
いつもはこれを使ってます。

```pl
ps aux | grep mysql | grep -v grep
```

でもこんな方法もあるって知りました。

```pl
ps aux | grep \[h\]ttpd
```

はほぼおなじ意味合いを持っているのかな？

正規表現のだと、

```pl
[defg]ebu
```

↑これはdebu, eebu,febu,gebu とマッチします。

```pl
grep \[h\]ttpd
```

↑これは、エスケープを省くと下の様になります。

```pl
grep [h]ttpd
```

これは httpd という文字列を検索することになるのですが、grep のコマンドは grep [h]ttpd なので、grep に引っかかることはありません。
ややこしいですね(´；ω；｀)

```pl
$ ps aux | grep httpd
hoge      9994  0.0  0.0 5539  1234 ?        Ss   Mar19  46:22 /fuga/hoge/httpd -k start
hoge      689  0.0  0.0 5539  1111 ?        S    12:08   0:00 /fuga/hoge/httpd -k start
watashi   689  0.0  0.0 7452   987 pts/6    S+   12:11   0:00 grep httpd
```

```pl
$ ps aux | grep httpd | grep -v grep
hoge      9994  0.0  0.0 5539  1234 ?        Ss   Mar19  46:22 /fuga/hoge/httpd -k start
hoge      689  0.0  0.0 5539  1111 ?        S    12:08   0:00 /fuga/hoge/httpd -k start
```

```pl
$ ps aux | grep \[h\]ttpd ← 検索コマンドの対象文字列と実際の検索対象文字列は異なる(・∀・)
hoge      9994  0.0  0.0 5539  1234 ?        Ss   Mar19  46:22 /fuga/hoge/httpd -k start
hoge      689  0.0  0.0 5539  1111 ?        S    12:08   0:00 /fuga/hoge/httpd -k start
```

実際の文字列は以下の様になるので、そりゃヒットはしないですね。

```pl
watashi   689  0.0  0.0 7452   987 pts/6    S+   12:11   0:00 grep [h]ttpd
```

簡単な気もするし難しい気もしますね。

[参考]
http://yoshiki.github.io/blog/2008/02/02/ps-auxww-grep-h/
http://www.ocn.ne.jp/hosting/support/manual/mwpro2/hp02/06_01.html
TestLinkバージョンアップ手順(1.9.7->1.9.8)

## はじめに
* 手動で更新する手順を書いていく。
 * 本手順はDBのカラムが変更されていない前提
 * 前に1.8系から1.9系に更新したがDBの構造変更があったため以下の手順ではだめだった
* セットアップは[TestLinkのインストール](http://qiita.com/oh_rusty_nail/items/0c5b4678aa601a2dd96b)を参照
* セットアップ後は以下の手順で更新する。

## 更新するもの
### DBの更新(dump)

```
$ mysqldump -u root testlink197 > dump.sql
$ mysql -u root testlink198 < dump.sql
```

### DBの更新(DBバージョンの更新)
* DBバージョンが解決できなくて、アップしてくださいといわれるので修正

```
$ mysql -u root 
mysql> update testlink198.db_version set notes="TestLink 1.9.8";
mysql> update testlink198.db_version set version="DB 1.9.8";
```

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
setup: The program happy version >=1.17 is required but it could not be found.


```
$ cabal install ghc-mod 
Resolving dependencies...
[1 of 1] Compiling Main             ( /var/folders/_n/g5d3dg1s0rx7sc0vq5lxbgyr0000gn/T/haskell-src-exts-1.14.0-77037/haskell-src-exts-1.14.0/Setup.hs, /var/folders/_n/g5d3dg1s0rx7sc0vq5lxbgyr0000gn/T/haskell-src-exts-1.14.0-77037/haskell-src-exts-1.14.0/dist/setup/Main.o )
Linking /var/folders/_n/g5d3dg1s0rx7sc0vq5lxbgyr0000gn/T/haskell-src-exts-1.14.0-77037/haskell-src-exts-1.14.0/dist/setup/setup ...
Configuring haskell-src-exts-1.14.0...
setup: The program happy version >=1.17 is required but it could not be found.
cabal: Error: some packages failed to install:
ghc-mod-3.0.0 depends on haskell-src-exts-1.14.0 which failed to install.
haskell-src-exts-1.14.0 failed during the configure step. The exception was:
ExitFailure 1
hlint-1.8.51 depends on haskell-src-exts-1.14.0 which failed to install.
```

happy コマンドが参照できてない

``` .zshenv
# Haskell
export PATH=$HOME/.cabal/bin:$PATH
```

```
. ~/.zshenv
```
CentOS6.4にEmacs24を入れる

ローカルのEmacsからさくらVPSに `/ssh:sakura:~/hoge` な感じで繋げようとしたら妙に重たかったので「ローカルからファイルが開けなければ、サーバーにEmacsを入れればいいじゃない。」という脳内アドバイスに従うことにしました。

`sudo yum install emacs` すれば Emacs23 が入るみたいですが、どうせなら Githubに上げてる `.emacs.d` をMacやUbuntuと共用で使いたいので同じバージョンの24を入れたくなりました。

## インストール方法

まず `~/src` にでも移動して `$ git clone git://git.savannah.gnu.org/emacs.git` します。1GB近くのファイルが落ちてくるので「……な、なんだと！」とBleach風に驚きながら終わるのを待ちましょう。

```
$ sudo yum groupinstall "Development Tools"
$ wget ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.68.tar.bz2
$ tar xf autoconf-2.68.tar.bz2
$ cd autoconf-2.68
$ ./configure; make; sudo make install
$ sudo yum install texinfo libXpm-devel giflib-devel libtiff-devel libotf-devel  
$ cd emacs
$ ./autogen.sh
$ ./configure --without-x
$ make bootstrap
$ sudo make install
```

以上でインストール終了！

## make bootstrap の説明

READMEから抜粋
># make bootstrap
>#     Removes all the compiled files to force a new bootstrap from a
>#     clean slate, and then build in the normal way.

##参照

Compile Emacs 24 on CentOS/Redhat 6 » Embrace Dreams
http://haulynjason.net/weblog/2013/05/compile-emacs-24-on-centosredhat-6/
[Go] JSONの中身に応じて違うstructにデコードする

# 2020-05-10 追記

[中身が不定のJSONオブジェクトをGo言語で扱うのに mattn/go-jsonpointer が便利だった - えいのうにっき](https://blog.a-know.me/entry/2020/05/10/003402) によると今なら [mattn/go-jsonpointer](https://github.com/mattn/go-jsonpointer) が良さそうです。

# 元の文

まずgoでJSONを扱う基本は[JSON and Go - The Go Programming Language](http://golang.org/doc/articles/json_and_go.html)を参照してください。

[mattyw: Using go to unmarshal json lists with multiple types](http://mattyjwilliams.blogspot.jp/2013/01/using-go-to-unmarshal-json-lists-with.html)のブログ記事で紹介されていた内容が興味深かったので共有します。

このブログ記事は配列の要素に2つのデータタイプPerson, Placeが混在していて、それぞれJSONのキー名が異なる場合にどうデコードするかという話です。ブログのコメントにもあるように、APIの仕様を変えられるならキーを分けて配列の要素は混在しないようにしたほうがよいという話はあります。が、この例以外にもJSONの中身に応じてgo側では違う型にマッピングしたいケースはあると思いますので参考になります。

4つの実装が紹介されています。

- 一旦mapにデコードして、そこからstructのインスタンスを作る
- 2つのデータタイプのキーを両方持つstructを作ってそこにデコードしてから、最終的なstructのインスタンスを作る
- 一旦[json.RawMessage](http://golang.org/pkg/encoding/json/#RawMessage)にデコードして、そこからstructのインスタンスを作る。
  - RawMessageは[]byteとして定義されているためこのキーを持っているかとかの判定は出来ません。そこでPersonとPlaceにそれぞれデコードしてみて、値が入った方を採用するということをしています。
- [dustin/go-jsonpointer](https://github.com/dustin/go-jsonpointer)というライブラリを使う。
  - [draft-ietf-appsawg-json-pointer-03 - JavaScript Object Notation (JSON) Pointer](http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-03)をgo言語で実装したものです。ざっくり言うとXMLに対するXPathのようなもので、JSON内の特定の位置を文字列で指定してその値を取得することができます。
  - このライブラリを使ってデコードする[サンプルコード](https://github.com/tlehman/json_unmarshall_blogchallenge/blob/master/solution.go#L145-L178)

```go
// tlehman's solution using dustin's go-jsonpointer
func solutionD(jsonStr []byte) ([]Person, []Place) {
	persons := []Person{}
	places := []Place{}

	for i := int64(0); true; i++ {
		// build path to element of json array (e.g.   /things/2  )
		pathRoot := string(strconv.AppendInt([]byte("/things/"), i, 10))
		pathName := pathRoot + "/name"
		pathAge := pathRoot + "/age"
		pathCity := pathRoot + "/city"
		pathCountry := pathRoot + "/country"

		name, _ := jsonpointer.Find(jsonStr, pathName)
		city, _ := jsonpointer.Find(jsonStr, pathCity)

		if name != nil {
			age, _ := jsonpointer.Find(jsonStr, pathAge)
			agef, _ := strconv.ParseFloat(strings.TrimSpace(string(age)), 64)
			nameTrimmed := string(trimJsonBytes(name))
			persons = append(persons, Person{nameTrimmed, agef})

		} else if city != nil {
			country, _ := jsonpointer.Find(jsonStr, pathCountry)
			cityTrimmed := string(trimJsonBytes(city))
			countryTrimmed := string(trimJsonBytes(country))
			places = append(places, Place{cityTrimmed, countryTrimmed})

		} else {
			break
		}
	}
	return persons, places
}
```

## go-jsonpointerの実装について

[dustin/go-jsonpointer](https://github.com/dustin/go-jsonpointer)の実装は、goのJSON標準ライブラリの[scanner.go](http://golang.org/src/pkg/encoding/json/scanner.go)に含まれる非公開API（先頭が小文字のscanner）を公開API（先頭が大文字のScanner）にした[dustin/gojson](https://github.com/dustin/gojson)に依存しています。

この[Scanner](https://github.com/dustin/gojson/blob/master/scanner.go#L70-L105)を使ってユーザにJSONポインタの文字列で指定されたキーまで進み、そこで必要な部分だけの値を取得できるという仕組みです。

標準のjson.Unmarshal()ではJSON全体に対応するgoのデータ構造を構築しますが、これだと関心がある部分についてのみデータ構造を作るので効率がいいというわけです。
Sidekiqのconnection poolが便利かもしれない


SidekiqのワーカーはRailsと別プロセスで動き続けてくれるわけなんだけど、ワーカー上でコネクション上手いこと使い回したいな−と思ったらいいのがあった。

https://github.com/mperham/connection_pool

このConnectionPoolはSidekiqにも同梱されていて使えるらしい。

使い方はこんな感じ。

```ruby:
class HogeWorker
  REDIS_POOL = ConnectionPool.new(:size => 5, :timeout => 5) { Redis.connect}
  
  def perform key, value
    REDIS_POOL.with do |conn|
        conn.set key, value
    end
  end
end
```

いい感じ。
gvim上でマウスの中ボタンによる貼り付けを無効化したい

Thinkpadユーザーなのでスクロールしようとしたらgvimに貼り付けられたりしてたので対策を調べた
結果としては、以下を.gvimrcに書くだけ

```vimrc:.gvimrc
map <MiddleMouse> <Nop>
imap <MiddleMouse> <Nop>
map <2-MiddleMouse> <Nop>
imap <2-MiddleMouse> <Nop>
map <3-MiddleMouse> <Nop>
imap <3-MiddleMouse> <Nop>
map <4-MiddleMouse> <Nop>
imap <4-MiddleMouse> <Nop>
```

参考
http://www.not-enough.org/abe/manual/comm/tips.html
Rails4で最新版のdevise/devise_invitable関連でハマったこと

#devise
##devise_for へのブロック指定がDeprecated
ブロックを渡すためには、以下のようにdevise_scopeを使う。
旧)

```rb

devise_for :users, controllers: {passwords: 'users/passwords'}, skip: [:sessions] do
  get 'login' => 'users/sessions#new', as: :new_user_session
end

```

新)

```rb

devise_for :users, controllers: {passwords: 'users/passwords'}, skip: [:sessions] 

devise_scope :user do
  get 'login' => 'users/sessions#new', as: :new_user_session
end

```

##OrmAdapter::ActiveRecordとActiveRecordの間に差異
find_firstやfind_first_by_...などがRails4でDeprecatedとなったが、
DeviseはOrmAdapter::ActiveRecordを使っていて、これはActiveRecord4.0以降に合わせられていないので、
resource_class.to_adapterで使えるメソッドとresource_classで使えるメソッドが異なる。

##PasswordsController#newでbuild_resourceが意味ない
以前のDevise::PasswordsControllerからコピーしてカスタマイズして、

```rb
build_resource({})
```

としていた場合、最新版のように

```rb
self.resource = resource_class.new
```

としないとresourceが設定されない。

#devise_invitable
##invitation_created_atカラムが追加された
マイグレーションが必要

##invitation_tokenを別名で使っている場合
```rb
prepend_before_filter
```
で
```resource_from_invitation_token```
の前に
```params[:invitation_token]```
を指定していたが、
prependされなかったので
```resource_from_invitation_token```
をオーバーライドした
自前ビルドしたgemとrubygems.orgのgemのバージョンをインストール後に区別する方法


## まずは失敗談

[Merge pull request #1525 from zerobase/issue1519 · 5c23ae1 · mojombo/jekyll](https://github.com/mojombo/jekyll/commit/5c23ae158eebb8cbc945e817a484153f4a913062) みたいにバグを修正したので、さっそくそれを使いたい。

`rake build` から `gem install pkg/jekyll-1.2.0.gem` としました。その後、「いま使ってるjekyllは自前ビルド版だっけ？」と確認したくなったのですが、調べ方がよくわからない。

```
$ gem list --local|grep jekyll
jekyll (1.2.0)
```

と表示されるだけで、手がかりがない。これは困ったぞと。

色々考えたのですが、結論としては、そもそもビルド時にカスタム・バージョン指定しておけば、あとから判別できます。

以下、そのやり方です。

## 1. カスタム・バージョンを指定する

[local build config: VERSION = '1.2.0.issue1519' · cb2c631 · zerobase/jekyll](https://github.com/zerobase/jekyll/commit/cb2c631279bdff1c57dd6058f89655060a606488) のように

```
module Jekyll
  VERSION = '1.2.0.issue1519'
```

とします。

失敗談1. ちなみに `1.2.0-issue1519` のように `-` を入れたら `rake build` のときに

```
Invalid gemspec in [jekyll.gemspec]: Malformed version number string 1.2.0-issue1519
```

となるので要注意。

失敗談2. 最初は jekyll.gemspec を直接編集したんですが、これって `rake build` で自動生成されるんですね。意味なかった。

## 2. ビルドする

```
$ rake build
Updated jekyll.gemspec
mkdir -p pkg
gem build jekyll.gemspec
  Successfully built RubyGem
  Name: jekyll
  Version: 1.2.0.issue1519
  File: jekyll-1.2.0.issue1519.gem
mv jekyll-1.2.0.issue1519.gem pkg
```

## 3. インストールする

```
$ gem install pkg/jekyll-1.2.0.issue1519.gem
Successfully installed jekyll-1.2.0.issue1519
Parsing documentation for jekyll-1.2.0.issue1519
Installing ri documentation for jekyll-1.2.0.issue1519
1 gem installed
```

参考までに、ふつうに `gem install jekyll` とした場合は

```
$ gem install jekyll  
Fetching: jekyll-1.2.0.gem (100%)
Successfully installed jekyll-1.2.0
Parsing documentation for jekyll-1.2.0
Installing ri documentation for jekyll-1.2.0
1 gem installed
```

となります。

## 4. インストールされたバージョンを確認する

```
$ gem list --local|grep jekyll                                 
jekyll (1.2.0.issue1519)
```

となります。
GitHub Pagesのバグ：`if`のなかに`include`を書いても読み込まれない現象


2013-09-13 00:42現在、GitHub Pagesには [Liquid doesn't render my partial · Issue #1519 · mojombo/jekyll](https://github.com/mojombo/jekyll/issues/1519) という問題があります。簡単に言うと、`if`のなかに`include`を書いても読み込まれないというバグです。Jekyll 1.1.2/1.2.0とLiquid 2.5.2（最新版）を組み合わせた場合に生じます。

このバグは修正済みなので、jekyllの次バージョン(1.2.1)では修正されているでしょう。

あるいは、GitHub Pagesのほうでも [bump liquid and redcarpet · f09dd3e · github/pages-gem](https://github.com/github/pages-gem/commit/f09dd3ef97bba2592275895ed070583bbddc9743#commitcomment-4077828) というやりとりをしたところ、 [rollback to liquid 2.5.1 for Jekyll 1.1.2 compatability · 89d9fa0 · github/pages-gem](https://github.com/github/pages-gem/commit/89d9fa0397ae01e735ff512ee3b5e6163b30a0ef) となったので、Liquid のバージョンを戻すことで一時的に問題を解消するのかもしれません。

この問題を経験してから「GitHub PagesよりAmazon S3でホストするほうが安全だなあ」と思いました。せっかく静的サイトジェネレータのJekyllを使っているのに、ホスティング・サーバーの都合で結果が左右されてしまう。ぼくは静的サイトジェネレーターの良さって、手元の開発環境とまったく同じコンテンツであることが簡単に保証できることだと思っているので。
ClojureでJavaの無名クラスを使うにはreifyする

UIを扱うJavaコードでよく出て来るanonymous class 無名クラス Clojureで扱うときはreifyを使う.

http://clojure.org/datatypes

```java
selectedItems.addListener(new ListChangeListener<String>() {
    @Override
    public void onChanged(Change<? extends String> change) {
        System.out.println(change.getList());
    }
});
```

これが

```clojure
(.. selectedItems (addListener (reify ListChangeListener
                                 (onChanged [this change]
                                            (println (.. change getList))))))
```

こうなる


> reify: 〈抽象観念などを〉具象化する，具体化して考える.
> [reifyの意味 - 英和辞典 Weblio辞書](http://ejje.weblio.jp/content/reify)
Symfony2でSass、Compassを使う方法


## Sass/Compassインストール

```
gem install sass
gem install compass
```
## config.yml
```
assetic:
    debug:          %kernel.debug%
    use_controller: false
    filters:
        sass:    ~
        compass: ~
```
## Twig
```
{% stylesheets filter="compass"
    "@DemoBundle/Resources/public/sass/main.sass"
    "@DemoBundle/Resources/public/sass/header.sass"
    "@DemoBundle/Resources/public/sass/footer.sass"
%}
    <link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
```

sassファイル編集するたびにコンパイルしなくてもいい。

production環境でアクセスする前に

```
php app/console assetic:dump --env=prod --no-debug
```

しておかないと動かないので注意
jsonを取得、表示するアプリケーション　その１

とりあえずテキストフィールド、ボタン、テキストエリアだけのシンプルな画面をSwingBuilderで作る。

```groovy:json_client.groovy
import groovy.swing.SwingBuilder
import javax.swing.*
import java.awt.*

def txtUrl
def txtJson

new SwingBuilder().frame(title:'', defaultCloseOperation:JFrame.EXIT_ON_CLOSE, size: [800, 600], show:true) {
	borderLayout()
	hbox(constraints: BorderLayout.NORTH) {
		txtUrl = textField()
		button(text:'送信', actionPerformed:{txtJson.text = txtUrl.text})
	}
	scrollPane(constraints: BorderLayout.CENTER) {
		txtJson = textArea(editable:false)
	}
}
```

![qiita-001.png](https://qiita-image-store.s3.amazonaws.com/0/17179/30defc6d-91a6-ac2c-2876-531ebf1d60f2.png)
ROSチュートリアル第一回 -- ROSとは


## ROSとは

![ros_org.png](https://qiita-image-store.s3.amazonaws.com/0/6025/a8f309f2-f2d3-aa43-0b05-ec1c58371f03.png "ros_org.png")

[ROS](http://wiki.ros.org/)とは Robot Operating System の略で、ロボット開発のための様々なソフトウェアの集合のこと。
基本的にオープンソースで開発されている。
また、コアなソフトウェアは[BSDライセンス](http://ja.wikipedia.org/wiki/BSD%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9)を採用しているものが多い。

### 結局ROSって何?
ROSは *OS* と付いているが、いわゆるLinuxやWindowsといったOSではない。
基本的には、以下の総称と考えれば良い。
1. プロセス間通信のための通信ライブラリ
2. プログラムをコンパイルするためのビルドシステム

## ROSの歴史
ROSはもともと、Stanford大学の[AI Lab(STAIR)](http://stair.stanford.edu/)にて開発が行われていた。
それを2008年に[WillowGarage](http://willowgarage.com)が当時の主要な開発者であったEric Bergerを引き抜き、開発を引き継いだ。

現在ではROSの開発は[OSRF(OpenSource Robotics Foundation)](http://osrfoundation.org/)によって行われている。

最新版であるhydroでは、リリース時に700を超えるパッケージが提供されており、ROSはロボット業界において大きな影響力を持つようになった。
特に欧米の研究者コミュニティでは人気が高い。


## ROSのバージョンについて
ROSのバージョンに関しては名前が付いている. 
現在の最新はhydroである。

これは、アルファベット順に亀の名前が採用されている。
Box Turtle, C Turtle, Diamondback, Electric Emys, Fuertet, Groovy Galapagos, Hydro Medusa

何故亀なのか、というと「世界は亀の上にできている」という言い伝えが有り、ROSもそのような基板になれるようにとの願いが込められていると聞いたことがあるが、事実かどうかは未確認である
PostgreSQL のサーバー側でセッションを切断する方法

サーバー側でクエリの実行を中断するには SIGINT を当該プロセス（ `ps` や `pg_stat_activity` から探す）に送ります（`kill -INT PID`）が、これではセッションは切断されません。メンテナンスなどで切断して欲しい場合には `pg_terminate_backend(procpid)` を使います。

当該の PID がわかっている場合には

```sql
SELECT pg_terminate_backend(当該PID);
```

で切断できます。

特定のDBのセッションをすべて切断するには

```sql:9.2
SELECT pg_terminate_backend(procpid)
  FROM pg_stat_activity
 WHERE datname = 'DB名'
   AND procpid <> pg_backend_pid() -- 自分自身を切断しないように
;
```

PostgreSQL 9.3 からは `procpid` ではなく `pid` に変わっているようなので

```sql:9.3以降
SELECT pg_terminate_backend(pid)
  FROM pg_stat_activity
 WHERE datname = 'DB名'
   AND pid <> pg_backend_pid();
```

特定のユーザーなら `usename` で絞ります。切断後に再接続されたくない場合は `pg_hba.conf` で reject するようにしておきましょう。
Linuxのメッセージに使われる言語を気軽に変えたいのでLANGを書き換えるシェル関数を作る

Qiitaのタグに lang って入れただけで lang-en って勝手に補完されて消しても復活するのでとてもうざったいことに気づきました。

さて、Linuxの表示メッセージを普段は日本語にしてるけど何か問題が起きた時はやっぱり英語のほうが良いので切り替えたい時があるのですが環境変数のLANGに設定するための値をいつも忘れてしまうのでシェルスクリプトを書いて解決しようと思いました。

でもシェルスクリプト `chlang.sh` を書いて実行すると子のプロセスにはシェル変数や環境変数は親のプロセスを書き換えることができないのでダメでした。

でもシェル関数なら同じプロセスで実行されるようで、そっちのほうに書いときました。

(さらっと書きましたが何で反映されないかを調べるのに結構時間くってしまっています。)

```bash:~/.bashrc
chlang ()
{
  if [ $1 == "en" ]; then
    export LANG="en_US.UTF-8"
  fi
  if [ $1 == "jp" ]; then
    export LANG="ja_JP.UTF-8"
  fi
}
```
これで `$ chlang en` で英語表示になって `$ chlang jp` で日本語表示に戻すことができます。

## 参考

BASH script to set environment variables not working - Ask Ubuntu
http://askubuntu.com/questions/53177/bash-script-to-set-environment-variables-not-working
Apache Traffic Server をソースからインストール

# 概要
Apache Traffic Server をソースからインストールする。

# 前提条件
+ 以下必要なパッケージがインストール済み

[tcl-devel](http://qiita.com/topology-lab/items/c869f63146ff97b7a105)
[Expat](http://qiita.com/topology-lab/items/98caa12229fb5a6e8fc5)
[PCRE](http://qiita.com/topology-lab/items/c869f63146ff97b7a105)

+ OSにtclを認識させる

```bash:
# echo /opt/tcl/tclx.x.x/lib >> /etc/ld/so.conf
# ldconfig
```

# 本家

[Apache Traffic Server](http://trafficserver.apache.org/)

# ダウンロード

[本家](http://trafficserver.apache.org/downloads)

「Download Traffic Server x.x.x」ボタン
→「trafficserver-x.x.x.tar.bz2」のURL
→任意のディレクトリに配置

# 解凍

```bash:tar
$ tar xvfj trafficserver-x.x.x.tar.bz2
```

# configure

```bash:./configure
$ ./configure --prefix=/opt/trafficserver/trafficserver-x.x.x \
--with-user=user \
--with-group=grp \
--with-expat=/opt/expat/expat-x.x.x \
--with-pcre=/opt/pcre/pcre-x.x
```

# make, make install

```bash:make
$ make && make install
```

# 起動 / 停止

```bash:起動
$ /opt/trafficserver/bin/trafficserver start
```

```bash:停止
$ /opt/trafficserver/bin/trafficserver stop
```

# 疎通確認

```bash:curl
$ curl http://localhost/8080
```

+ 期待値

```html:responce
<HTML>
<HEAD>
<TITLE>Not Found on Accelerator</TITLE>
</HEAD>

<BODY BGCOLOR="white" FGCOLOR="black">
<H1>Not Found on Accelerator</H1>
<HR>

<FONT FACE="Helvetica,Aial"><B>
Description: Your request on host "<EM>localhost<EM>" was not found.
Check the location and try again.
</B> </FONT>
<HR>
</BODY>
```
PCREをソースからインストール

# PCRE
+ 本家？

[PCRE](http://www.pcre.org/ "PCRE")

+ ダウンロード
本家？「Download」からftpのURL
「pcre-x.x.tar.gz」
→任意のディレクトリに配置

+ 解凍
```bash:tar
$ tar xzvf pcre-x.x.tar.gz
```

+ configure

```bash:./configure
$ ./configure --prefix=/opt/pcre/pcre-x.x
```

+ make, make install

```bash:make
$ make && make install
```
Expatをソースからインストール

# Expat

+ 概要
tcl-develをソースからインストールする。

+ 本家？

[The Expat XML Parser](http://expat.sourceforge.net/ "Expat")

+ ダウンロード
[sourceforge](http://sourceforge.jp/projects/sfnet_expat/releases/ "sourceforge")

「expat-x.x.x.tar.gz」
→任意のディレクトリに配置

+ 解凍

```bash:tar
$ tar xzvf expat-x.x.x.tar.gz
```

+ configure

```bash:./configure
$ ./configure --prefix=/opt/expat/expat-2.1.0 --disable-static
```

+ make, make install

```bash:make
$ make && make install
```
tcl-develをソースからインストール

# tcl-devel

+ 概要
tcl-develをソースからインストールする。

+ ダウンロード

[tcl](http://www.tcl.tk/ "tcl")

「Get Tcl/Tk Now」
→「Sources Download Page」
→「tclx.x.x-src.tar.gz」
→任意のディレクトリに配置

+ 解凍

```bash:tar
$ tar xzvf tclx.x.x-src.tar.gz
```

+ configure

```bash:./configure
$ cd tclx.x.x/unix
$ ./configure --prefix=/opt/tcl/tcl8.6.0 --with-encoding=UTF-8
```

+ make, make install

```bash:make
$ make && make install
```
第13回オフラインリアルタイムどう書くの問題をPythonで解く

問題はこれです
[Qiita 第13回オフラインリアルタイムどう書くの問題](http://qiita.com/Nabetani/items/936e7885f4c607472060)
Pythonで解きました。
朝に問題見て、仕事中にあれがいいかな〜とか考えてました。
実装は1時間くらい。

```py:doukaku_13.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

def create_aquarium(input):
    # 0は空きマス, 1は積み木の有るマス
    aquarium = []
    for num in input:
        brick_line = [0 for i in range(9)]
        for i in range(int(num)):
            brick_line[8 - i] = 1
        aquarium.append(brick_line)
    aquarium.append([0 for i in range(9)])
    aquarium.insert(0, [0 for i in range(9)])
    return aquarium

def fill_air(aquarium):
    # 幅優先探索
    def fill(y, x):
        aquarium[y][x] = 2
        try:
            if aquarium[y + 1][x] == 0: fills.append((y + 1, x))
        except: pass
        try:
            if aquarium[y - 1][x] == 0: fills.append((y - 1, x))
        except: pass
        try:
            if aquarium[y][x - 1] == 0: fills.append((y, x - 1))
        except: pass

    fills = []
    #セットアップ
    for i in range(len(aquarium)):
        if aquarium[i][8] == 0:
            fills.append((i, 8))

    for y, x in fills:
        fill(y, x)

    return aquarium

def count_water(aquarium):
    return sum([line.count(0) for line in aquarium])

def test(input, answer):
    aquarium = fill_air(create_aquarium(input))
    my_answer = str(count_water(aquarium))
    if my_answer == answer:
        return True
    else:
        print "answer is %s but my answer is %s" % (answer, my_answer)



if __name__ == "__main__":
    test( "83141310145169154671122", "24" )
    test( "923111128", "45" )
    test( "923101128", "1" )
    test( "903111128", "9" )
    test( "3", "0" )
    test( "31", "0" )
    test( "412", "1" )
    test( "3124", "3" )
    test( "11111", "0" )
    test( "222111", "0" )
    test( "335544", "0" )
    test( "1223455321", "0" )
    test( "000", "0" )
    test( "000100020003121", "1" )
    test( "1213141516171819181716151413121", "56" )
    test( "712131415161718191817161514131216", "117" )
    test( "712131405161718191817161514031216", "64" )
    test( "03205301204342100", "1" )
    test( "0912830485711120342", "18" )
    test( "1113241120998943327631001", "20" )
    test( "7688167781598943035023813337019904732", "41" )
    test( "2032075902729233234129146823006063388", "79" )
    test( "8323636570846582397534533", "44" )
    test( "2142555257761672319599209190604843", "41" )
    test( "06424633785085474133925235", "51" )
    test( "503144400846933212134", "21" )
    test( "1204706243676306476295999864", "21" )
    test( "050527640248767717738306306596466224", "29" )
    test( "5926294098216193922825", "65" )
    test( "655589141599534035", "29" )
    test( "7411279689677738", "34" )
    test( "268131111165754619136819109839402", "102" )
```

水の溜まるマスを探すより、水が溜まらないマスを探す感じで解きました。
フィールドの下から上に向かってどんどこ探ってゆき、一番上まで探り終わった時に、未探索のマスに水が溜まります。
変数名をチェックして挙動を変えるデコレータ

あまり実用性はないかも(自分の練習＋メモ代わり)

```py
def deco(func):
    from inspect import getargspec
    def inner(*args, **kwargs):
        arg = getargspec(func)
        if 'a' in arg.args:
            print args[arg.args.index('a')];
        return func(*args, **kwargs)
    return inner
```

このサンプルがやってることは、args引数内に、'a'という名前の引数が含まれていたらその値を表示するという処理。
ある程度メソッドのシグネチャが似ている場合に、特定の形のメソッドならデコレータを適用するとか?
inspectの練習代わりに作成。
RailsでWEBrickが127.0.0.1ではなく0.0.0.0で待ち受ける理由

Railsでは起動ログを見ると 127.0.0.1 じゃなくて 0.0.0.0 で待ち受けてるのって何でだろう？
そもそも 0.0.0.0 ってなんだったっけ？

=> Booting WEBrick
=> Rails 4.0.0 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server

と思って調べたら、0.0.0.0 は「全てのアドレスを示す」ので外部からでも接続できるってことらしい。
そういえばVPSで動かしてみて試したような気がする。

Why does Ruby on Rails use http://0.0.0.0:3000 instead of http://localhost:3000? - Stack Overflow
http://stackoverflow.com/questions/1478747/why-does-ruby-on-rails-use-http-0-0-0-03000-instead-of-http-localhost3000
SublimeText2のSFTPプラグインで秘密鍵を使う設定

Sublime Text 2上でSFTP/FTPを使うときに、SFTPプラグインをインストールしたのですが、
サーバーにアクセスする際にパスワードではなく、秘密鍵(.pemとか)でログインする方法です。

以外とすんなり設定出来なかったので、手順をまとめました。

## 1. Configファイルを作成する

プロジェクトフォルダのコンテキストメニュー（右クリック）から、"SFTP/FTP > Map To Remote"を選択する。するとプロジェクトフォルダ内に、"sftp-config.json"ファイルが作成されます。

## 2. 秘密鍵を準備する

サーバーにSFTPでログインするための秘密鍵を、適当な場所に用意します。
その際、秘密鍵のファイルのパーミッションが、 **自分だけだ読み取れる状態(=0400)** になっているか確認します。（なっていないとログインに失敗します。）

パーミッションの変更は、例えばMacであれば以下のようになります。

```
$ chmod 400 xxxx.pem
```

## 3. Configファイルを設定する

秘密鍵の準備が出来たら、Configファイルを編集します。
設定ファイルの内容は、ほとんどデフォルトで問題ないと思いますが、下記だけは設定が必要です。

```
{
    ....
    "host": "exsample.com",
    "user": "user name",
    //"password": "password",      パスワードはコメントのままにします
    "port": "22",
    "remote_path": "path",
    ....
    "sftp_flags": ["-o IdentityFile=~/path/xxx.pem"],
    ....
}
```

最後の"sftp_flags"プロパティの"IdentityFile"に、ローカルの秘密鍵のパスを設定します。
これで秘密鍵を使って、サーバーにSFTP接続出来ます。
Laravel4でのファイル入力から移動まで

軽く覚書的なもの。

Larave4を使って少しやった。

```php:views/test.php
<!doctype html>
<html lang="ja-JP">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <?= Form::open(array('url' => '' ,'files' => true)) ?>
    <input name="image" type="file" />
    <input type="submit">
    <?= Form::close() ?>
</body>
</html>
```

```php:controller/HomeController.php
<?php
public function showTest()
{
    return View::make('test');
}

public function execTest()
{
    $set_path = public_path('images/');

    // ディレクトリは存在するか確認
    if(!File::exists($set_path))
    {
        File::makeDirectory($set_path);
    }

    // ファイルは入力されたか
    if(!Input::hasFile('image'))
    {
        return;
    }
    $file = Input::file("image");

    // 情報を取得
    $file_path = $file->getRealPath();
    $name = $file->getClientOriginalName();

    // ファイルをtmpから移動
    File::move($file_path, $set_path . $name);

    // 以降は。。。。
    exit();
}
```
Railsで星型レビューRatyを使う


##Raty導入

公式ページからダウンロードする。
http://wbotelhos.com/raty


/lib/jquery.raty.min.jsをassets/javascriptのフォルダに入れる。
/lib/imgの中身を全てassets/imagesのフォルダに入れる。

##Viewへ記述

表示させたい場所に次のタグを組み込む。

```sample.rb
<div id="star"></div>
```

タグを入れたViewが読み込むjavascriptに次の記述を行う。

```sample.rb
<script>
$('#star').raty({
  size     : 36,
  starOff: '/assets/star-off.png',
  starOn : '/assets/star-on.png',
  scoreName: 'review[point]' 
});
</script>
```

sizeは★のサイズ。
scoreNameはパラメーター名(1,2,3,4,5で設定)。
starOffとstarOnはそれぞれファイル名。
imagesのフォルダに入れたファイルを指定する。

これで画面に星形レビューが表示される。
NavigationDrawerでDrawer内を入れ子でレイアウトする

`Navigation Drawer`を使う場合、レイアウトにいろいろ制約があります。

* DrawerLayoutの最初の子がメインコンテンツになります
* 2番めの子がDrawerになります
* Drawerは`layout_gravity`に`start`が必要
* Drawerの幅は240dp以上320dp以下でなくてはいけない

こうしてみるといろいろ制約が多くて面倒ですが、これに沿えば何もしなくてもドロワーが表示されるので、楽ちゃ楽ですね。

但し、一箇所、ハマりどころがあります。例えばドロワー内を`ListView`だけではなく、複雑なレイアウトにしたいと思いますよね？（威圧）

そう思って以下のように書いたりしてみます。

```xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Hello World, MyActivity"/>

    <LinearLayout
        android:id="@+id/left_drawer_layout"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#111">

        <TextView
                android:text="sample header"
                android:textColor="#fff"
                android:layout_width="match_parent"
                android:layout_height="48dp"
                android:layout_gravity="start"/>

        <Button
                android:id="@+id/left_drawer_button"
                android:layout_width="wrap_content"
                android:layout_height="48dp"
                android:layout_gravity="start"
                android:text="button"/>

        <ListView
                android:id="@+id/left_drawer_list"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:divider="@android:color/transparent"
                android:dividerHeight="0dp"
                android:layout_gravity="start"
                android:choiceMode="singleChoice"/>

    </LinearLayout>
</android.support.v4.widget.DrawerLayout>
```

ルール上、問題無さそうですが、これで実行するとドロワーの中が`LinearLayout`の最初の子である`TextView`しか表示されません。紆余曲折ありましたが解決策は単純で以下の行を追加するだけです。

```xml
    <LinearLayout
        android:id="@+id/left_drawer_layout"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:orientation="vertical"　//←これ！
        android:background="#111">
```

ソースを追っかけて見たけど、childCount周りでおかしな制御してるようだが、わからなかった（敗北）。とりあえずこれでドロワー内を好きにレイアウトできるようになります。
Railsで生SQLを書かずにLEFT JOINする方法

弊社ブログ記事からの転載です
[Railsで生SQLを書かずにLEFT JOINする方法](http://lab.heathrow.co.jp/2013/09/02/2541) @ [lab.heathrow](http://lab.heathrow.co.jp)


例えばこんな関連のモデルがあったとして
 
```ruby
class Blog
  has_many :posts
  attr_accessible :enable
end

class User
  has_many :posts
  attr_accessible :enable
end

class Post
  belongs_to :blog
  belongs_to :user
end
```


Blog(enable=true)もしくはUser(enable=true)に属するPostを取得したいとき



MySQLで書くと、こんな感じ。

```sql
SELECT `posts`.*
FROM `posts`
LEFT JOIN `blogs` ON `blogs`.`id` = `posts`.`blog_id`
LEFT JOIN `users` ON `users`.`id` = `posts`.`user_id`
WHERE
  `blogs`.`enable` = 1
  OR
  `users`.`enable` = 1
```

このLEFT JOINの部分をActiveRecordでどう書くかというのが、今回のお話


##あまり良くない書き方
ネットを検索すると、よくこんな感じのやり方をしているサンプルを見つけます
JOIN句を生SQLで書いてます

```ruby
Post.joins("LEFT OUTER JOIN `users` ON `users`.`id` = `posts`.`user_id`")...
```

DBがMySQLの場合、これは正しく動作します。
しかし、DBが例えばSQLServerの場合、これはシンタックスエラーとなってしまいます。

せっかくActiveRecordが裏側のDBを抽象化してくれているのにもったいない
見栄えもわるいし、書くのも長ったらしくてめんどくさいですね


##正しい方法
includesを使うことによって、このように書くことができます

```ruby
Post.includes(:blog, :user).where(Blog.arel_table[:enable].eq(true).or(User.arel_table[:enable].eq(true))
```

これでActiveRecordがよろしくやってくれます。
DBがMySQLであろうとSQLServerであろうと関係なく、LEFT JOINされた正しいSQLを発行してくれます。


***

弊社ブログ記事からの転載です
[Railsで生SQLを書かずにLEFT JOINする方法](http://lab.heathrow.co.jp/2013/09/02/2541) @ [lab.heathrow](http://lab.heathrow.co.jp)
プロキシ下からEC2のWindowsにRDPでつなぐ

プロキシ環境下から、EC2に立てたWindowsインスタンスにリモートデスクトップ(RDP)で接続する

# 越えるべきハードル
* プロキシ(諸悪の根源)

# 対策
* sshポート転送
 * 適当なlinuxインスタンスをEC2に立ててそこを経由させる

## 手順
1. EC2にWindowsインスタンス(Windowsとする)を立てる
 * 3389番ポート(RDPで使用するポート)は開けておくこと
1. EC2にLinuxのインスタンス(Linuxとする)を立てる
 * 3389番ポートは開けておくこと
 * OSの種別などは何でもOK
1. Windowsインスタンスと接続する環境で以下のコマンドを実施
> $ ssl -L 3389:Windows:3389 ec2-user@Linux

* この状態でLinuxのインスタンスにRDPで接続すればOK
** 転送されWindowsインスタンスに繋がる

# おまけ
* macからRDPで接続する場合 [Microsoft Remote Desktop Connection Client for Mac 2.1.1](http://www.microsoft.com/ja-jp/download/details.aspx?id=18140) が無料でよさそう
rake assets:precompileでコンパイル時間がかかるファイルを調べる

```shell-session
rake log:clear
rake assets:precompile
cat log/production.log | ruby -ractive_support/core_ext -e 'puts $<.each_line.select {|s| s.starts_with? "Compiled"}.sort_by {|s| s.match(/(\d+)ms/)[1].to_i } | head'
```
「積み木の水槽」をjavascriptで解いてみた

何日か前に出題されていたものをjsでも書いてみました。

http://nabetani.sakura.ne.jp/hena/ord13blocktup/

みなさんの回答を、投稿してからみようと思うので
同じや、さらに良いロジックがあるかもしれませんが、とりあえず。

左右から見える壁の高さと奥行きを調査し、見えない部分に水が入っていると考えています

```js:water.js
var test = function (input, output) {

    // 0が入っているところで分けて別々に計算して足す
    var blocks = input.split('0')
      , water = 0;

    // 分けたブロックごとに計算
    blocks.forEach(function (data) {
        var block = data.split('')
            // 左影
          , max1 = 0
          , lsharp = block.reduce(function (x, y) {
                        max1 = Math.max(y * 1, max1);
                        x.push(max1);
                        return x;
                    }, [])
            // 右影
          , max2 = 0
          , rsharp = block.reduceRight(function (x, y) {
                        max2 = Math.max(y * 1, max2);
                        x.unshift(max2);
                        return x;
                    }, []);

        // 左影右影の低い方と実際のブロックの差分を算出すると水の量
        for (var i = 0, len = block.length; i < len; i++) {
            water += Math.min(lsharp[i], rsharp[i]) - block[i];
        }
    });
    console.log(water == output);
};

/*0*/ test( "83141310145169154671122", "24" );
/*1*/ test( "923111128", "45" );
/*2*/ test( "923101128", "1" );
/*3*/ test( "903111128", "9" );
/*4*/ test( "3", "0" );
/*5*/ test( "31", "0" );
/*6*/ test( "412", "1" );
/*7*/ test( "3124", "3" );
/*8*/ test( "11111", "0" );
/*9*/ test( "222111", "0" );
/*10*/ test( "335544", "0" );
/*11*/ test( "1223455321", "0" );
/*12*/ test( "000", "0" );
/*13*/ test( "000100020003121", "1" );
/*14*/ test( "1213141516171819181716151413121", "56" );
/*15*/ test( "712131415161718191817161514131216", "117" );
/*16*/ test( "712131405161718191817161514031216", "64" );
/*17*/ test( "03205301204342100", "1" );
/*18*/ test( "0912830485711120342", "18" );
/*19*/ test( "1113241120998943327631001", "20" );
/*20*/ test( "7688167781598943035023813337019904732", "41" );
/*21*/ test( "2032075902729233234129146823006063388", "79" );
/*22*/ test( "8323636570846582397534533", "44" );
/*23*/ test( "2142555257761672319599209190604843", "41" );
/*24*/ test( "06424633785085474133925235", "51" );
/*25*/ test( "503144400846933212134", "21" );
/*26*/ test( "1204706243676306476295999864", "21" );
/*27*/ test( "050527640248767717738306306596466224", "29" );
/*28*/ test( "5926294098216193922825", "65" );
/*29*/ test( "655589141599534035", "29" );
/*30*/ test( "7411279689677738", "34" );
/*31*/ test( "268131111165754619136819109839402", "102" );
```

次は出題と同時にチャレンジしてみたいと思います。
RailsのActionMailerでメールを送信する（Gmail経由）

##環境設定
`config/environments/development.rb`を以下のように設定

```rb:/config/environments/develop.rb

config.action_mailer.delivery_method = :smtp
config.action_mailer.raise_delivery_errors = true
config.action_mailer.smtp_settings = {
  :enable_starttls_auto => true,
  :address => 'smtp.gmail.com',
  :port => '587',
  :domain => 'smtp.gmail.com',
  :authentication => 'plain',
  :user_name => 'ユーザー名@gmail.com',
  :password => 'gmailパスワード'
}

```


##メーラークラスを自動生成

```
#rails generate mailer クラス名　メソッド名

$ rails generate mailer NoticeMailer sendmail_confirm
      create  app/mailers/notice_mailer.rb
      invoke  erb
      create    app/views/notice_mailer
      create    app/views/notice_mailer/sendmail_confirm.text.erb
      invoke  test_unit
      create    test/functional/notice_mailer_test.rb

```


##メーラークラスの編集
```rb:/app/mailers/notice_mailer

class NoticeMailer < ActionMailer::Base
  #デフォルトのヘッダ情報
  default from: "user@gmail.com"

  # Subject can be set in your I18n file at config/locales/en.yml
  # with the following lookup:
  #
  #   en.notice_mailer.sendmail_confirm.subject
  #
  def sendmail_confirm
    @greeting = "Hi"

    mail to: "user@sample.com", subject: "ActionMailer test"
  end
end

```


##メールテンプレートの編集
テンプレートの拡張子を`html.erb`にすればHTMLメール、`text.erb`にすればテキストメールとなる。

```erb:/views/notice_mailer/sendmail_confirm.html.erb

NoticeMailer#sendmail_confirm

<%= @greeting %>, find me in app/views/app/views/notice_mailer/sendmail_confirm.html.erb

<h2>テスト</h2>
<p>あいうえおかきくけこさしすせそたちつてとなにぬねのあいうえおかきくけこさしすせそたちつてとなにぬねのあいうえおかきくけこさしすせそたちつてとなにぬねのあいうえおかきくけこさしすせそたちつてとなにぬねのあいうえおかきくけこさしすせそたちつてとなにぬねのあいうえおかきくけこさしすせそたちつてとなにぬねの</p>

```

以上でActionMailerからGmailを経由して送信できるようになった。

```

$ rails c
NoticeMailer.sendmail_confirm.deliver

```

メールが送信されたかを確認。


##viewから送信

```rb:items_controller.rb

  def mail_send
    @mail = NoticeMailer.sendmail_confirm.deliver
    render :text => 'send finish'
  end

```

```erb:index.html.erb

<%= link_to 'Send Mail', action: "mail_send" %>

```

以上でviewから送信できる。
Mac で ThinikPad USB トラックポイントキーボードを使う


英語配列のキーボードが使いたくて、安くて評判の良いこれを買った。
[Amazon.co.jp： レノボ・ジャパン ThinkPad USB トラックポイントキーボード(英語) 55Y9003: パソコン・周辺機器](http://www.amazon.co.jp/dp/B002NSDWPM "Amazon.co.jp： レノボ・ジャパン ThinkPad USB トラックポイントキーボード(英語) 55Y9003: パソコン・周辺機器")

さっき届いて、Mac で快適に使うためには、多少の設定が必要だったので、メモ。

---

基本的に全て Mac 上で設定可能だった。

##  キーボード周りの設定
`システム環境設定 -> キーボード ->  装飾キー` から設定する。
下のスクリーンショットのように設定した。


![keybord-preference.png](https://qiita-image-store.s3.amazonaws.com/0/12904/940a7600-1d6c-982e-f8ab-f82f4653dd4e.png "keybord-preference.png")


要点は、
* `キーボードを選択` で、`ThinkPad USB Keybord` を選択する
* CapsLock を Control に
* Option(Alt) を Command に
* Command(Windows) を Option に

## トラックポイント周りの設定

* デフォルトだと、赤ポチの速度が遅いので、速くした。
    * `システム環境設定 -> マウス` の  `軌道の速さ` で設定。 

* KyeRemap4Mackbook を使って、中ボタン + 赤ポチで、Mac のスクロールと同じ動きをするように設定
    * pplog さんに教えていただきました、ありがとうございます!: [ThinkPadのキーボードをMacで使いはじめたらマウスいらなくなった | pplog](http://pplog.jugem.cc/?eid=952 "ThinkPadのキーボードをMacで使いはじめたらマウスいらなくなった | pplog")

![mouse-pointer-preference.png](https://qiita-image-store.s3.amazonaws.com/0/12904/68fd23df-2d47-793b-4de1-cf09754dfb89.png "mouse-pointer-preference.png")


## その他

* デスクトップの表示(ジェスチャーだと4本指で外に広げる)は、デフォルトで `F11` に設定されている
* MackBook Air の上にキーボードを載せたい時、MacBook Air のキーボードとトラックパッドはオフにしておく
    * トラックパッドの無効化: `システム環境設定 -> アクセシビリティ ->  マウスとトラックパッド` から `マウスまたはワイヤレストラックパッドがあるときは内蔵トラックパッドを無視` にチェックを入れる
    * キーボードの無効化に関しては [にとろたんぶらー: MacBookのキーボードを無効にする](http://nitro-idiot.tumblr.com/post/925404919/macbook "にとろたんぶらー: MacBookのキーボードを無効にする") ここを参考にした
	 * 無効化: `sudo kextunload /System/Library/Extensions/AppleUSBTopCase.kext/Contents/PlugIns/AppleUSBTCKeyboard.kext/`
        * 有効化: `sudo kextload /System/Library/Extensions/AppleUSBTopCase.kext/Contents/PlugIns/AppleUSBTCKeyboard.kext/`
        * 無効化時に何か言われるけど、きちんとオフになっった
Play2(Scala)のFilter機能で事前・事後処理を記述する

Play2(Scala)のFilter機能で事前・事後処理を記述する

はじめに
----
[Bounscale](https://github.com/bounscale/bounscale/)というオートスケールするHeroku Addonを作っています。

Bounscaleでは実験的にPlay2(Scala)への対応を実施中です。
オートスケールするにあたり、各種リソースの監視が必要なのですが、リソース値の取得をするためにPlay2のFilterの仕組みを利用しています。

Filterの使い方について下記にまとめます。

Filter?
----
Filterというと[JavaのSevletFilter](http://docs.oracle.com/javaee/7/api/javax/servlet/Filter.html)や[Ruby on Railsのfilter](http://apidock.com/rails/AbstractController/Callbacks/ClassMethods/before_filter)など、Webアプリケーション開発では比較的浸透した用語だと思います。

処理としてはある特定のURL/コントローラへのリクエストについて、共通的な事前/事後処理を提供する機構です。
J2EEパターン(懐)のIntercepting Filterが語源なのかな？

典型的には、認証処理などを統一的に記述して漏れなくアクセス制御を実現したりします。

バージョン
----
探した限りにはPlay1にはFilterの機構を見つけられませんでした。
Play2.1.1でFilterの機構が導入されたようなので、それ以降でしか動かないと思います。

流れ
----
基本的にはappディレクトリの下などにFilterクラスを作成し、Global#applyで登録するイメージです。

Filterの作成
----
appの下にこんな感じで書きます。

````scala:YourFilter.scala
package yourfilter

import play.api.mvc._
import play.api.libs.concurrent.Execution.Implicits._

class YourFilter extends Filter {
  def apply(next: (RequestHeader) => Result)(rh: RequestHeader) = {
    println("BEFORE")

    def after(result: PlainResult): Result = {
      println("AFTER")
      result
    }

    next(rh) match {
      case plain: PlainResult => after(plain)
      case async: AsyncResult => async.transform(after)
    }
  }
}
````

ポイントとしては、

* Filterクラスを継承し、applyメソッドを実装する
* next(req)の前が事前処理
* 事後処理はメソッドとして定義しておく(非同期呼び出しに対応するため）
* next(req)の戻り値の型がPlainResultなら同期的に、AsyncResultなら非同期的に事後処理メソッドを呼ぶ

Globalへの登録
----
下の感じで先ほどのFilterをGlobalに登録します。

````scala:Global.scala
import play.api.GlobalSettings
import play.api.mvc.WithFilters
import yourfilter.YourFilter

object Global extends WithFilters(
    new YourFilter) with GlobalSettings
````

実行
----
こんなサンプルアクションを定義して

````scala:Application.scala
package controllers

import play.api._
import play.api.mvc._

object Application extends Controller {

  def index = Action {
    println("action!")
    Ok(views.html.index("Your new application is ready."))
  }

}
````

このアドレスにアクセスしたら下記のログが出るようになりました。

````
BEFORE
action!
AFTER
````

所感
----
非同期処理を考慮する必要があるので記述がちょっと煩雑。もっとなんとかならないものかと思いました。

終わりに
----
このような事前・事後処理の多くはRubyでは[Rack Middleware](https://github.com/rack/rack/wiki/List-of-Middleware)、node.jsでは[Express Connect Middleware](http://expressjs.com/api.html#middleware)の仕組みでも記述できます。

上記Middlwareの場合はフレームワークに到達する前に通過するので、より根っこの部分を抑えられます。
なので、例えばあるアクセスのCPU時間を取得するなどの場合は、そちらの方がフレームワークの処理時間も含めた正確な値が取れます。

Filterもいいのですが、PlayもMiddlewareの機構を提供してくれるとうれしい今日この頃です。