こんにちは。キーボード大好き人間のmikoです。

国内外からキーボードキットを取り寄せて、はんだ付けをしてキーボード作りを楽しんでいます⌨

My Keyboard

キーキャップ・キースイッチって想像以上に多くの種類があり、
凝り始めてしまうと抜け出せなくなってしまいます…。正に沼…。

キーボードの話を続けるとそれだけで記事が終わってしまうので、
本題に移らさせていただきます!!

さて突然ですが、みなさまにお聞きしたいことがあります。

最近「運動フィットネス」できてますか?

ちなみに私はできていませんでした
リモートワークを始めて早2年になるのですが、一番嬉しかったことは通勤時間が無くなったことです。

しかし、通勤がなくなったことによって運動する機会がなくなりました

そもそもリモートワークを開始する以前でも運動する習慣がなく、
唯一の運動といっても過言ではなかった「通勤」がなくなった結果
体重は増え、体力は落ちていきました…

改善せねばアカン!

これは流石に運動して改善せなアカンなということで、
購入したのがNintendo Switch「リングフィット アドベンチャー」でした。

My Switch & Controller

「リングフィット アドベンチャー」についてはご存じの方も多いでしょうが、
ざっくりと説明するとプレイヤー自身が運動することで、敵へ攻撃できるというRPGゲームです。

キャラクターのレベルや攻撃力、防御力といったステータスも存在しているので、
レベルを上げて敵を圧倒するといったプレイも可能です。
ですが、圧倒できるとは言っても攻撃するために必要なことは、
プレイヤー自身の「運動」なので辛いことに変わりありません。

ある程度は続けられたが…

RPGゲームが好きな私は毎日楽しくリングフィット アドベンチャーを進めて、
キャラクターのレベルを上げていたのですが、次第に怠けてしまうようになってしまいました。

ゲーム内に登場するリングくんがトレーナーとして、フィットネス中にやる気が出る声援をくれるのですが、
それだけでは続けるモチベーションを保てなくなっていったためです…。

このままではダメだと!モチベーションを維持するのに何か良い案はないのか…?
と悩みに悩んだ結果、思いついたのが…

稟議書を通すために運動すれば面白いんじゃない?

という謎の案でした。

思い立ったが吉日

「思い立ったが吉日」がモットーな私は、早速アイディアをまとめました。
そして生まれたのが、コラボフローとリングフィットアドベンチャーを組み合わせたシステム。

その名も…

「稟議フィット アドベンチャー」

です!(怒られそう…)

稟議書を通すために運動(フィットネス)をするという画期的なアイディア!

仕様

「稟議フィット アドベンチャー」の主な仕様は以下の2点です。

  • 3日間継続して運動する必要がある
  • 毎日異なるミッションを達成する必要がある

経路設定

この「稟議フィット アドベンチャー」の経路設定は以下の通りになっています。

経路の流れは以下の通りです。

  1. 申請者が申請を開始する
  2. リンギくんがミッションを設定する
  3. 申請者がミッションが達成できたかを証明する画像を添付する
  4. リンギ君が画像を読み取り、ミッションが達成できているか判定する
  5. ミッションを達成できていたら次の段階へ判定が進む
  6. 3~5を3日間続ける
  7. 最終承認者(ラスボス)に判定してもらう

ミッションが達成できていない場合は、申請段階へ差戻されるスパルタ仕様です。

画像の文字読み取り

「稟議フィット アドベンチャー」で重要なポイントは

「リンギ君が画像を読み取り、ミッションが達成できているか判定する」

という処理です。

この処理を実現させるために、Google Apps Script(以下GAS)のOCR機能を利用することにしました。

GASでDrive APIを使い、画像ファイルをGoogle Documentへ変換することで
変換後のファイルからテキスト情報を取得するできるようになります。

画像ファイルからテキストを取得する部分のコード

全てのコードを載せると長くなってしまうので、
画像ファイルからテキスト情報を取得する部分のコードを紹介します。

// 添付ファイルパーツに添付した画像ファイルを取得する
var imageBlob = UrlFetchApp.fetch(`https://cloud.collaboflow.com/{インスタンス名}/api/index.cfm/v1/files/${fileID}/download`, contents).getBlob();

var resource = {
  title: imageBlob.getName(),
  mimeType: imageBlob.getContentType()
};
var options = {
  convert: true,
  ocr: true,
  ocrLanguage: 'ja'
};

// Google Documentに変換する
const file = Drive.Files.insert(resource, imageBlob, options);
// 変換したGoogle Documentからテキストを取得する
const text = DocumentApp.openById(file.getId()).getBody().getText();
// 取得したテキストをコンソールで確認する
console.log(text);

// 変換したGoogle Documentを削除する
var fileData = DriveApp.getFileById(file.getId());
var getData = fileData.setTrashed(true);

こちらの記事「リンクになる文字GASでOCRする – Qiita 」を参考にさせていただきました。
ありがとうございました!🙇

実行結果の確認

リングフィット アドベンチャーで一日の運動終了後に以下の運動結果を表示してくれます。

こちらの画面を保存して先ほどのコードでGoogle Documentへ変換してテキストデータを読み取ると…

