移植完了!2015年09月27日 03:43

移植完了!
移植完了!


ジャバスクリプトへの移植を完了した。

言語仕様を確認しながらだったので、相当時間を取られたし、つまらんバグフィックスで躓いたので今時になってしまった。

移植作業は、思ったよりも簡単だ。

構文の書式を確認しながらの作業なので、手間は掛かる。

とりあえず、掲載する。

「<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>JavaScript</title>
</head>
<body>
<script>
function print(str){
document.write(str + "<br />");
}
/*
<<<<潜降>>>>
*/
var pa = 100;
var pb = 0;
var nn2 = 0.79;
var r;//潜降速度(m/分)
r=prompt("senkou_sokudo(m/min) ? ","");
if ( (r == "") || (r == null) ) r = "0";
r = 10*r;
var d;//作業深度(m)
d=prompt("sagyou_sindo(m) ? ","");
if ( (d == "") || (d == null) ) d = "0";
var t = 10*d/r;
var qn2 = 74.5207;
var harf_time=[5,8,12.5,18.5,27,38.3,54.3,77,109,146,187,239,305,390,498,635];
var k=new Array(15);
var bunatu=new Array(15);
for (var i = 0; i < 16;i++){
k[i] = Math.log(2)/harf_time[i];
bunatu[i] = (pa+pb)*nn2+r*nn2*(t-1/k[i])-((pa+pb)*nn2-qn2-r*nn2/k[i])*Math.exp(-k[i]*t);
}
/*
<<<<作業>>>>
*/
var pb = 10*d;
var qn2=new Array(15);
var r = 0;
var t;// 290 input "作業時間(分) ? ",t
t=prompt("sagyou_jikan(min) ? ","");
if ( (t == "") || (t == null) ) t = "0";
for (var i = 0; i < 16;i++){
qn2[i] = bunatu[i];
bunatu[i] = (pa+pb)*nn2+r*nn2*(t-1/k[i])-((pa+pb)*nn2-qn2[i]-r*nn2/k[i])*Math.exp(-k[i]*t);
}
/*
<<<<浮上開始時の分圧>>>>
*/
var btm_bunatu=new Array(15);
for (var i = 0; i < 16;i++){
btm_bunatu[i] = bunatu[i]
}
/*
<<<<M値>>>>
*/
var mvn2a=[126.885,109.185,94.381,82.446,73.918,63.153,56.483,51.133,48.246,43.709,40.774,38.68,34.463,33.161,30.765,29.284];
var mvn2b=[0.5578,0.6514,0.7222,0.7825,0.8126,0.8434,0.8693,0.891,0.9092,0.9222,0.9319,0.9403,0.9477,0.9544,0.9602,0.9653];
/*
<<<<初回減圧停止深度の決定>>>>
*/
var r;//input "浮上速度(m/分) ? ",r
r=prompt("fujyou_sokudo(m/min) ? ","");
if ( (r == "") || (r == null) ) r = "0";
r = -10*r;
var hantei=new Array(15);
var mv=new Array(15);
var j = 0;
while (j < 20){
var t = Math.abs((d-3*j)*10/r);
var pc = 3*j*10;
for (var i = 0; i < 16;i++){
qn2[i] = btm_bunatu[i];
bunatu[i] = (pa+pb)*nn2+r*nn2*(t-1/k[i])-((pa+pb)*nn2-qn2[i]-r*nn2/k[i])*Math.exp(-k[i]*t);
mv[i] = (pa+pc)/mvn2b[i]+mvn2a[i];
if (bunatu[i] > mv[i]){
hantei[i] = 1;
} else {
hantei[i] = 0;
}
}
var hanteiti = 0;
for (var i = 0; i < 16;i++){
hanteiti = hanteiti+hantei[i];
}
if (hanteiti === 0){
break;
}
j++;
}
/*
<<<<停止+浮上>>>>
*/
if (j === 0){
print("end");
}
while (j > 0){
var teisi = j;
var teisi_bunatu=new Array(15);

for (var i = 0; i < 16;i++){
teisi_bunatu[i] = bunatu[i];
}//for抜け
var pb = 3*teisi*10;
var pc = 3*(teisi-1)*10;
var l = 1;
while (l < 300){
var t = l;
for (var i = 0; i < 16;i++){
qn2[i] = teisi_bunatu[i];
bunatu[i] = (pa+pb)*nn2-((pa+pb)*nn2-qn2[i])*Math.exp(-k[i]*t);
qn2[i] = bunatu[i];
}//for抜け
var t = Math.abs(3*10/r);
for (var i = 0; i < 16;i++){
bunatu[i] = (pa+pb)*nn2+r*nn2*(t-1/k[i])-((pa+pb)*nn2-qn2[i]-r*nn2/k[i])*Math.exp(-k[i]*t);
mv[i] = (pa+pc)/mvn2b[i]+mvn2a[i];
if (bunatu[i] > mv[i]){
hantei[i] = 1;
} else {
hantei[i] = 0;
}//if抜け
}//for抜け
var hanteiti = 0;
for (var i = 0; i < 16;i++){
hanteiti = hanteiti+hantei[i];
}//for抜け
if (hanteiti === 0){
break;
}//if抜け
l++
}//内側のwhile抜け
//プリント表示
print(3*j+"m,"+ l +"min");
j--
}//外側のwhile抜け
</script>
</body>
</html>」

