OmniAICreator/Qiita-1.07M huggingface dataset:
[JAWS-UG CLI] IAM #56 インスタンスプロファイルの作成 (CodeDeploy)

前提条件
========


IAMへの権限
-----------

IAMに対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

* AWS CLI 1.11.14

```bash:コマンド:
aws --version
```

結果(例):

      aws-cli/1.11.14 Python/2.7.10 Darwin/15.6.0 botocore/1.4.71

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```

0. 準備
=======


1.1. 変数の確認
---------------

プロファイルが想定のものになっていることを確認します。

```bash:コマンド:
aws configure list
```

結果(例)

            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile         iamFull-prjz-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                         ap-northeast-1  env    AWS_DEFAULT_REGION

AssumeRoleを利用している場合はprofileが '<not set>'と表示されます。 そ
れ以外のときにprofileが '<not set>' と表示される場合は、以下を実行して
ください。

   変数の設定:

         export AWS_DEFAULT_PROFILE=<IAMユーザ名>




1. 事前作業
===========


インスタンスプロファイル名の決定
--------------------------------

```bash:変数の設定:
IAM_INSTANCE_PROFILE_NAME='CodeDeployEC2InstanceProfile'
```

同じ名前のインスタンスプロファイルが存在しないことを確認します。

```bash:コマンド:
aws iam get-instance-profile \
        --instance-profile-name ${IAM_INSTANCE_PROFILE_NAME}
```

結果(例):

      A client error (NoSuchEntity) occurred when calling the GetInstanceProfile operation: Instance Profile CodeDeployEC2InstanceProfile cannot be found.


2. 本作業
=========


インスタンスプロファイルの作成
------------------------------

```bash:変数の確認:
cat << ETX

        IAM_INSTANCE_PROFILE_NAME: ${IAM_INSTANCE_PROFILE_NAME}

ETX
```

```bash:コマンド:
aws iam create-instance-profile \
        --instance-profile-name ${IAM_INSTANCE_PROFILE_NAME}
```

結果(例):

      {
        "InstanceProfile": {
          "InstanceProfileId": "AIPAxxxxxxxxxxxxxxxxx",
          "Roles": [],
          "CreateDate": "2016-11-21T01:23:45.678",
          "InstanceProfileName": "CodeDeployEC2InstanceProfile",
          "Path": "/",
          "Arn": "arn:aws:iam::XXXXXXXXXXXX:instance-profile/CodeDeployEC2InstanceProfile"
        }
      }


3. 事後作業
===========


インスタンスプロファイルの確認
------------------------------

```bash:コマンド:
aws iam get-instance-profile \
        --instance-profile-name ${IAM_INSTANCE_PROFILE_NAME}
```

結果(例):

      {
        "InstanceProfiles": [
          {
              "InstanceProfileId": "AIPAJRUJIZXNNQU4R6VZM",
              "Roles": [],
              "CreateDate": "2016-11-21T01:23:45Z",
              "InstanceProfileName": "CodeDeployEC2InstanceProfile",
              "Path": "/",
              "Arn": "arn:aws:iam::XXXXXXXXXXXX:instance-profile/CodeDeployEC2InstanceProfile"
          }
        ]
      }


完了
====
`f.collection_select`にclassが設定できない


新規登録画面で、セレクトタグを使いたくて調べてると`f.collection_select`のデモがあったので、使ってみた。
が、いつものノリで、`class`指定したのだが`class`が反映されない。

```irb
<div class="form-group">
  <%= f.label :category %>
  <%= f.collection_select :category, Category.all, :category_id, :category, class: "form-control" %>
</div>
```

よくわからないけど、こうやって書くとできた

```irb
<%= f.collection_select :category, Post.all, :id, :category, {}, {class: "form-control"} %>
```
iOSでの:hover不具合をJSで解決

### iOSでの:hover問題
iOSデバイス（iPhone / iPad）ではCSSの`:hover`がうまく働かず、ダブルタップしないとリンクが飛ばないことがあります。

- [結構緊急リンクが飛ばない iOS 8.4.1からCSS :hoverも１クリックカウントっぽいSafari](http://webskillup.com/ety/20150816234007/)
- [iOS 8.4.1の:hover問題](http://blog.webcreativepark.net/2015/08/29-122908.html)

上記の情報によるとiOS 8.4.1で発見され、9.0以上では解決しているとのことですが、私は2016年11月現在の最新10.1.1の環境でこの不具合が出ました…（辛）不具合っていうか謎仕様…でもまあ不具合と言って差し支えないですよね…。

[iOSでHoverが効かない問題](http://qiita.com/rscq/items/8ab81205a8ab3229450a)でも9系でのバグ報告があるように、hoverで画像切り替えのような凝った実装をするとまだこの不具合が出ることがあるようですね。厄介です。

ちなみに私にこの不具合が出た時の実装はこう。

```HTML:index.html
<div id="link">
<a href="../sample.html">
　　<span>
　　　　<img src="img/pic_off.png" alt="off">
　　　　<img src="img/pic_on.png" alt="on">
　　</span>テキスト</a>
</div>
```

```CSS:style.css
a span img:first-child {
    display: block;
}
a span img:last-child {
    display: none;
}
a:hover span img:first-child {
    display: none;
}
a:hover span img:last-child {
    display: block;
}
```
レスポンシブサイトで`a`の中に２枚の異なる画像を並べ、Hover時にCSS`display`で切り替えるというちょっと凝ったものでしたが、これがもうダメでスマホ時にiOSデバイスでどうしても１タップで遷移してくれず、ダブルタップでやっと遷移してしまう。

### 解決
JS (jQuery) を使って無理やり解決。
まずはユーザーエージェント振り分けでiPhoneとiPadの時は強制的にリンク先、またはアンカーに飛ばすようにします。
そして、0.1秒未満の瞬間的なタップ時と、0.5秒以上のロングタップ時にはHover時の画像置換をする条件分岐を加えました。
結果的に0.1秒から0.5秒間のタップがあった時だけ、強制的にリンク先、またはアンカーに飛ばすという仕様。
感圧センサー対応はどうするとか、時間設定とか深く考えずに作りましたが、案外これで違和感なくできました。

```javascript:function.js
$(function () {
	var userAgent = navigator.userAgent;
	var UA_iPhone = (userAgent.indexOf('iPhone') > -1) ? true : false;
	var UA_iPad = (userAgent.indexOf('iPad') > -1) ? true : false;
	var touched = false;
	var touch_time = 0;
        //iPhone,iPadを判定
	if (UA_iPhone || UA_iPad) {
		$("#link").bind({
			'touchstart mousedown': function (e) {
				touched = true;
				touch_time = 0;
				document.interval = setInterval(function () {
					touch_time += 100;
                    // 短すぎるタップとロングタップ時の処理
					if (touch_time >= 500 || touch_time < 100) {
						e.preventDefault();
					}
				}, 100);
			},
			'touchend mouseup mouseout': function (e) { // マウスが領域外に出たかどうか
				if (touched) {
                    // ちょうどいいタップ時の処理
					if (100 < touch_time < 500) {
						var link = $(this).attr("href");
						var target = $(this).attr("target");
						var linktype = link.substring(0, 1);
						if (linktype != "#") {
							if (target == "_blank") {
								window.open(link);
							} else {
								location.href = link;
							}
						}
					}
				}
				touched = false;
				clearInterval(document.interval);
				e.preventDefault();
			}
		})
	};
});

```

### 所感
日本では圧倒的なシェアを持つスマホの王者iPhoneを無視するわけにもいかないので、ひとまずはこういう細かい謎仕様にも地道に対応していくしかないですねー。
あとは[ベンダーにバグ報告](http://www.apple.com/jp/feedback/safari.html)というのもいいかもすね。
また「こっちのやり方の方がいいよー」とかあったら教えていただけると嬉しいです。
ありがとうございました。
[Unity]古い映画の3,2,1..のようなSpriteアニメーション


# 結果

![FillLoop.gif](https://qiita-image-store.s3.amazonaws.com/0/113504/c66c7d7c-8d6d-543c-f231-5e17fb9172a2.gif "FillLoop.gif")

# 内容
スクリプトをアタッチした子以下のImageコンポーネントのうち，
ImageTypeがFilledのものにたいしてアニメーションを行う．

# 仕様アセット
- UniRx
- Linq to GameObject


# スクリプト

```
using UnityEngine;
using System.Collections;
using UniRx;
using Unity.Linq;
using System.Linq;
using UnityEngine.UI;
using UniRx.Triggers;

public class FillLoop : MonoBehaviour {


	public float speed = 1.0f;
	public bool isLoop = true;


