2008/01/31


私が自宅で使っているPC(ノート)はそれほど良いスペックではありません。それでもやっぱりC言語のソースをコンパイルしたり、重たいスクリプトを走らせたりする事があります。そんな時、横で淡々と流れていて欲しいustream.tvがブラウザ内をデカデカを乗っ取って、しかもリソースをどんどん食っていくのはとても耐え切れなかったりします。
ただもう最近は、ブラウザを使わずustream.tvを楽しんでいます。
今日はその方法をご紹介。

映像/音声ですが、Linux版に用意されているスタンドアローン版flashplayerを使っています。ネット上にあるFLVもコマンドラインから起動して閲覧出来ます。
# gflashplayer http://www.example.com/path/to/flv/example.flv
ustream.tvでは、flashを全画面で開く「Open in larger window」というリンクがありますが、このリンクはustream.tvのFLVプレーヤへの直接リンクとなっています。ですからこれをgflashplayerで起動すれば動画が見れます。
もちろんこのflashは、コントロールパネル付属のプレーヤでしか無く、このflash自身から実際のストリームを再生していますから再生していて中断しちゃった...なんて場合は再接続ボタンを押せばうまく再生し直してくれる場合があります。
この「Open in larger window」というリンクを取得し、gflashplayerに渡して再生する以下のシェルスクリプトを私は用意しています。
#!/bin/sh

GFLASHPLAYER=/usr/bin/gflashplayer

if [ "x$1" == "x" ]; then
  echo "usage: `basename $0` [channel]"
  exit
fi

USC=`curl -s "http://ustream.tv/channel/$1" | grep 'Open in larger window' | sed -e 's!^.*<a href="/\([^"]*\)".*$!\1!'`
if [ "x$USC" == "x" ]; then
  echo "currently offline?"
  exit
fi
URL="http://ustream.tv/$USC"
echo playing $URL
$GFLASHPLAYER "$URL"
このシェルスクリプト「ustplayer」をコマンドラインから # ustplayer erogeek-con と実行しています。
twitterで、followerさんが「http://ustream.tv/channel/xxxxx 見てる」と言えば、この"channel"の後の部分、"xxxxx"を実行引数に渡します。
またchatですが、私が自宅で使っているOSはLinuxですからxchatというX Window/GTK2で動くIRCソフトウェアがインストール出来ます。ustream.tvでは「chat1.ustream.tv/6667」というIRCサーバが公開されていますから、わざわざブラウザを上げるまでもないのです。charsetを"utf-8"にさえしておけばchat出来ます。ただしustream.tvのIRCサーバはustream.tvアカウントの認証が必要になりますから、設定画面等でログインパスワードを設定しておく必要があります。

で、昨日開催された「エロギークカンファレンス」を見ていた時のキャプチャがこれ...

erogeek-con

余談ですが、xchat等PC-UNIX上でIRCソフトウェアを使われる方でお薦めしたいのがbitlbee。xinetdデーモンとしても動作するIRCサーバで、MSN,Jabber,ICQ等各種IMプロトコルを中継してくれます。Jabberを使えばGTalkとおしゃべり出来ますから、xchat一つ起動しておけばtwitterも出来るし、jaikuも出来るし、MSNチャットも出来るし余分なリソースを取られなくて嬉しい限りです。

2007/10/21 追記
ustream.tvのHTMLフォーマットが変更された模様。それにあわせシェルスクリプトを修正
#!/bin/sh

GFLASHPLAYER=/usr/bin/gflashplayer

if [ "x$1" == "x" ]; then
  echo "usage: `basename $0` [channel]"
  exit
fi

USC=`curl -s "http://ustream.tv/channel/$1" | grep 'ustream\.tv/.*\.usc' | sed -e 's!.* src=\&quot;http://ustream\.tv/\([^&]*\)&.*$!\1!'`
if [ "x$USC" == "x" ]; then
  echo "currently offline?"
  exit
fi
URL="http://ustream.tv/$USC"
echo playing $URL
$GFLASHPLAYER "$URL"
Posted at by






そう...我々がwebなのだ
Posted at by




microsummaryという言葉をご存知でしょうか。microsummaryはMozilla Groupが提案しているWebの要約表記方法の事を指し、ブラウザのブックマーク等で動的に更新されるコンテンツを生成出来る機能です。
Microsummaries - MozillaWiki
例えば、貴方が任意のWebサイト一覧を作り、そのWebサイト毎の最新サマリを日々更新したと思った場合どうするでしょうか。 Web::Scraperを使って、そのサイトの本文もしくはタイトルらしき辺りをスクレイピングするでしょうか。 もしくはmicrofomatsを使ってエントリを一覧し、その先頭を最新と信じて出力するでしょうか。

これらはコンテンツ製作者の意図とそれを二次利用する者とで事前に
  • サマリは一番最初のコンテンツのタイトルである
  • サマリは<title>タグに含まれている
  • サマリとして使用して良いサイトである(もしくはない)
  • サマリは2時間おきに更新される可能性がある
などと言った情報が交換されていない事が原因で、現状コンテンツ制作側からは何も公開していない事になります。
それを実現する機能がmicrosummaryです。

