MoTLab -Mobility Technologies Engineering Blog-MoTLab -Mobility Technologies Engineering Blog-

雨予報とOSS活動

EngineerLifeGo
August 17, 2021

バックオフィスグループのアベです。普段はタクシーアプリ「GO」の事業者向けサービスのサーバーサイドを開発しています。今回はマーケティングチームの業務の自動化に協力しつつ、成果物の一部をOSSとして公開したお話を紹介します。

天気の悪い日の移動にはタクシーが便利ですよね。

GOのマーケティングチームでは、全国の天気予報を参考に、対応する地域のキャンペーンやお知らせなどの施策を考えています。

このために、毎日チームのメンバーが交代で気象庁サイトの天気予報のページを見に行き、GOがサービスを展開している各地域について、向こう一週間の降水確率をSlackチャンネルに貼りつける、ということがしばらくの間行われていました。このことは自分は知らなかったのですが、チャンネルに参加していた上司から招待され「自動化してあげたら喜ぶんじゃない?」と提示されました。

An image from Notion

メンバーが交代でテキストを書いて貼っていた

おりしも数ヶ月前、気象庁のサイトのデータがJSONで取得できるという話がインターネットで話題になり、気象庁の中の方も(保証はしないが)使用してよいという発言をTwitterでされていたので、プログラムは作りやすそうです。

社内のツールにどんな言語を使うかは基本的には自由です。とはいえ、メインの業務ではGOアプリのバックエンドをGoで開発していますし、シングルバイナリで作れば運用場所の自由度も上がりそう、ということでGoで作ることにしました。

話題にはなったものの、この気象庁のJSONデータを取得する、Goで書かれたOSSは見当たりませんでした。取得するだけなら書きおろしてもたいした量にはならないからでしょうか。自分も最初はそうしていました。ただこのJSONデータ、あくまで同サイトのWebページに流し込むのに都合のよい構造になっているため、その他の利用をするには面倒なところがあります。

そこで、取得と同時にデータ構造の変換も行うモジュールを作りました。本体のプログラムからは、予報対象の日時と各気象データをもつ構造体がDBのレコードのように扱えます。このモジュールは個人のOSSとして切り出しておきました。

An image from Notion

github.com/pen/jma-go

Slackのワークスペースとの連携方法は割愛します(インターネットでたくさんの資料がみつかります)。ひとつだけ: 一方的に情報を喋らせるだけのSlack Appを設置するのであれば、scopeはincoming-webhookひとつで十分です。

An image from Notion

同じ作業をbot化

雨予報botはマーケティングの方達に喜ばれて一段落しましたが、招待されたままのチームのチャンネルにて毎日会話を読んでいたところ、「エリアごとの各日の天気」ではなく「日ごとの各エリアの天気」でまとめるほうが検討しやすそうに見えました。また1列に情報を表示すると、全国的に雨天の週間はスクロールしないと全体がみえないのも気になりました。

本業のあいまを見てこれらの改善にとりかかったのですが、情報をどれかの日付の見出しのところで分割する処理を書いているうち「きれいにN分割できるアルゴリズムってあるのかな?」という興味が頭をもたげてきました。Slackでは2カラム表示までしかできず、2分割であれば安易なやりかたですぐに実装できたので脱線ではありますが、一般的なアルゴリズムがあるならそれを知っておきたいのはエンジニアの性というものです。

An image from Notion

日付でまとめるようにした & 最適な位置で2分割

少し調べたり仲間に尋ねたのですがズバリなものは見つからなかったため、自分なりにロジックを考案し、これもOSSにしてあります。

An image from Notion

github.com/pen/split-slice-go

このように、ちょっとした作業の自動化をネタに、近隣の(とくに非エンジニアの)チームの仕事のお手伝いをしたり、トレンドのAPIを使ってみたり、自分の興味に従うままプログラミングの知見を深めたり、一部を気軽にOSSとして公開したりできることは、本業の開発とはまた違った楽しさがあります。