SQL書き方ドリルのサンプルDBをre:dashで遊べるようにするVagrantfile

最近は社内でSQLの啓蒙活動をしています。

幸いにも何人か興味を持ってもらったので、一通りSQLを学べそうな「SQL書き方ドリル」を会社で買ってもらったので、 SQLとあわせて啓蒙中のre:dashから、書籍付属のサンプルDBを使って、手を動かしながら勉強できるような環境を作ってみました。

改訂第3版 すらすらと手が動くようになる SQL書き方ドリル (WEB+DB PRESS plus)

改訂第3版 すらすらと手が動くようになる SQL書き方ドリル (WEB+DB PRESS plus)

前提

お使いの環境でVagrantが使えるようになっている環境を前提とします。

Macで動作確認していますが、Windows, Linuxでも動くと思います。

準備

re:dashをGitHubからcloneします。

$ git clone https://github.com/getredash/redash.git
$ cd redash

次に、Vagrantfileを以下のように書き換えます

gist.github.com

MySQLrootユーザーがパスワードなしであったり、redashユーザーのパスワードが雑だったりしますが、ローカル環境での利用を想定しているためご了承ください。

最後に、SQL書き方ドリルのCD-ROMのデータをVagrantfileと同じ階層にSQL_DRILLという名前のディレクトリを作成し、その中に入れておきます。

起動

準備が終わればVMを起動するだけで、勝手にプロビジョニングされます。re:dashのVagrant Boxが事前にダウンロードされていない環境では、少し時間がかかると思います。

$ ./bin/vagrant_ctl.sh start

動作確認

上記のコマンドでVM起動すると、 http://localhost:9001 でre:dashにアクセスすることができます。

re:dashの使い方については割愛しますが、クエリを実行して、サンプルDBのデータを参照できていることを確認します。

現時点では、re:dashのデータソースについては手作業で設定することになります。

f:id:ariarijp:20160905140107p:plain

(念のため上記の画像ではデータをマスキングしています)

まとめ

SQLの入門書として評判のいい書籍の内容をre:dashで勉強できるようにしたので、社内でもっとSQLに興味を持つ人が増えてくれるといいなと思っています。

(追記)worldデータベース

こちらの記事でちょっと言及していただいたので、影響を受けて追記してみました。

kakakakakku.hatenablog.com

SQL書き方ドリルをお持ちでなくても、MySQLのworldデータベースを使用できるようにしました。Gistの Vagrantfile も変更済みです。

worldデータベースを使用する場合は、Vagrantfileと同じ階層にworld.sql.gzを配置してください。

Pagila Databaseをインポート済みのre:dashのVMを5分ぐらいで起動するスクリプトを書いた

まえがき

re:dashは頻繁にアップデートされるので、最新のバージョンを試ししたいときによくVagrantを使います。

Vagrantを使ったVM起動についてはre:dash標準の手順があるのでいいのですが、re:dashから利用するデータソースの準備はすこし面倒です。

ということで、re:dashのVMにサンプルデータベースを追加してくれるスクリプトを書きました。

github.com

Pagila

サンプルデータベースとして、MySQL用サンプルデータベースSakilaのPostgreSQL版のPagila Databaseを使用しています。

pgFoundry: Sample Databases: Project Home

各テーブルにどのようなデータが入っているかは、Sakilaのドキュメントを参考にすると良いでしょう。

MySQL :: Sakila Sample Database :: 5 Structure

手順

READMEの手順どおりにやれば、5分もかからずセットアップが終わります(Vagrant Boxのダウンロード時間を除く)

$ # READMEから抜粋
$ git clone https://github.com/ariarijp/redash-pagila-setup-script.git
$ cd redash-pagila-setup-script
$ git clone https://github.com/getredash/redash.git
$ cd redash
$ cp ../redash-pagila-setup.sh ./
$ vagrant up
$ vagrant ssh -c "bash /vagrant/redash-pagila-setup.sh"
$ ./bin/vagrant_ctl.sh start

起動したあとの動作確認

最後のコマンドでre:dashが起動したら、 http://localhost:9001 にアクセスするとログイン画面が表示されるので、デフォルトの admin / admin でログインし、

f:id:ariarijp:20160812215633p:plain

「New Query」をクリックして

f:id:ariarijp:20160812215742p:plain

適当なSQLを実行すると、結果が表示されます。

SELECT film.title,
       COUNT(film.film_id) cnt
FROM rental
JOIN inventory ON rental.inventory_id=inventory.inventory_id
JOIN film ON inventory.film_id=film.film_id
GROUP BY film.title
ORDER BY cnt DESC LIMIT 50;

