WebScripting Archive
一昨日のWordCampでもMatt直々に紹介があったP2、自分も早速設置してみました。
おお~。素敵素敵。でも、Twitterの魅力である、TLを通じた他人とのインタラクションは一人でP2を使っているのでは得られないので(多分。P2にはFollowとかいう仕組みはないですよね?)、自分はこのP2を適用したBlogをTwitterの自分のTweetのログを収集するために使うことにしました。
利用したのはTwitter Toolsというプラグイン。自分のTwitterでのTweetを収集してサイドバーとかに表示したり、一日のTweetのサマリ記事をBlogに自動で投稿したりする機能を持った、TwitterとWordPressをつなぐ働きを持った多機能プラグインです。で、今回はこのプラグインの「Tweet毎にエントリを自動投稿する」機能を利用しています。
但し、Twitter ToolsとP2をあわせて使う上で注意点が一つ。Twitter ToolsもP2も、Services_JSONというPEARのクラスを利用するのですが、それぞれがServices_JSONを定義しようとするために衝突が起こってしまうという問題があります。そこでP2のテーマの中にある、inc/JSON.phpファイルを少し修正してやる必要があります。Services_JSONの定義を丸ごと、以下のif文で括ってやればOKです。(いかにもPHPな話ですね…。)
if (!class_exists('Services_JSON')) {
//Services_JSONの定義
}
あとはTwitter Toolsの設定で"Create a blog post from each of your tweets?"という項目をYesに設定したり必要な設定を済ませるだけです!素敵ですね。
去年はコメント逆流だった。今年は何かなと思いふと見てみると…。
これは……
ニコ動はこういったflvplayerの挙動の切り替えにいつもプレイヤーのembedタグのflashvars属性を使っているのでソースを見てみた。
<embed id="flvplayer" height="540" width="952" flashvars="v=sm6595043&videoId=sm6595043&deleted=0&mylist_counter=5941&movie_type=flv&thumbImage=http://tn-skr4.smilevideo.jp/smile?i=6595043&us=0&ad=web_pc_player_marquee&iee=1&wv_id=sm6595043&wv_title=%E3%80%90%E8%A8%9B%E3%82%8A%E5%AE%9F%E6%B3%81%E3%80%91%20%E3%83%AF%E3%83%B3%E3%83%80%E3%81%A8%E5%B7%A8%E5%83%8F%E3%80%80Vol%EF%BC%9A01&wv_code=d806da3d&wv_time=1238515393&button_threshold=0&thumbTitle=%E3%80%90%E8%A8%9B%E3%82%8A%E5%AE%9F%E6%B3%81%E3%80%91%20%E3%83%AF%E3%83%B3%E3%83%80%E3%81%A8%E5%B7%A8%E5%83%8F%E3%80%80Vol%EF%BC%9A01&thumbDescription=%E2%94%80%E2%94%80%E6%9C%80%E5%BE%8C%E3%81%AE%E4%B8%80%E6%92%83%E3%81%AF%E3%80%81%E3%81%9B%E3%81%A4%E3%81%AA%E3%81%84%E3%80%82%E3%82%82%E3%81%86%E4%B8%80%E5%BA%A6%E3%81%8D%E3%81%BF%E3%81%A8%E4%BC%9A%E3%81%86%E7%82%BA%E3%81%AB%E3%80%81%E5%83%95%E3%82%89%E3%81%AF...&weather1=%E3%81%8F%E3%82%82%E3%82%8A&conjunction=%E6%99%82%E3%80%85&weather2=%E9%9B%A8&highest_temperature=13.0&lowest_temperature=8.0&chance_of_rain=40&player_version_xml=1233560503&marqueeVersion=1238147635&theRevengeOfChar=1" allowfullscreen="true" allowscriptaccess="always" quality="high" bgcolor="#FFFFFF" name="flvplayer" style="" src="http://www.nicovideo.jp/swf/nicoplayer.swf?ts=1238491869" type="application/x-shockwave-flash"/>
flashvars属性の最後の部分に注目。
theRevengeOfChar=1
逆シャアですね、わかります。
ふとWikipedia引いてみた。
『機動戦士ガンダム 逆襲のシャア』(きどうせんし- ぎゃくしゅう-、MOBILE SUIT GUNDAM Char’s Counter Attack)は、1988年3月に松竹系で劇場公開されたガンダムシリーズのアニメ映画。宇宙世紀(UC)の2人の主人公、アムロ・レイとシャア・アズナブルの最後の対決を描いている。ファンの間では「逆シャア」や英題の頭文字を取り「CCA」などと略されることもある。
英語表記違うやん…。
hiromasaさんが開発されたWordPress Related Post for Japanese 1.50、このサイトでも導入してみました。WordPress Related Post for Japaneseは、Yahoo! Japanの形態素解析APIを利用して関連エントリを取得・表示するプラグインです。実はver1.1のころから導入はしていて、裏で走らせてはいたのですが、そのころはBlogのエントリ数自体がまだ少なく、関連エントリを表示しようにも表示するエントリがないため精度が微妙だったので、表示するためのタグは張らずに遊んでいる状態でした。
でも今なら大丈夫!しっかり関連エントリが表示されています!
原理上短いエントリの場合、どうしても精度が出ない場合もありますが、それは努めて長文エントリ書くようにする、という運用でカバーしていければと思いますw
久しぶりにWindowsでXAMPPを立ち上げてみると、Apacheは起動しているのに画面が表示されないという不可解な現象に直面。Apacheは確かに起動しているのに、http://localhost/にアクセスしてみてもページ読み込みエラーが出るという…。散々悩んだ挙句、ふとhttp://127.0.0.1/ と打ち込んでみると見事にXAMPPのスプラッシュ画面が。どうやら、localhostを解決するためのhostsファイルが書き変わっていたためのようだ(近頃の、とあるR。 » localhostが動かなくなった より)。
前は動いていたのに、何のタイミングでこんなことになったのかなぁ…?
2009-03-16追記:Windows Defenderのせいらしい。
Expression Blend and Design : "Page Cannot Be Found" Issue when Previewing via Expression Blend
WordPress2.7が出たのをきっかけに、いい加減PHPの開発環境を整えようということで、hiromasaさん御用達のEclipse PDTの導入と、WebオーサリングツールであるAptana、SubversionクライアントであるSubclipseの導入を行ってみました。
参考にしたサイトはこちら
Eclipse+pdtインストール 日本語化してPHP開発環境を作る(Xampp) – delab
基本的にこの二つのサイトの指示に従ってインストールを進められたのですが、途中、PDTの「PHPサーバーの設定」のところでつまづきました。あるはずの「このサーバーへプロジェクトを公開」の項が…ない!という問題。実行時にXAMPPのフォルダにプロジェクトをコピーしてくれるオプションだったので、これがないと書いたものを走らせることができないので困ります。
ググるとBug 216086 – Run command borked, can’t get ALL files to copyというページに行き当たりまして(via ひとり2ちゃん: Eclipse で PHP PDT)、どうやら「このサーバーへプロジェクトを公開」というオプションは、削除されてしまったみたいです。
理由は、
- デカいプロジェクトだとコピーの作業って時間食うよね
- コード書き換えたらいちいちPublishしないといけないのはめんどうだよね、ブラウザでF5キー押すだけのほうがいいよね
- プロジェクトから削除したファイルがPublish先にゴミとして残ることがあるのはマズいよね
とのこと。なるほど。そして代替策としてhttpd.confを使ってエイリアスの定義をするやり方が紹介されていました。
で、それら設定をすべて済ませて、レポジトリからチェックアウトしてきたWordPress2.7をステップ実行してみたの図。
おおー!これは凄い。そしてこれまでテキストエディタでWordPressのThemeを書いて、var_dump()を使ってデバッグをしていた自分の努力はなんだったんだ…。
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時点)けど、まぁ動作しているのが確認できる。
そして学習完了アイテム数。
これで進捗状況が一目で分かるようになった。さぁがんばれ自分。
一般に公開する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) && (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対策位しか思いつかなかったけど、大丈夫かな?
飲み会などで中断を挟みながらも、なんとか順調にこなせているe-learningサイトのiKnow。このiKnowには、学習状況を表示できるBlogパーツがある。前回紹介した時に貼り付けたあれである。
で、今日はちょっとした好奇心からその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を取得してきて最終学習日時を表示するスクリプトでも書いてみるかな。
「入門 正規表現」を買った。まだ読み始めたばかりであるが、なかなか分かりやすくて良い本である。正規表現は、これまでJScriptを処理系に、リファレンス片手に少々触ったことがあるだけなので、ここで規則をマスターしておきたい。バイト先で予告された仕事内容の一つに、正規表現を使った入力チェックをクライアントサイドとサーバーサイドの両方で行う、というのがあるので、この前買った「PHPサイバーテロの技法―攻撃と防御の実際
」とともに、勉強していこうと思う。
ニコ動の外部プレーヤーからの再生も、動画の再生数のカウンタを回すようだ。ということは、だ。外部プレーヤーに対して、読み込みと同時に自動再生させるように仕組み、それをページビューの多いページに張り付ければ、ビジターの数だけカウンタを回す工作が可能になるのではないだろうか?
と、いうことで実証コードを書いてみた。
<embed type="application/x-shockwave-flash" id="nicoplayer" src="http://www.nicovideo.jp/swf/nicoplayer.swf?ts=1206973925" flashvars="fv_autoplay=1&thumbWatch=1&playerTimestamp=1206973925&v=sm1911846&thumbTitle=&thumbDescription=&thumbImage=&thumbPostedAt=&thumbPlayKey=1207198286.xBrJUYYRHY5hUTyx6wFoEdL4La4&mylist_counter=1140&movie_type=flv&wv_id=sm1911846&thumbWidth=485&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というパラメータを付加したことで実現できた。もっとも、プレイキーが時間とともに変化するかもしれないから、実際に使うには改修する必要があるだろう。