読者です 読者をやめる 読者になる 読者になる

Docker for Mac で Kibana を動かした

Docker OSX

Docker for Mac を試してみたかったので以下の記事を参考にさせていただきつつ、さわってみました。

dev.classmethod.jp

dev.classmethod.jp

アプリケーションは以下からダウンロードできますが、今回は Homebrew を使ってインストールしました。

www.docker.com

$ brew install Caskroom/cask/docker

Dockerhub からイメージを pull してきます。

$ docker pull elasticsearch:5.1.1
$ docker pull kibana:5.1.1

さっそくdocker runで動かします。

$ docker run --name elasticsearch511 -p 9200:9200 -p 9300:9300 -d elasticsearch:5.1.1
$ docker run --name kibana511 -e ELASTICSEARCH_URL=http://elasticsearch511:9200 -p 5601:5601 --link elasticsearch511:elasticsearch511 -d kibana:5.1.1

これで、localhost:5601にアクセスするとブラウザで確認ができる。

コマンドラインで2進数、8進数、10進数とかの変換を行う

OSX 作業メモ

サブネットマスクの確認したいときに、わざわざググるほどでないという時に。

$ echo "obase=2; ibase=10; 11" | bc
1011

10進数から2進数に変更する例。入力(ibase)に10、出力(obase)を2に変換する。

逆引きUNIXコマンド/bcコマンドで16進数、10進数、8進数、2進数の変換・計算を行う - Linuxと過ごす

MySQL でデータの範囲ごとにデータの個数を集計する

MySQL 作業メモ

MySQL のデータを範囲ごとにデータの個数を集計したいと思いました。以下の記事に書いてあることを MySQL でやりたかったので調べました。

[Excel] データの範囲ごとにデータの個数を集計する - ピボットテーブルを利用した 値の範囲ごとの人数集計 (年代、価格帯、得点帯での集計方法)

環境

$ mysql --version
mysql  Ver 14.14 Distrib 5.6.34, for osx10.11 (x86_64) using  EditLine wrapper

準備

今回はサンプルとして0 ~ 100 点までの成績の集計を想定します。

mysql> create database sampletables;
Query OK, 1 row affected (0.02 sec)

mysql> use sampletables
Database changed

mysql> create table student(name varchar(20), score int(10));
Query OK, 0 rows affected (0.04 sec)

mysql> insert into student (name, score)
    -> values
    -> ('Alice', 80),
    -> ('Bob', 75),
    -> ('Charlie', 63),
    -> ('Carol', 91),
    -> ('Dave', 53),
    -> ('Eve', 88),
    -> ('Ellen', 72),
    -> ('Franc', 47),
    -> ('Isaac', 65),
    -> ('Ivan', 32),
    -> ('Justin', 68),
    -> ('Mallory', 39),
    -> ('Marvin', 49),
    -> ('Mallet', 12),
    -> ('Matilda', 18),
    -> ('Oscar', 70),
    -> ('Pat', 74),
    -> ('Peggy', 37),
    -> ('Victor', 44),
    -> ('Plod', 55),
    -> ('Steve', 98),
    -> ('Trent', 84),
    -> ('Trudy', 52),
    -> ('Walter', 79),
    -> ('Zoe', 77);

mysql> show tables;
+------------------------+
| Tables_in_sampletables |
+------------------------+
| student                |
+------------------------+
1 row in set (0.00 sec)

mysql> select * from student;
+---------+-------+
| name    | score |
+---------+-------+
| Alice   |    80 |
| Bob     |    75 |
| Charlie |    63 |
| Carol   |    91 |
| Dave    |    53 |
| Eve     |    88 |
| Ellen   |    72 |
| Franc   |    47 |
| Isaac   |    65 |
| Ivan    |    32 |
| Justin  |    68 |
| Mallory |    39 |
| Marvin  |    49 |
| Mallet  |    12 |
| Matilda |    18 |
| Oscar   |    70 |
| Pat     |    74 |
| Peggy   |    37 |
| Victor  |    44 |
| Plod    |    55 |
| Steve   |    98 |
| Trent   |    84 |
| Trudy   |    52 |
| Walter  |    79 |
| Zoe     |    77 |
+---------+-------+
25 rows in set (0.00 sec)

