OmniAICreator/Qiita-1.07M huggingface dataset:
[Java1.8] UnaryOperatorの結合関数の勉強

UnaryOperatorのお勉強です。

UnaryOperator<T>とUnaryOperator<T>を結合した関数はどのようにかけるだろうか？

# いろいろやってみる

```Java:
public interface UnaryOperatorConnector<T> extends UnaryOperator<T>{
    public UnaryOperator<T> apply( UnaryOperator<T> t);
}
```
こうかな・・・

```Java:
public class UnaryOperatorConnectorTest{
    @Test
    public void test(){
        UnaryOperatorConnector<String> o2 = s -> s + "a";
}
```
あれ？？？うーん・・・・・

あ、composeね。

```Java:
public class UnaryOperatorConnectorTest{
    @Test
    public void test(){
        UnarryOperator<String> o1 = s -> s+"*";
        UnaryOperatorConnector<String> o2 = o1.compose( s -> s+ "*" );
}
```
あれ？？？うーん・・・・・

```Java:
UnaryOperator<String> op1 = s -> s + "*";
UnaryOperator<String> op2 = s -> s + "+";
Function<String,String> uo = op2.andThen(op1);
```
OKだ・・・

```Java:
UnaryOperator<String> op1 = s -> s + "*";
Function<String,String> uo2 = op2.andThen(s -> s+"*");
````
OKだ・・・
つまり、UnaryOperator.composeがFunctionを返してしまうのがおかしいんですかね。


# 結論

つまり、一旦Functionで受け取ってUnaryOperatorに変換しなければならないらしい。

```Java:UnaryOperators.java
public class UnaryOperators<T> implements UnaryOperator<T> {
    private Function<T,T>[] operators;

    public UnaryOperators(UnaryOperator<T>... operators){
        this.operators = operators;
    }
   @Override
    public T apply(T t) {
        return Arrays.asList(operators).stream().reduce (Function::compose ).get().apply(t) ;
    }
    public static <T> UnaryOperator<T> connect(UnaryOperator<T>... ops){
        return x -> Arrays.<Function<T,T>>asList(ops).stream().reduce( Function::compose ).get().apply(x);
    }
}
```

```Java:
public class UnaryOperatorsTest{
   @Test
    public void test2(){
        UnaryOperator<String> op1 = s -> s + "*";
        UnaryOperator<String> op2 = s -> s + "+";

        UnaryOperator<String> op3 = new UnaryOperators<>(op1,op2);
        UnaryOperator<String> op4 = UnaryOperators.connect(op1,op2);

        System.out.println(op3.apply("xxx"));
        System.out.println(op4.apply("yyy"));
    }
}
```
実行結果

```
xxx+*
yyy+*
```

関数をデータのように扱い始めると、頭が沸騰しそうです。

こういうことをやっていると、「関数もオブジェクトなんだな」という事を実感します。
むしろ関数型言語側からいえば、「オブジェクトもまた関数なんだよ」と言う事かもしれませんが。

というか

```Java:
    public static <T> UnaryOperator<T> connect(UnaryOperator<T>... ops){
        return Arrays.<Function<T,T>>asList(ops).stream().reduce( Function::compose ).get()::apply;
    }
```

こっちのほうがいいか。
クールな書き方があれば教えてください。
まだtypoで消耗してるの? ― typoで悲しい思いをする機会を減らす方法


typoしてますか?

私はしょっちゅうしてます。`confitions`とか`enalbe`とか。
デバッグしていて動かない原因がtypoだったときのくやしさといったら... typoを含んだコミットをプッシュしてしまったときの恥ずかしさといったら...

そんな悲しい思いをする機会を減らす方法を紹介します。

## pre-commitフックを活用しよう

typoするときって大抵同じ間違いを繰り返してしまいませんか? 私の場合は冒頭の`confitions`とか`enalbe`をしょっちゅうやってしまいます。そのような文字列をGitのpre-commitフックを使ってコミットする直前にファイルに中に含まれていないかをチェックさせます。

### .git/hooks/pre-commitの設定

Gitリポジトリをクローンしたディレクトリ以下に`.git/hooks/pre-commit`というスクリプトファイルを作成して実行権を付けておくと、コミットする直前に実行してくれます。このスクリプトがステータス0で終了したらコミットOK、ステータス0以外で終了したらコミットNGとなります。

`.git/hooks/pre-commit`がなかった場合は、`.git/hooks/pre-commit.sample`をコピーしましょう。そして、下記を追記してください。

```bash:.git/hooks/pre-commit
...

allow_typo_error=$(git config hooks.allowtypoerror)
typo_regexp=$(git config hooks.typoregexp)

if [ "$allow_typo_error" != "true" -a -n "$typo_regexp" ]
then
    for FILE in $(git diff-index --name-status --cached $against -- | cut -c3-) ; do
	has_typo_error=$(egrep --color=always -na $typo_regexp $FILE)
	if [ $? -eq 0 ]; then
	    echo
	    echo
	    echo "Typo has detected in $FILE"
	    echo "$has_typo_error"
	    echo
	    echo "If you know what you are doing you can disable this check using:"
	    echo
	    echo "  git config hooks.allowtypoerror true"
	    echo
	    exit 1
	fi
    done
