カレンダー
クイック サーチカテゴリ管理最近のエントリ
|
2010年 6月 4(金曜日)ヤフオク用Greasemonkeyスクリプト IVヤフオク ユーザスクリプトの改良ヤフオク画面用ユーザスクリプトを改造しました。改造点は2点です。
ファイルはこちらyahooauctions.user.jsです。 2010年 3月 31(水曜日)YouTube仕様変更対応 再びwatch_videos 形式のURL対応YouTubeにいつの間にか仕様が追加されています。URLに"watch_videos"が付くものがそれで、例えば、<<http://www.youtube.com/watch_videos?more_url=%2F&video_ids=BOjWxqFKA4g....>>の形式です。 ところで、ソフトウェア的にもこのフォーマットには謎があります。このURLにアクセスすると、<<http://www.youtube.com/watch?v=BOjWxqFKA4g&...>>に転送(リダイレクト)されます。転送先は一見何の変哲もないいつものフォーマットのページのようなのですが、ここから取得した"fmt_url_map"を使うと、直接ダウンロードできないようなのです。取得できるビデオ識別子(watch?v=xxx)を使えばダウンロードできるのですが、実際、見比べてみますと、この2つの"fmt_url_map"は確かに違っているのですが、どう直すのが正解なのか今一不明です。 そこで、ビデオ識別子を使ってページを取得し、その中から"fmt_url_map"を取ることにしました。ビデオ識別子は、"video_ids"パラメタの最初のもののようです。しかし、このフォーマットのURLはサンプルが少ないため確証が持てなかったので、取得できなかった場合はリダイレクトページの中からビデオ識別子を捜すようにしました。 こんな感じです。 #--- YTPid from watch_videos type URL これにて、取得に失敗していたビデオが所得できるようになったと思います。
2010年 3月 16(火曜日)Type-Map作成スクリプトType-Map (var)の作成前回、ウェブページの国際化に関して書きました。結論としては、type-mapを使って、.varファイルを作成すれば良いということでした。このtype-mapファイル作成を手作業でやるのは面倒ですので、生成スクリプトmktypemap.pl.zipを作りました。 使い方は以下の通りです。 カレントディレクトリのhtmlファイルとjpgファイルに対してlvarファイルを作成します。 ここでは、"foo.php"に対して国際化されたファイルが"foo.ja.php"もしくは"foo.php.ja"の形式に対応します。 中身は以下のようなものです。 #!/usr/bin/perl なお、このコードでは、"#--- at this moment, html is a dummy to transfer to <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 2010年 3月 11(木曜日)ウェブページの国際化対応Apacheの多言語化壁紙サービス(アプリ)を国際化して、海外のサイトで配布しています。意外にも、国内よりも海外のほうで使ってくださる人が多く、サイト自体のアクセスも海外からが増えてきました。そのため、最近は少しずつ英訳を進めています。しかし、ページが増えてくると、色々と課題が出てきて手作業が増えてきましたので、システマチックな方法で対応することにしました。 ページの英訳ページを英訳するには、以下の作業を行います。
この内、テキストの翻訳は手で行うしかありませんが、2)や3)は手作業でやるのが手間になってきたのと同時にバグったりしてきました。このため、2)に関してはPHPで関数を書いて対応していたのですが、3)の対応を行うに際し、Web Server (Apache)の機能を調べてみました。 国際化の方法apacheの国際化の方法は2種類あります。いずれの方法も、閲覧者から指定された"Accept-Languages"を参照して、適切な言語のファイルを自動的に返す仕組です。
特に理由がなければ、Type-Mapの方法を使うのが良さそうです。 実際の設定foo.htmlに対して、foo.varのファイルを作成して、URLをfoo.varでアクセスさせることになります。ファイルは以下のようなものです。 URI: foo.en.php そして、国際化したページ全てのページに対して xxx.var を作成し、リンクを全て xxx.var を差すように変更します。 これでOKなのですが、実際に想定されている使い方とは少し違うようです。apacheのmanualディレクトリでType-Mapが使われているのですが、ここではindex.htmlをvarファイルにしています。動作させるためには、SetHandlerが必要になります。 <Directory "/var/www/manual"> このようにすると、外部からのURLを変更する必要がありませんので、透過的に設定することができて便利です。要するに、htmlファイルと思ってアクセスすると実体はtype-mapファイルで、その設定に従って適切なファイルが実際には返されることになります。 2010年 2月 13(土曜日)Asahi.COMのGreasemonkey scripts asahis II朝日新聞サイト向け マーキー削除 II前回、ティッカー(marquee)を取り除いたのですが、今日から仕様が変更になったようです。以前は"TopBnr"というIDでしたが、"tickerAnchor"になったようです。そのため、ユーザスクリプトを修正しました。ここ(asahis.user.js)です。 2010年 2月 1(月曜日)ヤフオクと朝日.COMのGreasemonkey scriptsAsahi.comのマーキー削除今日、朝日新聞のサイトを見ていると、上のほうにマーキーが出るようになっています。しかも、どういう実装なのかすごく重くて、文字が動く度にCPUロードが振り切れてしまっています。私はfirefoxでAdBlockを使っていますが、Asahi.comでは無料で新聞を読ませてもらっているので派手なバナー公告以外は消さないでいたのだけれど、これはいただけません。 ということで、マーキーを消すGreasemonkeyスクリプト asahis.user.js を書きました。書いてしまうとついでに、という気になってしまい、[PR]の付く公告スペースも消すことにしました。 ヤフオクのスクリプト改善asahisを作っていると、ヤフオクのスクリプトyahooauctions.user.jsでも気になっていた点も改善したくなりました。[PR]という一行公告が出ていて、以前一回非表示にするコードをスクリプトに書いていたのですが、Yahoo!側の変更により空振するようになっていたものです。こちらも修正しました。 さらに、表示スペースが倍増した、ヤフーショッピングの公告も削除することにしました。これも設定でon/offできます。 2010年 1月 7(木曜日)WIXとGUIDWIXのGUIDウィンドウズインストーラ WiXの使い方と国際化の方法でGUIDに何を入れれば良いか分らなかったのですが、ようやく分りました。GUIDGenで採番したGUIDを入れれば良いです。GUIDとGUIDgenGUIDが何か良く理解していなかったので、これはマイクロソフトが発行(管理)するユニークIDなんだろうと思っていました。こういう仕組は良くありますよね。それで、そのIDを発行するのが有料と。 でも、もっとジェネラルなものでした。人々が勝手に付けても一意性を保てるようにしたIDなのでした。wikipediaを見ると概念は分ります。作り方は、とりあえず、MS純正のGUIDGenを使えば良いようです。マイクロソフトのサイトからダウンロードできます。 それにしても、これは便利そうですね。事務的なことに関しても、今迄、IDを振るのに一々ファイルを使って管理したりしていましたが、GUIDを使って置き換えることができます。Linuxでも、uuidgenを使えば、フォーマット互換のIDを取得することができます。一意性に関してもGUIDと互換性があるのでしょう。 2009年 10月 29(木曜日)C#でアプリを再起動するC# .Net Frameworkでアプリケーションを再起動するコードC# .Net framework 3.X版でアプリケーションを再起動するコードを紹介します。Windowsのアプリではファイルのロックなどもあり、設定を変えて再起動、というケースがままあると思います。UNIXとは全く違った感じのコードになります。 photostandで設定リセットメニューを実装しました。設定する項目が多くなってしまったときに、とにかく普通に動くようにしたい、ということがあるだろうと"リセット"をメニューに入れていたのですが、実装せずにグレイアウトしてあったものです。 さて、ググると、最初に見つかったのは、System.Diagnostics.Process.Restart。しかし、ヘルプの中には見つかりません。どうやら、バーション2.Xではあったものが、既になくなっているようです。さらに調べると、以下のようなコードが見つかりました。 // Get the parameters/arguments passed to program if any .Netでは、Exit()をコールした後に、コードを書けるんですね。ということで、このままのコードで動きました。このアプリは2重起動をチェックしているのですが、テストでは特に引っかかりません。 ちなみに、UNIX/Cで書くと、以下のような感じでしょうか。 pid = fork(); 実際には2重起動のチェックを回避するために、同期するかウェイトを入れないとならないでしょう。もしかすると、上記でforkなしでexeclしてしまっても構わないような気もしますが、何かのリソース上の問題があるような気もします。 2009年 10月 24(土曜日)YouTubeの仕様変更対応 再びYouTube仕様変更10/22対応私がヤフオクにかまけている間に、YouTubeが仕様変更をしていました。夜にウェブサーバのログをなにげなく見てみたら、10/22の朝9時以降はYouTube Downloaderが全部エラーしているのに気が付きました。試しに手元でダウンロードスクリプトを走らせてみてもやっぱりエラーしますので、変更があったことは間違いないようです。 早速ビデオページをダウンロードして確認してみましたところ、"var swfArgs ="と指定されていたFlashPlayerへの引数が、"'SWF_ARGS\':"という形式で指定されるようになっていました。実際のパラメタの書式に変更はなかったようです。要するに、変数がハッシュとして保持されるように変更されていました。とりあえず、理由を知る必要もなかったので、ビデオページのパーサを変更することで対応し、ウェブサーバにもアップロードしました。無事ダウンロードできるように復活しています。 その後、落ち着いてググってみたところ、あちこちで同じようにびっくり+緊急対応しています。部外の寄生サービス者にも影響は小さくないくらいですのに、YouTubeのサービス自体を稼働中にズバっと替えられる手際の良さには感心しました。それにしても、何のために変更が必要だったのでしょうか。ビデオページをざっと斜め読みした程度では、Ajaxとかいう単語も見えましたけど。
2009年 10月 23(金曜日)ヤフオク用Greasemonkeyスクリプト IIIヤフーオークション画面をカスタマイズする〜その3Yahoo! Auction向けのGreasemonkeyユーザスクリプトに、前回のToDoを追加実装しました。今回で、出品者のブラックリスト管理、業者の商品ページ一杯に表示されるウザい公告の削除、おまけとして、Yahooからの公告("[PR]口臭がなくなります"、みたいな一行公告)を抑制します。 こちらからyahooauctions.user.jsインストールして下さい。Greasemonkeyを有効にしたfirefoxからアクセスすればインストーラ画面が出ます。削除の普通にGreasemonkeyの画面から「アンイストール」できます。設定はユーザスクリプトファイルを直接編集して下さい。ファイルは以下にあります。
できることと設定方法は以下の通りです。[true/false]は、trueで機能有効、falseで無効です。 //-- 設定パラメータ Configuration parameters of the script
ToDoさて、やり残しです。機能的には自分としては満足なのですが、実装上の限定があります。autopagerizeと一緒に使うと、2ページ目以降でブラックリストが効きません。このユーザスクリプトはGreasemonkeyのユーザスクリプトの代表選手であり、私も使っているので看過できません。原因は、autopagerizeが次ページをXMLHTTPRequestで取ってきてそのまま表示しているためと思います(未確認)。この推測が正しければ、今回のスクリプトに限らず、2ページ目以降は全てのユーザスクリプトが効いていないはずです。これを解決するためには、autopagerizeから、Greasemonkeyのスクリプトを実行しないとならないような気がします。その内、確認して対策を考えます。
2009年 10月 22(木曜日)ヤフオクで使うGreasemonkeyスクリプト IIヤフオクスクリプトの機能追加版です追加も含めての機能は以下の通りです。
ユーザスクリプトはyahooauctions.user.jsからダウンロードして下さい。GreaseMonkeyがインストールされていれば、自動的にユーザスクリプトとして認識されて、インストールされます。なお、前回のとは適応範囲が変わっていますので、古いのをお使いの場合、一旦アンインストールしてから、改めてインストールして下さい。 今のところ設定UIを作っていませんので、動作の設定はスクリプト自体を編集して行います。スクリプトは、Firefoxのユーザプロファイルディレクトリの下の、"gm_scripts/yahooauctions"にあります。インストール後に編集してしまっても支障はないようです。 //-- Configuration parameters of the script ToDoこのあと個人的に欲しいのは、出品者のブラックリストです。価格自己釣上げする自作自演業者や、送料のバックマージンで稼ぐ業者は詐欺でしかなく、表示する価値はありませんので、出品物を全て削除して見えなくしたいです。これはさっと見たところ、テーブルレイアウトの<tr>要素毎非表示にしてしまえば良いです。例ですが。 <tr BGCOLOR="#ffffff"> 上記の出品者(評価)の"yyyyxxxx"さんの名前でマッチして、<tr>...</tr>をstyle="display:none"にする。Javascriptに慣れた方であれば一瞬で書けるんでしょうけど。 それにしても、Greasemonkeyはカスタマイズできる便利さを与えてくれる素晴しいシステムです。これがインターネットエクスプローラで動かないのは本当に残念なことです。 2009年 10月 21(水曜日)Greasemonkeyスクリプト Yahoo! Auction検索ソートヤフオクの検索結果を「残り時間順」にするGreasemonkeyスクリプトヤフオクの検索結果など競り商品のリストを「残り時間が短かいもの」順にするユーザスクリプトです。Firefox + Greasemonkey上で動作します。 ささやかな楽しみとして、ヤフオクで少額商品を時々落札しています。Yahoo!AuctionのUIには不便に思うところが沢山あるのですが、その内の一つとして、検索結果など商品のリストが表示される画面で、商品が「お勧め順」にソートされていることがあります。これは、右上のプルダウンメニューでソート方法を選べるのですが、何か操作するとデフォルトの「お勧め順」に戻ってしまい面倒くさいことこの上ないです。 利用者としては、一度ソート方法を設定したら、設定を保持して欲しいところです。結局これはオプション(リスト上位に表示される業者向け有料オプション)を販売する都合でこのような仕様になっているのでしょう。しかも、ヤフオクでは業者による値段の釣上げ行為が常態化していますので、事実上、利用者にとっては「残り時間が少ないもの」以外のソート方法は意味がありません。(スタート価格を安価にしておいて締切り前になると売りたい値段まで人為的に値段が釣上げられますので、一定以上の残期間があるものの現在価格は無意味になります)。 そこで、この不便を解消するべく、Greasemonkeyを使って開発してみました。yahooauctions.user.jsです。極度に簡単な実装で、該当するページで、ソートが「残り時間が少ないもの」順になっていない場合、設定してからページを読み直しています。ヤフオクのパラメタ仕様が良く分らないのと、Greasemonkeyを使うのは初めてですので、完全ではないと思いますが、とりあえず手元では動作しています。本当は、検索ページを呼ぶリンクアンカーを加工するような実装にすればリロードをなくすことができる筈ですが、今回は動かすこと優先で一番簡単な実現方法にしました。 それにしても、このGreasemonkeyは強力なツールです。これを使えば、他者から提供されているWEBサービスを自分が好きなUIで利用できるようになる訳です。Saasのようなものもありますが、APIが開示されることが前提になりますので、全てのサイトで利用することはできません。このような方向性が進められていくと、変更を嫌う提供者は改変不能なWEBページ、例えばFlashなど、を使う割合が増えて行くような悪い予感もします。役所系のサイトでは、文書がなんでもかんでもPDFで配布されているように。
2009年 10月 17(土曜日)HTTP Refererの信頼性リファラーは信頼できるかサービスページ毎に掲示板を設置するに当り、設置したページを分別するためにリファラーを利用する実装を試みました。その実装の有効性を調査してみました。 サービスを提供していますと、ユーザの声のフィードバックを受けたくなります。不具合などもエラーログで確認できる以外にも発生しているに違いありません。このように考えて、サービスのページにQA掲示板を設置することにしました。ページに埋め込みで、軽く作りたかったため、クライアント側をAjax/Javascript、サーバ側をCGIと想定しました。 背景ネットを漁り、lebhaft Ajaxの一行掲示板というBBSソフトが想定に合致しました。利用に制限がないし素晴しいものです。しかし若干の改造が必要です。これは一つの掲示板を管理するソフトウェアですが、私の利用では、各サービス毎に掲示板を設置します。簡単にするために、インストールは1つで、コードを共有できるようにと考えました。要するに、設置したページ毎にデータベース(この掲示板ではファイル)を分けることになり、サーバではリクエスト毎に設置したページを知る必要があります。 前置きが長くなりましたが、このページを見分けを実現するために、2つの方法を考えました。
(2)はリクエスト側、CGI側の双方にパラメタの追加を行う実装になり、(1)の場合CGI側だけの追加になりクライアント側は自動で付加されますので、Ajaxのリクエストを変更する必要がありません。 ブラウザによるリファラーの対応の違いさて、(2)の実装は問題ないとして、(1)で実装する場合、リファラーは信頼できるのでしょうか、いつも送られて来るのでしょうか。PCではあまり話題に上りませんが、携帯電話などではリファラ送信不可の設定がデフォルトだったりします。また、私のブログでは画像取得時のリファラの変更なども扱ってきました。皆、平気で設定を変えているのではないでしょうか。
基本的には、インタラクティブなHTTPクライアントはデフォルト送信し、バッチなものは送信しません。インターネットエクスプローラは通常の方法ではリファラを止めることはできませんので安心です。しかし、firefoxとoperaは止められるので完全には信頼できないことが分ります。なお、バッチのwgetもaria2cもどちらも、自由にリファラを付けることができます(そもそもクライアントは何を指定すべきか分りませんので)。しかしこれらは一般的ではないので考慮しなくて良いでしょう。 結論としては、firefox (とopera)でリファラを止めている人の割合の統計データを確認できるまでは、当てにできない、ということになります。今回は、安全のために、CGIは(1)(2)の両対応とし、クライアント側はページURLを送る(2)の実装にしました。 2009年 8月 28(金曜日)YouTubeダウンローダスクリプト プレイリスト対応YouTubeダウンロードスクリプトのプレイリスト対応YouTubeにはplaylistというものができています。クリックすると、直接指定されている動画から始まり、それに続くリストが順番に自動再生されるものですが、ありがた迷惑のような気もします。ただ、YouTubeのダウンローダーページでも、プレイリストのURLを指定してエラーしている方もいらっしゃいますので、対応することにしました。 対応は2レベルに分れます。
プレイリストは8曲くらい連なっているようでダウンロードには多大な時間が掛かりますため、バッチ処理になるスクリプト(ytdownloader.pl)ではレベル2対応、ウェブサービス(YouTubeダウンローダ)ではレベル1対応を行いました。 仕様の解析プレイリストは以下のようなURL形式です。 http://www.youtube.com/view_play_list?p=3A7DF57CA0B7E08B&playnext=1&playnext_from=PL&v=n3m1P05Shy4 ページを開くと、直接ビデオが始まり、リストのビデオがその後が続きます。 次にプレイリストの続きはどうなっているでしょうか。 <div id="playlistRow_PL_23" class=" watch-playlist-row v*CGaJrUXe45A "> これがプレイリスト23番目で、赤字がビデオ識別子になります。(2箇所に指定されています)。直接指定されていたのが、このプレイリストの22番目のようで、その後は上記のブロックが順番に並んでいます。従って、これを順番に取得してやれば良いことになります。 それにしても、他の情報も同様なのですが、ページ中の情報には冗長なものがすごく多いです。なんだかきちんと設計していないんじゃないかという感じがしてしまいます。実際にはビデオストリーム(100MBにもなる)に比べれば誤差の範囲なので、性能の問題にはなりませんが。 実装完成したスクリプトはこちらにあります。"-p"オプションを指定するとプレイリストのファイルを全部取得します。 さて、最初にプレイリストをリストに格納します。上記のどちらを使っても良いのですが、上のを使います。 } elsif (m!<div\s+id=\"playlistRow.*\"\s+class=\"\s*watch-playlist-row\s+v*([^\s\"]+)\s*\">!) { 次に実際の中身を取得します。 foreach (@vplaylist) { 自分を呼び出してダウンロードします。ここでは並行してダウンロードしたかったのでforkしていますが、行儀良くシーケンシャルにやるのでしたら、systemで良いでしょう。また、waitpidしていますが必須なわけではありません。 2009年 8月 24(月曜日)YouTubeダウンローダー仕様変更〜スクリプトYouTube仕様変更に対応したダウンローダースクリプトYouTubeダウンローダの改修の記事で書いていますが、YouTubeの仕様が一斉に変更されています。提供しているダウンローダスクリプトでもこれに対応しています。仕様変更内容はこちらのページをご参照下さい。ここでは、中身について簡単に解説いたします。 YouTubeのページを読むまずはおなじみ、YouTubeのリンクに使われるページを読みます。 $ytpid = $ARGV[0]; 中身を解析します。 最初の"fullscreenUrl"が旧来の方法です。2番目のifの中にある"var swfArgs"はFlashPlayerに渡す引数で、この中の"fmt_url_map"を捜します。ここには、解像度パラメタとそのファイル取得URLがペアになっているので、ハッシュに保存します。(Dprintはデバッグ文です)。タイトルは取れれば取っておきます。 foreach (@wgetrsp) { ストリームのURLを取得します。 if ($raw =~ m|(video_id=.*)&title=|) { 次のifが新しい仕様に合わせたものです。"fmt_url_map"の中身が取得できた場合に、このメソッドで取得することにしていますが、厳密かどうかは分りません。タイトルがあれば、なるべくタイトルを生かしたファイル名にします。(pathに使えない文字を'_'にしてあります。"TypeSelect"では、なるべく高画質なビデオファイルを選択しています。 } elsif ($#vphashk >= 0) { 最後のifは使っていませんが、コードとしては残してあります。昨年後半に行われた仕様変更により、一部のビデオが対応したと言われるメソッドです。"t"パラメータ("&t=")であるトークンを取得する方法は"get_video_info"によるものと、"api2_rest"によるものの2種類あり、片方をコメントアウトしてあります。 } elsif (0) { 最後に実際のストリームを取得します。 $GetCmd = "wget $FlagQuiet -O \"$filename\" \'$url\'"; なお、ファイルの選択ですが、基本的に下記"Spriority"の順番に高画質なのですが、22は大き過ぎてダウンロードに時間が掛かる上に再生も重いので、特に希望がなければ取らないようにしています。 #--- Select the suitable type. 帯域の制御実際にダウンロードしてみると、ダウンロード開始時に500kbpsくらいのスピードで始まるのですが、30秒くらいで徐々に遅くなり始め、100kbps〜50kbpsくらいまで落ちて行きます。以前は無制御(一定のスピード)でダウンロードできていたので、帯域制御をサーバ側でするようになったと思われます。 というのも、これが問題になるのはダウンロードのときだけで、ストリーミングの場合は支障ありません。ストリーミング視聴であれば、最初にバッファをある程度一杯にしないとならないので高速で送り、バッファが満たされれば、後はビデオストリームのビットレート程度のスピードで送れば充分ということになるからです。この場合、クライアント側のブラウザは実時間(10分のビデオなら10分間)サーバに接続状態になってしまうのはサーバ負荷ともなってしまうとも考えられます。しかし、実質的にブラウザ側でバッファ充足度による伝送速度のフィードバック制御を行っていますので、殆どのクライアントは最後まで速く送ろうとしても受け取れません。このため、今回のサーバ側の帯域制御はこれで仕方ないことになります。 |
ブログ管理 |