OmniAICreator/Qiita-1.07M huggingface dataset:
CloudFrontで~を含むInvalidation

これまでCloudFrontを利用している際に ~ を含んだパスでInvalidationがうまくいかない現象*1が有りました。
本日(5/22)にCloudFrontのアップデートによりワイルドカード( * )利用したInvalidationが可能になったので、 ~ を含むパスも削除出来るかテストを実施しました。
*1:CloudFrontが準拠しているRFC1738の仕様 詳細は[こちら](http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/cloudfront_2012_03_15/model/InvalidationBatch.html)

# 準備  
## 環境
- apacheやnginx、IISを入れたサーバ
- curlコマンドを叩くPC
- AWSアカウント

## CloudFrontの準備
テスト用に以下のパスでページを準備する

- /
- /sample/
- /sample/~/
- /sample/~/sample2

# 検証
## CloudFrontへキャッシュをさせる

初回の為 Miss from cloudfront になることを確認

```
# curl --verbose http://HOGEHOGE.cloudfront.net/ 1> /dev/null
< X-Cache: Miss from cloudfront

# curl --verbose http://HOGEHOGE.cloudfront.net/sample/ 1> /dev/null
< X-Cache: Miss from cloudfront

# curl --verbose http://HOGEHOGE.cloudfront.net/sample/~/ 1> /dev/null
< X-Cache: Miss from cloudfront

# curl --verbose http://HOGEHOGE.cloudfront.net/sample/~/sample2 1> /dev/null
< X-Cache: Miss from cloudfront
```

キャッシュが行われていることを確認

```
# curl --verbose http://HOGEHOGE.cloudfront.net/ 1> /dev/null
< X-Cache: Hit from cloudfront

# curl --verbose http://HOGEHOGE.cloudfront.net/sample/ 1> /dev/null
< X-Cache: Hit from cloudfront

# curl --verbose http://HOGEHOGE.cloudfront.net/sample/~/ 1> /dev/null
< X-Cache: Hit from cloudfront

# curl --verbose http://HOGEHOGE.cloudfront.net/sample/~/sample2 1> /dev/null
< X-Cache: Hit from cloudfront
```

