スキップしてメイン コンテンツに移動

[javascript][Google App Engine]HTML5のsessionStorageで高速化

はじめて書いたjavascriptを先輩に見せたところ、取得ボタンを連打されてGoogle App Engineに対するリクエストが大変なことになりましたw

ということで、今回はその連打対策を講じてみました。

■変更点
・「取得」ボタンをクリックしたときにGetData()を呼び出すように
・sessionStorageにデータが存在するかチェックしてあれば表示
・なければAjaxでリクエストして結果をsessionStorageに保存したうえで表示

WebStorageのうちセッション単位でデータを保持するsessionStorageと永続的に保持するlocalStorageがあるが、毎日取得するデータが変わるのでsessionStorageを採用した。

同一セッションの同一パラメータ(証券コードと営業日数)の組み合わせの場合にはsessionStorageから取得している。

AjaxHistoricalPrices
http://test-004.appspot.com/html/index.html

「処理時間」には、「取得」ボタンが押されてから表示までの時間をミリ秒単位で表示している。

実際に同一パラメータで「取得」ボタンを2回以上クリックしてもらうと、かなり高速化できていることがわかると思う。

また、画面の「データ取得元」にsessionStorageから取っているか、HTTPで取っているかを表示している。

var startTime = new Date();
var endTime = new Date();
var GetData = function(){
    startTime = new Date();
    var key = document.form.ticker.value + ':' + document.form.days.value;
    var out = sessionStorage.getItem( key );
    if (!out){
        out = Request(key);
        document.getElementById("source").innerHTML = 'HTTP.';
    }else{
        document.getElementById("source").innerHTML = 'sessionStorage.';
        echo(out);
    }
}
var Request = function( key ) {
    var url = 'http://test-004.appspot.com/dlhistorical?ticker='+document.form.ticker.value+'&days='+document.form.days.value+'&type=json';
    var XHR;
    XHR = new XMLHttpRequest();
    XHR.onreadystatechange = function(){
        if( XHR.readyState === 4 && XHR.status == 200 ) 
            var data = JSON.parse(XHR.responseText);
            var out = '';
            for (i in data.Historical){
                out += '';
                for (j in data.Historical[i]){
                    out += '';
                }
                out += '';
            }
            out += '
'+data.Historical[i][j]+'
'; sessionStorage.setItem(key,out); echo(out); }; XHR.open( 'GET', url, true ); XHR.send(); } var echo = function( text ) { endTime = new Date(); var msec = endTime - startTime; document.getElementById("exectime").innerHTML = msec+"ミリ秒かかりました "; document.getElementById("result_div").innerHTML = text; }

コメント

このブログの人気の投稿

[Python]redis-pyでRedis Pub/Sub実装

前から面白そうと思っていたRedisのPub/Sub機能。 redis-pyでどう実装すれば使えるか確認してみた。 ■Pub/Subについて http://ja.wikipedia.org/wiki/出版-購読型モデル ■pub.py from redis import StrictRedis def publish(channel,msg): """ redis-pyにはPUBLISHするためのメソッドがないので、 Redisのコマンドをそのまま実行する為のクラスを使う。 """ sr=StrictRedis() """ 第1引数にRedisのコマンド、第2引数以降は そのコマンドの引数をそのままセット """ sr.execute_command("PUBLISH",channel,msg) if __name__=="__main__": # チャネル"hoge"に"Hello"というメッセージを出版(Publish) publish("hoge","Hello") ■sub.py from redis import Redis def listen(channel): r=Redis() ps=r.pubsub() ps.subscribe(channel) while True: for i in ps.listen(): print i["data"] if __name__=="__main__": # チャネル"hoge"を購読(Subscribe) listen("hoge") ■実行方法・実行結果 (ターミナル1-準備) [user@localhost ~]# python sub.py 1 # => チャネ

[Python]ポートフォリオの達人ランキング取得プログラム

今日は、投資ブログで公開している三菱UFJ投信主催の「投資にチャレンジ!!ポートフォリオの達人」から毎日更新される運用成績を取得するプログラムを作りました。これまで毎日コンテストの個人ページからコピー&ペーストして作成していた記事の成績部分をプログラムを実行するだけで作成できます。 ■投資ブログの記事 この記事の作成を効率化します。 http://mockuninvestment.blogspot.jp/2013/06/201367.html ■コマンド実行方法 取得したい参加者の個人ページのURLをプログラムに渡してあげるだけ。 python muam_contest.py http://contest.muam.jp/app/ranking/detail?dsp=eac8d83669d6cca1 ■出力内容 コマンド入力後、Enterを押して実行すると以下のフォーマットが出力されます。 2013/6/7更新 ポートフォリオの達人ランキング ========== ランキング(6/7更新):198位 評価額:100,357円 リターン:0.47% リスク:10.63% リターン ÷ リスク:0.04(0.04435225290) ========== http://contest.muam.jp/app/ranking/detail?dsp=eac8d83669d6cca1 あとはブログに張り付けるだけです。投稿用のアドレスにメール送信するプログラムと組み合わせれば、完全自動化できてしまいますね。 ■ソース #!/usr/local/bin/python #coding: utf-8 from bs4 import BeautifulSoup import urllib2,re,unicodedata,sys template=u"""2013/%(date)s更新 ポートフォリオの達人ランキング ========== ランキング(%(date)s更新):%(rank)s 評価額:%(amount)s リターン:%(ret)s リスク:%(risk)s リターン ÷ リスク:%(riskreturnratio)s ========== %(url)s""&

[OS]VirtualBoxでCentOS6.5(x86_64)がKernel panicを起こした

完全に対処療法。 恥ずかしながら自分では原因がわかっていない。 忘れないようにメモしておく。 いろいろ設定したあと、何度目かの再起動のタイミングでKernel panicが発生して起動しないという事象が発生。 こちらの方法でなんとか起動させて。 [CentOS] SELinux 無効化後のカーネルパニック http://kuni255.blogspot.jp/2013/04/centos-selinux.html こちらの通り、/boot/grub/grub.confに設定を追加。 Kernel panic – not syncing: Attempted to kill init! http://h2np.net/mynotebook/post/130 設定変更後、以下の操作をそれぞれ10回ほど試した限りでは再発していません。  (1)halt+起動 (2)reboot 追記:と思ったらまた発生した。なんかもう解決できる気がしない。