OmniAICreator/Qiita-1.07M huggingface dataset:
プロトタイピングをして追加実装を楽にする。

メンテナンスしているC++のソースに新しい機能を追加することになった。

####**仕様の確認**
実装を求められている仕様を確認することから始まる。
データの入力と出力と、何を実現したいのかという漠然とした期待から始まる。（それを内部でどのように実装すべきかは、開発者にゆだねられている。）そこで、それが実際にうまくいったときには、どのような結果になるのか、その結果をグラフで確認しやすい枠組みを使おう。

####**プロトタイプしやすいライブラリと言語**
次に、本番の実装と共通するライブラリ（あるいは、同等の機能を持つライブラリ)を、もっとプロトタイピングやテストのしやすい言語を使って、アルゴリズムの検討を行う。

従来MATLABで実現していた機能の多くは、Python統合環境Spyderなど(python + numpy + matplotlib)で容易に利用できます。PythonやC♯などは、C++よりはコーディングが楽な言語です。関数で実装すべきか、クラスで実装すべきかにおいても、事前に試してみることができます。その結果、使い勝手を確かめた設計を、C++で実装することになります。

以下は、spyder統合環境がMATLABに類似した操作性を実現していることを示す例です。

```py:simpleExample.py
from pylab import *
x=linspace(0, 10, 500);
y=sin(x)
plot(x, y, '-')
```

####**ターゲット言語での実装**
そして、追加実装する機能だけをC++で実装します。まだ、統合先のソースとは別にしておきます。そしてC++で実装したものが、他の言語で実装したものと同様な結果が得られれば、追加実装する機能のコードは単体テストをしたような状況になります。（本当はきちんとテストを自動化しなくてはなりませんが）

####**プロジェクトへの追加**
最後は、追加実装した機能を、統合先のプロジェクトに追加する。
追加実装した機能を使う、使わないを簡便に切り替えられるようにしておく。

追記：
　**プロトタイピング時のコーディング指針**
　プロトタイピングを書くときは、記述の簡潔さを優先して書く。（実行速度やメモリの消費量については優先順位を減らす。）
　for文よりは、リストの内包表記の方が記述が簡潔になる。
　不要な変数をなくす。
　一時的な変数を使わなくて済むようならば、一時的な変数を使わない。
　意図している内容がわかる変数名にする。
　新規のコンソールでプロトタイプの動作を確認する。
　（コンソールでの再実行では、前回の変数が残っていて、それでエラーにならずに動作してしまうことがある。）
　暗黙のglobal変数の使用をなくす。
　思い込みというバグを埋め込まないように、プロトタイプを簡潔にわかりやすくする。


付記：
プロトタイピングに用いる言語の例としては、Pythonを用いましたが、人によってはC♯もありだと思っています。C♯で書かれたOpenCVを利用したプログラムをpythonで書き換えるのはとても容易でした。C♯では、C++言語にあるC言語由来の弱点が少ないので記述が簡潔でした。
MaCabのユーザー辞書にmecab-ipadic-NEologdを手動で追加する

最近話題のMeCabの辞書mecab-ipadic-NEologdを使ってみたいと思いユーザー辞書に追加したので、その方法をまとめます。
mecab-ipadic-NEologdの作者の方がSlideShareでインストール方法を紹介していますが、システム辞書に入るのかユーザー辞書に入るのかを見るにはシェルの中身を読むのが面倒だったので手動でユーザー辞書に追加します。
http://www.slideshare.net/overlast/mecab-ipadicneologdtokyordf-46497035

このブログを参考にしました。（このブログではシステム辞書に登録）
https://blog.apar.jp/linux/2796/
あとは、MeCab公式のやり方を参考にしました。
http://taku910.github.io/mecab/dic.html

実際の手順
まずはgitからmecab-ipadic-NEologdをダウンロードする
`git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git`

辞書データとなるCSVを解凍する。
`xz -dkv mecab-ipadic-neologd/seed/mecab-user-dict-seed.*.csv.xz`

解凍したCSVをMeCabの辞書に変換する。
`/usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic -u mecab-user-dict-seed.20150810.dic -f utf-8 -t utf-8 mecab-user-dict-seed.20150810.csv`

最後にMeCabの設定ファイルに作成したユーザー辞書を追加する。
`emacs /usr/local/etc/mecabrc`
`userdic = /dicファイルのパス/mecab-user-dict-seed.20150810.dic`

あと、neologdと関係ないですが、MeCabでは初期設定では半角記号がなぜか、名詞,サ変接続になるので修正する。未知語用のファイルを編集すればできる。
mecab-ipadic-2.7.0-20070801のunk.defの
`SYMBOL,1283,1283,17585,名詞,サ変接続,*,*,*,*,*`
を
`SYMBOL,1283,1283,17585,記号,一般,*,*,*,*,*`
に変更してmecab-dict-indexを実行して辞書を再作成する。

これで終了。固有名詞も結構登録されていて良さそうですね。

###20160206追記
MeCabのTips
`input-buffer overflow. The line is split. use -b #SIZE option.`というエラーがでるときがあるが、本当にオーバーフローしてるわけではなく、入力テキストの最後に改行がないと出るエラーみたい。
Rubyのビット演算とCrystal

Rubyでビット演算を扱ったとき、個人的に便利あるいは不便だなと思ったところの話。また、それに対して最近話題のCrystalを使えばいい感じになるのでは、ということを書いてみました。

## うれしいところ
Rubyでビットや、10進数以外を扱う場面において、やはりうれしいのはコードが読みやすくなる点だと思います。数値リテラルにはアンダースコアを含めることができるので、64ビットとかそういう長いものでも `0xFFFF_FFFF_FFFF_FFFF` のようにわかりやすく書けるし、異なる進数間のやりとりも数値と文字列間のやりとりもとても容易です。

```rb:hoge.rb
"1111".to_i(2) #=> 15
15.to_s(2) #=> "1111"
"%b" % 0b1010 #=> "1010"
```

## つらいところ
ちょっとつらいなと思ったのは、符号なし整数を扱いたいときの左シフトと反転です。
例えば、 `0b1111_1111` を4つ左にシフトした場合 `0b1111_0000` が返ってくることを、また、 `0b0101_0101` のNOTは `0b1010_1010` となることを心のどこかで期待してしまいます。しかし実際には

```rb:hoge.rb
"%b" % (0b1111_1111 << 4)
#=> "111111110000"

"%b" % (~0b0101_0101)
#=> "..10101010"
```

という感じになります（符号なしと指定できないし、型がないので当たり前といえば当たり前ですが…）。NOTの方に至っては左側に無限に1ビットが立ってることを表現するための謎の文字列が返ってきます。

一応解決策として、ほしい大きさの分だけマスクをかければなんとかなるのですが、これを毎回書くのは煩わしい。

```rb:hoge.rb
"%b" % ((0b1111_1111 << 4) & 0b1111_1111)
#=> "11110000"

"%b" % (~0b0101_0101 & 0b1111_1111)
#=> "10101010"
```

## そこでCrystalを使ってみる
解決策として別の言語を使うというのはどうなんだという気もしますが、CrystalはRubyとほぼ同じ文法なので移行は可能だと思います。

もうみなさんご存知かと思いますがCrystalには型があるので、（Rubyのように表現力が必要でなおかつ）ビット演算を扱いたいという場面において、しあわせになる手段のひとつとなるのではないのでしょうか。

先程の左シフト、反転の話もCrystalでは符号なし8ビット整数のサフィックスをつけてやるだけで解決します。

```rb:hoge.cr
"%b" % (0b1111_1111_u8 << 4)
#=> "11110000" 

"%b" % (~0b0101_0101_u8)
#=> "10101010"
```

つよい…

## おわりに
Crystal 応援しています。

