OmniAICreator/Qiita-1.07M huggingface dataset:
Mac OS X に boot2docker をインストールする

こんにちは。
毎日のように Vagrant で up と destroy を繰り返している者です。
大変便利に活用しているのですが、仮想マシンの起動・停止とプロビジョニングを一日に何度も実行していると待ち時間も馬鹿にならないため、もっと素早くアプリケーションを立ち上げて開発サイクルを回したいなあと思っていました。
そんなときは Docker 使ってみては？というアドバイスを頂きましたのでさっそくインストールから試してみたいと思います。

# 環境
boot2docker は VirtualBox 上に Linux 仮想マシンを立ち上げ、その上でコンテナを実行します。

* Mac OS X Yosemite
* Virtual Box 4.3.28
* boot2docker 1.7.0

# VirtualBox のインストール
https://www.virtualbox.org/wiki/Downloads
私は既にVirtualBoxを使用しているので、インストールは省略しました。

# boot2docker のインストール
http://boot2docker.io
Boot2Docker-1.7.0.pkg をダウンロードしてインストールします。

# 仮想マシンの作成
`boot2docker init` で VirtualBox の仮想マシンを作成します。

```
$ boot2docker init
```


# 仮想マシンの起動
`boot2docker up` で仮想マシンが起動します。
出力メッセージ末尾の環境変数がのちほど必要になります。

```
$ boot2docker up

（中略）

To connect the Docker client to the Docker daemon, please set:
    export DOCKER_HOST=tcp://192.168.59.104:2376
    export DOCKER_CERT_PATH=/Users/takayuki/.boot2docker/certs/boot2docker-vm
    export DOCKER_TLS_VERIFY=1
```

仮想マシンの状態確認は `boot2docker status` です。

```
$ boot2docker status
running
```

# 環境変数の設定
docker コマンド用に環境変数を設定します。

```
$ export DOCKER_HOST=tcp://192.168.59.104:2376
$ export DOCKER_CERT_PATH=/Users/takayuki/.boot2docker/certs/boot2docker-vm
$ export DOCKER_TLS_VERIFY=1
```

# dockerコマンドのテスト
```
$ docker info
Containers: 0
Images: 0

（中略）

Init Path: /usr/local/bin/docker
Docker Root Dir: /mnt/sda1/var/lib/docker
$
```

# 仮想マシンの停止
```
$ boot2docker halt
```

```
$ boot2docker status
poweroff
```

# 仮想マシンの削除
```
$ boot2docker destroy
```

# こんなとき
* `docker info` で `Cannot connect to the Docker daemon. Is 'docker -d' running on this host?`
    * `env | grep DOCKER` で環境変数が正しく設定されているか確認しましょう。

# まとめ
仮想マシンの作成から削除までのオプションは Vagrant と似たような感じで実行できるので、とてもわかりやすいですね。私は `up` と `halt` を使いましたが、`start` と `stop` でも良いようです。
docker コマンドについてはまた後日勉強します。

# 参考
* Dockerエキスパート養成読本
    * http://www.amazon.co.jp/dp/4774174416
画像を雑に分類する


Imagemagickのidentifyコマンドで取れる統計値を使って、大雑把に画像を分類する。
機械学習とかディープラーニングとか、そういう高度な話ではない。


大量の画像があって、似通った画像を探したいときには役に立つかもしれない（おおざっぱだけど）。

# identifyで画素平均値をとる

次のコマンドで画素平均とファイル名のリストを出力する。ついでに数字順ソートしておく

```bash
$ identify -format '%[mean], %f\n' *.png |sort -n > list.txt
$ head list.txt
7088.67, 574.png
7145.75, 387.png
7222.86, 318.png
7259.57, 084.png
7619.62, 155.png
7637.2, 158.png
7639.7, 177.png
7652.95, 305.png
7690.87, 519.png
7693.43, 364.png
```

# 似た画像順に並ぶようリネームする

ファイル名のprefixに画素平均順の連番を付け足して、ファイル名でソートすると似た画像が固まるようにする。


```bash
$ i=1; for f in `cat list.txt|cut -d',' -f2`; do g=m`printf '%03d' $i`_$f; mv $f $g; i=$((i+1)); done
```

# 確認

スライドショーを見てだいたい似た画像が固まっているか見てみてください。

identifyの統計値には `%[mean]` のほかに `%[entropy]`, `%[standard-deviation]` などがありますが、実験した範囲では分類の大雑把さは似たり寄ったり。

画像全体の統計値だから、たまたま結果が近い画像同士は並んでしまう。ま、大雑把にやってるからしょうがないでしょう。

