Hatena::ブログ(Diary)

プヨぷよの日記

2009/09/04 (Fri)

[][][][]ExSearchBar1.0.1 & SAHK

前々から秘密裏に進んでたSAHK*1が先日一般ベータへ移行した。私は途中参加な上ときどきミーティングに顔出す程度しかできてないんだけど、紆余曲折あったことは知っているので無事日の目を見れてほっとしている。SAHKそのものはまだ一般ユーザーの投稿を受け入れられる段階まできていないけれど、OEI*2・Si/Sar Makerは現状でかなり強力なツールになっている。特に非公式プラグインと一緒にIEPanelEx、IEDockExをインストールする機能はプラグイン自体のインストールが少々煩雑なのと、再配布がNGなのもあいまってこれらプラグインを利用するスクリプト類を利用にする際にはかなり手間を省いてくれるはず。

実はOEIにIEPanelEx、IEDockExをインストールする機能が付いたのは最近で、このテストも兼ねてExSearchBarがExtension一覧に乗ってるんだけど、ちょうどGoogleの仕様変更と重なってた*3ようでサジェストが動かないよ?って報告がメンバーからあがってた。常用してるプニルで確認してもサジェストが効いておらず、サジェスト用のURIを直接叩いてみると帰ってくるjson形式のデータのフォーマットが変わってた。

というわけで該当部分を急ぎ修正して1.0.1にバージョンアップしたので、26日以降にインストールした・またはバージョンアップした人は正常にサジェストが機能していると思う。それ以前にインストールした人は、再インストールするか、またはプラグインマネージャーでもアップデートが可能なはずなのでアップデートしてほしい。OEIを使わずに正式版をインストールしていた人はOEIのインストールを済ませたあと、SAHKのextension一覧からExSearchBarへと進み、OEIでインストールしなおすとバージョンアップができる*4

メンバーへは個人のラボスペースが与えられているので、ぷよラボもそちらへ移行するつもりでいる。いまはMosa関係しかおいてないけど、Shearerのようなスクリプト郡も今後はそちらで公開することになると思う。

*1Sleipnir Assembly house for Kittens

*2Odd Eyes Installer

*3:PCの起動が数日ぶりだったので正確な日程はよくわからない

*4:以降はプラグインマネージャーからのアップデートが可能

2009/06/19 (Fri)

[][][]ExSearchBar正式版

ようやくまともなドキュメント書いたので正式版*1として公開する。α1の公開が2007/07/10だから2年近く前になるのか。作ってる間にIEDockExができたり知識*2が増えたりで実装方法が二転三転したのもいい思い出。

修正点は項目こそ多いものの、目に見えた影響があるのはカスタム検索ボタンのボタンタイプ:フォルダーの仕様変更とアイコン*3の同梱くらい。サブフォルダの中身をマウスオーバーするまで走査しないようにしたので、比較的浅い階層でも大きな負荷はかからないようになってる。修正点一覧は以下のとおり。

RC2 fix1からの修正

  1. 履歴など、ExSearchBarの初期化以外の理由で開かれたadapter.htmlの処理の改善
  2. フォルダ、メニュー、アクションボタン用に5色ずつアイコンを同梱
  3. 上記に伴い、タイプ変更時にアイコンを自動で変更するように修正。
  4. 検索履歴の部分に下向きの三角を表示
  5. 階層メニューのCSSを修正
  6. インプットとセレクトボックスのサイズ調整
  7. delta.ico, sep.icoをiconsフォルダへ移動(古いファイルは削除して問題ありません)
  8. 設定済みのアイコンを変更する際にインプットボックスへ正しくない値が設定される不具合の修正
  9. ボタンタイプ:フォルダーの仕様変更(サブフォルダの展開をマウスオーバー時に変更)

プヨぷよのExSearchBarは今こんな感じf:id:Puyo2:20090619235726p:image

*1:土台になるIEDockExはまだ0.0.8なんだけど…

*2:CreatePopupとかScriptControllとか

*3:クォリティーはお察しなのでどこかから調達してくるほうがきれいに仕上がると思う

2009/06/03 (Wed)

[][][]ExSearchBar RC2

あんまり使ってる人いないっぽいけど。ファイルはいつものとこ。RC1からの修正は以下のとおり。

  1. 検索候補のキー操作での選択がうまくいってなかった不具合の修正
  2. 履歴の削除が正常に機能していなかった不具合の修正
  3. 履歴の表示が正常に機能していなかった不具合を修正
  4. URL自動判別の強化
  5. メニューボタンをフルパスのほかにOverride以下の相対パスで指定できるように
  6. フォルダボタンの追加(階層が浅すぎるとえらいことになります)
  7. メニューに右端が画面の右端を超える場合の表示方向を左側へ変更

