由々識の気まぐれ日記

JavaScriptプログラマ「由々識」が時々書くするブログ。 内容はJavaScript全般、Sleipnir関係。

Sleipnir 2.6.0 test2 リリース

Sleipnir 2.6.0 に上書きして使用する テスト版、test2 が 2ch でリリースされました。


<更新履歴>

[仕様変更]

- スクリプトメニューで拡張子 .txt のファイルは表示しないようにした。(RAPT)

[不具合修正]

- 戻る/進む履歴を復元したとき、メモリリークすることがあった不具合を修正した。(RAPT)
- Sleipnir がアクティブではないとき、タブをクリックしてもアクティブにならなかった不具合を修正した。(キヨタカ)

今回の修正で私の目を引くのはやはり

- スクリプトメニューで拡張子 .txt のファイルは表示しないようにした。(RAPT)

でしょうか。
というか、そもそもこれは私がフォーラムで要望したものなのですけどね。(笑)
私は公開しているスクリプトファイルにスクリプトファイルと同名の付属テキストを付け、
同じフォルダに入れて管理しています。
今まではのスクリプトメニューにスクリプトとテキストファイルの両方が表示されてまぎらわしかったのですが、
今回の修正でスクリプトだけが表示されるようになりました。
と言うか、こんなにもすぐに対応してくれるとは思っていなかったのでうれしいかぎりです。

「画像BBSのURL抽出&保存」を公開してみた

画像BBSのURL抽出&保存スクリプトを公開してみました。
公開場所は 私のHP ではなく Sleipnir Script BBS です。

今回のスクリプトは Sleipnir Script BBS で 夏姫さん の要望によるもので、
開発に4日ほどかかりました。

で、今回のスクリプトがどんな機能なのかというと、
画像掲示板の1ページ目から最後のページまでの画像へのリンクを全て抽出し、
根こそぎダウンロードするというものです。
ぶっちゃけて言うとこの画像掲示板の画像全部欲しい!という時に使います。
ダウンロード時に Referer と Cookie も送るのでアクセス制限にも強いです。
とは言え、できたばかりなので対応していない画像掲示板もあります。
現在の仕様では直リンク画像しか抽出することができないので、画像がHTMLに埋め込まれて表示されるタイプには未対応です。

なにはともあれ、我こそは「画像収集家」と名のる方は使ってみてはいかがでしょうか。

2.6.0 test1 がリリース

Sleipnir 2.6.0 に上書きして使用する テスト版、test1が 2ch でリリースされました。
更新履歴」を見ると、主に IE7 関係と全画面表示の不具合が修正されています。
私の環境は IE6 なうえに Sleipnir 2.6.0 正式版 の段階で全画面表示の不具合が発生していなかったし、
今回は開発者向けの修正も無いので、
私個人的には目を引く修正は無い感じです。

そうそう、念のため言っておきますが、今回のバージョンはあくまで test版 です。
日常使っている Sleipnir には上書きしないように。
日常使っている Sleipnir を違う場所にコピーし、
そのコピーした Sleipnir に上書きするようにしてください。
test版 はあくまでもユーザーに不具合を見つけてもらうバージョンなので、
どんな不具合があるかわかりません。
あと、もちろん見つけた不具合は 2ch のスレで詳細に報告しましょう。
あなたの報告が明日の Sleipnir を作る・・・かも。

「リンク先画像のサムネイル表示」について

拙作の「リンク先画像のサムネイル表示」ですが、現在、Sleipnir 2.xx でサムネイル画像のアスペクト(縦横)比が維持できない場合がある仕様となっております。
今日、その原因がわかりましたのでこの場で発表いたします。

本題に入る前にこの「リンク先画像のサムネイル表示」がどんな機能のスクリプトなのか知らない方もいると思われるのでご説明します。
このスクリプトは実行するとページ内の“画像への直リンク”の左横に小さな縮小画像(サムネイル画像)を表示するものです。また Shift キーを押しながら実行すると別ウィンドウが開いてそこにサムネイル画像が一覧表示されます。複数の直リンク画像が開かずに確認できるので画像収集家には大変便利なスクリプトです。

さて今回、Sleipnir 2.xx でアスペクト(縦横)比が維持できない場合がある仕様となっているのは別ウィンドウでの表示時でのことです。
まずは「リンク先画像のサムネイル表示」がどのようにアスペクト比を維持したまま画像を縮小して別ウィンドウで一覧表示しいるのかを説明します。