f:id:ariarijp:20160812215848p:plain

まとめ

re:dashの最新版をカジュアルに試したいというモチベーションで書きましたが、Rebuildなどをきっかけにre:dashに興味を持たれたかたにも使っていただけると思います。よろしければ使ってみてください。

rebuild.fm

表参道.rb #14 でDigdagについてLTしてきました

8/4に開催された表参道.rb #14でLTさせていただきました。

omotesandorb.connpass.com

ビアガーデン風ということで、会場提供していただいたSansan株式会社様のGardenというイベントスペースで開催され、飲み物、食べ物も無料提供していただきました。ごちそうさまでした。写真とっておけばよかった。

発表資料

Rubyを触る機会が以前にもまして減っているのですが、最近使ったDigdagにRuby APIがあったので、Ruby APIについてLTしました。

懇親会でもいろいろお話を伺いましたが、みなさんバッチ処理ではそれなりに困りごとがあるようだったので、興味を持って聞いていただけたのかなと思っています。

ひさしぶりのLT登壇で緊張しましたが、いくつか笑いも起こっていたので、自分も楽しんでLTできました。

資料はこちらです。

speakerdeck.com

追記

資料中に「Ruby APIから設定した配列をYAML側でfor_eachを使って処理するのはできなさそう」というようなことを書きましたが、loopでできるのではというアドバイスをいただきました。

参考として教えていただいたGistの通りにやってみたところ、lYAML内で配列を扱うことができました。

gist.github.com

@hiroysato さん @smdmts さんありがとうございました!

このようにいろいろな方から反応をいただけるのも、ちょっと勇気をだしてコミュニティで発表することの利点ですよね。

mackerel-agent-pluginsにmackerel-plugin-php-fpmが含まれてないんだけど?と言われて調べた

まえがき

mackerel-plugin-php-fpm使いたいんだけど、CentOS使ってるんだけどまだyumで入ってこないんだよねー?と言われたので、ちょっと気になったので調べてみました。

このプラグインは私が作ったものなのですが、私の場合はgo buildしたものを/usr/local/binに置くような雑運用かつUbuntu環境なのですが、実際のところどうなんでしょうか。

確認方法について

CentOSの環境が無いのでDockerで確認することにしました。Docker for Macがリリースされてから、よりDockerが気軽に使えるようになりましたね。

gist.github.com

今回はmackerel-plugin-php-fpmのインストールだけを確認したいので、mackerel-agentはインストールしていません。

確認のための準備

準備と言ってもdocker buildだけです。イメージ名は何でもいいです。

$ docker build -t centos7-mackerel-agent-plugins .

確認してみる

無事にビルドできたら、さっそくdocker runしてみます。

docker run -it --rm centos7-mackerel
Usage of mackerel-plugin-php-fpm:
  -metric-key-prefix string
        Metric key prefix (default "php-fpm")
  -tempfile string
        Temp file name
  -timeout uint
        Timeout (default 5)
  -url string
        PHP-FPM status page URL (default "http://localhost/status?json")

あら?インストールされているようですね。

もうちょっと確認してみる

インストールディレクトリを見てみましょう。

ここで察しがついているかたもいるかもしれませんが、もう少々お付き合いください。

docker run -it --rm centos7-mackerel ls -la /usr/local/bin
---snip---
lrwxrwxrwx  1 root root   33 Jul 21 14:55 mackerel-plugin-php-apc -> ../../bin/mackerel-plugin-php-apc
lrwxrwxrwx  1 root root   37 Jul 21 14:55 mackerel-plugin-php-opcache -> ../../bin/mackerel-plugin-php-opcache
---snip---

おや。リンクになっていますね。/usr/binに実体がありそうな雰囲気です。

docker run -it --rm centos7-mackerel ls -la /usr/bin
---snip---
-rwxr-xr-x  1 root root 5131476 Jul 14 07:30 mackerel-plugin-php-apc
-rwxr-xr-x  1 root root 4787124 Jul 14 07:30 mackerel-plugin-php-fpm
-rwxr-xr-x  1 root root 5131476 Jul 14 07:30 mackerel-plugin-php-opcache
---snip---

実体はここにあって、ここにはmackerel-plugin-php-fpmもありますね。

なぜ/usr/local/binにインストールされないのか

0.19.4で変わったみたいです。

mackerel.io

今までのものは互換性を保つために/usr/local/binにもおいてくれるようですね。

まとめ

インストールされてないと言っていたのが、インストールディレクトリが変わったこと以外の問題だったらちょっとわかりませんが、