不具合修正と調整がメインで、新しい機能はカスタム検索ボタンにフォルダを追加した。たとえばSleipnir/documents/jaなんかを指定しておくとReadMeやHistoryなんかのドキュメントがメニュー項目として展開される。アイテムは関連付けされたアプリケーション*1で開かれる。

シェル相当のコンテキストメニューがないせいか、実装してみたら思ったほど便利ではなかったけど、WSHスクリプトログインスクリプトだけを展開とかプニル関連のドキュメントを開くときとかに使えると思う。もちろん、ショートカットを入れたフォルダを登録すればランチャ代わりにもなる。

サブフォルダを展開可能だけど、XMLからメニューを生成するクラスを使いまわしてるので、表示する時点ですべてのサブフォルダ内を走査するので浅い階層を指定するとメモリにもCPUにもやさしくない。ルートなんかを指定するとえらいことになるので気をつけてほしい。

追記:

検索アクション名を指定すべきところを検索エンジン名を指定するなど、不具合の指摘をうけたので修正したfix1をアップした。

  1. 初回起動の際のアクティブエンジン選択が正しくない不具合を修正
  2. adapter.htmlのabout:blankへのナビゲートを廃止
  3. サジェストをEnterキーで確定した際にコンテキストメニューが出ることがある不具合を修正

*1:*.jsだけはwscriptで決めうちしてある

2009/05/22 (Fri)

[][]shearer 0.6.0

更新されたエントリーのポップアップ機能を追加したshearer0.6.0アップロードした。修正・追加は以下のとおり。

  • 更新されたエントリーがあった場合巡回が中断する不具合の修正
  • 接続に失敗した場合に巡回が中断する不具合の修正
  • 既読チェックの処理の改善
  • 更新されたエントリーがあった場合に右下にポップアップする機能の追加

1つ目のはアップ直前にステータスバーに状態を表示するようにしたのはいいが更新を通知する時の記述が間違ってたせいでスクリプトが停止してた。既読チェックは、読み込んでからjavascriptで処理する都合上、表示がちらついてた*1ので非表示で読み込んでから処理後に表示するようにした。

最後のポップアップ機能の追加は散々悩んだ末createPopupを使うようにした。createPopupによるポップアップは各ウィンドウに最大ひとつなので、htmlfileオブジェクトを使ってダミー*2のウィンドウを作り、そこから表示するようにした。

もうちょっとフェードさせたり表示時間を設定できるようにしたりタイトルだけ表示させたりとかやりようはあるだろうけど、細かい調整はあとにまわしたい。正規表現のサポート機能があんまり進んでないし。

追記:表示位置の計算がおかしかったので0.6.1を上げ直したshearer0.6.1

[][][]htmlfileオブジェクトからcreatePopup

shearerで更新されたエントリーのポップアップ作ってたときの副産物。開いてるタブのDOMを汚さず、しかも複数ポップアップ*3を出せる。複数ポップアップを出すのにはポップアップからポップアップを出す手法があるけど、これだと親が消えたら一緒に消えてしまう*4。htmlfileオブジェクトを使ってcreatePopupすれば、windowオブジェクト自体を複数作れるので相互干渉せずに出したり引っ込めたりできる。

var ScriptControl = CreateObject("ScriptControl");
ScriptControl.Language = "JScript";
ScriptControl.AddObject("ScriptControl", ScriptControl);
ScriptControl.AddObject("sleipnir", sleipnir, true);
ScriptControl.AddCode(async);
ScriptControl.Run("async");

function async()
{
	var dummydoc = new ActiveXObject("htmlfile");
	var dummywindow = dummydoc.parentWindow;
	
	var popup = dummywindow.createPopup();
	var div = popup.document.createElement("div");
	div.innerText = "ここにテキスト";
	div.style.height = 100;
	div.style.backgroundColor = "yellow";
	popup.document.body.appendChild(div);
	
	popup.show(100, 100, 100, 100);
	dummywindow.setTimeout(function () {}, 10);//ScriptControlの破棄を遅延?
}

スクリプトの前半は非同期化のためのおまじない*5。これをやらずにUserActionスクリプトでcreatePopupを使ってもうまくいかない*6。多分、同じ理由で最後の一見無意味なsetTimeoutも削ると私の環境ではうまく動いてくれなかった。いったん表示されてしまえば即消えちゃうようなことはないけれど、どうしてこうなるかちゃんとはわからない。

本体のasyncは、別にSleipnirスクリプトじゃなくてもTridentエンジンなら普通に動く。@TypeSleipnir ScriptでないSeaHorseスクリプトなら直接使えるはず。この例の場合は

ScriptControl.AddObject("sleipnir", sleipnir, true);

すら要らないんだけど、普通何か作るならISleipnirは必須だと思うから残しておいた。

*1:起動直後で巡回が重なると特に

