OmniAICreator/Qiita-1.07M huggingface dataset:
極端なProxy環境(パスワード＆Root CA置き替え)でdocker-machineの利用メモ

初めまして、何度もQiitaからの役に立つ記事を得ました。ありがとうございます。自分の経験もシェアさせていただきます。

今回は、掲題のように、極端Proxy下dockerの利用経過を簡単にメモします。
docker-machineはWindows 7で利用しています。

### 1. PROXYパスワード自動入力

まず自作ツール[proxy-login-automator](https://github.com/sjitech/proxy-login-automator)で、偽のローカルProxyサーバを作成し、それを介して実際のProxyサーバとやり取りする。そのうち、自動的にパスワードに入れる感じ。

```
node proxy-login-automator.js \
-local_host "*" \
-local_port 65525 \
-remote_host RealHost \
-remote_port 80 \
-usr ProxyUserIdHerer \
-pwd ProxyPasswordHere \
-as_pac_server true
```

- `-local_host "*"`は重要です。docker-machineのブリッジカード192.168.99.1をLISTENしたいためです。（とにかく、docker-machineからもPCからもアクセスできる共同アドレスであればいい）

- 真のProxyサーバはPAC（プロキシ自動設定）ファイルを提供しているので、偽サーバもas_pac_server trueで同じ機能を提供する。

そして、docker hubのサイトへアクエセウしてみて、先ほどのコマンドの出力には、「新たに、ポートnnnnnで普通のProxy機能を提供する」のような情報を確認して、そのポート番号をメモする。例えば65526。

### 2.docker-machineを作成

ここでproxy情報はhttp\://docker-machinの`ブリッジアダプターIP`:`先ほどメモリしたポート`。

```
docker-machine create -d virtualbox \
--engine-env HTTP_PROXY=http://192.168.99.1:65526 \
--engine-env HTTPS_PROXY=http://192.168.99.1:65526 \
--engine-env NO_PROXY="localhost,127.0.0.1,192.168.99.*" \
--virtualbox-disk-size "100000" \
--virtualbox-cpu-count 2 \
--virtualbox-memory 1500 \
default
```
(docker-machineを再作成したくないですが、ローカルでHTTPS_PROXYなどを設定すればdockerコマンドを利用する試しは失敗)


こうして、docker runは一歩進んだ、ただし、信頼できないコンテンツ、証明証はダメですみたいなエラーが出た。（具体的なメッセージは忘れってしまった）。

あ、これはProxyサーバはSSL通信を監視するために、すべてのWebサーバの証明書を置き替えたから。
普通はProxyサーバの証明書をローカルマシンにROOT信頼機関として導入したので、ブラウザーは問題ない。docker-machine中にも導入必要です。

### 3. docker-machineにProxyサーバの証明書を導入

- ブラウザ(例えばfirefox)のアドレスバー左アイコンからサイトの証明を見れます。その証明書をエクスポートして、形式は「BASE64のCER」で良い。まあ、結果はBASE64テキストBEGIN CERTIFICATE...であればOKです。

- その名前の拡張子をPEMに変更。
    
- docker-machineにコピー

    docker-machine ssh

    ```
    cd /var/lib/boot2docker/
    sudo mkdir certs
    sudo cp /c/Users/Download/THE_PEM_FILE.pem certs/
    ```

- docker-machine restart

これで完了。

2016/09/14追加：
### 4. Docker container中でProxy経由でgitを利用する時の設定

さらに一層設定ですね。
~/.gitconfigに以下を追加
```
[http]
        proxy = http\://192.168.99.1:65526
```
以上です。
Ubuntu 14.04 LTSにNodejs v4.5.0をインストール

備忘録
参考元：http://askubuntu.com/questions/594656/how-to-install-the-latest-versions-of-nodejs-and-npm-for-ubuntu-14-04-lts

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.5 LTS"

// 設定ファイルを含めて削除
$ sudo apt-get purge nodejs npm 
// version 6.xをインストールしたい場合、https://deb.nodesource.com/setup_6.x を指定
$ curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
$ sudo apt-get install nodejs
$ nodejs -v
v4.5.0
$ npm -v
2.15.9
```
手元で取った動画をGIF画像にしてQiitaに貼り付けやすくする

#### このページについて
Macでは、QuickTime Playerで手元の画面の動画が撮れる。
この動画をgifに変換することで、実際のコードの動きなどをQiitaの記事に貼り付け易くなる。
GIF動画に変換する方法について記載する。

---

#### 方法


下記コマンドで行う。
実行にはffmpegとImageMagickのインストールが必要。

```
ffmpeg -i [movie_file_name] -r 50 frames/%03d.png
```

```
convert -delay 2 -layers optimize frames/*.png ./output.gif
```



実際に変換して貼り付けたのがこちら。
![output.gif](https://qiita-image-store.s3.amazonaws.com/0/37053/431f4aba-293f-e382-5588-028969e11591.gif)



参考
http://genjiapp.com/blog/2014/06/04/generating-better-animated-gif-from-mov-recorded-by-quicktime-player.html
http://qiita.com/noir/items/dc7366be57f987c04a20
http://www.yuichon.com/2016/02/ffmpeg-install/
各言語のプロファイラまとめ

|言語|プロファイラ|ビューア|
|:-:|:-:|:-:|
|PHP|Xdebug<br>(zend_extension_ts="/path/to/xdebug.so"<br>xdebug.profiler_enable=1)|Webgrind|
|Perl|NYTProf<br>(perl -d:NYTProf script.pl)<br>(PerlModule Devel::NYTProf::Apache)|nytprofhtml|
|Java|VisualVM(jvisualvm)|VisualVM(jvisualvm)|
|Android|android.os.Debug.startMethodTracing<br>android.os.Debug.stopMethodTracing|AndroidDeviceMonitor|
|C/C++(Unix)|Callgrind(Valgrind)<br>(valgrind --tool=callgrind /path/to/exe [args])|KCachegrind<br>QCachegrind|
Fiddlerで特定ディレクトリー以下の全ファイルをローカルファイルと差し替える

#前置き
デバッグ用Proxyサーバーである『Fiddler』の機能の1つに
条件にマッチしたURLを差し替える『AutoResponder』という機能があり、
差し替えパターンの1つとしてローカルファイルを選択することが出来る。

実はこの機能、正規表現を使うことでかなり柔軟な設定が可能なのだが
ドキュメントに明示されていないためか気付いていない人が結構いるようなので方法を書いておく。

なお、本記事ではFiddlerの導入方法などについては省略する。
今回記事を書くにあたって利用した環境はWindows 10。

#差し替えの有効化
今回は下記ブログ記事の画像を差し替えてみることにする。

![差し替え前](https://qiita-image-store.s3.amazonaws.com/0/139956/d8a60bb3-932e-d8e6-9fb4-51a7ec0ef82a.png)

まずは指定したURLを単にFiddlerで返させる所から。
Fiddlerを起動し、右のタブ一覧から『AutoResponder』を選択し、
右上にある『Enable rules』と『Unmatched requests passthrough』（条件にマッチしなかったURLは無視）をチェックする。

左のリクエスト一覧から差し替えたいものを選択して右中央の領域へドラッグ＆ドロップすることで、
Fiddlerによるレスポンス差し替えが有効となる。
初期状態（*200-SESSION_1）ではサーバーへリクエストする代わりに、
最初のドラッグ元で返していたレスポンス内容がFiddlerから固定で返るようになる。
![fiddler2.png](https://qiita-image-store.s3.amazonaws.com/0/139956/db36ab57-b8cb-ac74-5f62-dc3a8212bde4.png)

#ローカルファイルと1対1で差し替える
次にローカルのファイルと1対1で差し替えてみる。
レスポンス内容を修正するルールを右側から選択した状態で右下のセレクトボックスを選択すると、
マッチしたリクエストに対しFiddlerがどのような応答を返すかを選択することが出来る。
今回は一番下の『Find a file...』を選択し、
開いたファイルダイアログから任意のローカルファイルを選択する。
選択後に右下のSaveボタンを押すことで内容が反映される。
![ローカルファイルの選択](https://qiita-image-store.s3.amazonaws.com/0/139956/d25aed07-ec57-9613-69a4-d5552d12a0a0.png)

ローカルファイルを直接指定した例が以下。
後で正規表現対応するためにファイル名を合わせているが、
単純に1対1で差し替える場合は特に名前を合わせる必要はない。
![ローカルファイルを直接指定した例](https://qiita-image-store.s3.amazonaws.com/0/139956/8e69f3e1-6897-2a68-58a9-f221391ced11.png)

ブラウザーをリロードすることで内容が差し変わったことが確認できる。
![直接指定したファイルで置き換わった例](https://qiita-image-store.s3.amazonaws.com/0/139956/49b8f97a-3d95-f1ff-c602-35aa21200638.png)

#正規表現を利用して特定ディレクトリー下のファイルをまとめて置き換える
いよいよ本題の正規表現を利用する例。
正規表現を用いる場合は条件部の先頭を元の『EXACT』から『REGEX』に変更する。
その上で差し替えたいディレクトリー下を、グループ化の正規表現『(.*)』を利用して下記のように指定する。
マッチしたグループはレスポンス形式選択欄から参照することが可能なので、ファイルパス指定に『$1』を指定する。
内容編集後は反映のため、再度右下のSaveボタンを押す。
![正規表現でディレクトリーを丸ごと置き換える例](https://qiita-image-store.s3.amazonaws.com/0/139956/916cd0d0-684b-5bb4-05af-44321e7e6ea9.png)

ブラウザーをリロードした結果が以下。
2つの画像がそれぞれローカルのファイルと置き換わっている。
![正規表現指定で置き換わった例](https://qiita-image-store.s3.amazonaws.com/0/139956/08e7a7aa-8eae-aed4-9e45-71253756191a.png)

なお、グループ化した部分にスラッシュ記号が含まれた場合も正しくディレクトリー構造として解釈される。
例えばグループ化部分に『foo/bar/baz.jpg』といったURLがマッチした場合は、
$1部分も『foo\bar\baz.jpg』というように展開され、
子ディレクトリーや孫ディレクトリー下に設置したファイルを返すことが出来る。

今回はローカル側のディレクトリー構造をサーバー側と合わせたが、
例えばURLのクエリー部分にファイル名が入るようなケースなど、
応用次第で動的なURLに対して柔軟に置き換え対象を指定することが出来る。

なお、URLを正規表現として解釈する際、『/』など大半の記号については特に気にかける必要がないが、
クエリー部開始を表す文字である『?』が正規表現の『0回か1回登場』と解釈されてしまう点は見逃しがちなので、
バックスラッシュでエスケープするのを忘れないよう注意が必要。

#参考
Autoresponder Reference - Fiddler Documentation
http://docs.telerik.com/fiddler/KnowledgeBase/AutoResponder
tmuxで複数のペインに対して同時にコマンドを実行する


この技を使えば作業効率がN倍になるかもしれない

## デモ
4つのペインに対して同時に`uptime`コマンドを実行する
![https://gyazo.com/85ef1eac196c5c703281595436b0c878](https://i.gyazo.com/85ef1eac196c5c703281595436b0c878.gif)

## コマンド
`Prefix -> :set-window-option synchronize-panes on -> Enter`でこのモードに入ることができる。

同一ウィンドウ内の全てのペインに対して同じコマンドを同時に実行できるので、複数のサーバへのオペレーション等で役に立つ。例えば`yum update`などの時間のかかるコマンドだったり、`top`コマンドで同時に負荷を確認したり。

`Prefix -> :set-window-option synchronize-panes off -> Enter`でこのモードを終了できる（onの部分がoffになっただけ）。
Mavenのresourcesフォルダについて整理してみた

# 動機
今までなんとなくMavenでresourcesフォルダを使ってきましたが、開発時にEclipseから使う場合にどこのファイルが使われるかをちゃんと理解していなかったので、まとめてみます。

# そもそもリソースとは
Javaにおけるリソースとは、プログラム実行する際に必要となる、プログラム本体（classファイル）以外のファイルのことです。よくあるものとしては、設定ファイルや画像ファイル、各種データファイルなどになります。クラスパス上にファイルを配置すれば、getClass().getResourceAsStream("/\<filename\>")でInputStreamを取得できます。

Mavenを使っている場合は、src/main/resourcesとsrc/test/resourcesの２つのリソース用の専用ディレクトリがあるので、そこにリソースファイルは配置します。で、この２つの違いなんですが、mainの方は通常実行時に、testの方はJUnitのテスト実行時に使われる、というざっくりとして説明しかされないことが多いのですが、もう少し詳しく見ていきます。

# Eclipse
EclipseのMavenプロジェクトでは、上記の２つのディレクトリは両方ともソースディレクトリして登録されています。そしてOutputフォルダがtarget/classes、target/test-classesになっており、クラスファイルの出力先と同じになっています。これらのフォルダには実行時にクラスパスが設定されますので、これらのフォルダ内にあるリソースファイルが使われることになります。

ということなので、まず第一のポイントとして、srcフォルダ配下にあるファイルが直接使われることはありません。それではいつtargetフォルダの方にコピーされるのでしょうか？ビルド時でしょうか？そうではなく、Eclipseが更新を認識した際になります。Eclipse上から直接ファイルを作成したり、更新した場合はそのタイミングで、Eclipseの外でファイル操作をした場合は、Eclipse上でsrcフォルダを（F5やメニューから）refreshしたタイミングで、targetの方にコピーが行われます。これを私はよく理解していなくて、最初のうちはtargetフォルダの方を直接編集して、あとからsrcの方に手でコピーするというわけのわからないことをしていました。。。

第二のポイントしては、classes（mainからコピー）とtest-classes（testからコピー）のどちらのファイルが使われるかです。通常実行時は、クラスパスはclassesの方にしか設定されませんので、classes内のファイルが確実に使われます。それに対して、JUnit実行時は両方のフォルダにクラスパスが設定されます。となると、どちらが使われるかは、単純にどちらが先にクラスパスに設定されているか、ということになります。実際にテストクラスからSystem.getProperty("java.class.path")で確認してみると、test-classesが１番目、classesが２番目に設定されていることがわかります。なので、test-classesの方が優先で使われるというわけです。

# Maven
続いてMavenから実行する場合です。標準的な構成ではMavenからプログラムを実行するのは、testフェーズでJUnitを実行する時だけなので、その時どこのファイルが使われるかの話をすると、やはりsrc/main/resourcesとsrc/test/resourcesファルダにあるリソースファイルは、process-resourcesとprocess-test-resourcesフェーズで、各々target/classesとtarget/test-classesファルダにコピーされます。そして、JUnit実行時はクラスパスが両方に通りますが、test-classesの方が先なのでそちらが優先的に使われます。Eclipseでの実行時と同じですね。

あと、Mavenがらみでいうと、最後にpackageフェーズでjarファイルなどを作成する際には、当然target/classesフォルダの方から作られます。
tmuxでペインの幅・高さを等しくする


このTipsを知らずに、今まで手動で幅・高さの調整をしていた...。

## デモ
### ペインの幅を均等にする
![https://gyazo.com/0ea33de97d72e855de840dfe2017878c](https://i.gyazo.com/0ea33de97d72e855de840dfe2017878c.gif)

### ペインの高さを等しくする
![https://gyazo.com/481298b8fd5002e933affd6261dcfde7](https://i.gyazo.com/481298b8fd5002e933affd6261dcfde7.gif)

## 設定ファイル
次の設定を.tmux.confに記述している。

```.tmux.conf
# 幅を等しくする
bind ^h select-layout even-horizontal

# 高さを等しくする
bind ^v select-layout even-vertical
```

`Prefix C-h`で幅を等しくし、`Prefix C-v`で高さを等しくする。
自分はPrefixを`C-t`に設定しているので、`C-t -> C-h`または`C-t -> C-v`になる。
※ デモでは、縦分割は`Prefix |`、横分割は`Prefix "`を使っている
DrupalのDBバックアップ/リストア

忘れがちなのでメモっとく。

#DBサーバーからDBをバックアップする
pg_dump -h 192.168.60.10 -p 5432 -U postgres -C drupaluser > DbBackup20160908.sql

#ローカル環境のDBをバックアップする
pg_dump -U postgres -C DBNAME > DBNAME_local

#XX環境のDBサーバーからDROPする
drop database drupaldb;

#XX環境のDBサーバーへリストアする
psql -U postgres < DbBackup20160908.sql

#画像とか
以下にアップロードファイルなどがアップされるので、
これらもコピーして置いてあげると尚良。
/ext/system_data/drupal_upload_files
脱・C likeなクラス設計 その２

前回：[Strategyパターン](http://qiita.com/_Nanagin/items/0a0745e60c202f02bf15)

# 対象
本ページの対象は、デザインパターンは名前も聞いたこともあるし、
解説ページなんかを読めば、ふむふむなるほど！と思うけど
実際の開発現場に入って、クラス設計してと言われると
なぜかC likeなクラス設計しかできないんです。という方向けです。

意外と気づいていない人も多く
予備軍がいっぱいいると思います。


# C likeなクラス設計とは、
私の造語なのかもしれません。明確に説明が難しいのですが、
　object思考言語で書く意味あるのか？と疑問になるクラス設計
　クラス化する意味がないんじゃない？と疑問になるクラス設計
そんなイメージのクラス設計です。

# デザインパターンを適応するメリットって何？
デザインパターンを適応した場合クラス数が増えます、実装量が増えます。
できれば適応しないに越したことはありません。

でも、実際は適応した方がいい事が多々あります。
それは、仕様変更に対しての保険と考えるといいと思います。

---
確実に怪我や病気(仕様変更)なく老衰(プロジェクトの完了)を
迎えることができるのであれば保険（デザインパターン）は不要です。

---


保険もむやみに入ることは正しいとは言えないのと同じように、
むやみやたらにデザインパターンに当てはめることは
正しいとは言えません。


# 頻出パターン
今回は、業務系開発でよく使うデザインパターンとして、
abstract-factoryについて書いていきたいと思います。

# abstract-factoryとは？
[TECHSCORE(abstract-factory)](http://www.techscore.com/tech/DesignPattern/AbstractFactory.html/)の解説が分かりやすくて好きなので、載せておきます。

# 実務業務
============================================
お客様「前回はXXXXアルゴリズムとYYYYアルゴリズムの切り替えしてくれてありがとう」
お客様「ちょっと申し訳ないんだけど、XXXXアルゴリズム を生成する直前にZZZZアルゴリズムを実行すると」
お客様「処理速度が速くなることがわかったんだ。」
お客様「YYYYアルゴリズムの時はZZZZアルゴリズムは実施しないでくれ」
　私　「了解いたしました。」
　私　「XXXXアルゴリズム生成する場合は、newする前にZZZZアルゴリズムを実行すればいいんだな。」


============================================


# C likeなクラス設計　ダメな設計
ダメなクラス設計(図１)です。

![図１.png](https://qiita-image-store.s3.amazonaws.com/0/98558/75c14cf5-0f9d-a7e7-d52b-78bfdc0a3603.png)

図１


これはmain関数でZZZZアルゴリズムを生成しておいて、
実行アルゴリズムがXXXXだった場合にXXXXをnewする直前で
ZZZZアルゴリズムを実行する気です。


こんなイメージです。


```java:sample
public class main {

    public static void main(String[] args) {
		// ダミーコード
    	if( 実行アルゴリズム == XXXXアルゴリズム )
    	{
    		ZZZZ.XXXXアルゴリズム高速化メソッド()
    		algo = new XXXXアルゴリズム;
    	}else{
    		algo = new YYYYアルゴリズム;
    	}
    	
    	algo.分析実行();
    	algo.分析結果取得();
    }
}
```

これでも問題なく動きます。
動くんですが。。。

せっかくmainは最低限の意識だけと決めて、
生成部分の切り分けのみとしていたのに台無しです



# こんな時は、abstract-factoryパターンを検討しましょう
Factoryクラスを追加しました。
変更箇所はこれだけです。

![zu 3.png](https://qiita-image-store.s3.amazonaws.com/0/98558/8959eb6c-531d-db6f-027f-f89b2b46a4cc.png)


図２

```java:sample
public class main {

    public static void main(String[] args) {
		// ダミーコード
　　　　　factory = new Factoryクラス()
    	if( 実行アルゴリズム == XXXXアルゴリズム )
    	{
    		algo = factory.XXXXアルゴリズム生成;
    	}else{
    		algo = factory.YYYYアルゴリズム生成;
    	}
    	
    	algo.分析実行();
    	algo.分析結果取得();
    }
}
```

mainはアルゴリズムの生成する時のロジックをfactory経由で行うようになりました。
これでmain関数はこれ以上アルゴリズムを意識する必要がありません。

では、ZZZZアルゴリズムはどうなるのかというと、
XXXXアルゴリズム生成の中でZZZZアルゴリズム高速化メソッドを実行後
XXXXアルゴリズムを返却するようになります。


これで、もし、YYYYアルゴリズム用の高速化メソッドが開発された場合も
main関数には一切手を入れる必要がなくなりました。

無事、アルゴリズムを隠蔽しmain関数はアルゴリズムの中身を
意識しなくても良いようになります。


# ポイント
実体を意識させたくない　+　実体生成時やることがバラバラ
こんな時はabstract-factory


# まとめ
- abstract-factoryとStrategyは、実話似ている
- 使用者に実体を意識させないようにする
EclipseでUnhandled event loop exceptionが発生する場合

補足：あくまで実験結果ですので、100%再現されるとは限りません。

原因と対処法が数年に渡って錯綜しているようですが。
Eclipseで、Unhandled event loop exceptionが発生するのを回避する方法の暫定版です。
(org.eclipse.swt.SWTErrorと表示されるのも、おそらく同件。)
エラーに遭遇した事がある方は、(ワークスペース)/.metadata/.logなどを参照で。

[Exceptionが発生しやすい状況]
Project Explorer上で何かをクリックした後に、コードエディタのコード部分をクリックした場合。
※コード部分の描画(アクティブ化？)が終わる前にクリックすると、発生しやすい。

[Exceptionが発生しにくい状況]
Project Explorer上で何かをクリックした後に、、コードエディタのタブをクリックし、
その後にコード部分をクリックした場合。

とうことで、アクティブでないウインドウ(コードエディタのコード部分)をクリックした時に、Unhandled event loop exceptionが発生している・・ような気がします。

[結論]
他のViewに触れた後にコードエディタに戻る場合は、コードエディタのタブをクリックしてからコード部分に触れるとよさげ。

－－－　きりとりせん　－－－
他の対処法1：(回避できる場合もある・・？)
Eclipseの起動オプション(jvmに渡すパラメータ)が原因とする説。
1-1
　-vm (javaw.exeのパス)　を指定すると直るらしい？
　　=>　jdk1.6、1.7、1.8で実験してみたが、exceptionが発生する。
　　jdk1.7のjavaw.exeを指定すると、若干発生率が下がる？？
　　(Eclipseを起動しなおすと、発生率が変わる模様)
1-2
　-Xmx オプションは指定しない方がよい？
　(Eclipse lunaのreadme/readme_eclipse.htmlで、他の現象の対策として書かれている。)
　　=>　これも、-Xmx (デフォルト値)を渡した時に、若干発生率が下がる事があるかも？
　　という感じでした。

　> 3.2.6 Platform - SWT
　> Opening File Dialog crashes eclipse (Vista only)
　> ・・・i.e. do not use the -Xmx VM args. (bug 188317)
　※補足：過去に-Xmxオプションを指定した事がある場合は、
　-Xmx (デフォルト値)を渡さないと直らない・・かも。


－－－
他の対処法2：(回避できる場合もある・・？)
Eclipseの .javaの関連付けを変更すると直るとする説。
※Windowsではなく、Eclipse内で設定する関連づけです。
　=>　これも、他の対処法1と似たような状況。
WindowBuilderのインストールは試しませんでしたが、.javaにJava Editorを関連づけた後に、
発生条件を満たす(他のViewに触れた後に、コード部分をクリックする)と、Exceptionが発生します。

　WindowBuilderのインストールも必要という説も。
　http://stackoverflow.com/questions/15594590/eclipse-bug-unhandled-event-loop-exception-no-more-handles
　補足1：このQ&Aに書いてある回答は
　1.Help > Install New Software... から、WindowBuilderをインストールする
　2-1.Window > Preferences >
　　General > Editors > File Associations を開く
　2-2.File types: の、Add...ボタンをクリック
　　File type: 欄に、.javaを入力してOK
　2-3.Associated editors: で、WindowBuilderを選択して、Defaultボタンをクリック
　という内容です。

補足2：試した限りでは、Eclipseを再起動すると、.javaの関連付けの設定が消えるようです。
(関連付けの設定画面を閉じる瞬間に、一瞬、何らかのエラーが表示されます。)
TVTestをコマンドラインからビルドする

## 環境
- Windows 10 Pro Anniversary Update x64
- Visual Studio Community 2015

## ビルド手順

![1.png](https://qiita-image-store.s3.amazonaws.com/0/140086/3e544842-f1e1-3b8f-873b-b251d264c3b9.png)

- [TVTestのソース](https://github.com/DBCTRADO/TVTest)をcloneし、developブランチに切り替える。
- BaseClassesフォルダへ不足ファイルをコピーする。
- cloneしたフォルダに下記バッチファイルを置き、実行する。

```bat:build-TVTest.bat
@echo off

setlocal
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\VsMSBuildCmd.bat"

pushd "%~dp0TVTest"

msbuild /p:Configuration=Release_MD /p:Platform=Win32 src\TVTest_All.VS2013.sln
if ERRORLEVEL 1 goto :windup
msbuild /p:Configuration=Release /p:Platform=Win32 sdk\Samples\Samples.VS2013.sln
if ERRORLEVEL 1 goto :windup

:windup
popd
pause
```

## バッチファイルの簡単な解説

- 1行目
 - バッチファイル実行中にコマンドラインを表示しないようにするためのおまじない。
 - `echo off`の行そのものを表示させないために、先頭に`@`をつけてある。
- 3行目
 - 4行目で環境変数が変更されるため、build-TVTest.batの外に影響を及ぼさないようにするためのおまじない。
- 4行目
 - VsMSBuildCmd.batを読み込む。これにより、MSBuildにパスが通る。
 - なお、VsMSBuildCmd.batは、VS2015をインストールするとスタートメニューに登録される「VS2015 用 MSBuild のコマンド プロンプト」と同じもの。
- 6行目
 - TVTestフォルダへ移動する。`%~dp0`は、build-TVTest.batのあるフォルダを表す。
- 8行目
 - MSBuildでsrc\TVTest_All.VS2013.slnを読み込み、**TVTest本体とTVTest_Image.dllをビルドする**。
- 9行目
 - MSBuildがエラーを起こしたらラベル`windup`へ飛ぶ。
- 10行目
 - MSBuildでsdk\Samples\Samples.VS2013.slnを読み込み、**各種プラグインをビルドする**。
- 11行目
 - MSBuildがエラーを起こしたらラベル`windup`へ飛ぶ。ただしラベル`windup`は直後にあるため、この行はあまり意味がない。
- 14行目
 - 8行目で`pushd`しているので`popd`で元のフォルダへ戻る。
- 15行目
 - 「続行するには何かキーを押してください」。

## MSBuildのコマンドラインオプションによる構成変更

### TVTest_All.VS2013.sln

- 8行目の`Release_MD`を`Release`に変更すると、VCランタイムを使用しない構成でビルドする。
- 同、`Win32`を`x64`に変更すると、64bit版をビルドする。

### Samples.VS2013.sln

- 10行目の`Release`を`Release_static`に変更すると、VCランタイムを使用しない構成でビルドする。
- 同、`Win32`を`x64`に変更すると、64bit版をビルドする。

## おまけ：package.sh

- TVTestのソースに含まれるpackage.shは、下記処理を行うBashスクリプト。 
 - ビルドしたバイナリ、ヘルプファイル、ドキュメント、設定ファイル等をひとつのフォルダへコピーする。
 - コピーしたファイル群から書庫ファイルを作る。
- Git Bash上で実行する。Git Bashは、[Git for Windows](https://git-for-windows.github.io/)をインストールすると使えるようになる。

### package.shの使い方

- TVTestフォルダ上で右クリックし、[Git Bash Here]を選択する。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/140086/302e9dd5-fef1-f6d7-1ed8-996fb74a10fb.png)

- Git Bashが開いたら、下記コマンドを実行する。7-Zipがインストールされていなければ最後にエラーとなるが、気にしないこと。

```shell-session
$ ./package.sh -a x86 -c dynamic -t release
```

![3.png](https://qiita-image-store.s3.amazonaws.com/0/140086/a98977e7-1339-4b97-1756-a8512702b58a.png)

- コマンドが終了するとpackageフォルダが作られ、ビルドしたバイナリ等がコピーされている。これを使ってインストールする。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/140086/4d4c167d-6b37-fdc6-922b-da8651b61130.png)

- package.shの先頭にコマンドラインオプションの使い方が書かれているので、よく読むこと。
C++のEigenで作ったライブラリをBoost.NumpyでPythonから使えるようにする。

# この記事は

札幌C++勉強会の[オンラインもくもく会#36](https://github.com/sapporocpp/mokumoku/issues/44)でやった内容をメモります。

# インストール方法

他所をあたってください。がんばれ。

# やること

簡単な例として、Pythonのnumpyで用意した2次元配列の和を
C++のEigenライブラリを使って計算し、それをまたPythonに返す、ということをします。

# C++のソースコード

```cpp:cpplib.cpp
#define EIGEN_DEFAULT_TO_ROW_MAJOR
#include<Eigen/Core>
#include<boost/numpy.hpp>
namespace py = boost::python;
namespace np = boost::numpy;

np::ndarray add_double(const np::ndarray lhs, const np::ndarray rhs) {
    using Stride = Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>;
    const auto
        lrows = lhs.shape(0),
        lcols = lhs.shape(1),
        rrows = rhs.shape(0),
        rcols = rhs.shape(1);

    const Stride
        lstride(lhs.strides(0)/sizeof(double), lhs.strides(1)/sizeof(double)),
        rstride(rhs.strides(0)/sizeof(double), rhs.strides(1)/sizeof(double));

    const Eigen::Map<const Eigen::MatrixXd, Eigen::Unaligned, Stride>
        lmat(reinterpret_cast<double*>(lhs.get_data()), lrows, lcols, lstride),
        rmat(reinterpret_cast<double*>(rhs.get_data()), rrows, rcols, rstride);

    np::ndarray ret = np::empty(
        py::make_tuple(lmat.rows(),lmat.cols()), 
        np::dtype::get_builtin<double>());

    Eigen::Map<Eigen::MatrixXd>
        ret_mat(reinterpret_cast<double*>(ret.get_data()), lmat.rows(), lmat.cols());

    ret_mat = lmat + rmat;
    return ret;
}

BOOST_PYTHON_MODULE(cpplib) {
    Py_Initialize();
    np::initialize();
    py::def("add_double",add_double); 
}
```
行列の足し算を目的にするだけならもっと簡単に書けるかもしれませんが、応用が効くように書いてます。型が `double` 限定なのは仕方ないです。やるとしたら`dtype` 調べて分岐ですが、実行時判定するしかない。

# コンパイル方法

SConsでやります。例えばこんなかんじです。mingw環境でやってます。

```py:SConstruct
# vim: filetype=python
# SConstruct

env = Environment(
    SHLIBPREFIX="",
    SHLIBSUFFIX=".pyd",
    CXX="/mingw64/bin/g++",
    CXXFLAGS=["-std=c++14"],
    LINKFLAGS=["-std=c++14"],
    CPPPATH=[
        "/mingw64/include/eigen3",
        "/mingw64/include/python3.5m", ],
    LIBPATH=["/mingw64/lib"])

env.SharedLibrary("cpplib", ["cpplib.cpp"],
    LIBS=["boost_numpy", "python3.5.dll", "boost_python3-mt"])
```

# Pythonコード

```py3:usecpp.py
import numpy as np
from cpplib import add_double

a = np.array(
    [[1, 2, 3, 4],
     [5, 6, 7, 8],
     [9, 1, 2, 3],
     [4, 5, 6, 7], ], dtype=np.float64)
b = np.array(
    [[5, 6],
     [4, 5], ], dtype=np.float64)

result = add_double(a[1::2, 1::2], b[::1, ::1])
print(result)
```

結果は
`[[6,8],[5,7]]`と`[[5,6],[4,5]]`が足されるので

```shell-session
$ python3 usecpp.py
[[ 11.  14.]
 [  9.  12.]]
```

となります。ここでもくもく会時間切れ。

# 追記

https://github.com/ignisan/boost_numpy_project/blob/master/to_eigen_map.hpp
配列の要素を一撃で抽出する方法

#前回の投稿でいただいたコメント
[『プログラマの考え方がおもしろいほど身につく本』で学んだ問題解決の考え方](http://qiita.com/Yunosuke21/items/500dc01c2ec08a2fa756)の記事にて、以下のコメントをいただきました。
「配列をまず作成し、それを出力処理に渡す。」(だいぶ端折ってます。)

で、まず初めに配列を作り、次にその配列を出力するというプログラムを防備録的に残しておきます。

#アイドルグループ「でんぱ組.incのメンバーを一挙に紹介する」プログラムを書きます。（JSにて）

```
var DempagumiInc = ["みりんちゃん", "りさちー", "ねむきゅん", "えいたそ", "もがちゃん", "ピンキー！"];　//配列でメンバーを列挙

document.write("<p>" + "でんぱ組.incのメンバーは" + "<p>"); //名前だけだと悲しいので紹介文を付けた①

for (var i = 0; i < DempagumiInc.length; i++) {
	document.write(DempagumiInc[i] + "<br>");
} //for文を使って配列の要素を抽出

document.write("<p>" + "です。" + "</p>"); //名前だけだと悲しいので紹介を付けた②
```

#結論
配列とforの相性は抜群!!

以上。
ubuntu apt 初心者の備忘録

アンインストールの仕方を忘れないように、書き留めます…

# インストールする場合

```
$ sudo apt install パッケージ名
```

# アンインストールする場合

```
$ sudo apt remove パッケージ名
```

# 依存関係があるパッケージも含め、アンインストールする場合

```
$ sudo apt --purge remove パッケージ名
```
action属性がないform


とあるサイトのソースを見てたらformなのにaction属性が指定されていないやつを見かけた。

びっくりして調べてみたらどうやらhtml5でいらなくなったみたい。

action属性が指定されていない場合は、formのデータの送信先はそのhtmlファイル自身になる。


とのことらしいです。

びっくり
FFmpegでライフゲーム(Conway's Game of Life)

[ライフゲーム(Conway's Game of Life)][life] GIF動画を好きなだけ生成できる。

そう、[FFmpeg][ffmpeg] ならね。

## 基本編
FFmpegは多機能なマルチメディア変換ソフトウェアですが、その中で[`life`映像ソースフィルタ][filter]機能が提供されます。<del>ちょっと頭おかしいのでは？</del>

```
$ ffmpeg -f lavfi -i life=s=60x60 -vframes 500 lifegame.gif
```
![lifegame1.gif](https://qiita-image-store.s3.amazonaws.com/0/6657/d3a1fd27-d8ef-f4c4-ec95-901fb547e6a4.gif)
ワールドサイズ 60x60、500 世代

## 応用編
基本編では出力サイズが小さくて見づらいです。サイズを大きくし（x6倍）、色もそれっぽく(？)、ついでにグリッド線も引いておきましょう。

```
$ ffmpeg -f lavfi -i life=s=60x60:life_color=00ff00:ratio=.5 \
  -sws_flags neighbor -vf scale=360:360,drawgrid=w=6:h=6 \
  -vframes 500 lifegame.gif 
```
![lifegame2.gif](https://qiita-image-store.s3.amazonaws.com/0/6657/d76484fe-4aaa-17cf-5873-9b11917cf9aa.gif)
ワールドサイズ 60x60、500 世代

[life]:https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0
[ffmpeg]:https://ffmpeg.org/
[filter]:https://ffmpeg.org/ffmpeg-filters.html#toc-life
wordpressにinstagram apiを利用して、リスト形式表示とポップアップ表示を実装する プラグイン

# instapopup

インスタグラムのAPIを使用して、
Wordpress内に、リスト形式で並べて、
クリックするとポップアップ(モーダルウィンドウ)が開きます。
ポップアップには、colorbox( http://www.jacklmoore.com/colorbox/ )
を利用しました。

# 使用方法

/wp-content/plugins/にinsta-popupを格納し、
プラグインを有効化後、
管理画面で、
username,
access token, 
表示数, 
を登録します。  

Access Tokenの取得に関してはGoogleにて検索をかけてください。
  
その後、表示したい箇所に
<?php echo $instapopup->create(); ?>
と記述してください。

# 使用例

http://ymmo.sakura.ne.jp/insta_popup/
インストール済みのProvisioning Profileの一覧を取得する

# インストール済みのProvisioning Profileの一覧を取得する

需要があるか分かりませんが, 置いておきますね.
良いやり方が他にあればご教授ください :pray: 

```bash
#!/bin/bash
#
# usage: ./display_profile.sh

set -e

IFS=$'\n'
for FILE in $(find "${HOME}/Library/MobileDevice/Provisioning Profiles" -name *.mobileprovision); do
    LINE=$(( $(grep -a ">Name<" -n $FILE | awk -F':' '{print $1}') + 1 ))
    PROVISIONING_NAME=$(sed -n ${LINE}p ${FILE} | sed "s/^.*>\(.*\)<.*$/\1/")
    echo -e $(echo ${FILE} | sed "s/^.*\/\(.*\)\..*$/\1/") "\t" ${PROVISIONING_NAME}
done
```

出力結果は

```bash
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 	 ProvisioningName1
yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy 	 ProvisioningName2
```

のようになります.
sqs:ListQueuesのポリシー設定

sqs:SendMessageなどと異なり、sqs:ListQueuesはキューのリストを参照する必要があるので、以下のようなポリシー設定が必要になる。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sqs:ListQueues"
            ],
            "Resource": "arn:aws:sqs:<region>:<account_ID>:*"
        }
    ]
}
```
Windowsに仮想サーバーを立ててローカルにあるMacbookからSSH接続

VPSでのサーバー関係の練習のためにWindowsにVirtualBoxで仮想サーバーを立てCentOSをインストールし、Maｃbookからssh接続してみます。

#WindowsパソコンにVirtualBoxをインストール
https://www.virtualbox.org/wiki/Downloads
からダウンロードしてください。

#CentOSのインストール
http://qiita.com/100/items/80a899fbaeb1e82b3f67
このページを参考にしてください。

#VirtualBoxのネットワーク設定
CentOSの仮想サーバーの設定からネットワークを選択し、割当を**ブリッジアダプター**にします。
仮想サーバーを起動し、デスクトップ画面が表示されたら**アプリケーション**から**端末**を開きます。
`$ ifconfig`
を入力し、IPアドレスを確認します。
3行目くらいに`inet ◯◯◯`　とIPアドレスが表示されると思います。

#SSH接続
Macでターミナルを開きます。
`$ ssh root@◯◯◯（さっきのIPアドレス)`を入力します。
パスワードが聞かれると思いますが、CentOSをインストールした時にパスワードを入力してください。



これでローカルにある仮想サーバーへSSH接続されました。
UIScrollViewで横スクロールのページングを実装する

# デモ

![A0f3wxdzLg.gif](https://qiita-image-store.s3.amazonaws.com/0/9875/6e8b33d6-6245-b81b-1284-e5fde3c56a3a.gif)


# ソースコード

Github: https://github.com/k-yamada/PagingViewController

```swift

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var scrollView: UIScrollView!
    
    let cardWidth: CGFloat  = 300
    let cardHeight: CGFloat = 300
    var cardViews: [UIView] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        initScrollView()
    }

    private func initScrollView() {
        cardViews.append(createCardViewFromImageName("image1", index: 0))
        cardViews.append(createCardViewFromImageName("image2", index: 1))
        cardViews.append(createCardViewFromImageName("image3", index: 2))
        cardViews.forEach {
            scrollView.addSubview($0)
        }
        scrollView.contentSize = CGSizeMake(view.frame.width * CGFloat(cardViews.count), cardHeight)
    }

    private func createCardViewFromImageName(imageName: String, index: Int) -> UIView {
        let imageView = UIImageView(frame: CGRectMake(0, 0, cardWidth, cardHeight))
        imageView.image = UIImage(named: imageName)?.roundedImage(5)
        imageView.contentMode = UIViewContentMode.ScaleAspectFit
        imageView.center.x = view.frame.width / 2
        let cardX: CGFloat = CGFloat(index) * view.frame.width
        let cardView = UIView(frame: CGRectMake(cardX, 0, view.frame.width, cardHeight))
        cardView.addSubview(imageView)
        return cardView
    }
}
```

注意: Storyboard上で、UIScrollViewの`Paging Enabled`にチェックしてください。
Google Trendsを用いた長期トレンド分析における注意点

マーケティング的な観点で技術動向を調査するにあたっての有用な一手法として、[Google Trends][]の活用を挙げることが出来ます。このGoogle Trendsを用いることにより、ある検索語の人気度合いを確認することが出来るため、例えば、IT業界で明日の飯の種を探ることが、より容易になります[^1]。

#Google Trendsを用いた長期トレンド分析時に何を注意しなければならないのか？

大昔（2007年頃より以前）においては、Google検索のユーザー層は現在とは大分異なっていました。Google検索は、Google Trendsを用いた時系列分析の始点にあたる2004年時点でようやく検索エンジンのシェアトップを獲得し、Yahooと肩を並べました（参考：[ComScore on top search engines for December 2004: Google - 35%, Yah00 -32%]）。以降、Google検索は着実にシェアを獲得するものの、2007年時点でもそのシェアは60%強に留まっています（参考：[Hitwise: August 2007 Search Share Favors Google, Yahoo – Microsoft Drops][]）。つまるところ、大昔のGoogleユーザー層は、現在より大分Geek色が強かったと考えられます[^2]。

そのため、Google Trendsを用いたトレンド分析の結果は、2007年頃より以前では、よりGeek色が強いユーザーの関心を反映したものとなっているはずです。更に端的に言ってしまうと、**2007年頃より以前では、情報技術関連の検索語の人気度が顕著に高くなります**。

上記の裏づけを示すため、Google Trendsでの（流行の影響を受けづらい）典型的な情報技術用語（"Server"、"Computer"、"Software"）の人気度の時系列推移を以下に示します。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/135979/ea49f571-86fd-ef70-163c-6abeae6c5bfe.png)

#では、どうすれば良いのか？
情報技術に関連する用語に対して、Google Trendsを用いた長期トレンド分析を行う場合には、典型的な情報技術用語（"Server"、"Computer"、"Software"...etc.）と比較する形での分析を行うことを推奨します。

この推奨に反した場合にはどうなるかと言うと、例えば、「Java」キーワード**単体**に対してGoogle Trends分析を行うと、「Java言語は継続的に衰退している」としか解釈しようが無い時系列グラフが表示されてしまいます（下図）。

![002.png](https://qiita-image-store.s3.amazonaws.com/0/135979/1b9e98c9-af5c-4653-59d4-8eceeb98d3c6.png)

一方で、上述したようなミスリードを避けるために、「Software」キーワードと比較しつつ、「Java」キーワードの人気度の推移を確認すれば、「（Google検索のユーザー層の変化により）情報技術関連の用語が全般的に人気度を落としている一方で、Java言語に対する検索ニーズは相対的には安定している」、というような新たな結果解釈の余地が生ずることとなります（下図）。

![003.png](https://qiita-image-store.s3.amazonaws.com/0/135979/7f8acf88-fe67-a560-ace2-03e7dfe5eb60.png)

#補足
実は、Google Trendsには[「カテゴリ」の概念がある][]ので、仮に、Java言語の人気度の推移を見たいのならば、「プログラミング」カテゴリ内に閉じた形での人気度の推移を見るのが本来あるべき素直な対応だったりもします。しかしながら、「Java（プログラミング言語）」カテゴリを指定した上での「Java」キーワードの人気度が右肩下がりになっている結果（下図）を見ると、「カテゴリ」内に閉じた形で人気度を分析する戦略が上手く機能している気がせず...

![004.png](https://qiita-image-store.s3.amazonaws.com/0/135979/59555915-2aaa-d0e6-1954-59aae2ac6af5.png)

[^1]: Qiitaでの投稿で言うと「[google trendによるプログラミング言語のトレンド][]」記事で、プログラミング言語の人気度合いに関するGoogle Trendsを活用した調査結果が紹介されていたりもします。
[^2]: 異論は認めます。ただ、2007年におけるiPhoneの登場と、それに続くスマートフォンの普及は、インターネット検索の「カジュアル化」をもたらしたと考えます（その結果として、インターネット検索の世界におけるGeek要素は薄まった...はず）。

[Google Trends]: https://www.google.co.jp/trends/
[google trendによるプログラミング言語のトレンド]: http://qiita.com/lambda-knight/items/93e4ac9137d0b3340673
[ComScore on top search engines for December 2004: Google - 35%, Yah00 -32%]: http://www.zdnet.com/article/comscore-on-top-search-engines-for-december-2004-google-35-yah00-32/
[Hitwise: August 2007 Search Share Favors Google, Yahoo – Microsoft Drops]: http://searchengineland.com/hitwise-august-2007-search-share-favors-google-yahoo-microsoft-drops-12231
[「カテゴリ」の概念がある]: https://support.google.com/trends/answer/4359597?hl=en&ref_topic=4365530
異なるVPCのInternal ELBに繋ぐ設定覚書

# 概要

Internal ELBを立て、非公開のAPIを作り、別のVPCから叩きたい時の設定
毎回忘れるのでポイントだけ書き残しておく

# 手順

## Internal ELBを立てる

- PrivateなSubnetにELBを立てる
- `Create an internal load balancer`にチェックを入れるのを忘れてはいけない

## VPC peeringの設定

- 同じアカウアントでも、Createした後でAcceptしないといけない
- local、peeredの順番は関係ないはず

## Route Tableの設定

- API叩き先、叩き元のどちらにもTargetにVPC peering connectionを追加する
    - 基本PrivateなRoute Tableに設定するはず
rhel/centos 6で最新のgitが使いたくなったら、IUSレポジトリを入れて、yumを使おう

rhel/centos 6では、gitのバージョンが古く、LFSとかも使えません。そこで、バージョンアップをしたいと思うのですが、ソースからやるとgitのバージョンが上がった時に追随するのが面倒ですし。yumでやろうと思って調べるとrpmforgeとかは、[もうメンテされてないから使わないで](https://wiki.centos.org/AdditionalResources/Repositories/RPMForge)、などと言われます。

そこで、本家git-lfsのインストールwikiにあるやり方でやりましょう。

1. IUSのレポジトリを登録します。  
`curl -s https://setup.ius.io/ | sudo bash`  
IUSはInline with Upstream Stableの略で、Enterprise Linuxのディストリビューションにより新しいバージョンのRPMを提供しようとするコミュニティのプロジェクトです。

2. あとはgitをインストールしてお終い。パッケージ名に気をつけてください。  
`yum install git2u`  
既にgitが入っている場合は、インストール前に削除しておいてくださいね。

インストールできるパッケージの一覧は[こちら](https://ius.io/Packages/)です。

[参考](https://github.com/github/git-lfs/wiki/Installation#rhelcentos)
Vagrantのエラー対応

Windows 10でVagrant 1.8.5使ってテスト環境作ろうと思ったときに遭遇したエラーに対応した内容です。

# box could not be found or could not be accessed
`vagrant up`したら以下の様なエラーがでた。

```
The box 'bento/centos6-8' could not be found or
could not be accessed in the remote catalog. If this is a private
box on HashiCorp's Atlas, please verify you're logged in via
`vagrant login`. Also, please double-check the name. The expanded
URL and error message are shown below:

URL: ["https://atlas.hashicorp.com/bento/centos6-8"]
Error:
```

このエラーについて検索したときによく出てきたのが、`chef`は`bento`に変えるという方法。
ただ上記のように`bento`を使っても変わらず。
いろいろ調べた結果、[Microsoft Visual C++ 2010 再頒布可能パッケージ](https://goo.gl/lgvZrM)が必要とのこと。Windowsだから？ (ここにたどり着くまで結構時間かかった。。)
ダウンロードしたら普通にいけました。

# Authentication failure. Retrying...
同じく`vagrant up`したとき。延々繰り返して先に進まない。
Vagrant 1.7以降で`vagrant up`すると、対象のゲストOSに対して新たな鍵のペアを生成・配置されることが原因らしい。
とりあえず、Vagrantfileに`config.ssh.insert_key = false`を追記したらいけました。

# ssh executable not found
`vagrant ssh`したとき。
これは内容の通り、SSHクライアントが存在しないのでクライアント入れてパスを通せばよい。
私はMobaXterm使っててそれで`ssh`できるので特に何もしませんでした。

```
`ssh` executable not found in any directories in the %PATH% variable. Is an
SSH client installed? Try installing Cygwin, MinGW or Git, all of which
contain an SSH client. Or use your favorite SSH client with the following
authentication information shown below:
```

# 参考
- [vagrant up するには、Visual Studio C++ 2010 の再頒布可能パッケージが必要 - Qiita](http://qiita.com/yorozuone/items/d202a21b33fd16621de4)
- [vagrant upコマンド実行時にAuthentication failure.エラーが発生する - Qiita](http://qiita.com/shyse/items/9ec50b868b90f847c75f)
- [WindowsでVagrantを扱う私的まとめ (インストール編) - 素敵なおひげですね](http://stknohg.hatenablog.jp/entry/2015/01/18/165202)
Macのターミナルの背景色をコマンドラインから変える

UbuntuからMacに乗り換えてからずっと困っていたのが、ターミナルの背景色。
プロファイルを変えれば色も変わるんですが、タブやウィンドウを新しく開く時にしかプロファイルは指定できず、今現在のターミナルのプロファイルって変えられないですよね。

**変えられるならぜひ教えてほしいっす。**

で、試行錯誤してたどり着いたのがaliasでの解決。

bash使っているので、.bashrcに以下の行を追加します。


```sh:.bashrc
# これは一例です。
# 好きなプロファイルを指定してください

BASE_COLOR_CHANGE='tell application "Terminal" to set current settings of first window to settings set '
PREFIX_COLOR_CHANGE='/usr/bin/osascript -e '"'"$BASE_COLOR_CHANGE
alias change_default=$PREFIX_COLOR_CHANGE' "Pro"'"'"
alias change_blue=$PREFIX_COLOR_CHANGE' "Ocean"'"'"
alias change_red=$PREFIX_COLOR_CHANGE' "Red Sands"'"'"
alias change_silver=$PREFIX_COLOR_CHANGE' "Silver Aerogel"'"'"
alias change_green=$PREFIX_COLOR_CHANGE' "Grass"'"'"
```

すかさず.bashrcを読み直して

```sh
source ~/.bashrc
```

赤っぽく変えたかったら

```
change_red
```
<img width="300" alt="Screen Shot 2016-09-08 at 19.03.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/9800a195-f814-8079-5c75-122eb082d68b.png">



変わった！


<img width="300" alt="Screen Shot 2016-09-08 at 19.08.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/65152538-6996-e348-96ab-476da7a15e50.png">

これでカラフル生活に戻れます。
[memo]symfonyで調べる

調べるメモ。

# コマンドの調べ方
```php
./symfony 
```
→コマンドが全部出る

```php
./symfony help [コマンド名]
```
→コマンドのヘルプが出る

# ドキュメントパスがわからないときに便利そう

1. `http://host/アプリ名_dev.php`で右上にツールバーが出る
2. config>settings>sf_root_dir→このディレクトリを調べる

`アプリ名_dev.php`は設定によって変わることもあるけど、結構これが多いらしい。
ターミナルからSAKURAのMySQL


SAKURAのレンタルサーバーでMySQLを使ってみる覚え書きです。
（参考サイト：http://d.hatena.ne.jp/hop_head/20130913/1379071336）


#データベースの作成

これはさくらインターネットの管理画面からでないと出来ないみたいです。


#ssh接続

ターミナルから
`ssh ユーザー名@ユーザー名.sakura.ne.jp`

パスワードを聞かれるので、さくらのコントロールパネルに入る時と同じものを入力してEnterしましょう。


#MySQL起動

`mysql -u ユーザー名 -h データベースアドレス　-p`

そして「データベースの接続パスワード」を入力です。

データベースアドレスはコントロールパネルから見れる「データベース　サーバ」と言う所にあるものです。


これでSQL文を使うことが出来ます。

終了はexitです
[その2]blank appプロジェクトが作成できなくなった時の対処

[前回](http://qiita.com/meganesan/items/d29f2730b5a7c4ed9cdb)のつづき。

自宅ではVS2015Communityを使っていて、↑でうまくいった。
業務ではVS2012ProとVS2015Proを併用していて、こちらは↑しても
VSを再インストールしても全く改善されない。それどころか悪化しているような。。。

# 結論
原因をつきとめる時間 > 再インストール時間になりそうと判断し、
PCにインストールしていたすべてのVisual Studioをアンインストール、VS2015Proのみ再インストールし再起動。([ここ](https://beta.visualstudio.com/downloads/)からダウンロードした)
↓
ターゲットSDKが見つからないと言われる
↓
[SDK](https://developer.microsoft.com/ja-jp/windows/downloads/windows-10-sdk)再インストール、再起動
↓
UWPの空プロジェクトが作成できた！

もしかしたらVSとSDKインストーラーのロケールが違っていたのでおかしくなったか…？
何度もやり直したのでよくわからなくなってしまった…
おわり。
ProGuard対応した時のざっくりメモ


ProGuardを掛ける時にやった手順メモ。もっとスマートな方法無いだろうか。


# 最初に入れるライブラリ
## ドメイン毎のdexcountが見れる君

https://github.com/KeepSafe/dexcount-gradle-plugin
<img width="257" alt="スクリーンショット 2016-09-08 18.10.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/78827/ee7b7693-c897-c7e6-2f20-1080c5483e47.png">

こんな感じで表示出来るHTMLを吐き出してくれる。

# まずは外部ライブラリ分については公式のサンプルをあたってみる

- しっかりしたライブラリにはだいたい`proguard-rules.pro`が付いてるので、それをコピってくる
- [android-proguard-snippets](https://github.com/krschultz/android-proguard-snippets)という公式系をまとめたリポジトリもあるので、ここからコピってくるのも手
    - ただし、動くかは自分で確認してね

# 地道な戦い
## ドメインごとに手を付ける

たとえば、`me.yashims85.test.models.hoge`というpackageがあったら

- 最初に`me`を全てkeep指定にする
- `me.yashims85`くらいの大味でkeepを外す
- warnがでたらドメインを小さくしてkeepを掛ける
- ある程度納得感のあるドメインまで繰り返す
RedshiftでUNLOADしてCOPYする

# 概要

Redshiftで、UNLOADしたファイルをそのままCOPYしようとして少しはまったのでメモ

# UNLOAD

```sql
UNLOAD ('SELECT * from table_name')
TO 's3://bucket/path/'
CREDENTIALS 'aws_access_key_id=${ACCESS_KEY_ID};aws_secret_access_key=${SECRET_ACCESS_KEY}'
ALLOWOVERWRITE
ESCAPE
ADDQUOTES
;
```

そのままCOPYに使うため、ESCAPEとADDQUOTESをちゃんと付ける
でないと、Stringカラムに改行などが混じっていた時に困る

# COPY

```sql
COPY table_name from 's3://bucket/path/'
CREDENTIALS 'aws_access_key_id=${ACCESS_KEY_ID};aws_secret_access_key=${SECRET_ACCESS_KEY}'
ESCAPE
REMOVEQUOTES
;
```

UNLOADと同様、ESCAPEとREMOVEQUOTESをちゃんと付ける
iTerm2でプロンプトの途中で強制改行されてしまうとき

つまり virtualenv を使った時にこうなっちゃう場合です。

![c4d9b222d00cc053a89b0adb16d1e4ff.png](https://qiita-image-store.s3.amazonaws.com/0/17911/475c6afc-dc9d-69b6-aaf8-cb6a49dd33e1.png)

ほんとは `(venv)` と `[~/venv]$` は一行で表示されてほしいのですが、二行になってしまっています。

## 対処する

- `⌘ + ,` で preferencesウインドウを表示する
- Profilesタブを選択
- Terminalタブを選択
- "Insert newlines before start of command prompt if needs"のチェックボックスを外す


![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/17911/b734aaa4-97b5-7684-5fca-bed32851e44e.png)


## 世界が平和になった

期待通りの見た目になり、ちゃんとプロンプトの直前に環境名が表示されるようになった。

![スクリーンショット 2016-09-08 18.04.55.png](https://qiita-image-store.s3.amazonaws.com/0/17911/cf4a05b3-713b-d227-a0de-f75e136faa56.png)

よかったですね!
[Swift] 自作ライブラリを Swift3 に対応する


他にもあるかもしれませんがとりあえずこれでいけたっぽいのでメモ。

## Syntax 変更の対応

これは簡単ですね、Xcode8 でプロジェクトを開いて `Convert syntax` で変換します。


## podspec の更新

podspec で Swift のバージョンを指定します。

```
Pod::Spec.new do |s|
  ...
  ...
  
  s.xcconfig = {
    'SWIFT_VERSION' => '3'
  }
end

```

## Travis CI の設定変更

Travis CI の設定ファイルのxcodeバージョンを変更します。

```
osx_image: xcode8
```
有線LANケーブルと有線LANアダプターでMacからRaspberryPiにSSH接続する

#環境
Mac OS X El Capitan US環境
Raspberry Pi2 Raspbian Jessie
[BUFFALO Giga USB3.0対応 有線LANアダプター LUA4-U3-AGT](http://amzn.to/2cELRqG)

#インターネット共有設定
有線LANアダプターとLANケーブルを接続し、有線LANアダプター側をMacに、LANケーブル側をRaspberry Piに接続する。

Macの「System Preferences」 > 「Sharing」 を開き
InternetSharingにチェックを入れる
<img width="668" alt="Screenshot 2016-09-08 17.41.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/42913/02babacc-f38d-0337-ff8b-270645088cd9.png">

Raspberry Piの電源を入れる。

#IPアドレスの確認
Macに最初からインストールされている「Console」アプリを使って、接続したRaspberryPiに(DHCPサーバであるMacによって)自動的に割り振られたIPアドレスを確認する。
FILESのsystem.logを開いて、右上の検索窓に「OFFER」と入れると、DHCPアドレスを割り当てた時のログが出る。

<img width="960" alt="Screenshot 2016-09-08 17.49.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/42913/f735fb72-63ad-36da-8d8c-79b2e3fa3384.png">

１番下の行に最新のメッセージが出ているので、今回の場合RaspberryPiのIPアドレスが「192.168.2.3」であることがわかる。

#TerminalからSSH接続
あとはTerminalで通常と同じようにSSH接続するだけ。
`$ssh pi@192.168.2.3`
CloudFrontとALBでHTTP/2を使用する

# CloudFrontとALBでHTTP/2を使用する
CloudFrontでHTTP/2が使用できるようになったのでALB(ApplicationLoadBalancer)と合わせて試してみる。

## 準備
配信用サーバ(Apache/2.2.15) 
ELB(httpsも有効化)
ALB
CloudFront
Chrome(HTTP/2 and SPDY indicator を入れておく)
※各SSLはACMを使用した

## テスト
### 1. ELB経由で確認
![001elb.png](https://qiita-image-store.s3.amazonaws.com/0/55705/54740993-a6b4-0e25-5c84-1a45b1c41c8a.png)
当然HTTP/2は有効になっていない。

### 2. ALB経由で確認
![002alb.png](https://qiita-image-store.s3.amazonaws.com/0/55705/86668e2e-2377-3736-0272-e5f0b28448ca.png)
同じようApacheの設定してでALBとELBで差が発生する。
ALBに関してはHTTP/2対応のApacheでなくても使用が可能。

### 3.CloudFrontで確認
Originにテスト1で使用したELBを指定する。
![003cloudfront.png](https://qiita-image-store.s3.amazonaws.com/0/55705/0eef1e91-d9d9-6a70-2a40-3a3f11681fcd.png)
HTTP/2が有効になっていることを確認。

## まとめ
めっちゃ便利
CloudFront、ALB共に既存のApacheで使用できるのは非常に便利
ソースからhttp2を有効化してコンパイルなどが不要な為、使用するのが容易になっている。

## メモ・補足等
CloudFrontのOrigin設定にALBは指定できない。
咬ませるならELBにする必要がある?
-> 自分が知らないだけでALBをOriginに指定できるのかもしれないが...
CEDEC2016 個人的おすすめセッション

CEDEC2016に行ってきて聴いたセッション、アップされたスライドを読んだセッションの個人的なお勧めセッションリストです。
まだ読んで無いセッションもありますので、後日追加するかも。

スライドが非公開のセッションもプレスさんがレポート記事を書いてくれていたりしていて非常に助かりますが、
さすがに内容全文をフォローしきれてないのもありますので現地で聞くのもやっぱり必要だなぁと思いました。



# 最適化

## CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
http://www.slideshare.net/EpicGamesJapan/cedec2016-unreal-engine-4
https://www.youtube.com/watch?v=iqYQvpTndTw

- アート、プログラマー向け。
- レンダリングフローとその処理内容が丁寧に説明されている。最近のレンダリングフローなら同じような形になると思うので、UE4を使っていなくても勉強になる。
- UE4の最適化手法が解説されている。同じような実装を作っているのならUE4以外でも同じ事が使用できる。
- アーティスト向けに作ってるけど、レンダリングに詳しくないプログラマーも勉強できる。
- 今回のCEDECでトップクラスでお勧め。
- アートもプログラマーもみんな読もう

## GPU最適化入門
https://cedil.cesa.or.jp/cedil_sessions/view/1457

- プログラマー向け。
- レンダリングフローの流れが綺麗に纏められている
- 描画負荷のボトルネック調査から、どうやって対処するかをフローチャートで纏められている
- これから描画周りに関して勉強する人、描画負荷を何とかしないと行けない人に向けては非常に良い資料。
- 今回のCEDECでトップクラスでお勧め。
- プログラマー全員読もう

## AAAタイトル開発における最適化　FINAL FANTASY XV実例紹介
https://cedil.cesa.or.jp/cedil_sessions/view/1536
http://jp.gamesindustry.biz/article/1609/16090501/

- プログラマー向け。
- ハイクオリティなFF XVの最適化の実例纏め。非常に貴重だし、詳しく説明されているのでお勧め。

## アイドルマスターシンデレラガールズ スターライトステージ 制作事例・テクニカル編　－ 多種多様なスマートフォンで5人のアイドルが躍動するライブの舞台裏 （60fpsリズムゲームの開発手法） －
http://www.4gamer.net/games/307/G030796/20160829088/

- アート、プログラマー向け
- 最適化手法やデータの数値、状態など詳しく説明されている。
- スライド公開が無いので、現地行った人に聞くべし。

# VR
## 「VR ZONE Ploject i Can」の知見、全部吐き出します！
http://www.famitsu.com/news/201608/26114177.html

- 全職種向け
- 貴重なVRアトラクションの運営を行った結果のレポート、その運営で得た知見の纏め
- VRやる人は読もう
- スライド公開が無いので、現地行った人に聞くべし。

## 手と指がVRの中にある：Oculus Touchのインタラクションデザイン
https://cedil.cesa.or.jp/cedil_sessions/view/1552
https://www.youtube.com/watch?v=v9OjMClVt74
http://jp.gamesindustry.biz/article/1608/16082705/
http://www.moguravr.com/oculus-touchhand-interaction-vr/

- 全職種向け
- Touch等の手を使うVRアクションについての知見。
- VRやる人は読もう

## PlayStation®VR向けコンテンツに対するConsultation Serviceの取り組み
http://www.famitsu.com/news/201608/25114069.html

- ゲームデザイナー、プログラマー向け
- 酔いに関するテスト、評価方法。
- 酔いにくい移動方法、他プレイヤーが酔いにくくなるテクニック等。

# AI
## FINAL FANTASY XV におけるレベルメタAI制御システム
http://jp.gamesindustry.biz/article/1608/16082901/
http://www.famitsu.com/news/201608/26114282.html

- プログラマー向け

## 目で見るゲームAI実践(群衆)
https://cedil.cesa.or.jp/cedil_sessions/view/1537

- プログラマー向け
- 映像とゲーム両面からの群衆AI。
- ゲームは実際のタイトル名を上げて、どのような群衆AIをしているのかを解説している

# その他
## FINAL FANTASY XV -　CHARACTER＆ENVIRONMENT WORKFLOW
http://www.famitsu.com/news/201608/27114297.html

- アート、プログラマー向け
- キャラクターのセットアップ方法や、ポリゴン数等数値を出して詳しく説明されている。
- 風や物理制御方法も紹介されているのでプログラマーにも有用かと

## エンジニアが持続的に成長するスキルサーズデー型勉強会 〜なかだるみしない社内勉強会の運営方法〜
https://cedil.cesa.or.jp/cedil_sessions/view/1486

- 全職種向け
- Cygamesさんが実際にやってる勉強会の話。
- 社内で全然人が集まらないと嘆くような所は是非。~~　嘆きたい　~~


# CEDEC2016　まとめ
http://qiita.com/YuukiOgino/items/051fc5823fb38ce7e9bd

YuukiOginoさんが情報源を綺麗に纏めて下さっています。
エイリアスの内容を見たい

そういえば.zshrcとかに書いたエイリアスの中身ってなんだったっけって時、ありますよね。
すごく簡単に見られるみたいです。

```
$ alias (エイリアス名)
```
でOK

例えば私の場合、

```
Yo@Ruby_MacbookPro ~/Desktop $ alias sshsyaro
sshsyaro='ssh chino@***.***.***.***'
```
※IPアドレスは伏せています

で接続先のIPアドレスを確認します。
gulp と同じ形式なシンプルなロガー 『 fancy-log 』 が便利な件

## TL; DR
[fancy-log](https://www.npmjs.com/package/fancy-log) というライブラリは、超シンプルなインターフェイスで [gulp](http://gulpjs.com/) と同じ形式でログが出力できます。

形式例: `[17:47:40] メッセージ`

## はじめに
Node.js でログ出力を行う場合、Node.js 標準の API では `console.log` を使うと思います。

しかし、ちょっと複雑なログの形式を出力しようと思うと、それだけでは途端に面倒になり、[log4js](https://www.npmjs.com/package/log4js) などのロガーライブラリを噛ますことになります。書捨てなスクリプトやプライベートなツールに対しては、そこまでするのはちょっと面倒です。

そんな時は [fancy-log](https://www.npmjs.com/package/fancy-log) を使うと便利です。[fancy-log](https://www.npmjs.com/package/fancy-log) を使うと、時刻付きのメッセージが簡単に出力でき、あとからログを追うときに大変便利です。

## 使い方
はじめに、npm 経由でインストールします。

```
$ npm i fancy-log
```

次に、`require` してログを出力する関数を呼びます。定義されている関数は、たったの 2 つです。

```js
const log = require('fancy-log')

log('通常のログの場合')
log.error('エラーログの場合')
```

上記を実行すると、下記テキストが出力されます。

```
[17:47:40] 通常のログの場合
[17:47:40] エラーログの場合
```

簡単ですね。

## まとめ
[fancy-log](https://www.npmjs.com/package/fancy-log) は自作ツールの [slack-lgtm-bot](https://github.com/pine/slack-lgtm-bot) で実際に使っています。

みなさんも、簡単に時刻付きのログを出力したい際にぜひご利用下さい!
Javascriptのオブジェクトのメンバ数を取るときにlengthプロパティが使えない。

jsのある処理で、オブジェクトに2つ以上メンバ数がある際に分岐させるときにつまづいたのでメモ。

普通にこうやったらうまくいかなかった。

```js
var dataList = {
    "apple" : 120,
    "banana": 100
};

if (dataList.length >= 2) {    // dataList.length はundefined
    // ほげほげ
}
```

調べてみると残念ながらどうやらオブジェクトにlengthプロパティはないらしい。
eachで泥臭くカウントしていくしかないのかと思いきや、[この記事のotakaさんのコメント](http://qiita.com/glaytomohiko/items/af4b025d7cd48c07266c)でスマートに解決出来た。

```js
var dataList = {
    "apple" : 120,
    "banana": 100
};

if (Object.keys(dataList).length >= 2) {    // Object.keys(dataList) は["apple","banana"]
    // ほげほげ
}
```

otakaさん、ありがとうございます！
Ubuntu/xenial64にAnsibleのgemモジュールでgemをインストールする

`gem` がインストールされずエラーも吐かない（$PATHに登録されてないとこにインストールされた？）ので盛大にハマった。

以下のようにしないといけないみたい。Rubyは `apt-get install ruby` で普通にインストールしたやつです。

```yaml
    - name: Install Ruby gems
      become: yes
      gem:
        name: "{{ item }}"
        state: latest
        user_install: no
        executable: /usr/bin/gem
      with_items:
        - bundler
        - mailcatcher
        - wordmove
```

わかんなかったのは、`executable`ってやつ。

Ansible の `gem` コマンドのパスを探すための関数 `get_bin_path()` が `/usr/local/bin` は探してくれないみたい。

`gem` が見つからなかったらエラーとか吐いてくれるのかと思ってたんだけど、時間がある時にソースを見てみる。
Flaskフレームワークで画面のフォームより入力したファイルをあれこれする。

タイトルの通りです。

Viewに設置したフォームより取得したファイルを

- アプリのルートディレクトリに保存(1)
- ファイル名を取得(2)

することを意図したコードを紹介します。


# コード本体

まず下記のコードをファイル上部に記述します。

```py
from flask import Flask, request
from werkzeug import secure_filename
```

下記のコードで当初の目的(1), (2)が達成されます。

```py
   target_csv = request.files['file'] # FileStorageオブジェクトが作成される。
   csv_file_name = secure_filename(target_csv.filename)
   save_path = os.path.dirname(os.path.abspath(__file__))+"/" + csv_file_name
   target_csv.save(save_path) # appのルートディレクトリに保存する。
   print save_path.split("/")[-1] # ファイル名のみ表示

```
【C#】PowerShell実行空間上で外部ファイルのps1スクリプトを呼び出す方法

### 趣旨

.NET アプリケーションからPowerShellを実行するケースにおいて、
外部のps1スクリプトを呼び出す時、単純に呼び出すとエラーとなります。

```
ハンドルされていない例外: System.Management.Automation.PSSecurityException: このシステムではスクリプトの実行が無効になっているため、ファイル Verb-Noun.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(http://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。 ---> System.UnauthorizedAccessException: このシステムではスクリプトの実行が無効になっているため、ファイル Verb-Noun.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(http://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
   --- 内部例外スタック トレースの終わり ---
   場所 System.Management.Automation.Runspaces.AsyncResult.EndInvoke()
   場所 System.Management.Automation.PowerShell.EndInvoke(IAsyncResult asyncResult)
   場所 ConsoleApplication1.Program.Main(String[] args) 場所 Program.cs:行 84
```

この問題を解決する方法を共有します。

#### 使用するコマンドが事前に用意される場合

```csharp:Sample.cs
var config = RunspaceConfiguration.Create( );
{
    config.Scripts.Prepend( name: "Verb-Noun", definition: $"{script ...}" );
}
using ( var rs = RunspaceFactory.CreateRunspace( config ) )
using ( var ps = PowerShell.Create( ) )
{
    rs.Open( );
    ps.Runspace = rs;

    ps.AddCommand( cmdlet: "Verb-Noun" )
        .Invoke( );
}
```

#### 実行中に用意される場合

```ps1:Sample.cs
var state = InitialSessionState.CreateDefault( ); // or CreateDefault2, Create
{
    state.ExecutionPolicy = ExecutionPolicy.RemoteSigned; // or Unrestricted
}
using ( var rs = RunspaceFactory.CreateRunspace( state ) )
using ( var ps = PowerShell.Create( ) )
{
    rs.Open( );
    ps.Runspace = rs;

    ps.AddCommand( cmdlet: ".\\Verb-Noun.ps1" )
        .Invoke( );
}
```
Google アナリティクスに、Firebase Analyticsで計測した数値を表示させてみる

Google アナリティクスに、Firebase Analyticsで計測した数値を表示させることはできるのか調べたら、
出来るようなので、やってみました( ･ㅂ･)و 

簡単にそのやり方を書きますー

##  ①新しいプロパティの作成
Google アナリティクスの`管理`の`プロパティ`の**新しいプロパティを作成**を選択。

![スクリーンショット 2016-09-08 14.08.20.png](https://qiita-image-store.s3.amazonaws.com/0/53996/a57ba8cf-5055-64e1-9480-0b23114e5bf3.png)

## ②トラッキングの設定

ここで必要な設定は、`トラッキングの対象`, `トラッキング方法`, `Firebaseへ接続`の３つです。

はじめに、`トラッキングの対象`に**モバイルアプリ**を選び、`トラッキング方法`に**Firebase Analytics**を選択します。

![スクリーンショット 2016-09-08 14.09.09.png](https://qiita-image-store.s3.amazonaws.com/0/53996/a15bc470-ba61-85d1-ff8d-0f7461c54b96.png)


次に、`Firebaseへ接続`で、**Google アナリティクスに表示させたいプロジェクトを選びます。**

![スクリーンショット 2016-09-08 14.09.30.png](https://qiita-image-store.s3.amazonaws.com/0/53996/1f729cea-1e10-417f-76dc-5bc2ee251a98.png)


最後に**アプリを接続**を押して、完了です!

![スクリーンショット 2016-09-08 14.09.38.png](https://qiita-image-store.s3.amazonaws.com/0/53996/4db54c37-625a-db57-f70f-4c347a129785.png)

## ③確認

ちゃんと出来れば、こんな感じに**リンク済みです。**と表示されます。

![スクリーンショット 2016-09-08 14.10.08.png](https://qiita-image-store.s3.amazonaws.com/0/53996/eb63957e-3898-e357-174c-2664868ca599.png)

そして、ホーム画面には、こんな感じにFirebase Analyticsのプロジェクトが追加されているはずです。

![スクリーンショット 2016-09-08 14.16.58.png](https://qiita-image-store.s3.amazonaws.com/0/53996/042c9ccd-86eb-7c2a-0490-f20741d40b77.png)

ちなみに、データはこんな感じに表示されます。（数値の部分は隠しています）

![スクリーンショット 2016-09-08 17.16.40.png](https://qiita-image-store.s3.amazonaws.com/0/53996/d0c9929b-316e-6513-0b7f-ab8104d62e39.png)

# まとめ

ポチポチするだけで、設定できたので、意外と簡単でした（笑）
調べると他にもいろいろGoogle アナリティクスとFirebase Analyticsの連携はできるみたいなので、これからいろいろやってみようと思います( *• ̀ω•́ )b
【CakePHP3】複数データベース接続を実現する方法


`default`以外へのデータベース接続を試みましたが、単純に`app.php`に接続設定を追加して、Tableに`useDbConfig`を足しただけではうまくできませんでした。いろいろ調べて接続できるようになったので、対応方法をメモしておきます。


# 環境
- CentOS7
- CakePHP 3.2.12
- PHP 7.0.9
- Apache 2.4.6

# 対応方法
行うことは以下の２点です。


## 1 app.phpに設定を追加

```php:app.php

//default以外に新たにDB接続設定を追加します
'another_db' => [
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => 'another_host',
            'username' => 'another_username',
            'password' => 'another_password',
            'database' => 'another_database',
            'encoding' => 'utf8mb4',
            'timezone' => 'UTC',
            'cacheMetadata' => true,
            'quoteIdentifiers' => false,
            'log' => false,
            'url' => env('DATABASE_TEST_URL', null),
        ],
```
## 2 Tableファイルに関数を作成

```php:SamplesTable.php
<?php
namespace App\Model\Table;
use Cake\ORM\Table;

class SamplesTable extends Table
{
    ...
    //この関数を追加します
    public static function defaultConnectionName(){
        return 'another_db';
    }

    ...
}

```

これで`SamplesTable`は`another_db`に接続できました！ :smiley: 

# 参考文献
- [Multiple database connection in cakephp 3 - stack overflow](http://stackoverflow.com/questions/29981890/multiple-database-connection-in-cakephp-3)