ご挨拶
新年、明けましておめでとうございます。本年もよろしくお願いいたします。
scalaでバックエンドを開発しているaxtstar(@axtstart)です。
さて、今回は昨年開催された社内イベントから出てきた あるもの について書きたいと思います。
よくある内容かもしれないけど
昨年の9月頃社内のイベントで、全社員が、 チームに分かれてアイデアを出し合い、どうすれば社内が活性化するのかというのをディスカッションし、発表するというものがありました。
また、出されたアイデアに対して、上位3チームには実際に予算がついて実施できる(しなければ?)というものでした。
我がBチームはランダムランチのような「AI飯」というのを提案しました。 これは、食事代を会社側で提供し、あまり交流のない部署のメンバ同士でランチに行くことで、社員同士をつなぎ、社内活性化を狙ったものでした。
コンセプトは、
- 手間なし
- 負担なし
- しがらみなし
上記の3つを実現するため、
手間なしは、マシンによるお店、人の選定を行うことで、手間が無いばかりでなく恣意的にならないということ、
負担なしは、会社からお金が出るということ(つまりタダ飯)
しがらみなしは、今回は部長職以上は参加に加えないこと
というような内容でした。
その結果見事3位になって、予算10万円を獲得しました。
考えることは結構ある
上記のAI飯を実現するため、
- お店をどう決定するか
- どうやってメンバを決めるか
- お金をどう渡すのか
という課題がありました。
お店に関しては、まず何らかのサービスから、弊社所在地を中心に1Kmといった範囲の店舗を抽出し、Bチームの誇るグルメ通である、Nさん、Tさんにより、狭かったり、常に混んでいたりとグループでの食事には不適な店舗を除外してもらいました。
メンバの選定に関しては、部署を考慮して5人を決めた後、上記のお店と実施日を記載したメッセージを送信して、参加可否を確認しました。参加否の場合、新たにメンバを選定し同じ手順で参加可否を確認しました。
メンバが期限までに決まれば、その時に(役職などは無関係に)リーダを決定して参加者全員にメンバを通知することにしました*1。
実施日にリマインドを送信し、お金に関してはKさん提案の事前申請による人数×5人分といった金額をリーダに渡して実施することになりました。
実装とか細かいところ
実装はチームのメンバの中に開発部のメンバが私を含めて二人いたことから、その二人で主導することになりました、私は種にslack部分などのインタラクションを担当しました。他にFさんが、メンバ選定のロジックを組むことになりました。
slackインタラクションの作り方
↑こちらで、新しいbotやslash commandが作れます。
インタラクションはbot作成とよく似ていますが少し違うのは、
UserとSlack両方とやり取りがある点です。
なのでかどうかわかりませんが、「Add features and functionality」で下記を指定します。
- Bots
- Interactive Components
Interactive Componentsでは後述しますが、URLエンドポイントを指定する必要があります。
APIサーバ(URLエンドポイント)
slackに対してメッセージを送信するのはどこからでもできる*2のですが、インタラクションに関しては別で、先ほど設定した「Interactive Components」のInteractivityのRequest URLだけが返答を返すことができますので、こちらをAPIサーバとして実装する必要があります*3。またこちらはSSL対応の必要もあります。
SSL対応は我らがインフラエンジニアTさんにLet's encryptにて設定をお願いしました。
今回Fさんと協議を重ねた結果APIサーバはpythonでいこうという話になりました。
さらに、webサーバにはFlask、データベースはmongodbを利用しました。*4
ユーザ選定
ユーザ選定はslackのユーザリストから作成します
下記を利用します。
https://api.slack.com/methods/users.list/test
その後、先述した部長職以上の方を対象外とする処置を施しDBに入れます。
お店選定
お店の情報はyelpのapiを利用することにしました。
Nさん、Tさんによるフィルタリング済み店舗リストをDBに入れておきます。
yelpの情報を最大限利用する形でデータを格納しました。(そのままという)
{ "id": "**", "alias": "**", "name": "**", "image_url": "**", "is_closed": false, "url": "**", "review_count": 4, "categories": [ { "alias": "****", "title": "****" } ], "rating": 3.5, "coordinates": { "latitude": 0, "longitude": 0 }, "transactions": [], "price": "¥", "location": { "address1": "*", "address2": "", "address3": "", "city": "", "zip_code": "*", "country": "JP", "state": "13", "display_address": [ "", "" ] }, "phone": "+81", "display_phone": "03-", "distance": 0 }
こちらから1店舗を実施時に抽出します。
ユーザへのメッセージ送信のところ
メッセージの作成にはslackのInteractive messageを利用し、ユーザからの返信を受け取れるよう*5にしました。
下記jsonに対して、プログラムからtitle、image_url等を設定してslackに送信します。
{ "fallback": "none", "color": "#258ab5", "attachment_type": "default", "title": "", "title_url": "", "text": "", "image_url": "", "fields": [ { "title": "rating", "value": "", "short": false } ], "callback_id": "attendance_confirm", "actions": [ { "name": "admit", "text": "参加します", "value": "admit", "type": "button" }, { "name": "absent", "text": "欠席します", "value": "absent", "type": "button" } ] }
slack上での表示は以下のようになります。
上記の「参加します」、「欠席します」ボタンが押されたとき、エンドポイントにcallback_idが伝わります。
このcallback_idや送信ユーザを元に、参加可否により、「参加ありがとうございます」「欠席残念です」といったメッセージをslackに返します。*6
実施日当日
実施当日、下記メッセージでリマインドを行い、実施ちょっと前にも似たようなメッセージを送ります。
そしてリーダにお金を渡して、食事会に行ってもらいます。
アンケート
開催の2時間後にTさん作成のアンケートへのリンクを記載したメッセージを送信し、社員の満足度などを聞きました。
12月からトライアルという形でスタートしており、
参加した社員からはかなり好意的な反応や、店の選定のちょっとした要望などがが返ってきており、これはすごく社内活性化になっているなと感じています。
さらに参加率を上げるため、例えばGoogleカレンダーと連携してオファーの時間に予定が埋まっている人は省くなど、新たに考えていく必要もあるのかなと思いました。
統計情報
実施回数 | 参加人数(のべ) | アンケート回答 | 継続希望 |
---|---|---|---|
6 | 27人 | 23人 | 22人 |
まとめ
思ったよりは良い反応がもらえて、業務の合間を縫って作った甲斐がありました。
また、作っている時に、他の部署の人と仲良くなれた気がします。自分的には大成功でした。
いかがでしたでしょうか?
アスタミューゼでは現在、エンジニア・デザイナーを絶賛大募集中です。 興味のある方はぜひ下記バナーからご応募ください。