本日の運動結果
R 画面を撮影する
どすこい
O計活動時間
合計活動時間
合計消費カロリー
6分18秒 35.01kcal
0.66km
合計走行距離
・・次へ

所々、画像とは異なっている部分がありますが、今回取得したかった「活動時間」や「消費カロリー」、「走行距離」の値は正確に取得できています!

さて、「稟議フィット アドベンチャー」の準備は整ったので、
実際に稟議書(仮)を出して、リングフィットするだけです!

レッツ!リンギフィット!

まずは稟議書を作成します。

VRヘッドマウントディスプレイを着けてリモートワークはできるのか?って検証をしたいので、
阪神タイガースが2位に終わり意気消沈しているこにお(konio)氏に購入依頼をすることにします。
※ちなみに私は隠れヤクルトファンです。

最初の段階へ進むとリンギくんが目標を設定してくれます。

リンギくんは1時間ごとに申請書をチェックしてくれているので、しばらく待っていると…

無事に段階が先へ進みました!
1~3日目のミッションもちゃんと設定されています。

さて、3日分の目標も決まったのでレッツ!リンギフィット!

戦いの日々

さて、ここからはがむしゃらにリングフィット アドベンチャーを頑張っている人間の姿と
運動結果、OCR結果をご覧ください。

1日目

1日目のミッションは「活動時間10分以上」です。

フィットネスをしている時間が活動時間として計測される仕様になっています。

そのため、休憩時間などは活動時間に含まれないので楽することはできません。

運動結果

OCR結果

本日の運動結果
R 画面を撮影する
どすこい
合計活動時間
1 12分4秒
68.35kcal
合計消費カロリー
合計走行距離
1.39km
・・次へ

イイ感じに結果が取得されています!
(「1 12分4秒」の頭にある「1」はどこからやってきたんだ…?)

2日目

2日目のミッションは「活動時間15分以上」です。

たったの5分の違いですが、1日目の倍以上辛いです。汗だくです…。

お見苦しくて申し訳ないですが、ここで2日目の運動の様子をご覧ください。

見ている人を不安にさせるフィットネス風景

※色々と酷い姿をご覧ください

運動結果

開始5分を過ぎたあたりで体が悲鳴をあげ始めていましたが、何とかミッションを達成できました。

OCR結果

気になるOCRの結果は…?

本日の運動結果
R 画面を撮影する
どすこい
合計活動時間
Osamm16分16秒 6 合計カロリー 76.08kcal
0.57km
合計消費カロリー
cal
合計走行距離
・・次へ

ちゃんと「16分16秒」という文字が取得できています!

(Osammってなんだ…?おさむ?)

3日目

3日目。いよいよ最終日です!
ミッションは「活動時間20分以上」ですが…、2日目で三途の川が見えていたのでVRヘッドマウントディスプレイのためなら頑張れます。

運動結果

限界を乗り越えた結果、22分運動できました!
辛かったけれども達成感を感じます!!

※この後、風呂場でシャワーを浴びながら数分間座り込みつつグッタリしていました。

OCR結果

1日目、2日目と余分な情報がありつつも正しい値を取得できていたわけですが、最終日の3日目のOCR結果は…?

本日の運動結果
R 画面を撮影する
どすこい
合計活動時間
ō stune 22分15秒 6 合計カロリー101.65kcal
合計消費カロリー。
合計走行距離
2.62km
・・次へ

22分15秒!

ちゃんと取得できています!
「ō stune」ってなんだよって気持ちもありますが、思わず声を出して喜びました。

ラスボス戦

さて、これで終わりではありません。

ラスボスに承認してもらわなければ、この稟議書は決裁されません…。

気になる結果は…?!

・・・おや?

おやおや?

おやおやおやおやおや?

差戻されとるやん!!??

ラスボスのありがたいお言葉を見てみましょう…。
コメントの内容によっては異議を申し立てにいかねば…。

ごもっともなご指摘でございます…。

金額によってミッション日数や難易度が変わるような仕組みにしたりすると面白そうですね…。

余談

ちなみにミッション設定について最初の案では、
ランダムでミッションが設定される仕様にしていました。

ですが、とある理由で今回は変更しました。

そのとある理由とは

  • 1日目:活動時間40分以上
  • 2日目:消費カロリー100kcal以上
  • 3日目:走行距離2.00km以上

活動時間15分で三途の川が見えていた自分からすると絶望しかなかったので、
緩めな設定に変更しました。

しかし、これぐらいの目標を2週間ぐらい続けないと
VRヘッドマウントディスプレイの稟議は通らなかったでしょうね…。

まとめ

年末にお見苦しい姿を晒してしまい、申し訳ございません。
それに茶番にお付き合いいただいたkonio氏ありがとうございました。

社員に運動不足の人が増えていて困っている…とお困りの管理職の皆様、
「稟議フィット アドベンチャー」を導入してみてはいかがでしょうか?
※もし社員から反感を買ったとしても私は何も責任を負いません。

来年も技術ブログを更新していきますので、よろしくお願いいたします!
それでは良いお年を!!✋