fi
```

### 使い方

いつも自分が間違えてしまう文字列を下記のコマンドを実行して登録しておきます。スクリプト中では`egrep`を使っていますので正規表現を利用可能です。

```bash
$ git config hooks.typoregexp "enalbe|confition|tackel|mesage|isntall|lamdba|unlick|unkown"
```

* 2016/09/16 typoリスト追加 (T_T
* 2017/06/09 typoリスト追加 (うんこぅん)

あとは普通にコミットするだけ。
コミットしようとするファイルに登録した文字列が含まれていた場合、下記のような警告が表示されコミットが中止されます。

![スクリーンショット 2015-09-21 15.08.11.png](https://qiita-image-store.s3.amazonaws.com/0/65069/dfe6d542-30db-174b-4ba8-3973da47122f.png "スクリーンショット 2015-09-21 15.08.11.png")


なんらかの理由で一時的にtypoチェックを無効にして強制的にコミットしたい場合は、下記のコマンドを実行してください。(ブランチマージをしようとしていてtypoチェックに引っ掛かった場合など。明らかに間違いだとわかりますが一旦マージはそのまま終わらせて、そのあと改めて修正コミットをいれるとよいでしょう。)

```bash
$ git config hooks.allowtypoerror true
```

## おわりに

Gitのpre-commitフックを利用して、typoチェックをする方法を紹介しました。

この方法は、私自身が何度も何度も同じ間違いを繰り返してしまっており、ヒドイ時には検証工程までいってからの戻りにもなってしまっていたため、再発防止策として導入しました。

[test - エンジニアなら知っておきたい障害報告&再発防止策の考え方 - Qiita](http://qiita.com/hirokidaichi/items/f9f4549c88aaf8b38bda) ← こちらの記事によれば、良い再発防止策には下記のものがあるそうです。

> 1. その種類の問題について二度と意識することがなくなる解決策
> 2. その種類の問題を開発時に自動的に検知することができる解決策
> 3. その種類の問題が発生しても自動的に復旧することができる解決策
> 4. その種類の問題が発生しても影響が局所化される、フールプルーフ、フェールセーフになる解決策

今回の方法は2つ目の「問題を自動的に検知」に該当します。常にtypoしないようにと気を張り続けるのではなく、typoしたってちゃんと検知できるからいいんだ!と思うと少しだけ普段の作業効率が上がったような気がします。(ほんとにちょっとだけね。)

一度でもtypoをしてしまった場合は、その文字列を随時登録するようにして、二度と同じ間違いをしないようにしましょう。
VirtualBoxのゲストCentOSとホストWindows 7の間でpingが通らない問題が解決しました

VirutalBoxのゲストOSとしてCentOSの仮想マシンを作成したのですが、ホストOSであるWindowsとの間でpingが通らない問題に遭遇しました。真の原因は判らないのですが、ゲストOSでNATとブリッジの装備順を変えているうちに解決しました。

こんな問題は私だけかもしれませんが、念のため記しておきます。

## 環境

* VirtualBox 4.3.30/5.0.4
* Windows 7（ホストOS）
* CentOS 6.6（ゲストOS)

### Windowsのネットワーク構成

0. ローカルエリア接続（Realtek PCIe GBE Family Controller）
1. ローカルエリア接続２（ASIX AX88179 USB 3.0 to Gigabit Ethernet Adapter）
2. VirtualBox Host-Only Ethernet Adapter（#1,#2,#3）

### Linuxのネットワーク構成（当初の構成）

0. eth0 : dhcp
1. eth1 : 192.168.56.101（VirtualBox Host-Only Ethernet Adapter #1を割り当て）
2. eth2 : 192.168.1.101（ブリッジアダプタでローカル接続２を割り当て）

## 問題の現象

ホストマシンからも、ゲストマシンからも、お互いにpingが通りませんでした。当然他のプロトコルであっても通りませんでした。

## 解決策

### Linuxのネットワーク構成（当初の構成）

ゲストOS側のネットワーク構成(/etc/sysconfig/network-srcript/ifcfg-eth[02])を変更しました。

0. eth0 : dhcp
1. eth1 : 192.168.56.101（VirtualBox Host-Only Ethernet Adapter #1を割り当て）
2. eth2 : 192.168.1.101（ブリッジアダプタでローカル接続２を割り当て）

## 補足（ブリッジアダプタの用途について）

ソフトウェアの開発用物理ネットワークは、インターネットアクセスの物理ネットワークと完全に分けるため、USB LANアダプタを購入してPCに装着しました。古いVirtualBoxの場合は今回のような問題は起きなかったと記憶していますので、最初は何が起きているのかさっぱりわかりませんでした。

ブリッジに使用しているローカル接続２には、仮想マシン郡と同じネットワークアドレスを割り当てていましたから、ルーティングの問題でもないし原因がわからず色々試した結果、今回の結果にたどり着きました。

pingが通らない現象ですが、厳密には激しくロスっているようです。特にホストOSからゲストOSへのロスり方が激しく、あたかもpingが通っていないように見えていたみたいです。

## 補足（ブリッジアダプタの使用するホスト側のアダプタの謎について）

ブリッジアダプタに割り当てるホスト側アダプタは、同一ネットワークが割り当てられているアダプタ（つまり下で言うと2.が該当）であるべきだと勝手に思い込んでいましたが、どうやら別のアダプタ（例えば1.）でも良いかも知れません。良いというか、完全にパケットを遮断できないかも知れません。

0. ローカルエリア接続（Realtek PCIe GBE Family Controller）
1. ローカルエリア接続２（ASIX AX88179 USB 3.0 to Gigabit Ethernet Adapter）

というのは、最初に紹介した環境において2.ローカルエリア接続２アダプタでなく、1.ローカルエリア接続アダプタでもパケットが流せるためです。偶然なんですが、アダプタを間違えて割り当ててもロスは酷いですがパケットがゼロにはなりませんでした。

ネットワークアドレスは違うし、ルーティングも設定していないので、相互にパケットを授受できるはずがないと思うので、どうしてこの現象になるのか謎です。

このパケットは物理ネットワークに流れず、VirtualBoxのネットワークドライバ内で閉じているだけかもしれません。実害は無いのかもしれませんが真偽は不明です。。
IFTTTを使ってESP-WROOM経由でロボを動かす


前回、[BLEモジュールのkoshianでピッコロボを動かしました](http://qiita.com/snumano/items/68f5e8567c9279291216)が、今回はIoTっぽく、ESP-WROOM-02を使ってインターネットに接続し、IFTTTから操作してみました。

# ESP-WROOM-02とは？

Arduino IDEでSketchを書き込めるWiFiモジュールです。
技適付きなので、日本でも安心して使えます。
CEREVOで販売している[約900円のピッチ変換のブレークアウトボード付き](http://cerevo.shop-pro.jp/?pid=91592223)がおすすめです。
詳細は[こちら](http://qiita.com/snumano/items/95cdca970ec0a4695547)で紹介しているので、ご参照ください。

![91592223.jpg](https://qiita-image-store.s3.amazonaws.com/0/4779/a5917464-0d00-ca26-6620-6684f7011b69.jpeg "91592223.jpg")

# IFTTT

> IFTTT(イフト)とは「レシピ」と呼ばれる個人作成もしくは公に共有しているプロフィールを使って数あるWebサービス（Facebook、Evernote、Weather、Dropboxなど）同士で連携することができるWebサービスである
> [IFTTT](https://ifttt.com/)

## レシピを作成する

以下のようなレシピを作成しました。

* TwitterをTriggerとして、ハッシュタグ「#roboroborobo」を付与して、tweetした場合、tweet内容をActionに渡す。
* Maker ChannelをActionとして、渡されたtweet内容を、用意したREST API環境にPOSTする。

![IFTTT.png](https://qiita-image-store.s3.amazonaws.com/0/4779/e056f5f4-fed4-b786-e99d-4e862c455c12.png "IFTTT.png")

## tweetする

下記のようにハッシュタグ#roboroboroboを付けて、ロボ操作に必要な文字列を記載します。ちなみに、操作に必要な文字列は下記の通りで、複数記載することで連続操作が可能です。

* w:前進
* s:後進
* a:左向き
* d:右向き

![twitter.png](https://qiita-image-store.s3.amazonaws.com/0/4779/41ed8da2-4f49-1351-a314-27448ecf6a44.png "twitter.png")


# システム構成

## 全体構成

ここで全体の構成を示します。
IDCFクラウドに、Ubuntuの仮想マシンを起動し、[Ponte](https://github.com/eclipse/ponte)をinstallします。
Ponteに対して、REST APIでdataをPUTし、ESP-WROOM-02側ではMQTTでdataをチェックします。

![kobito.001.jpg](https://qiita-image-store.s3.amazonaws.com/0/4779/8199584b-387e-49bd-6c00-cf20c569acfa.jpeg "kobito.001.jpg")

## REST API/MQTT対応

IFTTTのMaker Channel側のIFがREST APIであり、デバイス側はMQTTを使いたかったので、これらの対応方法を検討します。調べてみると、REST API/MQTT両方に対応しているアプリやwebサービスがあるので、これらを使うのが簡単そうです。
ただし、Maker Channelで使えるパラメータは制限があり、自由にヘッダーは設定できません。この事から、[Ponte](https://github.com/eclipse/ponte)を利用する事にしました。

参考までに、検討した他のアプリ/webサービスを以下に示します。

### header操作が必要

* [Device Hub](https://dashboard.devicehub.net/)
* [Meshblu](https://developer.octoblu.com/docs)

### REST API対応していない/有料

* [mosquitto](http://test.mosquitto.org/)
* [Sango](https://sango.shiguredo.jp/#contact)


# まとめ

* IFTTTを使って、ピッコロボを操作するレシピを作成しました。
* twitterにtweetしてから、IFTTT経由でピッコロボが動くまで、数分かかる場合がありますが、実際に動作する事を確認できました。


# 参考情報
## MQTT
http://www.slideshare.net/masahikokubara/mqtt-45099223
https://gist.github.com/voluntas/e0a90f3e22316144ed3a
c++ builder > AnsiString をUnicodeStringに変えてはまった

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

ソフトの修正の中でよけいなことをやってはまった話。

```
AnsiString xxx = ...
```

という宣言で処理していたのを、以下のようにした。

```
String xxx = ...
```

その変数xxxについては、そのLengthにかかわる処理にマジックナンバーが入っていたため、関連処理が動かなくなった。

そもそもAnsiString型から変更したのが間違いだったかもしれない。

AnsiString型、UnicodeString型混在を避ける場合は、関連処理をテストできるようにした上で修正した方がいいだろう。

VCSで履歴があったので10分程度でわかったが、VCSを使ってなかったらかなりはまったかもしれない。
IOS9 言語関連で問題でた。対応してみる事に。

# 確認する。
ios9の障害で、日本語表示が英語表示になる問題があるという記事があったんで、
対応もかねて確認することになった。
記事によると、使用言語の判断が失敗するとおっしゃる。

早速、日本語対応アプリケーションをXcode7のIOS9シミュレーションで確認する事にする。
ほぅ　見事に英語になりますね。(噂どうりの現象で驚きました。)

今のアプリは、これで判定してる

```
        NSArray *languages = [NSLocale preferredLanguages];
        NSString *currentLanguage = [languages objectAtIndex:0];
        isSame = ([currentLanguage isEqualToString:language]);
```

そして、ターゲットの言語(language)でなければ英語にするようにしている。
languageが日本語なら@"ja"のはずなんだけど、スルーされてるから
全滅ってわけですね。

まずは、Google様にお問い合わせすることに(他力本願)
どうも言語の文字が変わっているらしい。

シミュレーターでログ確認
　"ja"でなくて"ja-JP"で来ますね。

なんだこの-JPってのは？？？
判定に-JP　つければいいのだが、本当にそうだろうか・・・・・

#実験する。
まだIOS9の実機ないからシミュレーターで確認
設定>言語と地域 で言語変更する

>日本　　　　　　ja-JP
フランス語　　　fr-JP
英語　　　　　　en-JP　　　

なんと、おまけ(-JP)がもれなくついてますね。
では、地域を変更することに
日本+English(US)　　　ja-US
日本+フランス　　　　ja-FR

リージョンが付いてきているようだ

地域と言語の組み合わせでなにかいい事あるのかな？

# 対応考える。

・実験から従来の判定方法の場合、判定数を増やせば対応可能（地域限定）だが
確認が面倒(X国数)なので、比較方法修正でなんとかしないと大変

・'-'までの文字列で比較する場合 '-' の出現は１回でないからターゲットから取得した言語情報の'-'までの文字列取得して 比較したらダメである。
　　zh-Hans-JP
　　zh-Hant-JP
    こいつらです。


まずは、NSStringについて Google様にお問い合わせすることにした
NSString関連は、文字単位の比較が難しくみえる。（本人未熟）
まぁ、データは、英語(Ascii文字)なんで、C言語で対応することに（妥協早！）

```
      変数 language　検出したい言語
      例) @"ja"


        BOOL     isSame=false;
        NSArray  *languages = [NSLocale preferredLanguages];
        NSString *currentLanguage = [languages objectAtIndex:0];
        const char *cur = currentLanguage.UTF8String;
        const char *cmp = language.UTF8String;        
        short i;
        short len=strlen(cmp);
        for( i=0;i<len; i++ )
        {
            if( cur[i]!=cmp[i] ) break;
        }
        if( i==len )
        {
            if( cur[i]==0   ) isSame=true;
            if( cur[i]=='-' ) isSame=true;
        }


　　　isSame が trueなら　同じ

　　　　　　　　 falseなら　違う
内容
　　　　検出したい文字列の長さ分比較して、次の文字が
　　　　NULLまたは、'-'の場合同類で判断する。
       この方法なら、多分従来のIOSでも使用可能かと思います。

　　　　シミュレーション上では問題なく動いているように見えます。

