OmniAICreator/Qiita-1.07M huggingface dataset:
VirtualBox(Mac)にWindows10 Technical Preview をインストールしてみた

次のような流れです。

ディスクイメージをダウンロードしようとMac(Firefox)からダウンロードサイトへ行くと「申し訳ございませんが、お使いのオペレーティング システムにはプレビュー版をインストールできません。」で終了しました。
http://windows.microsoft.com/ja-jp/windows/preview

手元にあった Windows7(32bit)を VirtualBox上にインストールし、そこ(面倒なのでIE)からダウンロードサイトへ行ったところ、うまくダウンロードできました。ちなみに Microsoftのアカウントでログインする必要がありますね。先にインストールした Windows7 が 32bit だったので、同様の32bit版(English)をダウンロードしました。

Windows7 の環境に上書きインストールしようと、仮想マシンを起動し F12 キー押してCD-ROMブート...インストーラから起動したところ インストーラの起動は始まったのですが、途中でエラーメッセージが表示され中断...4GB以上の物理メモリにアクセスするから...というようなメッセージだったと思いますが。（うろ覚え）

試しに 64bit 版もダウンロードして同じ手順で...
エラーメッセージは表示されたのですが、先ほどとちょっと違う。32bit 環境に 64bit はインストールできないぜ的なメッセージでした。

あぁ、VirtualBox で仮想マシン作るときに OSの種類選択してましたね。
という訳で Windows7 の仮想マシンを削除（ディスク容量ピンチなので）して、新しく Windows 8.1(64bit) で作成して、インストール開始...
インストールできました！！!
[スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/12300/0c659890-ce01-20da-ea1b-951671ddd92f.png)

意外と疲れました...
Python で rsocket で通信が爆速でやばい.


漢なら RDMA でデータ送りたいですね!

とりあえず手っ取り早く rsocket http://syoyo.wordpress.com/2012/12/06/rsocket-new-way-of-rdma-aware-programming/ を使い, 既存の python スクリプトで高速転送を実現してみましょう.

# 構成

```
        IPoIB        1 GbE
Server: 172.24.0.1  192.168.11.1
Client: 172.24.0.2  192.168.11.2
```

Server と Client は InfiniBand QDR と, 1 GbE で物理的に繋がっています.
InfiniBand のレイヤは IPoIB で繋がっているものとします.

## テストスクリプト

Client から 1GB のデータを送り, Server 側はそれを受け取るだけというスクリプトです(単方向データ通信).

```
# server.py
import socket

import itertools

HOST = ''                 
PORT = 8081               
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
ret = []
while 1:
    #print "recv"
    data = conn.recv(1024*1024*1024)
    #print "len:%d", len(data)
    if not data: break
    #ret.append(data)

conn.close()
print "done"
```

```
# client.py
import socket
from datetime import datetime
from datetime import timedelta

def millis(s, e):
    dt = e - s
    ms = (dt.days * 24 * 60 * 60 + dt.seconds) * 1000 + dt.microseconds / 1000.0
    return ms

HOST = '192.168.11.1'    # GbE remote host
#HOST = '172.24.0.1'    # IPoIB remote host
PORT = 8081             
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
d = "a" * 1024*1024*1024
print "sending..."
start_ms = datetime.now()
s.sendall(d)
end_ms = datetime.now()
print "sent"
s.close()
print "elap: %d [ms]" % millis(start_ms, end_ms)
```

1 GbE での接続では...

```
# server 側で実行
$ python server.py

# client 側で実行
$ python clientpy

elap: 9109 [ms]
```

1GbE だと理論上限が 100MB/s くらいですから期待通りですね.

IPoIB だと…

```
elap: 23711 [ms]
```

あらなんだか IPoIB そのままだと 40 MB/s くらいと遅いですね. 
1GB のデータなので少なくとも 10000 ms(10 secs, 100MB/s) くらいで転送してもらいたいところ.

## rsocket をつかう.

LD_PRELOAD で dll 差し替えにより, 既存 socket プログラムでも RDMA を使うことができるようになります.
(必ずしも全てではないが, iperf なども動きます)

また, RDMA が使える物理的経路(InfiniBand, etc)が IPoIB で見えている必要があります.

今回はこの LD_PRELOAD による方法を使います.
使った rsocket(librdmacm) のバージョンは 1.0.18 です.

```
# Server
$ LD_PRELOAD=/usr/local/lib/rsocket/librspreload.so python server.py
```

```
# Client
$ LD_PRELOAD=/usr/local/lib/rsocket/librspreload.so python client.py

elap: 695 [ms]
```

Super cool! **1GB のデータが 0.7 秒** で送れました. 1.4 GB/s ほど. これだと python で GB 単位のデータの処理(バイト配列処理)をするほうが時間かかってしまうレベルですね.

## TODO

* バッファに mmap を使ってより python 側の処理を軽くできないか検討してみる.
 
## まとめ

rsocket すばらしい.
Google AdMob SDKを使用する際に必要なFramework

## GoogleMobileAdsSdkiOSを使用する際に追加するframework
2014/10/02現在の最新版は6.12.0でした。
※SDKバージョンが変わると違うかもしれないですが、覚え書きとして

* AudioToolbox
* MessageUI
* SystemConfiguration
* CoreGraphics
* AVFoundation
* StoreKit
* CoreTelephony
* AdSupport
* EventKit
* EventUIKit

コード記述に関しては、多数の人が投稿しているのでそちらを参照下さい。
Git使いがMercurialを使うときに知っておくと便利なこと

### まえがき、あるいは動機

ゲームギョウ界とかでよくあるのが「ソースコードと巨大バイナリを一緒に扱いたい」という状況。この場合Gitは容量を食いすぎて使えないが、Mercurial(Hg)ならDVCSでありながら巨大バイナリも現実的に扱える。ということでGitからHgへ移行する事を考えた時に躓きがちなところをまとめてみた。

### bookmarkとbranch

Hgのコマンド体系がSubversion(svn)ぽいところがある程度でGitとHgの中身はだいたい同じと考えていい(なので説明は省く)が、ブランチに対する考え方がかなり違う。

Gitから移行することを考えるとHgには二種類のブランチがあると考えるとわかりやすいだろう。一つはbookmarkでもうひとつはbranchだ。この二つの間に互換性はないので混ぜて使うことはできない。互いに見えないだけなので階層的に分けて両方使うのは問題ないが。

結論から述べるとGitでマージするときに--no-ffしていなかったらbookmark、していたらbranchを使えばいい。

#### bookmark

HgのbookmarkはGitで言えばbranchにかなり近い。近いんだけどfast-forward条件ではマージさせてくれないのでgit mergeで--no-ffやってた人だと悩むだろう。bookmarkは公開しない限り公開されないのでbranchを公開、bookmarkをプライベートとして使うといいように思える。プライベート「ブランチ」で--no-ffするメリットもあんまりないし。

#### branch

HgのbranchはGitには該当するものはないがHgはpush/pullするときにブランチも同期する(ただし送り先にないbranchは指定しないとpushされない)。つまりトピックブランチも共有してしまうことになる。とはいえブランチをcloseすると一覧からは見えなくなるところまで共有しているのでGitでトピックブランチをpushした場合のように手元とリモートの両方でブランチを消さなきゃならないなんて必要はない。

各々がバラバラに開発している場合はこの「ブランチが共有される」というのは混乱の元なので「少人数ではHg」とか言われたりするのだが、ITS(Issue Tracking System)も使わないような開発それ自体が混乱の元であり、ITSを使うならブランチ名も管理されるのでこのことは本来なら制約にはならない。

むしろbranchの状態とITSのチケットが連動してくれると簡単でいいと思う。

なお、HgのbranchはGitと違い「ブランチを作っただけ」とか「ブランチをcloseしただけ」とかいうファイルの変更が存在しないコミットが存在し得る。またclose後も(特別な操作は不要で)アクセスは可能なようなので、branchをcloseするコミットにITSのチケットクローズコマンドを書いてコミットしたものをdefaultへマージするというのが自然だと思う。

それと、Hgの特徴とか言われる無名ブランチだけど、Hgのマルチヘッドは無名のbookmarkとまったく同じ。hg merge するとマルチヘッドがマージされて解消する。見えにくいのでそんなにいい仕様だとは思わないけど。

### 注意点

Hgはブランチ名に_以外の記号は使えないと考えていい(使える記号もあるけど推奨されないようだ)。bookmarkには使えるっぽいけど。

それと、Hgの名前付きブランチは作ったばっかりで指してるコミットが同じだと隠れちゃってglogでもbranchesでも見えなくなる上にupdateしようとしても未知のリビジョンとか言われちゃう。これは仕様バグと言っていいだろう。

とりあえず今いるブランチは「hg branch」(単数形ブランチ名指定なし)で確認できるのでブランチ作ったのにできてないと思ったら要チェック。とりあえず何かコミットすればリビジョンが分離して見えるようになるのでブランチ作ったみたいなコミットでもしとけばおｋ。
Go事始め作業ログ

## Goとは

- 完全なコマンド操作ツールセットを持つ（クロスコンパイルも簡単）
- コンパイル速度が速く、コンパイル済みプログラムの実行速度もC言語やC++に迫る速さ
- タイプセーフかつメモリセーフ

らしい。早速プラットフォームをインストールしてみる。

## Goのインストール

Homebrewからインストールする。

```bash
$ brew install go
```