htmlファイルにベタ書きする方法だが、スクリプトファイルを分けるというのが、最近の流行りのようだ。

見て分かる通り、ベーシックのコードそのままである。

ただし、hanteiという変数は、ジャバスクリプトの場合、hantei(15)の配列と区別がつかなくなるので、「hanteiti」に変更した。

そのほかは、変数名も含めて同じである。

実行すると、小さいウインドウが出てきて、パラメーターを入力することが出来るが、文字化けが避けられないので、ローマ字表記にした。

フォームとか、気の利いた仕掛けには興味がないので、そっちが気に入っている方は、自分で何とかしてもらいたい。

使っているデータは、昨日書いたベーシックと同じなので、おそらく同じ値が出るはずである(有効数字が、ジャバスクリプトの方が多いので、少しは違うかもしれない)。

エディターは、テラパッド(TeraPad)というフリーのソフトをダウンロードして使ってみた(画像参照)。

ジャバスクリプトを書くのには、少しパワー不足かもしれない(「{」「}」の突合とかは、してくれない)。

せいぜい、文字列やコメントの色分けとか、予約語の強調程度である。

まあ、チップマンクベーシックのラインエディターよりは、作業効率は高い。

作業は、まず、ベーシックのコードを全部コピペして、逐次直していく方法を取った。

半自動で、変換してくれると楽なんだがな。

それでも、半日程度で終わったのは、標準的な記法にしていたからだろう。

「初回減圧停止深度の決定」の際に、先ほどの{}の数を間違えて、バグ取りに苦労したので、「停止+浮上」では、閉じカッコにコメントを付けて、明示的に判るようにした。

エディターの方で、何とかしてもらいたいもんだな。

さて、このまま移植を続けて、アンドロイドアプリまで行ってもいいんだが、さすがに、空気潜水で40mまでしか使えないのでは話にならないし、保守性を与えることも出来ない。

同じコードを、右から左に書き換えるというのも、言語仕様の勉強にはなるが、やや飽きてきた。

せっかくなので、少し改良しながら、安全率を掛ける仕掛けにチャレンジしてみようかな。

ヘリウムを用いたトライミックスや、ヘリオックスのパターンも研究してみよう。

深度によって、ガスの種類を切り替えたり、安全率を変更したりできるようにすれば、何となく減圧ソフトっぽくなってくるだろう。

とりあえず、JavaScriptへの移植のコツは分かった(コツコツやるだけ?)。

重複しているコードを整理したり、分圧を出している計算式を統一するなどして、工夫しなければならない(qn2が配列になっていたり、いなかったりするのに気付かずに、エラーになったりもした)。

短いコードだが、一応検討会報告書の手順に従っている(初回停止深度を探るのに、一部は変えてますが)。