```

残務。
IOS9実機準備して確認しないと・・・・・・・・・・・・・・・
OpenCV for Androidでface-detectionを動かす


まずは、OpenCV fro Androidをダウンロードしないことには始まりません。
ここからダウンロードしてください。現時点では3.0が最新となってますが（2015/09/21現在）、最終的にうまく動かせなかったので、2.4.11からインストールし直しました。キャプチャなどは3.0をトライしたときのをつかってます。

http://opencv.org/downloads.html

次に解凍したsdk/java/ をEclipseにインポートします。
EclipseのFileメニューのImportからGeneral-Existing Project into Workspaceを選んで、ダウンロードした先のフォルダを選択します。

![Import.png](https://qiita-image-store.s3.amazonaws.com/0/4664/611c20ea-8a6d-4cac-6a1d-ced3d624f282.png "Import.png")

エラーが出る場合はProjectを右クリックして出てくるPropertiesからAndroid SDKのバージョンを選択しなおすとうまくいきます。

![Property.png](https://qiita-image-store.s3.amazonaws.com/0/4664/b587fa98-5fa2-1f3e-1caf-a820a07e4d40.png "Property.png")

次にサンプルコード「face-detection」をImportしてビルドしてみます。サンプルはOpenCVのSDKフォルダの中に入ってます。

次に、Android NDKをインストールする。

https://developer.android.com/ndk/downloads/index.html#download

NDKをダウンロードして、僕は下記にインストールしました。SDKと同じ方がいいかな、くらいの理由です。

`/Applications/adt-bundle-mac-x86_64-20140702/sdk/ndk/android-ndk-r10e`

PATHにこのフォルダを通してあげて、ターミナルでface-detectionのフォルダに移動します。「ndk-build」を実行します。すると、libsにlibdetection_based_tracker.soがインストールされます。

最後に、端末にOpenCV Managerのクライアントをインストールします。Playストアにあるやつではうまく動かなったです。適切なやつをインストールしてください。

![OpenCVManagerAPK.png](https://qiita-image-store.s3.amazonaws.com/0/4664/64bb3fb0-6406-f32e-b12d-2967e57bd8f9.png "OpenCVManagerAPK.png")

これでようやくEclipseで実行します！
pythonのリスト連結方法，list.extend()と “+” 演算子の違い

# Pythonリストの連結方法
とても初歩的なことですが
pythonのリスト連結でハマったのでまとめておきます．

連結方法は2通り．
1. list.extend()メソッドを使う
2. リストオブジェクトを + 演算子で連結


```python:listSample.py

hoge = ["1", "2"]
foo  = ["3", "4"]

# やりがちなNG: hoge.extend(foo)の返り値はNone．したがって NoneType has no len.
while len(hoge) < 10:
    hoge = hoge.extend(foo)

# OK
while len(hoge) < 10:
    hoge = hoge + foo

# OK
while len(hoge) < 10:
    hoge.extend(foo)

```

## 参考文献
[のんびりPython リスト追加についての速度比較（append,内包表記など）](http://nonbiri-tereka.hatenablog.com/entry/2014/10/20/110304)
Golang で iso-2022-jp メールのデコード


メールの内容を解析したい場合、
net/mailパッケージだと、そのままでは日本語メールを読めないですよね。

github.com/curious-eyes/jmailパッケージを使ってみてはいかがでしょう。

```bash
$ go get github.com/curious-eyes/jmail
```

下記例のコードはutf-8ですが、iso-2022-jpの場合でも正しく出力されます。

```go
package main

import (
	"fmt"
	mail "github.com/curious-eyes/jmail"
	"log"
	"strings"
)

func main() {
	msg := `Date: Wed, 16 Sep 2015 05:32:06 +0900
From: Gopher <from@example.com>
To: Another Gopher <to@example.com>
Subject: =?UTF-8?Q?=E7=94=9F=E6=B4=BB=E3=81=AE=E3=81=BB=E3=81=A8=E3=82=93=E3=81=A9=E3=82=92?=
 =?UTF-8?Q?=E5=9C=B0=E4=B8=AD=E3=81=A7=E9=81=8E=E3=81=94=E3=81=99?=
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

=E3=83=9B=E3=83=AA=E3=83=8D=E3=82=BA=E3=83=9F=20=28=E8=8B=B1=3A=20Gopher=
=29=E3=81=AF=E3=80=81=E5=93=BA=E4=B9=B3=E7=B6=B1=E3=83=8D=E3=82=BA=E3=83=
=9F=E7=9B=AE=EF=BC=88=E9=BD=A7=E6=AD=AF=E7=9B=AE=EF=BC=89=E3=83=8D=E3=82=
=BA=E3=83=9F=E4=BA=9C=E7=9B=AE=E3=83=9B=E3=83=AA=E3=83=8D=E3=82=BA=E3=83=
=9F=E7=A7=91=E3=81=AB=E5=B1=9E=E3=81=99=E3=82=8B=E5=93=BA=E4=B9=B3=E9=A1=
=9E=E3=81=AE=E7=B7=8F=E7=A7=B0
`

	r := strings.NewReader(msg)
	m, err := mail.ReadMessage(r)
	if err != nil {
		log.Fatal(err)
	}

	header := m.Header
	fmt.Println("Date:", header.Get("Date"))
	fmt.Println("From:", header.Get("From"))
	fmt.Println("To:", header.Get("To"))

	fmt.Println("Subject:", m.DecSubject())
	body, err := m.DecBody()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s", body)

	// Output:
	// Date: Wed, 16 Sep 2015 05:32:06 +0900
	// From: Gopher <from@example.com>
	// To: Another Gopher <to@example.com>
	// Subject: 生活のほとんどを地中で過ごす
	// ホリネズミ (英: Gopher)は、哺乳綱ネズミ目（齧歯目）ネズミ亜目ホリネズミ科に属する哺乳類の総称
}

```

net/mailパッケージの構造体を埋め込んで実装しているので、同じように使えます。
Subject（件名）と Body（本文）をデコードしたい場合だけ、
- DecSubject
- DecBody
を使ってください。

From, To アドレスリストもデコードできればいいですね。
今どきメールを扱うことなんて、無いかもしれませんけどね。
Powで起動しているRailsアプリケーションをngrokで外部に公開する


# ngrok 2.0系の場合
## インストール方法
公式サイトからバイナリをダウンロードして設置する。
`/usr/local/bin`あたりに設置すると良いかも。

## 実行方法

```
ngrok http -host-header=myapp.dev 80
```

`-host-header`に公開したいアプリケーションのURLを指定するのが肝。例はPowで`myapp`を登録している場合。

こっちの方がオススメ！

# ngrok 1.7系の場合
## インストール方法
```
brew install ngrok
```

## 設定
1. `~/.powconfig`に`export POW_EXT_DOMAINS=ngrok.com`を追加
2. powの再起動

## 実行方法
```
ngrok -subdomain=myapp myapp.dev:80
```

どちらの方法でも生成されたURLにスマホ等からアクセスすれば、Powで起動しているRailsアプリケーションに接続出来ます。簡単ですね！

# 参考
[ngrok - secure introspectable tunnels to localhost](https://ngrok.com/faq#virtual-hosts)
[Using ngrok with Pow for Development Previews | Bunker](http://journal.wearebunker.com/post/59684890589/using-ngrok-with-pow-for-development-previews)
LittleBits の Arduino モジュール


[LittleBits](http://littlebits.cc/) はくっつけて遊んでいるだけで楽しい、大変良くできた電子工作・学習デバイスで、文章だけだと伝えることができないので一度は実物の LittleBits を触ってみて欲しい！！

というのはさておき、この LittleBits に [Arduino (Leonard) としてプログラミングできるモジュール](https://littlebits.cc/bits/arduino) があるんだけど、Arduino を知ってる人にとってこれだけ解れば OK という所のメモ。

## 基板まわり

[Getting Started with Arduino](http://discuss.littlebits.cc/t/getting-started-with-arduino/109) の図の通り。

![](http://discuss.littlebits.cc/uploads/default/11/99ec4d5d709b89d4.png)

LittleBits のマグネットでくっつくイン(d0, a0, a1) とアウトに (d1, d5, d9) ピンのマッピングされてる。特徴的なのが d5 と d9 で、Arduino の analogWrite() で出力される PWM のみならず、スイッチで analog に切り替えることができる。Leonard に D/A コンバータでの出力はなかったと思うけど、LittleBits のアウトとしては D/A して欲しいことがあると思うのでなるほど感。

## スケッチをコンパイルして動かす

ふつうに Leonard を選択するだけでおｋ。かんたん。

## LittleBits 以外の機器との連携

LittleBits 以外からもデータの入出力したいよね、というときのために a2, a3, a4 と d10, d11, d13 がある。I2C 用の d2, d3 もあるし ICSP もある。しかし物理的なピンヘッダが無いのでピンヘッダを半田付けする必要がある。特に I2C はプリント基板用なので使いにくいけど、僕は半田でピンヘッダつけました…(不格好)。

![半田付け下手なのでプラスチックの部分にあたって溶けた…](https://qiita-image-store.s3.amazonaws.com/0/5330/fe289ee6-efbb-2fcd-1b05-7bc7a6915e3d.jpeg "20150921-DSC04441.jpg")


なんでこんな面倒くさい作りになってるんだというと、たぶん LittleBits の設計思想の問題で、基本簡単に IN / OUT をモジュールでつなげていくシンプルな姿勢を崩したくなくて、そのため Arduino モジュールでのプログラミングも、IN / OUT のデータをいじれるだったり、USBシリアルでPCとインタラクションしたり、そういう用途に基本使って欲しい、どうしても拡張したい人用にはちょっと手間だけど自分でやってね、みたいな感じなんだろうなーと思ってる。

## 電源をどうするか

外部機器をつなげるとき、VDD と GND をどうするかという問題があるけど、そんなときは ISCP のピンヘッダに VDD(+5V) と GND があるので、そこから持ってくれば OK。

ISPC は

```
GND        --> 0 0 <-- RESET
MOSI (d16) --> 0 0 <-- SCK (d15)
VDD  (+5V) --> 0 0 <-- MISO (d14)
```

という配置なので、左上のピンを GND、左下のピンを VDD として使えるのでこれを利用する。

写真とスケッチのコードは、I2C に秋月の液晶 AQM0802A つないで、その画面に Arduino の可変抵抗モジュールの値と、外部から A2 に繋いだ光センサー(CDS) の値を表示させてる。なお AQM0820A は 3.3V の電圧が必要なので、抵抗分圧 で 5V -> 約 3.3V へ降圧し取得してる。

![20150921-DSC04440.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/2caae54f-a324-5118-53de-f0f25e3d4fb5.jpeg "20150921-DSC04440.jpg")

```ino
#include <Wire.h>
#include <ST7032.h>

