Redash のリリースビルドの場所を探す

ここ見ればわかる。

github.com

簡単。 jq はお好みでどうぞ。

$ curl https://version.redash.io/api/releases | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3424  100  3424    0     0   4626      0 --:--:-- --:--:-- --:--:--  4620
[
  {
    "id": 28,
    "version": "4.0.1",
    "channel": "stable",
    "download_url": "https://s3.amazonaws.com/redash-releases/redash.4.0.1.b4038.tar.gz",
    "backward_compatible": false,
    "released_at": "2018-05-02T00:00:00.000Z",
    "description": "* Before doing an upgrade, please make sure you have a backup.\n* If you have any issues, please refer to the troubleshooting section in the upgrade guide:\n  https://redash.io/help/open-source/admin-guide/how-to-upgrade\n* If the upgrade guide doesn't help, you can ask for help on the forum (https://discuss.redash.io).   \n\nFull CHANGELOG for this release: https://github.com/getredash/redash/blob/master/CHANGELOG.md",
    "docker_image": "redash/redash:4.0.1.b4038"
  },
  {
    "id": 27,
    "version": "4.0.0",
    "channel": "stable",
    "download_url": "https://s3.amazonaws.com/redash-releases/redash.4.0.0.b3948.tar.gz",
    "backward_compatible": false,
    "released_at": "2018-04-16T00:00:00.000Z",
    "description": "* Before doing an upgrade, please make sure you have a backup.\n* If you have any issues, please refer to the troubleshooting section in the upgrade guide:\n  https://redash.io/help/open-source/admin-guide/how-to-upgrade\n* If the upgrade guide doesn't help, you can ask for help on the forum (https://discuss.redash.io).   \n\nFull CHANGELOG for this release: https://github.com/getredash/redash/blob/master/CHANGELOG.md",
    "docker_image": "redash/redash:4.0.0.b3948"
  },
  {
    "id": 23,
    "version": "3.0.0",
    "channel": "stable",
    "download_url": "https://s3.amazonaws.com/redash-releases/redash.3.0.0.b3134.tar.gz",
    "backward_compatible": true,
    "released_at": "2017-11-13T00:00:00.000Z",
    "description": "* Before doing an upgrade, please make sure you have a backup.\n* If you have any issues, please refer to the troubleshooting section in the upgrade guide:\n  https://redash.io/help-onpremise/maintenance/how-to-upgrade-redash.html\n* If the upgrade guide doesn't help, you can ask for help on the forum (https://discuss.redash.io).   \n\nFull CHANGELOG for this release: https://github.com/getredash/redash/blob/master/CHANGELOG.md",
    "docker_image": "redash/redash:3.0.0.b3134"
  },
  {
    "id": 22,
    "version": "2.0.1",
    "channel": "stable",
    "download_url": "https://s3.amazonaws.com/redash-releases/redash.2.0.1.b3080.tar.gz",
    "backward_compatible": true,
    "released_at": "2017-10-22T00:00:00.000Z",
    "description": "* Before doing an upgrade, please make sure you have a backup.\n* If you have any issues, please refer to the troubleshooting section in the upgrade guide:\n  https://redash.io/help-onpremise/maintenance/how-to-upgrade-redash.html\n* If the upgrade guide doesn't help, you can ask for help on the forum (https://discuss.redash.io).   \n\nFull CHANGELOG for this release:\nhttps://github.com/getredash/redash/blob/master/CHANGELOG.md#v201---2017-10-22",
    "docker_image": null
  },
  {
    "id": 21,
    "version": "2.0.0",
    "channel": "stable",
    "download_url": "https://s3.amazonaws.com/redash-releases/redash.2.0.0.b2990.tar.gz",
    "backward_compatible": true,
    "released_at": "2017-08-08T00:00:00.000Z",
    "description": "* Before doing an upgrade, please make sure you have a backup.\n* If you have any issues, please refer to the troubleshooting section in the upgrade guide:\n  https://redash.io/help-onpremise/maintenance/how-to-upgrade-redash.html\n* If the upgrade guide doesn't help, you can ask for help on the forum (https://discuss.redash.io).   \n\nFull CHANGELOG for this release: https://github.com/getredash/redash/blob/master/CHANGELOG.md#v200---2017-08-08",
    "docker_image": null
  }
]

これがどういう時に欲しくなるかというと、VM で動いてる Ubuntu に特定のバージョンをインストールする時にバージョンとビルド番号が欲しくなる。

2.0.1 から 4.0.1 へのアップグレードを考えているので、検証を進めていこうと思う。

mozilla/redash_client を使って Redash のクエリを実行する

業務では redash-dynamic-query を使う機会が多いが、Mozilla が公開している mozilla/redash_client も試してみることにした。

github.com