	void Start () {

		// 子以下からImageTypeがFilledのImageを取得
		var images = this.gameObject.Descendants ().OfComponent<Image> ()
			.Where (x => x.type == Image.Type.Filled);

		foreach (var item in images) {
			
			var currentImage = item;
			float coeff = 1.0f; // fillAmountを増やすか減らすか

			// fillAmountが1か0で方向を逆転
			currentImage
				.ObserveEveryValueChanged (ci => ci.fillAmount)
				.Where (x => x == 1.0f || x == 0.0f)
				.Subscribe (_ => {
					currentImage.fillClockwise = !currentImage.fillClockwise;
					coeff = 1.0f - (2.0f * currentImage.fillAmount);
				})
				.AddTo (currentImage.gameObject);

			// fillAmountの増減
			this.UpdateAsObservable ()
				.Where (_ => isLoop)
				.Where(_=> currentImage != null)
				.Subscribe (_ => 
					{
						currentImage.fillAmount += Time.deltaTime * speed * coeff;
					});
		}
	}
}

```
zabbixのpostfixテンプレートをsolaris10に適用させる

# zabbixのpostfixテンプレートをsolaris10に適用させる

## はじめに

githubに公開していただいているzabbix3.0のpostfixテンプレートはlinuxベースのテンプレートなのでsolarisに適用する為の修正箇所を記載します。

（テンプレート）
https://github.com/thecamels/zabbix
Template App Postfix

（zabbixバージョン）
zabbix3.0.3

## インポート

[設定]→[テンプレート]
から[インポート]ボタンを選択する。

![2016-11-21_180859.png](https://qiita-image-store.s3.amazonaws.com/0/149632/4acf5fe4-2aaa-acf3-4218-61990e3d3946.png)

[ファイルを選択]からTemplate App Postfix.xmlを選択して[インポート]を実行する。
※上書き設定はそのままでもエラーは出ないはず。

![2016-11-21_181142.png](https://qiita-image-store.s3.amazonaws.com/0/149632/d2bce805-fab8-e7ff-cd3b-439aea43a852.png)

## configの配置

zabbix_agentd.conf.dに用意してもらっている下記ファイルを、

```
/etc/zabbix/zabbix_agentd.conf.d/
```

以下に配置する。

postfix.conf

## パラメーターの修正

grepのオプションがlinuxと違うため、そのまま使うとエラーになります。

```ruby:（初期設定）
UserParameter=mailqueue-postfix-queue[*], find /var/spool/postfix/ -type f | grep $1 | grep -v -e "/pid/" -e "/defer/" | wc -l
```

```ruby:（変更後）
UserParameter=mailqueue-postfix-queue[*], find /var/spool/postfix/ -type f | grep $1 | egrep -v -e "/pid/" -e "/defer/" | wc -l
```

solaris標準のgrepには「-e」オプションはありませんでしたー。
替わりにegrepに差し替えます。

postfixのテンプレートにサービス自動起動のチェックアイテムがあります。
linuxならchkconfig(cent6系)ですが、solaris10の場合svcsを使いますので、

```
cat solaris.conf
UserParameter=chkconfig[*], svcs -a|grep "$1" | cut -d " " -f 1 | grep -c online
```

というOS用ファイルを準備しておきます。

## 最後に

これでpostfixのキュー状態の監視が可能となります。

1点注意点としては、/var/spool/postfix/配下はroot権限がないと参照できません。
許されるのであれば、zabbix_agentd.confでAllowRoot=1にしてagentを起動するのがベターです。

以上。
VBAで文字コードを扱う方法

# 概要
文字化けしたので置換する方法を調べました>


# コード
```:vb
str = Replace(str, ChrW(&H301C), "～")
```

文字コードは、サクラエディタで調べました。

# 参考
https://search.yahoo.co.jp/search?ei=UTF-8&rkf=4&fr=link_highlight_cbr&p=%20ChrW(%26H301C)&hfrd=dD1Qb3JNWUImc2s9LlR0cnpoNVNXamFLOVZlRUlaSWo4T1VyUThZLQ==
Macにアプリをインストール後「未使用の〇〇〇を開こうとしています」が無限に繰り返された場合の対処

今回たまたまMacにGyazoアプリをインストールしました。

ところが、アプリを起動すると「未使用の〇〇〇を開こうとしています」と表示されました。
1回だけかと思って再起動しても、繰り返し表示される無限地獄に陥ってしまった様です。

## 条件

- OS X El Capitan
- Gayzo 3.3.3

## アプリのインストール

ディスクイメージを展開します。
Applicationsフォルダーにコピーする様に説明がありますので、ドラックしコピーします。

![kobito.1479717425.394662.png](https://qiita-image-store.s3.amazonaws.com/0/8941/e66f2105-cc92-cb40-6594-788c71059d43.png "kobito.1479717425.394662.png")


アプリを起動するとインターネットからのダウンロードである事の警告が出て「開く」を押すことで開けました。
ここまでは普通の手順です。

![スクリーンショット 2016-11-18 17.24.42.png](https://qiita-image-store.s3.amazonaws.com/0/8941/41996974-66a9-f27f-0304-a864dcd520e5.png "スクリーンショット 2016-11-18 17.24.42.png")

## 未使用の〇〇〇を開こうとしていますの無間地獄

Gyazoはスクリーンショットを撮ると終了してしまうので、もう一度撮ろうとしてアプリを起動すると下の警告がでます。
再度起動しても同じ様に警告がでてしまいます。

![　.png](https://qiita-image-store.s3.amazonaws.com/0/8941/375c811b-a93e-19f6-7ca4-40bcbc2db0c0.png "　.png")

Gyazoはスクリーンショットをサイト上に表示するのですが、その際認証されます。
この状態だと認証も毎回しなければならず警告を無視するだけでは済みません。

## 対処

起動したというフラグが書き込みできないだけだろうということで

- 一旦ホーム以下にコピーします。
- アプリを起動します。
- 念のため一旦終了して再起動します。
	- 警告が出ないことを確認します。
- ホームにコピーしたアプリをApplicationsフォルダーに移動します。


Applicationsフォルダーの権限設定がおかしいためかもしれないので、本来はディスクユーティリティで対処するのかもしれませんが、El Capitanでは権限の修復操作が見当たらなかったので、上記の方法で対処しました。
Androidのプロジェクトを移行したら、SDK r23でエラーが出た場合の解決法


# 概要

あるAndroidプロジェクトをEclipseからAndroidStudioに移行することになりました。フォルダ構成などはうまく移行できましたが、gradleによるビルド時、以下のエラーが出ました

```
C:\（略）\appcompat-v7\23.0.0\res\values-v23\values-v23.xml
Error:(2) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Inverse'.
Error:(2) Error retrieving parent for item: No resource found that matches the given name 'android:Widget.Material.Button.Colored'.
```

うーむ、そのプロジェクトは```compileSdkVersion```が21なので、どうしてr23のエラーが出るのが不明でした。

# 解決

https://code.google.com/p/android/issues/detail?id=183122

ですでに話題にはなっていたようで、主な解決方法は、

- 前のバージョンに戻す

ことが提示されてましたが、このAndroidプロジェクトをAndroidStudioでビルドするのは初めてだし、他のプロジェクトもあるのであまりSDKマネージャとかは触りたくありませんでした。

http://terahit.com/2015/08/20/android-studio-emu-error/

の情報を参考に以下を試して、どうにかビルドできるようになりました。

- ```compileSdkVersion```を、```23```にする
- ```buildToolVersion```を、```22.0.1```にする
- appcompatのバージョンを、```22.2.1```にする

これでビルドするとエラーが消えました。

SDKのバージョンは別に上げてもよかったですが、r23だと都合が悪い箇所があったので、```compileSdkVersion```を、```22```にしましたが、ビルドはできました。

# まとめ

ビルド関係でハマるとどうしてもGoogle頼りになってしまいますね…
Bash/Zshで、直前に実行したコマンドの引数を呼び出す

コンソールで、地味に便利な小ネタです。自分は最近知って、感動しました。

Bash/Zshで、こんなことありませんか？

```bash
1. ls -l /etc/hoge/fuga.conf
2. chmod 0600 /etc/hoge/fuga.conf
3. vim /etc/hoge/fuga.conf
```

この時、`/etc/hoge/fuga.conf`を何回もタイプまたはコピペすることになりますが、
2. の途中、`chmod 0600 `まで打った後、ESCを押した後に.(コロン)を押すと、`/etc/hoge/fuga.conf`が挿入されます。

`ESC + .` で、一つ前のコマンドの引数を呼べるみたいです。

自分はこれ知らないで`C-a M-d`とやってました。

# 補足

- 直前だけじゃなくて、繰り返して押せば以前のコマンドの引数を呼び出せる
- `Alt + .`でもできた。ということは`M-.`なのか。
javascriptの正規表現で記号が入っているかをvalidationする

##やりたいこと
.jsで正規表現を使ってvalidationを作ります。
記号が入ってる場合はtrue, そうでなければfalseで返します。
わざわざreturnする必要はありませんし、ifの判定だけで十分事足りますが、
その辺は分かりやすさ重視ということでひとつ。

##実装コード
```js:sample.js
function validateString(val) {
  var reg = new RegExp(/[!"#$%&'()\*\+\-\.,\/:;<=>?@\[\\\]^_`{|}~]/g);
  if(reg.test(val)) {
    return true;
  }
  return false;
}
```

# コード説明
[RegExp](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp): 正規表現用のオブジェクト。ちなみに RegExp = Regular Expressionの略です。
[test()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test) : **今回のキモ。**正規表現と対象の文字列の間のマッチを調べるための検索を実行し、結果を示す真偽値を返します。

# おまけ
[正規表現の確認用テストツール](http://okumocchi.jp/php/re.php)。
いつもお世話になっとります。ありがたや。
Docker | イメージを一覧するコマンド ( docker images )

表題の通り `docker images` で一覧できる。

# 例

```
$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              6.6                 d03626170061        11 weeks ago        202.6 MB
hello-world         latest              c54a2cc56cbb        4 months ago        1.848 kB
docker/whalesay     latest              6b362a9f73eb        18 months ago       247 MB
```

# オプション

## `-a`

全てのイメージを表示する。
( イメージの依存関係によっては「中間イメージ」が生成されるっぽい？ => http://www.projectatomic.io/blog/2015/07/what-are-docker-none-none-images/
 )

## `-q`

イメージIDだけを羅列する。

```
$ docker images

d03626170061
c54a2cc56cbb
6b362a9f73eb
```

## `--digest`

ダイジェストキーも表示する。

```
$ docker images --digests

REPOSITORY          TAG                 DIGEST                                                                    IMAGE ID            CREATED
alpine              3.2                 sha256:21e69d5899e4865b647f6a7aeaba3ddf0d0f17c0016b03ed716322c855533ccd   7bed0150ea37        4 weeks ago         5.265 MB
centos              6.6                 sha256:e21297742183af3e64cbd42585c1718b53c677797a77044ba13c1425c21ef06b   d03626170061        11 weeks ago        202.6 MB
hello-world         latest              sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9   c54a2cc56cbb        4 months ago        1.848 kB
docker/whalesay     latest              sha256:178598e51a26abbc958b8a2e48825c90bc22e641de3d31e18aaf55f3258ba93b   6b362a9f73eb        18 months ago       247 MB
```

# 補足

- 「docker イメージ 一覧」でググれなかったので記事作成。

# 環境

- Docker on Mac
- Docker version 1.12.3, build 6b644ec








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Docker | すべてのイメージを削除する

# 手順

まずは全てのコンテナを殺す。

```
docker rm `docker ps -a -q`
```

次に全てのイメージを殺す。

```
docker rmi `docker images -a -q`
```

依存関係によっては消えないものもあるので、あとは手動で殺す。

# 参考

- https://github.com/docker/docker/issues/1329

# 環境

- Docker for Mac
- Docker version 1.12.3, build 6b644ec








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Windows > Intel(R) Gigabit CT Desktop Adapter > Network link is disconnected. > 対応方法

```txt:動作確認
Windows 7 pro
```

Windows LogsのSystemを見ている中で以下のWarningが見つかった。

> Intel(R) Gigabit CT Desktop Adapter 
> Network link is disconnected.

Event ID:は27。

以下に対応方法が見つかった。
http://answers.microsoft.com/ja-jp/windows/forum/windows_7-performance/e1cexpress/6db3b732-bc68-4940-af99-58c6edf2a149?auth=1

実際に上記で問題ないかは要動作確認。
nginxをLet's encryptを使ってTLS/SSL化する

Let's encryptが使えるようになってからもかなり放置していたnginxのTLS/SSL化をやっと設定したのでメモ。

## 環境
* Debian 8.6(Jessie) + backports
* letsencrypt 0.9.3
* nginx 1.6.2

aptでインストールとかは省略するがLet's encryptのパッケージはbackportsから取ってくることに注意。

## 手順

certonlyで設定した。これは自分のnginxにLet's encryptのスクリプトが特殊なファイルを作成してそのファイルをLet's encrypt側で存在を確認してサーバーの実在を確認する…という流れになる。

通常のHTMLファイルなどをサービスしている`www.example.org`とアプリケーションサーバのプロキシーになっている`app.example.org`があるとするものとする。

具体的には`www.example.org`のための設定が以下のようだとする(例のためログの設定もしていないことに注意)。

```
server {
        listen 80;

        server_name www.example.org;

        root /var/www/html;
        index index.html;
}
```

次のコマンドを実行する。

```
# certbot certonly
```

ターミナルの対話環境で設定を入力していく。
最初の選択肢で `1 Place files in webroot directory`を選択する。ドメインに`www.example.org`を実行。webrootのディレクトリに`/var/www/html`を指定する。成功するとSSL証明書のファイルが`/etc/letsencrypt/live`の下に作成される。

次にこの証明書を使ってnginxを設定する。

```
server {
        listen 443;

        server_name app.example.org;

        root /var/www/html;
        index index.html;

        ssl on;
        ssl_certificate_key /etc/letsencrypt/live/www.example.org/privkey.pem;
        ssl_certificate /etc/letsencrypt/live/www.example.org/fullchain.pem;
}
```

これで`https://www.example.org`にアクセスしてSSLで通信ができるか確認する。なお，強制的にHTTPSにリダイレクトさせたい場合はHTTP側に次のように設定を追加する。なおcert.pemでは中間証明書が含まれないので使わない。

```
server {
        listen 80;
        listen [::]:80;

        server_name app.example.org;

        root /var/www/html;
        index index.html;
        return 301 https://$host$request_uri; # ここ
}
```

## 特殊な場合

アプリケーションサーバーを使っていて`/`以下が素直にアクセスできない場合以下のような回避策を使った。`.well-known`ディレクトリを使うのがわかっているので特別扱いした。

```
server {
        listen 80;
        listen [::]:80;

        server_name app.example.org;
        root /var/www/app;
        index index.html;

        # .well-known だけ通常のファイルシステムから見る
        location /.well-known/ {
                alias /var/www/app/.well-known/;
        }

        location / {
                # アプリサーバへの接続の設定などなど
        }
}
```

あとは`letsencrypt certonly`を実行しドメイン(`app.example.org`)とwebroot(`/var/www/app`)を指定する。HTTPSの設定やHTTPからのリダイレクトをする方法は前項と同様なので省略。

# メンテナンス
証明書の期限が3ヶ月なので定期的に更新する必要がある。次の通り。

```
# certbot renew
```

ちゃんと更新されるのか確認したいところではあるが古くなってないと更新されないので無理矢理更新するにはオプションをつけて実行する。

```
# certbot renew --force
```

これでコマンド出力で成功が確認できればOK。

# 参考
* http://qiita.com/kga/items/e30d668ec1ac5e30025b
* https://letsencrypt.jp/
* https://cryptoreport.websecurity.symantec.com/checker/ - 証明書の設定を確認してくれる
* https://www.ssllabs.com/ssltest/ - セキュリティ設定が適切かどうか確認してくれる
Docker | docker build と Dockerfile でイメージをビルドする基本

# docker build とは

Dockerfile から独自のイメージをビルドするためのコマンド。

# Dockerfile とは

`docker build` するための手順を書いたファイル。

# イメージを作ってみる

## 1. Dockerfile を作る

適当なイメージを「ベース」にする。

ここでは Dockerhub の公式で配布されている [ubuntuのイメージ](https://hub.docker.com/_/ubuntu/) を元にする。

```:./docker-build/Dockerfile
FROM ubuntu

CMD echo 'Hello docker world!'
```

この `CMD` で指定した内容は、イメージを「作成して固める」ときではなく、固めた後のイメージを「実行」する時に実行される。


# 2. イメージをビルドする

`-t` オプションで名前をつけられる。

`$ docker build ./ -t example`


# 3. イメージをコンテナとして実行する

`Hello World` が出力されるのが分かる。

```
$ docker run example
Hello docker world!
```

# 参考

- https://docs.docker.com/engine/reference/commandline/build/


# 環境

- Docker For Mac
- Docker version 1.12.3, build 6b644ec


# チャットメンバー募集

オープンチャット「アジト 〜プログラマの巣窟〜」
https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Inspectorのシリアライズ

UnityでScriptを作成すると変数がEditerのInspectorに表示され、そこからも値を設定できるようにシリアライズされる機能についてです。

#基本
###表示する方法
<img width="380" alt="Inspector" src="https://qiita-image-store.s3.amazonaws.com/0/82938/f1813864-2faa-2801-2041-303e47725678.png">

publicは自動でシリアライズされる。
staticは`[SerializeField]`を書くことでシリアライズできる。

```csharp:
using UnityEngine;

public class Inspector : MonoBehaviour {
	public bool flag1;
	[SerializeField]
	private bool flag2;
}
```

###表示しない方法
<img width="380" alt="Inspector" src="https://qiita-image-store.s3.amazonaws.com/0/82938/ea7638ce-0db8-e29b-e0e9-d5600717c87b.png">

private変数やstatic変数や定数(const)はシリアライズされない。
`[HideInInspector]`をpublic変数の前につけるとInspectorへの表示を消す。
`[System.NonSerialized]`をpublic変数の前につけるとシリアライズしない。

```csharp:
using UnityEngine;

public class Inspector : MonoBehaviour {
	private bool flag1;
	static bool flag2;
	public const bool flag3;
	[HideInInspector]
	public bool flag4;
	[System.NonSerialized]
	public bool flag5;
}
```

#折りたたみ表示
<img width="380" alt="Inspector" src="https://qiita-image-store.s3.amazonaws.com/0/82938/b70030d3-c6c3-b445-62f0-1df7a510e887.png">

`[System.Serializable]`をクラスの前につけ、そのクラス変数をシリアライズするとInspectorには折りたたんで表示される。

```
using UnityEngine;

[System.Serializable]
public class FriendClass {
	public string name;
	public bool sex;
	public int age;
}

public class Inspector : MonoBehaviour {
	public FriendClass Friend;
}
```
slackの検索で便利機能メモ

## ユーザー抽出
### キーワード
- 自分 me 
- ユーザ名指定 ``` @username ```  

### コマンド
- 自分から発言を抽出 ```from:me```
	- 検索ボックスの横の`@`ボタンでも自分への発言を抽出出来る。ただこちらはアカウント名を指定したメッセージのみだから、from:meはダイレクトメッセージも抽出できる。
- 特定の人から発言を抽出 ```from: ユーザ名 ```
- 自分への発言を抽出 ```to:me```
- 特定の人から発言を抽出(DMのみ) ```to: ユーザ名 ```
- チャンネルを検索 ```in:チャンネル名```

## 日付
- サポートしている日付フォーマット
    - MM/DD/YYYY
    - MM-DD-YYYY  
    - YYYY-MM-DD
    - YYYY/MM/DD  
- キーワード検索
    - 昨日 yesterday
    - 今日 today
    - 今週 week
    - 今月 month 
    - 今年 year

#### コマンド
- ~日より前を抽出 ``` before:日付 ```
- ~日よりも後を抽出 ``` after:日付 ```
- 特定日付内
    - 今週 ```during:week```
    - 今月 ```during:month```
    - もしくは `on:`でも出来る

### その他
- link付きを抽出 ```has:link```
- star付きを抽出 ```has:star```
- emojiを抽出   ```has:emoji名``` 
   - 例 smileの絵文字を抽出 ``` has::smile: ```
 
### おまけ
- 検索入力フォームで+を押すとリファレンスが出ます。
![referrence.png](https://qiita-image-store.s3.amazonaws.com/0/149835/2da4aced-4baf-7c65-c2c2-eb2e3dedd6d5.png)

### 参考ページ
https://get.slack.help/hc/en-us/articles/202528808
RubyでCSVを処理する(駅データの重複レコードの検出)

# やりたかったこと

駅データ.jpさんから駅データをダウンロードしてきて重複した駅を消したかった

# CSVを整理する方法

1. 文字コード(JIS)に気をつけてエクセルで頑張る(戦前からある方法)
2. CSV系アプリを使う(専用アプリだと文字化けしないけどやれることが少ない)
3. Rubyで頑張る(作る！)

## 1. エクセルで頑張る

エクセル先輩は実に素晴らしい。ほぼなんでも出来る。
重複削除もできるしソートなども出来る。あれは表計算ソフトというのは嘘だと思う。

尚、スプレッドシートも重複削除などは出来るんですが、エクセルほど簡単にはいかないっぽい。
Unique関数、Google App Script使うとやれるっぽい。
が、僕個人としてrubyでやっちゃったほうが早そう！と思ってスプレッドシートは回避しちゃいました(どなたか素敵なやり方あったら教えてくださいｗ)。

## 2. CSV系アプリ

なんか良いのあったら教えてください（汗

## 3. Rubyで頑張る

rails consoleを立ち上げてCSVデータをとりあえず変数に格納。
だいぶ古い記事なんだけど
[Ruby標準添付ライブラリcsvのCSV.tableメソッドが最強な件について](http://melborne.github.io/2013/01/24/csv-table-method-is-awesome/)
で解説されているCSVを扱う系の「.table」が素晴らしいと思った。

```
table = CSV.read('station.csv')
```
こんな感じでreadメソッドでもいいんですが、

```
table = CSV.table('station.csv')
```
と、CSVライブラリのtableメソッドを使うとすごく便利でした。

### CSV.tableの何が便利か？

table[0]とかtable[1]とかでreadメソッドでも同じようなデータが出てきます。
が、readでやるとただの配列。
tableでやるとRowでラッピングされて出てきます。

```
table = CSV.table('station.csv')
table[0]
 => #<CSV::Row id:1 name:"東京駅" address:"東京都千代田区丸の内一丁目9-1" ......
```

table[0]とかだとこんな感じ。tableメソッドでなくreadメソッドとほぼ同じ出力。

```
table = CSV.table('station.csv')
table[:name]
 => ["東京駅", "新横浜駅", "品川駅", "東京駅", "小田原駅", "熱海駅", "三島駅", "品川駅", "新富士駅", ......
```
CSVの縦列、カラム名を0,1などの代わりに入れると縦列で抽出が出来ます。すごい。
これで駅名がかぶっているレコードの抽出ができるわけです。すごい(2度目)。


### さて本題！「rubyを使って重複データの抽出」

```
table = CSV.table('station.csv')
table[:name].group_by{|i| i}.reject{|key,value| value.one?}.keys
 => ["東京駅", "品川駅", ......]
```

1. group_byして、同じ値を持っているkeyを探す。
2. rejectしてvalue側が1つしか該当しなかったレコードを除外(ここでは重複だけ欲しいから)
3. keyの名前だけ出す

以上で、重複しているレコードを出せる。

### よくわかる解説(わからなかったらゴメン)

group_byすると、

```
table[:station].group_by{|i| i}
 => {"東京駅"=>["東京駅", "東京駅", "東京駅"], "新横浜駅"=>["新横浜駅"], "品川駅"=>["品川駅", "品川駅"], ......
```
こんな感じで、まさにグルーピングできる。

んで、これに対してrejectすることで、

```
table[:station].group_by{|i| i}.reject{|key,value| value.one?}.keys
 => {"東京駅", "品川駅", ......
```

単一回答(重複してないデータ=ここでは品川駅)を除外することで重複した項目だけ表示できる。

重複してたら1個にしちゃいなさい！みたいなこともできるんですが、一応数十万行をそれでミスったら怖かったので、一応ラスト目検をしたほうがいいだろうと思って抽出までで留まっています。

# 駅データ関係豆知識

[駅データ.jp](http://www.ekidata.jp/)から駅および路線などのデータが**無料**でダウンロード可能。
ただ、一部が欠けていて、有料にすることでフリガナなど足らないデータが補完された全データが取れます。

> 有料データと無料データどちらも、仕様は同じです。
> 無料データは、有料データに対して、以下の情報が含まれていません。
> 
・路線マスタの「路線カラー（コード）」の一部
・路線マスタの「路線カラー(名称）」の一部
・路線マスタの「路線区分」の全部
・駅マスタの「駅名称(カナ)」の全部
・駅マスタの「駅名称(ローマ字)」の全部
・駅マスタの新幹線駅のデータすべて

そもそも駅名データは、東京駅とかだと路線によって東京駅というデータが多数存在してる。
(同じ東京駅ではあるもののJRと新幹線としては別データとして登録されている)
一番エグいデータだと思ったのは**大江戸線の都庁前駅**(上下線＆折り返し線があるため始発駅・終着駅のデータが混在している。氏ねばいいのに)。

単に駅名リストだけ欲しい！みたいに思っても重複がすごくあるので注意すべし(まさにこれで今回困ったんだけどさ)。

※上記サンプルコードの駅データは多少加工した後のデータでごにょっています。駅データjpさんから取ったデータとは少し変わっていますのでご注意ください。
Amazon Linuxのオフィシャルコンテナが DockerHubで公開されましたね

遂に、Amazon LinuxのオフィシャルコンテナがDockerHubで公開されました。
https://hub.docker.com/r/library/amazonlinux/

2016年11月21日時点では Amazon Linuxのバージョンは `2016.09`だけです。

試しに、 `/etc/system-relase`を確認してみます。

```
$ docker run -it --rm amazonlinux /bin/bash
Unable to find image 'amazonlinux:latest' locally
latest: Pulling from library/amazonlinux
67b04f48477e: Pull complete 
Digest: sha256:ec8257763aea7bd6cefce8d217deaf1b184426d3ab5fda2f98428921107cb72e
Status: Downloaded newer image for amazonlinux:latest
bash-4.2# cat /etc/system-release
Amazon Linux AMI release 2016.09
```
Spring Day 2016 レポート

## Application Re-Architecture Technology

Struts 1.x系からSpring MVCへの移行した際の事例紹介。
事例ベースでこんなところでハマったよー というお話も良かったのですが、
移行までの計画の事例や、自動で移行出来るものの整理、移行時に流用出来るものの整理は、なるほどなーと思う内容でした。

## Java EEユーザーから見たSpring

Java EEユーザがSpring Frameworkを使ってみて感じたこと。
Java EEのユーザではないのでJava EEの説明になるほど～と頷いてしまった。。。
とは言ってもSpringについての説明で、ためになるものも色々とあった。

- DI時にコンストラクタインジェクション推奨
 - コンストラクタ内でチェック出来たほうが便利
 - フィールドインジェクションだとついつい、フィールドを増やしすぎる（たしかに・・・）
- Springの方が画面有りの機能は作りやすい（出発地点が違うというのもありますが）
- REST APIでJava EEに分があると思っていたが、実際には大差ない。（Springが良くなっている）

## Let's Visualize Your Spring Cloud Applications!

https://t.co/IOas8Fqqrv

今後マイクロサービス化を進めていくとなると運用での可視化が必須担ってくると思い、拝聴してきました。
ツールの説明等は割愛するのでスライドで確認してみてください。

### 今回の話は主に以下の3点
- サービス感の依存性を可視化
- ログファイルを可視化
- サーバやプロセスの状態を可視化

### Spring Cloud Sleuth + Zipkin でサービス間の依存関係を可視化
- 改修時などに影響範囲を確認したい。
- エラー時に確認すべき範囲を特定したい。
- 実際に利用されていないサービスがあれば停止したい。

Dev向け。
マイクロサービス化するとなると必須になってくる情報だと思います。
大量のサービスを経由して動作する用になるため、依存関係がはっきりしていないと迂闊に改修出来なくなりそう。

### Elasticsearch + Logstash + Kibana + Filebeat でログファイルを可視化
- アプリケーションログの可視化
 - システムが安定稼働してるかの把握
- アクセスログの可視化
 - 適切にレスポンスを返せているかどうかの把握
 - 急激なアクセス増などが起きていないかの把握

Ops向け。（Dev向けも含まれてるかな）
サービスの拡大に伴って、ログが増加、重要なログが埋もれるのでは。。。という危機感があったのでタイムリーな話でした。
Elasticsearchを利用することで、雑にログを取り込んで置いて後から集計軸を変えるなども可能なので、実際の運用に合わせてチューニング出来るのは非常に良いと感じました。

### Elasticsearch + Kibana + Metricbeat でサーバやプロセスの状態を可視化
- サーバリソースの状態を把握
- 異常時にリソース情報とログ情報を並べて確認

リソースの確認はどこでもやっているのでしょうが、ログ情報と並べて確認するというのがポイントです。実際にトラブルが起きるとリソースの状態とログを突き合わせていますが、この辺りの作業が楽になりそうな気がします。
また、ログを日常的に見る習慣が付けば今まで気がついていなかったトラブルの予兆（実は問題ありの機能）に気づけるかもしれません。

## Microservices Architectureを超大規模プロジェクトでやってみた。
https://speakerdeck.com/kingofreverb/microservices-architecturewochao-da-gui-mo-puroziekutodeyatutemita

大規模プロジェクトで実際にMicroservices Architectureへの移行した事例を元に色々と説明をしてくださいました。
技術的な内容よりも、チームのあり方や精神的なものを全面に出したお話で、意外と聞けるチャンスの少ない話だったので興味深々でした。
全部まとめると長いので、気になったところだけ抜粋です。

### MSAへの移行は難しい、けど出来る！
精神的な難しさを以下のように表現していました。

- 「諦める事」への慣れ
- 「仕様」という言葉の魔法感
 - ノーガードになる
- パラダイムシフトを許容できない
 - 目に見える範囲で「改善」を積み上げる

逆に技術的な難しさについては、結局は組み合わせなのでなんとかなるという趣旨のことを言っていました。
このあたりは共感出来るところもあって、普段の現場でも当てはまるところあるな。。。と思わずにはいられませんでした。

### 依存性の分割
実際にシステムを分割していく上で、「意味ある単位」にシステムを分解する。

- 業務機能での何となくの塊（完璧でなくていい）
- 共通機能と業務機能は絶対に別
 - ここは理解が得られやすい

共通分は意外と切り出しやすいので、まずは分割してみてるということを言っていました。
ソースを綺麗にするのは置いておいて、まずは優先的に切り出せるものから手を付けるのは良いなと感じました。
※全部まとめてやろうとするとやる気が起きないだろうな。。。と

### システム構成はシンプルに
要は、何事もシンプルな構造にする方が良いということで、MSAもApplicationとLibraryに分けて、Application間での通信はWebAPIで統一する。
といった感じで、極力シンプルにすることを推奨していました。
これは同意見で、変に凝りだすと後々、手が入れづらかったり、勘違いが起こるのでシンプルイズベストかなと思います。

### ビルドの単位を切り離す
ビルドの単位も機能毎に分ける。
開発担当のやることが増えるかもしれないが、担当が名確になり、責任感が生まれる。

### データの分割
理想解はデータはサービス間で共有しない。
ここはある程度の諦めも必要ではないかと話していました。
実際は、自社のサービスを考えてみても、機能ごとにサービス化しても複数のサービスに跨って利用されるデータは多いと思います。

### その他、施策等
- リリースはwarからDockerファイルへ
- CIの役割を明確にする（jenkins名人ががんばらない、MS単位のリグレッションテスト、MS間の結合テスト）
- スライドのまとめのところを確認してください。。。

時系列に添って、どのようなアプローチを試し、その改善策を考えてきたのかを説明してくださいました。
技術的なアプローチももちろんですが、個々人の意識が改善されるように啓蒙活動するのが大切と強く言っていました。


## まとめ
Springの話を聴きに行ったのですが、MSAの話が色々なところで出ており、
世間的にMSAへの移行が進んでいるのを感じました。
クリアする課題は非常に多いとは思いますが、ある程度の割り切りで
一歩ずつ進むのも重要なのかも？　と思いました。
XCUITestでスクリーンショットを撮るコツ

# XCUITestのコツ

fastlaneのsnapshotでスクリーンショット取得を自動化するのに必要になったので、使ってみました。

- [UITestの導入とチートシート](https://qiita.com/hanawat/items/79bc81ed87704b15f3cd)
- [XCTest - User Interface Tests](https://developer.apple.com/documentation/xctest/user_interface_tests)

## はじめに

UIテストでは、Viewの階層は、XCUIElementというUI要素のツリーとして見えます。このツリーにクエリーをかけてUI要素を特定し、そのUI要素に、```exists```で存在を```XCTAssert()```で確認したり、```tap()```や```typeText()```などで操作することで、テストケースが進んでいきます。

最初にやる手順は、

- File - New - Target - iOS UI Testing Bundleで、UITestを作成する (プロジェクト作成時に作ってあれば、それでOK)
- test...()メソッドの中で、Xcodeのレコーディングボタン(左下の赤い丸)を押し、シミュレータのアプリを操作して、テストコードを生成する
    - 運が良ければそのまま実行できます
    - エラーになる場合、ブレークポイントで止めて、デバッガでXCUIElementのツリーや要素の状態を調べて、問題を解決していきます

```
po app
po app.searchFields
po app.searchFields.element
```

## UI要素(XCUIElement)を特定する

XCUIElementのクエリーは、直接の子供だけでなく、配下の子孫まで全部クエリーして、複数の要素を返してくれます。操作したいUI要素を特定するには、いくつか方法があります。

- あるタイプのUI要素が画面に一つしかないなら、```app.buttons.element```の様に、決め打ちでOK。
- テキストでクエリーして取る。```app.buttons["Back"]```
- accessibilityIdというプロパティを設定して、それを指定して取る。
- 位置による指定: 何番目のUI要素かで取る。```.elementBoundByIndex(3)```
    - この場合、直接の子要素の中の順番で指定する方が、変更に強いかもしれません。 ```.childrenMatchingType(.Other).elementBoundByIndex(3)```

## なぜかUI要素がないエラーになるのを回避する

画面サイズ、言語設定、タイミングなどで、UIテストが失敗することがあります。ある程度柔軟に書いておきましょう。

- 時間のかかるところではsleep(1)等を入れてみる。
    - 一応アプリがidleになるのを待ってから、次の処理を実行してくれるのですが、通信に時間がかかったりすると、idleになったと判断して次に進んでしまうことがあるようです。
- 言語が変わるとボタンなどの名前が変わることがあるので、デバッガなどで名前を見てみる。
- tap()する前にexistsをチェックし、可能なら代替手段を使う。

### 特定の言語でテストを実行する

```swift
    override func setUp() {
        super.setUp()
        let app = XCUIApplication()
        app.launchArguments += ["-AppleLanguages", "(ja)"]
        app.launchArguments += ["-AppleLocale", "ja_JP"]
        app.launch()
    }
```

## 実行する度に結果が変わってしまうのを回避する

アプリに、前回の状態を保存しておいて再開するような機能がある場合、テストの度にスナップショットの結果が変わってくることがあります。この場合、必要であればアプリ側に、特定の状態にリセットする機能を仕込んでおくと良いです。

- TextFieldやTextViewの文字をクリアする (やや面倒なので後述)
- キャッシュを削除する
- 地図のカメラを決まったポジションにする

### テキストをクリアするXCUIElementの拡張

テキストをクリアするXCUIElementの拡張です。

```swift
extension XCUIElement {
    func clearText() {
        guard let text = value as? String else {
            XCTAssert(false, "Not a text element.")
            return
        }
        if text.isEmpty {
            return
        }
        if buttons["Clear text"].exists {
            buttons["Clear text"].tap()
            return
        }
        tap()
        let selectAll = XCUIApplication().menuItems["Select All"]
        if selectAll.exists {
            selectAll.tap()
            typeText(XCUIKeyboardKeyDelete)
            return
        }
    }
}
```

使用例

```swift
    let app = XCUIApplication()
    let searchField = app.searchFields.element
    searchField.tap()
    searchField.clearText()
    searchField.typeText("Ramen")
    app.keyboards.buttons["Search"].tap()
```
Botkit + Herokuで動かしていたslackbotがある日突然R10 (Boot timeout)エラーを吐き始めた時の対処法


## 解決方法

botkit.slackbotを初期化する時に{hostname: '0.0.0.0'}を渡してあげる。

つまり、

```
var controller = botkit.slackbot({
  debug: false,
  json_file_store: './simple_storage/'
}).configureSlackApp({
  clientId: process.env.BOTKIT_SLACK_CLIENT_ID,
  clientSecret: process.env.BOTKIT_SLACK_CLIENT_SECRET,
  scopes: ['commands']
});
```

を

```
var controller = botkit.slackbot({
  hostname: '0.0.0.0', // <- これを追加
  debug: false,
  json_file_store: './simple_storage/'
}).configureSlackApp({
  clientId: process.env.BOTKIT_SLACK_CLIENT_ID,
  clientSecret: process.env.BOTKIT_SLACK_CLIENT_SECRET,
  scopes: ['commands']
});
```

にする。

## 環境

```
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.12.1
BuildVersion:   16B2555
$ node -v
v6.9.1
$ npm -v 
3.10.8
```

## 問題
前日までは全く問題なく動いていたのに、ある日ちょっとした修正をしていつも通り`git push heroku master`してHerokuにデプロイすると、ちょうど１分後に

```
 :
 : 
2016-11-20T20:21:23.350453+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2016-11-20T20:21:23.350453+00:00 heroku[web.1]: Stopping process with SIGKILL
2016-11-20T20:21:23.496229+00:00 heroku[web.1]: Process exited with status 137
2016-11-20T20:21:23.498989+00:00 heroku[web.1]: State changed from starting to crashed
```

というエラーが発生して、slackbotがダウンしてしまう。

原因は不明だけど、[このissue](https://github.com/howdyai/botkit/issues/491)をみてとりあえずその通りにしたら治った。
Excel 2013 > link > 見出し行の印刷設定

```txt:動作環境
Excel 2013 on Windows 8.1 pro
```

1400行ほどあるExcelファイルの一部を印刷したい。
その時に項目名が記載された見出し行を印刷したい。

http://www.tipsfound.com/excel2013/07009
に記載の方法で「印刷タイトル」>「タイトル行」を設定すればよい。
Docker | docker image を ダウンロードする / 削除する

# イメージのダウンロード

## 実行

`docker pull` する。

`$ docker pull hello-world`

## 確認

イメージの一覧を見ると、ダウンロードされているのが分かる。

```
$ docker images | grep hello

hello-world         latest              c54a2cc56cbb        4 months ago        1.848 kB
```

# イメージの削除

## 実行

イメージ名を指定して `docker rmi` ( remove image ) する。

```
$ docker rmi hello-world
```

## 確認

イメージが削除されているのが分かる。

```
$ docker images | grep hello
```

# イメージの削除に失敗する時

「コンテナ」が「イメージ」を使っていて消せない場合。

```
$ docker rmi hello-world
Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container 6588acea9641 is using its referenced image c54a2cc56cbb
```

## 原因

```
$ docker run hello-world
```

でコンテナを立ち上げているせい。


## コンテナの状態を確認する

`docker ps` で確認すると、コンテナ ( `6588acea9641` ) が イメージ ( `hello-world` ) を使っているっぽい。

```
$ docker ps -as | grep hello-world
6588acea9641        hello-world         "/hello"            About a minute ago   Exited (0) About a minute ago                       drunk_kowalevski    0 B (virtual 1.848 kB)
````

## コンテナを殺す

`docker rm` で該当のコンテナを殺す。

```
$ docker rm 6588acea9641
6588acea9641
```

## 再度イメージの削除を実行する

無事f成功した。

```
$ docker rmi hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Deleted: sha256:c54a2cc56cbb2f04003c1cd4507e118af7c0d340fe7e2720f70976c4b75237dc
Deleted: sha256:a02596fdd012f22b03af6ad7d11fa590c57507558357b079c3e8cebceb4262d7
```

# 環境

- Docker version 1.12.3, build 6b644ec
- Docker for mac








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
BigQuery Standard SQLで配列の差集合を求める方法


$A$と$B$を配列として時に、$A \setminus B$となる配列を返すUDF関数を作ってみました。

```sql
#standardSQL
CREATE TEMPORARY FUNCTION ARRAY_INT64_INCLUDE(arr ARRAY<INT64>, val INT64)
RETURNS BOOL AS ((
  SELECT LOGICAL_OR(elem = val) FROM UNNEST(arr) as elem
));

CREATE TEMPORARY FUNCTION ARRAY_INT64_SUB(arr1 ARRAY<INT64>, arr2 ARRAY<INT64>)
RETURNS ARRAY<INT64> AS ((
  SELECT ARRAY(SELECT val FROM UNNEST(arr1) AS val WHERE NOT(ARRAY_INT64_INCLUDE(arr2, val)))
));

SELECT ARRAY_INT64_SUB([1, 2, 3, 4, 5], [2, 3, 4])
```
BigQuery Standard SQLで配列の共通部分を求める方法


$A$と$B$を配列として時に、$A \cap B$となる配列を返すUDF関数を作ってみました。

```sql
#standardSQL
CREATE TEMPORARY FUNCTION ARRAY_INT64_INCLUDE(arr ARRAY<INT64>, val INT64)
RETURNS BOOL AS ((
  SELECT LOGICAL_OR(elem = val) FROM UNNEST(arr) as elem
));

CREATE TEMPORARY FUNCTION ARRAY_INT64_AND(arr1 ARRAY<INT64>, arr2 ARRAY<INT64>)
RETURNS ARRAY<INT64> AS ((
  SELECT ARRAY(SELECT val FROM UNNEST(arr1) AS val WHERE ARRAY_INT64_INCLUDE(arr2, val))
));

SELECT ARRAY_INT64_AND([1, 2, 3], [2, 3, 4])
```
SQLクエリでsatoshiで記録されているものをbtc表記にするメモ

単純に1e-8するだけだと浮動小数点の誤差がでるので桁を指定してroundで四捨五入する

```
select round(satoshi * 1e-8, 8) as btc from user_balances;
```

集計する場合は先にsumしてから四捨五入する

```
select round(sum(satoshi) * 1e-8, 8) as btc from user_balances;
```
ホスト側のCronで docker run する

# 結論

この記事を書いた直後に、別の解決策を発見してしまった。

```bash:crontab
* * * * * docker run -i some-image some-command
```

癖で`docker run -it`してしまっていたのが原因でした。

↓ここから下は模索中で、恐らく役に立たない記事です。

# やりたいこと

定期的に、Dockerイメージを動かしたい。

Docker内部のCronから動かすのではなく、ホスト側のCronで`docker run`したい。

最初、

```bash:crontab
* * * * * docker run -it some-image some-command
```

としていたが、`the input device is not a TTY`と怒られてしまう。

そこで、予めコンテナを作成&実行しておき、そのコンテナにCronからコマンドを渡すという方法があるらしい。
実行するコマンドは、停止しなければ何でも良い。

```bash
docker run -it -d --name some-container some-image tail -f /some/log.log
```

```bash:crontab
* * * * * docker exec some-container some-command
```

# メモ

- `docker exec -it`とすると、また怒られてしまう
- `--rm`オプションを付けないと、コンテナ名が重なってしまい不可
- `-d`オプションで、デーモンっぽく起動できる
- `--rm`オプションと`-d`オプションは併用できない。なんで？
- Docker内部にCronをインストールしてしまって、`cron -f`とかで起動しっぱなしにしておいた方が楽かも？

# 参考

- http://unix.stackexchange.com/questions/258222/how-to-run-builds-in-docker-containers-from-jenkins
- http://www.it1me.com/it-answers?id=29380344&ttl=docker+exec+-it+command+returns+following+error+%26quot%3Bcannot+enable+tty+mode+on+non+tty+input%26quot%3B
Python自動実行ではまったこと

Python超初心者の私がはまったことをメモ書き程度に書いていこうと思います。

#絶対パスと相対パスではまった･･･

ラズパイに手を出したタイミングでPythonをはじめて触りました。なのでpython超初心者です。
ラズパイと超音波センサーを組み合わせて、ある一定距離まで近づいたら、音声ファイルを再生するようなプログラムを書きました。
内容は、実際に取得した値（距離）をログファイルに書き出し、80cm以下になったときに音声ファイルを再生させました。

まず、pythonファイルを手動でコマンドを実行！
センサーに手を近づけると正常に音声ファイルを実行してくれました。

その次にラズパイを起動したとき、自動でpythonファイルを実行するように手を加えました。
（/etc/rc.localにコマンドを追記するだけの簡単なお仕事）
ラズパイを起動後、ログファイルを開き、センサーが動いていることを確認した後、センサーに手を近づけると、
あれ？音声ファイルが再生されない･･･でも値は80cm以下になってる･･･どうなってるんだってばよ･･･
プログラミング自体初心者の私はこの時点で軽く混乱してしまいました。

いろいろと試行錯誤をした結果、音声ファイルを再生するpythonファイルを指定するパスが相対パスで書かれていたのが原因でした。

・変更前

```test.py
  if (read_distance()) < 80:
      check = subprocess.Popen(['python','music.py'])
      print check
```
・変更後

```test.py
  if (read_distance()) < 80:
      check = subprocess.Popen(['python','/home/pi/music.py'])
      print check
```

今まで相対パスで書くことが多かったので、無意識に相対パスで書いてしまいました。
相対パスで書いてしまうと、基準となるディレクトリが変わってしまうので、絶対パスで書いておくのが無難みたいですね。

こんな簡単なことでも、忘れたころに同じ過ちを繰り返さないように書いておこうと思いました。
新しい言語でプログラミングするのは忍耐力が必要だと感じています･･･
debファイルからインストールする際に依存関係で悩んだら

# 概要
debファイルを`dpkg`コマンドでインストールしようとすると、依存関係で悲しい思いをすることが多々ある。
頻繁にやることでも無いのでいつもどうやって解決するのか忘れてしまう。ということでメモっておく。


# gdebiを使う
`gdebi`と言う依存関係の問題を自動で解決してくれるツールがあるのでこれに頼る。

## インストール方法
aptitudeでサクッとインストールできるので、サクッとインストールしちゃう。

```shell-session
sudo apt install gdebi
```

## 使い方
```shell-session
sudo gdebi [パッケージ名]
```


# 解決できない場合は…
launchpadで検索。大抵の場合はdebファイルが手に入るはず。
[Ubuntu in Launchpad](https://launchpad.net/ubuntu)


# 参考文献
[» ローカルでdebパッケージをインストールするとき依存関係も解決してくれる「gdebi」](http://unskilled.site/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%A7deb%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D/)
BigQuery Standard SQLで配列の和集合を求める方法


$A$と$B$を配列として時に、$A \cup B$となる配列を返すUDF関数を作ってみました。

```sql
#standardSQL
CREATE TEMPORARY FUNCTION ARRAY_INT64_OR(arr1 ARRAY<INT64>, arr2 ARRAY<INT64>)
RETURNS ARRAY<INT64> AS ((
  SELECT ARRAY_CONCAT_AGG(arr) FROM (
    SELECT arr1 AS arr UNION ALL 
    SELECT arr2
  )
));

SELECT ARRAY_INT64_OR([1, 2, 3], [2, 3, 4])
```
BigQuery Standard SQLである要素が配列中に含まれているかどうかを判定する方法


ある要素が配列の中に含まれているかどうかを判定するUDF関数を作ってみました。

```sql
#standardSQL
CREATE TEMPORARY FUNCTION ARRAY_INT64_INCLUDE(arr ARRAY<INT64>, val INT64)
RETURNS BOOL AS ((
  SELECT LOGICAL_OR(elem = val) FROM UNNEST(arr) as elem
));

SELECT ARRAY_INT64_INCLUDE([1, 2, 3], 4)
```
GoogleStaticMapで日本語の地図を取得する

# 困ったこと

https://maps.googleapis.com/maps/api/staticmap?center=34.71360393,135.32154121&zoom=15&size=275x191&markers=34.71360393,135.32154121&sensor=true&width=275&height=191&key=AIzaSyBAEHi7Z9UA3628IuCRr0USgFSVhjwlttk&language=jp

![image](https://qiita-image-store.s3.amazonaws.com/0/69406/6f0ea20f-3cdc-b80a-cb15-6e321a2dfa96.png)


で表示されているものと

```bash
$ wget "https://maps.googleapis.com/maps/api/staticmap?center=34.71360393,135.32154121&zoom=15&size=275x191&markers=34.71360393,135.32154121&sensor=true&width=275&height=191&key=AIzaSyBAEHi7Z9UA3628IuCRr0USgFSVhjwlttk&language=jp"
```

で取得されるものが違う。

![image](https://qiita-image-store.s3.amazonaws.com/0/69406/fad1e2c7-30b1-50d9-47a9-56424f2bfc6a.png)

※http://www.ajaxtower.jp/googlestaticmaps/para/index11.html このへんの設定ができていないわけではない。

# 解決

リクエストヘッダーに``Accept-Language: jp``を付ける。

```bash
$ wget --header="Accept-Language: ja" "https://maps.googleapis.com/maps/api/staticmap?center=34.65188449,135.0342171&zoom=15&size=275x191&markers=34.65188449,135.0342171&sensor=true&width=275&height=191&key=AIzaSyBAEHi7Z9UA3628IuCRr0USgFSVhjwlttk&language=jp"
```

これでOK。

![image](https://qiita-image-store.s3.amazonaws.com/0/69406/6f0ea20f-3cdc-b80a-cb15-6e321a2dfa96.png)
GoogleChrome | Vimium | Shift + x 系のキーを除外設定する

大文字を設定すれば良い。
たとえば <kbd>Shift + b</kbd> を除外する場合は除外設定に `B` を入力する。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/2e8b92f9-3437-54ab-9558-5d552f7e9f50.png)

# 環境

- Vimium 1.57








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Rustの定数一覧

### i8 & i16 & i32 & i64

```rust

// MAX
std::i64::MAX

// MIN
std::i64::MIN
```

### u8 & u16 & u32 & u64

```rust

// MAX
std::u32::MAX

// MIN
std::u32::MIN
```

### f32 & f64

```rust
// ネイピア数e
std::f64::consts::E

// 1/π
std::f64::consts::FRAC_1_PI

// 1/sqrt(2)
std::f64::consts::FRAC_1_SQRT_2

// 2/π
std::f64::consts::FRAC_2_PI

// 2/sqrt(π)
std::f64::consts::FRAC_2_SQRT_PI

// π/2
std::f64::consts::FRAC_PI_2

// π/3
std::f64::consts::FRAC_PI_3

// π/4
std::f64::consts::FRAC_PI_4

// π/6
std::f64::consts::FRAC_PI_6

// π/8
std::f64::consts::FRAC_PI_8

// ln(10)
std::f64::consts::LN_10

// ln(2)
std::f64::consts::LN_2

// log10(e)
std::f64::consts::LOG10_E

// log2(e)
std::f64::consts::LOG2_E

// π
std::f64::consts::PI

// sqrt(2)
std::f64::consts::SQRT_2

// Approximate number of significant digits in base 10.
std::f64::DIGITS

// Difference between 1.0 and the next largest representable number.
std::f64::EPSILON

// Infinity
std::f64::INFINITY

// Number of significant digits in base 2.
std::f64::MANTISSA_DIGITS

// Largest finite f64 value.
std::f64::MAX

// Maximum possible power of 10 exponent.
std::f64::MAX_10_EXP

// Maximum possible power of 2 exponent.
std::f64::MAX_EXP

// Smallest finite f64 value.
std::f64::MIN

// Minimum possible normal power of 10 exponent.
std::f64::MIN_10_EXP

// One greater than the minimum possible normal power of 2 exponent.
std::f64::MIN_EXP

// Smallest positive normal f64 value.
std::f64::MIN_POSITIVE

// Not a Number (NaN).
std::f64::NAN

// Negative infinity
std::f64::NEG_INFINITY

// The radix or base of the internal representation of f64.
std::f64::RADIX
```
bootstrap3のpanelの高さを揃える

## panelの高さが揃わない

bootstrap3でパネルを使っていたのですが、高さの揃え方がわからなかったので調べました。
まず、現状はこんな感じでした。わかりやすくするために、カラムの背景を赤と緑にしています。

![高さが揃わないカラム](https://qiita-image-store.s3.amazonaws.com/0/10078/c0e2ad00-9e05-d9dd-561f-84afd0cca86f.png)

## 解決方法

### まずカラムの高さを揃える

カラムの高さを揃えるには、以下のページの要領で、flexを使って揃えることができるようです。

[Bootstrap equal-height columns experiment](http://getbootstrap.com.vn/examples/equal-height-columns/)

```scss
.row-eq-height {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
}
```

flexのため、利用できるブラウザ環境はIE10以上になりますのでご注意を。
ひとまず、これでカラムの高さは揃いました。

![高さが揃ったカラム](https://qiita-image-store.s3.amazonaws.com/0/10078/fe732a51-bc10-117f-3f74-4feb663b628a.png)


### パネルの高さを揃える

次に、パネルの高さを揃えます。
単純に、`.panel`の高さを100%にします。

```scss
.row-eq-height {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  .panel {
    height: 100%;
  }
}
```

これで、パネルの高さを揃えることができました！

![パネルの高さが揃った](https://qiita-image-store.s3.amazonaws.com/0/10078/43abd2b5-6f17-af1b-d555-5b6a1383c721.png)

### 微調整する

`.panel`のheightを100%にすると、bootstrap3の要素は基本的にboxのため、まんま全部占有してしまうので、パネルの下のほうの空白が広くなりすぎるのが気になったので、微妙に調整しました。合計で100%になるように、heightとmargin-bottomを調整します。

```scss
.row-eq-height {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  .panel {
    height: 97%;
    margin-bottom: 3%;
  }
}
```

![微調整した状態](https://qiita-image-store.s3.amazonaws.com/0/10078/afb811d9-de20-bd63-ecf1-dc8f486fddbb.png)

以上です。
Railsでメールを送信（最初の一歩）


# 目的
Railsでメールを送信する仕組みを理解するためのベースとなるコードを書く。

# 前提
* 既にメールを送るための設定（SMTPサーバとか）がconfig/environments/でなされている。

# 方法
1. app/mailers/にメールを送るクラスを作成する。
2. app/veiws/にメールの本文を作成する。
3. メールを送る

# コード
1. app/mailers/にメールを送るクラスを作成する。

	```app/mailers/test_mailer.rb
	class TestMailer < ActionMailer::Base
	  default to:   yourmail@yourmail.com
	  default from: yourmail@yourmail.com
	
	  def test_mail(message)
	    mail(subject: 'テストメールです。')
	    @message = message
	  end
	end
	```

2. app/veiws/にメールの本文を作成する。

	```app/views/test_mailer.text.rb
	最初の行です。
	<%= @message %>
	最後の行です。
	```

3. メールを送る
	TestMailer.test_mailを呼び出す。
	今回は、最低限動くコードを書きたいだけなので、rails cで実行して確認する。

	```shell-session
	-> % rails c
	Loading development environment (Rails 4.1.0)
	
	Frame number: 0/5
	[1] pry(main)> TestMailer.test_mail('test').deliver
	  Rendered test_mailer/test_mail.text.erb (2.4ms)
	
	TestMailer#test_mail: processed outbound mail in 33.2ms
	
	Sent mail to yourmail@yourmail.com (2668.1ms)
	Date: Mon, 21 Nov 2016 04:14:51 +0900
	From: yourmail@yourmail.com
	To: yourmail@yourmail.com
	Message-ID: <xxxxxx@MacBook.local.mail>
	Subject: =?UTF-8?Q?=E3=83=86=E3=82=B9=E3=83=88=E3=83=A1=E3=83=BC=E3=83=AB=E3=81=A7=E3=81=99=E3=80=82?=
	Mime-Version: 1.0
	Content-Type: text/plain;
	 charset=UTF-8
	Content-Transfer-Encoding: base64
	
	XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
	
	=> #<Mail::Message:99999999999, Multipart: false, Headers: <Date: Mon, 21 Nov 2016 04:14:51 +0900>, <From: yourmail@yourmail.com>, <To: yourmail@yourmail.com>, <Message-ID: <XXXXXXXXXXXXXX_XXXXXXXXXXXXXXX@MacBook.local.mail>>, <Subject: テストメールです。>, <Mime-Version: 1.0>, <Content-Type: text/plain>, <Content-Transfer-Encoding: base64>>
	
	```
	
# 小ネタ
## メソッド毎にfromやtoを変えたい場合
mail(to: '' , from: '')をつかう。

```app/mailers/test_mailer.rb
class TestMailer < ActionMailer::Base
  default to:   yourmail@yourmail.com
  default from: yourmail@yourmail.com

  def test_mail(message)
    mail(subject: 'テストメールです。')
    @message = message
  end
  
  def special_mail(message)
    mail(subject: 'テストメールです。', from: 'special@yourmail.com', to: 'special@yourmail.com')
    @message = message
  end

end
```

https://www.qoosky.io/techs/51a6ac8189
じゃまなキャリッジリターンを消しさる

シェルスクリプトを実行すると『そのようなファイルやディレクトリはありません』や『コマンドが見つかりません』と出る場合 、改行コードが邪魔っけだったりしたので備忘録しておきます。

```
perl -i -pe 's/\r//g' *.sh
```

参考
http://pentan.info/server/linux/sh_error_crlf.html
fluent-plugin-rewriteが最新のfluentdを呼んでくるのでバージョン固定した

備忘録です。

fluent-plugin-rewriteが0.0.14を入れると芋づるで最新のfluentd本体0.14.8が入ってしまい、
最新のfluentdの0.14はまだtd-agentのpackageもマニュアルも正式版であるような話もエラー遭遇時点(2016/11)でみかけないが
依存関係のエラーで起動しなくなったりtd-client新しいの入れてもwarnがログに出てたりしていたということで固定しました。

chef的には以下のようにバージョン固定
 
```
gem_package "fluent-plugin-rewrite" do
  gem_binary "/opt/td-agent/embedded/bin/fluent-gem" 
  version "0.0.13" 
  options "--no-rdoc --no-ri" 
end
```

コマンドだと以下のようなかんじ

```
td-agent-gem install -v 0.0.13
か
/opt/td-agent/embedded/bin/fluent-gem install -v 0.0.13
```

※chefリポジトリなおしてイメージビルド側修正してなかったりすると二重に入ったりで要注意

以上。


http://www.slideshare.net/repeatedly/fluentd-v014-overview
gitlabのユーザのblockを解除

なんだか検証環境のgitlabのユーザがブロックされてると報告があり対処したことの備忘録です。

Unblockボタンおすと、画面に以下のメッセージが出てました。

`This user cannot be unlocked manually from GitLab`

ちょっとこの文言で検索かつ最近のログを眺めるとかldap側の期限きれてないか確かめるって感じかなと思って調べたところ、、

https://gitlab.com/gitlab-org/gitlab-ce/issues/13179
こちら↑にあるとおり、users.stateをupdateしたら画面上もステータス変わりました。


```
# grep 'db' /etc/gitlab/gitlab.rb
# gitlab-psql gitlabhq_production -h gitlab-db-psql.hoge.local -U gitlab
gitlabhq_production=> \d
gitlabhq_production=> \d users;
gitlabhq_production=> select * from users where username='yama';
gitlabhq_production=> update users set state='active' where username='yama';
UPDATE 1
gitlabhq_production=> select * from users where username='yama';
gitlabhq_production=> \q
```

へーそんなんでいいんかいな、と思ったりはしました。

以上。
サーバ上でmatplotlibを使うときのノート

matplotlibを使ってサーバ側で作図する(savefig()など)場合、

```
Traceback 
...
RuntimeError: Invalid DISPLAY variable
```
などと怒られる場合がある。
これは、表示先のDISPLAYが設定されていないことに原因しているらしい。
解決方法１は良く見るけど、それでもダメだったときのノート。

#解決方法1

```py
import matplotlib
matplotlib('Agg')
import matplotlib.pyplot as pet
```

#解決方法2

```py
import matplotlib.pyplot as plt
plt.switch_backend('agg')
```