takaiwa.net

Android、Java、Web系、Linux、マラソン等の備忘録

2011/04/16

JavaScriptオブジェクト⇔[JSON]⇔ローカルストレージの流れ

0 件のコメント

Opera Extensionsでも作ってみたいないと・・サンプルを見ていたら、データの保持にlocalStorageというやり方がありました。

localStrageはHTML5からの仕様で、Cookie の代わりとなるものでだが、より大容量データをブラウザに保存できるものだそうです。こちらの概要がわかりやすいと思います。

・Safari4 と IE8 で実装された DOM Storage とは何か - IT戦記
http://d.hatena.ne.jp/amachang/20080924/1222239494

で、直接値を入れて保存することもできますが、ここでは、JSON形式にしてデータを出し入れしてみたいと思います。

JavaScript ⇔ [JSON] ⇔ localStrage

その前に、JSONでどのようなデータを扱うかですが、下記のように、サイトのタイトルとURLを複数個格納するデータです。

{"modified":"2011/04/15 Fri",
"items":
   [
   {"title":"タイトル1","url":"http://www.yahoo.co.jp/"},
   {"title":"タイトル2","url":"http://www.google.co.jp/"}
   {"title":"タイトル3","url":"http://twitter.com/"}
   ]
}

流れはJavaScriptオブジェクトにデータを格納し、それをJSONデータにします。それをローカルストレージへ保存します。もう一方では、ローカルストレージからJSONデータを取得し、そのデータをJavaScriptオブジェクトとして扱います。サンプルプログラムは下記の通りです。

<!doctype html>
<html lang="ja">
  <head>
    <title>JavaScript→JSON→ローカルストレージ→JSON→JavaScript</title>
    <style>
    </style>
    <script>


    // Setボタンの処理
    window.addEventListener("load", function(){
        document.getElementById("setButton").onclick = function(){



            // JavaScriptオブジェクトにデータを設定
            var object = {};



            object.modified = "2011/04/15 Fri";
            object.items = new Array();



            object.items[0] = {};
            object.items[0].title = "タイトル1";

            object.items[0].url = "http://www.yahoo.co.jp/"



            object.items[1] = {};
            object.items[1].title = "タイトル2";

            object.items[1].url = "http://www.google.co.jp/"



            // itemsへデータを追加する場合の書き方例
            var data = {};

            data.title = "タイトル3";

            data.url = "http://twitter.com/"

            object.items.push(data);



            // JavaScriptオブジェクト→JSONデータに変換
            nativeJSON = JSON.stringify(object);



            // ローカルストレージへ保存
            localStorage.setItem('urlhistory', nativeJSON);



            document.getElementById("display").innerHTML = "set!";
        }

    }, false);



    // Getボタンの処理
    window.addEventListener("load", function(){
        document.getElementById("getButton").onclick = function(){



            // Setボタンで保存されたデータを取得
            var nativeJSON = localStorage.getItem('urlhistory');



            // JSONデータ→JavaScriptオブジェクトに変換
            var object = JSON.parse(nativeJSON);



            // オブジェクトからデータ取得
            var html = "modified:" + object.modified + "<BR>";



            for(var idx=0; idx < object.items.length; idx++) {
                html = html + "■items" + idx + "<BR>";

                html = html + "title:" + object.items[idx].title + "<BR>";

                html = html + "url:" + object.items[idx].url + "<BR>";

            }



            // 表示
            document.getElementById("display").innerHTML = html;



        }
    }, false);



    </script>
  </head>
  <body>
    <button id="setButton">
        Set
    </button>


    <button id="getButton">
        Get
    </button>
    <BR>


    <div id="display">display</div>


  </body>
</html>



このサンプルでは、 下図のように2つボタンがあり、

WS000109

まず、Setボタンを押すと、JavaScriptオブジェクト→JSON→ローカルストレージへ保存という動作をします。
 WS000110