少し調べたところ、Mozilla で使われている STMO という仕組みが Redash で構築されていて、その STMO のクライアントとして開発されているっぽい。

STMO は誰でもアクセスできるものというわけではなさそうだけど、 Mozilla は内部で使っているコードもすべてオープンにするようなポリシーで運営されているのかもしれない。

使ってみる

README ではクエリを検索するサンプルが紹介されているので、それを少し改変して redash-dynamic-query でよくやるパラメータを使ったクエリの実行をやってみる。

先に断っておくと、このコードは以下の PR に含まれる変更に依存しているので、私の手元でしか動かないことはご了承いただきたい。

github.com

from pprint import pprint

import pystache

from redash_client.client import RedashClient

api_key = os.environ["REDASH_API_KEY"]

client = RedashClient(api_key)
client.BASE_URL = 'https://localhost:5000/'
client.API_BASE_URL = client.BASE_URL + 'api/'

query = client.get_query(1)
sql = pystache.render(query['query'], {
  'since': '2018-04-01',
  'until': '2018-04-30',
})

result = client.get_query_results(sql, query['data_source_id'])

pprint(result, width=160)

上記のようなコードで、 redash-dynamic-query と同じように、クエリにパラメータをバインドして実行することができる。

モジュール内で BASE_URL が STMO の URL でべた書きされていたりするので、内部向けコードっぽさを強く感じるが、 Mozilla の外でも使えないことはなさそう。

redash-dynamic-query との違い

パラメータつきクエリの実行に特化している実装になっている redash-dynamic-query に対し、 mozilla/redash_client はすべてのAPIを網羅しているわけではないが、所謂 API クライアントとして作られている。

すべてを試したわけではないが、現時点の master ブランチでは以下のような機能を持っている。

  • クエリの検索・作成・実行・削除・更新・フォーク
  • クエリスケジュールの更新
  • ビジュアリゼーションの作成・削除・URL取得
  • ダッシュボードの作成・公開・ビジュアリゼーションの追加・URL取得

これらの機能を使って、Mozilla では Redash as a Code みたいな感じのことをやっているのかもしれない。

ただし、先程紹介した PR のように、ID を指定したクエリの取得など、よく使いそうな機能がまだ実装されていなかったりするので、 PR を送ったりするなどして開発に参加したり、Fork して必要な機能を足すようなことが必要になるかもしれない。

また、 .travis.yml を見る限りでは Python 2.7 での使用を想定されているためか、 Python 3 では上記で紹介したコードを動作させることはできるものの、ユニットテストは失敗する。 個人的には Python 2 を使う機会が減っているため、このあたりは少し気になる。

Redash Meetup #0.2 - SQL 未経験者向けハンズオンを開催した

主催しているRedash Meetupの企画として SQL 未経験者向けハンズオンを開催しました。

redash-meetup.connpass.com

ブログ書くのがずいぶん遅くなってしまったけど、まぁいろいろあった。

進行について

f:id:ariarijp:20180430190056j:plain

SQL 未経験者向けということで、一度でも SQL を書いたことがある人にとっては物足りなくなるレベルで内容を絞ることにした。

具体的にはイベントページの説明にも記載しているが、 WHERE での条件指定を中心に、後半少しだけ GROUP BY に触れるよう内容でハンズオンを構成した。

構成について気を使ったこと

コピペでほとんどの SQL を実行できるようににした

ハンズオンの大半は「ほぼコピペ」で進められるような構成にして、「何をやっても動かなくて詰まる」という状況を防ぐというのを意識した。

コピペで進めることにした理由としては、事前に社内のインターン向けにリハーサルをした際、「タイピング速度に依存して個々の進行度合いの差が大きく開く」というのが見受けられた。ということが大きい。

今回のハンズオンは「じっくり基礎を学ぶ」という特性のものではなく、「SQL を実行してみて、データベースからデータを取り出す感覚を掴んでもらう」ということを重視したため、このような形をとったが、イベントを終えてみると、参加者の方にとっては少し物足りないところもあったように思える。

このあたりは、ハンズオンイベントの難しさだなと思う。

コピペで実行する SQL の中にエラーを仕込んだ

サポート講師としてイベントをフォローというかドライブしてくれた id:kakku22 が表参道.rbで過去に発表した以下のスライドを思い出して、「SQL の中に潜むエラーを見つける」というのを、コピペ資料の中にこっそりと埋め込んだ。

kakakakakku.hatenablog.com

これが好評だったか?というと、よくわからないというのが正直なところではあるけど、「SQL を書いていれば必ずエラーと向き合うことになる」ということを伝えることはできたと思う。

エラーを見てすぐに拒否反応するのではなく「エラーが出たってことは、どこか間違ってるんだろうな」と思ってもらえるようになっていたらうれしい。

