OmniAICreator/Qiita-1.07M huggingface dataset:
「セマンティック バージョニング」を読んだのでバージョニングについてまとめた


## はじめに

バージョニングをどうやって行えばいいのかよくわからなかったので自分用まとめも兼ねてまとめておこうと思いました。
今回は[セマンティック バージョニング](http://semver.org/lang/ja/)を参考にしました。
上のサイトから要点をまとめました。

## メジャーバージョン、マイナーバージョン、パッチバージョン

バージョンを上げるには3つのバージョンを使って表記します。

- APIの変更に互換性のない場合は **メジャーバージョン**
- 後方互換性があり機能性を追加した場合は **マイナーバージョン**
- 後方互換性を伴うバグ修正をした場合([^1])は **パッチバージョン**

このシステムをセマンティック バージョニングと呼び、各々上の条件の時、バージョンをあげます。

## なぜセマンティック バージョニングを使うのか？

- 名前を正確な定義を与えることで、開発するソフトウェアにいて、意図が伝わりやすくなる
- 意図を正確に理解すれば、柔軟な依存性の仕様を作れる

バージョニングのルールはあやふやだったので何かのルールに従うのはいいですね。

## 仕様書から気になったコトまとめ

仕様書には11個ほどありますが、特にこれはというものをまとめました。

### パブリックAPIを宣言する必要がある
セマンティック バージョニングを適用するソフトウェアはパブリックAPIを宣言する必要があります。
公に公開されてるときには、文書だったり、コード自体で表現されていて抜け漏れがないようにしておかないといけません。

### バージョンナンバーはX.Y.Zの形式にする

Xがメジャーバージョン、Yがマイナーバージョン、Zがパッチバージョンを表します。
X.Y.Z(メジャー.マイナー.パッチ)のバージョン形式を守る必要があります。
X,Y,Zは負の整数であってはならず、各数値の先頭にゼロを置いてはいけません。

具体的に言うと、


◯ 1.0.0

× 01.0.0

ということですね。

バージョンの数値のアップデートは、

1.9.0 -> 1.10.0 -> 1.11.0

のように数値的にアップデートしていかないといけない点に注意。

### 一度パッケージをリリースしたら、バージョンのパッケージのコンテンツを修正してはいけない

当たり前っちゃ当たり前ですが、メジャー、マイナー、パッチのバージョンのルールに則って新しいバージョンとしてリリースする必要あり。

### メジャーバージョンのゼロは初期段階の開発用、バージョン1.0.0でパブリックAPIを定義

0.Y.Zは初期段階の開発用に使う。
1.0.0でリリース初期版。

### メジャーバージョンを上げたら、パッチとマイナーは0にリセット

当たり前ですが、1.10.0 -> 2.0.0
のようにするということ。

### マイナーバージョンについて

- プライベートコード内での新しい機能の追加や改善を取り込んだ場合バージョンを上げる
- マイナーバージョンを上げたら、パッチバージョンは0にリセット

## FAQ

サイト参照。

## おわりに

メジャー、マイナー、パッチのルールに従って命名するようにすれば綺麗なバージョニングができるようになると思います。
より詳しくは[公式](http://semver.org/lang/ja/)を見てみてください。 参考になれば幸いです！

[^1]: ここでいうバグ修正とは、間違った振舞いを修正する内部の変更のこと
dbq（CLI tool to easily Decorate BigQuery table name）を作ってみた


https://github.com/yoheimuta/dbq

- Go 言語製
- BigQuery にクエリ投げるときに簡単にデコレータをつけられるラッパーツール

[BigQuery の課金仕様と注意点をまとめてみた（2015-07 時点） - Qiita](http://qiita.com/yoheimuta/items/bb8fbc364e6dfeeaf731) に書いたとおり、BigQuery の検索費用は、[テーブルデコレータ](https://cloud.google.com/bigquery/table-decorators)を使えば節約できますが、`bq コマンド`でアドホックに実施するには使いづらいところがあります

- 数時間前までの指定くらいなら自力でも計算できるが、開始日時から終了日時の Unixtime を計算するのは面倒
- さらにタイムゾーン込みで計算するのも面倒
- ドライランで確認できるバイト数（`6862860066238 bytes of data` など）からどれくらいコストがかかるのかを計算するのも面倒

ということで、`bq query` コマンドをラップする CLI ツールを作ってみました  :bowtie: :moneybag:

```rb
# ドライラン
# この例では 2015-07-20 00:00:00 JST から現在までのデータを走査対象とする
# デコレータがない場合とある場合の走査バイト数と費用の比較も表示する
$ dbq query "SELECT * FROM [mtburnlog.foo@] ORDER BY time LIMIT 1" --startDate="2015-07-20 00:00:00" --tz="-9" --dryRun
Raw: SELECT * FROM [mtburnlog.foo] ORDER BY time LIMIT 1
Query successfully validated. Assuming the tables are not modified, running this query will process 6862860066238 bytes of data.

- 6862860066238 bytes equal to 6,862,860,066,238 bytes
- 6862860066238 bytes equal to 6.2TiB
- 6862860066238 bytes equal to $31.20867 (= 6.24173 TiB * $5)

Decorated: SELECT * FROM [mtburnlog.foo@1437314400000-] ORDER BY time LIMIT 1
Query successfully validated. Assuming the tables are not modified, running this query will process 109495551638 bytes of data.

- 109495551638 bytes equal to 109,495,551,638 bytes
- 109495551638 bytes equal to 102GiB
- 109495551638 bytes equal to $0.49793 (= 0.09959 TiB * $5)

# クエリを発行する
# 見やすさのためカラムを限定する
# Decorated: 以下が実際に発行されるクエリ
$ dbq query "SELECT time, bar, baz FROM [mtburnlog.foo@] ORDER BY time LIMIT 1" --startDate="2015-07-20 00:00:00" --tz="-9"
Decorated: SELECT time, bar, baz FROM [mtburnlog.foo@1437314400000-] ORDER BY time LIMIT 1
Waiting on bqjob_r232f2e05c1289cfb_0000014eb43d27e4_1 ... (1s) Current status: DONE    
+---------------------+-------+----------+
|        time         | bar | baz |
+---------------------+-------+----------+
| 2015-07-19 13:42:54 | 934   |      594 |
+---------------------+-------+----------+
```

ついでに、`DATE_ADD('datetime', -9, 'HOUR')`も置換するプレースホルダーを用意しました

- WHERE で JST の時間を指定したいことが多いので

```rb
# _tz(日時) が置換されるプレースホルダー
$ dbq query "SELECT time, bar, baz FROM [mtburnlog.foo@] WHERE _tz(2015-07-20 01:00:00) <= time and time <= _tz(2015-07-20 02:00:00) ORDER BY time LIMIT 1" --startDate="2015-07-20 00:00:00" --tz="-9"
Decorated: SELECT time, bar, baz FROM [mtburnlog.foo@1437314400000-] WHERE DATE_ADD('2015-07-20 01:00:00', -9, 'HOUR') <= time and time <= DATE_ADD('2015-07-20 02:00:00', -9, 'HOUR') ORDER BY time LIMIT 1
Waiting on bqjob_r7943732b00690112_0000014eb442afdc_1 ... (3s) Current status: DONE    
+---------------------+-------+----------+
|        time         | foo | baz |
+---------------------+-------+----------+
| 2015-07-19 16:00:00 | 17473 |     1068 |
+---------------------+-------+----------+
```

# 補足

`dbq` をつくるときに使った依存パッケージなどは http://go-talks.appspot.com/github.com/yoheimuta/talks/go-intro.slide#49 にまとめました

- Go 言語を使ったコマンドラインツールをはじめてつくる人には参考になると思います
フローチャートやシーケンス図をマークダウンで記述が可能なエディタSunny Place Editorを公開しました。


フローチャートやシーケンス図をマークダウンで記述が可能なエディタ Sunny Place Editor(Early Access版：0.1.0 Honolulu)を公開しました。

![SunnyIcon.png](https://qiita-image-store.s3.amazonaws.com/0/35954/e8a3d60e-cebd-f33e-29cf-c7d475d061eb.png "SunnyIcon.png")


片手間でやっているので、まだまだ **残念なところだらけ** なのですが、使えなくもないのでEarly Access版(Honolulu)を公開することにしました。現在はMac版のみです。 **Windows版はもう少し待ってください。**ただ、何ヶ月も待たせはしない予定。

## 0.使い方

アプリダウンロードは以下からどうぞ。
[Sunny Place Editor](https://sunnyplace.parseapp.com/)

ダウンロードしたファイルに同梱のREADME_ja.mdをエディタから開いてみてください。

ちなみに、こんなことができます。

## 1.GitHub形式のマークダウンが利用できる。

![sunny_markdown.gif](https://qiita-image-store.s3.amazonaws.com/0/35954/f3fbd155-9201-a8b7-3b1f-7463565d20f5.gif "sunny_markdown.gif")


## 2.フローチャートやシーケンス図がかける。

![sunny_flow.gif](https://qiita-image-store.s3.amazonaws.com/0/35954/a3b954ca-76dc-2ecf-31c6-bfaaaf680888.gif "sunny_flow.gif")

## 3.アンカーの自動埋め込み（オリジナル機能）

仕様書ではリンクを作成することが多いと思います。見出しとリストの中では[foo]と書けばアンカーを自動的に埋め込んで置いてくれるようにしました。これでリンクが作りたい放題ですよ。

![sunny_anchor.gif](https://qiita-image-store.s3.amazonaws.com/0/35954/ffdb5f42-66fd-5aa7-ded4-33821d0d93b4.gif "sunny_anchor.gif")

## 4.HTMLエクスポート
指定されたディレクトリにHTML形式でエクスポートできます。CSS/JavaScriptも添付されます。

## 今後の予定

まずはWindows版。
その次は細かいメンテをしようかと。
Capybaraで「Request failed to reach server, check DNS and/or server status」のエラー


## 現象

Capybaraでhttpsのサイトにvisit('')したときに、以下のエラーが発生する。

Request failed to reach server, check DNS and/or server status

```
/usr/local/lib/ruby/gems/2.1.0/gems/poltergeist-1.6.0/lib/capybara/poltergeist/browser.rb:323:in `command': Request failed to reach server, check DNS and/or server status (Capybara::Poltergeist::StatusFailError)
	from /usr/local/lib/ruby/gems/2.1.0/gems/poltergeist-1.6.0/lib/capybara/poltergeist/browser.rb:31:in `visit'
	from /usr/local/lib/ruby/gems/2.1.0/gems/poltergeist-1.6.0/lib/capybara/poltergeist/driver.rb:95:in `visit'
	from /usr/local/lib/ruby/gems/2.1.0/gems/capybara-2.4.4/lib/capybara/session.rb:227:in `visit'
	from /usr/local/lib/ruby/gems/2.1.0/gems/capybara-2.4.4/lib/capybara/dsl.rb:51:in `block (2 levels) in <module:DSL>'
	from itunes.rb:24:in `login'
	from itunes.rb:61:in `<main>'
```


## 原因

SSLの通信にエラーが起きてるため。

>The problem is most likely due to SSL certificate errors. If you start phantomjs with the --ignore-ssl-errors=yes option, it should proceed to load the page as it would if there were no SSL errors:
[screen scraping - PhantomJS failing to open HTTPS site - Stack Overflow](http://stackoverflow.com/questions/12021578/phantomjs-failing-to-open-https-site/24679134#24679134)


## 対処法

以下のオプションを設定することで解決した。

phantomjs_options: ['--ignore-ssl-errors=yes']


上記オブションのみで解決しない場合は、`--load-images=no`, `--ssl-protocol=any`のオプションも試してみるとよいとのこと。

```
Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, {
                    js_errors: false,
                    timeout: 1000,
                    phantomjs_options: [
                              '--load-images=no',
                              '--ignore-ssl-errors=yes',
                              '--ssl-protocol=any']})
end
```


ローカル環境では、上記の「phantomjs_options」を指定しなくても動作するが、CentOS上だとエラーになる。インストールしているphantomjsの違いなのか、SSL通信をする際の挙動が違うのか理解していないため、要調査。



## 参考

- [Capybara と Phantomjs で ChatWork をアレしようと思ったら Capybara::Poltergeist::StatusFailError とかいわれてなにも取得できなくて困った。 - MMMPA](http://mmmpa.hatenablog.com/entry/2015/01/05/Capybara_%E3%81%A8_Phantomjs_%E3%81%A7_ChatWork_%E3%82%92%E3%82%A2%E3%83%AC%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E6%80%9D%E3%81%A3%E3%81%9F%E3%82%89_Capybara%3A%3APoltergeist%3A%3AStatusFailError_%E3%81%A8)
- [selenium - Ruby: Phantom.js blocked on specific site? - Stack Overflow](http://stackoverflow.com/questions/25706563/ruby-phantom-js-blocked-on-specific-site)

- [screen scraping - PhantomJS failing to open HTTPS site - Stack Overflow](http://stackoverflow.com/questions/12021578/phantomjs-failing-to-open-https-site/24679134#24679134)

- [Command Line Interface | PhantomJS](http://phantomjs.org/api/command-line.html)
PHP7調査(38) PHP7のリリーススケジュール

(2015/9/8追記)最近のスケジュールを反映しました

(2015/11/18追記)リリース延期してRC7が出たので反映しました

(2015/11/25追記)残念ながら再度延期になりそうな気配です

PHP7の最新のリリーススケジュールは、私の認識では次のようになっています。（出典：「[PHP: todo:php70](https://wiki.php.net/todo/php70)」）

|リリース|予定|実際|
|---|---|---|
|Alpha 1|2015-06-11|2015-06-11|
|Alpha 2|2015-06-25|2015-06-25|
|Beta 1|2015-07-09|2015-07-10|
|Beta 2|2015-07-23|2015-07-24|
|Beta 3|2015-08-06|2015-08-06|
|RC1|2015-08-20|2015-08-21|
|RC2|2015-09-03|2015-09-04|
|RC3|2015-09-17|-|
|RC4|2015-10-01|-|
|RC5|2015-10-15|-|
|RC6|2015-10-29|-|
|RC7|2015-11-12|-|
|RC8??|2015-11-26|-|

~~この表「…」が多すぎだろ！と思われるかもしれませんが、betaの後はRC（リリース候補版）になるので、おかしくはありません。~~

予実の差がほとんどないことから考えても、スケジュール上は順調だと言えそうです。多少前後する可能性はあるでしょうが、11月リリース予定と考えておけば良さそうですね。
HuBot忘備録

# インストール

## HuBotのインストール

```
$ yo hubot
```

## Adapterの追加

```
# Procfileに web: bin/hubot --adapter slack と追記
$ npm install --save hubot-slack

# 確認
$ bin/hubot -a slack
※ slackのAPI tokenを入力していないと怒られるので、 export HUBOT_SLACK_TOKEN="hogehoge" などとbin/hubotに書いとく

```

# 起動
wordpressのWysiwygエディタでの改行問題

Wysiwygエディタで表示されているように出力したいときの問題。
wordpressが勝手に`<br>`入れたりするので、エディタのときと違って改行入っとるやん！とか改行されてへんやん！とかありがち。
なんでこれでうまくいった方法メモ


```lang:出力したいphp
$answer = get_sub_field('answer'); //custom fields
$answer = str_replace("<br/>", "", $answer);
$answer = str_replace("<br />", "", $answer);
$answer = str_replace("<br>", "", $answer);
echo nl2br($answer,false); 
```

enterして改行したときとShift+enter押して改行した2パターンはこれでOkだった。


http://blog.tk4.biz/blog/2013/12/15/29/
「すくすくスクラム広島第12回「見積もり」」に参加したよ

https://sukusuku-scrum-hiroshima.doorkeeper.jp/events/28115

二ヶ月おきに開催されているすくすくスクラム広島に参加しました。

![20150725-scrum.png](https://qiita-image-store.s3.amazonaws.com/0/53620/bcdca070-7c71-5dd1-e657-13b0ca455a75.png)

こうやって見返すと「見積もり」とはそれた内容だったと思いました。

システムを内製で作るのか、外注するのか。外注の場合、請負なのか、準委任契約なのか。
社内システムなのか、システムでお客様にサービスを提供するか。

条件によって見積もりに求められる内容（関係する人が求める内容？かな）が変わるのかもしれません。

「見積もり」は、視点によってだいぶ違う気がしました。
手元にあるエッセンシャルスクラムを「視点」を意識して読み返そうと思います。

大規模／エンタープライズというキーワードが印象に残りました。
夏休みは、ディシプリンド・アジャイル・デリバリー（DAD）を読みます。面白そうです。

気になる本が増えてます。 kindle の積ん読がひどくなってきそうです。。。
Visual C++ 14 (Visual Studio 2015) 更新ファイルがないのに実行のたび毎回リビルドされて困ったら

Visual Studio 2015 Community に MFC アプリを移行し、「デバッグなしで開始 (Ctrl + F5)」で実行しようとすると、毎回ソリューションのリビルドが走るようになってしまい、非常にうざい状況になってしまいました。

初回ビルドして実行しようとすると、下のようなダイアログが出て、これに何の気なしに「はい」しちゃうとどうやら毎回ビルドになってしまうみたいです。

![スクリーンショット 2015-07-25 16.09.02.png](https://qiita-image-store.s3.amazonaws.com/0/20937/66b5341a-ea48-76df-33fd-f63d09e665af.png)

このダイアログをもう一度出すには、「ツール」→「オプション」→「プロジェクトおよびソリューション」→「ビルド/実行」の設定を開きます。「実行時に、プロジェクトが最新の状態でない時」のドロップダウンリストが「常にビルドする」になっていたら、「ビルドするかどうかを確認する」に変更しましょう。

![スクリーンショット 2015-07-25 15.48.16.png](https://qiita-image-store.s3.amazonaws.com/0/20937/0a2fd12a-f863-f3d8-172f-c45107be066e.png)

もう一度「デバッグなしで実行」すると、先ほどのダイアログが表示されます。今度は、「いいえ」を選択しましょう。

![スクリーンショット 2015-07-25 15.47.42.png](https://qiita-image-store.s3.amazonaws.com/0/20937/7db57209-f428-d0ea-1f6e-768c99297361.png)

以上で、毎回リビルドされる状況は回避できます。
milkcocoa関連の情報をまとめてみた

# 概要
自分がネット上で目にしたMilkcocoaに関連する情報をまとめていきます。随時更新予定。
また、「こんな情報ありました」ってのも教えていただけるとありがたいです。

# 

## 公式関連
### Milkcocoa公式サイト
https://mlkcca.com/
とりあえずお絵かきしようぜ！

### Technical Rockstars
http://www.technicalrockstars.co.jp/
milkcocoaを作ってる会社。

### ドキュメント
https://mlkcca.com/document/

### Milkcocoa Engineer's Blog
http://blog.mlkcca.com/
Milkcocoaの中の人がいろんな使い方を紹介しています。

### Milkcocoaのセキュリティ機能を強化しました
http://blog.mlkcca.com/frontend/update-milkcocoa-security-rule/
最近の重要な機能の更新について。まだドキュメントへ反映されていないので追加。

### Milkcocoaのグッズ(BASE)
http://mlkcca.base.ec/
Tシャツ売ってます。

### マッシュアップアワード
http://hacklog.jp/apis/251

## 人物

|アカウント| 説明(ざっくり) |
|---|---|
|[@milkotn](https://twitter.com/milkotn) |みるこたん。#milkcocoaタグをすごく拾う。ヘッダー画像がちょいちょい変わる。|
|[@syuhei_hiya](https://twitter.com/syuhei_hiya) |milkcocoaのひと|
|[@_sgtn](https://twitter.com/_sgtn) |milkcocoaのひと|
|[@kiyopikko] (https://twitter.com/kiyopikko) |milkcocoaのひと|
|[@bakuonboogie](https://twitter.com/bakuonboogie) |milkcocoaのひと。Tシャツ姿をよく見かける。|
|[@n0bisuke]()|LIGののびすけさん。Milkcococa公認エバンジェリスト|
|[@printf_moriken](https://twitter.com/printf_moriken) |芸情展2014作ってる方|

## お絵かきのハッシュタグ
公式サイトのトップページでお絵かきしたら、キャプチャしてこのタグつけて呟こう。みるこたんが気に入るとヘッダー画像がそれになるらしい。

[#milkcocoaお絵かき](https://twitter.com/search?q=%23milkcocoa%E3%81%8A%E7%B5%B5%E3%81%8B%E3%81%8D&src=typd)

## milkcocoaを使ったWebサイト
### RAMIEL SHOOTING
http://milk-cocoa.github.io/ramiel-shooting/
milkcocoaとjThreeでブラウザ上で動くFPS。Nintendo64の007ぽい感じする。手軽にこういうのができるのがすごい。

### RAMIEL SHOOTINGのソースコード
https://github.com/milk-cocoa/ramiel-shooting
上記サイトのソースコード。

### 芸情展2014
http://www.aid.design.kyushu-u.ac.jp/exhibition/2014/

### PoyoPoyo!!
http://syuhei176.github.io/pencil-battle/
milkcocoaを使った落ちものゲー。

## milkcocoaを使ったプラグイン
専用のバックエンドを立ち上げるほどじゃないんだよなぁ…という最たる例ではないだろうか。そういうところでちゃちゃっと使えるのがmilkcocoaのよいところ。

### chat-parts
埋め込みチャットプラグイン。JSとCSSを追加するだけでWebサイトにチャットを埋め込むことができる。
![image](https://qiita-image-store.s3.amazonaws.com/0/30304/973f821b-5b99-d2fb-0c97-758ca1632610.png)
https://github.com/milk-cocoa/chat-parts

### shareclick
クリックポイントを共有するライブラリ。このデータからヒートマップを生成するなど応用のアイデアが広がります。ヒートマップを作る際は[こちら](http://blog.mlkcca.com/frontend/heatmap-with-milkcocoa/)の記事が参考になります。
https://github.com/milk-cocoa/shareclick

## 勉強会情報
[IoT縛りの勉強会! IoTLT](http://iotlt.connpass.com/)(connpass)
LIGの菅原のびすけさんが主催のIoT関連の勉強会。milkcocoaの中の人もいらっしゃる。他のBaaSの中の人もLTしてたり、IoT関連の情報も聞けるのでmilkcocoaでなにかやろうとしてる人は参加しない手はない。
ubuntu版chkconfigのsysv-rc-confを使う

サーバ起動時にApacheも自動で起動させたいときなど、chkconfigコマンドで設定を行うことで実現できる。

しかしUbuntu12.10からchkconfigが使えなくなって、代わりに「**sysv-rc-conf**」というのが用意されている。

##sysv-rc-confのインストール

```
$ sudo apt-get install sysv-rc-conf
```

##使い方

使い方はchkconfigと同じ

ex ) apache2をサーバー起動時に自動で起動させる

```
$ sysv-rc-conf apache2 on
```
Jenkinsをubuntu14.04にインストール

##Jenkinsをインストール
以下の４つのコマンドを実行すれば完了

```
wget -q -O - https://jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
```

##Jenkinsにアクセスしてみる
以下のコマンドでJenkinsを起動
`sudo service jenkins start`

ポート８０８０でアクセスできる
`http://ドメイン:8080`
単一ドメインで unicorn + nginx で Rails アプリを動作させる

# はじめに
さくら VPS で独自ドメインなしで趣味 rails アプリを運用しているので、1つの FQDN で複数の Rails アプリを動作させたいけど、色々ハマったのでメモ

#環境
OS: Centos 6.5

gem | version
:--|:--:
Nginx | 1.0.15 
Rails | 4.2.1
Unicorn | 4.9.0

#前提
- ドメインは _hoge.sakura.ne.jp_
- Rails アプリ名 _Banana_, _Melon_
- アプリの URL _hoge.sakura.ne.jp/banana/_ , _hoge.sakura.ne.jp/melon
となるように諸々設定する
- Banana は _/home/rails/banana_ に配置してある
- Melon は _/home/rails/melon_ に配置してある
- Banana は、ポート 3100 で動作
- Melon は、ポート 3101 で動作
- Nginx はリバースプロキシとして動作させる

***
概念図
![nginx_unicorn.png](https://qiita-image-store.s3.amazonaws.com/0/86918/5bc6977e-3f72-a994-47c6-91b9fff9632e.png)
/bananaへのリクエストがNginxで解決できなかったら、localhost:3100にリクエストを行う。
***

#作業
##Nginx側の設定

#### conf ファイル準備
/etc/nginx/conf.d/local.conf を作成して、内容を以下のようにしておく

```local.conf
upstream banana{
        server localhost:3100;
}

upstream melon{
        server localhost:3101;
}
server{
        listen 80;
        server_name hoge.sakura.co.jp;
        location /banana{
                alias /home/rails/banana/public;
                try_files $uri $uri.html $uri/index.html @banana;
        }
        location @banana{
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_pass http://banana;
        }
        location /melon{
                alias /home/rails/melon/public;
                try_files $uri $uri.html $uri/index.html @melon;
        }
        location @melon{
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_pass http://melon;
        }
}
```
> location /melon{} 

により、/melon/$uri に対するリクエストを受けたら 

- /home/rails/melon/public/$uri
- /home/rails/melon/public/$uri.html
- /home/rails/melon/public/$uri/index.html
- localhost:3100 

の順番に探していく。
localhost:3100については、探すのではなくて、リクエストを行うので、問い合わせ元がnginxのIPにならないように、問い合わせ元のIPとなるようにしてやる。

```
service nginx restart
```
で再起動しておく。
後は、Unicorn側の設定を正しく行うことで設定が完了する

##Unicorn側の設定
Nginxからは、localhost:3100, localhost:3101にそれぞれアクセスされるが、それぞれ/banana, /melon以下にアプリがあるという前提のリクエストなので、起動時パラメータを

```
unicorn.rb -p 3100 --path /banana
unicorn.rb -p 3101 --path /melon
```
としておく。これによって、localhost:3100/banana/がアプリのルートになる。
また、アプリ内で展開されるパスについても同様のパスになっている必要があるため、
config.ruを以下のようにしておく必要がある

```ruby:config.ru
require ::File.expand_path('../config/environment', __FILE__)
if ENV['RAILS_RELATIVE_URL_ROOT']
  map ENV['RAILS_RELATIVE_URL_ROOT'] do
    run Rails.application
  end
else
  run Rails.application
end
```

わかっていれば手順は非常に少なくて簡単。ググって出てくる情報だと、だいたいホスト名をアプリごとに変える運用になってるけど、サブディレクトリで運用したい人はあまり居ないのかな。
phpenvのコマンドとphpenv-apache-versionの切り替えコマンド


忘れるので、メモ書き。おまけは、導入時にこけたのでそれのメモ書きです。

導入時に参考にしたサイト
[HomebrewでApache、PHP、MySQL、phpMyAdmin追加 - Furudateのブログ](http://furudate.hatenablog.com/entry/2015/01/16/064610 "Furudateのブログ")


## phpenvのコマンド
### インストールできるバージョンの一覧表示
```bash
$ phpenv install -l
```

### インストールされているバージョンの表示
```bash
$ phpenv versions

* system (set by /Users/{ユーザー名}/.phpenv/version)
  5.6.4

# * 印が現在設定されているPHPのバージョンです。
# systemであればOSに搭載されてるバージョンを指す
# Yosemite 10.10.4の場合、PHP 5.5.24となる
```

### インストール
```bash
$ phpenv install {version}

# 例えば 5.4.27をインストールしたい場合
$ phpenv install 5.4.27
```

### クライアント側のPHPバージョンを切り替える
```bash
$ phpenv global 5.4.27

# hashの更新を行う
$ phpenv rehash

# 設定ができた場合は確認をする
$ php -v
PHP 5.4.27 (cli) 〜中略
```

### ローカル側のPHPバージョンを切り替える

phpenvでのローカルは、今いるディレクトリの場所だけ切り替える感じです。

```bash
# 切り替えたいディレクトリまで移動する
$ cd /var/www/project/sample

# バージョン変更
$ phpenv local 5.4.27

# unsetするまで維持するので、global環境のPHPに戻す
$ phpenv local --unset
```

### 使用中のShellだけPHPのバージョンを切り替える

iTerm2とかで試してます。

```bash
# タブで開いていれば、変更したいタブでコマンド実行
$ phpenv shell 5.4.27

# unsetして、global環境に戻す
$ phpenv shell --unset
```

## phpenv-apache-versionのコマンド
PHPをインストール時に libphp5.so をphpenvのバージョン管理フォルダにコピーしておく必要がある
### libphp5.soをコピーする
```bash
$ cp /usr/local/opt/httpd22/libexec/libphp5.so ~/.phpenv/versions/5.4.27/

# apacheのバージョンは適宜置き換えてください。
```

### バージョンを切り替える
```bash
$ phpenv apache-version {version}

# 例
$ phpenv apache-version 5.4.27
```
実行後apacheの再起動を行うので、Macの場合はsudoでのパスワードが要求される

***

## おまけ
`apache`を新しく入れたときに`LoadModule`の`libphp5.so`がエラーで読み込めないというかapacheのシンタックスエラーで凄く悩んだので、忘れないようにメモ。
まぁ原因はあれです。色々わけも分からずやってたら、`apxs`のパスが変わっちゃったのに気づかず、`php-build`の設定がクライアント側のapxsのままだったという落ちです。

```bash
httpd: Syntax error on line 117 of /usr/local/etc/apache2/2.2/httpd.conf: Cannot load /usr/local/Cellar/httpd22/2.2.29/libexec/libphp5.so into server: dlopen(/usr/local/Cellar/httpd22/2.2.29/libexec/libphp5.so, 10): Symbol not found: _ap_unixd_config\n  Referenced from: /usr/local/Cellar/httpd22/2.2.29/libexec/libphp5.so\n  Expected in: /usr/local/Cellar/httpd22/2.2.29/bin/httpd\n in /usr/local/Cellar/httpd22/2.2.29/libexec/libphp5.so
```
上記のようなシンタックスエラー吐いてる場合に、`php-build`の`--with-apxs2`のパスを確認しなおしましょう。
ちなみにエラーの原因は、libphp5.soのmake時に`apxs`のパスが違うために起きているためですね。
`Symbol not found: _ap_unixd_config`の部分でapacheの場所が参照できなかったんだと思ってます。
なので、`which`コマンドでちゃんとパスの確認をして、再度PHPのインストールを実行すればapacheに怒られずにすみます。


```bash
$ which apxs

# 結果（apacheを新規インスコしたら以下）
/usr/local/bin/apxs

# クライアントのままだと
/usr/sbin/apxs
```
まぁ何というかちゃんと動くようになって嬉しいね(・∀・)
モジュールの動的読み込み


なんとなくWebで見つけた今までの方法(imp.load_module)はdeprecatedだったため、Python 3.4におけるモジュールの動的読み込み処理を調べてみた。

# ファイル構成

```
top
  |- main.py
  |- foo
          |- __init__.py
          |- some.py
          |- sample.py
  |- bar
          |- __init__.py
          |- some.py
```

# 古い方法

```imp.load_module``` を使う方法で、```find_module()``` の結果を使用して```load_module()``` でモジュールを読み込む。
このとき、モジュール名（属性 ```__name__``` ）は ```load_module``` の第一引数```name```が設定される。
Pythonではモジュールを ```sys.modules``` に登録するが、後勝ちになって先に読み込んだモジュールは上書きされてしまうことに注意する。
このため、fooとbarの両方のsome.pyを同じ名前someで読み込むと、意図しないものになることがある。

```py3
import sys
import imp

def load(dir_name:str, symbol:str): # -> module
    (file, path, description) = imp.find_module(dir_name + '/' + symbol)
    return imp.load_module(symbol, file, path, description)

m = load('foo', 'some')
m.__name__ # -> 'some'
sys.modules['some'] # -> 'module'

n = load('bar', 'some')
m == n # -> True
```

# 新しい方法

```imp``` の置き換えとして ```importlib``` を使う。
```importlib.import_module``` で、相対パスそのままでモジュールを読み込む。

```py3
import importlib

m = importlib.import_module('foo.some') # -> 'module'
m.__name__ # -> 'foo.some'

n = importlib.import_module('bar.some') # -> 'module'
n.__name__ # -> 'bar.some'
```

## モジュール名を変えたいとき

古い方法と同様に、相対パス名を無視してモジュール名を自在に設定できるだろうか？
公式ドキュメントで ```imp.load_module``` の置き換えとして紹介されているものに次がある。
```SourceFileLoader()``` を使い、その第一引数にモジュール名を設定することができる。
モジュール名（ここではsome）は、やはり後勝ちとなる。別の名前を設定することができるので、必要に応じて設定する。

```py3
import importlib.machinery as imm
datum = imm.SourceFileLoader('some', 'foo/some.py').load_module()
```

# モジュール名の影響

foo/sample.pyでsome.pyを使用するとき、かつ動的に読み込む際の影響。
sampleを動的に読み込む場合、importで指定するモジュール名は ```sys.modules``` への登録名となる。上でモジュール名を変えていたときは、ここのimportにも影響する。

```py3
import some   # or
import foo.some
```

# まとめ

+ Python 3.4 におけるモジュールの動的読み込みを調べた
+ importlibないしその配下のモジュールを使用する
+ モジュール名の扱いに注意する
Linuxでユーザー空間で動作するプログラムとハードウェアがメモリを共有するためのデバイスドライバ（メモリ不足の場合）


前回投稿した[「Linuxでユーザー空間で動作するプログラムとハードウェアがメモリを共有するためのデバイスドライバ」](http://qiita.com/ikwzm/items/cc1bb33ff43a491440ea)で紹介した[udmabuf](https://github.com/ikwzm/udmabuf)では、dma_alloc_coherent()を使ってカーネル空間上にDMAバッファを確保しています。

カーネルのバージョンやビルド時のパラメータにもよりますが、通常はdma_alloc_coherent()はCMA(Continuous Memory Allocator)という仕組みを使ってバッファを確保しています。このCMAは確保できる"総容量"が決まっており、通常は16Mバイトです。したがって udmabuf ではこれを越えるバッファサイズを確保しようとすると失敗します。

実はCMAで確保できる総容量はカーネル起動時のパラメータで指定できます。例えば、devicetree に次のように指定すれば、CMAバッファの最大バイト数を128Mバイトに変更できます。


````devicetree.dts

	chosen {
		bootargs = "console=ttyPS0,115200n8 consoleblank=0 root=/dev/mmcblk0p2 rw rootwait earlyprintk cma=128M";
		linux,stdout-path = "/amba@0/serial@e0001000";
	};
````

当然、物理メモリ以上の容量は指定できませんし、あまり大きな値を指定すると他のプロセスに支障が出るので注意してください。
2015-07現在：さくらスタンダードでhtmlをphpとして動作の際の注意２

先日さくらスタンダードでhtmlをphpとして動作させる時の注意を書きました。

[さくらスタンダードでhtmlをphpとして動作の際の注意](http://qiita.com/sebon77@github/items/4dcf5099d3b331820968)

その続きで、5.2.17をルートにおいていた為、5.4か5.6に変更しようと思い、共有フォルダからコピーしてこようと思った際に、以前とphpの場所が変わってたので書いておきます。

**注意：2015年7月に確認している情報です。**

さくらは結構細かな部分が変更されるので、うまくいかない場合はなるべく新しい情報を検索してくださいませ。

まずはphpのバイナリを探します。
結論から言うと「/home/rs/php」に各バージョンが格納されています。
それぞれのフォルダ内にbinフォルダがあるので、「php-cgi」を自分のwwwルートに「php.cgi」としてコピーします。
この際、コピー元は「php」ではなく「php-cgi」ですのでそこは注意してください。

で同じくwwwルートの.htaccessに

```text:.htaccess
Action myphp-script /php.cgi
AddHandler myphp-script .php .html
```
を入れてあげればOKです。
しっかり試してませんが、www内にコピーしてきたphp.cgiのファイル名をphp54.cgi等にして、複数バージョンをコピーしてきて.htaccess内でファイル名を変更すれば、コンパネ内でphpバージョンを選択するのと同じことになると思います。
[baserCMS] サイトリニューアル時にcss、jsを強制的に再読み込みさせて、過去のキャッシュを利用させないようにする

baserCMSを利用したウェブサイトリニューアル時に、リニューアル以前のcss、jsの影響を受けて意図しない表示崩れが発生することがありました。
それでその対処策考えてみた件。


## 想定している対象者
- baserCMSでウェブサイトを制作をしている方
- リニューアル時に、旧cssの影響を受けて表示崩れが起きたことがある方


## 発生状況
1. baserCMSで制作しているウェブサイトを、ドキュメントルートの切替えで公開サイトを切替えたとき


### 環境
- 普通のLAMP
 - PHP 5.2.6
 - baserCMS 3.0.2, 4系


## 原因
ドキュメントルート切替時リリースの際、css、js のキャッシュが効くことにより、本来表示されるべき改修後表示に影響が出ることがある。


## 対処
読込URLに、ファイルの最終更新日時のタイムスタンプのクエリーを付与し、閲覧者のキャッシュを強制的に上書きさせる。
サンプルは以下。

```
<link rel="stylesheet" type="text/css" href="/css/style.css" />
<script type="text/javascript" src="/js/script.js"></script>
　　　　　　　　　　　　　　↓↓↓↓↓
<link rel="stylesheet" type="text/css" href="/css/style.css?1437808354" />
<script type="text/javascript" src="/js/script.js?1435806062"></script>
```

## 処理の作成
```php:/app/Config/install.php or /app/Config/setting.php
<?php
Configure::write('Asset.timestamp', 'force');
?>
```

### Asset.timestamp について
- core.php に備わっている
- true を設定すると、debug mode が1以上の場合に適用される
- force を設定すると、debug mode の値に関わらず常に適用される

## その他
- 単一で部分的に利用するときはこんな感じかなぁ

```
<link rel="stylesheet" href="/css/style.css<?php echo '?' . @filemtime(WWW_ROOT . CSS_URL . 'style.css'); ?>">
```


## 注意点
- ヘルパ経由で読み込んでいる箇所には適用されるけど、jsで動的に付与したり、直書きしている箇所には適用されません。
- 適用後は「サーバーキャッシュの削除」を実行し、一度ビューキャッシュを削除しましょう。
[ansible][copy] msg: could not find src=/path/to/file

ansibleのcopyは下記のような感じなのを忘れてました。

- src={{ansibleを実行したホスト}}
- dest={{適用しているリモート}}

```yaml
- name: 悪い例
  copy:
    src=/etc/ntp.conf.bk  # <- ローカルのパス
    dest=/etc/ntp.conf  # <- リモートのパス
```


素直に `shell: cp ...` しましょう

```yaml
- name: 本当にやりたかったこと
  shell: cp ntp.conf.bk ntp.conf 
        chdir=/etc
```
ACCON：サンプルアプリケーション(Blog)のデータ構造

## [ACCON](https://kurobuta.jp/books/book/manual/accon/ "ACCON")(Powered by FuelPHP)を利用した実装サンプル（Blog機能）のデータ構造

### ER図

![ER図](https://lh3.googleusercontent.com/cX1aHATKX1kUaEc4ctwJ5oGVPfveDSn9cmAY8M25NJA=w2730-h1930-no "ER図")

[拡大](https://photos.google.com/share/AF1QipPtsUA4siCPP1FRfUacNsKPkkeQFoaG4An1BLMiwjJn9uWvvYRJ0f35J2hdE4KpuA/photo/AF1QipPzhNPgaOPuQph0g4fWQ1jgcwtz2Bzqd5R-1Pgi?key=RnZXMklxdFg5SjlJMkRzeUFPYl9pREJwOEpJR013 "ER図")

### SQL

#### slugテーブル

```sql
CREATE TABLE `slug` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `user_id` int(11) NOT NULL DEFAULT '0',
  `created_at` int(11) NOT NULL DEFAULT '0',
  `updated_at` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `UNIQUE` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
```

#### postsテーブル

```sql
CREATE TABLE `posts` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `slug_id` int(11) NOT NULL,
  `post_status` varchar(45) DEFAULT NULL,
  `public_at` int(11) DEFAULT NULL,
  `summary` text NOT NULL,
  `body` text NOT NULL,
  `user_id` int(11) NOT NULL,
  `created_at` int(11) DEFAULT NULL,
  `updated_at` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
```
React-Bootstrapに挑戦する


# 突然の難関

簡単に行くかと思いきやいきなりつまずく。

とりあえずいままでの構成

 * dest
   * アプリのhtml (手書きｗ)
   * アプリのjs (自動変換)
 * src
   * アプリのjsx
 * node_modules
   * react
   * react-tools
   * react-bootstrap (new!)
 * bootstrap (new!)

destディレクトリにhtmlがあるのがアホっぽいが実験なので勘弁してくれ。

htmlのjavascriptタグで

    <script src="../node_modules/react/dist/react.min.js"></script>

とやって読み込み、

    jsx --watch --harmony src/ dest/

とやって変換してブラウザでドン！

動いたー

である。

が、同様の方法で

    <script src="../node_modules/react-bootstrap/dist/react-bootstrap.min.js"></script>

とやるとjsxがお怒りになられる。あいつ(jsx)はコンポーネントクラスの中身を気にする存在だったのか……と。お前(jsx)中身知らなくても変換できるだろ……と。

jsxからreactは見えてreact-bootstrapは見えないってのも罠感ある。

ちなみにjsxも$PATHにreact-tools/binを入れてるから動いてるところある。微妙ｗ

なんとなくnpmでグローバル領域にガンガンjs置いていくことに抵抗があるのだがこの感覚こそ最大の敵かも分からん。アンインストールの仕方よく分かってないし……

## 作戦１ JSXTransformerを使う。

たぶんいちばんシンプル。

ガンガン書いてたES6の構文がどうなるか気になるがたぶん平気だろう。

パフォーマンスはきっと落ちるが、そもそも実験だしどうでもいい？

## 作戦２ 諸々をnpm -gオプションで入れなおす

入れなおせばたぶん見れるようになるだろ。jsxにパス通さんでもよくなるし。

## 作戦３ jsを合成するヤバイジツを使う

ほいでgulpかなんか入れて諸々コミコミのデカイjsを一気にビルドする。

まぁ環境はクリーンだろうけど、労多くして功少なしか。

結局gulpをグローバルに入れそうだし。

-

というわけで作戦２で行く決断を下した……

## 結論

コンパイル？出来た。しかし問題はそんなことではなかった。

元々Reactで作っていたコードに、

    <button hogehoge>fugafuga</button>

というのがあり、これを

    <Button hogehoge>fugafuga</button>

と、閉じタグをBootstrapコンポーネントに変換していなかったためにコンパイルエラーが出ていたのだ！

ヤバイ！

そしてこの経験は恐らく他の人の役に立たない！
PhalconのクエリビルダーでSQLのLIKE句を使う

しょうもないネタだけど結構ハマったので…

以下のようなテーブルがあるとする(MySQL)。

```
mysql>DESC books;
+-----------+---------------------+------+-----+---------+----------------+
| Field     | Type                | Null | Key | Default | Extra          |
+-----------+---------------------+------+-----+---------+----------------+
| id        | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| title     | varchar(255)        | NO   | UNI | NULL    |                |
+-----------+---------------------+------+-----+---------+----------------+
```

ここで、titleによる検索のため、以下のようなSQLが実行されるように実装したい。

```sql
SELECT * FROM books WHERE title LIKE '%PHP%';
```

クエリビルダ（Phalcon\Mvc\Model\Criteria）で雑に実装すると以下のようになる。

```php
Books::query()->where("title LIKE '%" . $search . "%'");
```

当然だけど、この実装にはSQLインジェクションの脆弱性がある。しかし、

```php
Books::query()->where("title LIKE '%:title:%'", ['title' => $search]);
```

は動かない。では、どうするか。

```php
Books::query()->where("title LIKE ':title:'", ['title' => '%' . $search . '%']);
```

という風に、バインドするパラメータの前後に%をつければよい。

以上。
【Android】もっと先へ「加速」したくはないか、少年 〜gitignore編〜


.gitignoreの設定どうしてますか？

僕の場合、毎回プロジェクトつくるたびにどこかから適当にもってきてたんですが、もう面倒で面倒で。

新規プロジェクト作ったはじめの.gitignoreが理想の形になっててほしい。 **もう2度とコピペしたくない。**

ということでそうしましょう。

## ここを変えれば良い

以前に [【Android】もっと先へ「加速」したくはないか、少年 〜File Template編〜](http://qiita.com/kgmyshin/items/6b34c1f576a73c894f72) で紹介したんですが、Android Studioの中にはプロジェクトを新規で作る際に(当たり前かもですが)内包しているテンプレートを使っています。

で、gitignoreの場合はプロジェクト新規の際に単純にコピーしてきてるだけっぽいので、その大元を変えてあげます。

ちょっと長いですけど、そのファイルがこれです。

**/Applications/Android Studio.app/Contents/plugins/android/lib/templates/gradle-projects/NewAndroidProject/root/project_ignore**


このファイルを見ると、いつものアレになってるのがわかります。

```いつものアレ
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
```

このファイルを自分の好きな感じに変更しましょう。

```自分の好きな設定
# Built application files
/*/build/

# Crashlytics configuations
com_crashlytics_export_strings.xml

# Local configuration file (sdk path, etc)
local.properties

# Gradle generated files
.gradle/

# Signing files
.signing/

# User-specific configurations
.idea/libraries/
.idea/workspace.xml
.idea/tasks.xml
.idea/.name
.idea/compiler.xml
.idea/copyright/profiles_settings.xml
.idea/encodings.xml
.idea/misc.xml
.idea/modules.xml
.idea/scopes/scope_settings.xml
.idea/vcs.xml
*.iml

# OS-specific files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
```

これでもうアンインストールとかしない限り毎回コピペする必要ないです。

## ちなみに

**/Applications/Android Studio.app/Contents/plugins/android/lib/templates**

には結構、新規プロジェクトつくるときの材料があるので、他にもbuild.gradleとか初期設定を変えたいものがあると漁ってみるといいかもです。
C#でstructをバイト配列に変換する拡張メソッド

```csharp

public static byte[] ToByteArray<T>(this T structure) where T : struct
{
    byte[] bb = new byte[Marshal.SizeOf(typeof(T))];
    GCHandle gch = GCHandle.Alloc(bb, GCHandleType.Pinned);
    Marshal.StructureToPtr(structure, gch.AddrOfPinnedObject(), false);
    gch.Free();
    return bb;
}
```

よく使うネタです。
ElixirのGETTING STARTED（9.Recursion）をやってみた

# URL
http://elixir-lang.org/getting-started/recursion.html

# 試した環境
* Ubuntu Server 14.04 LTS 
* Erlang/OTP 18
* Elixir 1.0.4

# Loops through recursion

不変という特性のため、Elixir(や関数型言語)でのループは、は手続き型言語は異なる書き方をする。例えば、手続き型言語では次のように記述する。

```
for(i = 0; i < array.length; i++) {
  array[i] = array[i] * 2
}
```

上の例では、配列と補助変数iを変更している。Elixirではこうはできない。その代わり、関数型言語は再帰に頼る。関数は停止条件に到達するまで再帰的に呼ばれ、動作する。任意の回数文字を出力する下記の例を考えてみる。

```ex:recursion.exs
defmodule Recursion do
  def print_multiple_times(msg, n) when n <= 1 do
    IO.puts msg
  end

  def print_multiple_times(msg, n) do
    IO.puts msg
    print_multiple_times(msg, n - 1)
  end
end

Recursion.print_multiple_times("Hello", 3)
```

caseと同様に、関数は複数の節を持つことができる。
関数への渡した引数が節の引数のパターンとマッチし、ガードの評価がtrueの場合に、その節が実行される。

```sh
$ elixir recursion.exs
Hello
Hello
Hello
```

print_multiple_times/2が最初に呼ばれた場合、引数のnは3である。
最初の節はnが1と同じか小さい時にこの定義を使うように言っている。
これにはマッチしないため、Elixirは次の節の定義に移る。

2番目の定義はガードがなくパターンにマッチするので、実行される。最初に ```msg```が表示され、自分自身を呼び出し、第２引数に ```n-1```つまり2を渡す。呼び出された関数では同様に```msg```を表示し、```n-1```つまり1を第2引数に渡して、print_multiple_times/2を再び呼び出す。

nが1になったことにより、print_multiple_times/2にある第1定義のガードが評価されるので、この定義を実行する。```msg```を表示した後は、何も実行しない。

引数の2番目へどんな数を渡しても、第1の定義（ベースケースと呼ばれる）か、確実に1ステップ毎にベースケースに近づくような第2の定義のどちらかが呼ばれるprint_multiple_times/2を定義した。


# Reduce and map algorithms

例えば、リストにある数の合計を求めるようなときに、再帰のちかをどのように使うか見てみる。

```ex:math.exs
defmodule Math do
  def sum_list([head|tail], accumulator) do
    sum_list(tail, head + accumulator)
  end

  def sum_list([], accumulator) do
    IO.puts accumulator
  end
end

Math.sum_list([1,2,3], 0)
```

```sh
$ elixir math.exs 
6
```

引数としてリスト[1,2,3]と初期値0を渡してsum_list/2を呼び出す。パターンマッチのルールに従ってマッチするものが見つかるまで、それぞれの節が試される。この場合、[1,2,3]は[head|tail]に対して、 head = 1, tail = [2,3]が割り当てられ、accumulatorには0がセットされる。

次にリストの先頭とアキュムレータを足し(head + accumulator)、リストの残り(tail)を第1引数にとしてsum_listを再び呼び出し、再帰的に処理する。
リストの残りは再びsum_listで、[head|tail]にマッチされ、リストが空になるまで、次のように続く。

```ex
sum_list([1, 2, 3], 0) # accumlator = 0(head)
sum_list([2, 3], 1) # accumlator = 1(head) + 0(accumlator)
sum_list([3], 3) # accumlator = 2(head) + 1(accumlator)
sum_list([], 6) # accumlator = 3(head) + 3(accumlator)
```

リストが空になると、最後の節にマッチし、最終結果の6が返る。

リストから値をとり１つの値へ減らしていく処理は、"reduce"アルゴリズムと呼ばれており、関数型プログラミングの中心となっている。

もし、リストに含まれる要素の値を2倍にしたければどうすればいいか。

```ex
iex> defmodule Math do
...>   def double_each([head|tail]) do
...>     [head * 2 | double_each(tail)]
...>   end
...> 
...>   def double_each([]) do
...>     []
...>   end
...> end
```

```ex
iex> Math.double_each([1,2,3])
[2, 4, 6]
```

リストを再帰的にたどり、全ての要素を2倍にし、新しいリストを返す。
このリストの値とって、リストにマッピングする処理は、"map"アルゴリズムとして知られている。

再帰と末尾呼び出しの最適化はElixirの重要な部分で、ループを作るのよく利用される。
しかし、Elixirでプログラミングするときには、リストの操作として上記のような再帰を使うことはない。

[Enumモジュール](http://elixir-lang.org/docs/stable/elixir/#!Enum.html)はリストで使える便利なものを既に提供している。例えば、上記の例は次のように書ける。

```ex
iex> Enum.reduce([1,2,3], 0, fn(x, acc) -> x + acc end)
6
iex> Enum.map([1,2,3], fn(x) -> x * 2 end)
[2, 4, 6]
```

キャプチャー構文を使えば次のように書ける

```ex
iex> Enum.reduce([1, 2, 3], 0, &+/2)  # +演算子をキャプチャしている
6
iex> Enum.map([1, 2, 3], &(&1 * 2))
[2, 4, 6]
```
Tangle : Initialize


[Tangle, Compiler tool for wisp. ](https://github.com/Shadowys/tangle)

The current only way of compiling mass wisp files is through makefiles or shell scripts. In the spirit of taking everything good of [Clojure](http://clojure.org/), I'm trying to emulate the [defproject macro](https://github.com/technomancy/leiningen/blob/stable/sample.project.clj), even though I might actually end up using JSON instead. Nevertheless, Tangle aims take in that project descriptor and uses it while it engages the wisp compiler.

Currently it is in very early alpha stage and only allows you to use it by editing the config object in the index.wisp file and then

```bash
$ wisp src/index.wisp
```

Of course, this is assuming that you've already installed [wisp](https://github.com/Gozala/wisp). 
I'll be working on multiple src paths and initiating the defproject macro next. Contributors are welcome.
CentOS 6 初期設定


```bash:
$ sudo yum -y groupinstall development
$ sudo yum -y install vim zsh wget locate rsync bc nkf system-config-network-tui
$ sudo yum -y install libffi-devel gdbm-devel openssl-devel readline-devel tk-devel zlib-devel libxml2-devel
$ sudo updatedb
$ sudo sed -i -e 's/Defaults    secure_path = \/sbin:\/bin:\/usr\/sbin:\/usr\/bin/Defaults    secure_path = \/sbin:\/bin:\/usr\/sbin:\/usr\/bin:\/usr\/local\/bin/' /etc/sudoers
```
【PUN】PhotonCloudのコールバック処理をUniRxでスマートに書く「PhotonRx」

#PhotonRx

PUNのコールバック通知をUniRxのObservableTriggerの形式で扱えるようにしてみました。

**[PhotonRx](https://github.com/TORISOUP/PhotonRx)**

ライセンスはMITです。

##使い方

usingにPhotonRxを追加すれば、あとは*this.xxxxAsObservable*の形式でコールバック通知をObservableとして扱えるようになります。

```csharp:PhotonRxのサンプル
using System;
using PhotonRx; //追加する
using UnityEngine;
using UniRx;

public class PhotonRxSamle : MonoBehaviour {

	void Start ()
	{
        //プレイヤの入室イベント
	    this.OnPhotonPlayerConnectedAsObservable()
	        .Subscribe(p => Debug.Log(p.name + "さんが入室しました"));

        //プレイヤの退室イベント
	    this.OnPhotonPlayerDisconnectedAsObservable()
	        .Subscribe(p => Debug.Log(p.name+"さんが退室しました"));
	}
}
```

PhotonRxで定義されているxxxAsObservable()はObservableTriggerBaseと同じ挙動になっています。
つまり、対象の**GameObjectが破棄されると自動的にOnCompletedが飛ぶ**ようになっているのでストリームの寿命管理も考えなくて良くなっています。


##PhotonRxを導入するメリット

* PhotonのコールバックがIDE補完が効く形で呼び出せるようになる
* 型安全に扱えるようになる
* UniRxの柔軟な非同期処理にそのまま載せることができる

##高度な使い方

PhotonRxとコルーチンを組み合わせると**非同期処理を同期処理っぽく**書けるようになります(awaitみたいなことができる）

```csharp:ログイン処理を同期処理っぽく書く
using System;
using System.Collections;
using PhotonRx;
using UnityEngine;
using UniRx;

public class PhotonRxSamle2 : MonoBehaviour
{

    private void Start()
    {
        //ロビーへの接続処理
        StartCoroutine(ConnectCoroutine());
    }

    private IEnumerator ConnectCoroutine()
    {
        //ロビーへの接続結果を通知するストリームを作成
        //接続成功・失敗のストリームの2つをマージしてどちらかのイベント通知の到達を待つ
        var loginStream = this.OnJoinedLobbyAsObservable().Cast(default(object))
            .Merge(this.OnFailedToConnectToPhotonAsObservable().Cast(default(object)))
            .FirstOrDefault() //OnCompletedを発火させるため
            .PublishLast(); //PublishLastは結果をキャッシュする

        //ConnectでStartAsCoroutineより前にストリームの監視を開始する
        loginStream.Connect();

        //接続開始
        PhotonNetwork.ConnectUsingSettings("0.1");

        //結果保存用のオブジェクト
        var result = default(object);

        //StartAsCoroutineは対象のストリームのOnCompletedが発行されるまでnullを返す（コルーチン上で待機する）
        yield return loginStream.StartAsCoroutine(x => result = x, ex => { });

        //結果の型を見て判定する
        if (result is DisconnectCause)
        {
            Debug.Log("接続失敗");
            //
            //ここに失敗処理を書く
            //
            yield break;
        }

        Debug.Log("接続成功");

        //以下処理を続けるならここに書く

    }
}
```

肝は`StartAsCoroutine`です。
詳しくは[【UniRx】UniRxとコルーチン](http://qiita.com/toRisouP/items/dc369ff4232c5c127437)をご参考ください。

##作った経緯
6/19のUniRx勉強会で講演された、gloopsの森永さんの[若輩エンジニアから見たUniRxを利用したゲーム開発](http://www.slideshare.net/HirohitoMorinaga/unirx)というスライドの中で、ObservableTriggerとしてPUNのコールバックを扱うと便利に幸せになったとの内容がありました。
確かにTriggerベースにしてしまえば扱いやすく、パフォーマンス的にも良いのでこれは早速使うしか無いなということで実装をしてみました。
タブ切り替え時にアニメーションを行う

UITabbarController のタブをアニメーションで切り替わるようにする。


おおまかに次の手順

1. UIViewControllerAnimatedTransitioning プロトコルに準拠したアニメーションクラスを作成する。
2. TabBarControllerDelegate のanimationControllerForTransitionFromViewController メソッド内で上記のアニメーションクラスを返してやればOK


1.animator クラスの作成

```objc:TabAnimation
class TabAnimation: NSObject,UIViewControllerAnimatedTransitioning {

    func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval {
        return 1.0
    }
    
    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
        let from:UIViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!
        let to:UIViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
        var container:UIView = transitionContext.containerView()
        container.insertSubview(to.view, aboveSubview: from.view)
        to.view.alpha = 0.0;
        
        UIView.animateWithDuration(self.transitionDuration(transitionContext),
            animations: {() -> Void in

                println("begin")
                from.view.alpha = 0.0;
                to.view.alpha = 1.0;

            },
            completion: {(value: Bool) in
                transitionContext.completeTransition(true)
        })
    }
   
}
```

2. タブコントローラの実装

```objc:TabViewController
class TabViewController: UITabBarController,UITabBarControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
 self.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
        println(viewController)
    }
    
    func tabBarController(tabBarController: UITabBarController,
        animationControllerForTransitionFromViewController fromVC: UIViewController,
        toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning?{
            return TabAnimation()
    }
}
```


作ったやつのサンプルプロジェクトはこちら
[https://github.com/colorbox/Example/tree/master/AnimationTab](https://github.com/colorbox/Example/tree/master/AnimationTab)
RecyclerView, GridLayoutManagerにCardViewを直接いれてはならない。

RecyclerViewのLayoutManagerにGridLayoutManagerをセットする場合、そのアイテムのレイアウトとしてこのような実装をするときちんとマージンが反映されずに、カード自体が小さくなってしまう。


**ダメな例**

```xml:card_item.xml
<CardView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="8dp">
    <!--Some views -->
</CardView>
```

なので、GridLayoutManagerでCardViewを使用する場合、このように外側にFrameLayoutを入れる必要がある。

**正しい例**

```xml:card_item.xml
<Frame_Layout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="8dp">
        <!--Some views -->
    </CardView>
</FrameLayout>
```

なおLinearLayoutManagerではFrameLayoutなしでもちゃんと表示される。CardView以外でどうなるかは調べていないのでわかりません。

**追記2015/7/28**

これでもCardViewのサイズは指定通りにセット出来ますが、marginがおかしくなりますね。例えばmarginを4dpにセットした場合なぜか実際は8dpになります。なので、marginを1/2した値を設定しなければならない?  これはバグなのだろうか。。。
特定のビューにaddSubview して追加先のビューと同じ大きさにするAutoayout生成コード

あるビューを別のビューのサブビューとして追加し、追加先のビューと同じ大きさになるような制約を追加する。


```objc
-(void)moveView:(UIView*)view
           Base:(UIView*)base{
    // ビューを取り外して移動先に追加し、上下左右を接着する
    [view removeFromSuperview];
    [base addSubview:view];
    NSDictionary *viewDictionary = NSDictionaryOfVariableBindings(view);
    NSArray *horizonStete = [NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[view]-0-|"
                                                                    options:0
                                                                    metrics:nil
                                                                      views:viewDictionary];
    [base addConstraints:horizonStete];
    NSArray *verticalStete = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[view]-0-|"
                                                                     options:0
                                                                     metrics:nil
                                                                       views:viewDictionary];
    [base addConstraints:verticalStete];

}
```
mod_mrubyを使ってPOSTされたBODYの中からある項目を抽出してCookieに埋め込んでみる


すでに構築したものの追加要望で、あるサイトからPOSTされたBODYの中から特定の項目を抽出してCookieに埋め込んでほしいというものがあり、その方法を模索して今回の件名にたどり着きました。

## 前提事項

- Apache 2.2のモジュールを使って実現できること（できるだけ）
- ApacheのBackendにあるアプリケーションサーバには変更を加えない
- FormでPOSTされた情報から抽出し、Keyは柔軟に変更できなければならない

## 考えたこと

当初はApacheのmod_rewriteで下記のようにできないかとか考えてたんだけど（渡される値がURLにあると勘違いしてた）、ちょっと調べた限りではそれは難しそうだと断念。少なくともBODYの中身まで見てCookieに埋め込むようなことはできないなぁと。

```apache
RewriteEngine On
RewriteRule "^/index\.html\?KEY=(.+)" "-" [CO=key:$1:1440:/]
```

で、ちょっと前に[ngx_mruby](https://github.com/matsumoto-r/ngx_mruby)を弄ったことがあって、そういえばApache版もあったことを思い出し、実際にやってみた結果うまくいったのでその内容を下記に記載します。

## 導入手順

[mod_mrubyのページ](https://github.com/matsumoto-r/mod_mruby/wiki/Install)に書いてあるとおりDocker使えば楽なのですが、今回はすでに構築されているApacheに対して適用しなければならないので、Dockerでない方法で確認します。基本的に記載のとおりにやれば問題なくインストールできます。

なお、依存モジュールがあるので、その点のみ注意です。

```bash
sudo apt-get install openssh-server git curl apache2 apache2-dev apache2-utils rake ruby2.0 ruby2.0-dev bison libcurl4-openssl-dev libhiredis-dev libmarkdown2-dev libcap-dev libcgroup-dev
```

## 設定内容

下記設定で確認しました。 ```mrubyInsertFilterFirst``` を使っていますが、ほかの[Directive](https://github.com/matsumoto-r/mod_mruby/wiki/Directives)でも動作するかもしれません。また、```r.filename```を使ってリダイレクトもしています。

```/etc/apache2/sites-enabled/000-default.conf
<VirtualHost>
    〜略〜
    <Location /login/>
        mrubyInsertFilterFirst /path/to/mruby/set-cookie.rb
    </Location>
    〜略〜
</VirtualHost>
```

```/path/to/mruby/set-cookie.rb
r = Apache::Request.new
s = Apache::Server.new
hout = Apache::Headers_out.new
if r.body.to_s =~ /KEY=(.+)/
  hout["Set-Cookie"] = "key=#{$1}; path=/; expires=EXPIRATION_DATE"
end
r.filename = s.document_root + "REDIRECT"
Apache.return(Apache::OK)
```

```html
<form method="POST" action="http://TARGET_SERVER/login/">
  <input type="text" name="KEY" value="VALUE" />
  <input type="submit"/>
</form>
```

ChromeのデベロッパーツールでCookieがセットされていること確認できました。

## 使ってみて

mod_mrubyはかゆいところに手が届く、すばらしいソフトウェアです。他にもいろいろカバーしている機能があり、もっともっと活用できそうです。この場を借りて、mruby、mod_mrubyを開発されたみなさま（特にまつもとさんと松本さん）に感謝いたします。いやぁ、ほんと助かりました。


## 注意

動作は確認していますが、保証するものではありません。実際お試しになる場合は正しく動作しない可能性もありますので、ご留意ください。
内容で間違っている部分等ありましたらご指摘いただけるとうれしいです。

## 参考にさせていただいたサイト

- [mod_mruby](http://mod.mruby.org/)

その他いろいろなサイトを徘徊して調べました。Apache, mod_mrubyについて情報を公開してくださっているみなさまに感謝です。
apple-touch-iconはbase64で指定できてJSで後書きできるって知ってた？

## おさらい
apple-touch-iconとは、iOSのSafariだとホーム画面に追加するってやると追加されるやつ（Webクリップアイコンって言うらしいですよ）
Androidの場合もなぜか同じ名前で読み込まれる

![gamy.png](https://qiita-image-store.s3.amazonaws.com/0/7132/bca5ea36-97bc-4cbd-47a1-0ec6c1f8fc2a.png)

## 追加方法
headerタグの中に

```html:html
<link rel="apple-touch-icon" href="apple-touch-icon.png" />
```

## なんと！base64でこんな書き方もできるんです
```html:html
<link rel="apple-touch-icon" href="data:image/png;base64,・・・・・・" />
```
## そして！JavaScriptで後から書き変えができるんです
```js:javascript
var appleTouchIcon = document.getElementById("appleTouchIcon");
appleTouchIcon.href = "apple-touch-icon2.png";
```

##これを利用してCanvasを使ってapple-touch-iconを生成できるのでは？

##できました！
例えば、アイコン画像を２つ用意して、１つはPNGで透過させてCanvasで重ねてみます。

![gamy.png](https://qiita-image-store.s3.amazonaws.com/0/7132/c552b46f-3138-5ef4-0f2f-2e593013df48.png)

```js:javascript
var appleTouchIcon = document.getElementById("appleTouchIcon");

var img1 = new Image();
img1.src = "appIcon1.png";
var img2 = new Image();
img2.src = "appIcon2.png";

/*
 ※実際にやるときは画像のロードを待たないとだめ
*/

// canvas作成
var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");

var size = 152
canvas.width = size;
canvas.height = size;
ctx.drawImage(img1, 0, 0, size, size);
ctx.drawImage(img2, 0, 0, size, size);
var base64 = canvas.toDataURL("image/png");

appleTouchIcon.href = base64;
```

今回は、こんな感じでカテゴリー毎に違うアイコンを作るのに使いました。
わざわざこのために画像生成用のサーバーを構築せず簡単に実装できました。
![gamy2.png](https://qiita-image-store.s3.amazonaws.com/0/7132/a55d66fe-183d-30db-2659-77b042f1c2ca.png)
Ubuntu 14.04でZabbixを立てる

# 資料

https://www.zabbix.com/documentation/2.4/manual/installation/install_from_packages#debian_ubuntu

# aptリポジトリの追加

```
wget http://repo.zabbix.com/zabbix/2.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_2.4-1+trusty_all.deb
dpkg -i zabbix-release_2.4-1+trusty_all.deb
sudo apt-get update
```

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

```
sudo apt-get install snmp snmp-mibs-downloader fonts-ipafont-gothic zabbix-server-mysql zabbix-frontend-php 
```

# タイムゾーンの設定

```apache:/etc/httpd/conf.d/zabbix.conf
# php_value date.timezone Europe/Riga
php_value date.timezone Asia/Tokyo
```

# スキーマとデータのインポート

```
cd /usr/share/zabbix-server-mysql
mysql -u $DBユーザ名 $DB名 < schema.sql
mysql -u $DBユーザ名 $DB名 < images.sql
mysql -u $DBユーザ名 $DB名 < data.sql
```

# グラフで日本語を表示するためにIPAフォントを使用する

```
sudo ln -s /usr/share/fonts/truetype/fonts-japanese-gothic.ttf /usr/share/zabbix/fonts/graphfont.ttf
```

# Zabbix Serverの設定

```/etc/zabbix/zabbix_server.conf
DBHost=
DBName=
DBUser=
DBPassword=
```

# サービスのリスタート

```
sudo service apache2 restart
sudo service zabbix-server restart
```
nyagosスクリプト解説 - VisualStudio れんけー

設定
=====

自分の .nyagos はこんな感じになっている。

```Lua:.nyagos
local ProgramFiles="C:\\Program Files (x86)"
if not nyagos.stat(ProgramFiles) then
    ProgramFiles = "C:\\Program Files"
end

local function source(args)
    args[0] = "source"
    local fd = io.open(args[1])
    if not fd then
        return nil,"File Not Found"
    end
    fd:close()
    return nyagos.exec(args)
end

source{ nyagos.pathjoin(ProgramFiles,
        "Microsoft Visual Studio 10.0\\VC\\vcvarsall.bat"),
        "x86" }
```

ややこしいことをしているけど、要は

```
source "C:\Program Files\Microsoft Visual Studio 10.0\\VC\\vcvarsall.bat" "x86"
```

を実行すれば、環境変数が Visual Studio Command Prompt 相当になるっていうだけ。

活用
====

コマンドラインから Visual Studio を起動する
-----------------------------------------

```
open *.sln
```

要はソリューションファイルを開けばいいだけ

Visual Studio を起動せず、ビルドする
----------------------------------

こんな Makefile をつくったりー（ここでは TAB がスペース化されているので、コピペする時は注意）

```
build:
	devenv XXXXXXX.sln /build Release

debug_:
	devenv XXXXXXX.sln /build Debug

clean:
	devenv XXXXXXX.sln /clean Release
	devenv XXXXXXX.sln /clean Debug
```

マクロを使っているので、mingw32-make.exe でも nmake.exe でも、どっちでもいけるはず