Diverse developer blog

株式会社Diverse(ダイバース) 開発者ブログです。

redash×Slackでよろこびの声を自動通知!見せびらかし会レポート #5

こんにちは!Diverse広報担当です。

Diverseでは週に1回、エンジニア同士で「見せびらかし会」を開催しています。

f:id:diverse-tech:20210928172234p:plain
「見せびらかし会」とは、各エンジニアが1週間の中で頑張った開発Tipsを、仲間に向けて発表する場。
各自の知見やノウハウの共有を目的に行っています。”見せびらかす”という仰々しい名前ですが、ちょっとした工夫や改善も大歓迎!というラフな発表会です。

▼過去の見せびらかし会ブログ
見せびらかし会 カテゴリーの記事一覧 - Diverse developer blog

今回はエンジニアの青山さん(@yoichi_aoyama)とkumanomi(@m_kumanomi)さんの”見せびらかし”です。
ぜひお読みください!


▼目次

redashを使って、よろこびの声をSlackに通知する仕組み

青山さんの今週の見せびらかしについて

青山:今回の私の見せびらかしは、youbrideを成婚して退会してくれたユーザーさんのコメントを自動通知する仕組みです。
redashでクエリを実行して、その結果をSlackに通知する形にしました。
f:id:diverse-tech:20210928172648p:plain
直近の成婚退会者を抽出するクエリを用意し、そのクエリを実行してSlackに投げる部分はPythonで作っています。
redashのプラグインとして登録されていたPythonを使って実装しました。

どんな仕組みを作ったのか?

青山:「成婚退会者数」は、redashでクエリを1つ書いて抽出しています。
実際の実装は、redashのクエリの中でSlack用のコードをPythonで書くというシンプルなものです。
f:id:diverse-tech:20210928172823p:plain
ただし一癖も二癖もある状態なので、工夫して作りました!
Pythonを書いたことがある人は分かると思いますが、よくエンコードをUTF-8を に、冒頭で指定すると思います。
しかし、それがredashだと効かないため、別の方法を使ってUTF-8で動くように設定しました。

f:id:diverse-tech:20210928172946p:plain
この設定がなければ、クエリ実行結果の日本語がエンコードできず、ASCIIとして処理されてしまってエラーになります。そのため、エンコードをUTF-8にするための処理を入れました。

次に、指定するSlackURLについて。以前はhook用のURLがあってペイロードの中でチャンネルやユーザーを指定する必要がありましたが、現在はアプリ単位で作られており、Webhookとして簡単に登録できます。

f:id:diverse-tech:20210928173142p:plain
Webhook登録時に、投稿するSlackチャンネルを指定すれば、専用のURLが発行されます。それをコードに埋め込めばOKです。

f:id:diverse-tech:20210928173325p:plain
テキストの部分は、引数で受け取ったcontentをそのまま入れるようにしていて、後はリクエストを投げる処理となっています。以上が関数の説明です。


そして、下の画面の青い部分が、実際のSlackに投げる内容を示しています。

f:id:diverse-tech:20210928173504p:plain
まずはクエリの実行。redash特有の関数になっていて、先ほど作ったクエリのIDを引数として実行されます。
そして実行結果がresultsに入るので、resultsの中身をSlackに投稿する形に加工していきます。
最後に加工が終わったら、Slackにポストする関数の処理に移り、Slackにポストするという流れです。

現在はメンバーIDしか出せておらず、性別などがありません。
細かく表示するには、クエリでデータを収集して、今回のロジックを使って文字列を作ることが必要になってきます。

こんな感じでSlackと連携できるので、皆さんもデータの通知をガンガン作りましょう!

―(一同拍手)ここから質問タイムです!

【質問】スケジュールはどう設定していますか?

青山:redashで1時間ごとに実行するよう設定しました。しかし、これだけだと(Pythonのコードが参照する)クエリの結果は更新されないので、クエリの方もスケジューリングしています。

【質問】なぜこの仕組みにredashを使おうと思ったのですか?

青山:実はredashの中にPythonのコードを書けることを知らなかったのですが…。問い合わせが来ていないかを検知する仕組みがあることを思い出し、どうやって実現しているかを調べてみたらPythonを使っていることに気づきました。

それを応用して、現在の成婚退会レポートを通知する仕組みができたんです。redashの拡張機能が便利で助かりました。

【質問】一番苦労していたのはエンコーディングと仰っていましたが、図の2行目から4行目について詳しく教えてください。

f:id:diverse-tech:20210928173647p:plain
青山:impというモジュールの中にあるreload関数で、モジュールの再読み込みをしています。これを使ってsysモジュールを再読み込みしている理由は、再読み込みしないとsys.setdefaultencordingが呼べないからです。

reload(sys)だけやろうとすると、今度は(importなしで使用できるはずの)reloadがないというエラーになります。そのため、reloadをきちんとimportして使うというコードを入れました。

ユーザーのプロフィール単位でマッチ率を分析できる仕組み

kumanomiさんの今週の見せびらかしについて

kumanomi:私の場合は見せびらかし…というより、今ちょうど試行錯誤しているところです。どんなユーザーが課金していてマッチしているのか?を、ユーザーのプロフィール単位で分析できる仕組みを作っています。

f:id:diverse-tech:20210928173716p:plain

これまででわかったことはこんな感じです。

  • 相手への希望条件ごと(例:車を持っている人)にマッチしやすさを出してみたが、結局課金しているユーザーがマッチしやすいことがわかった(今知りたいのはそこじゃない)。

  • プロフィールを埋めているユーザーほど、マッチしやすい傾向がありそう。

  • マッチするにあたり「結婚のタイミング」が大切かと考えていたら、その項目自体がそんなに大事にされていないようだった。

    という形で、今はまだ「コレだ!」というものは出せていません。細かくデータを区切ったり、区切らなかったり…と続ける中で、分析の仕組みが完成したらどこかで報告できればと思います!

最後に

いかがでしたか?
Diverseのエンジニアは、お互いの開発共有を通じて、チーム全体のレベルアップを図っています。
第5回に渡ってお送りした見せびらかし会は、今回で最終回です。最後までお読みいただいた皆さま、ありがとうございました!

今後も別の形で、Diverseエンジニアの裏側を紹介していきます。どうぞお楽しみに!


◆Diverseの取り組みに共感いただいた方、エンジニアの働き方に興味がある方、ぜひ弊社の採用ページをご覧ください!

herp.careers