OmniAICreator/Qiita-1.07M huggingface dataset:
Intel Edisonに時刻やSSH接続を設定

[前回の記事](http://qiita.com/mia_0032/items/239bafa11044af28dec0)でEdisonを最新にできたので、今回はSSHで接続できるようにし、Linuxの基本的な設定といくつかのパッケージのインストールを行います。

前回と同様にベースボードは[SwitchScience版Eaglet](https://www.switch-science.com/catalog/2070/)を使います。

PCとの接続は[前回の記事](http://qiita.com/mia_0032/items/239bafa11044af28dec0)を参照してください。

まずはシリアルコンソールからrootユーザーにログインします。

```bash
# xxxxxxの部分は環境によって異なるので置き換えてください。
$ screen /dev/tty.usbserial-xxxxxx 115200 -L
Poky (Yocto Project Reference Distro) 1.7.2 edison ttyMFD2

edison login: root # root でログイン
Password: # 前回設定したパスワード
```

以下の作業はEdison上で行います。

## 1. パッケージリポジトリの追加

標準で設定されているリポジトリはインストールできるパッケージが少なすぎるので、リポジトリを追加します。

ファームウェアバージョン2.0からファイル名が変わっていたり、別のリポジトリになっているようなので注意が必要です。

```:/etc/opkg/base-feeds.conf
src/gz all http://repo.opkg.net/edison/repo/all
src/gz edison http://repo.opkg.net/edison/repo/edison
src/gz core2-32 http://repo.opkg.net/edison/repo/core2-32
```

```:/etc/opkg/iotkit.conf
src iotkit http://iotdk.intel.com/repos/2.0/intelgalactic
src iotdk-all http://iotdk.intel.com/repos/2.0/iotdk/all
src iotdk-i586 http://iotdk.intel.com/repos/2.0/iotdk/i586
src iotdk-x86 http://iotdk.intel.com/repos/2.0/iotdk/x86
```

追加が終わったらリポジトリをアップデートします。

```
root@my-edison:~# opkg update
```

## 2. いろいろパッケージをインストール

```
root@my-edison:~# opkg install sudo bash less git vim glibc-locale-ja glibc-localedata-ja-jp glibc-charmap-utf-8 localedef
```

## 3. OSの基本設定

タイムゾーンとロケールを日本に設定します。

```bash
# 日本時間に設定
root@my-edison:~# timedatectl set-timezone Asia/Tokyo
# ja_JP.utf8のロケールを追加
root@my-edison:~# localedef -i ja_JP -f UTF-8 ja_JP.utf8
```

公開鍵認証でSSH接続できるようにします。

```bash
root@my-edison:~# vi /etc/ssh/sshd_config
```

```diff
- #RSAAuthentication yes
- #PubkeyAuthentication yes
- #AuthorizedKeysFile     .ssh/authorized_keys
+ RSAAuthentication yes
+ PubkeyAuthentication yes
+ AuthorizedKeysFile     .ssh/authorized_keys
```

好みですがシェルをbashへ変更します。

```bash
root@my-edison:~# chsh -s /bin/bash
```

シェルの設定を行います。

```bash
root@my-edison:~# echo "alias ll='ls -la --color=auto'" >> .profile
root@my-edison:~# echo "alias vi='/usr/bin/vim'" >> .profile
root@my-edison:~# echo "rm='rm -i'" >> .profile
root@my-edison:~# echo "export LANG='ja_JP.utf8'" >> .profile
root@my-edison:~# source .profile
```

## 4. SSH接続の設定

公開鍵認証でSSHできるようにします。

```bash
root@my-edison:~# echo "自分の公開鍵" >> .ssh/authorized_keys
```

自分のPCから

```bash
$ ssh root@<edisonのipアドレス or edisonのホスト名.local>
```

でSSHできれば完了です。

SSHできるようになれば、シリアルコンソールは緊急時以外は使わないため、シリアル変換基板を外しても問題ありません。

## 参考にした記事

[Intel Edisonの初期化後 毎回セットアップする作業をひとまとめ - Qiita](http://qiita.com/CLCL/items/3df874ff08b5a7dc4c52)
[Intel Edisonの時刻合わせ（systemd-timesyncd,timedatectl） - Qiita](http://qiita.com/CLCL/items/e991e23f4bdbca5ff28b)
[Edisonに日本語UTF-8(ja_JP.UTF-8)のロケールを設定する。 - Qiita](http://qiita.com/masato_ka/items/5ff0373b7674ae79528d)
[10: Edison上のYocto Linuxで採用されたパッケージマネージャ opkg をいじる ｜ Developers.IO](http://dev.classmethod.jp/hardware/10-edison-package-manager-opkg/)
[[Edison]sshやscpを使ってみる ｜ Developers.IO](http://dev.classmethod.jp/hardware/edison-ssh/)
numpy の unit テスト

こんにちは。
numpy などのインストール後、unit テストを実行させてみました。

```console
$ python --version
Python 2.7.11
$ pip install nose
$ python -c "import numpy; print numpy.__version__; numpy.test()"
..................................
----------------------------------------------------------------------
Ran 5931 tests in 22.598s
   OK (KNOWNFAIL=5, SKIP=8)
$ python -c "import scipy; print scipy.__version__; scipy.test()"
..................................
$ python -c "import matplotlib; print matplotlib.__version__; matplotlib.test()"
..................................
```

```print numpy.__version__```の部分は不要かもしれませんが、python 3.x では、```print(numpy.__version__)```へ変えて下さい。

```console
$ pip3 install nose
$ python3 -c "import numpy; print(numpy.__version__); numpy.test()"
$ python3 -c "import scipy; print(scipy.__version__); scipy.test()"
$ python3 -c "import matplotlib; print(matplotlib.__version__); matplotlib.test()"
```
UINavigationControllerのスワイプで戻るを有効・無効にする方法

ナビゲーションバーの左にボタンを配置すると「スワイプで戻る」が効かなくなります。

```objc:Objective-C
UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_button_image"]
                                                                   style:UIBarButtonItemStylePlain
                                                                  target:self
                                                                  action:@selector(backButtonTapped:)];
self.navigationItem.leftBarButtonItem = backButtonItem;
```

画面が戻る前に特別な処理をしたいなどは戻るボタンの代わりに上記のようにナビゲーションバーの左側に独自実装したボタンを配置する必要があります。
だけど、スワイプで戻る処理はちゃんと実装したい。

そういう時は自前で実装する必要があります。

```objc:Objective-C・ViewController.h 
@interface ViewController : UIViewController <UIGestureRecognizerDelegate>
```

```objc:Objective-C・ViewController.m
self.navigationController.interactivePopGestureRecognizer.delegate = self;
```

これでスワイプで戻るが有効になります。
``viewDidLoad:``や``viewWillAppear:``で呼べば大丈夫。
iOS6には対応していないので、もしサポートする場合は分岐する必要があります。

###スワイプで戻るを無効にする方法
逆にスワイプで戻るを無効にする方法はこちら。
常にNOを返せば問題ないですね。

独自のUINavigationControllerクラスでこれを実装すれば問題ないと思います。

```objc:Objective-C・ViewController.m
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    return NO;
}
```

###スワイプで戻るを条件によって有効無効にしたい場合
例えば、編集されていない時にはスワイプで戻るを有効、編集されているときはスワイプで戻るを無効にしたい時は追記でこんな感じで実装。

```objc:Objective-C・ViewController.m
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    // 編集フラグがオンの時はスワイプで戻るを無効
    if(self.Edit) {
        return NO;
    } else {
        return YES;
    }
}
```

###独自でスワイプで戻るを無効にした状態から元に戻す場合
基本的にiOSのスワイプで戻るが有効の状態で、特別な画面のみ戻るボタンを隠して、独自実装したい場合。
こういうパターンですね。

```
画面1
↓ ↑
画面2
↓ ↑
画面3
ナビゲーションバーの左ボタンを独自実装
self.navigationController.interactivePopGestureRecognizer.delegateを設定
↓ ↑
画面4
```

画面2から画面1へ戻る時にスワイプで戻るがなぜか効かなくなります。
画面3で``self.navigationController.interactivePopGestureRecognizer``を実装しているので、その名残が残っているわけですね。

なので、その場合はこういう形で実装します。

```objc:Objective-C・ViewController.m
- (void)viewWillAppear:(BOOL)animated {
    self.navigationController.interactivePopGestureRecognizer.delegate = self;
}

- (void)viewWillDisappear:(BOOL)animated {
    self.navigationController.interactivePopGestureRecognizer.delegate = nil;
}
```

ポイントはnilにするタイミングを``viewWillDisappear:``にするというところ。
``viewDidDisappear:``でnilにしても効いてくれないので、画面が閉じられる前に実装。


(特に一番最後のパターンをしたくて)かなり躓いたので、お役に立てればと思います。
ESP8266 > 三端子レギュレータ / ブレッドボード / アルカリ電池単３x3 > 動いた: TX,RXの結線間違い > プルアップ抵抗を3つから１つに減らしたら失敗した

ESP-WROOM-02を動かそうとして相変わらず動かない。

## try1 > 動かない

ブレッドボードで組み直してみた。

回路図の参考にしたのは
http://qiita.com/dz_/items/eb7c80d3caf4a5c84274
に記載がされていた http://www.mkbtm.jp/?p=618 

その回路図と違うのは以下のプルアップ、プルダウンをつけたこと

- IO15 : プルダウン 10k
- IO2 :  プルアップ 10k
- IO0 : プルアップ 10k

![qiita.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/c9ccb7fc-80d1-6b47-4f0c-1c3fe3435be9.jpeg)

Flash Boot Modeにしているが、ATコマンドの応答がない。

```txt:動作環境
Windows 8.1pro on vmware fusion on MacOS X 10.8.5
```

- Tera Termで応答なし
- Sketchでのシリアルモニタで応答なし

3V3は3.25Vたっている。
ENも同様。


## try2 > 動いた

TXとRXがクロスになってなかった。クロスにしたらATコマンドの応答が来るようになった。

ユニーバサル基板での実装時には確認していたのが、ブレッドボード実装時にはきちんとみてなかった。


```txt:結果
AT+GMR
AT version:0.25.0.0(Jun 24 2015 18:02:27)
SDK version:1.1.2
compile time:Jun 24 2015 18:15:29
OK
```

次はユニバーサル基板実装にして、扱いやすくする。


## try3 > CR-123Aでも動いた

電源を3端子レギュレータからCR-123Aに変更してみた。

使用途中のCR-123Aの電圧は3.077Vだった。ESP-8266の動作電圧範囲3.0Vから3.6Vに入っている。

![qiita.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/ee0cc1a6-65fa-3d31-2719-a3f38b204d5b.jpeg)

Tera TermからATコマンドを送信して動くことを確認できた。


## try4 > プルアップ抵抗の数を減らそうとして失敗

上記の場合、プルアップ抵抗は以下の３つにそれぞれ10kを接続している。

- EN
- IO2
- IO0

元々参考にしていた以下の手書き回路図ではプルアップ抵抗は10kを１つで３つ接続している。
http://qiita.com/ie4/items/ae850cdb2c617f3fd6af

同じように３つのプルアップ抵抗を１つにした所、Tera TermでATコマンドが返ってこなくなった。

電気回路について今年の春に入門の本を読んだ程度だが、ブルアップを１つの抵抗で共有するのはだめではないのだろうか。

VCCへは抵抗１０ｋを介している。気になるのはそれ以外の抵抗を介しない接続

- ENとIO2とIO0

各端子から見える抵抗値が10kΩにならなくなるのだろうか？
キルヒホッフの法則、テブナン鳳の定理など、どの法則を使えば理屈が分かるのだろうか。


とりあえず、このtryは１つ目のユニバーサル基板での実装そのものなので、３つのプルアップ抵抗にユニバーサル基板を変更すればいいのだろう。
動作中のPHPがZTSかNTSか判定する方法

タイトルの通り、一部の人にだけ便利なPHP情報をご紹介します。

# ZTSとは

ZTS (Zend Thread Safe) は、マルチスレッド環境に対応するためのPHPの機構です。

マルチスレッド環境では、同じメモリ領域を複数のスレッドが共有します。複数のスレッドが同時に一つのリソース（たとえばグローバル変数）を読み書きする可能性があるので、シングルスレッド環境とは異なるプログラミングが必要になります。マルチスレッド環境で安全に動くようなプログラムのことをスレッドセーフと呼びます。

つまり、ZTSというのはPHPのスレッドセーフ実装ということになります。

とはいえ、PHPはシングルスレッド環境で動かす方が一般的です。LinuxやMacOSXなど、多くの環境のPHPがNTS (Non Thread Safe) で動作しているはずです。ZTS動作が必要なのはWindows+IIS環境くらいでしょう。

ZTSかどうかはPHPのビルド時に決まります。何かの理由で両方を比較したい場合はPHPのバイナリまたは共有ライブラリを2種類用意する必要があります。

# ZTSかNTSかをPHPプログラムから判断する

このZTS/NTSについて、今どちらのモードで動いているかPHPプログラムから知りたい場合は、定数`PHP_ZTS`で調べることができます。1ならZTS有効、0なら無効です。

念のため補足しておくと、PHPプログラマの目線ではZTSでもNTSでも同じPHPプログラムが同じように動くはずなので、ZTSかNTSかはそれほど重要ではないはずです。

# どういうときに便利か

ZTSかNTSかでPHPプログラムは影響を受けないと書きましたが、PHP拡張モジュールの場合は別です。僕はNTS環境でしか期待通りに動かない拡張モジュール（[hnw/php-strdumper](https://github.com/hnw/php-strdumper)）を書いたので、そのテストコードでZTSかNTSかを調べたかったんです。

まさに俺得情報ですね。

# おまけ

他にも`PHP_DEBUG`という定数も見つけました。これを使えばPHPが`--enable-debug`つきでビルドされているかどうかを調べられます。これらの定数はPHP5.2.7以降で使えます。

# 参考URL

- http://php.net/manual/ja/reserved.constants.php#constant.php-zts
Immutable.jsチュートリアル用環境構築

<h1 id="immutablejsチュートリアル用環境構築">Immutable.jsチュートリアル用環境構築</h1>

<p><a href="https://facebook.github.io/immutable-js/">Immutable.js</a>のチュートリアルをCLIですすめるために行った環境構築手順です。</p>



<h2 id="1-nodeのインストール">1. Nodeのインストール</h2>

<p>割愛…。nodebrewを使ってnodeを入れています。</p>



<h2 id="2-チュートリアル用フォルダ作成">2. チュートリアル用フォルダ作成</h2>

<p><code>mkdir ./immutableTutorial</code></p>



<h2 id="3-packagejson生成">3. package.json生成</h2>

<p><code>npm init</code></p>



<h2 id="4-immutablejsのインストール">4. Immutable.jsのインストール</h2>

<p><code>npm install --save immutable</code></p>

<p>以上！</p>



<h2 id="実行方法">実行方法</h2>

<p>とりあえず、<code>entry.js</code>などのJSファイル作ってチュートリアルのサンプルコードかいて、<code>node entry.js</code>とやれば結果が返されます。(下のサンプルコードを実行した場合、2と50が改行されて表示されます)</p>



<pre class="prettyprint"><code class="language-js hljs "><span class="hljs-comment">// entry.js</span>
<span class="hljs-keyword">var</span> Immutable = <span class="hljs-built_in">require</span>(<span class="hljs-string">'immutable'</span>);

<span class="hljs-keyword">var</span> map1 = Immutable.Map({a:<span class="hljs-number">1</span>, b:<span class="hljs-number">2</span>, c:<span class="hljs-number">3</span>});
<span class="hljs-keyword">var</span> map2 = map1.set(<span class="hljs-string">'b'</span>, <span class="hljs-number">50</span>);

console.log(map1.get(<span class="hljs-string">'b'</span>));
console.log(map2.get(<span class="hljs-string">'b'</span>));</code></pre>



<h2 id="引き続きチュートリアルをやるために">引き続きチュートリアルをやるために</h2>



<h3 id="the-case-for-immutability">The case for Immutability</h3>

<p>assertモジュールを使うところが出てきたので、<a href="https://www.npmjs.com/package/assert">assertモジュール</a>を入れます</p>

<p><code>npm install --save-dev node</code></p>

<p>で、チュートリアルのコードをこう書き換えて<code>node entry.js</code>を実行します。</p>



<pre class="prettyprint"><code class="language-js hljs "><span class="hljs-keyword">var</span> assert = <span class="hljs-built_in">require</span>(<span class="hljs-string">'assert'</span>);
<span class="hljs-keyword">var</span> Immutable = <span class="hljs-built_in">require</span>(<span class="hljs-string">'immutable'</span>);

<span class="hljs-keyword">var</span> map1 = Immutable.Map({a:<span class="hljs-number">1</span>, b:<span class="hljs-number">2</span>, c:<span class="hljs-number">3</span>});
<span class="hljs-keyword">var</span> map2 = map1.set(<span class="hljs-string">'b'</span>, <span class="hljs-number">2</span>);

<span class="hljs-keyword">try</span> {
  assert(map1 === map2);
  console.log(<span class="hljs-string">'true'</span>);
} <span class="hljs-keyword">catch</span>(e) {
  console.log(<span class="hljs-string">'false'</span>);
  console.log(e);
}</code></pre>
ATOMをR言語に対応させる方法

こんにちは

普段コーディングに使うエディタをSublime Textから近頃評判の良いATOMに切り替えた。

左端のカラムが今開いているファイルのディレクトリ位置を明示してくれているので、
Ruby on RailsなどWebフレームワークを用いた開発の時にとっても便利！

しかし、デフォルトでは自分が趣味で用いている**R言語に対応していない!!**

そこでR言語に対応させる方法を模索してみたところ、
思いの外簡単だったのでその方法をここで紹介する。

そもそもATOMが最近支持を集めている理由としては、
オープンソースで拡張のためのパッケージが大量に提供されているところにある。
お察しの通り、R言語のためのパッケージも存在するのだ。

以下、その手順(環境はMacを用いているため、Windowsでは多少手順に違いがあることをご容赦いただきたい)。

1.ATOMを開く

2.Macのメニューバーより「Atom」→「Preferences...」を選択する。
![スクリーンショット 2015-12-19 10.03.25.png](https://qiita-image-store.s3.amazonaws.com/0/106245/41e68670-a535-d483-bccd-47880d95d964.png)



3.ATOMの設定画面が表示されるので、「Install」を選択する。
![スクリーンショット 2015-12-19 10.07.39.png](https://qiita-image-store.s3.amazonaws.com/0/106245/b984b687-2475-815f-f581-82b3e57a717a.png)

4.Install Packagesの画面が表示されるので、入力欄に「language-r」を入力し、一番上に表示されるlanguage-rのPackageの「Install」をクリックする(僕はすでにインストールしているため、Install表示は出ない)。
![スクリーンショット 2015-12-19 10.15.13.png](https://qiita-image-store.s3.amazonaws.com/0/106245/3c69ee5c-fa65-f327-b01f-270797f30fb9.png)


5.Install完了後は自動的に設定が適用されるので、拡張子「.R」のファイルを開けばこの通り！
![スクリーンショット 2015-12-19 10.24.18.png](https://qiita-image-store.s3.amazonaws.com/0/106245/29809067-4152-c95d-1ca4-def56c96e382.png)
イベントループが何かわからないので調べてみた

#前置き

Node.jsでよく出てくる言葉であるイベントループとは何か？ということについて調べました。

Node.jsそのもののイベントループに関してではなく、一般的にいうイベントループとは何か、ということについてこの記事では書いてあります。


#フロー駆動型プログラムとイベント駆動型プログラムの違い

###フロー駆動型プログラム
- プログラムは上から下へ実行される
- フローを記述することになるので，フロー駆動型プログラムと呼ばれる

###イベント駆動型プログラム
- イベントに対して，実行される内容が変化するプログラムをイベント駆動型プログラムと呼ぶ
- フローの代わりにイベントに応じたコードを書く
- プログラムに必要なことは，イベントの監視とそのイベントの処理
- イベントの監視と動作内容をあわせて，イベントハンドラと呼ぶ


#イベントループ
- イベントを待機するループを持つ仕組み
- イベントループ内にイベントディスパッチャを持つ構造が一般的
- イベントはイベントキューに入れられて，古いイベントから順に取り出される
- 取り出されたイベントに対応する処理を行う
- プログラム中では，イベントに対応する処理は，コールバック関数を使って記述する．
- プログラムは，イベントに対する処理内容をコールバック関数で動作した後，イベントループと呼ばれる無限ループに動作が移る
- この無限ループで，イベントの監視と，それに対応する処理を永遠行う


#用語補足


##イベント
簡単な例を挙げると、マウスクリックなどのプログラム外から発生するアクションのことです。

>イベント (英: event) とは、コンピュータ・プログラムの実行に際し、（プロセス間で共有するイベントカウンタのインスタンスが条件を満たしたときなど）何らかのアクションが発生した際にプログラムに発信される信号（これをメッセージと呼んだりする）をいう。
[- イベント (プログラミング)(Wikipedia)
](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0))

##イベントキュー
>複数のイベントが連続して発生した場合に、それらのイベントを待ち行列として保持するデータ構造。イベントの発生間隔が短く、次のイベントが発生するまでにイベントハンドラの処理が間に合わない場合にバッファとして用いられる。  
[- イベント駆動型プログラミング(Wikipedia)
](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E9%A7%86%E5%8B%95%E5%9E%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)


##イベントディスパッチャ
>発生したイベントをイベントハンドラに振り分ける機能のこと  
[- イベント駆動型プログラミング(Wikipedia)
](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E9%A7%86%E5%8B%95%E5%9E%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)

##コールバック関数

>###コールバックとは
「コールバック」というのは英語の「callback」そのままですが、これは直訳すると「呼び戻す」とか「折り返し電話する」とかいうような意味のようです。  
プログラミングの文脈で言う「コール」というのはもちろん電話のことではありません。
「コール」とは「（ある処理を）呼び出す行為」のことですよね。
「コールバック」というのは言葉の意味としては「（呼び出された側から呼び出した側を）呼び出し返す行為」ということになります。  
>###呼び出し返す
ここで「呼び出し返す」という言葉に注目してください
「呼び出し返す」とはつまり「（関数を）呼び出し返す」ということです。
この「呼び出し返される関数」のことを「コールバック関数」と言います  
[- コールバックの薦め](http://d.hatena.ne.jp/prettysoft/20100909/1283529670)

***

[参考：イベントループ(Wikipedia)](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%AB%E3%83%BC%E3%83%97)  
[参考：イベント駆動型プログラム
](http://akita-nct.jp/yamamoto/lecture/2007/2E/22nd/html/node2.html)
Macで特定のディレクトリ以下で変更されたファイルをリアルタイムで表示する


# 用途
既存のファイルが多すぎて、バッチなどを走らせたときに、どのファイルが更新されたり作られたかわからないときに使うといい

# 方法
fswatchを入れて以下をたたくとよろし

    fswatch -0 . | xargs -0 -n 1 -I {} echo {}

# 応用
* fswatch を使えば、ソースコードが更新されたときに再起動するなどもできる。
bootstrap-sassでエラーメモ

[全部はいらないよね？bootstrap-sassをカスタマイズして使う方法](http://qiita.com/masamitsu-konya/items/e3630046774ac1fbd346)
の記事を参考に設定するとエラーが発生。

```
Undefined variable: "$alert-padding". while precompile assets
```

通常は上記記事のようにやるとうまくいくと思うが、今回は下記を追記していた。

```rb:/config/initializers/assets.rb
Rails.application.config.assets.precompile += %w( *.js *.css)
```

こちらに報告されているように ```*.css```がよろしくないよう。

https://github.com/twbs/bootstrap-sass/issues/654

```rb:/config/initializers/assets.rb
Rails.application.config.assets.precompile += %w( *.js *application.css)
```

で対応し、エラー解決！
考察 > コードの見せ方 > 水平スクロール | Word Wrap | 自己改行付加

コードが1行80文字を超えた時、どうするのが一番扱いやすいか（見やすさ、編集しやすさ）。

状況としては１行が100文字程度までとなる場合。かつ、80文字を超えるのは全体の1割程度の場合。


選択肢はいくつかある。

1. 改行を自分でつけない > エディタやIDEの<font color=red>スクロールバー機能</font>を使う
  - 長所: たいていのエディタやIDEにはスクロールバーはついている
  - 短所: スクロールで見たとき、1行全部が一見できない (後ろの引数を見たときに関数名が見えなかったり)
2. 改行を自分でつけない > エディタやIDEの<font color=red>Word Wrap機能</font>を使う
  - 長所: 1行全部が一見できる
  - 短所: Word wrapが標準でないIDEやエディタがある
  - 短所: Word warpをオンにすると行数が増える
3. <font color=red>改行を自分でつける</font>
  - 長所: 常に同じ形で読める
  - 短所: エディタでの検索時に複数行の閲覧性がよくない (エディタによっては2行目が出てこない)
  - 短所: 編集時に改行を付け直さないといけなくなる

最近の僕のやり方は以下のようなものだ。

- Sublime Textで改行せずにコーディングする
- Sublime TextではWord wrap機能をオンする
- C++ Builderでそのままビルド実行する

最近は横幅1280以上でC++ Builderを開くことが多いので、C++ Builderにおいては自分で改行をつけない方が見やすい。

一方で、Sublime Textは2画面を横に並べることが多いので、そのままでは右側が見えないためWord wrap機能をオンにする。
Word wrap機能オンでは行数が増えるが、80文字を超える行は割合的に少ないので、自分の主なコーディングでは行数の増加は少ない。

Qiitaのコード表示にスクロールバーが使われているから、ふと考えてみた。
phpMyAdmin インストール＆設定 (Ubuntu 14.04.3 LTS + Nginx )

# phpMyAdminの設定で中々ハマったのでメモ
### 前提
Nginxはインストール済み
## インストール
```
sudo apt-get install php5-cgi php5-mysql php5-fpm
sudo apt-get install phpmyadmin
```

apacheのデフォルト設定を選択してEnter(nginxの選択が無かったのでapacheを選択．Skipできなかった．）


## nginx.conf
configのパスは
/etc/nginx/sites-available/default
なので

```
sudo vim /etc/nginx/sites-available/default
```

``` conf:/etc/nginx/sites-available/default

server {
...
  location /phpmyadmin {
    root /usr/share;
    index index.php;

    location ~ ^/phpmyadmin.+\.php$ {
      # Bad gatway 502が出たらソケットのパスと名前が一致しているかを確認する
      fastcgi_pass   unix:/var/run/php5-fpm.sock;
      fastcgi_index  index.php;
      fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
      include        fastcgi_params;
    }
  }
...

```
## nginx 再起動
```
sudo service nginx resatart
```

## 確認
http://[host]/phpmyadmin

# 自動起動設定
```
sudo sysv-rc-conf php5-fpm
```


# 参考文献
sockのNo such file or directoryで見たのは↓
https://www.scalescale.com/tips/nginx/php-fpm-connect-to-unixtmpphp5-fpm-sock-failed-2-no-such-file-or-directory/
上記では/tmp/php5-fpm.sockになっていて，
自分の環境には/tmp/php5-fpm.sockは存在しなかった．今回のハマりポイント．
***
sockのPermissionで怒られた時は↓（今回は発生しなかった）
http://kawatama.net/web/1352


## 所感
Nginxの設定を余りいじったこと無かったのでBad Gateway出て萎えてしまいますが，そこは気合．
ググってもググってもCentOS + phpMyAdminだったりであまり参考にならなかったり...


NginxのBad GateWayが出た時は

```
cat /var/log/nginx/error.log
```
などでエラー文を確認しよう．
protectedメンバをReflectionを使わずに抜き取る

使い道はないような気がするけど、裏技っぽいやつ。
まずこういうクラスがあったとする。

```php
<?php
class Person
{
  protected $name;
  protected $age;

  function __construct($name, $age)
  {
    $this->name = $name;
    $this->age = $age;
  }

  protected function greet()
  {
    echo "{$this->name}です。こんにちはこんにちは！\n";
  }
}
```


Personのインスタンスが渡されたとき、Personと無関係の文脈ではnameやageは参照することができない。greetメソッドも実行することができない。(Reflectionでいじれば可能だけど、ここでは表題通り使わないことにする）

こんな継承クラスを一個作ると、抜き取ることができる。

```php
<?php
class CrazyPerson extends Person
{
  static function getProtected(Person $p, $memberName)
  {
    return $p->$memberName;
  }

  static function execProtected(Person $p, $methodName, array $args=[])
  {
    return call_user_func_array($p, $methodName, $args);
  }
}
```

使い方。

```php
<?php
function doSomething(Person $p) {
  //$pのnameがどうしても取りたい！
  echo CrazyPerson::getProtected($p, 'name');

  //$pのgreet()をどうしても呼びたい！
  CrazyPerson::execProtected($p, 'greet');
}
```

子クラスのコンテキストであれば、親クラスのprotectedが参照できる。
つまり子クラスのstaticメソッドを経由するだけで、親クラスのprotectedメンバやprotectedメソッドを呼び出すことが可能。抜き取りたいオブジェクトに何かする必要はない。
c++ builder XE4, 10.2 Tokyo > 他アプリを見つける > 1. captionでの見つけ方

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

### 注意
(追記 2018/11/14)

**以下で使用しているZeroMemoryは最適化で吹き飛ぶため、SecureZeroMemory()の使用が推奨されます。**

- [C++ > SecureZeroMemory() > 最適化で吹き飛ぶ ZeroMemory() の代替](https://qiita.com/7of9/items/53fcfc1124b38cde9da1)


### 内容

http://qiita.com/7of9/items/7b8e8e5ec4111df6dcf5
の続き。

開いたアプリを見つけたい。

HWNDなりプロセス番号なりで見つけたいが、とりあえずできたのはウィンドウキャプションでの見つけ方。

## try1 

```Unit1.cpp
void __fastcall TParentForm::App_openOther(String param)
{
	String progname = L"childProject.exe";
	if (FileExists(progname) == false) {
		ShowMessage(L"childProejct.exe not found");
		return;
	}

	TShellExecuteInfo sinfo;

	::ZeroMemory(&sinfo,sizeof(SHELLEXECUTEINFO));
	sinfo.cbSize = sizeof(sinfo);
	sinfo.hwnd = 0; // Desktop
	sinfo.fMask = SEE_MASK_FLAG_DDEWAIT;
	sinfo.lpFile = progname.c_str();
	sinfo.lpParameters = param.c_str();
	sinfo.lpVerb = L"";
	sinfo.nShow = SW_SHOWNORMAL;

	ShellExecuteEx(&sinfo);

	// 起動待ち
	WaitForInputIdle(sinfo.hProcess, INFINITE);
}

void __fastcall TParentForm::App_findCaptionOf(String caption)
{
	String suffix;

	int len = String(L"/caption=").Length();
	suffix = caption.Delete(1, len);

	suffix = StringReplace(suffix, L"_", L" ", TReplaceFlags()<<rfReplaceAll);

	String fullCaption = L"childProject";
	fullCaption = fullCaption + L" / " + suffix;


	HWND appHwnd;

	appHwnd = FindWindowEx(NULL, NULL, NULL, fullCaption.c_str());
	if (appHwnd != NULL) {
		String msg = L"found:" + caption;
		OutputDebugString(msg.c_str());
	}

}


void __fastcall TParentForm::B_createClick(TObject *Sender)
{
	App_openOther(L"/caption=Test_3_1_4");
}
//---------------------------------------------------------------------------

void __fastcall TParentForm::B_foundClick(TObject *Sender)
{
	App_findCaptionOf(L"/caption=Test_3_1_4");
}
//---------------------------------------------------------------------------
```


以下のように見つけることができた。

```txt:結果
デバッグ出力: found:Test_3_1_4 プロセス parentProject.exe (2312)
```

## try2

以下において、全部のキャプション文字列を渡すように変更した

```Unit1.cpp
void __fastcall TParentForm::App_findFullCaptionOf(String fullCaption)
{
	HWND appHwnd;

	appHwnd = FindWindowEx(NULL, NULL, NULL, fullCaption.c_str());
	if (appHwnd != NULL) {
		String msg = L"found2:" + fullCaption;
		OutputDebugString(msg.c_str());
	}

}

void __fastcall TParentForm::B_foundClick(TObject *Sender)
{
	App_findCaptionOf(L"/caption=Test_3_1_4");

	App_findFullCaptionOf(L"childProject / Test 3 1 4");
}
```

App_findFullCaptionOf()の方では"_"から" "への変換は省略している。
簡単な再帰処理でPHP7とPHP5.6で速度比較してみる

PHP7がリリースされて、速度改善も今回のリリース内容に含まれていますが、、、

実際にどれくらい早くなったのか検証してみようと思います。

# 検証するプログラム

フィボナッチで簡単な再帰処理をさせてみます。
顕著に違いを出すために、メモ化は未使用の状態で。

```PHP:fib.php
<?php

$start = microtime(true);
fib(35);
$end = microtime(true);

echo "Start: {$start}\n\n";
echo "End: {$end}\n\n";
$time = $end - $start;
echo "Time: {$time} sec. \n\n";

echo "Fin.\n\n";

function fib($n) {
    if ($n === 0) {
        return 1;
    }
    if ($n === 1) {
        return 2;
    }

    return fib($n - 1) + fib($n -2);
}
```

# まずPHP5.6

![php5.6](https://s3-ap-northeast-1.amazonaws.com/alegriaghost-sample/sample001/php5.6.png)

約33秒ほどかかっていますね。
何回か実行してみましたが、32〜36秒あたりが多くそこらへんは誤差の範囲なんでしょうか。
※なぜか私の環境では速度が異常に遅いようです。(コメント参照)

# 次にPHP7

![php7](https://s3-ap-northeast-1.amazonaws.com/alegriaghost-sample/sample001/php7.png)

約2秒です！！！！
劇的に早くなってますね(/･ω･)/

~~このプログラムだけで言うとだいたい15-18倍くらいの速度になってます。~~
~~まぁ◯倍という数値はこれだけの検証だとアテになりませんが、~~
私の環境だと異常に遅いようなので、数値は全くアテにならないと思われます。
とりあえず早くなっているというのは明らかですね！

PHP7を取り入れるには色々と弊害がありそうですが、これだけパフォーマンスが良くなるのなら取り入れる価値はありですね。
c++ builder XE4, 10.2 Tokyo > 他のアプリを開く > access violationが出た > ZeroMemory()したら回避できた

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

### 注意
(追記 2018/11/14)

**以下で使用しているZeroMemoryは最適化で吹き飛ぶため、SecureZeroMemory()の使用が推奨されます。**

- [C++ > SecureZeroMemory() > 最適化で吹き飛ぶ ZeroMemory() の代替](https://qiita.com/7of9/items/53fcfc1124b38cde9da1)


### 内容

http://qiita.com/7of9/items/e95f72ce80a8807018fb
で作成したアプリをchildProject.exeという名前に変更して、それを別アプリから開く。


他のアプリを起動する

# XE4

## try1 > access violation

```Unit1.cpp
void __fastcall TParentForm::App_openOther()
{
	String param = L"/caption=Test_1_B_C";

	String progname = L"childProject.exe";
	if (FileExists(progname) == false) {
		ShowMessage(L"childProejct.exe not found");
		return;
	}

	TShellExecuteInfo sinfo;
	sinfo.cbSize = sizeof(sinfo);
	sinfo.hwnd = 0; // Desktop
	sinfo.fMask = SEE_MASK_FLAG_DDEWAIT;
	sinfo.lpFile = progname.c_str();
	sinfo.lpParameters = param.c_str();
	sinfo.lpVerb = L"";
	sinfo.nShow = SW_SHOWNORMAL;

	ShellExecuteEx(&sinfo);

	// 起動待ち
	WaitForInputIdle(sinfo.hProcess, INFINITE);
}
void __fastcall TParentForm::Button1Click(TObject *Sender)
{
	App_openOther();
}
//---------------------------------------------------------------------------
```

ShellExecuteEx(&sinfo);
実行直後に以下のエラーが出ている。調査中。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/232272fd-285b-6060-d64b-d9c9a3c5c5fd.png)


## try2 > no error

http://www.usefullcode.net/2006/12/post_34.html
が参考になった。 

```Unit.cpp
__fastcall TParentForm::TParentForm(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TParentForm::App_openOther()
{
	String param = L"/caption=Test_1_B_C";

	String progname = L"childProject.exe";
	if (FileExists(progname) == false) {
		ShowMessage(L"childProejct.exe not found");
		return;
	}

	TShellExecuteInfo sinfo;

#if 1
	::ZeroMemory(&sinfo,sizeof(SHELLEXECUTEINFO));
#endif
	sinfo.cbSize = sizeof(sinfo);
	sinfo.hwnd = 0; // Desktop
	sinfo.fMask = SEE_MASK_FLAG_DDEWAIT;
	sinfo.lpFile = progname.c_str();
	sinfo.lpParameters = param.c_str();
	sinfo.lpVerb = L"";
	sinfo.nShow = SW_SHOWNORMAL;

	ShellExecuteEx(&sinfo);

	// 起動待ち
	WaitForInputIdle(sinfo.hProcess, INFINITE);
}
void __fastcall TParentForm::Button1Click(TObject *Sender)
{
	App_openOther();
}
//---------------------------------------------------------------------------
```

`#if 1`で囲った部分があると上記のエラーがでない。

sinfoのメンバ変数に未初期化の値が入っていることによりエラーとなっていたようだ。


# 10.2 Tokyo

10.2 Tokyoの場合、try1でもaccess violationにはならなかった。

念のためにはtry2の方法にしておくのが良いだろう。
「「「FMC2Goスケジューラーにおけるスケジュールの自動アップデート機能」のつづき」のつづき」のつづき


[FileMaker Advent Calendar 2015](http://www.adventar.org/calendars/865)の19日目

# 「「「FMC2Goスケジューラーにおけるスケジュールの自動アップデート機能」のつづき」のつづき」のつづき

だんだんタイトルが長くなってきている気がしないでもありませんが、このパートは今回で一段落です

## どうやってセッションのデータが更新されるか実際に見てみる
どうやってセッションのデータが更新されるか実際に見てみる

レコードのインポート(一致するレコードを更新)で処理しているようです
詳しくは
[ホーム > データの共有 > データの保存、インポート、およびエクスポート > FileMaker Pro へのデータのインポート](http://www.filemaker.com/help/12/fmp/jp/html/import_export.17.10.html)
を参照

> 既存の FileMaker Pro ファイルへデータをインポートすると、次の処理を実行することができます。
> - インポート元のファイル（ソースファイル）から新しいレコードを追加する
> - インポート元のファイルの情報でレコードを更新する
> - インポート元のファイルの情報で一致するレコードを更新する

### このブロックでは

![151219-03.png](https://qiita-image-store.s3.amazonaws.com/0/89027/1dd5b1b0-4369-e0d1-bd5f-4f5e3994179f.png)

0. セッション情報のインポート用のレイアウトに切り替え
0. レコードのインポート(一致するレコードを更新)
0. Get( 最終エラー )でエラーが検出されたらローカル変数「$err_msg」にエラーメッセージを設定

### こういう紐付けでインポート
![151219-01.png](https://qiita-image-store.s3.amazonaws.com/0/89027/4039b668-6d1c-cfc1-ecdd-aabea8f552fe.png)

### ここからがキモ

「対象外のみ表示」スクリプトステップを実行することで、今回のアップデートに含まれていなかった「```__kp_Schedule_ID```(アップデートファイル側では：```__kp_Session_ID```)」をキーに持つセッションが対象レコードとして取得できます

その対象レコードを「対象レコード削除」とすることで古い(更新されなかった)「Schedule」テーブルのレコードを一括で削除しています

これは「一致するレコードを更新」した時に、インポートされたレコード(更新対象になったレコード)が対象レコードになるFileMakerの仕組みを上手く使っているようです
情報に更新があっても、なくてもオンステージにあるレコードをアップデートに全て含めることで、今回のアップデートに含まれなかったレコード＝消してしまいたいレコード(＝なんらかの事情でなくなったセッション)と扱っているようです
片方向のレコード同期のソリューションとしては一番単純かつ確実な方法かなと

おなじような仕組みで「Speaker」と「SessionSpeaker」と「Vendors」の内容を更新しているようです

そして最後まで「$err_msg」に値が入らなければ更新がエラー無く終わったとしているようです

### よくわからなかった処理
よくわからない処理だったこのブロック
![151219-07.png](https://qiita-image-store.s3.amazonaws.com/0/89027/81bb06f4-e7f9-5351-4e6d-c86b942c7c82.png)
「Speaker_Photo_FullSize」を「zz_Photo_Import_Staging」で
「Speaker_Company_Logo」を「zz_Logo_Import_Staging」で
差し替えるような処理をしているようだ
しかしインポートの紐付けを見てみると「zz_Photo_Import_Staging」、「zz_Logo_Import_Staging」ともにインポート対象になっていない
なにか裏ワザ的なものが仕込まれているのだろうか？
今回はインポート対象となっていないので、「not IsEmpty」の条件では処理対象にならないようだ

### Speakerのインポート紐付け
ちなみにSpeakerのインポート紐付けはこんな感じ
![151219-02.png](https://qiita-image-store.s3.amazonaws.com/0/89027/6e1b65ca-1c2c-487c-c0ad-c6a0ce7b3b9a.png)

今回で「FMC2Goスケジューラーにおけるスケジュールの自動アップデート機能」関連は終わり
明日はまた別のことを取り上げます
ブラウザで巡回しながら、特定の条件にマッチする URL の場合にダウンロード

## はじめに

この記事は クローラー／Webスクレイピング Advent Calendar 2015 の 19日目です。

今回はブラウザを使っていろいろページを巡回しながら、特定の正規表現にマッチする URL の場合にだけダウンロードを行うようなスクリプトの書き方を紹介します。

使うのは [`mitmproxy`](https://mitmproxy.org/) です。

## `mitmproxy` とは

`mitmproxy` とは Man In The Middle Proxy を表しています。
その名の通りブラウザとサーバの間にプロキシとして動作します。
ただし、単なるプロキシではなく、リクエストやレスポンスを検知して自動的な処理を実施したり、あるルールでリクエストやレスポンスの文字列を書きかえることも可能です。
`mitmproxy` は `Python` で書かれているので、その上での処理も `Python` で記述する必要があります。

## 今回の記事でやりたいこと

この記事では下記の前提で自動的にコンテンツをダウンロードすることが目的です。

* ダウンロードしたいコンテンツはブラウザを直接操作して選択、アクセスする
  * 逆にいうと、特定のリンクすべてとかではない。そうしちゃうと対象として多すぎる。
  * もしくはダウンロードしたいリンクの一覧を作成するのがカンタンではない。
  * たとえばログインが必要なサイトで、ログイン処理の記述などすべて自動化するのは面倒
* 一回一回、ブラウザの機能でファイルとして保存するには多すぎる。
* ファイル名の命名など、特定のルールで採番して、保存したい。
    * 手でやるには面倒
* ダウンロード自体には wget を使う

## 作成したスクリプト

上記の目的で作成したのが次のスクリプトです。

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

import urllib
import urlparse
import re
import sys
import datetime
import subprocess

def request(context, flow):
  request = flow.request
  if ".pdf" in request.path:
    cmdline = "wget"
    for k, v in request.headers.items():
      if k == "User-Agent":
        cmdline = cmdline + ( " --user-agent=\"%s\"" % ( v ) )
      elif k == "Referer":
        cmdline = cmdline + ( " --referer=\"%s\"" % ( v ) )
      elif k == "Host":
        pass
      elif k == "Proxy-Connection":
        pass
      elif k == "Accept-Encoding":
        pass
      else:
        cmdline = cmdline + ( " --header \"%s: %s\"" % ( k, v.replace(":", " ")))
    url = request.url
    cmdline = cmdline + " \"" + url + "\""
    now = datetime.datetime.strftime(datetime.datetime.now(), '%Y%m%d%H%M%S')
    filename = now + "-" + os.path.basename(request.path)
    cmdline = cmdline + " -O " + filename
    cmdline = "( cd ~/pdf; " + cmdline + ")"
    subprocess.call(cmdline)
```

上記のスクリプトを mitmproxy を使って下記のように実行します。

```
$ mitmproxy -s download.py
```

すると、`mitmproxy` が 8080番ポートで HTTPプロキシとしての動作を開始します。

その後、手元のブラウザのプロキシの設定を localhost:8080 に変更すると、その後は自動的に `mitmproxy` 経由でアクセスが行われるようになります。

上記のスクリプトを動作させているので、`.pdf` を含むパスにアクセスしたときは `wget` を使ってダウンロードが行われます。

## 解説

上記のスクリプトでは、下記のことが実現できています。

* 実際のブラウザのユーザエージェントやリファラなどの HTTP リクエストヘッダを使って、ダウンロード処理を実施。
    * ブラウザ側でログイン済みのクッキー情報がそのまま利用できている
    * スクリプト上でログイン処理などを手で実装する必要がない
* 本当にやりたいダウンロード処理に関する記述だけで OK
* ファイル名で並び替えたときもダウンロードした順に並べたかったので、ダウンロードタイミングをファイル名の先頭につける

## 補足
`wget` のコマンドラインオプションや HTTP リクエストヘッダに関する処理についてはほかの文献で調べてほしいですが、一点だけ `Accept-Encoding` についてだけ解説しておきます。
この `Accept-Encoding` をスキップさせる処理を記述しない場合、せっかくダウンロードしたコンテンツが gzip で圧縮された状態で、もうひと手間加えないと使える状態にならず、軽くハマってしまいました。このヘッダは通信量を減らすためにどのような圧縮を行うかを指定するものだからです。

`Accept-Encoding` ヘッダはスキップさせることによって、非圧縮のファイルが保存されるようになるのでその手間を減らすことができます。
skitch > win版はサポート終了 / Mac版は引き続きサポート対象

Evernote、「Skitch」「Clearly」の開発終了を発表し、非難轟々
http://gori.me/apps/iphone-app-news/82930

>2016年1月22日でサービスが終了するアプリ・サービスは以下の通り。アップデートは打ち切られ、新規ダウンロードも不可になる。
>
...


Evernoteでの発表
https://blog.evernote.com/jp/2015/12/18/51195
> Skitch for Windows・Windows Touch・iOS・Android
（注: Skitch for Mac は引き続きサポート対象となり、ご利用可能です。）
...

SkitchをMacとWindowsで使っているので今後の対処を考えないといけない。

Mac版は「引き続きサポート対象」と記載があるが、一旦こういうことになるといつ打ち切られるか不透明なので、継続利用をする気がなくなる。

実際に使えなくなってから考えるのでもいいが、代替案は見つけておくのがいいかもしれない。

MacとWinで別ソフトを使うのでもいいが、同じUIのソフトの方がいいと思って使ってきた。
UbuntuにMosquittoをインストールしてMQTTブローカーを構築

Ubuntu 14.04上でMosquittoをインストールしてMQTTブローカー（サーバ）を自前で構築してみます。 

**Mosquitto**
http://mosquitto.org/

#パッケージリストにリポジトリを追加
```
kyoro@iot:~$ sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa
[sudo] password for kyoro:

More info: https://launchpad.net/~mosquitto-dev/+archive/ubuntu/mosquitto-ppa
Press [ENTER] to continue or ctrl-c to cancel adding it

gpg: keyring `/tmp/tmpmtjlhsxh/secring.gpg' created
gpg: keyring `/tmp/tmpmtjlhsxh/pubring.gpg' created
gpg: requesting key 262C4500 from hkp server keyserver.ubuntu.com
gpg: /tmp/tmpmtjlhsxh/trustdb.gpg: trustdb created
gpg: key 262C4500: public key "Launchpad mosquitto" imported
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)
OK
```


#パッケージリストの更新

```
kyoro@iot:~$ sudo apt-get update
```

#クライアントの導入

```
sudo apt-get install mosquitto-clients
```

#ブローカー（サーバ）の導入
```
sudo apt-get install mosquitto
```

Mosquitto導入完了！

#接続テスト

##クライアントでtestを購読

```
kyoro@iot:~$ mosquitto_sub -d -t test
Client mosqsub/12779-iot sending CONNECT
Client mosqsub/12779-iot received CONNACK
Client mosqsub/12779-iot sending SUBSCRIBE (Mid: 1, Topic: test, QoS: 0)
Client mosqsub/12779-iot received SUBACK
Subscribed (mid: 1): 0
```

##ターミナルを別に開いてメッセージをpublish

```
kyoro@iot:~$ mosquitto_pub -d -t test -m "Hello world!"
Client mosqpub/12852-iot sending CONNECT
Client mosqpub/12852-iot received CONNACK
Client mosqpub/12852-iot sending PUBLISH (d0, q0, r0, m1, 'test', ... (12 bytes))
Client mosqpub/12852-iot sending DISCONNECT
```

##クライアント側で受信されます

```
Client mosqsub/12779-iot received PUBLISH (d0, q0, r0, m0, 'test', ... (12 bytes))
Hello world!
```

これでMQTTブローカーの出来上がりです！
再起動時にもサービスが自動で立ち上がるようになっているので、`service`コマンドでよしなに運用してください。
c++ builder XE4, 10.2 Tokyo > キャプションに複数文字列のsuffixを追加する

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

アプリのキャプションに複数文字列のsuffixを追加したい。

例として"Test 1 B C"という文字列を追加したい。

実行時引数を使う。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	String mark = L"/caption=";

	for (int i=1; i<=ParamCount(); i++) {
		if (LowerCase(ParamStr(i)).Pos(mark) > 0) {
			String suffix = ParamStr(i).Delete(1,mark.Length());  // e.g. "/caption=Test_1_B_C"

			// 複数個の文字列を受けるためにいったん"_"付きで受けたものを"_"を消して使う
			suffix = StringReplace(suffix, L"_", L" ", TReplaceFlags()<<rfReplaceAll);

			String caption = L"Mysoftware";
			caption = caption + L" / " + suffix;
			this->Caption = caption;
		}
	}
}
//---------------------------------------------------------------------------
```

結果
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c366cf75-b074-59f9-abcf-841a51deb2e9.png)
【便利プラグイン紹介】CSScombでCSSを綺麗にする計画

![151208_1.png](https://qiita-image-store.s3.amazonaws.com/0/100295/698bdf3a-8ada-7c8b-a8c6-9605d19bc2fc.png)
どうも、牛丼デザイナーのぽてこです。
今回はアドベントカレンダーの19日目を担当させていただきます。
8日目を見てくださった方々、ありがとうございます。
基本的なことに関しては[前回の記事](http://qiita.com/poteko/items/034587d39b9a55122adf)に書かれているのでそちらを見てみてくだされば嬉しいです。

というわけで、本日は最近のぽてこのお気に入りプラグインの簡単なご紹介をさせていただきます。

#そもそもCSScombとはなんぞ？
CSSを記述するとき、プロパティの順番に気を使うコーダーは多いと思います。
ぽてこは、プロパティの順番が決まってたり決まってなかったりします。

案件ごとにプロパティの順番が決まっていることもしばしばなので、それぞれ覚えてしまうよりも自動でやってしまいたい……
ということで、このCSScombがとても便利！
ぺっとするだけでプロパティの順番を好きな順番に変えてくれます。

ブラウザからも使用することができるのですが、ショートカット１つで使えるのと、お気に入りのエディターで使えるというのはメリットになりますよね。
SublimeText2意外にも使えるエディターがあるので、気になる方は調べてみてね。

#CSScombのプラグインをインストールしてみましょう
![151219_1.png](https://qiita-image-store.s3.amazonaws.com/0/100295/dccfabc5-8ecd-502a-49dd-4c7c304660db.png)

では、実際に動かしてみましょう！

前回の記事でも取り上げていたPakege Controlを開くためのコマンドパレットを立ち上げましょう。
ショートカットは shift＋commanda＋p です。

PackageControlを開いって、入力画面にinstallと入力するとプラグインのインストールをする準備は完了するので早速インストールしましょう。
入力画面で「CSScomb」と入力すると、該当するプラグインが候補に出てきますのでカーソルを合わせて、エンターキーをッターンしましょう。

#実際に使ってみ……ちょ、あれ？
さて、実際に使ってみましょう！
適当にぐちゃぐちゃなプロパティ順番のCSSを書いて、ctrl shift c を押してみましょう！

わー！！すげぇ！！面倒くさがりやでも面倒くねぇやー！！

……となればいいのですが。
ならない場合もあるそうで。

#CSScombが動かない時の対処法
Windowsをお使いの方で、PHPをインストールしていない場合だと動かないことがあるそうです。

この場合はPHPのインストールを行ってください。
参考URL:[PHPインストールと初期設定(Windows)](http://www.phpbook.jp/install/)

これに関しては先輩方が詳しいはずなので先輩に……と言いたいところですが、社内のLinux講座で習ったような記憶があるので記憶が正しければ今度記事にしてみようかなと思います（この言葉を打つ手が震えているのは内緒）

#ちょっとしたデメリットも。
このCSScombですが、デメリットももちろんあります。
大きなデメリットは１つだけですが、プロパティの順番は最初に設定されているプロパティの中でしか順番変更できないのです。

なので、順番の設定を変更するときには設定変更画面にずらずらーっとあるプロパティを手動で（もしくはショートカットで）動かしていくしかないのです……。

順番変更が辛いですね。はい。

これ、いい感じのやり方ご存知の方がいたらご教授ください。

#おわりに。
さらっとCSScombのご紹介でした。
こんなプラグインもあるんだーくらいのノリで見ていただければ嬉しいです。

ちなみに、今回ですね、SublimeText擬人化してやるーーーーーーーーとか言ってたのですがね、もうね、それはね、年明けにやりましょう。
どうせやるなら気合い入れて擬人化したいなぁ。。。なんならSublimeちゃんのアプリとか作ってもらえたり…しないよなぁ。
技術英語 > 「I believe we should go this way, Commander.」「What makes you say that?」/ What brought you here?

@ Star Trek Voyager > TWISTED

道に迷っているTuvokとChakotay.

Tuvok
> I believe we should go this way, Commander.

Chakotay
> <font color=red>What makes you say that?</font>

<hr>
関連して思い出したのは

<font color=red>What brought you here?</font>
Windowsの分散オブジェクト技術とは

[Windows & Microsoft技術 基礎](http://qiita.com/advent-calendar/2015/ms)18日目です。

落としました。申し訳ありません。年内には何とか。。。 :cold_sweat: 

以下のような内容でまとめようと思っております。

# 分散処理おさらい

## 参考文献

[分散システム―原理とパラダイム 第二版](http://www.amazon.co.jp/dp/4894714981)

# オブジェクト指向・コンポーネントベース

# DCOM

## COMとは

## DCOMとは

## DCOMを保管する技術

## 参考文献

[まるごと図解 最新マイクロソフトテクノロジーがわかる](http://www.amazon.co.jp/dp/4774109495/)

# WCF

# .NET Framework

## SOAP

## ASMX

## Remoting

## 大統一理論としてのWCF

# まとめ
C++ でも PHP のヒアドキュメント的なことができる (raw string literal)

# 概要

PHP の `''` や C# の `@""`, python の `r""` のような、エスケープ記号を省略する文字列定数の書き方は便利ですね。
C++ でも C++11 から文字列定数の仕様が追加されエスケープ記号を省略する書き方ができるようになっていました。 raw string literal と呼ぶようです。

下記リンクの (6) に当たります。
http://en.cppreference.com/w/cpp/language/string_literal

この使い方について解説します。

# 基本

最もミニマムな書式は

```cpp
const char str[] = R"([ここに文字列定数])";
```

です。先頭のダブルクォートの前に `'R'` をつけ、文字列定数の前後を `'('` と `')'` で囲みます。
例えば Windows のパス文字列 `C:\path\to\folder\file.txt` のようなものを const char に代入したいと思ったとき、従来は

```
const char str[] = "C:\\path\\to\\folder\\file.txt";
```
と書いていたのを、

```
const char str[] = R"(C:\path\to\folder\file.txt)";
```
のように代入できます。

文字列定数の中ではダブルクォート `'"'` もエスケープなしで使用できます。

```cpp
#include <iostream>

int main(void){
    std::cout << R"("Hello, World")" << std::endl;
}
```

```:出力
"Hello, World"
```

便利ですねー。

# 特別な場合

上記の仕様だけでほとんどの場合問題ありませんが、以下のような場合には困ります。

```cpp
#include <iostream>

int main(void){
    // コンパイルエラー！
    std::cout << R"("Hello, World(1)")" << std::endl;
}
```

この例では、 `"Hello, World(1` までが raw string literal と解釈されてしまうためコンパイルエラーとなります。文字列定数中に `)"` を含んでいてはいけないわけです。
しかしこのようなケースに対処する仕様がしっかり用意されています。

```cpp
#include <iostream>

int main(void){
    // OK！
    std::cout << R"#("Hello, World(1)")#" << std::endl;
}
```

のように、 `R"` と `(` の間に任意の文字列(*)を付け足して開始・終了パターンを変更することができます。

(*) `(`, `)`, `\`, ` ` を除いた英数字。最大 16 字まで

# 他の書式との組み合わせ

raw string literal は他の文字列定数書式と組み合わせることができます。

- `R("...")` で `const char[ ]`.
- `LR("...)"` で `const wchar_t[ ]`.
- `u8R("...)"` で `const char[ ]` (UTF-8).
- `uR("...)"` で `const char16_t[ ]` (UTF-16).
- `UR("...)"` で `const char32_t[ ]` (UTF-32).

下例では UTF-8 形式の文字列定数をコンソール出力しています。

```cpp:main.cpp
#include <iostream>
using namespace std;

int main(void){
    
    cout << u8R"##(<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>Hello</title>
    </head>
    <body>
        Hello, World!!!
    </body>
</html>
)##";
}
```

```:出力
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>Hello</title>
    </head>
    <body>
        Hello, World!!!
    </body>
</html>
```
2つの座標から角度や距離を求める

# はじめに

この記事は、岩手県立大学アドベントカレンダー2015 19日目の記事です。

今回は、平面上に2つの座標を与えられたときの2つの座標からなる角度や距離を求めます。
Swiftでの記述例を示しますが、他のプログラミング言語でも同様の方法で求めることができます。
以下の画像を参考にします。

![平面座標](https://qiita-image-store.s3.amazonaws.com/0/3862/2a2aef71-9b0b-807a-29a9-7ac498264dfd.jpeg)

# 角度を求める

原点O(0, 0)と点(5, 5)からなる角度は45度です。
逆正弦atan2（アークタンジェント2）を使います。
atan2は点(x, y)とx軸によって表されるベクトルの角度(θ)を返します。
よって位置から角度を求めることができます。

```swift:sample1.swift
struct Point {
    var x:Double = 0
    var y:Double = 0
}

func angle(a:Point, b:Point) -> Double {
    var r = atan2(b.y - a.y, b.x - a.x)
    if r < 0 {
        r = r + 2 * M_PI
    }
    return floor(r * 360 / (2 * M_PI))
}

print(angle(Point(x: 0, y: 0), b: Point(x: 5, y: 5))) // 45.0
print(angle(Point(x: 0, y: 0), b: Point(x: 0, y: 10))) // 90.0
print(angle(Point(x: 0, y: 0), b: Point(x: -10, y: -10))) // 225.0
```

# 距離を求める

距離は三平方の定理で求めることができます。
原点O(0, 0)と点(0, 10)の距離は10です。
原点O(0, 0)と点(5, 5)の距離は

```math
1:1:\sqrt{2}
```

の三角形より5*1.4142=7.07106781187となります。

```swift:sample2.swift
struct Point {
    var x:Double = 0
    var y:Double = 0
}

func distance(a:Point, b:Point) -> Double {
    return sqrt(pow(b.x - a.x, 2) + pow(b.y - a.y, 2))
}

print(distance(Point(x: 0, y: 0), b: Point(x: 5, y: 5))) // 7.071
print(distance(Point(x: 0, y: 0), b: Point(x: 0, y: 10))) // 10.0
print(distance(Point(x: 0, y: 0), b: Point(x: -10, y: -10))) // 14.142
```

# 方向を求める

始点と終点の座標から方向を求めます。
方向は下記の図のように8種類あるものとして、その番号を返します。
スワイプの方向を求めることができます。

![方向](https://qiita-image-store.s3.amazonaws.com/0/3862/4f6e620c-55f2-b396-6944-4819c894e6e7.jpeg)

```swift:sample3.swift
struct Point {
    var x:Double = 0
    var y:Double = 0
}

func direction(angle: Double) -> Int {
    if(23 <= angle && angle <= 67) {
        return 7;
    }else if(68 <= angle && angle <= 112) {
        return 6;
    }else if(113 <= angle && angle <= 157) {
        return 5;
    }else if(158 <= angle && angle <= 202) {
        return 4;
    }else if(203 <= angle && angle <= 247) {
        return 3;
    }else if(248 <= angle && angle <= 292) {
        return 2;
    }else if(293 <= angle && angle <= 337) {
        return 1;
    }else {
        return 0;
    }
}

print(direction(angle(Point(x: 0, y: 0), b: Point(x: 5, y: 5)))) // 7
print(direction(angle(Point(x: 0, y: 0), b: Point(x: 0, y: 10)))) // 6
print(direction(angle(Point(x: 0, y: 0), b: Point(x: -10, y: -10)))) // 3
```

# おわりに

明日は20日目 @yuzumone さんです。
ArchLinuxでRails+Unicorn+H2O HTTP server試してみた

H2OというHTTPサーバがあると聞いたので試してみた

次の開発で使えるよう備忘録としてのメモ

# インストール

[公式のインストールマニュアル](https://h2o.examp1e.net/install.html)
によるとPackageとSourceのどちらからでもインストールできるらしい
今回はPackageからインストールを選択

```
yaourt -S h2o
```

少し時間がかかってインストール完了

# テスト用Railsアプリケーション

とりあえずUnicornで動くRailsアプリを作る

```
rails new h2o_sample
```

Unicornのインストールと設定は
[Rails 4.2 + Unicorn + Nginx でアプリケーションサーバの構築](http://qiita.com/Salinger/items/5350b23f8b4e0dcdbe23)
こちらの記事の通りに設定

Unicornは起動しておく

# H2Oの設定

H2Oサーバの設定ファイルを作成

Railsプロジェクトルート/config/h2o.conf

```h2o.conf
listen: 80

hosts:
  "127.0.0.1.xip.io":
    paths:
      /:
        proxy.reverse.url: http://[unix:/tmp/unicorn.sock]/
    access-log: /dev/stdout
```

`/tmp/unicorn.sock`はUnicornのlisten設定に従う

これをsudoで実行する(ポートを80にしてるから)

```
sudo h2o -c config/h2o.conf
```

http://localhost/
にアクセスするとRailsの初期ページが表示される

意外と設定が楽だった
Ruby 3.0に備え、文字列の凍結／解凍方法を確認する

Ruby 3.0 から文字列リテラルがデフォルトで immutable (frozen) になるかもしれないと知り、気になったので、文字列の凍結／解凍について確認してみた。

# 文字列の凍結

Ruby では、Object#freeze でオブジェクトを凍結（内容の変更を禁止）できる。

String は Object を継承しているので、String#freeze で凍結できる。

```ruby
s = 'hoge'
s.frozen?    # => false
s.freeze
s.frozen?    # => true
s << 'fuga'  # => RuntimeError: can't modify frozen String
```

# 文字列の解凍（Ruby 2.2以前）

凍結されたオブジェクトは解凍（内容の変更を再許可）できない。凍結状態を含め、変更を禁ずるのが「凍結」だからである。

そのかわり、Object#dup で、凍結されたオブジェクトとほぼ同じ内容の非凍結オブジェクトが得られる。

前述の通り、String は Object を継承しているので、String#dup で非凍結文字列が得られる。

```ruby
s = 'hoge'
s.freeze
s2 = s.dup  # => "hoge"
s2.frozen?  # => false
```

また、String.new(frozen_string) でも、frozen_string とほぼ同じ内容の非凍結文字列が得られる。

```ruby
s = 'hoge'
s.freeze
s2 = String.new(s)  # => "hoge"
s2.frozen?          # => false
```

ただ、これらのメソッドは、「非」凍結文字列のコピーが欲しいときにも使われるため、解凍を意図していることがコード上からは分かりづらい。

# 文字列の解凍（Ruby 2.3以降）

Ruby 2.3 で、String#+@ が導入された。インスタンスが凍結されている場合は同内容の非凍結文字列が得られ、凍結されていない場合はインスタンス自身が得られる。

```ruby
s = 'hoge'
s.freeze
s2 = +s     # => "hoge"
s2.frozen?  # => false
```

対称的な挙動の String#-@ も用意されている。

```ruby
s = 'hoge'
s.frozen?   # => false
s2 = -s     # => "hoge"
s2.frozen?  # => true
```

これらのメソッドは意図が明確なので、コード読解の障害にならないだろう。

一見、どちらが凍結でどちらが解凍か忘れてしまいそうだが、「オブジェクトの温度が低く（-）なれば凍結され、高く（+）なれば解凍される」と考えれば覚えやすい。
drone.ioでマトリクス・ビルドを試してみた

[以前の投稿](http://qiita.com/letusfly85/items/d373e60f5eb22d045661)で、[drone.io](https://github.com/drone/drone)の最新版をビルドして環境構築をしました。

今回は、**Matrix Build**というビルド方法を使ってみました。

# 1. やりたいこと

**複数の言語のバージョン**と、**複数のDBのバージョン**で動作することを期待されるようなライブラリのテストについて効率的な実施を目的とします

# 2. drone.ioのマトリクスビルドについて調べてみた

[マトリクス・ビルドについてのドキュメント](http://readme.drone.io/usage/matrix/)を参照しました。

下記のようなことが記載されています。

```
Droneは、drone.ymlで、.「マトリクス」というセクションを定義することができます。
Droneは、１コミットに対して、「マトリックス」セクションで定義された、
すべての組み合わせのビルドとテストを実行します。
```

なるほどー、と思いつつ、具体的なサンプルを少しだけ修正して、眺めてみました。

```yaml:.drone.yml
build:
  image: golang:$$GO_VERSION
  commands:
    - go  run hello.go

compose:
  redis:
    image: redis:$$REDIS_VERSION

matrix:
  GO_VERSION:
    - 1.4
    - 1.5
  REDIS_VERSION:
    - 2.8
    - 3.0
```

`image: golang:$$GO_VERSION`と、`image: redis:$$REDIS_VERSION`のように、dockerで利用するコンテナのバージョンが変数指定されています。

変数の組み合わせを`matrix`セクションで定義されていて、それぞれ、

* GO_VERSION -> 1.4と1.5
* REDIS_VERSION -> 2.8と3.0

とあるので、考えられる組み合わせは、２×２の４通りになります。

```properties
(GO_VERSION, REDIS_VERSION) = (1.4, 2.8), (1.4, 3.0), (1.5, 2.8), (1.5, 3.0)
```

# 3. 動かしてみた

`test-pj`というgitリポジトリを、OSSの[GitLab](https://gitlab.com/)を利用して、作成して、リポジトリに`.drone.yml`を追加して、`git push`をしました。

すると、下記のように、テストが左側のタブに組み合わせが表示されつつ、直列に実行されることを確認できました。

![matrix_build.png](https://qiita-image-store.s3.amazonaws.com/0/49547/b3592999-2bc8-59f4-96ca-8ada65abcef0.png)


これは便利ですね！

また、特定の組み合わせでビルドが成功したときだけ、デプロイする、のような戦略もとれるようです。

```yaml:.drone.yml
deploy:
  heroku:
    app: foo
    when:
      matrix:
        GO_VERSION: 1.4
        REDIS_VERSION: 3.0
```

# 4. 今後調べたいこと

* matrixの組み合わせ上限とかってあるのか確認。動かすのとソースを読むの両方やってみようと思います。gitterで質問してもいいかもしれないです
* matrixビルドを、並列に実施するような仕組みはすでに実装されているか確認します

---


drone.ioは、今後もがんがんと進化していきそうで楽しみだな、と思う機能でした。

本日はここまでとなります。
パスワードを指定してmysqlコマンドを実行すると表示されるワーニングを回避

mysqlコマンドを実行するときに-pでパスワードを付けると下記のワーニングが表示されてしまいます。

>Warning: Using a password on the command line interface can be insecure.

例えばユーザ名がrootでパスワードがmysqlの場合、下記のコマンドを実行すると表示されます。

```
mysql -uroot -pmysql
```

ワーニングを表示しなくするには、ユーザとパスワードを設定ファイルに書いて、mysqlコマンドのオプションに設定ファイルを指定するようにすると出なくなります。
名前はなんでもいいんですが、今回はmy.confという名前でファイルを作成します。

```
[client]
user = root
password = mysql
```

mysqlコマンドに--defaults-extra-fileというオプションがありますので、上記のファイル名を指定します。

```
mysql --defaults-extra-file=./my.conf
```

これでワーニングが出なくなります！
[連載] WebVR入門 vol.4


さて、連載も今回で4回目となりました。
この記事は[WebVR Advent Calendar](http://qiita.com/advent-calendar/2015/webvr)の17日目の記事となります。

-------------------------------------------


## モバイル対応する

今回は、[前回](http://qiita.com/edo_m18/items/0aee765a4e612e7a16af)までに作ったものにモバイル対応を入れたいと思います。

### DeviceOrientationControls.jsを読み込む

Three.jsのexamplesの中にある上記スクリプトを読み込ませます。

↓位置はここ
![cap.png](https://qiita-image-store.s3.amazonaws.com/0/5616/14acede6-4aea-ed61-bb49-a4299fd9a704.png "cap.png")

このスクリプトはスマートフォンのジャイロセンサーを読み取り、その状態をカメラに反映してくれるものです。
そう、VRには欠かせないデバイスの向きをカメラに反映させてくれる素晴らしいスクリプトです。

使い方は以下のようにとても簡単です。

```js
// 初期化
var orientationControls = new THREE.DeviceOrientationControls(camera);

// update
orientationControls.update(); // これはレンダーループなどの中で呼び、毎フレームごとに実行する必要があります。
```

## VREffect.jsに少し手を加える

連載第一回目で `VREffect.js` を使うと手軽にWebVRが扱えることを説明しました。
ただ、スマートフォンだとヘッドマウントディスプレイ（HMD）が扱えないため、画面を分割する前に処理を途中で中断してしまいます。
なので、少しだけ手を加えて画面分割の処理をスマートフォンでも実行してくれるように変更します。

主に手を入れる箇所は次の2箇所です。


```js
this.render = function ( scene, camera ) {

	// if ( vrHMD ) {
	// ...中略...
	// }
}
```

`if (vrHMD) { }` の中で画面分割を行っていますが、ここの処理に入らないため、コメントアウトして実行してもらうようにします。

ただ当然、vrHMDがある想定の処理になっているため、いくつかの値をエミュレートして設定しておく必要があります。
以下の設定がその設定値です。

```js
if ( camera.parent === undefined ) camera.updateMatrixWorld();

// HMDがない場合のエミュレート値
eyeFOVL || (eyeFOVL = {
    downDegrees: 53.04646682739258,
    leftDegrees: 46.63209533691406,
    rightDegrees: 47.52769470214844,
    upDegrees: 53.04646682739258
});
eyeFOVR || (eyeFOVR = {
    downDegrees: 53.04646682739258,  
    leftDegrees: 47.52769470214844,
    rightDegrees: 46.63209533691406,
    upDegrees: 53.04646682739258
});

cameraL.projectionMatrix = fovToProjection( eyeFOVL, true, camera.near, camera.far );
cameraR.projectionMatrix = fovToProjection( eyeFOVR, true, camera.near, camera.far );

camera.matrixWorld.decompose( cameraL.position, cameraL.quaternion, cameraL.scale );
camera.matrixWorld.decompose( cameraR.position, cameraR.quaternion, cameraR.scale );

// HMDがない場合のエミュレート値
eyeTranslationL || (eyeTranslationL = {
    x: -0.03200000151991844,
    y: 0
});
eyeTranslationR || (eyeTranslationR = {
    x: 0.03200000151991844,
    y: 0
});
```

どこに差し込んでいるか分かりやすいように、VREffect.jsで書かれている処理も合わせて載せてあります。


## スマホで実行してみる

以上の修正を行い、これをスマホで実行すると以下のような見栄えになります。

[![cap.png](https://qiita-image-store.s3.amazonaws.com/0/5616/2103dc86-fdf5-d08a-ac72-3a553596649b.png "cap.png")](https://youtu.be/ELisFJeGmv0)


[デモも用意](http://edom18.github.io/webvr-advent-calendar/step3/)してあるので、実機で見てもらうとよりどういうものか分かるかと思います。



## WebVR？

さて、前回に引き続き今回もｗ
色々実装しましたが、これもまたWebVRではありません。
WebVRはあくまでHMDからのデータを取得できるAPIの仕様なので、モバイルには当然HMDは接続していないので、WebVRによるAPIはまったく意味を成しません。

### WebとしてのVR

Webは「いつ誰がどんなデバイスで見るか」分からないコンテンツです。
つまり、VRであったとしてもそれは例外ではなく、モバイルから見られる可能性が高いわけです。
なので、WebVRコンテンツを作ったとしても、Oculus Riftに代表されるデバイスでだけ見れればいい、というものにはならないと思っています。

なので、こうしたモバイル対応を入れておくことで、似た体験をさせることが可能なのもWebVRのメリットだと考えています。

さて、今回は以上です。

あと2回、何書くか・・。
とりあえず次回はWebVR-Boilerplateを使って、今回のモバイル対応をよりよくする方法を紹介したいと思っています。
（ただ、なんかバグあるっぽいんだよな・・Oculus x Firefoxで見ると・・・）