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が違っていても読み出すことができます。このブックマークレットは、ユーザ名とパスワードを平文で保存するので本当に重要なユーザ名/パスワードを保存しないでください。
いちど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ブックマークレットを呼び出すと

上に書いたように、このブックマークレットはあまり安全でないので、ちゃんとしたいのなら最強のパスワード管理ソフト 1Password [Mac OS X] | Lifehacking.jpで紹介されている1Passwordがいいとおもいます。
しかし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が正解という場合も多そうです。
( 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);
}
} )()
トラックバック元エントリにこのエントリへのリンクがない場合はトラックバックを受け付けません。
http://labs.gmo.jp/mt/mt-tb.cgi/226
comments