後半は応用編として、前半のハンズオンとは全く違ったデータベースを使った演習を入れた

前半の内容は前述の通り「ほぼコピペ」で進める内容となっていて、具体的には MySQL のサンプルデータとして有名な world データベースを使用していた。

一方、後半の内容は sakila データベース(ビデオレンタル店を模したデータ)を使用し、以下のような課題に取り組む形をとった。

  • (Redashで)テーブルの一覧、カラムの一覧を見てみる
  • 顧客数をカウントする
  • 店舗別の顧客数をカウントする
  • 再生時間が長い映画トップ20を取得する
  • タイトルに GOLD を含む映画を取得する
  • (チャレンジ演習) 最も出演回数の多い俳優または女優の名前は?

前半にコピペをしながら取り組んだ SQL を参考にすれば、正解にたどり着けるような課題にしつつ、未知のデータベースにどんなテーブルやカラムがあるか、何件のデータが保持されているかなど、少し実務でも活用できそうなお題を選んだつもり。

改善点

SQL を「書く」体験をもう少し多くしてもよかった

前述の「コピペ進行」の話のとおりなので割愛

資料を公開できるように準備したかった

イベント企画時点では、イベント後に資料を公開することを計画していたが、イベント内で口頭補足する前提の資料にしてしまったことや、Redash のハンズオン環境環境がないと実感に欠ける資料になってしまったため、公開は見送ることにした。

次回開催をする場合は、この点を解決したい。

まとめ

  • ハンズオンは準備と内容のレベル調整が大変
  • みなさんの反応を見ながら進行できるのは面白い
  • 次回開催は未定。定員を大きく超える応募をいただいたので、また開催してみたいとは思っている

次回開催、どうしようかなぁ。と思いを巡らせてみてはいるものの、まずは直近のイベントの準備・開催を終えてから考えることにしよう。

Redash Meetup についての宣伝

redash-meetup.connpass.com

Redash Meetup #2 では コネヒト株式会社 の shnagai さんに登壇をお願いしました。Redash に興味があるかたは、こちらのイベントへのご参加もご検討ください。

PHPerKaigi 2018に参加したついでにアンカンファレンスで話してきた

PHPerKaigi 2018に行ってきました

今日はPHPerKaigi 2018に参加してきました。

phperkaigi.jp

アンカンファレンスで喋ってきました

Track Bの部屋に行ったところ、アンカンファレンスの枠がごっそり空いていたので、スッと参加表明してみました。

字が汚いですね。緊張して震えていたのかもしれません。

今見てみるとTweetも思いっきり間違えてます。きっと緊張していたのでしょう。

ちなみに、参加表明してからネタを仕込むために1時間半ほどもくもくスペースで作業してたのですが、その間に開催されていたトークがベストトーク賞だったようです。おめでとうございます。

発表したこと

f:id:ariarijp:20180310194540p:plain

Meetupを主催するぐらい気に入っているRedashっぽいものをLaravelで書いてみたので、これを元に話しました。名前はPhpedashです。

そんな私が不定期に主催しているRedash Meetupはこちらです。

redash-meetup.connpass.com

発表のあと、ソース公開しないんですか的なお声がけをいただいたのですが( 参加票のアイコンを見た感じ id:uzulla さんだったかな?)、公開予定はありません。

というか、これがそのまま本番で運用されたらいろいろやばい雑な実装が多すぎて公開できませんでした。

盛り込んだネタ

作ってみましただけだとフックに欠けるので、以下のような話を盛り込みました。

  • PDO便利
  • league/csv 便利
  • phpoffice/phpspreadsheet 便利
    • でも、PHPExcelとかやめよう

上記のライブラリを組み込んだ機能は、直前で手をいれたときに作業漏れしていてデモが動かなかったという悲しいこともありましたが、発表後に直しました。

PDO便利

PHP: PDO - Manual

Phpedashではデータソースを保持するテーブルにDSNを保持する素朴な実装にしました。DSNにすれば相手がSQLiteだろうとPostgreSQLだろうと接続できて便利ですね。

league/csv 便利

csv.thephpleague.com

CSV操作するときに便利なライブラリです。

これは業務でも使っているお気に入りライブラリのひとつでした。

phpoffice/phpspreadsheet 便利

PhpSpreadsheet Documentation

みんなが大好きなExcelをあれこれするライブラリです。

「何気ないExcelが、PHPerを傷つけた」

元ネタわかりませんが、用法としてあっているでしょうか。

でも、PHPExcelとかやめよう

PHPExcel操作するのやめようって書いてある記事が、他のRedashの記事を押しのけて本ブログの一番人気ですという話をしました。皮肉なものです。

