OmniAICreator/Qiita-1.07M huggingface dataset:
docker build で tar.gz 指定するときに Dockerfile が見つからないときの対処

# 概要

tar.gz で圧縮したファイルを使って docker イメージを作ろうとしたところ、以下のようなエラーが出てしまった。

```
$ docker build - < hoge.tar.gz
Sending build context to Docker daemon XXX MB
Error response from daemon: Cannot locate specified Dockerfile: Dockerfile
```

# 原因

hoge.tar.gz のルート直下に Dockerfile が見つからずに怒られている。 
tar.gz の作り方が悪かった様子

```
$ tar zcvf hoge.tar.gz hoge
```

これだと tar.gz ファイルのルート直下に `hoge` というディレクトリができてしまう

```
$ tar tf hoge.tar.gz
hoge/
hoge/Dockerfile
hoge/...
```

# 解決

tar.gz コマンドの叩き方を変更

```
$ cd hoge
$ tar zcvf hoge.tar.gz .
$ tar tf hoge.tar.gz
./
./Dockerfile
./...
```

これで tar.gz のルート直下に Dockerfile が置かれるので、正常に実行できるようになった

```
$ docker build - < hoge/hoge.tar.gz
```

# 所感

`docker build - <` のググラビリティが低くてちょっと大変だった…
【Salesforce初心者】SOQLで親リストから子供レコードの取得

SOQLの練習をしている時に、詰まったところをメモします。

Trailheadに下記のコードがありました：

```
Account[] acctsWithContacts = [SELECT Name, (SELECT FirstName, LastName FROM CONTACTS)
                              FROM Account
                              WHERE Name = 'SFDC Computing'];
System.debug(acctsWithContacts);

Contact[] cts = acctsWithContacts[0].Contacts;
System.debug('Name of first associated contact: '
             + cts[0].FirstName + ', ' + cts[0].LastName);

```
ここの記載が最初理解できなかったです：
```
Contact[] cts = acctsWithContacts[0].Contacts;
```
AccountリストからContactリストを受け取る時、なんで「０」を書く必要があるかが最初わからなかったです。

インドの同僚に聞いて、やっとわかりました。

つまり、親リストの中に、内部クエリで子リストをとってきた場合のリスト構造はこうなります（多分）

accountA
        -AccountA.Contact1
        -AccountA.Contact2
accountB
        -AccountB.Contact1
        -AccountB.Contact2
        -AccountB.Contact3

つまり二次元リストです！

だから　Contact[] cts = acctsWithContacts[0].Contacts
でAccountリストの中の1子目のAccountにぶら下がっているContactリストを全部とります。


検証として、いかのコードで検証してみました：
＊前提：Account "SFDC Computing"に、二つContactを追加している状態

```
Account[] acctsWithContacts = [SELECT Name, (SELECT FirstName, LastName FROM CONTACTS)
                              FROM Account
                              WHERE Name = 'SFDC Computing'];
System.debug(acctsWithContacts);
System.debug(acctsWithContacts.size());//これの結果が1

Contact[] cts = acctsWithContacts[0].Contacts;
System.debug(cts.size());//これの結果が2

System.debug('Name of first associated contact: '
             + cts[0].FirstName + ', ' + cts[0].LastName);

System.debug('Name of first associated contact: '
             + cts[1].FirstName + ', ' + cts[1].LastName);
```
配列に->MoveNext();ってデフォルトでphpに無いのね……(^_^;)

メモ失礼します。

PHPの移植作業をしてまして

```php

//list[]にデータを入れる
:
		foreach ($con->query($list_query) as $row) {
			$list[]=$row;
		}
：
//listのデータを使う
		while(!$list->EOF){
			$status  = ($list->fields['status']==1) ? "公開する" :"公開しない" ;
：
			$list->MoveNext();
		}

```
とのようにやろうとしてましたが
			$list->MoveNext();
で落ちている……
良く見てみるとMoveNextは
\includes\classes\db\mysql\query_factory.php
のクラスだったのでデフォルトで無い模様……

なので元から見てみるか……
IDEごとのショートカットキー対応表

交互に使ってるとよく混乱するのでメモ

※デフォルトの状態

|動作| Eclipse | Visual Studio2015|
|:-----------|:-----------|:------------|
|デバッグ開始|<kbd>F11</kbd>|<kbd>F5</kbd>|
|（デバッグ中）続行|<kbd>F8</kbd>|<kbd>F5</kbd>|
|（デバッグ中）ステップイン|<kbd>F5</kbd>|<kbd>F11</kbd>|
|（デバッグ中）ステップオーバー|<kbd>F6</kbd>|<kbd>F10</kbd>|
|定義に飛ぶ|<kbd>Ctrl</kbd>+クリック|<kbd>F12</kbd>|
|定義に飛んだ後戻ってくる|<kbd>Alt</kbd>+<kbd>←</kbd>|<kbd>Ctrl</kbd>+<kbd>-</kbd>|
|メンバ探し|<kbd>Ctrl</kbd>+<kbd>O</kbd>|<kbd>Ctrl</kbd>+<kbd>,</kbd>|
|行ジャンプ|<kbd>Ctrl</kbd>+<kbd>L</kbd>|<kbd>Ctrl</kbd>+<kbd>G</kbd>|
|行ごと削除|<kbd>Ctrl</kbd>+<kbd>D</kbd>|<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>L</kbd>|
|コメントアウト|<kbd>Ctrl</kbd>+<kbd>/</kbd>|<kbd>Ctrl</kbd>+<kbd>K</kbd>→<kbd>Ctrl</kbd>+<kbd>C</kbd>|

ややこしや～

