本日は『秋分の日』だが、久し振りに真夏日になるらしい。自分(58歳♂)は、ようやく 2回目のワクチン接種を終えたが、抗体が出来始めるのは接種から10日後以降だと聞いているので、もうしばらく自粛の日々を過ごさなければならない。もどかしい限りだ。
今日は息抜きとして、BMI を求める簡単なコーディングをやってみた。
BMI が 30以上の人は新型コロナの重症化リスクが高いとか。自分も最近は運動不足で、ちょっと気になっている。自分の経験では、痩せたいなら有酸素運動を『長時間続ける』のが一番効果的だ。
運動と言っても、キツイ事をやる必要はない。週に3~4回、1時間以上歩き回るだけでも効果があるので、気になる人は試すといい。例えば、片道徒歩30分で行けるコンビニやスーパーへ歩いて行って、帰ってくるだけで、往復で 4km は歩いた計算になる(人の歩行速度を時速4kmと仮定)。
早く痩せたい人は、1時間ではなく、2時間以上歩くのがお薦め。有酸素運動は、強い負荷を短時間やるよりも『無理なく長時間続ける』…その方が効果を実感できる。コレ、本当だから。
コロナ禍の前までは、自分もよく歩き回っていたが今は、汗でマスクがビチョビチョになるのが気になって、自転車で移動するようになってしまった。お陰で 5kg も太ってしまった。しかも最近は天候不順…輪をかけて運動不足。
さて、BMI は次の式で求める。↓
BMI=体重(kg)÷身長(m)÷身長(m)
コードで記述すると… (1) kg / m / m (上記をそのまま記述) (2) kg / (m * m) (C,JavaScript とか) (3) kg / (m^2) (BASIC とか) (4) $kg / ($mt ** 2) (Perl) (5) (/ kg m m) (Scheme) (6) (/ kg (expt m 2)) (Scheme) …こうなる。
前置記法の Lisp や Scheme では、算術演算子が『多項演算子』として記述できるので、こういう式(5)が簡潔に表現可能(そもそも演算子ではなくプロシージャだし)。
他の言語(中置記法)では、算術演算子は『2項演算子』として扱うしかない。しかも演算子の優先順位があるので、紛らわしい数式で悩む事も多い。優先順位を覚える気がない自分は () を多用する。
『優先順位』は凡庸な社会が作った不完全なルールに過ぎない。優先順位ごときで受験の合否が決まってしまうようでは、社会は『本当に優秀な頭脳』を見逃してしまうと思う。紛らわしい数式を出題するのは、悪意を感じるね。
とりあえず、ちょっとコーディングしてみる。まずは Perl から。
#/usr/bin/perl use strict; use warnings; use POSIX 'floor'; my ($mtr, $kg) = @ARGV; my $bmi = get_bmi($kg, $mtr); print "$bmi\n"; sub get_bmi { my ($kg, $mtr) = @_; my $real_bmi = $kg / ($mtr ** 2); floor(($real_bmi * 10) + .5) / 10; } __END__ 書式:print_bmi.pl 身長(m) 体重(kg) 結果:BMI を小数点第1位まで標準出力(端数 四捨五入) (整数値はゼロサプレスが働く…これは Perl の仕様)
引数指定を『身長(m) 体重(kg)』の順番にしたのは、コマンド履歴を使って再実行する時に、その方が入力が楽だから。成人して成長が止まったら、身長が変わる事はない。
何度も実行する場合、体重の数値だけ変えながら実行するので、引数末尾を体重にした方が修正入力し易い訳。
実行例:
E:\strawberry-perl>print_bmi.pl 1.72 65 22 E:\strawberry-perl>print_bmi.pl 1.72 71.4 24.1 E:\strawberry-perl>gosh gosh> (/ 65 1.72 1.72) 21.97133585722012 gosh> (/ 71.4 1.72 1.72) 24.13466738777718 gosh> (/ 71.4 (expt 1.72 2)) 24.13466738777718 gosh> (exit)
71.4 kg というのは、直近で一番重かった体重。それでも BMI は 24 で済んでいる。だが、自分の実感では BMI が 22 を超えたら、体調に何らかの不調を感じる。30 未満なら安心っていうのも何か違う気がする…
ただ、太って良かったと思った事もある。それは、自転車で上り坂を駆け上がる時だ。ペダルを踏み込む時に、以前よりも『体重パワー?』で楽々と坂道を駆け上がれる事に気が付いた。「おお、何かスゲーぞ!」と喜んでいたら、電動アシストに乗ったおばちゃんにゴボウ抜きされた…
最後の gosh というのは Gauche という日本人が開発している Scheme 処理系。repl 実行が基本の Scheme では、この程度の式をプロシージャに仕上げる必要性は、さすがに感じない。
次は JavaScript(以降、js と略す)。
js では、引数指定を『入力フォーム』で実現する必要があり、それが面倒臭い。通常、js のサブルーチン(関数)は、html の <head>~</head> 内に記述するが、ブログでは記事中にそのまま記述するのが妥当かと。
あと、身長・体重は個人情報でもあるので、パスワードでお馴染みの伏字入力(**** と表示される奴)も必要かと。パスワードは文字列扱いなので、実数値に変換する必要がある…それには parseFloat() を使う。
一応言っておくと、ページが『http://』では、伏字にしてもセキュリティ的には無意味だと思う(たぶん)。このページは『https://』だから、まあ大丈夫なのかな(たぶん)。
<!-- はてなブログ(xhtml) で javascript を使う --> <script type="text/javascript"> //<![CDATA[ function getBMI(){ var mt = parseFloat(document.mymyForm.MT.value); var kg = parseFloat(document.mymyForm.KG.value); var bmi = Math.round((kg / mt / mt) * 10) / 10; alert("BMI(30以上は肥満):" + bmi); } //]]> </script> <form name="mymyForm"><p> 身長(m):<input type="password" name="MT"> 体重(kg):<input type="password" name="KG"> <input type="button" value="BMI 算出" onclick="getBMI()"> </p></form>
このソースを、そのまま貼ってみた。↓
↑上記に入力フォームやボタンが表示されない人は、js が『使用不可』設定になってるか、セキリュティを厳格にしすぎているかのどっちかだと思う。
html5 用のソースも書いてみた。こっちはローカル上で実行する前提なので、伏字入力は省略し、最初から数値として扱っている。↓
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>getBMI.html</title> </head> <body> <script> function getBMI(){ var mt = document.myForm.MT.valueAsNumber; var kg = document.myForm.KG.valueAsNumber; var bmi = Math.round((kg / mt / mt) * 10) / 10; alert("BMI(30以上は肥満):" + bmi); } </script> <form name="myForm"> <p> 身長(m):<input type="number" name="MT"> 体重(kg):<input type="number" name="KG"> <input type="button" value="BMI 算出" onclick="getBMI()"> </p> </form> </body> </html>
このソースをコピペして『getBMI.html』という名前で保存(utf-8)してダブルクリックすれば、BMI を計算できるぞ。