実行した SQL

mysql> select
    ->     count(*),
    ->     sum(case when score <= 10 then 1 else 0 end) as '1~10',
    ->     sum(case when score > 10 and score <= 20 then 1 else 0 end) as '11~20',
    ->     sum(case when score > 20 and score <= 30 then 1 else 0 end) as '21~30',
    ->     sum(case when score > 30 and score <= 40 then 1 else 0 end) as '31~40',
    ->     sum(case when score > 40 and score <= 50 then 1 else 0 end) as '41~50',
    ->     sum(case when score > 50 and score <= 60 then 1 else 0 end) as '51~60',
    ->     sum(case when score > 60 and score <= 70 then 1 else 0 end) as '61~70',
    ->     sum(case when score > 70 and score <= 80 then 1 else 0 end) as '71~80',
    ->     sum(case when score > 80 and score <= 90 then 1 else 0 end) as '81~90',
    ->     sum(case when score > 90 and score <= 100 then 1 else 0 end) as '91~100'
    -> from
    ->     student;
+----------+------+-------+-------+-------+-------+-------+-------+-------+-------+--------+
| count(*) | 1~10 | 11~20 | 21~30 | 31~40 | 41~50 | 51~60 | 61~70 | 71~80 | 81~90 | 91~100 |
+----------+------+-------+-------+-------+-------+-------+-------+-------+-------+--------+
|       25 |    0 |     2 |     0 |     3 |     3 |     3 |     4 |     6 |     2 |      2 |
+----------+------+-------+-------+-------+-------+-------+-------+-------+-------+--------+
1 row in set (0.00 sec)

それぞれの範囲ごとに、範囲におさまっていれば1を、おさまってなければ0を足すという処理にしました。

まとめ

今回はデータの集計作業で使った SQL を紹介しました。

このあと可視化しようとすると Google スプレッドシートでグラフにすることになるので正味、全部 Google スプレッドシートでやったらいいのにという内容でもあるのですが、実際の作業はもうすこし複雑な SQL で、かつ、データ量もそこそこ多かったという背景もありました。

Mac の開発環境を自動構築したいがためのリンク集(Ansible, Serverspec)

Ansible Serverspec 作業メモ

突然、Mac のディスプレイが壊れた同僚と話をして、今は Ansible, Serverspec を使って Mac の環境構築を自動化しておくのがイケているということでした。

Ansible, Serverspec の練習も兼ねてちょっとコードを書いてます。ほとんどコピペで homebrew のパッケージのインストールを自動化(Ansible)、インストール済みのテスト(Serverspec)をしています。

現状、 Bitbucket に private repository をつくって非公開にしていますが Github とかに公表したいと思います。

参考になりそうな URL を自分用メモとして以下にまとめておくことにしました。

Ansible

t-wada.hatenablog.jp

dev.classmethod.jp

qiita.com

tech.quartetcom.co.jp

saitou.hatenablog.com

snowlong.hatenablog.com

shiopu.hatenablog.com

blog.matsuokah.jp

www.kagemiku.com

blog.shin1x1.com

speakerdeck.com

Serverspec

mawatari.jp

changesworlds.com

changesworlds.com

その他

qiita.com

今日は以上です。

大容量ファイルを S3 に置いてダウンロードする方法

AWS 作業メモ

大容量の画像ファイルなどを急ぎで共有したいとき、ありますよね。

今回はaws-cliをつかって、ある程度のサイズのファイルであれば Dropbox のようなサービスの無料枠で共有が可能ですが無料使用枠を越えた容量の場合の対処法をメモします。

ただし、この方法には情報の漏洩のセキュリティリスクがあるので、重要な情報であればよりセキュリティレベルを高めた方法(後述)で検討すべきと思います。

前提条件

aws-cliを使用します。

$ python --version
Python 2.7.11

$ aws --version
aws-cli/1.10.63 Python/2.7.11 Darwin/15.6.0 botocore/1.4.53