このスクリプトは実行するとページ内のから画像へのリンクの URL を抽出します。実はこの部分の処理は高速化のために結構面倒なことをやっているのですが今回のお題から外れるので詳しい話はまた今度します。で、この抽出した URL を元に一覧表示の HTML を生成して別ウィンドウに出力します。この時、画像にはスタイルシートの visibility:hidden; が設定され画像は見えません。画像はこのまま見えない状態で読み込まれ、読み込み完了した時点でスクリプトが画像のアスペクト比を取得して画像の大きさを縮小変更し、画像のスタイルシートを visibility:visible; に設定して画像が見えるようにします。
さて、ここまでは問題がありません。このまま全ての画像に以上のような処理をしていけば終了です。しかし現実は IE の仕様のせいで終わりません。文字通りスクリプトの処理が終わらないのです。
何故終わらないかというと、それは画像の読み込みが完了したかどうかを判定する処理にあります。画像の読み込みが完了したかどうかを判定する際に complete を使っているのですが、画像がリンク先のサーバーに存在しない、いわゆる 404 エラーなどだった場合はこの complete がいつまでたっても“読み込み中”の値しか返してくれません。読み込みが行われていないにもかかわらずです。また、別の方法として readyState を使う方法もありますが結果は同じようなものです。
ではどうすれば良いのかというと、それは Sleipnir.API:IsBusy() を使います。これはウィンドウが読み込み中かどうかを判断する API で、ページの HTML が読み込み完了していてもページ内の画像が読み込み中だった場合“読み込み中”の値を返し、全ての画像の読み込みが完了すると“読み込み完了”の値を返します。つまり、この Sleipnir.API:IsBusy() が“読み込み完了”の値を返してかつ“読み込み中”の値を返す画像は表示不可ということでやっとスクリプトは終了になります。

さて、長々と説明しましたがまだ話の本題はこれからです。
スクリプトを終了させるのに必要な Sleipnir.API:IsBusy() ですが、Sleipnir 2.xx のものには不具合があり、ある条件下で不具合が発生するのです。
実は、URL が「about:○○○」だとウィンドウが読み込み中であるにもかかわらず“読み込み完了”の値を返してしまうのです。window.location.reload(); でウィンドウを再読み込みしても値は“読み込み完了”から変わりません。ただ、F5 キーなどスクリプト以外から再読み込みをすると正常に“読み込み中”→“読み込み完了”の値を返します。
で、この不具合で具体的に何が起こるかというと、画像が“読み込み中”にもかかわらず Sleipnir.API:IsBusy() が“読み込み完了”の値を返すために正常に読み込まれている途中の画像が表示不可画像と判断され、アスペクト比が維持されないままサムネイル表示されるのです。

話が少しややこしかったと思うので、この不具合を再現する簡単なソースを書きます。
Sleipnir 1.66 と 2.xx の両方をお持ちの方は結果を比べてみてください。


TEST.js
var pnir, id, document, window;

pnir = new ActiveXObject("Sleipnir.API");
id = pnir.NewWindow('about:blank', true);
document = pnir.GetdocumentumentObject(id);
window = pnir.GetWindowObject(id);

document.open();
//↓表示する画像は読み込みに時間が掛かれば何でも良い。
document.writeln('<HTML><HEAD><TITLE>TEST</TITLE></HEAD><BODY><IMG src="http://8.dtiblog.com/y/yuyushiki/file/TEST.jpg"></BODY></HTML>');
document.close();
do {
pnir.SearchBarString = (pnir.IsBusy(id)) ? '読み込み中' : '完了!';
WScript.Sleep(10);
} while(!pnir.CtrlDown && !window.closed);
pnir.SearchBarString = '';

/* 終了処理 */
window = null;
document = null;
id = null;
pnir = null;

このスクリプトは実行するとまず 「about:blank」が開き、document.writeln() で画像の表示する HTML を書き込みます。画像が表示されたら繰り返し構文の do 〜 while()Sleipnir.API:IsBusy() でウィンドウの読み込み状態を監視し、検索バーに状態を表示し続けます。
画像を閉じるか Ctrl キーを押すとスクリプトが終了します。
Sleipnir 1.66 では画像が読み込み中の時は“読み込み中”と表示され、画像の読み込みが終了と同時に“完了!”の表示に変わりますが、
Sleipnir 2.xx では最初から“完了!”のままです。


そんなわけで不具合の再現方法もわかったことなので Fenrir の人たちには早くこの不具合を修正してほしいです。

「ウィンドウに収まるように画像を縮小」を更新しました