const int CDS_IN = A2;
const int A_IN = A0;

ST7032 lcd;

void setup () {
  lcd.begin(8, 2);
  lcd.setContrast(30);
}

void loop () {
  int cds = analogRead(CDS_IN), a0 = analogRead(A_IN);

  lcd.setCursor(0, 0);
  lcd.print("CDS: " + (String)cds);
  lcd.setCursor(0, 1);
  lcd.print("A0:" + (String)a0);

  delay(100);
}
```

## その他

LittleBits もエコシステムやコミニュティを持っているので、いろんな人がいろいろやってる。例えば

- [Arduino voltage corrector for the i30 Keyboard bit](http://littlebits.cc/projects/arduino-voltage-corrector-for-the-i30-keyboard-bit)


では、LittleBits のキーボードモジュールから押されたアナログ電圧値をマッピングしてるソースコードを公開してたりする(右サイドバーのADDITIONAL FILESにある)。
[読書メモ]実践Junitのメモ1


[実践Junit](http://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5-JUnit-%E2%80%95%E9%81%94%E4%BA%BA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AE%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E6%8A%80%E6%B3%95-Jeff-Langr/dp/4873117305/ref=sr_1_1?ie=UTF8&qid=1442735467&sr=8-1&keywords=%E5%AE%9F%E8%B7%B5junit)

自分に必要なとこだけメモする。

# ユニットテストの基礎
1章、2章は割愛
## 様々なアサーション
### Junitでのアサーション
#### assertThat(何かと何かが等しいことを示す)
assrtThat + Hamcrestのアサーションを使えば失敗時にわかりやすいメッセージが表示される。
assertTrueではスタックトレースのみ。
ただし、前者を利用しても提示できる情報には限界がある。シンプルなテストであればassertTrueの方が良いという派閥もある。
#### 重要なHamcrestマッチャー
|メソッド名|内容|
|:-------|----|
|eqaualTo|コレクションやオブジェクトの比較。is単体でもほぼ同じことができる|
|not|否定|
|nullvalue|nullであること。多くの場合、非nullチェックは冗長であり、あまり価値はない|
|notNullValue|非nullチェック|
その他は以下を参考に。
[Java Hamcrest] (http://hamcrest.org/JavaHamcrest/)
[HamcrestのMatchersに定義されているメソッドの使い方メモ](http://qiita.com/opengl-8080/items/e57dab6e1fa5940850a3)

## テストの編成
### AAAに基づいた一貫性の実現
AAAとは?

#### Arrange(セットアップ)
テストが実行される際にシステムが適切な状態にあること
#### Act(操作)
テストコードの実行
#### Assert(アサーション)
テスト対象の振る舞いが正しいかどうかの確認

After(事後処理)が含まれる場合もある

### 個々のメソッドについてテストするのではなく、対象のクラスの持つ振る舞いをテストする
- ATMの例 -> 出金のテストを行うには入金をしてからでないとできない。
- 全体的な観点を持つべき

### テストと対象のコードの関係
テストコードはテスト対象に依存してはならない。
ただし、テスト対象の設計を変えればテストをしやすくなる場合、積極的に採用すべき。 -> テストしやすいコードは実運用にも適している場合が多い

### 一つの目的に特化したテストの価値
テストケースごとに１つずつテストメソッドを用意し、検証対象の振る舞いを的確に表す名前をつける

- テストが失敗するとテストの名前が報告されるため、どの振る舞いに問題があったのかすぐにわかる
- 失敗したテストの分析にかかる手間を最小限にできる
- すべてのテストケースが実行されることを保証できる

### ドキュメントとしてのテスト
ユニットテストは永続的で信頼できる情報を提供すべき。
普段コメントで書いていることはほぼユニットテストに置き換え可能

#### 一貫性のある名前
正確な名前をつけることによって、テストの内容を詳細に理解できるようにすべき。

- テストの名前は7語程度にすべき

 ``` Ex
 //何らかの処理を行うと何らかの結果が発生する
 doingSomeOperationGenerateSomeResult
 
 // 何らかの条件下では何らかの結果が発生する
 someResultOccursUnderSomeCondition
 ```
 
#### 意味のあるテスト
 テストがわかりにくいと感じた場合、コメントを追加するのではなく、名前を改善することから着手する。
 
 - ローカル変数の名前を改善する
 - 意味のある定数を導入する
 - hamcrestアサーションを利用する(Junit組み込み以外のものも使ったりする)
 - 長いテストは、より短く焦点を絞った複数のテストに分割する
 - あまり重要でないコードはヘルパーメソッドや@Beforeメソッドに移動する

### @Beforeと@Afterに関する補足(初期化と後処理)
- @Beforeメソッドは複数定義できるが、実行順の制御はできない。
- @Beforeメソッドは全てのテストに対して適用されるため、特定のテストだけで必要になる処理は避ける

### テストと緑バーの重要性
全てのテストが常に成功しているべき。
#### テストの所要時間を縮める
問題があることに気づくのが遅れるほど、解消のためのコストは増大するため、テストの実行対象を減らすのは得策ではない。
データベース等の低速なリソースを使っていなければテストはすぐに完了するので、常に全てのテストを実行すべき。
以下のような方法で高速化を図る。

- モックオブジェクトの利用
- 実行するパッケージを限定する
- Infinitestを使って常にバックグラウンドで実行する
- 特定のアノテーション(@Category)がついているテストだけを実行する

[Categories · junit-team/junit Wiki](https://github.com/junit-team/junit/wiki/Categories)
[Infinitest](https://infinitest.github.io/)

最善の対策は、実行に時間のかかるテストを慎重に減らしていくこと。

#### テストを無視する
- テストが失敗した際には１つずつ解決する
- @Ignoreアノテーションが付いているメソッドは実行されない
iOS9時代の画面サイズ


前回の、[iOS9時代のiPhoneアーキテクチャー](http://qiita.com/m1takahashi/items/bfff549c48b2c081ac7c)に引き続き、画面サイズの違いをまとめてみます。
iPhone6s,iPhone6sPlusが発表されましたが、画面サイズの変更はなかったようで、ほっとしました。

![iPhone画面サイズ図.jpg](https://qiita-image-store.s3.amazonaws.com/0/92038/e7ef0642-7fd3-e284-1fbd-f97e430c8200.jpeg "iPhone画面サイズ図.jpg")


| 端末| ディスプレイ(インチ) | 解像度 | 論理サイズ | 画像サイズ |
|:-----------|:------------:|------------:|------------:|:------------:|
| iPhone6s Plus | 5.5 | 1920*1080 | 736*414 | ＠3x |
| iPhone6s | 4.7 | 1334*750 | 667*375 | ＠2x |
| iPhone6 Plus | 5.5 | 1920*1080 | 736*414 | ＠3x |
| iPhone6 | 4.7 | 1334*750 | 667*375 | ＠2x |
| iPhone5s | 4.0 | 1136*640 | 568*320 | ＠2x |
| iPhone4s | 3.5 | 960*640 | 480*320 | ＠2x |


iPhone6 Plus, iPhone6s Plusの論理サイズは、『736*414』という不思議な値が返ってきます。
どうやら、論理サイズ（736*414）を3倍（＠3x） して、それ（2208*1242）を縮小して、『1920*1080』にしているようです。

ナビゲーションバーの背景画像などにこだわって、各画面サイズごとに作った場合、iPhone6 Plus, iPhone6s Plus用は、『2208*1242』で作成してImages.xcassetsのImageSetの『＠3x』に指定します。
誤って、1920*1080で作ってしまうと、端末で見た際に、敷き詰められた状態になってしまいます。
（こだわって、時間をかけた挙句に、悲しい思いをすることになります）

※＠は、全角にしてあります。
unity > RS-232C > 受信が成功しない

```txt:動作確認
Unity 5.1.3-f1 on MacOS X 10.8.5
```

UnityからRS-232C通信をしようとしている。
送信はできたが、受信がどうもできない。

現状、1文字の受信はできたが、それ以降の受信をしようとすると.exeで実行中のソフトが落ちる。

以下のようなものを試したが全部ダメだった。
- コルーチン
- スレッド
- デリゲート


以下のサイトの方がUnityでシリアル通信をしている。ファイルもあるので、このあたりを詳しく見ていくのがいいのだろうか。
http://www.dyadica.co.uk/unity3d-serialport-script


## .BytesToRead > NullReference

.BytesToRead を呼びに行ったときにNullReferenceになるようだ。

[参考](http://answers.unity3d.com/questions/315898/has-anyone-got-serial-working-bytestoread-has-null.html)

2008年から直っていない不具合のようだ。 Monoで発生しているとのこと。
この理由により .BytesToReadは使えそうにない。


<hr>
## やはり受信しない

(追記 2015/09/22)

その後、以下のサイトからUnityファイルを取得して、ビルドしたものをWindowsで動かしてみた。
http://www.dyadica.co.uk/unity3d-serialport-script

Unity5で開くとupgradeのメッセージが出てきたので、upgradeでプロジェクトを開いてビルドした。

PrefabをSceneに追加し、GUITextを２つ追加(comStatusとrawData用)し、SerialPort GameObjectのスクリプトに関連付けした。

COM3, 9600bpsで設定し、Windowsで動かしたのが以下の通り。

![Win8x64pro.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/9f1a3c1f-9ef9-f3d3-6173-ff78288ecfba.jpeg)

ポートはOpenできたが、COM4からCOM3への通信がまったく受信されていないようだ。設定でThreadingとCoroutineが選択できるが、どちらでも同じく受信しない。

Unity4で動いていたものがUnity5でダメになったのかもしれない。

<hr>
以下に成功例を掲載した。

http://qiita.com/7of9/items/cb08473ec5f3cc8d4b61
c++ builder > TForm > 英語化 > フォーム > .Scaled = falseにしておく

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

1年ほど昔、DEKOさんという方に教えていただいたこと。

またひっかかりそうなので、再掲する。
http://www.freeml.com/delphi-users/3828/latest

症状としては、英語化でフォームを開いた時にフォームサイズが1.5倍くらい伸びてしまう。

最終的には以下をやって解決した。

> ScaledプロパティをFalseにしてから、言語リソースを削除し、再度言語リソースを追加した後で、フォームサイズがオリジナルと同じになることを確認しました。

<hr>
http://hp.vector.co.jp/authors/VA011889/visualbasic/fontsize.htm
> ちなみにDelphiの場合はフォームのScaledプロパティをFalseに設定すれば、 開発時のコントロールサイズで表示する事が出来ます。
NeoPixel のフルカラー砲弾型 LED


NeoPixel のフルカラー砲弾型 LED を買ったのでメモ。複数つなげてもかんたんにつかえた。

![20150921-DSC04439.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/5b8f0879-f630-0324-28e6-89b4245ed0b7.jpeg "20150921-DSC04439.jpg")

- 四本足で一番長いのが GND。ふつうの LED のアノードが長いからって足が長いのを VDD と間違いがち(というか間違えた)
- 5mm も 8mm も同じ IC (WS2811) 積んでる
  - http://www.adafruit.com/datasheets/WS2811.pdf
  - VDD の前に 100R 抵抗 -> 104 のコンデンサ(|-GND)
  - ↑ふつうにデータシート見た方が早い
  - なお adafruit のサイトでは抵抗もコンデンサも繋がずに動かしてるけど大丈夫なのかなー
    - http://www.adafruit.com/images/1200x900/1938-00.jpg
- ライブラリはふつうに NeoPixel を使えばよし
  - https://github.com/adafruit/Adafruit_NeoPixel
AWSのネットワークACLはステートレスなのでインバウンドの一時ポートを適切に設定しないとハマる

# ELBからのヘルスチェックに失敗する

AWSでLoadBalancerのテストをしていて、突然バックエンドにつながらなくなったり、ヘルスチェックに失敗したりするようになった。

セキュリティグループの設定がおかしいのかと思っていろいろ確認してみても問題なし。

で、ネットワークACLをもう一度確認してみたら、ELBがいるサブネットの設定がこうなってた。

```
カスタム TCP ルール　TCP (6)　32768-61000　0.0.0.0/0　許可
```

原因はこれだった。

> リクエストを開始するクライアントは、一時ポートの範囲を選択します。範囲は、クライアントのオペレーティングシステムによって変わります。多くの Linux カーネル（Amazon Linux カーネルを含む）は、ポート 32768～61000 を使用します。Elastic Load Balancing が送信元のリクエストは、ポート 1024～65535 を使用します。Windows Server 2003 を介する Windows オペレーティングシステムは、ポート 1025～5000 を使用します。Windows Server 2008 は、ポート 49152～65535 を使用します。そのため、インターネット上の Windows XP クライアントから、お使いの VPC のウェブサーバーにリクエストが送信される場合、ネットワーク ACL には、ポート 1025～5000 あてのトラフィックを可能にするアウトバウンドルールを用意する必要があります。
http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_ACLs.html#VPC_ACLs_Ephemeral_Ports


ネットワークACLがステートレスだということを理解していたし、適切に設定しているつもりだったけどサブネットの中にはLinuxしかいないからこれで大丈夫だろうと思っていたのが失敗だった。

で、ポートの範囲を広げたら無事ヘルスチェックがとおるようになりました。

```
カスタム TCP ルール　TCP (6)　1024-65535　0.0.0.0/0　許可
```

> Requests originating from Elastic Load Balancing use ports 1024-65535. 
http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_ACLs.html
とあるネットワーク業界の隅っこで強制的にGitを使わせた話

# まず
成功とは言いがたかった。
全体的にGitでの管理を行いたかったのだけれども、そもそもの知識レベルなどを考慮した結果、一部の重要ファイルのみをGitで管理することにしたこと。
ただ、バージョン管理するということと毎朝Cloneすることについては周りの理解者の協力もあったり、他の方も技術者としての興味でなんとかなった。

内容は1年前の話なので、ネットワーク業界が変わっていることを期待している。

# ネットワーク業界ファイル管理あるある
* ファイルは日付管理&oldフォルダ
* コンフィグの元ネタはExcelで作成
* 構成図はお金があるPJはCAD/Visio、お金がないとパワーポイントなどのOfficeで作成
* 一応設計資料が消えても大丈夫なようにHDDまるごとバックアップは取ってる
* バージョン管理システム導入してるけど、使い方がデータ共有みたいな形になっていて変。
* **というかバージョン管理って何？という人が大多数**

こんな感じですかね？違います？
少なくとも私が経験した、何箇所かの某ISPの某NWのPJではこんな感じだったような。
クソ食らえっていつも思っているんですが、社会とは怖いもので、飼いならされてしまうんですね。

# 導入したいよぉ
今回Cisco製品等のコンフィグを管理したいということではなく、とある有償ソフトウェアで吐き出されるファイルをソフトウェア自体で管理できればよかったのですが、そんな機能はないけれど、品質の保証とレビュー、勝手なファイル更新をさせたくなかったので導入しようと至った。

## 現状
現状を示した図がこれ。
![Git導入前1](https://qiita-image-store.s3.amazonaws.com/0/65675/7b68c139-f1ba-77c6-7ac4-a86275ac7b4d.png)
サーバにファイルを保存すると誰でも編集可能であり、編集されてしまうと全員に影響が出る。

詳細図。前はこんな感じで作成していました。
一応試作はローカルでやるんですけどね・・・そうじゃないときもあります・・・。
![Git導入前2](https://qiita-image-store.s3.amazonaws.com/0/65675/942ea62d-1c7e-4ae7-2fb5-76b75425cd5d.png)

## 提案
どういう体制にしたいかというのがこれ。
![Git導入後](https://qiita-image-store.s3.amazonaws.com/0/65675/ca4f7b84-1ece-f564-08e7-c324811d62eb.png)
要はレビュー通らなかったものはサーバには保存させない。
万が一誰かがサーバ上のものを編集しても、それはマスターではないから、
リポジトリから持ってきて上書きしますよと。

# なんとかなるだろう！
とりあえず環境作って使わせて飼いならそう！
環境自体は極力優しくなるよう、Tortoise GitとGitbucketを使った。

そして翌日。
まあ、説明もほとんどなく使わせたものだから、当然競合やら無視する人が出てくるわけです。

# さて、どうしたものか
教育資料面倒だよね･･･本読んでくれたりする人はいいけど、理想論なので･･･。
そこで、興味ある奴だけ重要なファイルをいじることにして、そいつらでまわそう。
そうすれば、重要ではないファイルがたとえ変な変更が入っていたとしても、取り返しが付く。
ただし、どんなファイルでも誰がいじったかは明確にしようということで、編集者はファイル内に変更日時と名前を書くように義務付けた。

さらに翌日。
お、困る人が減った。説明してもぽかーんとする人も減った。
切捨てたほうが最初やりやすいね！ととりあえずPJ的には最後までこの方法でやり通した。

# まとめ
* ネットワーク屋さんでもGitの可能性が見えてきた
* Windowsがまともに扱えればなんとかなる優しさになってきた
* ファイル編集する人が2～3人だと声がけでいいけど、それより増えたら迷うことなく導入で良さそう
* **色々なファイルをバージョン管理したいという要望が出てきた**
* **沢山の競合が起きた！**
* gitbucket版pull request便利！
* あと少しすれば、チャットとの連携もいける気がする！

oldフォルダと日付や連続するアルファベットが付いた設計資料が消えるときが来て欲しいものだ。。。
iOS AdblockAPIについて広告主とメディアの目線から影響を考える

# TL;DR

- 広告主・優良メディアにとっては長期的にポジティブ、ダメディアは淘汰される
- Adblockが普及した場合一番泣くのはアドネットワーク事業者
- なお[AdblockされるとGAが無効化する](http://unique-experience.xyz/?p=1526)点についてはここでは言及しない（GAというかjsだと思うが）


# 前提として
Adblockの論点を議論する際に抑えておかなくてはいけない前提が2つある。
## Adblockの影響範囲はアドネットワークによる出稿に限る

web広告には極めて大雑把に大別すると以下の2種類
1. 純広告（ネイティブアドと近似してもよい）
2. アドネットワーク

Adblockを有効にした場合にBlockされてしまうのは概ね2である。1はそもそも広告というより単位としては「記事=コンテンツ」に近いため、Adblockの影響が及ばない事が多い（例外はもちろんある）。


## Adblockはマス層へ簡単に普及しない

- Adblockという機能をユーザーが利用するためには、3rd partyのクライアントを通じた設定というステップを踏む必要がある。
- このステップは以下の2点から、マス層には非常にハードルが高い
  1. そもそも有効化するチューニングというタスク自体を認識できない
  2. 3rd partyのクライアントが課金を必要とする場合が多い
- いくら日本でのiOSの普及率が高いとはいえ、Adblockの機能を課金+めんどうなチューニングをしてまで利用したいと考えるユーザーは非常に少なく、逆に利用層はギークやITテクノロジー界隈のユーザーがメインになると筆者は考える。

本稿に関してはこれら前提を踏まえたい。

# Adblockの影響を考える

簡略図を用意した。
![image](https://qiita-image-store.s3.amazonaws.com/0/83135/ba158d6a-b0a8-0d63-ee2f-47f6dc8214c2.png)

こと広告業界において、中間プレイヤーが極めて多層化し複雑怪奇な構造となっているが、最も本質的なプレイヤーである広告主と、メディアにとってAdblockの影響を考える。

## 広告主

- **影響**：impが減りCTRが上がる。ビジネスKPI（CPA, LTV）等への影響はポジティブ。長期的に考えると、そもそも有効なアドテク手法は1年単位で変わる（替わる）ので考慮しなくても良い気がする。
  - impの減少は露出量という点からネガティブだが、露出の意味はブランディングかアトリビューションにある。正直バナー広告でブランディングなど微妙だし、アトリビューションも真偽を正しく測るのが難しい。 
  - 見込み客へ訴求するチャンスが減ると思われるが、そもそもAdblockを使用するようなユーザーは表示された広告を意地でも踏まないようなユーザーがほとんどであるため、初めから見込み客にすら成り得ない場合が多い。
  - そういったユーザーへのimpが排除されることは、広告機会を純化してくれるため、ポジティブである。ビジネスKPIに良いフィードバックが得られるのではと筆者は考えている。

## メディア

- **影響**：impやclickの減少により一律でネットワークからの収益化が厳しくなるが、メディアとして品質の高いコンテンツ・プラットフォームを生み出しているところは相対的に純広告の価値が上がるので影響なしorポジティブ（例. mery）。結果的にダメディアが淘汰される。
  - すこしユーザーの目線を交えると、2chまとめのようなメディアにはエロ広告ばかり。
  - 一律でネットワークをブロックするのではなく、メディアや出稿主単位でブロックできる用になると良いかもね（この点はえふしん氏も同意権の模様）。
  ![image](https://qiita-image-store.s3.amazonaws.com/0/83135/4c3a79b7-da4e-ee9f-e6c7-5c9531ff6432.png)



### ちなみにAdblockによって一番大きな影響を受けるのは…
おそらく中間業者たるアドネットワーク事業者だと思われる。

- 駄メディアを排除する圧力がかかり、これまで効率的に稼ぐことのできたimpが得られなくなる。
- アドネットワークは「量が制す」世界なので、如何に大量の広告枠を保有できるかが鍵。独立系のネットワークが氾濫する現状だが、adblockによりimpの総量が減ると食えなくなるネットワークが撤退し、最終的にはGoogleのような巨大ネットワークに淘汰されていく。

# コメント

- 今後Adblockがマス層へ受け入れられるような事があれば、より純広告的な、ネイティブアド的なものがメディアにとって主流のマネタイズ手法になっていきそう。
- 自社のサービスとしてはEC事業主として広告を出稿し、メディアで単体収益化を検討していたりするので、両方の目線で考えられるにはいいお題目でした。
- 事象の理解しやすさを優先するためにかなり雑に分類したり前提置いたりしていますが、大きく理解は外れていないはず。
統計における測定値の取り扱い


統計では、販売価格といった数量を伝える情報の他に、
マンションにおいて、部屋の向きや洗濯乾燥機の有無といった、
定性的な情報を取り扱う。
これらを取り扱う、変数や尺度についてまとめた。

##  変数
### 定量的変数
数字で記述でき、平均値を出すといった計算処理を行うことに意味がある変数。

### 定性的編集
単に性質を記述するもの。カテゴリーに属することを区別するために数値を割り振ることがあるが、その数値には意味はない。

## 尺度
統計において取り扱う尺度には4種類ある。

### 名義尺度
数値を単位グループあるいは、階級のラベルとして使用する。
性別においては、男を0、 女を1のように数値を割り振ることが可能である。
定量的ではなく、定性的なデータに持ちいる。
ex) 性別、色、職種、業種、地域 など

### 順序尺度
データの要素がそれぞれの相対的な大きさや品質によって順序付けされる。
通知票の、良い、おおむね良い、もう少し とランク付けするときなどに用いられる。
順序付けでは、ある商品がほかの商品より優れているということがわかるだけで、どのくらい優れているかは不明である。

### 間隔尺度
どの点をゼロとするかが恣意的に決められており、2つの測定値の比率を計算しても意味を成さない。ただ、測定値の間隔をとればその比率には意味がある。
時刻であれば、10時と5時は10時は、5時の2倍という意味はないが、 0時から10時までの間と、0時から5時までの間が2倍であるということに意味はある。
他にも温度なども例としてあげられる。

### 比率尺度
2つの測定値の比を考えることができる。お金など、100円は 50円の 2倍でであり、 0円はまったくお金がないことを意味する。
一般に間隔尺度に属する測定値の間隔を取ると比率尺度になる。
ほかに、重さ、長さ、面積、体積、量などが例としてあげられる。
gulpでwebpackを使う

[gulp](http://gulpjs.com/)で[webpack](http://webpack.github.io/)を使って、Web開発で使用するモジュールを管理してみます。

## インストール

まずはgulpとwebpackのインストールします。WebPackはコマンドを使うことがあればグローバルにインストールする必要があるけれども、今回はgulpを使うのでグローバルにはインストールしていません。

`package.js`を作成してプロジェクトを追加、ついでにその他必要になるパッケージもインストールしておきます。

```ps1
npm install gulp webpack-stream gulp-load-plugins --save
```

loaderを使えばJadeやBabel、CoffeeScriptの変換もできます。



## gulpfile.js

このサイトの作成時に使用している`gulpfile.js`の一部です。

```js
'use strict';