また、今回の方法ではURLが外部に漏れたときに認証無しでファイルをダウンロードできるという情報漏洩のリスクがあります。

対策としてURLの有効期限を短めに設定したり、ダウンロードが完了したらIAMポリシーを速やかに破棄したりといった対策も検討すべきかと思います。

あるいは、presigned URL を利用するのでなく、 S3 に対応した SSH クライアントソフト( Cyberduck など)を利用して、認証付きでダウンロードするという方法もありかと思います。

https://cyberduck.io/index.ja.html?l=ja

S3 とは

S3 ( Amazon Simple Storage Service )は2016年にリリースされたサービス。

S3は「99.999999999%の耐久性と年間99.99%のオブジェクトの可用性を提供できるように設計されています」。(中略)AmazonエバンジェリストであるJeff Barrによれば、この9の並びが意味しているのは、「10,000個のオブジェクトをS3に保存したとすれば、平均て1000万年に1つほどのファイルを失うことになる。 といわれる、データの完全性、可用性において極めて優れたサービスであると言えます。

https://www.amazon.co.jp/dp/4873115817

料金については、ストレージの種類によって異なりますが、データの受け渡しのような一時的な利用であれば、極めて安価に利用できます。

qiita.com

IAM の設定

test-bucketという名前の Bucket とその直下のファイル対して参照だけできるIAMポリシーを設定しておきます。

{
    "Version": "20xx-xx-xx",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": [
                "arn:aws:s3:::test-bucket"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::test-bucket/*"
        }
    ]
}

aws-cliを使って presigned URL を生成

test.txtというファイルをtest-bucketに設置します。

上で設定したAWSロールを適用したIAMユーザhogehogeを作って、aws configure --profile hogehogeで認証情報の設定を作成しておきます。

今回は、有効期間1日の URL を生成するため--expires-in 86400のオプションを指定しました(60 * 60 * 24)。

$ aws s3 presign test-bucket/test.txt --expires-in 86400 --profile hogehoge

これURLが発行されるので、そのURLを伝えればダウンロード可能です。ダウンロードが終わったらIAMポリシーを削除するなりしたらダウンロードできなくなります。

なお、上にも記載しましたが、presigned URLを発行することでセキュリティレベルを落とすことにもなるのでその点は注意が必要です。

dev.classmethod.jp

私が調査でよく使う Git コマンド3選

作業メモ Git

ローカルだったら、クライアントソフトを使って見やすくできるのですが、サーバにある、いわゆるベアリポジトリはそうはいきませんよね。 Git サーバでの調査でよく使ってるコマンドをまとめます。

コミットログを見る

git logコマンドでリビジョン名やコミットコメントという情報は見れますが、どのブランチがマージされているかをさらっと眺めたいときに可視化して表示しています。

git log --oneline --graph --decorate=full

リビションの変更内容を確認する

そのリビジョンで変更されたファイルを確認するのに使用しています。

git show <リビジョン名>

任意のファイルの内容を確認する

特定のcommittreeblobハッシュ値を指定することでファイルの内容を確認できます。treeblobという概念が頭にはいりやすくなった気がします。

git cat-file -p <ハッシュ値>

naokirin.hatenablog.com

dqn.sakusakutto.jp

Your version of goimports is too old and doesn't support vendoring. Please update goimports!

作業メモ

Go 初心者です。

思うところあって、 Go を試そうとしていました。随分前に emacs で Go の環境を整えてましたが、久し振りに go-mode にすると以下のエラーが出ました。

Your version of goimports is too old and doesn't support vendoring. Please update goimports!

gofmt errors:
flag provided but not defined: -srcdir
usage: goimports [flags] [path ...]
  -d    display diffs instead of rewriting files
  -e    report all errors (not just the first 10 on different lines)
  -l    list files whose formatting differs from goimport's
  -w    write result to (source) file instead of stdout

goimports のアップデートが必要とのことでしたので、 go get しました。

$ go get golang.org/x/tools/cmd/goimports

godoc.org

github.com