02時58分10秒このままじゃ使いづらいってば。本家のCookbookを見て、ちょっと試してみたところ、個人的にちょっと扱いづらかったのでいきなりTableクラスとRecordクラスを拡張することから始めてみた。使いづらかった部分というのは、Tableクラスで列情報にアクセスするのにtitleメソッド(カラム名の取得)、typeメソッド(型情報の取得)と分かれているRecordクラスのコンストラクタがStringベースでちょっと面倒だったといったあたりで、また行の抽出でループ処理が必須になるのでEnumerableにしてみることにした。以下はその拡張コード。prototype.jsが必要。カラム情報の配列を取得する。);}じゃあ使ってみるかこのような拡張をした上で、データベースへアクセスしてみる。ここではmdbを使用してみた。適当なmdbファイルを「test_db」としてODBCデータソース(ユーザDSNまたはシステムDSN)に登録しておいて、以下のようなコードでテーブルの作成、行の挿入、行の取得を行う。ODBC()」でODBCオブジェクトを初期化する。この例ではmdbを使用したためユーザID・パスワードはないが、通常のDBMSの場合は「UID=ユーザID;PWD=パスワード」を追加する必要がある。次のODBC#execでテスト用のテーブルを作成している。insert/delete/updateの場合もexecメソッドで実行する。次の変数「updater」は今作成したテーブルの更新に使用するTableオブジェクト。この後に説明するODBC#queryメソッドの戻りもTableオブジェクトだが、それは読み取り専用らしく、更新する場合はこの例のようにURIをパラメータにしてTableをnewする必要がある。その後はTable#addメソッドで行を新規に追加しているが、追加する行の初期化には、このエントリで拡張したRecrd::fromHashメソッドを使用している。次に、ODBC#queryを使用してupdaterとは別にTableを取得している。この「table」は読み取り専用でaddメソッドは失敗する。取得したtableをeachで列挙し、Record#toHashをHashにした上でinspectしてダンプしている。最後に使用したTableとODBCをcloseして終了。問題がちらほら上記のサンプル程度では特に問題がないが、とりあえず目に付いた問題点をば。Table#typeの戻り値の型がドキュメントと違う。type(1)のように引数を1つだけの場合はStringが帰ってくるはずだが実際は要素が1つのArrayが帰ってくる。Table#typeで型情報は取得できるが、Record#valueで実際に取得する値は常にStringTable#addでレコードを追加すると、日本語のデータが化ける。insertクエリを使用した場合は化けないTable#close、ODBC#closeを実行しても実際は接続が残っているぽい。mdbやSQLiteはjsdbを終了するまでファイル自体がロックされているといった感じ。Table#typeはたいした話ではないが、日本語のデータが通らないとなるとこのオブジェクトモデルを利用したデータアクセスはほぼ使えないと思うのだが。オブジェクトモデルが微妙に使いづらかったり、同じ情報を示すプロパティが複数あったり、あるオブジェクトの生成方法が複数あったり、設計も実装もちょっと中途半端な感じがする。ODBC#queryで生成したTableでデータを更新できないのはなんだかなぁと思う。おまけで、TableにRecordを生成するファクトリメソッド(Table#createRow、とかね)がほしかったなぁ。そのほうが新しいレコード挿入するのに勝手がよいんだけど。20時15分34秒なんとなく試してみたくなったり普段GreatNewsというRSSリーダーを使っている。動作は軽快だしあまり不満はないのだが、内蔵のタブブラウザの機能がおまけ程度の機能しかないのでちょっと不満に思っていた。いままではリンクURLをコピーしてFirefoxに貼り付けていたのだが、読みたい記事がたまってくるとそれも面倒になってきた。要するに「Firefoxで開く」というメニューが欲しくなったのだ。その手の右クリック拡張あるだろうなーと思って探していたら「そんなん、自分で作れ。拡張メニュースクリプトの作り方が見つかったので自作することに。)で蹴っ飛ばせば標準のブラウザで開けるので以下のようなhtmlを書いてみた。withブロックで囲ってるのは単に好みの問題なのでご容赦を。消しちゃったスクリプトだから動くかわかんないや。);}</script>メニューはリンク上での右クリック時のみに設定してあるため、このように非常にシンプルだ。(実はそうでもなかったが)ところが考えてみれば当たり前で、このスクリプトではセキュリティ警告がでてしまう。2001」(紙copiの前身)の取り込みメニューが登録されており、そちらを参考にさせてもらったところVBScriptでCreateObjectしていた。半信半疑で先のスクリプトをVBSで書き直そうと思ったが、ずいぶんとVBS書いてなかったのと、ものすげー冗長になるのが目に見えていたのでWScript.Shellを取得する部分のみおそるおそるVBSに置き換えた次のようなスクリプトを書いてみた。消しちゃったスクリプトだから動くかわかんないや。);}</script>うまくいくじゃん!!...なんだか納得いかんけど。ひょんなことからまあ不恰好だがよいか、と思ってちょろちょろとテストしていたら、imgなリンクの時にはメニューが表示されないことに気がついた。場当たり的にレジストリのcontextsの値に画像時のフラグも加えたが、今度はevent.srcElementがimgになるので当然リンク先が取得できない。ああ、探索する必要があるのね、ふぅ。ActiveXの復活をして以下のようなコードにした。)}</script>なぜか警告がでなくなった。?それでいいのか?俺が悪いのか?警告でないじゃん、と思ったのはつかの間、これimgなリンクだと大丈夫で、普通のリンクだと怒られるという不可思議な現象になっていた。ActiveXObjectのみ別関数にしたところ、普通のリンクでも警告が出なくなった。)}</script>本当にそれでいいのか?まぁ、ともあれ。セキュリティホールっぽく感じたのでスタック数を指定してWScript.Shellをnewするスクリプトを貼り付けたHTMLをIEに読み込ませたところ、スタック量に関係なくセキュリティ警告が表示された。これでGreatNews環境がすこしだけ快適になったのでよしとしよう。20時35分34秒どこまで平気なのか!?先のエントリで、コールスタック数によって警告されるか否かを検証するために、次のようなスクリプトを書いた。);で、ちょろちょろパラメータ変えながら試してたら、やっぱり気になるじゃないですか。「どこまで深くして大丈夫なのか」が。試してみました手軽に実行できるよう、次のようなブックマークレット形式にしてごにょごにょやってみた。);で、いくつかのブラウザでの実行結果は次の通り。3332Operaはちょっと挙動が面白く、3332を超えても最後のalertは実行される。overflowが記録されていた。知っていたからといって別に役立つわけではないが、なんかの目安になるかな。吊ブックマークレットtumblrのキーボードショートカットが便利になっとる。Chrome編dataスキームの画像をブロックしてみるローカルストレージを確認したり消したりするブックマークレットそうそう、いまさらTwitter始めました。(9)このブログについてJavaScriptとかC#とかPHPとか。