拙作の「ウィンドウに収まるように画像を縮小」が Ver.1.22 に更新しました。
まずは、このスクリプトがどような機能なのか知らない方もいると思うのでご説明します。
このスクリプトは実行するとページ内の全ての画像をウィンドウ内に収まる大きさに縮小します。
元からウィンドウ内に収まる大きさの画像はそのままです。
フレームにも対応しているのでフレームが使われたページでも使えます。
また、「1.66互換スクリプト」「UserActionスクリプト」「SeaHorseスクリプト」全対応なので、
ファイル名を変えてそれぞれのフォルダに入れるだけで導入できます。
入れたフォルダ、及び実行状態からスクリプト側が独自に判断して処理します。
したがって、ソースの書き換え等は不要です。


さて、そのスクリプトの今回の更新内容は

・画像を縮小した後にもう一度実行するとオリジナルのサイズに戻るようにした。

です。
当機能は以前から要望があったのですが、この度めでたく実装となりました。
これで「SeaHorseスクリプト」で縮小した画像を「UserActionスクリプト」で元のサイズに戻す等ができます。
ちなみに、何故こんなに時間が掛かってしまったのかというと、
私の中に迷いがあったためです。
いったい何を迷っていたのかご説明しましょう。

まず画像が HTML で次ように書かれていたとします。

<IMG src="hoge.jpg" style="width:1024px; height:768px;">

この例では画像は横 1024 ピクセル、縦 768 ピクセルで表示されます。
さて、ここで問題なのは表示されている画像サイズと画像本来のサイズは異なる場合があるということです。
画面に表示されるサイズは横 1024 ピクセル、縦 768 ピクセルでも、
本当のサイズは横 640 ピクセル、縦 480 ピクセルかもしれません。
この状態で画像をスクリプトで例えば横 800 ピクセル、縦 600 ピクセルに縮小してしまうと、
画面上での表示サイズである横 1024 ピクセル、縦 768 ピクセルという情報は失われてしまい、

<IMG src="hoge.jpg" style="width:auto; height:auto;">

としても元のサイズには戻らず、横 640 ピクセル、縦 480 ピクセルになるだけです。
つまり元に戻したくても戻らないのです。

「元に戻す」と表記しておきながら元に戻らない場合があって良いのだろうかと迷っていました。

さて、それではどのような方法でこれを解決したかというと・・・、

実は解決してません。

もう諦めました。
だって、良い解決策がうかばないんだもん。(><)

というわけで、めでたく『オリジナルのサイズに戻る』機能(一部例外あり)が実装されました。
ちなみに、実装時間は動作テストなどを含めて1時間ほどでした。
こんなに速く実装できるならもっと早く実装すれば良かったです。


次にページの画像が縮小済みか未縮小かをどのように判別しているかですが、
それには
 getAttribute
 setAttribute
 removeAttribute

を使ってます。
スクリプト実行時に setAttribute で <HEAD>タグの ImageSizeReduce="true" 属性の有無を確認します。
そして、
ImageSizeReduce="true" 属性が無かった場合は縮小処理をして setAttribute でページ内の <HEAD>タグに ImageSizeReduce="true" という属性を追加し、
ImageSizeReduce="true" 属性が有った場合は画像を元のサイズに戻して
removeAttributeImageSizeReduce="true" 属性を消去しています。


そういえば、スクリプトのファイルサイズがいつのまにか 14.3KB にもなってました。
ソース
内には実はもういらない部分があったりするのですが、
実装に苦労した部分のために消せないでいたりします。
その部分は window.execScript() を使うと「1.66互換スクリプト」時でも
組み込みスクリプト並みの処理速度が出るというものだったのですが、
WindowsUpdateの更新パッチ<KB925454>を当てると使えなくなってしまいました。
おそらく何らかのセキュリティーホールになっていたのだと思われます。
仕方の無いことですね。

 | HOME |  次のページ »

Sleipnirスクリプトをお探しのかたはこちらへどうぞ。

Yuyu's Digital Lab.

プロフィール

由々識

作者:由々識

JavaScriptプログラマの由々識です。
主にSleipnirスクリプトを書いています。

RSS 1.0

カレンダー

10 | 2007-11 | 12
S M T W T F S
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -

アーカイブ

カテゴリー

最新投稿

最新コメント

トラックバック

ツール

あわせて読みたい
この日記のはてなブックマーク数

お小遣い稼ぎ!
スマホでお小遣い稼ぎ!
DTIブログポータルへ
このブログを通報
Report Abuse
利用規約