参考 (本投稿で使用したCrystalのバージョンは 0.7.5 でした)
[http://crystal-lang.org/docs/syntax_and_semantics/literals/integers.html](http://crystal-lang.org/docs/syntax_and_semantics/literals/integers.html)
ポエム駆動開発記1 :baby_chick: 


2015/08/13

## なぜこれを書いているか

これからのサービス開発で再利用できるようにと思い立ったので、今開発中のサービスで悩んだこと、楽しかったこと、良かったツールなどを書き留めておく。

### ポエムっていいな！でも使い方が分からない！

[会社で「ポエム」を綴ろう！  - Gihyo.jp](http://gihyo.jp/lifestyle/serial/01/poem-driven)を読んで憧れて、[esa.io](https://esa.io/)を使いはじめた。
どうやら、まとまっていなくてもいいからアツい気持ちをポエムに綴れば良いらしい！

と軽い気持ちで始めたら大失敗した。

チームメンバー4人でそれぞれに、今回作りたいものに対する想いをポエんでもらったが、かきっぱなしで全然ミーティングに生かせない。
原因は、

- ポエムは、読み解く努力を払わなければならない。
- 反応を積極的に返さなければならない。
- 新しいツールは、少し自分で使ってみてから展開しなければならない。

ということに気づいていなかったからだった。

特にツールの使い方を知らないうちに展開したのは痛い反省だった。
[esa.io](https://esa.io/)ではドキュメントは、まずWIP(Work in Progress)の状態で投稿される。
ただし、この状態では誰にも通知されない。それに加えて誰もコメントをしあわなかったため、WIPのドキュメントがフワフワと増えていった。しかもそうすると、たまにログインしてくれたメンバーにとっては知らないうちにドキュメントが増えていることになり、ついつい足が遠のくようになってしまった。

#### 解決策

今は、「今後変更がなさそうなものは最初からShipする」ことをお願いしていっている。
ただしこれだけでなく、何をどのように書き込むかについても、ルールづけが必要だと思う。そこは検討中。
iptables 設定以前

iptables ってコマンドのサンプルはたまに見かけるけど、そのコマンドにどういう意味があるのかとかどうやってサービスとして使うのかとかがよくわからなかったので調べました。
具体的な設定例は多く書いてないので他の記事を参照してください。


iptables
=========

*IP パケット*のフィルタリングのルールを設定する。
Linux で使える。

類似なものとして firewall なるものがある。 Centos7 などで採用されており、裏側で iptables を使っている（らしい）。


Basics
------


まず、数種類の *table* がある。通常 filter テーブルを操作することが多く、 `iptables` コマンド実行時にテーブルの指定を省略すると filter テーブルに対して操作が行われる。
filter テーブルでは、遮断・通過させるパケットを決定する。
その他 nat, mangle などのテーブルがあり、 `-t` オプションによって操作するテーブルを指定できる。

それぞれの table にはいくつかの *chain* がある。チェーンの種類には INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING などがあるが、一つのテーブルですべてのチェーンを持っているわけではない。例えば、 Filter テーブルには INPUT, OUTPUT, FORWARD の３つのチェーンがある。

また、 `-N` オプションによりユーザ定義チェーンを作成することができる。作成したチェーンは、ルール定義時に `-j` オプションのターゲットとして指定でき、あるルールにマッチしたパケットはそのチェーンに流す、ということができる。

各チェーン上でルールは sequential に並んでおり、各パケットについて一番はじめにマッチしたルールによってそのパケットの処理が決定される。
そのため、ルールの設定時にはルールを末尾に追加する `-A` オプションを使うことが多い。
どのルールにもマッチしなかった場合、そのチェーンの *policy* によってパケットの処理が決定される。
ポリシーは、 `-P` オプションによって設定される。




Save/Restore Rules
------------------


iptables コマンドによってルールを書き換えた場合、

    # iptables-save > /etc/iptables/iptables.rules

などとすることでそれをファイルに保存する。逆に、このファイルを直接書き換えた場合、及びシステムの起動時は

    # iptables-restore < /etc/iptables/iptables.rules

とすることで保存されたルールを読み込むことができる。
起動時にこの操作を行うサービスが多くのシステムで存在するので、適宜 `systemctl enable iptables` などで有効化する。
このサービスはルールの読み込みを行うのであって、このサービスの有無によって iptables によるフィルタリングが有効化・無効化されるわけではない
（`systemctl disable iptables` としているシステムでも、直接 `iptables` コマンドでルールを操作すれば、それは（再起動するまで）有効になる）。


Examples
---------

filter テーブル INPUT チェーンのポリシーを DROP とする（どのルールにもマッチしなかったすべての内向きパケットを破棄する）

    # iptables -P INPUT DROP


http アクセスを許可する

    # iptables -A INPUT -p tcp --dport http -j ACCEPT


lo interface を通るパケットを許可する

    # iptables -A INPUT -i lo -j ACCEPT

送信元が `192.168.10.0/24` 、送信先が `eth0` であるパケットに IP Masquerade を設定する

    # iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE


参考
----

* http://www.unix-power.net/linux/iptables.html
* http://www.geocities.co.jp/SiliconValley-Cupertino/5128/500_compu/iptables.html
* <http://www.yamamotolab.jt.u-tokai.ac.jp/~hiroshi/education/nwa/txt/nwa12.html>
* <https://wiki.archlinux.org/index.php/Iptables>
* <http://www.math.kobe-u.ac.jp/~kodama/tips-iptables.html>
* <http://www3.big.or.jp/~sian/linux/tips/iptables.html>
* [Stray Penguin - Linux Memo (iptables)](http://www.asahi-net.or.jp/~aa4t-nngk/iptables.html)
* [Stray Penguin - Linux Memo (Iptables tutorial)](http://www.asahi-net.or.jp/~aa4t-nngk/ipttut/index.html)
もしもAWSでMFAが壊れて秘密の質問に答えられなかったら

# Q.もしもAWSでMFAが壊れて秘密の質問に答えられなかったら

**A.かなり面倒くさいし、10,000円以上かかる**

## 概要

多要素認証（MFA)が利用できない状態になり、AWSのサポートに解除申請を出したところ、ピン番号の通知のあとに秘密の質問について聞かれた。登録したのがもう数年前で、しかもどうやら当時秘密の質問を適当に書いていたらしく、答えられなかった。そうすると、以下のようなものの提出を求められた。

- 免許証のコピー
- ガス・電気・水道等公共料金の領収書コピー
- 定形のフォーム（Word)に公証役場で私署証書の認証を受けた書面のコピー

上記をスキャンしてPDFにしてメールに添付して送れとのこと。
私の感想については以下のとおり。

- マジか
- ガス・電気・水道は自動振込で領収書とかないはず
- Word持ってない
- 公証役場ってなんだ？

## 公証役場ってなんだ？

公正証書の作成や私的な書類の署名等が正しいということを証明してくれる機関。
都道府県内に数箇所あり、サイン中心の海外では証明手段として割とポピュラーなものらしい。日本でも、企業が定款を作成した時や、遺言を作成したとき、不動産の取引や金銭の賃借、養育費なんかの取り決めの文書を公正証書としてくれるらしい。また私的文書の署名や日付が確かに本人にその日に書かれたということの証明などもしてくれるとのこと。書いててあまりよくわかっていない。
今回の場合、民間企業へMFAの解除申請を行っているのがたしかに私であるということの証明のために提出するので、私署証書の認証というものになるらしい。この場合、実際に署名を公証人の前で行うパターンと、署名したあとで「たしかにこのサインは私がしました」と自認するなどあるそうで、今回は特に指定は無かったが署名欄は空けて公証人の前で署名することにした。

ちなみに土日祝日お休み以外の９時～１７時が業務時間だそう。
AWS月50円しか使ってないしもう一生アカウント放置で良いんじゃないかという気もしたが、自分のうっかりで交通事故を起こしたようなものだと思って、ちょうど盆休みだし翌日に行ってきた。

## 公証役場訪問

先に公証役場に電話してみたところ、私署証書の認証（公的書類ではないものの署名等の認証）の場合は予約は不要なのでそのまま窓口まで来いとのこと。このあたりはどうも行く公証役場によって手順が違うらしいので、先に電話をしてみたほうが良いだろう。

最寄りの公証役場は電車で３０分ほどのビジネス街の雑居ビルにあった。昼イチに着いたので、私の前には二組だけ。３，４０分ほど待つとパーティションで区切られたブースに通された。公証人は５０代くらいの温厚そうな男性で、私が着席すると、これはどのような文章であるかとの質疑があった。外国の情報処理サービスのアカウントにログインするため使う特別な機械が利用できなくなったため一時的にその利用を解除する申請書である、とごく噛み砕いて話した。理解してもらえたのかは分からないが、それから公証人の前で氏名をローマ字で記入し、記入日を書いた。公証人は良い人で、ごく丁寧な対応をしていただいた。
通してせいぜい５分程度で、それからまた１０分程度待つと認証書が交付された。

AWSから渡された書面には公証人欄は書類内にあったが、日本の場合は書類自体にはサインせず、書類に公証人がサインした証書をホッチキスで止めて割印を押すというような形式になるらしい。あきらかに先方から渡されたフォームと違うのでやや不安になるが、国で定められた手順で公証人が発行した証書が付いているので問題もあるわけなかろうと考えて公証役場を出た。

計１時間ほどで、発行手数料が5,500円＋外国文書加算が6,000円で11,500円。
勉強代である。自業自得である。大人がガタガタ言う金額じゃない。
そう自分に言い聞かせつつもじっと手を見る。

## その他

- 公的な料金の支払い書は無かったので住民票を取って添付した
- WordはGoogleドライブでプレビューできたのでそれで印刷した
- PDFはPhotoshopElementsでスキャナから取り込んだ画像から作った
- 複数のPDFを結合するフリーソフトを使ってまとめた

## 結果

書類をPDFで送付したところ、定時近くだったが２時間ほどでMFAデバイスが解除された。

今度はもうこんな目に遭うまいと、秘密の質問は全部乱数にしてパスワード管理ソフトに記録した。それからMFAの管理をAuthyを利用してマルチデバイス間で利用できるようにした。またrootアカウント以外にもIAMで管理者アカウントを作って、それもパスワード管理ソフトとMFAをAuthyに登録を行った。こんだけやっておけば、二度目はないだろう。

AWSに対してはもうちょい手順を簡略化できないもんかと思うが（本人限定受取の郵便でPIN送るとか）、海外の企業でどこの国に対しても同じような手順を求めたりしてんのかなと思うし、企業の基幹システムなんかを動かしている以上、適当なやり方でシステム乗っ取られたりしたらそれこそ信用に関わるので、仕方ないだろうなとも思う。

とにかく問い合わせの開始からMFA解除まで合計3日かかり、金額的には11,500円＋交通費かかった。しかしまあ、どう考えても自業自得であるし、公証役場に行って私署証書の認証を受けるなどやったことのない経験もできたので、良い勉強になったと思う。
クエリ文字列とハッシュの相互変換




クエリからハッシュ

```irb
irb(main):004:0> CGI.parse('test=hoge&test2=huga')
=> {"test"=>["hoge"], "test2"=>["huga"]}
```



ハッシュからクエリ
```irb
irb(main):009:0> {"test"=>"hoge", "test2"=>"huga"}.to_query
=> "test2=huga&test=hoge"
```


クエリからハッシュにするときは値部分が配列になるのでその点だけ注意が必要
unity > Scene間でstringをやりとりする

```txt:動作確認
Unity 5.1.1-f1 on MacOS X 10.8.5
```

Scene2からScene1のUI > Textに文字を入れたい。

~~public static で変数を宣言して、DontDestroyOnLoad (this);をする。その変数を他のシーンでset/getするようにして使う。~~

(追記 2015/09/01)
以下のDontDestoryOnLoad()が間違いで、DontDestroyOnLoad(

##準備
Scene1に以下を作成する
1. TextFileName :Text
2. Button1 :UI>Button 
3. Button1に下記のButton1Control.csを関連付ける. Button (Script) > On Click()にButton1Control.Button1Click()をFunctionとする。
4. Button1のMy TextにTextFileNameを関連付ける

Scene2に以下を作成する
1. Button2 :UI>Button
2. Button2に下記のButton2Control.csを関連付ける. Button (Script) > On Click()にButton2Control.Button2Click()をFunctionとする。

Build SettingにてScene1とScene2をDrag and Drop.


##code

```csharp:Button1Control.cs
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class Button1Control : MonoBehaviour {

	public static string filename; // used from Scene2

	void Start () {
		DontDestroyOnLoad (this);
	}
	
	public void Button1Click() {
		Application.LoadLevel ("Scene2");
	}
	
	public Text myText; // should be related to TextFileName:Text
	void OnGUI() {
		myText.text = filename;
	}
}
```

```csharp:Button2Control.cs
using UnityEngine;
using System.Collections;

public class Button2Control : MonoBehaviour {
	public void Button2Click() {
		Button1Control.filename = "test.csv";
		Application.LoadLevel ("Scene1");
	}
}
```

##実行の様子

Scene1から実行する。

![Scene1_unity_-_150813_fromScene2_-_PC__Mac___Linux_Standalone__Personal_a.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/6b60ccef-150b-3599-2544-a1bab8ffb71b.jpeg)

![Scene1_unity_-_150813_fromScene2_-_PC__Mac___Linux_Standalone__Personal_b.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/4adcaa00-2327-dfe0-4cd8-20365beafc05.jpeg)

![Scene1_unity_-_150813_fromScene2_-_PC__Mac___Linux_Standalone__Personal_c.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/6b54060d-30d0-d17b-77a7-28f9bf08f5ba.jpeg)

test.csvをScene1に渡すことができた。
facebookログインでユーザーの情報を取得するコード

案外苦戦したので記録

GraphAPIはver2.4を使用。

```ruby:facebook_accesstoken_fetcher.rb
# coding: utf-8
# facebook authorize constant
CLIENT_ID=XXXXXXXXXXXXXXXXXX
# facebook app secret
APP_SECRET = 'XXXXXXXXXXXXXXXXXXXXXXXX'
# 注意:下記定数変更時はfacebook developerでアプリ情報の変更も必要
REDIRECT_URI = 'http://localhost:3000/web/login/new'

module FacebookInformationFetcher


  # facebookログインダイアログのURLを取得
  def login_dialog_url
    return "https://www.facebook.com/v2.4/dialog/oauth?client_id="+CLIENT_ID.to_s+"&redirect_uri="+REDIRECT_URI+"&scope=email"
  end

  # アクセストークンを取得
  def fetch_accesstoken(code)
    url = "https://graph.facebook.com/oauth/access_token?client_id="+CLIENT_ID.to_s+"&client_secret="+APP_SECRET+"&redirect_uri="+REDIRECT_URI+"&code="+code
    uri = URI.parse(url)
    https = Net::HTTP.new(uri.host, uri.port)
    https.use_ssl = true
    req = Net::HTTP::Post.new(uri.request_uri)
    req["Content-Type"] = "application/json"
    return https.request(req)
  end

  # ユーザーデータの取得
  def fetch_user_information(access_token)
    # 登録に必要な情報の取得
    url = "https://graph.facebook.com/me?fields=email,id,name&access_token="+access_token
    uri = URI.parse(url)
    req = Net::HTTP::Get.new(uri.request_uri)
    req["Content-Type"] = "application/json"
    https = Net::HTTP.new(uri.host, uri.port)
    https.use_ssl = true
    res = https.request(req)
    parameter = JSON.parse(res.body)

    if parameter['error']
      # トークンの期限切れ
      if parameter['error']['code'] == 190
        return false
      end
    else
      return parameter
    end

  module_function :login_dialog_url,:fetch_accesstoken,:fetch_user_information
```

facebookログイン時のリダイレクト先でアクセストークン取得用のコードが取得できる。
そのコードを使用してfetch_accesstoken メソッドからアクセストークンを取得。
さらに、アクセストークンを使用してfetch_user_informationメソッドからユーザーの情報を取得する。
どのような情報を取得するかはlogin_dialog_url で返さすアドレスのscopeパラメーターに左右されるのでその辺りは調整しないといけない。

参考ページ
[Facebook OAuth認証（認証ありで誕生日とEmailを取得）](http://www.omnioo.com/record/sns/fb_oauth02/)
[Facebook Login](https://developers.facebook.com/docs/facebook-login/v2.4)
Coqでもあのニンジャパターンマッチが使えるぜ

Coqでペア(2つ組)を束縛するlet式のときにはOCamlと同様に束縛する側にパターンを書くことができる。

```coq:Ninja.v
  let (x, y) := (1, 2) in
  ...
```

しかし、これが3つ組になるとエラーとなる。

```coq:Ninja.v
  let (x, y, z) := (1, 2, 3) in
  ...
```

```
Error: Destructing let on this type expects 2 variables.
```

これはCoqのNinjaパターンマッチが2つ組だけしか考慮していないというわけではない。

```coq
let (変数名1, ..., 変数名n) := 式1 in ...
```
という式は実は一般的に単一コンストラクタを持つすべてのInductive型で使用できることができ、それは次の内容と等価になる。

```coq
match 式1 with
| コンストラクタ(変数名1,...,変数名n) => ...
end
```

これはタプル以外でも使えるという利点がある一方で、入れ子になるパターンでは使えないという不便な点もある。上での3つ組でのエラーはちょうどその場合ではまっているということである(Coqの(1,2,3)は内部では((1,2),3)と扱われる)。

これだと不便だという事で、入れ子になったパターンマッチに対応した構文が用意されている。3つ組でのNinja パターンマッチをしたい場合は次のように書けば良い。

```coq:Ninja.v
  let '(x, y, z) := (1, 2, 3) in
  ...
```

それでは、良いニンジャパターンマッチを！

参考: https://coq.inria.fr/distrib/current/refman/Reference-Manual004.html
chef-rbenvでbundlerのインストールが失敗する

# 環境

OS: Ubuntu12.04

# Problem

~~~
$ vagrant provision
...
==> default: ================================================================================
==> default: Error executing action `install` on resource '[2.1.1::bundler (xxx)] (xxx)'
==> default: ================================================================================
==> default: 
==> default: NoMethodError
==> default: -------------
==> default: undefined method `timeout' for LWRP resource rbenv_gem from cookbook rbenv
==> default: 
...
~~~

# Solution

## 方法1

githubの最新版をインストールするようにBerksfileを修正

```rb
Berksfile: 

cookbook 'rbenv', :git => 'git://github.com/chef-rbenv/chef-rbenv.git'
```

インストール

```
rm -rf berks-cookbooks; berks vendor
```

## 方法2
berks-cookbooks/rbenv/metadata.jsonを以下のように1行追加する。


~~~diff
# berks-cookbooks/rbenv/metadata.json:

@@ -31,6 +31,7 @@ attribute :gem_binary,    :kind_of => String
attribute :user,          :kind_of => String
attribute :root_path,     :kind_of => String
attribute :clear_sources, :kind_of => [TrueClass, FalseClass]
+attribute :timeout,       kind_of: Integer, default: 300

include Chef::Rbenv::Mixin::ResourceString
~~~
PHPでコマンドを実装してみる かんたんseq篇


いまのところ`echo`がいちばん行数多い件。
コメントするべきところは… 特にない気がする。

BSDバージョンの`seq`でもいろいろ機能があるんだけれど、全然実装してないので「かんたん」バージョン。小数点数の処理とか全然してないけどPHPがよしなにやってくれてるので良い感じ。

```php:seq
#!/usr/bin/env php
<?php
namespace zonuexe\UnixCommand;

/**
 * SEQ command
 *
 * @author    USAMI KENTA <tadsan@zonu.me>
 * @license   http://www.apache.org/licenses/LICENSE-2.0 Apache-2.0
 * @copyright 2015 USAMI Kenta
 */

if (realpath($_SERVER['SCRIPT_FILENAME']) == realpath(__FILE__)) {
    $argv = isset($_SERVER['argv']) ? $_SERVER['argv'] : [];
    array_shift($argv);

    exit(seq($argv));
}

/**
 * @return int UNIX status code
 */
function seq(array $argv)
{
    $len = count($argv);

    if ($len === 1) {
        $start = 1;
        $step  = 1;
        $last  = array_shift($argv);
    } elseif ($len === 2) {
        $start = array_shift($argv);
        $last  = array_shift($argv);
        $step  = ($start >= $last) ? -1 : 1;
    } elseif ($len === 3) {
        $start = array_shift($argv);
        $step  = array_shift($argv);
        $last  = array_shift($argv);
    } else {
        return 1;
    }

    if ($step == 0) {
        $message = 'seq: zero decrement';
    } elseif (($start < $last) && ($step < 0)) {
        $message = 'seq: needs positive increment';
    } elseif (($start > $last) && ($step > 0)) {
        $message = 'seq: needs negative decrement';
    }

    if (isset($message)) {
        fwrite(STDERR, $message . PHP_EOL);
        return 1;
    }

    foreach (range($start, $last, $step) as $n) {
        echo $n, PHP_EOL;
    }

    return 0;
}
```
docker psのような横に長い出力をhjklでスクロールしたい

terminalは80桁にしているのでdocker psのように出力が横に長いコマンドの一覧性が悪くて辛いので、less -SのようなPAGERを使っていたのですが、スクロールが矢印キーだったりして不満がありました。
MacOSのlessはlesskey使えないっぽいのですよね。

ソースから入れてコンフリクトが生じるのも嫌な感じなので、
どうせ新しく入れるならと most というPAGERを導入してみたところ、
これが非常に快適で `export PAGER=most` してしまいました。

MacOS環境なら `brew install most` とかで入ります。
hjkl生活をするために `~/.mostrc` を以下のように設定しています。

```shell-session
setkey "up" "k"
setkey "down" "j"
setkey "column_left" "h"
setkey "column_right" "l"
setkey "page_left" "^h"
setkey "page_right" "^l"
```

ついでに `~/.zshrc` で

```shell-session
alias L="| $PAGER"
```

しておけば、

```shell-session
$ docker ps -a L
```

で幸せになれます。
Brackets上でpsdが見れない時の対処

sublimeからBracketsに乗り換えようかと思ったところで、
イキナリつまづいたので、自分用にmemo。


##AbobeにあげたpsdがBrackets上で見れない
これでは、Bracketsに乗り換える意味がないのではと、
ググった思い調べてたが出てこない。（英語苦手、翻訳万歳）
しかしabobeのAssets画面上では見れているがBracketsでは見れないわからん。

いろいろ他のpsdをあげてみたりしてテストしたらわかってきた事があるので、
下記のことを試してみた。


##psd名を直してみた
**psdのファイル名の全角だったので半角にしてみた**

`例：トップ.psd　→　top.psd `

するとさっきまで見れなかったのがみれたー！やったー！



##結論
試してないですが全角英語もダメだと思います。
**Brackets使うならpsd名は半角でつけましょう**

また、レイヤー1500枚以上ある場合も見れませんので、その場合は
無駄なレイヤーなどを削除しましょう。
ReactiveCocoa 3.0でSignalProducerをマージ

## まえおき

環境: Xcode6.4, ReactiveCocoa 3.0RC1

複数の`SignalProducer`をマージする方法。
[ドキュメント](https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/Documentation/BasicOperators.md#merging)にやり方は書いてありますが、いちいち`SignalProducer`の`SignalProducer`を作って`flatten`するのが面倒くさい感じです…
それっぽい関数が見つからなかったので自分で書いちゃいました。
~~(ただ自分が見落としてるだけで実はあるのかも知れません)~~**修正: 簡単な方法ありました**

## 定義

**修正**: これ↓だけでいいらしいです

```swift
func merge<T, E>(sources: SignalProducer<T, E>...) -> SignalProducer<T, E> {
    return SignalProducer(values: sources) |> flatten(.Merge)
}
```

```swift

func mergeWith<T, E>(other: SignalProducer<T, E>) -> SignalProducer<T, E> -> SignalProducer<T, E> {
    return { SignalProducer(values: [$0, other]) |> flatten(.Merge) }
}

```

## 使い方

```swift
merge(
    self.username.producer,
    self.password.producer
).start(next: { text in
    println("\(text)")
})
```

```swift
self.username.producer
    |> mergeWith(self.password.producer)
    |> start(next: { text in
        println("\(text)")
    })
```

注) `self.username`、`self.password`は`MutableProperty<String>`です
mdworker を止める


止める

```bash:mdworkerを止める
$ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist
```


再開する

```bash:mdworkerを再開する
$ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist
```

参考: http://osxdaily.com/2011/12/10/disable-or-enable-spotlight-in-mac-os-x-lion/
fish shell で長いコマンドが終わったら通知センターに知らせる

fish shell で長いコマンドが終わったら通知センターに知らせる

### 注意

`$CMD_DURATION` のフォーマットの都合上、version 2.2.0 より古い fish では動かない。



通知センターに push する function

```fish:~/.config/fish/functions/fish_notify.fish
function fish_notify
    echo "display notification \"$argv[2]\" with title \"$argv[1]\"" | osascript
end
```

fish_prompt から呼ぶ

```fish:~/.config/fish/functions/fish_prompt.fish
function fish_prompt --description 'Write out the prompt'
  (...)

  # 10 秒以上かかったコマンドを通知する
  if test $CMD_DURATION
    if test $CMD_DURATION -gt (math "1000 * 10")
      set secs (math "$CMD_DURATION / 1000")
      fish_notify "$history[1]" "Returned $status, took $secs seconds"
    end
  end
end
```

### 参考

http://codeyarns.com/2013/06/29/how-to-get-notification-on-long-duration-command-completion-in-fish/
JavaScriptのルーティングライブラリのメモ（2015年8月）

自分用メモ。フロントエンドでルーティングを行う必要が出てきたのでそのライブラリを調べた。
とりあえずざっとサーベイしたところ有力そうなのは以下。
 
 * [page.js](https://github.com/visionmedia/page.js)
 * [crossroads.js](https://github.com/millermedeiros/crossroads.js)
 * [Grapnel.js](https://github.com/EngineeringMode/Grapnel.js)
 * [vue-router](https://github.com/vuejs/vue-router)
 * [router.js](https://github.com/tildeio/router.js/)
 * [lightrouter](https://github.com/garygreen/lightrouter)
 * [rlite](https://github.com/chrisdavies/rlite)
 * [Hash-Router](https://github.com/michaelsogos/Hash-Router)

ちゃんと更新されているものを中心に上げている。有力そうなのはpage.jsだけどいろいろ調べたほうがよさそう。
vue-routerはVue.jsを使うプロジェクトで使えそうだけど開発中。

## Vueでルーティングするときの事例
[vue.jsとpage.jsの組み合わせでルーティングをするときのサンプル](http://qiita.com/tondol/items/b48c2e2424b50cb63c24)
Python/Windowsでpipでは入らなかったライブラリ導入

#はじめに

機械学習、自然言語処理で必須なscikit-learn,Gensimがpipで導入出来ず辛い思いをしたことがあり、pipでは導入できなかったライブラリの導入方法をまとめます

#自分の環境
OS: Windows 7 64bit
python:python 3.4.3　64bit

#手順
1. pythonのバージョン,ビット確認
2. wheelを導入
3. 入れたいライブラリをダウンロードする
4. ライブラリ導入
5. 完了

#pythonのバージョン,ビット確認
コマンドプロンプト上でpythonと実行し結果を確認します
例
`Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64 bit (AMD64)] on win32`
→python3.4.3の64bit

#wheelを導入
以下のコマンドを実行します
`pip install wheel-0.24.0.tar.gz`

参考にさせていただきました
pip と wheel を windows でも使いこなす
http://qiita.com/toruuetani/items/b0000e9f5c89a350d4f8

#入れたいライブラリをダウンロードする

Unofficial Windows Binaries for Python Extension Packages
http://www.lfd.uci.edu/~gohlke/pythonlibs/

上のページから入れたいライブラリを探し、自分の環境に合ったものをダウンロードします

例
自分はpythonのバージョンが3.4系、64bitなので「scikit_learn-0.16.1-cp34-none-win_amd64.whl」をダウンロードしました
cp34→Python バージョン
amd64→Python bit数

`scikit_learn-0.16.1-cp34-none-win_amd64.whl
　　　　　　　　　　　　　↑python　　　　　↑bit`

#ライブラリ導入
ダウンロードしたwhlをC:\Python\Scriptsに置きます
コマンドプロンプトで以下を実行します
`cd C:\Python\Scripts`
`pip install example.whl`

※example.whlは例です
例として「scikit_learn-0.16.1-cp34-none-win_amd64.whl」をダウンロードしたら以下のコマンドを実行してください
`pip install scikit_learn-0.16.1-cp34-none-win_amd64.whl`

#完了
恐らくこれで導入できたと思います
標準ではpythonは32bitでインストールされるのもつまずくポイントだと思います
Ansibleの変数(Variables)のマージポリシー

Ansibleでvars_filesを並べた時の変数のマージポリシー([hash_behaviour](http://docs.ansible.com/ansible/intro_configuration.html#hash-behaviour))の話で、デフォルトはreplaceなのですというお話です。

## 前提

以下のように

1. vars/base.yml
2. vars/override.yml

の順に読み込むとしましょう。

```yaml:site.yml
---
- hosts: all
  vars_files:
    - vars/base.yml
    - vars/override.yml
  tasks:
    - name: "でばっぐ"
      debug: msg="{{ git }}"
```

```yaml:vars/base.yml
---
git:
  repo: xxx
  branch: yyyy
```

```yaml:vars/override.yml
---
git:
  branch: override
```

## デフォルトの挙動

```shell-session
$ ansible-playbook -i host/local test.yml

PLAY [all] ********************************************************************

GATHERING FACTS ***************************************************************
ok: [127.0.0.1]

TASK: [でばっぐ] **********************************************************
ok: [127.0.0.1] => {
    "msg": "{'branch': 'override'}"
}
```

おやおや、 git.repo=xxxx が消されてしまいましたね。
replaceのポリシーなので、git というキーの根っこから上書きされ、 git = {branch: override} になってしまいました。

## ansible.cfg に ```hash_behaviour=merge``` を設定した場合

ansible-playbookコマンドを実行するカレントディレクトリに ansible.cfg ファイルを置いてみましょう。

```ini:ansible.cfg
[defaults]
hash_behaviour=merge
```

```shell-session
$ ansible-playbook -i host/local test.yml

PLAY [all] ********************************************************************

GATHERING FACTS ***************************************************************
ok: [127.0.0.1]

TASK: [でばっぐ] **********************************************************
ok: [127.0.0.1] => {
    "msg": "{'repo': 'xxx', 'branch': 'override'}"
}
```

git.branch だけが上書きされましたね。

ちなみにansible.cfgファイルは次の順で探されるようです。

1. カレントディレクトリ
2. 環境変数の ANSIBLE_CONFIG or ~/ansible.cfg
3. /etc/ansible/ansible.cfg

See:http://yteraoka.github.io/ansible-tutorial/#test-ansible
Ruby on Railsで拡張されているEnumerableのメソッドまとめ


RailsではEnumerableモジュールを[拡張しています](https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/enumerable.rb)。
そこで、Rails 4.2.3で定義されているメソッドをすべて紹介してみたいと思います。

## exclude?

各要素に引数で渡された値が含まれているか確認し、 **含まれていない場合はtrue** を返します。
rubyのEnumerableに定義されている`include?`の反対ですね。

```ruby
[1, 2, 3].exclude?(5)
# => true
[1, 2, 3].exclude?(3)
# => false
```

## index_by

ActiveRecordとかで取得したオブジェクトの配列を **特定のキーのハッシュに変換** します。
例えばCarsテーブルがあったとして、

|id|maker|name|price|
|---|---|---|---|
|1|トヨタ|プリウス|1000000|
|2|アルファロメオ|166|3000000|
|3|フォルクスワーゲン|ゴルフ|1500000|
|4|トヨタ|ハリアー|2000000|

普通に取得するとオブジェクトの配列が返ってきますが、

```ruby
Car.find(:all)
# => [#<Car id: 1, maker: "トヨタ", name: "プリウス", price: 1000000>,#<Car id: 2, maker: "アルファロメオ", name: "166", price: 3000000>,...]
```

index_byを利用すると、

```ruby
Car.find(:all).index_by(&:id)
# => {1=>#<Car id: 1, maker: "トヨタ", name: "プリウス", price: 1000000>,2=>#<Car id: 2, maker: "アルファロメオ", name: "166", price: 3000000>,...}
```

こんな感じでidをキーにしたハッシュ形式にしてくれます。
ちなみにキーが重複している場合は一つにまとめられてしまうので注意してください。

## many?

{}ブロック内にある式の結果を満たす要素が **2つ以上ある場合にtrue** を返します。
ちなみに、1つ以上ある場合を求めたい場合は`any?`を使えばいいです。

```ruby
[1, 2, 3, 4, 5].many? { |n| n < 3 }
# => true
[1, 2, 3, 4, 5].many? { |n| n < 2 }
# => false
[1, 2, 3, 4, 5].any? { |n| n < 2 }
# => true
```

先ほどのCarsテーブルの例で言うとこんな感じ。

```ruby
Car.find(:all).many? { |c| c.price <= 1500000 }
# => true
Car.find(:all).many? { |c| c.price <= 1000000 }
# => false
Car.find(:all).any? { |c| c.price <= 1000000 }
# => true
```

## sum

**各要素内の合計**を返します。

```ruby
[1, 2, 3].sum
# => 6
['foo', 'bar'].sum
# => "foobar"
[[1, 2], [2, 5]].sum
# => [1, 2, 2, 5]
```

先ほどのCarsテーブルの例で、priceの合計を求めたいならこう。

```ruby
Car.find(:all).sum(&:price)
# => 7500000

# こういう風にも書ける
Car.find(:all).sum { |c| c.price }
# => 7500000
```

sumはinjectを使って合計を求める場合のショートカットとして作られたみたいです。

```ruby
# injectと同じく、引数として初期値を与えれる
Car.find(:all).sum(0) { |c| c.price }
# => 7500000

# injectを使って同じことを書くとこんな感じになる
Car.find(:all).inject(0) { |sum, c| sum + c.price }
# => 7500000
```

## 参考

rubyで定義されているEnumerableモジュールもまとめているので、そちらもどうぞー。
[selectなどの配列の抽出・検索を行うメソッドまとめ](http://qiita.com/shibukk/items/7dded3e74b0f7dbfb633)
[mapなどの配列の値を操作するメソッドまとめ](http://qiita.com/shibukk/items/d985d014de598d925b8b)
USBメモリを使う

# USBメモリを使う

[MacOSXからRaspberry Piにパスワード無しで接続する](http://qiita.com/or2/items/d8f6b357bdedc197b50c)の続き

SDカードをガシガシ使うとすぐに寿命が来るということなので、データ領域としてUSBメモリを使ってみる
USB接続のHDDでも理屈、手順は同じはず

## USBメモリが認識されているか確認する
`sudo fdisk -l`

```lang:result
Disk /dev/sda: 15.9 GB, 15854469120 bytes
1 heads, 1 sectors/track, 30965760 cylinders, total 30965760 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x7c047283

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            8064    30965759    15478848    c  W95 FAT32 (LBA)
```

今回接続したUSBメモリは/dev/sdaとして認識されているようだ

## USBメモリを初期化する
`sudo fdisk /dev/sda`

```lang:result
Command (m for help): p ※パーティションを確認する

Command (m for help): d ※パーティションを削除する

Command (m for help): n ※パーティションを作成する
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 
Using default value 1
First sector (2048-30965759, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-30965759, default 30965759): 
Using default value 30965759

Command (m for help): p ※コマンドを終了する
```

`sudo mkfs.ext4 /dev/sda1`

## UUIDを確認する
`sudo blkid /dev/sda1`

```lang:result
/dev/sda1: UUID="00000000-0000-0000-0000-000000000000" TYPE="ext4"
```

## マウントポイントを作成する
`sudo mkdir /mnt/usb1`

## fstabファイルを書き換える
`sudo nano /etc/fstab`

```lang:/etc/fstab
UUID="00000000-0000-0000-0000-000000000000" /mnt/usb1 ext4      defaults        0       2
```

## 再起動する
`sudo reboot`
ubuntuでkworkerのcpu使用率がやたら高い

/sys/firmware/acpi/interrupts/gpeXXの数値が高いやつを探せばいいらしいです。

```shell-session
$ grep . -r /sys/firmware/acpi/interrupts
```
...
/sys/firmware/acpi/interrupts/gpe15:       0   enabled
/sys/firmware/acpi/interrupts/gpe16:    5501   enabled
...

gpe16の値が高いので

```shell-session
$ su
$ echo disable > /sys/firmware/acpi/interrupts/gpe16
```

としてやるとおさまった。

---

GPE(general purpose event:ハードウェアのイベントいろいろ)をACPIがハンドルして、ACPIのシグナル管理しているkworkerがおしごと。
というものらしいです。変なイベントを拾ってるのかもしれませんね。

環境

```shell-session
$ uname -a
```
Linux MacBookPro 3.13.0-61-generic #100-Ubuntu SMP Wed Jul 29 11:21:34 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
違うドメインにリンクしている場合target="_blank"を付与するスクリプト

毎回書くのでメモ。
ウッカリ忘れも防止できるので、このぐらいの処理はクライアントサイドでやるのがいいんじゃないかなって思ってる。

```js
// コンテンツラッパー内のaタグを走査する
$('body').find('a').each(function(){
  var attr = $(this).attr('href');
  // アンカーリンクではない、かつ、自ドメインのリンクではないという条件を判定
  if(attr.search(/^#/) !== 0 && attr.search(/\//) !== 0 && !attr.match(YOUR_DOMAIN)) {
    $(this).attr('target','_blank');
  }
});
```
emacsからAtomへ

`Emacs`から`Atom`へのエディタの乗り換えをしようと思った。

* Emascキーバインドは基本的に全部使える
* `TAB`キーは常に`Auto Indent`に割り当てたい

の2つは譲れなかった。

`term2`というAtom上でiTerm2が開くことの出来るパッケージをインストールした際に、`ctrl-k`がプレフィックスキーに当てられた。

よって、keymapの変更で

* term2が持っている`ctr-k`のプレフィックスキー関連を削除
* `TAB`はAutoIndentに割り当て

を以下で行った。


## keymapの変更

`Atom > Open Your Keymap`

```
'atom-text-editor:not([mini])':
  'tab': 'unset!'
  'tab': 'editor:auto-indent'

'atom-text-editor':
  'ctrl-k t down': 'unset!'
  'ctrl-k t left': 'unset!'
  'ctrl-k t right': 'unset!'
  'ctrl-k t t': 'unset!'
  'ctrl-k t up': 'unset!'
```
pyvenvで別のバージョンのPythonを指定したい

/* とりあえずUbuntu14.04では確認しました。 */

# やりたいこと
すでにenv2_7というディレクトリをpyvenvで作ったと仮定して。

```sh
$ source env2_7/bin/activate
$ python -V
Python 2.7.6
```

ということをやりたかったのです。


# 結論
作った仮想環境ディレクトリのbinの下のpythonのシンボリックリンクを変えてやる。

# 余談
生成された仮想環境のbin以下に、各Pythonへのシンボリックリンクが張られているらしく、
そのうちのpythonのシンボリックリンクを変えてactivateしたら、実際うまく行った。

# コマンドと見てみる
こうなっているのを、

```sh
$ tree env2_7
env2_7
├── bin
│   ├── activate
│   ├── activate.csh
│   ├── activate.fish
│   ├── python -> python3.4
│   ├── python3 -> python3.4
│   └── python3.4 -> /usr/bin/python3.4
...
```

シンボリックリンクを張り直して、

```sh
$ ln /usr/bin/python2.7 env2_7/bin/python --symbolic
```

こうした。

```sh

$ tree env2_7
env2_7
├── bin
│   ├── activate
│   ├── activate.csh
│   ├── activate.fish
│   ├── python -> /usr/bin/python2.7
│   ├── python3 -> python3.4
│   └── python3.4 -> /usr/bin/python3.4
...
```

最初の```pyvenv```コマンドでできる方法をご存じの方がいらっしゃいましたら、ぜひコメント欄にてツッコミしてください。
serverspecでローカルのコマンドを実行するには？（sshログインテスト）

# はじめに

非常に短いエントリですが同じことで困っている人もいるかも。と思いましてメモしておきます。

* serverspecでsshのログインテストをやりたかったのですが、みなさんどうやってやっているのでしょうか。
* よいアイディアがあれば教えてください。

# 私はこうやってやってみました。

* expect使ってもよかったのですがshellを用意するのも面倒だったので、sshpassを使いました。
* ansibleでいうlocal_actionがなかったので、systemを使ってローカルでコマンドを実行し、実行結果の比較はrspecの構文で実装してみました。

## ソース
```
describe 'ssh login test' do
  stdout = system("sshpass -p 'infrainfra' ssh -t #{ENV['TARGET_HOST']} -l infra hostname")
  it 'login succeeded' do
    expect(stdout).to eq true
  end
end
```

## 実行結果

* 成功時

```
ssh login test
  login succeeded
```

* 失敗時

```
ssh login test
  login succeeded (FAILED - 1)

Failures:

  1) ssh login test login succeeded
     Failure/Error: expect(stdout).to eq true

       expected: true
            got: false

       (compared using ==)
     # ./spec/webserver/user_spec.rb:34:in `block (2 levels) in <top (required)>'
```
[Swift] 画面内のランダムな座標を返すメソッドを作った

## コード

シンプルですが、備忘録も兼ねて

```swift:Swift2.0
// 通常
func randPoint() -> CGPoint{
    let randWidth  = CGFloat(arc4random_uniform(UInt32(self.frame.width)))
    let randHeight = CGFloat(arc4random_uniform(UInt32(self.frame.height)))
    let randPoint  = CGPoint(x:randWidth,y:randHeight)

    return randPoint 
}

// 2行で書きたい場合
func randPoint() -> CGPoint{
    let randPoint = CGPoint(x:CGFloat(arc4random_uniform(UInt32(self.frame.width))),y:CGFloat(arc4random_uniform(UInt32(self.frame.height))))
    return randPoint
}
```

## 使い方

```swift:Swift2.0
var testPoint:CGPoint = randPoint()
print(testPoint)
//=> e.g. (195.0, 42.0)
```
Javascriptで照明を操作 [Cylon.js x Philips Hue]


Hueを最近触ってるのでCylon.js経由で操作してみます。
あと、Milkcocoaも使ってWebとつなげてみたいと思います。

## Philips Hue

Webの人向けに簡単に言うとプログラミングで制御できる照明です。
http://www2.meethue.com/ja-JP

![](http://cnet1.cbsistatic.com/hub/i/r/2013/08/27/b54cee95-84b8-11e3-beb9-14feb5ca9861/thumbnail/770x433/3819299edbb781c0e9677e33ce980515/2Z9A2731_940x671.jpg)

過去の[IoTLT](http://iotlt.connpass.com/)でカヤックのネロさんがデモを見せてくれてましたが、Web開発者でも扱いやすいAPIインターフェイスがあるのが特長です。

HTTPリクエストでAPIを叩けるのでどんな言語でも問題無く制御できると思います。

## Cylon.js

http://cylonjs.com/ 

前にJSオジサンで紹介したNode.jsのIoT向けフレームワーク(ライブラリ)です。
> [Cylon.jsでIoT (第5回 #JSオジサン : 5分) ](https://speakerdeck.com/n0bisuke/cylon-dot-jsdeiot-di-5hui-number-jsozisan-5fen)

Hue向けのアダプタも存在します。

http://cylonjs.com/documentation/platforms/hue/

![](https://i.gyazo.com/6017510b93e79105abe05369408153e6.png)

## HueのAPIを使うにあたって

[色々遊べるハイテク照明 「Philips hue」のAPIを叩いてみた。](http://blog.udcp.net/2013/10/09/philips-hue-api/)

こちらのブログを参考にしました。
**ユーザー名とhueブリッジのIPアドレスを確認しましょう。**

## Cylon.jsでHueを操作してみる。

* 準備
npm経由でいつもどおり

```
$ npm install cylon cylon-hue
```

```hue-cylon.js
var Cylon = require('cylon');

Cylon.robot({
  connections: {
    hue: { adaptor: 'hue', host: '192.168.1.85', username: 'XXX' }
  },

  devices: {
    bulb: { driver: 'hue-light', lightId: 2 }
  },

  work: function(my) {
    every((1).second(), function() {
      my.bulb.toggle();
    });
  }
}).start();
```

サンプルどおりに書いて実行します。

```
$ node hue-cylon
```

![](https://i.gyazo.com/a4b806e1979990c5ebef426995cefb80.gif)

会社の電球につけてやってみました↑

簡単です。

## MilkcocoaとつなげてWebから操作

https://mlkcca.com/

> Milkcocoaはリアルタイム通信/IoT向けのバックエンドを提供してくれるサービスです。

いつも思うけど、Milkcocoaのトップページのドット絵と連携すると、Web側を作らなくていいから凄く楽ですw

```
$ npm i milkcocoa
```

```hue-milkcocoa.js
var Cylon = require('cylon');
var Milkcocoa = require('milkcocoa');
var milkcocoa = new Milkcocoa('dogi9jz8c16.mlkcca.com');
var ds = milkcocoa.dataStore('dots');
var hue;

Cylon.robot({
  connections: {
    hue: { adaptor: 'hue', host: '192.168.2.2', username: 'newdeveloper' }
  },

  devices: {
    bulb: { driver: 'hue-light', lightId: 1 }
  },

  work: function(my) {
    my.bulb.turnOn(); //点灯
    hue = my; //hue変数に操作メソッド諸々を渡しておく
  }
}).start();

ds.on('push',function(data){
  switch (data.value.color){
    case '#ce071b':
      console.log('赤');
      hue.bulb.rgb(255,0,0); //赤
      break;
    case '#fdbc00':
      console.log('黄');
      hue.bulb.rgb(255, 165, 0); //黄
      break;
    case '#097b28':
      console.log('緑');
      hue.bulb.rgb(107, 142, 35); //緑
      break;
    case '#0f5aa6':
      console.log('青');
      hue.bulb.rgb(30, 144, 255); //青
      break;
    default:
      hue.bulb.rgb(255, 255, 255);
      break;
  }
});

```

実行するとこんな感じです。

![](https://i.gyazo.com/9ba13570a254bfcf6701a39abf6f99e3.gif)

Milkcocoaのトップページのドット絵は操作するとpushイベントが発火して`data.value.color`に色の情報が渡ってくるのでハンドリングしています。

APIドキュメントとかをそこまで読んでないのでこんな感じで振り分けてるけど、16進の値をそのまま色情報に渡せるメソッドもあるかも

> http://www.developers.meethue.com/documentation/core-concepts

##まとめ

HueのAPIがHTTPリクエストで叩けるのがいいですね。
BLEだけじゃなくてこういったインターフェイスも増えてくるとJavascriptだけじゃなくてPHPとかでもIoTできそう。
UILabel


![UILabelSample.png](https://qiita-image-store.s3.amazonaws.com/0/89465/3f2a36e7-c4f2-951e-7eb2-1a0f5ad82a36.png "UILabelSample.png")



```swift
//
//  ViewController.swift
//  参考：https://sites.google.com/a/gclue.jp/swift-docs/ni-yinki100-ios/uikit/001-uilabelde-wen-ziwo-biao-shi
//  UIKit001
//

import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Labelを作成.
        let myLabel2: UILabel = UILabel(frame: CGRectMake(0,0,300,100))
        let myLabel: UILabel = UILabel(frame: CGRectMake(0,0,200,50))
        
        // 背景をオレンジ色にする.
        myLabel.backgroundColor = UIColor.orangeColor()
        myLabel2.backgroundColor = UIColor.blueColor()
        
        // 枠を丸くする.
        myLabel.layer.masksToBounds = true
        myLabel2.layer.masksToBounds = false
        
        // コーナーの半径.
        myLabel.layer.cornerRadius = 20.0
        
        // Labelに文字を代入.
        myLabel.text = "Hello Swift!!"
        myLabel2.text = "Test label Size:30"
        
        // 文字の色を白にする.
        myLabel.textColor = UIColor.whiteColor()
        myLabel2.textColor = UIColor.whiteColor()
        
        // 文字の影の色をグレーにする.
        myLabel.shadowColor = UIColor.grayColor()
        
        // フォント設定
        myLabel2.font = UIFont.systemFontOfSize(CGFloat(30))
        
        // Textを中央寄せにする.
        myLabel.textAlignment = NSTextAlignment.Center
        myLabel2.textAlignment = NSTextAlignment.Center
        
        // 配置する座標を設定する.
        myLabel.layer.position = CGPoint(x: self.view.bounds.width/2,y: 200)
        myLabel2.layer.position = CGPoint(x: self.view.bounds.width/2, y:500)
        
        // Viewの背景色を青にする.
        self.view.backgroundColor = UIColor.cyanColor()
        
        // ViewにLabelを追加.
        self.view.addSubview(myLabel)
        self.view.addSubview(myLabel2)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}```
iOS8 音を鳴らす

準備：mp3音源をプロジェクトに追加（プロジェクトフォルダ右区rックで追加）

１、音源へのパスを生成
２、AVAudioPlayerのインスタンス化
３、AVAudioPlayerのデリゲートを設定
４、タップしたときに音を鳴らす止めるなどの処理
５、イベント処理

:exclamation:注意点:exclamation:
 **xcode7betaでは「２、AVAudioPlayerのインスタンス化」で例外処理を記載しないとビルドエラーになる**
 　

``` swift
//
//  ViewController.swift
//  sousa
//
//  Created by Misato Morino on 2015/08/13.
//  Copyright (c) 2015年 Atsushi Komuro. All rights reserved.
//

import UIKit
import AVFoundation

//AudioPlayerDelegate
class ViewController: UIViewController,AVAudioPlayerDelegate {
    
    //変数宣言.
    var myAudioPlayer : AVAudioPlayer! = nil
    var myButton : UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //再生する音源のURLを生成.
        let soundFilePath : NSString = NSBundle.mainBundle().pathForResource("Sample", ofType: "mp3")!
        let fileURL : NSURL = NSURL(fileURLWithPath: soundFilePath as String)
        
        //AVAudioPlayerのインスタンス化
        do{
            myAudioPlayer = try AVAudioPlayer(contentsOfURL: fileURL, fileTypeHint:nil)
        }catch{
            print("Failed AVAudioPlayer Instance")
        }
        
        //AVAudioPlayerのデリゲートをセット.
        myAudioPlayer.delegat = self
        
        //ボタンの生成
        myButton = UIButton()
        myButton.frame.size = CGSizeMake(100, 100)
        myButton.layer.position = CGPoint(x: self.view.frame.width/2, y: self.view.frame.height/2)
        myButton.setTitle("▶︎", forState: UIControlState.Normal)
        myButton.setTitleColor(UIColor.blackColor(), forState: .Normal)
        myButton.backgroundColor = UIColor.cyanColor()
        myButton.addTarget(self, action: "onClickMyButton:", forControlEvents: UIControlEvents.TouchUpInside)
        myButton.layer.masksToBounds = true
        myButton.layer.cornerRadius = 50.0
        self.view.addSubview(myButton)
    }
    
    //ボタンがタップされた時に呼ばれるメソッド.
    func onClickMyButton(sender: UIButton) {
        
        //playingプロパティがtrueであれば音源再生中.
        if myAudioPlayer.playing == true {
            
            //myAudioPlayerを一時停止.
            myAudioPlayer.pause()
            sender.setTitle("▶︎", forState: .Normal)
        } else {
            
            //myAudioPlayerの再生.
            myAudioPlayer.play()
            sender.setTitle("■", forState: .Normal)
        }
    }
    
    //音楽再生が成功した時に呼ばれるメソッド.
    func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) {
        print("Music Finish")
        
        //再度myButtonを"▶︎"に設定.
        myButton.setTitle("▶︎", forState: .Normal)
    }
    
    //デコード中にエラーが起きた時に呼ばれるメソッド.
    func audioPlayerDecodeErrorDidOccur(player: AVAudioPlayer, error: NSError?) {
        print("Error")
    }
}
```
NFSでマウントするときに出るエラーの対処( mount: wrong fs type, bad option, bad superblock on....)

## 現象

NFSでいざユーザーがいざマウントしようとすると以下のエラーがでることがあります（IPアドレス等は伏せ字）

> mount: wrong fs type, bad option, bad superblock on XXX.XX.XXX.XXX:/YYYY,
       missing codepage or helper program, or other error
       (for several filesystems (e.g. nfs, cifs) you might
       need a /sbin/mount.<type> helper program)
       In some cases useful info is found in syslog - try
       dmesg | tail  or so

##対処
nfs-commonがないので、インストールします。
`sudo apt-get install nfs-common`
makeで/usr/bin/ld: cannot find -l○○○というエラーが出た時

## 現象
Makeすると、
`/usr/bin/ld: cannot find -lX11`
などというエラーが出る時があるみたいです。

## 対処
-l[パッケージ名]ということなので、該当のパッケージをインストールする。

今回の場合はX11に関連するライブラリが足りないということを意味します。
パッケージを検索を以下で検索し
`apt-cache search X11`

libX11をインストールしましょう。

これで解決できるはずです
PyBrainで訓練済みモデルの書き出し & 読み込み

最近、PyBrainというPython用の機械学習ライブラリを使用して、ニューラルネットを構築して学習させることがあった。  
PyBrainを使えば、結構簡単にニューラルネットを構築できる上に、訓練したモデルをxmlファイルとして書き出しておくことができる。もちろん、これを読みこめばモデルの再利用ができる。

ので、今回はインストール方法とモデルの書き出し・読み込みをまとめておく。

## 1. PyBrainのインストール
インストールにはpipを使用する。

```bash
pip install pybrain
```

## 2. モデルの書き出し
`from pybrain.tools.xml import NetworkWriter`を使用する。

```python

from pybrain.tools.shortcuts import buildNetwork

# ~ 中略(訓練データの読み込みなど) ~

# ニューラルネットワークモデルの定義
network = buildNetwork(64, 19, 2)

# ~ 中略（データを使用して訓練を実行）~

# モデルを書き出す
NetworkWriter.writeToFile(network, 'model.xml')
```

これで、訓練済みのモデルの設定がmodel.xmlというファイルが出力される。  

## 3. モデルの読み込み
`from pybrain.tools.xml import NetworkReader`を使用する。

```python
from pybrain.tools.xml import NetworkReader

network = NetworkReader.readFrom('model.xml')
```

先ほど出力したmodel.xmlを読み込むことで、学習済みモデルを再現することができる。

あとは、認識するなり追加学習するなり、好きにしてあげてください。
cygwinの/usr/binが見つからない...!?

と思ったらちゃんと有りましたよ、という話。

windowsでcygwinを使っていて、各種パッケージをインストールする。（apt-cygでもいいし、setup.exeからでもいい。）  
次に、そのインストールしたコマンドのあるパスを見つけようとして、

```bash
$ which hogehoge
/usr/bin/hogehoge
```

というパスを見つけたとする。

ところが、**cygwin配下に/usr/binというフォルダはない**ことに気がついた。

気になってググってみると、**cygwin上では/usr/binと言うのは単に/binへのリンク**だという。  
実際に/binの中を見てみると、インストールされたパッケージがちゃんと格納されていた。
couchappメモ

**JSの基本が全然なっていない状態なので、親切な方はコメント等してくださると涙を流して喜びますのでよろしくお願いします。**

後継の[erica](https://github.com/benoitc/erica)ってのもあるらしいが日本語ドキュメントが少なすぎてよくわからないので
CouchAppをインストールしてみた
インストールはPython2.6以上が必要、ソースコードをGithubからダウンロードして行った。

---
CentOS6.6 final
CouchDB1.6.1
CouchApp1.0.1

アプリ生成コマンド
---
`$couchapp generate app testApp`
カレントディレクトリにtestAppディレクトリが出来、その下にテンプレートファイルがいろいろ出来る。

コンテンツの置き場所
---
htmlやCSS,JSファイルは以下に置く
`testApp/_attachment/

DBのリスト表示
---
`$couchapp generate view byname`
とすると
`testApp/views/byname`
というディレクトリが出来てmap.jsとreduce.jsが作られる。
とりあえずmap.jsの中身を書いてやると良い

```
function(doc) {
    if (doc.name) {
emit(doc.name,doc);
    }
}
```

ブラウザでの表示
---
`$ couchapp push testApp http://127.0.0.1:5984/testApp`
testAppという名のデータベースは予めfutonでもコマンドでも良いので作っておく。

`http://127.0.0.1:5984/testApp/_design/testApp/index.html`
これで表示される

map-reduceという仕組みらしい（もっと調べろ、自分）が
map.jsファイルをvimで自前で書こうとするといつも動かない・・・
一度はバイナリエディタで確認してみて自分で書いた方はインデントにタブコードが入ってしまったためだった。
今日はインデントをスペースにしたのだけれどそれもダメだった。
動いている別のviewからコピーしたmap.jsを書き換えるという方法だと動く。
unity > uGUI > ファイルリスト表示 > スクロール付き

```txt:動作確認
Unity 5.1.1-f on Mac OS X 10.8.5
```

##準備
1. Button1を作成。TextをButton1Textとする
2. 同様にButton2,3,4を作成する
3. ScrollBarを作成. 名前をScrollbarFileとする
4. ScrollbarFileにScrollScript.csを関連づける。OnClickでScrollScript.ScrollBarChangeをFunctionとする。

##code
```csharp:ScrollScript.cs
using UnityEngine;
using System.Collections;

using UnityEngine.UI; // for Text
using System.IO; // for Directory()

// Button1
// - Button1Text
// Button2
// - Button2Text
// Button3
// - Button3Text
// Button4
// - Button4Text
// ScrollbarFile
// EventSystem

public class ScrollScript : MonoBehaviour {

	private string [ ] s_files = Directory.GetFiles("."); 

	private void dispFilesOnButtons(string filename, int idx, int shift) {
		int pos = idx - shift;
		GameObject work = GameObject.Find ("Button" + pos.ToString () + "Text");
		if (work) {
			work.GetComponent<Text>().text = filename;
		}
	}

	private int getShiftValue(string scrollBarName, int maxFileNum) {
		GameObject work = GameObject.Find (scrollBarName);
		if (work) {
			float aRatio = (float)work.GetComponent<Scrollbar>().value;
			return (int)(maxFileNum * aRatio);
		}
		return 0;
	}

	private void clearButtonsText()
	{
		foreach (Text aText in Text.FindObjectsOfType<Text> ()) {
			if (aText.name.Contains("Button")) { // e.g. Button2Text
				aText.text = "";
			}
		}
	}

	private void updateFileList()
	{
		int shift = getShiftValue ("ScrollbarFile", s_files.Length);
		
		clearButtonsText ();
		int count = 1;
		foreach (string aFile in s_files) {
			dispFilesOnButtons(aFile, count, shift);
			count++;
			Debug.Log(aFile);
		}
	}
	
	void Start() {
		updateFileList ();
	}

	public void ScrollBarChange() {
		updateFileList ();
	}	
}
```

##実行結果
![Scene_unity_-_150813_fileScroll_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/27d9da0a-4f9b-3335-7dd3-ee748412011e.jpeg)

![Scene_unity_-_150813_fileScroll_-_PC__Mac___Linux_Standalone__Personal_b.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/257a61c8-6c48-156e-669a-9120a95d17ee.jpeg)
PHPでコマンドを実装してみる cat篇	


にゃーん

## これまでのあらすじ

* [PHPでコマンドを実装してみる かんたんecho篇 - Qiita](http://qiita.com/tadsan/items/675bd3b37a8689090417)

## catコマンドってなんだ

複数のファイルを連結して標準出力するのが`cat`コマンド。

```sh
% cat ./hoge #hogeファイルの中身を標準出力する
ほげ
% cat ./hoge ./huga ./piyo > ./xxx #ファイルを連結してxxxファイルに書き込む
% cat ./xxx
ほげ
ふが
ぴよ
% echo んー | cat # パイプで渡して引数なし
んー
% echo んー | cat - - - # - が標準入力
んー
んー
んー
```

要件としては、こんな感じ…?

## 実装


引数なしのときは標準入力のみを出力。標準入力はキャッシュする。

あと、ファイルがなかったりしたら標準エラー出力に書き込む。

```
fwrite(STDERR, "cat: ${f}: No such file or directory" . PHP_EOL);
```

文言は例によってBSD catから拝借してる。読み込めないファイルがひとつでもあったとき、終了ステータスは`1`にする。

## 完成

```php
#!/usr/bin/env php
<?php
namespace zonuexe\UnixCommand;

/**
 * CAT command
 *
 * @author    USAMI KENTA <tadsan@zonu.me>
 * @license   http://www.apache.org/licenses/LICENSE-2.0 Apache-2.0
 * @copyright 2015 USAMI Kenta
 */

if (realpath($_SERVER['SCRIPT_FILENAME']) == realpath(__FILE__)) {
    $argv = isset($_SERVER['argv']) ? $_SERVER['argv'] : [];
    array_shift($argv);

    exit(cat($argv));
}

/**
 * @return int UNIX status code
 */
function cat(array $argv)
{
    $files  = $argv ?: ['-'];
    $failed = false;
    $stdin  = null;

    foreach ($files as $f) {
        $file = null;
        if ($f === '-') {
            if ($stdin !== null) {
                echo $stdin;
                continue;
            }

            $file = STDIN;
        } elseif (!is_file($f)) {
            $failed = true;
            fwrite(STDERR, "cat: ${f}: No such file or directory" . PHP_EOL);
            continue;
        } else {
            $file = fopen($f, 'r');
        }

        while (!feof($file)) {
            $data = fread($file, 8192);
            if ($data === false) {
                break;
            }
            if ($f === '-') {
                $stdin .= $data;
            }

            echo $data;
        }
        fclose($file);
    }

    return $failed ? 1 : 0;
}

```

## 感想

今回は標準入出力を扱ったり終了ステータスを扱ったり、ちゃんとUnixコマンドっぽい感じになりましたね。
Bluemix に ElasticSearch がキターっ！

IBM が Compose を買収しました：
http://japan.zdnet.com/article/35067826/

Compose は MongoDB や Redis といったオープンソースデータベースを DBaaS で提供していた企業です。Compose のサービスは早速 IBM Bluemix に統合され、既に Bluemix サービスとして個々の DBaaS が選択・利用できるようになっています：
![6ba57578-s.png](https://qiita-image-store.s3.amazonaws.com/0/89495/b0f1aa85-4045-6b90-41f0-bb5eab8bc548.png)
MongoDB や Redis に関しては（データベースとしては）既に Bluemix で使えるようになっていました。が、今回の統合で新たに Bluemix で使えるようになったサービスもあります。

それが ElasticSearch です。高速な NoSQL データベースでもあり、ユーザーの多いオープンソース全文検索エンジンとして知られていましたが、ついにこの ElasticSearch の DBaaS が Bluemix のサービスの１つとして選択できるようになりました：
![f716b8e3-s.png](https://qiita-image-store.s3.amazonaws.com/0/89495/43df3819-c6ea-7f12-1d3e-944dfbe0ecb3.png)

特に、これまで Bluemix には検索エンジンサービスが搭載されていなかったため、アプリケーション内での検索機能を作ろうとすると、外部のサービスを使ったり、自分で個別に検索機能を実装する必要がありました。これからは検索エンジンも Bluemix 内のものが（しかも ElasticSearch が）使えるようになります！

非常に嬉しく楽しみな新サービスです。