会場で PHPExcel / PHPSpreadsheet 使っている・知っている人に挙手をおねがいしたら結構手が上がったような気がしています。皆さん苦労してますね。

発表を終えて

正直、特に持ち帰るような知識もない発表になってしまったかなと思ってはいます。

もっと前日までに準備しておけばよかった。とは思いますが、発表しないでのこのこ家に帰ってくるよりはよかったかなと思っています。

また、小さいことですがアンカンファレンス一発目を取れたので、そこはちょっと満足しています。

最後に

PHPerKaigi 2018に関わったみなさま、おつかれさまでした!

久しぶりに休日開催のイベントに参加しましたが、楽しかったです。

Redashのユーザー削除について考える

前提知識

kakakakakku.hatenablog.com

github.com

現状のRedashにおけるユーザー削除のTL;DR

  • FK使ってるのでユーザーだけ削除するのはRedashでは難しい
  • ユーザーを無効にするPRとかも出てるけど動きが止まってて今は使えない

考えたこと

前置き

Redashでユーザーを削除したい理由を「該当ユーザーをRedashにアクセスできなくしたい」に絞って考える。

気持ち悪いからきれいにしたい、クエリ作成者などに退職者の名前が出ているのを変えたい。というのも気持ちはとてもわかるけど、ビジネスに与える影響はほとんどないものと考えられるので考慮しないでおく。

「社内ルールで必ずユーザー情報を削除しないといけない」などの事情も考えられるけど、そういう会社はたぶんRedashの導入を許可しないと思うので、これも考慮しない。

オフィスからのアクセスのみに制限する

一番下のレイヤーでアクセスさせなくする方法として各社で取られているであろうアクセス制限のひとつ。

よくあるユーザーを削除したくなるシーンの一つは退職者がでたときだと思うけど、その場合も例外はあれど大抵はオフィスからのIPで制限しておけば心配が減ると思う。

パスワード認証を使わず、Google認証だけを使う

Googleのアカウントを失った時点でアクセスできなくなるので、悪くない対応だと思う。

これも退職のケースで考えると、退職後に同じ会社のメールアドレスを使い続けるのはそれなりのレアケース。

LDAPは使ったことがないけど似たようなことができると思う。

しかし、G Suiteを導入していない会社だったりすると選べない。

パスワード認証を使わないようにするには .env あたりで以下の環境変数を設定する。

REDASH_PASSWORD_LOGIN_ENABLED=false

これを書いてて、LDAPが触ってみたいと思って触ってないものの一つだということを思い出した。

Basic認証のID/PWを変える

この辺から泥臭い系の対応になってくる。

退職者がでたときにBasic認証を変えましょうという対応。

これは退職者だけでなく、利用者全員に影響するのでそれなりに面倒な対応になる。

そういえば各社認証情報ってどうやって管理してるのか、勉強会とかでいつも聞こうと思って忘れてることのひとつだったりする。

Redashユーザーのパスワードを変える

ユーザーを無効にする機能はなくてもユーザーのパスワードを書き換える機能はある。

といっても、admin画面からは変えられないので、以下のコマンドで変える。

$ sudo -u redash ./bin/run ./manage.py users password [メールアドレス] [新しいパスワード]

redash ユーザーじゃないとPostgreSQLに接続できなくてエラーになる。というのはRedashあるあるのひとつ。

新しいパスワードを pwgen などで適当に作ってあげれば事実上ログインできない状態にできるはず。

Redashの所属グループをなくす

仮にログインできても何も見えなければいいよね。という対応。

雑ではあるけど、データを見せたくないということが目的であればこれでもよい。

試してみたところ、クエリやダッシュボードは見えなくなりそうだけど、アラートやスニペットは見えてしまうようだった。

該当ユーザーのメールアドレスをを変える

Twitterでいただいたご意見。

メールアドレスが残ってて、かつ、そのメールアドレスが生きているとパスワードリマインダーが使えてしまうので、これも有用。

メールアドレスは admin であれば他人のメールアドレスも変更できるためお手軽でもある。

まとめ

他にも方法はあるかもしれないけど、ぱっと思いついたのは全部書いた。

現実的には上記に列挙したような対応を各社のRedash利用スタイルやインフラ・情シス事情によって組み合わることになると思う。

ちょうど使用しなくなったユーザーをどうしようか考えていて、この記事を書くに至ったけれど、ユーザーを無効にすることができればだいぶ楽になりそうだなと改めて思った。

すっかりこのブログはRedashブログになってしまったので、「Redash User's blog」に改名したほうがいいのだろうか。

記事公開後のはなし

Twitterでメールアドレスを変えるというアイディアをいただいたので追加しました。

「名前を変える」のくだりは「該当ユーザーをRedashにアクセスできなくしたい」とはちょっとずれるので追記しなかったけど、やりたくなりますよね。