var gulp = require('gulp');
var objectAssign = require('object-assign');
var webpack = require('webpack-stream');
var $ = require('gulp-load-plugins')();

var watch = false;

gulp.task('build:js', function() {
  var src = 'src/scripts/main.js';
  var dist = 'tmp/scripts/';
  var config = {
    output: {
      filename: '[name].js'
    },
    module: {
      loaders: [
        {
          test: /\.jade$/,
          loader: 'jade'
        }
      ]
    },
  };

  if(watch) {
    config = objectAssign(config, {
      watch: true,
      devtool: '#inline-source-map'
    });

    return gulp.src(src)
      .pipe(webpack(config))
      .pipe(gulp.dest(dist));
  } else {
    return gulp.src(src)
      .pipe(webpack(config))
      .pipe(gulp.dest(dist));
  }
});

gulp.task('watch:js', function(cb) {
  watch = true;

  runSequence('build:js', cb);
});
```

webpackは機能自体は多くてちょっととっつきにくさはあるけれど、そのぶん`gulpfile.js`はbrowserifyを使ったときよりもだいぶシンプルになります。監視用のタスクはとくにそうだとおもう。



## browserifyとの使い分け

webpackで便利だと感じるのはbrowserifyやwatchifyなどのvinylを扱った大量のコードでの表現をwebpackでは簡単な記述で実現できるところが楽で好き。基本的に監視タスクが必要になる場合には何も考えずにwebpackを使っています。



## 参照文献

* [JavaScript - BrowserifyからWebpackへの移行時の注意点 - Qiita](http://qiita.com/derui@github/items/5233b4ef8fbde1e80d33)
Brunchで結合されたMithrilJSでroutingを分離させる


物凄く限定的な誰得Tips・・・

BrunchでJSを結合を行うと

````javascript:example.js
;require.register("client/app/account/signup", function(exports, require, module) {
});
````

でラッピングされて結合されます。

例えば単純にconsole.logするだけのJS2つが結合された状態は以下のようになります。

````javascript:example.js
;require.register("js/hoge", function(exports, require, module) {
	console.log("hoge")
});
;require.register("js/fuga", function(exports, require, module) {
	console.log("fuga")
});
````

で、これらを踏まえた上でMithrilJSのラウティングを考えます。
MithrilJSのラウティングは以下の様な形で設定されます。

````javascript:mithril.js
m.route(document.getElementById("root"), "/", {
    "/": main,
    "/hoge": hoge,
});
````

ここで参照している`main`,`hoge`はそれぞれコンポーネントになります。
仮に、ラウティングの部分のみ`router.js`のようなファイルに分離させて、Brunchで結合させた場合不都合が生じます。

それは、ラウティングで指定すべきコンポーネントが指定できなくなるという問題です。

例えば以下の様な結合後のファイルを見ると納得できるかもしれません。

````javascript:example.js
;require.register("js/hoge", function(exports, require, module) {
  // Components
  var hoge = {
	  controller: function(){},
	  view: function(controller){}
  };
});
;require.register("js/fuga", function(exports, require, module) {
  // Components
  var fuga = {
	  controller: function(){},
	  view: function(controller){}
  };
});
;require.register("js/router", function(exports, require, module) {
  m.route(document.getElementById("root"), "/", {
    "/": hoge,
    "/fuga": fuga,
  });
});
````

この形では、`router.js`がhoge・fugaのコンポーネントを参照することが出来ません。
そこで、各コンポーネントを記述しているファイルで`module.exports`を行います。

````javascript:hoge.js
  // Components
  var hoge = {
	  controller: function(){},
	  view: function(controller){}
  };
  
  module.exports = hoge
````

````javascript:fuga.js
  // Components
  var fuga = {
	  controller: function(){},
	  view: function(controller){}
  };
  
  module.exports = fuga
````

さらに、`router.js`では各ファイルを`require`で呼び出します。

````javascript:router.js
var hoge = require("./js/hoge")
var fuga = require("./js/fuga")
m.route(document.getElementById("root"), "/", {
    "/": hoge,
    "/fuga": fuga
});
````

これでroutingを担う部分のみファイル分離させることができました。

--

初心者JSerが試行錯誤して作ったものですので、他により良い方法があれば教えて頂けると幸いです。
Python3でメモリ使用量を見るとき

pipで下記のモジュールをインストール

```
pip install psutil
pip install memory_profiler
```

下記の部分を書き換えて文字コードエラーを防ぐ

Python 3.4.3

 /home/vagrant/.pyenv/versions/3.4.3/lib/python3.4/site-packages/memory_profiler.py

890行目

```
xec(compile(open(__file__, encoding="utf-8").read(), __file__, 'exec'), ns, ns)
```

使い方

メモリ消費を見たいメソッドの上に`@profile`を記述

例

```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