有効数字をどこまで取るかで、精度的にわずかに違ってくるが、決定的に異なる値が出るわけではない。

ブラウザーという実行環境が、広く普及しているので、ジャバスクリプトで書いたが、この言語は、元々動的なホームページを作るのが目的なので、電卓代わりに使うようにはできていない。

それでも、必要な関数や制御構文は揃っているので助かる。

もっと、込み入ったプログラムにも耐えられるような仕様になっているのだろうが、今回はベーシックのコードを翻訳した程度だった。

インターフェースとか作りこめば、もっと楽しめるのかもしれないが、浮沈子はそういうのは苦手だな。

対話的な入力よりも、コードの中に直接書くのが好きだったりする。

人様に使っていただくなんて発想はない。

今回も、インプットボックスを出しているが、このページのパクリである。

(promptによるインプットボックスの使い方)
http://www.pori2.net/js/dialog/2.html

文字列の取得ということだが、そのまま代入しても、数字として扱ってくれているようだな。

言語エンジンの方で、勝手に解釈してるんだろう。

明示的に変換しておく方が安心かもしれない。

(JavaScriptで文字列を数値に変換する方法について解説)
http://www.pori2.net/js/number/1.html

「parseInt()が文字列を整数に変換するJavaScriptの命令文です。」

人様に使っていただくソフトを書くのは、大変なんだろうな。

浮沈子は、コードの中に直に書くよりましならいいと思っている(志が低いので)。

まあいい。

この他に参考にしたページを書いておく。

(JavaScript入門 (全24回))
http://dotinstall.com/lessons/basic_javascript_v2

例によって、取っ付きを良くする動画シリーズ。

(JavaScript入門)
http://www.ajaxtower.jp/js/

頻繁に見たページ。

(JavaScript リファレンス)
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference

あんま、見なかったな。

(JavaScript初級者から中級者になろう)
http://uhyohyo.net/javascript/index.html

初級者の基礎知識だけ読んだ。

ざっと以上だが、ベーシックからの移植程度に、左程の技は必要ない。

この程度の処理では、どの言語でも同じような書き方しかできないのではないか。

初めにジャバスクリプトで書いたとしても、似たようなコードになっただろう。

作業手順の関係から、初回停止深度の確定を分けているが、コードの中身はその後の浮上+停止と同じようなロジックなので、この部分は工夫の余地がありそうだな。

まあ今回は、最後の浮上+停止について、繰り返し文の入れ子構造で比較的シンプルに書けたのでいいとしよう。

次は、とりあえずヘリウムだが、表計算ソフトを使って書いたときは大変だったな(窒素とヘリウムと合計の計算シートを別々に作ったので)。

プログラムは、それぞれのガス毎に計算して、足し算した値を、加重平均して出したM値と比較するだけなので、簡単にいくだろうと高をくくっている。

安全率にしても、変数を一つ立てて、それで割り返してやるだけだ。

深度毎にやるということになると、条件分岐してやらなければならないから面倒だな。

保守性とか、グラディエーションという感じで、何となく普通の減圧ソフトっぽい。

それでも、この減圧アルゴリズムを生で使えば、ある確率で必ず発症する。

業務潜水で、しっかりした管理を受けているとか、再圧室が確保されている場合でなければ、とても使えたものではない。

業務潜水というのは、減圧症にかかることを織り込んだ体制になっている。

間違っても、レジャーダイビングで使用する話ではない。

それにしたって、テクニカルダイビングの訓練を受け、認定されて初めて減圧潜水を行えるようになる。

その際の減圧表は、遥かに保守的で、安全側に振ってある。

何度も繰り返して書くが、この減圧ソフトは、これ以上のリスクを負わせると違法になるという最低のレベルを規定するためのものだ。

実際の潜水に使用するべきものではない。

浮沈子は、あくまでも、合法的な最低の基準を、計算式ではなく、実際に導出して確認できるようにするために作っている。

世の中には、もっと安全率を高めた減圧表はいくらでもある。

日本潜水協会のNSK減圧表は、厚生労働省の計算式よりはるかに保守的に作られている(非会員3000円で手に入る:冊子になってます)。