次に、Getボタンを押すと、ローカルストレージ→JSON→JavaScriptオブジェクト→内容を表示という動作をします。

WS000111 

ローカルストレージから取り出したJSONデータを変換することで、JavaScriptオブジェクトとして使えるので、それをループで回して、HTML文を作成して表示しています。

2011/04/10

無料オンラインストレージを使って、Linux自宅サーバの自己満足的多重セーフ ティなバックアップを考えてみた

0 件のコメント

そもそもは、この大した記事も投稿していない、自宅サーバのwordpressに、今後も記事を投稿するなら定期的にバックアップを取る仕組みを入れておいた方がいいなって所からいろいろ考え始めたものです。 image

  • 前提となる環境について

現状、我が家のマシンは右図のように、LinuxマシンとWindowsマシン2台がLANを介して繋がっています。 Windowsでは、Dropboxクライアントが動いており、いくつかのファイルはDropboxサーバにデータを保存する形を取っています。

Linuxマシンの方は特にオンラインストレージのバックアップは使っておらず、大事そうなデータは、LinuxマシンとWindowsマシン両方に保存するような形でバックアップを取っており、どちらかのHDDが死んでも、どちらかに残ってるので、データが失われる心配はないな、と考えていました。

ところが、3.11の東日本大震災のような事態が起き。あのような壊滅的な状況など、今まで生活してきて、1mmも想定していませんでした。僕自身被災していないとは言え他人事ではありません。コンピュータを生業としている僕としては、生き伸びてライフラインや建物が復旧できてたしても、プログラムファイルやデータが無いとなると、そこでまた絶望を感じるだろうと想像できます。

そんな事を言うなら、自宅サーバなど使ってないで、例えばwordpressで言うならば、アメーバやlivedoorやFC2などに代表されるブログサービスを使えばいいし、サーバを運用したいならGoogle App EnginやAmazonのEC2などのクラウドサーバを使えばいいのですが、やはり費用対自由度を考えると、自宅サーバかなという結論になりました。まぁ、電気代とか、セキュリティや安定稼働とか、時間的コストを考えたら、クラウド化だろと突っ込まれるかも知れませんが、view数などスズメの涙程度のWebサーバですし、まぁ面白いし勉強になるかなという動機もあります・・・

  • 多重セーフティについて

昨年、探査機はやぶさの帰還で話題になりましたが、不具合に対して「こんなこともあろうかと・・」という想定をしておいて、何重にもリカバリーできるようにしておくことだと解釈してますが、趣味レベルのサーバにそんなもの必要無いだろと、僕自身も思います・・。率直に言えば、先ほどと同じで面白そうだからというのが理由で、もっともらしい理由を考えるなら、
image
ある日、クラウドサービスのサイトを訪れると、 はぁ??という気持ちとは裏腹に、女子が優しく微笑んでるかもしれません・・

要するに、やれDropboxだ!やれEvernoteだ!これからはクラウド化だ!ローカルにデータを持ってる方が危険だ!という昨今ではありますが、じゃー、Dropboxのオンラインストレージサービスが100%安全か?と聞かれれば、右図のようにサービスを停止してしまう可能性は0では無いということです。

まぁ、サービスが停止したところで、別のサービスに乗り換えればいいだけの話ですが、ここで言いたいのは、ちょっと1つのサービスに依存しすぎではありませんか?ということです。

  • 無料で使えるオンラインストレージについて

いろいろあると思いますが、以下のサイトに簡単な特徴が載ってます。

・無料オンラインストレージ・無料ファイル転送比較
http://www.kooss.com/storage/
WS000100
今使っているDropboxに似たサービスで気になったものが、SugarSyncとUbuntu oneです。ここで、僕の環境の何がネックになるかと言うと、自宅サーバ(CentOS)をがあるという点です。SugarSyncは5GBでいろんなプラットフォームに対応しているのに、Linuxだけ・・・