ターミナルを再起動すると、[`go`コマンド](https://github.com/astaxie/build-web-application-with-golang/blob/master/ja/ebook/01.3.md)が使えるようになる。

## GOROOT と GOPATH

を環境変数に指定するように各所で言われているが、今回はGOROOTを指定しない。

- **GOROOT** Goのルートディレクトリを指す
- **GOPATH** Goのワーキングディレクトリを指す

ところが、GOROOTはインストールしたGoに既に環境変数として登録されており、既に然るべき場所を参照している。

```bash
$ go env GOROOT
# /usr/local/Cellar/go/1.3.2/libexec
```

ので、複数バージョンのGoをインストールして、バージョンをまたいで使ったりするのであれば個別に上書き指定する必要があるかもしれないが、素直に使うので今回はそれを行わなかった。言い換えれば、exportされるGOROOTは **go env GOROOT** を上書きする事になる。

GOPATHは作業ディレクトリを参照するようにしておく。

```bash
$ export GOPATH=/Users/1000ch/workspace/go
```

## Hello, World

GOPATH配下の`src`フォルダに適当なプロジェクトを作成する。

```bash
$ mkdir $GOPATH/src/helloworld
```

プログラムを作成する。ここでは`main.go`としておく。

```bash
package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}
```

実行するには、以下のように`run` + ファイル名で実行する。

```bash
$ go run $GOPATH/src/helloworld/main.go
# hello, world
```

## パッケージをダウンロード

`go get`によってリモートのGoパッケージをダウンロードすることが出来る。GitHubやらBitBucketやらをリモートとし、対応するバージョンシステムを利用して取得。

例えば以下のようにGitHubにあるGoのパッケージをダウンロードすると、`$GOPATH/src`にダウンロードされる。

```bash
$ go get github.com/golang/lint
```

## パッケージをインストール

`go install`によってパッケージをインストール可能。インストールしたパッケージは`$GOPATH/bin`に配置される。パッケージ名は`.go`ファイルのパッケージ名に基づく。

```bash
$ go install pkgname
```

バイナリが`$GOPATH/bin`に生成される。これは実行可能ファイル。

```bash
$ ./bin/pkgname
```

## パッケージのビルド

`go build`によってパッケージをビルド可能。`go install`とは異なり、カレントディレクトリに配置される。

```bash
$ go build pkgname
```

カレントディレクトリに`go install`同様の実行可能ファイルが生成される。

```bash
$ ./pkgname
```
mod_proxyとErrorDocument利用時のX-Forwarded-Forの値についてのメモ

ELB配下のEC2で以下のような設定でApacheを動かしていると、ログにX-Forwarded-Forが"[クライアントのIP], [ELBのIP], [ELBのIP]"となるのがよくわからなかったので調べた。
図に書いてみると分かったけどややこしかったのでメモしておく。

```apache
ErrorDocument 502 /error/502.html

ProxyPass /error http://localhost:3010/error 

# 必ずタイムアウトする
ProxyPass / http://localhost:3020/ 
```

## 動作

[![ErrorDocumentWIthProxy.png](https://qiita-image-store.s3.amazonaws.com/0/16768/12e9f2e6-88e0-74a6-b014-cfdbae2f0c06.png)](https://qiita-image-store.s3.amazonaws.com/0/16768/12e9f2e6-88e0-74a6-b014-cfdbae2f0c06.png)

1. クライアントからELBにリクエストが送られる。
 * 送信元IPはクライアントのIPでX-Forwarded-Forはまだ無い。
2. ELBからEC2(mod_proxy)にリクエストが送られる。
 * ELBがX-Forwarded-ForにクライアントIPの値をしまい、送信元IPとしてELBのIPでリクエストする。
3. mod_proxyから背後のサーバーにリクエストが送られる(タイムアウトして502となる)。
 * mod_proxyがX-Forwarded-ForにELBのIPを追加し、送信元IPとしてlocalhostからリクエストする。
4. 502のErrorDocumentが設定されているため再度ELBからのリクエストという扱いで指定されたproxyを行う。
 * 送信元IPがELBのIPでX-Forwarded-Forの値は変更しないままのリクエストとしてproxyする。
5. ErrorDocument用のproxyが行われる。
 * mod_proxyがX-Forwarded-ForにELBのIPを追加し、送信元IPとしてlocalhostからリクエストする。
MongoDBのISODateの関数仕様を見る

Mongo Shell 内で `ISODate.toString()` すれば実装が見れます。
以下は、MongoDB-2.6.4 での出力例です。

```js:ISODate
function (isoDateStr){
    if (!isoDateStr)
        return new Date();

    var isoDateRegex = /(\d{4})-?(\d{2})-?(\d{2})([T ](\d{2})(:?(\d{2})(:?(\d{2}(\.\d+)?))?)?(Z|([+-])(\d{2}):?(\d{2})?)?)?/;
    var res = isoDateRegex.exec(isoDateStr);

    if (!res)
        throw "invalid ISO date";

    var year = parseInt(res[1],10) || 1970; // this should always be present
    var month = (parseInt(res[2],10) || 1) - 1;
    var date = parseInt(res[3],10) || 0;
    var hour = parseInt(res[5],10) || 0;
    var min = parseInt(res[7],10) || 0;
    var sec = parseInt((res[9] && res[9].substr(0,2)),10) || 0;
    var ms = Math.round((parseFloat(res[10]) || 0) * 1000);
    if (ms == 1000) {
        ms = 0;
        ++sec;
    }
    if (sec == 60) {
        sec = 0;
        ++min;
    }
    if (min == 60) {
        min = 0;
        ++hour;
    }
    if (hour == 24) {
        hour = 0;   // the day wrapped, let JavaScript figure out the rest
        var tempTime = Date.UTC(year, month, date, hour, min, sec, ms);
        tempTime += 24 * 60 * 60 * 1000;    // milliseconds in a day
        var tempDate = new Date(tempTime);
        year = tempDate.getUTCFullYear();
        month = tempDate.getUTCMonth();
        date = tempDate.getUTCDate();
    }

    var time = Date.UTC(year, month, date, hour, min, sec, ms);

    if (res[11] && res[11] != 'Z'){
        var ofs = 0;
        ofs += (parseInt(res[13],10) || 0) * 60*60*1000; // hours
        ofs += (parseInt(res[14],10) || 0) *    60*1000; // mins
        if (res[12] == '+') // if ahead subtract
            ofs *= -1;

        time += ofs
    }

    return new Date(time);
}
```

`Date` に比べて初期化時に渡せる引数のパターンが少なかった。
タイムスタンプはダメなんすね..
HomebrewでphpのextensionをインストールしたのにCLIから使用できない

```
$ php -i | grep php.ini
Configuration File (php.ini) Path => /etc
```
ファイルはないので...
```
sudo ln -s /usr/local/etc/php/5.4/php.ini /etc/php.ini
```

モジュールの読み込み（必要？）
```
extension=/usr/local/Cellar/php54-mcrypt/5.4.33/mcrypt.so
```
Windows 10 Technical PreviewをMacにインストールする方法

# Mac ChromeでUAをInternetExplorerに変えればいい

1. [User-Agent Switcher](https://chrome.google.com/webstore/detail/user-agent-switcher/ffhkkpnppgnfaobgihpdblnhmmbodake/related?hl=ja)をインストール
2. Internet Explorer 10などにする（なんでもいいヨ）<br /><br />![UASwitcher.png](https://qiita-image-store.s3.amazonaws.com/0/47955/b1c7fd2c-00c4-f863-bd51-00bbe9708833.png)
3. [Windows 10 Technical Preview](http://windows.microsoft.com/ja-jp/windows/preview-download?ocid=tp_site_downloadpage)サイトへアクセス
4. Windowsのなにかしらに登録していない人はユーザー登録を（登録途中から英語サイトになります）。
5. メール認証して登録が終わったら再度[Windows 10 Technical Preview](http://windows.microsoft.com/ja-jp/windows/preview-download?ocid=tp_site_downloadpage)サイトへアクセス
6. 英語 64 ビット (x64)をダウンロード
7. お金のある人は[VMWare Fusion](http://www.vmware.com/jp/products/fusion)か[parallels](http://www.parallels.com/jp/)、お金のない人は[Virtual Box](https://www.virtualbox.org/)をダウンロードしてインストール
8. VMWare Fusionでしか試していないのでわかりませんが、Windowsサイトからダウンロードした「**WindowsTechnicalPreview-x64-EN-US.iso**」というファイルを下のウィンドウにドラッグする<br /><br />![fusion-1.png](https://qiita-image-store.s3.amazonaws.com/0/47955/cc271d05-22ac-c7fa-a1a9-85e286f7eae2.png)
9. 「**WindowsTechnicalPreview-x64-…**」が選択状態になっているのを確認して、「**続ける**」をクリック
10. Windows 10のインストールが開始されます。
11. Sign in to Your Microsft accountまできたら、先ほどWindowsサイトで登録した**メールアドレス**と**パスワード**を入力
12. Help us protect your infoで、「**Text \*\*\*\*@hoge.com**」状態で、登録時に入力したメールアドレスをいれる
13. 7桁のSecurity codeがメールが届きますので、Enter the code you receivedで入力
14. 「**Hi**」と出れば成功
Atom Editor起動時に前回のタブを開かせる方法

Settings → Packages
Search packagesに「remember-session」と入力、検索、Install

[remember-session](https://atom.io/packages/remember-session)
にも書いてあるが、前回終了時の、

* ウィンドウ位置・サイズ
* ツリービューの幅
* プロジェクトへのパス・そのパスへの次のセッション
* 開いていたタブ、フォーカスのあったタブ

が復元される
linuxにsubversionレポジトリ作成及びそのアクセス

###参考資料
---
[ref1: subversion実践入門](http://www.amazon.co.jp/Subversion%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E9%81%94%E4%BA%BA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AB%E5%AD%A6%E3%81%B6%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86-%E7%AC%AC2%E7%89%88-Mike-Mason/dp/4274066800/ref=sr_1_1?ie=UTF8&qid=1412214613&sr=8-1&keywords=subversion)


### linuxサーバーにレポジトリ作成
ref1) p32
xxxx: レポジトリ名
```svnadmin create xxxx```s

### linuxサーバーに外部からssh接続
ref1) p37
```svn co svn+ssh://user@host/aaa/bbb/xxxx```

### svnサーバーにadd&commit
ex) README.mdをadd&commit
```svn add README.md```
```svn commit -m "xxxx" ./README.md```

### svnサーバー管理下にあるか確認
```svn list```
Android StudioにEclipseのショートカットを効かせる

EclipseユーザがAndroid Studioに移行した際に戸惑うのがショートカットの違いだと思います。  
Android Studioのショートカットを覚えてもいいのですが、結構微妙なショートカットが多いです。(ファンクションキーを多用するとか…)  

で、Android StudioでEclipseのショートカットを適用する方法です。  


##手順
Android studioのpreference -> keymap で Keymaps: Mac OSX(Eclipse)にする。

![スクリーンショット 2014-10-02 11.08.25.png](https://qiita-image-store.s3.amazonaws.com/0/39433/649222a7-07f8-c782-085d-18258b2409a3.png)




##注意点
この適用をすると、検索で⌘Fが使えなくなります。これはEclpse標準じゃなかったのですかね。Findを検索して、keymapをあててあげればOK。

![スクリーンショット 2014-10-02 11.09.09.png](https://qiita-image-store.s3.amazonaws.com/0/39433/5266bfe9-d370-8ab3-4d0c-1895a705a93c.png)
Vagrant上で時刻がずれている時の対処法

Vagrant上で開発しているときに、現在の日付と時刻を見る為に **$ date コマンド** を打つと、表示される時刻でがおかしい場合があります。

現在、日本国内で時計をみると**「2014年10月2日10:46:45」**となっているとします。

vagrant上で

<pre>
$ date
2014年 10月  2日 木曜日 01:46:45 UTC
</pre>

UTC（全世界で時刻を記録する際に使われる公式な時刻「 協定世界時」）になってしまっていますね。日本標準時刻より **9時間** 遅れています。

実際は、**JST（日本の標準時刻）**で表示されてほしいので

<pre>
$ sudo rm /etc/localtime
$ sudo ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
</pre>

として時刻を日本の標準時刻に戻しましょう。

<pre>
$ date
$ 2014年 10月  2日 木曜日 10:46:45 JST
</pre>
mvn test で mvn findbugs:check も実行する

### 概要
`mvn findbugs:check` にひっかかったらテストこけるようにする。

### pom.xml 
build 要素に以下を追加する。

```xml:pom.xml
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>findbugs-maven-plugin</artifactId>
				<version>3.0.0</version>
				<executions>
					<execution>
						<id>findbugs-test</id>
						<phase>test</phase>
						<goals>
							<goal>check</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
```

できた！
CI と組み合わせると幸せ度があがる感じ。

### 続きまして
Eclipse の Warnings がある場合に `mvn package` こけるようにしたい。
Redmineのチケットの変更をHubotを経由してチャットに通知する

Redmineのチケットの変更をHubotを経由してチャットアプリに通知する方法を紹介します。

SlackやHipChatを使っている人は直接 [sciyoshi/redmine-slack](https://github.com/sciyoshi/redmine-slack) や [hipchat/redmine_hipchat](https://github.com/hipchat/redmine_hipchat)を使った方が簡単だと思います。

## 概要

RedmineにWebHookプラグインをインストールし、チケット更新時にHubotへPOSTするように設定します。Hubotはデータを受け取り、チャットアプリに更新情報を通知します。

![notification-screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/6092/b0fd1a46-139b-ecaf-5d1d-6dbb107ba6e0.png)

## Hubotの設定

HubotにRedmineのチケット更新通知用のスクリプトをインストールします。

* [tenten0213/hubot-redmine-notifier](https://github.com/tenten0213/hubot-redmine-notifier)

```bash
$ cd myhubot
$ npm install --save hubot-redmine-notifier
$ vim external-scripts.json
```

```json:external-scripts.json
["hubot-redmine-notifier"]
```

## Redmineの設定

RedmineにWebHookプラグインをインストールします。

* [suer/redmine_webhook](https://github.com/suer/redmine_webhook)

```bash
$ cd $RAILS_ROOT/plugins
$ git clone git://github.com/suer/redmine_webhook.git
$ bundle install --without development test
$ rake redmine:plugins:migrate RAILS_ENV=production
```

インストール後Redmineを再起動し、WebHookのURLを設定します。
設定するURLは `http://<hubot-host>:<hubot-port>/hubot/redmine-notify?room=<room>`です。

![redmine-webhook-settings-screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/6092/fbe17c50-2ba2-5903-4d50-d9425b29b76d.png)
No.1: 狼と山羊とキャベツ

# A Wolf, a Goat and a Cabbage.


ある川の岸に男と狼と山羊とキャベツがいる。男は狼と山羊とキャベツを連れて舟で川を渡ろうとしているが、舟は小さいので、男の他には狼と山羊とキャベツのいずれかひとつしか乗せられない。また、男が見張っていないと狼は山羊を食べてしまい、山羊はキャベツを食べてしまう。どのようにすれば男は無事に全員を連れて対岸に渡れるだろうか。


```hs:WolfGoatCabbage.hs
module Main where
import Data.Maybe (fromJust)

data Shore = Here | There deriving (Eq, Show)
data Move = M | MW | MG | MC deriving (Eq)
instance Show Move where 
  show m = case m of {M->"男だけ"; MW->"男と狼"; MG->"男と山羊"; MC->"男とキャベツ";}

type Locations = (Shore, Shore, Shore, Shore) -- (man, wolf, goat, cabbage)
type History = (Locations, [Move]) -- (locations of characters, log of moves)


isLegal :: History -> Bool
isLegal ((m,w,g,c),l) = 
  if (w==g) && (m/=w)
    then False
	else if (g==c) && (m/=g)
	       then False
		   else True

step :: History -> [History]
step ((m,w,g,c),l) = filter isLegal $
  [((move m,w,g,c),M:l)] ++ 
  (if m==w then [((move m, move w, g, c),MW:l)] else []) ++
  (if m==g then [((move m, w, move g, c),MG:l)] else []) ++
  (if m==c then [((move m, w, g, move c),MC:l)] else [])
    where move x = if x==Here then There else Here

next = concat . map step
solve = fromJust . lookup (There,There,There,There) . concat . iterate next . return
format = ("":). (flip (zipWith (++))) (cycle ["が行く ","が戻る "]) . map show . reverse

main = mapM_ putStrLn $ format $ solve ((Here, Here, Here, Here),[])

```

# 出力
*Main\>  main

男と山羊が行く
男だけが戻る
男と狼が行く
男と山羊が戻る
男とキャベツが行く
男だけが戻る
男と山羊が行く
インクリメントへのちょっとしたこだわり

# 例

JavaScriptですが、内容的には言語不問です。

```html:example.html
<script src="example.js"></script>
<p id="number"></p>
```

```javascript:example.js
window.onload = function () {
  setInterval(
    (function () {
      var list = ['a', 'b', 'c', 'd', 'e'];
      var number = document.querySelector('#number');
      var i = 0;
      number.textContent = list[i];
      return function () {
        number.textContent = list[i = (i + 1) % list.length];
      };
    })(),
    500
  );
};
```

着眼点はこ↑こ↓

```javascript
var i = 0;
number.textContent = list[i];
return function () {
  number.textContent = list[i = (i + 1) % list.length];
}
```

## 無限インクリメントって整数の上限を考えるとちょっとアレ？

```javascript
var i = 0;
number.textContent = list[i];
return function () {
  number.textContent = list[++i % list.length];
};
```

あんまりこうは書きたくないかなぁ…

## 後置インクリメントよりは前置インクリメントの方が流れ的に自然じゃない？

今回は結果的に `++` 演算子は使ってないけど、

```javascript
var i = 0;
number.textContent = list[i++];
return function () {
  number.textContent = list[i++ % list.length];
};
```

何かこう書くとちょっと分かりにくいような…
OSX MavericksにKyotoCabinet/KyotoTycoonをインストール


KyotoCabinet, KyotoTycoonが(ソースで入れると)OSX Mavericksで素直に入らなくてちょっと困ったので、メモ。

追記: Homebrewがあるじゃないか...。Mavericksでも問題なくインストールできるようなので追記しました。

# Homebrewからインストールする場合

```bash
$ brew install kyoto-cabinet
$ brwe install kyoto-tycoon
```

# ソースからインストールする場合

## KyotoCabinet

KyotoTycoonのインストールに必要なライブラリである, KyotoCabinetのインストールではc++のtr1/以下にあったunordered_mapなどの比較的新しいコレクションがtr1/を付けないでincludeするようになった関係でうまくコンパイルできないため、親切な人が作ってくれているパッチをあてるとよいです。

- https://gist.github.com/eungju/7366318

```bash
$ cd /usr/local/src
$ wget http://fallabs.com/kyotocabinet/pkg/kyotocabinet-1.2.76.tar.gz
$ tar xvzf ./kyotocabinet-1.2.76.tar.gz
$ cd kyotocabinet-1.2.76
$ wget https://gist.githubusercontent.com/eungju/7366318/raw/20548ce6addf4e996fc1e562a03bb0aa3a16a18e/kyotocabinet-mavericks.patch
$ patch < kyotocabinet-mavericks.patch
$ ./configure
$ make
$ sudo make install
```

## KyotoTycoon

KyotoTycoonも、コンパイル時にgetpidが解決できないというエラーが出るようになったので、`#include <unistd.h>` を`ktdbext.h`に追加します。

```bash
$ cd /usr/local/src
$ wget http://fallabs.com/kyototycoon/pkg/kyototycoon-0.9.56.tar.gz
$ tar xvzf ./kyototycoon-0.9.56.tar.gz
$ cd kyototycoon-0.9.56
$ vim ktdbext.h
$ ./configure
$ make
$ sudo make install
```

# 参考リンク

- KyotoCabinet: http://fallabs.com/kyotocabinet/
- KyotoTycoon: http://fallabs.com/kyototycoon/
- https://gist.github.com/eungju/7366318
- http://giwacchi.hatenablog.com/entry/2013/03/10/013548
Ansibleで複数のサーバを操作する


## はじめに

Ansibleで複数のサーバを操作する方法を記述します。

## 環境

* CentOS 6.5
* Ansible 1.7

## Ansibleのインストール

* epelリポジトリの追加

```shell
$ curl -O http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum localinstall epel-release-6-8.noarch.rpm
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * epel: ftp.tsukuba.wide.ad.jp
 * extras: www.ftp.ne.jp
 * updates: ftp.tsukuba.wide.ad.jp
repo id                 repo name                                                       status
base                    CentOS-6 - Base                                                  6,367
epel                    Extra Packages for Enterprise Linux 6 - x86_64                  11,105
extras                  CentOS-6 - Extras                                                   15
updates                 CentOS-6 - Updates                                               1,597
repolist: 19,084

$ rpm --import http://ftp.riken.jp/Linux/fedora/epel/RPM-GPG-KEY-EPEL-6
```

* Ansibleのインストール

```shell
$ sudo yum install ansible
$ ansible --version
ansible 1.7
```

## Ansibleでの操作

* インベントリファイルを作成します。

```ini:~/ansible_hosts
[localhost]
127.0.0.1

[servers]
web001
web002
db001

[web]
web001
web002

[db]
db001
```

* 全サーバでhostnameコマンドを実行します。

```shell
$ ansible -i ansible_hosts all -a "hostname"
web001 | success | rc=0 >>
web001

web002 | success | rc=0 >>
web002

db001 | success | rc=0 >>
db001

127.0.0.1 | success | rc=0 >>
client
```

※ 各サーバへのsshでのログインにパスワードが必要な場合は、 ``--ask-pass`` オプションを指定します。

```shell
$ ansible -i ansible_hosts all -a "hostname" --ask-pass
```

* webサーバのみでhostnameコマンドを実行します。

```shell
$ ansible -i ansible_hosts web -a "hostname"
web001 | success | rc=0 >>
web001

web002 | success | rc=0 >>
web002
```

__|(パイプ)__ などを使用したい場合は、 __shell__ モジュールを利用します。
モジュールを指定しない場合は、 __command__ モジュールが利用されます。

```shell
$ ansible -i ansible_hosts web -m shell -a "hostname | tr '[:lower:]' '[:upper:]'"
web001 | success | rc=0 >>
WEB001

web002 | success | rc=0 >>
WEB002
```

* root権限でコマンドを実行したい場合は、``--sudo``オプションを指定します。

```shell
$ ansible -i ansible_hosts web -a "whoami" --sudo
web001 | success | rc=0 >>
root

web002 | success | rc=0 >>
root
```

※ sudoコマンドでパスワードが必要な場合は、``--ask-sudo-pass``オプションを指定します。

```shell
$ ansible -i ansible_hosts web -a "whoami" --sudo --ask-sudo-pass
```

* リモートサーバで別アカウントでコマンドを実行したい場合は、``--sudo-user``オプションを指定します。

```shell
$ ansible -i ansible_hosts web -a "whoami" --sudo --sudo-user admin
web001 | success | rc=0 >>
admin

web002 | success | rc=0 >>
admin
```

## 参考
* [Ansible is Simple IT Automation](http://www.ansible.com/home)
* [Ansible Documentation](http://docs.ansible.com/)
* [Inventory](http://docs.ansible.com/intro_inventory.html)
* [Introduction To Ad-Hoc Commands](http://docs.ansible.com/intro_adhoc.html)
* [ansible/ansible](https://github.com/ansible/ansible)
Scalaのfold関数が許される条件がわからない


以下に書いてるのは推測でしかないので、あとでドキュメントをさらってみる。

例えば、リストを処理してfoldでまとめるコードがあったときに、以下のコードだとコンパイルが通らない。理由は最初のmapの戻り値とfoldの第一引数のアキュムレータの型の一致が確定できないからだと思う。

```scala
Source.fromFile(logListFileName, enc).getLines().toList map { logfile =>
  transform(logfile)
} foldLeft(Map[Foo, Int]()) { (acc, m) =>
  // merge
}
```

そう考えるのは、reduceならコンパイル通るから。

```scala
Source.fromFile(logListFileName, enc).getLines().toList map { logfile =>
  transform(logfile)
} reduceLeft { (acc, m) =>
  // merge
}
```

以下のようにカッコで囲って（演算順序を特定してることになるのか？）やればOKだった。

```scala
(Source.fromFile(logListFileName, enc).getLines().toList map { logfile =>
  transform(logfile)
}).foldLeft(Map[Foo, Int]()) { (acc, m) =>
  // merge
}
```

もしくは一旦、変数に入れる。

```scala
val bar = Source.fromFile(logListFileName, enc).getLines().toList map { logfile =>
  transform(logfile)
}
bar.foldLeft(Map[Foo, Int]()) { (acc, m) =>
  // merge
}
```
Windows 10 Technical Previewをインストールしてみた

Windows 10 Technical Previewが公開されたのでダウンロードした。
ISOは英語か簡体字中国語かポルトガル語（ブラジル）かしかないので、英語64ビットをダウンロードしてVirtualBox 4.3.12にインストールしてみたが、普通に動いているように見える。
VirtualBoxのOSのバージョン選択は「Windows 8.1 (64 bit)」を選んだ。CPU1コア、メモリ2GBでまれに引っかかりを感じるが概ね問題ない。

インストール画面も最初の設定も8.1と比べて特に変わったところはない、と思う。8.1のものを正しく覚えているわけではないが。
とりあえず8以降をインストールしたことがあれば特に迷うことはないだろう。
英語版だが、時刻表記などのロケールやキーボードは日本のものを選ぶことができる。IMEもある。

ビルド番号は9841である。内部バージョンは6.4.9841になっている。
インストール直後でストレージは9.30GB使われていた。
今のところプロダクトキーは入力する必要はなかった。

ちょっと使ってみたけど、以下のような感じ。

* スタートメニューは報道の通り、7までのものの右側に8のスタート画面をひっ付けたようなものになっている。7までのようにスタートメニュー内でシャットダウンできるようになった。
* 8では右下隅に合わせてもチャームが出てこない。左上隅のウィンドウ切り替えもだ。これまで左上隅の切り替えを使わないと切り替えできなかったようなPC設定なんかは普通のウィンドウとして×で閉じることとか_で最小化することとかができるようになっている。なおチャームはWindows+Cで出てくる。これは8などと同じ。
* IEはまだ11だった。
* PowerShellは5になっている。
* コマンドプロンプトが右クリックでペーストできるようになっている。コピーは範囲を選択して右クリックだ。今のPowerShellと同じ挙動。IMEを有効にして入力すると文字化けする。メモ帳やPowerShellでは問題なく日本語文字が入力できるのだが。
* スタートボタンの右隣はコンピュータ内の検索ボタン、その右隣に仮想デスクトップボタン。仮想デスクトップはだいたい想定通りに機能してくれる。
* VirtualBoxのGuestAdditionsのインストールは失敗した。
* ChocolateyをPowerShellでインストールするのは上手く行かなくて、コマンドプロンプトでインストールするのは上手く行った。Chocolateyを使ってFirefoxおよびGoogle Chromeをインストールできることは確認した。
* [AnsibleでWindowsを操作する準備をする](http://qiita.com/yunano/items/f9d5652a296931a09a70)は問題なく成功した。

**2014-10-12追記**: VirtualBox 4.3.18上にもWindows 10 Technical Previewはインストールできた（私は確認していないが4.3.14や4.3.16では失敗するらしい）。しかしGuestAdditionsはまだインストール時にエラーになってインストールできていない。
EvilでのW/Bの挙動の変更

EvilでのW/B(大文字のwとb)は日本語を書いていると思わぬところにすっ飛んでしまうので、変更してみました。

~/.emacs.d/init.elで

```el
(custom-set-variables 
   '(evil-bigword "^ \t\r\n、。;?!？！を" ))
```

とするだけでした。デフォルトは「`^ \t\r\n`」なので、日本語を書いていると思わぬところにすっ飛んでしまうわけです。

ここでは「`、。;?!？！を`」を追記していますが、この辺はデフォルトも含めて好みに応じて変更していただければよろしいかと思います。

MS-DOSのjstevieはitojunさんが「ひらがな」と「漢字」の間や「ひらがな」と「ASCII文字」の間で止まるようにして下さった、と何となくですが記憶にあります。たとえば「漢字」と「ひらがな」が並んでいる場合にはそこで止まるのではなく、通過して次の「漢字」のところで止まります。日本語の文節を意識して作られているのですね。

この仕様は非常に便利で自然だと思いますが、現在のEvilのちょっとしたカスタマイズの範囲内では無理なようです。

# 付記

現在(2014/11/23)のバージョンのEvilではうまく動かなくなっています。

```el
(defun forward-evil-WORD (&optional count)
  "Move forward COUNT \"WORDS\".
Moves point COUNT WORDS forward or (- COUNT) WORDS backward if
COUNT is negative. Point is placed after the end of the WORD (if
forward) or at the first character of the WORD (if backward). A
WORD is a sequence of non-whitespace characters
'[^\\n\\r\\t\\f ]', or an empty line matching ^$."
  (evil-forward-nearest count
                        #'(lambda (&optional cnt)
                            (evil-forward-chars evil-bigword cnt))
                        #'forward-evil-empty-line))
```

とinit.elに書くことで解決しました。
SKKでのローマ字入力マップの変更

かなモードで`?`が`？`になってしまうのが嫌で、変更してみました。以下の変更で`?`をそのまま`?`として入力できます。

# ddskkの場合
~/.skk か ~/.emacs.d/init.elに

```el
(setq skk-rom-kana-rule-list
      '(("?" nil "?")))
```

 ~~と書いて、~~

~~(skk-compile-rule-list skk-rom-kana-base-rule-list
 skk-rom-kana-rule-list)~~

~~とすると変更できるようです。`skk-compile-rule-list`を呼ばないといけないなんて…。~~


と書くと変更できます。

# libskkを使っているインプットメソッドの場合

`/usr/share/libskk/rules/default/rom-kana/default.json' の

```json
           "?": ["", "？" ],      
```

という行を

```json
           "?": ["", "?" ],      
```

に変更して、インプットメソッドを再起動するとかなモードでも`?`で`?`が入力できるようになります。`？`は全英モードで入力すればいいので、大きな問題はないと思います。

もしかしたら

```json
           "?": ["", "？" ],      
```

行を削除するだけでもいいかもしれませんね。
Xcode6でmodal segueがうまくunwindできない人の対症療法


ども、ストーリーボードオタクのtaです。ストーリーヲタじゃないよ？　あとストリートヲタでもない。
図とかコードとかないので読みづらいと思いますが相済みません。なにかしら困ってる方のヒントになれば。

なお、結論から言うと、「unwind先を別に設定しろ」です。

##XCode5では、どうだったのか
UINavigationControllerとリレーション接続したViewControllerから、モーダルセグエでモーダルなVCに遷移するパターンを想定します。
（NavControllerでVCを包むのは、画面の統一感を出したいとか、上部の左右に、ボタンを簡単に実装したいとか、そんな理由です）

XCode5では、NavgationController（N）と実際に表示するViewController（A）とをストーリボード上でリレーション接続します。
次に（A）と別のVC（B）をモーダルセグエで接続した場合、unwindによる（B）の戻り先を（A）と指定していました。
（NavigationControllerにソースコード追加しないで済むし、遷移の対応付けとしては、常識的な感じがしますね）
そして、これは、期待通りiOS7でも8でも動作します。（XCode5でコンパイルした場合）

##しかしXCode6では動かない
このプロジェクトをXcode6に持ってきて、つまり、iOS8SDKでコンパイルするとモーダルパネルが「unwindできん」ので「動かないよ、リセットリセット」と、割と致命的な不具合が起きるんですよ、デギン閣下。このバイナリは、iOS7でも8でも不具合を起こしてしまいます。（微妙に動作が異なる）
いろいろ試してみましたが、この状態でも、さらに孫のmodalから（B）へのunwindは普通に動くし、（B）に設定したsegue「以外」のIBActionセレクタはEvent駆動するし、ボタンを押すと押されたアニメーションもするので、画面がフリーズしてるわけでもない。

##ひらめきによる回避策
んで、ものは試しに！　NavigationController（N）に、unwindの戻り先セレクタを記述し、直接（B）から、unwindしてやったら、なんと動きやがりました！！！
他に、TABBarControllerを使っている場合、そっちにunwindしてやったり、他のTAB配下のVCにunwindしても動いたりするようです。なんでやねん。
「遷移」の記述方法という観点で見ると、非常に不審で、甚だ怪しい感じですが、とりあえず回避策として、Xcode6でも動くようになりました。納得いかん。

あくまで一時的な対症療法と思いますが、unwind先を変えてみて問題なさそうならそれで行く、という感じですかね〜。ということで、特殊なコードを追加せず解決してみました。

以上、サイド3からのレポートを終わります。寒いのう。

###閑話。
Xcode5.1.1でコンパイルしたものは、iOS8の実機でも期待どおりunwindできるので、他にバグがないのであれば、性急に対応する必要は無いです（リリース済みアプリで不具合起きてるのかと思って一瞬ビビりますね）

Xcode6ではモーダルセグエは非推奨。（あ、プッシュも）。ということなので、新規アプリではまったく別のアプローチのUIを考えるのもいいでしょう。

しかし、そもそも、なんでiOS7と8のSDKでそんなに動作が異なる事態になってるのさ？　デグってるように見えるじゃん？　非推奨にしたからといって、元々の動作と異なるものにしていい道理はないんで、小一時間問い詰めたい。小一時間と言わず問い詰めたい。
休題。
Git、Mercurial、Subversion、Perforce、どれを使う？

ツールが苦手なことをさせるとユーザーが苦労するので苦手分野で判断するといいと思う。

Gitは巨大なバイナリファイルが致命的に苦手だ。DVCSなのも災いしてリポジトリが膨れ上がるので映像関係の人とかはGitは避けるのが無難。

Mercurial(Hg)もDVCSだがHgの場合はファイルを--largeを指定して追加することでそのファイルだけ集中型扱いできるので巨大なバイナリも扱える。バイナリはマージできないのでロックベースで管理するしかないが拡張機能で一応ロックもできるようだし(ロックしないでITSのチケットで同じファイルを触らないように管理するほうがいいと思うけど)。

svnとP4は集中型なのでソースコードを扱う能力はDVCSであるGitやHgよりかなり劣る。ソースコードだけを扱うならこの２つよりはGitやHgの方がいい。ただP4のマージツールはよくできている(見やすい)。VCSにP4を使わない場合でもオススメだ。

GitとHgはツリーを一部だけを作業領域として取り出す操作ができないので、そんな必要がある場合はリポジトリを分割して設計して、それらをsubmodule(Git)、subtreemerge(Git)、subrepository(Hg)などの機能で統合管理する必要がある。というようにGitやHgはツリーの一部だけを扱うのはあまり得意ではない。

とりあえず、

* 大きなバイナリファイルも扱うならsvn、P4、Hg。
* 巨大なデータを扱うならsvn、P4。
* ソースを扱うならGit、Hg。
* ツリーの一部を扱うならsvnやP4がいいが、GitやHgでもできないことはない。
* HgはサブリポジトリにHgだけでなくSVNやGitのリポジトリを使えるのでそういう使い方をする場合はHg一択。
* Gitのブランチは先頭へのポインタであってブランチ自体を認識しているわけではないのでGitをサブリポジトリ/サブモジュールとして使うとupdate/checkoutしたときに「生首(detached head)」状態になってしまう。Gitリポジトリをサブリポジトリ/サブモジュールで使うのはいまいち。

...てなところ。Hgが万能だがdepth指定できるsvnもそれが必要なくらい巨大なリポジトリを扱うなら結構強い。どれか一つだけを選ばなくていいのならデータをsvnに、ソースをHgに置き、Hgのサブリポジトリとしてsvnのビルドに必要な部分だけを取り出すのが万能だろう。

それとここで出てないVCSについて私は使ったことがないので判断材料には含まれていないことを断っておく。
覚え書き 002[UIViewController LifeCycle]

# UIViewControllerのライフサイクル

## ライフサイクル
init
↓
viewDidLoad
↓
viewWillAppear
↓
viewDidAppear
↓
viewWillDisappear
↓
viewDidDisappear

## 各々のタイミング
init:初期化

viewDidLoad:Viewが初めて呼び出されるときに呼び出される．

viewWillAppear:Viewが表示される直前に呼ばれる.度々呼ばれる．

viewDidAppear:Viewの表示が完了した後に呼ばれる．度々呼ばれる．

viewWillDisappear:ViewからViewに切り替える直前に呼ばれる．度々呼ばれる．

viewDidDisappear:ViewからViewに切り替え終わったときに呼ばれる．度々呼ばれる．
ボタンクリックだけでまとめサイトを作れるkimonoがすごい


kimonoはサイトのスクレイピングしたい部分をクリックするだけでスクレイピングしてくれる。

https://www.kimonolabs.com/

![スクリーンショット 2014-10-02 0.57.52 1.png](https://qiita-image-store.s3.amazonaws.com/0/46334/dcc71601-b096-8407-13c6-eafbb64f326d.png "スクリーンショット 2014-10-02 0.57.52 1.png")

[chromeのエクステンション](https://chrome.google.com/webstore/detail/kimono/deoaddaobnieaecelinfdllcgdehimih)もあるのでインストールするとスクレイピングしたいサイトで起動すればすぐにスクレイピングできる。

![スクリーンショット 2014-10-02 0.59.26.png](https://qiita-image-store.s3.amazonaws.com/0/46334/bb08ec66-b7b9-34fa-f257-e30a178f2ece.png "スクリーンショット 2014-10-02 0.59.26.png")

右下に表示されるのは他の人が作成したこのサイト（日経新聞）のスクレイピング。よってサイトによってはクリックしてスクレイピング選択する必要もなし！
Doneすると結果をjson、rss、csvで出力するurlを提供してくれる。以下のようにサイトでの確認も可能。

![スクリーンショット 2014-10-02 1.00.18.png](https://qiita-image-store.s3.amazonaws.com/0/46334/75bf5933-d78a-84e7-583b-cdee549b0054.png "スクリーンショット 2014-10-02 1.00.18.png")


それだけでは終わらない！なんとそのままクリックだけでwebアプリも作成してくれる！

![スクリーンショット 2014-10-02 1.02.46.png](https://qiita-image-store.s3.amazonaws.com/0/46334/70dbb688-285d-5b64-8aa5-ce0e33e494ef.png "スクリーンショット 2014-10-02 1.02.46.png")

チャート表示のようなものも今後提供されるそう。
まだBeta版ということもあり、課金などところところcoming soonになっているが、すごすぎるサービスだ。
Arduinoを触ってみた

#触ったきっかけ
ニコニコ超会議というイベントで見た電子工作が面白そうだったから。
電子工作初挑戦です。

#目標
とりあえず動く環境を作り、Lチカと呼ばれるHello,World的なモノをできるようにする。

#準備
amazonで道具を購入。
http://www.amazon.co.jp/gp/product/B00BQSTYZW

ArduinoIDEのダウンロード(windows用)
http://arduino.cc/en/Main/Software

IDEをインストールするとIUSBドライバも入るので先にインストールを済ませてからつなぎましょう。

#IDEを触ってみる
####マイコンボード/シリアルポートを設定をする
[ツール] -> [マイコンボード]から接続しているボードを選択。
私の場合はデフォルトで繋いだものが選択されてました。

[ツール] -> [シリアルポート]から接続しているポートを選択。
1つしか選択肢が無かったので解りましたが、解らない場合はUSB接続の情報を見ると解るらしい。

####サンプルコードを実行する
ArduinoIDEには多くのサンプルコードが入っています。
当然、Lチカのコードも入ってるので実行してみる。

* サンプルコードを開く

[ファイル] -> [スケッチの例] -> [01.Basics] -> [Blink]
新しいウィンドウが生成されてコードが表示されます。

* マイコンボードにプログラムを転送する

右向きの矢印マークがボード書き込みボタンです。
書き込みを開始すると下のコンソールに状態が表示されます。変更していないので必ず正常に終了するはずです。
プログラムは書き込み完了時点で実行されます。
今回のサンプルは1秒間隔でボード上のLEDが点滅するコードなので、実際に実行されているのを目視確認します。

####サンプルコードを理解する
サンプルコードに書かれているのはコメントを除くと以下のとおりです。

```
void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);   
  delay(1000);              
  digitalWrite(13, LOW);    
  delay(1000);              
}
```

プログラム経験があるとすぐに予想がつきます。

```
void setup()
```
まずコレ。setupというその名の通り起動時に実行されるメソッドです。必ず実装しないといけません。

```
pinmode(num, mode)
```
ピンのモード設定をするメソッドです。設定できるモードはINPUT、OUTPUT、INPUT_PULLUPの3つです。
INPUTは入力、OUTPUTは出力、INPUT_PULLUPは内部のプルアップ抵抗を有効にするモードとのこと。
プルアップ抵抗とはなんぞや？となったのでググってみましたが、ピンと来ないので一旦飛ばして起きます。
参考記事：http://mag.switch-science.com/2013/05/23/input_pullup/

```
void loop()
```
こちらも名の通り、ループ処理をするメソッドです。これも必須メソッドで、loop()の処理が実行され続けます。

```
digitalWrite(pin, value)
```
特定のピンへ出力をするメソッドです。今回は13番ピンへHIGHもしくはLOWの出力を行っています。
HIGHのときは5V(3.3Vのボードでは3.3V)の電圧が、LOWの時は0Vの電圧がかかります。

```
delay(m/s)
```
指定した時間(マイクロ秒単位)プログラムの実行を止めます。
他のプログラミング言語にもある機能と同じように、あらゆる処理が止まるので使うときは気をつけてねとの注意書きがリファレンスにありました。

これで使っているメソッドはすべて説明できたのでこの処理は理解出来ました。
次は実際に自分でコードと回路を組んで実行してみようと思います。
『Unity』でゲーム用2Dアニメーションソフトウェア『Spine』を使えるようにしてみる


###※追記
ランタイムのいつのバージョンからかはわかりませんが、atlasとjson、textureを同時にインポートすれば

Spine表示までの手順の②～⑨までは不要（インポート時にやってくれるよう）になりました。

インポート時に出来上がるprefabをD&Dすれば表示できます

なのでこのページほぼ不要かもしれないです…（時々自動でうまく出来ないことがあるから無駄では無いと思いたい…

#Spineを使えるようにするための前準備

UnityでSpineを使う際にはランタイムが必要なので

公式サイト → ランタイム → OfficialRuntimes → Unity,C# → GitHub からダウンロード

http://ja.esotericsoftware.com/

spine-runtimes-master.zip/spine-runtimes-master/ の中にある

>spine - csharp
spine - unity

という、2つのフォルダが必要ランタイムなのでUnityを起動してproject内にD&D

※Editorフォルダに入れなくても大丈夫っぽい



#Spine表示までの手順
 

Unity Projects/Spine/Assets/SpineRuntime/spine-unity/Assets/Examples/Spine
の中にある

>dragon.atlas
dragon.json
dragon.png
dragon2.png


というサンプルを使って説明

※上記以外はUnity内で作るので不要


###①上記の中からatlas、jsonの拡張子を .txt にする

リネームで、『dragon_atlas.txt』『dragon_json.txt』のようにどっちがどっちかわかるようにする

![01.png](https://qiita-image-store.s3.amazonaws.com/0/39358/735dafe2-d900-9e6d-6ea4-02d2e76e5d5d.png)


###②Materialを作る

シェーダーはSpine用のシェーダーが追加されているので、Spine/Skeletonというシェーダーを使う

※Spine用のシェーダーは強制ではないので画像に合ったものに変えても良い

![03.png](https://qiita-image-store.s3.amazonaws.com/0/39358/db4b1306-d20e-0cb4-3a23-627ba7b9286a.png)


###③Project内にCreateからSpineAtlasを作る

![02.png](https://qiita-image-store.s3.amazonaws.com/0/39358/0f4bc29b-ad59-69bb-fa37-46e3748083d7.png)


###④Project内にCreateからSpineSkeletonDataを作る

![05.png](https://qiita-image-store.s3.amazonaws.com/0/39358/07a1fe0e-438b-6ed0-96dd-ba5f47c3b35e.png)


###⑤作ったSpineAtlasに .txt にしたatlasとMatrialを、Inspector上にD&Dで登録する

![06.png](https://qiita-image-store.s3.amazonaws.com/0/39358/5a2eaba6-a265-15cd-f9a2-14bee6035916.png)


###⑥SpineSkeletonDataに⑤で作ったSpineAtlasと .txt にしたjsonをInspector上にD&Dする

![07.png](https://qiita-image-store.s3.amazonaws.com/0/39358/4161c532-809f-a06e-f1b3-a9fc3ba0ffd6.png)

###⑦SpineSkeletonDataに、AddMixというボタンが出来るので使いたいアニメーションの数だけ登録する

アニメーションの種類はAnimationStateDataの中にあるアニメーション毎の名前で選べる 

AnimationStateDataには横に2つアニメーションの名前があるが、横に同じ名前が並ぶように選ぶようにする

![12.png](https://qiita-image-store.s3.amazonaws.com/0/39358/831f6f43-0605-a274-3445-983eab04a8b2.png)

###⑧ Hierarchy内にCreateからSpineSkeletonAnimationを作る

![13.png](https://qiita-image-store.s3.amazonaws.com/0/39358/d5df04a5-826e-f0c3-4007-218fa233ed20.png)

###⑨Inspector上に、⑥～⑦で作ったSpineSkeletonDataをD&Dする

Loopや、Animationをさせたい場合はInspectorから設定 

Skinを使う場合InitialSkinを表示させたいSkinに変更

![08.png](https://qiita-image-store.s3.amazonaws.com/0/39358/8e436966-0015-e154-8225-aefc2a602d93.png)

![11.png](https://qiita-image-store.s3.amazonaws.com/0/39358/2f0a9927-b8d5-5e13-80da-e4bd0fcda9e0.png)


###⑩下画像みたいな感じで表示されていたら完了！！

![10.png](https://qiita-image-store.s3.amazonaws.com/0/39358/b32dcc17-0c34-5df4-4227-349a56b8c565.png)
Chromebookの開発環境

ChromeOSがあまり開発者向きではないことを知らず購入した後、何とかできないものかと弄ってみました。結局Macを購入しましたが、何かの参考になれば幸いです。

## Chromeのカスタマイズ

- Speed Dial3: 新しいタブを拡張。
- EditThisCookie: Cookieの管理。
- Pocket: ウェブサイトの一時保管場所。
- Adblock Pro: 広告ブロックツール。

## アプリ

- Office系:Google Apps Scriptが使える。
- Save to Pocket: オフライン用Pocket。
- Enjad: 英和辞典。オフラインでも利用可能。
- Text: エディタ。HTML/PHP/JSのハイライトを確認。
- Memo Notepad: シンプルなメモ帳。オフラインでも利用可能。
- [Nitrous.IO](https://www.nitrous.io): IDE。
- Chrome Dev Editor: IDE。フロントエンド開発向け。GitHubと連携可能。

## あまり使わなかったもの

- Bookmark#: SpeedDial3で充分だった。
- Neater Bookmarks: SpeedDial3で..
- BookMarks Menu: SpeedDial3が便利すぎて...
- Web Developer: 入れたものの使いこなせず放置。
- Markdown Here: 使う機会が無かった。人によっては便利かもしれない。
- md everywhere: markdownを確認するためだけに入れた。挙動が好きになれない。
- amCoffee: ConsoleをCoffeeScript用にするらしい。入れただけ。
- [ハイライト表示](www.keywordhighlight.com): 検索結果をハイライト表示してくれる。便利だけど無効にしたらそのまま放置していた。

## その他

購入したのはHPのChromebook11です。Ubuntuを入れようかとも思いましたがshellコマンドが見当たらなかったので断念(もしかしてリカバリーモードで起動しなければできない？)

[ideone.com](http://www.ideone.com)を使えば特に環境設定を行わなくてもある程度はできるかも知れません。
MEAN.js使ってみる。ついでにTravisCIも


TravisCIでテストに失敗してもPASSってなっちゃうんですけど、、、どなたか教えてくださいってことで、これまで作業した内容をあげてみます。

最近仕事でjavascript使ってるので、自分でもなんかアプリを作ろうと思って、環境構築中。

MEAN.jsとはMongoDB、Express、AngularJS、Node.js この組み合わせ。
クライアントもサーバもjavascriptで作れる。MongoもJSON扱うので親和性が高い組み合わせっぽい。

## MEAN.jsでアプリ作成

### とりあえずGitHubにリポジトリ作成

```
$ mkdircd ~/uzura
$ touch README.md
$ git init
$ git add README.md
$ git commit -m "first commit"
$ git remote add origin git@github.com:akokubu/uzura.git
$ git push -u origin master
```

### Yoemanでひな形作成

```
$ sudo npm install -g yo
$ sudo npm install -g generator-meanjs

$ yo meanjs
You're using the official MEAN.JS generator.
? What would you like to call your application? UZURA
? How would you describe your application? Full-Stack JavaScript with MongoDB, Express, AngularJS, and Node.js
? How would you describe your application in comma seperated key words? MongoDB, Express, AngularJS, Node.js
? What is your company/author name? LONGPOSITION INC.
? Would you like to generate the article example CRUD module? Yes
? Which AngularJS modules would you like to include? (Press to select)
❯◉ ngCookies
◉ ngAnimate
◉ ngTouch
◉ ngSanitize
```
名前入れたくらいでデフォルト。README.mdがconflictするので上書き(Y)を指定

### MongoDB
以前にhomebrewで入れてたっぽい。起動しておく。

```
$ mongod
```

### アプリ起動

```
$ grunt
[nodemon] starting `node --debug server.js`
debugger listening on port 5858

 NODE_ENV is not defined! Using default development environment
MEAN.JS application started on port 3000
```
起動したみたい。自動的にはブラウザ開いてくれない
http://localhost:3000/
にアクセスして、サンプルアプリが表示されればOK！

### テスト実行

```
$ grunt test
```
6 passing (160ms)って出てるので最初から用意されてたテストが実行されてるみたい。

## TravisCI
継続的インテグレーションってやつ。最初にやっとかないと最後までやらないよねってことで。

GitHubの公開リポジトリならば無料とのこと。隠すようなものもないし、誰にも注目されてないからこれで大丈夫。
https://travis-ci.org

GitHubのアカウントでログインすると、リポジトリの一覧が出てくるので、さっき作ったリポジトリをONにする。

.travis.yml ってファイルが必要みたいだけど、ひな形に含まれているので大丈夫そうなので、とりあえずそのままpushしてみる。

```.travis.yml 
language: node_js
node_js:
  - "0.10"
env:
  - NODE_ENV=travis
services:
  - mongodb
```
```
$ git add .
$ git commit -m "meanjs generate"
$ git push
```

ビルド成功した。
![build pass](http://i.gyazo.com/2452e52c04925e5373bbee786d3f4edb.png)

### テスト失敗させてみる

```app/tests/user.server.model.test.js
	describe('Method Save', function() {
		it('should begin with no users', function(done) {
			User.find({}, function(err, users) {
				users.should.have.length(0);
				done();
			});
		});

users.should.have.length(0);
↓
users.should.have.length(1);
これで失敗するはず
```

```
$ git commit -am "test fail"
$ git push
```

TravisCIのビルドが、、、失敗しない・・・
![build fail1](http://i.gyazo.com/60a4781704160105785013b3f245bf27.png)
![build fail2](http://i.gyazo.com/60f79efe41186785698b09ae9ea3e30a.png)
テストは失敗しているようなんだけど、ビルド自体はPASS。ローカルで実行してみても終了コードが0になってて、どうすればテストに失敗したら、ビルドが失敗するようになるのかわからない・・・
Ruby | 日付フォルダ生成用 CLI ツール defoker gem を作成した

# Ruby | 日付フォルダ生成用 CLI ツール defoker gem を作成した
## 概要
日付フォルダ生成用 CLI ツール defoker gem を作成しました。

日付フォルダとは、

~~~
20140909
201409
2014
20140909_hoge
201409_hoge
2014_hoge
~~~

こういうフォルダです。

## 機能
* 当日、翌日、前日の日付フォルダの生成（サフィックス有り無し切り替え可能）
* 当月、翌月、前月の日付フォルダの生成（サフィックス有り無し切り替え可能）
* 当年、翌年、前年の日付フォルダの生成（サフィックス有り無し切り替え可能）
* 連続した日のフォルダ一括生成（サフィックス有り無し切り替え可能、フォルダ数指定可能）
* 連続した月のフォルダ一括生成（サフィックス有り無し切り替え可能、フォルダ数指定可能）
* 連続した年のフォルダ一括生成（サフィックス有り無し切り替え可能、フォルダ数指定可能）

詳細は、GitHubの使用例をご確認ください。
https://github.com/tbpgr/defoker

## デモ

![defoker.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/11a08802-1e12-7fb3-996e-c7ff2a14fb60.gif)

## スライド

[defoker slide](http://tbpgr.github.io/defoker_slide)

## 参照
* [defoker GitHub](https://github.com/tbpgr/defoker)
* [defoker RubyGems](http://rubygems.org/gems/defoker)
Clojureで二進化十進表現

BCD そう、それは 二進化十進表現

```clj:bcd.clj

(ns bcd-clj.core)

; 桁数計算
(def counter (ref 0))
(defn calc-digits [num]
  (dosync (alter counter inc))
  (def result (quot num 10))
  (if (>= result 1) (calc-digits result) counter)
  (deref counter))

(defn toBCD [num]
  (def digits (calc-digits num))
  (def str-array
    (for [x (range digits)]
      (Integer/toBinaryString (int (.charAt (.toString num) x)))))
  (map (fn [x] (subs x 2)) str-array))

(toBCD 1234567890)

```

clojure 書ける人はもっとスマートな書き方出来るんでしょうね。
UnityでAndroid用ゲームアプリを作って公開までやってみた

#ゲームアプリ
今回はUnityチュートリアルを参考にして2Dシューティングゲームを作ってみました。
Android端末をお持ちの方はぜひ遊んでみてください。  

  

[アプリをダウンロードする](https://play.google.com/store/apps/details?id=com.DoragonSlayer)
![Dragon Slayer.png](https://qiita-image-store.s3.amazonaws.com/0/36607/36969c99-1a94-89ec-d261-5113a3f7b06e.png)



# 広告をつける
今回は[nend](http://nend.net/)にお世話になりました。
[Unityプラグイン](http://nend.net/dl/mediapartner/)にマニュアルが付属してあるので、それを読めばすんなり導入できました。


# アプリ公開前にしておくこと

### 電子署名
[この](https://akira-watson.com/android/unity-android-release.html)あたりを参考にやりました。
Unityだけで完結できるので簡単にできました。

### Google Play デベロッパーの登録
登録料として25ドルが必要です。
詳しくは[こちら](https://support.google.com/googleplay/android-developer/answer/113468?hl=ja&authuser=1)から

### アプリ公開時に必要なものを準備しておく
* 署名済のapk
* スクリーンショット　　　　　全体で少なくとも 2 つのスクリーンショットが必要です
* 高解像度アイコン　　　　　　512 x 512 32 ビット PNG（アルファ付き)
* 宣伝用画像　　　　　　　　　横1,024 x 縦 500 JPG または 24 ビット PNG（アルファなし）
* 連絡先のメールアドレス　　　このアドレスはアプリと一緒に公開されます

# 素材提供

[キャラチップ]
* [ひぽや倉庫](http://piposozai.wiki.fc2.com/)
* [王国興亡記](http://ameblo.jp/makapri/)
* [黒幕亭劇場](http://www.geocities.jp/kurogeki/)
* [なにかしらツク～ル](http://nanikasiratkool.web.fc2.com/index.html)
* [ＴＡＲＧＥＴ　ＥＹＥＳ](http://www.geocities.co.jp/Playtown-Bingo/5789/sozai-enter.htm)

[ BGM・SE]
* [スキップモア](http://www.skipmore.com/)
* [魔王魂](http://maoudamashii.jokersounds.com/)
AngularJS + CoffeeScript + Protractor + GruntでE2Eテスト環境構築

## 前提

[Yeoman](http://yeoman.io/) + [AngularJS Generator](https://github.com/yeoman/generator-angular)を使って構築し、Gruntfile.jsをGruntfile.coffeeへ書き換えた環境を前提としています。

```
yo anguar --coffee
```

Gruntfile.coffeeに関してはこちらをどうぞ
http://qiita.com/rneuo/items/c7d449a7361fe9cea236#2-3

## 概要

### インストールモジュール説明

AngularJS + CoffeeScript + Protractor + Gruntでテスト環境を構築するにあたって、下記のnodeモジュールを使って構築してみたいと思います。

- Protractor本体
    - https://github.com/angular/protractor

- CoffeeScriptでspecを記述するProtractorプラグイン
    - https://github.com/lebek/protractor-coffee-preprocessor

- Protractorを実行させるGruntプラグイン
    - https://github.com/teerapap/grunt-protractor-runner

- ProtractorにバンドルされているSelenium WebdriverをstartさせるGruntプラグイン
    - https://github.com/seckardt/grunt-protractor-webdriver

### テスト実行環境

下記のようにSeleniumサーバーとProtractor内のBrower Driversによってテストスクリプトを実行します。

```
 [Test Scripts] < -- > [Selenium Server] < -- > [Browser Drivers]
    protractor             port:4444                 port:9001
        ↓                                       chrome browserのdriver
     jasmine
    
```

- Test Scripts
    - e2e用のspecファイル
    - [protractor](https://github.com/angular/protractor)を使用してspecファイルを記述
- Selenium Server
    - [protractor](https://github.com/angular/protractor)にバンドルされているSelenium Webdriverサーバーを使用する
- Browser Drivers
    - [protractor](https://github.com/angular/protractor)にバンドルされているChrome Driverを使用する

## インストール

```
npm install protractor --save-dev
npm install protractor-coffee-preprocessor --save-dev
npm install grunt-protractor-runner --save-dev
npm install grunt-protractor-webdriver --save-dev
```

```
node_modules/protractor/bin/webdriver-manager update
```

package.jsonの末尾のscriptsの項目を下記のように書き換える。次回から`npm install`で更新できるようにする

```json:package.json
  "scripts": {
    "test": "grunt test",
    "install": "node_modules/protractor/bin/webdriver-manager update"
  }
```

### その他の設定

`yo angular --coffee`し、Gruntfile.coffeeへ変換した後の差分は[こちら](https://github.com/rneuo/sample-angular/commit/7fe37218391d2845d5392ddbb31df616300ed452)をどうぞ

## 連絡

いろんなやり方があると思いますが、よく見るやり方で色々はまってしまいました、、
上記のやり方ですんなりいったのですが、もっといい方法があれば是非コメントよろしくお願いします！
【初心者向け】Java実行環境構築

Javaの実行環境の構築の仕方です。
ここではWindows環境での構築を説明します。

### やり方
1.Javaをダウンロード
[こちらのページ](http://www.oracle.com/technetwork/java/javase/downloads/index.html)よりダウンロードできます。
JDKをダウンロードします。(JREでも実行することは可能です)

2.インストール
ダウンロードしたJDKをインストールします。
exeファイルを実行してインストールします。
インストールするときに選択する項目がありますが、デフォルトで大丈夫だと思います。

3.Pathの設定
Pathを設定することによって、現在のディレクトリに関係なくJavaコマンドなどを使うことができます。
PC画面左下のWindows>コンピュータ>システムのプロパティ>システムの詳細設定を開きます。
開くと画面の右下に「環境変数」というボタンがあるのでそこをクリックして画面を開きます。

画面下半分に「システム環境変数」という項目があります。
その中に「Path」という変数があるかを探します。

##### Pathがあった場合
Pathの部分を選択して編集ボタンをクリックします。
「変数値」の項目の最後に、「C:\java\jdk1.7.0_21\bin;」(自分のインストールしたパス、バージョンを入力してください)を追加で記入します。
このときにもともと記入してある内容を変更してしまわないように気を付けてください。
また、もともと入力してあった内容の最後に「;」がついていなかった場合はつけてから記入してください。

##### Pathがなかった場合
新規ボタンから「変数名」に「Path」、「変数値」の項目に、「C:\java\jdk1.7.0_21\bin;」(自分のインストールしたパス、バージョンを入力してください)を記入します。

ともに「OK」ボタンで編集を終了します。
これでPathの設定は完了です。

4.インストールできたか確認する
コマンドラインを起動します。

```lang:コマンド
javac -version
```

を実行します。
バージョンが表示されれば、実行環境の構築は完了です。

このときにエラーが出る場合は、Pathの設定が間違っている可能性が高いです。
Pathに設定した、jdkをインストールしたディレクトリのパスが間違っていないか、「;」でほかのパスと区切られているか、などを確認してみてください。

以上になります。
これでJavaのプログラムを実行したり、開発することができます。
Exceptionや$_RQUESTを手抜き整形でかんたんエラー通知(HTMLメール)


エラー(例外)発生時にメールで通知したいけど、StackTraceやリクエスト情報をメール本文用にまじめに整形するが面倒だったので、こんな関数を用意して```var_dump```の結果をそのままメールで送るという手抜きをしました(*ﾉω・*)ﾃﾍ

```php
	/**
	 * @param \Exception $e
	 * @return string
	 */
	function errorToHtml(\Exception $e)
	{
		ob_start();
		echo '<pre style="font-family: monospace; white-space: pre;">';
		echo $e;
		echo "\r\n";
		var_dump($_SERVER);
		echo "\r\n";
		var_dump($_REQUEST);
		echo '</pre>';
		$ob = ob_get_clean();

		return $ob;
	}
```

Herokuを使っているので送信ロジックは[Heroku + PHP + SendGrid でメールを送信する](http://qiita.com/shin1x1/items/c8569424753d1a2c36f8)を参考にしました。
送信した結果はこんな感じ。

![_ERROR__test_-_i_am_really_you_gmail_com_-_Gmail.png](https://qiita-image-store.s3.amazonaws.com/0/3899/8c48ad72-d8e7-a44a-2175-8aec8e6221d8.png "_ERROR__test_-_i_am_really_you_gmail_com_-_Gmail.png")
[PHP]抽象クラスとTraitのコードを見比べる。

##書き比べればなんとかなるはず
##抽象クラス
```php:abstract.php
<?php

abstract class Working
{
    abstract protected function where();
    abstract protected function why();
    abstract protected function how();

    public function work()
    {
    	echo $this->where($where);
    	echo $this->why($reason);
    	echo $this->how($how);
    }
}

class Person extends Working
{
	protected function where()
	{
		return '横浜で';
	}

	protected function why()
	{
		return 'お金欲しいから';
	}

	protected function how()
	{
		return '営業する';
	}
}

$bob = new Person();
$bob->work(); // 横浜でお金欲しいから営業する

```
##trait
traitの1文字目は小文字、のはず…
http://www.infiniteloop.co.jp/docs/psr/psr-2-coding-style-guide.html

```php:trait.php
<?php

trait Working
{
    protected function where($where)
    {
        return $where;
    }

    protected function why($reason)
    {
        return $reason;
    }

    protected function how($how)
    {
    	return $how;
    }

    public function work($where, $reason, $how)
    {
    	echo $this->where($where);
    	echo $this->why($reason);
    	echo $this->how($how);
    }
}

class Person
{
	use Working;
}

$bob = new Person();
$where = '横浜で';
$why = 'お金欲しいから';
$reason = '営業する';
$bob->work($where, $why, $reason); // 横浜でお金欲しいから営業する
```
##結果
ニャル子さんが言う通り、変更頻度が低い実装は、
traitに抜き出したほうが良さそう。
抽象クラスは多重継承した時に、やっかいなことになりそう。
そもそも多重継承ってなくした方がよさそう
nokogiri 1.6.3.1がインストール出来ずにbundle install出来ない現象の解決メモ


### bundle install出来ない


```
$ bundle install

Gem files will remain installed in /home/websites/test.shukuba.net/vendor/bundle/ruby/1.9.1/gems/nokogiri-1.6.3.1 for inspection.
Results logged to /home/websites/test.shukuba.net/vendor/bundle/ruby/1.9.1/extensions/x86_64-linux/1.9.1/nokogiri-1.6.3.1/gem_make.out
An error occurred while installing nokogiri (1.6.3.1), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.3.1'` succeeds before bundling.
```


### 必要なパッケージを入れる

```
$ sudo yum install libxml2-devel libxslt-devel

[snip]
Complete!
```

### nokogiriを追加する。

```
$ gem install nokogiri -- --use-system-libraries=true --with-xml2-include=/usr/include/libxml2/
Building native extensions with: '--use-system-libraries=true --with-xml2-include=/usr/include/libxml2/'
This could take a while...
Building nokogiri using system libraries.
Successfully installed nokogiri-1.6.3.1
Parsing documentation for nokogiri-1.6.3.1
Done installing documentation for nokogiri after 4 seconds
1 gem installed
```


### bundle installする

```
$ bundle install

Your bundle is complete!
```
【メモ】Clojure で 割り算

φ(..)メモメモ

```clj:tmp.clj
;; 普通の割り算
(/ 9 2) ; 9/2

;; 商だけ欲しい
(quot 9 2) ; 4

;; 剰余だけ欲しい 
(rem 9 2) ; 1
```