OmniAICreator/Qiita-1.07M huggingface dataset:
【国内】IoTソリューション (介護)

## 親の運転を見守るお守り型IoTデバイス(Charm)

![スクリーンショット 2015-04-17 17.38.12.png](https://qiita-image-store.s3.amazonaws.com/0/74972/b7357ddf-9f6b-dffd-c38c-f90f3a76321f.png)

http://hatapro.co.jp/c/

- 介護向け国内IoTソリューション
- 高齢者の親を持つ子が親の運転状況を監視できるIoTデバイス。
- 毎日の運転傾向をデバイスが自動収集、離れて暮らす子のスマホへ通知が届く。危険な運転をするとお守りデバイスから音声が発せられる。運転者が発作、事故災害など緊急時にはシステムが代理で電話してもらえる。

## うんこ「10分後に出ます」世界の悩みを解決する画期的デバイス、日本の教授たちが開発『D free』(トリプル・ダブリュー・ジャパン社)

![スクリーンショット 2015-04-17 17.57.53.png](https://qiita-image-store.s3.amazonaws.com/0/74972/3a0cebe4-a2d7-9569-8d62-dd09fc81cf84.png)

http://weekly.ascii.jp/elem/000/000/307/307988/

- 介護向けIOTソリューション
- 超音波センサーで膀胱や前立腺、直腸をモニターして、膨らみや振る舞いをもとに排泄を予知する仕組み。スマホと連動していて、アプリ側は便通の記録帳になっている。
- 介護士が１人当たり20〜30人見るが、便漏れが発生すると3〜4人がかかりきりになるので、運用の改善に繋がる。

## 見守りクラウドロボ(ビズロボジャパン、コムツァイト）

![スクリーンショット 2015-04-20 11.14.28.png](https://qiita-image-store.s3.amazonaws.com/0/74972/5a13eab9-989e-2f5b-0018-2df673cae564.png)

http://bizrobo.com/news/20150319_233.html

- 介護向けIOTソリューション
- 利用者が高齢者の方の気になるパターンを設定(「トイレから何時間も出てこない」等)し、独自の連絡通知機能を追加できる。
- 首掛け型呼び出しボタン、温度センサ、照度センサ、湿度センサ、人感センサ、扉開閉センサ、無線電灯スイッチ、無線式電灯回路切替機をセンサとして設置できる。

## GPシューズ(チェリー・BPM)

![スクリーンショット 2015-04-20 11.46.12.png](https://qiita-image-store.s3.amazonaws.com/0/74972/8ce73519-d1e9-9441-3b41-30bfc5ecd2b3.png)

http://www.cherrybpm.com/reserve/

- 介護向けIOTソリューション
- 認知症の方には、その方のパターンを設定し、家から出かけたという情報を通知で利用者に知らせることができる。高齢者の方向けには、靴の利用状況から、安否確認の通知をすることができる。 
- GPキューブを利用すると, 子どもやペットがどこに行ったかを確認することができる。手荷物や貴重品にも応用可能である。

## GPSスマートインソール　GPS内蔵インナーソールで靴をGPS化　自閉症・徘徊老人・アルツハイマーの介護、徘徊対策などに(駿河屋)

![スクリーンショット 2015-04-20 11.58.06.png](https://qiita-image-store.s3.amazonaws.com/0/74972/dcc9079b-6831-d8a8-090a-3aebda66215d.png)

http://surugaya.shop-pro.jp/?pid=79482828

- 介護向けIoTソリューション
- 靴の中敷きにGPSを入れている。
- アプリから介護対象者のリアルタイムな場所の状況を知ることができる。介護対象者が危険エリアに到達した場合, 携帯電話に通知が来る。
node.jsをバージョンアップしたら最初にやるべきこと

# これだけ

```node_modules入れ直しの例.
// node_modulesを消して
rm -rf node_modules

// 新たに入れ直し（必要に応じてsudo）
npm install
```

# なんで？
バージョンをあげたら、node_modulesは新しい処理系でビルドし直す必要があるからということです。でも、たまに消さなくても動いちゃうことがあるのでややこしいという。

##おまけ
npm installして起動したのにエラーが出る場合は、エラーメッセージで吼えているnpmを探しましょう。
大方、該当のnpm入れ直すと改善します。一度uninstallしてからまたinstallしましょう

```swig-email-templates入れ直しの例.
npm uninstall swig-email-templates
npm install swig-email-templates
```
Elastic Beanstalkでtimezoneの変更

`.ebextensions/00-set-timezone.config`を作ってこんな感じ。

```
commands:
  set_time_zone:
    command: ln -f -s /usr/share/zoneinfo/Japan /etc/localtime
```

http://stackoverflow.com/questions/25399685/amazon-elastic-beanstalk-change-timezone
IE9対策 border radiusとgradient編

まだie9は対応必要ですよね・・。

ie9 border radius gradient problem とか検索するとすぐに出てくるかと思いますが、
IE9では角丸とグラデーションを一緒に指定すると角丸が効かなくなってしまいます。

そんなときはー、SVGを使うべし。

http://www.colorzilla.com/gradient-editor/

![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/ffd6bdfe-53bf-af7e-033b-ba0d0d926c88.png)

個々を使えばすぐにグラデーションを生成してくれます。
さらに、IE9を使うならば、SVGを使うようにしてくれます。

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/b9bece48-b1c7-4a72-77ed-88956866f5cb.png)
↑ここで選択できます。

IE9でradiusとgradientのfilterが相性よくないので、

```html

<!--[if gte IE 9]>
  <style type="text/css">
    .gradient {
       filter: none;
    }
  </style>
<![endif]-->
```

↑こちらをHTMLに入れておくと、IE9ではfilterを消してくれます。
そもそもIE6からIE8まで対応が必要なければ、filter消しちゃっていいですね。
JavaScriptを読んでて「なにこれ！？」と思うけれど調べられない記法8選。

JavaScriptを読んでいると、「あれ、、、なにこれ？この書き方。。。」と思うことがたまにあります。この際の厄介なことは、どうやって調べたらいいかわからないことです。Google先生に聞こうにも、その書き方をなんと呼ぶかわからないので聞けない。

そんな「なにこれ？」を厳選してみました。覚えておくと、将来スッキリとする時が来るでしょう。

# 1. なみなみ、ふにゃふにゃ言ってる

```js:
var arg = ~~~~~~~~~~~1^1|1&1<<1>>1>>>1
```
ビット演算子を使うと、JavaScriptでなみなみ、ふにゃふにゃ言えます。上記は-1です。

# 2. アンダーバーアンダーバー、ダラーダラー言ってる。
```js:
var __$$_$$$_$$_$$_peso = "だらーだらー";
```
JavaScriptでは、変数名に文字と数字、Unicode文字、それに_と\$を使うことができます。
つまり、アンダーバーやダラーが出てきても、それは単なる文字と一緒です。特に意味はありませんが、目立つので、（多分それが理由で）JQueryではJQueryオブジェクトのエイリアスに\$を使っています。

# 3. 大カッコ、中カッコ

```js:
{}
[]
```
オブジェクトの生成が{}、配列の生成が[]です。上記コードは下記と同じ意味です。

```js:
new Object();
new Array();
```

# 4. かっこかっこ言ってる。

```js:
execFunc()();
```
JavaScriptでは、関数で関数を返すことができます。どう説明すればよいかわからないので、サンプルコードを示します。

```js:
function execFunc(){
  return function(){
    console.log("do");
  }
}
```
上記は関数を返す関数で、execFunc()で、実行可能な関数が生成され、その直後に()をつけることによって生成された関数を実行するというものです。

# 5. 見慣れぬコロン
JavaScriptでコロンが出てくるパターンは3項演算子とラベルとオブジェクトリテラル（くらい？）です。その中でも、三項演算子とラベルはいきなり出てくるとびっくりするので選出です。

```js:三項演算子
var arg = 条件 ? true : false;
```

```js:ラベル
test: while(true){
	break test;
}
```
ラベルは、JavaScriptではループ文の前につけてそのループをbreakしたりcontinueしたりするのに使えます。ループ分以外の式にもラベルをつけることもできます。

# 6. いきなりスラッシュ（/）
```js:
var regexp = /test/i
```
""や''で囲われているのは文字列ですが、//で囲まれているのは見慣れませんね。//で囲まれたのは正規表現で、RegExpオブジェクトが生成されます。上のコードは下記コードと同じ意味です。

```js:
var regexp = new RegExp("test", "i");
```

# 7. 唐突に単独のバックスラッシュ

```js:
var message = "JavaScriptでは\
文字列の最終行に\\をつけることで\
複数行の文字列を定義することが\
できてしまうのです。\
";
```

# 8. function前の変な記号
functionの前に特定の記号をつけることにより即時実行関数を定義することができます。即時実行関数とは、スコープを限定的にするために用いる記法で、以下の表現が代表的です。

```js:
(function(){console.log("do")})();
```
()で囲み、その後に実行のための()をつけることで定義した関数を即時に実行できます。この記法は有名なのですが、実は()で囲わなくても最初に!や+や-や~の記号をつけることで即時関数として実行できます。

```js:
!function(){console.log("do")}();
+function(){console.log("do")}();
-function(){console.log("do")}();
~function(){console.log("do")}();
```

ちなみに、functionの前に何も付けないと文法エラーとなります。

```js:これは文法エラー
function(){console.log("do")}();
```
2015/04/17 Unity HandsOn at TechBuzz Space

## 資料

* [プレゼン資料](http://www.slideshare.net/monry84/20150417-unity-handson)
* [画像リソース](https://www.dropbox.com/s/nbaogfo3eapdpxm/images.zip?dl=0)
* [Player.cs](https://gist.github.com/monry/3b79031d53381cbf0da3)
* [Racket.cs](https://gist.github.com/monry/2a8091a618f10232d29b)
* [完成プロジェクト](https://github.com/monry/Workshop-2015-02-16-Sample-Project)
	* 2015/02/16 のモノと同じです。
LAMP環境最短リプレースメモ

# LAMP環境最短リプレースメモ


## メモ
LAMP環境の移転、または環境の複製などいろいろと方法がありますが、最短での移行、丸ごとバックアップのメモ。RPMなどのパッケージからイチからセットアップするのはめんどくさいため、構築段階からXAMPPを使用します。/opt以降のディレクトリに構築し、lampp以降のディレクトリを丸ごとtarでバックアップを取ります。移行先のサーバーに転送後、/opt以降に展開。以上でおわりです。ユーザー、グループに気を付ければ問題なしです。開発環境の複製やフルバックアップにつかうなど。Windowsはポータル版が必要でいける？かも。


```sh:
# パーミッション保持したまま圧縮
tar cvzfp xxxxx.tar.gz ディレクトリ名

```


```sh:
# パーミッション保持したまま解凍
tar xvzfp xxxxx.tar.gz

```


<a href="https://www.apachefriends.org/jp/index.html">XAMPP Installers and Downloads for Apache Friends:</a>
ImageMagick でサムネイル画像を作成

大きい画像は全体が収まるように縮小し、小さい画像はオリジナルのサイズのままセンターに配置して、特定のサイズのサムネイル画像を作成するコマンド。

縦横150の画像の場合はこんな感じ。

```bash
$ convert source.png -resize 150x150\> -gravity center -crop 150x150+0+0 -gravity center -background transparent -extent 150x150 dest.png
```
PowerShell を monokai 風にする posh-monokai

http://shirokichi2.blog.so-net.ne.jp/2014-03-15

cmd.exe には反映したのに細かいところが PowerShell に反映しなかったので結局レジストリと編集から調整した  
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17228/07a5813c-46b6-d23e-31ab-432058152681.png)


フォントは IPAゴシックが好きなので変更した  

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/17228/4cf67aca-0fb8-6364-d8b0-0000fc669ba8.png)  
気が向いたらちゃんと書く ← 書かない
http://hitode909.hatenablog.com/entry/2015/04/12/122930
定期支払のIPNについて（試用期間中の0円決済）

試用期間中の決済通知について教えてください。

現在、Sandboxで設定している定期支払いでは、試用期間が0円の場合、試用期間中の通知が行われていないように思われます。
(試用期間中が0円でなければ通知されることが確認できています)
【国内】IOT向けのクラウド


## スマートフォンアプリのバックエンド機能が開発不要になるクラウドサービス(nifty)

![スクリーンショット 2015-04-17 16.41.24.png](https://qiita-image-store.s3.amazonaws.com/0/74972/877adcbc-65f2-59b9-93fe-7bf26d17aa39.png)

http://mb.cloud.nifty.com/about.htm

- クラウド上に用意された機能をAPIで呼び出すだけで利用できる。
- サーバー開発、運用不要により、工数削減によるコストカット、スピードアップができる。コントロールパネルも用意に設定されている。

- 設定方法は以下のリンクから
http://iot.mb.cloud.nifty.com/iotcolumn/mbaas%E3%82%A2%E3%83%97%E3%83%AA%E3%83%97%E3%83%83%E3%82%B7%E3%83%A5%E9%80%9A%E7%9F%A5%E5%AE%9F%E8%A3%85
- 統計、プッシュ通知の開封率、アプリ全体の総開封率、配信したプラットフォームを見ることができる。mBaasのコントロールからグラフを見ることが可能で、開封数の時間変化を詳しく知ることができる。
- 月にプッシュ通信を200万回まで配信できる。


## ～手軽に宅内のPC、スマホ、タブレット、スマート家電の通信を保護～ (nifty社)

![スクリーンショット 2015-04-17 16.27.59.png](https://qiita-image-store.s3.amazonaws.com/0/74972/a0544fc3-6d24-66ce-344b-98c2de34f958.png)

http://iot.mb.cloud.nifty.com/iotcolumn/mbaas%E3%82%A2%E3%83%97%E3%83%AA%E3%83%97%E3%83%83%E3%82%B7%E3%83%A5%E9%80%9A%E7%9F%A5%E5%AE%9F%E8%A3%85

- PC、スマートフォン、タブレット端末、スマート家電を保護が可能。
- ネットワーク接続機器(サービスアダプタ)を宅内LANに接続することで、サービスアダプタ内で接続されている機器をソフトウェアの設定なしでセキュアな環境で利用できる。
- スマート家電や、ゲーム機の保護が可能になる。

## Iotにおけるセキュリティ対策(nifty)


![スクリーンショット 2015-04-17 17.24.48.png]
(https://qiita-image-store.s3.amazonaws.com/0/74972/8f152a79-9da3-db58-e990-6069e9a9b42b.png)


- 自動洗浄機能付きトイレのハッキング、消音の音楽が流れたりする問題が発生している。今後はIoTの市場が増えていくにつれセキュアな面での対策が必要。
- 「パーソナルL2クラウド」により、複数の宅内LANとクラウド環境をつなぎ、１つのシステムで複数の家庭を管理するシステムの構築ができるようになった。現在特許を出願中である。
HRのforestplotをRで書く

**forest plot**とはそもそもメタ解析の結果表示につかう図表です。
ただ、交互作用の検討をしたり、いわゆるサブセット解析をした時にそのサブセットごとで結果が違うかどうかを考えたりする場合の視覚化にも有効です。
多くの場合この方法は**relative risk**や**odds ratio**を考えるときに使われますが、医学統計の場合盲目的に**cox回帰**を用いることも多いですので、その時の**hazard ratio（HR)**でも同じことを考えることが出来ます。
Rではパッケージとして**rmeta**などが準備されていますが、実はこれはオッズを考える場合の分割表を想定して作っているので、HRのforest plotを考えるときは、自作しなくてはなりません。

自作となると単にplot関数をうまく使うのもいいのですが、前々からggplotという関数群に興味があったので、今回はこれを使ってみることにしました。

#準備するデータの形式
 変数| HR | lower |upper
:-----------:|:------------:|:------------:|:----------:
 type1       |  1.6   |  1.5     |2
 type2     |   1.4    |     1.2 |2.6
      type3  |    1.1 |     1   |1.4
          type4|  1.3 |     1.2    |1.9
        type5|    1.1 |     .9  |1.2
     type6|   7  |     .8 |14

それぞれ確かめたいHRを調べて、変数の名前、点推定値（HR)、９５％信頼区間の下限（lower),95%信頼区間の上限(upper)を表にしておきます。HRの計算法は他のトピックで取り上げます。

#Rでの解析
まず必要なパッケージを読み込ませます。
```r
require(ggplot2)
require(survival)
```
もちろんない人はinstall.packages()で落としてみてください。
なお、ggplot2もあまり古い物の場合使えない可能性があるので、Rでははできるだけ最新のものの方が良いです。

次にデータを読み込みます。
```
DATA<-read.csv(file.choose(),header=T)
```
もちろんディレクトリをいつも意識して仕事ができている人はfile.choose()である必要はありません。

なお一行一行読んでいく人のために補足ですが、最後のスクリプトで縦横を逆転させます。
また医学統計でサブセット解析をするときは、往々にして症例数の少ないサブセットで大きなHRになることが多いですので、はじめからHRはlogを付けて表示するようにしています。

```r
re<-ggplot(DATA,aes(x=変数, y=log(HR)))　#変数はいわゆるサブセット解析した時の項目です。
re<-re+ylim(-1,5)#ここではHR(log(HR))の大きさ（横軸の最小値、最大値）を規定しています。
re<-re+geom_point(size=5,sharp=7) 　#信頼区間の設定１
re<-re+theme_bw()+theme(panel.grid.major.x=element_blank())　#信頼区間の設定２
re<-re+geom_errorbar(aes(ymin=log(lower),ymax=log(upper)),width=0.2,size=.50)　#信頼区間の設定３
re<-re+geom_hline(yintercept=log(1),linetype=2,col="blue") #ハザード比1.0に点線挿入
re<-re+coord_flip() #図を横に
```
これで

```r
re
```
と押すと結果が出てきます。

![プレゼンテーション9.jpg](https://qiita-image-store.s3.amazonaws.com/0/75926/5edad457-16be-bcdf-0835-b96606ffc257.jpeg)


logをとっているのがよくわからないかな？いや、log(1)=0なのでわかっていただけるか・・・。

ちなみに今回は[この投稿](http://yoshitakakeison.blogspot.jp/2015/04/ggplot.html)を参考にさせていただきました。
html floatの基本 高さを認識させる

#はじめに
htmlの基本のfloatの処理、高さを認識させる手法をまとめます。
html初心者の方ははじめはfloatに壁を感じてしまうかもしれませんが、慣れれば難しいことはありません。
ここで、頭の整理をしましょう。


# floatについて
floatは左右に要素を回りこませたいときに使います。
注意点としては、floatという名前通り、要素を浮かしているということを忘れてはいけないということです。

***floatは浮いているんだ！！***

常にこの意識を持ちましょう。

floatを使った要素の親要素はheight:auto;(デフォルト) では高さ0となってしまいます。これは要素が浮いていて、高さが認識されていないのです。

では、高さを認識させるには？

目次
1. 親要素にoverflow:hidden; または overflow:auto;を使う
2. floatした要素の直後の要素にclear:both;をつける
3. clearfixを使う

# 1. 親要素にoverflow:hidden; または overflow:auto;を使う

ボックスの高さは中身で決まります。cssのルールではoverflow:visibleだとfloatしたもの（浮動化ボックス）は中身だとは認識されません。
しかし、overflow:visible以外では浮動化ボックスも中身として計算されます。
つまり、高さが認識されるのです。

とにかく、親要素のoverflowをhiddenかautoにすると高さが認識されるということです。

注意点としては、overflow:hidden;を高さを認識させるおまじないのように使っていくと、中身がはみ出してしまった時、表示されなくなるので、レイアウトが崩れてしまうということです。

# 2.floatした要素の直後の要素にclear:both;をつける

clear:both;を付け忘れると、floatした要素の下に潜り込んでしまいます。だって、floatした要素は浮いていますからね。clear:both;をかけた要素がそれ以降の要素が潜り込むのをせき止めるイメージです。

ちなみに、clearというプロパティにはleftとrightという値をとれるのですが(それぞれ左だけせき止めると右だけせき止める）、bothだけで十分です。clear:left;をつかったり、clear:right;を使ったりすると後々どっち使ったかややこしくなりますしね。

# 3.clearfixを使う

親要素のクラスにclearfixを加え、cssを以下のように記述する。

```
/* for modern brouser */
.clearfix:after {
  content: ".";
  display: block;
  clear: both;
  height: 0;
  visibility: hidden;
}
/* IE7,MacIE5 */
.clearfix {
  display: inline-block;
}
/* WinIE6 below, Exclude MacIE5 \*/
* html .clearfix {
  height: 1%;
}
.clearfix {
  display: block;
}
/**/
```

難易度の高いテクニックなので、初めのうちは内容を理解する必要はないです。イメージとしては、見えない要素を一番下に加えて、そこでclear:both;でfloatをせき止めるという感じです。
また、上記のcssは一例です。

# まとめ

基本的にfloatを使ったら、どれかの方法で解除することを考える必要があります。
個人的には、3 のclearfixが使いやすいです。 

また、新しい手法も出てくるかもしれません。
Mac OS Xの仮想環境は2つまで！

Mac OS Xを仮想環境で動かしたいですよね！
どうせなら、[Mac Pro](https://www.apple.com/jp/mac-pro/)をホストマシンにして多くの仮想環境を動作させましょう。
って思ったのですが、**ライセンスという壁があり不可能**でした。

AppleCare Help Desk Supportに問い合わせたところ、以下の回答をいただきました。
> 現状別のアプリケーションの導入などを行っても OS X 10.10 で利用できる**仮想環境は 2 台まで**になっており、**一つのコンピュータに 3 台目以降の仮想環境のインストールは出来ない**との回答でした。
お力になれず申し訳ありませんが、ご了承いただければと思います。

これは、OS X Serverなどを導入しても制限を解除できないし、OS Xとかを複数購入してもダメとのこと。

> つまり1台の物理的な Mac に、2台までの仮想マシンしか作成できませんので、**3台目、4台目の仮想マシンが必要な場合は別の物理的な Macに導入**していただく必要がございます。

でも、「現状」って言葉があるので、今後このあたりの制限が緩和されることに期待したいですね。
画像が回転されてアップロードされてしまうのをImagickで直す

iPhoneでアップロードしたファイルが90度回転した向きで表示されてしまう…というので調べたら、Exifにorientationの情報があるのですが、アップロード時にExifを削除して保存するようにしていたからのようでした。
Exifを残した状態でも、見る人の環境によって回転して表示されたりされなかったりなようなので、サーバー側で正しい向きに回転して保存するようにしました。

```php
$im = new Imagick($filePath);
$orientation = $im->getImageOrientation();
switch ($orientation) {
	case 2: // Mirror horizontal
		$im->flopImage();
		break;
	case 3: // Rotate 180
		$im->rotateImage('#000000', 180);
		break;
	case 4: // Mirror vertical
		$im->flipImage();
		break;
	case 5: // Mirror horizontal and rotate 270
		$im->flopImage();
		$im->rotateImage('#000000', 270);
		break;
	case 6: // Rotate 90
		$im->rotateImage('#000000', 90);
		break;
	case 7: // Mirror horizontal and rotate 90
		$im->flopImage();
		$im->rotateImage('#000000', 90);
		break;
	case 8: // Rotate 270
		$im->rotateImage('#000000', 270);
		break;
}
$im->stripImage();
$im->writeImage($filePath);
```

Exif消さない場合は、```stripImage()```のかわりに```setImageOrientation(1)```をすればいいはず。きっと。

本当は[ORIENTATION 定数](http://php.net/manual/ja/imagick.constants.php#imagick.constants.orientation)で書きたいんだけど、TOPLEFTとかよくわからないんだよな…。
OSが機能を開始する流れ(bootstrapping)

#OSが機能を開始する流れ(bootstrapping)
*個人的な授業のメモです*

##1.機器に内蔵されたプログラム(**フォームウェア**)が起動し、ブートローダを実行
![firstImage](http://i.imgur.com/6p4BQcp.png?1)
※フォームウェアとは**BIOS**など

##2.**ブートローダ**が**カーネル**を読み込んでメモリ上に展開
![firstImage](http://i.imgur.com/88dKCYI.png?1)
※カーネルはOSが管理するファイルシステム上にあるのでBIOSでは読み込めない

##3.**カーネル**の実行
![firstImage](http://i.imgur.com/iwlYvBu.png?1)

###=> いつも見ている実際のGUI


##参考情報
・[BIOSとは](http://e-words.jp/w/BIOS.html)
・[ブートローダとは](http://e-words.jp/w/%E3%83%96%E3%83%BC%E3%83%88%E3%83%AD%E3%83%BC%E3%83%80.html)
・[カーネルとは](http://e-words.jp/w/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB.html)
Swoole や Event エクステンションを使って HTTPS サーバーを起動させる

PHP 5.4 で導入されたビルトインサーバーはアプリの評価やテストに便利ですが、SSL/TLS に未対応なので、対策としては [Swoole](http://www.swoole.com/) や [Event](http://php.net/manual/ja/book.event.php) (libevent) などの PHP エクステンションを導入して、自分でサーバーのコードを書く方法が挙げられます。

## Swoole

### インストール
ビルドオプションの `--enable-openssl` を指定する必要があります。

```bash
git clone https://github.com/swoole/swoole-src.git
cd swoole-src
phpize
./configure --enable-openssl
make install
```

Mac OS X で試したところ、`make install` に入る前に `Makefile` を修正する必要がありました。次の行から `-lcrypt` を削除します。

```bash
SWOOLE_SHARED_LIBADD = -lz -lssl -lcrypto
```

### PHP コード

Swoole の[トップページ](http://www.swoole.com/)や examples ディレクトリにある[コードの例](https://github.com/swoole/swoole-src/blob/master/examples/ssl/server.php)をもとに書きます。

```php:server.php
$crt_dir = 'crt/';
$config = [
   'ssl_cert_file' => $crt_dir.'server.crt',
   'ssl_key_file' => $crt_dir.'server.key'
];

$server = new swoole_http_server('0.0.0.0', 5000, SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL);

$server->set($config);

$server->on('request', function ($request, $response) {
    $response->header('Content-Type', 'text/html; charset=utf-8');
    $response->end('Hello Swoole');
});

$server->start();
```

## Event

### インストール
```bash
pecl install event
```

### PHP コード

マニュアルに掲載されている[コードの例](http://php.net/manual/ja/event.examples.php)をもとに書きます。

```php
$host = '127.0.0.1';
$port = 8765;

$base = new EventBase();

$listener = new EventListener(
    $base,
    'ssl_accept_cb',
    $base,
    EventListener::OPT_CLOSE_ON_FREE | EventListener::OPT_REUSEABLE,
    -1,
    "$host:$port"
);
$base->dispatch();

function ssl_accept_cb($listener, $fd, $address, $base) {

    EventUtil::sslRandPoll();
    $crt = 'crt/server.crt';
    $key = 'crt/server.key';

    $ctx = new EventSslContext(
        EventSslContext::SSLv3_SERVER_METHOD,
        [
            EventSslContext::OPT_LOCAL_CERT  => $crt,
            EventSslContext::OPT_LOCAL_PK    => $key,
            EventSslContext::OPT_VERIFY_PEER => false,
            EventSslContext::OPT_ALLOW_SELF_SIGNED => true,
        ]
    );

    $bev = EventBufferEvent::sslSocket(
        $base,
        $fd,
        $ctx,
        EventBufferEvent::SSL_ACCEPTING,
        EventBufferEvent::OPT_CLOSE_ON_FREE
    );

    $bev->enable(Event::READ);
    $bev->setCallbacks(
        'ssl_read_cb',
        NULL,
        NULL,
        NULL
    );
}

function ssl_read_cb($bev, $ctx)
{
    $body = 'hello world';
    $msg = sprintf(
        "HTTP/1.1 200 OK\r\n".
        "Content-Type: text/html; charset=utf-8\r\n".
        "Content-Length: %d\r\n".
        "Connection: Close\r\n".
        "\r\n". $body,
       strlen($body)
    );

    $buf = new EventBuffer();
    $buf->add($msg);

    $bev->input;
    $bev->writeBuffer($buf);
    $bev->free();
}
```
ブランチの最終更新日時を一覧にする git branch-activity 書いた

## 概要

どのブランチが新しくてどれが古いのか分からなくなることが多々あるので分かるようにするやつを書いた。

![git branch-activity.png](https://qiita-image-store.s3.amazonaws.com/0/735/5128248f-bb5e-9825-fc1a-ab87c362f51d.png)

```
usage: git branch-activity [-r | -a] [-R] [--no-color]
```

`git branch-activity` でローカルブランチ名と更新日時を新しい順に表示する。リモートブランチを表示するなら `-r` オプションをつける。ローカルとリモート両方表示するなら `-a`。ようするに `git branch` のオプションと同じ。

現在のブランチは緑、リモートブランチは赤、その他のローカルブランチは白で表示する。これも `git branch` に合わせてある。

## インストール

```bash
curl -o /usr/local/bin/git-branch-activity https://gist.githubusercontent.com/uasi/ec9978d793df35184b33/raw/git-branch-activity.sh
chmod +x /usr/local/bin/git-branch-activity
```

## コード

```bash:git-branch-activity.sh
#!/bin/bash

USAGE="\
usage: git branch-activity [-r | -a] [-R] [--no-color]

    -r, --remotes  List remote-tracking branches
    -a, --all      List both remote-tracking and local branches
    -R, --reverse  Reverse list order
    --no-color     Don't use colored output"

GIT_BRANCH_OPT=

print_branches() {
    git branch $GIT_BRANCH_OPT | perl -lne 'print $1 if /^[ *] ?(\S+)/'
}

decorate_branches() {
    local use_color=$1
    local format

    if [[ -n "$use_color" ]]; then
        format="format:\e[34m[%ai]\e[m \e[33m%h\e[m" # blue, yellow
    else
        format="format:[%ai] %h"
    fi

    local current_branch=$(git symbolic-ref -q --short HEAD)

    while read -r br; do
        printf "$(git log --date=iso8601 -n 1 --pretty="$format" "$br") "
        if [[ -n "$use_color" ]]; then
            print_colored_branch "$br" "$current_branch"
        else
            echo "$br"
        fi
    done
}

print_colored_branch() {
    local branch=$1
    local current=$2

    local red="\e[31m%s\e[m"
    local green="\e[32m%s\e[m"
    local format="%s"

    case "$GIT_BRANCH_OPT" in
        -a)
            if [[ "$branch" = remotes/* ]]; then
                format=$red
            elif [[ "$branch" = "$current" ]]; then
                format=$green
            fi
            ;;
        -r)
            format=$red
            ;;
        *)
            if [[ "$branch" = "$current" ]]; then
                format=$green
            fi
            ;;
    esac

    printf "$format\n" "$branch"
}

main() {
    local sort_opt=-r
    local use_color

    if [[ -t 1 ]]; then
        use_color=1
    fi

    while [[ $# > 0 ]]; do
        case "$1" in
            -a|--all    ) GIT_BRANCH_OPT=-a ;;
            -r|--remotes) GIT_BRANCH_OPT=-r ;;
            -R|--reverse) sort_opt=         ;;
            --no-color  ) use_color=        ;;
            -h          )
                echo "$USAGE"
                exit
        esac
        shift
    done

   print_branches \
       | decorate_branches "$use_color" \
       | sort $sort_opt
}

main "$@"
```
CakePHPのテストでモデルやコンポーネント以外をモックにする

コントローラーのテストで、コントローラーのメソッドや、モデル、コンポーネントをモックにするには、```generate()```を使えば良い([Cookbook 2.x - テスト - テストアクションによるモックの使用](http://book.cakephp.org/2.0/ja/development/testing.html#id24))ですが、別のクラスのメソッドとかを呼んでいるのをモックにするには、以下のようにします。

#staticメソッドの場合#

コントローラークラスのプロパティにクラス名を書いておき、staticメソッドを呼んでいるところで```call_user_func()```を使うようにします。
以下はCakeResqueをモックにする例。

```php:HogeController.php
public $CakeResque = 'CakeResque';

public function foo() {
    //CakeResque::enqueue('default', 'PostsShell', array('check', $postId));
    // ↑のかわりに↓のように書く
    call_user_func(array($this->CakeResque, 'enqueue'), 'default', 'PostsShell', array('check', $postId));
```

```php:HogeControllerTest.php
public function testFoo() {
    $Hoge = $this->generate('Hoge');
    $Hoge->CakeResque = $this->getMock('CakeResque');
    $Hoge->CakeResque->staticExpects($this->once())
        ->method('enqueue');
```

#staticでないメソッドの場合#
コントローラークラスのプロパティにオブジェクトを持つようにしておいて、それをMockにします。
以下はCakeEmailをモックにする例。

```php:HogeController.php
public $CakeEmail = null;

public function foo() {
    // @codeCoverageIgnoreStart
    // ↑これを書くとコードカバレッジの計算をするときに無視してくれる
    if (!$this->CakeEmail) {
        $this->CakeEmail = new CakeEmail();
    }
    // @codeCoverageIgnoreEnd
    $this->CakeEmail->to('test@example.com');
    if ($this->CakeEmail->send()) {
        // メール送信成功
        return $this->redirect('/');
    }
```

```php:HogeControllerTest.php
public function testFoo() {
    $Hoge = $this->generate('Hoge');
    $Hoge->CakeEmail = $this->getMock('CakeEmail', array('to', 'send'));
    $Hoge->CakeEmail->expects($this->once())
        ->method('to')
        ->with('test@example.com');
    $Hoge->CakeEmail->expects($this->once())
        ->method('send')
        ->will($this->returnValue(true));
```

ちょっと無理やり感ある気がするけど、そんなもんかな…。
1ディレクトリに大量のファイルを入れたときのパフォーマンスのお話：メモ

動画をブラウザからアップロードするシステムを作ろうと思ったとき、ある疑問が浮かびました。
１フォルダにいくつまでファイルを入れられるのだろう？
いくつ以上のファイルをぶっこむと、パフォーマンスが落ちるのだろう？

それに対する回答を見つけました

参考サイトはここです。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1424766974
http://q.hatena.ne.jp/1157692616

答えとしては、
今のコンピュータでは１ディレクトリに入れられるファイル数の上限はないが、
1000 ~ 1500 ファイル以上を入れるとパフォーマンスが悪くなる
とのことでした。

どのくらい悪くなるのは、あんまりわかりません。
とりあえず、それ以下になるように分散させて管理するのがよさそうです。

以上、簡単なメモでした。
Naoを純正ケースに入れる時の注意点

Naoを純正ケースに入れる時、慣れていないと意外と戸惑ってしまいます。何回か試してみて、コツをつかんできたので、皆様との共有のために記事を書いてみました。

純正ケースです。

![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/64389/294cfa03-4cae-e445-56fa-685f211ddfdf.jpeg)

開けてみると空っぽですが、まず最初に発泡スチロールのケースにNaoを入れて、それを純正ケースに入れる形となります。

![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/64389/415eb2aa-9b41-06eb-fd45-9757bd27010b.jpeg)
![004.jpg](https://qiita-image-store.s3.amazonaws.com/0/64389/0bd35f7c-48bd-3e9e-0ba3-7ab178d620cc.jpeg)

発泡スチロールにNaoを入れるとこうなります。

![005.jpg](https://qiita-image-store.s3.amazonaws.com/0/64389/423e1eb9-526a-d361-622f-c6d8ba8bed12.jpeg)

以下の点を意識しながら入れていくとやりやすいです。

　・最初に足の裏、次に頭、そして肩から腕の順番がやりやすいです
　・Naoを入れた後、全てが収まっているかを力の加減を見ながら上から押してください（ここで力強くNaoを押しすぎると破損の原因になるので注意）
　・腕の位置は写真の黄色い矢印のようしてください。この形にしないと発泡スチロールの蓋が閉まりません。（もし、無理に発泡スチロールの蓋を閉めると指が破損する原因となります）

![005a.png](https://qiita-image-store.s3.amazonaws.com/0/64389/80c6eef6-1202-6eed-4d5a-3e0e66b196b0.png)

発泡スチロールに入れた後、純正ケースに収納します。ケースの底をみると隅に突起があるので、その突起と突起の間に発泡スチロールを設置します。（写真の黄色のように入れてください）

![003a.jpg](https://qiita-image-store.s3.amazonaws.com/0/64389/e374dc77-45a9-6d26-2ea8-9c8e861634d5.jpeg)

この入れ方をすると、無事純正ケースの蓋を閉めることができます。正しい入れ方をしないと、蓋を閉めようとしても閉まりません。ここで力任せに閉めてしまうとNaoの破損の原因となります。

最後に。
Naoを稼働させた後に収納しようとすると、指が突っ張ったまま電源が切れているケースがあります。この場合は、電源を切る前にChoregrapheでスリープ状態にして、そこからNaoの電源を切ると指が緩んで電源OFFとなります。

指を突っ張ったまま電源を切り、ケースに収納させると指の破損の原因となりますので、ご注意を。
Choregraphe以外のツール

はじめまして、ロボットスタートの中の人のあさひと申します。
色々言語を噛じっては挫折してるダメな人です(^_^;)

HTMLなら何とか読めるかなぁくらいな感じでして、そんな自分がQiitaに書くのは心苦しかたったりしています…。

さて、そんなダメな人ですが、NAOやPepperをロボットスタートにJOINしてから少しいじるようになり、多少はChoregrapheに抵抗はなくなってきましたが、色々覗いてみるとやっぱり「あぁ、Pythonだなぁ」なんて思ってしまうのはナイショです。

なので、ROSなんかは夢のまた夢です…。

そんな中、<a href="http://isana.net/">イサナドットネット</a>さんから簡単にPepperを動かせるツールが発表されました。

Citrus Rams
http://isana.net/products/citrus/

記事を見てみると、Choregrapheより一段簡単みたいですね。あぁ、使ってみたい。

そして、もう一つ気になっているのがありまして。

PEPPERブロック
http://qiita.com/haiattoC/items/bbe5bf89c1beef44d6e8
http://review.robotstart.co.jp/archives/574
（すいません、ちょっと宣伝ですw）

haiattoCさんが発表したものなのですが、MITメディアラボが作成してる「<a href="https://scratch.mit.edu/">Scratch（スクラッチ）</a>」にインスパイアされている感じです。

Scratchは以前少し触ったことがあるのですが、よく出来てるなと関心しました。さすがMIT。

出来ない人からすると、エラーが動かないのが嫌なんです。
で、その対応が分からずにハマってしまうことなんです。
エンジニアの方は当たり前と思うことなんですよね…。

ということで、裾野が広がるこういったツールが増えてくれたら、非エンジニアとしては嬉しいなと思っているわけです。
Haskell hspec で状態を引き回したい


hspec で `it` 関数間で状態を引き回したいので、どのようにすればよいか検証してみました。現在直面している問題は Yesod.Test の `yit` 関数間で Cookie に含まれているセッションを引き回したい、というものなのですが、問題を簡単にするために、System.Random とファイル IO を用いて擬似的にセッションを表現します。

hspec に関する基本的な使い方は以下を参照してください。

[Haskell hspec 入門 - Qiita](http://qiita.com/satosystems/items/4a7b6cc007f885a6de90)

# 検証コード

```Session.hs
import System.Random
import Test.Hspec

-- | セッションが保持されるファイル名。
path :: String
path = "Session.txt"

-- | テストで使用するテンポラリファイル名。
tmp :: String
tmp = "Session.tmp"

-- | ランダムな値を生成して 'path' に保持する。
writeRandom :: IO String
writeRandom = do
  gen <- newStdGen
  let (value, _) = random gen 
      str = show (value::Int)
  writeFile path str 
  return str 

-- | 'path' から値を読み出す。
readRandom :: IO String
readRandom = readFile path >>= return

-- | 'writeRandom' と 'readRandom' の仕様。
spec :: Spec
spec = do
  describe "writeRandom" $ do
    it "normal case" $
      writeRandom >>= (\s -> saveSession s >> return s) >>= (`shouldSatisfy` (/= ""))
  describe "readRandom" $ do
    it "normal case" $ do
      actual <- readRandom
      expected <- loadSession
      actual `shouldBe` expected

-- | 'spec' の補助関数。
-- セッションをファイルに保持する。
saveSession :: String -> IO ()
saveSession s = writeFile tmp s

-- | 'spec' の補助関数。
-- ファイルからセッションを読み出す。
loadSession :: IO (String)
loadSession = readFile tmp >>= return

main :: IO ()
main = hspec spec
```

実行すると、期待通りに動作します。

```bash
$ runhaskell Session.hs

writeRandom
  normal case
readRandom
  normal case

Finished in 0.0056 seconds
2 examples, 0 failures
```

`it` 間で状態を引き回すために `writeFile`、`readFile` でファイルに状態を保存／復元していますが、システムの提供するテンポラリファイルに保持したほうがよいでしょう。

# まとめ

hspec で状態を持つモジュールの仕様を書き下す、真の方法があるような気がしているのですが、見つけられていません。Web に限定すれば Test.Hspec.WebDriver の `session` や `sessionWith` を使えば良いような気がしますが、Yesod.Test で独自に定義されている `ydescribe` や `yit` と相性が悪いような気がします。
CocoaPodsのバージョンアップの方法


CocoaPodsのバージョンを更新する方法です。

#アップデート方法

### 通常

```bash
$ [sudo] gem update cocoapods
```

### うまく行かない時

```bash
 $ [sudo] gem uninstall cocoapods
 $ [sudo] gem install cocoapods
```

# アップデート後にやったほうがいいこと

```bash
$ pod setup
```

# エラーが出た場合

原因として考えられるものを幾つかあげておきます。

## 古いバージョンのCocoaPodsが壊れている

古いバージョンのCocoaPodsを消します。

```bash
$ sudo gem clean cocoapods
```

## CocoaPodsの設定ファイルが壊れている

設定ファイルを削除し、再設定します。

```bash
$ sudo rm -fr ~/Library/Caches/CocoaPods/
$ sudo rm -fr ~/.cocoapods/repos/master/
$ pod setup
```


#CocoaPodsを使っているプロジェクト側ですること

1.プロジェクトのディレクトリに移動する

2.Podsディレクトリを削除

```bash
$ sudo rm -fr Pods/
```

3.Podsを更新

```bash
$ pod update
```
ShinobiLayer: Local Load BalancerでHTTPSを利用する方法

2016/4/14更新
暗号化スイーツとして以下が選択できるようになりました！

```
- RC4-MD5 (S), RC4-SHA (S)
- DES-CBC-SHA (S+), DES-CBC3-SHA (S)
- AES128-SHA (S), AES256-SHA (S)
- AES128-SHA256 (S+), AES256-SHA256 (S+)
- EXP-RC4-MD5 (S), EXP-DES-CBC-SHA (S)
- ECDHE-RSA-AES128-SHA (E+), ECDHE-RSA-AES256-SHA (E+), ECDHE-RSA-AES128-SHA256 (E+), ECDHE-RSA-AES256-SHA384 (E+), ECDHE-RSA-AES128-GCM-SHA256 (E+), ECDHE-RSA-AES256-GCM-SHA384 (E+)
```


#はじめに

Local Load Balancer経由でHTTPS通信をする際には2つ方法があります。両者の簡単な紹介の後、SSL Offloadの構成方法について説明します。以下の記事も併せて参考にして下さい。
「Local Load Balancer使用時にクライアントの送信元IPを取得する方法(HTTP編)　http://qiita.com/testnin2/items/037e1337a1d9b5f13231 」


# Service Groupとして**TCP**を利用する方法

この場合、下図のようにEnd to Endで暗号化がされます。このHTTPSセッションの暗号化・復号化を行うのは末端のユーザーであり、末端のWebサーバーです。

![LLB_HTTPS01_B.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/4bd15f62-575b-26dd-07b0-fa79a92af99e.jpeg)


![PORTAL_NOSSL_OFFLOAD.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/6f70fd2f-28d9-bf3e-7946-017c4e6951bc.jpeg)


利点

* Local Load Balancerの安いモデルで割り振りが可能。**（with SSL offloadオプションを購入していないLoad Balancerの場合、構成画面でSSL Offloadというタブが出てこないことに注意）**

欠点

* 末端のWebサーバーに暗号化・復号化の負荷がかかる。
* 全ての末端のサーバーにてSSL設定をする必要がある。
* End to EndでSSLの暗号化されているため、単なる通過点であるLocal Load Balancerではヘッダの中身も見れないし修正もできない。そのため、HTTPヘッダ情報（X-Forwarded-For）を埋め込めないので、クライアント側のIP（この図では203.xxx.xxx.xxx）の情報をWebサーバーに渡すことができない。


まぁ、この内容から分かるように、**とりあえず動くようにする**というのが目的であり、あまり適切な使い方ではないと思います。

# Service Groupとして**HTTPS**を利用し、SSLをOffloadする方法

この場合、下図のようにLocal Load BalancerにてHTTPSセッションの暗号化・復号化が行われます。

![LLB_HTTPS02_B.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/0f1c5278-a875-432c-b232-484aee54edfc.jpeg)


利点

* SSLの暗号化・復号化はLocal Load Balancerが実施するため、末端のWebサーバーにSSLの負荷がかからない。
* 末端のサーバーにてSSL設定をする必要がない。
* Local Load Balancerで復号化するため、HTTPヘッダ情報（X-Forwarded-For）を編集できる。そのため、クライアント側のIP（この図では203.xxx.xxx.xxx）の情報をWebサーバーは取得することが可能になる。

欠点

* SSL OffloadオプションありのLocal Load Balancerは、「なし」よりも高価

# SSL-Offload設定方法概略

以下に簡単な手順を示します。流れさえ分かっていれば、あまり悩むところはないと思います。

1. SSL-Offload付きのLocal Load Balancerを購入する。

2. Local Load Balancerの構成画面にて、HTTPSのService Groupを作成する。Local Load Balancerと割り振り先Webサーバーの間は暗号化をしないので、今回は80番ポートに接続する。
![PORTAL_SSL_OFFLOAD01.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/bdb710d9-1b75-af39-31c7-cdf56239df5f.jpeg)

3. SSLの証明書を購入もしくはimportする。Customer Portalにて、Security -> SSL -> Certificatesからimportが可能です。オレオレ証明書でも動くので、私はよくこれで試しています。
![PORTAL_SSL_OFFLOAD03.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/b435b3dd-dcbf-af2f-4f96-13d7840b4c37.jpeg)

4. Local Load Balancerの構成画面のSSL Offloadの画面にて、先ほどimportした証明書を選択する。
![PORTAL_SSL_OFFLOAD02_修正2.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/67f05e4f-5fcf-4e8b-0edd-b150bae85cf5.jpeg)
ちなみに、Step2のHTTPSというService Groupを作っていない場合は、以下のようなエラーが出力される。
![PORTAL_SSL_ERROR.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/14343602-516a-7681-669f-f5ad0c0be167.jpeg)

これにて設定完了です！あとはX-Forwarded-Forのログがでるような構成を、各Webサーバー端末で実施しておきます。**X-Forwarded-For**については以下の記事を参考にして、webサーバーに設定しておいてください。
「Local Load Balancer使用時にクライアントの送信元IPを取得する方法(HTTP編)　http://qiita.com/testnin2/items/037e1337a1d9b5f13231 」
同僚にNode.jsをいじらせるために作った手順メモ（CentOS6.5）

## node.js 環境設定


タイトル通りのメモがあったのでし投稿。

node.jsは頻繁にバージョンが変わる為、バージョン管理ツールを使用しインストールをするのがよい。
今回はnvmを使用するがnodebrew等他にもツールは存在する。

# 導入準備
##  依存モジュールのインストール
```　　
  $ yum -y install openssl-devel
  $ yum -y install gcc-c++
```

##  バージョン管理ツール導入

nvmの gitリポジトリをcloneする

```
  $ cd /usr/local/
  $ git clone git://github.com/creationix/nvm.git
```


.bashrc に以下を記載

```
  $ alias shasum=sha1sum　#centOSにはnvmが使っているshasumがないのでエイリアスを設定する
  $ ./usr/local/nvm/nvm.sh # ログイン時もnvmが使えるようにbashの読み込み設定
  $ bash #bashrcを読み込ませる
```

# node.jsのインストール  
```
  $ nvm install v0.10.32 # node.jsのインストール
  $ nvm alias default v0.10.32 # defaultに設定
  $ nvm ls # 確認
```

## 確認  
```
  $ bash # bashrcを読み込ませる  
  $ node -v
```


## バージョンを変更する場合 
```
  $ nvm install v0.10.25 # 目的のバージョンのnode.jsをインストール
  $ nvm use v0.10.25 # バージョンを変更
  $ nvm alias default v0.10.25 # 使い続けるならdefaultも変更してやる
```

# 参考サイト

**参考にしていいサイト**

最新バージョンの確認用
node.js : http://nodejs.org/

**参考にしちゃいけないサイト**

日本語マニュアルだけちょっとは読んでおくとよいけど古いから最高にしちゃダメ
node.js 日本語コミュニティ : http://nodejs.jp/ 


後は適当につかってね
java7なscalaでbase64

StringをBase64に

```scala
scala> val base64 = javax.xml.bind.DatatypeConverter.printBase64Binary("scala de base64".getBytes("UTF-8"))
base64: String = c2NhbGEgZGUgYmFzZTY0

scala> new String(javax.xml.bind.DatatypeConverter.parseBase64Binary(base64), "UTF-8")
res9: String = scala de base64
```

バイナリファイルをbase64に

```scala
scala> import java.nio.file.{Files, Paths}
import java.nio.file.{Files, Paths}

scala> val byteArray: Array[Byte] = Files.readAllBytes(Paths.get("test.png"))
byteArray: Array[Byte] = Array(-199, 10...

scala> val base64 = javax.xml.bind.DatatypeConverter.printBase64Binary(byteArray)
base64: String = iVBO....
```

## 結局こっちにしたの巻
```scala
import org.apache.commons.codec.binary.Base64._
encodeBase64String("hoge".getBytes("UTF-8"))
```
Macでlocalhost設定


# Apache を自動で起動させるようにする
Yosemiteにははじめからインストールされていますが、これを自動的に起動させるために、ターミナルで以下のコマンドを入力します。
``` $ sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist
```
手動で（再）起動させる時は、以下のコマンドを入力します。
``` $ sudo apachectl restart
```
このコマンドは、各種ファイルを編集した際にApacheに反映されているかを確認するためによく使います。

Apacheが起動しているかどうかチェック
http://localhost/ にアクセスして、「It works!」が出ればOK。

# httpd.conf編集
Apacheの起動が確認できたら、次はhttpd.confを編集します。
ここでPHPやバーチャルホスト等を使うための設定をして行きます。

##ファイルの場所

/etc/apache2/httpd.conf

## 変更箇所

103、160、166、168、169行目のコメントアウトを外す

```
#LoadModule include_module libexec/apache2/mod_include.so
#LoadModule vhost_alias_module libexec/apache2/mod_vhost_alias.so
#LoadModule userdir_module libexec/apache2/mod_userdir.so
#LoadModule rewrite_module libexec/apache2/mod_rewrite.so
#LoadModule php5_module libexec/apache2/libphp5.so

↓
LoadModule include_module libexec/apache2/mod_include.so
LoadModule vhost_alias_module libexec/apache2/mod_vhost_alias.so
LoadModule userdir_module libexec/apache2/mod_userdir.so
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
LoadModule php5_module libexec/apache2/libphp5.so
```

221、222行目　Directoryの内容を編集

```
AllowOverride none
Require all denied
↓
AllowOverride all
Require all granted
```

250行目、OptionsにIndexes、Includesを追加

```
Options FollowSymLinks Multiviews
↓
Options FollowSymLinks Multiviews Indexes Includes
```

430、431行目　コメントアウトを外してSSIを有効に、さらに.htmlも有効にする

```
#AddType text/html .shtml
#AddOutputFilter INCLUDES .shtml
↓
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml .html
```

493、499行目のコメントアウトを外す

```
#Include /private/etc/apache2/extra/httpd-userdir.conf
#Include /private/etc/apache2/extra/httpd-vhosts.conf
↓
Include /private/etc/apache2/extra/httpd-userdir.conf
Include /private/etc/apache2/extra/httpd-vhosts.conf
```


# httpd-userdir.conf 編集
## ファイルの場所

/etc/apache2/extra/httpd-userdir.conf

## 変更箇所

16行目　コメントアウトを外す

```
#Include /private/etc/apache2/users/*.conf
↓
Include /private/etc/apache2/users/*.conf
```

#ユーザーのホームにSitesフォルダを作成する
ユーザーのホームにSites（サイト）フォルダがない場合、以下のコマンドを入力します。

```
$ mkdir ~/Sites
```

#{username}.conf 作成・編集

## 作成する場所

```
/etc/apache2/users/{username}.conf

```

## {username}.conf 作成

以下のコマンドを入力して、{username}.conf を作成します。

```
$ sudo vim /etc/apache2/users/{username}.conf
```

## {username}.conf 編集

以下のように書き込みます。
{username} 以外はコピペしても良いかと思います。

```
<Directory "/Users/{username}/Sites">
   AddType text/html .shtml .html
   AddHandler server-parsed .shtml .html
   Options Indexes MultiViews FollowSymlinks Includes
   AllowOverride all
   Require all granted
</Directory>
```

AddTypeとAddHandler、それとOptionsのIncludesはSSIを使うための記述なので、必要なければトルツメでも構いません。


# httpd-vhosts.conf 編集

## ファイルの場所

```
/etc/apache2/extra/httpd-vhosts.conf
```

## 編集内容
```
<VirtualHost *:80>
    DocumentRoot "/Users/{username}/Sites/{yourdocs}"
    ServerName {yourservername}
    <Directory "/Users/{username}/Sites/{yourdocs}">
        Require all granted
        DirectoryIndex index.html
        Options Includes
    </Directory>
</VirtualHost>
```

#　最後に
Apacheを再起動して確認します。

```
$ sudo apachectl restart
```
各設定が反映させているか確認できればおしまい。

http://locolhost/~{username}でアクセスできればOK
高帯域な SSD ストライピングストレージを作る(試み)


漢なら SSD 並べて高帯域な SSD ストレージで 16K RAW 動画編集したいですね!

![ssd.JPG](https://qiita-image-store.s3.amazonaws.com/0/36275/e560eb67-03cf-037e-9a99-a85019125532.jpeg "ssd.JPG")

![hdparm.JPG](https://qiita-image-store.s3.amazonaws.com/0/36275/5d452285-3af1-ba38-775c-4c97793730ee.jpeg "hdparm.JPG")



HBA + SSD x 8 でストレージを組んでみましょう.

## ハードウェア&OS構成

* HBA カード(8 port).
* SSD x 8(500MB/s ほどでる 256GB x 8 = 総計 2TB) 
* SandyBridge 世代マザー(PCI-Gen2) + Core i7-2600S + 16GB memory 
* CentOS 6.6

(2015 年 4 月時点で 8 port HBA + 256GB SSD x 8 で総計およそ 14 万円)

最近の Intel/AMD のマザーボードでは SATA のポートがたくさんありますが, DMI(ノースブリッジ?)を経由するので実は最大で 1GB/s くらいしかでません.
(Xeon-D ではオンボード SATA でも性能でるかもしれません. Skylake でも DMI 帯域は二倍アップにとどまるので, 2GB/s が限界です)

そこで HBA カードを PCI-ex に刺して使います.

今回は LSI SAS 9207-i8 を使いました.
HW 的には Gen3 世代では 4GB/s まで出るのが知られています(http://www.thessdreview.com/our-reviews/sata-3/lsi-sas-9207-8i-pcie-3-0-host-bus-adapter-quick-preview/3/)

### HBA ファームウェアダウングレード

LSI HBA には P20 ファームウェア/BIOS が入っていますが, これは **buggy** であることが知られています. 実際, Linux では I/O error が発生するのを経験しました. そこで安定と言われている P19 にダウングレードしておきましょう. 
FreeDOS のツールを使わないとダウングレードできないので注意しましょう(Linux から操作するツールではダウングレードはできない)

## セットアップ

ディスクのパーティションを作成します. 
SSD なので, fdisk に -c -u を付けて, 4K 境界に領域を作るようにしておきます(そうしないと読み書き性能が半分くらいに落ちます).

```
# fdisk -c -u /dev/sdX
```

とりあえず software raid で RAID-0 構成を組んでみます.

```
$ mdadm --create --verbose /dev/md0 --level=stripe --raid-devices=8 /dev/sda1 /dev/sdb1 … /dev/sdh1
```

## 計測

hdparm かけてみます.


```
# hdparm -t /dev/md0 

/dev/md0:
 Timing buffered disk reads: 5944 MB in  3.00 seconds = 1980.52 MB/sec
```

Cool! 

でも理論上 3.2GB/s くらいでるはずですが, 2GB/s でした… やはり PCI-Gen2 世代だからでしょうか. とりあえずセットアップ進めます.

XFS でフォーマットしてマウントします.

```
# mkfs.xfs /dev/md0
# mkdir /mnt/md
# mount /dev/md0 /mnt/md

# df -h
…
/dev/md0              1.9T   34M  1.9T   1% /mnt/md
```

Cool! 2TB 見えました.

dd でテストしてみます.

書いてみます.

```
$ dd if=/dev/zero of=16GB bs=1GB count=16
16+0 records in
16+0 records out
16000000000 bytes (16 GB) copied, 8.4435 s, 1.9 GB/s
```

Super cool! 16GB が 8 秒ほど. これは快感ですね.

読んでみます.

```
$ dd if=16GB of=/dev/null bs=1GB count=16
16+0 records in
16+0 records out
16000000000 bytes (16 GB) copied, 4.93369 s, 3.2 GB/s
```

むむ! read は理論限界の 3.2GB/s でました! 素晴らしい. でもメモリにキャッシュされているとかでしょうかね.

### 並列で書き込んでみる.

64 GB を 2 プロセス同時書き込みで試してみます.

```
$ dd if=/dev/zero of=64GB.1 bs=1GB count=64 &
$ dd if=/dev/zero of=64GB.2 bs=1GB count=64 &

64+0 records in
64+0 records out
64000000000 bytes (64 GB) copied, 48.136 s, 1.3 GB/s
64+0 records in
64+0 records out
64000000000 bytes (64 GB) copied, 49.0994 s, 1.3 GB/s
```

2.6 GB/s にまで上がりました.

 
64GB x 2 を読み込んでみます.

```
$ dd if=64GB.1 of=/dev/null bs=1GB count=64 &
$ dd if=64GB.2 of=/dev/null bs=1GB count=64 &

64+0 records in
64+0 records out
64000000000 bytes (64 GB) copied, 52.8069 s, 1.2 GB/s
64+0 records in
64+0 records out
64000000000 bytes (64 GB) copied, 53.3111 s, 1.2 GB/s
```

2.4 GB/s. メモリにキャッシュされない実性能としてはこんなところでしょうか.


## TODO

* Gen3 世代マザーで試す
  * 理論上 4GB/s くらいでるはず
* InfiniBand と繋いで, ネットワークで GPU 動画処理ワークステーションにデータを飛ばす
* Xeon-D で検証したい
* GlusterFS striping or オレオレ striping を試す.
* スレッド書き込みとかすれば理論限界(3.2GB/s)狙えるかも.
「Poltergeistでのfeatureテストが結構な頻度で止まっちゃうんです…（＞＜）」への臨時対応

featureテストにはPoltergeistが便利と聞きつけたので導入してみたものの、かなりの頻度でだんまり（Timeoutまで返ってこない）になってしまうことがあって、これは厳しいなと思っていました。止まる処理が決まっているわけではなく、マチマチで、通ったり通らなかったりしています。

どうもよく引っかかるのがAjaxの処理をしている画面の気がしたので、思い切ってテスト中はAjax処理をOFFにしてみました（テストに関係ない所なのでOFFにできて良かった）

そうしたらかなり改善しました。そういうことなのか。

https://github.com/teampoltergeist/poltergeist/issues/375
こちらとかで解消できるかとやってみたのですが、効果が見られませんでした。
Aura.Framework_Project で Twig を使う

Aura で果たしてそもそも Framework_Project がどれくらい使われてるのか知らないけど、この Aura.Framework_Project ってのは、まあ要するに、Web_Kernel と Cli_Kernel を使った Project_Kernel が Router 設定したり Dispatcher したりしてとりあえずアプリが動きます、っていう Project のひな形を作ってくれるやつです。

* はじめに、に書いてある [Aura for PHP : はじめに](http://auraphp.com/framework/2.x/ja/)
* [auraphp/Aura.Framework_Project - GitHub](https://github.com/auraphp/Aura.Framework_Project)

はじめに、の章で Framework Project 使ってるからこれが Aura 的なスタンダードなのかなーと思って進めると、以後のサンプルでは一切出てきません (死

ま、ともかくひな形ができちゃえばあとはわりと簡単に Hello Wordl! まで動かすことはできるんですが、少しずつ色々変更したくなってきます。

## てことで Twig を使う

サンプルとかではマイクロフレームワークを使う系の話がよくでてくるけど、文字列で HTML 組み立てていくのはさすがに使いやすそうにない感じなのでとりあえず View は おなじみの [Twig](http://twig.sensiolabs.org/) を使いたい気持ちになるよね、ということでそれを組み込んでみます。

まずは composer でインストールしておきます。

```bash
$ composer require "twig/twig:~1.0"
```

## DI で Twig を設定する

DI の設定は `config/Common.php` あたりでします。

```php
<?php

namespace Aura\Framework_Project\_Config;

use Aura\Di\Config;
use Aura\Di\Container;

class Common extends Config
{
    public function define(Container $di)
    {
        ...

        $di->set('twig', $di->lazyNew('Twig_Environment', [
            'loader' => $di->lazyNew('Twig_Loader_Filesystem', [
                'paths' => dirname(__DIR__) . '/templates',
            ]),
            'options' => [
                'cache' => dirname(__DIR__) . '/tmp/cache/templates',
            ]
        ]));

        ...
    }
    
    ...
}
```

プロジェクトのルートディレクトリを取るのは本当は `$di->get('project')->getPath()` とかが良いんでしょうか。


## 使う

だいたいこんなかんじで。
ディスパッチャに設定している hello というオブジェクトは、Framework_Project で生成したひな形で最初から書いてあるやつです。`$twig->render()` の結果を `$response->content` にセットします。

```php
$dispatcher->setObject('hello', function () use ($di) {
    $response = $di->get('aura/web-kernel:response');
    $twig = $di->get('twig');
    $response->content->set(
         $twig->render('hello.html.twig', ['name' => 'aoi san!'])
    );
});
```


## まぁそんなかんじでだいたい動く

うごくんだけど、

* 毎回 `$response` と `$twig` を get してきて使うってのは面倒極まりないので、そこはとりあえずよしなにやってくれるメソッドをはやして処理
* とかやるとマイクロフレームワークスタイルでの使い方っていうよりフルスタック型の使い方に近くなるのだけど。
話題の document.execCommand('copy') を使ってコピーボタンを置く

脱 Flash を掲げている我々にとっての最大の難関はクリップボードアクセスのために ZeroClipboard などを利用して Flash を利用しないといけなかった訳ですが遂に朗報が舞い込みました。

- [Chrome 43からcutおよびcopyコマンドが使えます - Qiita](http://qiita.com/yoichiro@github/items/43ee75196bf643cde093) 

先日から徐々に話題になっていたので、実際に使おうとすると使えるのかどうかをざっと試してみたのでその内容を書いておきます。

## 各ブラウザの実装状況

前述の記事にもありますが、ざっとこんな感じ。

- Chrome: 43 で対応
- IE: 10 で対応
- Firefox: ~~設定の変更が必要 ( 設定の変更が行われていない場合はエラーを投げる~~ Firefox 41以降はデフォルトで有効になっています
- Safari: v10から対応

モダンブラウザだったら大体問題なく`document.execCommand('copy')`が使えるので、以下のような回避策はほぼ不要です

## やりたいこと

- copyボタンを設置する
- DOM構築時に `document.execCommand('copy')` が利用可能な環境の場合は `document.execCommand('copy')` でクリップボードへのコピーを行い、サポートしていない場合は事前に ZeroClipboard を仕掛けておく

## 試したこと

- ~~`document.queryCommandSupported('copy')`を叩けば上手くいくと踏んでいたら、 Chrome は https://code.google.com/p/chromium/issues/detail?id=476508 の通りでユーザーのクリックなどがない場合は `false` が返ってくるので、事前に判定できない。~~
    - ~~結局バージョンで判定するしかないという雰囲気~~
    - ~~修正のためのpatchが提出された https://codereview.chromium.org/1097693003/ これが取り込まれれば Chrome は判定可能になる~~
    - 修正がmerge済みになったので48.0.2541.0での修正が確認されています
- ~~Firefox は 設定に関わらず `document.queryCommandSupported('copy')` が `true`を返す。~~
    - ~~適当に `document.execCommand('copy')` を叩いてエラーが飛んでくるかどうかで一応判定は出来る。~~
    - デフォルトで有効になったので設定を気にすることはほぼ必要なさそう
        - なので以下のようなHackも不要

```js
# XXX: Hack for Firefox. Firefox throw error when setting disable.
if document.queryCommandSupported('copy')
  try
    document.execCommand('copy')
  catch
    useZeroClipBoard = true
```

### 所感

http://updates.html5rocks.com/2015/04/cut-and-copy-commands に

> Ahead of calling document.execCommand(), you should ensure that this API is supported using the document.queryCommandSupported() method.

と書かれてはいるものの各ブラウザの`document.queryCommandSupported('copy')`がかなり鬼門という雰囲気。（ Chrome の実装を契機にもうちょっと良しなになって欲しい気持ち）

なんか良いアイデアとかあれば教えて下さい。何か変化があれば追記します。


### メモ

- [Clipboard API](http://dev.w3.org/2006/webapi/clipops/clipops.html) は コピーとかペーストとかのクリップボードに関するアクションをユーザーが実際に行ったときにだけ利用できる
regexpをキャッシュしてくれるラッパーを作った

おそらく便利だと思っているんだけど、ちょっと調べた感じ無さそうだったので作った。

# 置き場所
コード：
https://github.com/umisama/go-regexpcache
インストール：
`go get github.com/umisama/go-regexpcache`

# やってくれること
regexpの関数をラップしていて、使ったことのある正規表現の時はキャッシュからregexpを返してくれる。コンパイル時間がかからないのですぐにかえしてくれる。
一応、オフィシャルなregexpパッケージの関数と互換な仕様になっている。

```go
import "github.com/umisama/go-regexpcache"

// 一回目なので普通にコンパイルされる
match := regexpcache.MustCompile("^[hc]at").MatchString("cat")
println(match)

// ２回以降はキャッシュからちゃっちゃと持ってくる
match = regexpcache.MustCompile("^[hc]at").MatchString("cat")
println(match)
```

# 動機
golangで文字列のバリデーションをする関数を作るみたいな事を考えた時に、正規表現を関数の中でコンパイルしていると処理時間がかかるので辛い。なので、コンパイルしたregexp.Regexpオブジェクトを、典型的にはグローバルに置くことになる。

```go
var re = regexp.MustCompile("^[hc]at")

func varidation(str string) bool {
    // regexp.Regexp object is global for avoid compile time
    return re.MatchString(str)
}
```

ところがそうするとある関数でしか使わない変数でグローバルが汚れてしまってなんとなく気になります。それに、関数の中で難の正規表現とmatchを取ってるのかのわからなくなって、見通しが悪くなっているようにも思います。
そういうわけで、go-regexpcacheを使うとこういうことができます。

```go
func varidation(str string) bool {
    // You can write regexp inside function
    return regexpcache.MustCompile("^[hc]at").MatchString(str)
}
```

たぶん便利だと思うんですが、便利だと思う方、お使いください。
WordPressプラグイン備忘録


WP案件にてリピートしそうなプラグインを書いていきます

|プラグイン名|説明|備考|
|:-------|:------|:-----|
|WP Social Bookmarking Light|様々なSNSシェアボタンを簡単に設置できる|個別記事のみも可。Pocketにも対応したらしい。
|Duplicate-post|記事の複製が簡単にできる|定番であり必須ですね|
|WP PageNavi|ページネーションが簡単に設置できる|別途styling用のプラグインを入れるとstyleも簡単に変更できちゃうそうです。・・・CSSいじりますけど。
|MW wp form|お問い合わせフォーム作成(画面遷移あり)|確認画面、送信完了後画面を作成することができる
|Contact form 7 |お問い合わせフォーム(画面遷移なし)|簡易的なお問い合わせフォームならこいつでちゃちゃっと作成
|Custom post type permalinks|カスタム投稿のパーマリンクを簡単に変更できる|さらwp_get_archive()でカスタム投稿の一覧を取得できるようになるおまけがあるようです|
|Types|カスタム投稿とカスタムフィールドの作成|さらに日本語にも対応。一石三鳥ですね
dotinstallでAngular.jsを勉強しようとしてハマったこと

#はじめに
Angular.jsの勉強をはじめました。

その学習サイトとして[dotinstall](http://dotinstall.com/ "dotinstall") を利用していますが、バージョンの差異があり、サンプルコードが動きません。なので、勉強と並行して、ここに正誤表みたいなものを作りたいと思います。
主に公式の[このページ](https://docs.angularjs.org/guide/migration#migrating-from-1-2-to-1-3 "Angular")を参考にしてます
また、自分自身も初心者なので、間違い等がございましたら、ご指摘いただけたらと思います。

なお、なぜそう動くのかは自分把握していないので誰か教えてくださいよろしくお願いします。

ちなみに、英語できるよって人は、以下のサイトも利用すればいいと思います。
[code school](https://www.codeschool.com/courses/shaping-up-with-angular-js "code school")

#バージョン
この記事の執筆開始日（2015年4月17日）のAngularJSの最新バージョンは1.3.15です。
また、dotinstallで扱われているバージョンは1.0.1です。

正誤表記事で、さらにバージョンの差異にハマらないようにご注意ください。

#\#03
htmlもjavascriptも、変更が要ります。

htmlの方は、アプリの名前を設定してます。
絶対必要なのかどうかはわかりませんが、myscript.jsのなかで指定しているので、多分必要だと思います。

```html:index.html
<!-- この一行を変える（必要ないかもだけど）
<html lang="ja" ng-app="myApp">
-->
<html lang="ja" ng-app="myApp">

```

myscript.jsの方は結構変えないといけないです。
一回モジュールとしてやらないといけないみたいです。

```javascript:myscript.js
/**
 * dotinstall

 var mainCtrl = function($scope) {
   $scope.users = [
     {"name": "taguchi", "score":52.22},
     {"name": "tanaka", "score": 38.22},
     {"name": "yamada", "score": 11.11}
   ];
 };
 */


/**
 *新しい方
 */
var myApp = angular.module('myApp', []);

  //myApp.controller('myCtrl', function($scope) {
  //amrmorik83さんからのアドバイス
  //コードを圧縮した時におかしくなることを防ぐため。
  myApp.controller('MyController', ['$scope', function($scope) {
  $scope.users = [
    {"name": "taguchi", "score":52.22},
    {"name": "tanaka", "score": 38.22},
    {"name": "yamada", "score": 11.11}
  ];
}]);

```

#\#07
4,5,6はそのままのコードで良かったです。
コントローラーのネストについてですが、#03と同様に、以下のように書く必要があります。

```javascript:myscript.js
var myApp = angular.module('myApp', []);

myApp.controller('myCtrl', ['$scope',function($scope) {
  //略
}]);

myApp.controller('userItemCtrl', ['$scope', function($scope) {
  $scope.increment = function() {
    $scope.user.score++;
  };
}]);

```

どうも、myAppのコントローラーに追加してあげる感じでいいみたいですね。
追加したものを識別しているのが、第一引数っぽい？（key,value）みたいな。

#終わりに
以上です。
最初につまずいたので、めちゃくちゃ違いがあるのかなと思いましたが、本当に基本的なことは上記に書いてある事以外なさそうです。

ですが、やはり細部は結構違うっぽいので、流れをつかむための膨大な過去バージョンのサンプルプログラムと公式ドキュメントを併用しながら、なんか色々かけていけたらと思います♪
任意のカスタム投稿タイプの記事一覧を表示させる


##表示させるには

下記タグを挿入すると月別アーカイブを表示させます。

```php:sidebar.php

<?php
wp_get_archives('type=monthly&post_type=news&show_post_count=true
?>

```

##オプション
オプションは文字列内に&で区切って指定

下記がデフォルト値

```
'type'            => 'monthly',
'post_type'       => '',
'limit'           => '',
'format'          => 'html', 
'before'          => '',
'after'           => '',
'show_post_count' => false,
'echo'            => 1,
'order'           => 'DESC'

```

###type
出力形式を指定

* monthly （初期値）
* daily
* weekly
* postbypost （投稿を公開日時の順に）
* alpha （投稿をタイトルのアルファベット順に）


###post_type
カスタム投稿のスラッグを指定

###limit
最大表示件数

###show_post_count
投稿数を表示させるか否か
（例）2015年4月(4)

###order
順番の指定


とりあえずこれくらい抑えておけばなんとなく使えるかなと・・。
詳しくはcodecで。

[テンプレートタグ/wp get archives](http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/wp_get_archives)
CakePHPでAuth認証が必要なコントローラーをテストする

CakePHP2のテストではセッションを使う処理はそのままでは動かないので、ログイン状態じゃないと見られないページなど、Authコンポーネントを使う場合はMockにしてテストします。
プロパティで認証ユーザーのデータをセットし、```authUserCallback```ファンクションを返すようにすると、```Auth->user()```や```Auth->user('name')```などが指定した値を返すようにできます。

```php:HomeControllerTest.php
private $__authUser = array(
    'id' => 1,
    'name' => 'test1',
    'role' => 'admin',
    'created' => '2015-04-17 10:37:35',
    'modified' => '2015-04-17 10:37:35'
);

public function testIndex() {
    $Home = $this->generate('Home', array(
        'components' => array(
            'Auth' => array('user'),
        )
    ));
    $Home->Auth->staticExpects($this->any())
        ->method('user')
        ->will($this->returnCallback(array($this, 'authUserCallback')));
    $this->testAction('/');
}

public function authUserCallback($param) {
    if (empty($param)) {
        return $this->__authUser;
    } else {
        return $this->__authUser[$param];
    }
}
```

参考：[Cookbook 2.x - テスト - テストアクションによるモックの使用](http://book.cakephp.org/2.0/ja/development/testing.html#id24)