怠惰な人のカロリー管理~~~
この記事は VOYAGE GROUP Advent Calenderの22日目の記事となっております。
前置き~~~~~
こんにちは、今年新卒で入社した @takeru0911です。早いもので入社して8カ月も経過しました。
皆様のご指導のたまもので技術力が少しずつ成長しているという実感がありますが、技術力よりも圧倒的に成長したことがあります。
はい、 体重 です。
大学入学時からすると驚きの30kg増、大学院入学時からだとなんと25kg程度太りました。 この圧倒的な成長の傾きは衰えることなく入社してさらに勢いを増しております。
その圧倒的(体重)成長曲線のイメージは下のような感じです。
(こちら縦軸が体重で、横軸が時間tと思っていただければ)
どちらも圧倒的ですが、入社後の成長具合がよくわかるかと思います。
成長するのはとても良いことですがこのままいくとちょっと良くないことが起きかねないとダイエットを決意したのが入社して一カ月も経たないときでした。
そのあと、ダイエットするためにいろいろなことを行いました。
このうちの 摂取カロリーを記録
、というのが地味なようで自分の体質を把握する意味でもいい感じに効いてくるらしいです(ネット調べ)
でもめんどくさくないですか?
毎回の食事のカロリーをいちいち調べて、なんかに記録して、というのを毎食行うなんてちょっと信じられないですよね。
できる人心の底から尊敬します、僕には無理です(無理でした、一週間くらいでやめました)
でも最近は補助するアプリもあって、これなら私でもいけるのでは・・・!?と使ってみたりしました。
ダメでした
例えば、おにぎり
って検索すると、梅にぎり、鮭にぎり、そのほかいっぱいのおにぎり。
あれですよね、選択するのめんどくさいですよね。 これがおにぎり2個とかになると、いくつ食べたかを入力してとかなるわけですよ。
なんにしてもこれを食事のたびに食品ごとに行うのはちょっと辛いですよね。
とは言え最近いろいろな方面の方々に会うたびに
「太った?」 「痩せた方がいい」
と言われるので、痩せるためにカロリー管理をするにはどうしたら良いのか?と本気出して考えてみました。
結果、自分みたいな怠惰マンでもカロリーを管理できるようなものは自分でしか生み出せないと考えて、もう作るしか無いか・・・という結論に至りました。
前置き終わり。
カロリ~~~~~
ここまでの前置きでどんな感じなら、とても怠惰な自分でもカロリーを管理できるか分かってきた気がします。
- 入力するだけ
- あいまいでも選択しないでいい
- 選択肢が複数あってもいい感じにサマる
- 一つのページで完結する
上の条件をGoogle Spreadsheetで実現することにしました、google application script(gas)便利ですね(ぼくはExcelのVBAのほうが書き慣れてて好きです)
あと食品のカロリーはapiで取得します
カロリーapi~~~~~
食品のカロリーの取得には カロリー api
でぐぐって上のほうで出てきた↓のものを使用させていただきました。
このapi結構気に入っていて、例えばおにぎりって叩くと、↓みたいにおにぎりで部分一致するものをすべて返してくれます(calがカロリーですね)。
<Result> <food> <id>77</id> <name>おにぎり紀州梅</name> <cal>148</cal> </food> <food> <id>102</id> <name>おにぎり</name> <cal>180</cal> </food> </Result>
怠惰な私は、シーチキンおにぎりを食べようが、鮭おにぎりを食べようが(面倒なので) おにぎり
で登録したがります。
なのでこの部分一致で返ってきたものをいい感じにサマれば、どんなおにぎりを食べようがなんとなくそれっぽいカロリーになるはずです(?)
ではapi叩いて、xmlをparseしていい感じにサマるのをgasで書きましょう。
xmlのparseあたりはここらへんを参考にしました。
//apiたたいてカロリーxmlを取得 function fetchCalorieXml(foodName){ var feedURL = "http://24th.jp/test/api_cal.php?submit=on&name=" + foodName; var response = UrlFetchApp.fetch(feedURL); return response.getContentText(); } //取得したxmlをparseしてカロリー取得 //該当する食品があったら良い感じにカロリーをさまる function parseCalorieXml(contentText){ var xml = XmlService.parse(contentText); var items = xml.getRootElement().getChildren('food'); var sumCal = 0; if(items.length == 0){ return 0; } for(var i = 0; i < items.length; i++) { var cal = Number(items[i].getChild("cal").getText()); sumCal = cal + sumCal } //いい感じにサマる return sumCal / items.length; }
fetchClorieXml
でapiを叩いて取得されたxmlを parseCalorieXml
に渡すだけです。
サマる箇所はもし複数ヒットしたら平均をとって返すとかいうなんの捻りもない内容になってます。
User Defined Calorie(UDC)
このapiのおかげで基本的な食事はカバーできます。
しかしよく食べるけど一般的ではないなにか(会社で売られる弁当とか)とか、大量の飲み物や食べ物を食べる会(飲み会)の場合はちょっとapiだけだと辛いですね。
なのでユーザーが独自のカロリーを登録できるようにしました。
はい、いわゆる User Defined Calorie(UDC)機能の実装です。
本当に何の捻りもない実装です。 下の画像みたいにUDC sheetに食べ物の名前と、カロリー数を書いてその値を取得するだけです。
将軍ってのは会社に来る弁当屋さんの名前で、カロリー数は適当です。 飲み会は飲み会ですね、夜飲み会があるとこれを入力すれば面倒なことなしです、素晴らしい!!(このくらい割り切らないと絶対続かないので)
これを普通にgasで実装ですね。
なんも捻りもないのでコードは載せないです。
食べた数をわけるのめんどい!!
朝ごはんに私はおにぎりを2つ食べてカフェラテを飲むのですが、それぞれの食べた個数を↓みたいに複数のセルに書いていくのは無理ですね。
食べたもの | 個数 |
---|---|
おにぎり | 2 |
カフェラテ | 1 |
一つのセルにこんな感じで入力したいですよね
おにぎり*2,カフェラテ
この入力でいい感じにカロリー計算してくれたら、毎朝全く同じメニューの私は補完が効いて朝ごはんの登録は お
を入力するだけでとても楽になります。
というわけでこれもgasでできるように実装しましょう。
普通に ,
でsplitして、splitされた文字列を *
でsplitするだけです。
//複数食品があったら、なんか分解する //カレー*2とかあったら個数もなんかやる function parseInputFood(inputText){ var splitText = inputText.split(",") var foods = []; for(var i = 0; i < Number(splitText.length); i++){ var cnt = 1; var text = splitText[i]; //なんこか食べたら var splitAsta = text.split("*"); if(splitAsta.length > 1){ cnt = splitAsta[1]; } var foodName = splitAsta[0]; foods.push( { name: foodName, cnt: cnt } ); } return foods; }
普通ですー。
楽
なんやかんやで↓みたいな感じにわりと楽な感じにカロリーを計算できるようになりました。
ちなみにapiにもUDCにもない食品は、UDCに登録してね☆って言われます。
まとめ
いろいろバグというか、実装が足りない部分もありますがこれくらいで十分かなと思います。 ほとんど書いたことないので読みにくかったり、もっときれいに書けるやんってところが多々あると思いますがご容赦を。
でもなんだか自分でこういうのを作ると、長続きするような気がします。 ダイエットでカロリー管理が続かなかった方がもしいれば自分で作ってみるのも良いかもしれないですね
ちなみに書いたコードはgistにあげておきました。 スクリプトエディタでこれをぺって貼り付けて、プロジェクトトリガーでシートの編集時に動くように登録すれば動くかと思います。
それでは来年ではダイエット成功の報告ができると信じてさようなら~!
次の VOYAGE GROUP Advent Calendar の記事をお楽しみに~~~~~