大切じゃないパスワードを記録するためのiPhone用ブックマークレットとclient-side storageの可能性

JavaScript++かも日記: 【iPhone】iPhone用 JavaScriptデータベースプログラミング入門 (1)でiPhoneのSafariでもclient-side storageが実装されていてjavascriptからSQLite3を利用できる、というのを知りました。

Firefox3に載っているsqliteよりもちょっとバージョンが古いのでFirefox3でSQLite3の全文検索機能を使って日本語を検索するのはまだできないようですが、できるようになるのも時間の問題でしょう。ためしにちょっと触ってみようと思ってclient-side storageをバックエンドにして、入力したパスワードを保存して次回から入力を楽にするためのbookmarkletをつくりました。


client-side storageはHTMLに書かれたjavascriptから読み出すことができ、データベースに書き込んだときのドメインと同じドメインにあるjavascriptからはURLが違っていても読み出すことができます。このブックマークレットは、ユーザ名とパスワードを平文で保存するので本当に重要なユーザ名/パスワードを保存しないでください。

ブックマークレット

dumbkeychain

つかたかた

いちどSafariにブックマークレットを入れて、iTunesからブックマークを同期するとiPhone/iPod touch上にブックマークレットを送ることができます。手で入力するのはムリです。

今回は30日間限定オンラインアルバム | 30days Album™で動作を確認しました。30daysは、Flashでアップロードしたい写真をはじめに全部いっぺんに選んであとは待っておくだけでアップロードできて、誰でも見られるようにしたくないときにも見てほしい人にアカウントを作ってもらったりする必要もなく、メールでURLをパスワードを送るだけですみます。なにより写真がきれいに見えるデザインになっています!

flickrでいいじゃんと思うかもしれませんが、一般的にはflickrあまり知られてなくて、英語だからアカウントを作ってもらうのも面倒がられたりして、アップローダをダウンロードしてこないとたくさんアップロードするのが大変で、そのアップローダがうまく動かなかったりするので、いろんなひとに写真を見てほしい時にはぜんぜん使えません。

今知ったけどモバイル版もリリースされています!裏側も30days Album Information | 30days Album を支える技術 #0 〜 サーバ構成概要によればperbal+lighty+rails/catlyst+MogileFS+Gearman/TheSchwartz+MySQLと手堅くおもしろい作りになっています。

機会があったらぜひお試しください!

30daysは今年自分が最も感銘を受けたサービスなので、つい話がおおきくそれてしまいましたが、ブックマークレットの話に戻ります。 ログイン画面でdumbkeychainブックマークレットを呼び出してからフォームを送信すると、そのとき送信したユーザ名とパスワードがsqliteに保存され、次回から同じログイン画面(URLのパスをキーにしてデータを保存しているので、ログインするページのパスが変わるものはうまく機能しません)でdumbkeychainブックマークレットを呼び出すと
Picture 1-30
sqliteに保存されているユーザ名とパスワードが自動的に入力されます。
あとは送信ボタンを押すだけでログインできます。
Picture 2-28

上に書いたように、このブックマークレットはあまり安全でないので、ちゃんとしたいのなら最強のパスワード管理ソフト 1Password [Mac OS X] | Lifehacking.jpで紹介されている1Passwordがいいとおもいます。

HTML+js+client-side storageでなにができるか

今回はブックマークレットからclient-side storageを利用しましたが、これはウェブアプリケーションで使う時に威力を発揮します。 ウェブベースのRSSリーダを考えてみましょう。携帯端末の通信速度もかなり向上しましたが、通信をはじめる時にはわりと時間がかかります(基地局との接続確確立に時間がかかるのでしょうか?)。電車に乗っているときには、電車がトンネルや地下にはいってしまうと通信できなくなります。

しかしclient-side storageを使うことでこれらの問題を解決することができます。

ユーザが記事を読んでいる間にXMLHttpRequestを使ってバックグラウンドでデータを読み込んでsqliteに書き込んでおけば、端末のメインメモリを消費することもなくデータを保存することができ、ユーザがデータを要求した時には容易に取り出すことができるのでユーザのアクションに対するレスポンスを大きく改善することができます。バックグラウンドでデータをあらかじめダウンロードしてsqliteにいれていれば、電車が圏外に移動してもsqliteからデータを読み出すことができます。うまくいけば駅に停車している間に圏外になっている間に読むだけの量をあらかじめ読んでおくことができるかもしれません。


UIの作り込みをのぞいたロジック部分はOSX上のsafari+javascriptで開発することができるので、あんまり互換性のないiPhoneシミュレータ+自分でメモリを解放しないといけないObjective-CでiPhoneのネイティブアプリケーションを書くのに比べると、圧倒的に短期間で容易に作ることができます。

モーション検地やマルチタッチさえ捨てれば、開発コストを考えると、JavaScriptでスゴイ完成度高いiPhone用のwebアプリを作るほうが楽そうな気もする。フィードバックや更新、配布コストの面から考えても。
fladdict» ブログアーカイブ » iPhone APPの開発は待ちか?
で書かれているとおり、開発が困難で時間のかかるネイティブアプリケーションでしかできないことは、カメラや加速度センサといったデバイスの機能を利用したいときだけです。

client-side storageが加わったことでHTML+javascriptだけでできることも大きく広がるので、同じだけの開発努力を注ぐならHTML+javascriptが正解という場合も多そうです。