@profile
def main():
    a = [1] * (10 ** 6)
    b = [2] * (2 * 10 ** 7)
    del b
    return a

if __name__ == '__main__':
    main()
```

下記で実行

```
python -m memory_profiler パイソンファイル名
```

#参考

memory_profiler

http://www.sakito.com/2012/09/python-memoryprofiler.html

文字コードエラー

http://chidipy.jpn.com/topics/?p=309
技術英語 > damage / damages > damages: 損害賠償金

引用: 冠詞マスター教本 by 石井隆之さん

> 複数形が、特別の意味をもち一人歩きする例が英語には存在します。
> 例えば、damagesは単に「たくさんの損害」の意味よりも、「損害賠償金」の意味が普通です。また、口語ではthe damage(s)の形で費用の意味も出ることにも注目しておきましょう。

> (a) The plaintiff claimed damages for the broken gold watch.
> (b) What are the damages? (費用はいくらですか?)

http://ejje.weblio.jp/content/damages

こういうのは意識しておかないと安易に複数形を使ってしまいそう。

ideaとideasの違いなどについて以下のように書いているものもある。
http://blog.livedoor.jp/fairypot2/archives/1695298.html
> any ideasは「自分が知ってる事に加えて、何か情報がほしい時」や「プロジェクトの出発点に立った時」に使う。
...
Sがつかない「any idea」は情報の手がかりが全然ない時に使うの。ここでのideaは「ヒント、手掛かり、意見」ね。
VimへのNeoBundleのインストール(2015/09/21版)

NeoBundleは非推奨となったようです。

@yoza さんの[dein.vimを使ってみる](http://qiita.com/yoza/items/2f8bd33a18225754f346)や、@delphinus35 さんの[NeoBundle から dein.vim に乗り換えたら爆速だった話](http://qiita.com/delphinus35/items/00ff2c0ba972c6e41542?utm_content=buffer1bafe&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer)で紹介されているdeinというのがいいそうです。 

Vim 8.0からは、標準のパッケージマネージャーも搭載されているようなので、そちらを使用するのが良さそうです。
Qiita上では記事が見当たりませんが、http://kata0hka.hatenablog.com/entry/2016/09/26/055756 あたりが参考になりそうです。

以下、NeoBundleのインストール記事なので、今となっては非推奨となりますのでご注意ください。

[VimへのNeoBundleのインストール](http://qiita.com/poad1010/items/0434466cec41193b1136) の最新版です。

# pluginのダウンロード

## Linux/Mac OS XなどのUNIX系の場合

```
curl https://raw.githubusercontent.com/Shougo/neobundle.vim/master/bin/install.sh > install.sh
sh ./install.sh
rm -rf install.sh
```

## Windowsの場合

```
mkdir -p ~/.vim/bundle
git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
```

# _vimrcの作成

call neobundle#rc() とかが動かなくなっていたので、NeoBundle公式のREADMEを参考にしながら修正しました。

以下、_vimrcの最新版となります。

```:vimrc
" Note: Skip initialization for vim-tiny or vim-small.
if 0 | endif

