SQL書き方ドリルのサンプルDBをre:dashで遊べるようにするVagrantfile
最近は社内でSQLの啓蒙活動をしています。
幸いにも何人か興味を持ってもらったので、一通りSQLを学べそうな「SQL書き方ドリル」を会社で買ってもらったので、 SQLとあわせて啓蒙中のre:dashから、書籍付属のサンプルDBを使って、手を動かしながら勉強できるような環境を作ってみました。
改訂第3版 すらすらと手が動くようになる SQL書き方ドリル (WEB+DB PRESS plus)
- 作者: 羽生章洋,和田省二,菅井大輔
- 出版社/メーカー: 技術評論社
- 発売日: 2016/04/12
- メディア: 大型本
- この商品を含むブログを見る
前提
お使いの環境でVagrantが使えるようになっている環境を前提とします。
Macで動作確認していますが、Windows, Linuxでも動くと思います。
準備
re:dashをGitHubからcloneします。
$ git clone https://github.com/getredash/redash.git $ cd redash
次に、Vagrantfileを以下のように書き換えます
MySQLのroot
ユーザーがパスワードなしであったり、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のデータソースについては手作業で設定することになります。
(念のため上記の画像ではデータをマスキングしています)
まとめ
SQLの入門書として評判のいい書籍の内容をre:dashで勉強できるようにしたので、社内でもっとSQLに興味を持つ人が増えてくれるといいなと思っています。
(追記)worldデータベース
こちらの記事でちょっと言及していただいたので、影響を受けて追記してみました。
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にサンプルデータベースを追加してくれるスクリプトを書きました。
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 でログインし、
「New Query」をクリックして
適当な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;
まとめ
re:dashの最新版をカジュアルに試したいというモチベーションで書きましたが、Rebuildなどをきっかけにre:dashに興味を持たれたかたにも使っていただけると思います。よろしければ使ってみてください。
表参道.rb #14 でDigdagについてLTしてきました
8/4に開催された表参道.rb #14でLTさせていただきました。
ビアガーデン風ということで、会場提供していただいたSansan株式会社様のGardenというイベントスペースで開催され、飲み物、食べ物も無料提供していただきました。ごちそうさまでした。写真とっておけばよかった。
発表資料
Rubyを触る機会が以前にもまして減っているのですが、最近使ったDigdagにRuby APIがあったので、Ruby APIについてLTしました。
懇親会でもいろいろお話を伺いましたが、みなさんバッチ処理ではそれなりに困りごとがあるようだったので、興味を持って聞いていただけたのかなと思っています。
ひさしぶりのLT登壇で緊張しましたが、いくつか笑いも起こっていたので、自分も楽しんでLTできました。
資料はこちらです。
追記
資料中に「Ruby APIから設定した配列をYAML側でfor_eachを使って処理するのはできなさそう」というようなことを書きましたが、loopでできるのではというアドバイスをいただきました。
@ariarijp 有用な記事ありがとうございます。for_eachで配列が処理できないのはloopで回避できるかもしれません。参考 https://t.co/ptFAd2BHI9
— hiroyuki sato (@hiroysato) 2016年8月5日
参考として教えていただいたGistの通りにやってみたところ、lYAML内で配列を扱うことができました。
@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が気軽に使えるようになりましたね。
今回は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で変わったみたいです。
今までのものは互換性を保つために/usr/local/bin
にもおいてくれるようですね。
まとめ
インストールされてないと言っていたのが、インストールディレクトリが変わったこと以外の問題だったらちょっとわかりませんが、
Mackerelのように定期的にアップデートがあるプロダクトは、リリースノートもかかさずチェックしていくのがいいのかもしれませんね。
Raspberry PIとUSBマイクとMackerelを組み合わせて、室内の騒音レベルを可視化する
手近なものでできそうだったので、連休の合間にやってみました。
Raspberry Piの準備
Raspberry PIはすでに持っていたRaspberry Pi 2 Model Bを使います。
- 出版社/メーカー: Raspberry Pi
- メディア: エレクトロニクス
- この商品を含むブログ (10件) を見る
USBマイクはこれを使います。Raspberry Piでマイクを使うときはよく使われるものみたいですね。
SANWA SUPPLY MM-MCUSB16 USBマイクロホン
- 出版社/メーカー: サンワサプライ
- 発売日: 2009/05/13
- メディア: エレクトロニクス
- 購入: 2人 クリック: 3回
- この商品を含むブログ (6件) を見る
Raspberry PiでUSBマイクを使う例は、それなりに検索するとでてきますが、以下の記事を参考にしました。
soundmeter
音声信号処理についての知見もないので、あまりそこで時間をかけたくないのでsoundmeterというのをつかってみました。
インストールはREADMEに従えばよいでしょう。インストールするとsoundmeter
コマンドが使用できるようになります。
いくつかオプションがあり、RMSを取得するサンプリング時間や、結果の出力方法などを指定できます。
ちなみにRMSはRoot Mean Squareの略のようです。ざっくりイメージを掴むなら以下の記事を参考にしてみてください。
USBマイクのGAIN調整
soundmeter
が使えるようになったら、USBマイクのGAINを調整します。
計測したい場所にRaspberry PIをおいて、soundmeter
を実行しておきます。
オプション無しで実行すると、0.5秒ごとのRMSが表示されます。
もう一つターミナルを開いて、alsamixer
コマンドを実行し、マイクのGAINを調整します。
Mackerelで可視化
ここまででRaspberry PiとUSBマイクを使って騒音レベルが取得できるようになったので、あとはMackerelにメトリックを送信するだけです。
Raspberry PiへのMackerel導入については割愛しますが、以前Qiitaに記事を書いたので、多少は参考になるかもしれません。
カスタムメトリックを使う
Mackerelにメトリックを送信するには、カスタムメトリックの仕様にあわせてスクリプトを書く必要があります。
グラフ定義とメトリックを出力するスクリプトであれば、監視対象のホストで動けばどんな言語で書いてもいいと思いますが、
今回はRaspberry Piをつかっていることもあるので、素直にPythonで書いてみました。
これを適当なディレクトリーに置きます。今回は/opt/mackerel-check-scripts/soundmeter.py
に置くものとしておきましょう。
mackerel-agent.confに設定を追加する
[plugin.metrics.soundmeter] command = "/opt/mackerel-check-scripts/soundmeter.py"
上記の設定を追加し、mackerel-agentを再起動すると、数分後には以下のようなグラフが描画できていると思います。
実際のグラフを見ると途切れている箇所がありますが、時折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を書けるようになりたいなと思ったりもします。