大雑把じゃなく分類したい人は[ディープラーニング](http://qiita.com/tags/deeplearning)とかを勉強しましょうね。

# 参考

[ImageMagick: Command-line Tools: Identify](http://www.imagemagick.org/script/identify.php)

`-format` で指定できる値
http://www.imagemagick.org/script/escape.php
evalを使わずに任意のJavaScriptコードが実行できちゃう小ネタ

良いか悪いかで言ったら、明らかに良くないんだろうけど、できてしまうんですねこれ。

```js:よくない.js
var script = document.createElement( 'script' );

script.type = 'text/javascript';
script.innerHTML = "for(var i=0; i< 10; i++){console.log(i);}";

document.querySelector( 'body' ).appendChild(script);
```

![yokunai.png](https://qiita-image-store.s3.amazonaws.com/0/6642/73e5d9b3-8771-5efb-f823-65c07bfacf8d.png)

セキュリティは詳しくないからよく知らないんだけど、WebSocketとか使ってるアプリでエスケープが甘いと悪いことされそうな予感。

**追記**

CSPを使うと、ちゃんとブロックされるようです。 @mpyw さんに教えていただきました。ありがとうございます。詳しくはコメント欄をご覧ください

ただし、CSPはインラインスクリプトや外部スクリプトの読み込みを禁止しますので、システムの実装に大きな制約がかかることになります。使う際はご留意ください
参考記事： [弊社のホームページにContent Security Policy(CSP)を導入しました](http://blog.hash-c.co.jp/2013/12/Content-Security-Policy-CSP.html)
c++ builder XE4, 10.2 Tokyo > TeeChart > 時間軸のラベル表示位置変更 > 6時間ずつ > Chart1->Axes->Bottom->Increment = StrToTime(L"06:00");

```txt:動作環境
C++ builder XE4
    TeeChart Lite v2013.08.130414
RAD Studio 10.2 Tokyo Update 2 (追記 2018/01/09)
    TeeChart v2016.17.160129 32bit VCL
```

TeeChartにて横軸を6時間ごとにラベルを表示するには。

コードでは

    Chart1->Axes->Bottom->Increment = StrToTime(L"06:00");
log4cpp覚え書き

C++用のログ出力ライブラリとして、log4cppがある。使うまでの準備と使用例をまとめる。

# 準備
* SourceForgeのサイトからlog4cppのソースコードをダウンロードする。
 本投稿ではバージョン1.1.1を使用。
* 任意のフォルダに展開する。
* log4cpp\msvc10配下のmsvc10.slnを開く。
  本投稿ではVisual Studio Express 2013 for Windows Desktopを使用。 
  プロジェクトのアップグレードに関連するメッセージが表示される。OKを押して進む。
* log4cppプロジェクトをビルドする。
  log4cpp\msvc10\log4cpp\Releaseフォルダ配下に以下のファイルが生成されていることを確認する。
  - log4cpp.lib
  - log4cpp.dll

# 使用
* Visual StudioにてVisual C++新規プロジェクトを作成する。
* プロジェクトのプロパティページの[リンカー]-[入力]にて、生成されたlog4cpp.libを追加ライブラリとして指定する。
* ログ出力フォーマットファイルを用意。  

  ```properties:log4cpp.properties
  # log4cpp.properties
  log4cpp.rootCategory=DEBUG, rootAppender
  
  log4cpp.appender.rootAppender=RollingFileAppender
  log4cpp.appender.rootAppender.fileName=log4cppSample.log
  log4cpp.appender.rootAppender.maxFileSize=10000000
  log4cpp.appender.rootAppender.maxBackupIndex=5
  log4cpp.appender.rootAppender.layout=PatternLayout
  log4cpp.appender.rootAppender.layout.ConversionPattern=%d [%-5p] %m%n 
  ```
  
* ロガーを提供するクラスを追加。

  ```cpp:Log.h
  #pragma once
  #include <log4cpp/Category.hh>
  #include <log4cpp/PropertyConfigurator.hh>
  
  class Log
  {
  private:
  	Log();
  public:
  	~Log();
  	static log4cpp::Category& getLogger();
  };
  ```
  
  ```cpp:Log.cpp
  #include "stdafx.h"
  #include "Log.h"
  
  Log::Log()
  {
  }
  
  Log::~Log()
  {
  }
  
  log4cpp::Category& Log::getLogger()
  {
  	std::string initFileName = "log4cpp.properties";
  	log4cpp::PropertyConfigurator::configure(initFileName);
  
  	return log4cpp::Category::getRoot();
  }
  ```

* ログを出力したいクラスにて、上のロガー提供クラスからロガーを入手。
  そしてログ出力。

  ```cpp:log4cppSample.cpp
  int _tmain(int argc, _TCHAR* argv[])
  {
  	log4cpp::Category& logger = Log::getLogger();
  
  	logger.warn("Storm is coming");
  
  	Base* pBase = new Base();
  	Base* pDerived = new Derived();
  
  	pBase->printLog();
  	pDerived->printLog();
  
	logger.shutdown();
  
  	delete pDerived;
  	delete pBase;
  
  	return 0;
  }
  ```
  
  ```cpp:Base.cpp
  void Base::printLog()
{
	log4cpp::Category& logger = Log::getLogger();

	logger.info("This is Base");
}
  ```
  
  ```cpp:Derived.cpp
  void Derived::printLog()
{
	log4cpp::Category& logger = Log::getLogger();

	logger.info("This is Derived");
}
  ```

* ログ出力例

```text:log4cppSample.log
2015-07-04 14:06:05,900 [WARN ] Storm is coming
2015-07-04 14:06:05,903 [INFO ] This is Base
2015-07-04 14:06:05,904 [INFO ] This is Derived
```
OSXでngをmakeする。あるいはClangで古いスタイルのCソースをコンパイルする

`EDITOR=vi`はもういやだ!!

ということで起動が軽い[ng](http://tomato.sakura.ne.jp/~amura/ng/)に[UTF-8パッチ](http://hidev.blog.so-net.ne.jp/2007-03-09)を当てたものを作ることにしました。

```
% curl http://tomato.sakura.ne.jp/~amura/archives/ng/ng-1.5beta1.tar.gz | tar xz
% cd ng-1.5beta1
% curl http://www002.upp.so-net.ne.jp/hidev/ng-1.5beta1-utf8.patch.gz|gzcat|patch
% ./configure && make
```

こんなかんじでmakeをすると、

```
tty.c:292:3: error: non-void function 'ttinsl' should return a value [-Wreturn-type,Semantic Issue]
```

とエラーを吐いてコンパイルが止まります (他に警告も大量に出ます)。こんな感じの関数がエラーになっています;

```.c
func() {
    return;
}
````

型指定のない関数ですね。Cの規約によりこれは`int`を返すと仮定されますが、returnは何も返していません。「この関数はvoidじゃねえよ!! なんか値返せよ!!」とコンパイラが怒っているわけです。エラーメッセージにもそのように出ていますね。古いソースだとこういった関数が結構ありますし、実際ngのソースにあってエラーになりました。

これを抑止するにはコンパイルオプションに `-Wno-return-type` をつけてやればよいです。というかこのオプションを発見するのに手間取りました(なのでここにメモを)。

Makefileを開いて

```
CFLAGS  = -O2 $(CDEFS)
```

の行を

```
CFLAGS  = -O2 $(CDEFS) -w -Wno-return-type
```

に書き換えればよいです。ついでに警告全抑止オプションの`-w`もつけときました。これで`git commit`のときにviが起動して脱力するのを避けられます。
Unityのリニアライティングと.pvrの問題

Unityは5以降では.pvr v3やktxといった、よりハードウエアに密着したテクスチャファイルフォーマットを未加工にインポートすることができるようになりました。
しかし、このことが問題になる場合があります。

##Unityのレンダリングモード
[Player Settings の Edit -> Project Settings -> Player -> Other Settings
でRenderingでカラースペースを設定できるようになりました。
](http://docs.unity3d.com/ja/current/Manual/LinearLighting.html)
![colorspace.png](https://qiita-image-store.s3.amazonaws.com/0/80418/01197ed0-8017-c754-8bdd-8e2778d375af.png)
これがLinearになっていると、リニアライティングという物理的により正しい計算によるライティングになります。ただしテクスチャなどのレンダリングのもとになるソースがどのようなカラースペースで作られているかを正しく設定しなければなりません。

##.pvrファイルを作る(れない?)
.pvrを作るにはどうすればいいか?
たぶんImagination TechnlogiesのPowerVR SDKを使用するの一択でしょう。
たとえば、PVRTexToolGUI
![PVRTexTool.png](https://qiita-image-store.s3.amazonaws.com/0/80418/791bc76e-55a7-d623-874a-9528da227662.png)
しかし、このツールには大問題が、、
pngだろうがtgaだろうがjpgだろうが、読み込んだ外部形式のファイルのカラースペースをすべてLinearと判断します。pngみたいなカラースペースを明示するフィールドがあるフォーマットでもです。
pvr形式のファイルを読み込むときには、さすがにしっかりカラースペースを認識するので機能として持っていないわけでもないよう。
仮に100歩譲って読み飛ばすにしても、そこはせめてデフォルトをsRGBのほうにしておいてほしいのですが。。Linearスペースのイメージデータなんて普通存在しないでしょう。
この結果として、入力が間違っているのですから変換して出力された.pvrファイルのカラースペースもすべて間違っていることになります。
LinearスペースはsRGBで、sRGBはsRGB^2なんて謎のガンマがかかって間違って出力されてしまいます、、、
そもそも、このツール、データ詳細にカラースペースがないので、イメージデータが今どのカラースペースにあるかを知る方法もないのですが(使いにくい)。

結論から言うとPowerVR SDKのツールで正しいカラースペースの.pvrファイルを作るのは困難だといわざるえません。
ソースとして、Linearスペースのpngやtgaを用意してってなかんじになってしまいますから、、そんなデーター普通ありません。
あとはpvrファイル出力後バイナリーエディタでカラースペースのフラグを操作するとか、、今回はLinearスペースで出力後(実はsRGB)、バイナリーエディタで書き換えて無理やりsRGBにしてしまいました(コレデOK?!)

##.pvrファイルを読む(めない?)
さてどうにか出来上がった.pvrファイルをUnityで使ってみましょう。
Unityはレンダリングモードがgammaのときイメージファイルのカラースペースを全部sRGBと判断するようです。まあ、普通に我々が入手したり加工したりできるイメージファイルは圧倒的にsRGBカラースペースのものが多いですから、こりゃ妥当っていえば妥当かな?!
で、レンダリングモードをLinearにかえてやると、Unityはイメージファイルのフォーマットを元に正しくカラースペースを設定し物理的により正しいレンダリングをおこない :smile: 、、、、、いやいや、正しく判断しませんねえ :fearful: 、、.pvrファイル場合はすべて無条件でLinearカラーと判断されてしまいました:scream: 
UnityもImagination Technlogies同様、フラグはガン無視です:sob: 
PVRTexToolGUIといいUnityといい、この人たちはどれだけLinearスペースのイメージが好きなんでしょう。
まあ、対処はPVRTexToolGUIのときとほぼ同じ、ソースとしてLinearスペースの.pvrしか使わないということでしょうか、、しかしそもそもPowerVR SDKのツール側の問題でLinearスペースの.pvrファイルというもの自体なかなか作れなさそうなんですが。。

![sdunitychan.jpg](https://qiita-image-store.s3.amazonaws.com/0/80418/93397919-3b8a-eab2-9079-d6e909202c97.jpeg)
######sRGBの.pvrファイルを使ってレンダリングするとテクスチャのカラースペースをLinearと誤認識するせいでユニティちゃんが白っぽくなってしまう。


##結論
####Unityのリニアライティングモードでは.pvrファイルは使えない(調べてないけど、.ktxとか.ddsもやばそう)
2015-07-04 C++ Builder XE4 > JSONファイル処理 > ParseJSONValue() / Get(idx) / JsonString-> / JsonValue->

### 備考
(2019-05-21)

<font color=red>C++ Builder 10.2Tokyoでは下記の実装はSize()とGet()について古いと認識される。</font>
- [C++ Builder 10.2 Tokyo > JSON > W8111 非推奨のエンティティ '_fastcall TJSONObject::Size()' にアクセスしている (+Get()) > CountとPairs[]を使う (XE4から10.2Tokyoへの移行)](https://qiita.com/7of9/items/bada48662318be9cdcb3)

### 実装

```txt:動作確認
C++ Builder XE4
```

以下の山本隆さんの記事が参考になる。
http://www.gesource.jp/weblog/?p=4567

```cpp
#include <DBXJSON.hpp> // for JSON

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String jsonText = L"{ \"name\": \"Caroline Charonplop Kyary Pamyu Pamyu\", \"age\": 22 }";
	TJSONObject *jsonObj = dynamic_cast<TJSONObject*>(TJSONObject::ParseJSONValue(jsonText));

	String item, value;
	TJSONPair *pair;
	for(int idx=0; idx<jsonObj->Size(); idx++) {
		pair = jsonObj->Get(idx);
		item = pair->JsonString->Value();
		value = pair->JsonValue->Value();
        ShowMessage(L"item=" + item + L", value=" + value);
	}

	jsonObj->Free();
}
```


関連してこちらも参考になる。
http://www.gesource.jp/weblog/?tag=json

ParseJSONValue()は失敗する時がある
http://qiita.com/7of9/items/a923ffb936ea44b9536d
Master-Slave Datastoreマイグレーション FAQ

App Engine のMaster-Slave Datastore のマイグレーションについて、分かりにくいことが多いと思うので、FAQを作ってみました。背景は [僕のブログ記事](https://www.ianlewis.org/jp/app-engine-master-slave-migration-ja)を読んでください。

*Master-Slaveを使うアプリは xxx というIDにします。HRDのアプリIDは xxx-hrd とします。*

## マイグレーションするにはどうすればいいの？

ステップは以下の感じです。それぞれのドキュメントを参照してくでさい。マイグレーションツールについては次の質問もご参考にしてください。

1. [アプリを複製する](https://cloud.google.com/appengine/docs/adminconsole/migration#duplicating_your_application)。アプリの管理画面の「Application Settings」でできます。
2. [新しいアプリへデプロイする](https://cloud.google.com/appengine/docs/adminconsole/migration#deploying_your_new_hrd_application)
3. マイグレーションツールを使って[マイグレーションを行います](https://cloud.google.com/appengine/docs/adminconsole/migration#using_the_migration_tool)。

## マイグレーションするけど、実際に何が行われるの？

マイグレーションは以下のようなことを順番に行います (ドキュメントは[こちら](https://cloud.google.com/appengine/docs/adminconsole/migration#using_the_migration_tool))

1. xxx アプリのデータを一旦 xxx-hrd にコピーする (Incremental Copy)。これは何回も繰り返できます。
2. コピーが終わったら、xxx を読み込み専用モードにする。これは自動ではなくて自分で「Activate Read-only」ボタンを押す感じです。
3. 「Finish Migration」で 1 と 2 の間に更新されたデータを xxx-hrd にコピーする (これは終わったら、元に戻せないので注意)。Finish Migrationが終わったら、エイリアスが作られて、 xxx.appspot.com から xxx-hrd のアプイケーションのデータを使って動作します。
4. xxx.appspot.com (内部は xxx-hrd というアプリ)はちゃんと動作しているのを確認してから、[Billing を無効にします](https://cloud.google.com/appengine/pricing#disable_billing_old)。その後は xxx を削除できます。

## xxx.appspot.comを使い続けたいけど、可能ですか？

可能です。マイクレーションするために、xxx-hrdみたいな別App IDを作らなくちゃいけないけど、マイグレーションの最後にドメインのエイリアスを作るので、 xxx.appspot.com は使い続けます。

## xxx というIDを使い続けないけど、可能ですか？

これは不可能です。マイグレーションの最後にドメインのエイリアスを作るので、 xxx.appspot.com は使い続けますが、xxxのアプリIDは使えなくなります。App Engineの管理画面は xxx-hrd を使うことになります。

* App Id: xxx-hrd
* URL: xxx.appspot.com OR xxx-hrd.appspot.com になります。

最終的には、xxx.appspot.comでアクセスできるので、ユーザーのエクピリエンスが変わらないと思います。xxx.appspot.comなのに、管理画面ではxxx-hrdというアプリIDになる分かりにくさだけが残ると思います。

## xxx.appspot.com と xxx-hrd.appspot.com から両方アクセスできるのが気持ち悪いんですけど、どうすれば？

もし、xxx-hrd.appspot.comでアクセスを不可能にしたい場合は、アプリ側でHTTPのHostヘッダーを検証するのがベストかなと思います。

## xxx から移行したら後に課金されるんですか？

マイグレーションした後に何もしなければ、データの容量に対して課金されます。マイグレーション後に確認した後にxxxの[Billing を無効](https://cloud.google.com/appengine/pricing#disable_billing_old)にしなければならない。

## xxx はもういらないんだけど、削除できますか？

[Billing を無効](https://cloud.google.com/appengine/pricing#disable_billing_old)にしたら、削除できるはず。

## 最初の Incremential Migration がなかなか終わらないけど、どうすれば？

Incremential Migration をする時に、終わらないケースがあるらしい。 [Using the Migration Tool](https://cloud.google.com/appengine/docs/adminconsole/migration#using_the_migration_tool)の下の９版をご参考ください。

Read-onlyでIncremental Migrationを行う場合は、終わらないケースを解消するらしい。もし、Incremental Migrationが終わらない場合は、一旦Migrationを止めて、Read-onlyにしてからまたIncremental Migrationを実行するのがいいと思います。

# その他

他に質問があると思うんですが、もしここに自分の質問が答えてない場合は、 ここにコメントするか、[@IanMLewis](https://twitter.com/)に連絡して、できるだけこの記事を更新していきます。あと、#gcpjaというハッシュタグをつけると他のエキスパートの方が回答してくれるかもしれない。
画像を平行移動してずらす


Imagemagickでリサイズや拡大縮小する方法はよく見つかるけど、サイズや縮尺を変えずに画像をそのまま平行移動する方法は見つけるのに苦労したので、ここに書いとく。

紹介したAffine以外にも[SRT](http://www.imagemagick.org/Usage/distorts/#srt)という形式があるけど個人的にはAffineのほうが簡単だと思う。

例として「 `A.png` をx方向に3、y方向に−5だけ平行移動した画像を `B.png` に保存」するコマンドを考える。


# Affine

http://www.imagemagick.org/Usage/distorts/#control_points

```
$ convert A.png -distort Affine '10,10 3,5' B.png
```

`'10,10 3,5'` は(10,10)の位置にある点を(3,5)の位置に移すような変換を全体にかけろ、という命令。

# 注意

平行移動してくれるだけと思いきや、画素値も微妙に変わってしまうようです。
たぶん[Area-Resampling](http://www.imagemagick.org/Usage/distorts/#area_resample)とかが関係していると思うけど、とくに深追いしていない。

確かめるために距離0で平行移動した画像を作って元画像とくらべてみる

```
$ convert A.png -distort Affine '10,10 10,10' A2.png
$ compare A.png A2.png compare.png
```

compare.pngには相違点が赤で表示されるので、そこそこ赤が出ているのがわかると思う。


# 参考

```
$ convert -version
Version: ImageMagick 6.9.0-10 Q16 x86_64 2015-03-09 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2015 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: DPC Modules
Delegates (built-in): bzlib freetype jng jpeg ltdl lzma png xml zlib
```



[Distorting -- IM v6 Examples](http://www.imagemagick.org/Usage/distorts/)
[ImageMagick - ２枚の画像を比較！ - mk-mode BLOG](http://www.mk-mode.com/octopress/2013/09/04/imagemagick-compare-two-images/)
ファイルフォーマット > YAML > 入門 > XMLやJSONとの違い

http://internetcom.jp/developer/20080926/26.html
の気になった部分の抜粋

> YAMLでは、スペースによるインデントを使ってデータの階層構造を示す表記方法が基本です。
...
> ただしYAMLは、JSONのスーパーセットでもあります。そのため、必要に応じて、スペースによるインデント表記からJSON風の表記へと切り替えることも可能です。
...
> 必要に応じて途中からJSON風の表記に切り替え、インデントによる表記と混在させることも可能です。
...
> <font color=red>最下位レベルのノード（子供がないノード）</font>
...
> YAMLの場合、...ファイル内でタブは一切サポートされていません。
...

<hr>
ハッシュ
> インデントした子で、キーと値をコロン（:）で区切って表記すると、ハッシュを作成できます。

リスト
> リストを作成するには、リストの各要素の先頭にマイナス記号（-）を付け、...

ブロックリテラル
> <font color=red>縦棒（|）</font>のディレクティブを使った場合、テキスト内の改行は保持されます。
> <font color=red>大なり記号（>）</font>のディレクティブを使った場合、改行はすべて無視され、1行の長いテキストとみなされます。

他のディレクティブもある。

<hr>
XMLやJSONとYAMLとの違い

> YAMLはXMLに比べて著しく簡潔です。YAMLファイルの中身は、ほとんどが実際のデータです。
...
> 一方、YAMLの弱点は、スキーマやDTDの概念がないことです。このため、ファイルが目的の形式に合致しているかどうかを検証する手段がありません。
...
> JSONは、効率性の向上やファイルサイズの節約を目指したデータにはうってつけです。スペースや終了タグによるサイズの浪費がほとんどないからです。
WordPress JSON REST APIの開発手法をパクってCIのベストプラクティスを覚える

# 概要
![スクリーンショット 2015-07-04 10.54.58.png](https://qiita-image-store.s3.amazonaws.com/0/65478/6d0e5ca6-8132-3cc8-8e3e-1dd3db4b0197.png)

[WordPress JSON REST API](https://github.com/WP-API/WP-API)のリポジトリにはWordPressプラグイン開発のベストプラクティスとも言えるCI環境が整ってます。これを自分の開発環境にも適用してみました

以下、WordPress JSON REST APIの開発で使用されているツールをいくつか紹介します

# PHP Code Sniffer
![スクリーンショット 2015-07-04 11.05.51.png](https://qiita-image-store.s3.amazonaws.com/0/65478/926f16d1-67f7-3645-c629-b7bf47b5b677.png)
正しくコーディング規約が守られているかをチェックするためのツールです。問題があれば自動でコードを修復してくれる機能もあります。

WordPress JSON REST APIは[WordPress Coding Standards](https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards)を使ってWordPressのコーディング規約をチェックしています。

![スクリーンショット 2015-07-04 11.26.56.png](https://qiita-image-store.s3.amazonaws.com/0/65478/6bc66583-c95b-00e8-3d0f-3b609ef5425e.png)
実行するとこんな感じです。これはエスケープ漏れっすね。esc_html_eやesc_attr_e関数をつかって出力時はエスケープしなさい！と怒られています。

その他にも、nonceが設置されてなかったら、CSRFの危険があると指摘してくれたりと、至れり尽くせりです。
コーディング規約もWordPress.com VIP用の規約なんかもあります。
[WordPress.com VIP code-review-what-we-look-for](https://vip.wordpress.com/documentation/code-review-what-we-look-for/)

![スクリーンショット 2015-07-04 11.42.18.png](https://qiita-image-store.s3.amazonaws.com/0/65478/ded70da7-6bc8-2713-ca38-9b907ede1182.png)
これを有効化するとposts_per_pageに-1を指定したり、独自のSQLを発行するだけで怒られてしまいます。

確かに提供するホスティングサービス上で好きなSQLを発行されてDBに負荷かけるのはやめて欲しい気持ちはわかりますが、えらい厳しいっすね。

# PHPUnit
![スクリーンショット 2015-07-04 12.31.19.png](https://qiita-image-store.s3.amazonaws.com/0/65478/8e854cdf-f178-11ff-6771-cb18ab036013.png)
定番のユニットテストのツールっすね。

[Make WordPress Core](https://make.wordpress.org/core/handbook/automated-testing/)
[WP-CLI+PHPUnitを使ったWordPressプラグインのユニットテスト（１）](https://firegoby.jp/archives/5498)
使い方は上記に詳しく説明されてます。

# PHPLint
[http://www.icosaedro.it/phplint/](http://www.icosaedro.it/phplint/)
PHPの文法の構文チェックをしてくれるツールです。

# Scrutinizer
![スクリーンショット 2015-07-04 11.52.42.png](https://qiita-image-store.s3.amazonaws.com/0/65478/e5f05575-b720-6f8d-9375-68d7cdc07a71.png)
[https://scrutinizer-ci.com/](https://scrutinizer-ci.com/)

これはTravis CIと同様のCIサービスです。ざっくり言えばコード全体を解析してイケてるコードかどうか点数をつけてくれます。
ちなみに僕の公開しているプラグインはこんな感じ。
[https://scrutinizer-ci.com/g/horike37/wp-syndicate/](https://scrutinizer-ci.com/g/horike37/wp-syndicate/)

自動でパッチを作ってくれたり、ここからGithubにissueを立ててくれたり色々やってくれます

# 自分のプラグインにこれらのツールを入れる
https://travis-ci.org/horike37/wp-syndicate/jobs/69370112
このあたりのツールを入れてTravis CIを回します。
まあ、ここまで細かくチェックしてたら、そうそうバグやセキュリティホールを誤って仕込んでしまうってことはなくなりますね。
ファイルフォーマット > YAML > .unityで使われている形式

https://github.com/keijiro/Furball/blob/923b52190c3aa3b9a5938ed518c96871b11d85f2/Assets/Scene01/Furball.unity
を見ていて、.unityというファイル形式に興味を覚えた。

以下、Furball.unityの一部を抜粋させていただく。

```yaml
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!29 &1
SceneSettings:
  m_ObjectHideFlags: 0
  m_PVSData: 
  m_PVSObjectsArray: []
...
```

http://docs.unity3d.com/Manual/FormatDescription.html
> Unity’s scene format is implemented with the <font color=red>YAML data serialization language</font>. 

YAMLという形式を読むツールなどは今後調べようと思う。
IntelliJのDockerインテグレーションを使う

## 前提

環境はMac。boot2dockerが入っているものとする

## 手順

1. IntelliJにDockerプラグインを入れる
2. DockerHost等の設定
3. Run/Debug Configurationにてコンテナの起動設定
4. Dockerfile書いてアプリケーションを起動

## 1. IntelliJにプラグインいれる

![plugin.png](https://qiita-image-store.s3.amazonaws.com/0/10292/7464c566-0295-8e9e-7ce2-c07ffb39b623.png "plugin.png")

## 2. DockerHost等の設定

設定画面から`Clouds`を開き、`Docker`を選択して新規設定を作成。boot2dockerのホストのIPアドレスと証明書を埋める。

![dockerhost.png](https://qiita-image-store.s3.amazonaws.com/0/10292/5fc492ff-bee5-aa1b-f2d6-1082c1b0f9a3.png "dockerhost.png")

## 3. Run/Debug Configurationにてコンテナの起動設定

あとは起動設定。新規に`Docker Deployment`を作成する。`Server`には先ほど作成したDockerHostの設定を選択する。

![deploy.png](https://qiita-image-store.s3.amazonaws.com/0/10292/4b8c3916-8212-2ef7-4c03-91f76cc97db9.png "deploy.png")

`Container Settings`で指定した場所に下記のような設定ファイルが作成されるので、任意の場所を設定する。

```json
{
  "_comment" : "FOR DETAILED FORMAT LOOK AT https://docs.docker.com/reference/api/docker_remote_api_v1.16/#create-a-container",
  "HostConfig": {
    "PortBindings":{ "8080/tcp": [{ "HostIp": "0.0.0.0", "HostPort": "18080" }] }
  }
}
```

## 4. Dockerfile書いてアプリケーションを起動

今回の例ではNode.jsのアプリケーションを起動してみる。特に特別なものはない。普通のDockerfile。ここで指定している8080番ポートのEXPOSEが、上記の`Container Settings`を介してboot2dockerのVMの18080番ポートにマッピングされて起動される。

```
FROM    centos:centos6

# Enable EPEL for Node.js
RUN     rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
# Install Node.js and npm
RUN     yum install -y npm

# Bundle app source
COPY . /src
# Install app dependencies
RUN cd /src; npm install

EXPOSE  8080
CMD ["node", "/src/index.js"]

```

あとは起動するだけ。
![run.png](https://qiita-image-store.s3.amazonaws.com/0/10292/d3be1ab3-0969-a929-319d-fe56f9c210d5.png "run.png")

起動毎にDockerfileをベースにimageをビルドして起動してくれるので、気が付くとDockerのimageがたくさん。。w

```
$ docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
<none>                          <none>              d77428963982        4 seconds ago        433.4 MB
<none>                          <none>              2dbf7fccd362        About a minute ago   433.4 MB
<none>                          <none>              2db3f6f43f3d        17 minutes ago       433.4 MB
<none>                          <none>              1a692b123249        26 minutes ago       433.4 MB
<none>                          <none>              b3da671305c1        27 minutes ago       433.4 MB
<none>                          <none>              8e12d9cc00c9        33 minutes ago       433.4 MB
```

## Disclaimer

この記事はわたし個人のメモであり、わたしの雇用者を代表するものではありません。
apache proxy設定 + Node.js + socket.io を動かす

一部でDynamoDBを使いたかったので、AWS SDK for Node.jsを使用する必要がありました。
ドメインはメインのPHPのAPIと同じにしたかったので、proxyを設定して運用することにしました。
以下が今回設定した環境です。

* [AWS EC2 で始めるお手軽LAMP環境 APACHE2.4 MYSQL5.5 PHP5.6](http://qiita.com/bboobbaa/items/62761fc219136c37af14)

※リバースプロキシを設定したいので、apache2.4以降の`mod_proxy_wstunnel.so`が必要です。

今回は`http://example.com/socket.io`の、`/socket.io`以降アクセスした場合はnode、他は`/var/www/html`以下が読み込まれるようにしたいと思います。

expressを使うと楽なので、node_modulesにexpressをインストールします。

```bash:
npm install express
```

例ではnode.jsは3000ポートを使用します。

```node:app.js
var port = 3000,
    express = require('express'),
    app = express(),
    http = require('http').createServer(app),
〜
http.listen(port);
```


実行はバックグラウンドで動いてくれる`forever`が便利なので、インストールします。

```bash:
npm install forever -g
forever start app.js
```

nodeが実行されたら、apacheの設定をします。
デフォルトに無いので、モジュール読み込みのconfに`mod_proxy_wstunnel.so`を追加します。

```bash:/etc/httpd/conf.modules.d/00-proxy.conf 
〜
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
```

プロキシ設定をします。

```bash:/etc/httpd/conf/httpd.conf
〜
ServerName example.com
DocumentRoot "/var/www/html"
〜
<IfModule mod_proxy.c>
    ProxyPass /socket.io http://127.0.0.1:3000/
    ProxyPassReverse /socket.io http://127.0.0.1:3000/
</IfModule>
〜
```

ブラウザにアクセスして以下が表示されれば成功です。

```lang:ブラウザ
Cannot GET /
```

おまけ：サーバー再起動した時用に以下の設定をrc.localに追加すると便利です。

```bash:/etc/rc.local
〜
(cd /home/-/-/ && forever start app.js)
```
Happy Hacking Keyboard Lite2を日本語キーボードのノートPCにつなげて使う方法

#Let's Note CF-N8に入れたMint Linux上でHHK Lite2を使ってFcitx-Mozcから英語配列で日本語入力する

なんもしないと日本語入力のママ刻印通りの文字が出ません｡


#fcitx-imlist 
[ここから入手](http://kenhys.hatenablog.jp/entry/2015/05/31/034040)

#以下2つを作製　~/　におく

```uskeyset.txt
XKBMODEL="hhk"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS=""
```

```jpkeyset.txt
XKBMODEL="pc105"
XKBLAYOUT="jp"
XKBVARIANT=""
XKBOPTIONS="ctrl:nocaps"
```

#以下をBashrcに登録

```
alias uskey='sudo cp ~/uskeyset.txt /etc/default/keyboard;
             setxkbmap -model hhk -layout us;
             fcitx-imlist -s fcitx-keyboard-us'
```

```
alias jpkey='sudo cp ~/jpkeyset.txt /etc/default/keyboard;
             setxkbmap -model jp106 -layout jp;
             fcitx-imlist -s fcitx-keyboard-jp'
```

#おわり

bashから新しく登録したコマンドを叩きましょう｡

いまんとこ直接入力の時はHHKで英語のキー配列で入力できるんですが､なぜかMozcを立ち上げて日本語入力しだすとキー配列が日本語に戻っちゃうんですよね｡しょうが無いので上で設定した uskey コマンドを連打するという不便な日々｡

#追加
それでもなんかうまく行かないという人のために｡
##1. [lxkeymap](https://launchpad.net/lxkeymap)を使ってみる

テキストファイル作って日本語設定はこうで

```
[Global]
layout = jp,jp
variant =
option = ctrl:nocaps
```

英語はこういう感じに設定して

```
[Global]
layout = us,us
variant =
option =
```

コピーして実行

```
 sudo cp ~/Dropbox/lxkeymap-us.txt  ~/.config/lxkeymap.cfg;
 lxkeymap -a
```


##2. Mozc立ち上げて日本語入力しだすと何故か日本語配列に戻る
日本語入力システムの順番を確かめる｡入力メソッドの設定が､上から英語､Mozc､日本語の順番であること｡かつ､Mozcのキーボード設定が「規定」になってるかどうかたしかめる｡
BathRuby 2015 - Nothing is Something by Sandi Metz　前半のメモ

動画
https://www.youtube.com/watch?v=9lv2lBq6x4A&feature=youtu.be

missingno15さんがこちらに書いたコードを自分のメモとして記述｡
https://gist.github.com/missingno15/4bc7efabe7a45ff895fd

```rb

require 'pry'

class Animal
  DATABASE = [
    { id: 1, name: "Mockingbird" },
    { id: 2, name: "Pheasant" },
    { id: 3, name: "Duck" },

    { id: 4, name: "Platypus" },
    { id: 5, name: "Penguin" },
    { id: 6, name: "Peacock" },
    { id: 7, name: "Hummingbird" },
    { id: 8, name: "Owl" }
  ]
 
  attr_accessor :id, :name
  
  def self.find(id)
    target_data = DATABASE.find { |data| data[:id] == id }
 
    if target_data
      self.new(target_data)
    end
  end
 
  def initialize(attrs)
    @id = attrs.fetch(:id)
    @name = attrs.fetch(:name)
  end
end
 
 
# Now we have a list of ids that we want to query
 
ids = [4, 8]
 
# Let's map this
 
birds = ids.map { |id| Animal.find(id) }
p birds  # => [{:id=>4, :name=>"Platypus"}, {:id=>8, :name=>"Owl"}]
 
# Let's now add an id that doesn't exist in our database to our array of ids
# Now when we run map on the ids, we should get nil in the resulting array
 
 
ids << 48
birds = ids.map { |id| Animal.find(id) }
p birds  # => [{:id=>4, :name=>"Platypus"}, {:id=>8, :name=>"Owl"}, nil]
 
# However, let's say we don't want it to return 'nil', we want it to be 
# descriptive and return 'no animal' instead when we call #name on each object
# With our current implementation, if you iterate through each element 
# in the array, you'll get:
 
# birds.each { |bird| bird.name }
# => undefined method `name' for nil:NilClass (NoMethodError)
 
# Let's say we can't change Animal#find because it belonged to an 
# external framework so we have no control whatsoever on it
 
# You could do something like this:
 
birds.each { |bird| bird ? (puts bird.name) : (puts "no animal") }
 
# However, we can do better
# Let's use the Null Object Pattern to substitute for our missing values
 
class MissingAnimal
  def name
    "no animal"
  end
end
 
birds = ids.map { |id| Animal.find(id) || MissingAnimal.new }
 
# Now when when we call #name on each object
 
birds.each { |bird| puts bird.name }
 
 
# #=> Platypus
#     Owl
#     No animal
 
 
# However, Sandi Metz makes the point that everytime you want to do this, we will be calling on 
# twice the amount of objects. Her solution is wrapping up the Null Object into another class 
# which also handles the API of the thing that we have no control over.
 
class GuaranteedAnimal
  def self.find(id)
    Animal.find(id) || MissingAnimal.new
  end
end
 
 
# Now in the rest of the areas of your app, you can now change this:
 
birds = ids.map { |id| Animal.find(id) || MissingAnimal.new }
 
# to this↓
 
birds = ids.map { |id| GuaranteedAnimal.find(id) }
 
birds.each { |bird| puts bird.name  }
# => Platypus
#    Owl
#    No animal
```
BathRuby 2015 - Nothing is Something by Sandi Metz 後半のメモ

動画
https://www.youtube.com/watch?v=9lv2lBq6x4A

後半のコードです｡
確か自分で写したものだったと思う｡
前半が「IFを使うと分岐が増えていく」という内容なのでIFは禁止です｡

```rb
require 'pry'

# change behavior of existing methods without changing original code

class House
  def recite
    (1..data.length).map{|i|line(i)}.join("\n")
  end

  def line(number)
    "Num: #{phrase(number)} "
  end

  def phrase(number)
    parts(number).join(" ")
  end

  def parts(number)
    data.last(number)
  end

  def data
      %w(1 2 3 4 5 6 7 8 9 10 11 12)
  end
end

class RandomHouse < House
  def data
    @data ||= super.shuffle
  end
end

class EchoHouse < House
  def parts(number)
    super.zip(super).flatten
  end
end

class RandomeEchoHouse1 < EchoHouse
  def data
    # need duplication
    @data ||= super.shuffle
  end
end

class RandomeEchoHouse2 < RandomHouse
  def parts(number)
    # need duplication
    super.zip(super).flatten
  end
end

class RandomeEchoHouseSack < House
# so wet....
  def data
    @data ||= super.shuffle
  end
  def parts(number)
    super.zip(super).flatten
  end
end

# Using inheritance as a way of sharing methods.
# Not a good practice.

# p House.new.line(6)
# p RandomHouse.new.line(6)
# p EchoHouse.new.line(6)
# p RandomeEchoHouse1.new.line(6)
# p RandomeEchoHouse2.new.line(6)
# p RandomeEchoHouseSack.new.line(6)

class CoolHouse
    attr_reader :data, :formatter

  DATA = %w(1 2 3 4 5 6 7 8 9 10 11 12)

  def initialize(orderer: DefaultOrder.new, formatter: DefaultFormatter.new)
    @data = orderer.order(DATA)
    @formatter = formatter
  end

  def recite
    (1..data.length).map{|i|line(i)}.join(" ** ")
  end

  def line(number)
    "Num: #{phrase(number)}"
  end

  def phrase(number)
    parts(number).join(" ")
  end

  def parts(number)
    formatter.format(data.last(number))
  end

end

# Orderer role
class DefaultOrder
  def order(data)
    data
  end
end

class RandomOrder
  def order(data)
    data.shuffle
  end
end

# Fomatter role
class DefaultFormatter
  def format(parts)
    parts
  end
end

class EchoFormatter
  def format(parts)
    parts.zip(parts).flatten
  end
end

# No strange inheritance here
p CoolHouse.new.line(6)
p CoolHouse.new(orderer: RandomOrder.new).line(6)
p CoolHouse.new(orderer: RandomOrder.new, formatter: EchoFormatter.new ).line(6)

# Also Very flexible
p CoolHouse.new(orderer: RandomOrder.new).recite
p CoolHouse.new(formatter: EchoFormatter.new).recite
p CoolHouse.new(orderer: RandomOrder.new, formatter: EchoFormatter.new).recite

 ## Isolate the difference, Name the concept , Define the role, Inject the players
 ## Nothing (like null) is something (needs to be named)
```
英数字のランダムパスワード作成

パスワード自動生成の時とかに便利かと思います。

```php:
〜
public function randString($length = 8) {
    $list = array_merge(range('0', '9'), range('a', 'z'), range('A', 'Z'));
    if ($length  < 1) {
        return false;
    }
    $str = '';
    for ($i = 1; $i <= $length; $i++) {
        $str .= $list[array_rand($list)];
    }
    return $str;
}
```
かつお君へ PHPのcryptでログイン処理を作成

cryptはDESによるハッシュ生成の場合、8文字になります。
SALTを指定することにより他の暗号化処理よりセキュアです。
DBに保存するパスワードは、基本的に入力した値をハッシュ化し、照合する場合も入力されたパスワードをハッシュ化して同じかどうか確認します。
詳しくは下記のURLを参照して下さい。

* [PHP:crypt](http://php.net/manual/ja/function.crypt.php)

bootstrap.phpの末尾にSALTを設定して下さい。
SALTはCRYPT_BLOWFISH（`$2a$` `$2x$` `$2y$` のどれか、2桁のコストパラメータ、`$`、`./0-9A-Za-z`からランダムな22文字の系29文字）が好ましいかと思われます。
※SALTは例です。

```php:App/Config/bootstrap.php
〜
define('SALT','$2a$01$katsuokun./fight./2015');
```

ユーザ登録画面では、受け取ったPOSTデータのパスワードにcryptを掛けます。
先ほどdifine()でconstを作成したので、`$`を付けずに`SALT`のみで定数を読み込めます。

```php:App/Controller/User.php
public function registUser() {
    if ($this->request->is('post'))
    {
        $this->loadModel('User');
        $this->request->data['User']['pass'] = crypt($this->request->data['User']['pass'], SALT);
        $this->User->save($this->request->data);
    }
}
```

ログイン時には受け取ったパスワードにcryptを掛けデータの確認をします。

```php:App/Model/User.php
〜
public function checkUserLogin($id, $pass) {
    return $this->find('first', array('conditions' => array('id' => $id, 'pass' => crypt($pass, SALT))));
}
```

これでパスワードは完全に利用するユーザ本人のみしか分からなくなりました。
こんなかんじで実装をお願いします。

こちらも参考にするといいかもしれません。
* [英数字のランダムパスワード作成](http://qiita.com/bboobbaa/items/d838e3e9331bf66af75e)

=====

SALTを固定化するのは良くないと指摘をいただいたので新しく書き直しました！

* [かつお君へ PHPのpashword_hashでログイン処理を作成](http://qiita.com/bboobbaa/items/fa3ac0c76f35ac1cc2c4)
Chef12 knife backup restore Request Entity Too Large

Chef10 から Chef12 への移行の際に knife backup を使って export/restore を
行ったのですが、node の json が 1,000KB を超えていたため、413 が返りエラーに
なりました。

```
% knife backup restore nodes
WARNING: This will overwrite existing data!
Do you want to restore backup, possibly overwriting existing data? (Y/N) Y
=== Restoring nodes ===
Restoring nodes from .chef/chef_server_backup/nodes/HOST1.json
Restoring nodes from .chef/chef_server_backup/nodes/HOST2.json
ERROR: Request Entity Too Large
Response: JSON must be no more than 1000000 bytes.
```

当初は nginx の client_max_body_size かなと思ったのですが、250m になっていました。

```
client_max_body_size 250m;
```

nginx は 127.0.0.1:8000 で起動しているデーモンの reverse proxy だったので、8000/tcp で待っている
以下のプロセスの config を変更する必要がありました。

```
opscode  20388  4157  6 11:06 ?        00:00:28 /opt/opscode/embedded/service/opscode-erchef/erts-6.4/bin/beam.smp -Bd -K true -A 5 -- -root /opt/opscode/embedded/service/opscode-erchef -progname opt/opscode/embedded/service/opscode-erchef/bin/oc_erchef -- -home /var/opt/opscode/opscode-erchef -- -noshell -noshell -noinput -boot /opt/opscode/embedded/service/opscode-erchef/releases/12.1.0/oc_erchef -mode embedded -config /opt/opscode/embedded/service/opscode-erchef/sys.config -name erchef@127.0.0.1 -setcookie erchef -smp enable -pa lib/patches -- foreground
```

```
% diff /opt/opscode/embedded/service/opscode-erchef/sys.config.ORG /opt/opscode/embedded/service/opscode-erchef/sys.config
93c93
<               {max_request_size, 1000000},
---
>               {max_request_size, 4000000},
```
インクルードしているファイル一覧を作る(1)


# はじめに
ソースコードの依存関係調査をするにあたり、c、cpp、ヘッダファイルでインクルードしている箇所を抜き出すrubyスクリプトを作成。

# 環境
- Windows8.1
- ruby 2.1.6p336 (2015-04-13 revision 50298) [x64-mingw32]

# スクリプト
- depend_check.rb

```rb
require 'nkf'

CODES = {
  NKF::JIS   => 'stateless-ISO-2022-JP',
  NKF::EUC   => 'euc-jp',
  NKF::SJIS  => 'Shift_JIS',
  NKF::UTF8  => 'utf-8',
  NKF::BINARY => 'ascii',
  NKF::ASCII  => 'ascii',
  NKF::UNKNOWN => 'ascii',
  Encoding::EUCJP_MS => 'euc-jp',
  Encoding::CP51932  => 'euc-jp',
  Encoding::WINDOWS_31J => 'windows-31j',
}

def check(file)
  str = open(file) { |io| io.gets(nil) }
  if str.nil?
    '' # "EMPTY"
  else
    CODES.fetch(NKF.guess(str))
  end
end

def depend(fpath)
  list = []
  encoding = check(fpath)

  File.open(fpath, "r:#{encoding}") do |f|
    f.each_line do |line|
      line.chomp!
      if line =~ /^#include/
        x = line.split(/(\"|<|>)/)
        list << x[2]
      end
    end
  end
  list
end

file = ARGV[0]
exit(-1) if file == nil

depend(file).each do |x|
  puts x
end
```
まあ、とりあえずこんな感じで。

# 実際に次のようなコードを読み込ませてみる

```
> ruby depend_check.rb a.c
```

- a.c

```c
#include <stdio.h>
#include "a.h"
#include "include\b.h"
//#include "c.h"
#include "../c.h"
```

- 結果

```
stdio.h
a.h
include\b.h
../c.h
```

これでは、いったいどこのヘッダファイルが参照されているのかわからない。
ちゃんと知るには、includeパスを与えてやる必要がある。

#ひとまず、このスクリプトを再帰的に実行

- depend_check.bat

```bat
@echo off
for /f "usebackq" %%i in (`dir /B /S *.c`) do (
    ruby depend_check.rb %%i
)
```

ひとまずこれでcファイルからインクルードしている一覧ができた。

まだこれでは使い物ならんな。
ということで、次回へ続く（予定）。
UnityでC#を使う時に引っかかることリスト


何回か転んでるのでリスト化しておこうと思う。

# 命名部門
+ クラス名とファイル名が一致してないと死ぬ。

+ たぶん一般的なC#のプログラム(.NETクラスやMSDN的な書き方)だとPublicはUpperCamelCaseだけど、
UnityではUnityScriptに合わせてかLowerCamelCaseになっている。
共通のC#ライブラリ書くなら、UpperCamelCaseで書くべきだけど、Unity限定ならLowerCamelCaseの方が統一性があるかも。

# プログラマー初心者部門
+ float/doubleの数値で等値演算しちゃう
+ nullチェックを忘れる
+ 0で割り算しちゃう

# GameObject部門
もちろん抜け道はあるよ

+ Vector2/Vector3/Vector4にいれた小数点第4位未満の小さな値がmagnitudeとかで0に丸められる
+ positionで設定できる値に値域があるなんて知らなかったよ
+ Matrixでtransformを指定できない。
+ TransformについてTranslate, Rotate, Scaleがかかる順番についてはRotate=>Translate=>Scaleの順で掛かる
+ GameObjectを位置指定せずに生成すると原点に生成される。そのGameObjectを別のGameObjectの子にすると、親GameObjectのTransformの逆行列的なものが、子GameObjectに入力される(親を変える時に子Objectの世界座標は維持される)。
+ 上記について親を変更する時にLocalPosition,LocalRotate,LocalScaleをリセットするようなメソッドがほしいな。

# Editor部門
+ EditorでScreen.widthとかを呼ぶとEditorWindowのサイズが帰ってくる。
+ Editorで何か値を変えた時にその変更をキャッチしたければOnValidateを使う。例えば下記のようなケース

```C#

public class HogeBehaviour : MonoBehaviour
{
   [SerializeField]
   protected int _hogeProperty; // 実際にInspectorで操作される値.
   public int HogeProperty
   {
      get
      {
          return _hogeProperty;
      }
      set
      {
          updateHogeProperty(value); // Inspectorで直に変えた時はここは呼ばれない.
      }
   }
   
   protected void updateHogeProperty(int value)
   {
      _hogeProperty = value;
      // 以下HogePropertyに関する何かの処理.
   }
   
   void OnValidate() // Inspectorで値が変更された時に呼ばれる.
   {
      updateHogeProperty(_hogeProperty); 
   }
}
```

# Coroutine部門
Coroutineは同一スレッド内で処理される。
具体的には次のフレームのすべてのGameObjectのUpdateが終わった後に呼ぶことを予約しているだけ。

+ Coroutineを別スレッドだと勘違いして再入意識せずに書いちゃう

# 初期化関連部門
+ MonoBehaviourのコンストラクタ、デストラクタは使用しない。デストラクタなら大丈夫だろうと思うと赤い例外メッセージがコンソールで暴れることになる。
+ 初期化に静的コンストラクタを呼ぶと死ぬ。エディタでは死ななくてもビルド後のiOSとかAndroidとかで死ぬ。

```C#
いろいろ略

public class HogeBehaviour : MonoBehaviour
{
   public int aValue = StaticClass.StaticValue; // Boo!!
}

---

public static class StaticClass
{
   static public int StaticValue;
   
   static StaticClass()
   {
       StaticClass.StaticValue = 1;
   }
}
```

+ Taskとか使おうとするとなくて死ぬ。

# 文字コード部門
Macとかでは問題なくてもWindowsで死ぬ。Windows向けHack。
基本的に海外製のソフトは2バイトコードの扱いで死ぬことが多い
(日本語FEP起動でクラッシュするアプリとかそうだよね)。
アルファベット圏の人は基本的に2バイトコードに無頓着と思っていい。

+ 2バイト文字を使う時、Unity(MonoDeveloper?)は2バイト文字をうまく扱えないので末尾に"."を必ずつける。
(正確には行末がASCIIで終わっていれば安全なのだと思います。)

+ 文字コードはUTF-8BOM付きかUTF-16BEにする。

ここまで

**他に思い出したら追記するかもしれないし、飽きて寝るかもしれない。というか寝かせてくださいウヒィ。**

あと他にも罠があったりとかこれ違うぜとか回避方法とかあったらコメントとか、批判記事をお願いします(:D)TL
NovaでInstanceのresizeができないときの対処法

# はじめに
OpenStackを利用する際、インスタンスのリサイズを行おうとするとエラーになり、以下のようなエラーログが出力される場合がある。

```text
Unexpected error while running command.\nCommand: ssh ${ip-of-nova-compute} mkdir -p /var/lib/nova/instances/${instance-uuid}\nExit code: 255\nStdout: ''\nStderr: 'Host key verification failed.\\r\\n'\n"]
```
通常、OpenStack + KVMを利用している際、インスタンスのリサイズを行うとリソースの余っているKVMホストにリサイズとともにマイグレーションされる。その際、マイグレーション元のKVMホストからsshを用いてマイグレーション先のKVMホストに対象インスタンスのディレクトリを作成しようと試みる。リサイズでエラーが起こる場合は大抵このエラーに遭遇するのだが、こうなった際の対処法は2つある。

# 1. 同一ホストでリサイズを行うようにする
リサイズを行う際にマイグレーションを実行せずに自身のKVMホストでリサイズを行う方法。以下の設定を`/etc/nova/nova.conf`に入れることで可能になる。

```bash
# すべてのnovaノードで追加する
allow_resize_to_same_host=True
# nova-schedulerが稼働しているノードで追加する
scheduler_default_filters=AllHostsFilter
```

この場合の制約は、nova-schedulerのフィルターがAllHostsFilterに固定されてしまうことである。フィルターが使えず、かつ、同一ホストでリサイズされることによりコンピュートリソース全体の管理が難しくなってくる。なので、テスト目的以外での利用はおすすめできない、と、公式のドキュメントにも記載がある。

なお、VMwareをハイパーバイザーとして利用している場合には、nova-computeはvCenterとのやり取りをしているにすぎないため、基本的にはこの設定を入れて同一ホスト上でのリサイズしかできない(Icehouseの場合)。もし、Kiloで状況が変わっているなら誰か教えて欲しい。

# 2. novaユーザをログイン可能なユーザに変更し公開鍵を設定する
通常はこちらの方法をとる。やり方は以下のとおり。

* novaユーザのログインシェル有効化と秘密鍵/公開鍵生成
* `nova-api`が稼働しているノードで秘密鍵/公開鍵生成と、.ssh/configと.ssh/authorized_keysの作成
* 全てのnovaノードに共通の.ssh配下を展開する

## novaユーザのログインシェル有効化と秘密鍵/公開鍵生成
通常novaユーザは、以下のとおりログインシェルが設定されていない。

```shell-session
$ cat /etc/passwd | grep nova
nova:x:106:112::/var/lib/nova:/bin/false
```

そこでまずはログインシェルを`bash`に変更する。これはnova関連のプロセスが稼働しているすべてのホストで実行する。なお、novaユーザのデフォルトのホームディレクトリは`/usr/lib/nova`である。

```shell-session
$ sudo usermod -s /bin/bash nova
```

## `nova-api`が稼働しているノードで秘密鍵/公開鍵生成と、.ssh/configと.ssh/authorized_keysの作成
次に、`nova-api`が稼働しているホストでnovaユーザにスイッチして秘密鍵/公開鍵を生成する

```shell-session
$ sudo su nova
$ ssh-keygen -t rsa
```

その後、.ssh/configと.ssh/authorized_keysも作成する

```shell-session
$ cat << EOF > ~/.ssh/config
Host *
    StrictHostKeyChecking no
    UserKnownHostsFile=/dev/null
EOF
```

```shell-session
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys; chmod 600 ~/.ssh/authorized_keys
```

## 全てのnovaノードに共通の.ssh配下を展開する
`nova-api`ノードにおいて、

```shell-session
$ sudo su nova
$ cd ~/
$ tar zcvf /tmp/nova_ssh.tar.gz .ssh
$ scp /tmp/nova_ssh.tar.gz ${パスワードログインが可能な別のユーザ}@${全てのnovaノード}:/tmp
```

`nova-api`の.sshが配布されたノードにおいて以下を実行。実行ユーザがnovaユーザである必要は無い。

```shell-session
$ sudo tar xvzf /tmp/nova_ssh.tar.gz -C /var/lib/nova/
```

これでインスタンスのリサイズが可能になる。
Office 2013で拡張された「アプリ」というアドインについて

あまり情報が無く、かつWebで検索してもキーワードが一般的すぎて引っかからないんです。。

なので、一旦ここにメモ。

# 参照リンク

1. http://www.atmarkit.co.jp/ait/articles/1301/25/news063_3.html
2. http://www.atmarkit.co.jp/ait/articles/1303/04/news091.html

# 手順

1. javascriptを実装したhtmlファイルをwebサーバー上、もしくは共有サーバー上に置く
2. アプリ用のGUIDを取得する http://www.guidgen.com/
2. マニフェストファイル(xml形式)を作成し、サーバー上に置く
3. Excelオプション画面、セキュリティーセンターの設定から「信頼できるアプリカタログ」に上記共有フォルダを設定する
4. リボンの<挿入> からアプリを選択し挿入する

# htmlファイルの作り方
- ```<script src="https://appsforoffice.microsoft.com/lib/1.0/hosted/office.js"></script>``` を追加  
- 必要な初期処理を ```Office.initialize = function (reason) {}に記述する
技術英語 > I['m fairly new to the world of] Pi

http://www.instructables.com/id/1979-Bang-Olufsen-Raspberry-Pi-Internet-Radio/

> I'm fairly new to the world of Pi and was attracted by the comprehensive instructions


https://github.com/scottbass/Powershell
> I'm fairly new to powershell, so any constructive comments are most welcome.

fairで思い出したのは以下。

    a fair amount of code (かなりの量のコード)
rpmbuildでバイナリファイルが書き換えられてしまうのを防ぐ

rpmbuildでバイナリファイルを埋め込むとstripされて元ファイルと異なる。
元ファイルのままで埋め込みたいときはspecファイルに以下の一行を
入れておけば良い。

```bash
%define __spec_install_post /usr/lib/rpm/brp-compress || :
```

rpm で strip しない． - ぴょぴょぴょ？ - Linuxとかプログラミングの覚え書き -
http://d.hatena.ne.jp/pyopyopyo/20050205/p1

rpmbuild: disabling stripping in spec file?
http://www.redhat.com/archives/rpm-list/2005-March/msg00075.html
rebar3でhexにライブラリを公開する

# rebar3でhexにライブラリを公開する

rebar3は[hex](http://hex.pm)に登録されたライブラリを使用したり, hexにpublishすることができます.

## 導入
[hex](http://hex.pm)のトップページにも書かれていますが, 以下の記載を追加ないしはファイルを作成します.

```~/.config/rebar3/rebar.config
{plugins, [rebar3_hex]}.
```

その後, 以下のコマンドを実行し, hex pluginが使えるようになったことを確認しましょう.

```bash
$ rebar3 plugins list
===> Fetching jsx ({pkg,<<"jsx">>,<<"2.6.1">>})
===> Fetching ssl_verify_hostname ({pkg,<<"ssl_verify_hostname">>,
                                           <<"1.0.5">>})
===> Fetching rebar3_hex ({pkg,<<"rebar3_hex">>,<<"0.8.0">>})
===> Compiling ssl_verify_hostname
===> Compiling jsx
===> Compiling rebar3_hex
--- Global plugins ---
rebar3_hex
```

これで, hex pluginが利用できるようになりました.

## ユーザー登録をする

ライブラリを公開する為には, まずユーザー登録をする必要がある.
既にmixでhexを利用していて, ユーザー登録を済ませている場合は同じconfigファイルを参照する為, 登録は不要になる.

```bash
## user確認
$ rebar3 hex user whoami

## user登録
$ rebar3 hex user register
Username: ([])> 
Email: ([])> 
Password:
Password (confirm):
Registering...
Generating API key...
You are required to confirm your email to access your account, a confirmation email has been sent to XXXXX@XXX.XXX
```

メールが届くので, 記載のリンクに飛ぶと登録が完了する.

## ライブラリを公開する

ライブラリを公開する為にはいくつかの修正を加える必要があるかもしれません.

```src/bbmustache.app.src
{application,bbmustache,
             [{description,"Binary pattern match Based Mustache template engine for Erlang/OTP"},
              {vsn,"1.0.3"},
              {registered,[]},
              {applications,[kernel,stdlib]},
              {contributors,["Hinagiku Soranoba"]},
              {licenses,["MIT"]},
              {links,[{"GitHub","https://github.com/soranoba/bbmustache"}]},
              {env,[]}]}.
```
これは [bbmustache](http://github.com/soranoba/bbmustache) のapp.srcだが, `vsn`を変更し, `contributors`, `licenses`, `links`を追加した.
`vsn`は`hex`のバージョン規則に則って`majour.minor.patch`でバージョンを記載する必要がある.
また, application名が既に使われてしまっている場合は変更する必要がある.


以上の準備ができたら, 公開をしよう.

```bash
$ rebar3 hex publish
Publishing bbmustache 1.0.0
  Dependencies:
    
  Excluded dependencies (not part of the Hex package):
    
  Included files:
    src/bbmustache.app.src
    src/bbmustache.erl
    rebar.config
    rebar.lock
    README.md
    LICENSE
Proceed? ("Y")>
```

更新は以下のコマンドを使用すると良い

```bash
$ rebar3 hex cut
Select semver increment or other (Current 1.0.0):
1) patch
2) minor
3) major
4) other
[1-4] > 1
Publishing bbmustache 1.0.1
  Dependencies:
    
  Excluded dependencies (not part of the Hex package):
    
  Included files:
    src/bbmustache.app.src
    src/bbmustache.erl
    rebar.config
    rebar.lock
    README.md
    LICENSE
Proceed? ("Y")> 
```

このコマンドを実行した後で, `.app.src`が更新されるの`git commit`はその後で実行するようにすると良いだろう.
また, 表示されるバージョンがおかしい場合は `rebar3 update`を実行すると直るはずです.

## 最後に

他のコマンドについては [rebar3のドキュメント](http://www.rebar3.org/v3.0/docs/hex-package-management) に記載があるので, 「publishの権限を他の人に与えたい」時など, より詳しいことについてはこちらを参照して欲しい.


従来のURLを指定するやり方でも困ることはないかと思いますが, 折角なのでhexに公開していきましょうw

-----

余談ですが, ドキュメントもpublishできますが`doc/index.html`をpublishするようで`edown`だと`README.md`で何か良い方法を知っている方がいましたら, 是非ご教授ください.
(githubのドキュメントとしてはmarkdownの方が便利なので中々捨てがたいのです...)
centos6.6にpostgresql9.4をインストールして、heidisqlなどのクライアントツールから接続できるようにする

<div class="content">
<p>ルートになる。</p>
<pre><code>sudo -i</code></pre>

<p>pgdgをインストールする。</p>
<pre><code>yum localinstall http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-centos94-9.4-1.noarch.rpm</code></pre>

<p>postgresql9.4をインストールする。</p>
<pre><code>yum install postgresql94-server</code></pre>

<p>サーバを起動する前に、初期化を行う。</p>
<pre><code>/etc/init.d/postgresql-9.4 initdb</code></pre>

<p>クライアントツール（heidisql）からpostgresに接続できるように設定を一部変更する。</p>
<pre><code>vi /var/lib/pgsql/9.4/data/pg_hba.conf</code></pre>
<p>として</p>

<pre><code># "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident</code></pre>

<p>を下記の通り修正する。</p>
<pre><code># "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust</code></pre>

<p>postgressql9.4を起動する。</p>
<pre><code>/etc/init.d/postgresql-9.4 start</code></pre>

<p>postgresユーザに切り替わる</p>
<pre><code>sudo su - postgres

psql
CREATE ROLE staff WITH LOGIN CREATEDB;
\q

createdb staff</code></pre>

<p>これで一式作成完了。<br>
sshでポート転送すれば、centos上のpostgresに、ローカルのheidiSqlよりアクセスできました。<br>
（作業完了後にまとめて記録しているので、間違いがあったらすみません）</p>
</div>