filetype off

if has('vim_starting')
  if &compatible
    set nocompatible               " Be iMproved
  endif

  set runtimepath+=~/.vim/bundle/neobundle.vim
endif

call neobundle#begin(expand('~/.vim/bundle/'))

" originalrepos on github
NeoBundle 'Shougo/neobundle.vim'
NeoBundle 'Shougo/vimproc', {
  \ 'build' : {
    \ 'windows' : 'make -f make_mingw32.mak',
    \ 'cygwin' : 'make -f make_cygwin.mak',
    \ 'mac' : 'make -f make_mac.mak',
    \ 'unix' : 'make -f make_unix.mak',
  \ },
  \ }
NeoBundle 'VimClojure'
NeoBundle 'Shougo/vimshell'
NeoBundle 'Shougo/unite.vim'
NeoBundle 'Shougo/neocomplcache'
NeoBundle 'Shougo/neosnippet'
NeoBundle 'jpalardy/vim-slime'
NeoBundle 'scrooloose/syntastic'
NeoBundle 'Shougo/vimfiler.vim'
NeoBundle 'itchyny/lightline.vim'
NeoBundle 't9md/vim-textmanip'

NeoBundle 'Shougo/unite.vim'
NeoBundle 'ujihisa/unite-colorscheme'
NeoBundle 'tomasr/molokai'
""NeoBundle 'https://bitbucket.org/kovisoft/slimv'

call neobundle#end()

filetype plugin indent on     " required!
filetype indent on
syntax on

