XREA.COM Logo XREA.COM Ad

作ったもの

1l ★:2006/06/09(金) 20:14:05 ID:???
何かを作ったときに書く。

AutoHotkey関連については、流行らせるページの管理人の雑記スレに書く。
http://lukewarm.s101.xrea.com/test/read.cgi/bbs/1146398137/
2l ★:2006/06/09(金) 20:18:37 ID:???
VxEditor用行番号付きコピースクリプト
http://lukewarm.s41.xrea.com/up/file/110.zip

都合により作った。
選択範囲の辺りを行頭に行番号をつけた形でコピーする。
ソースコードの一部を引用して説明したいときに便利かも。
3l ★:2006/08/08(火) 09:17:20 ID:???
Vector他ダウンロードユーティリティ改良
http://lukewarm.s41.xrea.com/DMonkey/dmsh/dlutil.html
オンラインソフトをダウンロードして解凍するDMonkeyスクリプトに、Softpedia対応モジュール、MSI解凍モジュール、NSIS解凍機能を追加した。

頻繁に利用するようになったSoftpediaだが、「Download」のリンクが横にスクロールさせないと表示されないことがありイラつくので、ソフト情報ページから直接ダウンロードできるようにしてやった。
Vectorと比べるとページの読み込みにやたら時間がかかる気がする。

なんとなく糞忌々しい糞MSI形式の糞インストーラーに堪忍袋の緒が切れたので、MSI2XMLというプログラムで解凍する機能を組み込んでやることに。
MSI2XMLのファイル解凍先指定がカレントディレクトリ指定からの相対パスだという謎の仕様に悩まされた。
なぜか解凍されるファイル名が「_9520D58CF0DD42CF9E8FBC28445F8DBC」等のIDになっているので、XMLファイルから出力先ファイル名を検索してリネームしてやる処理を作る羽目になった。
かなり適当に作ったためフォルダ構造までは再現されないが、実行ファイルとマニュアルくらいしか含まれていないくせに糞MSIになっているソフトも多いし、とりあえずマニュアルは読めるようになるはずなので、概ね問題ないだろう。

ついでに糞Nullsoft社の糞NSIS製糞インストーラーも始末できないかと思い調べたところ、最近7-zipが解凍に対応したらしい。
LZHなどにも対応しているはずだが、自己解凍書庫の解凍が出来ないので、従来使用していたNoahと組み合わせて利用することに。
MSI形式にも対応しているようだが、仮のファイル名で解凍されてしまうので、XMLを元にリネームできるMSI2XMLの方がマシだった。
その他、ISO形式などにも対応しているらしいが、オンラインソフトの配布に使われることはあまりないだろうから無視する。

この改良により、各種アーカイバの自己解凍形式に加え、糞InnnoSetup、糞MSI、糞NSISの強制解凍が可能になり、かなり多くの糞インストーラーが始末できるようになった。
その他http://programmerstools.org/taxonomy/term/38によると糞Installshieldと糞WISEを強制解凍するツールもいくつか存在するらしいので、解凍できない糞インストーラーを見つけたときにでも試してみよう。


7-zipの履歴によると、一部のバージョンの糞NSISで作った糞インストーラーがどこだったかのアンチウィルスソフトにウィルスとして検出されるらしい。
いい気味だ。
この調子でインストーラーをウィルス認定しまくって、自己解凍書庫ベースでないインストーラーをこの世から一掃してくれないものか。
4l ★:2006/08/17(木) 04:15:03 ID:???
Vector他ダウンロードユーティリティ改良
http://lukewarm.s41.xrea.com/DMonkey/dmsh/dlutil.html
Vectorの仕様変更対応、Sourcefoge対応モジュール追加

Vectorがリニューアルしやがって従来のモジュールが使えなくなったので修正した。
FONTタグなどを多用した腐りきったHTMLからスタイルシートなどを使用した小綺麗なHTMLに変わったようだが、うるさい文法チェッカーに言わせると未だに間違いだらけらしい。
サイトの構造自体は変わっていないらしく、正規表現などを修正するだけで対応できた。

