パンデミック後の新世界を作るために (foussin’s blog)

(『見捨てられた世代』からの提言)

肥満(BMI >= 30) かどうかを確認

 本日は『秋分の日』だが、久し振りに真夏日になるらしい。自分(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)
…こうなる。

 前置記法の LispScheme では、算術演算子が『多項演算子』として記述できるので、こういう式(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>


 このソースを、そのまま貼ってみた。↓


身長(m):
体重(kg):

 ↑上記に入力フォームやボタンが表示されない人は、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 を計算できるぞ。