JSONとウェブ・ストレージ2015年10月06日 21:32

JSONとウェブ・ストレージ


減圧プログラムの方も、何となく意欲が薄れてきて(まあ、飽きっぽいのでしょうがないな)、プログラミングそのものというか、データのハンドリングを楽しむようになってしまった。

本来は、厚生労働省の告示による計算方法に則った減圧スケジュール(減圧表)を、簡便に作ることができるソフトを目指してるんだが、繰り返し潜水と、エアブレイクを除く、大方の仕組みは書けてしまった。

後は、酸素呼吸(実際は、窒素濃度20パーセントの80パーセント・エンリッチド・エア・ナイトロックス)を吸い始めてからの時間をカウントする仕掛けを作って、25分経ったら空気(窒素濃度79パーセント)を5分間吸うという分岐を作ってやることと、書き上げたコードの後ろに、水面休息時間の計算と、もう1回潜るためのコードをコピペしてやればいい。

それが、おっくうで手が付かない。

今日は、昨日書いたコードのバグを整理したり、重複したコードを削除したりして、少しでも見通しをよくする作業を行った。

一瞬、消し過ぎて、動かなくなったりして焦ったけどな。(コードは、訂正したものを差し替えて載せました)。

ウエブ・ストレージ(使ってるのは2つあるうちの、データが無期限に保存されるローカルストレージ)を使用して、パラメータの保存をするというアイデアは、なかなか良かったが、テストで設定したデータも読み込んでしまうのにはまいったな。

全部削除するボタン(コメントアウトしているだけなので、直ちに表示可能)と、デフォルト値を保存する仕掛け(未作成)を付けて、開発環境との切り分けを行う必要がある。

相変わらず、IEやエッジでは使えない。

ウェブ・ストレージについては、マイクロソフトのページにも解説が載っている。

(Web ストレージについて)
https://msdn.microsoft.com/ja-jp/library/bg142799(v=vs.85).aspx

(Web Storage を使ってファイルをローカルに保存する)
https://msdn.microsoft.com/ja-jp/library/hh580308(v=vs.85).aspx

自分の所で載せているサンプルプログラムが動かないんじゃ、しょうがないな。

パソコンやブラウザーの環境の問題なのかもしれないが、それを弄らなければ動かないような仕組みでは困る。

ブログの記事からテキストをコピペして、メモ帳かなんかに貼り付けて、拡張子を「.html」にしてダブルクリックすると、直ちに減圧ソフトが動くことを目指している。

マイクロソフトの2番目の記事の下の方に、JSONを使って多数のデータをウェブ・ストレージに保存する方法が出ている(まあ、これもマイクロソフト製のブラウザーでは動かないんだが)。

同じような記事が、いくつかのサイトで上がっている。

(html5のlocalStorageで複数のデータを保存するには?)
http://the-zombis.sakura.ne.jp/wp/blog/2012/05/12/post-1362/

(localStorageで複数のデータを保存する)
http://www.tam-tam.co.jp/tipsnote/javascript/post5978.html

そのほかにもいくつかあるが、それらを参考に、減圧ソフトで今のところ使用しているパラメーターを、ウェブ・ストレージに保存するプログラムを書いてみた。

<!DOCTYPE html>
<html>
<body>
<script>

function print(str){
document.write(str + "<br />");
}
//配列を定義
var defaultParameter = {
a1:1.21,
a2:1.4,
a3:1.35,
a4:1.1,
a5:1.1,
d:40,
d1:0,
d2:2,
d3:3,
d4:4,
nhe:0,
nn2:0.79,
o2:12,
pa:100,
pb:0,
qhe:0,
qn2:74.5207,
r:8,
r0:8,
s:2,
t1:125
};

//ウェブ・ストレージに格納するためにJSON.stringify()で文字列に変換後、key"data"の値として格納する
window.sessionStorage.setItem("data", JSON.stringify(defaultParameter));

//逆にウェブ・ストレージから引っ張って来てから、JSON.parse()でオブジェクトに戻している
//元のオブジェクト(defaultParameter)と区別するために、(~Copy)として、別のオブジェクトに格納
var defaultParameterCopy = JSON.parse(
window.sessionStorage.getItem("data"));

print("元のオブジェクト(defaultParameter):");
print(JSON.stringify(defaultParameter));
print("");
print("一度保管してから読み込んだオブジェクト(defaultParameterCopy):");
print(JSON.stringify(defaultParameterCopy));
print("");
print("値が数値になっていることの確認:a1(1.21) + 1: ");
print(defaultParameterCopy.a1+1);

</script>
</body>
</html>」

実行するとこうなる。

「元のオブジェクト(defaultParameter):
{"a1":1.21,"a2":1.4,"a3":1.35,"a4":1.1,"a5":1.1,"d":40,"d1":0,"d2":2,"d3":3,"d4":4,"nhe":0,"nn2":0.79,"o2":12,"pa":100,"pb":0,"qhe":0,"qn2":74.5207,"r":8,"r0":8,"s":2,"t1":125}

一度保管してから読み込んだオブジェクト(defaultParameterCopy):
{"a1":1.21,"a2":1.4,"a3":1.35,"a4":1.1,"a5":1.1,"d":40,"d1":0,"d2":2,"d3":3,"d4":4,"nhe":0,"nn2":0.79,"o2":12,"pa":100,"pb":0,"qhe":0,"qn2":74.5207,"r":8,"r0":8,"s":2,"t1":125}

値が数値になっていることの確認:a1(1.21) + 1:
2.21」

さっき書いた事情で、sessionStrageを使っているが、データがコードされているので、動きを見るのに問題はない。

結果を画面からコピペする関係で、初めにプリント文を使えるようにしている(ベーシック病だな・・・)。

アラートだと、やりにくいし、字が小さいのでこれにしている。

この記法だと、取得した値の方は数字に変換されているようだ。

最後のところで、足し算してみて確認している。

これをうまく使えば、デフォルト値を戻してやることも出来るだろう。

オブジェクトとして書き込みと読み取りをしているので(うーん、単なる文字列に変換して格納してるだけだがな)、JSONといえるかどうか・・・。

まあいい。

パラメーターの格納は、プロパティ名と値の組み合わせで書けるオブジェクトが向いている。

ジャバスクリプトのオブジェクトが、元々JSON形式になっているだけの話か。

それをウェブ・ストレージに保管するだけ。

それでも、何かの役に立つかもしれない。

せっかく、デフォルト・パラメーターのオブジェクトを書いたので、これをソースに書き込んでおくことにしよう。

万が一、ローカルストレージが消えてしまっても、参考値として残しておくことができる。

それ以外は、昨日と変わっていないので、今日はソースコードは書かない。

いろいろやることはあるが、一向に意欲が湧かない(いつものことじゃん!?)。

昨日も、今日も、フィットネスはさぼっている。

部屋に籠って、横になったり、コードを書いたり、飯を食ったりしているだけだ(最悪ですな・・・)。

動かなかったJSON関係のプログラムを、動かすことができるようになっただけ。

配列はいろいろ使ってきたが(半飽和組織:コンパートメントが16種類もあるんで)、オブジェクトというデータ保存の枠組みは初めて使った。

プロパティ名になる文字列(識別子?)に、いろいろ制約があるので注意しなければならないようだが、あまり神経質にならずにどんどん使っていけば見やすいコードになるんだろう。

パラメーターの格納には向いている気がする。

うまく実装できるといいんだがな。