###参考
[eclipseでよく使うショートカット](http://qiita.com/ynxx/items/7734dfb755bc83373d7c)

###TODO
・VisualStudioのバージョンによっても異なる模様（ひどい）、今回は2015
・VB、C++の時要確認
ngrockでローカル環境と外部サービスをつなぐ

# 外部からのリクエストをローカル環境で受け取りたい！

ローカル環境で開発していて、外部サービスからの通知・リクエストを受けとって中身を確認したい。ってことよくあると思います。でもローカル環境を外部に公開するなんて怖いし面倒くさい。そんなときに[ngrock](https://ngrok.com)を使うとお手軽に外部サービスとローカル環境をつなぐ事ができます。

# アカウント登録
https://ngrok.com  にアクセスしてアカウントを登録。
サブドメインとか使わないなら無料版で十分です。

# インストール
OS: macOS 10.12.4 (Sierra)
brew caskでインストール
```
$ brew cask install ngrok
```

# 確認
```
$ ngrok -v
ngrok version 2.2.3
```

#　起動
```
$ ngrok http 8080
```
こんな画面がでればOK

```
grok by @inconshreveable                          (Ctrl+C to quit)

Session Status              online
Account                     account_name (Plan: Free)
Version                     2.2.3
Region                      United States (us)
Web Interface               http://127.0.0.1:4040
Forwarding                  http://602bc2c0.ngrok.io -> localhost:8080
Forwarding                  https://602bc2c0.ngrok.io -> localhost:8080

Connections                 ttl     opn     rt1     rt5     p50     p90
                            0       0       0.00    0.00    0.00    0.00
```

http\://602bc2c0.ngrok.ioにアクセスするとlocalhost\:8080につながります。
外部サービスのwebhookなんか試すときに、webhookの送信先URLにhttp\://602bc2c0.ngrok.ioを指定してあげると、ngrokを経由してlocalhost:8080に届きます。

# virtualhostとか
ローカル環境でvirtualhostを設定して、ホスト名で振分してるとかあると思います。
そんなときは、以下のように起動時のオプションで、host-headerを書き換えることができます。

```
$ngrok http --host-header=rewrite www.hogehoge.local:80
```

すると↓のように　http\://3ff3ce28.ngrok.io　へのリクエストが、ホスト名www.hogehoge.localとして中継されます。

```
grok by @inconshreveable                         (Ctrl+C to quit)

Session Status              online
Account                     account_name (Plan: Free)
Version                     2.2.3
Region                      United States (us)
Web Interface               http://127.0.0.1:4040
Forwarding                  http://3ff3ce28.ngrok.io -> www.hogehoge.local:80
Forwarding                  https://3ff3ce28.ngrok.io -> www.hogehoge.local:80

Connections                 ttl     opn     rt1     rt5     p50     p90
                            0       0       0.00    0.00    0.00    0.00
```

ちなみにhttp\://3ff3ce28.ngrok.ioの3ff3ce28部分は起動する度に変わります。
固定したい場合は、有料プランでお布施をすると固定できるみたいです。

以上。
MATLABで一瞬で線形判別機をつくる

# Fisheriris を用いた判別分析のまとめ

MATLABのStatistics & Machine learning toolbox が最近便利になったときいて使ってみたメモ．あとで書き直す．
参考: https://jp.mathworks.com/help/stats/discriminant-analysis.html


# データを読み込む
```
load fisheriris
%  meas         150x4              4800  double              
%  species      150x1             19300  cell    
%
%  meas については，1次元目が標本で，2次元目が特徴 (Sepal Length, Sepal Width, Petal Length, Petal Width)
```

# 判別機の学習と成績

```
usefeat = [1 2] % 使う特徴

% 使うデータを半々に分ける
idx = logical(ones(150,1));
meas_trn_idx = idx;
meas_trn_idx(1:2:150)=0;
meas_tst_idx=~meas_trn_idx;

nMdl = fitcdiscr(meas(meas_trn_idx,usefeat), species(meas_trn_idx));
[pres, score] = predict(nMdl, meas(meas_tst_idx,usefeat));
```

正解かどうか見てみる

```
disp([pres species(meas_tst_idx)]); % [予測されたクラス(pred) 正解クラス]
accuracy = sum(strcmp(pres, species(meas_tst_idx)))/length(pres);
disp(['正解率: ' num2str(accuracy)])
% 正解率は下記のような分類誤差を測るメソッド loss でも推定できる
L = nMdl.loss(meas(meas_tst_idx, usefeat), species(meas_tst_idx)); % 1-Lが正解率
```

# 最適化
 -  fitcdiscr は自動での grid search やベイズ最適化に対応している (2017aから？，デフォルトでは適用されない)
 - これらを用いてより精度を上げることを試みることができる．
 - ここではgammaについて最適なパラメータを探る

```
% Gamma (正則化パラメータ)
gm = 0.1:0.1:1;
for g = 1:length(gm)
	% 5-fold Cross Validation を行うオプションを追記
	% そのほかのオプションは doc fitcdiscr などで調べる
	oMdl{g} = fitcdiscr(meas(meas_trn_idx,usefeat), species(meas_trn_idx), ...
		'Gamma', gm(g), 'CrossVal','on', 'KFold', 5);	
	
	acc(g) = 1 - oMdl{g}.kfoldLoss;
end
[~,Mid] = max(acc);
```

### 最適化したパラメータでテストデータを弁別してみる

```
bMdl = fitcdiscr(meas(meas_trn_idx,usefeat), species(meas_trn_idx), 'gamma', gm(Mid));
Lo   = bMdl.loss(meas(meas_tst_idx, usefeat), species(meas_tst_idx));

% おそらく正解率が4%ほど上がっていると思う
disp(1-L)  % 最適化有り
disp(1-Lo) % 最適化なし
```


# 各特徴量での分布

```
bin1 = linspace(min(meas(:,1)), max(meas(:,1)), 25);
bin2 = linspace(min(meas(:,2)), max(meas(:,2)), 15);

% histogram
figure;
for sp = 1:3
	subplot(2,1,1); hold on;
	histogram(meas(strcmp(species, nMdl.ClassNames{sp}), 1), bin1)
	subplot(2,1,2); hold on;
	histogram(meas(strcmp(species, nMdl.ClassNames{sp}), 2), bin2)
end

% scatter plot
figure; % scatterhist などでも可
gscatter(meas(:,1), meas(:,2), species)

% 事後確率を見てみる
[~, pprob] = bMdl.predict(meas(meas_tst_idx, usefeat));
imagesc(pprob); 
```
![image](https://qiita-image-store.s3.amazonaws.com/0/28835/27580fd5-d205-ed32-b0ad-98ec92cb127e.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/28835/8c541c10-fdfb-c568-d016-77da30b7c402.png)


scatter での印象通り，事後確率をみてもこの二つの特徴量ではversicolor と virginica の判別が比較的難しいっぽいことが分かる
BracketsのEmmetをpugに対応させる

## 1. snippets.jsonを作成

[ファイル]->[新規作成]から新しいファイルを作成し、下記のJSONを貼り付けます。

```json
{
  "pug": {
    "filters": "jade",
    "extends": "html",
    "profile": "xml"
  }
}
```

新しいファイルの名前を「snippets.json」として任意の場所に保存してください。
今回は、デスクトップに「emmet」というフォルダを作り、そこにsnippets.jsonを置くとします。

## 2. snippets.jsonのパスを確認

Bracketsがデフォルトの状態であれば、snippets.jsonのタイトルバーにパスが表示されます。
確認しておきましょう。
下記画像のタイトルバーは「/Users/kubotomoki/Desktop/emmet/snippets.json(Getting Started) - Brackets」となっています。

![](https://qiita-image-store.s3.amazonaws.com/0/75375/3e604563-818c-91c8-b05a-a2a3c934242b.png)

## 3. Emmet　Preferencesにパスを指定

メニューの[Emmet]->[Preferences...]から「Emmet　Preferences」を表示。
「Extensions folder」の入力欄に、タイトルバーで確認した**snippets.jsonまでのパス**を入力します。
snippets.jsonまでのパスなので、ファイル名は含めないでください。

![](https://qiita-image-store.s3.amazonaws.com/0/75375/60750a80-aefa-81de-1e4e-88729741db31.png)

## 4. Bracketsを再起動

Bracketsを再起動します。
Bracketsをそのまま落としてもいいですし、メニューの[デバッグ]->[拡張機能付きでリロード]でEmmetを更新します。

たのしー！

![pug.gif](https://qiita-image-store.s3.amazonaws.com/0/75375/dc0013c0-96d3-4222-e48b-a87ae94501f3.gif)

### もしEmmetがおかしくなったら

拡張機能からEmmetを削除したのち、再インストールしてください。

## snippets.jsonについて

snippets.jsonなどのEmmetの正規のカスタマイズ方法は、過去に私がAdobe公式ブログで解説しています。参考にしてください。

[Emmet入門 第4回 Emmetのスニペットや設定を編集して、思い通りの記述にしよう \| Adobe Creative Station](https://blogs.adobe.com/creativestation/web-learning-emmet-snippets)
ActiveDirectoryとは何か。初心者編

#はじめに


最近、ActiveDirectoryのお仕事をお手伝いさせてもらうことになり、
簡単な検証をやりながら、ActiveDirectoryってなんだろいうことを少しお勉強。
簡単にまとめてみました。

##ActiveDirectoryとは
<br>

```
ネットワーク上のユーザー情報やコンピュータ情報など、さまざまな資源をまとめて管理するためにマイクロソフトによって開発された。
WindowsServerには標準機能として備えられている。
```


###ActiveDirectoryが必要となるケースは？

例1)
社員数が数名程度であればそこまで負荷がかからないかもしれないけれど、
20、30と増えるにつれて、
個別の端末を一つ一つ作業するのは膨大な時間と手間がかかる。

例2)
必要なOSやアプリケーションのアップデートを行う必要があった場合も、
簡単に作業することができず企業としてのセキュリティも脆弱になりかねない。
(社員ごとに作業を依頼すると漏れが生じる可能性がある）

例3)
社員が好き勝手にPCの設定をしてしまうと、何かトラブルがあった場合も
状況をすぐに把握できず、対処に時間がかかる。

例4）
パソコン知識がない社員はアップデート作業や、プリンタの登録等本来の業務以外の部分で、余計に手間が掛かる可能性がある。


####そこで、ActiveDirectoryを導入すると。

管理者側で社員ごとにユーザーアカウントを作成すれば、社員はどの端末からでも自分のアカウントでログインすることができる。

ユーザーアカウントの新規登録や廃止も即座に可能。

セキュリティルールや端末への設定変更等を全てのユーザーに同じように適用することが可能。

等々。

前述したようなお悩みも一気に解決することができる！


Active Directoryは「ドメイン」という単位で管理する範囲を定義してます。
ドメインを作成することで、組織内のユーザー、コンピュータ、グループ、サービスなどを集中して管理することが可能。
![AD_01.png](https://qiita-image-store.s3.amazonaws.com/0/174392/6db2a600-2868-021b-71f4-51b0285c6751.png)


またADの導入によりPCの管理業務が４年間で168万円もコスト削減が可能という結果も出ています。
※社員数30名、導入９ヶ月目
[microsoft公式サイトより](https://www.microsoft.com/japan/msbc/Express/sbc/activedirectory/default.aspx)

![AD_02.png](https://qiita-image-store.s3.amazonaws.com/0/174392/22f3fb04-bac1-ab2e-dfa2-b187fa05f335.png)


#おわりに

調べるほど奥が深いので、今回は本当にざっくりと大枠をまとめてみました。

管理する側される側、会社にとってもメリットが大きいActiveDirectory。
導入されている企業は多くあるかと思いますが、これからもどんどん需要が高まっていきそうですね。


参考サイト：[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](http://wa3.i-3-i.info/word12420.html)
このサイトに出てくるゆるーいキャラクターの顔が地味に癒されますw
[Vagrant] vagrant up 時に常に実行される provison を設定する

通常、Vagrantfileのprovisionは初回の `vagrant up` 時にのみ実行されるが、毎回実行したい場合があるので方法メモ

# TL;DR

結論としては `run: "always"` をprovisonの設定に追加すれば良いです。

# 設定例

たとえば、起動後にconfluenceの実行スクリプトを叩いてほしい場合。

```rb:Vagrantfile
  config.vm.provision "shell",
    run: "always",
    inline: "/home/vagrant/atlassian/confluence/bin/start-confluence.sh"
```

# 関連

[[Vagrant][Linux] ネットワークのデフォルトゲートウェイの設定 - Qiita](http://qiita.com/koara-local/items/d1e2092d5c5fc6d1739f)

# 参考
[Basic Usage - Provisioning - Vagrant by HashiCorp](https://www.vagrantup.com/docs/provisioning/basic_usage.html#run-once-or-always)
単気筒エンジンのシュミレーション

#概要
liquidfunで、単気筒エンジンのシュミレーションやってみた。

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/Y/5/H/Y5Hd.jpg?t=1491445862)
#成果物
http://jsdo.it/ohisama1/Y5Hd
Windows10 Creators Updateを試す


## ダウンロード

https://www.microsoft.com/ja-jp/software-download/windows10

![image](https://qiita-image-store.s3.amazonaws.com/0/97156/819168ac-fcae-9b2f-0e61-cd9e75bf4ff0.png)
から「今すぐアップデート」を選択。


## ダウンロードしたファイルを実行

![image](https://qiita-image-store.s3.amazonaws.com/0/97156/86c6efc1-ac62-7016-dbba-2c87cc4bd8c8.png)


更新を実行するとダウンロードが開始されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/97156/98a7de9c-4a19-9207-028f-d76d69e0f834.png)

ダウンロード中は他の作業ができるらしい。



終わったら再起動して待つ。
おおよそ1時間くらいでアップデート完了。


![image](https://qiita-image-store.s3.amazonaws.com/0/97156/19814aff-ecaf-86a6-b348-b67c2fa23cb8.png)

ここまできたら完成！！！



## 新機能を試そう

### Paint 3D

ペイントを開くと右上に「ペイント3Dを開く」の文字が。

![image](https://qiita-image-store.s3.amazonaws.com/0/97156/3618bb60-1f68-e3dc-e3d2-c0fc3f4a62d5.png)

開いてみると・・・


こんなんのが出てきた
（適当にオブジェクトを配置しています。）

![image](https://qiita-image-store.s3.amazonaws.com/0/97156/ba62b6a2-f0ef-46b7-1e4c-952c4636236f.png)

割と軽快に動くように見える。
モデリングツールのように見えて、
あくまでも画像を出力するようなので、これで3Dプリンタ用のSTLを作るとかの用途にはできないようです。



### Edge の強化

![image](https://qiita-image-store.s3.amazonaws.com/0/97156/522cccd1-7894-5daa-c61b-0c1bdf282195.png)

とりあえずタブの画像化が楽しい。
ただ重い気がする。気がするだけかもしれない。


### 高DPI対応

プロパティ -> 互換性から設定できるようです。

![image](https://qiita-image-store.s3.amazonaws.com/0/97156/a986d7c1-7a0c-eaba-7db7-b279e795719c.png)

試してみたけど違いが分からん。24inch WQHDではダメらしい。
4Kクラスじゃないと違いが見えないみたいですね。


## その他気づいたところ

#### 半角/全角を押したときの挙動

画面に大きく「A」か「あ」が表示されるようになった。
タブレットを意識したのかな。


他にもいろいろあるらしいですが、
パッと見わからなったのであとは別の機会に。
常駐アプリについて

Linux版MindでWebアプリケーションを作成しようと考えています。
提供のライブラリcgilibで文字コードEUCであれば一通りのものが作成できそうです。
今はUTF8での表示に対応したいので、srclibディレクトリにある文字コード変換関係のライブラリが使えそうです。

質問があるのですが、Linux版Mindでいわゆる常駐アプリケションのようなものは作成できるでしょうか。
Mindの長所は文字列操作が得意です。しかしながら大きな辞書を抱え込むプログラムを作成すると起動時に
ファイルを毎回読み出すのに時間がかかってしまいます。またアクセス数が増えプログラムが多くロードされると
メモリを圧迫します。

そこで辞書検索するようなプログラムを一度だけロードし常駐することで各種サービスを提供できるようにしたいのです。
前のWindows版にはあったような気もしますが記憶違いかもしれません。

よろしくお願いします。

Mind三昧
fitガールのネットワーク基礎知識　〜コンピュータとネットワークの歴史〜

#はじめに
こんにちは:rose::sparkles::sparkles:
筋トレを始めてから４.5年経ち、お腹と背中に縦線が入り、絶好調な感じです:thumbsup::laughing::laughing:


今回は、TCP/IPの重要性を理解するために、コンピュータの発達とネットワークの関わりの歴史についてです。



##バッチ処理(1950年代）
バッチ処理とは、処理するプログラムやデータなどを、まとめて一括で処理する方式。
プログラムやデータをカードやテープに記録して、それを順にコンピュータに読み込ませて一括処理:bangbang:


###タイムシェアリングシステム【TSS】(1960年代)
TSSは、１台のコンピュータに複数の端末を接続し、複数のユーザーが同時にコンピュータを利用できるようにした:raised_hands::sparkles:
TSSの登場によって、*インタラクティブな操作ができるようになった:bangbang::bangbang:


*インタラクティブ:人間が指示を与えるたびにコンピュータが処理をし結果が返ってくること

1965年、BASICというプログラミング言語が、アメリカのダートマス大学のケメニーとクルツによって開発された。


####コンピュータ間通信の時代(1970年代)

コンピュータの性能が向上し、小型化、価格も安くなった時代。
これまで、コンピュータから別のコンピュータにデータを移したい場合、*外部記録媒体にデータを保存し、それを輸送しなければいけなかった・・・。とてもめんどくさい:unamused::unamused:

しかし、コンピュータ間を通信回路で接続するだけでデータを瞬時にやり取りできるようになった為、輸送する手間などがなくなったのだ:kissing_closed_eyes:

*外部記録媒体：情報を記録してコンピュータからはずせるもの。当時は、磁気テープやフロッピーディスク。現在では、CD/DVDやUSB





#####コンピュータネットワークの時代(1980年代)
スーパーコンピュータや大型コンピュータ、小型のパーソナルコンピュータなど、いろいろな種類のコンピュータを相互に接続できるコンピュータネットワークが登場:bangbang::bangbang::bangbang:

Window Systemというコンピュータ画面上で複数の窓を開くことができるシステムが開発された。


######インターネットの普及(1990年代）
ダウンサイジング:サイズを小さくすること。

マルチベンダ:ベンダは機器メーカーやソフトウェアメーカーのこと。いろいろなメーカーの効きやソフトウェアを組み合わせ、ネットワークを構成する場合のことを指す。


この2つの言葉が流行した。

E-mailの利用と、WWW(World Wide Web)による情報発信ブームが起こり、企業や一般家庭にインターネットが普及した。
Excel > 日時文字列からシリアル値を取得する > すでに変換済ということを教えていただきました

```txt:動作環境
Excel 2013 on Windows 8.1 pro (64bit)
```

`2017/4/5  11:50:00`のようなテキスト文字列から[シリアル値](http://exinfo.biz/lec/lec_serial.shtml)を取得したい。

参考: https://oshiete.goo.ne.jp/qa/1639838.html

A2セルのテキスト値を変更するには、以下のようにした。

=DATE(YEAR(A2),MONTH(A2),DAY(A2)) + TIME(HOUR(A2), MINUTE(A2), SECOND(A2))

他の関数を組合せてもっとシンプルに書けるかもしれない。

### 教えていただいた事項

@nukie_53 さんの[コメント](http://qiita.com/7of9/items/3649402e2ef526c6cad3#comment-afc57326689559a7f972)において日時文字列がシリアル値に変換されていることを教えていただきました。

情報感謝です。

確認しましたところ、確かにそうなっており、変換処理をせずともその列を用いて時系列データを作成できました。
Railsのtext_areaのサイズを指定する。

以下のようにサイズ属性を記述する。

```_form.html.erb
<div class="field">
<%= f.label :仕事内容 %> + 入力例を表示する
<%= f.text_area :job_description, size: "20x10", class: "form-control" %>
</div>
```
curlを便利に使う為の.curlrcの雛型

curlを使う際に毎回同じ設定があったり、curlをベースにしたスクリプトの設定をしたりするのに使う、.curlrcですが、なかなか使える解説が無かったので、自分用に覚え書き

よく買う設定だけ入れているので、全部の項目があるわけではありません。他にも設定をする項目はあります。
多くのLinux/unixだと~/.curlrcか/etc/curlrcに書いて使えばいいかと思います。
また、Windows環境では.curlrcではなく_curlrcを使います。
探索場所は、環境変数CURL_HOME→HOME、なければcurl.exeがあるパスの順にコマンドラインで `curl -K curlrc.txt` のように明示的に指定するのも手です(2019/01/15 追記)

```~/.curlrc
# HTTP-Version

http1.0
#http1.1
#http2

# IPv4/IPv6のどちらを逆引きに使うか

ipv4
#ipv6

# User-Agentの設定

##MS-Edge
#user-agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299"
##Chrome
#user-agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"
#IE11
#user-agent = "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
#Firefox
user-agent = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0"

# Referer (リファラ)の設定

referer = ";auto"

# .netrc を読み込むかどうか

#netrc
#netrc-optional


# サーバーの認証をどうするか

#anyauth

# !!! remote-time dosn't work with ftp upload from stdin !!! : use -R switch for downloading

#remote-time
remote-name-all
create-dirs

# Don't show/download error document - only error code

#fail

# Append to target file when uploading (F/SFTP)

#append

# Use HTTP Basic Authentication

#basic

# Maximum time allowed for connection (seconds)

connect-timeout = 300
speed-time      = 120
speed-limit     = 9000000

# Retry only within this period

retry           = 4
retry-delay     = 5
retry-max-time  = 10

# Convert LF to CRLF in upload

#crlf

# Make the operation more talkative

#verbose
#silent
#show-error

# FTP setup

ftp-create-dirs
ftp-ssl
ftp-pasv
ftp-method = nocwd

# Proxy

#proxy-user = "(ユーザ名):(パスワード)"
#proxy = "http://proxy.xxx.co.jp:(ポート)"

# SSL 証明書

# 古かったりするとError (35)の原因になる
# curl http://curl.haxx.se/ca/cacert.pem -o /usr/ssl/certs/ca-bundle.crt
# で最新にしておくと吉
cacert = /usr/ssl/certs/ca-bundle.crt
capath = /usr/ssl/certs/

# SSLの操作を無視する場合
#insecure
tlsv1
#tlsv1.0
#tlsv1.1
#tlsv1.2
#sslv2
#sslv3

# SSL ciphers to use

#ciphers = PFE

## cookie
cookie-jar = /tmp/.curl_cookies
cookie = /tmp/.curl_cookies
```

コメントインしたり、コメントアウトしたりして使ってやってください。
GCEのf1-microインスタンスを真にタダで使う方法

2017年3月にGoogle Cloud Platform (GCP) の価格改定があり、無料枠 （Always Free Products）も強化されました。その中でも、Google Compute Engine (GCE) の無料化が個人的には一番ビックリしました。無料の対象はUSリージョンのf1-microインスタンス1個だけですが、ずっと無料でインスタンスを提供する、というのは他のクラウド事業者と比べても大盤振る舞いと言えるのではないでしょうか。

## 無料のはずのGCEでなぜか課金されているのに気づいた

そんなわけで筆者はus-westリージョンにf1-microインスタンスを立ててみました。SSHログインしてシェル上でコマンド操作をする程度であればネットワークレイテンシはそれほど気になりません。また、HDDも30GB使えますので、ちょっとした確認・実験用環境としては十分実用的です。

この環境が無料で使えるのは助かるなぁ、と思っていたのですが、数日後にGCPのWebコンソールを確認してみると下記のように料金が発生していることに気づきました。

![billing.png](https://qiita-image-store.s3.amazonaws.com/0/46856/ff87a6cc-4f2f-d23e-19f0-d3ce595b366b.png)

実はGCEのインターネット外向き通信の料金は次のようになっています。

|送信先|単価|無料枠|
|---|---|---|
|中国|$0.23/GB|なし|
|オーストラリア|$0.19/GB|なし|
|それ以外|$0.12/GB|1GB|

USから中国・オーストラリア以外への外向き通信には1GBの無料枠があるのですが、中国・オーストラリア宛の外向き通信は1バイト目から料金が発生することになります。上の画像は中国への外向き通信が0.02円（約1MB）発生したことを示しています。

## 課金の原因はなんとSSH総当たり攻撃

しかし、今回のインスタンスはWebサーバやその他のサービスを動かしているわけではありません。このマシンで唯一listenしているポートはSSHの22番ポートで、それ以外のポートはGCEのファイアウォール機能でパケットフィルタリングされています。

つまり、課金の原因となった通信は攻撃者によるSSHログイン試行以外に考えられません。実際、ログを確認してみると世界中からのSSHログイン失敗のログが残されていました。

## 課金を防ぐには

自分のせいじゃないのに課金されるなんてひどい！とも思いましたが、GCP全体としても攻撃者によるネットワークトラフィックにお金を払っているわけですから、GCPの課金体系は十分理解できます。

とはいえ、自分に何のメリットもない攻撃のせいで課金されるのは悔しいですよね。そこで我々にできることはネットワークトラフィックを減らすことです。攻撃者からの通信に対して何のパケットも返さなければ完全に0円です（補足：GCEのインターネット内向き通信は無料です）。

これをほぼ完璧に実現する方法がポートノッキングです。攻撃者がポートノッキングのルールを知らない限り1パケットも返事をせず、それでいてルールを知っていれば普通にSSH通信できるので、今回の条件に非常に合っています。詳細な設定方法などは次の記事で紹介しています。

- [ポートノッキングで10秒間だけsshdを公開する設定 \- hnwの日記](http://d.hatena.ne.jp/hnw/20170327)

実際、筆者はこの設定をしてから「Network Internet Egress」（外向き通信）で全く課金されていません。セキュリティ以外の目的でポートノッキングが使えるよ、というのは少し面白い発見のような気がします。

これ以外の方法でも、攻撃者に1パケットも返さない方法であれば目的は達成できるはずです。

## そもそも頑張って0.00円にする必要性があるのか

今回、課金を防ぐためにネットワークトラフィックを減らしてみたわけですが、実際のところそこまで頑張る意味はほとんどないと思います。攻撃が原因のネットワークトラフィックは1日に1MB程度のようですから、1ヶ月続いたとしても0.6円程度です。攻撃が激化したとしても金額面ではたかが知れています。

また、筆者は先月分で0.05円ほど課金されている認識でしたが、いまのところ請求は来ていません。1円未満の端数はGoogleさんが負担してくれるのかもしれませんね。だとしたら、特に対策をしなくても結局タダなのかもしれません。

## まとめ

- 2017年3月からGCEのf1-microインスタンス1個が原則無料になりました（USリージョンのみ）
- ただし、中国・オーストラリア宛のインターネット下り通信だけは無料枠がありません
    - 1パケットも返さないように設定できれば完全無料が達成できます
    - 特に対策しなくても1円も請求が来ないかもしれません
Goのテストを並列で実行する

## はしがき

テストもコードベースが巨大になってくると、
時間が掛かるので並列処理したいヨネーって要望とか。
並列処理のベンチマークどないしよか的な事を
まとめてみました。

**CIで並列実行してもらえばよくね?**

とか言われると、そうですね感溢れるかもですが :P
最近、testの事ばかり調べてたので、メモがてら。

## テストの並列実行

`testing.T.Parallel()` を呼び出したテストは並列に実行されます。
`go test -parallel n(並列数)`で指定すれば並列で実行してくれます。

試してみましょう。

```
package main

import (
	"testing"
	"time"
)

// 10秒かかるテスト
func Test10sSleep(t *testing.T) {
	t.Parallel()
	time.Sleep(10 * time.Second)
}

// 20秒かかるテスト
func Test20sSleep(t *testing.T) {
	t.Parallel()
	time.Sleep(20 * time.Second)
}

// 30秒かかるテスト
func Test30sSleep(t *testing.T) {
	t.Parallel()
	time.Sleep(30 * time.Second)
}
```

* 通常実行

```
$ go test ./...
ok  	playground_/paralleltest	60.855s
```

* 3並列

```
$ go test ./... -parallel 3
ok  	playground_/paralleltest	30.025s
```

並列テストの恩恵を受けてますね :)

## 注意点

並列処理なので、testAが走っている最中にtestBが走って相互に影響してコケたりします。
折角並列実行しても、` 成功するときもあれば失敗しちゃうよお ふぇぇぇぇ... ` 
ってなってしまいます。
他のテストに影響を出すような物(例えばDB周りとか）はmock化するか、
並列実行を避けたほうが無難かなと。

## テストしたい関数の並列実行時のベンチマークについて

` testing.B.RunParallel ` が使えます。
` SetParallelism(n int) ` で ` 設定値*GOMAXPROCS ` を反映する事できます。

* `p.go`

```
package main

import "time"

// 3秒止める処理
func DoAnyThing() {
	time.Sleep(3 * time.Second)
}
```

* ` p_test.go `

```
package main

import "testing"

func BenchmarkSingle(b *testing.B) {
	for i := 0; i < b.N; i++ {
		DoAnyThing()
	}
}

func BenchmarkParallel(b *testing.B) {
	b.SetParallelism(5) // 私の実行環境の場合、GOMAXPROCS=4なので20並列
	b.ResetTimer()
	b.RunParallel(func(pb *testing.PB) {
		for pb.Next() { 
			DoAnyThing()
		}
	})
}
```


* 結果

```
$ go test -bench . -benchmem -benchtime 30s -v
testing: warning: no tests to run
PASS
BenchmarkSingle-4  	      10	3001148727 ns/op	      64 B/op	       1 allocs/op
BenchmarkParallel-4	     200	 150105216 ns/op	     108 B/op	       1 allocs/op

```

20倍実行できてますね :)
GOMAXPROCは ` runtime.GOMAXPROCS(0) ` で取得できます。

## 参考

* [testing](https://golang.org/pkg/testing/)
* [runtime](https://golang.org/pkg/runtime/#GOMAXPROCS)
ridgepoleにおけるintとbigintでのlimitの違い

### 結論

- intではmysqlの型が変わる
  - ただし有効はものは1から5まで
- bigintではlimitは意味を持たない

### 詳細

schemaファイル

```
create_table :limit_schema do |t|
  t.integer     :int_limit_1,        limit: 1, null: false, default: 0
  t.integer     :int_limit_2,        limit: 2, null: false, default: 0
  t.integer     :int_limit_3,        limit: 3, null: false, default: 0
  t.integer     :int_limit_4,        limit: 4, null: false, default: 0
  t.integer     :int_limit_5,        limit: 5, null: false, default: 0
  t.integer     :int_limit_6,        limit: 6, null: false, default: 0
  t.integer     :int_limit_7,        limit: 7, null: false, default: 0
  t.integer     :int_limit_8,        limit: 8, null: false, default: 0
  t.bigint      :bigint_limit_1,     limit: 1, null: false, default: 0
  t.bigint      :bigint_limit_2,     limit: 2, null: false, default: 0
  t.bigint      :bigint_limit_3,     limit: 3, null: false, default: 0
  t.bigint      :bigint_limit_4,     limit: 4, null: false, default: 0
  t.bigint      :bigint_limit_5,     limit: 5, null: false, default: 0
  t.bigint      :bigint_limit_6,     limit: 6, null: false, default: 0
  t.bigint      :bigint_limit_7,     limit: 7, null: false, default: 0
  t.bigint      :bigint_limit_8,     limit: 8, null: false, default: 0
end
```

limitの値を変えていくとintの型が変わる

```
  `int_limit_1` tinyint(4) NOT NULL DEFAULT '0',
  `int_limit_2` smallint(6) NOT NULL DEFAULT '0',
  `int_limit_3` mediumint(9) NOT NULL DEFAULT '0',
  `int_limit_4` int(11) NOT NULL DEFAULT '0',
  `int_limit_5` bigint(20) NOT NULL DEFAULT '0',
  `int_limit_6` bigint(20) NOT NULL DEFAULT '0',
  `int_limit_7` bigint(20) NOT NULL DEFAULT '0',
  `int_limit_8` bigint(20) NOT NULL DEFAULT '0',
  `bigint_limit_1` bigint(20) NOT NULL DEFAULT '0',
  `bigint_limit_2` bigint(20) NOT NULL DEFAULT '0',
  `bigint_limit_3` bigint(20) NOT NULL DEFAULT '0',
  `bigint_limit_4` bigint(20) NOT NULL DEFAULT '0',
  `bigint_limit_5` bigint(20) NOT NULL DEFAULT '0',
  `bigint_limit_6` bigint(20) NOT NULL DEFAULT '0',
  `bigint_limit_7` bigint(20) NOT NULL DEFAULT '0',
  `bigint_limit_8` bigint(20) NOT NULL DEFAULT '0',
```

- intはlimitによって型が変わる
  - `limit: 1`: tinyint
  - `limit: 2`: smallint
  - `limit: 3`: mediumint
  - `limit: 4`: int
  - `limit: 5`: bigint
- bigintに関してはlimitは必要ない

ちなみにmysql5.6でのストレージ要件

> TINYINT	1 バイト
> SMALLINT	2 バイト
> MEDIUMINT	3 バイト
> INT、INTEGER	4 バイト
> BIGINT	8 バイト

## 参考リンク

http://qiita.com/Yinaura/items/cede8324d08993d2065c
https://dev.mysql.com/doc/refman/5.6/ja/storage-requirements.html
Swift3でJSONパースを行う

# Swift3でJSONパースを行う

## 今回の目標
JSON文字列のパースを行います

色々と便利なライブラリ(SwiftyJson等)があるそうですが、今回はApple標準フレームワークの```Foundation```に含まれており特別な設定等なく使用できる```JSONSerialization```を使用してJSONパースを行ってみます。

## 開発環境
Xcode：8.2.1
言語：Swift 3
OS：MacOS

## 手順
1. パースするJSONの形式を確認
2. JSONパースする


### 1. パースするJSONの形式を確認
今回パースするJSONは下記を想定します

```json:personalData.json
[
 {
  "id":"1",
  "content":{
    "name":"suzuki",
    "age":25}
 },
 {
  "id":"2",
  "content":{
    "name":"sato",
    "age":20}
 }
]
```

ここで形式を確認しておくのは、JSONを取り出す際に正しい型にキャストを行う必要があるためです。
今回はトップレベルが配列([])で、その下が辞書({})型になっています。

### 2. JSONパースする

```JSONSerialization``` を使用してJSONパースを行なったあと、キャストを繰り返して値を取り出しています

```swift:jsonParseTest.swift
import Foundation

// JSONデータを作成
let jsonString: String = "[{\"id\":\"1\", \"content\": {\"name\":\"suzuki\",\"age\":25}},{\"id\":\"2\", \"content\": {\"name\":\"sato\",\"age\":20}}]"
var personalData: Data =  jsonString.data(using: String.Encoding.utf8)!

// ここから本題
do {
    let json = try JSONSerialization.jsonObject(with: personalData, options: JSONSerialization.ReadingOptions.allowFragments) // JSONパース。optionsは型推論可(".allowFragmets"等)
    let top = json as! NSArray // トップレベルが配列
    for roop in top {
        let next = roop as! NSDictionary
        print(next["id"] as! String) // 1, 2 が表示

        let content = next["content"] as! NSDictionary
        print(content["age"] as! Int) // 25, 20 が表示
    }
} catch {
    print(error) // パースに失敗したときにエラーを表示
}
```
Cognos Analytics 11.0.6 新機能 - ダッシュボード

##概要
Cognos Analytics 11.0.6のダッシュボード機能の紹介動画がこちらにUPされています。
https://www.youtube.com/watch?v=SMJAJ3SNiGk&t=4s

別のこちらの投稿で概要を説明していましたが、動画を見てそれ以上に説明されていた事を投稿します。
**Cognos Analytics 11.0.6 新機能一覧**
http://qiita.com/shinyama/items/5f8a04138472c1e5f1dc

##OLAPデータソースのサポート
OLAPデータソースがサポートされ、画面のように、ディメンション、階層、レベル、メジャーがツリーに表示されます。
図は、特定のレベルとメジャーを選択肢「Add」ボタンをクリックするだけで、棒グラフが作成された説明です。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/f7cd2eb8-5cfb-cdac-b770-d4d97ae3e69f.png)

バーをクリックすると、5個のアイコンが表示されますが、右端から、ナビゲーション、ドリルダウン、戻る、のアイコンとなります。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/d0fbfeb0-d9b5-3087-1a87-1c12bae1c026.png)

ナビゲーションを行うと、Produce LineのレベルからProduct Type階層を飛ばして、2つ下の階層のProductに飛ぶ事など、自由な遷移が可能です。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/e5633b78-4be9-ffca-ed88-6ec4fcb31af1.png)

##ダッシュボード内コンテンツの相互作用範囲のグループ化
コンテンツをクリックした時に、相互作用する範囲をグループ化できます。
オブジェクトをクリックすると、3つのアイコンが表示され、新規のコネクション作成、コネクションの削除、コネクションの変更ができます。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/e7690adb-abc0-ac22-bf7f-63764e2f6c40.png)

##グリッドの改良
グリッドのパフォーマンスが改善されました。
グリッドには、緑色の集計行がデフォルトで表示されますが、
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/7ece4090-be98-9203-957d-0a926883d9ba.png)

グリッドをクリックして表示される、このアイコンをクリックすると瞬時に集計行の表示の有無が切り替わります。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/ac156fbe-18e9-c8e6-5a21-2c0c0e123551.png)

グリッドの列タイトルをクリックし、集計規則を変更する事も可能です。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/ccbff2c9-21d6-9c0f-aac5-3cf0472b3aee.png)

グリッド内の文字の大きさは、グリッドのサイズに合わせて自動的に変更されるようになりました。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/05f3c78a-3e25-9cfd-7795-5fdf1078edee.png)

##キーボード ショートカット
キーボードのショートカットが使えるようになりました。
Ctrl + S :保存
Ctrl + Z :Undo
Ctrl + Y :Redo
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/c9ff2a45-3c75-7dc8-696b-64b6bbca29e7.png)

##積み上げ棒グラフでのソート
図のような積み上げ棒グラフで、Valueを選択しソートを変更すると、
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/67ea393e-9aa9-b522-05ba-92bf6ddaec8c.png)

積み上げ後の合計値を元にソートがされます。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/77cdc962-2db1-b77d-4ee9-657c666af3b0.png)

##自動サイズ調整するテキスト
テキストで「Auto-size」というオブジェクトを置くと、
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/f8e3b9e8-862d-14f0-2dd6-a813ceb06234.png)

テキストのフォントサイズが、コンテナーのサイズ、ブラウザのサイズ、ディスプレイの解像度を元に、自動調整されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/46b34002-f354-58a4-0d00-adf06bcc5677.png)
openFrameworksで日本語の文字化けを直す


# 1. 概要

Project Generatorでアップデートすると日本語が文字化けしてしまいますよね。
そんなときに元に戻す方法です。

![スクリーンショット_2017-04-06_10_43_24.png](https://qiita-image-store.s3.amazonaws.com/0/94069/70c2d063-3d53-cb45-5d76-e4bc7054c88b.png "スクリーンショット_2017-04-06_10_43_24.png")

# 2. 環境
* Xcode 8.3
* openFrameworks v0.9.8

# 3. 手順

## 3.1 右側のText Setting欄のText Encodingを押す

![スクリーンショット_2017-04-06_10_43_24.png](https://qiita-image-store.s3.amazonaws.com/0/94069/14af26fc-5d4c-778d-0743-57763f69850d.png "スクリーンショット_2017-04-06_10_43_24.png")

## 3.2 Unicode (UTF-8)を選択する

![スクリーンショット_2017-04-06_10_43_33.png](https://qiita-image-store.s3.amazonaws.com/0/94069/809198e5-6641-2e1f-49f3-8e765ab22170.png "スクリーンショット_2017-04-06_10_43_33.png")

## 3.3 ポップアップウィンドウでReinterpretを押す

![スクリーンショット_2017-04-06_10_43_36.png](https://qiita-image-store.s3.amazonaws.com/0/94069/9b56b443-48a3-2457-159a-96a812be701d.png "スクリーンショット_2017-04-06_10_43_36.png")

## 3.4 元通り！

![スクリーンショット_2017-04-06_10_43_41.png](https://qiita-image-store.s3.amazonaws.com/0/94069/3ce8c643-ee73-e9e9-6e96-1f8e9cbe2a96.png "スクリーンショット_2017-04-06_10_43_41.png")

プロジェクトジェネレータを使うたびにやるのは面倒ですけどね…。
Carto Builderを試す

# Carto とは

[Carto](https://carto.com/)はWebベースのGISサービスで、そのBIツール的な扱いやすいインターフェイスと優れたパフォーマンスで人気があります。スペインのスタートアップが開発しますが、MapboxやArcGISなどと並び称されるほどのメジャーな存在になっているようです。
簡易なジオロケーションマッピングや分析結果のビューアーとして十二分な機能を備えており、無料プランでもそこそこの実用性を発揮します。

## Cartoを使うわけ

BIツールの地図機能でも十分なケースは多いのですが、複数レイヤーはPower BI（１つだけ）やTableau（２つまで）でも扱えず、分析が行き詰まることがよくあります。無償プランではこれまでCarto Basicと呼ばれるビュアーが使われておりましたが、プレビューでCarto Builderというものが開発中でした。

トライアルで使っていましたが、近々正式リリースになり、全面移行するようです。Builderの魅力をまとめておきます。

## Carto Builder

Carto BuilderはCartoの地図ビュアー／BIツールの新盤であり、非常に多機能な分析機能、可視化機能を特徴としています。[昨年2016年7月に発表されました](https://carto.com/blog/welcome-to-carto-builder)。

![image](https://qiita-image-store.s3.amazonaws.com/0/146939/36690976-e968-f68e-8320-6e21489f7be8.png)


Carto Basicでは、データの整形、ジオポイントのマッピング、ヒートマップなどの要約可視化、JSONベースのポリゴン表示、レイヤー処理など極基本的なGIS処理が可能でした。通常の集計処理のレポーティングなどではこれで十分でしたが、地図上での解析が必要な場合は、やや物足りない感じでした。

Carto Builderでは主に地理的分析について、大幅に拡張されて、どのようなユースケースでも一通りの作業をこなすことができるようになりました。

![image](https://qiita-image-store.s3.amazonaws.com/0/146939/feb79c60-0a4f-1bf1-bcb9-675b774240ba.png)


## GeoReference
これは、単純にテーブルデータの空間座標を特定するための機能です。テーブルから緯度、経度や地名などのカラムを指定することでマッピングがスタートできます。
![image](https://qiita-image-store.s3.amazonaws.com/0/146939/90ae0ee8-6920-9f96-b087-4a31343f272a.png)
ヒートマップについては特に分析をしなくても出せます。
![image](https://qiita-image-store.s3.amazonaws.com/0/146939/c2b301ac-7f63-f84c-750f-5a2c541cf028.png)

## Create Area of Influence
いわゆるバッファ処理です。商圏解析や近傍処理を容易なインターフェイスで実現可能です。名前が"Buffer"などと専門用語でなく、一般的な名称になっているのが親切ですね
![image](https://qiita-image-store.s3.amazonaws.com/0/146939/4491e23d-8cd7-3a66-11d9-2e8246e75884.png)

## Intersect second layer
レイヤー間の処理は高度なGISでないとなかなか備わっていないものですが、Builderではこれも簡易なインターフェイスとして提供されており、非常に使いやすいです。

![image](https://qiita-image-store.s3.amazonaws.com/0/146939/288168dd-e237-46cc-5168-8a88d191ff9d.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/146939/9a16edf6-ac96-74b6-d15c-7398a69e4eac.png)



## Join columns from 2nd layer
これもよくある処理ですが、ポリゴン同士の重ね合わせ処理も同じインターフェイスから実施可能です。異なるデータソースからのデータ結合は課題が多いのですが、この機能により用途が広がります。

## Group points into polygons
これもポリゴンがバラバラの点で提供される場合は便利です。影響範囲を結合したい場合はこれを行うほうが楽かもしれません。
![image](https://qiita-image-store.s3.amazonaws.com/0/146939/885c8723-e674-863b-efb2-4748574f0eca.png)

# まとめ
簡単でしたが、Carto Builderの実力の一端を紹介しました。Cartoの魅力がさらに増し、他に類を見ないツールとなってきました。今後もウォッチを続けていきたいと思います。
vagrantのXdebugでEclipseからデバッグする

###前提条件：vagrantの仮想環境にxdebugがインストールされて、phpのiniファイルに正しい記載があること

１：実行構成を選択

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/68914/62d2e7ee-024a-43a3-84c7-a4ccb045c55d.png)

２：サーバを作成する
左のPHP Webアプリケーションを右クリックし、新規を押下
新規構成がでてくるので、クリック
その後、右にある新規を押下
![2.png](https://qiita-image-store.s3.amazonaws.com/0/68914/da4613be-92b7-2e17-d5ea-9e7a77805892.png)

サーバ名はわかりやすくつける
ベースURLはVagrantのIPアドレス（適宜変えます）
※Nignx側でserverNameがあれば、そっちにする（この場合は、hostsの設定もいる）
できたら、次へボタン押下

![3.png](https://qiita-image-store.s3.amazonaws.com/0/68914/27844ae8-70de-30c8-dcaf-6e07c70f81d1.png)

デバッガーはXDebugを選択
ポートはiniファイルに記載した番号を指定する
できたら次へボタン押下

![4.png](https://qiita-image-store.s3.amazonaws.com/0/68914/d54076f5-9bab-3b0d-115c-7f9fcfc84f49.png)

パスマッピングは追加ボタン押下後、
サーバ上のパスにvagrantの同期先
ファイルシステムのパスがローカル側
できたらOKボタンを押下し、
確認できたら完了ボタン押下
※ワークスペースのパスの場合はそちらで。。。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/68914/833061b0-5ea2-15d4-4456-e28ea77ba2de.png)

![6.png](https://qiita-image-store.s3.amazonaws.com/0/68914/52b738b5-0e64-6d08-0b0d-148a5d8d69db.png)

![7.png](https://qiita-image-store.s3.amazonaws.com/0/68914/da7dbd8c-f6c5-a20e-ef78-df1301e1131f.png)

好きな名前をつけたら
サーバータブの記載を行う
PHPサーバはさっきつくったやつを設定する
ファイルは、Eclipseにプロジェクトを作っておかないといけません
URLもファイルのとこと同じにしておきます。
※今回は/public/index.phpが最初の画面と想定します

![8.png](https://qiita-image-store.s3.amazonaws.com/0/68914/c845f6b3-fa3e-2671-0626-3ffbe3c4d60d.png)

共通タブは使いやすいようにしてください！

以上で、動くと思います！
適宜編集します！
webpack-dev-server で他のローカルマシンのブラウザでもライブリロード


webpack で es2015 とか PostCSS とかを使ってフロントエンドを開発するのに webpack-dev-server を使うとオートリロードするのでとてもいい。

でも webpack-dev-server のデフォルトではループバックアドレスになってるっぽいので、0.0.0.0 を設定に入れてあげると他のマシンのブラウザでアクセスできて、一気にいろんなブラウザがオートリロードで確認できて更に便利だなーと思った。

```javascript
...
module.exports = {
   ...
   ...
   devServer: {
      contentBase: 'dist',
      port: 3000,
      host: '0.0.0.0'
   },
   ...
   ...
}
```

特に hot とか inline 設定してないけどライブリロードしてくれてるみたい。
Lambdaにjarをdeployする（その１）

# ソースコードを書く

ソースはAWS Toolkit for Eclipseを導入したEclipseから「New lambda Java Procjet」で作成したS3のイベントを拾うhandlerです。

![make1.png](https://qiita-image-store.s3.amazonaws.com/0/169729/e478a3e5-2370-6d89-f406-cc465c74e71b.png)

実装は何でも良いです。
通例だとHello Worldかhogehogeなので、Hello hogehogeとログに吐きます。

# Jarを作ります

mavenを使っているのでゴールをpackageにしてjarを作ればいいんでしょ？
と、いつもの癖でjarを作ってしまいましたが、間違いです。


AWS Lambda　開発者ガイドの記載を読みましょう

Lambda 関数
　└Lambda 関数のビルド
　　└デプロイパッケージの作成
　　　└デプロイパッケージの作成 (Java)
　　　　└Maven および Eclipse IDE を使用した .jar デプロイパッケージの作成 (Java)

要約すると```
 <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-lambda-java-core</artifactId>
      <version>1.1.0</version>
      <scope>compile</scope>
    </dependency>
```
と```
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
</plugin>
</plugins>
</build>
```
をpom.xmlに追加します。

今回はEclipseから「New lambda Java Procjet」でプロジェクトを作成しているので、aws-lambda-java-coreとaws-lambda-java-eventsが既にdependencyに入っています。

あとはゴールにpackage shade:shadeを入力するとスタンドアロンjarの出来上がり．．．って59MBもありますが？

![make2.png](https://qiita-image-store.s3.amazonaws.com/0/169729/ffedc2bb-6698-98da-e56f-2393b6fce945.png)

何故かと思いpom.xmlを見るとdependencyにaws-java-sdkが入っていることが原因のようです。
これの依存関係階層は、かなり強烈なので巨大なjarが出来るのは当然ですね。

という事で、aws-java-sdkをdependencyから外してスタンドアロンjarを作成した所、7.5MBのjarに落ち着きました。

deployするjarが出来上がったので、次はAWS側の設定です。
windowsでmecabの辞書をnaist-jdicに切り替える

## 目的
mecabに用いる辞書をnaist-jdicへ変更する

##環境
windows7 64bit
Mecabインストール済み
環境変数に~\Mecab\binのパスを通している

##準備
* naist-jdicの辞書を取得する

ダウンロード先 https://ja.osdn.net/projects/naist-jdic/
今回は「naist-jdic (for MeCab) mecab-naist-jdic-0.6.3b-20111013」を選択

* 現在使っているMecabの文字コードを確認する

Mecabが認識する文字コードをコマンド「mecab -D」で確認する
現れた情報のcharsetを確認することで現在認識している文字コードが確認できる


##実施手順
手順は以下の通り
1. naist-jdic辞書を指定の場所に置く
2. mecabrcを変更する
3. コマンドをたたく

### 1. naist-jdic辞書を指定の場所に置く
準備で取得した辞書を
~\Mecab\dic に置く

### 2. mecabrcを変更する
~\Mecab\etc に置いてある「mecabrc」を開き、
>dicdir =  $(rcpath)\..\dic\ipadic

と書いてある場所を
>;dicdir =  $(rcpath)\..\dic\ipadic
>dicdir =  $(rcpath)\..\dic\mecab-naist-jdic-0.6.3b-20111013

と上書きする。

※上書きできない場合は、mecabrcをデスクトップ上などにコピーして上書きし、ファイルを置換すれば可能

### 3. コマンドをたたく
~\Mecab\dic\mecab-naist-jdic-0.6.3b-20111013まで移動し、以下のコマンドを実行

```
mecab-dict-index.exe -f euc -t (確認した文字コード)
```

「-f euc」はnaist-jdicの辞書に使われている文字コード

後は「mecab -D」で辞書情報が変更されたことを確認し、Mecabを動かして実際に文字コードの変更に問題がないか確認する

※追記　```
mecab-dict-index.exe -d mecab-naist-jdic-0.6.3b-20111013 -f euc -t (確認した文字コード)
```のコマンドで辞書が作成できなくなっていた。(2017/06/13)
カレントディレクトリを辞書内に移動する方法で対処した。
最低限のCoreOSのVagrantfile


[本家のファイル](https://github.com/coreos/coreos-vagrant/blob/master/Vagrantfile)を最低限動く程度まで削りました。
synced_folderにnfsを使用しているので、Windowsは[Vagrant WinNFSd](https://github.com/winnfsd/vagrant-winnfsd)をインストールしてください。

```rb:Vagrantfile
# -*- mode: ruby -*-
# # vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.ssh.insert_key = false
  config.vm.box = "coreos-alpha"
  config.vm.box_url = "https://storage.googleapis.com/alpha.release.core-os.net/amd64-usr/current/coreos_production_vagrant.json"

  config.vm.provider :virtualbox do |v|
    v.check_guest_additions = false
    v.functional_vboxsf     = false
    v.memory = 1024
    v.cpus = 1
  end

  if Vagrant.has_plugin?("vagrant-vbguest") then
    config.vbguest.auto_update = false
  end

  config.vm.network :private_network, :ip => "172.17.8.101"

  config.vm.synced_folder "host-side path", "guest-side path", :nfs => true, :mount_options => ["nolock,vers=3,udp"]
end
```

プロビジョニング時にDocker Composeをインストールするならこんな感じでしょうか。

```rb:Vagrantfile
# -*- mode: ruby -*-
# # vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.ssh.insert_key = false
  config.vm.box = "coreos-alpha"
  config.vm.box_url = "https://storage.googleapis.com/alpha.release.core-os.net/amd64-usr/current/coreos_production_vagrant.json"

  config.vm.provider :virtualbox do |v|
    v.check_guest_additions = false
    v.functional_vboxsf     = false
    v.memory = 1024
    v.cpus = 1
  end

  if Vagrant.has_plugin?("vagrant-vbguest") then
    config.vbguest.auto_update = false
  end

  config.vm.network :private_network, :ip => "172.17.8.101"
  
  config.vm.provision :shell, inline: <<-SHELL
    mkdir -p /opt/bin
    curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > /opt/bin/docker-compose
    chmod +x /opt/bin/docker-compose
  SHELL

  config.vm.synced_folder "host-side path", "guest-side path", :nfs => true, :mount_options => ["nolock,vers=3,udp"]
end
```
【PHP】CSRFとは-----対策

##CSRF

####[CSRF定義(WiKi)](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%AA)

クロスサイトリクエストフォージェリ (cross-site request forgeries) は、Webアプリケーションの脆弱性の一つもしくはそれを利用した攻撃。略称はCSRF（シーサーフ (sea-surf) と読まれる事もある）、またはXSRF。リクエスト強要、セッションライディング (session riding) とも呼ばれる。

CSRF脆弱性とは以下のような攻撃（CSRF攻撃）を可能にする脆弱性を指す：
・攻撃者はブラウザなどのユーザ・クライアントを騙し、意図しないリクエスト（たとえばHTTPリクエスト）をWebサーバに送信させる。
・Webアプリケーションがユーザ・クライアントからのリクエストを十分検証しないで受け取るよう設計されている場合、このリクエストを正規のものとして扱ってしまい、被害が発生する。
・CSRF攻撃はURL、画像の読み込み、XMLHttpRequestなどを利用して実行される。

####対策

formのhidden値は暗号学的関数を通しておくという方法を紹介します。

######キーワード
・[openssl_random_pseudo_bytes](http://php.net/manual/ja/function.openssl-random-pseudo-bytes.php)
　　疑似乱数のバイト文字列を生成する
・[bin2hex](http://php.net/manual/ja/function.bin2hex.php)
　　バイナリのデータを16進表現に変換する

######Web送信受信対策

```ruby:送信側.php
//安全安心なトークンを作成(32桁数)
$TOKEN_LENGTH = 16;
$tokenByte = openssl_random_pseudo_bytes($TOKEN_LENGTH);
$csrfToken = bin2hex($tokenByte);

//セッションに設定
$_SESSION['csrfToken'] = $csrfToken;
```

```ruby:送信側.html
//formのhidden値に設定
<input type='hidden' name='csrf' value='{$csrfToken}'>
```

```ruby:受信側.php
if ($_POST['csrfToken'] === $_SESSION['csrfToken']) {
  //正常処理
} else {
  //CSRF攻撃が発生
}
```


*参考：*
・[CSRF定義(WiKi)](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%AA)
・[攻撃の手法・特徴](http://www.trendmicro.co.jp/jp/security-intelligence/threat-solution/csrf/index.html)
・[リクエスト強要（CSRF）対策](https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/301.html)



`---I Love PHP (｡･ω･｡)ﾉ♡`
RubyでMeCabを使う方法と新語辞書NEologd対応


## Mecabってなに？
文章を品詞単位で切ってくれる形態素解析エンジン。↓こんなかんじ

```sh
$ mecab
明日は明日の風が吹く
明日	名詞,副詞可能,*,*,*,*,明日,アシタ,アシタ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
明日	名詞,副詞可能,*,*,*,*,明日,アシタ,アシタ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
風	名詞,一般,*,*,*,*,風,カゼ,カゼ
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
吹く	動詞,自立,*,*,五段・カ行イ音便,基本形,吹く,フク,フク
EOS

```

MeCabと辞書のインストールは[こちら](http://taku910.github.io/mecab/#download)から。。。

## nattoをインストール
MeCabをRubyプログラム内で使えるようにするバインディングが、natto。

まずはインストール。

```sh
gem install natto
```

下のようなプログラムを書くだけでOK。

```rb
# -*- coding: utf-8 -*-

require 'natto'

txt = '明日は明日の風が吹く'

natto = Natto::MeCab.new
natto.parse(txt) do |n|
  puts "#{n.surface}: #{n.feature}"
end
```

実行してみると、、、

```sh
$ ruby natto_test.rb
明日: 名詞,副詞可能,*,*,*,*,明日,アシタ,アシタ
は: 助詞,係助詞,*,*,*,*,は,ハ,ワ
明日: 名詞,副詞可能,*,*,*,*,明日,アシタ,アシタ
の: 助詞,連体化,*,*,*,*,の,ノ,ノ
風: 名詞,一般,*,*,*,*,風,カゼ,カゼ
が: 助詞,格助詞,一般,*,*,*,が,ガ,ガ
吹く: 動詞,自立,*,*,五段・カ行イ音便,基本形,吹く,フク,フク
: BOS/EOS,*,*,*,*,*,*,*,*
```
無事出来ました！

## mecab-ipadic-NEologdとは？
mecabで形態素解析をする場合に用いる辞書です。デフォルトで使われるipadicだとうまく品詞分割できない場合があります。。（↓こんな感じにドラゴンボールもアラレちゃんも分けてしまう。。。）

```sh
$ mecab
ドラゴンボールとアラレちゃん
ドラゴン	名詞,一般,*,*,*,*,ドラゴン,ドラゴン,ドラゴン
ボール	名詞,一般,*,*,*,*,ボール,ボール,ボール
と	助詞,並立助詞,*,*,*,*,と,ト,ト
アラレ	名詞,固有名詞,一般,*,*,*,*
ちゃん	名詞,接尾,人名,*,*,*,ちゃん,チャン,チャン
EOS
```

これをNEologd辞書を使うと、、、

```sh
$ mecab -u /usr/local/lib/mecab/dic/mecab-ipadic-neologd/seed/mecab-user-dict-seed.20170216.dic
ドラゴンボールとアラレちゃん
ドラゴンボール	名詞,固有名詞,一般,*,*,*,DRAGON BALL,ドラゴンボール,ドラゴンボール
と	助詞,並立助詞,*,*,*,*,と,ト,ト
アラレちゃん	名詞,固有名詞,一般,*,*,*,アラレちゃん,アラレチャン,アラレチャン
EOS
```
ちゃんと「ドラゴンボール」と「アラレちゃん」に分けてくれます！

## 使い方
- 1.まずはダウンロード

	```sh
	$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
	```

- 2.次に、辞書ファイルを解凍

	```sh
	$ xz -dkv mecab-ipadic-neologd/seed/mecab-user-dict-seed.20170216.csv.xz
	```

- 3.csvをmecab用の`.dic`形式に変換

	```sh
	$ /usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic -u mecab-user-dict-seed.20170216.dic -f utf-8 -t utf-8 mecab-user-dict-seed.20170216.csv
	```

- 4.実行
	- mecabコマンドの後に-uでdicのパスを指定する場合

	```sh
	$ mecab -u /usr/local/lib/mecab/dic/mecab-ipadic-neologd/seed/mecab-user-dict-seed.20170216.dic
	```

	- mecabの設定ファイルを変更しておく場合
	`/usr/local/etc/mecabrc`に以下を追記

	```sh
	userdic = /usr/local/lib/mecab/dic/mecab-ipadic-neologd/seed/mecab-user-dict-seed.20170216.dic
	```

## お世話になったサイト
[rubyのmecabバインディングnattoを使う](http://qiita.com/k-shogo/items/0f8a98c52913c729c7eb)
[MaCabのユーザー辞書にmecab-ipadic-NEologdを手動で追加する](http://qiita.com/K-1/items/5cb3601341f6fa4fdd95)
mozilla Firefox、Thunderbird 52からのアドオン非動作（XPCOM廃止の影響）の解決策一例

#はじめに
Firefox や Thunderbird 開発元である Mozilla は、XPCOM の（XULも？）廃止を予定しており、バージョン52で [XPCOM の一部は廃止](https://dev.mozilla.jp/2016/12/firefox-52-addon-compatibility/)されました。古くから使用されてきている多数のアドオンが動かなくなったことと思います。
[今後も続々と](https://dev.mozilla.jp/tag/firefox/)廃止になっていくようです（もちろん機能改善もあるのですが）

- [拡張機能のバイナリコンポーネント対応が廃止されます](https://dev.mozilla.jp/2015/05/dropping-support-for-binary-components/) - modest (mozilla developper's site)
- [XULとの決別、XPCOMの廃止はありえるのか？] (http://d.hatena.ne.jp/teramako/20100107/p1) - teramako さん
-  [MozillaはXUL廃止を本当に実行に移すのだろうか](http://d.hatena.ne.jp/Schuzak/20160225) - Schuzak.jp さん
-  [モジラ、アドオン開発の変更計画を発表--XUL／XPCOMを非推奨へ](https://japan.zdnet.com/article/35069294/) - ZDNet Japan

#解決策の例
アドオンがうまく動かなくなった場合は、デバッグコンソール（Ctrl + Shift +J）を開いて、エラーメッセージからヒントを得ることができるでしょう。
##"nsPreferences is not defined."

設定情報（設定エディタで読み書きできる例のもの）の取得・保存に 　chrome://global/content/nsUserSettings.js 内にある nsPreferences を使用しているアドオンがあります。

```js
let alwaysShown = nsPreferences.getBoolPref("extension.myaddon1.alwaysshown", false);

nsPreferences.setIntPref("extension.myaddon1.level", 10);
```

は、バージョン52以降エラーになります。これは、たとえば次のように書き換えることができます。

```js
let prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);

let alwaysShown = false;
if(prefs.getPrefType("extension.myaddon1.alwaysshown") == Components.interfaces.nsIPrefBranch.PREF_BOOL)
{
  alwaysShown = prefs.getBoolPref("extension.myaddon1.alwaysshown");
}

prefs.setIntPref("extension.myaddon1.level", 10);
```

#さいごに
MDN サイトでの多数あるリンク切れが、プロジェクトの綻びをなんとなく感じさせてくれます（ボランティア活動で作られているので贅沢は言えませんが...）
"nsPreferences is not defined" でググると
>「重宝していたアドオン『＊＊＊』が使えなくなってしまいました。。作者さんからのメッセージでは『Firefox52以降のバージョンでは動作しません。すみませんが今後の対応予定はありません。』とありました。諦めるしかないのかもしれませんが、もう業務とどっぷりで、しかも代わりになるアドオンも見つからないのです（泣）<b>寄付してもよいのでどなたか作ってください！！</b>」

といった叫びも見られます。視点を変えてみると、これはチャンスかも！？開発者でないあなたも、ばりばり開発者だけど Firefox アドオン開発には詳しくないあなたも、Firefox や XUL に詳しい開発者をつかまえて、協同して代替の先進的アドオンをリリースしてみてはいかがでしょう？

#参考にした情報
- [prefs.js に設定を保存する・設定を読み込む](https://piro.sakura.ne.jp/xul/tips/x0007.html) - piro さん（[XUL開発情報ページ](https://piro.sakura.ne.jp/xul/doc/)） 
- [nsPreferences -> nsIPrefService への移行](https://github.com/thorikawa/FireMobileSimulator/issues/3) - GitHub thorikawa さん
- [Preferences](https://developer.mozilla.org/en-US/Add-ons/Code_snippets/Preferences) - MDN
- [nslPrefBranch](https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIPrefBranch) - MDN
vagrantとlocalを同期させる方法

#前提: vagrantをinitさせておいてVagrantfileがあること

```vim:Vagrantfile
config.vm.synced_folder "ローカルのパス", "vagrantの同期させたいパス"
↓
EX)
config.vm.synced_folder "C:/git", "/var/www/html"
```

上記を行うと、ローカルにある"C:/git"配下にあるものが、
vagrantにある"/var/www/html"に同期させる。

以下のように、カンマ区切りでオプションの設定もできる。

```vim:Vagrantfile
EX)
config.vm.synced_folder "C:/git", "/var/www/html",
:owner => "nginx",
:group => "nginx",
:mount_options => ['dmode=777', 'fmode=777']
```
travis-ciでecrにpushする

ecrにdocker imageを上げるのを毎回手動でやるのは結構疲れます。ですのでtravis-ciを使って自動化しました。

## .travis.ymlを作成する
まず、[このgist](https://gist.github.com/BretFisher/14cd228f0d7e40dae085)をそのままコピーして.travis.ymlを作成しました。

## awsの環境変数を追加する
ecrにdocker imageをpushするためには `AWS_ACCESS_KEY_ID`と `AWS_SECRET_ACCESS_KEY`が必要です。これをそのまま.travis.ymlに書くのはまずいので暗号化して.travis.ymlに追加します。そのために `travis`gemをインストールします。 `travis`gemをが環境変数の暗号化から.travis.ymlへの追加までうまくやってくれます。便利です。

```sh
$ gem install travis
$ travis encrypt AWS_ACCESS_KEY_ID=AKIxxxxx --add
$ travis encrypt AWS_SECRET_ACCESS_KEY=Apxxxxxxxxx --add
```

これで.travis.ymlに以下のように暗号化された環境変数が追加されました。

```
env:
  global:
    - secure: xxxxx
    - secure: xxxxx
```

参考: https://docs.travis-ci.com/user/encryption-keys/

## masterにマージされた時だけビルドする
このままではfeatureブランチでもpushされると勝手にbuild&pushされてしまって問題なのでmasterブランチにマージされた時のみbuild&pushされるようにします。

travis-ciでは特定ブランチのみで.travis.ymlに書かれたスクリプトを動かすことができるのですが、これを使うと他のテストも走らなくなってしまいます(https://docs.travis-ci.com/user/customizing-the-build) 。これは問題なので別の手段をとります。

CIが走っているブランチは `$TRAVIS_BRANCH`という環境変数に格納されているのでこの値をチェックしてコマンドを実行するようなスクリプトを書きます。

```sh
# script/travis-docker-setup.sh
if [[ "$TRAVIS_BRANCH" == "master" ]]; then
  docker --version
  pip install --user awscli
  export PATH=$PATH:$HOME/.local/bin
  eval $(aws ecr get-login --region ap-northeast-1)
  docker build -t xxx -f Dockerfile.production .
  docker tag grow_turf:latest 12345.dkr.ecr.ap-northeast-1.amazonaws.com/xxx:latest
  docker push 12345.dkr.ecr.ap-northeast-1.amazonaws.com/xxx:latest
fi
```

そして.travis.ymlの `after_success`を以下のようにします。

```sh
# .travis.yml
acter_success:
  - ./script/travis-docker-setup.sh
```

そして最後にsettingsより `Build branch updates`をオンにします。

<img width="947" alt="Screen Shot 2017-04-05 at 16.37.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/131581/4d7c055d-13de-9d7f-93b5-eb39176b8109.png">


これでmasterのみでdocker buildとdocker pushが走るようになります。

参考: http://stackoverflow.com/questions/34591587/travis-conditional-on-branch-after-success

これであとはslack連携なんかすればいい感じになります。

## .travis.yml
最後に、できた.travis.ymlは以下のようになりました。(travis-docker-setup.shは上で書いたやつそのまんまです)

```
sudo: required
language: ruby
services:
- docker
install:
- echo "install nothing!"
script:
- rspec
after_success:
- "./script/docker-setup.sh"
env:
  global:
  - secure: longString
  - secure: longString
```