NeoBundleCheck
```

# おまけ

Ubuntuでプリインストールされているvim-tinyでは動きません。

```:shell
sudo apt-get remove vim-tiny
sudo apt-get install vim
```

とすれば、動作します。
Karplus-Strong String Synthesis

##Karplus-Strong string synthesisとは
　擦弦楽器（ヴァイオリンやギター）の物理モデルの合成方法。電子音から生楽器のような音が出せる、物理モデルの基本的なもの。

##弦楽器が音高を持つ仕組み
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/93396/daf320c3-7f33-c083-4094-b3f25bc073bb.jpeg)
　弦楽器は、駒と駒に乗っていて、空中に浮いている部分を、指で弾くなり、弓で擦るなりで音を鳴らす。
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/93396/0ecbde36-0bda-6c2e-4d17-bad07e71ad5e.jpeg)
　音の高さは駒と駒の距離の長さか、弦が引っ張られる強さで決まる。
　ではどのように音が鳴るのか？
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/93396/9697a38c-bb00-4a3e-fb8a-b762ebeba171.jpeg)
　何らかの方法で演奏すると、弦に垂直の力がかかる。それに対して、引っ張る力が弦を元の位置に戻そうとする。戻ろうとするが行き過ぎて、また引っ張られる力で戻され、弦が震える。
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/93396/dddfdfd6-313e-5a74-20fa-1c1a1f845417.jpeg)
　弦に伝わった振動は、駒まで伝わり跳ね返って反対の駒に伝わり、また跳ね返る。それが繰り返されることで弦楽器の音色ができる。
![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/93396/b2dbf66b-1e58-2c78-9735-6077a8cfe017.jpeg)
　これらを音響合成用に簡略したのがこの図。弾き始めのノイズを鳴らして、振動の移動で音の繰り返しを表したディレイ、ノイズのままでは高音域がうるさいのでローパスフィルターを入れておく。それがフィードバックしていく。

##Maxで作る
###ノイズ発生器
![スクリーンショット 2015-09-21 4.35.23.png](https://qiita-image-store.s3.amazonaws.com/0/93396/d911d773-ea3c-8a8e-af36-a15d7f3806cf.png)
　[adsr~]を使って、Bangを打てば短いノイズを鳴らすものを作る。[adsr~]のアーギュメントはそれぞれAttack 5ms、Decay 10ms、Sustain 0、release 5msにしている。Sustain以外はこれくらいの長さなら好きにアレンジしてください。

###ショートディレイ（ローパス付き）
![スクリーンショット 2015-09-21 4.39.28.png](https://qiita-image-store.s3.amazonaws.com/0/93396/1a2f7f55-2c8a-ce1d-d6d5-7429a6fd907d.png)
　出てきたノイズは[tapin~]に繋いで[tapout~]で出力。そのあと[onepole~ 5000]がローパスフィルターとなって、5,000Hz以上の周波数をカットしてくれる。最後にその信号を[*~ 0.99]で音量を下げて、[tapin~]に繋げれば、フィードバックの長いショートディレイとなる。

###ひとまず完成
![スクリーンショット 2015-09-21 4.44.35.png](https://qiita-image-store.s3.amazonaws.com/0/93396/e4c5a08c-dcaa-8326-d06f-a36622f53b47.png)
　あとはノイズと[onepole~]から出てきた信号をdacに繋げば完成。

###音高を付ける
　現在[tapout~]に10の数値が入っている。これは、10ms遅らせて信号を出している。ここの数値を周期にしてあげれば、音高が生まれる。
![スクリーンショット 2015-09-21 4.50.11.png](https://qiita-image-store.s3.amazonaws.com/0/93396/a0bcaf27-4ebe-040d-1567-f1e9460dc4f1.png)
　[kslider]に[mtof]を繋いで周波数を出します。周波数とは１秒間に何回振動しているかなので、周波数を１秒(1,000ミリ秒)で割ってあげると１周あたりの周期が出てくる。この例だと440Hzは2.273...msになる。

###完成
![スクリーンショット 2015-09-21 4.54.36.png](https://qiita-image-store.s3.amazonaws.com/0/93396/3f28214c-757e-090e-a743-169953708a08.png)
　出てきた周期を[tapout~]に繋ぎ、[mtof]をノイズ発生用のBangに繋げば、キーボードの音程に対応した音高で物理モデルが演奏できる。
Xcode7.0にしたらv0.8.4のビルドが通らなくなった

僕の環境だけかもしれないですが、
Xcode7.0にしたらopenFrameWorks0.8.4のビルドが、
まとめて通らなくなりました。

エラーをみると下記の通り。

```
OF/of_v0.8.4_osx_release/libs/openFrameworks/utils/ofURLFileLoader.cpp:45:10: 'openssl/opensslconf.h' file not found
```

opensslのheaderがsearch pathにはいっていないことが原因のようです。

何故7.0にしたタイミングでこのエラーがでるようになったのかはわかりませんが、
とりあえず対応します。

以下にあるCoreOF.xcconfigを変更してsearchPathを増やします。

```
of_v0.8.4_osx_release/libs/openFrameworksCompiled/project/osx/CoreOF.xcconfig
```

こちらに下記２つを追記します。

12行目あたり
```
HEADER_SSL = "$(OF_PATH)/libs/openssl/include"
```

39行目あたり

```
OF_CORE_LIBS = $(LIB_POCO_1) $(LIB_POCO_2) $(LIB_POCO_3) $(LIB_POCO_4) $(LIB_POCO_5) $(LIB_POCO_6) $(LIB_POCO_7) $(LIB_POCO_8) $(LIB_POCO_9) $(LIB_POCO_10) $(LIB_TESS) $(LIB_GLEW) $(LIB_CAIRO1) $(LIB_CAIRO2) $(LIB_CAIRO3) $(LIB_FMODEX) $(LIB_RTAUDIO) $(LIB_OPENSSL1) $(LIB_OPENSSL2) $(LIB_GLFW) $(LIB_FREEIMAGE) $(LIB_FREETYPE)
OF_CORE_HEADERS = $(HEADER_OF) $(HEADER_POCO) $(HEADER_FREETYPE) $(HEADER_FREETYPE2) $(HEADER_FMODEX) $(HEADER_GLEW) $(HEADER_FREEIMAGE) $(HEADER_TESS2) $(HEADER_CAIRO) $(HEADER_RTAUDIO) $(HEADER_GLFW) $(HEADER_SSL)
```

を追加
[Kundera]NoSQL/OGM Error

# Entity object is invalidについて

cassandra/NoSQLに限らず、persistence.xmlに対してアプリケーション管理環境で transaction-type="JTA"を指定していると、以下のエラーが出る。

```
java.lang.IllegalArgumentException: Entity object is invalid, operation failed. Please check previous log message for details at com.impetus.kundera.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:174)
```

https://github.com/impetus-opensource/Kundera/wiki/Getting-Started-in-5-minutes
このサンプルでは問題ないが、EJB(コンテナ管理)とEntityManagerFactory(アプリケーション管理)を相互使用する、persistenceを定義はできないってことでいいのかな？

もし、同時に入れたり場合は、以下のように分けるのが良いかも？
とりあえず、エラーは無くなったことは確か。

```xml
  <persistence-unit name="kundera_pu" transaction-type="JTA">
    <provider>com.impetus.kundera.KunderaPersistence</provider>
    <properties>
      <property name="kundera.nodes" value="XX.XX.XX.XX"/>
      <property name="kundera.port" value="9160"/>

      <snip...>

    </properties>
  </persistence-unit>
  <persistence-unit name="kundera_pu_t" transaction-type="RESOURCE_LOCAL">
    <provider> com.impetus.kundera.KunderaPersistence </provider>
    <properties>
      <property name="kundera.nodes" value="XX.XX.XX.XX"/>
      <property name="kundera.port" value="9160"/>

      <snip...>

    </properties>
  </persistence-unit>

** 追記
```
  <persistence-unit name="kundera_pu" transaction-type="JTA">
```

に関しては、
```

 <persistence-unit name="kundera_pu">
```

の方が望ましいのかもしれない。default JTAなので同じだと思っていたんだがなー
GoogleIMEの辞書ファイル(*.txt)をMacの日本語IM用辞書ファイル(*.plist)に変換する

# 発端

最近使っているユーティリティを、なるべくMacネイティブのものに変更しているのだけど、
その一環でGoogleIMEを日本語IMにしようと思い立った。

# 問題
微妙な使い勝手に起因するところは後々慣れていくだろうなぁとは思っているのだけど、
一番の問題は、GoogleIMEで使ってた辞書ファイル(約3000語?)をどうやって移行するか。

とりあえずスクリプトあるだろーとググったら意外になかったっぽいので、
取り急ぎPHPで適当に書いたらとりあえず動いたので、お裾分けすることにします。

```php
<?php
// convert.phpとか適当に名前つけて保存してくだしあ


// ファイル名を引数から読込んで定義
$option = getopt('i:o:');
$filename_in  = empty( $option['i'] ) ? "./名称未設定.txt" : $option['i'] ;
$filename_out = empty( $option['o'] ) ? "./IME辞書01.plist" : $option['o'] ;

// 存在確認して入力ファイルを開く
if( !file_exists($filename_in) ){
	echo("WARN - 指定された入力ファイルは存在しません。 file=$filename_in");
  exit();
} else {
	$fp_in = fopen( $filename_in, "r" );
}

// 存在確認して出力ファイルを作成・開く
if( file_exists($filename_out) ){
	echo("WARN - 既に出力先ファイルが存在しています。 file=$filename_out");
	exit();
} else {
	touch( $filename_out );
	$fp_out = fopen( $filename_out, "w" );
}

//出力ファイルにヘッダ行を投入
fwrite($fp_out,"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
fwrite($fp_out,"<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n");
fwrite($fp_out,"<plist version=\"1.0\">\n");
fwrite($fp_out,"<array>\n");


//一行読み込み、以下の処理を繰り返す
while (($data = fgets($fp_in)) !== FALSE)
{
  // HTでバラして配列に変換
  $data_array = explode("\t", $data);

  // 使うのは0個目と1個目だけなので、ここが空だったらスルーする
  if( $data_array[0]!=="" && $data_array[1]!=="" )
  {
    //HTMLエスケープしないとimportした時落ちる(白目)
    $shortcut = htmlspecialchars($data_array[0]);
    $phrase   = htmlspecialchars($data_array[1]);

    // 出力
    fwrite($fp_out,"	<dict>\n");
    fwrite($fp_out,"		<key>phrase</key>\n");
    fwrite($fp_out,"		<string>$phrase</string>\n");
    fwrite($fp_out,"		<key>shortcut</key>\n");
    fwrite($fp_out,"		<string>$shortcut</string>\n");
    fwrite($fp_out,"	</dict>\n");
  }
}

//出力ファイルにフッタ行を投入
fwrite($fp_out,"</array>\n");
fwrite($fp_out,"</plist>\n");

//ファイルを閉じる
fclose($fp_in);
fclose($fp_out);
```

# 使い方
入出力ファイル名を選んでPHPで実行すると、
GoogleIMEで出力したTSVをうまいこと読み込めるplistにしてくれる。
そんな複雑でもないので、Macに入ってるPHPだけでサックリ動きます。
```$ php convert.php -i (GoogleIME).txt -o (日本語IM).plist```

# 面倒なこと
単語数が多いせいか、毎回日本語IMの辞書画面開くとカラーボールになってﾌｧｰwwwwってなる。
作った辞書データインポートする時も5分くらい固まってﾌｧｰwwwwwってなってた。
一番やりたかったiPhone/iPadとの辞書の同期もできるようになったが、
やや時間差があるっぽい。1日くらいで確認できた。

それと1度だけ辞書データが全デバイスから吹っ飛んだことがあり、
おいおい同期してるのにそれはどうなん?っていう。

このあたり、もうちょいシステム面での改善お願いしたいですよねぇ。

# 日本語IMの使い勝手とか
細かい所にGoogleIMEほど気が回ってない。

- スペースを常に半角にして入力する設定ができない。
- 「(」の変換に他の括弧が出て来ない。「かっこ」って打っても他の括弧のランクが低い。
- ~~Shift押したまま英語打とうと思っても打たせてくれない。~~
    - 入力ソースの「Shiftキーの動作」を「英字モードに入る」に変えたら動いた。俺が情弱だった。
- 変換後のEnterが2回押し。
    - それを回避するために「Windows風のキー操作」にチェックを入れるとShiftの英字モードが選べなくなる。
    - まぁ英字モードもAIUEOから始めると効いてないっぽいし、もう諦めた方が良さそう。
- 難しい漢字とかあんまり入ってない。おいおいそれは入れといてくれ、みたいな姓名とか意外とない。

近年作ったばっかりなら生温い目で見なくもないけど、GoogleIMEの方がまだまだ使い勝手は断然高い。
日本や漢字圏固有の入力IMではあるにしても、今後Appleさんはここに力入れる気あるのかな。
移行したばっかではあるけど、もう少し細かい改善を出してくれると助かります。