OmniAICreator/Qiita-1.07M huggingface dataset:
OSX上でPacker+Chefを使ってDockerImageを作成


はじめに
=======
Docker Toolboxが公開されましたね！([参考](http://pocketstudio.jp/log3/2015/08/13/docker-1-8/))
Dockerいじる機会も増えたので，MacにInstallしてみてPackerでDockerImageを作ってみました．


目的
---
OSX上でChef Cookbookの内容のDocker ImageをPackerでビルドします．


環境
---
- OSX 10.10
- Docker Toolbox 1.8.1b
- Packer 0.8.6

作成方法
-------
基本的に，公式の[Installation on Mac OS X](http://docs.docker.com/installation/mac/)に従っています．

```sh:shell
$ docker-machine create --driver virtualbox default
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
To see how to connect Docker to this machine, run: docker-machine env default

$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM
default   *        virtualbox   Running   tcp://192.168.99.100:2376

$ docker-machine env default
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/kazutaka/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"
# Run this command to configure your shell:
# eval "$(docker-machine env default)"

$ eval "$(docker-machine env default)"

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
```

以上で，dockerのインストールは完了です．
次にpackerを使ってdocker imageを作成します．OSX上では，Docker Clientがバグのためうまく連携できないとありますが，その解決方法が[github issues](https://github.com/mitchellh/packer/issues/901)にあったため，それを利用すると無事連携することができました．

```sh:shell
$ make ~/tmp
$ export TMPDIR=~/tmp
$ packer build machine_chef.json
$ docker-machine ssh default
$ docker images
```

TMPDIRの場所を変える必要があるみたいですね！私の環境では，これで無事OSX上でdocker imageをつくるとができました！


### Reference
- [Packerを使ってChef/Puppet/AnsibleでDockerのイメージをつくる](http://deeeet.com/writing/2014/03/02/build-docker-image-by-packer/)
RaspberryPi2からBluemix IoTFサービスへのデータ送信間隔を変更する方法

#<i class="fa fa-cubes" style="font-size:1em;"></i>概要
[BluemixのRaspberryPi登録レシピ](https://developer.ibm.com/recipes/tutorials/raspberry-pi-4/)に登場する[デバイス用のsampleプログラム](https://github.com/ibm-messaging/iot-raspberrypi/releases/tag/1.0.2)はデータの送信間隔が1回/秒である。
この送信間隔を変更するには[ソースコード(iot.h)](https://github.com/ibm-messaging/iot-raspberrypi/blob/master/samples/c/iot.h)を修正してビルドする。

基本はこれ↓
https://github.com/ibm-messaging/iot-raspberrypi/tree/master/samples/c#note-for-users-who-want-to-change-the-code-compile-and-build-the-deb-file

#<i class="fa fa-cube" style="font-size:1em;"></i>前提
RaspberryPi2がBluemixのIoTFサービスに[「レシピ」](https://developer.ibm.com/recipes/tutorials/raspberry-pi-4/)を使って接続済みであること。

#<i class="fa fa-cube" style="font-size:1em;"></i>手順
作業はRaspberryPi2にログインして行う。
実行時ユーザは次の通り
$ : pi
\# : root

1. 設定ファイルの退避
`# cd /etc/iotsample-raspberrypi/`
``# cp -p device.cfg device.cfg.`date +%Y%m%d`_1``
※これで、アンインストール(dpkg -P)してもフォルダとバックアップファイルが残るので安心。

2. 必要パッケージのインストール
`# apt-get install dpkg-dev build-essential devscripts`
`# apt-get install libssl-dev`

3. ソースコード一式を入手
`$ cd ~`
`$ git clone https://github.com/ibm-messaging/iot-raspberrypi.git`

4. ソースコード修正（送信間隔を1秒から10秒に変更）
`$ cd ~/iot-raspberrypi/samples/c/`
`$ vi iot.h`
39行目
変更前）#define EVENTS_INTERVAL 1
変更後）#define EVENTS_INTERVAL 10

5. ビルド
`$ debuild -b`
署名のエラーは無視する。

6. アンインストール（古いのを）
`# dpkg -P iot`

7. インストール
`# cd /home/pi/iot-raspberrypi/samples/`
`# dpkg -i ./iot_1.0-1_armhf.deb`

8. サービスの確認
`# service iot status`
※起動している(okが表示される)こと。

9. 設定ファイル作成
`# cd /etc/iotsample-raspberrypi/`
``# cp -p device.cfg.`date +%Y%m%d`_1 device.cfg``
※6.でいったん削除されてしまうので、1.で退避したファイルで復元

10. サービスの再起動
`# service iot restart`
※起動している(okが表示される)こと。

11. 起動モードの確認
`# service iot getdeviceid`
※registerd mode で起動している(registerd modeが表示される)こと。

12. IoTFで確認
Bluemix IoTFダッシュボード→デバイス→参照→登録済みのデバイスを選択
ライブ・イベント欄にて1回/10秒の間隔でデータ受信していること。

#<i class="fa fa-cube" style="font-size:1em;"></i>環境

[Raspberry Pi 2](https://www.raspberrypi.org/products/raspberry-pi-2-model-b/)
[Bluemix IoT Foundation](https://internetofthings.ibmcloud.com/)

#<i class="fa fa-book" style="font-size:1em;"></i>参考
https://github.com/ibm-messaging/iot-raspberrypi/blob/master/samples/c/README.md
https://developer.ibm.com/recipes/tutorials/raspberry-pi-4/
Atom用Gmailチェッカー

Atom用にGmailのメールをチェックしてステータスバーに表示するパッケージを作ってみました。

[Atom.io/packages/atom-gmail-checker](https://atom.io/packages/atom-gmail-checker)

![screenshot](https://raw.githubusercontent.com/nobuhito/atom-gmail-checker/master/img/screenshot.png)


## FEATURE

よくあるGmailチェッカーと機能的にはほぼ一緒で、定期的にGmailをチェクして新しく追加されたメールの件数をステータスバーに表示し、その件数をクリックするとブラウザでGmailのサイトを表示します。

検索ワードを指定できるようにしてるいるので例えば「指定した送信者から送られてきたメール」だったり「任意のラベルが付いているメール」等任意の条件を指定できます。

## INSTALL

Atomでパッケージをインストールすると、OAuthでの設定画面が表示されます。表示に沿ってブラウザーを開いて認証後に表示されるコードをコピペしてください。
「Click here.」をクリックしても表示されてるURLをコピペして開いてもどちらでも同じURLにジャンプします。

![Auth](https://i.github-camo.com/8a9f8be91b8cf95c054e2b7ad5aefd389316db8d/68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f6e6f62756869746f2f61746f6d2d676d61696c2d636865636b65722f6d61737465722f696d672f617574682e706e67)

## SETTINGS

無事にインストールが済めばそのまま利用することが出来ますが、以下の値を変更することが出来ます。

 - Check interval: メールの着信をチェックする間隔です。デフォルトで1分になっています。
 - Check query: 検索キーワードです。デフォルトではInboxにある未読メールの件数を表示sルウ用になっています。変更する場合はGmailの検索キーワードをそのまま設定してください。
 - Preview time: 新しいメールが追加されると画面下に設定した時間でスニペットが表示されます。デフォルトでは5秒になっていますが、不要な場合は0を指定してください。

## SUMMARY

今回はGmailチェッカーを作ってみたわけですが、HTTPでAPIが準備されていればかなり簡単にステータスバーに情報を追加することが出来きました。

HTTP経由のAPIは数多くありますので、なかなか夢が広がりますな。
SAME but Different: Fast and High-Quality Gibbs Parameter Estimationを読んだ

# KDD2015 SAME but Different: Fast and High-Quality Gibbs Parameter Estimationを読んだ

## どんなもの？
- SAME (State Augmentation for Marginal Estimation)をグラフィカルモデルへ適用
- 元々精度の良い手法(SAME)を高速化できた

## 先行研究と比べると？
- LDAへの適用で、online VBと同程度に高速で、その他の手法より精度が良いことを示した

## 技術や手法のキモはどこ？
- GPUで高速化
- factored sample representation↓したSAMEを組み合わせる
- 潜在変数同士が独立(LDAとか)ならポアソン分布で一気にサンプリング
　そうでない場合は近似だと思って同じようにサンプリングする。
　この近似はVBとやっていることは同じ

## どうやって有効だと検証した？
LDAのVBやCGS実装と比較。
- 尤度の収束がVBonlineと同じくらい早い
　CGSで1000-2000 passかかっているのが20passでいい
- CGS1000pas分に到達するのにVBonlineが40sec,提案が90sec。CGS系は60-70h

## 議論はある？
- 1passでサンプルサイズを増やすと精度は上がるが速度が下がる。GPUに上手く合わせてやるとそこまで速度の低下は見られない
- サンプルサイズをpass毎に変えていく方法も考えられるが、あまり効果はなかった

## 次に読むべき論文は？
- A. Doucet, S. Godsill, and C. Robert. Marginal maximum a posteriori estimation using markov chain monte carlo. Statistics and Computing, 12:77–84, 2002.
- L. Bottou and O. Bousquet. The tradeoffs of large scale learning. In NIPS, volume 4, page 2, 2007.
- J. Canny and H. Zhao. Bidmach: Large-scale learning with zero memory allocation. In BigLearn Workshop,
NIPS, 2013.

## ref
http://dl.acm.org/citation.cfm?id=2783258.2783416
ATOM 1.0.8 で導入された line-ending-selector がクソ

（ちなみに現時点の最新版は 1.0.9）

ATOM 1.0.8 で導入された [line-ending-selector](https://atom.io/packages/line-ending-selector)。改行コードを簡単に切り替えることのできるパッケージで一見便利に見えるのだが，これがとんでもないく◯ったれ。

Linux などは違うと思うが， Windows 版では新規にファイルを開いた時の既定の改行コードが CRLF 固定になっている。しかも [EditorConfig](https://atom.io/packages/editorconfig) を無視しやがる。

改行コードが CRLF だと Windows ⇔ Linux 間を渡り歩いてる（私のような）人が困るだろうが。なにより git に怒られる。改行コードの制御は [EditorConfig](https://atom.io/packages/editorconfig) に任せれば良い。いらんことすんな！

というわけで [line-ending-selector](https://atom.io/packages/line-ending-selector) は disable にした。

## 追記

この問題については既に [issue が上がっている](https://github.com/atom/line-ending-selector/issues/5)が反応が鈍い感じ。一方 [EditorConfig](https://atom.io/packages/editorconfig) のほうは 1.2.0 がリリースされ，今回の問題に対応してくれたようだ。ブラボー！
A PCA-Based Change Detection Framework for Multidimensional Data Streamsを読んだ

# KDD2015 A PCA-Based Change Detection Framework for Multidimensional Data Streamsを読んだ
## どんなもの？
多次元データストリームの変化検知の手法を提案

## 先行研究と比べると？
- PCAを使うことを利用して分布の比較を行う
- 閾値を自動で更新していく

## 技術や手法のキモはどこ？
- PCAで次元を落とすと同時に、各次元で比較(スコアの計算)することで並列計算できるようにした
- PCA計算で得られる固有値からスコア計算ができるので計算が楽になる

## どうやって有効だと検証した？
人工データと実データで精度と実行時間で比較。計算コストも算出した。
精度
- True positive
- late detection
- false negative
- true negative

F1値とPCAでどこまで次元を削れるか、その時どのくらい時間がかかるかを示した


## ref
http://dl.acm.org/citation.cfm?id=2783359
#ifdefが多数あるプロジェクトをどうテストする？

`#ifdef` が１つの場合には、そのon/offだけで2通りのコードをテストしなくてはなりません。
`#ifdef` が２つの場合には2^2=4になります。
`#ifdef` が５つの場合には2^5=32になります。
こうなってくると
手作業でビルドして３２通りをテストするのは困難になります。

#### **`#ifdef`はモジュールのファイル構成にかかわる部分にだけになるよう減らすこと。**

```cpp
const bool DebugInfo = true;
if(DebugInfo){
//冗長な表示をするコード
}
```

を以下のように書く必要はありません。

```cpp
#ifdef DEBUG_INFO
showDebugInfo(); //冗長な表示をするコード
#endif
```

ビルド後の実行形式が大きくなってしまうことを気にしないのであれば
デバッグ専用のコードを `#ifdef` `#endif` で囲うのをやめてしまえば可読性はよくなります。

(CppUnitなどで単体テストを強化すれば、開発のメインのプログラムの中にデバッグ専用のコードを埋め込むことが減るはずです。
また、プログラムのテストが十分行われていれば、最後にデバッグ用のコードを生成しないように、不要なコードを削除するのは容易です。ですから `#ifdef` を使って、ソースコードの改変を発生させるのは、最小限に減らしましょう。
)

```cpp
#ifdef DEBUG_INFO
showDebugInfo(); //冗長な表示をするコード
#endif
```

みたいなコードが、ソースコードに何十箇所も出てくる場合には、
その部分のコードを全て有効にしていたうえで、 `showDebugInfo()` 関数の中でだけ、 `#ifdef DEBUG_INFO` を使うことです。

```cpp
void showDebugInfo(){
#ifdef DEBUG_INFO
//冗長な表示をするコードの実体
#endif
}
```

そうすれば、`DEBUG_INFO` のマクロ定数の使用する場所が減ります。

マクロ定数をC++の定数に代入しておき、
値が参照できれば十分なときには

```cpp
#ifdef マクロ定数
#endif
```

の代わりに

```cpp
if( /*C++のbooleanの定数*/ ){
}
```

を使うと、 `#define` の結果によって構文が乱されることがなくなります。

#### **効果**
　ソースコードを改変していったときに、試してみなかった `#ifdef` の組み合わせで、ソースコードがビルドできないという問題を減らすことができます。


追記
#### **`#ifdef` がOSの違いに起因する場合**
ディレクトリの有無を調べるbool型の関数を作る場合、C++ではOSの違いによってコードが異なります。そこで、よくとられる手法は、OSの違いを含みうる部分を１つのソースファイルに集めて、その範囲の中で `#ifdef` を用いることです。そして、単体テストを移植対象のOSでそれぞれ実行することです。そうすると、OSの違いが他の `#ifdef` の組み合わせを考える必要がなくなります。
2のべき乗で、テストする組み合わせが増えていくことを防止できます。

 OSの違いによるコードが存在する場合、まずBoostのライブラリに該当するものがないかを調べてみよう。
ファイルシステム
[boost::filesystem](http://www.boost.org/doc/libs/1_60_0/libs/filesystem/doc/index.htm)
ネットワーク関係
[boost::asio](http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio.html)

Boostのライブラリを使えば、OS依存性のあるコードは大幅に減らせるはずです。
Boostのライブラリは、あなたが自作するライブラリよりは格段にテストされているはずです。
Boostのライブラリを使えば、Windowsでテストしておいた結果からLinuxで動作する可能性が格段に高いと期待されます。
自作ライブラリで `#ifdef` `#else` `#endif` しているコードでは、windowsで動作させたからといってLinuxで動作するかどうかはわかりません。
　以上の理由からBoostを使うように強く推薦します。


次のような記述を見つけました。
「条件コンパイルが避けられない場合もあるが、これはプラットフォームのバリエーションに対応するときの最終手段だと考えるべきだ」（[『テスト駆動開発による組み込みプログラミング　C言語とオブジェクト指向で学ぶアジャイルな設計』](https://www.oreilly.co.jp/books/9784873116143/)p.247）

---

`#ifdef` などのようなプリプロセッサがない言語で開発できる場合には、そのような言語に移行するという手もあるだろう。
GO 言語はそのような言語の選択肢の１つだ。
PHP頻出文法チートシート

PHPの頻出文法のチートシートでも作ろうかなと。

```php
// 同じ関数を複数回使用
printf($a);printf($b);
$f=printf;$f($a);$f($b); // print/echoは言語構造なので不可

// print
print($a);
print $a;
print$a;
echo$a;
?><?=$a;

// 文字列表示
echo "hoge";
echo hoge;
?>hoge<?

// rtrim
rtrim($a);
chop($a);

// 文字列の分割
preg_split('/,/',$a);
explode(',',$a);
split(',',$a); // PHP7で削除

// 配列の文字列化
implode($a);
join($a);

// 文字列置換
str_replace($m,$r,$a);
strtr($a,[$m=>$r]);
strtr($a,$m,$r); // 1文字の場合のみ

// 正規表現置換
$a=preg_replace($p,$r,$a); // マッチしなかった場合元の文字列
$a=preg_filter($p,$r,$a); // マッチしなかった場合NULL

// 正規表現検索
preg_match($p,$a,$m);
ereg($p,$a,$m); // PHP7で削除

// 繰り返し
foreach(range(1,100)as$i)echo$i;
for($i=1;$i<101;$i++)echo$i;
for(;$i++<100;)echo$i;
while($i++<100)echo$i;

// 繰り返しを抜ける
while(++$i<20);echo$i;
while(++$i<20)?><?=$i;

// $aならfunc
if($a)func();
$a&&func();

// $aならfunc1、それ以外はfunc2
if($a){func1();}else{func2();}
$a?func1():func2();
(func.($a?1:2))();

// $a==$bならfunc
if($a==$b)func();
$a!=$b?:func();
$a!=$b||func();
$a==$b&&func();

// $i==5ならfunc
if($i==5)func();
$i==5&&func();
$i-5||func();

// $i!=5ならfunc
if($i!=5)func();
$i!=5&&func();
$i^5&&func(); // intなら"!=" == "^"

// 4の倍数だけ何もしない
if($i%4){$j++;echo$k;}
if($i%4&&$j++)echo$k;
if($i%4)$j+=print$k; // echoは返り値を受けられない
$i%4?$j+=print$k:0;

// 小文字
lcfirst($a);
$a|~*; // *はchr(223)

// 大文字
strtoupper($a);
$a&*; // *はchr(223)、こちらは1文字の場合のみ

// 切り捨て
intval($x);
floor($x);
$x|0;

// 改行
echo"\n";
echo"
";
echo~*; // *はchr(245)

// 配列を全表示
for(;$i<count($a);)echo$a[+$i++];
for(;$b=$a[+$i++];)echo$b;
for(;printf($a[+$i++]););
foreach($a as$b)echo$b;
echo implode($a);

// if-else
if($a)a();elsif($b)b();else c();
switch(1){case $a:a();break;case $b:b();break;default:c();}
$a?a():($b?b():c());
```


文法募集中。
ZigBeeの脆弱性


Black Hat 2015で発表された[ドローンが上空からIoTをハッキング！](http://csi.sproutgroup.co.jp/archives/000145.html)に関してちょっと調べてみました。

該当のペーパーはこちら[￼ZIGBEE EXPLOIT](https://www.blackhat.com/docs/us-15/materials/us-15-Zillner-ZigBee-Exploited-The-Good-The-Bad-And-The-Ugly-wp.pdf)です。

これによれば、ZigBeeの特定プロファイルにおける認証方式の仕様バグのようです。
(ZigBeeのプロファイル仕様を正しく把握できていないので、誤読があるかも）

## 内容

ZigBeeのプロファイルの内、以下の２つに関しての話題です。

- Home Automation Public Application Profile (HAPAP)
住宅オートメーション用。On/Offスイッチ、サーモスタットなどの各種センサー

- Light Link Profile (ZLL)
住宅向け照明コントロール専用(HAPAPとは独立)

これらは仕様として
「接続ごとの暗号キーを決めるシーケンスにおいて、初回のキーに決め打ちのキーを使うことが選択肢として設けられている」
ようです。

そして、センサーデバイス側の事情として「低コスト、低スペック」があり、ZigBeeネットワークに参加してくる側が、他に選択肢を持たない場合、受ける側(Trust Center)もそれに応じてしまいます。

決打ちのキーで暗号化された通信路でAESのキーを作成し、それ以降は生成したキーを使って通信をします。このため、途中から解読することは難しく、ネットワークに参加する初回のみが危ないようです。
ただ、接続後でも、ピンポイントでJammingし、センサー側をリセット状態にすることで（この辺のシーケンスは不明）、再度初期化シーケンスを行わせることが可能なようです。

さらには、セキュアなやりとりを選択するデバイスだとしても、Jammingをうまく使うことで、順番に選択肢を狭めていき、最終的にデフォルトの決打ちキーを選択させてしまうことも可能だとか。

この決打ちキーは、ZigBeeのタッチリンクにも使われているようで、同様に盗み見ることができてしまうようです。

照明On/Offならまだしも、ドアロックを乗っ取られるとかなりマズいですね。

このペーパーでは、盗み見用のハードもソフトもそろいつつあり、現実的な問題になるのも時間の問題だと警告しています。

## 対応方法
ペーパーでは、対応方法として以下をあげています。

- そもそも耐タンパにすべし
（セキュアなキーを持っていても開けたらわかるなら意味ない）

- デフォルトの決打ちキーを使うな
- キー生成シーケンスは別チャネルでやれ
- キーは定期的にローテーションしろ

だそうです。
ZigBeeの仕様として、何が Must で、何が Option なのかが把握できていないので、「できるけどやらない」、「option指定だからやらない」、「コスト的にやれない」、「仕様からはずれちゃうからやらない」などの理由の予想がつかず、正直ピンときていません。


## その他
他にも、同様に初回のキーやりとりがあぶないと、別シーケンスの提案をしているペーパーもありました。

- [これ](http://www.hindawi.com/journals/ijdsn/2013/608380/)。pdf版は[こちら](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CB0QFjAAahUKEwiSwYSw-tLHAhUMnZQKHQw_DY4&url=http%3A%2F%2Fdownloads.hindawi.com%2Fjournals%2Fijdsn%2F2013%2F608380.pdf&ei=ZRfkVdL6IIy60gSM_rTwCA&usg=AFQjCNFa7siezZ44TdlD-lRH_q5ph8dmJQ&sig2=7SKi1ZvbtfKQTG4dv64BYg&cad=rja) 



# 参考
- [TOCOS ZigBeeとは](http://tocos-wireless.com/jp/tech/ZigBee/ZigBee.html)
- [ZigBee仕様 2005/6/27](http://www3.nd.edu/~mhaenggi/ee67011/zigbee.pdf)
- [ZigBee仕様 2008/1/17](http://home.deib.polimi.it/cesana/teaching/IoT/papers/ZigBee/ZigBeeSpec.pdf)


下記はいずれもZigBee公式サイトから。

- [ZigBee Security Specification Overview](https://docs.zigbee.org/zigbee-docs/dcn/05/docs-05-3765-00-0mwg-zigbee-security-layer-technical-overview.pdf) p30
- [ZigBee Security](https://docs.zigbee.org/zigbee-docs/dcn/09-5378.pdf)

# 所感
ZigBeeのことを、あまりに知らなすぎて調べるのが難しいです。
ECCUBE3管理画面の商品マスターで「検索する」を押すとシステムエラーが発生しましたになります。

すいません。ECCUBE初心者です。
先日ECCUBE3をレンタルサーバーに導入しました。インストールも商品登録もスムーズにいきましたが、商品マスターで「検索する」ボタンを押すとシステムエラーが発生しましたという画面になり、検索できません。
どこをどう直せばいいか全く分からないので、もし分かる方がいらっしゃいましたらお教えいただけますでしょうか。

どうかお願いします。
Deviseを複数モデルで使用し、ディレクトリごとに切り分けたいときの覚書



## はじめに
複数モデルにDeviseを使用した場合にcontrollerを切り分けたかったいし、Viewもいじりたいと思ったのでその覚書


## 設定ファイルの編集

```/config/initializers/devise.rb
config.scoped_views = true
```

## UserとAdminのMVCをDeviseで作成する


* Userの作成

```
rails g devise user
```

* Adminの作成

```
rails g devise admin_user
```

Controllerの作成(userは`site`ディレクトリ以下に,adminは`manager`ディレクトリ以下に作成していきます)

* User Controllerの作成

```
rails g devise:controllers site/users
```

* Admin Controllerの作成

```
rails g devise:controller manager/admin_users
```

* User View の作成

```
rails g devise:views site/users
```

* Admin View　の作成

```
rails g devise:views manager/admin_users
```

## ルーティングの設定

```config/routes.rb
  namespace :manager do
      devise_for :admin_users, controllers: {
      sessions: 'client/admin_users/sessions',
      registrations: 'client/admin_users/registrations',
      passwords: 'client/admin_users/passwords'
    }
  end
  
    scope module: 'site' do
    devise_for :users, controllers: {
      sessions: 'site/users/sessions',
      registrations: 'site/users/registrations',
      passwords: 'site/users/passwords'
    }
  end

```
WordPress4.3で、ログイン失敗時のリダイレクトページを変更したい

乱暴な方法ですが・・・。

# WordPressを意識させたくないサイトを作りたい

BuddyPressつかっているんですけど、一般会員向けにはいかにもデフォルトですっていうログインページ見せたくないんですよねー。

# ログイン失敗時に失敗的な処理を呼び出すことができる

https://buddypress.org/support/topic/keep-users-from-wp-admin/

add_action使って、「ログイン失敗時」の処理を呼び出しています。

ところが、これだけでは（少なくとも）WordPress4.3環境下ではうまく動きませんでした。

# 深刻な問題
上記のやり方だと、ユーザIDとパスワードの欄両方が入力されていないかぎり、リダイレクト処理ができませんでした。

つまり、ユーザID、パスワードのどちらかが入っていないと
例の見せたくないデフォルトのログインページにたどり着いてしまいます。

# wp_login_failed のありか

フック　wp_login_failedはどのタイミングで実行されるのでしょうか・・・？
実態は、wp-includes/pluggable.php の、デフォルトでは６００行目あたり。

wp_authenticate　関数　内のかなり下の方

「エラーが発生し、かつユーザID、パスワードの欄がどちらも空でない」タイプの状態が発生したとき。です。


#（強引に）ユーザID,パスワードが空のときの処理を記述する。

本音としては、あまりやりたくないですが・・・。
wp_authenticate関数の冒頭に
<pre>
#IDかパスワード、どちらか一つでも空なら判定対象外にして、
#強制的にリダイレクト処理を呼び出す
if ( $username == null || $password == null ){
    $hoge = 'empty';
    do_action('wp_process1',$hoge );
}
</pre>

とでも書いておいて

現在使用しているテーマのfunctions.phpに

<pre>
add_action('wp_process1','wp_funtion_a');

#リダイレクト処理
#最低限の記述です。適宜改良してください。
function wp_funtion_a($hoge){
　　　$url=$_SERVER['HTTP_REFERER'];
　　　
     #リダイレクトURLが空でなければ、リファラーでリダイレクト
　　　if (!empty($url))
         wp_redirect($url);

}
</pre>

wp_inculdesの中身をデフォルトからカスタマイズしているので、ちょっと乱暴かも。
もっといい方法があればな〜。
Javascript っぽい新しい言語を妄想してみた【マップ編】

1. [Javascript っぽい新しい言語を妄想してみた](http://qiita.com/trashtoy/items/d95b22d3b68cd463c2da)
2. [Javascript っぽい新しい言語を妄想してみた【配列編】](http://qiita.com/trashtoy/items/72fa703bc35a643f9c5d)
3. Javascript っぽい新しい言語を妄想してみた【マップ編】 ← イマココ

## あらすじ

「もしも自分が Javascript っぽい言語をゼロから設計するとしたら？」というテーマで以下のような言語を作ってみました. (名前はまだない)

* 基本的な文法は Javascript と同じ.
* オリジナルの Javascript が「プロトタイプベース」なのに対し, この言語は「クラスベース」なオブジェクト指向.
* すべての値がオブジェクトである. 「スカラー型」あるいは「プリミティブ型」のような概念は存在せず, すべての値が何らかのクラスのインスタンス.
* すべてのクラスは Class クラスのインスタンス. (※新しいクラスの定義は `new Class()` で行う)
* 関数の表記はオリジナルの Javascript と同じだが, 引数や返り値のタイプヒンティングを付与することも出来る. (この辺りは Javascript よりもむしろ PHP7 に近い)

詳しいコードは [初回の記事](http://qiita.com/trashtoy/items/d95b22d3b68cd463c2da) をご覧ください.

今回は「マップ」についての説明です.

## 基本形

Javascript における object の概念をこの言語では「マップ」と呼んでいます. 例えば以下のように書けます. Javascript と全く同じですね！

```js
var map = {
    "foo": "aaaa",
    "bar": "bbbb",
    "baz": {
        "hoge": true,
        "fuga": false,
        "piyo": true,
    },
    "xxxx": ["a", "b", "c"],
    "yyyy": 100,
};

console.log(map["baz"]["hoge"]); // true
```

マップは `Map` クラスのインスタンスなので, 以下のようにメソッド呼び出しで書くこともできます.

```js
var child = new Map();
child.put("hoge", true);
child.put("fuga", false);
child.put("piyo", true);

var map = new Map();
map.put("foo", "aaaa");
map.put("bar", "bbbb");
map.put("baz", child);
map.put("xxxx", ["a", "b", "c"]);
map.put("yyyy", 100);
map.put("new", 1.0);

console.log(map.get("baz").get("hoge")); // true
```

## やっぱりジェネリック (総称) に対応

前回の配列編を読んでくださった方はおそらく想像がついているのではないかと思いますが, マップも配列と同様に型を指定することが出来ます.
コンストラクタの引数に Class 型オブジェクトを 2 つ指定することで, キーと値の型をそれぞれ指定することが出来ます.
以下のコードの `Integer` および `String` は, 言語仕様で定められたグローバル変数 (実態は Class クラスのインスタンス) です.

```js
var map = new Map(Integer, String);
map.put(100, "asdf");
map.put(200, "xyz");
map.put(300, true); // 値が String 型ではないので実行時エラー
```

以下のようなシンタックスシュガーを使って同じことが表現できます.

```js
var map = <Integer, String>{
    100: "asdf",
    200, "xyz"
};
map.put("hoge", "fuga"); // キーが Integer 型ではないので実行時エラー 
```

型を指定しない場合は, キーに String, 値に Object を指定したのと同じ意味になります.
以下の map1, map2, map3, map4 はすべて等価なオブジェクトです.

```js
var map1 = <String, Object>{};
var map2 = {};
console.log(map1 == map2); // true

var map3 = new Map(String, Object);
var map4 = new Map();
console.log(map3 == map4);
```

(余談: 2 つのオブジェクトが「等価」かどうかのチェックは `==`, 「同一」かどうかのチェックは `===` を使います)

例えマップの中身が同じでも, マップに指定された型が違う場合は等価にはなりません.

```js
var map1 = <Integer, Object>{100: "hoge", 200: "fuga"};
var map2 = <Object, String>{100: "hoge", 200: "fuga"};
console.log(map1 == map2); // false
```

以上で Map 編は終了です. 次回は「クラス定義」編を予定しています. (内容はただいま構想中)

ちなみに ES6 ではかなりクラスベースっぽくなったとの噂ですが, 今のところ最新情報を追えておりません...
サーバー増強しようと思ったけどしなくて済んだ話(オーバーコミット機能について)

# 発端
muninのmemoryで「commited」が頻繁に増えるので、サーバーを増強しないといけないんじゃないかって話になった。

でも、muninのcommittedの説明を読むと、
**「プログラムに割り当てられたメモリ量。オーバーコミットなら正常で、メモリリークも検出できるよ」(意訳)**
って書いてあったので、もしかしたら増強必要ないんじゃね？と思ったのがきっかけ。

# オーバーコミット？？
* Linuxのメモリ管理サブシステム。
* プロセスに対してmallocで仮にメモリを割り当てる。
* 実メモリより多く割り当てることもある。
* 実際にプロセスが動く場合は実メモリが割り当てられる。
* スワップメモリが少ない場合、サーバーシャットダウンの恐れがある。
* 上記を回避するにはスワップメモリ以上のオーバーコミットは設定しない。

## なんでこんな機能があるのか
…よくわからなかった。
とりあえず少ない物理メモリを効率的に使うためのモノらしい。
専門じゃないからわからぬ。

# 設定を確認する

↓のコマンドを打つ。

```
sysctl -a | grep vm.over
```

こんなん返ってくる

```
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
```

* **vm.overcommit_memory**：オーバーコミットするかどうかの設定(下表参照)
* **vm.overcommit_ratio**：vm.overcommit=2のときに使う設定値

|項目|内容|
|:--|:--|
|0|オーバーコミット有効。<br>実メモリの大きさまで割り当てる。|
|1|オーバーコミット有効。<br>実メモリ以上に割り当てる。|
|2|オーバーコミット無効。<br>割り当ては下式のように割り当てる。<br>(0.5 * RAM) + (overcommit ratio * RAM) = Recommended swap size|

※式は公式を参照→[Red Hat Customer Portal](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/5/html/Virtualization/sect-Virtualization-Tips_and_tricks-Overcommitting_with_KVM.html)


# 結局問題あるのか。
この項は個人的な考察です。

## 現状の設定内容
現状の設定内容は
* vm.overcommit_memory = 0
* vm.overcommit_ratio = 50

こんな感じ。

実メモリ以上に割り当てない設定なので問題ないんじゃないかなーと思っている。


## あるサーバーではmuninのcommittedが高くなるのに別サーバーではそうでもない
あるサーバーではcommittedが何度も実メモリ分までグラフがビンビンしてたけど、
もう片方のサーバーではappのメモリに沿って低めの値になってた。

### これに対する予想。
**プロセス数の違い？**
* 問題がなかったサーバー→約100個のプロセスが常時起動(root/grep除く)
* 問題のあったサーバー→5個ぐらいのプロセスが常時起動(root/grep除く)

ちなみにプロセス数は下記コマンドで確認した。

```
ps aux |  grep -v "\(root\|grep\)" | wc -l
```

# わからなかったこと。
**メモリリークの検出がmuninのcommittedでわかるって書いてあったけど、実際どんな状態になるのかわからん。**
メモリリークってプロセスがメモリを解放しない状態のことだから、committedが減っていくってことなのかな…とは思ってる。


全体的に参考にさせていただいたとこ→[passingloop • Linux のオーバーコミットについて調べてみた](http://passingloop.tumblr.com/post/11957331420/overcommit-and-oom-killer)
GoとRedisでアンテナサイトを作ってみた

アンテナサイトが儲かる！って記事を見てテンション上がったので、Goの練習も兼ねて作ってみました。

https://github.com/ngc224/colle

下記が使用したパッケージです
goji
pongo2
go-flags
logrus
redigo
goquery

config.sample.jsonをconfig.jsonにして適当に設定すると動きます
機能はフィードの取得、ランキング、インリンクとアウトリンクのカウント、アフィリエイト用にDMMの広告を挟めるようにしてみました
RDBは使うとコストが高いかなと思って現状は使っていません

作ってから思ったことはアンテナサイトといえどもちゃんと運用しないと全く人がこないってことでした
Google Sheetで選択したセルを再計算させるApps Script

#概要
[Googleスプレッドシート](https://www.google.com/intl/ja_jp/sheets/about/)で計算式が沢山あるシートを開くと、たまに計算が正しく行われていないことがある。
計算式を一回消して再度設定すると正しく計算し直してくれるので、それを自動的に行うApps Scriptを書いた。

以下のAppsScriptをインストール後、再計算対象のセルを選択し、メニューから「Re-calculate selected cells」を選ぶとAppsScriptが再計算してくれる。
![Google SheetのAdd-onsメニュー](https://qiita-image-store.s3.amazonaws.com/0/10682/8f142419-57f4-b93f-3bc2-dcaa44f51934.png)


#下記のコードでなにをしているのかの解説

`onOpen()`でGoogle SheetのAdd-onsメニューに「Re-calculate selected cells」というメニュー項目を追加している。そのメニュー項目が押されたら`recalculate()`という関数が呼び出される。

`recalculate()`の中では、まず`SpreadsheetApp.getActiveRange()`を呼び出し、スプレッドシート上で選択されているセルのレンジを`activeRange`として取得する。
`activeRange`に対して`getFormulas()`を呼び出すことで、選択したレンジ内に設定されている数式群を二次元配列として取得している。

その後、数式を削除し`activeRange.setValues(valuesToEraseFormula)`、再度数式を設定`activeRange.setValues(valuesToRestoreFormula)`することで、Googleスプレッドシートに数式を強制的に再計算させている。

なお、元々数式が設定されていないセルは`SpreadsheetApp.getActiveRange()`では空文字列が返ってくる。なので、`activeRange.getValues()`を実行して、セルの値を消さないような処理も行っている。

#実際のコード
[Gist: katz/RecalculateSellectedCells.gs](https://gist.github.com/katz/ab751588580469b35e08)で公開している。

```js
/**
 * @OnlyCurrentDoc  Limits the script to only accessing the current spreadsheet.
 */


/**
 * Adds a custom menu with items to show the sidebar and dialog.
 *
 * @param {Object} e The event parameter for a simple onOpen trigger.
 */
function onOpen(e) {
  SpreadsheetApp.getUi()
      .createAddonMenu()
      .addItem('Re-calculate selected cells', 'recalculate')
      .addToUi();
}


/**
 * Force Spreadsheet to re-calculate selected cells
 */
function recalculate(){
  var activeRange = SpreadsheetApp.getActiveRange();
  var originalFormulas = activeRange.getFormulas();
  var originalValues = activeRange.getValues();
  
  var valuesToEraseFormula = [];
  var valuesToRestoreFormula = [];
  
  originalFormulas.forEach(function(outerVal, outerIdx){
    valuesToEraseFormula[outerIdx] = [];
    valuesToRestoreFormula[outerIdx] = [];
    outerVal.forEach(function(innerVal, innerIdx){
      if('' === innerVal){
        //The cell doesn't have formula
        valuesToEraseFormula[outerIdx][innerIdx] = originalValues[outerIdx][innerIdx];
        valuesToRestoreFormula[outerIdx][innerIdx] = originalValues[outerIdx][innerIdx];
      }else{
        //The cell has a formula.
        valuesToEraseFormula[outerIdx][innerIdx] = '';
        valuesToRestoreFormula[outerIdx][innerIdx] = originalFormulas[outerIdx][innerIdx];
      }
    })
  })
  
  activeRange.setValues(valuesToEraseFormula);
  activeRange.setValues(valuesToRestoreFormula);
}


/**
 * Runs when the add-on is installed; calls onOpen() to ensure menu creation and
 * any other initializion work is done immediately.
 *
 * @param {Object} e The event parameter for a simple onInstall trigger.
 */
function onInstall(e) {
  onOpen(e);
}


```
MacのGoogleChromeのデベロッパーツールでF11,F12を有効にする方法

# キーボードショートカットでJavaScriptをステップ実行したい！！

![スクリーンショット 2015-08-31 18.36.41.png](https://qiita-image-store.s3.amazonaws.com/0/18740/18d19e33-7540-bc5e-5f17-c280b5a17696.png)


GoogleChromeのデベロッパーツールでは、F11で Step In, F10でStep Overするショートカットキーが用意されているのですが、OSXの初期設定のままだとこれが機能しません。

Fn + F11 を押すと音量が小さくなり、F11単体を押すとデスクトップが表示されて涙が出ます。
でも諦めるのはまだはやい！！

下記のとおりにやれば、使えるようになります。

# システム環境設定 > キーボード で 「F1,F2などのすべてのキーを標準のファンクションキーとして使用」にチェックを入れる

![スクリーンショット 2015-08-31 18.43.48.png](https://qiita-image-store.s3.amazonaws.com/0/18740/cd3afce7-fcdb-83e4-ab07-465dca42a44b.png)


# システム環境設定 > キーボード > ショートカット で F11のチェックを外す

![スクリーンショット 2015-08-31 18.39.42.png](https://qiita-image-store.s3.amazonaws.com/0/18740/e808fec7-bddb-17ee-f264-5d03d40e7671.png)


これで、F11のデバグショートカットが有効になります！！
Network timed out while trying to connect to


あるDockerfileをPULLするところでエラーを吐いていた。

```
Network timed out while trying to connect to ....
```

詳細は以下。

```
$ kohey% docker build -t kohey/kangol .                                                                                             
Sending build context to Docker daemon 15.36 kB
Step 0 : FROM ubuntu
Pulling repository docker.io/library/ubuntu
Network timed out while trying to connect to https://index.docker.io/v1/repositories/library/ubuntu/images. You may want to check your internet connection or if you are behind a proxy.
```

直した方法としては

```
docker-machine restart 〇〇
eval "$(docker-machine env ◯◯)"
```

で直った。。。。
[PHP][Graph API] Facebookページの投稿記事のいいね、シェア、リーチの取得

# [PHP][Graph API] Facebookページの投稿記事のいいね、シェア、リーチの取得
[[PHP][Graph API] Facebookページのいいね、リーチの取得  ](http://qiita.com/tutida/items/57ed443d1ed831988269)に引き続き、  
ページの値ではなく、ページの投稿記事の「いいね」「シェア」「リーチ」の取得方法  
  
以下にちょいちょい出てくるアクセストークンとかは上記リンクを参考にしてください。  

## 投稿記事の記事IDの取得
記事を特定するための記事IDを取得しなけりゃ始まらない。
### サンプルコード  

```php
        //FacebookページのID
        $pageId = 'FacebookページのID';
        //取得したアクセストークン
        $accessToken = '取得したアクセストークン';

        $limit = 3;
        // ※取得数に上限を設ける場合は、'limit' を指定する
        // ※最大取得数 100
        $urlForPosts = 'https://graph.facebook.com/'
                        . $pageId  . '/posts?access_token='
                        . $accessToken . '&limit=' . $limit;

        // Graph APIはJSON形式のデータをレスポンスとして返す

        $resultsPosts = json_decode(file_get_contents($urlForPosts));
        $posts = $resultsPosts->data;


        echo '<pre>';
        var_dump($posts);
        echo '</pre>';
```


## 記事ごとの「いいね」「シェア」「リーチ」の取得
### リーチ数

```php
$poostId = '値を取得したい記事ID';
$accessToken = 'アクセストークン';
$urlForReachs = 'https://graph.facebook.com/' . $postId 
                 .'/insights/post_impressions_unique/lifetime'
                 .'?access_token=' . $accessToken;
```

[[PHP][Graph API] Facebookページのいいね、リーチの取得  ](http://qiita.com/tutida/items/57ed443d1ed831988269)と特に変わりないので説明は省略。  
### いいね、シェア
「いいね」と「シェア」は公開されている情報なので、アクセストークンなしで取得できます。  
さらに、urlのfieldsをいい感じに書くと、合計とか出してくれる  

```php
//記事ID
$postId = '値を取得したい記事ID';

//いいね、シェア数取得用URL
$urlForLikes = 'https://graph.facebook.com/' . $postId .'/?fields=likes.summary(true),shares';

// Graph APIはJSON形式のデータをレスポンスとして返す
$resultsLikes = json_decode(file_get_contents($urlForLikes));

$likes = 0;
$shares = 0;
if (array_key_exists('likes', $resultsLikes)) {
    $likes = $resultsLikes->likes->summary->total_count;
}
if (array_key_exists('shares', $resultsLikes)) {
    $shares = $resultsLikes->shares->count;
}

echo '<pre>';
echo 'いいね合計<br>';
var_dump($likes);
echo 'シェア合計<br>';
var_dump($shares);
echo '</pre>';
```

結果

```php
いいね合計
int(4)
シェア合計
int(7)
```

良いと思う(ﾊｽﾞ)
WPtouch ProでのiOS 8.4.1時におけるopacity不具合対処法

iOS8.4.1からWPtouch Proのメニューやブログ名をタップした際に，複数回タップしないと動作しない現象が発生していた．

以下のブログ等でも取り上げられている．
[結構緊急リンクが飛ばない iOS 8.4.1からCSS :hoverも１クリックカウントっぽいSafari](http://webskillup.com/ety/20150816234007/)

自分の[ブログ](http://mizuka123.net)でも同様の事象が発生していたが，上記サイトの例に当てはまらなかったため，解消まで時間がかかってしまった．

# 変更点
変更点は使用しているWPtouchテーマのstyle.cssで以下をコメントアウトor削除する．

    .touched {
        background-color: rgba(0,0,0,.1);
        opacity: .5;
    }
    
# まとめ
WPtouch Proの細かいところまで調べていないが，タップした際classに「touched」が追加され透過処理が行われていた．
今回はその透過処理を無効化しただけである．
LinuxでC++ AMP（Kalmar、旧clamp）

[C++ AMP(C++ Accelerated Massive Parallelism)](https://msdn.microsoft.com/ja-jp/library/hh265137.aspx)、知ってますか？
CUDAでもOpenCLでもない、Microsoft主導の異種混在（ヘテロジニアス）計算機での環境です。

このC++ AMP、「Microsoftが」というとDirectXみたいにWindows（Visual Studio）でしか動かないと思ってませんか？
大昔はそうでしたが、現在はLLVM/clangベースの[Kalmar](https://bitbucket.org/multicoreware/cppamp-driver-ng)（旧clamp）を使うことでLinuxでも（たぶんMacでも？）C++ AMPを使うことができます。

使い方はとっても簡単。[Kalmarのトップページ](https://bitbucket.org/multicoreware/cppamp-driver-ng/wiki/Home)に従って、

0. 予めclangをインストールしておいて
0. （Ubuntuなら）[.debをダウンロード](https://bitbucket.org/multicoreware/cppamp-driver-ng/downloads)してdpkgでインストール
0. ``/opt/kalmar/bin``にパスを通して
0. ``clang++ `clamp-config --install --cxxflags --ldflags` main.cpp``でコンパイル＆リンク

で出来ちゃいます。

Windows(Visual Studio)版と違うのは

* 実体はOpenCL CかSPIRへの翻訳機なので、[concurrency::accelerator::get_description()メソッド](https://msdn.microsoft.com/en-us/library/hh350886.aspx)でも何のデバイスが取得出来てるのかさっぱり分かりません（[get_allして表示してみましたが](https://bitbucket.org/aokomoriuta/opencl_etc/src/master/cppamp/devices)、私の環境では全部「OpenCL」と言われて終わりました。なんだそれ？）
* ただそのおかげで、WDDMの制約はないので、倍精度演算が普通に使えます[^1]。
* たまに``No section``とか警告が出たりしますが無視してもよさそうです（実行可能ファイルは出力されていて普通に実行できるので）。

と言ったあたりです。

C++ AMP自体の使い方は[ベクトルの加算](https://bitbucket.org/aokomoriuta/opencl_etc/src/master/cppamp/VectorAdd/)ぐらいなら簡単なので、実際にはコードを読んでみたりしてください（そのうちどっかに書くかも）。

実際の処理時間ですが、[適当にN体問題で比較してみた](https://bitbucket.org/aokomoriuta/simd/src/master/cppamp/simd/)結果、

* [OpenCL版](https://bitbucket.org/aokomoriuta/simd/src/master/cpp/simd/)：730[ms]
* [C++ AMP版](https://bitbucket.org/aokomoriuta/simd/src/master/cppamp/simd/)：807[ms]

で、10[%]ぐらいのコストでした。

OpenCLを使う場合はOpenCL Cへの移植があってちょっと面倒ですが、C++ AMPならほぼC++のままで動かすことができる[^2]ので、その移植コストを考えたら10[%]ぐらいなら許容範囲かなと思います。

「C++ AMPなんて流行ってないじゃん」「CUDAで/OpenCLでいいじゃん」って言う方もいるかもしれませんが、

* CUDAのようにベンダーロックがかかっていないので、大多数のプラットフォームで動かすことができる
* OpenCLのようにデバイス側の（カーネル）コードが別管理ではないので、構造が単純になる。例えば、[thrust](http://thrust.github.io/)のような汎用的なライブラリを作りやすい（[Bolt](https://github.com/HSA-Libraries/Bolt)は・・・まぁ全然うまく行ってないので仕方ない）

という両方の長所を兼ね備えているのは今のところC++ AMP以外には存在していません。
銀の弾丸ではないので盲信は避けるべきですが、Linuxでもこれだけお手軽に使えるとなると、これからもう少し本気で使ってみようかなと思いました。

[^1]: Windowsの場合、[倍精度演算の完全サポートにはWDDM1.2以上（つまりWindows8以上）が必要](http://blogs.msdn.com/b/nativeconcurrency/archive/2012/02/07/double-precision-support-in-c-amp.aspx)です。
[^2]: 実際には、関数宣言に[restrict(amp)](https://msdn.microsoft.com/en-us/library/hh388953.aspx)が必要で、その関数内では[いくつか制約](http://blogs.msdn.com/b/nativeconcurrency/archive/2011/12/19/restrict-amp-restrictions-part-0-of-n-introduction.aspx)があります（特に``std::size_t``が使えなかったりするのは地味にめんどい）。
X Cocos2d-xで表示した自機をタッチで横に動かす

#目次
1 はじめに
2 タッチされている場所に絵を動かす
3 動く範囲を画面内に制限する
4 まとめ

#はじめに
この記事は、画面下に自機を表示し、それを横方向にのみ動かしたい人向けの、覚書です。


#タッチされている場所に絵を動かす
下記コードは、絵を(画面横幅/2,高さ100)に表示したあと、タッチされている間、横方向にのみ動かす例です。

```GameScene.lua

local GameScene = class("GameScene",function()
    return cc.Scene:create()
end)

function GameScene.create()
    local scene = GameScene.new()
    scene:addChild(scene:createLayer())
    return scene
end


function GameScene:ctor()
    self.visibleSize = cc.Director:getInstance():getVisibleSize()
    self.origin = cc.Director:getInstance():getVisibleOrigin()
    self.schedulerID = nil
end

function GameScene:playBgMusic()
--[[local bgMusicPath = cc.FileUtils:getInstance():fullPathForFilename("background.mp3") 
    cc.SimpleAudioEngine:getInstance():playMusic(bgMusicPath, true)
    local effectPath = cc.FileUtils:getInstance():fullPathForFilename("effect1.wav")
    cc.SimpleAudioEngine:getInstance():preloadEffect(effectPath)]]
end

-- create farm
function GameScene:createLayer()
    local layer = cc.Layer:create()

    -- スプライトを追加
    local sprite = cc.Sprite:create("land.png")
    sprite:setPosition(self.visibleSize.width/2,100)
    layer:addChild(sprite)

    -- タッチ開始時に呼ばれる関数
    local function onTouchBegan(touch, event)

        return true -- 開始イベントの関数はtrueを返す
    end
    
    -- タッチしながら指を動かしている時に呼ばれる関数
    local function onTouchMoved(touch, event)
        -- a)タッチ点の座標を取得
        local location = touch:getLocation()
        
        -- b)タッチ点のx座標へ絵を移動
        sprite:setPositionX(location.x)
    end
    
    -- タッチを離した時に呼ばれる関数
    local function onTouchEnded(touch, event)

    end

    -- タッチイベントで呼ばれる関数を登録
    local listener = cc.EventListenerTouchOneByOne:create()
    listener:registerScriptHandler(onTouchBegan, cc.Handler.EVENT_TOUCH_BEGAN )
    listener:registerScriptHandler(onTouchMoved, cc.Handler.EVENT_TOUCH_MOVED )
    listener:registerScriptHandler(onTouchEnded, cc.Handler.EVENT_TOUCH_ENDED )

    -- このレイヤーでのタッチイベント取得を有効化
    local eventDispatcher = layer:getEventDispatcher()
    eventDispatcher:addEventListenerWithSceneGraphPriority(listener, layer)
    
    return layer
end

return GameScene
```

a)でタッチ中の座標を取得し、b)で絵の位置をタッチ中のx座標に変更しています。実行するとタッチ中絵を動かすことができますが、画面の端から絵が飛び出すところまで動かせてしまいます。

![Hero Controller.png](https://qiita-image-store.s3.amazonaws.com/0/90495/697fb878-584d-6950-3001-cbc1c2a862f2.png)


#動く範囲を画面内に制限する
表示画面内で絵を動かすにはb)を下記のように変更します。

```GameScene.lua
...
        -- b)タッチ点のx座標へ絵を移動
        local dx = location.x
        local offsetX = sprite:getContentSize().width/2
        -- タッチ位置Xが絵の横幅半分よりも左の場合は、表示位置dxを絵の横幅半分の位置にする
        if location.x < offsetX then
            dx = offsetX
        -- タッチ位置Xが(画面横幅-絵の横幅半分)よりも右の場合は、表示位置dxを(画面横幅-絵の横幅半分)の位置にする
        elseif self.visibleSize.width-offsetX < location.x then
            dx = self.visibleSize.width-offsetX
        end
        -- 絵の表示位置を更新
        sprite:setPositionX(dx)
...
```

上記コードで、まず現在タッチされているX座標を一旦dxに保存、絵の横幅/2をoffsetXとして変数に格納し、その下で、dxをoffsetX〜(画面幅-offsetX)の範囲に収めます。実行すると、絵は画面からはみ出さない範囲で横に動かせます。

#まとめ
今回の例は、例えば、インベーダーゲームのような、画面下に表示した自機を動かすのに使えます。
ブラウザでローカルファイルのチェックサムを算出する方法


## デモ

[Checksum with JavaScript in browser](http://minodisk.github.io/js-checksum-example/dist/)

このデモではユーザーが選択したローカルファイルのチェックサムを `md5`, `sha1`, `sha256`, `sha512` ハッシュ関数を使って計算して `hex`, `binary`, `base64` エンコーディングして表示している。

### 動作確認環境

- Win7 IE11
- Win7 Chrome 44
- Win7 Firefox 40.0.3
- Mac OSX Chrome 44
- Mac OSX Safari 8.0.8
- Mac OSX Firefox 40.0.3
- Android Chrome 44
- iOS 8.4.1 Safari

## 使ったパッケージ

webpackやbrowserifyといったバンドラーがビルトインとして用意している`crypto`と`buffer`モジュール[^modules]を使う。これらのパッケージはwebpack/browserifyともに内部的に同じパッケージに依存しているが、バージョンが違うため若干挙動が異なる。

[^modules]: nodeのコアモジュールをブラウザ用に書き換えたモジュール

### [webpack/webpack at v1.12.0](https://github.com/webpack/webpack/tree/v1.12.0)

- [webpack/node-libs-browser at v0.5.2](https://github.com/webpack/node-libs-browser/tree/v0.5.2)
  - [feross/buffer at v3.4.3](https://github.com/feross/buffer/tree/v3.4.3)
  - [crypto-browserify/crypto-browserify at v3.2.8](https://github.com/crypto-browserify/crypto-browserify/tree/v3.2.8)

### [substack/node-browserify at 11.0.1](https://github.com/substack/node-browserify/tree/11.0.1)

- [feross/buffer at v3.4.3](https://github.com/feross/buffer/tree/v3.4.3)
- [crypto-browserify/crypto-browserify at v3.9.14](https://github.com/crypto-browserify/crypto-browserify/tree/v3.9.14)

## コード

この書き方をするとバージョンによる挙動の違いがない。

```js
var crypto = require('crypto')
var $input = document.querySelector('input[type=file]')
var algorithm = 'md5'
var encoding = 'base64'

$input.addEventListener('change', function () {
  var file = $input.files[0]
  if (file == null) return

  var r = new FileReader()
  r.onerror = function (err) {
    console.error(err)
  }
  r.onload = function () {
    var buf = new Buffer(r.result)
    var hash = crypto.createHash(algorithm)
    hash.update(buf)
    console.log(hash.digest(encoding))
  }
  r.readAsArrayBuffer(file)
}, false)
```

1. `FileReader#readAsArrayBuffer()` でファイル内容を `ArrayBuffer` として読む。
1. 得られた `ArrayBuffer` を `Buffer` でラップする。
1. `crypto.createHash()` で `Hash` インスタンスを作る。
1. `Hash#update()` に `Buffer` インスタンスを渡しハッシュの内容を更新する。
1. `Hash#digest()` で目的のエンコーディングの結果を得る。
効率の良いAPIモック作成について


# 概要
* アプリの開発を進めるには、APIの仕様 + API仕様通りのレスポンスを返すモックがあると捗る
* モックを簡単に効率良く作成する方法を調査

# 調査・検証

## 1.自分で仕様から書き起こす
### 長所
* 好きな言語で書ける
* 普段書かない言語を選択すればスキルアップ

### 短所
* 地味に大変
* 実際に使うときが面倒(ローカルか開発サーバ)
* 使いまわせない
* 時間がかかる
* 仕様変更ごとにコードを修正

## 2.JSONSchemaからの生成
### 長所
* JSON SchemaでAPIを設計することでfieldの型など仕様が明確になる。
* APIのレスポンスが正しいかValidationするのに使える。
	* サーバ、クライアントどちらでもテストに使用できる
* ドキュメントを自動生成できる。

### 短所
* 書くのが大変
* [json_world](https://github.com/r7kamura/json_world)というRubyのDSLでJSON Schemaが書けるgemがある

### 参考
* http://r7kamura.hatenablog.com/entry/2014/06/10/023433
* https://speakerdeck.com/izumin5210/client-development-using-json-schema-number-kanrk06
* http://qiita.com/izumin5210/items/9714af5018b908f35124
* http://sssslide.com/speakerdeck.com/co3k/json-schema-de-web-api-falsesukimawomai-meyou
* https://github.com/r7kamura/rack-json_schema
* https://github.com/retro/apitizer

## 3.Apiary

https://apiary.io/

### 長所
* [API Blueprint](https://github.com/apiaryio/api-blueprint/blob/master/API%20Blueprint%20Specification.md)とよばれるMarkDownの拡張言語で記述
* レスポンスを定義するとエントリーポイントが用意されそのままMockになる

#### MSON
* [MSON](https://github.com/apiaryio/mson)を使うことでMarkDownでJSONレスポンスを書ける。
	* Markdown Syntax for Object Notationの略
* ↓はApiaryでMSONを使ってAPIを定義したサンプル

```markdown
### GET /mson_test

+ Response 200 (application/json)

    + Attributes
        + categories (array)
            + (object)
                + name: Category One (string) - Name of the category
            + (object)
                + test: aaaaa (string)
```

このように書くと以下のようにJSONのレスポンスに変換し、すぐに叩けるモックを用意してくれる。

```json
{
  "categories": [
    {
      "name": "Category One"
    },
    {
      "test": "aaaaa"
    }
  ]
}

```

* 同時にJSON Schemaにも変換してくれる。

```json
{
  "type": "object",
  "properties": {
    "categories": {
      "type": "array"
    }
  },
  "$schema": "http://json-schema.org/draft-04/schema#"
}
```

* Apiaryでの定義はそのままドキュメントになる。
	* http://docs.ryosukehorie.apiary.io/#reference
	* 実際にリクエストできるモック付きのドキュメント

## 短所
* API BlueprintのSyntaxの学習コスト
* [有料](https://apiary.io/pricing)

## 参考
* http://qiita.com/horimislime/items/38327a3f4166b7b39eb5

# 結論
* Apiaryが良さそう
Linuxで載ってるメモリ（DDR）の種類を調べるコマンド

よく忘れるのでメモ。

```shell-session
$ sudo dmidecode --type memory
Handle 0x0011, DMI type 17, 34 bytes
Memory Device
        Array Handle: 0x0010
        Error Information Handle: Not Provided
        Total Width: 64 bits
        Data Width: 64 bits
        Size: 8192 MB
        Form Factor: DIMM
        Set: None
        Locator: DIMM1
        Bank Locator: Not Specified
        Type: DDR3
        Type Detail: Synchronous
        Speed: 1600 MHz
        Manufacturer: 1311
        Serial Number: 12202868
        Asset Tag: 9876543210
        Part Number: M2X8G64CB8HD9N-DG
        Rank: 2
        Configured Clock Speed: 1600 MHz

Handle 0x0013, DMI type 17, 34 bytes
Memory Device
        Array Handle: 0x0010
        Error Information Handle: Not Provided
        Total Width: 64 bits
        Data Width: 64 bits
        Size: 8192 MB
        Form Factor: DIMM
        Set: None
        Locator: DIMM2
        Bank Locator: Not Specified
        Type: DDR3
        Type Detail: Synchronous
        Speed: 1600 MHz
        Manufacturer: 1311
        Serial Number: 12162869
        Asset Tag: 9876543210
        Part Number: M2X8G64CB8HD9N-DG
        Rank: 2
        Configured Clock Speed: 1600 MHz
```

というのがある。
重要なのが

* Type: DDR2とかDDR3とかの種類
* Size: 1枚の容量。4096[MB]とか、8192[MB]とか。
* Speed: 1600[MHz]とか。メモリクロックじゃなくて、チップの種類の方。

あたり。

この情報からチップの種類がわかる（DDR3-1600とか）ので、それと[enwpの情報](https://en.wikipedia.org/wiki/List_of_device_bit_rates#Dynamic_random_access_memory)を照らし合わせると理論性能がわかります。

また、別のコマンドとして

```shell-session
$ sudo lshw -class memory
  *-memory
       description: System Memory
       physical id: 10
       slot: System board or motherboard
       size: 16GiB
     *-bank:0
          description: DIMM DDR3 Synchronous 1600 MHz (0.6 ns)
          product: M2X8G64CB8HD9N-DG
          vendor: Conexant (Rockwell)
          physical id: 0
          serial: 12202868
          slot: DIMM1
          size: 8GiB
          width: 64 bits
          clock: 1600MHz (0.6ns)
     *-bank:1
          description: DIMM DDR3 Synchronous 1600 MHz (0.6 ns)
          product: M2X8G64CB8HD9N-DG
          vendor: Conexant (Rockwell)
          physical id: 1
          serial: 12162869
          slot: DIMM2
          size: 8GiB
          width: 64 bits
          clock: 1600MHz (0.6ns)
```

というのもあり、こっちの方が見やすいかもしれません。
Mongooseのモデルメソッドの返り値

MongooseのModelオブジェクトのメソッドはQueryを返すのかPromiseを返すのかいつも忘れてしまうので、まとめてみました。リンク先は公式APIドキュメントです。

## Promiseを返す

* [Model#remove([fn])](http://mongoosejs.com/docs/api.html#model_Model-remove)
* [Model#save([options], document, [fn])](http://mongoosejs.com/docs/api.html#model_Model-save)
* [Model.create(doc(s), [fn])](http://mongoosejs.com/docs/api.html#model_Model.create)
* [Model.geoNear(GeoJSON, options, [callback])](http://mongoosejs.com/docs/api.html#model_Model.geoNear)
* [Model.geoSearch(condition, options, [callback])](http://mongoosejs.com/docs/api.html#model_Model.geoSearch)
* [Model.mapReduce(o, [callback])](http://mongoosejs.com/docs/api.html#model_Model.mapReduce)
* [Model.populate(docs, options, [cb(err,doc)])](http://mongoosejs.com/docs/api.html#model_Model.populate)
* [Model.remove(conditions, [callback])](http://mongoosejs.com/docs/api.html#model_Model.remove)

## Queryを返す

* [Model.count(conditions, [callback])](http://mongoosejs.com/docs/api.html#model_Model.count)
* [Model.distinct(field, [conditions], [callback])](http://mongoosejs.com/docs/api.html#model_Model.distinct)
* [Model.find(conditions, [projection], [options], [callback])](http://mongoosejs.com/docs/api.html#model_Model.find)
* [Model.findById(id, [projection], [options], [callback])](http://mongoosejs.com/docs/api.html#model_Model.findById)
* [Model.findByIdAndRemove(id, [options], [callback])](http://mongoosejs.com/docs/api.html#model_Model.findByIdAndRemove)
* [Model.findByIdAndUpdate(id, [update], [options], [callback])](http://mongoosejs.com/docs/api.html#model_Model.findByIdAndUpdate)
* [Model.findOne([conditions], [projection], [options], [callback])](http://mongoosejs.com/docs/api.html#model_Model.findOne)
* [Model.findOneAndRemove(conditions, [options], [callback])](http://mongoosejs.com/docs/api.html#model_Model.findOneAndRemove)
* [Model.findOneAndUpdate([conditions], [update], [options], [callback])](http://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate)
* [Model.update(conditions, doc, [options], [callback])](http://mongoosejs.com/docs/api.html#model_Model.update)
* [Model.where(path, [val])](http://mongoosejs.com/docs/api.html#model_Model.where)
[WordPress]カスタム投稿タイプの投稿画面で特定の項目を非表示にする方法



wordpressでカスタムフィールドを多用してゴリゴリとカスタマイズしていると、
投稿画面で不要な入力項目を消したくなってくるはず。

この場合はカスタム投稿タイプだと, register_post_type関数の引数 "support"で表示する項目を１つずつ指定することができる

全オプションは以下

```php
'supports' => array(
    'title',           // タイトル
    'editor',          // 内容の編集
    'author',          // 作成者
    'thumbnail',       // アイキャッチ画像。現在のテーマが post-thumbnails をサポートしていること
    'excerpt',         // 抜粋
    'trackbacks',      // トラックバック送信
    'custom-fields',   // カスタムフィールド
    'comments',        // コメントの他、編集画面にコメント数のバルーンを表示する
    'revisions',       // リビジョンを保存する
    'page-attributes', // メニューの順序。「親〜」オプションを表示するために hierarchical が true であること
    'post-formats',    // 投稿のフォーマットを追加。投稿フォーマットを参照
),
```

必要な項目だけ指定すればOK

## 参考
公式マニュアル

http://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/register_post_type
Cloudflareの無料SSLは、iOS9のApp Transport Security(ATS)で有効なのか!?

# iOS9が出るー

Appleが2015年9月9日にやるイベントで、iPhone 6sと同時に iOS9 がリリースされる(予定) ほとんどのiPhoneユーザは、iOS9に飛びつくと思うけど、iOS9 から結構いろいろな機能が付く。

* Safari 広告禁止機能(アドオン必要?)
* App Transport Security(ATS)

[続きはこちら!](http://tech.h7i.jp/entry/2015/08/31/155838)
ポテトの長さの平均は

ハンバーガー統計学をRで解いてみました。
http://kogolab.chillout.jp/elearn/hamburger/chap1/sec1.html

## ポテトの長さの平均を計算する

### ワクワクバーガーのポテトの長さの平均

まずはワクワクバーガーのポテトの長さから。

```r:waq2_potato_length
>waq2 <- read.delim("waq2_potato_length.csv",sep=",", stringsAsFactors=FALSE, header=FALSE, na.strings="")
>mean(waq2$V1)
[1] 4.571429
```

ワクワクバーガーのポテトの長さ（49本分）
https://drive.google.com/file/d/0B4lJ1IyMUew0OE9CVGhTam0wdzQ/view?usp=sharing

### モグモグバーガーのポテトの長さの平均

次にモグモグバーガーのポテトの長さから。

```r:mog2_potato_length
> mog2 <- read.delim("mog2_potato_length.csv",sep=",", stringsAsFactors=FALSE, header=FALSE, na.strings="")
> mean(mog2$V1)
[1] 4.614286
```



モグモグバーガーのポテトの長さ（49本分）
https://drive.google.com/file/d/0B4lJ1IyMUew0SHZ1STMxNXRfLUE/view?usp=sharing
How to make AssetBundle


[Article of Japanese](http://qiita.com/satotin/items/7a481c69230e9393401b)

1. Choose prefab
2. See bottom of inspector
3. Set AssetBundle name
4. Create Assets/Editor/ExportAssetBundles.cs
5. Choose menu -> Assets -> Unity 5.x Build AssetBundle
6. Generate file into **StreamingAssets** folder

```csharp:ExportAssetBundles.cs
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.IO;

public class ExportAssetBundles : MonoBehaviour
{
    [MenuItem("Assets/Unity 5.x Build AssetBundle")]
    static void ExportResource_Unity5()
    {
        Debug.Log("Target=" + EditorUserBuildSettings.activeBuildTarget.ToString());

        // Folder name is PlatForm name
        string OutPutPath = Application.streamingAssetsPath + "/" + EditorUserBuildSettings.activeBuildTarget.ToString();

        if (Directory.Exists(OutPutPath) == false )
        {
            Directory.CreateDirectory(OutPutPath);
        }

        // Build AssetBundle at platform manifest.
        BuildPipeline.BuildAssetBundles(OutPutPath, 0, EditorUserBuildSettings.activeBuildTarget);
        Debug.Log("ComPress End");
    }
}
```
ansible実行時sudoパスワードを省略(vault)

## 参考

* [Ansibleでパスワードを暗号化して管理する - Qiita](http://qiita.com/daeji/items/fe3859f4e469f0e97d3f)

# 準備

* sudoのパスワードが`myp@sswOrd`とする。

```yaml:group_vars/all
---
ansible_sudo_pass: myp@sswOrd
```

他にも`ansible_ssh_pass`を書くと便利。

```bash:hosts
[hosts]
localhost ansible_connection=local
```

```yaml:main.yml
---
- hosts: localhost
  sudo: yes
  tasks:
  - name: install utilities
    apt: pkg={{ item }} state=installed
    with_items:
      - vim
      - screen
```

## sudo のパスワードが聞かれないことを確認

```bash:実行
ansible-playbook -i hosts
```

## 暗号化する

```bash:暗号化
ansible-vault encrypt group_vars/all
```

暗号化のパスワードを聞いてくるので2回入力。
これで`group_vars/all`が暗号化された。

```bahs:パスワードを変更したい場合
ansible-vault edit group/vars/all
```

## 実行方法

```bash:暗号化の状態で実行
ansible-playbook -i hosts --ask-vault-pass
```

暗号化で用いたパスワードを入力


# 注意点

暗号化されているとはいえ、Githubのような公共のリポジトリにpushしないように。

```bash:.gitignore
group_vars/all
```
HeidiSQL で CSV ファイルインポート

# 使い方

- ツール > CSV ファイルのインポート
- テーブルを truncate してからインポートするにチェック
- 制御文字
    - フィールド区切り文字を「,」に設定
    - フィールドエスケープ文字を空に設定
- autoincrement なフィールドがある場合
    - カラムのチェックを外す
    - CSV ファイルからも項目を削除する

# 失敗例

フィールド区切り文字のデフォルトが「;」になっててそれに気づかず実行すると以下エラーが発生する
/* Warning (1261): Row 1 doesn't contain data for all columns */
Herokuでbower installする


Herokuはbuildpackがあるので、簡単にnode.jsやnpmを動かすことができますね。いいですね。

## Herokuでアプリケーションを新規作成

すでに、ローカルで動くことを前提としています。

```
$ cd ~/project_dir
$ heroku create
```

## buildpackのURLを指定

```
$ heroku config:set BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-multi.git
```

## node.js/bowerの設定

バージョンは、念のため開発環境に合わせておきます（Herokuで対応していないバージョンの場合、勝手に近しいものに置き換わるっぽいです）。

```/package.json
{
  "engines": {
    "node": "0.12.7",
    "npm": "2.12.1"
  },
  "dependencies": {
    "bower": "1.4.1"
  },
  "scripts": {
    "postinstall": "bower install"
  }
}
```

```/.buildpacks
https://github.com/heroku/heroku-buildpack-nodejs
https://github.com/heroku/heroku-buildpack-ruby
```

```/Gemfile
source "https://rubygems.org"

ruby '2.2.3'

gem "sinatra", require: "sinatra/base"
gem "sinatra-contrib", require: "sinatra/reloader"
gem "sinatra-assetpack"
gem "sass"

gem "slim"
```

```
$ git push heroku master
```

これで、node.js / npmのバイナリが設置され、postinstallで指定した`bower install`が動くようになります。おめでとうございます。自分。