microformatsは既存のコンテンツに対するrel属性およびclass属性を定義する事で、二次利用者側に欲しいコンテンツの場所を示しています。しかしこれでは複数の情報を結合したサマリを生成したり、不要な情報を省く事が難しくなる。つまりプログラマブルでは無い。microsummaryは、link要素に指定したURLに格納されるmicrosummary定義ドキュメントに埋め込まれるXSLT(XML Stylesheet Language Transformations)をコンテンツ自身に適応する事により、microformatsよりもより柔軟なサマリを提供出来るようになっています。

まず、このサイトのHTMLを見て下さい。
<link rel="microsummary" href="http://mattn.kaoriya.net/microsummary/entry_title.xml" />
という部分に、microsummary定義ドキュメントへのパスが記述されています。
そしてそのドキュメントの中身には <?xml version="1.0" encoding="UTF-8"?>
<generator xmlns="http://www.mozilla.org/microsummaries/0.1" name="Big Sky - Entry Title">
  <template>
    <transform xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <output method="text"/>
      <template match="/">
        <value-of select="html/head/title"/>
        <text> - </text>
        <value-of select="//div[@class='xfolkentry'][1]/h3"/>
      </template>
    </transform>
  </template>
  <update interval="240"/>
  <pages>
    <include>^http://mattn\.kaoriya\.net</include>
  </pages>
</generator>
となっています。
この定義ドキュメントのpages要素を見て下さい。
pages/includeには、そのサイトでmicrosummaryを適応すべきURLパターンが記述されています。
つまりコンテンツ製作者側が、サイトページに応じてmicrosummaryを出力するかしないかを定義出来る事になります。
次にtransform要素。ここはXSLTスタイルシートと同じ構成になっている。上の例ではこのページのHTMLにある、html/head/title要素と、xfolkentryというクラス名の付いたdiv要素直下にあるh3要素を、結合しサマリとして扱うと定義しています。
もちろん、XSLTなのでもっと複雑なサマリを生成する事も出来ます。
また、update要素ではサマリの更新間隔を指定する事もでき、通常30分である更新時間を任意に指定する事も出来ます。

microsummaryは、はてなダイアリーにおいても既に導入されておりhttp://d.hatena.ne.jp/microsummary/entry_title.xmlに定義ドキュメントが格納されています。これにより、例えば「はてなスター日記」をFirefoxでブックマークすると、最新記事のタイトルがサマリーとして生成され、上の記述にもある様に240分毎(update要素)にサマリが更新されるブックマークをコンテンツ製作者側から提供する事が出来ます。
microsummary-hatenastar
利用方法では、ニュースのヘッドラインを流す事も可能です。
参考:FirefoxのブックマークツールバーでYahooヘッドラインニュースを流す方法
さらに、ライブドアリーダのフィード詳細画面では、購読者数とレートがmicrosummaryとして配信されており、動的なブックマーク(ライブタイトル)を実現出来ます。 例えば私のサイトのフィード詳細でもmicrosummaryが配信されています。以下のブックマークレットで確認出来ます。
参考:しげふみメモ:livedoor Reader購読者数のライブタイトル
この他、定義ドキュメントに記述出来る要素については
Microsummary XML grammar reference - MDC
に日本語訳化された物があるので興味のある方は参照してみて下さい。
なお、MozillaのドキュメントWikiにあるMicrosummaries - MozillaWiki Standardizationという項目では、microsummaryが記述されるlink要素はmicroformatsとして標準化されるべきだ、との文章もあります。いずれmicroformatsのDraftに入ってくるのかもしれません。

さて、このエントリを作成するにあたって、以前microsummaryの記事でご紹介したbookmarkletを改造し、microsummaryを表示するブックマークレットを作ってみました。
※IE6、Safariでは動作しません。動作確認は、FirefoxとOperaにて行っています。
bookmarlet:microsummary
表示しているドキュメントのlink要素の内、ref="microsummary"の物を検索し、定義ドキュメントをXHRで取得しXMLDOMとしてパース。その後pages/includeにURLがマッチしている事を確認した後にXSLTプロセッサでサマリを生成する。といった仕組みです。
IE6で動作しない理由は、XSLTプロセッサに渡すドキュメントエレメントはXMLである必要があり、document.documentElement.innerHTMLを渡してもパースエラーになってしまう為です。また、SafariではtransformToDocumentにdocument自身を渡すとエラーとなっています。

ちなみに、HTMLを無理やりXHTMLに変換し、MSXML2.DOMDocumentで処理するコードの残骸が入っていますがお気になさらず...

microsummaryはおそらくブラウザのブックマークに限られた話ではありません。
冒頭で述べた様に、コンテンツサマリ一覧を作成する様な二次利用者に対しても有用で、CGI等も必要とせず、かつ記事のエントリに付与されたclass属性を壊す事無くサマリを集約出来ます。おおよそGRDDLのサマリ版といった所だと認識して頂けると思います。
ただし、現状のmicrosummaryでは1つの定義ドキュメント内に1つのスタイルシートしか記述出来ず、URLパターンに応じたスタイルシートを選ばせる事が出来ない上、出力する内容も1つに限られてしまいます。
これはブックマークのサマリとして登場したmicrosummaryの性でしょうか...。

上で述べた様に、膨大なコンテンツを扱う二次利用者側からすると、microformatsで得られる情報は大きすぎ、かつコンテンツ提供者側が意図しない内容になってしまう可能性もあります。これを解決出来るmicrosummaryに、少し期待出来るのでは?と考えています。
Posted at by