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

Vagrant で CentOS7 を動かしてみたときに知っているコマンドが使えなくて困った話

こんにちは。

今更 Vagrant の話になって恐縮ですが、手でコマンド叩いて確認したいことがあって、CentOS7環境をつくりました。

$ vagrant init centos/7

$ vagrant up

$ vagrant ssh

これで VM にログインまでできました。さらに、httpd のインストール@vagrant

# yum install -y httpd

次にローカルの Vagrantfile を編集し、ブラウザからアクセスできようにします。

$ cat Vagrantfile| grep private_network
   # config.vm.network "private_network", ip: "192.168.33.10"

$ vi Vagrantfile #上記をコメントアウト

$ vagrant reload

$ cat Vagrantfile| grep private_network
   config.vm.network "private_network", ip: "192.168.33.10"

ただ、 この時点でブラウザからアクセスできません。。。困った。

結局問題だったのは、以下の2点です。 - VM 側でネットワークアダプタが認識されていない - firewalld に http が弾かれている

VM 側でネットワークアダプタが認識されていない

あるあるですがこの調査ではよく ifconfig を叩いてます。よし、、、

# ifconfig
-bash: ifconfig: command not found

Oops… command not found. だと。。。

そういえば、ifconfig を使うのはおっさんだ という話を思いだしました。若者は ip を使うみたいですね。

# ip -a
・・・
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 08:00:27:95:72:f8 brd ff:ff:ff:ff:ff:ff

よくわからないけど 192.168.33.10 が書いてないので shutdown -r で再起動。再度確認します。

# ip a
・・・
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:95:72:f8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.33.10/24 brd 192.168.33.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe95:72f8/64 scope link
       valid_lft forever preferred_lft forever

今度は大丈夫そうですね。

再び、ブラウザからアクセス、、、するもダメでした。

firewalld に http が弾かれている

それじゃ iptable かなと思ってvi /etc/sysconfig/iptablesを確認するも"/etc/sysconfig/iptables" [New File]がでてファイルがありません。

調べると CentOS7 からは firewalld というサービスが使用されているみたいです。

firewall-cmd を確認するも sshしか許可されていません。

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:
# vi /etc/firewalld/zones/public.xml # <service name="http"/> を追加
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="ssh"/>
  <service name="http"/>
</zone>

再起動

# systemctl restart firewalld

確認

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client http ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:

まとめ

これでブラウザからアクセスができました。

補遺

CentOS6 の時はservice httpd start, chkconfig httpd on のように使ってましたが、CentOS7 からは systemctl を使うとのことでした(エイリアスになっている)。

サービスの起動

# systemctl start httpd

サービスの自動起動を on

# systemctl enable httpd

サービスの停止

# systemctl stop httpd

サービスの自動起動を off

# systemctl disable httpd

Docker for Mac で Kibana を動かした

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進数とかの変換を行う

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

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

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

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

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)

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

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

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

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

git show <リビジョン名>

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

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

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

naokirin.hatenablog.com

dqn.sakusakutto.jp