2010年 09月 19日

JSDeferred のテストを node.js で動かすように変更

0.3.2 をリリースしました

http://github.com/cho45/jsdeferred

本体以外の部分でシンタックスエラーがでてたので 0.3.3 をリリース


今までコマンドラインのテストは Rhino を用いてやっていたわけですが、node.js のほうがインストールしやすく、テストの実行スピードが早いためそのようにしました。ブラウザのテストは特に変わりません。

IE でまだテストを走らせていないのでリリースはしてないのですがいくつかバグを潰しました

  • Opera で全く動かないことがあった
    • キャッシュによるもの。コード中のゆのっちは削除されました
  • Deferred.connect をネストして使ったとき実行順がおかしかった
  • node.js 環境下で var Deferred = require('./jsdeferred.js').Deferred; とできるように this.Deferred へ代入するように

とかです。

ついでにドキュメントを jsdoc-toolkit 可読なものに変え、テスト実行時に http://closure-compiler.appspot.com/ で警告なくパック可能なことを確かめるようにしました。API ドキュメント も jsdoc-toolkit で作るようにしました。

型も書いてますがこれらもうまくチェックさせるにはどうしたらいいのかよくわからず。

2010年 09月 15日

Plack-Middleware-StaticShared

http://github.com/cho45/Plack-Middleware-StaticShared

js とか css を纏めていっこにして配信してくれる Middleware を書きました。Plack::Middleware::JSConcat というが既にありますが、キャッシュコントロールがうまくできなかったのと、css も纏めたかったのでつくった次第です。

      enable "StaticShared",
          cache => Cache::Memcached::Fast->new(servers => [qw/192.168.0.11:11211/]),
          base  => './static/',
          binds => [
              {
                  prefix       => '/.shared.js',
                  content_type => 'text/javascript; charset=utf8',
                  filter       => sub {
                      WebService::Google::Closure->new(js_code => $_)->compile->code;
                  }
              },
              {
                  prefix       => '/.shared.css',
                  content_type => 'text/css; charset=utf8',
              }
          ];
        [% css = [
          '/css/base.css',
          '/css/site.css',
        ] %]

        [% IF debug %]
        [% FOR c IN css %] 
        <link rel="stylesheet" type="text/css" href="[% c %]"/>
        [% END %]
        [% ELSE %]
        <link rel="stylesheet" type="text/css" href="/.shared.css:[% version %]:[% css.join(',') %]"/>
        [% END %]


        [% js = [
          '/js/jquery-1.3.2.min.js',
          '/js/site-script.js',
        ] %]

        [% IF debug %]
        [% FOR j IN js %] 
        <script type="text/javascript" src="[% j %]"></script>
        [% END %]
        [% ELSE %]
        <script type="text/javascript" src="/.shared.js:[% version %]:[% js.join(',') %]"></script>
        [% END %]

みたいに使えます。version + ファイル名 をキーにキャッシュをつくり、クライアントにもほぼ無期限のキャッシュをさせます (update した際に version を更新する必要があります)。

悪意をもった人によって version を変えてアクセスされまくると、キャッシュが溢れそうなので verify する仕組みがほしいですがいいのが思いつかなかったのでとりあえず放置してあります。

2010年 09月 10日

gerry++

2010年 09月 05日

gerry++

2010年 09月 01日

Chemr-js

Chemr という .chm を読む Mac 向けのツールを作っていたのですが、環境の変化か何かで動かなくなってしまい、いろいろやってみたけどどうやっても直らなかったので代替を考えて実装しなおしました。

やはり、普段使ってるフィールドの技術でつくるのが最もメンテナンスしやすいと思い、ブラウザ+Greasemonkey で実現することにしました。実際のところ、僕が欲しいのは .chm を読むツールではなく、適切にインデックスが貼られたドキュメントをインクリメンタルサーチして統一した操作方法で読めるツールなので、別に .chm じゃなくても良いのです。高級なリファレンスツールやら拡張やらを使用していらっしゃるかたには必要ないかと思いますが個人的には便利に使えるようになったので紹介したいと思います。

使いかた

対応サイトにアクセスすると検索ボックスがでてくる

C-l (Cmd-L) で検索エリアにフォーカス、C-n で次を選択、C-p で前を選択、tab で最上位にある候補を補完、C-u でクリア、C-w でワード削除などとなっています。検索ボックスが邪魔なら ESC で消せる。C-l したらもっかいでてくる。

スペースは正規表現の .* みたいにふるまいます。pla midd とかで Plack::Middleware がマッチ

各種サイトにアクセスしたときにそのサイトをクロールしてインデックスをつくります。サイトによっては時間かかりますが大抵すぐおわります。 (Android のドキュメントとかは2000ページ近くクロールするので40分ぐらいかかりますし、静的ファイル相手とはいえ普通にDOSってる感があるので逮捕されても僕は責任とれません)

対応サイト

とかにいくと勝手にサーチウィンドウがでます。Android のサイトはこわいのでリンクはりません。

工夫した点

キーイベント

iframe を使っているのですが、iframe 内部にフォーカスがあるとショートカットキーが効かなくなってうざいので少々頑張っています。具体的には、iframe 内部の場合、親ウィンドウにキーイベントを伝播 (postMessage) するようにしてあります。postMessage なのは iframe 内のリンク遷移で外部ドメインにいってしまってもいいようにです。

高速な検索

mala さんが昔つくっていた http://la.ma.la/blog/diary_200604021538.htm のコードを参考にしつつ、一定数ヒットしたものを適当に好みでスコアリングして表示しています。URL のデータを追加したりしてるのでほんのすこし工夫してます。

html 入れ替え

サイトによってサーチウィンドウのフォントが変わったりして嫌だったので document.replaceChild(html, document.documentElement) という荒技をしてます。

対応サイトにアクセスしたとき、ロードしたページは iframe の中でロードされなおされ、本来読まれたページは chemr.user.js が乗っ取ります。ページ内のリンクは iframe の中なので、クリックしてもいちいち index を読みなおすこともなく快適です。

独立したアプリケーションのように

レポジトリに createapp.rb というのが入っていて、これをうまく使うと普段使いのブラウザとは別に、リファレンスひき専用のブラウザをつくれて便利です。特に Mac の場合、Cmd-Tab でアプリ間しか移動できないので必須です。

手順としては

  • 既存の Firefox プロファイルに加え "chemr" という名前のプロファイルをつくる。
  • createapp.rb を実行する ( /Application/Firefox.app と chemr というプロファイルが必要です)
  • /Application/Chemr.app ができるのでこれを起動
  • 普通の Firefox と同じように Greasemonkey (ほか好みで Stylish など) をインストール
  • about:config で dom.storage.default_quota を大きく (しなくてもいいけど、100MB ぐらいにしとけば十分)
  • chemr.user.js をインストール
  • アドレスバーを消すとか、セッション復帰を有効にしたりする

です。非常に便利です。普段 Firefox を使わない方なら createapp.rb 使わず、普通に一個 profile 潰してもいいと思います。

2010年 08月 25日

gerry++

2010年 08月 24日

gerry++

2010年 08月 20日

gerry++

2010年 08月 19日

gerry++

2010年 08月 18日

gerry++