2008年5月31日土曜日

タイニーアバターの宇宙展を見学

タイニーアバターの宇宙展を見てきました。
いままでタイニーアバターは使ったことがなかったのですが、どこかで小さな猫のアバターが飛び跳ねてるのを見てずっと気になってまして、気に入ったのがあれば購入してしまうかもとか考えながら突入。

えぇ、購入しちゃいましたよ。
4つも・・・(笑)


こちらはDonburi CraftさんのLittle Meer
あまり使う機会はなさそうですが、家が水辺にあるのでたまには使ってみてもよいかなぁと。
水中にいるときに使うようにします。


今回1番のお気に入り。
naniSLのsenkageさん作のSculpted Foxです。
スカルプテッドプリムが良い感じです。


こんなキャラクター好きなんです(笑)
OCEAN-NETさんのSkeleton Pirate
今建築中の家が船の形をした家(あくまで船ではないのですが・・・)なので、たまにはこのアバターを使おうかなと思ってます。


最後はTINY LOVEさんのBald Eagleです。
こちらも羽の一本一本まで丁寧に作りこんであってすばらしい出来!
スナップショットを見るよりも、今回のように実物がおいてあるほうが、思わず衝動買いしてしまうので危険ですね。

ほかにもすばらしい作品ばかりで、おなかいっぱいになりました。

ブラックマンがぁ!

あまりに衝撃を受けたので、勢いでエントリー



自宅にいるときに気づくと浮いてました・・・
しばらくじっとされてたのですが、Away表示もなかったしフリーズでもしてたのかな。

2008年5月27日火曜日

Crafters CUP 11を見学


うわっ、前回のエントリーから半年以上経過してる(汗)

え~かなり久々なんですが、実際SLもほったらかしの状態でした・・・
原因はリアルなお仕事なんですけどね。

5月に入ってから久しぶりに入ってみると、プレミア会員のお小遣いで10,000L$以上たまっていたりしてて、時の流れを感じる今日この頃です。
つ~か、会員料金もったいねぇ orz

ということで、リハビリを兼ねてちょいとinWorldでの生活環境を変えてみたり、何かものづくりでもしてみるべとか思ってたら、ASUKAでCrafters CUPがあるというので見てきました。

今回のテーマは「家具」ということで、実は家を建設中ってこともあって夜中に一人で座ったり、寝たり、覘いたりしてみましたが、いやぁ勉強になります。

中でも気に入ったものが2ブースほどあったので、投票してきました。以下、気に入ったブースのSSです。


シンプルなデザインのチェアですが、質感を大事に作ってあって一目ぼれ。黄色の椅子ほしいです。販売してるのかな?


これまたかなりシンプルなリゾート風チェア。実は今の家は海辺に建ててるので、自分で作る参考にさせてもらおうと思ってます。低プリムできれいにまとめられているのですが、自分的にはシンプルすぎる感じがするので、もう少しデザインを変えて作ってみようかと思ってます。

ほかにも展示があります。5月末まで開催されているようなので、お気に入りの一品を見つけに入ってみてはいかがでしょうか。

開催場所
ASUKA sim
http://slurl.com/secondlife/ASUKA/128/128/2

2007年10月19日金曜日

SLitter - 概要



SLitterとは?

SLitterとはTwitterをSecondlife内から利用するためのHUDです。同様のHUDはこのブログでも紹介したようにいくつかあるのですが、新着メッセージを受信した際に日本語が文字化けしてしまうため、SLitterは日本語環境でちゃんと使用できるものを目指しています。
Twitterとは?

Twitter, Inc.が2006年3月から提供しているサービスで、「What are you doing?」を合い言葉に、短いメッセージを発信するマイクロブログと呼ばれるものです。誰でも無料で利用でき、利用者同士が友達登録することでお互いのメッセージを交換しあえるのが特徴です。以下のページで詳しく説明されてますので、Twitterを知らない人、まだ使ったことのない人はご参照ください。

CNET Japan
新SNS「Twitter」--初心者のためのスタートガイド
SLitterの中身

