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 を試してみたかったので以下の記事を参考にさせていただきつつ、さわってみました。
アプリケーションは以下からダウンロードできますが、今回は Homebrew を使ってインストールしました。
$ 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進数とかの変換を行う
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
Serverspec
その他
今日は以上です。
大容量ファイルを 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
料金については、ストレージの種類によって異なりますが、データの受け渡しのような一時的な利用であれば、極めて安価に利用できます。
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を発行することでセキュリティレベルを落とすことにもなるのでその点は注意が必要です。
私が調査でよく使う Git コマンド3選
ローカルだったら、クライアントソフトを使って見やすくできるのですが、サーバにある、いわゆるベアリポジトリはそうはいきませんよね。 Git サーバでの調査でよく使ってるコマンドをまとめます。
コミットログを見る
git log
コマンドでリビジョン名やコミットコメントという情報は見れますが、どのブランチがマージされているかをさらっと眺めたいときに可視化して表示しています。
git log --oneline --graph --decorate=full
リビションの変更内容を確認する
そのリビジョンで変更されたファイルを確認するのに使用しています。
git show <リビジョン名>
任意のファイルの内容を確認する
特定のcommit
、tree
、blob
のハッシュ値を指定することでファイルの内容を確認できます。tree
やblob
という概念が頭にはいりやすくなった気がします。
git cat-file -p <ハッシュ値>