Sourcefogeは、トップページ→ファイル一覧→ミラーサーバ一覧→リダイレクトページ→ファイルという、やたら回りくどい構造になっているが、単にミラーサーバ一覧のURLを置換するだけでファイル本体のURLが得られることに気付いた。
ミラーサーバは適当に固定しておいても問題ないだろう。
5l ★:2006/10/13(金) 12:53:34 ID:???
ぜろちゃんねるスクリプト改 ファイルアップロード対応版+動画投稿プラグイン
http://lukewarm.s151.xrea.com/up/file/003.zip
ぜろちゃんねるスクリプト(http://0ch.mine.nu/)の2006/02/27版を改造して、ファイルのアップロードに対応させ、YouTubeのように動画ファイルの投稿を受け付けるプラグインを作成した。

Googleに買収されるなど、相変わらず話題沸騰のYouTubeであるが、動画ごときでここまで大きくなったのは意外な気がする。
適当な形式で投稿した動画が、多くのプラットフォームで再生可能な状態で公開されるというのは、確かに便利ではあるが、作成の難易度的にはそこら辺のWeb2.0的システムと大して変わらないだろう。
もっと色々なサイトが出来て、blogホスティングサービスとかのように群雄割拠な状態になっても良さそうなものだ。
投稿できる動画の容量や長さの制限が厳しく、エンコード後の画質もよいとは言えず、いちいちJavaScriptをONにしなければ見られないのも鬱陶しいし、ファイル本体のダウンロードがやりづらい作りも腹立たしいYouTubeなんかよりもユーザーフレンドリーなサイトは、作ろうと思えばいくらでも作れそうなものだが、なかなかめぼしいサイトは増えてこない。
たまに二匹目の泥鰌を狙ってサービスを始める企業があるが、大抵は念入りな検閲などで余計に使いづらいものとなって、当り障りのないホームビデオ展で終わっている。

参入を躊躇わせる原因として考えられるのが、回線やストレージ、エンコードのためのCPUパワーなど高いサーバスペックを必要とする割に儲かりにくそうなことと、著作権を侵害しているファイルがアップロードされまくると言うことだ。
著作権侵害で訴えられるのは困るし、違法ファイル対策をするのも面倒くさいし、対策をしたら人は集まらないだろうし、人が集まったらサーバ負荷が厳しいし、そこまで苦労して運営してもあまり儲かりそうにないとなっては、よほどの変態か間抜けでないとやりたがりはしないだろう。
一方、人々の需要の方はそれなりに多かったため、なんか知らんが頑張ってそこそこ使いやすいサービスを提供し続けている変態サイトがむくむくと成長していったと言うわけだろう。

一方、Web2.0とか動画サイトがもてはやされ始めるよりずっと前から存在しているファイルアップロード掲示板は、様々な中小サイトが軒を並べている。
そのほとんどは、個人が自宅サーバやホスティングサービスを利用して公開しているものだ。
アップローダーCGIスクリプトは様々な物が公開されており、それほど苦労せずに設置できる。
余ったリソースで適当に運営して、広告バナーでで小使稼ぎにでもなれば良し、面倒なことになりそうならトンズラしちゃえばいいやと、暇つぶし感覚で気軽にやってるところが多いのではないか。
一方、企業が提供するアップローダー的サイトが少ないのは、動画投稿サイトと同じような理由だろう。

そういえば、ブームの割には動画投稿サイト的なCGIが公開されているのは見かけないような気がする。たぶん、無いのだろう。ネットランナーとか言う本にも載ってなかったし。
ということは、スクリプトが公開されて簡単に設置できるようになれば、個人による動画投稿サイトも増えるのではないだろうか。
そんなことになって喜ぶ人がいるかどうかは分からないが、YouTubeとかGoogleの儲けを1セントでも削ってやれれば愉快である。
というわけで、作ってみることにした。
長い前置きだ。


ゼロから作成するのは面倒なので、2ch互換掲示板スクリプトの「ぜろちゃんねる」をベースに作成することに。過去に3回も設置したりして、つきあいはかなり長い。
レス機能とかが最初から出来ているので楽だ。
0chのプラグイン機構で実現できるかと思ったが、どうやらファイルアップロードには対応していないらしく、投稿フォームに「<input type="file">」を付けて投稿してもエラーになってしまった。
調べたところ、アップロードファイルの処理は普通に書くと面倒くさいが、CGI.pmというライブラリを使えば楽になるらしい。
幸い、フォーム情報のデコード部分を少し書き換えるだけで修正できた。
ファイルサイズや元のファイル名の取得、ファイル本体の移動などは、ついでにフォーム処理モジュール内に組み込んでおく。
あとの部分はプラグインとして実装すればいいだろう。
プラグインを追加すれば、画像掲示板とか汎用アップローダーとかにも使えそうだ。

受け取った動画は、面倒だから「dat」ディレクトリに一緒に保存してしまうことに。
FLVへのエンコードには、「ffmpeg」を使う。多くのフォーマットに対応したかなり強力なプログラムで、色々なツールのバックエンドとして使用されている。とりあえずWindows上でのテストには「携帯動画変換君」に入っていた物を使う。
CGIから実行しようとしたら、なにやらCygwin1.dllのバージョンが合わないとか言うエラーが出やがった。perl.exeをCygwinの物からActivePerlの物に変えたら、正常に実行されるようになった。
動画の表示には、「Flash FLV Player」というFlashファイルを使う。ダウンロードしながらの再生とかも可能で本格的だ。
こいつは再生前の「Click to play」画面に画像ファイルを表示できるらしい。
ffmpegには動画のフレームを画像として保存する機能も付いているということなので、エンコードのついでに画像を抜き出すようにしてみた。

アップロードされたままのAVIなどの動画ファイルも、embedタグで表示できるようにした。
ffmpegが使えない環境でもそれなりに動作するはずだ。再エンコードをされたくない人などにとってはこちらの方が喜ばれるかも知れない。
とりあえず自分でXviDエンコードしたAVIファイルは表示できたが、他の形式でうまくいくかどうかは定かではない。mp4とかは無理かも。

とりあえず動画をアップロードして掲載できるようになったが、さすがにCGIのリクエスト時に動画のエンコードを行っていると時間がかかる。
面倒なので、小さなファイル以外は別スクリプトで一つずつエンコードするようにした。
適当にwhileとsleepで常駐するモードと、全掲示版の「dat」ディレクトリを処理したら終了するモードの二つを用意。
タスクスケジューラーとかcronとかいうやつとかで実行するときは、1回のみ処理モードを使えばいいだろう。

そんなわけで、割とそれっぽいものができたような気がする。
しかし、例によって自分では全く使わないだろう。
自宅サーバを公開するのが面倒くさいし、利用してもらったところでうれしいことがあるわけでもない。著作権侵害で訴えられたりしたらやだし。
そもそも、動画なんてどうでもいい。さっさと廃れないものか。
6l ★:2006/10/14(土) 08:51:07 ID:???
Sleipnir2(SeaHorse)用Vector不要部分削除
http://lukewarm.s151.xrea.com/up/file/005.zip
実はまだ1.66を使っているのだが、そろそろ移行しようかと思い弄ってみることに。
とりあえず、Webページをスクリプトで書き換えてしまうプラグインを試す。
鬱陶しいVectorの広告とかを消してみる。
どうやら、JavaScriptをOFFにしているとJavaScriptモードは動作しないらしいので、SleipnirScriptとやらを使う。
よく分からんが、Sleipnirが直接実行しているだけで、中身はWindowsのJScriptなのだろうか。
documentオブジェクトが_documentになっていたりするが、大した違いはない。「var document=_document;」とするだけで良さそうだ。
正規表現を考えるのが面倒だったので、DOMを使うことに。
FireFoxのDOMインスペクタでVectorを表示してみたら、必要以上に入れ子になっていてうんざりした。
色々と要らない部分を非表示にしたら、かなりすっきりしたが、ページの読み込み途中に普通の画面が見えてしまい、鬱陶しさはあまり代わらない。
また、新着ヘッドライン作成スクリプトが作成したフレーム内で表示しようとすると動作しなかった。
_documentが指す物が違うからなのか、トップレベルのURLが代わらないと発動しないのかはよく分からないが。
そんなわけで、不要部分の削除にはあまり役に立たなそうだが、他に何か使い道はないもんか。
7aaa:2006/10/14(土) 19:13:21 ID:3fFrRatM
>「今度、あなたに妹が出来るのよ」

まで読んだ。
8l ★:2006/10/19(木) 00:47:54 ID:???
Sleipnir+SeaHourseプラグイン用、YouTubeの動画ページを開いたときスクリプトとActiveXを有効に
今度こそSleipnir2に移行しようと思い、最新正式版を一からカスタマイズし始めたのだが、「URIアクション」のセキュリティ設定自動変更機能が「セキュリティ高」等の中から選択するという意味不明な仕様になっており、「JavaScriptとActiveXを有効に切り替え」というような明示的な指定が出来なくて苛つく。
別に「全て有効」にしてしまってもいいような気もするが、何となく気にくわないのでSeaHorseスクリプトで切り替えてやることにする。
Sleipnir-APIのSetSecurity()でセキュリティ設定を変更するには、ドキュメントのIDを指定しなければならないということだが、直接知る方法が用意されていないらしい。
仕方ないので、開いている全てのページのGetDocumentObject()の返り値をSleipnirScriptに与えられた_documentオブジェクトと比較して、一致した物をSeaHorseの発動したドキュメントとみなすことに。
一旦読み込んでから切り替えが行われるのが鬱陶しいが、とりあえず動作している気がする。
これを応用すれば、「JavaScriptを有効にすると鬱陶しくてしようがないけど、ActiveXは有効にしたい」というようなサイトが便利になるかも知れない。
セキュリティ切り替えだけでなく、他のSleipnirAPIの機能も使えるはずだ。役に立ちそうなのはNavigateとかオートリロード設定くらいしかないが。プロキシの切り替えとかは出来んのか。

作ったスクリプトは以下。

// ==UserScript==
// @name YouTube
// @description YouTubeのページを開いたときにJavaScriptとActiveXを有効にする
// @include http://www.youtube.com/watch*
// @type SleipnirScript
// ==/UserScript==
var api=sleipnir.API;
var c=api.GetCount();
for(var i=0;i<c;i++){
var id=api.GetDocumentID(i);
if(api.GetWindowObject(id)==_window){
api.SetSecurity(id,true,false,true,false,true,false,false);
break;
}
}
9l ★:2006/10/31(火) 19:43:32 ID:???
ファイルアップロード機能をこっちにも組み込んでみた。
ベースにしている0chのバージョンが古かったので修正に手間取ったが、たぶん何とかなった。
ファイルをdatディレクトリに置いてあると、Janeが拡張子に関係なくdatファイルだとみなしてスレッドとして開こうとしてしまうので、別のディレクトリを作って保存することに。
公開版についても、そのうち修正しておこう。

http://lukewarm.s151.xrea.com/b/file/1131296346_21.png
とりあえず、アップロードしてみた。
Sleipnir2のスクリーンショット。
ウィンドウの枠が切れているのは、不要なボーダー部分をスクリーンからはみ出させて表示領域を増やしているため。
その他、執拗に無駄な領域を削減してやった。
10chm版日本語リファレンス:2006/11/08(水) 02:48:14 ID:GH2yCsBQ
http://lukewarm.s101.xrea.com/test/read.cgi/bbs/1092315284/80
です。
どこに書き込んで良いものか迷ったのでここに上げました。
勝手にaタグにname要素付けたりかなりいじってしまったので、diffも付けておきます。
1110:2006/11/08(水) 02:54:52 ID:GH2yCsBQ
あれ…失敗してますか。
もう一回試して駄目だったらテストスレか外部アップローダーで上げます。すいません。
12l ★:2006/11/09(木) 00:24:14 ID:???
・Sleipnir用GooglePageRank表示

GoogleToolBarに付いているページランク取得の奴をSleipnirから使えるようにしてみることに。
前にもページランク取得のしくみを調べようとしたことがあるが、サーバにURLと共に送信するチェックサムのようなものを求めるしくみが分からずに挫折していた。
なにやらサードパーティ製のページランククライアントがいくつかでまわっているようなので、ソースコードを探してみたら、どこかの偉い人がWWW::Google::PageRankというPerlモジュールを作成していた。
http://72.14.235.104/search?q=cache:A9LJPeSrplQJ:www.drk7.jp/MT/archives/000486.html www::google::pagerank.pm&hl=ja&ct=clnk&cd=1&lr=lang_ja

リクエストを送っている部分は簡単なのだが、チェックサムを求めるコードがやたらとややこしい。
どうやら、GoogleToolBarのプログラムをデバッガか何かで解析して、ネイティブコードをそのままPerlスクリプトに置き換えたものらしい。ご苦労なことだ。
それを更にJavaScriptに置き換えることに。
ビット演算の符号の扱いの違いとかに苦しめられたが、とりあえずオリジナルと同じ動作をするようになった。
リクエストを行う部分は適当にXMLHTTPの奴で再現した。
とりあえず、Rankがどうのというテキストが返ってきたので、一応動作しているのだろう。

次に、Sleipnirで表示しているページのランクを取得して表示したい。
とりあえず、ページを読み込むときに自動実行されるSeaHorseスクリプトにしてみる。
ページの読み込みが完了するのを待って、表示中のページのランクを取得する。
表示の方法が問題である。
とりあえずsleipnir.Statusに文字列を代入し、ステータスバーに表示させてみたが、タブバーをマウスでポイントするだけで消えてしまって役に立たない。
いちいちEchoでアウトプット欄に表示するのも鬱陶しい。
仕方ないので、ページのタイトルの先頭に付加してみる。

なにやら、ページによってはSeaHorseスクリプトが多重に呼び出されていることが明らかになる。
画像やCSSを読み込むときにもいちいち実行されるのか、IFRAMEとかが仕込まれていると多重実行されるのかは不明。プラグインのドキュメントが糞ほどの役にしか立たないのが忌々しい。
いずれにせよ、多重に実行することは避けられないようなので、既にタイトルにページランクが付加されていたら実行を中止するように。
とりあえず、タイトルにページランクが表示されるようになった。
しかし、タブにもいちいちランクが表示されるのが鬱陶しい。一覧できるのは面白いかもしれないが。

とりあえず完成したので少し使ってみたが、ページランクなんて見て何がうれしいのだろうか。
投稿ファイル名: GooglePageRank.zip
http://lukewarm.s151.xrea.com/b/file/1149783578_12.zip
サイズ: 1413
13l ★: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
14l ★:2006/11/09(木) 23:40:36 ID:???
>>12
ファイル名を*.user.jsにしなきゃならないのを忘れていて、そのままSeaHorseフォルダに入れても動かなかった。
まあいいや。
ページ読み込みごとにいちいち実行されると負荷が大きいんで、UserActionで必要なときに呼び出した方がいいかも。
15l ★: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
16l ★: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
17l ★:2006/11/10(金) 22:28:29 ID:???
・覚え書き
Sleipnirの組み込みスクリプトに用意されているsleipnirオブジェクトでは、Alertでダイアログを表示することは出来ても、確認ダイアログや入力ダイアログは表示できない。
代わりにwindow.confirm()やwindow.prompt()を使えばよい。
18l ★: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
19l ★:2007/02/13(火) 23:25:55 ID:???
某アニメに登場した落ちものパズルゲームをJavaScriptで作ってみた。
http://lukewarm.s151.xrea.com/etc/game.html

落ちてくるブロックを操作して積んでいく所までは普通の落ちものパズルだが、一定数のブロックが揃っても手動でクリックしない限り消えない。
操作するブロックが3つ続きになっていることにより、好きなときに消せるという手軽さが上手く相殺されているようだ。
マウスとキーボードを同時に操らなければならないというややこしさが良い。
消せる条件については、作中で明示されていなかったので、同じ色が4つ以上繋がっていれば消せることにした。
連鎖は、操作しているブロックが落ちて新しいものに代わるまでに複数回消すことで連鎖とみなすことにした。

とりあえず動作するところまで作ったが飽きた。
得点の計算が適当すぎる。
ブロックの外見に画像を使えるようにしようかと思ったが、画像を用意するのが面倒なんでやめた。
なんか知らんがIEでしか動作しない。
20l ★: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
244 x 320
21l ★: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
名前: E-mail:
ファイル:
0ch BBS 2005-10-08