Mackerelのように定期的にアップデートがあるプロダクトは、リリースノートもかかさずチェックしていくのがいいのかもしれませんね。

Raspberry PIとUSBマイクとMackerelを組み合わせて、室内の騒音レベルを可視化する

手近なものでできそうだったので、連休の合間にやってみました。

Raspberry Piの準備

Raspberry PIはすでに持っていたRaspberry Pi 2 Model Bを使います。

Raspberry Pi 2 Model B (1)

Raspberry Pi 2 Model B (1)

USBマイクはこれを使います。Raspberry Piでマイクを使うときはよく使われるものみたいですね。

SANWA SUPPLY MM-MCUSB16 USBマイクロホン

SANWA SUPPLY MM-MCUSB16 USBマイクロホン

Raspberry PiでUSBマイクを使う例は、それなりに検索するとでてきますが、以下の記事を参考にしました。

qiita.com

soundmeter

音声信号処理についての知見もないので、あまりそこで時間をかけたくないのでsoundmeterというのをつかってみました。

github.com

インストールはREADMEに従えばよいでしょう。インストールするとsoundmeterコマンドが使用できるようになります。

いくつかオプションがあり、RMSを取得するサンプリング時間や、結果の出力方法などを指定できます。

ちなみにRMSはRoot Mean Squareの略のようです。ざっくりイメージを掴むなら以下の記事を参考にしてみてください。

sleepfreaks-dtm.com

USBマイクのGAIN調整

soundmeterが使えるようになったら、USBマイクのGAINを調整します。

計測したい場所にRaspberry PIをおいて、soundmeterを実行しておきます。

オプション無しで実行すると、0.5秒ごとのRMSが表示されます。

もう一つターミナルを開いて、alsamixerコマンドを実行し、マイクのGAINを調整します。

f:id:ariarijp:20160717230306p:plain

Mackerelで可視化

ここまででRaspberry PiとUSBマイクを使って騒音レベルが取得できるようになったので、あとはMackerelにメトリックを送信するだけです。

Raspberry PiへのMackerel導入については割愛しますが、以前Qiitaに記事を書いたので、多少は参考になるかもしれません。

qiita.com

カスタムメトリックを使う

Mackerelにメトリックを送信するには、カスタムメトリックの仕様にあわせてスクリプトを書く必要があります。

mackerel.io

グラフ定義とメトリックを出力するスクリプトであれば、監視対象のホストで動けばどんな言語で書いてもいいと思いますが、

今回はRaspberry Piをつかっていることもあるので、素直にPythonで書いてみました。

gist.github.com

これを適当なディレクトリーに置きます。今回は/opt/mackerel-check-scripts/soundmeter.pyに置くものとしておきましょう。

mackerel-agent.confに設定を追加する

[plugin.metrics.soundmeter]
command = "/opt/mackerel-check-scripts/soundmeter.py"

上記の設定を追加し、mackerel-agentを再起動すると、数分後には以下のようなグラフが描画できていると思います。

f:id:ariarijp:20160717231903p:plain

実際のグラフを見ると途切れている箇所がありますが、時折soundmeterが以下の様なエラーを出してしまうので、おそらくこれが原因だと思いますが、厳密に計測したいわけでもないので、これは無視しています。

pi@raspberrypi:~ $ soundmeter
         8  Traceback (most recent call last):
  File "/usr/local/bin/soundmeter", line 9, in <module>
    load_entry_point('soundmeter==0.1.3', 'console_scripts', 'soundmeter')()
  File "/usr/local/lib/python2.7/dist-packages/soundmeter/meter.py", line 311, in main
    m.start()
  File "/usr/local/lib/python2.7/dist-packages/soundmeter/meter.py", line 116, in start
    self.record()  # Record stream in `AUDIO_SEGMENT_LENGTH' long
  File "/usr/local/lib/python2.7/dist-packages/soundmeter/meter.py", line 90, in record
    data = self.stream.read(FRAMES_PER_BUFFER)
  File "/usr/local/lib/python2.7/dist-packages/pyaudio.py", line 608, in read
    return pa.read_stream(self._stream, num_frames, exception_on_overflow)
IOError: [Errno -9981] Input overflowed

まとめ

すでにRaspberry PiやUSBマイクなどの機器が手元にあり参考にできる記事も多く、Mackerelの扱いにもある程度慣れているので、連休の合間に2時間ほど作業しただけでできました。

最近はre:dashやAnsible、AWS Lambdaなど、Pythonで書かれたもの/書くもののお世話になる機会が増えてきたので、もうすこしPythonを書けるようになりたいなと思ったりもします。