5 posts from 3 月 2007
- January
- February
- March
- April
- May
- June
- July
- August
- September
- October
- November
- December
Mashup Awardで受賞したSecondLife x Voxのコードを公開します。
WebサービスとSecondLifeをマッシュアップする際のコードの例として参考になるのではないかと思います。ジュークボックスのほうについては殆ど同じコードなので、特に公開はしませんが、要望があれば公開します。
Webサービスとマッシュアップするときの肝は、
- llHttpRequestによるリクエストの送信
リクエストを送信した後は、サーバーサイドで他サービスへの問い合わせを行い何らかの処理をして、http_responseメソッドで受信し処理をするだけです。
SecondLifeとWebサービスをマッシュアップする場合、LSLのpoorさから殆どこのような形になるかと思います。
では、以下コードです。それでは、皆さんもSecondLifeでのHackを楽しんでみてください。
Happy Hacking with pleasure!
//----------------------------------------------
// Constants/Global variables
//----------------------------------------------
// global variables
key requestId;
list photoUrls = [];
integer currentPhoto=0;// Constants
key VIDEO_DEFAULT = "6e0f05ad-1809-4edc-df29-fae3d2a6c9b8";
float PHOTO_TIMER_PERIOD = 5.0;
string API_BASE = "http://mashup4u.net/v2r/search_photo";
string DEFAULT_TAG = "dogs";
string DEFAULT_PHOTO_URL = "http://aka-static.vox.com/.shared:v21.4:vox:en_us/themes/minimalist-grey/logo.gif";//----------------------------------------------
// Functions
//----------------------------------------------
string apiUrl(string tagName)
{
string url = API_BASE + "?tag=" + tagName;
return url;
}setUrl(string url)
{
key video_texture = llList2Key(llParcelMediaQuery( [PARCEL_MEDIA_COMMAND_TEXTURE]), 0);
if(video_texture == NULL_KEY)
{
video_texture = VIDEO_DEFAULT;
llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_TEXTURE, VIDEO_DEFAULT]);
}
llSetTexture(video_texture,ALL_SIDES);
llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_URL,url]);
llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PLAY]);
llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_AUTO_ALIGN,TRUE]);
}showPhoto(string url)
{
setUrl(url);
}startSliedShow(string tagName)
{
string apiUrl = apiUrl(llEscapeURL(tagName));
llSetText("Now showing photos tagged with " + tagName,<255,255,255>,1);
requestId = llHTTPRequest(apiUrl,[HTTP_METHOD,"GET"],"");
}stopSlideShow()
{
llSetTimerEvent(0);
initializeVariables();
showPhoto(DEFAULT_PHOTO_URL);
}initializeVariables()
{
currentPhoto=0;
photoUrls = [];
llSetText("Vox Slideshow",<255,255,255>,1);
}help()
{
llWhisper(0,"Type '/1 tag' to tell me what tag to search for on vox.");
llWhisper(0,"Touch the Vox SlideShow to stop slide show");
}//----------------------------------------------
// Main
//----------------------------------------------
default
{
state_entry()
{
llSetText("Vox SlideShow",<255,255,255>,1);
showPhoto(DEFAULT_PHOTO_URL);
llListen(1,"",NULL_KEY,"");
}
listen(integer channel, string name, key id, string message)
{
if(message == "") {
help();} else {
llSay(0,"Searching photos tagged with "+message + " ...");
initializeVariables();
startSliedShow(message);
}
}touch_start(integer nd)
{
help();
stopSlideShow();
//startSliedShow(DEFAULT_TAG);
}timer()
{
string photoUrl = llList2String(photoUrls, currentPhoto);
showPhoto(photoUrl);
currentPhoto = currentPhoto + 1;
integer photoNums = llGetListLength(photoUrls);
if(photoNums == 0) {
return;
}
if (currentPhoto > photoNums - (integer)1)
{
currentPhoto = 0;
}
// for loop
llSetTimerEvent(PHOTO_TIMER_PERIOD);
}http_response(key request_id, integer status, list metadata, string body)
{
if (request_id == requestId)
{
if(status == 200) {
photoUrls = llParseString2List(body,["|"],[]);
integer photoNums = llGetListLength(photoUrls);
if(photoNums == 0) {
llSay(0,"Found no photos. Please search with another tags.");
initializeVariables();
showPhoto(DEFAULT_PHOTO_URL);
return;
}
llSetTimerEvent(0.01);
}
}}
}
SecondLife×Vox - Virtual World meets Web2.0というタイトルで応募したのですが、SixApart賞を受賞しました!SixApartさん、どうもありがとうございます!
SecondLife×Voxは、SecondLife内でWeb上のリソースを使って、写真のスライドショーと音楽のジュークボックスを楽しむことができるというサービスです。
SecondLifeとWebのサービスをマッシュアップしたところが面白い点で、スライドショーやジュークボックスだけでなく、他にも色々と応用ができるかと思います。
簡単な応用だと、Web上のリソースを使って、SecondLife内に広告を流し込んだりなんてことが簡単にできます。今回応募したものの他にもSecondLife×LingrやSecondLife×人口無能というマニアックなマッシュアップも作ってみたのですが、Bot系サービスも結構面白い応用ができるんじゃないかと思います。
仮想世界とWebのサービスを組み合わせるマッシュアップは、多くの可能性を秘めているので、是非みなさんもHackしてみてください!Happy hacking with pleasure !
ちなみに、サービス提供場所は以下の場所になります。4月下旬程度まではサービスを提供する予定です。
SecondLifeではllHttpRequestでWebと話をすることができます。これを使って、SecondLifeとWebをつなげています。
実装は、
クライアントサイド: LSL
サーバーサイド : Catalyst + Perl
で行うことにしました。
LSLからサーバーに対してHttpRequestを送って、サーバーではVoxの写真や音楽を取得し、XML::RSSを使って、タグから関連する画像、映像のURLを絞り込んで取得して返却します。
llHttpRequestでは結果を非同期で受け取ることができ、レスポンスが戻ってきたら画像、音楽のURLリストを順に再生するというスクリプトをLSLで書いています。
全てをLSL内で処理するのも可能といえば可能なのですが、LSLで書かれたライブラリが殆どないので、なるべくサーバーサイドで処理をしないと、開発をするのがしんどいのでこのような形になりました。また、LSLはSecondLife内でコンパイルしないといけないので開発速度が遅いというのもあって、殆どの処理はサーバーサイドで行っています。
Second Lifeの面白さは、LSLというLindenLabのスクリプト言語をオブジェクトに与えることができる点につきます。
LSLをオブジェクトに与えることで、オブジェクトのサイズを変えたり、動かしたり、メディアを再生したりすることができます。オブジェクトを直に動かしている感じがとても面白いです。
LSLは、少し変わった言語で、言語であると同時にイベントドリブンなフレームワークでもあって、イベントと状態がプログラミングモデルの中に組み込まれています。ゲーム内でしかコンパイルできないので、開発するのが少し億劫になりますが、それでも物がグリグリ動かしたりするのはとても面白いです。
SecondLifeに興味がなくても、LSLは楽しめるんじゃないかと思います。
Mashup Award 2ndに、SecondLife×Vox - Virtual World meets Web2.0というタイトルで応募しました。
僕が作ったのは、仮想世界と現実世界のサービスをマッシュアップするサービスです。具体的には、SecondLife上からVoxで公開されている写真をスライドショーで表示したり、音楽をジュークボックスのように流すサービスです。タグで絞り込んだ写真や音楽を流し続けることができます。
これを作ろうと思ったきっかけは、SecondLifeで遊んでいるときに、仮想世界にはWebとは違う面白さがあることに気づいたことでした。
■ 一人 vs 複数人
Webでは基本的に一人で使うサービスが殆どで、他の人と楽しみをリアルタイムに共有しながら楽しむサービスが殆どありません。たとえば、Flikcrでスライドショーを見ることはできますし、Last.fmで音楽を聴くことはできますが、それは一人で楽しむサービスです。
ですが、SecondLifeでなら、複数人でリアルタイムにサービスを楽しむことができます。仮想世界では、リアルの世界であるような、にぎわいを共有したり、サービスを共有しながら楽しむことができるのです。そんなところに、Webにはない新しいコミュニケーションの可能性を感じたのというのが作ったきっかけの一つです。
■ コンテンツ量の差 ( Web >> SecondLife )
あともう一点は、コンテンツ量の圧倒的な差です。Web上には膨大なコンテンツがあります。一方、SecondLife内にはあまりコンテンツはありません。リソースの制約の問題もあり、SecondLife内に物を置くのは現状では現実的ではありません。であれば、Webのコンテンツを仮想世界に流し込むことで仮想世界をよりリッチな世界にできれば面白いのではないかと思いました。
このような違いがあるからこそ、Webのコンテンツと仮想世界のコンテンツをマッシュアップできたら、仮想世界をより面白くでき、かつWebでは体験できない新しいエクスペリエンスを作れるのではないかと思いました。
コンセプトは壮大ですが、さほど掛けられる時間もないので、コンセプトを伝えることだけに集中し、極力シンプルなものを作ることにしました。企画1日、実装1日という短い時間での作成でしたが、コンセプトは伝わるものになったのではないかと思います。結果やいかに!