また、レジャーダイビングにおいては、各指導団体でテクニカルダイビングの指導の際は、もっと安全寄りにした減圧スケジュールが立てられるように学習する。

それを踏まえて、あくまでも、潜水士試験の参考に、減圧理論や減圧ソフトの仕組みを学習、確認するためのものとして活用されたい。

浮沈子は、テクニカルダイバーを目指してはいるが、この減圧スケジュールで潜ることは絶対ない。

比べてみればわかるが、ヤバ過ぎて怖くて使えない。

そういうソフトだということは肝に銘じて欲しいな。

元になったビュールマンのZH-L16は、現在も改良が続いていて、遥かに安全率が高くなっている。

ダイコンとかに使用されているアルゴリズムについては、各メーカーが、さらに保守性を高める工夫をしているし、そのダイコンも、ギリギリまで使うことは避けるように、指導団体では教育しているはずだ(少なくとも、PADIはそう言っている)。

レクリエーショナルダイビングでは、ディープストップや安全停止など、実質的な予防的減圧停止を導入しているが、もとより、日常的に本格的な減圧停止が必要になるようなプロファイルで潜ることは禁じている。

健康のためにも、避けるべきものだ。

業務上減圧停止を伴う潜水をせざるを得ない立場の労働者が、手軽に確認できる最低限のラインを示すためのツールとして開発している。

計算式や係数は、厚生労働省のホームページで公表されているし、潜水士テキストにも載っている。

(厚生労働省告示第四百五十七号)
http://www.mhlw.go.jp/file/06-Seisakujouhou-11300000-Roudoukijunkyokuanzeneiseibu/keisanhouhoukokuji.pdf

「NN2:当該区間の窒素の濃度(窒素の濃度が変化する区間にあっては、当該区間の最高の窒素の濃度)(単位パーセント)」

パーセントでは、正しい値がでないので、誤植(?)を指摘しているんだが(2015年の7月21日に、担当部署「厚生労働省労働基準局安全衛生部労働衛生課業務第四係03-5253-1111内線5498」へ電話している)、いつまでたっても直らない。

ヘリウムも同じだ。

まあ、明らかな間違いなので、そのうち治ると思うんだがな。

まあ、もう、どうでもいいんですが。

ヘリウム使用の計算式が出来たら、また掲載する。

三台話2015年09月27日 22:05

三台話
三台話


500Eに乗って、愚弟と近所に昼食に行って、駐車場で03ボクスターに乗り換え、第三京浜を都筑ショートコースでぶっ飛ばした後、プレステージで掛田さんと駄弁ってから、疎開先へ行って83タルガと入れ替えてきた。

1日に3台に乗ることは滅多にない。

配列リテラル風に書くと、こんな感じ。

["500E","03ボクスター","83タルガ"]

まあ、どうでもいいんですが。

乗り心地を評価すると、こうなる。

「500E>03ボクスター>>83タルガ」

しかし、アドレナリン分泌量(量ったわけではありませんが)では逆だ。

「500E<03ボクスター<<83タルガ」

新車時の販売価格は、この順番。

「500E=83タルガ>>03ボクスター」

浮沈子が中古で仕入れた額は、こうなる。

「500E<83タルガ<<03ボクスター」

しかし、購入後のメンテ費用は、真逆だ!。

「500E>>83タルガ>03ボクスター」

出入りしている店で、一番のお得意さんになっているのは、もちろん500EのメンテナンスをしているJ-AUTOだろう。

次が、たまに改造をするプレステージ。

定期点検と、車検の時しか金を落とさずに、景品だけもらいに行くのが、都内某ポルシェセンターというわけだ。

足回りとか見てもらったアウトバーンには、その後行ってないし、83タルガを仕入れた横浜の店にも行ってないなあ。

500Eは川越で仕入れたが、それっきりだ。

近くの店で、顔になって、ちょこちょこ直したり、改造したりしている。

こんな感じで維持できればいい。

まあいい。

500Eは、相変わらず、いい感じで走る。

内張りの修理を依頼しているが、材料とか揃ったら、連絡してくれることになっている。

