OmniAICreator/Qiita-1.07M huggingface dataset:
Dockerコンテナ間で双方向通信させる

## まえがき
自社のサービスでマイクロサービスアーキテクチャを基本として設計・開発を行っています。またDockerを用いてインフラをコード化し冪等性を担保し、どこでも同じ環境を再現でき、スケーラブルであるなど様々な恩恵を受けて、インフラもマイクロサービス特性である疎結合で高凝縮性をそのまま実現しています。
今回はちょっと困っていたコンテナ間双方向通信する方法について、解決ができたので共有しようと思いました。

# これを読むとわかること ( TL;DR )
* Dockerコンテナ間で通信する方法
* 特にコンテナ間の双方向通信は`Docker Compose` version2で解決（※）
* `Docker Compose`のVersion 2 が少しわかる(チラッと）

※別の表現をするなら、docker networkを作成してdocker run時に作ったnetworkを`--network`で指定すれば良いです。

# 解決したかったこと

マイクロサービスをベースに作成していくと、例えば、
`決済サービス`と`ユーザーサービス`は別のサービスとしたい場合、コンテナを別々に用意するとします。
お互いのAPIを経由して情報を取得し合いたい場合、この２つのコンテナの双方向通信ができず困ってました。

# なぜ簡単ではなかったか？
（このセクション前の方法を説明しているだけなので、読み飛ばしてOKです。）
あるコンテナに別のコンテナのIPを教える場合、`docker --link`が簡単です。
以下はuserコンテナからpaymentコンテナに接続する場合、名前でIPを引けるようにする`docker-compose.yml`の例です。

```
user:
  image: nginx:1.9-alpine
  ports:
   - "80:80"
  links:
   - payment:payment
payment:
  image: nginx:1.9-alpine
  ports:
   - "8080:80"
```

### ping 

それぞれのコンテナの中からpingを飛ばしてみます。

user => payment ( OK )

```
/ # ping payment
PING payment (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.095 ms
```
payment => user ( NG )

```
/ # ping user
ping: bad address 'user'
```

当然の動きです。userのみにpaymentが見えるように設定している為。

両方にlinkの設定を書けば良いのではないか？と
↓このようなことを試してみますと、

```
user:
  image: nginx:1.9-alpine
  ports:
   - "80:80"
  links:
   - payment:payment
payment:
  image: nginx:1.9-alpine
  ports:
   - "8080:80"
  links:
   - user:user
```

結果 ： 怒られます

```
% docker-compose up -d
ERROR: Circular dependency between payment and user
```

# 解決策：Docker Compose Version2

docker-compose.ymlがこちら。

```
version: '2'
services:
  user:
    image: nginx:1.9-alpine
    ports:
     - "80:80"
  payment:
    image: nginx:1.9-alpine
    ports:
     - "8080:80"
```

linkの設定を削除し、最初の2行だけを追加しているだけです。
これで両方のコンテナから双方向に名前でIPが引けるようになります。

`docker inspect`でコンテナの詳細を見てみると、

(paymentのコンテナの結果の一部）

```
            "Networks": {
                "ver2_default": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "f95e47abaaeb",
                        "user"
                    ],
```

`f95e47abaaeb`というコンテナのIDと、
`user`というサービス名がエイリアスと登録されていてこれらの影響で勝手に名前が引けるようになっているようです。
`ver2_default`というのが、`docker network ls`で確認できますが、docker-compose実行時に勝手に`docker network create`が実行されて作成される`bridge`ネットワークのようです。

```
% docker-compose up -d
Creating network "ver2_default" with the default driver
Recreating ver2_payment_1
Recreating ver2_user_1
% docker network ls
NETWORK ID          NAME                    DRIVER              SCOPE
f5396e5e4ee2        ver2_default            bridge              local
```

さらに興味があれば`docker network inspect [NETWORK ID]`を実行してみると、ネットワークに対してコンテナやそのMacAddressが登録されていることも確認できます。

# まとめ

結局、Version2で記載した場合のDocker Composeの動きを書いただけの内容となってしまいましたが、Docker Engineのv1.10辺りでNetwork部分をより柔軟に進化させたものを勝手にDocker Composeが動作させている印象です。モヤッとしていた問題が解決できそうでスッキリしましたが、あまりコンテナ同士が双方向で通信しだすとコンテナ自体が密結合になってしまいそうで気をつける必要がありそうです。
機械学習レシピ#1

以下のビデオをみた際のメモ書き。
https://www.youtube.com/watch?list=PLOU2XLYxmsIIuiBfYad6rFYQU_jL2ryal&v=cKxRvEZd3Mw

機械学習で使う２つのオープンソースライブラリ

- sckit-learn
- TensorFlow

## りんごとみかんを区別するコードを書く
機械学習を使わないと、手作業のコードを多く書くことになるコード。（オレンジ色のピクセル数をカウントして、緑色のピクセル数と比較するなど。ただしこの方法は白黒写真では使えない。）
また何かマッチしない例がくると、毎回それをコードに反映しなおさないといけない。

規則を把握するアルゴリズムがあるとこれらは回避できる。機械学習ではそのために分類器Classifier（関数）を学習させる。

入力データ　⇒ Classifier　⇒　ラベル
※絵 ⇒ Classifier ⇒ オレンジ
※メール ⇒　Classifier ⇒ SPAM

これらは教師付き学習(Supervised Learning)と呼ばれ、サンプルデータからパターンを見つけて分類機を作成する。

目的：果物の種類を分別する関数を作る
　　　　　　　　果物に関する情報を入力として受取り、特徴量(測定値)に基いて出力として予測する。

## sckit-learnでコード化

- sckit-learnのインストール

```
$ sudo pip install -U numpy
$ sudo pip install -U scipy
$ sudo pip install -U scikit-learn
```

① 学習データを集める

| Weight | Texture | Label |
|:-:|:-:|:-:|
| 150g  | Bumpy  | Orange  |
| 170g  | Bumpy  | Orange  |
| 140g  | Smooth  | Apple  |
| 130g  | Smooth  | Apple  |
これらが分類機に学習してほしいデータ。
学習データが良いと、良い分類器が作成できる。

学習データをコードで用意。
2つの変数”特徴量”と”ラベル”を用意する。特徴量は入力、ラベルは出力。
このとき特徴量のデータ型はStringではなく数値型に変えて、Bumpyは０、Smoothは1とする。またりんごは０、オレンジは１とする。

②　分類機を学習させる
今回は決定木を利用。
分類機は規則の箱
学習アルゴリズムは規則を作る手順（学習データ中のパターンを見つけることで作る）

```
#分類器を作成。この時点ではただの箱。りんごやオレンジのことは知らない。
#学習させるための学習アルゴリズムが必要
clf = tree.DecisionTreeClassifier()
```
sckitでは分類器オブジェクトの中に学習アルゴリズムが含まれていて、Fitと呼ばれる。
Fit = ”データ中のパターンを見つける”

```
clf = clf.fit(features,labels)
```

③ 新しい果物を分類する
分類機へ新しい果物の特徴量(150gでBumpyしている)をインプットする。

```
print clf.predict([[150,0]])
```

出力として1が返ってくるので、オレンジと分類される。

```test.py
from sklearn import tree
features = [[140,1],[130,1],[150,0],[170,0]]
labels = [0,0,1,1]
clf = tree.DecisionTreeClassifier()
clf = clf.fit(features,labels)
print clf.predict([[150,0]])
```
PostgreSQLの接続数について

#接続数の確認

```
SELECT * FROM pg_stat_activity;
```

#同時接続数の設定値の確認

```
SHOW max_connections;
```

#接続の開放

```
SELECT pg_terminate_backend(pid)
  FROM pg_stat_activity
 WHERE datname = 'DB名'
   AND pid <> pg_backend_pid();
```
usrをUSBに移動した覚え書き

タイトルのまんま、そのうち忘れそうだったし。<b>やるなら自己責任で！</b>

```text:Terminal
# e2label /dev/sd** usr
# mv /usr /usrold
# mkdir /usr
# mount LABEL=usr /usr
# cp -p -r /usrold/* /usr
# echo 'LABEL=usr /usr ext4 defaults,relatime 0 0' >>/etc/fstab
```

　最初の1行合ってるか微妙。心配ならGpartedからラベル設定すれば確実（それでできたし）。
　cpに-p付け忘れてsudoが使えなくなったり別のとこでsudoのパーミッションだけ変更しても他のも当然ダメだったりで大変だった。計30回以上やり直したかもしれない。
　最後の1行は教えてもらったのそのままだけど、```UUID=*****```でもいいみたいだし```,relatime```は他のとこには書いてないから必要ないのかな？
　usroldはcp終わった後にsudoとか正常動作すれば消してもいいかな。何かあったときにLiveBootして戻せるようにするなら残しといていいと思うけど多少目的から外れるし。


　emmc16GBのChromebookにLinux入れると(CroutonにしろChrx使ってGalliumOSにしろ）容量心配だったからこういうのやってみた。けどCrouton使った方はUSBとかSDにインストールする方法結構あったし、GalliumOSも結構調べてとりあえず1件だけUSB,SDにインストールする方法見つけたから使わない可能性の方が高い気がする。けどLinuxについてまた少し詳しくなったしそれはそれでいいかな
RuboCopの出力フォーマットをHTMLにする

RuboCopは出力フォーマットとしてHTMLをサポートしています

## <i class='fa fa-flask'></i> サンプル
tbpgr/kosi に対して rubocop を実行してみます。

```sh
$ mkdir -p tmp/rubocop
$ rubocop -f html >! tmp/rubocop/report.html
$ open tmp/rubocop/report.html
```

### <i class='fa fa-chrome'></i> 出力結果
![rubocop_html_report.png](https://qiita-image-store.s3.amazonaws.com/0/43480/e9037730-f8af-c8dc-ffe4-52c24daf0347.png)
yarn てどうなの ?

https://yarnpkg.com/

![yarn.png](https://qiita-image-store.s3.amazonaws.com/0/27516/ba6ab56a-c5e7-3084-98b4-b50549b32978.png)

---

![ultra-fast.png](https://qiita-image-store.s3.amazonaws.com/0/27516/da5b5108-b718-5968-888c-805dc16c0640.png)

---

![mega-secure.png](https://qiita-image-store.s3.amazonaws.com/0/27516/2e5f938a-a299-aab3-45ef-b88832343593.png)

---

![super-reliable.png](https://qiita-image-store.s3.amazonaws.com/0/27516/be91748c-b524-114c-d6f3-43b59c90c7ad.png)

---

Super Reliable
npm の悲劇

```
├─┬ abc@1.0.0
│ ├── def@1.0.0
│ └── ghi@1.0.0
├─┬ jkl@1.1.0
│ ├── abc@2.0.0
```

↑たまになる😇
require/import するものによって実際のバージョンが異なったりする

---

good bye 涙ぐましい努力
![shrinkwrap.png](https://qiita-image-store.s3.amazonaws.com/0/27516/543ddd0b-591b-6fc3-58e9-a37f45268e4a.png)

---

**lockfile でバージョンを固定できる**

![yarn-lockfile.png](https://qiita-image-store.s3.amazonaws.com/0/27516/2dee1475-64f8-e91d-a29b-a1dc3c4ea8e4.png)

---

redux が 2 日前に yarn lockfile を commit
https://github.com/reactjs/redux/commit/7c5d7615dc2c616d9f28d8dbe84e07fdc1bbd1ee
ワークしてそう

---

で、実際どうなのよ ?

---

```sh
$ git clone https://github.com/facebook/react.git .
$ time npm install
# snip
npm install  48.58s user 14.15s system 22% cpu 4:39.09 total
```

```sh
$ rm -rf ~/.yarn-cache
$ yarn
✨Done in 40.38s. 
```

キャッシュが全部のってると **16.43s**

279.09 sec -> 16.43 sec

---

ちっちゃいけどおっきい features

![what-are-you-waiting-for.png](https://qiita-image-store.s3.amazonaws.com/0/27516/ac283f38-d9b6-5bd3-fbb6-b261ab8d6ea2.png)

---

プロダクトでは… ?

https://github.com/yarnpkg/yarn/issues/513
![git-ssh.png](https://qiita-image-store.s3.amazonaws.com/0/27516/02b2a61c-44d3-72d8-def2-25c24ccc0fba.png)

private repo を扱えるように対応が進んでいる😂

---

結論: いけそう
node.js + line notifyを使ってみた

### Line Notifyが出た！
[Line Notifyが出たという記事](http://developers.linecorp.com/blog/ja/?p=3784)

自分宛てとグループチャット宛に送れるようです。
この記事は自動テスト結果を受け取り、
テストが失敗だったらプギャーな画像をLINEに送りつけるというなかなかストイックな内容でした。

### とりあえず普通に呼んでみる

```
curl -X POST -H 'Authorization: Bearer [token]' -F 'message=だが断る' https://notify-api.line.me/api/notify
```

tokenの部分は[ここ](https://notify-bot.line.me/my/)からゲットしたものを使用してください。
これで指定したLINEグループか自分にだが断るというメッセージがLine Notifyから来ます。

だが断る。カッコイイですね。
ちなみに画像を付ける場合は下記のようにすれば送れました。

```
curl -X POST -H 'Authorization: Bearer [token]' -F 'message=だが断る' -F 'imageThumbnail=http://dagakotowaru.png' -F 'imageFullsize=http://dagakotowaru.png' https://notify-api.line.me/api/notify
```

imageThumbnailとimageFullsizeが別URLを指定できるので、
開いてみたら実は違う画像とかもできましたｗ

### node.jsで組み合わせる
node.jsからcurlを呼び出すには下記2つの手段があります。
1. node-libcurlのパッケージを使う
2. 普通にnode.jsからcurlを実行する

node-libcurlはドキュメントが少ないのとレンサバのglibcのバージョンが古くて、
そもそも呼び出せなかったので、2でやりました。
おはようございます！とはてブから適当な記事リンクをツイートする
jsファイルを作っていたので、それを流用してLINE Notifyに投げるようにしました。

フィードから記事を解析とかは飛ばして、curlの実行部分はこんな感じです。
txtという変数にもろもろ入っています。

```
var exec = require('child_process').exec;
        exec("curl -X POST -H 'Authorization: Bearer [token]' -F 'message="+txt+"' https://notify-api.line.me/api/notify",
    function(){}
);
```

```
node line_hotentry.js
```

あとは普通に呼び出すとこんな感じでLINEが来ます。


<img width="320" alt="Slack for iOS Upload-2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/11564/39fbbfbb-785d-8445-7739-dfd52111a086.jpeg">

### 使ってみた感じ
curlで呼び出すだけなので、かんたんですね。スタンプとかも送れるとおもしろいかも。
普段から自分用に画像や天気予報、山手線情報など取得した情報を自分のメールに送っていましたが、
メールって普段使わないしなーと思っていたので、それらすべてLINE Notifyに送れるようになるのがうれしいですね。

以前読んだこの[記事](http://blog.8arrow.org/entry/2016/01/13/183349)で、slackを家族用に・・・とあり、
真似したかったのですがslack導入の敷居が高く諦めてました。
LINEであれば、非エンジニアでもほとんど導入しているので、
家族用にbot導入にはちょうど良さそうですね。
日本全国 Ruby系コミュニティ一覧 β

日本の地域ごとのRubyコミュニティ一覧が見あたらなかったので作ってみました。
（と思ったら https://github.com/ruby-no-kai/official/wiki/RegionalRubyistMeetUp に幾つかありました)
メンテナンスはベストエフォートで！！

|コミュニティ名|地域|URL|
|:---|:--|:--|
|Cherry.rb|大阪、堺筋本町|https://cherryrb.doorkeeper.jp/|
|Coedo.rb|東京、茅場町|https://coedo-rails.doorkeeper.jp/|
|DDD.rb|大阪|https://dddrb.doorkeeper.jp/|
|Fukuoka.rb|福岡|https://fukuokarb.doorkeeper.jp/|
|Ginza.rb|東京、銀座|https://ginzarb.doorkeeper.jp/|
|Hamamatsu.rb|浜松|http://hamamatsu-rb.github.io/|
|Hiroshima.rb|広島|https://github.com/hiroshimarb/hiroshimarb.github.com/wiki|
|Kanazawa.rb|金沢|http://kzrb.org/|
|Kansai.mrb|関西|https://kansaimrb.doorkeeper.jp/|
|Kawasaki.rb|神奈川、川崎|https://kawasakirb.doorkeeper.jp/|
|Kobe.rb|兵庫、神戸|https://koberb.doorkeeper.jp/|
|Kyoto.rb|京都|https://kyotorb.doorkeeper.jp/|
|Matsue.rb|島根、松江|http://matsue.rubyist.net/|
|Medaka.rb|大阪、神戸|https://medakarb.doorkeeper.jp/|
|Mitaka.rb|東京、三鷹|http://groups.google.co.jp/group/mitakarb|
|Niigata.rb|新潟|http://niigata-rb.github.io/|
|Nishinippori.rb|東京、西日暮里|https://nishinipporirb.doorkeeper.jp/|
|Nishishinjuku.rb|東京、西新宿|https://nishishinjuku.doorkeeper.jp/|
|Okinawa.rb|沖縄|http://ruby.okinawa/|
|RailsGirls Fukuoka|福岡|https://railsgirls-fukuoka.doorkeeper.jp/|
|RailsGirlsKobe|兵庫、神戸|http://railsgirls.com|
|RailsGirlsKyoto|京都|https://railsgirls-kyoto.doorkeeper.jp/|
|RailsGirlsNagoya|名古屋|https://railsgirls-nagoya.doorkeeper.jp/|
|Rails勉強会@東京|東京|https://railsmeetingtokyo.doorkeeper.jp/|
|Ruby札幌|北海道、札幌|https://rubysapporo.doorkeeper.jp/|
|Ruby東海|東海地方|https://groups.google.com/forum/#!forum/ruby-tokai|
|Ruby舞鶴|京都、舞鶴|https://ruby-maizuru.doorkeeper.jp/|
|Ruby関西|関西|https://rubykansai.doorkeeper.jp/|
|Ryudai.rb|沖縄|http://lingr.com/room/ryudairb/|
|Ryukyu.rb|沖縄|https://www.facebook.com/groups/ruby.okinawa/|
|Sendagaya.rb|東京、千駄ヶ谷|https://sendagayarb.doorkeeper.jp/|
|Shibuya.rb|東京、渋谷|https://shibuyarb.doorkeeper.jp/|
|Shinjuku.rb|東京、新宿|https://shinjukurb.doorkeeper.jp/|
|Shinosaka.rb|大阪|https://shinosakarb.doorkeeper.jp/|
|TX.rb|千葉|https://f60d71ff61dfbe61b1ce22791b.doorkeeper.jp/|
|Tokushima.rb|徳島|http://tokushimarb.github.io/|
|TokyoRubyistMeetup|東京|https://trbmeetup.doorkeeper.jp/|
|Tokyu.rb|東京、東急沿線|https://tokyurb.doorkeeper.jp/http://qwik.jp/tokyurb/|
|Toyama.rb|富山|https://yokohamarb.doorkeeper.jp/|
|Wakayama.rb|和歌山|https://wakayamarb.doorkeeper.jp/|
|Yokohama.rb|神奈川、横浜|https://yokohamarb.doorkeeper.jp/|
|amagasakirb|兵庫、尼崎|http://kokucheese.com/main/tag/amagasakirb/|
|e-ZUKA Ruby on Rails Group|福岡|http://www.meetup.com/ja-JP/ezuka_rails/|
|guRuby|群馬|https://guruby.doorkeeper.jp/|
|toruby|栃木|https://toruby.doorkeeper.jp/|
|とっとるびー|鳥取|https://55e175322c693255aaedcb298e.doorkeeper.jp/|
|五反田.rb|東京、五反田|http://gotanda-rb.connpass.com/|
|岡山Ruby, Ruby on Rails勉強会|岡山|https://sites.google.com/site/okayamaruby/|
|岡山Rubyコミュニティ|岡山|https://okaruby.doorkeeper.jp/|
|西脇.rb & 神戸.rb|兵庫、西脇～神戸|https://nishiwaki-koberb.doorkeeper.jp/|
Pandasで散布図を書くとき各要素のラベルを表示

# Pandasで散布図を書くときのメモ

Pandasで散布図(scatter)を書く方法は、結構簡単に見つかります。でも、以下のように、各要素にラベルを表示させる方法がなかなか見当たらなかったのでメモしておきます。

![scatter-simple-text.png](https://qiita-image-store.s3.amazonaws.com/0/33180/7849c0d6-33ba-7a18-c30e-b823c2e729eb.png)

Pandasのiterrows()で各行をforで繰り返し、aanotateで描画するまで。

```py3:scatter-label.py
import pandas as pd

# DataFrameにデータをセット
dd = pd.DataFrame([
        [10,50,'hoge'],
        [50,30,'fpp'],
        [20,30,'baa']
    ], columns=['ax','ay','label'])

# 散布図を描画
a = dd.plot.scatter(x='ax',y='ay')
# 各要素にラベルを表示
for k, v in dd.iterrows():
    a.annotate(v[2], xy=(v[0],v[1]), size=15)
```
Ubuntuでデスクトップにhomeのファイルが表示されてしまうときの対処法。

自分用のメモみたいなものです。

Ubuntuの日本語版を使用していると何故か、デフォルトではデスクトップのフォルダ名が「デスクトップ」となっている。
このままだと、ターミナル上でのディレクトリ操作が面倒くさいのでフォルダ名を「desktop」に変更した。
その後再起動したらデスクトップにhomeのファイルが表示されるようになってしまって???となってしまったので、それをもとに戻す方法を記しておきます。

参考にしたのはこちらのサイト
[https://forums.ubuntulinux.jp/viewtopic.php?id=3273](https://forums.ubuntulinux.jp/viewtopic.php?id=3273)

```
1. $HOME/.config/user-dirs.dirsをエディタで開く(要管理者権限)
2. XDG_DESKTOP_DIR="$Home/desktop"と変更する。
（名前変更してパスが異なるとこの部分が"$Home/"になってしまうらしい）
3. 一旦ログアウトしてから再度ログイン
```

以上の手順を踏むことで戻せた。
デフォルトで日本語で命名するのはやめて欲しいものですね。
【高速ファイル検索】locateコマンドでファイルを検索する

[【find・grep】特定の文字列を含むファイルのリストを取得する方法。](http://qiita.com/pokari_dz/items/0f14a21e3ca3df025d21)

↑の記事でファイル検索のコマンドについて書きましたが、
良い感じのコマンド見つけたのでメモ。

例えば、
「testなんとかってファイルをどこかに置いたんだけど、どこに置いたっけ・・・」
という場合に、
以下のようにコマンド実行すれば、testを含むパス一覧が取得できます。

```txt:コマンド
locate test
```
超高速で検索してくれます。

なぜ早いかと言うと、実はファイルのデータベースなるものが存在し、
locateコマンドは、このデータベースからファイルを検索しているためです。

このデータベースは、定期的に更新されるようになっているようですが、
updatedbコマンドで、すぐに最新の状態にすることができます。

locateコマンドを実行する前は、必ずupdatedbを実行すると良いかもしれません。

```txt:コマンド
updatedb
※必ずスーパーユーザーで実行する。
```
雑にAPKを管理しやすいファイル名にしたい


# 前置き

よくリリースAPKを作って、Driveに保存したりするのだけど、 `app-develop.apk` みたいな名前だと管理しにくい。
いい感じの名前に変えてくれる君を書いたのでメモ。

# 分かりやすい名前

APKの特徴を表す情報がほしい

- PackageName
- VersionName

いつ作ったのか知りたい (同じversionでAPK作り直しとかあるので)

- Year/Month/Day/Hour/Minute/Second

これらを統合して次のような名前のAPKがよさそう

- `<packagename>-<version>-<%Y%m%d%H%M%S>.apk`
- `me.mattak.example-0.0.1-20161013112233.apk`

# Script

```rb:apkup
#!/usr/bin/env ruby

AAPT=`find #{ENV['ANDROID_HOME']}/build-tools -type f -name 'aapt' | sort -r | head -1`.chomp
raise "aapt not found" unless File.exist? AAPT

if ARGV.size > 0
  APK_SRC=`find . -type f -name '*.apk' | grep -v unaligned | grep #{ARGV[0]} | peco --select-1 --prompt 'Source>'`.chomp
else
  APK_SRC=`find . -type f -name '*.apk' | grep -v unaligned | peco --select-1 --prompt 'Source>'`.chomp
end

LINE=`#{AAPT} dump badging #{APK_SRC} | grep package:`.chomp
LINE.sub (/name='(\S+)'/) {|it| PACKAGE = $1 }
LINE.sub (/versionName='(\S+)'/) {|it| VERSION = $1 }

FILE="#{PACKAGE}-#{VERSION}-#{Time.now.strftime('%Y%m%d%H%M%S')}.apk"
`cp #{APK_SRC} #{FILE}`
puts FILE
```

雑にこんな感じの書いて使ってる.
pecoだけinstallが必要なので注意.
APKだけあれば、Directoryの場所を気にせず実行できるのでべんりだ.

![apkup.gif](https://qiita-image-store.s3.amazonaws.com/0/15000/6b36c816-1557-f143-487d-23a8f9d713f5.gif)
[CentOS7.2+Postgresql9.6]郵便番号データベースを自前で用意する。(簡易版)

## 概要
単純に郵便番号のデータベースを手元に作る。（無加工）

## こんな人向け
・郵便番号データベースを自前で用意したい。
・自動でデータを更新させたい。
・時間をかけずに作りたい。

## 郵便番号のデータベースを用意する

DB構築
[PostgreSQL9.6構築手順はこっちを参照](http://qiita.com/tyoku/items/dfdee53a9e8e669cb8ce)

DB設定変更

```shell-session
sudo vim /var/lib/pgsql/9.6/data/pg_hba.conf

#local   all             all                                     peer
local   all             all                                     trust
```
即席かつ自分でしか利用しないのでtrustにしてます。。必要に応じて変えてください。

DB再起動

```
sudo systemctl restart postgresql-9.6
```

postgresqlユーザのパスワード設定と郵便番号DB作成

```
sudo -u postgres psql postgres
# alter user postgres WITH PASSWORD 'password';
# create database zipcd;
# \q
```

### 郵便番号ユーザ作成
```
sudo createuser -a -d -U postgres -P zipuser
新しいロールのためのパスワード:
もう一度入力してください：
パスワード: 
```

### 郵便番号テーブル作成
[郵便番号データの仕様はこっち](http://www.post.japanpost.jp/zipcode/dl/readme.html)

```
psql -U zipuser zipcd -p;
# create table zipcdmst (
  govcd  char(5),
  zipcd_old  char(5),
  zipcd  char(7),
  pref_kana  varchar,
  city_kana  varchar,
  town_kana  varchar,
  pref  varchar,
  city  varchar,
  town  varchar,
  flg_n1  boolean,
  flg_kaza  boolean,
  flg_chome  boolean,
  flg_1n  boolean,
  upd_stat  smallint,
  upd_reason  smallint
);
CREATE TABLE
# \q
```

## データ更新スクリプト作成

必要なものをインストール

```
sudo yum install -y unzip
sudo yum install -y nkf
```

スクリプト作成

```
sudo vim /usr/local/bin/update_zipcd.sh
```

```bash:update_zipcd.sh
#!/bin/sh

echo `date "+[%Y/%m/%d %H:%M:%S]"`"** START! update zipcd **"
psql -U zipuser -d zipcd -c "truncate table zipcdmst;"
cd /tmp
wget http://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip
unzip ken_all.zip
nkf -Sw KEN_ALL.CSV > KEN_ALL_UTF8.CSV
rm ken_all.zip
rm KEN_ALL.CSV
psql -U zipuser -d zipcd -c "copy zipcdmst from '/tmp/KEN_ALL_UTF8.CSV' WITH CSV;"
rm /tmp/KEN_ALL_UTF8.CSV
echo `date "+[%Y/%m/%d %H:%M:%S]"`"** FINISH! update zipcd **"
```
実行権限付与

```
chmod +x /usr/local/bin/update_zipcd.sh
```
プロキシサーバを通している場合は次を設定

```
sudo vim /etc/wgetrc

http_proxy = http://プロキシのIP:ポート/
https_proxy = http://プロキシのIP:ポート/
```

## 自動更新設定

毎月1日に実行して更新する。（差分更新とかめんどくさい事はしない）

```
sudo crontab -u root -e
0 3 1 * * /usr/local/bin/update_zipcd.sh >> /var/log/zip_upd.log
```

あとは適当なアプリで利用したり加工したりして使う。

おしまい。
visual studio のデバッグ実行の起動が遅かったけど .suo ファイルを削除したら解消した

タイトルのまんまです。

ある日、久しぶりに visual studio 2010 を起動してデバッグ実行したら、体感時間で数分くらい待たされるようになりました。

.suo ファイルを削除したら速くなりました。

ただ、またある日、久しぶりに ...

というわけで、自分用のメモがてら記事を作成しました。

ちなみに visual studio 2015 でも発生するそうです。
railsでバッチ処理する問に、小分けにして進捗も出す

```ruby:sample.rb
articles = Article
total_count = articles.count
per_batch = 2000
0.step(total_count, per_batch) do |offset|
  articles.limit(per_batch).skip(offset).each.with_index(offset) do |article, i|
    puts "#{i}/#{total_count}"
    STDOUT.flush　#nohup時に逐次表示させる
  end
end
```
Percona Monitoring and Management を試してみる

Percona Blog とか見ていると、よく出てくるので使ってみることに。
設定はいたって簡単、下記のURLの通りで問題ない。

[Installing the Percona Monitoring and Management Platform](https://www.percona.com/doc/percona-monitoring-and-management/install.html)

##1.構成

PMMサーバー : 10.0.0.1
DB : 10.0.0.2
OS : CentOS6.7
OS : MySQL5.6
*管理サーバーにはdockerをインストール

##2. 準備

1.下準備

DB から PMMサーバーへは 80 port でアクセスできるようにする。
PMMサーバーからDBへは40000-40002 port へアクセスできるようにする。

2.PMMサーバーの用意

docker起動後

```

#Create a PMM Data Container
docker create \
   -v /opt/prometheus/data \
   -v /opt/consul-data \
   -v /var/lib/mysql \
   --name pmm-data \
   percona/pmm-server:1.0.4 /bin/true

#Create and Run the PMM Server Container
docker run -d \
   -p 80:80 \
   --volumes-from pmm-data \
   --name pmm-server \
   --restart always \
   percona/pmm-server:1.0.4

```


3.PMMクライアント用意

監視対象で作業

インストール

```
wget https://www.percona.com/downloads/pmm-client/LATEST/pmm-client-1.0.4-1.x86_64.rpm
sudo rpm -ivh pmm-client-1.0.4-1.x86_64.rpm
```

設定

```
sudo pmm-admin config --server 10.0.0.1 --client-address 10.0.0.2 
```

設定確認

```
sudo pmm-admin info

PMM Server      | 10.0.0.1
Client Name     | db01
Client Address  | 10.0.0.2
Service manager | unix-systemv

sudo pmm-admin ping
OK, PMM server is alive.

```

メトリクス追加

```
sudo pmm-admin add mysql:metrics --user root --host 127.0.0.1 --port 3306
sudo pmm-admin add linux:metrics
```

接続確認

```
sudo pmm-admin check-network --no-emoji

* Client <-- Server
------- ------------ ---------------------- -------------
METRIC  NAME         PROMETHEUS ENDPOINT    REMOTE STATE
------- ------------ ---------------------- -------------
linux   db01  10.0.0.2:42000     OK
mysql   db01  10.0.0.2:42002     OK
```

PMM管理画面　（PMM landing page）	

http://10.0.0.1

データがとれていればOK

# DISK 関連

![pmm1.PNG](https://qiita-image-store.s3.amazonaws.com/0/99475/e8307727-579b-7991-3acb-5ef3a638801c.png)


個人的にはDISKのVolumeごとにlatencyグラフが見えるのはありがたい

# Innodb 関連

![pmm2.PNG](https://qiita-image-store.s3.amazonaws.com/0/99475/12752877-3971-d000-658c-c27fcc30751e.png)


4.その他


メトリクス停止

```
sudo pmm-admin stop linux:metrics  db01
```

メトリクス削除

```
sudo pmm-admin remove linux:metrics  db01
```

途中でhost名やクライアントIPを削除した場合、PMMサーバーから接続が上手くいかないことがある。
その場合、いったんクライン側の設定削除・設定のやり直しやPMMサーバーのdocker container作り直しなどをやれば解消されることがある。

*/var/log/pmm-mysql-queries-42001.log に吐かれるlogは、あまり有用な情報はでてくれない
AWSのEC2 ubuntuで「BUG: soft lockup - CPU#0 stuck for ~~s」とログが出て正常に起動できない

# はじめに

AWSのg2.xlargeをterminalからRebootをかけたところ、
数十分たっても起動ができなかった。
AWSのコンソールからシステムログを表示してみたところ、
「BUG: soft lockup - CPU#0 stuck for ~~s」との表示が出ていた。


# 対応

AWSのコンソール上から何度かインスタンスの停止→起動を繰り返す。

ステータスチェックが「1/2のチェックに合格しました」との表示で止まってしまうことがありますが、
私は二回停止→起動を行ったところ、正常に起動、接続できました。
keytoolでJavaの証明書を登録する時にハマった事

#やりたい事
jmeterでSSLサイトにリクエストを投げたい。
#ハマった事
keytool.exeの使い方が分からず、アクセス権限がありません等エラーとなった。
#解決コマンド
証明書配置パス:C:\crt
証明書名:testcrt.crt
keytool.exe -import -alias testcrt -file "C:\crt\testcrt.crt" -keystore "C:\Program Files\Java\jre1.8.0_101\lib\security\cacerts"
#確認方法
keytool.exe -list -keystore "C:\Program Files\Java\jre1.8.0_101\lib\security\cacerts" | find "testcrt"
証明書名を含めたフルパスが必要などで、悩みました・・・
c++のmapメモ：insertの更新方法


insertは初めてのkeyの時のみ追加して更新はしない。

更新をしたいときはmp[1] = 10のようにする。

ポインタの時は、*pmp[1] = 10としてしまうとエラーがでる。

(*pmp)[1] = 10とすれば更新もできる。

```cpp
#include <iostream>
#include <map>
using namespace std;
typedef unsigned int UInt;
 
int main() {
 map<int, int> mp;
 map<int, int>* pmp = &mp;
 // mp.insert(map<int, int>)
 mp[1] = 10;
 mp[2] = 20;
 mp[1] = 100;
 
 
 for(auto itr = mp.begin(); itr != mp.end(); ++itr) {
  std::cout << "key = " << itr->first           // キーを表示
    << ", val = " << itr->second << "\n";    // 値を表示
 }
 
 pmp->insert(map<int,int>::value_type(1,10));
 (*pmp)[1] = 10;
 // pmp->insert(map<int,int>::value_type(2,20));
 // pmp->insert(map<int,int>::value_type(1,100));

 std::cout << endl;
 
 for(auto itr = pmp->begin(); itr != pmp->end(); ++itr) {
  std::cout << "key = " << itr->first           // キーを表示
   << ", val = " << itr->second << "\n";    // 値を表示
 }
 
 return 0;
}
```
FileProviderでexternal-files-pathとexternal-cache-pathは使えない

Android v4 Support Library の FileProvider を使うとき、

```xml:file_paths.xml
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="my_images" path="images/"/>
    <files-path name="my_docs" path="docs/"/>
</paths>
```

のようなXMLを使いますが、[ドキュメント](https://developer.android.com/reference/android/support/v4/content/FileProvider.html) によると `paths` の中には5種類の要素が使えるとありますがそれは嘘です。

以下の通り、実際には3種類しか使えません。

| element | directory |
|:-:|:-:|
| files-path | Context.getFilesDir() |
| cache-path | Context.getCacheDir() |
| external-path | Environment.getExternalStorageDirectory() |
| external-files-path | **ugh! 使えません!** |
| external-cache-path | **ugh! 使えません!** |


[ソースコード](https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/v4/java/android/support/v4/content/FileProvider.java) みたら実際に実装されてませんでした。
[ドキュメントバグじゃんってissue](https://code.google.com/p/android/issues/detail?id=61170) も上がってました
iOS 10・iPhone 7のiMessageの新機能と使い方まとめ - 1 - エフェクトを付ける方法

iOS 10になってから、iPhone 7を機種変更してから、メッセージアプリには搭載されたiMessageの新機能に魅了されましたね。しかし、その新機能は一体なんですか？どのように使えますか？ここで、皆さんにiOS 10デバイスでのiMessageの新機能と使い方の1つ -　フェクトを付ける方法をご紹介します。

iOS 10では、iMessageに「吹き出しエフェクト」と「スクリーンエフェクト」という二種類のエフェクトを付けます：
１、スラム：いきなり大きい文字が現れます。
２、ラウド：文字が大きくなり、少しシェイクします。
３、ジェントル：文字が小さい文字から通常文字までじんわりと大きくなります。
４、見えないインク：メッセージにモザイクをかけたような状態で送り、相手がメッセージを開封すると内容が表示されます。

次は、フェクトを付ける方法をご紹介します：

ステップ1、iPhone/iPad/iPod touchで「メッセージ」アプリを開き、既存のスレッドに入るか、新しいメッセージを作成します。

ステップ2、メッセージを入力して、送信ボタンを長押しします。（iPhone 6s以降の機種は強く押します）

ステップ3、エフェクトの選択画面が出ます　＞　使いたい吹き出しエフェクトを選択します。
　　　　　　　　　　　![image](https://qiita-image-store.s3.amazonaws.com/0/144302/dadc658c-6f41-419f-a2ec-d0806470fa9b.png)

この文章はiMobie公式サイトからの[iOS 10のiMessageの新機能と使い方まとめlink：https://www.imobie.jp/support/ios-10-imessage.htm]
を参考して書きます。
ZapierにLINE Notifyを対応してみた

私は、多くのエンジニアがそうであるように、色々自動化するのが好きです。もちろん[IFTTT](https://ifttt.com/)も利用していますが、IFTTTは無料で使える一方で対応しているAPIやトリガーが少ないので、仕事では[Zapier](https://zapier.com/)を利用しています（API連携が３つまで無料）。

このZapierには、対応していないAPIであっても自力で対応させる事ができるという、エンジニア向けの機能が用意されています。

OAuth認証にRESTfulというような、標準的なAPIであれば、ブラウザ上でポチポチボタンを押しながら、フォームの項目を埋めていくだけで対応できます。APIのリクエスト方法やレスポンスの内容がちょっと標準的でない場合であっても、[Scripting](https://zapier.com/developer/documentation/v2/scripting/)と呼ばれるフィルターを実装できる機能（こちらはコードを書く必要がある）を利用することで、無理やりリクエストのヘッダーやパラメータを変更したり、レスポンスの内容を使いやすく加工したりできます。

今回はこの機能を使って、LINE Notify APIをZapierに対応して、LINE Notifyに通知を送れるようにした。以下のように、ちゃんと画像の送信もできるようになっている。

![183712.jpg](https://qiita-image-store.s3.amazonaws.com/0/1219/29fb024e-8580-7b60-c9f0-bc3c2eed3321.jpeg)

一番下の通知は、GitHub上でメンションされた時にそのコメント内容を受信するようにZapierに設定してみました。

![スクリーンショット 2016-10-13 17.06.20.png](https://qiita-image-store.s3.amazonaws.com/0/1219/26b39b8a-16bb-a674-dd18-12b8dea841ff.png)

普段からチャットツールを使いこなしているエンジニアからすると便利さを感じませんが、チャットツールを日常使いしていない、非エンジニアには便利かもしれないので、アンオフィシャルな機能でも使いたい人がいたら、[こちらのリンク](https://zapier.com/developer/invite/48705/63f8fe974772a4cbb412b3a62e4787dd/)からどうぞ！
あなたも私とClojure

# 環境の整え方

Windowsにおける開発環境の整え方です。
すぐ終わります。

## lein.batにパスを通す
"Leingen"とググって公式サイトにあるlein.batを右クリックしてダウンロードします。
パスの通ってるところに置きます。
## 開発環境・実行環境
どちらもZIPを解凍して実行ファイルから起動するので簡単ですね。
### 開発環境
"LightTable"とググってZIPを落として解凍します。
### 実行環境
"Cmder"とググってZIPを落として解凍します。
# Clojure事始め
Cmderで

```
lein
```
と打ってみます。（コマンドがない人はパスが未開通です）
ここで`lein self-install`をしてくださいと言われたら従います。
## プロジェクトの作成
作業する場所を`${projectDir}\`とします。
Cmderで`${projectDir}\`まで移動して
```
lein new app %{projectName}
```
これでプロジェクトができました。

```
lein run
```
と打てば`Hello, World!`と出てくるはずです。
## core.cljを弄る
```
${projectDir}\${projectName}\src\core.clj
```
ここにあります。これを開くと、Hello, World!と書いてある場所が分かります。
さっき入れたLightTableで開く方法ですが、[File]>[Open folder]で`${projectName}`のフォルダーを選択したら右側に`${projectName}`が出てくるかと思います。
ここでちょっと脱線です。`slurp`でファイルを開いてみましょう。

- `${projectName}\`に`test.txt`を作成して、適当な文字列を保存
- core.cljの`"Hello, World!"`の部分を`(slurp "test.txt")`に置換え

そしてCmderで

```
lein run
```
先ほど入れた適当な文字列が表示されたことかと思います。
相対パスは`${projectName}\`から始まってます。
## jarファイルにする
これで最後です。
`${projectName}\`で

```
lein uberjar
```
と打ったら終わりです。
jarファイルが2つできますが、`standalone`と付いている方がどこでも使える方です。
### jarファイルを実行
javaは入れておいて下さい。
あと、先ほど相対パスでファイル指定をしましたので、jarと同じところにtest.txtがなければいけません。

```
java -jar ${projectName}-0.1.0-SNAPSHOT-standalone.jar
```
先ほど入れた適当な文字列がまた表示されたことかと思います。

# 以上です。
PHPでintをオーバーフローさせた結果

## PHPのintの最大値と最小値

### 公式マニュアルの記載

[PHP: 整数 - Manual](http://php.net/manual/ja/language.types.integer.php)

> 整数のサイズはプラットフォームに依存しますが、 約 20 億 (32 ビット符号付) が一般的な値です。 64 ビットプラットフォームでの通常の最大値は、およそ 9*10^18 (900京) になります。 しかし PHP 7 より前のバージョンにおける Windows は例外で、Windows で PHP 7 より前のバージョンを使う場合はは常に 32 ビットとなります。 PHP は符号無し整数をサポートしていません。 整数のサイズは定数 PHP_INT_SIZE で、 そして整数の最大値は定数 PHP_INT_MAX でそれぞれ決まります。 これらの定数は、PHP 4.4.0 以降および PHP 5.0.5 以降で使えます。 PHP 7.0.0 以降では、整数の最小値を表す定数 PHP_INT_MIN が使えるようになりました。 

### わかりづらいので整理してみた

+ 32bit
  + 約20億(32ビット符号付き整数)
  + -2,147,483,648 ～ 2,147,483,647
  + 21億4748万3647
  + [2038年問題](https://ja.wikipedia.org/wiki/2038%E5%B9%B4%E5%95%8F%E9%A1%8C)の温床
+ 64bit
  + 約900京(64ビット符号付き整数)
    + ただし、PHP7未満のWindowsでは32bitと同じ
  + -9,223,372,036,854,775,808 ～ 9,223,372,036,854,775,807
  + 922京3372兆0368億5477万5807
+ 定数
  + 整数のサイズ：**PHP_INT_SIZE** 
  + 最大値：**PHP_INT_MAX**
  + 最小値：**PHP_INT_MIN** ※PHP7以降

### 今回のお話し

オーバーフローしたらどうなるのだろう？intの最大値に+1、最小値に-1した結果を確認する。

## 検証環境

[paiza.io](https://paiza.io/)：`PHP Version => 7.0.8-0ubuntu0.16.04.1`

## 検証コード

```php
<?php
echo "INT_MAX",PHP_EOL;
$n = PHP_INT_MAX ;
var_dump($n);
$n++;
var_dump($n);
$n = (int) $n;
var_dump($n);

echo "INT_MIN",PHP_EOL;
$n = PHP_INT_MIN ;
var_dump($n);
$n--;
var_dump($n);
$n = (int) $n;
var_dump($n);
?>
```

## 結果

+ 最大値を+1するとfloat型になる
+ float型をintにキャストすると最小値になる
+ 最小値を-1するとfloat型になる
+ float型をintにキャストすると最小値のまま

```
INT_MAX
int(9223372036854775807) //PHP_INT_MAX
float(9.2233720368548E+18) //PHP_INT_MAX+1
int(-9223372036854775808) //↑をintに
INT_MIN
int(-9223372036854775808)  //PHP_INT_MIN
float(-9.2233720368548E+18) //PHP_INT_MIN-1
int(-9223372036854775808) //↑をintに
```

## 教訓

**922京3372兆0368億5477万5808円も貯金しないようにしよう！**

※現在の残高51円
テストの重要性と失敗あるある

# はじめに
テストは重要です。プログラムをすればするほどテストの重要性に気づきます。
最近アジャイルの勉強をして、実際の開発でベストプラクティスを取り込んでさらに重要性に気づきました。
今までの経験を踏まえてテストの重要性と失敗あるあるを再確認したいと思います。

# 簡単な修正なのでテストしない
1行だけ修正すれば大丈夫だ。これはテストしなくても問題ないね。コミット。
（次の瞬間）
システムアボートしたぞ！何かしたか？
え？コミットを。。。
お前の環境では動くのか？
。。。やってません。
動作確認ぐらいしろ！

どんな簡単な修正でも間違いはあります。最低限動作確認はしましょう。（本当はテストも必要）

# 網羅テストをしない
基本的なテストパターンを実施して。よしオッケー。後は条件の違いや計算式の違いだけだから大丈夫っと。コミット。
（より上位のテストにて）
あれ？この値おかしくない？このデータだとエラーが起きるよ。
調べてみます。（ログやモジュールを確認）
（1時間後）
ここかあ！条件間違ってる。計算式間違ってる。。。
原因わかったのか？単体テストではどうだったんだ？
あ、基本的なパターンしかやってなかったので。。。
すぐに修正して、今度はちゃんと全パターンテストしろよ！

テストカバレッジを考える必要があります。まずC0（命令網羅）は必須だと思います。C1（分岐網羅）とC2（条件網羅）は、あり得ないパターンや冗長なパターンだったりするので、状況に応じてだと思います。しかしC0でオッケーではなく、C1とC2も考慮した上で決めましょう。

# いきなり結合テストで単体テストをしない
簡単なコードだからいきなり結合テストでオッケーだよね。
エラーだ。インターフェース間違ってたか。修正して、実行っと。
値が違う？計算式間違ってた。修正して、実行っと。
まだ値が違う。どこに問題があるんだ？
（何度か試してみても違う）
コード間違ってないと思うけど。。。上位モジュールでデバッグしてみるか。あれ？引数が間違ってる。別のモジュールのバグだ。
このモジュールのバグ見つけたから修正して〜。（担当者に伝える）
ああ、修正終わるまで待ちだ。。。

いきなり結合テストだとテストしたいモジュールのバグが別のモジュールのバグかわからず時間がかかることがあります。テスト自体の効率は単体テストの方がよいので必ず単体テストしてから結合テストに入りましょう。

# テストコードを書かない
簡単なプログラムだ。はい完成。テストコードも必要ないだろう。コンソールから1回実行すればオッケーだね。
あれ？エラーだ。ここが違うのか。修正して、もう1回実行。
よし動いた。あれ？値が違う。条件によって計算式変える必要あるんだ。条件追加して。条件あるから2パターン実行しないと。
（何度かエラーや修正を繰返して）
結局テストパターン10個にもなってる。コンソールから実行だと面倒だ。（最初からテストコード書いてればよかった。。。と思いつつ）これで最後だからコンソールでやって終わらせよう。
また違う！修正して、コンソールから実行だと面倒だ。（最初からテストコード書いてればよかった。。。と思いつつ）これで最後だからコンソールでやって終わらせよう。（繰り返す）

プログラムは意図しない間違えがあるものです。繰り返しテストするのは当たり前なので最初からテストコードを書きましょう。

# テストを自動化していない
バグを修正したぞ。単体テストを実行して。結合テストも実行して。オッケー。これでコミット。完璧だ。
（数日後）
あれ？この結合テスト結果前と違うんだけど。このモジュール修正した？
この前修正したかなあ。単体テストも結合テストもしたんだけど。。。
ああ、こっちのモジュールからも呼んでるだよ。対応するよう修正して。
はあ。。。

テストを自動化してないと修正したモジュールに影響あるテストが漏れる場合があります。規模によってですが最低限毎日全テストを自動実行しましょう。

# まとめ
- プログラムの品質を確保する上でテストは重要です。いくらコードレビューを十分にしたところで、間違えはあるもので、必ず最後はテストで確認しましょう。
- テストの網羅度は最低限C0（命令網羅）100%が必須です。実行されていない部分にはバグが潜んでいます。C1（分岐網羅）、C2（条件網羅）は100%でなくとも考慮する必要はあります。必要な部分はテストに追加しましょう。
- テストは単体テスト→結合テストの順にやりましょう。結合テスト1発でオッケーならすぐに終わるかもしれません。しかし1発で終わることはまれだし、終われない場合は時間ばかり掛かってしまいます。
- テストはテストコードを書いて繰り返しできるようにしましょう。テストは何度も繰り返すものです。単体テストで何度も実行し、その後のテストやリリース後でもバグが見つかったら再度テストします。さらにはリファクタリングする時にも必要です。
- テストは自動化して毎日全テスト実行しましょう。日々修正しているモジュールは色んな要因でバグが混在します。テスト済みのテストコードは、毎日実行する事でデグレードを早期に発見できます。

自分が書いたコードは完璧だと思いがちで、テストは面倒だという気持ちが起こりがちです。でも実際は自分の書いたコードはバグばかりで、テストを何度も繰返して品質を向上させます。
面倒だと言う気持ちを捨てて、テストは重要だ、必要だという気持ちを持ちましょう。実際に経験して、失敗を繰り返さないとわからないのですが、やはりテストは重要なのです。
Yarnでreact-tutorialを動かしてみた

ブログのコピペです(https://t-hiroyoshi.github.io/try-yarn/)

# Yarnとは

[Yarn](https://github.com/yarnpkg/yarn)とはつい先日公開された、Facebook, Exponent, Google, Tildeによって開発されたオープンソースの新しいJavaScriptパッケージマネージャです。

現在JavaScriptのパッケージマネージャとしてすでにnpmが存在していますが、Facebookほどの規模感になるとパフォーマンスやセキュリティに影響が出てきたので一から新しくYarnを[作ったよう](https://code.facebook.com/posts/1840075619545360)です。
新しいといってもnpmと互換性を持つpackage.jsonでパッケージ管理を行い、npm registry上のパッケージをインストールするので使う側としては早くて固いnpmぐらいに思った方が良いかもしれないです。

中の人をみてみると[Babel](https://github.com/babel/babel)や[Lerna](https://github.com/lerna/lerna)を作ったSebastianさんがコアっぽくてこの人やっぱりすごいなって思いました。

特徴をざっくりまとめるとこんな感じです

* Ultra Fast: ダウンロードされたパッケージは全てローカルにキャッシュされて並列インストールされる
* Mega Secure: インストールされたパッケージは実行される前にチェックサムされる
* Super Reliable: lockfileを使っていて他のシステムでも全く同じものがインストールされることが保証されている
* More emojis: 🐈

# 試す

本当は[create-react-app](https://github.com/facebookincubator/create-react-app)を動かしたかったのですがまだ[対応していなかった](https://github.com/facebookincubator/create-react-app/issues/896)ので[react-tutorial](https://github.com/reactjs/react-tutorial/)でやります。

何はともあれYarn本体をインストールします。
macOSやunixは以下のスクリプトでインストールできます。

```Shell
curl -o- -L https://yarnpkg.com/install.sh | bash
```

もしくはnpmを置き換えるものをnpmで入れるのは気持ち悪いですがnpmでも簡単に入れることができます。
**`yarn`は現在[バグがある](https://github.com/yarnpkg/yarn/issues/735)ので今の所は`yarnpkg`の方を推奨します**

```Shell
npm install --global yarnpkg
# or
npm install --global yarn
```

react-tutorialをcloneしてきてdependenciesをインストールします。

```Shell
git clone git@github.com:reactjs/react-tutorial.git
cd react-tutorial

yarn install
# or just "yarn"
```

この時点で感じたかもしれませんがめっちゃインストール早いです。
軽く計測してみたところnpmだと2.07s、Yarnだと0.66sと3倍ぐらいYarnの方が早かったです。

さらにyarn.lockが生成されてバージョンが固定されていることが確認できます。

npm-scriptsと同じ機能がYarnにもあって`yarn run <script>`で実行できます。
これを使ってreact-tutorialを起動してみます。

```Shell
yarn run start
# or
yarn start
```

ブラウザで`http://localhost:3000/`を開くときちんと動いていることが確認できると思います。

# まとめ

npmよりかなり高速化していることが分かりました、CLIの[コマンド](https://yarnpkg.com/en/docs/cli/)もnpmよりシンプルで好きなのでこれから積極的に使いたいです。JavaScript界のOSS開発速度はものすごいのでオープンになったこれから加速度的に色々改善されていくと思います。
現在npm上の`yarn`が現在バグっていることなどからまだ若干時期尚早かなという気がしますがいざという時はnpm使えば良いのでありかなというのが個人的な感想です。
Babel6の時みたいな大きな変更が入って苦しむことが起きないように願います。
Tesseract.jsを試す

[Tesseract.js](https://github.com/naptha/tesseract.js)はPure JavascriptなORCするライブラリのようです。
書いた時点では[62言語](https://github.com/naptha/tesseract.js/blob/master/docs/tesseract_lang_list.md)に対応してます。もちろん日本語も含まれています。
#試す
ブラウザで見ます。
画像はこれです
![test.png](https://qiita-image-store.s3.amazonaws.com/0/77253/d99a211e-c93e-2946-ef2a-43b195a74680.png)
![test2.png](https://qiita-image-store.s3.amazonaws.com/0/77253/531d61f9-c2ee-fca4-f29a-a6c34a7e67a1.png)


```html:index.html 
<!DOCTYPE html>
<html>
<head>
	<title>test</title>
</head>
<body>
	<div id="test"></div>
	<img src="test.png">
	<div id="test2"></div>
	<img src="test2.png">
	<script src='https://cdn.rawgit.com/naptha/tesseract.js/0.2.0/dist/tesseract.js'></script>
	<script type="text/javascript" src="index.js"></script>
</body>
</html>
```

```js:index.js 
Tesseract.recognize("./test.png",{lang:"jpn"}).then(function(result){
    const a = document.querySelector("#test");
    a.innerHTML = result.html;
})
Tesseract.recognize("./test2.png").then(function(result){
    const a = document.querySelector("#test2");
    a.innerHTML = result.html;
})
```
ちょっと待つと文字を認識した結果が出てきます。

##結果
日本語: 二れはサンプル テキス 卜て"す
英語: Sample TexT Sample Text Tes’r Tes’r

ある程度は認識してくれていますね。
Sublime Text 3の新機能「Show Definition」


Build 3124から追加された新機能 `Show Definition`。
クラスなどにマウスオンすると定義元を表示＆クリックでジャンプできる。

![definition.png](https://qiita-image-store.s3.amazonaws.com/0/16548/c3f30426-2873-ec0c-b032-f3bb6f7b90aa.png "definition.png")
_via [Sublime Blog](https://www.sublimetext.com/blog/articles/sublime-text-3-build-3124)_



なにこれいらなくない…？
`Go to Definition`でジャンプできるし。
これのせいでプチフリーズが起こってる気がする。

ということで非表示にしました。

```Preferences.sublime-settings
  "show_definitions": false
```
elixir on phoenix layoutのテンプレートを変更する


#アクションごとの設定

```
defmodule Sample.PageController do
  use Sample.Web, :controller

  def index(conn, _params) do
    conn
    |> put_layout("admin.html")
    |> render("index.html")
  end
end
```

put_layoutにfasleを渡すとレイアウトを使用しなくなる。

#Routerで設定
```

defmodule Sample.Router do
  use Sample.Web, :router

  ・・・・・

  # 使用するレイアウトの指定
  pipeline :admin_layout do
    plug :put_layout, {Sample.LayoutView, :admin}
  end

  scope "/", Sample do
    pipe_through [:browser, :admin_layout]

    get "/", PageController, :index
  end
  
  ・・・・・

end

```
iOSアプリの各種広告トラッキング方法まとめ

# 概要

iOSアプリのダウンロード数(というか初回起動数)と、広告との費用対効果を図りたいと思う。

色々調べると、オフィシャルのDOC(FacebookやTwitterのDOCなど)を見るのが一番で、とりあえずのやり方が書いてはある。
しかし誰もまとめていないので、結構やり方がバラつく。
バラバラとしてるのでまとめる。

## 何の広告トラッキングをするのか。

* Twitter
* Facebook
* Adwords
* Instagram

の4メディアぐらいがメイン所かと思います(※ラストのinstagramはFacebookなので計測方法はスルーで)。

## 計測方法

### **Twitter計測方法**

ドキュメントはこのあたり
・[アプリインストールまたはアプリエンゲージメントキャンペーンを作る](https://business.twitter.com/ja/help/campaign-setup/create-an-app-installs-or-app-engagement-campaign.html)

流れ全般(最初かいつまもうと思ったんだけど無理ｗ)

1. [Twitter Ads](ads.twitter.com) へ行く(Twitter広告を活用するとかを押してとりあえずサインイン)
* 広告キャンペーンを作成 の画面の右、「アプリを管理」を押す
* アプリを[Link Maker](https://linkmaker.itunes.apple.com/)などからリンクでもいいし、IDでもいいので登録
* **宣伝したいアプリが出たら「選択」を押して「選択済み」にする** ←重要。UI悪い。気づかない。
* 選択したアプリのすぐ下の枠に「コンバージョントラッキングを設定する」のリンクを押してタグ設定をしに行く
* answersが無料なので、それを選択
* fabricのアカウントを求められるのでSignIn or SignUpする
* その後のダウンロードとかそういうの全部無視。次の9へ。
* 以降の手順は [Answers for iOS - Fabric Summary](https://fabric.io/kits/ios/answers/summary) を見て進める
* んで、あとは広告出稿してテスト。

尚、Twitterのappを作っとく必要があったりするかもしれません。
その際は、twitterアプリの作成方法という別の作業が必要です。

※ドキュメントのAndroid版は以下です。
・[Answers for Android - Fabric Summary](https://fabric.io/kits/android/answers/summary)


### **Facebook計測方法**

ドキュメントはこのあたり
・[アプリ広告 Facebook](https://developers.facebook.com/docs/app-ads)
・[SDKの設定 - アプリ広告 - ドキュメンテーション - 開発者向けFacebook](https://developers.facebook.com/docs/app-ads/sdk)

上記ドキュメントにかかれている通りの手順でやっていくんですが、かいつまむと、

1. 広告の設定をしてリンクする
2. Facebook SDKをアプリに追加する  
ここは上記ドキュメントは無視。cocoapodsでごっそりインストールするのがいい
3. インストールのトラッキングを有効にする」にかかれているコードを書く

んで、あとは広告出稿してテスト。

※Podfile(一部抜粋)

```
target 'hogehoge' do
  pod 'FBSDKCoreKit'
  pod 'FBSDKLoginKit'
  pod 'FBSDKShareKit'
end
```

### **Adwords計測方法**

Firebaseを使おう。基本的にFirebaseにはGoogleTagManagerが使えるので、タグマネ使いは比較的とっつきやすい。
またGoogle to Googleだから何の不安もなくいける。

ドキュメントはこのあたり
・[Google Tag Manager Google Tag Manager for iOS](https://developers.google.com/tag-manager/ios/v5/)


1. ドキュメントに書いてある通り、Getting Startedの通りで。
2. PodでGoogleTagManagerをインストール
3. FIRApp.configure()などをAppDelegateに記載
4. AdwordsとFirebaseをリンクさせる(※下記参照)

Google AdwordsとFirebaseのリンクに関してですが、
・[Google Adwords - Firebase](https://firebase.google.com/docs/adwords/)
・[Firebase を使用してモバイルアプリのコンバージョンをトラッキングする - AdWords ヘルプ](https://support.google.com/adwords/answer/6366292)
のどっちかを見てやってください。

&nbsp;

で、もっと詳しい人是非コメントくだちぃ。
基本的に全部Firebaseとかで一括管理でやりたいんだけどなぁ。。。
エンリュの迷い森　～迷いの森～

　皆さま，どうもこんにちは．「エンリュの迷い森」ブログを書いております．迷子のエンリュと申します．こちらは独りごとのコーナーです．勝手に決めた当ブログ内の設定なんかをほろほろと紡いでいこうと思います．独り言なので人に読まれる意識は薄めです．ご了承ください．
 
# 迷いの森って何？
　「迷子のエンリュ」という名前もさることながら，このブログのタイトル「エンリュの迷い森」．情報技術の学習記事なのに**迷いの森**なんて，不吉な名前なんて付けなくても...と思われるかもしれません．
 　迷子ってのはなんというか，お散歩を趣味にしている私があまりに興味・好奇心のみで突っ走る挙句，どことも知れない路地やら山中やら川べりやらに行きついてしまう様子を表しているもので，もはや**「迷子が趣味」**と豪語してもいいくらいにお気に入りのアイデンティティと化しているものなんです．つまり，私にとっての「迷う」とは**「興味・好奇心のままにふらふらと足を延ばす/手を伸ばす」**ことであり，ここに私の学習姿勢というものも現れているのです．
　分野の専門化が進む現代において，あまりたくさんのことに手を出しすぎるというのはよろしくないことかもしれません．しかし，情報技術の世界はあまりに広い．何から手を付け何を目指し，何を学んだらいいのか皆目見当がつかない．それぞれの分野はどれも専門的な知識を要するくせに，ほかの分野とどこでどのようにつながっているか分からない．林立する学習事項の多さはまさしく**「森」**です．私を含めこの世界を覗きに来た誰もが，この「森」を彷徨う旅人であり**「迷子」**なのです．
　そんなわけで，情報分野というのは私の中では，深い霧をたたえ旅人を手招きしては離さない**「迷いの森」**としてイメージされるのです．
 
# Hacker
　情報分野のあらゆる知識に通じ，情報技術に長け，情報分野の「**迷いの森**」をすいすいと進む人を**ハッカー**といいます．よくコンピュータを使って悪さをする人をそう呼ぶことがありますが，本来ハッカーとは犯罪者を指す言葉ではありません．悪事を働く人は**クラッカー**と呼んで区別をして欲しいですね．私はハッカーを目指しているわけですが，悪事に手を染めようということでは断じてないのです．
 >**ハッキングとクラッキング**
>
>ハッキングの技能は元来深い知識と高度な技術を必要とするものであり、そのような技術者をハッカー(hacker)と呼び尊敬される存在であった。
しかし、中にはこれら技術を悪用する者もいた。初期には電話のただ掛けなどであったが、コンピュータが普及しだした頃からソフトウェアのコピーガード破り（および不正コピー）やウェブページの改竄をする者などが現れてきた。これらの悪用行為をクライム・ハッキング(Crime Hacking)、またはCrackingという（クラッキング参照のこと）。悪用する者もまた、自らを「ハッカー」と称したため、ハッカーとはこのような者たちである、と言う認識が広まり、現在もハッカーとクラッカーが同一視される事が多い。
そのため、Linux,FreeBSD,Apache HTTP Serverなどのオープンソースソフトウェアの開発者たちからは、このような犯罪行為を創造的行為であるハッキングと同一視にされることを嫌う意見がある（例；Linuxの開発者リーナス・トーバルズは、その著作の中で、「ハッカーとクラッカーを混同しないで欲しい」と記している）。また、出版社の「O'Reilly & Associates,Inc(日本法人：オライリー・ジャパン)」や雑誌「PC Japan(ソフトバンククリエイティブ刊)」など、本来の意味でのハッカー・ハッキングを用語として定着させようとしているメディアも少なからず存在する。
>
>出展：Wikipedia「ハッキング」 https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0

　さて，この**ハッカー**という言葉は，**hack**という英単語がもとになっています．早速辞書で調べてみますと，hackにはこんな意味があるのです．
>**hack**とは
>	
>(おのなどで乱暴にまたは乱雑に)たたき切る、ぶった切る、切り刻む、めった切りにする、(森林などを)切り払って進む、たたき切って作る、うまくやり抜く、むこうずねをける、(ボールを持っている)腕をはたく、取り組む
>
>出展：weblio 英和辞典・和英辞典 http://ejje.weblio.jp/content/hack

　少々乱暴な言葉のようですが，注目してほしいのは**森を切り払って進む**という意味を持つこと．すなわち森を開墾していくようなイメージをもつ言葉なのです．「I hacked my way through the woods.」 といえば，「わたしは林を切り払って進んだ．」となるわけです．
 
　**「迷いの森」**をどんどん進みながら深く深く切り込んでいき，その後ろにぱあっと開けた大地が見えたとき，わたしたちはまさに「森を切り開いて進んだもの」，**Hacker**となっているのです．
 
 
# 私と一緒に「迷いの森」の「Hacker」になろう！
## ~~Previous~~|[Top][t]|~~Next~~
Next: 未定
## [Index][i]
## [Journey][j]

[t]: http://qiita.com/LostEnryu/items/5f2b8070de83fb0962cf
[i]: http://qiita.com/LostEnryu/items/0bde259205ed4f5c3e94
[j]: http://qiita.com/LostEnryu/items/5c4346f5dfc3e268082d

[n]:url
Atlassian Bambooのデプロイ機能でAmazon ECRを利用する

# 前提事項

- Bambooはダウンロード版（現時点`v5.13.2`）で、Linuxサーバーにインストールされています
- Amazon ECRにアクセスできるIAMのアクセスIDとシークレットキーを用意しておきます
- ECRにPUSH先のリポジトリを用意しておきます
- ECSの起動設定などは別途行っているものとします
- お金の都合で `Task for AWS`というマーケットプレイスで販売しているプラグインが使えない場合に、標準の`Docker`プラグインでなんとかならないか、といったケースを想定しています
- CIサーバーにDockerがまだインストールされていない

# やりたいこと

BambooのBuildプランでテストが通過したプロジェクトをAmazon ECRへDocker Pushしたい。

# Dockerをインストールする

BambooにはDockerプラグインが標準で入っています。
これをデプロイタスクに追加して、`docker build`や`docker push`を実行することができます。
ただし、Dockerはインストールしておく必要があります（特にドキュメントからは読み取れないので注意が必要です）。

私はChefでプロビジョンしていたので、[dockerというCookbook](https://supermarket.chef.io/cookbooks/docker)を利用して、以下のようなレシピを記述してインストールしました。

```ruby
docker_service 'default' do
  action [:create, :start]
end
```

Bambooの管理者権限で`Server capabilities`にDockerのバイナリーへのパスを登録します。

# dockerコマンドでECRへpushするには

前提事項で書いたIAMのユーザーでログインするため`aws ecr get-login`コマンドで`docker login`のコマンドを実行します。

以下のQiita記事を参考にしました。
[Amazon ECR使い方簡易版](http://qiita.com/Jey/items/2788be375682383071fc)

これをBambooのScriptタスクで実行します。

Bambooのデプロイタスクは以下の順で実行するようにしました。

- ソースコードの取得(Checkout)
- ECRログイン(Script)
- コンテナビルド(Docker)
- コンテナ登録(Docker)

# 接続できない!

実際にデプロイタスクを実行してみると、以下のようなエラーが出てしまいます。

`Cannot connect to the Docker daemon. Is the docker daemon running on this host?`

調べてみると、`root`ユーザー以外で`docker`を起動しようとした場合のエラーだということで、レシピに`bamboo`ユーザーを`docker`グループへ追加するように追記して、プロビジョンします。

```rb
group 'docker' do
  action :modify
  members [node['bamboo']['user']]
  append true
end
```

`docker`グループにユーザーを追加した場合は、`docker`サービスの再起動が必要なので、コンソールで以下のコマンドを実行します。

```
$ sudo service docker restart
```

# まだ接続できない！

Bambooから再デプロイを実行するも、またログインで失敗します。
`ssh`コンソールからbambooユーザーで`aws ecr get-login`コマンドを実行すると、うまくログインできるのですが、なぜだ！！

# Bambooを再起動してみる

原因がわからないので、Bambooを再起動してみました。

で、デプロイを実行すると....

**うまく動きます**

# まとめ

同様のことでBambooから`docker login`に失敗する場合は、再起動してみてはいかがでしょうか？
Homebrew で Apache 2.4 + PHP 7.0 環境を作る

OS X El Capitan でやりました。

# デフォルト Apache を止める
プリインストールされている Apache が起動してしまうと困るので止める

``` bash
$ sudo apacehctl stop
$ sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist
```

# Apache 2.4 を入れる
`brew install php70 --with-apache` だけでも勝手に http24 がインストールされるのだけど、オプション付きでインストールしたいのであらかじめ入れておく。

``` bash
$ brew options httpd24
--with-privileged-ports
	Use the default ports 80 and 443 (which require root privileges), instead of 8080 and 8443
```

オプションなしでインストールするとポート 8080 で起動するが、 `--with-privileged-ports` でインストールすることでポート 80 で起動させることができる。

``` bash
$ brew install httpd24 --with-privileged-ports
```

# PHP 7.0 を入れる
``` bash
$ brew options php70
--with-apache
	Enable building of shared Apache 2.4 Handler module
```

`--with-apache` というオプションを付けると `libphp7.so` をビルドしてくれる。

``` bash
$ brew install php70 --with-apache
```

# `httpd.conf` を編集
`php7_module` が有効になっているか確認

``` /usr/local/etc/apache2/2.4/httpd.conf
LoadModule php7_module /usr/local/opt/php70/libexec/apache2/libphp7.so
```

以下の行を追加

``` /usr/local/etc/apache2/2.4/httpd.conf
<IfModule php7_module>
  AddType application/x-httpd-php .php
</IfModule>
```

# 起動
``` bash
$ sudo apachectl start
```

# 補足
## `apachectl status` がコケる場合
``` bash
$ sudo apachectl status
/usr/local/bin/apachectl: line 95: lynx: command not found
```

lynx は CUI の Web ブラウザらしい。
Apache が起動してるかどうかの確認に使っていると思われる。

``` bash
$ brew install lynx
(略)
```

lynx を入れれば動く。

## Composer を使う場合
mcrypt を入れておく

```
$ brew install php70-mcrypt
```
UE4 親子を同時に表示/非表示する

# UE4 親子を同時に表示/非表示する

UE4はUnityと違って、親を非表示にしても子供が非表示にならない。
子供も一緒に影響を与える設定が存在する。

## UnrealEngineの親子関係

**Cubeを親子付けする**
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/b7d70bed-d768-7d90-3c10-aba4cd1d5c4c.png)

**親を非表示にしても子供は表示される**
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/1c22eacc-c2e0-73a9-7e8d-6d88035a48af.png)


## ブループリントのSetVisibilityの設定で表示/非表示を設定する

1. 親のリファレンスをブループリントに追加する
2. SetVisibilityのPropagate to Childrenにチェックを入れると子供に対しても影響を与えるようになる
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/a960e4b4-76ee-67b5-0b8a-5e100b1d399f.png)
vagrantのvmをプロジェクトをまたいで使いまわす

## はじめに

WebApi.gitとBackendBatch.gitといった2つのサーバーアプリがあったとして、同じサーバー環境で動作するケースって結構ありますよね？また、WebApi.gitとBackendBatch.gitそれぞれに、ローカル環境用のVagrantfileがコミットされているケースもあるんじゃないかと思ってます。（うちだけ？）

その場合に、２つとも同じVMで動かしたいんだけど、それぞれをcloneしてきてvagrant upすると、同じVMが２つ作られてしまって容量が無駄だなぁと思い、どうにかしてWebApi.gitでもBackendBatch.gitでも同じVMを参照するようにできないかと調べてみました。

**※追記　2016-11-02**

普通に.vagrantディレクトリコピーするだけでOKでした。orz

## 手順

#### 1つ目は普通にvagrant upを作る

最初は、いつも通りの手順になります。

```
$ cd WebApi
$ vagrant up
```

で、Vagrantfileからバーチャルマシーンを作りましょう。

#### IDを調べる

```
$ VBoxManage.exe list vms
"xxx_1461733793019_27971" {xxxxxxxx-3e5d-4859-b33b-xxxxxxxxxxxx}
"yyy_1463384898217_32437" {yyyyyyyy-e3b8-4110-aaa3-yyyyyyyyyyyy}
"zzz_1463979796048_39205" {zzzzzzzz-692b-4884-bbac-zzzzzzzzzzzz}
```

で、使いたいvmのIDを調べます。
（ここでは仮に「xxxxxxxx-3e5d-4859-b33b-xxxxxxxxxxxx」とします）

#### 2つめもvagrant up

2つめのプロジェクトでvagrant upしましょう。

```
$ cd BackendBatch
$ vagrant up
```

いつも通り、インポートされますよね。
vmの作成が完了したら、

```
$ vagrant halt
```

ですぐ終了させ、

```
echo "xxxxxxxx-3e5d-4859-b33b-xxxxxxxxxxxx" > .vagrant/machines/default/virtualbox/id
```

で参照しているvmのIDを書き換えます。

これで、vagrant upした時に指定したidのvmが立ち上がるようになります。

重複して作られてしまったvmは削除しましょう。

## 参考

- [Re-associate vagrant with vm · Issue #1755 · mitchellh/vagrant](https://github.com/mitchellh/vagrant/issues/1755)
git,github関係の個人的メモ

気になることがあるたびに調べるのめんどくさいからよく使いそうなことのメモ
なんかあったら随時更新

#github上のファイルを削除したいとき
多分若干違う．．．

状態の確認
`$git status`

履歴の削除
`$git rm --cached [statusで得られた削除したいファイルのパス]`

.gitignoreに使わないファイルのパスを記述
`$vi .gitignore`

反映
`$git commit -m "削除"`
`$git push origin master`

以下，参考にしたサイト
http://yatta47.hateblo.jp/entry/2015/05/07/003000
http://am1tanaka.hatenablog.com/entry/2015/07/08/173643
http://qiita.com/go_astrayer/items/6e39d3ab16ae8094496c

#github上でリポジトリを移動したいとき
あらかじめ，移動先に空のファイルを作成しておく．

`$git clone --mirror [移動元リポジトリURL]`
`$cd [~.git]`
`$git push --mirror [移動先リポジトリURL]`

http://tanacasino.hatenablog.com/entry/2013/08/03/233427
Xcodeの右エディタペインにOpen Quicklyで選択したファイルを開く方法

Xcodeにおいて`Command+Shift+O`でOpen Quicklyを表示して検索した後`Enter`を押下するとエディタでファイルが表示されます。エディタをセパレート表示している時には左ペインで表示されます。

この時、右ペインでファイルを開く方法です。

## Option+Enterを利用する方法

T/Oで十分そうですが、一応説明を。Open Quicklyでファイルを選択した状態で`Option+Enter`を押下すると右ペインで表示されます。

## フォーカスがあるエディタで表示する方法

XcodeのPreferencesのNavigationタブのNavigationという項目で`Uses Focused Editor`を選択すると、Open Quicklyでフォーカスが当たっている方のエディタペインで選択したファイルを表示するようになります。ですので右ペインを選択した状態でOpen Quicklyでファイルを選択すると右ペインで表示されるようになります。


ご存知の方も多いとは思いますが、私ははじめて知りましたorz
AWS CLIでEC2のルートボリュームを暗号化する

## はじめに

システム構築にEC2を使う場合に、社内セキュリティ基準などでディスクレベルの暗号化が必要な場合があるかと思います。
その際にEBSならばすぐに暗号化できるのですがルートボリュームは一手間かかるのでそれを紹介します。

## 手順

### EC2のインスタンスを作成
事前にSecurity group、Subnet、IAMのインスタンスプロファイル、鍵を変数として設定しておいてください。
また、jqを`yum install -y jq` などでインストールしておいてください。

```
instanceid=`aws ec2 run-instances \
--image-id ami-1a15c77b \
--count 1 \
--instance-type t2.small \
--security-group-ids ${sg_id} \
--subnet-id ${subnet_id} \
--associate-public-ip-address \
--key-name ${key_name} \
--iam-instance-profile Arn=arn:aws:iam::${iam_profile} \
--block-device-mappings '[{"DeviceName":"/dev/xvda","Ebs":{"DeleteOnTermination":false, "VolumeSize":20,"VolumeType":"gp2"}}]' \
| jq -c -r '.Instances[]|.InstanceId'`
```

この時点ではルートボリュームは暗号化できません。

### AMI作成
作成したインスタンスのAMIを作成します。
この時点でもまだルートボリュームは暗号化されていません。

```
amiid=`aws ec2 create-image --instance-id ${instanceid} --name "noenctest" --no-reboot | jq -c -r '.ImageId'`
```

### AMIをコピー
ここで暗号化の処理をします。
下記の例ではKMSのkeyIDを指定していないのでデフォルトのものが使われますが、`--kms-key-id`で指定することもできます。
また、暗号化したAMIはアカウントを超えてコピーすることはできなくなります（private設定になる）ので、検証・ステージング・本番等でアカウントが別れている場合は要注意です。

```
enc_amiid=`aws ec2 copy-image --source-image-id ${amiid} --source-region ap-northeast-1 --region ap-northeast-1 --encrypted --name "enctest" | jq -c -r '.ImageId'`
```

これで暗号化ができました！
念のためコンソールから確認してみると
<img width="1260" alt="スクリーンショット 0028-10-13 15.37.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/69820/f572c679-701a-db7c-603e-24f06050b583.png">

暗号化できてますね！