## CloudFrontでInvalidationを実施
Object Pathsに /sample/~/* を指定してInvalidation

## Invalidation後の確認
```
削除していないパスを確認
# curl --verbose http://HOGEHOGE.cloudfront.net/ 1> /dev/null
< X-Cache: Hit from cloudfront

削除対象のパスを確認(/sample/*)
# curl --verbose http://HOGEHOGE.cloudfront.net/sample/ 1> /dev/null
< X-Cache: Miss from cloudfront

# curl --verbose http://HOGEHOGE.cloudfront.net/sample/~/ 1> /dev/null
< X-Cache: Miss from cloudfront

# curl --verbose http://HOGEHOGE.cloudfront.net/sample/~/sample2 1> /dev/null
< X-Cache: Miss from cloudfront
```

# 結果
今回のCloudFrontの更新によりパスに ~ を含んでいてもInvalidationが可能になりました。
これでミドルウェアの仕様上 ~ を含んでいた場合でも使用しやすくなったと思います。
c++ builder XE4, 10.2 Tokyo > ファイル作成日時の変更

```txt:動作確認
C++ builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/09)
```

ファイルの作成日時を変更したい。

http://www.gesource.jp/weblog/?p=5815
にdelphiでの具体例があった。

C++ Builderでは以下でよい。

```cpp
#include <IOUtils.hpp> // for TFile::SetCreationTime()

...
	String path;
	TDateTime dt;

	path = L"txt.csv";
	dt = Now();

	TFile::SetCreationTime(path, dt);
...
```

更新日時の変更はこちら
http://www.gesource.jp/programming/bcb/06.html
【Rails】Missing column: `applications.scopes`.

# Doorkeeperつらい
[Doorkeeper][doorkeeper] gemをアップデートしたら標記のようなエラーが…．

```
Missing column: `applications.scopes`.
```

## 原因

[Support ability to limit scopes by application · doorkeeper-gem/doorkeeper@1c89cc5](https://github.com/doorkeeper-gem/doorkeeper/commit/1c89cc596ab73755d5df3e0843a836659e070540)にて`oauth_applications`テーブルに`scopes`というカラムが追加された．
これがv2.2.0にて[Doorkeeper][doorkeeper] gemに取り込まれたため．

## 対処法
以下のコマンドを実行する（`bin/`や`bundle exec`は各自で補ってください）．

```shell-sessions
$ rails generate doorkeeper:application_scopes
$ rake db:migrate
```

## 補足
[cookpad/garage][garage]をv1.4.xにしたときに[doorkeeper][doorkeeper]がv2.2.x系に引き上げられるので，その影響を受ける人も多そう．

# References
* [doorkeeper-gem/doorkeeper][doorkeeper]
* [cookpad/garage][garage]

[doorkeeper]: https://github.com/doorkeeper-gem/doorkeeper/commit/1c89cc596ab73755d5df3e0843a836659e070540
[garage]: https://github.com/cookpad/garage
AngularJSでWebAPI(PHP)連携 GET編


AngularJSでWebAPI連携する方法は、

* $httpを使う
* ngResourceを使う

の大きく２つ。ngResourceはRESTfulというかResourcefulのAPIと簡単連携する仕組みと理解している。LaravelのRoute::resource()とかと組み合わせればかなり便利かなと（そのうち試す）。とはいえ、汎用性があるのは$httpなので、$httpの使い方。

###想定環境

* phpでAPIを作る（とりあえず素）
* レスポンスはJSON
* フロント側はAngular

###JSON

戻ってくるJSONはこんな形式を想定。

```json
{
	"status":"OK",
	"data":[
		{"name":"sato","age":"44"},
		{"name":"ito","age":"22"},
		{"name":"tanaka","age":"33"},
		{"name":"suzuki","age":"55"}
	]
}
```

###PHP(WebAPI)

ただ、データを返しているだけ。折角なので、非同期のチェックのために3秒遅延させてみる。

```php
<?php

	//sleep
	sleep(3);

	//main
	$res = [];
	$data = [];

	$data[] = ["name"=>"sato","age"=>"44"];
	$data[] = ["name"=>"ito","age"=>"22"];
	$data[] = ["name"=>"tanaka","age"=>"33"];
	$data[] = ["name"=>"suzuki","age"=>"55"];

	$res['status'] = "OK";
	$res['data'] = $data;

	header("Content-type: application/json");
	echo json_encode($res);
	exit;
```

###フロント

こんな感じ。
Controllerの第２引数を[]で囲む例が多いけど、その差がいまいち理解できていません。
あと通信部分はfactoryに切り出すとか。

```html
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
<script>

var app = angular.module('myApp',[]);

app.controller('hogeCtrl',function($scope,$http){

	//読み込み中を表示
	$scope.loading = true;

	//データ取得
	$http.get("http://localhost/data.php")
	.success(function(response){
	
		//データ取得
		$scope.status = response.status;
		$scope.users = response.data;

		//読み込み中非表示
		$scope.loading = false;
	});

});
</script>
</head>
<body>

<div ng-app="myApp" ng-controller="hogeCtrl">
<!-- 読み込み中エリア -->
<div ng-show="loading">
読み込んでいます。。。
</div>
<!-- status -->
{{status}}<br>
<!-- loop -->
<ul>
	<li ng-repeat="user in users">
	{{user.name + ' ' +user.age}}
	</li>
</ul>

</div>
</body>
</html>
```
社内情報共有ツールの検討


# 概要
* 社内情報をまとめるサービスorツールがほしい
* 使用人数15人〜20人ぐらい（増減あり）
* エンジニア半分、非エンジニア半分
* Markdownだと嬉しい（非エンジニアには頑張ってもらう）
* 今までに使用したツール
 * Redmineのwiki
 * PukiWiki


# 比較ツール

## Qiita:Team
[ServicePage](https://teams.qiita.com/) [料金表](https://teams.qiita.com/pricing)

* 現在エンジニア中心に使用中
* 17user15,000円/月
* [kobito](http://kobito.qiita.com/)使ってみると以外に便利


## Ruffnote
[ServicePage](https://ruffnote.com) [料金表](https://ruffnote.com/plans)

* 非公開ノート30件1,000円/月
* 多分30件は軽く超える。というかノートに課金するのは結構キツイ

## Lodge
[QiitaPage](http://qiita.com/m-yamashita/items/d6f64db461acd54095f7) [GitHub](https://github.com/lodge/lodge)

* Qiita:TeamのRoRによるクローンOSS
* まだbetaな印象
* 自分で管理すればサーバー費用のみで制限なし

## DocBase
[ServicePage](https://docbase.io/)

* 20user11,000円/月
* 2015年内課金開始予定
* ロゴがブリーフに似ている

# 参考
[[WIP] Markdownでメモができるサービス（ツール）一覧](http://qiita.com/mizoki/items/a5b8fd7288b096c2b47a)
1時間以内のアレの5をC#で

元ネタ「[1時間以内に解けなければプログラマ失格となってしまう5つの問題が話題に](http://www.softantenna.com/wp/software/5-programming-problems/)」


```lang:sample.cs
tatic void Main(string[] args)
{
    var sources = "123456789";
    var comm = " +-";
 
    var insertPoint = sources.Length - 1;
    var commCount = comm.Length;
 
    const int value = 100;
 
    System.Data.DataTable dt = new System.Data.DataTable();
 
    foreach (var v in Enumerable.Range(0, (int)Math.Pow(commCount, insertPoint)))
    {
        var formula = sources;
        foreach (var n in Enumerable.Range(0, insertPoint).Reverse())
        {
            var index = (v / (int)Math.Pow(commCount, n)) % commCount;
            formula = (index == 0) ? formula : formula.Insert(n + 1, new string(new[] { comm.ElementAt(index) }));
        }
 
        var result = (int)dt.Compute(formula, "");
        if (result == value)
            Console.WriteLine(formula + " = " + result);
    }
}
```

* DataTableを使いたかっただけだろ感があります。
* commに他の演算子を追加できたりなんかもします。
* 組み合わせを出してるところが読みにくいですし、あっという間にint値がオーバーフローしそうです。
* 名前の付け方って難しいですね。
Androidの2015夏モデル一覧

完全に自分用の一覧。
ネットに転がってそう。。。
※タブレット系はまとめたら追記予定

#発売端末一覧

| キャリア | 端末名 | 型番 | 発売予定日 | トピック |
|:-------:|:-----:|:-----:|:--------:|:----------:|
| docomo |[Xperia Z4](https://www.nttdocomo.co.jp/product/smart_phone/so03g/index.html?icid=CRP_2015_summer_so03g_to_CRP_PRD_so03g)|SO-03G|2015/06中旬|Zシリーズ完全版？|
| docomo |[Xperia A4](https://www.nttdocomo.co.jp/product/smart_phone/so04g/index.html?icid=CRP_2015_summer_so04g_to_CRP_PRD_so04g)|SO-04G|2015/06中旬|画面は4.6インチで小さめ|
| docomo |[Galaxy S6 edge](https://www.nttdocomo.co.jp/product/smart_phone/sc04g/index.html?icid=CRP_2015_summer_sc04g_to_CRP_PRD_sc04g)|SC-04G|2015/04/23(発売中)|CPUは一番ハイスペックかも|
| docomo |[Galaxy S6](https://www.nttdocomo.co.jp/product/smart_phone/sc05g/index.html?icid=CRP_2015_summer_sc05g_to_CRP_PRD_sc05g)|SC-05G|2015/04/23(発売中)||
| docomo |[Arrows NX](https://www.nttdocomo.co.jp/product/smart_phone/f04g/index.html?icid=CRP_2015_summer_f04g_to_CRP_PRD_f04g)|F-04G|2015/05下旬|虹彩認証|
| docomo |[AQUOS Zeta](https://www.nttdocomo.co.jp/product/smart_phone/sh03g/index.html?icid=CRP_2015_summer_sh03g_to_CRP_PRD_sh03g)|SH-03G|2015/05下旬||
| docomo |[AQUOS EVER](https://www.nttdocomo.co.jp/product/smart_phone/sh04g/index.html?icid=CRP_2015_summer_sh04g_to_CRP_PRD_sh04g)|SH-04G|2015/06中旬||
| docomo |[DisneyMobile](https://www.nttdocomo.co.jp/product/smart_phone/dm01g/index.html?icid=CRP_2015_summer_dm01g_to_CRP_PRD_dm01g)|DM-01G|2015/05下旬||
| au |[Xperia Z4](http://www.au.kddi.com/mobile/product/smartphone/sov31/)|SOV31|2015/06中旬||
| au |[Galaxy S6 edge](http://www.au.kddi.com/mobile/product/smartphone/scv31/)|SCV31|2015/04/23(発売中)||
| au |[AQUOS SERIE](http://www.au.kddi.com/mobile/product/smartphone/shv32/)|SHV32|2015/06中旬|赤外線通信が使える…！？|
| au |[isai vivid](http://www.au.kddi.com/mobile/product/smartphone/lgv32/)|LGV32|2015/05下旬||
| au |[HTC J butterfly](http://www.au.kddi.com/mobile/product/smartphone/htv31/)|HTV31|2015/06上旬||
| au |[TORQUE](http://www.kddi.com/corporate/newsrelease/2015/0512-6/)||2015/07上旬|高耐久性能の端末。Android 5.1が載る予定|
| au |[URBANO](http://www.kddi.com/corporate/newsrelease/2015/0512-7/)|V02|2015/07上旬|Android 5.1が載る予定|
| Softbank |[Xperia Z4](http://www.softbank.jp/mobile/products/list/xperia-z4/)||2015年6月中旬以降||
| Softbank |[Galaxy S6 edge](http://www.softbank.jp/mobile/products/list/galaxy-s6-edge/)||2015/05/29 発売予定||
| Softbank |[AQUOS Xx](http://www.softbank.jp/mobile/products/list/aquos-xx/)||2015/6月下旬||
| Softbank |[AQUOS CRYSTAL2](http://www.softbank.jp/mobile/products/list/aquos-crystal2/)||2015/07上旬||

#触ってみた感想(触ったら順次追記予定)
構造体のコピーとmemcpyとgdbのウォッチポイント

# はじめに

構造体のサイズがある程度大きくなると代入にmemcpyが呼ばれてgdbのウォッチポイントでソースの行数がわからなくなる話と、どのくらいのサイズでmemcpyを呼ぶかは処理系依存な話。

# gdbのウォッチポイントとmemcpy

そういうことはおきて欲しくないものだが、クソコードをデバッグしなければならないこともある。グローバル変数バリバリで、構造体とか定義しまくっていて、なおかつ**そのポインタを別のポインタに代入しまくってるからどこで変数が修正を受けているかコードを見ているだけじゃわからない**というコード。

で、不幸にしてそういうコードをいじることになった場合、強力な味方になるのがgdbのウォッチポイント。これで変数を監視すれば、ポインタとかを経由して変数の名前が変わっても変更を検知できる。

ところが、ある程度以上大きな構造体の代入はmemcpyが呼ばれるが、処理系によってはmemcpyによる変数書き換えそのものは検知できても、対応するソースの行を検出できないことがある。

たとえばこんなコードを書いてみる。ちなみにOSはCentOS、g++のバージョンはg++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)。

```cpp:test.cc
#include <stdio.h>
struct Hoge{
  int x;
  int buf[N];
};
Hoge a,b;
int
main(void){
  b.x = 1;
  b.buf[0] = 1;
  a = b;
}
```
Nの定義が無いが、これはコンパイル時に与える。
で、N=2047にしてコンパイルし、a.xをwatchして見る。

```shell-session:
$ g++ -DN=2047 -g test.cc 
$ gdb ./a.out
(gdb) watch a.x
Hardware watchpoint 1: a.x
(gdb) r
Starting program: ./a.out
Hardware watchpoint 1: a.x

Old value = 0
New value = 1
0x0000000000400585 in main () at test.cc:11
11	  a = b;
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.132.el6.x86_64 libgcc-4.4.7-11.el6.x86_64 libstdc++-4.4.7-11.el6.x86_64
```
ちゃんとtest.ccの11行目の「a=b;」で変数変化を検知した。

次に、N=2048で同じことをやってみる。

```shell-session
$ g++ -DN=2047 -g test.cc 
$ gdb ./a.out
(gdb) watch a.x
Hardware watchpoint 1: a.x
(gdb) r
Starting program: ./a.out
Hardware watchpoint 1: a.x

Old value = 0
New value = 1
0x0000003486089aab in memcpy () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.132.el6.x86_64 libgcc-4.4.7-11.el6.x86_64 libstdc++-4.4.7-11.el6.x86_64
```
と、memcpyにより変化したので、行番号が検出できなかった。

ちなみにインテルコンパイラ(icpc)だと、memcpyされても行番号が検出できる。

```shell-session:
$ icpc -DN=2048 -S test.cc; grep memcpy test.s 
        call      _intel_fast_memcpy                            #11.7

$ gdb ./a.out
(gdb) watch a.x
(gdb) r
Starting program: ./a.out 
Hardware watchpoint 1: a.x

Old value = 0
New value = 1
0x00000000004005a3 in main () at test.cc:11
11	  a = b;
```

# 構造体のサイズとmemcpy

構造体がどのくらいのサイズになったらmemcpyを呼ぶかは処理系やオプションに強く依存する。こんなコードを書いてみる。

```cpp:test2.cc
struct Hoge{
  int buf[N];
};
void
func(Hoge &a, Hoge &b){
  a = b;
}
```

いろんなNを与えてコンパイルし、memcpyが呼ばれているかを調べる。こんな感じ。

```shell-session
$ g++ -S -DN=32 test2.cc;grep memcpy test2.s 

$ g++ -S -DN=33 test2.cc;grep memcpy test2.s
	call	_memcpy
```

これをいくつかの処理系で試してみる。とりあえず手元のMacとCentOSで。おそらくOSというより処理系のバージョンの問題が大きいと思うが。

- (Mac) g++ (MacPorts gcc49 4.9.2_1) 4.9.2
- (Mac) clang++ Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
- (CentOS) g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)
- (CentOS) icpc (ICC) 12.1.4 20120410

|OS | 処理系 | オプション| memcpyが出るサイズ (N)|
|:-----------:|:-----------:|:------------:|:------------:|
|Mac OSX| g++  | なし, -O1, -O2, -O3 | 33|
|Mac OSX| clang++  | なし | 9|
|Mac OSX| clang++ | -O1 以上 | 33|
|CentOS | g++ | なし, -O1, -O2, -O3 | 2049|
|CentOS | icpc | -O0, -O1 | memcpy吐かない|
|CentOS | icpc | なし(-O2), -O3 | 33|

clang++とicpcはオプションにより挙動が変化する。clang++はmemcpyを呼ぶスレッショルドが変わり、icpcは-O1以下だとそもそもmemcpyを使わず、-O2以上だと N=33以上で _intel_fast_memcpyを呼ぶみたい。

# まとめ

memcpyが呼ばれるとgdbのウォッチポイントでソースの行数がわからなくなる場合があり、構造体のコピーでmemcpyが呼ばれるかどうかは処理系にもサイズにも依存する。
dockerでゲームを音付きで動かせたのでYouTubeにUPしました

ubuntu 15.04 + [LivaPC](http://www.livapc.com/)

音は[PulseAudioで他の端末から音を出す](http://qiita.com/tukiyo3/items/d39c90f91d782001e7d7)で出した。

## YouTube

[![ビデオが開けなかった場合に表示されるテキスト](https://qiita-image-store.s3.amazonaws.com/0/25728/e2b6149d-f939-1718-4703-299e28a0c154.png)](https://www.youtube.com/watch?v=gDlhPaOlL18)

* https://www.youtube.com/watch?v=gDlhPaOlL18

## 全オプション

```bash:
docker run \
 -it \
 --rm \
\
 --net=host \
 -v /etc/localtime:/etc/localtime:ro \
\
 -e DISPLAY \
 -v ~/.Xauthority:/root/.Xauthority \
\
 -e PULSE_SERVER=tcp:$(hostname -i):4713 \
\
 --privileged \
 -v /var/lib/dbus:/var/lib/dbus \
\
 private/games
```

多分 `--device=/dev/input/js0:/dev/input/js0` でジョイスティック使える。

## 以下指定したら体感3倍早くなった。

```bash:
 --privileged \
 -v /var/lib/dbus:/var/lib/dbus \
```

## 感想

ホストで動かした時のほうが早いが、ホストが十分早ければそこまで問題ないと思います。
git: 特定のディレクトリだけあるバージョンに戻したい

push済みの特定のディレクトリだけあるバージョンに戻す方法です。gitの技で戻せる方法があるのでしょうが、愚直なやり方です。

あるバージョンにリセットする。全体がリセットされる。

```
git reset <version>
```

特定のディレクトリを退避する。

```
cp -R target-dir ~/Desktop/target-dir
```

全体のバージョンを元に戻す。

```
git pull
```

特定のディレクトリも最新に戻るので削除する。

```
rm -rf target-dir
```

退避したディレクトリを持ってくる。

```
cp -R ~/Desktop/target-dir .
```
PulseAudioで他の端末から音を出す

ubuntu 15.04

## 参考

* [PulseAudio/Examples - ArchWiki](https://wiki.archlinux.org/index.php/PulseAudio/Examples)
* [docker-chrome-pulseaudio/Dockerfile at master · jlund/docker-chrome-pulseaudio · GitHub](https://github.com/jlund/docker-chrome-pulseaudio/blob/master/Dockerfile)
* [ezmac/google-chrome Repository | Docker Hub Registry - Repositories of Docker Images](https://registry.hub.docker.com/u/ezmac/google-chrome/)

## 設定

```bash:PulseAudioインストール
apt-get install -y pulseaudio
```

```diff:/etc/pulse/default.pa
- #load-module module-native-protocol-tcp
+ load-module module-native-protocol-tcp auth-ip-acl=127.0.0.0/8
```

これで 127.0.0.0/8 からのアクセスはcookie認証なしでできる。

```bash:再起動
pulseaudio --kill
pulseaudio --start
```

この端末自身で音が出ることを確認。
(もし`alsamixer` にてS/PDIFが`MM`になっていたら解除。)


## 音を出したい端末の設定

127.0.1.1 が pulseaudio

```bash:環境変数をセット
PULSE_SERVER=tcp:127.0.1.1:4713
```

(4713ポートでない場合は`nestat -anp | grep pulseaudio`でLISTENポートを確認。)

```bash:音を鳴らす
mplayer a.mp3
```
ES6 で書く環境を作る（WebStorm + Babel 編）


**[2015/05/22追記]**
WebStorm でなく gulp のタスクで Babel を動かす方法はこちらに書きました。
⇒ [ES6 で書く環境を作る（gulp + Babel 編）](http://qiita.com/hkusu/items/9b312274b3ff2913e15b)

---

この辺りの環境は、移り変わりが激しいので、現時点(2015/5/22)の参考ということで。書いた ES6 のスクリプトをどの環境でも動かせるよう、[Babel](https://babeljs.io) で ES5 へ変換することとします。

### 前提環境

> OS：`Mac OS X 10.9.5`
> Bable：`5.4.7`
> WebStorm：`10.0.2`
> npm：`2.7.5`

## 手順

といっても、WebStorm のバージョン 10 系なら簡単だった。

![スクリーンショット 2015-05-22 11.43.43.png](https://qiita-image-store.s3.amazonaws.com/0/35733/898eecba-7ffe-fba3-9b7d-10852f2d3d0a.png "スクリーンショット 2015-05-22 11.43.43.png")

ただ WebStorm を使うといえど、トランスパイラ（今回は Babel）は別途、必要なので、次のように `npm` で手元の環境へ導入しておきます。

```shell:
$ npm install -g babel
```

バージョンを確認してみます。

```shell:
$ babel --version

5.4.7
```

WebStorm で適当なプロジェクトを作成し、拡張子を `.es6` としてファイルを作成します。

![スクリーンショット 2015-05-22 15.00.32.png](https://qiita-image-store.s3.amazonaws.com/0/35733/9f87d7f1-e02e-945a-818c-e089ef22507b.png "スクリーンショット 2015-05-22 15.00.32.png")

すかさず `watcher` に追加するかい？というメッセージが表示されるので、今回は Babel の方の `Add watcher` リンクを追加します。

![スクリーンショット 2015-05-22 15.00.46.png](https://qiita-image-store.s3.amazonaws.com/0/35733/56929810-5055-c112-e5b7-6f231e2e0c5b.png "スクリーンショット 2015-05-22 15.00.46.png")

私の場合は `File Type` を次のように変更するだけでした。[OK]ボタンを押下します。

![スクリーンショット_2015-05-22_15_01_25.png](https://qiita-image-store.s3.amazonaws.com/0/35733/9e33cbf8-848d-0437-385d-e34b09cdba21.png "スクリーンショット_2015-05-22_15_01_25.png")

あとは次のように ES6 の記法でスクリプトを書くと、

![スクリーンショット 2015-05-22 15.12.06.png](https://qiita-image-store.s3.amazonaws.com/0/35733/53034b1b-7aea-72f4-b12e-ab16d1489313.png "スクリーンショット 2015-05-22 15.12.06.png")

自動的に ES5 へ変換後のファイルおよびソースマップが作成されます。

![スクリーンショット_2015-05-22_15_12_34.png](https://qiita-image-store.s3.amazonaws.com/0/35733/ec046e06-8cb2-f556-9438-ad109ea9c697.png "スクリーンショット_2015-05-22_15_12_34.png")

ブラウザで動作確認してもいいのですが、`console.log` 程度なら次のようにコマンドでも確認できます。

![スクリーンショット 2015-05-22 15.12.57.png](https://qiita-image-store.s3.amazonaws.com/0/35733/bc07268b-8fd9-316f-e4eb-1964b3a8053c.png "スクリーンショット 2015-05-22 15.12.57.png")

〜 以上 〜
キャッシュ対策 [自分用メモ]


自分用のメモです。
http://doop-web.com/blog/archives/1182

このままでは動かなかったので以下のように修正して使っています。

CSSやJSファイルのタイムスタンプを利用してパラメーターを生成して、呼び出し先のURLにパラメーターを追加する。

ファイルを更新するとタイムスタンプが変わり呼び出しのURLについたパラメーターが変更されるので、キャッシュが使われなくなる。

```php
function cacheBuster($filename) {
 if (file_exists($filename)) {
  echo date('YmdHis', filemtime($filename));
 } else {
  echo 'file not found';
 }
}
```

```html
<link rel="stylesheet" href="/css/stylesheet.css?date=<? cacheBuster(dirname(__FILE__).'/css/stylesheet.css'); ?>">
```

設定しておくと、とても便利なのでオススメです。
AngularJS で全角から半角に変換する Directive を追加する


以前作った JavaScript で Form の value に全角で入力された値を半角へ変換する関数を、AngularJS の Directive に書き換えてみた

# JavaScript バージョン

```html:inputタグ
<input name="phone" type="text" placeholder="09012345678" onchange="zen2han(this)">
```
```js:zen2han.js
function zen2han(obj){
  // 文字列かチェック
  if(typeof(obj.value)!="string") return false;
  var word = obj.value;

  obj.value = word.replace(/[！＂＃＄％＆＇（）＊＋，－．／０-９：；＜＝＞？＠Ａ-Ｚ［＼］＾＿｀ａ-ｚ｛｜｝～]/g, function(s) {
      return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);    
  })
}
```

[デモ](http://jsfiddle.net/yutackall/2op1hLvx/7/)

# AngularJS Directive バージョン
```html:inputタグ(ng-model無)
<input name="phone" type="text" placeholder="09012345678" convert-mb-to-ascii >
```
```html:inputタグ(ng-model有)
<input name="phone" type="text" placeholder="09012345678" ng-model="phone" convert-mb-to-ascii >
```
```js:app.js
angular
    .module('MyApp', [])
    // 英数字記号の全角文字を半角へ変換
    .directive('convertMbToAscii', function () {
        return {
            restrict: 'A',
            require: '?ngModel',
            link: function (scope, element, attrs, ngModel) {
                element.on('change', function(){
                    if(typeof(this.value)!="string") return false;
                    var word = this.value;
                    word = word.replace(/[！＂＃＄％＆＇（）＊＋，－．／０-９：；＜＝＞？＠Ａ-Ｚ［＼］＾＿｀ａ-ｚ｛｜｝～]/g, function(s) {
                        return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);    
                    });
                    // ng-model への反映(これがないとフォームの値だけ更新され、ng-modelの値は更新されない)
                    if (ngModel != null) {
                        scope.$apply(function() {
                            ngModel.$setViewValue(word);
                        });
                    }
                    this.value = word;
                });
            }
        };
    })

```

[デモ](http://jsfiddle.net/yutackall/acbeqe3o/11/)


require を `ngModel` としてしまうと、下記のエラーが発生してしまうが、
必要ないので `?ngModel` にして、発生しないようにしてます。
更に、同じタグに `ng-model` があった場合には、フォームの値だけでなく、ng-model の値も
更新するようにしてます。

```
Error: [$compile:ctreq] Controller 'ngModel', required by directive 'convertMbToAscii', can't be found!
```

参考
[AngularJS Directive なんてこわくない（その４）](http://angularjsninja.com/blog/2013/11/29/angularjs-custom-directives/)

ついでに逆バージョンも用意してみました
[AngularJS で半角から全角に変換する Directive を追加する](http://qiita.com/yutackall/items/24a1444bb1beeb3fbd83)
Rails + RDS（MySQL）でよくある文字化け事件

## モデルの生成

たとえば user モデルを作るとします。
すると同時にマイグレーションファイルも生成されますが、これが「ローカルでは動くけどステージング（RDS）では動かない」という事件を引き起こしてくれます。

```bash
$ rails g model user name:string email:string
```

```rb:xxxx_create_users.rb
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.string :email

      t.timestamps
    end
  end
end
```

## ローカルでは動くけどステージング（RDS）では動かない

ローカルでは同梱の SQLite3、もしくはそれ用にインストールした MySQL を利用すると思います。
そのローカルで十分検証したのち、ステージング（DB の向け先が RDS の）環境にデプロイすると、周りから「日本語が文字化けしています。調査をお願いします。」という連絡がきます。

## 原因は RDS（MySQL）の文字コード

RDS（MySQL）の文字コードはデフォルトでは latin1 が使用されるようになっています。
そのため、先ほどのマイグレーションファイルをそのまま適用すると latin1 でカラムが作られてしまって、日本語が扱えないという事件が起こってしまいます。

```bash
$ mysql -u xxx -pYYY -h zzz.rds.amazonaws.com
mysql> show create table users \G
 〜 中略 〜
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
```


## 対策１：RDS の設定を変更する

AWS コンソールから `RDS ->Parameter Groups` といって、下記のパラメータを ***utf8*** に修正しましょう。

- character_set_client
- character_set_connection
- character_set_database
- character_set_results
- character_set_server


## 対策２：マイグレーションファイルで charset を指定する

マイグレーションファイルの `options` で charset を指定します。

```rb:xxxx_create_users.rb
class CreateUsers < ActiveRecord::Migration
  def change
    create_table(:users, :options => 'ENGINE=InnoDB DEFAULT CHARSET=utf8') do |t|  # <--「utf8」を指定
      t.string :name
      t.string :email

      t.timestamps
    end
  end
end
```

## 付け足し

対策１／対策２ともに、対応前に生成されたテーブルは latin1 のままなので、`drop ->create` で作り直すか、`alter table <テーブル名> convert to charcter set utf8` で変更するような対応が必要になります。


## まとめ

どちらの対応でも問題ないですが、場合によってはインフラを変更できないようなプロジェクトも存在すると思うので、MySQL を利用する際は **対策２** の対応を取るような癖をつけておけば良いと思います。
MySQLでToo many connectionsが出た時の対応

MySQLでToo many connectionsが出た時にチェックする項目の整理

## MySQL側で見る事
どのMySQLサーバーで起きているか分かっている時にはそのサーバーにログインして確認する。
### 設定値の確認
MySQLにログインしてmax connectionsの確認をする

```sql
mysql> show variables like "%max_connections%";
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 1000  |
+-----------------+-------+
1 row in set (0.00 sec)
```
my.cnfの設定の確認ではなく実際にサーバーにログインして確認する。設定が反映されていない可能性があるので。

### 現状のコネクション数の確認
processlistの確認。

```sql
mysql> show processlist;

(ずらーっと現状の接続プロセスが出る)
```

ここで出てくるプロセスの数がmax_connectionsと同じだったらToo many connectionsが発生する。
processlistには接続元のHost情報や実行しているクエリの情報が出るのでその情報を元に犯人を特定する。

## クライアント(Webサーバー)で見る事
どのMySQLサーバーで起きているか分からない時には、クライアントでまずはサーバーの特定をする。
### MySQL(3306ポート)への接続数確認
MySQLに接続しているクライアントサーバー上で以下を実行。

```sh
netstat -anp | grep 3306
```

これで3306に繫いでいる接続の数がMySQLのmax connectionsよりも多ければ、Too many connectionsが発生する。
クライアントが複数の場合には、それぞれの接続数の和がmax connectionsよりも多くなってはいけない。

### 各アプリケーションの接続数、接続方法確認
アプリケーションでconnections数の設定や、コネクションプーリングしているかどうかの設定が書かれているのでそこを確認する。

## 対応方法
### max connectionsを広げる
max connectionsはオンラインで変更可能なので、mysqlにログインして以下を実行

```sql
mysql> set global max_connections = XXXX;
```

あまり上げすぎるとメモリを食うので、必要な分だけ上げる。
必要な分は前述のクライアントの状況を確認すれば分かる。

RDSの場合にはparameterグループを修正する。修正後自動的に反映される。

### クライアント側で調整
mysqlのmax connectionsを広げられない場合には、クライアントの設定でconnection数を減らすようにする。

Railsの場合、connection数が5でもModel毎にestablish_connectionしていると、connection数 x process数になってしまうので注意。
UINavigationControllerでPUSH/POPするときに表示される影を消す

![7Mhro.png](https://qiita-image-store.s3.amazonaws.com/0/32832/08e34c6c-0cc6-3397-8f29-0c57ca37966c.png)

```objc
@implementation CALayer (SLB)

+ (void)load
{
    SEL originalSelector = @selector(addAnimation:forKey:);
    SEL overrideSelector = @selector(slb_addAnimation:forKey:);
    Method originalMethod = class_getInstanceMethod(self, originalSelector);
    Method overrideMethod = class_getInstanceMethod(self, overrideSelector);
    
    method_exchangeImplementations(originalMethod, overrideMethod);
}

- (void)slb_addAnimation:(CAAnimation *)anim forKey:(NSString *)key {
    UIView *view = [self delegate];
    if ([NSStringFromClass([view class]) hasSuffix:@"DimmingView"]) {
        view.hidden = YES;
    }
    
    [self slb_addAnimation:anim forKey:key];
}

@end
```

CALayerのカテゴリクラスで**addAnimation:forKey:**をオーバーライドすることで実現することができます。

クラスメソッドの**load**では**addAnimation:forKey:**をオーバーライドするための準備です。
**addAnimation:forKey:**をそのままオーバーライドしようとすると、*category is implementing a method which will also be implemented*という警告がでるのでその対応です。ここでは**slb_addAnimation:forKey:**という名前にしてます。

**slb_addAnimation:forKey:**では、影を表示しているViewをHiddenにしているだけです。
この影を出しているのは[**_UIParallaxDimmingView**](https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/UIKit.framework/_UIParallaxDimmingView.h)というクラスなのでこれをHiddenにしています。


POPするときの影はappearanceで消すことができます。

```objc
[[UIImageView appearanceWhenContainedIn:NSClassFromString(@"_UIParallaxDimmingView"), nil] setHidden:YES];
```
fbAsyncInit() が読み込まれない【FacebookAPI】 

FacebookSDK等を使う際にwindow.fbAsyncInitがいつまでたっても読み込まれない場合があります。

```
  (function(d, s, id){
     var js, fjs = d.getElementsByTagName(s)[0];
     if (d.getElementById(id)) {return;}
     js = d.createElement(s); js.id = id;
     js.src = "//connect.facebook.net/en_US/sdk.js";
     fjs.parentNode.insertBefore(js, fjs);
   }(document, 'script', 'facebook-jssdk'));
```

これの読み込みをすべてのJSの最後にしっかり配置してあげて下さい。
SDK読み出しが始まる前にfbAsyncInitが定義されてないとダメなので。
Elasticsearch&kuromoji で、kuromoji_part_of_speechを設定するときの注意

https://medium.com/hello-elasticsearch/elasticsearch-833a0704e44b
> TokenFilter : kuromoji_part_of_speech
> このフィルターは指定された品詞を除外するためのフィルターです。
> 
> NOTE:
> デフォルトは、lucene-analyzer-kuromoji.jar に含まれる stoptags.txt に設定されている品詞が除外されます。※ 特殊な場合をのぞいてデフォルトのままで良さそうです。
> 個別に設定するには、次のようにします。
> 
> # 設定サンプル： 助詞-格助詞-一般、助詞-終助詞 を除外
> index:
>     analysis:
>         filter:
>             pos_filter:
>             type: kuromoji_part_of_speech
>             stoptags: [助詞-格助詞-一般, 助詞-終助詞]
>         tokenizer:
>             ja_tokenizer:
>                 type: kuromoji_tokenizer
>                 mode: search
>         analyzer:
>             ja:
>                 type: custom
>                 tokenizer: ja_tokenizer
>                 filter: [pos_filter]

という記述を見て、サンプルコードそのまま「stoptags: [助詞-格助詞-一般, 助詞-終助詞]」を設定してしまった人居ませんか？（自社のプロジェクトで居ました）。こうするとデフォルトの除外品詞の設定を上書きしてしまうため、検索結果に微妙なテキストが混入する可能性があります。

今回は、「だ」で検索するとなぜか「だ」を含まずに「な」を含むテキストがヒットしたため判明しました。
用言の活用を終止形に直して格納するフィルタも同時にセットしてあったため、「な」が、助動詞「だ」の連体形「な」として解釈され、インデックスに格納されていたのが原因だったようです。

本来デフォルトのままでよかったところを、「個別に設定する」ためのサンプルを使ってしまったということで。
結論としてはよく読めと。
[メモ] ステータスバーのサイズ

# メモ
書いた投稿せずに何ヶ月も置いていたので、記載内容の信憑性は定かではありませんが実機でテストした結果だったと思います。
ご参考程度にどうぞ。

# 確認用コード

```objc:
CGRect statusBarViewRect = [[UIApplication sharedApplication] statusBarFrame];
NSLog(@"h:%f", statusBarViewRect.size.height);
NSLog(@"w:%f", statusBarViewRect.size.width);
```

# iOS7(iPhone4Sで検出)

端末向き縦の場合
　h:20.000000
　w:320.000000

端末向き横の場合
　h:480.000000
　w:20.000000

iOS7では端末の向きに関わらず、端末ホームボタンが下向きにある状態で見た向きが縦であるため注意が必要。

# iOS8(iPhone6で検出)

端末向き縦の場合
　h:20.000000
　w:375.000000

端末向き横の場合
　h:0
　w:0

iOS8、あるいはiPhone6では端末の向きが横の場合にステータスバーは表示されない。
「未経験者OK！」のコードは通るんです。そう、Groovyならね。

[こちらの求人](https://www.wantedly.com/projects/18894)(画像が差し代わってたので[魚拓](https://archive.is/zDn3Q))のコードが一部で話題になっていますが、Groovyなら(1行足すだけで)コンパイルエラーを出さずに正常終了させる事ができます。

* Groovyは末尾のセミコロンは不要なので「String company = "~~"」の宣言もOK
* metaClassを使ってInteger#parseIntを常に0を返すように書き換える

```groovy
Integer.metaClass.static.parseInt = { String val -> 0 }

String company = "未経験者、中途者の熱意"
int i = Integer.parseInt(company);
while(true) {
    if( i == 0 ) {
        break;
    }
    System.out.println("笑顔");
}
```

とはいえこのコードの意味するところが全く分からない事に変わりはありませんが…w

### (追記)
上記のコードだと「笑顔」が出力されないので、さらに1行足して"笑顔"が出力されるようにしました。

* Integer#parseIntは文字の長さを返すように書き換える
* System.out.printlnを書き換えて、iをデクリメントするように書き換える
    * (本当は"=="をフックしたかったのですが、metaClassではうまく行きませんでした…悔しいっ) 

```groovy
Integer.metaClass.static.parseInt = { String val -> val.length() }

String company = "未経験者、中途者の熱意"
int i = Integer.parseInt(company);

System.out.metaClass.static.println = { String x -> i--; println x }

while(true) {
    if( i == 0 ) {
        break;
    }
    System.out.println("笑顔");
}
```
```text:結果
笑顔
笑顔
笑顔
笑顔
笑顔
笑顔
笑顔
笑顔
笑顔
笑顔
笑顔
```
笑顔あふれる職場になりました！
GPG error: 〜 the public key is not available: NO_PUBKEY の対処

/etc/apt/sources.list.d/〜.list
を編集して`apt-get update`をすると以下エラーが出ることがある。

> W: GPG error: http://〜 vivid Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY KEY 18DAAE7AECA3745F

## 対処

参考: [[SOLVED] 14.04: GPG error “NO_PUBKEY”](http://ubuntuforums.org/showthread.php?t=2257304)

```bash:
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys キー
```

今回の例ではキーが 18DAAE7AECA3745F になっているので、


```bash:
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 18DAAE7AECA3745F
```

再度 `apt-get update` してエラーが出ないことを確認。
スレッド(thread)

*個人的な授業のメモです*

swiftで`スレッド`のはなしがでてきたから、この機会にスレッドについてまとめたいと思う。

##スレッドとは
####　ソフトウェアやプログラミングなどの分野で、`並列処理`に対応したOS上でのプログラムの`最小の実行単位`のこと。`連続した処理の流れ`のことで、一つのプログラムが単一の処理の流れで実行されることを`「シングルスレッド」`（single threading）、複数のスレッドを同時に実行して並列に処理を進めることを`「マルチスレッド」`（multithreading）という。

※電子掲示板などで、一つの話題に属する複数の発言や記事をまとめたものをスレッドと呼ぶことがある。まさに、2ちゃんの「スレ」だ。


#### プロセス(一連の処理)を細かな単位で区切って、並列に処理をする。
![スレッド](http://i.imgur.com/06vgWC6.png)

### なんでスレッドにするの？
① メモリ空間の共有がしやすい
② プロセスの中で複数の制御を同時実行
③ マルチプロセッサでは並列実行も可能
④ 排他制御、スレッド間メモリ保護はプログラマお任せ
VMware製品へのVENOM脆弱性の影響情報

## 概要

VMware社からナレッジ「[VMware KB: VMware products not affected by CVE-2015-3456, aka VENOM(2117469)](http://kb.vmware.com/kb/2117469)」が発行されており、脆弱性のみつかったコードはVMware製品では使われていないとしている。

## 詳細

VMware製品への影響や対策は、[ナレッジベース](http://kb.vmware.com/)および[セキュリティアドバイザリ](https://www.vmware.com/security/advisories/)で確認する。以下に確認できた範囲で情報をまとめる。

### 背景

2015年5月13日に、National Vulnerbility Databaseに[CVE-2015-3456](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-3456)が登録されている。この問題は、「VENOM」の通称でも情報が広まっている。

### VMware社からの発信情報

VENOM脆弱性のVMware製品への影響については、VMware社から(1)調査結果のナレッジが出されている。

1. [VMware KB: VMware products not affected by CVE-2015-3456, aka VENOM(2117469)](http://kb.vmware.com/kb/2117469)

2015年5月22日時点で、関連するセキュリティアドバイザリは発行されていない。ナレッジからは影響なしとの判断になるので、発行されないと思われる。

### 関連ナレッジの和訳

現在のところ、関連ナレッジの和訳はない。

### 対策

特別なアクションは必要ないと思われる。ナレッジでは、以下のように説明している。

> VMware products are not vulnerable to CVE-2015-3456. VMware product security has reviewed CVE-2015-3456 and has concluded that the vulnerable code is not used in VMware products.

以下に私訳を乗せる。

> VMware製品はCVE-2015-3456の脆弱性を含まない。VMware製品セキュリティはCVE-2015-3456をレビューし、この脆弱性のあるコードがVMware製品では使われていないと結論した。

## 参照

本脆弱性の内容。

* [NVD - Vulnerability Summary for CVE-2015-3456](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-3456) 
* [QEMU 脆弱性 ”VENOM” について (CVE-2015-3456) — | サイオス OSS よろずブログ](http://oss.sios.com/yorozu-blog/CVE-2015-3456)

VMware社からの発信情報。

* [VMware KB: VMware products not affected by CVE-2015-3456, aka VENOM(2117469)](http://kb.vmware.com/kb/2117469)

VMware社のナレッジやセキュリティアドバイスは、随時更新されるので、適宜、原文を確認されたい。

----

本ページ内容は筆者が参照の便のためにある持点でまとめた個人的なメモです。内容を保証するものではなく、また筆者の所属組織等とは一切かかわりがありません。
色指定の小数値・10進値・16進値の変換早見表

RGBやHSVで色指定をするとき、場合によって小数だったり10進数だったり16進数だったりして都度計算し直すのが面倒なので、よく使う値を表にしてみました。

| 小数 | 10進値 | 16進値
| ---:| ---:| ---:|
|   0.0 |  0 |  0 |
|   0.1 | 26 | 1A |
| 0.125 | 32 | 20 |
|   0.2 | 51 | 33 |
|  0.25 | 64 | 40 |
|   0.3 | 77 | 4D |
| 0.376 | 96 | 60 |
|   0.4 | 102 | 66 |
|   0.5 | 128 | 80 |
|   0.6 | 153 | 99 |
| 0.627 | 160 | A0 |
|   0.7 | 179 | B3 |
| 0.753 | 192 | C0 |
|   0.8 | 204 | CC |
| 0.878 | 224 | E0 |
|   0.9 | 230 | E6 |
|   1.0 | 255 | FF |
ofxKinectでとりあえず表示メモ

```cpp:ofApp.h
    ofxKinect kinect;
    ofImage kinectImage; // キネクトの映像しまう
    ofImage depthImage;  // 深度画像
```


```cpp:ofApp.cpp

void ofApp::setup(){
    // kinect初期化
    kinect.init();
    kinect.open();

}

//--------------------------------------------------------------
void ofApp::update(){
    
    kinect.update();

}

//--------------------------------------------------------------
void ofApp::draw(){
    
    // Kinect映像
    kinect.draw(0, 0, kinect.width, kinect.height);
    
    
    // Kinect深度映像
    kinect.drawDepth(kinect.width, 0, kinect.width, kinect.height);

}
```
Rustをインストールしたらlibrustc_driverが無いと言われた時


Rustをインストールしようとしてうまく行かなかったので共有です。
Vagrant上で動いてるCentOS6.4です。

```bash
$ cat /etc/redhat-release
CentOS release 6.4 (Final)
```

↓こんな感じでインストールできるよ〜って書いてありますが

```bash
$ curl -sSf https://static.rust-lang.org/rustup.sh | sudo sh
```

終わって確認すると


```bash
$ rustc --version
rustc: error while loading shared libraries: librustc_driver-4e7c5e5c.so: cannot open shared object file: No such file or directory
```

こう言われたので.bashrcに

```~/.bashrc
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib
```

を一行追加してやったら

```bash
$ rustc --version
rustc 1.0.0 (a59de37e9 2015-05-13) (built 2015-05-14)
```

できました！
Test::Nginxでnginxモジュールのテストを自動化する

# Test::Nginx

[Test::Nginx](http://search.cpan.org/~agent/Test-Nginx-0.24/lib/Test/Nginx.pm)は[ngx_lua](https://github.com/openresty/lua-nginx-module)や[OpenResty](http://openresty.org/)のメンテナでおなじみのagentzh氏による`nginx.conf`の動作をテストするためのCPANモジュールです。


[先日のエントリ](http://qiita.com/cubicdaiya/items/09023ca6ed056d3d1ed2)で紹介した[ngx_dynamic_upstream](https://github.com/cubicdaiya/ngx_dynamic_upstream)のテストで使ってみているのでそれを元に解説します。

## Test::Nginxをインストールする

ここでは`cpanm`でインストールします。

```
cpanm Test::Nginx
```

また、テストの実行を楽にするために`App::Prove`もインストールします。

```
cpanm App::Prove
```

## Test::Nginx用のテストを書く

[ngx_dynamic_upstream](https://github.com/cubicdaiya/ngx_dynamic_upstream)でアップストリームの一覧を取得するテストを書いてみます。

```perl:t/list.t
use lib 'lib';
use Test::Nginx::Socket;
 
#repeat_each(2);
 
plan tests => repeat_each() * 2 * blocks();
 
run_tests();
 
__DATA__
 
=== TEST 1: list
--- http_config
    upstream backends {
        zone zone_for_backends 128k;
        server 127.0.0.1:6001;
        server 127.0.0.1:6002;
        server 127.0.0.1:6003;
    }
--- config
    location /dynamic {
        dynamic_upstream;
    }
--- request
    GET /dynamic?upstream=zone_for_backends
--- response_body
127.0.0.1:6001;
127.0.0.1:6002;
127.0.0.1:6003;
```

テストコードもPerlで記述しますが、上記のテストコードを見ればわかるようにPerlに詳しくなくても非常に簡単で直感的なテストコードを書くことができます。この例ではレスポンスボディのみをチェックしていますが、下記のようにステータスコードをチェックすることもできます。

```perl
=== TEST 3: not found upstream
--- http_config
    upstream backends {
        zone zone_for_backends 128k;
        server 127.0.0.1:6001;
        server 127.0.0.1:6002;
        server 127.0.0.1:6003;
    }
--- config
    location /dynamic {
        dynamic_upstream;
    }
--- request
    GET /dynamic?upstream=not_found
--- response_body_like: 400 Bad Request
--- error_code: 400
```

以下は[ngx_dynamic_upstream](https://github.com/cubicdaiya/ngx_dynamic_upstream)の全テストを`prove`で実行している様子です。

```
$ cd ngx_dynamic_upstream
$ prove t
t/00-list.t .......... ok
t/01-update-param.t .. ok
t/02-down.t .......... ok
t/03-add.t ........... ok
t/04-remove.t ........ ok
All tests successful.
Files=5, Tests=28,  5 wallclock secs ( 0.04 usr  0.02 sys +  0.91 cusr  0.44 csys =  1.41 CPU)
Result: PASS
$
```

# まとめ

`nginx.conf`の動作をテストするためのCPANモジュールである[Test::Nginx](http://search.cpan.org/~agent/Test-Nginx-0.24/lib/Test/Nginx.pm)について解説しました。

通常nginxのモジュールをテストしようとすると「HTTPリクエストを飛ばして、レスポンスのステータスやボディをチェックする」という非常に面倒な手順を踏むことになりますが、[Test::Nginx](http://search.cpan.org/~agent/Test-Nginx-0.24/lib/Test/Nginx.pm)を利用するとCLIだけでテストできてとても便利です。また、さっきも書いたようにPerlにさほど詳しくなくても簡単で直感的なテストコードを書けるというのがいいですね。
Androidで横向きか縦向きかを判定する

`<activity android:configChanges="orientation|screenSize">`を使って縦向き・横向きの変更をコード内で処理することができますが、Activity起動時など、`onConfigurationChanged`が呼ばれる前にどっち向きかを判定するには下記のコードを使います。

```java
int orientation = getResources().getConfiguration().orientation;

if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
  // 横向きの場合
}

if (orientation == Configuration.ORIENTATION_PORTRAIT) {
  // 縦向きの場合
}
```

実際には↑のように二つの`if`を使わずに`if`,`else`を使えば済むと思いますが、どちらを`if`に書くべきかは状況によるので念のため両方書いてます。
`orientation`は`int`なので、`switch`で分岐しても良いです。
APIを使用したNetAppストレージ管理

#はじめに
Data ONTAP(NetAppストレージOS)が提供するAPIを使用したストレージ管理方法について記載します。
今回はAPIを実行するためにNetApp Manageability SDK(NMSDK)を使用します。

APIの種類としては以下になります。

**7-Mode**
：7-Mode用のAPI
**Cluster mode**
：Clustered Data ONTAP用のAPI、SVM(vserver)の作成やaggrの操作などクラスタレベルのオブジェクトを操作をしたい場合に使用します。
**Vserver**
：volume作成やSnapshot作成などSVM(vserver)レベルのオブジェクトを操作したい場合に使用します。

#事前準備
1 NMSDKのダウンロード
[ここ](http://mysupport.netapp.com/NOW/cgi-bin/software?product=NetApp+Manageability+SDK&platform=All+Platforms)からダウンロード
※要アカウント

2 配置
使用したい言語のライブラリをサーバに配置

```
netapp-manageability-sdk-5.2\lib
* perl
* python
* ruby
* DotNet
* Java
* C
```

主に使用するライブラリは、NaServerとNaElementになります。
NaServerは、FASへの接続やAPIの実行などで使用します。
NaElementは、XMLパーサーでAPIの入出力を管理します。

#NMDSKの基本的な使い方
NMSDKを使用したAPIの処理の流れは、以下になります。
1. FASへの接続するためのNaServerインスタンスを作成
2. 実行したいAPIとその引数を指定してNaElementインスタンスを作成
3. NaElementインスタンスを引数にしてNaServerインスタンスからAPIを実行
4. 実行結果を確認

#使用例
Pythonを使用したサンプルが以下になります。

```py
import sys
import pickle
sys.path.append("./nmsdk")
from NaServer import *

storage = "Cluster mgmtのIPアドレス"
user = "ユーザ名"
password = "パスワード"

s = NaServer(storage, 1, 20)
s.set_admin_user(user, password)

api = NaElement('vserver-create') #vserver-create APIを指定
api.child_add_string('language','C');
xi1 = NaElement('name-server-switch');
api.child_add(xi1)

xi1.child_add_string('nsswitch','file')
api.child_add_string('root-volume','svm_root')
api.child_add_string('root-volume-aggregate','aggr10')
api.child_add_string('root-volume-security-style','unix')
api.child_add_string('vserver-name','demo_svm');

output = s.invoke_elem(api) #APIの実行
print(output.results_status()) #実行結果の確認
```

#便利なツール
NMSDKに含まれるzexplore.exeを使用するとC#,C,JAVA,Perl,Python,Rubyのコードを自動生成してくれます。
各種APIで必要な引数などの情報などを確認することができます。
使い方は簡単でAPIの種類とバージョンを指定したうえで、APIを右クリックして「Generate」するとコードが自動生成されます。
言語はPreferences-Languagesで指定できます。

![zexplore.png](https://qiita-image-store.s3.amazonaws.com/0/78184/72c7e75c-9f04-fc64-59b1-848134c33f47.png)
ComposerのupdateでCall to undefined method Illuminate\Foundation\Application::getCachedCompilePath()と出るときの対処

```
PHP Fatal error:  Call to undefined method Illuminate\Foundation\Application::getCachedCompilePath() in /Users/xxxxxxxx/vendor/laravel/framework/src/Illuminate/Foundation/Console/ClearCompiledCommand.php on line 28


                                                                                      
  [Symfony\Component\Debug\Exception\FatalErrorException]                             
  Call to undefined method Illuminate\Foundation\Application::getCachedCompilePath()  
                                                                                      
```

ここで親切な回答が。
[[SOLVED] Call to undefined method Illuminate\Foundation\Application::getCachedCompilePath() - Laravel.IO - The Official Laravel PHP Framework Community Portal](http://laravel.io/forum/03-24-2015-call-to-undefined-method-illuminatefoundationapplicationgetcachedcompilepath)

>Delete the vendor/compiled.php and run composer update again.

だそうです。


```
$ rm vendor/compiled.php 
```
やってみる。

```
$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Generating autoload files
Generating optimized class loader
```

動いた！
2015-05-22 c++ builder XE4, 10.2 Tokyo > fileIO > ファイル名を引数としてファイルサイズを取得

```txt:動作確認
C++ builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/09)
```

ローカルにおいているファイルの名前からファイルサイズを取得する方法を探していて、以下を見つけた。

[SO: Getting size of a file in Delphi 2010 or later?](http://stackoverflow.com/questions/1642220/getting-size-of-a-file-in-delphi-2010-or-later)
> there is a Windows way that doesn't involve FindFirst and all that jazz.

実際に実装したのは以下のコード

```cpp
#define ERR_SIZE (-1)
int getFileSize(String filename)
{
	TWin32FileAttributeData info;

	if (FileExists(filename) == false) {
		return ERR_SIZE ;
	}
	if (! GetFileAttributesExW(filename.c_str(),
		GetFileExInfoStandard,
		&info)) {
		return ERR_SIZE ;
	}
	return static_cast<int>(info.nFileSizeLow);
}
```

せいぜい数MBのサイズのチェックに使用する。大きなサイズの場合問題ないかは未確認。

FindFirstを使う方法もあるようだが、どちらがいいかは不明。
default_scopeとunscopedを使ってみた

ちょこっと調べてみると`default_scope`を使うことはあまりオススメしない記事が多い。実際、第三者からみたら思い描いている挙動と異なるので本当に意味のあるときしか使ってはいけないなと思いつつ使ってみた。

rails3系で実装しています。

ユーザーにstatus_idというカラムをもたせて、そのカラムで表示するかどうか「そのユーザーが申請されている途中なのか承認待ち状態なのか」などの条件分岐をするようにした。

modelに`default_scope { where(status_id: 0) }`を書いて状態が0のときのユーザーをとってくることを`default`にした。
コンソールで`モデル名.all`をたたいたらできてた！

ソースを書いていくうちに`status_id`が1と2とで場合分けして表示させたいと思った。しかし今`default_scope`がかかっているのでそもそも取ってこれない状態になっている。うーん。。。調べたら`unscoped`ってのがあった。しかもこれは部分的でもつけるらしい、素敵だ。

コンソールで`モデル名.unscoped.all`したら`default_scope`がかかっていない状態にできた！！と思ったら.....

もう使っていないユーザー(退会したユーザー)まで取ってきていた。ってことで
`where(deleted_at: nil)`をメソッドをつけることにした。モデルに
`scope :existing, -> { unscoped.where(:category => SALES) }`
を追加してコンソールたたいたら、、、、、上手くいかない。。。。。。

いろいろ調べてもよくわからなかったので仕方なくメソッドにした。

http://kotatu.org/blog/2014/10/11/why-should-use-scopes-over-class-methods/

http://ruby-rails.hatenadiary.com/entry/20140814/1407994568

```
def self.existing
 unscoped.where(deleted_at: nil)
end
```

できた。

rails4系のときはいけそうなのかな。。
http://techracho.bpsinc.jp/tsunekawa/2013_10_10/13553

わかったらまた書きます。
MacOS Xでcomposerを動かしたときdate_default_timezone_get():と出たときの対処法

MacOS Xでcomposerのアップデートをしようとした時、こんなエラーが出て困った。

```
$composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Removing sebastian/version (1.0.4)

  [RuntimeException]                                                                                                                                                                 
 date_default_timezone_get(): It is not safe to rely on the system's ti  
  mezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting  
   this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone.                   
   
update [--prefer-source] [--prefer-dist] [--dry-run] [--dev] [--no-dev] [--lock] [--no-plugins] [--no-custom-installers] [--no-autoloader] [--no-scripts] [--no-progress] [--with-dependencies] [-v|vv|vvv|--verbose] [-o|--optimize-autoloader] [--ignore-platform-reqs] [--prefer-stable] [--prefer-lowest] [packages1] ... [packagesN]                   
```


MacOS Xではphp.iniがたくさんあるので、どのphp.iniを使っているのか、調べる必要があります。


```
$php -i | grep 'Configuration File'
Configuration File (php.ini) Path => /usr/local/etc/php/5.5
Loaded Configuration File => /usr/local/etc/php/5.5/php.ini
```

こうすると、phpiniがどこにあるか教えてくれる。

```
$sudo vi /usr/local/etc/php/5.5/php.ini
```

として、編集してあげればOK。
Open vSwitchで作ったブリッジをVLANインターフェースにする

なんでそんな事になってしまったのかというと、Linux BondingとOVS Bridgeをホスト上で混在させると（OVS BridgeにLinux Bondingを差したりとか）、Linux Bondingが上がらなかったりとかなんとも不安定な動作をするようになってしまい、調べてみたらその構成はおすすめしないということだったので、Linux BondingをOVS Bondingに変えようとしたのだが、そのLinux BondingはVLANインターフェースだったのである。OVS BondingがVLANタグを認識せねばならない。（ ＾ω＾ ）どうしてこうなった！？今や我々はブリッジをVLANインターフェースにせねばならない。

殺伐としたスレにfake bridgeが！

```bash
ovs-vsctl add-br br-bond0
ovs-vsctl add-bond bond0 em1 em2
ovs-vsctl add-br br-bond0.1024 br-bond0 1024
```

最後のがfake bride。ブリッジの中にVLANをしゃべれるブリッジをPortという形で作成できる。何を言っているのか分からないと思うが。

```
$ ovs-vsctl show
Bridge "br-bond0"
    Port "br-bond0.1024"
        tag: 1024
        Interface "br-bond0.1024"
            type: internal
    Port "br-bond0"
        Interface "br-bond0"
            type: internal
    Port "bond0"
        Interface "em2"
        Interface "em1"
```

br-bond0.1024の設定をする。

```
$ cat /etc/network/interfaces
auto br-bond0.1024
iface br-bond0.1024 inet static
        address <hoge>
        netmask <hoge>
        gateway <hoge>
        network <hoge>
        dns-nameservers <hoge> <hoge>
        vlan_raw_device br-bond0

auto em1
iface em1 inet manual

auto em2
iface em2 inet manual
```

rebootする。
gitがわからなくても直ぐ出来るHerokuへのデプロイ。

Webアプリケーションなんかを作った時に、さぁいざデプロイ。
というのが結構初心者には敷居が高い。
gitを使ってコマンドを打つわけだけどなんだかんだで、わからない箇所をググるのは時間の無駄。

ガンガンプログラム書き続けるモチベーションを保つためには、
やっぱり最初は簡単に出来る方がいいに決まってる。

ということでgitを使わないアプリのデプロイ方法。
今回はPythonを使った場合です。

通常のgitを使ったデプロイ方法としては、

```
$ heroku login
$ cd アプリプロジェクトファイル/
$ git init
$ heroku git:remote -a アプリ名
$ git add .
$ git commit -am "make it better"
$ git push heroku master
```

という感じ。ただエラー吐かれたりすると、原因をググる時間がもったいない。

Herokuは現在Dropboxからデプロイできます。

Herokuダッシュボードの右上の　＋　ボタンで新規アプリを制作。
![alt](http://www.in-ga.net/qiita/01.jpg)

任意の名称をつけます。Heroku全体で使われていない名前であることが必須。
![alt](http://www.in-ga.net/qiita/02.jpg)

アプリができたらDropBoxのアイコンをクリック。
![alt](http://www.in-ga.net/qiita/03.jpg)

これでDropbox/アプリ/Heroku/アプリ名　のフォルダの中に投げるだけ。
![alt](http://www.in-ga.net/qiita/04.jpg)

Pythonでやる場合にちょっとハマりそうになるのが、ファイルの置き方。
![alt](http://www.in-ga.net/qiita/05.jpg)

上記のように置きます。これで万全なはず。
依存モジュールはpip freezeでrequirements.txtに書き出し。
runtime.txtの中身はPythonバージョンを明記。
Procfileの中身はbottleであればメインのpyファイルを指定。

```
web: python index.py
```

のようになります。

ここまで準備出来たらHerokuのデプロイボタンを押すだけ。簡単！
コストエクスプローラーで課金をチェック

はじめに
---

個人用を取得したので会社用の AWS アカウントのリソースを整理して定常的な課金が発生しないようにしたいと思いました。もちろんアカウント自体を閉じてしまう、というのも出来ますがこのアカウントは今では大変レア？な [EC2-Classic](http://aws.typepad.com/aws_japan/2013/03/amazon-ec2-update-virtual-private-clouds-for-everyone.html) 環境のアカウントなので一応取っておこうかなと。

消せども消せども
---
リソースを綺麗に消したつもりでしたがビミョーな課金が発生します。
...タグ付けをちゃんとやって来なかったツケです。

これをコストエクスプローラーで見てみます。
おなじみのマネジメントコンソールを開きます。右上の[請求とコスト管理]をクリック。

![右上に注目](https://www.evernote.com/l/ABFzRB9-iPJFyaWDA1xrxMmlq79X0FIzJ10B/image.png)

すると、課金についてのダッシュボード画面に移行します。
これでも何となく EC2 の課金が占めてるなぁというのは判ると思いますが、もうちょい詳しく見ます。

![コスト画面](https://www.evernote.com/l/ABFKSoQEJlxAeY5BXe5haJIFeZ1HdnIftckB/image.png)

画面左側のメニューバーにある[コストエクスプローラー]をクリックすると、右側に[コストエクスプローラーを起動]というリンクがあるのでこれをクリックします。コストエクスプローラーの起動までちょい待ち。

![コストエクスプローラー起動](https://www.evernote.com/l/ABFQN3JgfcdPW6VR2aZwLh2O-S3r2ujaRjAB/image.png)

表示期間をプルダウンメニューで選べます。デフォルトは Monthly (月ごと) で３ヶ月単位だけど Daily (日ごと)で7日間表示に切り替えてみます。

![コストエクスプローラー画面](https://www.evernote.com/l/ABGzD2p8DDJEeaCmYbteRkp7duaiFW2dwYUB/image.png)

結構課金は減っているけど、まだ何か課金されている様子。意図的にリソースを残しているS3, Route53以外全部 EC2 の課金。タグを付けてないので力技で各リージョンのEC2コンソールを覗いてみました。よく考えると[Trusted Advisor](https://aws.amazon.com/jp/premiumsupport/trustedadvisor/) 使うという手もあったかも。

![コストエクスプローラー日次画面](https://www.evernote.com/l/ABFSIomc8zhIFKqoB8Jl21G1rH9XM9io9XEB/image.png)

消し忘れてたもの
---
*他リージョンのインスタンス（なんでそのリージョン使ったの？ねぇ？って自分に問いたい。）
*Elastic Load Balancing
*EBS Volume 
*AMI 
*Snapshot 
*Elastic IP (お約束)

その他注意事項
---
今回自分ではハマらなかったですが、多分初心者の方の場合以下のようなところにハマってうっかり課金が発生してしまう人もいるかもしれないので注意事項として書いておきます。

*CloudFormationやAutoScalingで立ち上げたリソースの場合、単独EC2インスタンスだけ消してもまた自動的に復活してしまう
*AMIだけ消してSnapshot消さないと意味ない(AMI の中にSnapshotが含まれるので AMI を消しても自動的にSnapshotは消されない)
*特にEBSの場合起動ボリューム以外の追加ボリュームは割とインスタンス終了時に自動的に消される設定になってないので注意
*停止しているインスタンスは Elastic IP がついていても使っていないと見なされるので注意

そんな感じのところ注意して使えば楽しくやって行けるかと思います！ Enjoy！！
ofxOpenCvを入れたらビルドできない時 (Mac)


メモ

ofxOpenCvを試そうと思って
普通にアドオンに追加したらビルドできなかった(Mac)
ぐぐって

xcodeのBuild SettingsのHeader Search Pathsに

```cpp:path
../../../addons/ofxOpenCv/libs/opencv/include/
```

を追加したら解決しました
Yahoo!オークションの落札相場の自動取得について

Yahoo!オークションで特定商品の過去の落札相場をAPIなどで定期的に自動取得したいのですが、
現在Yahoo!社より提供している機能で無料で取得することは可能でしょうか。

http://developer.yahoo.co.jp/webapi/auctions/
上記のようなサイトを確認しているのですが、
上手く見つけることができず・・・。

理想としては、
①商品名検索
②終了したオークション（直近90日、直近5件など）の落札価格の平均値を算出
を何度も繰り返したいです。

もしご存知の方いらっしゃいましたらご教示くださいますよう、
よろしくお願いいたします。
ElixirにComeoninモジュールでパスワードを暗号化

Elixirの中で、[Comeonin](http://hexdocs.pm/comeonin/)モジュールでパスワードを暗号化する

`mix.exs`ファイルのdeps関数部分

```
defp deps do
  [
    {:comeonin, "~> 1.0"}
  ]
end
```

実行

```
$ mix deps.get
$ iex -S mix
```

使用例

```
iex(6)> hash = Comeonin.Bcrypt.hashpwsalt("123456")
"$2b$12$lkDBNAh/yIeYi8tkulPvqO/Y3rTY3Clik3rt7iku6wTcItkob/3PO"
iex(7)> b = Comeonin.Bcrypt.checkpw("123456", hash)
true
iex(8)> b = Comeonin.Bcrypt.checkpw("123", hash)
false
```

`hashpwsalt`はランダムのsaltを使ってパスワードのハッシュします。