その他には、手を入れるところはない。

浮沈子が手放して、J-AUTOが買い取ったら、全塗装して運転席のシートを純正に戻して売りに出すそうだ。

まあ、当分先だけどな(たぶん)。

宿題としては、制御用コンピューター(4台)と、ATオーバーホール、エアコンの電磁弁が残っているが、症状が出てからでいいというのが金川さんの意見だ。

それ以外は、全部やったから。

まあ、エンジン本体には手を付けていないし、ホイールやサスペンションという、ドレスアップ要素は全く弄っていない。

しかし、いいクルマに仕上がっている。

足として、乗り倒しても、音を上げない。

法定速度プラスアルファ(アルファ>
法定速度!?)で走っても、びくともしない。

03ボクスターは、21世紀のクルマだ。

基本設計は、20世紀だが、クルマの在り様は、完全に現代のクルマである。

現世利益を追及した、モダンなMRだ。

文句のつけようがない。

燃費も、3台中で最もいい(排気量も最低だけどな)。

・500E:5.0リッター
・83タルガ:3.2リッター(エンジン積み替え)
・03ボクスター:2.7リッター

回せば、7200回転のレッドゾーンまで、キッチリ回る。

いい音たてて、それなりの加速をする。

500Eみたいに、ガソリンぶちまけて加速するのではなく、緻密な機械が澱みなくスムーズに回って、効率よく燃焼させているのが分かる(ような気になる)。

手放そうと思っても、なかなか踏み切れない。

83タルガは、正真正銘の20世紀のクルマだ。

特に、03ボクスターから乗り換えると、その違いに驚く。

これって、同じ「自動車」という括りで語っていいのかあ???。

全く別のカテゴリーの乗り物としか思えないくらい違う。

それでも、空冷のガチャガチャいうエンジン音をさせつつ、神経質なクラッチワークに気を使いながら走る、この人間臭い乗り物が大好きだ!。

めっきり涼しくなって、今日は屋根を閉じたまま、サイドウインドウを開け放って走った。

今後の課題は、ブロワーファンを直すこと、エンジンカバーをダックテイル風のフィン付きに替えること、バッテリーをリチウムイオンに替えること、ブレーキ踏んだ時の振動を調整すること。

せいぜいそんなもんである。

次回の走行会の情報も仕入れた。

掛田さんの方で、改造関係は、いろいろ調べてくれることになった(ブレーキは、走行会前に直したいな)。

それ以外は、いつでもいい。

ブロワーは、冬前に直っていて欲しいような気がする。

去年は、結構寒かったしな。

明日は、久々にフィットネスクラブに顔を出そう。

このところ、さぼってばかりで、間が空いてしまっている。

スポーツの秋、食欲の秋、芸術の秋、贅肉の秋(?)・・・。

駐車場へ向かう道すがら、この時期、キンモクセイの咽るような強い香りが漂っていた。

(キンモクセイ)
https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%B3%E3%83%A2%E3%82%AF%E3%82%BB%E3%82%A4

「秋に小さいオレンジ色の花を無数に咲かせる。雌雄異株であるが、日本では雄株しか入っていないので結実しない。雄しべが2本と不完全な雌しべを持つ。花は芳香を放つ。」

なんだ、みんなオスかあ・・・。

「キンモクセイの花は甘めでしっかりした強い香りであることから、日本において汲み取り式便所が主流で悪臭を発するものが多かった時期には、その近くに植えられることもあった。その要因から、香りがトイレの芳香剤として1970年代初頭から1990年代前半まで主流で利用されていたため、一部年齢層においてはトイレを連想させることがある。」

この部分は、以前にも引用した記憶がある。

(金木犀)
http://kfujito2.asablo.jp/blog/2014/10/13/7458127

秋の季語でもある。

静岡県の木(モクセイ)にもなっているそうだ。

本当なら、今日は墓参りに行く予定だったのだが、愚弟が体調を崩していて見送った。

台風21号が、先週までいた石垣島の近くにいる。

秋は、台風の季節でもある。

何事もなければいいのだが・・・。