Scripting Archive

JUL
9

SearchQueryGenerator for MarineToolbar

Published:2008-07-09 18:02:42 UTC

※SearchQueryGenerator for Lunascapeはこちら

これは何?

ウェブページ上の検索フォームからMarineToolbar用の検索クエリ文字列を生成し、MarineToolbarの検索エンジンリストに追加する機能を提供するユーティリティです。

ダウンロード

SearchQueryGeneratorforMarineToolbarSetup.zip

動作環境

win版IE6.0以上,MarineToolbarがインストールされているPC。

インストール方法

ダウンロードしたファイルを展開して、
SearchQueryGeneratorSetup.msiを実行してください。

アンインストール方法

コントロールパネルのプログラムの追加と削除から削除してください。

使用方法

1
任意の検索フォーム上で右クリックして、[Marine Toolbarに追加]を選択。

FormMakerforMarineToolbar_contextmenu

2
必要に応じてパラメータの変更を行う。
FormMakerforMarineToolbar※プロパティの説明参照

3
登録された検索エンジンは、Rootフォルダ直下に保存されます。

MarineToolbar_menu

プロパティの説明

項目 説明
タイトル MarineToolbarの名前欄に対応する項目です。
文字コード 文字コードです。値を変更する必要はありません。
メソッド 送信時のメソッドを指定します。値を変更する必要はありません。
送信先 MarineToolbarのURL欄に対応する項目です。なお、get形式の場合でも"?"以降の文字列は表示されません。
referer 送信時のrefererを指定します。デフォルトでは無効になっており、使用する場合はcheckboxから有効にしてください。
検索語代入先 検索語が代入されるテキストBoxを選択します。初期値はFormの中で先頭のTextタイプのElementになります。
検索ボタン 検索時に使用されるボタンを選択します。
例えば、Googleの場合、[Google検索][I`m feeling Lucky]と二つのボタンが定義されていますが、このように送信ボタンが複数ある場合に使用するオプションです。
エレメントの確認 エレメントの確認ボタンを押すと、選択されているコントロールの色が反転しますので、それで対応しているコントロールを判断すると良いでしょう。

 

注意点

検索が行われる前にJavascriptで前処理を行っているFormの場合、正常に検索クエリが生成できない場合があります。その際はJavaScriptの実行を一旦OFFにしてから検索クエリの生成を行うと正常に生成できる場合があります。お試しください。

更新履歴

  • 2008/07/09 SharpLab.に公開場所を移転。
  • 2007/04/01 SearchQueryGenerator for MarineToobar公開。
  • 2005/03/17 FormMaker for MarineToolbar ver2.31公開。
  • 2004/11/21 FormMaker for MarineToolbar ver2.3公開。

本気でやるならクロスプラットフォームは避けてMozillaアプリを作るべき-hogehoge

うーん、そうかな。自分もクロスブラウザスクリプティングの労に嫌気が差して、Firefoxの拡張制作に逃げ込んだ経験がある。でも逃げ込んだ先のMDCのドキュメント漁ってたら仕様変更・方針転換の痕跡がゴロゴロあって、サンプルコードとか読んでも、バージョン毎に処理分けしてたりと、クロスブラウザスクリプティングと大差ない面倒を抱え込まなきゃいけないことに気づいて萎えてしまった。

何で後方互換性という基本的なことさえ担保されないのか。

色々事情は有るのかもしれないけど、ブラウザがバージョンアップするたびに動作しなくなった拡張が死屍累々・・・、という状況を許容しているMozillaとは、とてもじゃないが付き合いきれないと自分は思った。やたらと乱発される仕様変更によって、非生産的な対応作業を、ユーザーと、拡張作者に強いるMozillaのやり方は賢いとは思えない

対照的なエピソードがMSにはある。Windowsリリース時の話だ。

スポルスキー氏は2004年にマイクロソフトの基本的な戦略について興味深いことを書いている。DOSからWindowsへ移行する時期に、バギーなアプリケーションをWindows上で走らせるためにアドホックな機能追加を行っていたと証言しているのだ(参考リンク

その具体例に驚かされる。往年のヒットゲーム「SimCity」はメモリの扱いで致命的なバグがあった。開放したメモリを、開放した直後に再び使ってしまうというバグだ。これは1度に1つのアプリケーションしか動かないシングルタスクのDOSでは問題がないが、マルチタスク環境のWindowsでは重大な問題を引き起こす。開放したメモリは、すぐに別のアプリケーションによって利用されるからだ。このためSimCityはWindows上でクラッシュを繰り返したという。SimCityのバグの原因をディスアセンブルして突き止めたマイクロソフトは、SimCityの稼働を検知したらメモリアロケータを特殊なモードで走らせるという機能追加を行った。

これは特殊な話ではなく、Windowsを新バージョンにアップデートしたときに、あらゆるアプリーションが稼働するよう同社のテストチームは非常に多くの“回避策”をWindows上に仕込んでいったという。たとえアプリーション側に問題があったとしても、それはWindowsユーザーには関係ない。ユーザーは、Windowsをアップデートしたら自分のアプリケーションが動かなくなったと考える。問題のあるアプリケーション開発者全員に修正させることができない以上、Windows側で回避策を打つ、というアプローチだ。

Webブラウザ戦争でAcidレースの局地戦が白熱 - @IT

どうだろう?今でもこのカルチャーがMSに受け継がれているかは知らない。IE8では原則に反してドラスティックな変更が入るかもしれないことがこの記事でも言われている。だから、IEを勧めたいのではない。だが、自分の知る限り、.netの世界ではライブラリの後方互換性が大きく破壊されることはこれまで起きていない。設計が良いのだろう。というわけで、Silverlightはどうだろう?Silverlightなら、プレーヤーのバージョンアップが入っても、まず間違いなく後方互換性は担保される。レンタリングするのはMS製のエンジンでしか有り得ないのでクロスエンジン互換性を気にすることもない。Silverlightなら、色々な人を悩ませてきた、色々な問題を解決してくれる…筈。

何アホ言ってたんだ自分・・・。猛省。

MAY
17

id:amachangさんによる紹介記事を読んで知ったXPathGraphを使って、自分のiKnowの学習中アイテム数と学習完了アイテム数を表示するグラフを描いてみた。木曜の1限が休講になって、ボケっとしているうちに思いついたので勢いで書いたのだが、グラフが描かれるまで待ってたのでエントリが遅くなってしまった。

さて、XPathGraphはURLで指定したデータソースに対して、1日1回XPath式を実行し、得られる数字をグラフにしてくれるというサービス。
iKnowの学習中アイテム数は、Flashで作成されたブログパーツが使用しているXMLファイルから取得できることはiKnowLastAccessTimeCheckerを書いた時に確認済。これを使えばすぐ終わるかなと考えていたのだが…、XPathGraphは困ったことに、XMLファイルを解さないらしい。XPathなのに。…XPathなのに。その訳を調べてみると、どうやらXPathGraphはXPathの処理系にHTML::TreeBuilder::XPathとかいうHTML処理用?の奴を使っているらしく、XMLでもHTMLとして処理しようとする為らしい。仕方ないのでYahoo pipesという米Yahoo!のサービスと組み合わせてみようとしたところ、今度はiKnowのXMLファイルにXML宣言が無いせいでパースエラー。/(^o^)\ナンテコッタイ

という訳で最終的にはpipeにあたるものをphpで自作。要はXMLからデータを取ってきて、HTML化すれば良いわけだから、iKnowLastAccessTimeCheckerの時と同じ要領。

<?php
function getScores($id){

    $req = 'http://www.iknow.co.jp/assets/user/' . $id . '/iknow_badge.xml';

    $iknow = @simplexml_load_file($req);
    if($iknow===false){
        echo('パースエラー');
        exit();
    }

    $studying = $iknow->history->fragment->score[0];
    $finished = $iknow->history->fragment->score[1];

    return array("studying"=>$studying, "finished"=>$finished);
}

?>

<?php
    $id = htmlspecialchars($_GET['id']);
?>

<!DOCTYPE html PUBLIC '-/W3C/DTD XHTML 1.0 Strict/EN'
    'http:/www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
<html xmlns='http:/www.w3.org/1999/xhtml' xml:lang='ja' lang='ja'>
    <head>
        <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> 
    </head>
    <body>
        <p>

<?php
    if(!empty($id) && (strpos($id,'/')===false)){
        $scores= getScores($id);
        echo('<ul>');
            echo('<li class="studying">');
                echo($scores["studying"]);
            echo('</li>');
            echo('<li class="finished">');
                echo($scores["finished"]);
            echo('</li>');
        echo('</ul>');
    }
?>

        </p>
    </body>
</html>

これをデポに設置したうえで、XPathGraphから以下のようにidをパラメータとして渡して呼び出し。

http://depot.sharplab.net/php/iknow/PipeToXPathGraph.php?id=shiroica

XPathの方はこれだけ。

//li[1]

さて、出来たグラフ。まだ二点分のデータしかない(5/17時点)けど、まぁ動作しているのが確認できる。

shiroicaのiKnow学習中アイテム数

そして学習完了アイテム数。

shiroicaのiKnow学習完了アイテム数

これで進捗状況が一目で分かるようになった。さぁがんばれ自分。

MAY
3

iKnowLastAccessTimeChecker

Published:2008-05-03 11:03:12 UTC

一般に公開するphpスクリプトとしてはWordPressのテンプレートを除き、記念すべき第一弾かな?

iKnowのBlogパーツの通信を覗いてみた」というエントリで書いたように、iKnowではBlogパーツのために、ユーザーの学習中アイテム数などをxmlファイル形式で外部に公開している。今回は、その中の最終学習日時を表示するphpスクリプトを書いてみた。

<?php
function getLastAccesseTime($id){

    $req = 'http://www.iknow.co.jp/assets/user/' . $id . '/iknow_badge.xml';

    $iknow = @simplexml_load_file($req);
    if($iknow===false){
        echo('パースエラー');
        exit();
    }

    $date = strtotime($iknow->history->fragment['date']);
    
    return $date;
}

?>

<?php
    $id = htmlspecialchars($_GET['id']);
?>

<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'
    'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='ja' lang='ja'>
    <head>
        <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> 
        <title>iKnowLastAccessTimeChecker - 
            <?php
                echo($id);
            ?>
        </title>
    </head>
    <body>
        <p>

<?php
    if(!empty($id) &amp;&amp; (strpos($id,'/')===false)){
        $accessedTime = getLastAccesseTime($id);
        echo(date('Y年m月d日 H:i:s',$accessedTime));
    }
?>

        </p>
    </body>
</html>

こんな感じ。get変数idを与えると、そのidを持つユーザーの最終アクセス日時を表示する。で、このスクリプトを早速デポにUPしてみたので、その検索窓を設置してみる。

自分のIDで試してみた例:

http://depot.sharplab.net/php/iknow/LastAccessTimeChecker.php?id=shiroica

脆弱性対策はDirectory Traversal対策位しか思いつかなかったけど、大丈夫かな?

MAY
1

飲み会などで中断を挟みながらも、なんとか順調にこなせているe-learningサイトのiKnow。このiKnowには、学習状況を表示できるBlogパーツがある。前回紹介した時に貼り付けたあれである。

image-300x181 で、今日はちょっとした好奇心からそのBlogパーツがサーバーと何を通信しているかを調べてみた。

使ったソフトはFiddler2。FiddlerはHTTP(s)トラフィックをモニタするためのツールで、ローカルプロキシとして実装されており、http://www.fiddlertool.com/fiddler/からDL可能。実行すると、自動的にアタッチされるので、左側のリストから任意のセッションを選択して内容を覗くことができる。

さて、Fiddlerで覗いてみると、それらしいリクエストとして

http://www.iknow.co.jp/assets/user/shiroica/iknow_badge.xml?time_stamp=1209570292344

というものがあった。GETメソッドでtime_stamp=1209570292344というデータが送られているが、これは名前の通り、リクエストを送信する時点でのUNIXタイムスタンプ(ミリ秒単位)のようである。但し、この値を操作しても、返ってくる結果は変わらないようであるが。(5/2追記:よく考えたらキャッシュ対策ですね)

で、そのボディの内容について。先のリクエストに対して返却されるデータは、ニコ動同様にXML形式であった。具体的には以下のように。

<iknow>
  <version>1.0</version>
  <title>iKnow! バッジ</title>
  <link>http://www.iknow.co.jp/clickback/iknow_public_badge/shiroica</link>
  <avatar>/assets/users/49q1_small.jpg</avatar>
  <language>ja</language>
  <description>iKnow! で一緒に学習しよう</description>
  <history application="iknow">
    <fragment date="Wed Apr 30 13:11:46 UTC 2008">
      <score label="学習中アイテム">706</score>
      <score label="学習完了アイテム">9</score>
    </fragment>
  </history>
</iknow>

ということは、ユーザー名から母国語、アイコンのURL、最終学習日時(UTCであることに注意)、学習中アイテム数、学習完了アイテム数がとれるようである。

アイコンのURLと、学習中アイテム数、学習完了アイテム数はBlogパーツ上でも表示されるので、通信されているとは思っていたが、最終学習日時まで通信しているとは思わなかった。最終学習日時はプロフィールページなどでも公開されていないので、予想外の珍しいデータがとれたといえる。

「見て見て、ちゃんと勉強してるんだよ!」という意図でBlogパーツを貼り付けている自分みたいなタイプの人間は、こっちのデータも表示するようにできたらなぁと思ったりする。そのうちPHPでXMLを取得してきて最終学習日時を表示するスクリプトでも書いてみるかな。

APR
11

入門 正規表現

Published:2008-04-11 23:41:33 UTC

入門 正規表現」を買った。まだ読み始めたばかりであるが、なかなか分かりやすくて良い本である。正規表現は、これまでJScriptを処理系に、リファレンス片手に少々触ったことがあるだけなので、ここで規則をマスターしておきたい。バイト先で予告された仕事内容の一つに、正規表現を使った入力チェックをクライアントサイドとサーバーサイドの両方で行う、というのがあるので、この前買った「PHPサイバーテロの技法―攻撃と防御の実際」とともに、勉強していこうと思う。

ニコ動の外部プレーヤーからの再生も、動画の再生数のカウンタを回すようだ。ということは、だ。外部プレーヤーに対して、読み込みと同時に自動再生させるように仕組み、それをページビューの多いページに張り付ければ、ビジターの数だけカウンタを回す工作が可能になるのではないだろうか?

と、いうことで実証コードを書いてみた。

<embed type="application/x-shockwave-flash" id="nicoplayer" src="http://www.nicovideo.jp/swf/nicoplayer.swf?ts=1206973925" flashvars="fv_autoplay=1&amp;thumbWatch=1&amp;playerTimestamp=1206973925&amp;v=sm1911846&amp;thumbTitle=&amp;thumbDescription=&amp;thumbImage=&amp;thumbPostedAt=&amp;thumbPlayKey=1207198286.xBrJUYYRHY5hUTyx6wFoEdL4La4&amp;mylist_counter=1140&amp;movie_type=flv&amp;wv_id=sm1911846&amp;thumbWidth=485&amp;thumbHeight=385" allowscriptaccess="always" bgcolor="#000000" quality="high" height="385" width="485">

http://adfrontica.sakura.ne.jp/lab/test.htm

どうだろう?読み込みと同時に再生が始まっただろうか?動画を張り付ける際に使うscriptが実際に吐き出すソースをFirefoxの「選択部分のソースを表示」という機能を使って取得したうえで、flashvars属性の中に、fv_autoplay=1というパラメータを付加したことで実現できた。もっとも、プレイキーが時間とともに変化するかもしれないから、実際に使うには改修する必要があるだろう。

前のBlogに載せた、ニコ動のPlayerから内部変数が読み出せる件は、合宿から帰ってきたら修正されていたが、どう修正されたかというと、

System.security.allowDomain("*");

という記述が書き換えられたようだ。allowDmainは、内部変数に対して操作を加えられるドメインを設定する機能のようだ。詳しくは以下のページを参照。

Adobe – デベロッパーセンター : Flash Player 8 のセキュリティ機能の変更点

んー、ニコ動以外にもこの記述を適切にできていないで、結果セキュリティリスクにしているWebサービスも、探せばあるかもね。