OmniAICreator/Qiita-1.07M huggingface dataset:
OpenVz上のCentOS7でNFSサーバを動かせた

[unfsd](http://qiita.com/tukiyo3/items/668f15df364e6d91553a)がCentOS7用のがない、srpmからビルドも成功しないということで絶望していたが、[NFS server inside container - OpenVZ Linux Containers Wiki](http://wiki.openvz.org/NFS_server_inside_container)の手順で出来た。

## ホスト側の作業

コンテナを一度停止しないと有効になりません。

```bash:ホスト側にて実行
vzctl set $CONTAINERID --feature nfsd:on --save
```

もしくは直接記述

```diff:/etc/pve/openvz/374.conf
+ FEATURES="nfsd:on"
```

## コンテナ側の作業

```bash:
yum install nfs-utils
```

* [NFS server inside container - OpenVZ Linux Containers Wiki](http://wiki.openvz.org/NFS_server_inside_container)には`/etc/sysconfig/nfs`に追記するようにあったが、何も変更せずに行けました。

```diff:/etc/exports
/var/log/  192.168.100.0/24(ro,no_subtree_check)
```

```bash:反映と確認
exportfs -rav
```

## 他のサーバからNFSマウントできることを確認

```bash:
mount -t nfs コンテナのIP:/var/log /mnt/
```


# nfsオプションを有効にしていると稼働中のバックアップできないっぽい

```bash:
INFO: suspend vm
INFO: Setting up checkpoint...
INFO: 	suspend...
INFO: Can not suspend container: Invalid argument
INFO: Error: unsupported fs type nfsd
INFO: Checkpointing failed
ERROR: Backup of VM 318 failed - command 'vzctl --skiplock chkpnt 318 --suspend' failed: exit code 16
INFO: Backup job finished with errors
TASK ERROR: job errors
```
CentOS7にfluentdをインストール

rpmの提供はまだされていない。

## 参考

* [Treasure Data Packages](http://packages.treasuredata.com/)
* [Ruby GemからFluentdをインストールする | Fluentd](http://docs.fluentd.org/ja/articles/install-by-gem)

# gemでインストール

```bash:インストール
yum groupinstall "Development Tools"
yum install ruby-devel
gem install fluentd --no-ri --no-rdoc
```

* `/usr/local/bin/fluent` が生成される。

## 動作確認

```bash:動作確認(/opt/fluent/fluent.confに設定ファイルを置く場合)
fluentd --setup /opt/fluent
fluentd -vv &
echo '{"json":"message"}' | fluent-cat debug.test
```

```bash:動作確認(/opt/fluent/fluent.confに設定ファイルを置く場合)
fluentd --setup /opt/fluent
fluentd -c /opt/fluent/fluent.conf -vv &
echo '{"json":"message"}' | fluent-cat debug.test
```

## OS起動時に常駐させる

```bash:crontab&nbsp;-e
@reboot fluentd -vv &
```

# gemでインストール済みのファイル郡だけを使う

```bash:
git clone -b docker-lampp https://github.com/tukiyo/setup_centos7.git
tar xzf setup_centos7/files/fluentd-0.10.55.tar.gz \
  -C /root/
export PATH=$PATH:$HOME/.gem/ruby/bin/
```


# gemでインストールその2

```bash:
docker run -it -d --name centos7 tukiyo3/centos7-devel
docker exec centos7 bash

gem install --user-install fluentd --no-ri --no-rdoc
export PATH=$PATH:$HOME/.gem/ruby/bin/
```
CentOS7にphp5.6をAnsibleを使ってインストール

参考: [【CentOS7】にPHP5.6をインストールする。](http://note.onichannn.net/archives/2774)

* remi,remi-php56リポジトリを有効にする。
* php56-phpというパッケージがあるが、これを使うと`/opt/remi/php56/root/`にインストールされるため注意！！

## playbook

* https://github.com/tukiyo/setup_centos7 から抜粋

```yml:tasks/main.yml
- name: install php
  yum: pkg={{ item }} state=installed enablerepo=remi,remi-php56
  with_items:
    - php
    - php-devel
    - php-mysqlnd
    - php-mbstring
    - php-gd
    - php-cli
    - php-dbg
    - php-pecl-xdebug
    - php-pear
    - php-pecl-mailparse
  notify:
    - restart httpd
```

```yml:handlers/main.yml
---
- name: restart httpd
  service: name=httpd state=restarted
```
さくらサーバでのfilter_input(INPUT_SERVERの挙動が・・

ブログみたいに使ってすみませんｗ

元請けが好きなのでさくらサーバのスタンダードをよく使います。
そのくせに最近まで（昨日までｗ）気がつかなかったのことがあったので書いておこうかと。

私はさくらでPHPを使うと今の標準が5.4なんでfilter_inputを普段GETとかPOSTとかには使ってるんです。
ですがなぜか`$_SERVER`はベタに書いてたので、ふとfilter_inputを使ってみようとか思ったって話です。
（本当はIDEとしてNetBeansを使ってまして「$_SERVERを直接書くな！！フィルタしろ！！」って文句言われるからうっとうしいなぁと思ったのが元なんですがｗ）

それはさておき、よくフォームとかでサブミットされた次のページで基本的なチェックとして

```php
if($_SERVER["REQUEST_METHOD"] == "POST")
```

とかってやると思うんですね。
要するにアドレス直打ちの最低限防止みたいな。
これをフィルタしてみようと思い、

```php
if(filter_input(INPUT_SERVER,"REQUEST_METHOD") == "POST"){
   ***A***
}else{
   ***B***
}
```
みたいなのを書いた訳です。
最初はローカルPCのXAMPPで動作確認してOKと。
ではさくらサーバにアップして・・・あれ？Bに行っちゃう・・・

おかしいなと思ってコード書いてアップしてみたらさくらサーバではINPUT_SERVERは無視する？
REMOTE_ADDRとかHTTP_REFERERとかすべて空白で返ってきてしまう・・・

Googleでも調べてみましたが特に書いてる人もいなさそう？
INPUT_SESSIONが動作しないのはPHP自体の話でマニュアルにもあるので理解出来るんですが（NetBeansは文句言いますがｗ）

まぁ直書きすれば解決するんで大きくは問題にならないんですが、どなたか解決法とまで行かなくとも原因とかわかりませんかね？
個人的に気持ち悪いだけなんですがｗ
IPv6ネットワーク経由で外部のMongoDBに接続する


バックエンドのDBにもグローバルIPv4を振っていたので、せっかくIPv6は潤沢にあるし使ってみようということでIPv6に変更しました。
MongoDBはデフォルトでIPv6が無効になっているらしいので有効にします。

- OS
 - Ubuntu 14.04
- MongoDB
 - 2.6.5

#設定
`mongod.conf`でIPv6を有効にするオプションを書く必要があります。
`ipv6 = true`が有効化のオプションです（多分）。
さらに、デフォルトだと`bind_ip = 127.0.0.1`となっていて外部から利用できないのでlistenしたいIPアドレスを書きます。
もしくはどのインタフェースでもlistenするのであれば`bind_ip`の行をコメントアウトしてもよいです。
設定を変えたらあとは再起動するだけです。


```shell-session
# vim /etc/mongod.conf
logpath=/var/log/mongodb/mongod.log
logappend=true
port = 27017
+ ipv6 = true
# service mongod restart
Restarting database: mongod.
```

これで使えるはず、と思って外部からアクセスしてみたのですが、一向に利用できませんでした。

```console
# lsof -i:27017
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mongod  8434 mongodb    8u  IPv4  12214      0t0  TCP *:27017 (LISTEN)
mongod  8434 mongodb   11u  IPv6  12215      0t0  TCP *:27017 (LISTEN)
```

うーんやはり全インタフェースできちんと`LISTEN`になっている。
と少し悩んで、iptablesが原因であることに気づきました。
IPv6なのでip6tablesですね。
この27017番ポートを開放します。

```console
$ ip6tables -A INPUT -p tcp --dport 27017 -j ACCEPT
```

これで外部から利用できるはずです。

#クライアントのコマンド
余談ですが、クライアント側のコマンドも`--ipv6`を付けないとIPv6でアクセスしてくれません。
IPv6のアドレスと書いているところは適当に読み替えて下さい。

```consolen
$ mongo IPv6のアドレス:27017/test
MongoDB shell version: 2.4.9
connecting to: IPv6のアドレス:27017/test
Thu Oct 23 02:48:09.538 getaddrinfo("IPv6のアドレス") failed: Address family for hostname not supported
Thu Oct 23 02:48:09.539 Error: couldn't connect to server IPv6のアドレス:27017 at src/mongo/shell/mongo.js:147
$ mongo IPv6のアドレス:27017/test --ipv6
MongoDB shell version: 2.4.9
connecting to: IPv6のアドレス:27017/test
>
```
MySQLのEXPLAIN

クエリを最適化するということは、

・書き換える前と後でクエリの実行結果が同じになる
・EXPLAINがよりよい実行結果を表示する

クエリの実行計画を調べるためには、
SELECT文の先頭に「EXPLAIN」をつけて実行する

##フィールド

###id/select_type

クエリの種類を表すもの。
クエリの種類とはJOIN、サブクエリ、UNIONおよびそれらの組み合わせのことで、
select_typeの内容もその組み合わせから導き出されたものである。


####JOINの場合

MySQLが実行できるJOINの種類は「Nested Look Join(NLJ)」の一種類しかない。
テーブルを一つずつ順に処理していく方式のこと。

クエリがJOINだけから構成される場合、select_typeは「SIMPLE」と表示される。
SIMPLEではidが全て同じ値になる。

EXPLAINの出力の順序がどのテーブルから処理するかということを反映している。

####サブクエリの場合

サブクエリがカラムとselect_typeには以下の5種類のうちいずれかが表示される。

・PRIMARY・・・外部クエリを示す
・SUBQUERY・・・相関関係のないサブクエリ
・DEPENDENT SUBQUERY・・・相関関係のあるサブクエリ
・UNCACHEABLE SUBQUERY・・・実行する度に結果が変わる可能性のあるサブクエリ
・DERIVED・・・FROM句で用いられているサブクエリ


DERIVEDの場合、サブクエリ→外部クエリの順番でクエリが実行
それ以外の場合は外部クエリ→サブクエリの順番でクエリが実行

サブクエリの場合、外部クエリとサブクエリでは別々のidがつけられる

####UNIONの場合

###table

アクセスする対象のテーブル

###type

対象のテーブルに対してどのような方法でアクセスするかを示す
致命的なクエリはこのフィールドを見れば一目でわかるので重要なフィールド

###possible_keys

オプティマイザがテーブルのアクセスに利用可能なインデックスの候補として挙げたキーの一覧

###key

オプティマイザによって選択されたキー。

###key_len

選択されたキーの長さ。
インデックスの走査は、キー長が短い方が高速。
インデックスをつけるカラムを選ぶときにはそのことを念頭に置いておく。

###ref

検索条件で、keyと比較されている値やカラムの種類。
定数が指定されている場合はconstと表示される。

###rows

そのテーブルからフェッチされる見積もり

###EXtra

そのクエリを実行するためにオプティマイザがどのような戦略を選択したか
ということを示すフィールドで、重要。


・Using where・・・頻繁に出力される追加情報である。WHERE句に検索条件が指定されており、なおかつインデックスを見ただけではWHERE句の条件を全て適用することが出来ない場合に表示される。

・Using index・・・クエリがインデックスだけを用いて解決できることを示す。Covering Indexを利用している場合などに表示される。

・Using filesort・・・filesort（クイックソート）でソートを行っていることを示す。

・Using filesortについては先日詳しく説明したので参照されたい。

・Using temporary・・・JOINの結果をソートしたり、DISTINCTによる重複の排除を行う場合など、クエリの実行にテンポラリテーブルが必要なことを示す。

・Using index for group-by・・・MIN()/MAX()がGROUP BY句と併用されているとき、クエリがインデックスだけを用いて解決できることを示す。

・Range checked for each record (index map: N)・・・JOINにおいてrangeまたはindex_mergeが利用される場合に表示される。

・Not exists・・・LEFT JOINにおいて、左側のテーブルからフェッチされた行にマッチする行が右側のテーブルに存在しない場合、右側のテーブルはNULLとなるが、右側のテーブルがNOT NULLとして定義されたフィールドでJOINされている場合にはマッチしない行を探せば良い・・・ということを示す。

####ref

http://nippondanji.blogspot.jp/2009/03/mysqlexplain.html
バージョンを指定してrails newする方法


バージョンを指定してRailsをインストール、アプリ作成する方法
Rails Tutorialで初めてやって、忘れそうなのでメモ

```
$ gem install rails -v version
$ rails _version_ new app_name
```

- `-v, --version` バージョンを指定してGemをインストールする


以下、実例

```
$ gem install rails -v 4.2.0.beta2
$ rails _4.2.0.beta2_ new hello_app
```
EC2にvsftpをセッティングする際のハマリポイント

EC2にvsftpインストールする際、Security Groupの設定ではまったのでメモ

## インストール

vsftpをインストール

```
$ sudo yum install vsftp
```

次に空のポートを確認

````
$ cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000
````

で、vsftp.confを編集

```
$ vi /etc/vsftpd/vsftpd.conf
```

|分類|    内容                         | 意味|
|:--:|:-------------------------------:|:---:|
|修正|    anonymous_enable=NO          | 匿名ユーザーのログインは許可しない。|
|修正|    dirmessage_enable=NO         | ユーザが新しいディレクトリに初めて移動したとしてもメッセージは表示しない。|
|修正|    ascii_upload_enable=YES      | アスキーモードのアップロードを有効にする。|
|修正|    ascii_download_enable=YES    | アスキーモードのダウンロードを有効にする。|
|修正|    chroot_local_user=YES        | ローカルユーザーのルートを各自のホームに変更する。|
|修正|    chroot_list_enable=YES       | chroot_listを有効にする。ファイルはデフォルト（chroot_list_file=/etc/vsftpd/chroot_list）になる。|
|修正|    tcp_wrappers=NO              | ホストへのアクセスを制御しない。（EC2のSecurity Groupsで設定する方がよい）|
|修正|    connect_from_port_20=NO      | ActiveFTPを無効にする。|
|修正|    xferlog_std_format=NO        | wu-ftpdではなく，vsftpdログ形式でログを記録する。|
|追加|    pasv_enable=YES              | PASV FTPを有効にする。|
|追加|    pasv_addr_resolve=YES        | PASVモード接続先IPアドレスをホスト名から取得する。|
|追加|    pasv_address=固定IP          | Elestic IPを設定する。（インスタンスのPublic DNSを指定するとPASVモードでの接続はできない。バージョン2.0.4以降であれば、IPが固定でなくても pasv_addressにDDNSを書くことで動的なIPに対応できる。）|
|追加|    pasv_min_port=60001          | PASVモード接続時の最小ポート番号を設定する。（確認した空きポートの範囲で設定）|
|追加|    pasv_max_port=60010          | PASVモード接続時の最大ポート番号を設定する。（確認した空きポートの範囲で設定）|
|追加|    use_localtime=YES            | ローカルタイムを使用する。（デフォルトはGMT）|
|追加|    force_dot_files=YES          | .（ドット）で始まるファイルを隠さない。|

ルートディレクトリにアクセス出来るユーザーを設定します。

```
$ vi /etc/vsftpd/chroot_list
```

ユーザーを追加します。

```
$ adduser [ユーザー名]
$ passwd [パスワード]
```

サービスを起動

````
$ service vsftpd start
$ chkconfig vsftpd on
````

## Security Groupの設定
ここでハマりました。。。。。。。
以下の値をEC2のSecurity Groupに追加します。

**TCP**

|Type            |Protocol| PortRange    | Source    |
|:---------------|:------:|:------------:|:---------:|
|Custom TCP Rule |TCP     | 21           | 0.0.0.0/0 |
|Custom TCP Rule |TCP     | 60000 - 60010| 0.0.0.0/0 |

60000 - 60010　PortRangeを指定する際は単純にハイフン区切りでok.

以上


# 追記
アクティブモードでは接続出来るが、パッシブモードでは接続出来なくてかなりハマっていた。
EC2の場合、`pasv_address `にグローバルIPを指定しないといけなかったぽい。
以下の記事を参考にしたらすんなり解決した！！あざす！！

* [Amazon EC2 (Amazon Linux) での vsftpd インストールと設定](http://blog.genies.jp/2011/07/amazon-ec2-amazon-linux-vsftpd.html)
* [Amazon Linuxにvsftpをセットアップする方法](http://promamo.com/?p=3067)
* [AWSAWSでFTPサーバー立てる時に気をつけるべき2つのこと＋α](http://dev.classmethod.jp/cloud/aws/to-be-aware-of-when-settingup-ftpserver-with-aws/)

# 余談
本稿とは全く関係ないが、今回参考にさせて頂いたブログの別記事「[独習のしかた](http://promamo.com/?page_id=3373)」
の考え方がかなり勉強になった。アウトプットの重要さをひしひしと感じた。

車輪の再発明は大事..
package.json の dependencies の git:// が動かない

# 問題

@bouzuya の Hubot スクリプトは `git://` でインストールすることを推奨している (例: https://github.com/bouzuya/hubot-twada ) 。しかし、最近それらがうまく機能せず、`package.json` の `dependencies` に `git://` な url を指定しても `npm install` で失敗することがある。

以前はそんなことなかったのだけれど、ここ数日ひどい。ちなみに発生するエラーは以下のようなもの。

```
npm ERR! git fetch -a origin (git://github.com/bouzuya/hubot-randict.git) fatal: unable to connect to github.com:
npm ERR! git fetch -a origin (git://github.com/bouzuya/hubot-randict.git) github.com: Name or service not known
npm ERR! git fetch -a origin (git://github.com/bouzuya/hubot-hatena-bookmark-hotentry.git) fatal: unable to connect to github.com:
npm ERR! git fetch -a origin (git://github.com/bouzuya/hubot-hatena-bookmark-hotentry.git) github.com: Name or service not known
```

なぜか名前解決に失敗したようなエラーが出る (ネットワークに問題があるわけではない) 。

# 解決策

`git://` を使わず、`.tar.gz` を使う。

GitHub は tag (releases) や master に対して archive url (.tar.gz) が提供されるので、それを使う。

## before

```
"hubot-bbn-tags": "git://github.com/bouzuya/hubot-bbn-tags.git#1.0.0"
```

## after
    
```
"hubot-bbn-tags": "https://github.com/bouzuya/hubot-bbn-tags/archive/1.0.0.tar.gz"
```

単純置換なので簡単に移行できるし、エラーも現状起きていないようだ。`npm install` の時間も短縮できるのでなかなか良い。

# その他

もっと良い対策 (根本的なもの) あると思うのだけど、とりあえず動き、気になる問題もないのでシェア。
case文でProc#curryを使うと便利かもしれない

RubyのProcクラスはとても便利なのですが、最近このクラスにcurryというメソッドがあるのを知りました。

```rb
a = -> (x, y, z) {(x||0) + (y||0) + (z||0) }
p a.curry[1][2][3]
#=> 6
```

例えば「１からnの連続した数字を列挙する。ただし、３で割れるならFizz、５で割れるならBuzzと数字の代わりに表示する」という動作をさせたいとします

```実装1.rb
def fizzbuzz(num)
  (1..num).map do |n|
    case
    when n % 3 == 0 then 'Fizz'
    when n % 5 == 0 then 'Buzz'
    else n
    end
  end.join(' ')
end

# 普通はこんなふうには書かないが、あえてProcを使う
def fizzbuzz_v2(num)
  (1..num).map do |n|
    factor = ->(y){ n % y == 0 }
    if factor === 3 # factor[3] や factor.call(3)と同じ
      'Fizz'
    elsif factor === 5
      'Buzz'
    else
      n
    end
  end.join(' ')
end

puts fizzbuzz 30
#=> "1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 Fizz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 Fizz
puts fizzbuzz_v2 30
#=> "1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 Fizz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 Fizz
```

これは Proc#curryで書くと少しだけDRYになります。

```実装2.rb
def fizzbuzz(num)
  # factor[y][x]で、yがxで割り切れるかの判定をtrue/falseで返す
  factor = ->(y, x){ x % y == 0 }.curry

  (1..num).map do |n|
    case n
    when factor[3] then 'Fizz' # factor[3][n] の判定
    when factor[5] then 'Buzz'
    else n
    end
  end.join(' ')
end

puts fizzbuzz 30
#=> "1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 Fizz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 Fizz"

```

factorの中身がもう少し複雑になると、caseで同じような条件をいくつか判定する際に有り難みが出てきそうな気がしますね。

リファレンスを見てみると、可変長引数の場合は以下のような使い方も出来るよということです

```rb
# 引数を合算する　ex) sum[1,20,300] #=> 321
sum = ->(*args){args.inject(:+)}

sum_c = sum.curry
sum_c[1][2][3]
# 最初のsum_c[1]で数値が帰ってくるので、意図した動きにならない

# 可変長引数の長さを３と固定してしまう
sum_c3 = sum.curry(3)
sum_c3[1][2] #=> <Proc:0x007f0a484f5958 (lambda)>
             #引数を２つしかもらってないので、まだProcオブジェクト
sum_c3[1][2][3] #=> 6

# こういう書き方でもOK.
sum_c3[1,2][3] # caseで使うときは、この書き方を使えそう？
sum_c3[1][2,3]
sum_c3[1,2,3]

```

今回は`->`を使いましたが`lambda` `proc` `Proc.new`あたりでも同じように使えます。あんまり使い分けたことがない…


# 参考

* [class Proc - Ruby 2.1.0 リファレンスマニュアル](http://docs.ruby-lang.org/ja/2.1.0/class/Proc.html)
* [Rubyのcaseを〇〇(言語名)のswitch文だと思っている人たちにぼくから一言ガツンと申し上げたい - hp12c](http://melborne.github.io/2013/02/25/i-wanna-say-something-about-rubys-case/)
素のGoでプロミスキャスモード

#素のGoでプロミスキャスモード
##なにこれ
ネットワークに流れているデータを垂れ流すサンプルです。
もともとネトゲの通信データを解析する目的で作っていたものの残骸になります。
パケットモニタリングツールのひな形にどうぞ。

##ソース

```go:unko.go
package main

import (
	"bytes"
	"log"
	"net"
	"syscall"
	"unsafe"
)

func main() {
	// WSA開始
	var wsadata syscall.WSAData
	if err := syscall.WSAStartup(0x202, &wsadata); err != nil {
		log.Fatal(err)
	}
	// ソケット取得
	sock, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_RAW, syscall.IPPROTO_IP)
	if err != nil {
		log.Fatal(err)
	}

	// アドレスの取得
	ip := net.IPv4(0, 0, 0, 0).To4()
	if list, err := net.InterfaceAddrs(); err == nil {
		for _, it := range list {
			log.Print(it)
			ipslice := net.ParseIP(it.String()).To4()
			if !bytes.Equal(ipslice, ip) {
				ip = ipslice
				break
			}
		}
	}

	// bind
	sock_in := syscall.SockaddrInet4{Port: 0}
	copy(sock_in.Addr[:], ip)
	if err := syscall.Bind(sock, &sock_in); err != nil {
		log.Fatal(err)
	}

	// プロミスキャスモードの設定
	ret := uint32(0)
	rcvall := uint32(0x98000001)
	arg := uint32(1)
	if err := syscall.WSAIoctl(sock, rcvall, (*byte)(unsafe.Pointer(&arg)), 4, nil, 0, &ret, nil, 0); err != nil {
		log.Fatal(err)
	}

	// 受信待ちサーバ起動
	resultsrv := startServer()
	// 受け渡し用データ
	an := &anOp{}
	an.init()

	// 非同期設定
	if _, err := syscall.CreateIoCompletionPort(sock, resultsrv.iocp, 0, 0); err != nil {
		log.Print(err)
	}

	var buf syscall.WSABuf
	bufbuf := make([]byte, 0x10000)
	buf.Len = uint32(len(bufbuf))
	buf.Buf = (*byte)(unsafe.Pointer(&bufbuf[0]))

	for {
		var d, f uint32
		// 受信開始
		err := syscall.WSARecv(sock, &buf, 1, &d, &f, &an.o, nil)

		switch err {
		case nil:
		case syscall.ERROR_IO_PENDING:
			err = nil
		default:
			log.Print(err)
		}

		// IOが完了するまでブロック
		r := <-an.resultc

		if bufbuf[9] == 6 && r.err == nil {
			// TCP
			log.Printf("%#v", bufbuf[:r.qty])
		}
	}
}

// ここから下はほとんどgo1.1のコピペ
type ioResult struct {
	qty uint32
	err error
}
type resultSrv struct {
	iocp syscall.Handle
}
type anOp struct {
	o       syscall.Overlapped
	resultc chan ioResult
}

func (o *anOp) init() {
	o.resultc = make(chan ioResult, 1)
}

func startServer() (resultsrv *resultSrv) {
	resultsrv = new(resultSrv)
	var err error
	resultsrv.iocp, err = syscall.CreateIoCompletionPort(syscall.InvalidHandle, 0, 0, 1)
	if err != nil {
		panic("CreateIoCompletionPort: " + err.Error())
	}
	go resultsrv.Run()
	return
}

func (s *resultSrv) Run() {
	var o *syscall.Overlapped
	var key uint32
	var r ioResult
	for {
		r.err = syscall.GetQueuedCompletionStatus(s.iocp, &(r.qty), &key, &o, syscall.INFINITE)
		switch {
		case r.err == nil:
		case r.err == syscall.Errno(syscall.WAIT_TIMEOUT) && o == nil:
			panic("GetQueuedCompletionStatus timed out")
		case o == nil:
			panic("GetQueuedCompletionStatus failed " + r.err.Error())
		default:
		}
		(*anOp)(unsafe.Pointer(o)).resultc <- r
	}
}
```

##技術的なことは特に無し
[WinSock2を使用したパケットモニターの作成](http://codezine.jp/article/detail/125)等を参考にGoでプロミスキャスモードを動作させてみました。
重要な部分はGo1.1からのコピペです。
Go1.2からはネットワーク処理の多くがランタイムに隠蔽されてしまったのでコピペに使えませんでした。

##注意点
* Windows専用です。
* 管理者権限で実行しないと動きません。
* ファイアウォールの設定をしないと想像通りに動きません。
[iOS] Add Local Notifications

If you want to send local notifications for the user. You can use the `UILocalNotification`. Just like this.

```swift
var notification = UILocalNotification()
notification.fireDate = NSDate(timeIntervalSinceNow: 10)
notification.timeZone = NSTimeZone.localTimeZone()
notification.alertBody = "This is a notification!"
notification.alertAction = "Open"
notification.soundName = UILocalNotificationDefaultSoundName
UIApplication.sharedApplication().scheduleLocalNotification(notification)
```

But this is not done. May be you will get some error message in the console like this:

```
Attempting to schedule a local notification ..... with an alert but haven't received permission from the user to display alerts
```

For this, you should ask the user to permit your app to send notifications when the app lunch in the `didFinishLaunchingWithOptions` from the `AppDelegate` file.

```swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    if(UIApplication.instancesRespondToSelector(Selector("registerUserNotificationSettings:"))) {
        application.registerUserNotificationSettings( UIUserNotificationSettings(forTypes: UIUserNotificationType.Sound | UIUserNotificationType.Alert | UIUserNotificationType.Badge, categories: nil))
    }
    return true
}
```

*Tip: The notification only works when the app is in the background.*
MongoDBのREST APIの挙動について

[MongoDB HTTP Interface] (http://docs.mongodb.org/ecosystem/tools/http-interfaces/)にある通り、`mongod`は`--rest`オプション付きで起動するとRESTful HTTP APIを提供する。

これは便利なはず・・・なのだが、予想と動きが違う。

試しに`--rest`オプションをつけて起動。





```
# cp -p /etc/mongod.conf /etc/mongod.conf.orig
# vim /etc/mongod.conf
+rest=true
# service mongod start

```

何件かデータを投入したコレクションを作る。

```
> use test_db
> db.test_coll.insert({"test_key":"alpha"})
> db.test_coll.insert({"test_key":"2014"})
> db.test_coll.insert({"test_key":"beta2014"})
> db.test_coll.insert({"test_key":"2014gamma"})
> db.test_coll.insert({"test_key":2015})

```

REST APIをcurlでcallしてみる。

```bash
$ curl localhost:28017/test_db/test_coll/
{
  "offset" : 0,
  "rows": [
    { "_id" : { "$oid" : "5447b0c4baa91c44440ade8a" }, "test_key" : "alpha" } ,
    { "_id" : { "$oid" : "5447b0d6baa91c44440ade8b" }, "test_key" : "2014" } ,
    { "_id" : { "$oid" : "5447b0e4baa91c44440ade8c" }, "test_key" : "beta2014" } ,
    { "_id" : { "$oid" : "5447b0edbaa91c44440ade8d" }, "test_key" : "2014gamma" } ,
    { "_id" : { "$oid" : "5447b279465a49b060dd2d0a" }, "test_key" : 2015 }
  ],

  "total_rows" : 5 ,
  "query" : {} ,
  "millis" : 0
}

```

1,3,5つめの例はキー指定でマッチする。

```bash
$ curl localhost:28017/test_db/test_coll/?filter_test_key=alpha
{
  "offset" : 0,
  "rows": [
    { "_id" : { "$oid" : "544772746f8c26500950b3ad" }, "test_key" : "alpha" }
  ],

  "total_rows" : 1 ,
  "query" : { "test_key" : "alpha" } ,
  "millis" : 0
}

$ curl localhost:28017/test_db/test_coll/?filter_test_key=beta2014
{
  "offset" : 0,
  "rows": [
    { "_id" : { "$oid" : "5447b0e4baa91c44440ade8c" }, "test_key" : "beta2014" }
  ],

  "total_rows" : 1 ,
  "query" : { "test_key" : "beta2014" } ,
  "millis" : 0
}

$ curl localhost:28017/test_db/test_coll/?filter_test_key=2015
{
  "offset" : 0,
  "rows": [
    { "_id" : { "$oid" : "5447b279465a49b060dd2d0a" }, "test_key" : 2015 }
  ],

  "total_rows" : 1 ,
  "query" : { "test_key" : 2015 } ,
  "millis" : 0
}

```

2,4つめの例はマッチしない。

```bash
$ curl localhost:28017/test_db/test_coll/?filter_test_key=2014
{
  "offset" : 0,
  "rows": [

  ],

  "total_rows" : 0 ,
  "query" : { "test_key" : 2014 } ,
  "millis" : 0
}

$ curl localhost:28017/test_db/test_coll/?filter_test_key=2014gamma
{
  "offset" : 0,
  "rows": [

  ],

  "total_rows" : 0 ,
  "query" : { "test_key" : 2014 } ,
  "millis" : 0
}
```
queryをよくみると、2つめではクエリのキーが数値と解釈され、文字列を含むdocumentがマッチしない。さらに4つめでは`2014gamma`が途中で切れて`2014`となっている。

[How do I query for a string in MongoDB's Simple REST interface? - stackoverflow](http://stackoverflow.com/questions/16924461/how-do-i-query-for-a-string-in-mongodbs-simple-rest-interface)
によると、パラメータが数値かどうかをREST APIが判断するロジックがやや不十分なようにみえるが、MongoDB内で区別できる型がHTTPリクエストでは指定されていないので仕方ないとも考えられる。

最新の`2.6.5`でも現象を確認できた。注意を要する。

### 追記
更新、認証などは動作保証がないので、productionで使うのは非推奨、とのこと。
http://docs.mongodb.org/manual/core/security-interface/#rest-api
matplotlibで座標軸を調整する

自分で解説しようかと思いましたが、`axis`が便利すぎて特に言う事がないのでマニュアルの和訳を載せておきます。
[nbviewer](http://nbviewer.ipython.org/gist/termoshtt/934d1505bd64c0b402d9)に表示例を載せましたのでついてに見てください。

[matplotlib.pyplot.axis(*v, **kwargs)](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.axis)

Convenience method to get or set axis properties.
座標軸を設定したり設定を取得するのに便利な方法です。

Calling with no arguments:
引数無しで呼び出した場合:

```python
axis()
```

returns the current axes limits [xmin, xmax, ymin, ymax].:
現在表示している座標の最大・最小を[xmin, xmax, ymin, ymax]の形式で返します。

```python
axis(v)
```

sets the min and max of the x and y axes, with v = [xmin, xmax, ymin, ymax].:
v = [xmin, xmax, ymin, ymax]を引数として呼べはx,yの最大・最小をそれぞれ設定します。


```python
axis('off')
```

turns off the axis lines and labels.:
座標軸を非表示にします。

```python
axis('equal')
```

changes limits of x or y axis so that equal increments of x and y have the same length; a circle is circular.:
xあるいはyの上限・下限を調整して同じ座標値の増分が同じ長さになるように調整します。
円がちゃんと丸く表示されます。

```python
axis('scaled')
```

achieves the same result by changing the dimensions of the plot box instead of the axis data limits.:
(上限・下限はそのままで)表示する領域を調整する事で('equal'の場合と)同じ効果を得ます。

```python
axis('tight')
```

changes x and y axis limits such that all data is shown. If all data is already shown, it will move it to the center of the figure without modifying (xmax - xmin) or (ymax - ymin). Note this is slightly different than in MATLAB.:
全てのデータが見えるように最大・最小を変更します。もし既に見えている場合は(xmax - xmin)あるいは(ymax - ymin)を変えないように表示領域を中央に移動します。MATLABの場合と微妙に異なるので注意してください。

```python
axis('image')
```

is ‘scaled’ with the axis limits equal to the data limits.:
データの最大・最小を使用した上でさらに'scaled'の効果を得ます。

```python
axis('auto')
```

and:
と

```python
axis('normal')
```

are deprecated. They restore default behavior; axis limits are automatically scaled to make the data fit comfortably within the plot box.
は廃止予定です。これらはデフォルトの設定を回復します。データがプロット領域にうまく入るようにします。

if `len(*v)==0`, you can pass in xmin, xmax, ymin, ymax as kwargs selectively to alter just those limits without changing the others.
`len(*v)==0`の場合はxmin, xmax, ymin, ymaxを選択的にキーワード引数として与える事ができます。この時与えられなかった設定はそのままで与えた設定を反映させられます。

The xmin, xmax, ymin, ymax tuple is returned

See also

[xlim()](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.xlim), [ylim()](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.ylim)
    For setting the x- and y-limits individually.
RaspberryPiでWebカメラ

今更ながら、RaspberryPiをいじっています。
Webカメラを動作させてみました。

参考にさせてもらったサイト：[pi で遊んでみる (Webカメラ)](http://www.ahirustudio.com/gadget/rasp_pi_work2/)

* RaspberryPi B+
* Webカメラ([BUFFALO BSW13K10H](http://buffalo.jp/products/catalog/supply/multimedia/webcamera/130/bsw13k10h/))

Webカメラは、店頭で500円程度の一番安いやつ。
USB接続して、コマンドで確認。

```
$ lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 004: ID 0411:01a2 BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM Wireless LAN Adapter [Ralink RT8070]
Bus 001 Device 006: ID 1e4e:0103
```

一番下の"0103"がウェブカメラ…？

画像キャプチャのためのソフトウェアをインストールし、動作させてみる。

```
$ sudo apt-get install fswebcam
$ fswebcam ./tmp.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Adjusting resolution from 384x288 to 352x288.
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
Writing JPEG image to './tmp.jpg'.
```

![tmp.jpg](https://qiita-image-store.s3.amazonaws.com/0/53351/7a5ba79e-656d-e155-d465-d6d386633a5e.jpeg)

暗い。初期設定では露出時間が短いみたいですね。
（ウェブカメラの選択失敗したと思いました）
露出時間のオプションをつけて、撮影。

```
$ fswebcam -F 100 ./tmp.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Adjusting resolution from 384x288 to 352x288.
--- Capturing 100 frames...
Captured 100 frames in 6.56 seconds. (15 fps)
--- Processing captured image...
Writing JPEG image to './tmp.jpg'.
```

![tmp1.jpg](https://qiita-image-store.s3.amazonaws.com/0/53351/5f07a2ac-cf20-7965-285a-dfea717d1130.jpeg)

うまくピントは合っていないですが、バッチリ撮れました。
npm shrinkwrapで依存モジュールのバージョンを固定

Node.jsで作られたアプリケーションをデプロイするときに、npm shrinkwrapを使って依存モジュールのバージョンまで固定した状態でインストールする方法を紹介します。

## 背景

`npm install` で依存モジュールをインストールするとき、`package.json` で `^1.2.3` や `~1.2.3` といったバージョン指定をしているモジュールが1つでもあると、[semver](https://www.npmjs.org/doc/misc/semver.html) に従って `1.2.5` などのより新しいバージョンがインストールされる可能性があります。

セマンティックバージョンの意味からすれば、1.2.3 が互換性のある 1.2.5 に置き換わっても同じように動作すべきですが、現実問題としてテストしたバージョンと本番にデプロイされるバージョンが意図せず変わってしまうのは気持ちが悪く、依存モジュールを含めてバージョンを固定する方法を調べました。

## 実現方法

まずは `npm install` します。すると、`package.json` に従って依存関係にあるモジュールが `node_modules` 以下にインストールされます。

```console
$ cd myapp/
$ npm install
...
$ ls
node_modules/  package.json
```

次に `npm shrinkwrap` します。すると、`node_modules` にインストールされている全モジュールのバージョン情報が `npm-shrinkwrap.json` というファイルに出力されます。直接依存しているモジュールだけでなく、間接的に依存しているモジュールも含まれていることが分かります。

```console
$ npm shrinkwrap
wrote npm-shrinkwrap.json
$ ls
node_modules/  npm-shrinkwrap.json  package.json
$ cat npm-shrinkwrap.json
{
  "name": "myapp",
  "version": "0.0.1",
  "dependencies": {
    "socket.io": {
      "version": "1.1.0",
      "from": "socket.io@^1.1.0",
      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.1.0.tgz",
      "dependencies": {
        "engine.io": {
          "version": "1.4.0",
          "from": "engine.io@1.4.0",
          "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.4.0.tg
z",
          "dependencies": {
            "debug": {
              "version": "1.0.3",
              "from": "debug@1.0.3",
              "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.3.tgz",

...
```

最後に、`npm-shrinkwrap.json` がある状態で `npm install` すると、今度は `package.json` ではなく `npm-shrinkwrap.json` に記載されたバージョンに固定されて各モジュールがインストールされます。めでたし、めでたし。

```console
$ cd myapp/
$ ls
npm-shrinkwrap.json  package.json
$ npm install
```

## 補足

私は Node.js の素人なので、この方法が一般に推奨される方法なのかが分かっていません。やりたいことは「開発環境で動作確認したバージョンと同じモジュールを本番環境で動かしたい」ということで、いくつかの選択肢のうちこの方法が一番良さそうに思えたというだけです。

- 開発環境で動作確認した node_modules ごとコミットし、それをそのまま本番環境にデプロイ
    - 以前はこの方法を使っていたが、OSやアーキテクチャも違うので怪しいし、コミットするファイルも大量になってしまう
- `package.json` だけコミットし、本番環境で `npm install` する
    - 動作確認したバージョンとは異なるバージョンがインストールされることがあり、しかもバージョン違いのせいで `npm install` がコケたことがあった
- `npm-shrinkwrap.json` もコミットし、本番環境で `npm install` する
    - バージョンを固定してインストールできるので良さそう。ただし、リリース時にnpmサーバーがダウンしていたらリリースできない

もっと良い方法やデファクトな方法を知っている方がいましたら、ぜひフィードバックいただけると嬉しいです。
[CocoaPods] Podspec ファイルの一例

#やりたいこと
* spec.name を参照したい
* ViewController.mなど、プロジェクトのデフォルトファイルは除外したい
* pchファイルに書いたimportを参照したい

```spec:Example.podspec
Pod::Spec.new do |spec|
spec.name         = 'Example'
spec.source_files = "#{spec.name}/*.{h,m}"
spec.exclude_files = "#{spec.name}/AppDelegate.{h,m}", "#{spec.name}/RootViewController.{h,m}", "#{spec.name}/ViewController.{h,m}", "#{spec.name}/main.m"
spec.prefix_header_contents = '#import "CommonHeader.h"'

spec.subspec 'UIView+Sizes' do |a|
	a.source_files = "#{spec.name}/UIView+Sizes.{h,m}"
end

end
```
覚え書き(3) - 数式を取得する -

###覚え書き(3)
####数式を取得する
#####R1C1形式での取得
以下は、セル「C3」に入力された数式を取得し、隣のセル「D3」に取得した数式を文字列として代入する。

```js:Suusiki_1.js
var Excel = new ActiveXObject("Excel.Application");
Excel.Visible = true;              //Excelを表示する
var Book = Excel.Workbooks.Open("エクセルファイル名");    //既存のブックを読み込む
var Sheet = Book.Worksheets(1);     //1シート目のオブジェクトを取得

Sheet.Cells(3, 4).Value = "'" + Sheet.Cells(3, 3).FormulaR1C1;    //Cell(3,3)="C3"の式を、Cell(3,4)="D3"へ代入

WScript.Quit();
```
数式をそのまま他のセルへ代入すると、数式として解釈されるので、明示的に文字列とするために「'」（シングルクオーテーション）を付加している。

#####A1形式での取得
以下は、数式をA1形式で取得する。

```js:Suusiki_2.js
var Excel = new ActiveXObject("Excel.Application");
Excel.Visible = true;              //Excelを表示する
var Book = Excel.Workbooks.Open("エクセルファイル名");    //既存のブックを読み込む
var Sheet = Book.Worksheets(1);     //1シート目のオブジェクトを取得

Sheet.Range("D3").Value = "'" + Sheet.Range("C3").Formula;

WScript.Quit();
```

セルA3とB3の値を足し算した結果をセルC3に代入する式(C3=A3+B3)の場合は、下記のとおり
R1C1形式：=RC[-2]+RC[-1]
A1形式　：=A3+B3
issetとunsetのシンタックスハイライトがおかしい

```php
class A {}
function () {};
const A = $a;
if ($a) { }
foreach ($a as $b) {}
require $a;
print $a;
echo $a;
isset($a);
unset($a);
empty($a);
```

issetとunsetも言語構造です！関数じゃないです！

```php
__halt_compiler();
```

あとこいつも…
Ruby の yield, Proc, lambda

## yield

yield が書かれたメソッドに渡されたブロックを実行する。

**一番シンプルな例**

```rb
def test
  yield
end

test { p "hoge" }
```
=> "hoge"

**引数を1つ渡す場合**

```rb
def test
  yield "hoge"
end

test {|x| p x }
```
=> "hoge"

**引数を2つ渡す場合**

```rb
def test
  yield "hoge", "fuga"
end

test {|x, y| p x, y }
```
=> 
"hoge" 
"fuga"

**ブロックがあるか、ないかを判定する**

```rb
def test
  if block_given?
   yield
  else
   p "no blcock"
  end
end

test { p "hoge" }
test
```
=>
"hoge"
"no blcock"

## Proc
ブロックを表すクラス。

**一番シンプルな例**

```rb
# 引数にブロックを与えて初期化する
proc = Proc.new {p "test"} 

# callでブロックを実行する
proc.call
```
=> "test"

**引数を1つ渡す場合**

```rb
# 引数にブロックを与えて初期化する
proc = Proc.new {|x| p x} 

# ブロックを実行する
proc.call(["hoge"]) # proc["hoge"]　または proc.("test")でも同じ
```
=> "hoge"

**引数を2つ渡す場合**

```rb
# 引数にブロックを与えて初期化する
proc = Proc.new {|x,y| p x,y} 

# ブロックを実行する
proc.call(["hoge", "fuga"]) # proc["hoge", "fuga"] または proc.("hoge", "fuga")でも同じ
```
=> 
"hoge"
"fuga"

## lambda
Proc.new と同じ。

```rb
l = lambda {p "hoge"}
l.call
```
=> "hoge"

lambda は `->` で書ける

```rb
l = -> {p "hoge"}
l.call
```
=> "hoge"

**引数を1つ渡す場合**

通常の書き方はProcと同じなので、以下省略系のみ紹介

```rb
l = -> (x){p x}
l.call("hoge")
```
=> "hoge"

**引数を2つ渡す場合**

```rb
l = -> (x,y){p x,y}
l.call("hoge", "fuga")
```
=>
"hoge"
"fuga"
[Swift] ローカルスコープを実現する

func locally を定義。
 
```swift
func locally(work: () -> ()) {
    work()
}
````
すると、locally をローカルスコープの代わりに使うことができる。

```swift
locally {
    let g = 42
    println(g)
}
````

#参考
[How to create local scopes in Swift? - Stack Overflow]
(http://stackoverflow.com/questions/24011271/how-to-create-local-scopes-in-swift)
Oculus Rift DK2をセットアップする手順

初めて触った時にめちゃくちゃ迷ったのでここにメモっておきます。
ざっくり手順は下記のような感じ。

1. Oculus Runtimeのインストール
2. Oculus Configuration Utilityの設定
3. 拡張デスクトップの設定
4. プライマリディスプレイの設定
5. カメラのセッティング
6. 遊ぶ！！

## Oculus Runtimeのインストール

[公式サイト](https://developer.oculusvr.com/?action=dl&p=sdk&v=21)からOculus Runtimeをダウンロードしてきます。ユーザー登録(無料)が必要です。
RuntimeとSDKがありますが、動かすだけならRuntimeだけで良いです。
ダウンロードしたらインストーラーの指示に従ってドライバーをインストールします。

## Oculus Configuration Utilityの設定

タスクバーにOculusアイコンが現れ、ダブルクリックするとOculus Configuration Utilityが起動します。
Tool→Rift Display Modeを選択するとRift Display Modeダイアログが表れます。
ここで**一度Direct HMD Access from Appsにチェックを入れてApplyをクリックした後、再度Extend Desktop to the HMDにチェックを入れてApplyをクリック**します。
こうするとOculus Riftが外部ディスプレイとして認識されるようになります。正しく認識されていればOculus Rift本体のLEDがオレンジ色から青色に変わり、Oculus Riftに映像が表示されるようになります。

## 拡張デスクトップの設定

デスクトップで右クリック→画面の解像度を選択して画面の解像度ダイアログを開きます。
デスクトップの複製設定になっている場合は**拡張設定に変更**します。
Oculus Riftを覗き、正しい向きに表示されているかを確認します。反転したりしている場合は、向き欄をいろいろ選択して正しい向きに表示されるようにします。また、解像度で1920x1080が選択されていることも確認します。

## プライマリディスプレイの設定

いくつかのアプリケーションではセカンダリディスプレイへのフルスクリーン表示に対応していない場合があります。
その場合はOculus Riftをプライマリディスプレイに設定することで正しく表示ができるようになります。
また、フレームレートが75hz出ないという場合も、プライマリディスプレイに設定することによって解決する場合があります。
設定方法は下記のとおりです。

1. デスクトップで右クリック→画面の解像度を選択して画面の解像度ダイアログを開く。
2. Oculus Rift側のディスプレイを選択した状態で**これをメインディスプレイにする**のチェックを入れる。
3. OKをクリックする。

ただし、これをやるとOSのログイン画面やデスクトップアイコンなどがOculus Riftの方に表示されるため、日常の操作が非常に不便になります。Oculusアプリケーションを実行しない時はOculus Rift本体の電源を切っておくようにすれば外部ディスプレイとしても認識されなくなるので、必要なときだけ電源を入れるようにしましょう。

ちなみに、こういう時に**Windowsキー+矢印キー**のショートカットが役に立ちます。
**Windowsキー+ ← or →**でフォーカス中のウィンドウをディスプレイをまたいで移動させることができます。
**Windowsキー+ ↑**でフォーカス中のウィンドウを最大化することができます。

## カメラのセッティング

付属のカメラを適当な場所に設置して、USBケーブルでPCと接続します。
そしてSyncケーブルでOculus Riftの端子とも接続します。
詳しくはマニュアルを読んでください。
ここで迷うポイントはないと思います。

## 遊ぶ！！

ここまで設定をすればOculus Riftを使ったアプリケーションが動かせるようになります。
基本的にはアプリケーションの実行ファイルをダブルクリックすればそのまま遊べると思います。
Unityアプリケーションの場合は最初に画面解像度設定ダイアログが出る場合があります。フルスクリーン設定にして起動しましょう。
たまにうまく起動できなかったり、再度起動したら何事もなく動いたり、とよくわからないこともありますが、**開発者向けのプレビュー版ですからこんなもんです。**

### で、どんなのが遊べるの？

[Oculus VR Share](https://share.oculusvr.com/)というサイトで全国の開発者がOculus Rift向けアプリケーションを公開しています。
ここで検索したりカテゴリーを見てみたりしてアプリケーションを探せば良いのですが、**Supported Rift Versions欄にDK2と書かれているものしか使えません。**

あとは[Mikulus DK2](https://bowlroll.net/file/45058)をやっておけばいいとおもいます。
Scala を使ってもっと楽に CSV の処理に SQL を使う

http://qiita.com/2KB/items/5511809c80516699cfcf

こちらの記事を見て「おー」と思ったので、カッとなってこのような Scala のライブラリをつくりました。

https://github.com/seratch/csvquery

こんな感じで使うことができます。H2 がサポートしているものなら任意の SQL 文法を使うことができます。

```scala
import scalikejdbc._
import csvquery._
implicit val session = autoCSVSession

val csv = CSV("./sample.csv", Seq("name", "age"))

val count: Long = withCSV(csv) { table =>
  sql"select count(*) from $table where age > 20"
    .map(_.long(1)).single.apply().get
}
```

実際にはこのようなクエリになります。このライブラリは csvread をつくるところを巻き取ってくれるというわけです。

```sql
select count(*) from csvread('./sample.csv', 'NAME,AGE', 'UTF-8') where age > 20;
```


また複数の CSV ファイルを読み込んだ csvread 同士を join することができます。

```scala
case class Account(name: String, companyName: String, company: Option[Company])
case class Company(name: String, url: String)

val (accountsCsv, companiesCsv) = (
  CSV("./accounts.csv", Seq("name", "company_name")),
  CSV("./companies.csv", Seq("name", "url"))
)
val accounts: Seq[Account] = withCSV(accountsCsv, companiesCsv) { (a, c) =>
  sql"select a.name, a.company_name, c.url from $a a left join $c c on a.company_name = c.name".map { rs =>
    new Account(
      name = rs.get("name"),
      companyName = rs.get("company_name"),
      company = rs.stringOpt("url").map(url => Company(rs.get("company_name"), url))
    )
  }.list.apply()
}
```

メモリに乗るサイズの関連した複数の CSV を扱う場合などで使いどころがあるかもしれませんね。
トランザクションをネストしたらどうなる？　内側だけロールバックできる？

トランザクションはRDBに対するひとかたまりの操作です。だから本来入れ子も何もなく、始まりと終わりが一個ずつあるだけです。以上。

…で終わらせられないのは、それでもネストが必要になる場面があるからですね。
ありがちなのは、トランザクション開始終了処理まで込みのアプリケーション側関数・メソッドやストアドプロシージャの存在。こうした関数を、まあ関数ですから部品的に扱おうとするとトランザクションが開始した文脈下でこうした関数が呼び出されて入れ子のサブトランザクションスタート、ってことになったりします。

サブトランザクションのコミットは問題ない
--
```sql
BEGIN TRANSACTION;
  INSERT ... 'A');
  BEGIN TRANSACTION;
    INSERT ... 'B');
  COMMIT TRANSACTION;
  INSERT ... 'C');
COMMIT TRANSACTION;
```

内側のトランザクションがコミット終了する分には何の問題もありません。外側がコミット終了するならA,B,C全部反映されるし、外側がロールバックするなら一行も挿入されない… つまり内側のトランザクション開始・終了はなかったも同然と扱えます。

サブトランザクションのロールバックが問題
--
```sql
BEGIN TRANSACTION;
  INSERT ... 'A');
  BEGIN TRANSACTION;
    INSERT ... 'B');
  ROLLBACK TRANSACTION;
  INSERT ... 'C');
COMMIT TRANSACTION;
```

問題はこれ。内側のサブトランザクションだけロールバックした場合。次のどの動作になるか。

1. A,Cが入っている。
2. Cだけ入っている。
3. ROLLBACKの時点でエラー発生。

正解は **実装依存** 。1. はなんかマイナーなRDBMSで見たことあります。PostgreSQLは 2. でした。SQL Serverは 3. らしいです。
困りましたね。こういう制御に関わる振る舞いが違ってくるとアプリケーションコードの骨格そのものがDB製品依存しかねません。

部分的ロールバックだったらSAVEPOINTがある
--
ストアドプロシージャや関数にトランザクション開始・終了まで入れ込んでしまう場合、処理失敗で巻き戻したいのはやっぱりその関数内で発行した変更だけです。その意味では先ほどの3択だったら 1. の動きをしてほしい。つまり部分的ロールバックです。

SQL標準はむしろ部分的ロールバックをする方法そのものはきっちり定義してくれています。それがSAVEPOINT。これを使うとこう書けます。

```sql
BEGIN TRANSACTION;
  INSERT ... 'A');
  SAVEPOINT SP1;
    INSERT ... 'B');
  ROLLBACK TO SAVEPOINT SP1;
  INSERT ... 'C');
COMMIT TRANSACTION;
```

これで、A,Cが挿入されます。…おやQiitaさん、SAVEPOINT命令知らないの？ ハイライトされてないよ？ まあ、されるんです。

JavaなんかでもJDBCにしっかり setSavepoint() メソッドありますからね。使えます。

トランザクション込みの関数の書き方
--
SAVEPOINTの存在を考えると、部品化したい関数なら頭で単純にBEGIN TRANSACTIONというわけにはいきません。もしトランザクションの内側であれば代わりにSAVEPOINTを呼ばないといけないから。

今トランザクションの中にいるかを判定できるかというと、これは処理系次第ということになってきますが、例えばJDBCみたいに getAutoCommit() で取得できるならこれで判別するまでですね。判別するAPIが見当たらないようなら、スレッドローカル変数を使って自力管理することになります。トランザクションを開始するときにスレッドローカル変数にフラグを立てることで、それより先のスタックフレームにもわかるようにしておこうという方法。
Ruboty | Configuration | dotenv #ruboty #chatops

# Ruboty | Configuration | dotenv #ruboty #chatops
## 概要
Ruboty の設定に関して。

## 資料
Ruboty の構成要素については、下記記事を参照
[Ruboty | 基本構成図解](http://qiita.com/tbpgr/items/7f08569dd8828bae6527)

## 詳細
Ruboty では、 bot名やデプロイモードなど、設定値は環境変数で設定します。
[dotenv gem](https://github.com/bkeepers/dotenv) 経由での環境変数設定を推奨しています。

## 試行
### 仕様
RUBOTY_ENV によって、 development と production を切り替えます。
環境変数を直接設定する方法と、
dotenv(.env ファイル) を利用する方法の両方を検証します。

### Gemfile

~~~ruby
source "https://rubygems.org"

group :development do
  gem "ruboty-google_image"
end

group :production do
  gem "ruboty-lgtm"
end
~~~

### 実行(環境変数で設定)

~~~
$ RUBOTY_ENV=development bundle exec ruboty
> ruboty help
ruboty /image( me)? (?<keyword>.+)/ - Search image from Google
ruboty /help( me)?\z/i              - Show this help message
ruboty /ping\z/i                    - Return PONG to PING
ruboty /who am i\?/i                - Answer who you are
> ruboty image 地獄のミサワ
http://img.jigokuno.com/20120502_2462789.gif
~~~

![development ruboty-google_image](http://dic.nicovideo.jp/oekaki/256231.png)

~~~bash
$ RUBOTY_ENV=production ruboty
> ruboty help
ruboty /lgtm( me)? ?(?<keyword>.+)?/ - Generate lgtm image matching with the keyword
ruboty /help( me)?\z/i               - Show this help message
ruboty /ping\z/i                     - Return PONG to PING
ruboty /who am i\?/i                 - Answer who you are
> ruboty lgtm
http://lgtm.herokuapp.com/http://38.media.tumblr.com/1b7fab2dd5e05f6cd3c9617e9a8e2e90/tumblr_mnl78auDq21r3eh5jo2_500.gif
~~~

![production ruboty-lgtm](http://lgtm.herokuapp.com/http://38.media.tumblr.com/1b7fab2dd5e05f6cd3c9617e9a8e2e90/tumblr_mnl78auDq21r3eh5jo2_500.gif)

### 実行(.envで設定)

#### .env(development)

* .env

~~~
RUBOTY_ENV=development
~~~

* 実行

~~~
$ ruboty --dotenv
> ruboty help
ruboty /image( me)? (?<keyword>.+)/ - Search image from Google
ruboty /help( me)?\z/i              - Show this help message
ruboty /ping\z/i                    - Return PONG to PING
ruboty /who am i\?/i                - Answer who you are
> ruboty image
> ruboty image 地獄のミサワ
http://ascii.jp/elem/000/000/558/558297/002_185x.gif
~~~

![development ruboty-google_image](http://ascii.jp/elem/000/000/558/558297/002_185x.gif)

#### .env(production)

* .env

~~~
RUBOTY_ENV=production
~~~

* 実行

~~~
$ ruboty --dotenv
> ruboty help
ruboty /lgtm( me)? ?(?<keyword>.+)?/ - Generate lgtm image matching with the keyword
ruboty /help( me)?\z/i               - Show this help message
ruboty /ping\z/i                     - Return PONG to PING
ruboty /who am i\?/i                 - Answer who you are
> ruboty lgtm
http://lgtm.herokuapp.com/http://33.media.tumblr.com/a6a59c1b3b537ffa26b4f11b505760c0/tumblr_mlr6xd2wdF1r0rp7xo1_500.gif
~~~

![production ruboty-lgtm](http://lgtm.herokuapp.com/http://33.media.tumblr.com/a6a59c1b3b537ffa26b4f11b505760c0/tumblr_mlr6xd2wdF1r0rp7xo1_500.gif)

## 参照
[Ruboty GitHub](https://github.com/r7kamura/ruboty)
[Ruboty RubyGems](https://github.com/r7kamura/ruboty)
[dotenv gem GitHub](https://github.com/bkeepers/dotenv)
Ruboty | Configuration | Gemfile #ruboty #chatops

# Ruboty | Configuration | Gemfile #ruboty #chatops
## 概要
Ruboty の設定に関して。

## 資料
Ruboty の構成要素については、下記記事を参照
[Ruboty | 基本構成図解](http://qiita.com/tbpgr/items/7f08569dd8828bae6527)

## 詳細
Ruboty では、 Adapter や Handler などの拡張は gem で行います。
Ruboty を利用する際のメインのディレクトリに Gemfile を作成し、
gem を指定することで各種拡張機能を利用します。

## 試行
### 仕様
ruboty-google_image Handler を Shell Adapter から利用してみます。

### Gemfile

~~~ruby
source "https://rubygems.org"

gem "ruboty-google_image"
~~~

### 実行
ruboty-google_image のヘルプが追加され、
実際に、機能が追加されていることを確認できます。

~~~bash
$ bundle install
$ ruboty
> ruboty help
ruboty /image( me)? (?<keyword>.+)/ - Search image from Google
ruboty /help( me)?\z/i              - Show this help message
ruboty /ping\z/i                    - Return PONG to PING
ruboty /who am i\?/i                - Answer who you are
> ruboty image 地獄のミサワ
http://img.jigokuno.com/20120502_2462789.gif
~~~

![alt](http://img.jigokuno.com/20120502_2462789.gif)

## 参照
[Ruboty GitHub](https://github.com/r7kamura/ruboty)
[Ruboty RubyGems](https://github.com/r7kamura/ruboty)
[Ruboty GoogleImage GitHub](https://github.com/r7kamura/ruboty-google_image)
Ruboty | 基本構成図解 #ruboty #chatops

# Ruboty | 基本構成図解 #ruboty #chatops
## 概要
Rubotyの基本構成を図解します

## 構成図
![ruboty_structures.png](https://qiita-image-store.s3.amazonaws.com/0/43480/3681fcb2-a6e0-a0bd-0a10-4eddf27e3ecc.png)

## 構成要素
* Adapter
チャットクライアントとの接続用アダプタ。
デフォルトは Shell Adapter。
Slack, Idobata, HipChat, Twitter など様々な Adapter がある。

* Brain
永続化を行う

* Handler
後述の Action とワンセットで Hubot の Script に相当。
正規表現と ruboty help に利用する情報の登録、Actionの振り分けが責務。
ping, help などチャットから実行する個別のコマンド。

* Action
前述の Handler とワンセットで Hubot の Script に相当。
Handlerから呼び出され、具体的な振る舞いを記述する。
ping, help などチャットから実行する個別のコマンド。

* Configuration
Gemfile で Handler や Adapter を追加する。
環境変数で ruboty の名前や接続先など各種設定を行う。
`--dotenv` オプションで .env を利用することを推奨している。
.env については、 [dotenv gem](https://github.com/bkeepers/dotenv) のドキュメント参照。

## 補足
構成図の作成には [gviz gem](https://github.com/melborne/Gviz) を利用しています。
[tbpgr の Gviz 関連情報](http://qiita.com/tbpgr/items/76d0379bb83ec64fbdb3)

## 参照
[Ruboty GitHub](https://github.com/r7kamura/ruboty)
[Ruboty RubyGems](https://github.com/r7kamura/ruboty)
[dotenv gem](https://github.com/bkeepers/dotenv)
Ruboty | Ruby 製のチャットボットフレームワーク「Ruboty」 インストールから疎通確認まで #ruboty #chatops

# Ruboty | Ruby 製のチャットボットフレームワーク「Ruboty」 インストールから疎通確認まで #ruboty #chatops
## 概要
Ruboty は Ruby 製のチャットボットフレームワークです。
要は [Hubot](https://hubot.github.com/) の Ruby 版。

Hubot は便利だけど CoffeeScript より Ruby で書きたい、という人向け。

## インストール

~~~
$ gem install ruboty
$ ruboty -h
Usage: ruboty [options]
        --dotenv        Load .env before running.
    -g, --generate      Generate a new chatterbot with ./ruboty/ directory if specified.
    -l, --load          Load a ruby file before running.
    -h, --help          Display this help message.
~~~

## 試行

Ruboty は Hubot 同様、デフォルトでは Shell Adapter を利用して動作します。
デフォルトで, help / ping / whoami の3つの Handler が組み込まれています。

~~~
$ ruboty
> ruboty help
ruboty /help( me)?\z/i - Show this help message
ruboty /ping\z/i       - Return PONG to PING
ruboty /who am i\?/i   - Answer who you are
> ruboty ping
pong
> exit
~~~

※ `exit` or `quit` で Shell Adapter のプロンプトを終了する

## 参照
[Ruboty GitHub](https://github.com/r7kamura/ruboty)
[Ruboty RubyGems](https://github.com/r7kamura/ruboty)
sudo後もSSH Agent Forwardingしたい

そんな場合は、/etc/sudoers に以下を追記しておけば良い。

```test:/etc/sudoers
Defaults env_keep += "SSH_AUTH_SOCK"
```

最近知って便利だったのでメモ。

## 即座にAnsible Role化
最近、設定系のTipsはとりあえずAnsibleのロール化した形でメモるようにしてる。

```yaml:sudoers/tasks/main.yml
- name: allow agentforward sudo
  lineinfile: >
    dest=/etc/sudoers
    line="Defaults env_keep += \"SSH_AUTH_SOCK\""
    regexp="^Defaults +env_keep *\+= *\"SSH_AUTH_SOCK\""
    state=present
Sublime Text 3 用の C#.sublime-build を晒す

Sublime Text 2で使っていたのがそのままだと動かなかったので、下のように直して使っています。
「Preferences -> Browes Packages」で開いたフォルダの「User」フォルダの中に置いてます。

```C#.sublime-build
{
    // This build system will build your cs file to exe file and will run it
    "file_regex": "^(...*?)[(]([0-9]*),([0-9]*)[)]",
    // By default csc is not in your PATH, so add it to your path
    // or uncomment "path" and check that it has correct value
    "path": "C:/Windows/Microsoft.NET/Framework/v4.0.30319/",
    "shell": true, // Without this sublime has hard times to parse "&" in out command line
    "selector": "source.cs",

    "windows":
    {
        "cmd": ["del", "${file/\\.cs/\\.exe/}", "2>NUL", "&", "csc", "/nologo", "/out:${file/\\.cs/\\.exe/}", "$file"],
        "encoding": "cp932",
    },

    "variants":
    [
        {
            "name": "Run",
            "windows":
            {
                "cmd": ["del", "${file/\\.cs/\\.exe/}", "2>NUL", "&", "csc", "/nologo", "/out:${file/\\.cs/\\.exe/}", "$file", "&", "${file/\\.cs/\\.exe/}"],
                "encoding": "cp932",
            },
        }
    ]
}
```
Elixir Tuples

# Elixir Tuples

## 概要
Elixir の Tuples について。

tuple は順序づけされたコレクションです。
一度作成された tuple は変更できません。

## delete_at(tuple, index)
tuple から index の要素を削除した tuple を返却します

~~~
IO.inspect abc_tuple = {:b, :a, :c}
IO.inspect Tuple.delete_at(abc_tuple, 1)
~~~

* 出力

~~~
{:b, :a, :c}
{:b, :c}
~~~

## duplicate(data, size)
新しい tuple を返却する。
tuple は data が size 数分満たされている。

~~~
IO.inspect Tuple.duplicate(:hoge, 4)
~~~

* 出力

~~~
{:hoge, :hoge, :hoge, :hoge}
~~~

## insert_at(tuple, index, term)
tuple の index の位置に、 term を追加した tuple を返却する

~~~
IO.inspect abc_tuple = {:b, :a, :c}
IO.inspect Tuple.insert_at(abc_tuple, 1, :d)
~~~

* 出力

~~~
{:b, :d, :a, :c}
~~~

## to_list(tuple)
tuple を list に変換する

~~~
IO.inspect abc_tuple = {:b, :a, :c}
IO.inspect Tuple.to_list(abc_tuple)
~~~

* 出力

~~~
[:b, :a, :c]
~~~

## 参照
http://elixir-lang.org/docs/stable/elixir/Tuple.html
Viewportの指定時挙動について(iPhone)

## 確認環境

iPhone4sのSafariだけで確認しました。以下は全てこの環境での結果です。  

Androidの場合でも同じ？


## 1.Viewport指定なし (ドキュメントのwidthが980px以下)

https://dl.dropboxusercontent.com/u/337444/viewport/width_none.html

未指定時のiPhoneのviewport横サイズは980px。

縦: 横スクロールなしで表示される。

横: 横スクロールなしで表示される。(縦時にくらべていくらか拡大される)

## 2.Viewport指定なし (ドキュメントのwidthが980pxよりより大きい)  :bomb:

https://dl.dropboxusercontent.com/u/337444/viewport/width_none_1200.html

縦: 980pxまでは横スクロールなしで表示できるように拡大される。

横: 縦向きと同じ挙動

:skull: 縦→横または横→縦に傾けると幅320px表示となるように拡大される。 

## 3.width=device-width :bomb:

https://dl.dropboxusercontent.com/u/337444/viewport/width_device.html

縦: 719pxまでは横スクロールなしで表示できるように拡大される。

横: 縦時にくらべていくらか拡大されている。

縦→横→縦とすると、最終的な幅は640pxになる。

:skull: 挙動がつかめない。

## 4.width=device-width, initial-scale=0.5, minimum-scale=0.5, maximum-scale=0.5 :white_flower: 

https://dl.dropboxusercontent.com/u/337444/viewport/width_device2.html

縦: 640pxまでは横スクロールなしで表示できるように拡大される。

横: 960pxまでは横スクロールなしで表示できるように拡大される。(縦幅の1.5倍)

なお、拡大率のMIN,MAX共に初期倍率と同じため、拡大率は固定されている。


## 5.width=400  :white_flower:

https://dl.dropboxusercontent.com/u/337444/viewport/width_400.html

縦: 400pxまでは横スクロールなしで表示できるように拡大される。

横: 400pxまでは横スクロールなしで表示できるように拡大される。

width=600(縦向き時widthより大きい幅)、width=1200(なんとなく大きい幅)でも同様の挙動となった。

:bangbang: コンテンツの幅とviewportのwidthを一致させること。異なる場合には上記とは違う動きをした。


## まとめ

+ PCサイトにも width=＜コンテンツ幅＞ なviewportを指定しましょう。

+ スマホサイト向けのviewportについて。widthはdevice-widthを指定して、明示的に初期スケール、MAXスケール、MINスケールを指定しましょう。

+ デバイス種類(PC,スマホ,タブレット)毎にViewを作成するのが無難そう？


## 参考にしたサイト

+ http://tech.nitoyon.com/ja/blog/2013/02/15/viewport/

+ http://www.codegrid.net/ の「実践！スマホサイトのviewport設定」