• Explore Vox
  • Culture
  • Entertainment
  • Life
  • Music
  • News & Politics
  • Technology
  • Join Vox
  • Take a Tour
  • Already a Member? Sign in

SecondLife is beautiful

  • kitano’s Blog
  • Profile
  • Neighbors
  • Photos
  • More 
    • Audio
    • Videos
    • Books
    • Links
    • Collections

SecondLife x Voxのスライドショーのコード公開

  • Mar 24, 2007
  • 1 comment

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);
            }
        }

    }
}
 

1 comment Tags: secondlife

Mashup Award 2ndで"SixApart"賞を受賞!

  • Mar 21, 2007
  • Post a comment

 SecondLife×Vox - Virtual World meets Web2.0というタイトルで応募したのですが、SixApart賞を受賞しました!SixApartさん、どうもありがとうございます!

 SecondLife×Voxは、SecondLife内でWeb上のリソースを使って、写真のスライドショーと音楽のジュークボックスを楽しむことができるというサービスです。
 

SecondLife-Vox-Mashup
SecondLife-Vox-Mashup

 SecondLifeとWebのサービスをマッシュアップしたところが面白い点で、スライドショーやジュークボックスだけでなく、他にも色々と応用ができるかと思います。

 簡単な応用だと、Web上のリソースを使って、SecondLife内に広告を流し込んだりなんてことが簡単にできます。今回応募したものの他にもSecondLife×LingrやSecondLife×人口無能というマニアックなマッシュアップも作ってみたのですが、Bot系サービスも結構面白い応用ができるんじゃないかと思います。

 仮想世界とWebのサービスを組み合わせるマッシュアップは、多くの可能性を秘めているので、是非みなさんもHackしてみてください!Happy hacking with pleasure !

ちなみに、サービス提供場所は以下の場所になります。4月下旬程度まではサービスを提供する予定です。

  SecondLife x Vox


Post a comment Tags: secondlife

SecondLife×Voxのアーキテクチャ

  • Mar 17, 2007
  • Post a comment

SecondLifeではllHttpRequestでWebと話をすることができます。これを使って、SecondLifeとWebをつなげています。

実装は、

  クライアントサイド: LSL
  サーバーサイド  : Catalyst + Perl

で行うことにしました。

LSLからサーバーに対してHttpRequestを送って、サーバーではVoxの写真や音楽を取得し、XML::RSSを使って、タグから関連する画像、映像のURLを絞り込んで取得して返却します。

llHttpRequestでは結果を非同期で受け取ることができ、レスポンスが戻ってきたら画像、音楽のURLリストを順に再生するというスクリプトをLSLで書いています。

全てをLSL内で処理するのも可能といえば可能なのですが、LSLで書かれたライブラリが殆どないので、なるべくサーバーサイドで処理をしないと、開発をするのがしんどいのでこのような形になりました。また、LSLはSecondLife内でコンパイルしないといけないので開発速度が遅いというのもあって、殆どの処理はサーバーサイドで行っています。

Post a comment Tags: secondlife

SecondLifeの面白さはLSL

  • Mar 17, 2007
  • Post a comment

Second Lifeの面白さは、LSLというLindenLabのスクリプト言語をオブジェクトに与えることができる点につきます。

LSLをオブジェクトに与えることで、オブジェクトのサイズを変えたり、動かしたり、メディアを再生したりすることができます。オブジェクトを直に動かしている感じがとても面白いです。

LSLは、少し変わった言語で、言語であると同時にイベントドリブンなフレームワークでもあって、イベントと状態がプログラミングモデルの中に組み込まれています。ゲーム内でしかコンパイルできないので、開発するのが少し億劫になりますが、それでも物がグリグリ動かしたりするのはとても面白いです。

SecondLifeに興味がなくても、LSLは楽しめるんじゃないかと思います。

Post a comment Tags: secondlife

SecondLife×Vox - Virtual World meets Web2.0

  • Mar 16, 2007
  • Post a comment

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日という短い時間での作成でしたが、コンセプトは伝わるものになったのではないかと思います。結果やいかに!

Post a comment Tags: secondlife
kitano

About Me

kitano
Japan
View my profile
Software Engineer email: kitano.tk(at)gmail.com

Neighborhood

  • Nob Seki
    Nob Seki Updated: 2 hours ago
  • バートモ
    バートモ Updated: Apr 28, 2008

Explore friends, family, friends & family, or entire neighborhood.

View my neighbors

Tags

  • bernese mountain dog
  • business
  • communication
  • computer
  • computing
  • concept
  • dog
  • golden retriever
  • mountain
  • puppy
  • purebred dog
  • retriever
  • secondlife
  • sleeping

View my tags

Archives

  • March 2007 (5)
  • 2007 (5)

Subscribe

  • Subscribe to a feed of these posts
  • Powered by Vox
  • Theme designed by Lilia Ahner
  • Use this theme

Recent Comments

  • バートモ
    バートモ said:
    [いいですね]
    自分では出来ない部分なんで大変参考になり... read more
    on SecondLife x Voxのスライドショーのコード公開

Photos

  • SecondLife-Vox-Mashup
  • Dog working on laptop
  • Sweet Dreams
  • Bernese Mountain Dog

View more of my photos

Videos

  • ニュー・シネマ・パラダイス 完全オリジナル版 スペシャル・エディショ
  • シュリ
  • 恋する惑星
  • ショーシャンクの空に
  • ビューティフル・マインド
  • ライフ・イズ・ビューティフル

View more of my videos

Audio

  • Kind of Blue

View more of my audio

Books

  • ハネムーン
  • キッチン
  • 竜馬がゆく〈1〉
  • ラッキーマン
  • 東京タワー ~オカンとボクと、時々、オトン~
  • 海辺のカフカ (下)
  • 世界の終りとハードボイルド・ワンダーランド〈下〉
  • ノルウェイの森 下

View more of my books

  • Home
  • Explore
  • Tour Vox
  • Start a Vox Blog
Already a member? Sign in

Back to top

View Vox in your language: English | Español | Français | 日本語

Brought to you by Six Apart, creators of Movable Type, Vox and TypePad.
Six Apart Services: Blogs | Free Blogs | Content Management | Advertising

Vox © 2003-2008 Six Apart, Ltd. All Rights Reserved.
Help | Learn More | Terms of Service | Privacy Policy | Copyright | Advertise | Get a Free Vox Blog

Loading…

Adding this item will make it viewable to everyone who has access to the group.

Adding this post, and any items in it, will make it viewable to everyone who has access to the group.

Create a link to a person
Search all of Vox
Your Neighborhood
People on Vox

(Select up to five users maximum)

Vox Login

You've been logged out, please sign in to Vox with your email and password to complete this action.

Email:
Password:
 
Embed a Widget
Widget Title: This is optional
Widget Code: Insert outside code here to share media, slideshows, etc. Get more info
OK Cancel

We allow most HTML/CSS, <object> and <embed> code

Processing...
Processing
Message
Confirm
Error
Remove this member