OmniAICreator/Qiita-1.07M huggingface dataset:
EC2上のCoreOS内で動くDocker内のPlayアプリケーションのプロファイルを計測する

EC2上にCoreOSを動かし、そこでDockerコンテナを走らせている場合、JVMのプロファイルを取りたいと思っていたのですが、
どうもFlight Recorderがうまく動作しない気がしたので、EC2上のDocker環境で動くのを確認してみました。

## EC2上にCoreOSを起動する。

[こちらのCoreOSオフィシャルサイト](https://coreos.com/os/docs/latest/booting-on-ec2.html) から適当にCoreOSイメージを選択して起動します。

![Amazon EC2.png](https://qiita-image-store.s3.amazonaws.com/0/28681/2b79a683-0ce6-8529-fbe1-2451e84e6b69.png)

※ それっぽいボタン(右のLaunch Stack)を押すとCloudFormationで複数台起動することになるので注意。AMIのリンクを押して起動します。

EC2のインスタンスの作成はいろいろなところで解説されているのでそちらを参照して起動してください。

## CoreOSにログインし、Dockerインスタンスを起動する。

ログインはEC2にsshする標準の方法で。CoreOSのイメージはユーザ名`core`となるので注意。

### Dockerインスタンスの起動

Dockerのイメージは私が作成したCentOSにOracle JDK8がインストールされた以下のものを利用します。

```
docker run -p 80:9000 -id --name seed -v /var/tmp:/var/tmp chidakiyo/centos7-oracle-jdk8 /bin/bash
```

### Docker内に接続する

```
docker exec -it seed /bin/bash
```

## Docker内でPlayアプリケーションを起動する。

### 必要なモジュールのインストール

```
yum -y install git unzip
```

### Playのシンプルなアプリケーションを取得する
サンプルで取得したものを利用します。

```
git clone https://github.com/chidakiyo/sample-seed.git
```

### Playアプリケーションのビルド

```
cd sample-seed  

./activator dist
```

### Playアプリケーションの配置
```
unzip target/universal/play-scala-1.0-SNAPSHOT.zip -d /var/tmp/
```

### Playアプリケーションをフライトレコーダを有効にして実行

```
cd /var/tmp/play-scala*  

./bin/play-scala -J-XX:+UnlockCommercialFeatures -J-XX:+FlightRecorder
```

## Flight Recorderでプロファイルを取得を実行する

### PIDを調べる

```
jcmd
```

を実行し、`play.core.server.ProdServerStart`が起動されているPIDを調べる

### フライトレコーダでプロファイルの取得
```
jcmd {PID} JFR.start delay=1s duration=30s filename=/var/tmp/record_1.jfr
```

上記の例の場合、30秒間のみプロファイルの取得を行い`/var/tmp`配下にファイルを出力します。


## JFRファイルの取得と表示

### ファイルの取得
ファイルの取得はscpなどを利用して取得してください。  
Dockerの`/var/tmp/`ディレクトリはCoreOSの`/var/tmp`をマウントして起動しているので、CoreOS内の`/var/tmp`ディレクトリから取得できればOKです。

### ファイルを見る
Oracle Java (7以降) がインストールされた環境で`.jfr`ファイルをダブルクリックで実行します。 

![スクリーンショット 2015-07-28 16.24.44.png](https://qiita-image-store.s3.amazonaws.com/0/28681/58f184cb-324e-0fa4-9c26-fd7f2da72fa6.png)
 
きれいなグラフなどJVMの詳細な情報が見れましたね。
Arduino UnoをMacにつなぐ



[これ](http://qiita.com/urakarin/items/e4a90b25218ae0bebbb2)も[これ](http://qiita.com/urakarin/items/100cf72599f33772f9eb)も、元はと言えば

Arduino UnoをMac(Yosemite)に繋ごうと思ったらUSB-Serialとして認識してくれなかったよ、、

というのが始まりでした。
いよいよ本丸。

# MacのUSB-Serialとして認識させる

[ここ](http://forum.arduino.cc/index.php?topic=261375.0)によれば、[このサイト](http://www.wch.cn/download/CH341SER_MAC_ZIP.html)からドライバをダウンロードしていれて、デバッグモードで起動すればOKとかいてある。

ので、やってみる。

手元のArduino Unoはアリババから300円ほどで買ったもの。
VendorID: 0x1A86 (6790)
ProductID: 0x7523 (29987)

[上記サイト](http://www.wch.cn/download/CH341SER_MAC_ZIP.html)のDOWNLOADボタンを押したら、CH341SER_MAC.ZIP というのが手に入る。

解答するとインストーラがあるので実行。
どうも

```
/System/Library/Extensions/usb.kext
```

がインストールされた模様。大胆な名前よね。

中の Info.plistを確認してみると
idVendor: 6790
idProduct: 29987
と所望のものがありそう。

試しに、Arduinoをつないでみるが認識しない。まぁそうね。

```
sudo nvram boot-args="kext-dev-mode=1"
```

を実行してリブート。

認識した。
Arduino Unoとも繋がった模様。やったね。

おわり。
SVNでつまづいたなにがし

めもめも

# 存在しないファイルのロックを主張される

```text
Adding: J:\work\hogehoge\hguahuga
Deleting: J:\work\hogehoge\piyopiyo  
Error: コミットに失敗しました (詳しい理由は以下のとおりです):  
Error: Directory 'J:\work' is  
Error:  locked in another working copy  
Error: User 'real_analysis' does not own lock on path  
Error:  '/branches/working/hogehoge/piyopiyo/unfindedfile.txt'  
Error:  (currently locked by 'Ritsuko_Akizuki')  
```

ディレクトリの名前を変更しようとした時に文句を言われる。ところが対象のファイルがワーキングコピーはもちろんSVN上にも無い。

```bat
svn unlock --force "http://AkizukiTec/svn/branches/working/hogehoge/piyopiyo/unfindedfile.txt
```

ファイルあるとか無いとかどうでもいいのでunlockを投げる。ちゃんとロックを解除してくれる。
ActiveAdminで検索条件をカスタムする方法


# 実現したいこと
検索条件に何も指定しない場合に、NULLのデータのみ検索結果に表示したい
同一フォームで、「文字列が含まれている」、「文字列が等しい」、「文字列が空」で検索したい

# 問題
ActiveAdminのfilterは、なにか文字列が含まれていないと検索条件に含むことができない(where句に追加されない）

# 解決策

検索条件に`未設定`の文字列があったら、nilに変換する。これを実現するために、Ransackのcustom_predicateを作成する


## 設定ファイルに追加

```config/initializers/ransack.rb
Ransack.configure do |config|
  config.add_predicate 'equals_or_empty',
    arel_predicate: 'eq',
    formatter: proc { |v|
      v == '未設定' ? nil : v
    },
    validator: proc { |v| v.present? },
    compounds: true,
    type: :string
end
```

## ActiveAdmin Controllerに追加

```app/admin/example.rb
filter :name, filters: ['contains', 'equals_or_empty']
```

```app/admin/example.rb
ActiveAdmin.register Example do
  index do
    column :name do |example|
      if example.name.present?
        example.name
      else
        "未設定"
      end
    end
end
```

（Exampleは、適当なモデル名に読み替える）

containsは、適当な文字列で検索、equals_or_emptyは、未設定ならnullのデータを、未設定以外の文字列なら、通常のequalsと同じ動きをする


## ロケールに追加

```config/locales/activeadmin.ja.yml
---
ja:
  active_admin:
    filters:
        equals_or_empty: "等しい"
```

filtersに、equalsの代わりに自分で作成したequals_or_emptyを指定する。
eq(equals)と同じ名前にしておいた

# 余談

本当は、フォームに何も入力されていない場合にnilを設定するようにしたい。もしもっといい方法があればコメントが欲しいです。

最初、[ransacker](https://github.com/activerecord-hackery/ransack/wiki/Using-Ransackers)を使ってみたが、filtersで指定した条件でcondisionを決まるため、equalsを指定した場合に`name = ""`, containsを指定した場合に`name LIKE "%value%"になってしまう。入力文字列に合わせて`name is null`や、`name LIKE "%%"`をしたかったができなかった。どこかにArelを上書きするポイントがないものか、、

# 参考
- Ransackで定義されているpredicates([ransack/lib/ransack/adapters/active_record/ransack/constants.rb](https://github.com/activerecord-hackery/ransack/blob/c09aa177953deb27e28179f55844ced0489613b4/lib/ransack/adapters/active_record/ransack/constants.rb) )を参考に条件式を作った
- [ransack という検索用の gem について](http://blog.willnet.in/entry/2013/04/09/115216)では、[Ransack Custom Predicates](https://github.com/activerecord-hackery/ransack/wiki/Custom-Predicates)の日本語訳が書かれていた
- [ActiveAdmin Filters with Ransack](http://cavewall.jaguardesignstudio.com/2014/05/01/activeadmin-filters-with-ransack/)
- [ransack and ransackers](http://tap349.github.io/blog/2015/03/15/ransack-and-ransackers/)
CocoaPods 0.38からのtarget重複排除を無効化する

0.38以前で以下のようなPodfileを定義した場合…

```rb:Podfile
platform :ios, "7.0"

target "Foo" do
  pod "AFNetworking", "~> 2.5"
end

target "Bar" do
  pod "AFNetworking", "~> 2.5"
end
```

Podsプロジェクトで自動生成されるTARGETは、「Pods-Foo-AFNetworking」と「Pods-Bar-AFNetworking」の2つ出来上がります。
しかし0.38からは「AFNetworking」という1つのTARGETにまとめられるようになります。（例外あり）

[開発ブログより](http://blog.cocoapods.org/CocoaPods-0.38/)

> **Target Deduplication**
>CocoaPods now de-duplicates Pod targets, which means that it recognises when a dependency is used multiple times across different user targets but only needs to be built once. But sometimes this is not possible and they still need to be generated in different variants and thus build multiple times. The targets in Pods.xcodeproj need to be duplicated when one of the following conditions applies:
>
> * They are used on different platforms.
* They are used with differents sets of subspecs.
* They have any dependency which needs to be duplicated.
>
> This fixes several issues with Archiving apps with extensions, but also reduces build times significantly.

上記にある通り、いくつかの問題解決のためとビルド時間の短縮効果のためだと思われます。
そもそも、同じライブラリなのだから個別にビルドする必要は無いと言えばないのですが…

ところがどっこい！
有名な「AFNetworking」などは、本体とExtensionで別々のビルドコンフィグ（プリプロセッサ）を指定したい！
という事情があったりして、1つにまとめられてしまうと非常に困ります。

そこで、0.38以前のように個別のTARGETにするには上記開発ブログにある通り3つの例外を利用します。

1つ目が下記のように「Platform」指定を変えてしまうことです。

```rb:Podfile
target "Foo" do
  platform :ios, "7.0"
  pod "AFNetworking", "~> 2.5"
end

target "Bar" do
  platform :ios, "8.0"
  pod "AFNetworking", "~> 2.5"
end
```

iOSの場合、例えば「WatchKit Extension」は8.2からの指定で本体は7.0で良いというようなケースでこの方法が使えます。2つ目が別の「subspecs」を指定することです。

```rb:Podfile
platform :ios, "7.0"

target "Foo" do
  pod "AFNetworking", "~> 2.5"
end

target "Bar" do
  pod "AFNetworking", "~> 2.5", :subspecs => ['Serialization', 'Security', 'Reachability', 'NSURLConnection', 'NSURLSession']
end
```

「subspecs無指定」と「全指定」でも別々のTARGETになります。

3つ目が良くわからないのですが、CocoaPodsが重複して作る必要があると判断した場合（依存関係など？）のようです。
私は、今のところ「subspecs」を分けて指定することで問題が解決できています。

また、0.38から「installer」クラスのプロパティである「project」が無くなって「pods_project」に変わっているので、参考までにビルドコンフィグを変える所まで書いておきます。

```rb:Podfile
platform :ios, "7.0"

target "Foo" do
  pod "AFNetworking", "~> 2.5"
end

target "Bar" do
  pod "AFNetworking", "~> 2.5", :subspecs => ['Serialization', 'Security', 'Reachability', 'NSURLConnection', 'NSURLSession']
end

post_install do |installer|
  # 変更したいビルドターゲットを探す
  classy_pods_target = installer.pods_project.targets.find{ |target| target.name == "Pods-Bar-AFNetworking" }
  unless classy_pods_target
    raise ::Pod::Informative, "Not Found 'Pods-Bar-AFNetworking' target"
  end

  # ビルド設定を変更
  classy_pods_target.build_configurations.each do |config|
    # Preprocessor Macrosを変更する
    config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'AF_APP_EXTENSIONS=1']
  end
end
```
YosemiteでUSB Prober


[ここ](http://qiita.com/urakarin/items/100cf72599f33772f9eb)関連で、USB Proberが欲しいなぁと思った。

USB Proberとは、USBの情報が見られる便利ツール。これまでは、Dev toolとしてMacに簡単に入れることができていたのに、いつの間にか提供されくなっていた。

あらら。

ぐぐってみると[Appleの開発者サイト](https://developer.apple.com/downloads)（要ログイン）からもってこれるというので、

```
IOUSBFamili Log Release for OX X 10.9.4
```
ていうのを持ってきた。10.10用のものはないようだ。

とある[サイト](http://superuser.com/questions/781982/how-can-i-install-usb-prober-from-the-developer-sdk-on-mac-os-x)を斜め読みして10.10でも使えるんだーと早とちりしたので、DLしてインストーラを叩いてインストールしてみた。

ここが悲劇の始まり。

# 悲劇

本当は、中のUSB Prober.appだけを使え、という話だったようなのに、インストーラを叩いたおかげで、USB Host Driver (IOUSBFamili.kext)も古いものに上書き更新してしまったらしい。

インストール後、リブートするとMac Book Pro上のキーボード、トラックパッドが全く動かない。BTもバッテンマーク。画面は出ている。Thunderbolt EtherはOKぽい。USB関連だけがダメなようだ。

ここで、あーやっちまったな、、と認識。

# 復活
ネットワークは生きているようなので、外部からScreen Shareで接続して操作。社内の別MacからYosemiteの最新IOUSBFamily.kextをおすそ分けいただいてコピー。

そしてリブート。
あれ、動かない。

```
sudo kextcache -system-cache
```

して、再度リブート。ここでようやく復活。

焦ったわー。

ちなみに、USB Proberは無事動いています。便利。

おわり。
VagrantでCentOS7でAnsibleインストール


# 実行環境
- osx
- Vagrant
- virtualbox


## CentOS7をインストール

```bash:osx
$ mkdir centos7
$ cd centos7
$ vagrant init chef/centos-7.0; vagrant up --provider virtualbox
```

## CentOSにAnsibleをインストール

CentOSにログイン

```bash:osx
$ vagrant ssh
```

yumの追加リポジトリepelが必要なのでインストールしてからAnsibleをインストール

```bash:centos
$ sudo yum install -y epel-release
$ sudo yum install -y ansible
```

バージョンを確認して終わり

```bash:centos
$ ansible --version
ansible 1.9.2
```
RSAQ2 をYosemiteで使う


しばらくぶりに[RSAQ2](http://www.iodata.jp/prod/mobile/serial/2003/usb-rsaq2/)をMacに繋いだら、認識してくれなかった。
そういえば、このMacBookPro(Yosemite)にしてから使っていなかったかも。
古い方のMacBookPro(Mavericks)までは普通に使ってたのに。

対象は[こちら](http://www.iodata.jp/prod/mobile/serial/2003/usb-rsaq2/)
VendorID:067B (1659)
ProductID:04BB (1211)

ということで、試行錯誤した記録。
いろいろ大変なことになってしまったのだけど、結局[ここ](http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=229&pcid=41)に、

```
Download File: md_PL2303_MacOSX-10.6-10.10_v1.5.1.zip
```
というのがあって、Yosemite対応て書いてあるので、入れてみても動かない。
どうしてだろうと思って 

```
/System/Library/Extensions/ProlificUsbSerial.kext/Contents/Info.plist
```
を見てみると、対応するidVendor/idProductは登録されていない。。

なので、同ページの少し下の方にある

```
or download Third-Party Compatible Drivers:

PL2303 Serial-USB on OSX Lion
```

へ飛ぶと、[こんなページ](http://www.xbsd.nl/2011/07/pl2303-serial-usb-on-osx-lion.html)があった。
リンクされている http://www.xbsd.nl/pub/osx-pl2303.kext.tgz を落とすと、osx-pl2303.kext が入っていて、Info.plist を確認すると該当するidVendor/idProductを発見。
入れてみたら動いた。

やったね。

# おまけ

本当は、途中でUSB Prober入れてみたらUSB関連が全く動かなくなったり（IOUSBFamili.kextを10.9用のもので上書きしてしまったらしい）、大変だったことなんかもあったけど、それはまた[別のお話](http://qiita.com/urakarin/items/e4a90b25218ae0bebbb2)。

# おまけ2
途中、署名周りも疑って

```
sudo nvram boot-args="kext-dev-mode=1"
```

もしたけど、最終的にはこれがなくても良かったぽい。
上記を解除するのは

```
sudo nvram boot-args=""
```

としたけど、これでよかったのかしら[^1]？

[^1]: [ここ](http://tukaikta.blog135.fc2.com/blog-entry-89.html)によればOKみたい。ナイス。



おわり。
【Yahooショッピング】　複数ストアでのアプリケーションID共用について

お世話になります。
アプリケーションIDと認可コードについて教えてください。
ひとつのアカウントで複数のYaoooショッピングストアを運営しているのですが、
たとえば複数のストアの在庫更新APIに同時にアクセスする場合、
同一のアプリケーションIDで認可コードを別々に取得すれば問題ないでしょうか？
もしくは、店舗ごとにアプリケーションIDが必要になりますでしょうか？
ご教示いただけますと幸いです。
どうぞよろしくお願いいたします。
有理数オブジェクト？？

scivola様、問題がありましたら削除させて頂きます。今回はありがとうございました。


基本式 円周率の分数近似の値を算出(面白い！！)

```
    approx = 355 / 113r # 有理数オブジェクト

    puts "円周率 #{Math::PI} の分数近似 #{approx} ＝ #{approx.to_f}"


```

有理数オブジェクト

>まず有理数ってなんだっけ？？
有理数は二つの整数a,b(ただし分母にあたるbは0ではない)をもちいてa/bという分数で表せる数を指す。

>有理数オブジェクトってつまり何？？
数値を表すRational(有理数クラス)に属するオブジェクトのことを指す。
実数を表すクラスならFloatがあればよいのでは？と思われますが、Rationalは1/3のような実数で表すと0.3333333となってしまう循環小数を正確に表せるお得なオブジェクトです。


>approx 近似を表す変数
Math::PI Mathモジュールで用意されている定数 円周率を記述
to_f　整数や分数を浮動小数点数に変換するメソッド


no use to_f ver
to_fメソッドがない為、分数で処理され、記述

```
  円周率 3.141592653589793 の分数近似 355/113 ＝ 355/113
```



参考site
>URL http://www.atmarkit.co.jp/ait/articles/1407/29/news030.html
cocos2d-xのwebviewクラスを使う

## cocos2d-xでwebviewを使う

cocos2d-x v3.x系はwebviewを簡単に組み込める。ios・android気にせず使えるのは非常に便利。
ローカルファイルも簡単に読み込めるのでオンライン・オフラインどちらも対応できる。

- ubuntu14.04
- android 4.4
- cocos2d-x v3.4 (手元にあったのが古くて申し訳ない)

cocos2d-xはすでに導入済みとする

### プロジェクトを作る

```
cocos new webview -p com.caad1229.webview -l cpp
```

### とりあえずWebViewを出してみる

WebViewオブジェクトを生成。`HelloWorldScene.cpp`の`init()`に追加。

``` c++
#include "ui/CocosGUI.h"

bool HelloWorld::init()
{
	//
	// 省略
	//

	{
	    auto webView = cocos2d::experimental::ui::WebView::create();
	    webView->loadURL("http://yahoo.co.jp");

	    // ポジションとサイズを調整
	    Size screen = Director::getInstance()->getOpenGLView()->getDesignResolutionSize();
	    webView->setAnchorPoint(Vec2::ANCHOR_MIDDLE_RIGHT);
	    webView->setContentSize(Size(screen.width/2, screen.height));
	    webView->setPosition(Vec2(screen.width, screen.height/2));

	    this->addChild(webView);
	}
}
```

エミュレータもしくは実機を接続した状態でビルド&実行

```
cocos run -p android
```

以下のようになるはず。

![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/77816/9dbc4175-a261-2af9-45d2-8cd0266bea99.png)

### ローカルファイルを出してみる

アプリ内部に保持しているファイルを読み込むこともできる。これにより、例えばオフラインでも指定したhtmlを読み込ませることができる。

#### ローカルファイルの追加

画像などいれる`Resouces`フォルダにファイルをいれる。今回は`help.html`

``` html
$ vim ./Resouces/help.html
	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <title>help</title>
	</head>
	<body>
	    <h1>
	        WebView Help Test Page
	    </h1>
	    <p>test test test</p>
	</body>
	</html>
```

`HelloWorldScene.cpp`の`init()`に追加。ほとんど同じで、`loadURL`が`loadFile`になるだけ。

``` c++
    {
        auto webView = cocos2d::experimental::ui::WebView::create();
        webView->loadFile("help.html");

        // ポジションとサイズを調整
        Size screen = Director::getInstance()->getOpenGLView()->getDesignResolutionSize();
        webView->setAnchorPoint(Vec2::ANCHOR_MIDDLE_LEFT);
        webView->setContentSize(Size(screen.width/2, screen.height));
        webView->setPosition(Vec2(0, screen.height/2));

        this->addChild(webView);
    }
```

確認してみると、以下のようになる。

![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/77816/b4b1f270-fd43-f19c-e030-52c8d05a28d8.png)

## まとめ


最新のv3.6でも`experimental`となっており実験段階の模様。ただ、複雑に使わない限り十分かと思う。[リファレンス](http://www.cocos2d-x.org/reference/native-cpp/V3.6/da/d62/classcocos2d_1_1experimental_1_1ui_1_1_web_view.html#details)には様々なコールバック関数や、webviewを制御するAPIが用意されている。

cocos2d-xなので、使うのはゲームのヘルプとかになりそうだけれども、htmlだと手軽に色々な使い方もできそうですね。ちなみに当然だけれどもLinuxはないです。

プロジェクト[github](https://github.com/caad1229/cocos_webview)(容量削減のためcocos2d-xライブラリは抜いてあります)。
if文　演習　基本編


変数にメソッドが入るんは気持ちいい！！

```rb
x = 111*111
y = 66*66
z = ""

#xが12000より大きい場合に"変数xは12000より大きい"と記述
x = 12000

if x >= 12000
  puts  "変数xは12000より大きい"
end

#yが5000より大きい場合に"変数yは5000より大きい"と記述 
y = 66*66

if y >= 5000
  puts  "変数yは5000より大きい"
end       

#zが空の文字列の場合に"変数zは空です"と記述
z = ""

if z.empty?
  puts  "変数zは空です" 
end  

```

if文　演習　分岐編

```rb
word = "apple"
puts "りんごに対する英単語を入力してください"

answer = gets.chomp

if answer.empty? # answer's add in method(gets,chomp,empty)now
  puts "入力されていません"
elsif word == answer
  puts "正解です"
else
  puts "不正解です"
end      
```

if文 演習 論理演算子編

```rb
puts "パスワードを入力してください"
password = gets.chomp

#変数password_lengthにpasswordの文字数を代入してください
password_length = password.length

#password_lengthが0でない場合に"パスワードが入力されました"と記述してください。
unless password_length == 0
  puts "パスワードが入力されました"
end

#password_lengthが4文字以上10文字以下の場合に"パスワードは適切な長さです" とputsしてください
if password_length >= 4 && password_length <= 10
  puts "パスワードは適切な長さです"
end  

```

```rb

#論理演算子  && || は複数の条件を一つにまとめます
#&&(かつ)は左右の式がともに「真」の場合、全体も真
if x >= 10 && <= 30
  puts "xは10より大きい、かつ30より小さい"
end

#||(または)は左右の式のどちらか、または両方が「真」の場合全体も真になる
if x < 10 || x > 30
  puts "xは10より小さい,または30より大きい"
end  

```
```rb
#unless文
#if文の逆で、条件が「偽」の時に処理が行われます。内容が真でない限り処理される。
x = 20 
unless x == 30
  puts "xは30ではありません"
end
Raspberry Piで音声認識（パフォーマンス改善）


## 悩み

前回の[Raspberry Piで音声認識](http://qiita.com/t_oginogin/items/f0ba9d2eb622c05558f4)でマイクで話した言葉を認識するようになりました。

ですが、マイクで話してから認識するまでに2-3秒かかってしまいました。

そして、なかなか自分の話した言葉を認識してもらえません。（誤認識が多い）

さくっと認識してほしいものです。

## 認識時間を早め、認識率を上げる

認識までの時間がかかる点と、誤認識については、辞書が大きすぎることが原因と考えました。（文法解析まで含めているせいもあると思います）

認識してほしい言葉は限られているので、専用の辞書を作ってパフォーマンスを改善しようと思います。。

参考: [日本語音声認識](http://cubic9.com/Devel/%C5%C5%BB%D2%B9%A9%BA%EE/RaspberryPi/%C6%FC%CB%DC%B8%EC%B2%BB%C0%BC%C7%A7%BC%B1/)の'オリジナル単語辞書を作る'

### 辞書を作る

まず認識させたい言葉の読みを作成します。
単語間はタブ区切りで、最終行は改行が入らないようにする必要があるそうです。

```bash:weather.yomi
天気    てんき
気温    きおん
紫外線  しがいせん
```

次に、辞書形式に変換します。
yomiファイルの場所やyomi2voca.plの場所などは適宜置き換えてください。

```bash
$ iconv -f utf8 -t eucjp ~/weather.yomi | ~/julius-kits/dictation-kit-v4.3.1-linux/bin/yomi2voca.pl > ~/julius-kits/dictation-kit-v4.3.1-linux/weather.dic
```

### 設定ファイルを作る

今度は変換した辞書を使うための設定ファイルを作成します。
設定値はmain.jconfを参照にしました。

```bash:weather.jconf
-w weather.dic
-v model/lang_m/bccwj.60k.htkdic
-h model/phone_m/jnas-tri-3k16-gid.binhmm
-hlist model/phone_m/logicalTri
-lmp 8.0 -2.0
-lmp2 8.0 -2.0
-b 1500
-b2 100
-s 500
-m 10000
-n 30
-output 1
-input mic
-zmeanframe
-rejectshort 800
-charconv EUC-JP UTF-8
```

### 動作確認

最後に、この設定ファイルを使って起動します。

```bash
$ ALSADEV="plughw:0,0" ~/julius-4.3.1/julius/julius -C ~/julius-kits/dictation-kit-v4.3.1-linux/weather.jconf -nostrip
```

```bash
### read waveform input
Stat: adin_oss: device name = /dev/dsp (application default)
Stat: adin_oss: sampling rate = 16000Hz
Stat: adin_oss: going to set latency to 50 msec
Stat: adin_oss: audio I/O Latency = 32 msec (fragment size = 512 samples)
STAT: AD-in thread created
pass1_best: 天気
pass1_best_wordseq: 天気
pass1_best_phonemeseq: silB t e N k i silE
pass1_best_score: -1967.845459
sentence1: 天気
wseq1: 天気
phseq1: silB t e N k i silE
cmscore1: 1.000
score1: -1967.845459

pass1_best: 晴れ
pass1_best_wordseq: 晴れ
pass1_best_phonemeseq: silB h a r e silE
pass1_best_score: -1813.533447
sentence1: 晴れ
wseq1: 晴れ
phseq1: silB h a r e silE
cmscore1: 0.930
score1: -1813.533447

<<< please speak >>>
```

認識されるまでの時間も短縮され、スコアも上がりました！
MTGカード画像認識アプリ作っています

# 前置き

[Magic: the Gathering](http://mtg-jp.com/)が好きです。

ウェザーライト、5th、テンペスト、ストロングホールド。
休み時間に友達と対戦していました。

環境[^1]が変わりそこからしばらく離れていましたが
最近また興味を持って情報を追っていました。

10数年の歳月、知らぬ間にこんなにエキスパンションを重ねていたなんて！[^2]

オークションで、引退する方からカード2.5万枚ほど購入してみました。
しかしダンボールを開けてみると殆どが役に立たないコモン・アンコモン...[^3]

この悔しい思いを何とかプラスに転ずべく
何かMTGのアプリを作ろうと思い立ち、このエントリに至ります。

(大量のコモンを手にPauper[^4]にも目覚めますがそれはまた別の話)

# 画像認識ライブラリについて

ギャップロ様提供の画像認識ライブラリを利用しました。
[画像認識ライブラリ](http://www.gaprot.jp/labo/lib-ir/)

なんと特徴点データ生成ツールまであります！
これはありがたい。

# サンプルを動作させるまで

Xcode6.4使用。

## 画像認識ライブラリダウンロード

[画像認識ライブラリ](http://www.gaprot.jp/labo/lib-ir/)
ページ内の「画像認識ライブラリ for iOSをダウンロード」でファイル一式をダウンロード。

展開し適当なディレクトリに中身をコピー。

/framework/GPImageRecognitionEngine.framework.zip を展開しておく。

## OpenCVダウンロード

[OpenCV > DOWNLOADS](http://opencv.org/downloads.html)

こちらからダウンロード。

2015/7時点で最新版は3.0でしたが、ビルドエラーが出たので2.4.9を使用。

展開し、中身を先程のディレクトリの /framework と同階層に配置。

## プロジェクト設定変更

#### General:
　Bundle Identifierを自分の開発用の値に変更
　Deployment Target を 8.4 に変更

#### Build Settings:
　Valid Architecturesにarm64を追加
　Code Signing Identity、Provisioning Profileを自分の開発用の値に変更

#### Build Phases:
　Link Binary With Librariesに以下を追加
　GPImageRecognitionEngine.framework
　opencv2.framework

これで実機で動かせるはず。

## 動作確認

サンプルプロジェクトを起動するとカメラが動作状態となります。

用意されているテスト画像を写してみます。
/sample project/marker

![image (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/63205/d6809d4c-16c7-fe98-95eb-34d14c088f97.jpeg)

無事動きました！

# カードの特徴点データ作成
DatasetCreatorを起動します。

サンプルデータとして、今回は「トロスターニの召喚士/Trostani's Summoner」を使用。

[トロスターニの召喚士/Trostani's Summoner](http://mtgwiki.com/wiki/%E3%83%88%E3%83%AD%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%8B%E3%81%AE%E5%8F%AC%E5%96%9A%E5%A3%AB/Trostani%27s_Summoner)
召喚と同時に3体のトークンを出す強力なカードです。

項目追加から読み込ませ
タグを設定し
認識器「GPFineRecognizer」を選択し
最大特徴点数:400で
「データセット出力」

しかしカメラにカードを写しても認識せず。

今度はカードの上半分のみの画像ファイルを作りデータ再作成。

![スクリーンショット 2015-07-28 15.43.43.png](https://qiita-image-store.s3.amazonaws.com/0/63205/47b7955d-5476-9802-adf7-b5daff1884e4.png)

試したところ

![image.jpg](https://qiita-image-store.s3.amazonaws.com/0/63205/7a379162-fade-5961-119a-902cb1bc0a7a.jpeg)

認識しました！

# おわりに

当初はエキスパンションシンボルを認識する機能を作っていましたが

>「標識や記号、境界線が曖昧な色合いの画像は認識できない場合があります。」

と、画像認識ライブラリが不得手なパターンだったようで、思い通りに動作しませんでした。

何だか面白そうだな、と思ってもらえたら幸いです。

あとはすべてのカードの画像特徴点データを作れば良いのかな。


[^1]: MTGの環境ではなく私の環境

[^2]: [M:TG Wiki カードセット一覧](http://mtgwiki.com/wiki/%E3%82%AB%E3%83%BC%E3%83%89%E3%82%BB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7)

[^3]: 私はオークションで騙されたのだろうか...　いやいや説明文を読めばそう取れなくもないし、騙されたとは言えないか...　しかし割高な買い物だったな。

[^4]: Pauperについては [MTG Pauperブログ”シミてく(゜-゜)”](http://simiteku.com/) で詳しく楽しく解説されています。
【FileMaker】文字列を取り出す　類似識別子の対応

[前回](http://qiita.com/tyuma/items/2dbafe09787e37395265)は、一つの識別子で文字列を取得しましたが、今回は識別子が曖昧なケースの対応です。

テーブルやフィールド構成は、前回と同様です。

| フィールド名 | タイプ |
|:------------|:------|
| 本文 | テキスト |
| 名前 | 計算 |

違うところは、レコードによって、識別子が微妙に違うところです。

（その１）
>お申し込みありがとうございます。
>
> 以下の内容で承りました。
> [お名前] なんとか　かんとか
> [生年月日] 2000/1/1

（その２）
>お申し込みありがとうございます。
>
> 以下の内容で承りました。
> [名前] なんとか　かんとか
> [生年月日] 2000/1/1


モヤモヤっと叫びたくなりますが、FileMakerユーザのシステムにはよくあることなので、気持ちを落ち着かせて対応します。

技術者として色々コードを短縮化したいと思うのですが、ユーザがメンテナンスをすることを考え、冗長ですが一般人にもわかりやすく実装してみました。

```
Let ( 
      [ 

moji1% = "[お名前]" ; 
pos_start1% = Position ( 本文 ; moji1% ; 1 ; 1 ) ;
moji_cnt1% = Length ( moji1% ) ; 
pos_end1% = Position ( 本文 ; "¶" ; pos_start1% ; 1 ) - 1 ;

moji2% = "[名前]" ; 
pos_start2% = Position ( 本文 ; moji2% ; 1 ; 1 ) ;
moji_cnt2% = Length ( moji2% ) ; 
pos_end2% = Position ( 本文 ; "¶" ; pos_start2% ; 1 ) - 1 ;

      ] ; 

Case(
pos_start1%  ≠  0 ; Middle ( 本文 ; pos_start1% + moji_cnt1% ; pos_end1% - ( pos_start1% + moji_cnt1% ) + 1 )  ;
pos_start2%  ≠  0 ; Middle ( 本文 ; pos_start2% + moji_cnt2% ; pos_end2% - ( pos_start2% + moji_cnt2% ) + 1 )  ;
""
)

)
```

前回のは一つの識別子対応でしたが、今回のような複数の識別子も考慮するケースならば、一つの識別子のところも同様のフォーマットで修正して実装してあげるのがメンテナンスしやすいと思います。

ではでは。
Rubyの"る"

Railstutorialで登場したRubyの記法についてのメモ
随時更新

# 式展開
文字列に変数を代入する

```rb:filename
name = "Taro"
"#{name} is good!"
```
`=> "Taro is good!"`

## 注意
シングルクォート内では式展開は行われない

```rb:filename
name = "Taro"
'#{name} is good!'
```
`=> "#{name} is good!"`

# 文字列の配列に変換する

```rb:filename
%w[foo bar baz quux]
```

`=> ["foo", "bar", "baz", "quux"]`

# ブロック
体で覚える！
[Cocos2dx] Gray Scale Shader


Shader Script:

```cpp
#ifdef GL_ES
precision mediump float;
#endif
uniform sampler2D u_texture;
varying vec2 v_texCoord;
varying vec4 v_fragmentColor;
void main(void)
{
    // Convert to greyscale using NTSC weightings
    float alpha = texture2D(u_texture, v_texCoord).a;
    float grey = dot(texture2D(u_texture, v_texCoord).rgb, vec3(0.299, 0.587, 0.114));
    gl_FragColor = vec4(grey, grey, grey, alpha);
}                                                                                          
```

Use the shader script in CCSprite:

```cpp
//Create shader
CCGLProgram *shader = new CCGLProgram();
shader->initWithVertexShaderByteArray(ccPositionTextureA8Color_vert, shader_frag_grayscale);
shader->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position);
shader->addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color);
shader->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords);
shader->link();
shader->updateUniforms();

//Setup shader program to sprite
sprite->setShaderProgram(shader);
```

`shader_frag_grayscale` is the content of the shader script.

**Update:**

If you want to change the alpha of the sprite, you should set the blend mode in CCSprite to this:

```cpp
m_sBlendFunc.src = GL_SRC_ALPHA;
m_sBlendFunc.dst = GL_ONE_MINUS_SRC_ALPHA;
```

Then if you change the `alpha` here will work.

```
gl_FragColor = vec4(grey, grey, grey, alpha);
```

参考：

[グレースケールのアニメーション表示をしてみる](http://wonderpla.net/blog/engineer/Cocos2dx_GrayscaleShader/)
[Cocos2d-x 2.x CCSprite 灰白图的生成（利用shader设置）](http://www.cocos2dev.com/?p=325)
docker run するときにUID,GIDを指定する

# 追記 2021-02-04

自分のidを指定したいときは

```
docker run --rm -u `id -u`:`id -g` \
 -v $PWD:/work ubuntu:latest touch /work/uid1000gid1000.txt
```


# docker run するときに UID, GIDを指定する

マルチユーザーを想定して、コンテナを動かすときにユーザーのIDを指定したうえで、コンテナ内のコマンドが実行できるのか、手元の環境 docker 1.6.0 で確認してみた。

## オフィシャルのドキュメントによると

* [Docker Docs](https://docs.docker.com/reference/run/)

Dockerfileの中に記述するのであれば、USERを使うことで任意のUIDでコンテナを実行できることが書いてあり、さらにコマンドラインからでも -u="" の形で指定することでこのオプションを上書きすることができる。

ただ、GIDも指定できるようにはみえなかった。


## コマンドラインのヘルプで確認する

以下のコマンドで確認してみた
```
docker run --help
```
出力から抜粋
```
  -u, --user=                Username or UID (format: <name|uid>[:<group|gid>])
```

ということで、gidも指定できそうであった。


# UID 1000, GID 1000 でコンテナを動かしたい

docker 1.6.0 では

```
docker run --rm -u=1000:1000 -v $PWD:/work ubuntu:latest touch /work/uid1000gid1000.txt
```

確認する。

```
$ ls -ln uid1000gid1000.txt 
-rw-r--r--. 1 1000 1000 0 Jul 28 15:29 uid1000gid1000.txt
```
## 追記(2016-08-02)

複数のgidを指定したいときは、*--group-add*を使えば良い
(このオプションがいつからつかえるようになっているかはわからないが、1.11.2 ではつかえるようだ)

```
--group-add=2000
```

# 今後
* ほかのバージョンでどうなるのか試してみたい。
* デーモンもうまく動かせるケースもあるのかを確認してみたい。
ヘルパーって何？

Railstutorilを読んでヘルパーについてわかってきたことを少しづつメモ
[HTMLの雛形](http://qiita.com/histori/items/9b5af7d38ee8b8527bd2)で使う関数もここにメモしておく

# こんな関数欲しいな→自分で作る

## 場所
```rb:app/helpers/application_helper.rb
module ApplicationHelper
end
```
真っ白なキャンバスに書き放題！
### 条件分岐で文字列を書き分ける例
```rb:app/helpers/application_helper.rb
module ApplicationHelper
  def hoge(foo)
    bar = "Hello, world"
    if foo.empty?
      bar
    else
      "I am going to be king of the pilates"
    end
  end
end
```
# HTMLの雛形で使う関数
```rb:app/helpers/application_helper.rb
module ApplicationHelper
  # ページごとの完全なタイトルを返す
  def full_title(page_title)
    base_title = "ほげほげ"
    if page_title.empty?
      base_title
    else
      "#{base_title} | #{page_title}"
    end
  end
end
```
Processingでキモい生物をつくる


![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/84973/c888e673-8f84-49ed-00fb-637c907b6051.png)
有機的な動きを表現するのはprocessingに限らず難しいものです。
なるべく短くしたスクリプトで微生物、深海生物を表現しました。

```lang:creatures.pde
ArrayList<Branch> branches;
int len=100;

void setup() {
  background(0);
  size(1000, 800);
  stroke(255, 30);
  
  branches=new ArrayList<Branch>();
  for (int i = 0; i < len; i++) {
    branches.add(new Branch());
  }
  
}

void draw() {
  background(0);
  for (int i = 0; i < branches.size (); i++) {
    Branch b = (Branch) branches.get(i);

    pushMatrix();
    translate(width/2, height/2);
    rotate(radians(b.startAngle));
    b.branch(b.segments);
    popMatrix();

    strokeWeight(random(20));
    ellipse(width/2, height/2, 5, 5);
  }
}

void mousePressed() {
  setup();
}

void keyPressed() {
  if ( key == ' ' ) {
    save( "hoge.png" );
  }
}
```
setup()内の主なスクリプトです。
#ArrayList
配列の長さが決まっていない場合に使うクラスで可変長配列とよばれています。setup()内でnew演算子を使ってオブジェクトを作成します。
**ArrayList 変数名 = new ArrayList();**

もしくは下記のように作成します。
**ArrayList<型> 変数名 = new ArrayList<型>();**
そのあとfor文に以下を記述します。
**変数名.add(new 型());**

そしてdraw()内でオブジェクトbを宣言し、branchesから触手を表示させます。
**クラス名.オブジェクト=(クラス名) 変数名.get();**



こちらは触手を発生させるclassです。

```lang:Branch.pde
class Branch {
  float segments, startAngle, angle, theta, num;
  Branch(){
    segments = random(80);
    startAngle = random(-360, 360);
    angle = map(startAngle, -360, 360, -10, 10);
  }
  
  void branch(float len){
    len *= 0.85;
    float t = random(5);
    theta = angle + sin(len+num) * 10;
    strokeWeight(t*2);
    noFill();
    line(0, 0, 0, -len);
    
    fill(255);
    ellipse(0, 0, t, t);
    translate(0, -len);
    if(len > 5){
      pushMatrix();
      rotate(radians(-theta));
      branch(len);
      popMatrix(); 
    }
    num += 0.005;
  }
}
```
#map
**map(a, b, c, d, e)**
aを範囲b-cから別の範囲d-eへ変換します。今回は360度のランダム値をstartAngleを格納し、-10〜10へ変換しています。

#branch()関数
void branch(float len){}内にさらにbranch(len)を呼ぶことにより、触手を伸ばすようにしています。

参考：http://www.openprocessing.org/sketch/158344
オブジェクトの型変換

# オブジェクトの型変換

```rb
x = "3" # 文字列
y = 10  # 整数

puts x.to_i + y
puts y.to_s + "個のappleがあります"
puts y.to_f 
```

# result

```
13
10個のappleがあります
10.0
```  
 
# 型変換の種類 


- `to_i` (to_integer: 文字列を10進数の表現と見なして整数に変換します)
- `to_s` (to_string: 整数を文字列に変換します)
- `to_f` (to_float: 整数を浮動小数点に変換します）
Railsの関数、ヘルパー

Railstutrialで登場する関数、ヘルパーのメモ
随時更新

# Viewの中で使えるもの

## ビューの内容をレイアウトファイルに渡す
　`provide(:foo, 'bar')`

## リンクの生成
　`link_to("リンクテキスト", 'URL', target: "_brank")`
　第3引数は省略可、例えば、CSSの設定をハッシュで書ける

## パーシャルの挿入
　`render("layouts/hoge")`
　_hoge.html.erb
　相対するファイル名の前にアンダースコアをつけるとRailsが自発的に認識する
Slackのクローンアプリを３つ程試してみた

# 概要
[前回](http://qiita.com/heyhachi/items/9f35447a1ef8da430bd2)、アプリの起動まではやったので、実際にいじくり回してみた感触を箇条書きでまとめてみます。ただの個人の感想なので参考程度にしてください。

# [RocketChat](https://github.com/RocketChat/Rocket.Chat)
新進気鋭のアプリ。新しいが故か完成度がやや低い。

## Pros
* UIがLet's ChatよりSlackっぽい。
* WebRTCによるビデオチャットに試験的に対応している。
* UIが日本語対応。

## Cons
* デスクトップ通知が働かない。
* たまに挙動が激重になる。
* アバターが変更出来ない。
* ドキュメントが無い。

## Summary
導入するには時期尚早という印象。とりあえずチャットだけ使えればいいという場合にはいいかも。更新も頻繁にかかるようなので、どうやって追従するかが課題か。

# [Let's Chat](https://github.com/sdelements/lets-chat)
完成度は高め。UIは３つの中で一番シンプル。

## Pros
* 設定ファイルを書けば、ファイル共有やプライベートルーム作成も可能。
* UIが日本語対応。
* デスクトップ通知がされる。

## Cons
* プライベートルームとパブリックチャンネルの見分けがつかない。
* 通知がONかOFFしか選べず、チャンネル毎やメンションのみ通知などが設定できない。

## Summary
通知の設定が大雑把にしかできないが、実用に耐えるアプリケーション。ある程度完成されたChatが必要な場合はRocketChatよりオススメできる。

# [Mattermost](https://github.com/mattermost/platform)
３つの中で最もSlackに寄せている。こちらも新しいため少々不安定か。

## Pros
* 最初にチームを作るところからしてほぼSlack。
* デスクトップ通知がSlackと同等に細かく設定できる。
* ファイル共有も可能。

## Cons
* UIは英語のみ。
* ドキュメントがほとんど無い。

## Summary
日本語UIに拘らなければ一番オススメ。こちらもRocketChat同様に更新が頻繁にあるので、どうやって付き合っていくかが課題か。

# まとめ
個人的にはMattermostが一番良かった。現段階でどれかを選ぶのであればMattermost。RocketChatは今後のマイルストーンを見るとv1.0あたりで化けそうなのでそれを待った方がいいかも。無難にいくならLet's Chatを選択すれば[ドキュメントもある](https://github.com/sdelements/lets-chat/wiki)ので困ることも少ないだろう。
cURLでクライアント証明書を指定するには./が必要

クライアント証明書による認証の設定がうまくっているのか確認するときに`curl`を使ったりしますが、以下ではうまく動きません。`400 Bad Request`になってしまいます。

```shell-session
$ curl --key client.key --cert client.cer https://localhost/
```

```
<html>
<head><title>400 No required SSL certificate was sent</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<center>No required SSL certificate was sent</center>
<hr><center>nginx/1.8.0</center>
</body>
</html>
```

`./`が暗黙に補完されるということはないので、以下のように明示する必要があります。

```
$ curl --key ./client.key --cert ./client.cer https://localhost/ 
```

```
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
</head>
<body>
<h1>You are authenticated by client certificate.</h1>
</body>
</html>
```

いつも`./`つけるの忘れて30分とか時間を無駄にするので、Qiitaに書いておく。

[Using SSL client certificate authentication wit... | Qualys Community](https://community.qualys.com/docs/DOC-3273)
c++ builder XE4, 10.2 Tokyo > TGroupBox内のすべてのTButtonのenabledをfalseにする / Tag=99だけ変更する // TGroupBoxに属さない場合の処理

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/26)
```

TGroubBoxに含まれる複数のTButtonコンポーネントすべてに対してenabledをfalseにする。

```cpp
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
	String className;
	TGroupBox *gbPtr = GB_1;

	for(int idx=0; idx < gbPtr->ControlCount; idx++) {
		className = gbPtr->Controls[idx]->ClassName();
		if (className.Pos(L"TButton") > 0) {
			gbPtr->Controls[idx]->Enabled = false;
		}
	}
}
```

別の方法として、Tag=99としたものだけenabledを変更したい場合

```cpp
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
	TGroupBox *gbPtr = GB_1;

	for(int idx=0; idx < gbPtr->ControlCount; idx++) {
		if (gbPtr->Controls[idx]->Tag == 99) {
			gbPtr->Controls[idx]->Enabled = false;
		}
	}
}
```

<hr>
(追記 2015/10/04)

TGroupBoxに属さない、フォーム直属の野良コンポーネントについては、以下のようにthisを使えば取得できた。

```cpp
for(int idx=0; idx < this->ControlCount; idx++) {
    if (this->Controls[idx]->Tag == 99) {
        OutputDebugString(this->Controls[idx]->Name.c_str());
    }
}
```

これでかなりの自動化処理ができる。
PHPUNITのテストメソッド実行前後の処理まとめ

# PHPUNITのテストメソッド実行前後の処理まとめ
## 概要
PHPer界隈からも割と敬遠されがちなPHPUNIT。
ただでさえ書くのが面倒なテストですが、僕は毎回```PHPUnit_Framework_TestCase```が覚えられずにぐぐってしまいます・・・

DB関連やリクエスト関連のテストで良く使うのが、前処理・後処理等の下処理。
setUpとtearDownを主に使いますが、実は他にも色々な下処理やフック処理が出来たりします。

一応[PHPUNITマニュアル](https://phpunit.de/manual/current/ja/fixtures.html)にもあるのですが、特に僕含むPHPUNIT初心者の方の為にざっくりとまとめてみました。

メソッド名の手前に***(static)***がある場合、```public static ~~```でメソッドを追加しましょう。

## 一覧
### 各テストメソッド毎に実行
#### **setUp**
各テストメソッドの実行前に呼ばれるメソッド。
テストメソッド毎に同じ環境を用意し、メソッド内で動的に変化させて追従したい場合に便利。
(利用例)モック用オブジェクトの生成・テスト用データベースの生成・ファイルの生成

#### **tearDown**
各テストメソッドの実行後に呼ばれるメソッド。
次のテストメソッドに影響が出ない様に、データベースやファイルの破棄をするのに便利。
(利用例)テスト用データベースの破棄・ファイルの破棄

### テストクラス内で一度だけ実行
#### ***(static)*** **setUpBeforeClass**
一番最初のテストメソッド実行前(setUp()よりも前)に呼ばれるメソッド。
全てのテストメソッドで同じ物を使いまわしたい、テスト内で動的に変化させて追従したい場合に便利。
(利用例)テスト用テーブルの作成等・テスト利用ファイルの生成等

#### ***(static)*** **tearDownAfterClass**
一番最後のテストメソッド実行後(tearDown()よりも後)に呼ばれるメソッド。
全てのメソッドで使いまわしたり生成したファイル等を掃除したりする場合に便利。
(利用例)テスト用テーブルの削除・ファイルの削除等

### assert系メソッドのフック
#### **assertPreConditions**
assert系メソッドの実行直前に毎回実行されるメソッド。
正直、いつ使うのか分かりません・・・

#### **assertPostConditions**
assert系メソッドの実行直後に毎回実行されるメソッド。テストが落ちた場合、実行はされない。
これもいつ使うのかが想像出来ません。

### assert不合格時のフック
#### **onNotSuccessfulTest**
assertメソッドのテストに合格しなかった場合、tearDown()の後に実行されるメソッド。
引数として```Exception```が投げられ、throwしたりゴニョゴニョしたり出来ます。
エラーメッセージを分かりやすくしたり、個別でログに残したりすると便利かもしれません。

## まとめ
テスト実行時の処理順としては

```.php
public __construct();
public static setUpBeforeClass();

# テストメソッド繰り返し
    public setUp();
    public assertPreConditions();

    # assertメソッド実行
    if (assert() === true) {
       public assertPostConditions();
       public tearDown();

    } else {
       public tearDown();
       public onNotSuccessfulTest(Exception $e);

    }
# テストメソッド繰り返し

public static tearDownAfterClass();
public __destruct();
```

かなり見難いですが、こんな感じになるかと思います。
処理順については、時間があれば画像に差し替えたいと思います。

各メソッドの説明に個人的意見が含まれていますが、「こんな使い方あるよー！」という例題があればどんどん編集お願い致します！
それでは良いテスト生活を。
nginx + unicornを使用している時に特定ディレクトリ以下に対してIP制限をかける

unicornを使用している状態で、通常のnginxの制限を書こうとすると、unicornにプロキシされずアクセス時にnot foundとなってしまいます。そんな時の回避方法が以下となります。

```
upstream unicorn {
  server unix:/tmp/unicorn.sock;
}

server {
  listen 80 default_server;
  server_name myapp.com;

  access_log /var/www/myapp/logs/access.log;
  error_log /var/www/myapp/logs/error.log;

  root /var/www/myapp/source;
  
  // ここでELBのIPをクライアントのIPに置き換え
  set_real_ip_from 10.0.0.0/8;
  real_ip_header  X-Forwarded-For;
  
  // 制限をかけるディレクトリを指定
  location /admin/ {
    // アクセス元IP指定
    allow xxx.xxx.xxx.xxx;
    deny all;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://unicorn;
  }

  location ~ ^/assets/ {
    root   /var/www/myapp/source/public;
  }

  client_max_body_size 100m;
  error_page 404 /404.html;
  error_page 500 502 503 504 /500.html;
  try_files $uri/index.html $uri @unicorn;
  
  location @unicorn {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://unicorn;
  }
}
```

## 参考
* [ELB使用時にNginxで特定ディレクトリにIP制限をかける](http://www.lanches.co.jp/blog/2873)
CoffeeScriptでメソッド定義の条件分岐

例えば本番環境とそれ以外の場合で全く違う処理をしたいメソッドを定義する場合どのようにするのが望ましいのだろうか。
もっとも素直な実装は`pattern 4`であるが、毎回無駄な`if`が動いてしまうので不快である。

```coffeescript
if process.env.NODE_ENV in ['production']
  fn1: -> 
      # Do somthing
      return
else
  fn1: ->
      # Do somthing
      return

class Foo
  # pattern 1
  fn1: fn1
  
  # pattern 2
  if process.env.NODE_ENV in ['production']
    fn2: -> 
      # Do somthing
      return
  else
    fn2: ->
      # Do somthing
      return

  # pattern 3
  fn3:
    if process.env.NODE_ENV in ['production']
      ->
        # Do somthing
        return
    else
      ->
        # Do somthing
        return
  
  # pattern 4
  fn4: ->
    if process.env.NODE_ENV in ['production']
      # Do somthing
      return
    else
      # Do somthing
      return
  
```
django-uuidfieldを主キーにして少し困った話

## 前提

djangoはモデルを作成すると自動的にidというシーケンシャルなフィールドを追加し，
この値でリレーションを貼ってくれる．

```python
class Blog(model.Model):
    name = models.TextField(max_length=100)
    
class Entry(model.Model):
    blog = models.ForeignKey(Blog)
    body = models.TextField()
```
↑こんな感じで書いとくと↓こんな感じのテーブルができる

![スクリーンショット 2015-07-28 13.47.07.png](https://qiita-image-store.s3.amazonaws.com/0/58048/3b6bc418-40c7-e979-a2b4-364241dbb7e2.png)


シーケンシャルな値でリレーションを貼るとデータの移動の際に少し困ったことになることがある．
例えば別々のDBで運用していて，片方のデータをもう一方で取り込みたいときなど．
DBが別々の場合，当然シーケンシャル番号が重複する．
で，そのEntryからはBlogのidでリレーションを張っているわけだから，
下図のように取り込んだ時の新しいIDでリレーションを貼り直して上げる必要がある．

![スクリーンショット 2015-07-28 13.48.02.png](https://qiita-image-store.s3.amazonaws.com/0/58048/55ca2218-da17-bc33-4353-a9eb400b6a68.png)


これ，テーブル数が増えてリレーション関係が複雑になってくるとinsertの順番も気をつけないといけなくなって大変です．

### uuidフィールド
デフォルトのシーケンシャルなpkじゃなくuuidを使えばこの問題が解決します．
uuidは簡単に（確率的に）絶対重複しないランダムな文字列です．
詳しく知りたい人は[wikipedia](https://ja.wikipedia.org/wiki/UUID)さんでも見てください．

uuidの導入はdjango-uuidfieldパッケージをpipなどでインストールした後で，

```python
from uuidfield import UUIDField

class Blog(models.Model):
    uuid = UUIDField(auto=True, primary_key=True, editable=False)
```

こんな感じに書いとくとidの代わりにuuidフィールドが作成され，
uuidでリレーションを貼ってくれるようになります．
毎回主キーを書き換えるのは大変なのでベースモデルクラス作って継承して作るといいかもです．

```python
from uuidfield import UUIDField

class MyModel(models.Model):
    class Meta:
        abstract = True
    uuid = UUIDField(auto=True, primary_key=True, editable=False)    
    
class Blog(MyModel):
    ...

class Entry(MyModel):
    ...
```

## 問題と原因
色々書きましたが，ここまでが前提です．
django-uuidfieldは保存時に自動でuuidを生成して突っ込んでくれるのですが，
ModelFormでinstanceを渡した際に初期値として前回リレーションを貼ったレコードが選択されません．

uuidfieldはデータベースに突っ込む時に(postgres以外なら)char型として突っ込まれ，
取り出す時にuuid.UUID型になります．
UUID型の値，str型にすると`550e8400-e29b-41d4-a716-446655440000`みたいに
間にハイフンが入っちゃいます．

models.ForeignKeyで指定されているフィールドはModelFormにするとModelChoiceFieldになります．
ここで使われるselectリストの値は`550e8400e29b41d4a716446655440000`のように
ハイフンなしの値になります．

instanceの値はハイフンあり，セレクトの選択肢はハイフンなし，ということで，
値が一致せず，結果としてリレーションが外れてしまった，というのが原因でした．

## 解決方法
値の比較をする前にprepare_valueをオーバーライドしてハイフンなしの値を返してあげるようにしましょう．
formに値を渡す際に，fieldの値はprepare_valueメソッドて適切な形に変換されます．
この時にUUID型ならハイフンなしの値を返せばいいわけです．

```python
import uuid
from django.db import models
from uuidfield import UUIDField

class MyUUIDField(UUIDField):
    def prepare_value(self, value):
        if isinstance(value, uuid.UUID):
            return value.hex
        return value
        
class MyModel(models.Model):
    uuid = MyUUIDField(auto=True, primary_key=True, editable=False)

...
```

## もっと賢い解決方法
djangoでは1.8からUUIDFieldが標準で使えるようです．
https://docs.djangoproject.com/en/1.8/ref/models/fields/#django.db.models.UUIDField

リンク先の例に書いてくれてるように，default値をセットして上げてprimary_keyをTrueにすればそれで終わりでした...

```python
import uuid
from django.db import models

class MyUUIDModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
```
Engine側からどういうわけかmain_appのURL helperを使いたい

例えばEngine側のコントローラーを以下のように`ApplicationController`を親として定義しているとする。


```ruby
class Nyauth::Base < ApplicationController
end
```

`ApplicationController`を継承する理由は

* layoutはマウント元アプリ側のものを使いたい
* ApplicationControllerにある共通処理をEngine側のControllerでも使いたい

と言ったあたり。

この時地味に困るケースが有る。

* before_actionなどで、マウント元アプリ側のurl helperを、`main_app.`とか付けずに普通に使いたいケース
* layouts/application内にマウント元アプリ側のurl helperを、`main_app.`とか付けずに普通に使いたいケース


こんな時は、以下みたいなhelperを用意しておいて


```ruby
module Nyauth
  module ApplicationHelper
    # engine側からmain_app側のurl helperを呼ぶ事ができるようにしておく
    # ApplicationControllerに記載されているbefore_actionで参照するケースや
    # layoutに記載されているlinkから参照されるケースがありうる
    def method_missing method, *args, &block
      if method.in? Rails.application.routes.url_helpers.instance_methods
        main_app.send(method, *args)
      else
        super
      end
    end
  end
end
```

マウント元アプリ側で

```ruby
class ApplicationController < ActionController::Base
  include Nyauth:: ApplicationHelper
  helper Nyauth:: ApplicationHelper
end
```

みたいな感じで使うと、いいかも。

## 代替案

`main_app.`を全部のURL helperにつける
複数のhistogramを重ねて描きたい

# Q. 
複数のhistogramを重ねて1枚の図の中に描きたいです。density plotだとうまくいくんですけど、histogramだと以下みたいに積み上げ棒グラフになっちゃってうまくいかないんです。

```NG_example.R
library(ggplot2)

ggplot(data=iris, aes(x=Sepal.Length, fill=Species)) + geom_histogram(alpha=0.4)
```

![NG.png](https://qiita-image-store.s3.amazonaws.com/0/12869/a3130e1c-f0f4-720b-43d5-dd3bce565d49.png)


# A. 
`geom_histogram`のデフォルトのpositionが`stack`なのが原因です。
http://docs.ggplot2.org/current/geom_histogram.html
`identity`を指定することで望みの図を得ることができます。

```OK_example.R
library(ggplot2)

ggplot(data=iris, aes(x=Sepal.Length, fill=Species)) + geom_histogram(alpha=0.4, position="identity")
```

![OK.png](https://qiita-image-store.s3.amazonaws.com/0/12869/3417c464-f6fb-f283-2b54-1030647a3c82.png)


`position`の詳細については以下のページの「Position adjustments」のところを見てください。
http://docs.ggplot2.org/current/

# 参考資料
http://stackoverflow.com/questions/6957549/overlaying-histograms-with-ggplot2-in-r/
指定時間経過するまでは処理させないサンプル

```bash:sample.sh
TOUCH_FILE="10_minute_ago"
TOUCH_TIME=`date -d '10 minute ago' '+%m%d%H%M'`
LOGFILE="/tmp/some.log"

# タイムスタンプを今から10分前にする
touch -t $TOUCH_TIME $TOUCH_FILE

# ログファイルのタイムスタンプが10分以内の場合キャッシュを利用し終了
if [ -e $LOGFILE -a $LOGFILE -nt $TOUCH_FILE ];then
   echo "キャッシュを利用"
   exit 0
fi
# 二重実行を抑止するため現在時刻でtouch
touch $LOGFILE

# 重たい処理をここから下に書く
./heavy_script.sh > $LOGFILE
```

* [ShellScript - ファイルが指定時刻より新しいか判定 - Qiita](http://qiita.com/tukiyo3/items/b80fe223c9de78c14ada)
Swift 2.0 + Xcode 7 Bata 4 で、端末のモデル名を取得する


```
    class func systemModelVersion() -> String {
        var utdName: utsname = utsname()
        uname(&utdName)
        
        let machine = utdName.machine
        let mirror: Mirror = Mirror(reflecting: machine)
        var identifier: String = ""
        
        for children in mirror.children {
            if let value = children.value as? Int8 where value != 0 {
                identifier.append(UnicodeScalar(UInt8(value)))
            }
        }
        return identifier
    }
```

完璧な私のメモ書きっす！

ちなみに、Xcode 7 Bata 3 だと。。。

```
    class func systemModelVersion() -> String {
        var utdName: utsname = utsname()
        uname(&utdName)
        
        let machine = utdName.machine
        let mirror: MirrorType = reflect(machine)
        var identifier: String = ""
        
        for index in 0..<mirror.count {
            if let value = mirror[index].1.value as? Int8 where value != 0 {
                identifier.append(UnicodeScalar(UInt8(value)))
            }
        }
        return identifier
    }
```

と書いていました。
シングルクォートとダブルクォートの違い

scivola様、今回はご指摘ありがとうございます。

式展開

文字列の中に変数を記述すると変数に格納されている文字列の中の変数の置き換えます。
またrubyの場合は#{}の中には変数だけでなく、任意に式も記述出来る為,「変数展開」ではなく「式展開」と呼ぶのが良い。

```
ダブルクォートの場合、式展開が行われる

name = "Qiita"

puts "こんにちは, #{name}さん"

result

$ こんにちは、Qiitaさん

```


```
シングルクォートの場合、式展開が行われない。
 
name = 'Qiita'
 
puts 'こんにちは、#{name}さん’
 
result
$ こんにちは、#{name}さん
```

getsメソッドを使ってみよう。

```
getメソッドを使うとキーボードからの入力を受け取れる、
getメソッドが呼ばれると、コードの読み込みがそこで一時停止して、入力が終わると、続きから読み込みが再開される。

p "名前を入力してください"

name = gets #入力待ちで処理が止まる。
puts "こんにちは、 #{name}"
```

演習
メソッドを複数代入面白い。

```

puts "名前を入力してください(半角英数字)"
"rudiments"

name = gets.chomp #chompメソッドは改行を取り消すメソッド

name_length = name.length #name_lengthに対して、nameの文字数を数えるlengthメソッドを追加定義して代入している。

現在のname変数
gets.chomp
name.lengthの二つのメソッドが代入されている。

puts "あなたの名前は#{name_length}文字です。"

result
$ あなたの名前は9文字です。

```
snippet: awk

```awk:accesslog2jpn.sh
#!/bin/sh

awk '
match($0, /act=(login|mymenu|logout)|&memo=/) {
        #
        #文字置換
        sub("?act=login", "\tログイン");
        sub("?act=mymenu", "\tマイメニュー");
        #
        #複数の指定可能
        sub("?act=(logout|logoff)", "\tログアウト");
        #
        #正規表現
        sub("log=.*message=.*", "");
        #
        # 不要な文字削除
        sub("\"GET ", "");
        sub("/2015", "");
        sub(" \\+0900] ", "]\t");
        sub("&encode=u8", "");
        #
        print $0;
}
'
```

* match する時のみ処理する。
* sub で置換
* 正規表現がperlと違うので困ったらperl使う。

## 後ろから2番めの値を取得

```awk:
awk '{print $(NF-1)}' test.log
```

```awk:一番後ろは$NF
awk '{print $NF}' test.log
```

```awk:区切り文字を指定
awk -F"\t" '{print $1}' test.log
```
Reactをes6で使う場合のbindの問題


es6でReact.Componentを作成した場合
イベントハンドラでthisがundefinedになる

es5のReact.createClassを使った場合は、
イベントハンドラが自動でbindされるので大丈夫だった



es6

```html
save(e){
	this.props // undefined　になる
}
render (){
	return (
		<button onClick={this.save} />保存</button>
	);
}
```


es5

```html

save = function (e){
	this.props // undefined ではない
}
render = function (){
	return (
		<button onClick={this.save} />保存</button>
	);
}
```


## 解決策１
constructor内でbind

```html

constructor() {
	super();
	this.save = this.save.bind(this);
}
render = function (){
	return (
		<button onClick={this.save} />保存</button>
	);
}
```

## 解決策 2
jsx内でbind

```html

render = function (){
	return (
		<button onClick={this.save.bind(this)} />保存</button>
	);
}
```

## 解決策 ３
es6のアローファンクションを使う
eventを渡す必要がある

```html

render = function (){
	return (
		<button onClick={(event) => this.save(event)} />保存</button>
	);
}
```

## 解決策 ４
es7の新しいbindシンタックスを使う
※これはwebstormで構文エラーになる

```html

render = function (){
	return (
		<button onClick={::this.save} />保存</button>
	);
}
```
bin/rake db:create ができない


DBがない状態で bin/rake db:create しようとすると失敗する。
つまり、spring経由のrake db:createができない。
springを経由しなければよい。

```
$ rake db:create
```

で解決する。

たぶん、PostgresやSQLiteをつかっている場合はおきない。

### もっと詳しく

ちゃんと調べてない。推測。

```
bin/rake db:create
```

を実行すると springが先に起動する。その際にDBへ接続しようとする。DBがなくて失敗する。
unity > property > get / set


https://unity3d.com/learn/tutorials/modules/intermediate/scripting/properties?playlist=17117

getとsetの使用例。 setではvalueを使う。

```csharp
private int experience;
public int Experience
    {
        get
        {
            //Some other code
            return experience;
        }
        set
        {
            //Some other code
            experience = value;
        }
    }
```

上記のshorthand notation

```
public int Experience { get; set;}
```
関数をパラメータオブジェクトに対応させるためのマクロ

を書いた。

#サンプル

以下のように関数を定義すると

```scala
import x7c1.salad.parameter.Agglomerator.define

def show = define { (id: Int, name: String) =>
  s"id:$id, name:$name"
}
```

二通りの方法で引数を渡すことができるようになる。

一つはいつもどおりの形。

```scala
show(123, "foo")//id:123, name:foo
```

もう一つは構造的部分型を利用した形。

```scala
case class User(id: Int, name: String, nick: String)
val user = User(
  id = 123,
  name = "foo",
  nick = "bar"
)
show(user)//id:123, name:foo
```

これで委譲するためだけの同じような関数を書く手間は不要になった。

##補足

引数の名前と型さえ一致していれば任意のオブジェクトを渡すことができる。

```scala
case class Address(id: Int, name: String, postal: String)
val address = Address(
  id = 123,
  name = "foo",
  postal = "bar"
)
println(show(address))// id:123, name:foo
```

もちろん引数を満たしていなければコンパイル時に検出される。

```scala
case class Anonym(id: Int)
val anon = Anonym(id = 123)
println(show(anon))

//type mismatch;
//[error]  required: Object{def id: Int; def name: String}
//[error]  println(show(anon))
//[error]               ^
//[error] one error found
```

#利用方法

```scala
lazy val `your-app` = project.
  dependsOn(ProjectRef(uri("git://github.com/x7c1/Salad.git#0.4.0"), "salad-lib"))
```

* リポジトリの場所 : [Salad](https://github.com/x7c1/Salad)
* ビルド定義のサンプル : [sample-taupe/project](https://github.com/x7c1/Cliche/blob/e1855de7c1a479aac9e3ed573aa0c0e98f021c0c/scala/sample-taupe/project/TaupeBuild.scala#L19)

#中身

```scala
object Agglomerator {
  def define[A](f: A): Any = macro AgglomeratorImpl.define[A]
}
private object AgglomeratorImpl {
  def define[A: c.WeakTypeTag](c: whitebox.Context)(f: c.Expr[A]) = {
    import c.universe._

    val args = f.tree.children.filter(_.isDef)
    val names = args.map(_.symbol.asTerm.name)

    val fields = args.map{ x =>
      q"def ${x.symbol.asTerm.name}: ${x.symbol.typeSignature}"
    }
    val A = TypeName(c.freshName())
    val arg = TermName(c.freshName())
    val access: TermName => Tree = key => q"$arg.$key"

    q"""
      new {
        type $A = { ..$fields }
        def apply($arg: $A) = $f(..${names map access})
        def apply(..$args) = $f(..$names)
      }
    """
  }
}
```

#参考 : パラメータオブジェクトについて

* [[オブジェクト指向プログラミング][実装パターン]Parameter Object](http://d.hatena.ne.jp/asakichy/20091116/1258329295)
* [Introduce Parameter Object](http://www.refactoring.com/catalog/introduceParameterObject.html)

#参考 : Scala のマクロについて

* [Def Macros](http://docs.scala-lang.org/overviews/macros/overview.html)
* [Quasiquotes](http://docs.scala-lang.org/overviews/quasiquotes/intro.html)