まぁAPIが公開されているので、自分でプログラムを組んで、独自プログラムでSugarSyncへ保存するという選択肢もありますが、さすがにそこまで手を回せない。

Ubuntu oneはLinux OKというか・・・基本的にUbuntuのサービスというこで、僕のデータ資産を管理しようと思うと、現状では、Dropbox1つが満たしてくれてます。

  • どのように多重セーフティへもっていくか?

とりあえず、ボトルネックとなるLinuxマシンが無いものとして、単純に多重セーフティを考えると、WindowsマシンにDropboxとSugarSyncを入れてやればそれでOKです。

しかし、Windowsマシンというのはクライアントパソコンであり、Windowsマシンが起動している間は基本的に何かしら作業をしているということです。例えば、eclipseでプログラミングしながら、ブラウザで調べ物をしつつ、Adobe AireのTwitterクライアントを常駐させるなどをやっており、はたまた、地デジ番組を録画しているかもしれません。そこにDropboxもファイルを監視しています。現時点で少し重くなってます・・そこへSugarSyncを入れると、僕の非力なWindowsパソコンは、作業に支障をきたす重さになることが予想されます。これでは、本末転倒です。

で、そういった、予備のストレージサービスへバックアップを取るのは、裏でこっそりサーバがやってくれるといいですね。このサーバがLinuxではなくWindowsなら、Dropboxでクライアントマシンとサーバマシンを同期させ、サーバだけSugarSyncにも同期させれば、(ストレージサービスは)2重のセーフティと呼べるのではないでしょうか?

が、しかし、Linuxは譲れない・・・

将来的には、Linuxをサポートするサービスが増えてくれるかもしれませんが、現状あるサービスで、無理矢理に答えを考えた結果・・・
image
CentOS → Ubuntu へ・・・



どうせ、僕のCentOSは中身そんなに詰まってないし、移行はそんなに大変でないだろうと・・・それに、Ubuntuも勉強したいという動機もあり、この答えにたどり着きました。

image


で、もう少し具体的にどうするか話を詰めると、まず UbuntuサーバにDropboxクライアントを入れます。これで、Windowsで作業しているデータが、Ubuntu内のDropboxディレクトリへ作成されます。

Ubuntuサーバ内では、同ディレクトリへ、wordpressなどのバックアップデータを作成するバックアップスクリプトを定期的に実行させます。

これで、DropboxのストレージへLinuxのデータも反映されます。

そして、そのDropboxディレクトリの中身をUbuntu one ディレクトリへコピーするスクリプトを1日1回、アクセスの少ない時間帯に、実行するようにしておけば、同じものがUbuntu one ストレージにも反映されます。こうすれば、2つのオンラインストレージサービスへマシンに負荷の少ない状態でバックアップできるのではないでしょうか?

もし、Dropboxが潰れたら、WindowsにUbuntu oneクライアントをインストールすることで、引き続きバックアップ機構は維持できるはずです。

まぁ、そんなDropboxのサービスオワタ\(^o^)/みたいな想定よりも、Dropboxだけ運用してた場合に、データはクラウドにあるぜ!と手ぶらで意気揚々と外出し、訪問先(ネットカフェなど)の人様のパソコンで、Dropboxに繋がらない( ゚Д゚)ヒョエー などというパターンなら、多少現実味があるのではないでしょうか?

力業感は否めないかもしれませんが・・・現実的には、これからLinuxマシンにDropboxを入れて運用するにしても、Ubuntu移行はやらずに、新しくサーバ機を買うことがあれば、Ubuntuを入れて自己満足多重セーフティをやってみたいと思います。

【参考】
SugarSync

■2011/04/21 Thu 追記
似たような趣旨の記事がうpされてた。ここでは、触れてない無料のオンラインストレージについても簡単に特徴が書かれてる。
・複数のオンラインストレージサービスを平行利用して、無料のバックアップシステムを作ろう : ライフハッカー[日本版]
http://www.lifehacker.jp/2011/04/post_1692.html