SLitterはSecondlife内でアバターが操作するHUDとSecondlifeとTwitter(正確にはTwitter API)との中継ぎをするPHPスクリプト(SG:SLitter Gateway)で構成されています。本来はHUDのみでのアプリケーションを考えていましたが、LSLの制限や文字列処理の貧弱さからSGにて問題を解消する形となりました。

ID/パスワードの扱いについて

元々LSLのみでSLitterを作ろうとしたのは、TwitterのID/パスワードの管理を考えての事です。他のTwitter用HUDで見かけましたが、TwitterのID/パスワードをゲートウェイとなるサーバに保存されてしまうのは遠慮したいところ。また、ゲートウェイを用意する側(SLitterの場合は私ですが)も、他人のID/パスワードを預かることになりますので、その管理も含め、その責任の範囲はとても個人で負えるものではないと考えています。

従って、現在SGを間に挟む形となってしまいましたが、利用者のID/パスワードに関してはサーバ側で管理せず、配布するLSLスクリプト内に直接記入してもらう形としております。

なお、LSL/PHPともにソースを公開していきますので、利用に抵抗がある方はソースを変更しご自分の環境で自由にお使いください。

利用ライブラリ・参考サイト
  1. LSL
    • Makapu@BlackSheep-LSL
      Makapuさんの記事が無ければLSLを初めていなかったかもしれません。入門からリファレンスまで大変お世話になっております。
    • lslWiki Ja:Main Page
      有志の方々によって本家lslWikiの翻訳が進められています。詳細なリファレンスを参照するときはいつもお世話になっております。
  2. PHP
    • Services_Twitter
      このPEARパッケージが無ければSLitterのSGはどうなっていたことか・・・。SLitterを公開できたのはService_Twitterのおかげです。作者の悠希さんありがとうございます。
配布・連絡先

SLitterは2007/10/19現在Ver.0.1のアルファ版です。従ってSecondlifeないではベンダーなどによる配布はまだ行っておりません。今後、スクリプトやSG用のサーバなどが変更され、旧バージョンでは利用ができなくなる可能性があります。

使ってみたい方、興味をお持ちの方はSecondlife内にてAmber HermansまでIMをお送りください。こちらで確認次第、HUDをお渡しいたします。

なお、現時点では利用者数の制限は考えておりませんが、サーバ負荷などの理由により制限を行わざる状況が発生すればクローズドとします。ご了承くださいませ。

LSL convention 2007に出展します

あちこちのブログやニュースで紹介されているので知っている方が多いと思いますが、10/20から「LSL convention Japan 2007」が開催されます。内容がLSLなのでちょっと期待しつつオフィシャルサイトを見てたのですが、開発中のTwitterクライアントがとりあえずの形になったこともあって、せっかくなのでスタッフの方に問い合わせてみました。

出展の締め切り日はとうに過ぎていたのですが、なんと参加させていただけることに。

もう後には引けないので、Twitterクライアントに「SLitter」という名前を付けてブースの準備もしました。SLitterはまだアルファ版なので、お持ち帰り用のボックスは用意してません・・・すみません。


ただ、興味のある方や使ってみたい方(人柱希望?)はAmber HermansまでIMいただければHUDをお渡しします。なぜIM必須にするかというと、開発中のため、バージョンアップやサービスの一時停止などのお知らせを行う必要があるからです・・・

SecondlifeとTwitterの両方のサービスを利用している人が対象となるニッチなツールですが、興味のある方はお気軽にIMください。「SLitterくれ!」だけでOKですw

ちなみに、将来的にはフリーで配布することを考えています。というかオープンソースにしようと思ってます。その辺りの情報もこのブログでお知らせしていきますね。

さて、細かな説明用の記事も書かないとですね。

2007年9月25日火曜日

オブジェクトをHUDとして装備したとき表示される面

Twitterクライアントはぼちぼちと進めています。HUDとして装着してチャットで21チャンネルにメッセージを送るとステータスを更新、同じく21チャンネルに「chk:」とメッセージを送ると最新メッセージを1件取得して表示という形になりました。次は自動確認と新規メッセージがあった場合のみメッセージを表示という2点を実装しようと思ってます。複数メッセージの受信はちょっと考えないとなぁ・・・

