astamuse Lab

astamuse Labとは、アスタミューゼのエンジニアとデザイナーのブログです。アスタミューゼの事業・サービスを支えている知識と舞台裏の今を発信しています。

手間なし、負担なし、しがらみなし 〜とある社内活性化施策〜

f:id:astamuse:20190107143637p:plain
謹賀新年

ご挨拶

新年、明けましておめでとうございます。本年もよろしくお願いいたします。

scalaでバックエンドを開発しているaxtstar(@axtstart)です。

さて、今回は昨年開催された社内イベントから出てきた あるもの について書きたいと思います。

よくある内容かもしれないけど

昨年の9月頃社内のイベントで、全社員が、 チームに分かれてアイデアを出し合い、どうすれば社内が活性化するのかというのをディスカッションし、発表するというものがありました。

また、出されたアイデアに対して、上位3チームには実際に予算がついて実施できる(しなければ?)というものでした。

我がBチームはランダムランチのような「AI飯」というのを提案しました。 これは、食事代を会社側で提供し、あまり交流のない部署のメンバ同士でランチに行くことで、社員同士をつなぎ、社内活性化を狙ったものでした。

コンセプトは、

  • 手間なし
  • 負担なし
  • しがらみなし

上記の3つを実現するため、

手間なしは、マシンによるお店、人の選定を行うことで、手間が無いばかりでなく恣意的にならないということ、

負担なしは、会社からお金が出るということ(つまりタダ飯)

しがらみなしは、今回は部長職以上は参加に加えないこと

というような内容でした。

その結果見事3位になって、予算10万円を獲得しました。

考えることは結構ある

上記のAI飯を実現するため、

  • お店をどう決定するか
  • どうやってメンバを決めるか
  • お金をどう渡すのか

という課題がありました。

お店に関しては、まず何らかのサービスから、弊社所在地を中心に1Kmといった範囲の店舗を抽出し、Bチームの誇るグルメ通である、Nさん、Tさんにより、狭かったり、常に混んでいたりとグループでの食事には不適な店舗を除外してもらいました。

f:id:astamuse:20190109094826p:plain
範囲

メンバの選定に関しては、部署を考慮して5人を決めた後、上記のお店と実施日を記載したメッセージを送信して、参加可否を確認しました。参加否の場合、新たにメンバを選定し同じ手順で参加可否を確認しました。

メンバが期限までに決まれば、その時に(役職などは無関係に)リーダを決定して参加者全員にメンバを通知することにしました*1

実施日にリマインドを送信し、お金に関してはKさん提案の事前申請による人数×5人分といった金額をリーダに渡して実施することになりました。

f:id:astamuse:20190109101300p:plain
メンバ選定と金銭授受

実装とか細かいところ

実装はチームのメンバの中に開発部のメンバが私を含めて二人いたことから、その二人で主導することになりました、私は種にslack部分などのインタラクションを担当しました。他にFさんが、メンバ選定のロジックを組むことになりました。

slackインタラクションの作り方

https://api.slack.com/apps

↑こちらで、新しいbotやslash commandが作れます。

f:id:astamuse:20190107143923p:plain
slack appの作り方

インタラクションはbot作成とよく似ていますが少し違うのは、

UserとSlack両方とやり取りがある点です。

なのでかどうかわかりませんが、「Add features and functionality」で下記を指定します。

  • Bots
  • Interactive Components

Interactive Componentsでは後述しますが、URLエンドポイントを指定する必要があります。

f:id:astamuse:20190107183118p:plain
request 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を利用することにしました。

www.yelp.com

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上での表示は以下のようになります。

f:id:astamuse:20190107174410p:plain
お誘いメッセージ

上記の「参加します」、「欠席します」ボタンが押されたとき、エンドポイントにcallback_idが伝わります。

このcallback_idや送信ユーザを元に、参加可否により、「参加ありがとうございます」「欠席残念です」といったメッセージをslackに返します。*6

実施日当日

実施当日、下記メッセージでリマインドを行い、実施ちょっと前にも似たようなメッセージを送ります。

f:id:astamuse:20190108194430p:plain

そしてリーダにお金を渡して、食事会に行ってもらいます。

アンケート

開催の2時間後にTさん作成のアンケートへのリンクを記載したメッセージを送信し、社員の満足度などを聞きました。

12月からトライアルという形でスタートしており、

参加した社員からはかなり好意的な反応や、店の選定のちょっとした要望などがが返ってきており、これはすごく社内活性化になっているなと感じています。

さらに参加率を上げるため、例えばGoogleカレンダーと連携してオファーの時間に予定が埋まっている人は省くなど、新たに考えていく必要もあるのかなと思いました。

統計情報

実施回数 参加人数(のべ) アンケート回答 継続希望
6 27人 23人 22人

まとめ

思ったよりは良い反応がもらえて、業務の合間を縫って作った甲斐がありました。

また、作っている時に、他の部署の人と仲良くなれた気がします。自分的には大成功でした。

いかがでしたでしょうか?

アスタミューゼでは現在、エンジニア・デザイナーを絶賛大募集中です。 興味のある方はぜひ下記バナーからご応募ください。

*1:不測の事態があった場合はリーダに判断してもらうということも

*2:tokenがあれば

*3:通常のSlackBotは常駐プロセスのアプリ

*4:この辺のこまかいところは、別途書きたいと思います。

*5:受け取るのが先ほどのエンドポイント

*6:ちなみにこの処理は3秒以内に返すというslackのルールがあります。

Copyright © astamuse company, ltd. all rights reserved.