OmniAICreator/Qiita-1.07M huggingface dataset:
CSSのみでハンバーガーメニューを作る

[CSS Advent Calendar](http://qiita.com/advent-calendar/2014/css) 11日目は1週間ぶりにYuZakuroの担当です。

これまではフレームワークの紹介をしてきましたが、今回はより実践的な部分についての記事にしたいと思っています。

# つくるもの

CSSのみでハンバーガーメニューを作ります。JSは使いません。

出来上がりは[こんな感じ](http://codepen.io/zakuro9715/pen/WbwwZe)です。

最低限のスタイルしか定義していないので、見た目は微妙かもしれませんが、実際に使うときには追加してもらえれば良いのではないかと思います。

# 仕組み

メニュー部分はz-indexを小さくすることで、wrapperに隠されるような形になっています。

ボタンがクリックされると、wrapperが右にスライドして、メニューが見える仕組みです

## どうやってクリックに反応するか

おそらくこれが一番の肝です。よくある実装では、ボタンがクリックされるとJSでクラスを追加したりしますが、今回はCSSのみなのでこの方法は使えません。

これを解決する方法ですが、css3から追加されたchecked擬似クラスを使用します。これは、チェックボックスまたはラジオボタンにチェックが入っている時に適用されるものです。

つまり、チェックされたことを検出することで、クリックに反応しているわけです。

これで一応は解決しました。しかし、このままではチェックボックスを表示しなくてはいけなくなってしまいます。それでは困ります。そのため、チェックボックス自体はclipで消してしまって、ラベルをボタンが代わりに使用しています。

# 問題点とか

問題点かどうかは考え方によりますが、この方法だと、「メニュー以外をタップしたらメニューを閉じる」という実装ができません。そのような仕様の場合は、諦めてJSを使うのがよいでしょう。

# おまけ

サンプルでは、@izumin5210 さんが1日目の記事で紹介していたfont-awesomeをボタンに使用してみました。

# 参考
- [Pure CSS Off-screen Navigation Menu](http://www.sitepoint.com/pure-css-off-screen-navigation-menu/)
Mac OS XでNode環境を整える


# はじめに
node.js、npm、gruntを、anyenvとndenvでサクッとインストールします。

# ndenvインストール
まず、node.jsとnpmをインストールするために、ndenvをインストールします。
ndenvのインストールにはanyenvを使います。

anyenvのインストール方法は[こちら](http://qiita.com/nownabe/items/72096340ed59e3b3e348)。

```bash
$ anyenv install ndenv
$ exec $SHELL -l
$ ndenv -v
ndenv 0.4.0
```

# node.jsインストール
ndenvでnode.jsをインストールします。

次のコマンドでインストールできるバージョンの一覧が確認できます。

```bash
$ ndenv install -l
Available versions:
  v0.1.14
  v0.1.15
  v0.1.16
  v0.1.17
...
  v0.11.10
  v0.11.11
  v0.11.12
  v0.11.13
  v0.11.14
```

最新のをインストールしてみます。

```bash
$ ndenv install v0.11.14
```

次のコマンドでインストールされているバージョンを確認できます。

```bash
$ ndenv versions
  v0.11.14
```

今インストールしたものを利用するように設定します。

```bash
$ ndenv global v0.11.14
```

これで、nodeとnpmが使えるようになります。

```bash
$ node -v
v0.11.14
$ npm -v
2.0.0
```

# gruntインストール
gruntコマンドを使えるようにします。
`-g`はグローバルインストールです。

```bash
$ npm install -g grunt-cli
```

ndenvでrehashするとコマンドが使えるようになります。

```bash
$ ndenv rehash
$ grunt --version
grunt-cli v0.1.13
```

# おわりに
以上です。楽ちんですね。
RethinkDBのWeb管理ツールのポートを変更する


デフォルトで設定されている8080は他で使うことが多いので変えたいです。

`--http-port` オプションを使います。

```console
$ rethinkdb --http-port 18080
```

私の場合は Mac に Homebrew からインストールして、そのまま用意されてる LaunchAgent ファイルを使ってログイン時に起動させていたので、一度 `unload` したあとに `homebrew.mxcl.rethinkdb.plist` も以下のように修正しました。

```xml:homebrew.mxcl.rethinkdb.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>homebrew.mxcl.rethinkdb</string>
  <key>ProgramArguments</key>
  <array>
      <string>/usr/local/opt/rethinkdb/bin/rethinkdb</string>
      <string>-d</string>
      <string>/usr/local/var/rethinkdb</string>
      <string>--http-port</string>
      <string>18080</string>
  </array>
  <key>WorkingDirectory</key>
  <string>/usr/local</string>
  <key>StandardOutPath</key>
  <string>/usr/local/var/log/rethinkdb/rethinkdb.log</string>
  <key>StandardErrorPath</key>
  <string>/usr/local/var/log/rethinkdb/rethinkdb.log</string>
  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <true/>
</dict>
</plist>
```
tcpipによる接続サンプル

##
一対一しか考えてませんがな。制御系のやつらなら大体これがあればクライアント側はどうにかなる。サーバー側のマルチスレッド化はそのうちするかもしんまい。
スリープの入れ方がダサいですが、知らんわ。

##サーバー

```
require "socket"

CONNECTPORT = ARGV[0].to_i
puts CONNECTPORT
# クライアントからの接続を待つソケット
s0 = TCPServer.open(CONNECTPORT)

# クライアントからの接続をacceptする
sock = s0.accept

# 常に繰り返す
while true

  begin
    sock.puts("fff")
    # クライアントからのデータを全て受け取る
    buff,sp = sock.recvfrom(100)
    puts "--d #{buff}" if buff.length != 0
  rescue Exception => e
    puts "例外でたよ"
    sock = s0.accept
  end

end

# クライアントからの接続を待つソケットを閉じる
# ただし、ここに到達することはありません。
s0.close

```
##クライアント

```
require "socket"
exit if ARGV.size != 2

IPADDRES = ARGV[0]
CONNECTPORT = ARGV[1].to_i
puts IPADDRES
puts CONNECTPORT

sock = nil
#ヘルスのファイル
sendque = Queue.new

#　受信処理
Thread.fork do
  while true
    begin
      if sock == nil
        # ソケット接続
        sock = TCPSocket.open(IPADDRES, CONNECTPORT)
      elsif false == sock.closed?
        rev,buff = sock.recvfrom(100)
        text = rev.chomp
        if text.length != 0
          puts "return message:" + text.unpack('C*').map{ |b| "0x%02X" % b }.join(' ')
        end
      else
        sock = TCPSocket.open(IPADDRES, CONNECTPORT)
      end
    rescue Exception => e
      sleep(1)
      puts "例外dana"
    end
    sleep(1)
  end
end

#亭周期送信情報
Thread.fork do
  health =  File.open("health.dat").read
  while true
    begin
      sendque.enq health
    rescue
      puts "例外でたよ"
    end
    sleep(3)
  end
end

#　送信処理
Thread.fork do
  sleep(1)
  begin
    if sock == nil
    elsif false == sock.closed?
      while req = sendque.pop
        print("you writed:", req.unpack('C*').map{ |b| "0x%02X" % b }.join(' '),"\n")
        sock.write(req)
      end
    end
  rescue
    puts "まぁ、例外でたよ"
  end
end

# ショット
while file_name = STDIN.gets.chomp
  msg = file_name
  if File.exist?(file_name)
    File.open(file_name) do |f|
      msg = f.read
      f.close
    end
  end
  sendque.enq msg
end
# 送信が終わったらソケットを閉じる
sock.close

```
クライアントサイドJS・サーバサイド間の設定の共有について

ここのところ、クライアントサイドJSとサーバサイドで設定の共有をしたいなと思うことがよくあった。拙いながらその方法について考えてみた。

## やりたいこと

```
├── app
├── config
│   ├── production
│   │   ├── public.json
│   │   └── private.json
│   ├── staging
│   │   ├── public.json
│   │   └── private.json
│   ├── public.json
│   └── private.json
├── public
```

まず、サーバサイド(ここでは`app`ディレクトリ以下)とクライアントサイド(ここでは`public`以下)で設定を共有したいこと自体はよくあると思う。  
ユーザーがコンテンツを投稿できるようなアプリケーションの場合、たとえばユーザーの投稿数の制限だとか、文字の最大数の制限だとか、バリデーション周りで頻出する。

それで別々に設定を書くだとか、設定をサーバサイドからHTTPリクエストで受け取るだとかは、あまりスマートじゃないと考えていて、クライアントサイドはBrowserifyとかWebpackでJSONファイルを`require`するような形で読み込めればいいと思った。

設定の中には、DBへ接続する情報だとか、OAuth認証のConsumer Keyだとか、クライアントサイド側には渡したくない設定もあって、これは`private.json`のような形で別々にする必要がある。

また、設定は環境によって変えたいことが当たり前なので、環境ごとにディレクトリを作り、`production/private.json`のように分けておけるといいと思った。

## やり方

実装としてはこうなった。下記リポジトリを参照。

> **axross/config_management_sample | Github**
> [https://github.com/axross/config_management_sample](https://github.com/axross/config_management_sample)

```js
// returns default config
// var CONFIG = require('../config')();

// returns production config
// var CONFIG = require('../config')('production');

// also
// var CONFIG = require('../config')(process.env.NODE_ENV);

// for client-side js
// var CONFIG = require('../config/bundle.json');
```

色々融通を利かせてるうちに`index.js`のコードが長くなってしまったけど、それなりっぽくなったかなって感覚はあって、たとえばNode.js側からは`var CONFIG = require('./config')(process.env.NODE_ENV)`って具合に呼べるようにできた。

また、いずれ`public`や`private`だけではなく、フィールドやファイルを分けたくなるシーンも発生するような気がしたので、同じ階層にある別名のJSONファイルは、ファイル名を大文字化した上で設定の中に巻き込むようにした。

クライアントサイド向けにJSONファイルを書き出しているのは、Privateな設定を隠すのと、Browserifyとかでこの`index.js`もバンドルされるのは気持ち悪いなと思ったから。

クライアントサイドでの実際の使い方としては、gulpのビルドタスクなどで`config.generateBundle('production', function() { ... })`のように実行してやる。  
すると、`bundle.json`が生成されるので、これをrequireするようにすればよい。

また、Webpackの場合、別途JSONローダーが必要になるんだけど、そのJSONローダーを使ってどうやってもJSONファイルが読み込めなかったので、Webpackを使うなら`module.exports = `という文字を先頭に足して、JSONではなくJavascriptファイル化してやる必要がある。

## 問題かつ本題

設定の共有こそできるものの、クライアントサイドとサーバサイドで設定にアクセスするAPIが違うのは気持ち悪い(サーバーは`require('./config')`、クライアントは`require('./config/bundle.json')`)。

これを解決できるうまい方法があったら教えてください。
<aura:renderIf>タグの簡単な使い方

先日のSalesforce World Tour TokyoでもらったLightningコンポーネント開発者ガイドをぱらぱらめくりながら、Lightningの`<aura/>`タグの勉強をしています。
今回は`<aura:renderIf/>`タグを使って簡単な条件分岐を書いてみます。

```component.cmp
<aura:component>
    <table class="numbers">
        <tr><th>#</th><th>name</th></tr>
	<aura:iteration items="a,b,c,d,e" var="item" indexVar="index">
        <tr>
        	<td>{!index}</td>
	        <aura:renderIf isTrue="{!index % 2 == 1}">
    	        <td class="number-odd">{!item} は奇数番目</td>
        		<aura:set attribute="else">
            		<td class="number-even">{!item} は偶数番目</td>
            	</aura:set>
        	</aura:renderIf>
        </tr>
    </aura:iteration>
    </table>
</aura:component>
```

`items`のところには本来はオブジェクトを入れるのが普通だと思いますが、このように定数を書いて簡単に試せるのは調査の時には楽ですね。`indexVar`は初期値0で、ループを回るごとに1つずつ増えていく変数です。

cssについては、このコンポーネントでは`.THIS`がtableタグに相当するので、`.THIS`の後にスペースが不要なセレクタと必要なセレクターがあり注意が必要です。

```component.css
.THIS.numbers th, .THIS.numbers td { border: solid 1px; padding: 3px; }
.THIS .number-odd { background-color: #fff0ff; }
.THIS .number-even { background-color: #f0ffff; }
```

出力結果はこのような感じです。

![スクリーンショット 2014-12-09 20.25.13.png](https://qiita-image-store.s3.amazonaws.com/0/44645/7ec5ae34-495f-3fe0-c1ff-3926f06f6c36.png)

`<aura:renderIf />`で分岐する場合の注意点としては、htmlタグが対応しない形の記載はできませんのでご注意ください（cmpファイルのタグ全体に言えることです）。例えばrenderIf内で別のhtmlタグを開いたまま、`</aura:renderIf>`のように閉じることはできません。
Swiftで踏んだ地雷集


XCodeのアップデートと共にどんどん改善されているSwiftですが、まだまだ発展途上という事もあり変な罠がたくさんありそうです。

まだSwiftを書き始めてまだ1ヶ月程度ですが、ちょくちょく変なトラブルに悩まされたので小ネタ集としてまとめてみます。

## 謎のコンパイルエラー

以下のようなネストしたクロージャのコードを書いていた時のこと。


```swift:
Model.getItems({items, error in
     if let e = error {
          println(“error!”)
          return

     } 
     
     dispatch_async(dispatch_get_main_queue()) { [unowned self] in
               self.items = items
               self.tableView.reloadData()
     }
})

```

syntaxエラーも無いしぱっと見問題無さそうなコードなんですが、いざコンパイルすると以下のようなエラーが。

```
Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc failed with exit code 1
```

けっこうな量のコードを修正した直後で、ヒントが無さ過ぎて原因に気づくのにも一苦労・・。結局getItemsのクロージャではなく内側のdispatch_asyncへ渡しているクロージャでunowned selfを書いていたのが原因でした。どうもコンパイラの最適化で怒られているらしいんですが、イマイチ何が悪いのか理由が分からず。

ちなみにこの問題、XCode6.1.1では再現が取れませんでした。修正されたのかな？

## lldbコマンドが謎のエラーを吐く
元々Objective-CだったプロジェクトでSwiftを書いていて、あるときからデバッグ中にpoコマンドで変数を覗こうとすると以下のようなエラーが出るように。


```
(lldb) po self
error: Error in auto-import:
failed to get module 'TargetName' from AST context:
/Users/horimislime.../TargetName-Bridging-Header.h:23:9: ...

```

bridge headerだしimportしているObjective-C側に何か問題がありそうと思いつつ、検討も付かずにあれこれ調べてたところ、どうやらもう一度poコマンドを叩くと普通に変数表示させられるようです。

正直謎すぎる挙動ですが、以下でも同じことが書かれています。

[unable to print object ('po') in xcode6 beta 6 osx swift project: (Error in auto-import: failed to get module '__ObjC' from AST context) - Stack Overflow](http://stackoverflow.com/questions/25520415/unable-to-print-object-po-in-xcode6-beta-6-osx-swift-project-error-in-auto)

## ライブラリのバグ
Objective-Cだと動くけどSwiftだと動かない、シミュレータだと動くけど実機でクラッシュする、なんてものがちょくちょく。

自分がハマったのは端末のアルバム一覧を取得するコードでした。

```
assetsLibrary.enumerateGroupsWithTypes(ALAssetsGroupType(ALAssetsGroupAll)) { group, stop in
	...
}

```

このコードだと実機で確実にクラッシュします。原因は実機のみALAssetsGroupType(ALAssetsGroupAll)の結果がおかしかったため。

```シミュレータでの実行結果
(lldb) po ALAssetsGroupType(ALAssetsGroupSavedPhotos)
16
(lldb) po ALAssetsGroupType(ALAssetsGroupAll)
4294967295
```

```実機での実行結果
(lldb) po ALAssetsGroupType(ALAssetsGroupSavedPhotos) // これは実機でもOK
16
(lldb) po ALAssetsGroupType(ALAssetsGroupAll)
error: Execution was interrupted, reason: EXC_BREAKPOINT (code=EXC_ARM_BREAKPOINT, subcode=0xe7ffdefe).
The process has been returned to the state before expression evaluation.
```

全アルバム取ってきたいのにどうすりゃいいんだよ・・と思ってGithubを漁ってたら、恐らく全く同じ問題にぶちあたってると思われるコードを発見ｗ

[ParseTesting/ImagePickingViewController.swift at dc33772d64528e6be44cea8fbd483d5509a2c726 · ericandoh/ParseTesting](https://github.com/ericandoh/ParseTesting/blob/dc33772d64528e6be44cea8fbd483d5509a2c726/ParseStarterProject/ImagePickingViewController.swift#L133)

ALAssetsGroupAllで定義されている定数値をそのまま渡している様子。

他にもSwiftで動きが怪しいな〜とか、Objective-CのこのコードってSwiftではどう書けばいいんだ？みたいな疑問が出たら、 **ググるよりもGithubのコード検索の方が便利** かもなーと思いました。

## おわり
初期からSwift弄ってる人に比べたらマシだと思いますが、この短期間でも色々罠にハマって勉強になりました。小ネタですが同じ現象でハマってる人の役に立てれば。

色々悩まされたりもするけど・・・Swift楽しい!✌ ('ω' ✌ )三 ✌ ('ω') ✌ 三( ✌ 'ω') ✌
西暦を入力して”うるう年”かどうかを判定する

こんにちは、[@Solpha](https://twitter.com/solpha)です。

今回は、if文を使って閏年かどうかを判定するプログラムを書いてみたいと思います。

#概要

##考え方（[グレゴリオ暦](http://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AC%E3%82%B4%E3%83%AA%E3%82%AA%E6%9A%A6)で閏年を判定）

- 西暦が4で割り切れる年　⇒　閏年
- 西暦が100で割り切れる年　⇒　平年
- 西暦が400で割り切れる年　⇒　閏年

#プログラム

##コード

```go:leap-year.go
package main

import "fmt"

func main() {
	var year int

	fmt.Printf("閏年かどうかを知りたい西暦を入力してください --> ")
	fmt.Scanln(&year)

	if year%4 == 0 && year%100 != 0 || year%400 == 0 {
		fmt.Println("その年は”閏年”です。")
	} else {
		fmt.Println("その年は”閏年”ではありません。")
	}
}
```
ここでは、閏年か否かをif文を使って判定しています。

if文の中にある`&&`はAND条件（日本語でいう”且つ”）、`||`はOR条件（日本語でいう”または”）を表し、このif文では、

1. 4で割り切れ、かつ100で割れなければ「閏年」
2. 4で割り切れ、かつ400で割れれば「閏年」
3. 1と2に該当しなければ、「平年（not閏年）」

を判断して結果を表示させています。

##実行結果
```
$ go run leap-year.go
閏年かどうかを知りたい西暦を入力してください --> 2012
その年は”閏年”です。

$ go run leap-year.go
閏年かどうかを知りたい西暦を入力してください --> 2000
その年は”閏年”です。
	
$ go run leap-year.go
閏年かどうかを知りたい西暦を入力してください --> 2100
その年は”閏年”ではありません。
```

#所感
「4で割り切れるなら”閏年です”と表示させればいいな」と単純に考えてしまうと、（400の倍数を除く）100年の倍数も閏年扱いになってしまうことになるので少し考えました。

これくらいのことをすぐに考えられるようにならないといけないんだろうなと思いつつも、エラーなしで期待どおりの結果を一発で得ることができたので、そこそこ満足です。
zshでkillコマンドをプロセス名から補完する

zshではkillコマンドでプロセスIDやプロセス名を補完できるので紹介する。

## 基本的な使い方
使い方は簡単で、特に設定しなくても`kill`の後にkillしたいコマンド名を入れてTabを押せば、プロセス名が補完される。

```
% kill man #<= ここでTabを押す
% kill 32102
 1112 man find
23950 man less
32102 man ps
```

## カスタマイズする
このプロセス補完の機能は少し欠点があって、今動作しているシェルから起動したプロセスしか補完できない。でも、それも次の設定を.zshrcに書いておけば解決する。

```zsh
zstyle ':completion:*:processes' command "ps -u $USER"
```

最後の`ps -u $USER`というところが大事。標準ではTabで補完するときに`ps`コマンドを実行した結果を補完候補として使うんだけど、こうやって書いておくと代わりに`ps -u $USER`というコマンドを実行した結果を使うようになる。

これで、今のシェルから起動していないプロセスも補完できるようになる。
なので、tmuxを使っていて別のウィンドウで起動したプロセスとか、デスクトップのランチャーから起動したプロセスも補完できる。

最後の`ps -u $USER`は自由にカスタマイズしてOK。たとえば、次の例は出力フォーマットを変更して、たくさん情報が見れるようにしている。

```zsh
zstyle ':completion:*:processes' command "ps -u $USER -o pid,stat,%cpu,%mem,cputime,command"
```

![zsh_kill_1.png](https://qiita-image-store.s3.amazonaws.com/0/204/711590cc-3f73-ffd8-ee38-bf82803bd2cb.png)

固まってしまったブラウザを停止するときとかに補完しながらkillできると便利なので、ぜひ試してみてください!
HerokuにpushしたRailsプロジェクトのassetsが読み込まれない問題の解決方法

HerokuにpushしたRailsプロジェクトをheroku openしてブラウザから確認すると、assetsの全て、CssやJavaScriptなどが読み込まれていませんでした(;´༎ຶω༎ຶ`)

# config.assets.compileを設定
production.rbにconfig.assets.compileの設定があるようなので、そちらを編集します。

```rb:production.rbを編集
vi config/environments/production.rb

config.assets.compile = true
```
config.assets.compileをtrueに変更しました。
変更分をHerokuへ反映すると、ちゃんとassetsが読み込まれるようになりました(☝ ՞ਊ ՞)

# 参考
Rails 4: How To Fix The Heroku Assets Not Found CSS Image Issue
http://natashatherobot.com/rails-4-heroku-assets-not-found-css-image/
既存のpostgresから初期設定のDBを作りたいんです

http://xoyip.hatenablog.com/entry/2014/05/18/200000
この手が良さそうだと思った。やはりDBからdumpが簡単そうなので。DBの汎化が必要になったらいろいろと考えれば良いと思う。

```
ファイルフォーマット的にはここまでの作業で問題なくなったが、余計なデータが一種類入っている。それはschema_migrationのデータだ。
```

とのことだったので一発でいけないか調査。一次情報を当たる。
http://www.postgresql.org/docs/9.3/static/app-pgdump.html

`--exclude-table`を使えば良い。

```bash
pg_dump mydatabase --data-only --inserts --exclude-table=schema_migrations > seeds.sql
```

そんなわけでこれで準備OK。

`./db/seeds.sql`として`./db/seeds.rb`に以下を記述

```rb
sql = open(File.join(Rails.root, "db", "seeds.sql")).read
ActiveRecord::Base.connection.execute sql
```

あとはdbの準備をしたら下記を実行でOK。

```
rake db:migrate
rake db:seed
```
エンジニアラジオまとめ

[engineer meeting podcast](http://engineer-meeting.tumblr.com/)
[Rebuild Podcast](http://rebuild.fm/)
[mozaic.fm](http://mozaic.fm/)
[Admins Bar](http://admins.bar/)
[Frog School](http://school.frogagent.com/podcast-list/)
[CodeLunch.fm](http://codelunch.fm/)
[wada.fm](http://wada.fm/)
[職質テックトーク](http://shock-sheets-tech.tumblr.com/)
[アジャイルラジオ](http://www.agileradio.info/)
[riywo's Podcast](http://podcast.riywo.com/)
[だんごゆっけの平和な話](http://dandy.fm/)
[Automagic Podcast](http://automagic.fm/)
[backspace.fm](http://backspace.fm/)
[ライフハックLiveshow](http://liveshow.jp/)
[TECHBOOSTER](http://techbooster.org/)
[antipop.fm (あんちぽえふえむ)](http://antipop.fm/)
[podpatch](https://soundcloud.com/podpatch)
yii2-debugをローカル以外でも使いたい



yii2にはモダンフレームワークらしくイカしたデバッグツールがついてます。

![スクリーンショット 2014-12-11 22.48.29.png](https://qiita-image-store.s3.amazonaws.com/0/3181/2b8e6871-624b-56a6-ab58-71fb2e28ceea.png "スクリーンショット 2014-12-11 22.48.29.png")



しかし標準だとローカルIPからのアクセス限定で、VPSやVagrantで開発しようとした時に動かないので困ってしまいます。

どこかで設定するのかさがしてみると、`yii2-debug/Module.php`で直接IPが指定されてるのが伺えます

```php:yii2-debug/Module.php
<?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */
namespace yii\debug;
use Yii;
use yii\base\Application;
use yii\base\BootstrapInterface;
use yii\helpers\Url;
use yii\web\View;
use yii\web\ForbiddenHttpException;
/**
 * The Yii Debug Module provides the debug toolbar and debugger
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @since 2.0
 */
class Module extends \yii\base\Module implements BootstrapInterface
{
    /**
     * @var array the list of IPs that are allowed to access this module.
     * Each array element represents a single IP filter which can be either an IP address
     * or an address with wildcard (e.g. 192.168.0.*) to represent a network segment.
     * The default value is `['127.0.0.1', '::1']`, which means the module can only be accessed
     * by localhost.
     */
    public $allowedIPs = ['127.0.0.1', '::1']
```

どこかで値を再代入して解決することもできなくはないはずですが、Yiiのモジュール（コンポーネント）は初期化時にpublicなプロパティをオーバーライドできるという特性があります。なので、モジュールの定義をしている設定ファイルに値を指定することで対象のプロパティを再設定することが出来ます。

```diff:config/web.php
$config = [
 if (YII_ENV_DEV) {
     // configuration adjustments for 'dev' environment
     $config['bootstrap'][] = 'debug';
-    $config['modules']['debug'] = 'yii\debug\Module';
+ $config['modules']['debug'] = [
+         'class' => 'yii\debug\Module',
+         'allowedIPs' => ['1.2.3.4', '127.0.0.1', '::1'] // '*'ですべてのIPからのアクセスでも動作するようにできる
+ ];

     $config['bootstrap'][] = 'gii';
     $config['modules']['gii'] = 'yii\gii\Module';
```

これで`1.2.3.4`からのアクセスでもyii2-debugが動作するようになります。

DBやキャッシュのコンポーネントも同じように設定することができるのでYii2を使う上ではぜひ覚えておきたい手法です。
検索・置換を便利にするvim-abolish

これは Vim Advent Calendar 2014 11日目 の記事です。

---

日頃Railsを書いている。その際[vim-abolish](https://github.com/tpope/vim-abolish)が便利なんだけど、日本語記事で紹介されている場面をあまり見ないので紹介したい。

# インストール

インストールはいつものとおりVundleやNeoBundleで。

```vim
NeoBundle 'tpope/vim-abolish'
```

# 3つ機能

ところでvim-abolishは大きく分けて[Abbreviation](https://github.com/tpope/vim-abolish#abbreviation)、[Substitution](https://github.com/tpope/vim-abolish#substitution)、[Coercion](https://github.com/tpope/vim-abolish#coercion)の3つに分類されるが、Abbreviationは使っていないので、SubstitutionとCoercionだけを取り上げる。

## Substitution

Vimで `:substitute` と言えば置換処理に使うコマンドだが、Substitutionはこの置換処理に加えて検索を便利にしてくれる機能だ。

### 賢い検索

個人的にvim-abolishいれてから普通の検索はあまり使わなくなった。便利機能を紹介する。

#### 気が利く大文字・小文字マッチ

Vimの検索はデフォルトで大文字・小文字を区別する。`/box` は "box" にはマッチするが "Box" にはマッチしない。`ignorecase`オプションをつけると大文字・小文字の区別が無くなるので `/box` は "box" と "Box" にマッチするが "bOX" にもマッチする。

`:Subvert` コマンドはこの挙動をいい感じにしてくれる。`:Subvert/box` は "Box" "box" "BOX" にマッチする。`:S/box`でもOK。

#### スネークケース、キャメルケースにも対応

大文字・小文字だけだと「 `ignorecase` して `/box` でいいじゃないか」と思うかも知れない。

`:Subvert` コマンドはスネークケース、キャメルケースなどの区別もしてくれる。例えば `:S/hello_world` は "HelloWorld" "HELLO_WORLD" "hello_world" にマッチする。 `/hello_world` では "HelloWorld" にはマッチしない。

Railsの場合、モジュール名やクラス名は "ModuleName" 形式で、ファイル名は "module_name" で書かれる。 `:Subvert` ならこの２つを一緒に検索できる。

#### 組み合わせることができる

当然だが `/mouse` は "mouse" にはマッチするが "mice" にはマッチしない。

`:S/m{ouse,ice}` は "mouse" "Mouse" "MOUSE" "mice" "Mice" "MICE" にマッチする。

他の使い方としては `:S/{foo,bar}_concern` で "FooConcern" "FOO_CONCERN" "foo_concern" "BarConcern" "BAR_CONCERN" "bar_concern" にマッチする。

#### ファイルを指定する

今まではカレントバッファを対象にしていたが、検索対象のファイルを指定できる。

`:S/{foo,bar}_concern/ app/models/**/*.rb` とするとapp/modelsディレクトリ以下のrubyファイルの中から  "FooConcern" "FOO_CONCERN" "foo_concern" "BarConcern" "BAR_CONCERN" "bar_concern" にマッチした箇所がQuickfixに入る。（ここでは `_concern` のあとに `/` が必要なことに注意）

関連記事: [vimgrepとQuickfix知らないVimmerはちょっとこっち来い - Qiita](http://qiita.com/yuku_t/items/0c1aff03949cb1b8fe6b)


### 賢い置換

`:S/{pattern}/{string}/[flags]` で置換ができる。使い方は `:substitute` とほぼ同じだが、もちろん `:substitute` より痒いところに手が届いている。

#### 入れ替え

`:S/{vim,emacs}/{emacs,vim}/gc` を実行すると "vim" と "emacs" を入れ替えることができる。

## Coercion

これは通常モード時に、カーソルの下にある文字列のキャメルケース、スネークケースなどを入れ替える。プラグインをインストールすると勝手にいくつかのキーバインドが登録される。

コマンド | 動作
----|----
`crs` | "SnakeCase" → "snake_case"
`crm` | "mixed_case" → "MixedCase"
`crc` | "camel_case" → "camelCase"
`cru` | "upper_case" → "UPPER_CASE"

# おわりに

便利なので使ってみて欲しい。
Rubotyでideoneの採点を行う


https://github.com/cielavenir/codeiq_problems/blob/master/q1169/check.rb
をRuboty対応してみた。

##URL
http://rubygems.org/gems/ruboty-ideone

##Base
ruboty-gen gemを使いましたが、Handlerが状態を持つため、Actionはバッサリ削除してしまいました。
こういう場合、どうするのが良いのでしょうね。

あと、gemspecに書いてあるとおり、savonが必要です。

##Config
- IDEONE_USER/IDEONE_PASS: ideoneのユーザー名とAPIパスワード。
  - 同じユーザー名からは1ヶ月に1000回しかAPIリクエストできないらしい？ので注意。

###[150109追記] APIパスワードについて
- 150107の更新により、APIパスワードの設定が必要になりました。

1. ideoneのフッターの「api」をクリックします。
2. Pay-As-You-Goの「Continue」をクリックします。
3. 適当に入力します。とりあえずどのように知ったかはspojを入れておきましたが、別になんでも良いかと…。
4. APIパスワードをこの画面で設定しても反映されないようなので、チェックは入れずに「Subscribe」します。
5. my accountのsettingをクリックします。
6. Ideone API Passwordを設定します。

- 以上の情報はNeoCat氏から提供いただきました。感謝します。

##Usage

- `/ideone languages/`

言語一覧を返す。

```
   7: Ada (gnat-4.6)
  13: Assembler (nasm-2.10.01)
  45: Assembler (gcc-4.8.1)
 104: AWK (gawk) (gawk-3.1.6)
(snip)
```

- `/ideone setinput ?(?<input_uri>\S*)/`

stdinを保存する。
input_uri: 入力ファイル(空文字列ならクリア)
open-uriなKernel.openを使うので、入力ファイルはhttp://も指定できる。以下同様。

- `/ideone submit (?<language>\S+) (?<source_uri>\S+) ?(?<input_uri>\S*)/`

language: ID(数値)または言語名(文字列)。言語名の場合、記号類(`/[\s\(\)\.]/`)を除いて最大先頭一致のものを使用する。
source_uri: ソースファイル
input_uri: 入力ファイル(空文字列ならsetinputの内容を使用)

languageの例。

```
7 => Ada (gnat-4.6)
Ada => Ada (gnat-4.6)
ada => Ada (gnat-4.6)
asseml => Assembler (nasm-2.10.01)
assemblerg => Assembler (gcc-4.8.1)
c => C (gcc-4.8.1)
c+ => C++ 4.3.2 (gcc-4.3.2)
c++48 => C++ 4.8.1 (gcc-4.8.1)
javas => JavaScript (rhino) (rhino-1.7R4)
javascripts => JavaScript (spidermonkey) (spidermonkey-1.7)
r => R (R-2.11.1)
ru => Ruby (ruby-1.9.3)
```

- `/ideone view ?(?<id>\w*)/`

id: ideone ID(空文字列なら直前のsubmitで返されたIDを使用)
※これをActionで実現するにはActionにselfかコールバック関数を渡す必要があるわけですが。難しいですね。

##Example

```
$ IDEONE_USER=ciel0______ IDEONE_PASS=_______ ruboty
> ruboty ideone setinput /path/to/codeiq_base32/data.in
Input set.
> ruboty ideone submit ru /path/to/codeiq_base32/base32.rb
http://ideone.com/Sdsoiw
> ruboty ideone view
CodeIQ is a service in which you can check your programming skill. There are so many problems such as algorithms, mathematics, data sciences, and even security! The unique point is that (unlike other e-learnings) you can receive feedback comment from human, which will be helpful for your study. So, let's go for it!
> exit
$
```

##Appendix
/opt/local/lib/libiconv.dylibが`gem install nokogiri -- --with-iconv-dir=/opt/local`から認識されない不具合で1時間ほど悩んだ
(すでに1.6.3.1がインストールされていたが、bundle installでこけないようにしなければならない)。
結局/usr/local配下にsymlink張って無理やり通したけど、正しい解決策は何なのでしょうね…。

ところで、rubotyはbundle installしないと動かないみたいだからよかったけど、savonとmechanizeを両方インストールするとsavonがバグる不具合があるっぽい。
https://github.com/sparklemotion/mechanize/issues/407
【CakePHP】delete()/deleteAll()

#deleteメソッド
パラメータにidをとる。1レコード削除の場合に使う。

```php
if ($this->Model->delete(1)) {
  // 成功
}
```

第二引数にtrueを渡すと自身を参照している別テーブルのレコードも削除してくれる。ただし、アソシエーションでdependentをtrueにする必要あり。
第二引数のデフォルトはtrue。

戻り値はbooleanで、成功したらtrue、失敗したらfalseを返す。

#deleteAllメソッド
パラメータにfind()同様の検索条件をとる。複数レコード削除の場合に使う。

```php
$param = array('XXX' => 'XXXX');
if ($this->Model->deleteAll($param)) {
  // 成功
}
```
delete同様に第二引数にtrueを渡すと自身を参照している別テーブルのレコードも削除してくれる。

戻り値はbooleanで、成功したらtrue、失敗したらfalseを返す。

###全削除
deleteAllで全削除を行う場合、パラメータに何も渡さないと実行されないためダミーデータを渡す。

```php
$this->Model->deleteAll(['1=1']);
```
RのdplyrとPythonのpandasで, 処理速度の比較をしてみました

## はじめに

Rのdplyrとpythonのpandasで, 同じ表データを同じように処理してみます. 

どっちが速いんですかね? 気になりましたので調べてみました. 

## 野球データの集計

2013年メジャーリーグ全試合打席結果データ(77MB, 約19万行)から, 塁打数ランキング.csvを作ってみます. 

Rのdplyrを使って書いたスクリプトdplyr.Rは, 

```r
library(data.table)
library(dplyr)

## データ読み込み
dat = fread("all2013.csv")

## 集計 
dat %>% select(BAT_ID, H_FL) %>% 
 group_by(BAT_ID) %>% 
 summarise(BASE = sum(H_FL)) %>% 
 arrange(desc(BASE)) %>% 
 write.csv("hoge.csv")
```

こんな感じ. 

```bash
> time R -f dplyr.R
R -f dplyr.R  3.13s user 0.15s system 99% cpu 3.294 total
```

pythonのpandasだと, 

```py

#!/usr/bin/python

import pandas as pd

df = pd.read_csv('all2013.csv')

df[["BAT_ID", "H_FL"]].groupby("BAT_ID").sum().sort("H_FL", ascending=False).to_csv('hoge.csv')
```

こんな感じ. 

```bash
> time ./pd.py                                                                          
./pd.py  3.12s user 0.40s system 98% cpu 3.567 total
```

dplyrだと3.29秒, pandasだと3.56秒. 

dplyrがちょっと勝っています.

## まとめ

77MBのデータだと, どちらかが特別速いわけではなさそうです.

慣れている方を使えばOKなんでしょうかね? 

以上です.
chefでrbenvをuser_installsで入れてgemもちゃんといれる

Chefを使ってrbenvをUserインストールするには

https://github.com/fnichol/chef-rbenv

を使わないとできませんが、こちらのcookbookを使って gemをインストールすると該当ユーザーではなくrootが所有者として入ってしまうために、後から `Capistrano`を使って deploy をする時に bundle がうまく動かず悲しい思いをすることになるかもしれません。

かもしれません、というか原因がわからずまたyak shavingをし続けてました。シャイセ！

### 解決策

マージされてない Pull Requestがありましたのでそちらを使わせてもらいましょう。

https://github.com/fnichol/chef-rbenv/pull/73

```rb:Berksfile
cookbook "rbenv", github: 'sds/chef-rbenv', branch: 'install-gems-as-user'
```
Ruboty | ruboty-megen の command ブロックに example を追加 #ruboty

# Ruboty | ruboty-megen の command ブロックに example を追加 #ruboty

## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
ruboty-megen の command ブロックに example を追加します。

## <i class="fa fa-question-circle" style="font-size:1em;"></i> ruboty-megen って何？という方はこちら
[Ruboty | Ruboty Handler Plugin 作成時の README テンプレートジェネレータ ruboty-megen を作成した](http://qiita.com/tbpgr/items/33ccf5709cb553b2095f)
[各種 Generator を利用して Ruboty のプロダクトコード・README・Qiita記事の作成コストを下げる](http://qiita.com/tbpgr/items/1987fef9bb228b07e5eb)

また、関連する話題として ruboty-articlegen も登場するので下記もご確認ください

[Ruboty | Ruboty Handler Plugin 作成時に公開するための Markdown 形式の技術エントリ テンプレートジェネレータ ruboty-articlegen](http://qiita.com/tbpgr/items/3974585421a0e9110782)

## <i class="fa fa-history" style="font-size:1em;"></i> 経緯
<i class="fa fa-github-square" style="font-size:1em;"></i> [ruboty-megen](https://github.com/tbpgr/ruboty-megen) , <i class="fa fa-github-square" style="font-size:1em;"></i> [ruboty-articlegen](https://github.com/tbpgr/ruboty-articlegen) の順でジェネレータを作成したのですが、
<i class="fa fa-github-square" style="font-size:1em;"></i> [ruboty-megen](https://github.com/tbpgr/ruboty-megen) の時には気づかず、  <i class="fa fa-github-square" style="font-size:1em;"></i> [ruboty-articlegen](https://github.com/tbpgr/ruboty-articlegen) で追加した `command.example` を
<i class="fa fa-github-square" style="font-size:1em;"></i> [ruboty-megen](https://github.com/tbpgr/ruboty-megen) にも追加したくなりました。
`example` は Plugin の各コマンドの実行コマンドの例を設定します。

### 補足
こうなるといよいよ <i class="fa fa-github-square" style="font-size:1em;"></i> [ruboty-megen](https://github.com/tbpgr/ruboty-megen) , <i class="fa fa-github-square" style="font-size:1em;"></i> [ruboty-articlegen](https://github.com/tbpgr/ruboty-articlegen) の DSL の設定値がほとんど同じに・・・。

* ブログ記事は日本語で日本人向けになるケースが多そう
* README.md は世界向けの Plugin なら英語、日本人向けなら日本語
* README.md は Plugin 作者のほぼ全員に必要だが、 ブログ記事は必要ない人が多い

という差があるため、 2つのツールを統合したりはせずに、このまま別々に残しておこうと思います。

## <i class="fa fa-arrow-circle-right" style="font-size:1em;"></i> 参照
* <i class="fa fa-github-square" style="font-size:1em;"></i> [ruboty GitHub](https://github.com/r7kamura/ruboty)
* <i class="fa fa-github-square" style="font-size:1em;"></i> [ruboty-megen](https://github.com/tbpgr/ruboty-megen)
* <i class="fa fa-github-square" style="font-size:1em;"></i> [ruboty-articlegen](https://github.com/tbpgr/ruboty-articlegen)
【Redmine】画像のリサイズ方法

Redmineを使ってタスク管理をしているのだが、その際に画像を貼ると大きすぎることがあったので調べた。

すると次のように書けばいいらしい。

```code:
!{width:200px}imageSampe.png!
```

* 参考：[Redmine Wiki 画像のリサイズ機能を実装](http://devml.blogspot.jp/2008/07/redmine-wiki.html)
ブランチの構成を保ったままrebaseする

rebaseで大混乱したのでまとめました。

下図の状態でhogeブランチを最新のmasterにrebaseする。
![rebase_qiita_01.gif](https://qiita-image-store.s3.amazonaws.com/0/59349/458e1907-b019-995b-66e9-3054a14ef6a3.gif)



####```git rebase master```
コミットログが全て1列になる。
![rebase_qiita_02.gif](https://qiita-image-store.s3.amazonaws.com/0/59349/81372aa4-38d4-c028-410b-d4b6588b0d14.gif)



####```git rebase --preserve-merges master```
ブランチの構成を保ったままrebaseされる。
※正しくは『ブランチが分かれたという状態のログを保った状態でrebaseされる』。
![rebase_qiita_03.gif](https://qiita-image-store.s3.amazonaws.com/0/59349/1da775e3-2bfe-9be1-fe3a-718050a1fd5c.gif)

**どちらのrebaseもサブブランチまで移動されるわけではない。**
Blenderの3D View（選択操作）

# はじめに
前回に引き続き3D Viewにおける基本操作の説明です。

# 基本操作２：選択操作

3D View上でオブジェクト/面/線/点を選択する際にはさまざまな方法があります。

## キーボードによる選択

<dl>
<dt>Aキー</dt>
<dd>全選択/全選択解除　トグル動作</dd>
</dl>

## マウスによる選択

<dl>
<dt>RMB（右ボタンクリック）</dt>
<dd>クリックした対象を選択</dd>
<dt>Shift+RMB</dt>
<dd>追加選択（選択中の対象をクリックした場合は選択解除）
</dl>

## 特殊な選択

<dl>
<dt>Bキー：ボックス選択</dt>
<dd>Bキーを押すと、マウスカーソルが十字カーソルに変わるので、LMBドラッグで矩形に囲むことによって選択を行います。LMBではなくMMBドラッグで矩形に囲むとその部分が選択解除となります。</dd>
<dt>Cキー：サークル選択</dt>
<dd>Cキーを押すと、マウスカーソルが円にかわるので、対象を円内においてLMBで選択します。マウスホイールを回すことによって円の半径を変更できます。MMBで円内を選択解除でき、RMBクリックで選択完了です。</dd>
<dt>Ctrl+LMBドラッグ：投げ縄選択</dt>
<dd>投げ縄で囲むことによって選択します。</dd>
<dt>Ctrl+Shift+LMBドラッグ：投げ縄選択解除</dt>
<dd>投げ縄で囲んだ対象を選択解除します。</dd>
<dt>Iキー：選択反転</dt>
<dd>現在選択中の対象を選択解除し、選択されていない対象を選択状態にします。</dd>
</dl>

## オブジェクトモード専用の特殊な選択

<dl>
<dt>ALT+RMB：メニュー選択</dt>
<dd>複数のオブジェクトが重なっている部分をALT+RMBクリックすると該当するオブジェクトの名称がポップアップメニューで表示されるので、そこから対象を選択します。</dd>
</dl>

## エディットモード専用の特殊な選択

<dl>
<dt>ALT+RMB：ループ選択</dt>
<dd>ループ状に選択します。</dd>
<dt>CTRL+ALT+RMB：リング選択</dt>
<dd>リング状に選択します。</dd>
<dt>CTRL+（プラスキー）：増殖選択</dt>
<dd>現在選択中の対象に接続している物を選択中にしていきます。勝手な名前つけました、ごめんなさい。</dd>
<dt>CTRL+（マイナスキー）：縮退選択</dt>
<dd>増殖選択の逆です。これも勝手な命名です。</dd>
</dl>

言葉で説明しても、ピンとこないものが多いですね。ぜひ試してください。

ボックス選択
![box.png](https://qiita-image-store.s3.amazonaws.com/0/43250/3161b149-4839-8aa5-9ac7-980c9eb61f86.png)

サークル選択
![circle.png](https://qiita-image-store.s3.amazonaws.com/0/43250/42abf24d-b388-2a83-fef0-8fba1928c171.png)

投げ縄選択
![lasso.png](https://qiita-image-store.s3.amazonaws.com/0/43250/b1e1fdd8-200c-3020-c793-1ab9df078b35.png)

オブジェクトモードでのメニュー選択
![menu.png](https://qiita-image-store.s3.amazonaws.com/0/43250/a36d1ba9-aa16-6956-f207-ac93c0de9549.png)

今日はここまでです。
WatchKitでWKInterfaceControllerのinitメソッドが変わった？（Xcode6.2beta）【メモ】

#WatchKitでControllerのinitメソッドが変わった？

12/10 付けでリリースされたXcode 6.2 beta2（6C95a）をインストールしたところ、これまで試していたWatchKitアプリがエラーを出すようになった。

##エラー状況

```swift:InterfaceController.swift（エラー）
class InterfaceController: WKInterfaceController {
    override init(context: AnyObject?) {
        super.init(context: context)

        //省略
    }
}
```

![image](https://qiita-image-store.s3.amazonaws.com/0/59249/cca2e6cc-d38c-6db2-8d3f-0e06b5282850.png)


##対処方法

(2014/12/25) Xcode6.2 Beta3からクラス作成時の初期化メソッドとして、initではなくawakeWithContextメソッドが使われるようになっていました。これでcontextを使用できそうです。

```swift:InterfaceController.swift
    override func awakeWithContext(context: AnyObject?) {
        super.awakeWithContext(context)
    }
```



(解決済み) 
詳細までは調べていないのだけれど、イニシャライザが変わったようで、以下のように書き換えたところエラーは解消された。

```swift:InterfaceController.swift
class InterfaceController: WKInterfaceController {
    override init!() {
        super.init()

        //省略
    }
}
```

![image](https://qiita-image-store.s3.amazonaws.com/0/59249/4ce68f57-54c6-bcfc-bf50-d5a88aa94fa9.png)

ただ、これまでは画面の遷移でデータの受け渡しに使っていた、contextパラメータがイニシャライザの引数からなくなっているので、どうすればいいのか調べないと。
jekyllをpuma + nginxで動かす


社内ブログとしてjekyllを導入した時の作業メモ。
jekyllは導入済みというところからの作業です。


## 今回作る/いじるファイル

```bash
.
├── Gemfile
├── _config.yml
├── config.ru
└── puma.rb

```


## 必要なgemをインストールする

以下のgemをインストールしましょう。

```Gemfile
source 'https://rubygems.org'

gem 'jekyll'
gem 'rack-jekyll', github: 'adaoraul/rack-jekyll'
gem 'puma'

```
rack-jekyllはjekyllをrackで動かせるようにするgemです。


## Jekyll側の設定
### 関連ファイルをexcludeする
`_config.yml`に以下の設定を追加します。

```_config.yml
exclude: ["_tmp", "_log", "puma.rb", "config.ru"]
```
これは`jekyll build`に巻き込まれないように除外するファイルを指定する設定です。
この後作るpidファイルやログファイルを貯めこむディレクトリや、pumaの設定ファイルを`jekyll build`に無視してもらう必要があります。

### rack起動ファイルを作る
jekyllをrack-jekyllによってrackから動かせるようにしたので、`rackup`するための`config.ru`を作ります。

```config.ru
require "bundler/setup"
Bundler.require(:default)

run Rack::Jekyll.new(:destination => '_site')
```


## pumaセットアップ
pumaに読ませる設定ファイルを作ります。
このファイルに書かずにコマンド上でオプションを用いて指定する方法もあります。面倒です。

```puma.rb
application_path = File.expand_path('../../', __FILE__)

directory application_path

environment 'production'

daemonize true

pidfile File.join(application_path, '_tmp', 'pids', 'puma.pid')

state_path File.join(application_path, '_tmp', 'pids', 'puma.state')

stdout_redirect File.join(application_path, '_log', 'puma.stdout.log'), File.join(application_path, '_log', 'puma.stderr.log'), true

bind 'unix:///tmp/puma_jekyll.sock'
```

`bind 'unix:///tmp/puma_jekyll.sock'`で指定したソケットをnginxから見てもらうということになります。


## nginx側の設定
リバースプロキシを立てて、pumaのソケットにリクエストを流し込む設定をして完了です。

```/etc/nginx/conf.d/jekyll.conf
upstream jekyll {
    server unix:///tmp/puma_jekyll.sock;
}

server {
    listen       80;
    server_name blog.example.com;

    location / {
        proxy_read_timeout    30;
        proxy_connect_timeout 30;
        proxy_redirect         off;

        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_set_header   Host              $http_host;
        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header   Host              $host;

        proxy_pass          http://jekyll;

        access_log          /var/log/nginx/jekyll_access.log;
        error_log           /var/log/nginx/jekyll_error.log;
    }
}
```

nginxの大元の設定ファイルである`nginx.conf`から`conf.d/`以下の設定ファイルをincludeしてもらう設定をしていない場合はそれもしましょう。
多分デフォルトなら大丈夫だろうが・・・
`/etc/nginx/nginx.conf`の`http`ディレクティブに以下の１行を追加します。

```/etc/nginx/nginx.conf
# any configuration...

http {
    # any configuration...

    include /etc/nginx/conf.d/*.conf;
}

```


## 起動
```shell
# pumaでjekyllを起動
bundle exec puma -C puma.rb

# nginx再起動
sudo service nginx restart
```
mBaaSを使って無料でチャットゲームを作る(前編)

2014年も残すところわずかとなりましたが、今年も色んなスマホゲームがリリースされました。魅せ方やゲーム性など各社様々な工夫を取り入れていましたが中でも「リアルタイム通信」というのは一つのキーワードだったのではないでしょうか。cocos2dxを使った自作ゲームにもそれらの機能を取り入れたいところですが、いざ導入するとなるとサーバ側の処理を実装する必要があったり維持費が掛かったりと敷居が高いです。

本稿ではmBaaSを使ってcocosで作ったゲームにリアルタイム通信機能を実装する方法について書きます。

## Pusherの紹介
![スクリーンショット 2014-12-05 19.49.28.png](https://qiita-image-store.s3.amazonaws.com/0/2490/288e2a8d-290b-986f-fb62-c98cb6854c23.png)

[Pusher](http://pusher.com/)はリアルタイム通信に特化したmBaaSです。開発者はAPIやクライアントSDK経由でサービスにアクセスすることで、チャットのように双方向な通信が必要な機能を簡単に実装することができます。類似サービスも色々あったのですが、

1. 提供されている機能がシンプル
2. 以前触ったときより触り心地が良くなっていた

と、技術的にはそこまで真面目に選定したわけではないのですがPusherを使ってみます。類似サービスについては別途文末に記載します。

## cocosと繋いでみる
早速cocosで作ったゲームと接続してみましょう。PusherではWebSocketによる接続が提供されており、cocosにもWebSocket用クラスがあるのでそれらを利用します。部屋を建ててチャンネルを購読するコードは以下のようになります。

```lua
local json = require("json")

local ws = cc.WebSocket:create("ws://ws.pusherapp.com/app/{YOUR_APP_KEY}?protocol=7")
ws:registerScriptHandler(function(msg)
    msg = json.decode(msg)
    if msg.event == "pusher:connection_established" then
        ws:sendString(json.encode({
            event = "pusher:subscribe",
            data = { channel = "teen_room" }
        }))
    elseif msg.event == "pusher_internal:subscription_succeeded" then
        print("チャンネルを購読")
    elseif msg.event == "talk"
        local data = json.decode(msg.data) -- ※dataはさらにjsonエンコードされているのでデコードしています
        print(data.text)
    end
end, cc.WEBSOCKET_MESSAGE)
```
`cc.WebSocket:create`で初期化、`registerScriptHandler`で受信、`sendString`で送信します。上記のコード例は接続を確立してチャンネルを購読するまでの処理です。プレフィックスが`pusher:*`となっているイベントは、接続成功の通知や購読要求などPusherのシステムイベントと解釈されます。さらに詳細は[公式のドキュメント](https://pusher.com/docs/pusher_protocol)に記載されています。

## Debug Consoleからmessageを受信してみる
コードが書けたので次はイベントを受信してみます。PusherにはDebugConsoleが付属しており、ブラウザ経由でデバッグすることができます。

![スクリーンショット 2014-12-05 20.06.47.png](https://qiita-image-store.s3.amazonaws.com/0/2490/d0195181-6382-1163-89c8-ada4fe61e14c.png)

コンソールを開きながら先のコードを走らせると、接続されている様子が分かります。ここではイベントを送信することもできるので、チャンネルとイベントを指定して送信します。先のコードを実行していれば受信したメッセージが出力されているはずです。

```
cocos2d: [LUA-print] 17歳です
```

## Pusherのセキュリティ
これで送信/受信、両方の準備ができたのであとは端末を二台用意してチャットゲーム完成！といきたいところなのですが、もう一手間かける必要があります。というのも、Pusherでは基本的に端末から直接任意のメッセージを送信することはできず、一旦アプリサーバを介して送信するよう設計されています（※端末からのメッセージを許可する設定もあるようです）。

![hero_howitworks.png](https://qiita-image-store.s3.amazonaws.com/0/2490/7b0afdba-18a9-48d7-09c9-b8120db1cc18.png)

これは、ブラウザアプリやモバイルアプリのコードは基本的にユーザに読まれてしまうリスクを持っているため、そこに送信用キーを載せるのは危険だからというのが主な理由かと思われます。

そこで、別のmBaaSを使ってPusherにメッセージを送信できるようにします。詳細については次回の記事で書きます。

## おまけ
Pusher同様、アプリにリアルタイム通信を実装するためのmBaaSは他にも以下のようなものがあります。料金や実装状況など、用途に合わせて選択していければと思います。

* http://www.pubnub.com
* http://app.realtime.co
* https://www.firebase.com
* https://www.tambur.io
* https://www.hydna.com
* https://fanout.io
* https://mlkcca.com
* http://www.leggetter.co.uk
Chef で rakeを入れようとすると`"rake" from rake conflicts with`と怒られる時の対処法

既存の`rake`とぶつかってるので文句を言われるので対話的に処理してる時は `y` を押せばいいだけですが、 chef の適用をしてる時はそんなことできません。

### 対策

node ファイル内で強制オプションをつけましょう。

```json
 { "name": "rake", "options":  "--force" }
```

これで正常にインストールが終了するはずです。
【PHP】PHPでPDOを使ってMySQLでデータ取得・書き込み・更新などなど

phpでmysqlのデータをinsertやらupdateやらselectやらやるときにPDOで取得するやり方。
sql実行したデータをwhileしてーってより書き方すっきりした。

#DB接続
事前に記載、funciton化して最初に実行でも可。

```
define('DATABASE_NAME','xxxx');
define('DATABASE_USER','xxxx');
define('DATABASE_PASSWORD','xxxx');
define('DATABASE_HOST','localhost');

// pdo values
define('PDO_DSN','mysql:dbname=' . DATABASE_NAME .';host=' . DATABASE_HOST);

$pdo = new PDO( PDO_DSN, DATABASE_USER, DATABASE_PASSWORD );
```

#insert

prepare関数を使ってsql設定してexecute関数で実行。
その際、変数とかぶっこむならbindvalueとかで変数と型指定したりなど。

```
$smt = $pdo->prepare('insert into テーブル名 (name,tel) values(?,?)');
$smt->bindParam(1,$name, PDO::PARAM_STR);
$smt->bindValue(2,(int)$tel, PDO::PARAM_INT);
$smt->execute();
// 実行結果を配列に返す。
$select_data = $smt->fetchAll();
```
bindParamは文字列を返す。
bindValueは数値型を返すことも可能だが指定の必要があり。

#update

```
$smt = $pdo->prepare('update テーブル名 set count = ?, count2 = ?, count3 = ? where entry_id = ?');
$smt->bindValue(1,(int)$count, PDO::PARAM_INT);
$smt->bindValue(2,(int)$count2, PDO::PARAM_INT);
$smt->bindValue(3,(int)$count3, PDO::PARAM_INT);
$smt->bindValue(4,(int)$entry_id, PDO::PARAM_INT);
$smt->execute();
```

deleteもこのノリでいける。

#select

変数付与しないベタの形でよければquery関数使えばexecuteしなくてもよいぽい。

```
$smt = $pdo->query('select * from テーブル名 order by entry_id desc');
// 実行結果を配列に返す。
$select_data = $smt->fetchAll();

```

もちろんcreateもdropもこの手法でかける。
楽～。
HTML::DOMインストールでテストが失敗する場合のとりあえずの対処法

# HTML::DOMがインストールできない？
Windows8.1 Starawberry Perl5.20.1の環境下で、HTML::DOMをインストールしようとしたところ、テンポラリファイルの作成に失敗し、インストールできませんでした。

# 対処
C:/tempディレクトリを作った所、インストールできました。

# 理由
モジュールがFile::Tempを利用している場合、最終的にFile::Spec::Win32::tmpdirを参照します。このとき、以下の順番でテンポラリディレクトリを探します。

```
$ENV{TMPDIR}
$ENV{TEMP}
$ENV{TMP}
SYS:/temp
C:\system\temp
C:/temp
/tmp
/
```

環境変数を参照できなかったか、無効だった場合、SYS:/temp以下を探し、すべてのディレクトリが見つからないと、テンポラリ作成に失敗します。
【iOS】SwiftでPullToRefreshのライブラリつくったよ

SwiftでシンプルなPullToRefreshのライブラリをつくりました。
<br>
![PullToRefreshSwift.gif](https://qiita-image-store.s3.amazonaws.com/0/48971/57671943-8caa-40b5-66e0-eba97d08ea05.gif)

<br>
  
##使い方
使い方は簡単です。
pullToRefreshを追加したい、UIViewControllerのviewDidLoadなどでUIScrollViewのaddPullToRefreshwを呼び出すだけです。
※UIScrollViewのextensionで拡張しています

```swift
  override func viewDidLoad() {

        ...

        self.tableView.addPullToRefresh({ () -> () in
            // refresh code

            self.tableView.reloadData()
            self.tableView.stopPullToRefresh()
        })
  }

```
  
  
最初は文字も設定できるようにしたんですが、
シンプルな方がいいかなと思いまして、
上記のような感じにしました（UIRefreshControlぽく）。
<br>
PullToRefreshの高さ、画像と背景色を変更したい場合は`PullToRefreshConst`クラスを変更してください。  
  

```swift
struct PullToRefreshConst {
    static let backgroundColor = UIColor(red: 236/255, green: 240/255, blue: 241/255, alpha: 1.0)
    static let imageName: String = "pulltorefresharrow.png"
    static let height: CGFloat = 80
    static let duration: Double = 0.5
    static let tag = 810

}
```

<br>

### Sorce Code
[dekatotoro/PullToRefreshSwift · GitHub](https://github.com/dekatotoro/PullToRefreshSwift)

今後カスタマイズ性の改善やリファクタリングしていく予定です。 

ぜひFeedBackお願いしますm(- -)m
mbstring.internal_encodingがno valueの時のmb_substrの挙動について



今日あったトラブルなんですがこんな感じのコードです。

``` tests/string.php
<?php
require "vendor/autoload.php";

class StringTest extends \PHPUnit_Framework_TestCase
{
  /**
   * @test
   */
  public function 文字数が50文字以上の場合は50文字で切ることができる()
  {
      $str = "犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬";
      $actual = mb_substr($str,0,50);
      $this->assertEquals(50, mb_strlen($actual),'文字数が正しくない');
  }
}

```

まあこれはテスト通るんですが、実は出力してみるとおかしくなるんですよね。


``` test.php
<?php

$str = "犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬";
echo mb_substr($str,0,50)."\n";
```

これの出力結果が以下の通りです

```
$php test.php
犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬�
```

文字がぶっ壊れてしまいましたね。
で、phpマニュアルにると、mb_substrの4番目の引数にエンコーディングの設定があります。
デフォルト値が`mb_internal_encoding() `となっていたので、mb_internal_encodingの値を確認してみましょう。

```
$ php -i | grep mbstring.internal_encoding
mbstring.internal_encoding => no value => no value
```

どうやら`no value`になっていたのが原因みたいです。
UTF-8として認識されていなかったのぽいので、文字がぶっ壊れたと思います。

試しに`echo mb_internal_encoding()`;ってやってみたら`ISO-8859-1`って出てきました。
~~これmacな環境だからですかね？~~

[コメント](#comment-a1117ffe22dbc11a876c)で教えていただきましたが、どうやらOS依存ではなくて、PHP5.5だとデフォルトが`ISO-8859-1`になるようです。


## 対応策
まあどの環境でもUTF-8でコードを書いてたならUTF-8で動くようにしなきゃいけませんよね。
考えられる対応策は3つありますね。

1. 毎回引数に文字コードを明示的にしていする
1. スクリプトの中で`mb_internal_encoding() `を指定する
1. php.iniで設定


大体こんな感じだと思います。
まあこの辺はプロジェクトとかスクリプトが使われる状況によって変わって来ると思います。

まあiniで設定するのが一番良さそうですが、どうなんすかね。
とりあえず今回は引数指定で、修正してみました。

``` test.php
<?php

$str = "犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬";
echo mb_substr($str,0,50,'utf-8')."\n";

```


しかしmb_strlenはなぜ50文字って取得できたのか。。。
まあmb_strlenもエンコード指定してなかったからですね。これがmb_strlenだけにutf-8指定してたらちゃんとエラーになりますね。

``` test/string2.php

<?php
require "vendor/autoload.php";

class StringTest extends \PHPUnit_Framework_TestCase
{
  /**
   * @test
   */
  public function 文字数が50文字以上の場合は50文字で切ることができる()
  {
      $str = "犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬犬";
      $actual = mb_substr($str,0,50);
      $this->assertEquals(50, mb_strlen($actual,'UTF-8'),'文字数が正しくない');
  }
}
```


## まとめ

mb_~系のメソッドは大体文字コードの指定があるのでちゃんとinternal_encodingエンコーディングを設定しましょう。もしくは引数を必ず書きましょう。
Ruby: pry の起動時に色付きバナーを出すスクリプト

#pry 用バナー
pry の起動時に色付きバナーを出すスクリプトです。(irb でも動作します)
バナーはスクロールアップしながら表示されます。

![color-banner.gif](https://qiita-image-store.s3.amazonaws.com/0/60624/6ac32ff3-4c3e-5fd8-917f-79106eb64f0b.gif)

バナーは RUBY のバージョンによって色を変えています。

- 2.3 の場合 : 黄色 (※未確認...ruby2.3 がでたらチェックしてみます)
- 2.2 の場合 : 水色 (※未確認...ruby2.2 がでたらチェックしてみます)
- 2.1 の場合 : 赤 (上の画像)
- 2.0 の場合 : 青 (下の画像)
- 1.9 の場合 : マゼンタ
- 1.8 の場合 : 緑

(※下の画像はスクリプト単体で起動したところです)

![ruby20.png](https://qiita-image-store.s3.amazonaws.com/0/60624/1de2614e-cac0-f92e-d8f9-90e23152f6bd.png)



 


## 使い方
 1. 下のスクリプト 'banner.rb' を $RUBYLIB で指定されるディレクトリに置きます。
 2. ~/.pryrc または ~/.irbrc に以下の１行を追加します。

```rb
require 'banner'
```
以上です。

```rb:banner.rb
#!/usr/bin/env ruby

instance_eval do
  #
  # configuration
  #
  version_color = RUBY_VERSION >= '2.3' ? :YELLOW  :
                  RUBY_VERSION >= '2.2' ? :CYAN    :
                  RUBY_VERSION >= '2.1' ? :RED     :
                  RUBY_VERSION >= '2.0' ? :BLUE    :
                  RUBY_VERSION >= '1.9' ? :MAGENTA :
                  RUBY_VERSION >= '1.8' ? :GREEN   : false

  #
  # procedure
  #
  seq = proc {|n| $stdout.isatty ? "\e[#{n}m" : "" }

  color = proc do |s|
    n = {
      :BLACK    => 30,
      :RED      => 31,
      :GREEN    => 32,
      :YELLOW   => 33,
      :BLUE     => 34,
      :MAGENTA  => 35,
      :CYAN     => 36,
      :WHITE    => 37,
    }[version_color]

    "#{seq[n]}#{s}#{seq[0]}"
  end

  cls  = "\e[2J"
  move = proc {|y| "\e[#{y}H" }

  #
  # banner / description
  #
  banner = <<-'BANNER_DEFAULT'
      ######  #     # ######  #     #
      #     # #     # #     #  #   #
      #     # #     # #     #   # #
      ######  #     # ######     #
      #   #   #     # #     #    #
      #    #  #     # #     #    #
      #     #  #####  ######     #
  BANNER_DEFAULT

  descr = <<-DESCR
  #{RUBY_DESCRIPTION.sub(/\Aruby \S+/){ color[$&] }}
  #{RUBY_COPYRIGHT}
  DESCR

  #
  # print banner
  #
  if $stdout.isatty
    lines = banner.split $/
    top = 2

    [*0...lines.size].reverse.each_with_index do |y, i|
      puts cls
      puts move[top + y             ] + color[lines[0..i] * $/]
      puts move[top + lines.size + 1] + descr
      puts

      sleep 0.1
    end

  else
    puts $/ + banner + $/ + descr + $/

  end
end

# vim:set ts=2 sw=2 et:
```

# Gem化
(※2014.12.14追記)
このスクリプトを Gem 化しました。
Gem版は名前が変更されています。また、モジュール化されています。

```
$ gem install color_banner
```

使い方も異なります。
[使い方] ~/.pryrc に以下の行を追加する

```
require 'color_banner'
ColorBanner.banner
```

- [GitHub](https://github.com/lnznt/color_banner ColorBanner)
- [RubyGems](https://rubygems.org/gems/color_banner)

今後は Gem 化版をメインに保守するつもりです。
Android2.3でLayoutParamsのsetMarginが効かない場合の対処法


Gravityを設定しないと効かないようです！かなりハマりました！！

```java
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)hogeView.getLayoutParams();
params.setMargins(leftMargin, topMargin, rightMargin, bottomMargin);
showZoneViewLayoutParams.gravity = Gravity.NO_GRAVITY; //ココがないとダメ！！

hogeView.setLayoutParams(params);
```
jacksonを使ってjsonにシリアライズする

# 最初に

シリアライズでも少しハマったから書く。

# シリアライズのやりかた

ObjectMapper#writeValueAsStringを使う。
Stringにしか変換できない。ObjectNodeに変換しようとすると一手間かかる。

```java
String mapper = new ObjectMapper().writeValueAsString(test);
```

# 引っかかる

やっぱりなんかハマる。

## オブジェクトのメンバがprivate変数だと取れない

そんなんらしい。ちなみに↓みたいなエラーが出る。

    RuntimeException: org.codehaus.jackson.map.JsonMappingException: No serializer found for class

補足:
publicな変数にするか、getter/setterを書けば問題なく通る。

## annotation入れてるとエラーが出ないことがある

例えばデシリアライズに使ったJsonIgnorePropertiesをtrueにしてると空のデータが返ってくるだけ、とか言う状態になる。

```java
    @JsonIgnoreProperties(ignoreUnknown=true)
```

補足:
この設定を入れないとフィールドの削減を行った際にエラーになってしまうため、使いようによってはマストになる設定ではあるが、初期開発時にはトラブルの元になるので十分注意すること。

# つまり

jsonでやりとりする可能性のあるオブジェクトはメンバをpublicな変数として記述するか、独自でtoJson()メソッドを定義するとかしないといけない(多分)。
ObjectNodeで色々やりたい場合はそっちの方がいいのかもしれない。
PharoLauncherメモ

PharoLauncher
---
VMやイメージの管理ができる。[inriaのCIサーバ](https://ci.inria.fr/)でCIしているイメージをブラウズしてロードできたりして便利。

インストール
---
プロジェクトホームは[smalltalkhub上のここ](http://www.smalltalkhub.com/#!/~Pharo/PharoLauncher)。
ConfigurationBrowserでPharoLauncherをロードする。
stableがついてないようなので、Load Configurationして、適当なワークスペースを開いて
```ConfigurationOfPharoLauncher load```
する。そして
```PharoLauncher open```
で Pharo Launcher が立ち上がる。

使ってみる
---
Roassal3Dの最新ビルドをダウンロードする。
そして左側（ローカル）にリストされる。
![スクリーンショット 2014-12-11 18.56.54.png](https://qiita-image-store.s3.amazonaws.com/0/59918/521dd26e-404c-6066-f9a7-0a155248b659.png)
そしてLaunchする。
![スクリーンショット 2014-12-11 18.59.42.png](https://qiita-image-store.s3.amazonaws.com/0/59918/83b06dec-87a8-a9e9-eba4-b1b101f41120.png)
すると、PharoLauncherが動いているほうのイメージが保存終了し、Roassal3D最新ビルドのイメージが立ち上がる。
Jenkins の Windows スレーブノードをサービスとして起動する際、ユーザー名を正しく指定する


　`管理者のユーザー名` の欄に, ユーザー名の先頭に `.\` を付けて入力すればいい.
　例えば下の画像のように入力する (`ホスト` の IP はダミー).

![good.png](https://qiita-image-store.s3.amazonaws.com/0/49610/122211cb-6190-e6ee-a6a2-f4ca7af11781.png "good.png")

ユーザー名の先頭に `.\` を付けなかった場合, 以下のようなログが出てスレーブの起動に失敗する.

```
192.168.123.45 に接続します。
Checking if Java exists
java -version の戻り値は 1.8.0です。
Jenkinsのスレーブをサービスとしてインストールします。
jenkins-slave.exeをコピーします。
slave.jarをコピーします。
jenkins-slave.xmlをコピーします。
サービスを再起動します。
ERROR: Failed to create a service: Status Invalid Service Account
```
Rubyの行末

タイトルは「ルビーのゆくすえ」じゃなくて「ルビーのぎょうまつ」デス。

文字列末尾に改行がある場合と無い場合とでどのような違いがあるか注意しよう。

文字列 `"abc\ndef"` と `abc\ndef\n"` はいずれも二つの行からなる。このことは

```rb
"abc\ndef".each_line.to_a #=> ["abc\n", "def"]
"abc\ndef\n".each_line.to_a #=> ["abc\n", "def\n"]
```

によって分かる。とくに意外な点はない。

ところで，正規表現の `$` というアンカーは，行末にマッチするものだよね。
この「行末」というのは，さきほど確認した「行」という部分文字列の「末尾」とは限らず，もし改行があった場合は改行の直前になる。

このことは

```rb
"abc\ndef".gsub(/$/, "!") #=> "abc!\ndef!"
```

によって確認できる。
ここまでは，正規表現使いにとって常識の範囲だ。

ところが，文字列末尾に改行があると，

```rb
"abc\ndef\n".gsub(/$/, "!") #=> "abc!\ndef!\n!"
```

のようになる。
ちょっと意外な感じがしないか。最後の改行のあとにもマッチするだって？　2行からなる文字列に行末が三つもあるわけ？

ある人はこう思うかもしれない：

> 文字列末尾に改行がある場合は，そのあとに「空行」があるとみなされるんじゃないの。

この見方が当たっていないことは，

```rb
"abc\ndef\n".gsub(/^/, "_") #=> "_abc\n_def\n"
```

によって分かる。もし空行があるとみなされるのなら，`"_abc\n_def\n_"` になるはずだ。

結局，`$` は「行末および文字列末尾にマッチする」と考えたほうがよさそうだ。
リファレンスマニュアルでは `$` について

> 行末にマッチします。行末とは文字列の末尾もしくは改行の手前を意味します。

と書いてある。さきほど書いたのと表現は違うし，「行末」を違う意味で使っているし，each_line の振る舞いから見える「行」の概念との整合性が疑われるけど，実質同じことを言っている。

なお，以上は Ruby の正規表現がそういう仕様だということであって，他の正規表現ツールでは必ずしもこうではない。