Workflowsで詰将棋ランキングシステム作るで | SHIFT将棋部 Day.24
メリークリスマス🎄
はじめまして、SHIFT 将棋部部長の松田です。
21新卒入社ののち、ゲーム業界を対象として案件管理、体制構築などしております。 「間違ってたらすみません、あの松田さんですか?」とよく言われますが、その松田です。
メリーのクリスマスということで、クリスマスは基本的に予定が入っていることにしており、そんな調子だから毎年クリスマス周辺だけ暇になるんですが、イルミネーションなど危険なスポットに積極的に足を運ぶようにしています。
去年まで麻布十番に住んでいたので、六本木ヒルズ、東京ミッドタウン、東京タワーあたりは徒歩で巡ることができました。 関西にいた頃は、京都の伏見稲荷(鳥居がいっぱいあるとこ)を駆け抜けたのち、京都駅のイルミネーションに囲まれるなどしていました。
華やかな思い出だと言えるでしょう。
SHIFT 将棋部
SHIFT 将棋部は2021年5月に新卒研修のノリで創部して以来、なんやかんや25名前後集まり活動を続けています。 職団戦と呼ばれる企業対抗の将棋大会への参加をひとまずの目標として置き、月一で Discord で集まったり、将棋カフェや会社の会議室に集まって将棋をしています。
部員が部活の様子についても note にしてくれているので、ご興味あれば併せてどうぞ。
弊部は参加に至る敷居の低さも特徴としており、最も参加ハードルの低い活動として、「まいにち詰将棋」を設置しております。
まいにち詰将棋
将棋部のメインのコミュニケーションツールは Microsoft Teams なのですが、下記のように Workflows(旧:Power Automate)で自動で毎日詰将棋を投稿してくれるフローを組んでいます。
フローの内訳はこんな感じ。 平日(月~金)9時に、詰将棋へのリンクを含む投稿を行うシンプルなものです。
詰将棋と言っても、日本将棋連盟様が毎日詰将棋を投稿してくれるので、そこへのリンクを貼っているだけです。どなたでも見られるので、興味のある方は解いてみてください。
これだけだとただの自動投稿 BOT なのですが、もうちょっとゲーム性があったほうが楽しめるかと思い、ランキング化することにしました。 投稿内の「手動ランキング化してます」というリンクがどこに飛ぶのかというと、
こういった Excel に飛びます。
右下にランキングのようなものが表示されていますが、これが何を隠そう詰将棋ランキングなわけです。名前を付けることでそれっぽさが出ますね。
左側の表で、Teams の投稿についたリアクションを取得、一覧化しています。 その中でメッセ―ジの投稿日時、リアクションの種類、リアクションしたユーザーを取得し、月ごとに「いいね!」をした数を集計しているのです。
フローの紹介
リアクションを取得、と一言で言いましたが、これがけっこう曲者でした。 自動投稿と同様に Workflows を使っています。 作成に当たっては下記ブログの内容を大いに参考にしております。
出来上がったフローとしてはこんな感じ。
パーツごとに見ていきましょう。
変数を初期化する(リアクション配列格納)
まずはリアクションを集計・一覧化するデータの枠を配置します。 種類:アレイ としていますが、これは [1,2,3,...] といった配列形式のデータ群を指します。
集計したリアクションを表形式で出力したいという意思表示ですね。
変数を初期化する(出力ファイル名格納)
まずはリアクションを集計・一覧化するデータの枠を配置します。 種類:アレイ としていますが、これは [1,2,3,...] といった配列形式のデータ群を指します。
集計したリアクションを表形式で出力したいという意思表示ですね。
変数を初期化する(出力ファイル名格納)
次に、出力先となる CSV ファイルを準備します。 平たく言えばファイル名を決め、データをぶち込む箱を作るわけです。 今回は Teams のリアクションを集計する意図・出力タイミングをタイトルに盛り込み、
teams-reactions-[出力時間].csv
という形式で指定しました。
メッセージを取得します
将棋部 Teams 内の詰将棋チャンネル内のメッセージを取得する、という処理です。
Apply to each
直訳で「それぞれに適用する」という処理です。 直前に取得したメッセージが「メッセージ一覧」に該当し、メッセージそれぞれに対して、という for 文のような繰り返し処理を行います。
Apply to each 2 の中身
繰り返し処理の中にもう一段階繰り返し処理を作っているので、細かく見ていきましょう。 「ユーザー プロフィールの取得」によりチーム内のユーザーデータを取得する、という操作です。
続く「作成」により人間の目で見てわかる形のデータに変換します。 ここでは上から順に
投稿のID
件名(投稿のタイトル、ない場合は空欄)
投稿したユーザー
投稿日時
本文
リアクション種類(いいね!、ハート、など)
リアクションした日時
リアクションしたユーザーの表示名(松田 義顕、など人間向けの名前)
を指定しています。 「配列関数に追加」では、最初に作っておいた「リアクション集計」という配列の中に、変換したデータを入れていきます。 これらの処理を、投稿についたリアクションの数分行います。一段目の Apply to each と合わせて、「チャンネル内の全投稿の全リアクションを対象に繰り返す」という処理になります。
CSVテーブルの作成
配列形式のデータをCSV形式に変換します。
ファイルの作成
CSV 形式のファイルを、実際に開くことができるファイルとして「作成」します。 サイトのアドレス(将棋部 Teams)、どのチャンネルのどのフォルダかを指定しています。 ファイル名は最初に付けておいた「teams-reactions-[出力時間].csv」の形式になっていますね。 これまでに作成・変換したCSV形式のデータをファイルに含む内容として選択しています。
これでフローは完成です。 実行すると、指定した 05_詰将棋 > reactions 内に「teams-reactions-[出力時間].csv」のファイルが作られています。 ここでは毎日定期実行しているため、一日おきに出力されています。末尾の「-060000」といった数字はなぜかついてきました。ちょっとやそっとじゃ消えなかったので、諦めることにします。もっと本当に消すべきものは人生にたくさんあるのです。
詰将棋ランキング完成!
出力された CSV に、先ほどお見せした詰将棋ランキングの元となるデータが入っています。 誰がどんなリアクションをしているか、なんとなくわかりますでしょうか。 なお投稿タイトルはつけておらず、投稿者は「フロー ボット」(ダミーユーザー的な)にしているので、B,C 列は空白になっています。
Excel で集計用の関数を入れれば、ランキングの完成です。 ちなみに CSV からランキングへの転記は手動です。(今はまだ)
I列で「リアクションを付けた対象の投稿日時」
J列で「リアクションが『いいね!(like)』かどうか」
を判定しているため、いいね!以外のリアクションは集計対象外となります。 表示している Excel では、「10月にいいね!を付けた人」という絞り込みをしてランキング化したものです。 このとき、投稿についた返信は集計対象外です。
このようにトリッキーな11手詰めにコメントや、適当なリアクションをつけても集計対象外になります。
今回詰将棋ランキングを作る上では本来必須ではない情報も含まれていますが、ユーザー、リアクションの種類、投稿内容・タイトルも取得しているため、応用範囲は広いと思います。例えばリアクションによる出席確認、クイズ大会といった具合に。
皆さんも作ってみてね!
★★SHIFT公式ブログでアドベントカレンダー★★
いよいよ明日はクリスマス当日!お楽しみに!
お問合せはお気軽に
SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/
SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/
SHIFTの導入事例
https://service.shiftinc.jp/case/
お役立ち資料はこちら
https://service.shiftinc.jp/resources/
SHIFTの採用情報はこちら