とりあえず、立方体オブジェクトをHUDとして装備したとき、「いったいどこの面がどう表示されんねん!」とか思ったのでちょっと実験したメモですw。

まず面の話ですが、6面をそれぞれ色分けしたオブジェクトを準備。



このオブジェクトをHUD(Center2)に装着するとこんな感じ。



ちなみにオブジェクトのサイズはデフォルトのままなので0.5m(50cm)の立方体です。このまま画面をキャプチャしてサイズを測ると縦横373pxの正方形。

念のため、面の位置関係を確かめようとY方向に-45度、Z方向に-45度回転させてみました。



これで思った大きさのHUD作りができるかなw

2007年8月24日金曜日

Twitterクライアント for SL作成の続き

さて、これまで2つほどSecond Lifeから使えるTwitterクライアントを試してみたのですが、どれもアップデートはできるが日本語メッセージを受信すると文字化けしてしまうということで、やっぱ自分で作ってみることにしてみました。

前回作ったステータスアップデートの動作テストや2つほど試したクライアントの動作状況から考えて、lslのみでクライアントを作るのは困難な様子。
ちなみに、lslのみでステータスのアップデートは可能ですが、http_responseのbodyには「Unsupported or unknown Content-Type.」と帰ってきてしまいます。
ということでlslのみはあきらめて、間にPHPを使ったWebアプリをかますことに・・・

なぜPHPなのかは、特に深い意味はないのですが単に「Services_Twitter」というPearライブラリを使ってみたかっただけ(笑)
いや、これが簡単で便利なのですよ。

アップデートについては大体分かっているので、先にtimelineの取得をやります。
・・・できました。
もちろんα版(というよりもまだ検証段階かw)なので、フレンドのTimelineから最新メッセージ1件だけを取ってきてllOwnerSayで返すだけです。

初めはPHPからの返り値をurlencode()で処理してたのですが、これを使うと半角スペースが「+」に変換されちゃうので、lsl側での処理がめんどう。
と言うことで、Base64を使っています。この方がデータ量もちょっと少なくなりますしね。

この調子で、次は複数メッセージの取得を考えてみます。
http_responseのbodyは2048byteしか受け取れないので最大で20件分のメッセージを一気に受け取ると取りこぼれが起きちゃうので、複数回に分けて受け取るようにしようかと・・・
このとき毎回Twitterにアクセスしちゃうと1時間に70リクエストの制限に引っかかっちゃう恐れがあるので、ここも考えないといけません。メッセージをPHP側で一時保存して処理するとか。
う~ん、Services_Twitterにキャッシュ機能があるようだけど、これ使えないかなぁ。


PHPソース

<?php
//ライブラリの準備
$PATH = get_include_path();
set_include_path($PATH . PATH_SEPARATOR . ’classes/’);
require_once ’Services/Twitter.php’;
require_once ’Jsphon.php’;

//変数の準備
$user = ’TwitterのユーザID’;
$pass = ’パスワード’;

//Twitterに接続
$st =& new Services_Twitter($user, $pass);
$st->enableJsonConvert();
$a = $st->getFriendsTimeline();

//SLに値を返してやる
$str = $a[0]["user"]["name"] . "(" . $a[0]["created_at"] . ")\n" . $a[0]["text"];
echo base64_encode($str);
?>



lslソース

//変数の準備
key requestid;

default
{
  state_entry()
  {
    llOwnerSay("Touch me, I will get recent message.");
  }
  touch_start(integer tcnumber)
  {
    state download;
  }
}

state download
{
  state_entry()
  {
    requestid = llHTTPRequest("http://上のPHPにアクセスするURL",[HTTP_METHOD,"GET"],"");
  }
  http_response(key request_id, integer status, list metadata, string body)
  {
    if (request_id == requestid)
    {
      llOwnerSay(0,llBase64ToString(body));
    }
    else
    {
      llOwnerSay(0,(string)status+" error");
    }
    state default;
  }
}