*2スペル間違ってたけど気にしない(´・ω・`)

*3:createPopupはひとつのウィンドウに付きひとつしかポップアップを出せない

*4:階層メニュー作るときは都合がいいんだけど

*5:実際使うときはRunをtry〜catchしてデバッグ用にエラー補足したほうがいい

*6:多分表示されるより早くオブジェクトが破棄されてる

2009/05/20 (Wed)

[][]shearer (WebSlices)

今更だけどIE8で追加されたWebSlicesの機能を使えるようにしようと思ってScirpt書いてみた。ファイルはSUECさんのここ

WebSliceの仕様はWeb Slice Format Specification - Version 0.9を参照した。WebSliceは上記の仕様書にあるとおり、サイト内のclass=hsliceであるタグの中身で、IE8のWebSlicesでは基本的にこの中身*1を更新されてるかチェックし、更新されていれば通知するようになっている。

例にもあるように一番利用されるのはオークションサイトだろうけど、goo*2のように天気予報、占いといった比較的賞味期限の短くて最新の情報だけが有用な場合にもRSSに対する優位性があるように思う。逆に、ブログ*3のような過去の更新も有用な場合はこれまでどおりRSSを利用するのが適切だと思う。WebSliceは初歩的なhtmlが理解できればよいので個人でレンタルサーバを借りて個人でサイトを運営する場合なんかも利用しやすい利点もある*4

存在自体は前々から知ってはいたけれども、あまり対応サイト*5がなかったのと、そういうジャンルが得意な人が作るかな、と思って様子見してた。対応サイトも増えてきたし、配信サイト以外でも正規表現で特定箇所の更新チェックできるように作れば便利かな、と思ったんだけど先にできたのは正規表現のほうだった。Sliceにidが必須になってるからgetElementByIdが使えるし楽かなーと思ってたらcontent-entryがaタグにも使えるとかfeedurlがあるとかで思ったよりめんどくさかった。ていうかaタグをcontent-entry指定できるならfeedurlが何のためにあるのかよくわからないのだけど。

本題。表示はIEPanel、IEDock、PersonalChannelを利用するとして、巡回と登録をどうするか。ExSearchBarと同じようにISleipnirを渡せば話は単純なんだけど、この類が増えると起動時*6にわんさか中継用のダミーが開いてうっとうしい。というわけで、表示用のプラグインからはUserActionを実行し、スクリプトからはhtmlファイルとjsファイルを書き出すようにした。既読管理を通常のjavascripthtmlcssでやるしかなかったのでやや強引なやり方で非表示にするようにしている*7

f:id:Puyo2:20090520072244p:image:rightf:id:Puyo2:20090520072048p:image:left

上の図が登録時の画面。登録するときは、切り出したいページを開いてsearchsliceを実行する。もしWebSliceを配信しているページなら初期段階で選択されているはず。されていなければidを選択し、そのタグの中身を切り出すか、正規表現モードに切り替えて正規表現と表示用のフォーマットを入力する。フォーマットをevalした内容がエントリになるのでwhile*8なんかを使ってstrを処理し、最後に;strとやれば結構複雑な内容でもいける。よくわからなければ初期状態の$[0][0] || $[0]で最初にマッチしたものを表示できる。正規表現モードで編集するときは表示をplainにしておいて出来上がってから確認時にpreviewにするとよいと思う。gooの天気予報、gooの今日の占い、pixivのランキング画像を表示させると左側の図のようになる*9

おおむね初期段階で欲しかった機能は実装したけど、まだエラー処理がついてないので巡回時にサーバダウンしてたりすると巡回が中断して中途半端なHTMLを吐き出してしまう。正規表現のサポート*10もついてないので快適に利用できる層は限られてるかな。

ちょこちょこ使ってみた感じだとエントリをグループ分けしてグループごとにhtml吐き出すようにしたようが便利そうな感じ。けどそうすると更新管理が複雑になりそうだしグループごとにcss指定できるようにもしたいなぁ。グループごとにタブ管理したほうが無難だろうか。あと、どうにかしてもっとわかりやすく且つうざくないように更新を通知したいな。

*1:実際にはrel=feedurlやclass=entry-contentなaタグで別の中身も指定可能

*2:がんばってるね

*3:なんせWeb"log"が由来だしね

*4:いまどきはhtmlわかるって程度の人がわざわざサーバ借りてサイト立ち上げたりしないかな?

*5:オークション以外の利用法も思いついてなかったし

*6:パネルにすれば表示されるまでは開かないけど、やっぱり開くし

*7:そのせいで提供サイトのURLがステータスバーに表示できないけどちゃんと開けるはず

*8無限ループになりやすいので注意

*9:サイト別のcssで整形済み

*10:といっても大層なもとは作れないと思うけど