参考

  • Safari 3.1 に実装された「Client-side database storage (SQL API)」とは何か? - IT戦記
  • JavaScript++かも日記: 【iPhone】iPhone用 JavaScriptデータベースプログラミング入門 (1)
  • iPod touchで無線LANのブラウザ認証を楽にするbookmarklet - おぎろぐはてな

コード

( function () {
    var d = document;
    var e,i,j;
    function p () {
        l=d.location;return l.host + l.pathname
    }
    function _X(xpath, ctx) {
        exp = ctx.ownerDocument.createExpression(xpath, null);
        rs = exp.evaluate(ctx, XPathResult.ANY_TYPE, null);
        ns = [];
        while (i = rs.iterateNext()){ns.push(i);}
        return ns;
    }
    tgfm = null;
    for ( i = 0; i < d.forms.length ; i++ ) {
        f = d.forms[i];
        e = f.elements;
        for ( j = 0; j < e.length; j++) {
            if ( e[j].type == 'password' ) {
                tgfm = f;
                break;
            }
        }
        if ( tgfm )
            break;
    }
    ifnd = 0;
    n = 'dumbkeychain';
    db = openDatabase(n,'1.0',n);
    db.t = db.transaction;
    db.t(function(tx) {
        tx.executeSql('SELECT * FROM acs WHERE host = ?', [p()], function(tx, rs) {
            row = rs.rows.item(0);
            row.account.split(/\x02/).map ( function ( p ) {
                v = p.split(/\x01/);
                tgfm[v[0]].value = v[1];
            } );
            ifnd = 1;
        });
    });
    db.t(function(tx) {
        tx.executeSql('CREATE TABLE acs (id INTEGER PRIMARY KEY, host TEXT, account TEXT)');
    } );
    if ( !ifnd ) {
        tgfm.addEventListener( 'submit' , function (e) {
            ctx = d.documentElement;
            v = [];
            f = tgfm;
            for ( j = 0; j < f.elements.length; j++) {
                i = f.elements[j];
                t = i.type ;
                if ( t.match(/^text|password$/)) {
                    v.push( [i.name , i.value].join('\x01') );
                }
            }
            v = v.join('\x02');
            db.t(function(tx) {
                l = d.location;
                tx.executeSql('INSERT INTO acs VALUES(NULL, ?, ?)', [p(), v ] );
            } );
            return 1;
        }, true);
    }
} )()

tags

  • Safari
  • javascript
  • サービス
  • 「大切じゃないパスワードを記録するためのiPhone用ブックマークレットとclient-side storageの可能性」のはてなブックマーク数
  • 「大切じゃないパスワードを記録するためのiPhone用ブックマークレットとclient-side storageの可能性」deliciousブックマーク数
  • 「大切じゃないパスワードを記録するためのiPhone用ブックマークレットとclient-side storageの可能性」をはてなブックマークに追加
  • save "大切じゃないパスワードを記録するためのiPhone用ブックマークレットとclient-side storageの可能性" to del.icio.us
  • 「大切じゃないパスワードを記録するためのiPhone用ブックマークレットとclient-side storageの可能性」をリアルタイムブログ検索
  • permalink
  • XPathで書いたルールに従って複数ページにまたがったデータをあつめるjavascript製クローラ(失敗作)
  • 日時表記のフォーマットの名前とperl/PHP/javascriptでのつくりかた

comments

TypeKey Enabled
スタイル用のHTMLタグが使えます。
*required

trackbacks

トラックバック元エントリにこのエントリへのリンクがない場合はトラックバックを受け付けません。

http://labs.gmo.jp/mt/mt-tb.cgi/226
©2010 Kentaro Kumagai, GMO Internet Labs., GMO Internet, inc.
bits and bytes
2008 .08. 01 18:34

tagcloud

  • API3
  • C/C++3
  • E4X1
  • FUSE2
  • Firefox30
  • HTML4
  • IE1
  • MySQL1
  • OSX4
  • Opera2
  • PHP5
  • Safari1
  • UI2
  • WebKit1
  • XML2
  • XPCOM4
  • XPath5
  • apache2
  • binary2
  • book1
  • data14
  • debug5
  • design2
  • experiments4
  • extension14
  • geo1
  • google gears2
  • google maps API1
  • greasemonkey4
  • httpd5
  • javascript25
  • linux1
  • logging2
  • mobile4
  • perl7
  • tips6
  • tool11
  • vim2
  • visualization4
  • widget1
  • wii3
  • windows7
  • サービス8
  • 和訳1

Archives

  • 2008.08 (2)
  • 2008.07 (4)
  • 2008.06 (4)
  • 2008.05 (5)
  • 2008.04 (4)
  • 2008.03 (4)
  • 2008.02 (6)
  • 2008.01 (3)
  • 2007.12 (4)
  • 2007.11 (5)
  • 2007.10 (4)
  • 2007.09 (4)
  • 2007.08 (4)
  • 2007.07 (8)
  • 2007.06 (7)
  • 2007.05 (4)
  • 2007.04 (5)
  • 2007.03 (6)
  • 2007.02 (4)
  • 2007.01 (6)

about

  • bits and bytesのXML
  • 「bits and bytes」のCreative Commons
  • Powered by Movable Type
  • イベントと地図 - モグ
  • Use ecto to blog!
  • bits and bytesのはてなブックマーク数
  • bits and bytesをMy Yahoo!に追加
  • Subscribe with Bloglines