作ったもの
- 1 :l ★:2006/06/09(金) 20:14:05 ID:???
- 何かを作ったときに書く。
AutoHotkey関連については、流行らせるページの管理人の雑記スレに書く。
http://lukewarm.s101.xrea.com/test/read.cgi/bbs/1146398137/
- 13 :l ★:2006/11/09(木) 23:05:23 ID:???
- Sleipnir用スクラップブックスクリプト・プロトタイプ
SleipnirにはSQLiteというデータベースエンジンが搭載されているということで、せっかくだから何か作ってみることに。
RSSリーダー的な物を作ろうかと思ったが、普通のHTMLページも巡回できるようにしたいと思ったら、XMLHTTPではHTTPヘッダに文字コード指定のないUTF8以外のHTMLページを読み込めないということで、やる気を無くした。
とりあえず、表示しているページを切り取って保存するスクラップブックっぽいものを作成することに。
スクラップブックへの追加は、UserActionExtensionのスクリプトで作る。
この拡張スクリプトは、アクションが実行されるたびに再読込されるらしく、テストがやりやすくてよい。
選択範囲の取得とかは_document.selection.createRange().htmlTextとかで適当に出来た。
データベースに既にテーブルが作成されているかを調べる方法を知らなくて困ったが、毎回CREATE TABLEクエリを実行して存在していなければ作ってもらうという方法で動いたので、とりあえずこれでいいことにする。
SQLを使うのは2年ぶりくらいだったが、適当にリファレンスなどを見ながら書いたらうまくできたようだ。
次に、スクラップブックの内容を表示する部分は、SeaHorseスクリプトで作ることに。
「about:ScrapBook/*」というURLが開かれたら、SeaHorseスクリプトによって表示を行うという方法を考えた。
一瞬空白ページが開かれて見苦しいが、_document.write()で書き込めばちゃんと表示される。
とりあえず、URLの引数部分で操作を判別するようにし、一覧表示、個別ページ表示、項目削除の機能を付けた。
かなり適当だが、とりあえず保存・閲覧・削除が出来るようになったので、使おうと思えば使えそうだ。
あとは、2chのread.cgiのように一定件数ずつ表示できるようにしたり、検索キーワードにマッチする項目を表示できるようにしたりとかもしてみたい。
SQLなら簡単なクエリ文を作るだけで、ややこしい検索機能なども作れるので便利だ。
投稿ファイル名: ScrapBook.zip
http://lukewarm.s151.xrea.com/b/file/1149783578_13.zip
サイズ: 2297
- 14 :l ★:2006/11/09(木) 23:40:36 ID:???
- >>12
ファイル名を*.user.jsにしなきゃならないのを忘れていて、そのままSeaHorseフォルダに入れても動かなかった。
まあいいや。
ページ読み込みごとにいちいち実行されると負荷が大きいんで、UserActionで必要なときに呼び出した方がいいかも。
- 15 :l ★:2006/11/10(金) 06:30:27 ID:???
- ・Sleipnir2+UserActionExtension用goo英和辞書スクリプト
適当に作ってみた。
選択している単語をgoo辞書で検索して、結果を表示する。
goo辞書の文字コードはEUCだった気がするが、HTTPヘッダのContent-Typeに文字コードを明示しているらしく、Microcoft.XMLHTTPで読み込めた。
TextRangeのpasteHTML()で<span title="結果">のようにして追加し、ツールチップとして表示されるようにした。
検索結果が得られないときは、過去形などの活用語尾を削って再検索してみるという機能も付けてみた。
投稿ファイル名: gooDictionary.zip
http://lukewarm.s151.xrea.com/b/file/1149783578_15.zip
サイズ: 680
- 16 :l ★:2006/11/10(金) 21:42:32 ID:???
- ・Sleipnir用辞書スクリプト、フレーム内のページでも動作するように修正
選択範囲の文字列を処理するスクリプトが、フレームページ中ではうまく動かない。
_documentと選択範囲を含むドキュメントが違うのだから当たり前か。
フレームをたどって、選択範囲を含むドキュメントを取得する関数を作ることに。
とりあえず、フレーム内のドキュメントを選択している場合、_document.activeElement.tagNameはFRAMEかIFRAMEになるようなので、そのときにアクティブなフレームをたどることに。
各フレームのwindowオブジェクトにアクセスするにはdocument.framesを使う必要があるらしいが、activeElementとの対応が分からない。
各windowオブジェクトのdocument.hasFocus()でアクティブかどうかを調べようかと思ったが、アクティブでないフレームでもtrueになってしまう。
仕方ないので、別途フレーム要素の一覧を取得して、アクティブ要素と一致するものを調べ、対応するframesのアイテムをアクティブフレームとみなすことに。
なぜかdocument.all.tags(tagName)だとうまく一覧が取得できないときがあったが、getElementsByTagName()を使ったらうまくいったりした。
また、document.framesなどのコレクションに[i]のようなインデックスでアクセスしようとするとおかしくなることがあったが、item(i)のようにメソッド経由でアクセスしたらうまくいった。
フレーム内で別ドメインのページを表示しているような場合は、「アクセスが拒否されました」というようなエラーになってframesの要素にアクセスできない。クロスサイトスクリプティング的なものへの対策だったか。とりあえず、今回の所はあきらめることに。
そんな感じで、アクティブなフレームを割り出し、frames.item(i).documentを渡して再帰呼び出しし、アクティブな要素がフレームではなくなるまで潜っていくようにしたが、なぜかうまく結果が取得できない。
再帰呼び出しした先でdocumentオブジェクトのメンバにアクセスできなくなっているようだ。
なぜか、documentではなくその親のwindowオブジェクトを渡すようになおしたらまともになった。
まあ、ドキュメントを引数にアクティブなドキュメントを受け取るよりは、ウィンドウを引数にした方が感覚的には自然だからいいか。
投稿ファイル名: gooDictionary.zip
http://lukewarm.s151.xrea.com/b/file/1149783578_16.zip
サイズ: 834 bytes
- 17 :l ★:2006/11/10(金) 22:28:29 ID:???
- ・覚え書き
Sleipnirの組み込みスクリプトに用意されているsleipnirオブジェクトでは、Alertでダイアログを表示することは出来ても、確認ダイアログや入力ダイアログは表示できない。
代わりにwindow.confirm()やwindow.prompt()を使えばよい。
- 18 :l ★:2007/01/07(日) 22:49:46 ID:???
- WSHからSQLiteを操作して、M3UプレイリストをHogehoge2006にインポートする
WSHからSQLiteのデータベースを読み書きするライブラリを作るついでに作った。
(new ActiveXObject("WScript.Shell")).Exec()でsqlite3.exeを実行して、標準入出力を読み書きすれば出来るはずである。
しかし、Exec()の標準出力は、プログラムが終了してからでないと読み出せない。舐めんな。
出力をファイルにリダイレクトして、読み取り専用でファイルを開けば対話的に読み書き可能だという話を聞いたことがあるが、途中にcmd.exeを挟むのは癪に障る。
sqlite3.exeの「.output」コマンドで出力ファイルを指定してやれば、似たようなことが出来るらしい。しかも、クエリの結果しか出力されないので、わざわざプロンプトを読み飛ばしたりする手間もない。
一時ファイルが出来るのは邪魔だが、他に上手い方法は無さそうなのであきらめよう。
sqlite3.exeの出力形式には、csvやhtml、SQLクエリのような形式などいくつかの形式が使える。
listなど一部の形式は、結果の文字列値に区切り文字と同じ文字が含まれると正常にパース出来ないので役に立たない。
csv形式なら、文字列が「"」で囲まれ、改行が「\n」になったりするので、1行ずつ読んで「eval("[" line "]")」としてやるだけで簡単に配列に変換できそうである。
しかし、なぜか日本語の一部のバイトが変な風にエスケープされやがる。「\ooo」のような8進数形式らしい。
エスケープ後の「\」が日本語の上位バイトとくっついてしまうと、置換などでアンエスケープするのが困難になってしまい、打つ手がない。
csvはあきらめ、html形式を使うことに。
XMLDOMにXHTMLとして読み込んで、DOMオブジェクトとして処理する。
文字列値にHTMLタグが含まれていたときなど、「<」しか実体参照に変換しないようなので正常に読み込めるか不安だったが、そのままでも意外とうまくいった。
ActiveXObjectを生成したりするので、明らかにパフォーマンスが低そうだが、他に上手い方法は無さそうなのであきらめよう。
クエリに日本語が含まれるときの処理もやっかいである。
JScriptの内部ではUTF-8になっているが、Exec()の標準入力に送り込むときにShift_JISに変換されているらしい。
SQLiteの内部にはUTF-8で格納されているので、Shift_JISに変換されてしまうと都合が悪い。
ADODB.Streamで適当に変換して流し込んでやればうまくいくかと思ったが、Shift_JISとして正しくない部分が潰れてしまうためか、正常な結果が得られなかった。
仕方ないので、クエリを一旦UTF-8のテキストファイルとして保存し、「.read」コマンドで読み込ませることに。
かなり無駄なディスクアクセスが増えたが、他に上手い方法は無さそうなのであきらめよう。
そんな感じで、色々妥協しまくったが、とりあえず一通りまともに動作するようになった。
データベースをゼロから作って動作確認をするのが面倒だったので、Hogehoge2006のデータベースを実験台にする。
ついでだから、M3U形式のプレイリストファイルをHogehoge2006のクエリに変換してしまうツールを作ってみることに。
勝手に「imported_playlist」というテーブルを作成し、プレイリスト名、並び順、ファイル名を登録する。ちなみに、「playlist」というテーブル名はHogehoge2006内部で使われているらしく、勝手に作成すると正常動作しなくなる。
あとは、本来のデータベースである「list」テーブルと「imported_playlist」を結合して指定のプレイリストに登録された音楽ファイルの情報を列挙するようなSQL文を生成し、クエリ定義ファイルとして保存するようにすればいい。
この時、「select * from list〜」としたときと同じようにフィールドが並ぶようにしないといけない。「*」の代わりに「file_name,file_title,file_ext,file_size,tagTitle,tagArtist,tagAlbum,tagGenre,tagDate,tagComment,tagTracknumber,tagAPIC,tagLyrics,statDuration,statChannels,statSamplingrate,statBitrate,statVBR,infoCodec,infoCodec_sub,infoTagtype,gain,rating,playcount,lastplayed,modify」と書けばいいはずである。糞長い。
残りの部分は「SELECT (中略) FROM imported_playlist LEFT JOIN list ON list.file_name=imported_playlist.FileName WHERE ListName='PlaylistName' ORDER BY imported_playlist.ListNo」というような感じにする。
しかし、このままでは、クエリ実行後にHogehoge2006側でソートされてしまい、プレイリストの登録順が無視されてしまう。
これは「tagTracknumber」を「imported_playlist.ListNo」にすり替えてしまうことで無理矢理解決した。この技は、他のクエリ作成でも使えそうである。
そんなわけで、Hogehoge2006でも好きなように曲を並べて作ったプレイリストを再生できるようになった気がする。
普通のプレイリストを使いたければ、普通の音楽プレイヤーを使えばいいような気がするが。
投稿ファイル名: importPlaylist.zip
http://lukewarm.s151.xrea.com/b/file/1149783578_18.zip
サイズ: 2032 bytes
- 19 :l ★:2007/02/13(火) 23:25:55 ID:???
- 某アニメに登場した落ちものパズルゲームをJavaScriptで作ってみた。
http://lukewarm.s151.xrea.com/etc/game.html
落ちてくるブロックを操作して積んでいく所までは普通の落ちものパズルだが、一定数のブロックが揃っても手動でクリックしない限り消えない。
操作するブロックが3つ続きになっていることにより、好きなときに消せるという手軽さが上手く相殺されているようだ。
マウスとキーボードを同時に操らなければならないというややこしさが良い。
消せる条件については、作中で明示されていなかったので、同じ色が4つ以上繋がっていれば消せることにした。
連鎖は、操作しているブロックが落ちて新しいものに代わるまでに複数回消すことで連鎖とみなすことにした。
とりあえず動作するところまで作ったが飽きた。
得点の計算が適当すぎる。
ブロックの外見に画像を使えるようにしようかと思ったが、画像を用意するのが面倒なんでやめた。
なんか知らんがIEでしか動作しない。
- 20 :l ★:2007/02/18(日) 05:38:35 ID:???
- >>19をFirefoxとOperaに対応させたりした。
FirefoxのDOM要素のstyleプロパティにsizeプロパティがあるのを知らずに、with(element.style){}内でローカルのsize変数を使おうとしておかしくなっているのに気付かなくて苦労した。
その他、イベント周りでいちいち互換性のためのコードを入れなければならないのが面倒くさい。
タイマー関係はそのまま動いてくれて助かった。
Operaでキーボードを押しっぱなしているときにちゃんとonkeydownが発生しないのがイラつく。
投稿ファイル名:3.bmp.png
サイズ: 5160
画像: http://lukewarm.s151.xrea.com/b/file/1149783578_20.png

- 21 :l ★:2007/03/09(金) 13:02:53 ID:???
- GREYCstorationでTV画像のテロップを除去するAutoHotkeyスクリプト
http://lukewarm.s151.xrea.com/test/read.cgi/b/1132265191/67の奴を自動化するために、GUIの補助ツールを作ってみた。
AutoHotkey関連だが、大して目新しいことをやっているわけではないのでこっちに書く。
まず、処理範囲を減らすためにテロップの周辺のみを選択して切り出せるようにしたい。
とりあえずGui,Add,Pictureで画像を表示し、OnMessageでマウスイベントを監視して範囲選択を検出することに。
選択矩形を描画する方法が分からなかったが、とりあえずGui,Add,Text,BackgroundTrans Borderで枠線を表示できたので、それをGuiControl,Moveで動かして代用した。
選択範囲の切り抜きにはImageMagickを使う。
やたらと機能があってドキュメントを読むのがしんどい。
とりあえず切り抜きは「-crop」だった。範囲指定の書式が独特な感じで馴染みにくい。
次に、コントラストを上げて2値化してマスク画像を作成する。
テロップ以外にも明るい部分があると白くなってしまうので、画像編集ソフトで開いて手動で編集するように。
次に、テロップの文字の縁取りまで消えるようにマスクを太らせたい。
ImageMagickでぼかして2値化したり色々試してみたが、GREYCstorationのオプションに元からあったので無駄骨だった。
その他のオプションを設定してGREYCstorationを呼び出す。
オプションの説明が簡潔すぎて、何の設定なのか分からなくて困る。
とりあえず、-pと-aの値を小さくするとぼやけ気味になるらしいことなどは分かったが、試しても効果がよく分からないものもあった。ノイズ除去などに関係しているものだろうか。
その後、再びImageMagickで元の画像に埋め込んで完成。
そんな感じで、比較的手軽にテロップ除去が出来るようになったが、何の役に立つかは不明。
キャプチャ画像なんて、一瞬だけ映った画面を確認したいときに見るくらいで、保存しておいて観賞するようなものではないし、手間をかけてまでテロップを消したいとは思わない。
投稿ファイル名: KillTelop.zip
http://lukewarm.s151.xrea.com/b/file/1149783578_21.zip
サイズ: 2213 bytes
28KB
0ch BBS 2005-10-08