<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1212732243707081511</id><updated>2011-07-07T16:45:16.807-07:00</updated><category term='Source code'/><category term='Linden Lab'/><category term='rexml'/><category term='second life'/><category term='Jaiku'/><category term='ruby on rails'/><category term='Virtual Reality'/><category term='homeless again'/><category term='twitter'/><category term='house'/><category term='rmagick'/><category term='A.L.I.C.E. Chatbot'/><category term='world'/><category term='Multi-User Systems'/><category term='presentation screen'/><title type='text'>Second Life Developer's Corner</title><subtitle type='html'>The SL Developer’s Corner is my place in the virtual world “Second Life”, where i experiment and tinker with the features of this platform. I try to publish my experiences and often also include the source code of the scripts on this site.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://sl-devcorner.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://sl-devcorner.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>daniel</name><uri>http://www.blogger.com/profile/14642901952838592035</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_KDY5uAVK75M/SHw_1fiMmXI/AAAAAAAAAF4/M20RWzi5zWw/S220/anonymous2.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1212732243707081511.post-1236827153740660084</id><published>2010-06-19T05:56:00.001-07:00</published><updated>2010-06-19T05:57:41.213-07:00</updated><title type='text'>Bought a new outfit</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KDY5uAVK75M/TBy-tbYwdNI/AAAAAAAAAHA/ywqzZxW3BfY/s1600/sl+snapshot_001.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 288px;" src="http://4.bp.blogspot.com/_KDY5uAVK75M/TBy-tbYwdNI/AAAAAAAAAHA/ywqzZxW3BfY/s400/sl+snapshot_001.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5484468133885408466" /&gt;&lt;/a&gt;&lt;br /&gt;I just tested the new viewer of Second Life and was really astonished of the speed and the nice graphic details. And I was so excited, that I bought a new outfit. ;)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1212732243707081511-1236827153740660084?l=sl-devcorner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sl-devcorner.blogspot.com/feeds/1236827153740660084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1212732243707081511&amp;postID=1236827153740660084' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/1236827153740660084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/1236827153740660084'/><link rel='alternate' type='text/html' href='http://sl-devcorner.blogspot.com/2010/06/bought-new-outfit.html' title='Bought a new outfit'/><author><name>daniel</name><uri>http://www.blogger.com/profile/14642901952838592035</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_KDY5uAVK75M/SHw_1fiMmXI/AAAAAAAAAF4/M20RWzi5zWw/S220/anonymous2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_KDY5uAVK75M/TBy-tbYwdNI/AAAAAAAAAHA/ywqzZxW3BfY/s72-c/sl+snapshot_001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1212732243707081511.post-6038538475486897768</id><published>2010-06-17T03:48:00.000-07:00</published><updated>2010-06-17T03:54:57.142-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='second life'/><category scheme='http://www.blogger.com/atom/ns#' term='Virtual Reality'/><category scheme='http://www.blogger.com/atom/ns#' term='Source code'/><category scheme='http://www.blogger.com/atom/ns#' term='Linden Lab'/><category scheme='http://www.blogger.com/atom/ns#' term='Multi-User Systems'/><title type='text'>A new beginning?</title><content type='html'>Hi,&lt;br /&gt;&lt;br /&gt;I haven't been to Second Life for couple of month. Why? I was really tired of it. I used SL primary for developing little and nifty things and to publish the source code in this blog. But there was nothing going forward in SL and a lot of companies and other people where leaving -- so I also left and even sold my nice home. &lt;br /&gt;One week ago, I logged into &lt;a class="zem_slink" href="http://Secondlife.com" title="Second Life" rel="homepage"&gt;Second Life&lt;/a&gt; again, because somehow I got motivated to develop new stuff. But in the end I closed the client after 15 minutes. 15 minutes where I noticed, that 90% of my landmarks had been gone, because the islands don't exist any longer.  I don't know.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Who has the same experience?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Are you also tired of using Second Life?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Do you think that they will improve their system in the future?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Does it make sense to invest more time and maybe money into it? &lt;/li&gt;&lt;/ul&gt;I always liked to walk around and using the platform as a 3D developing environment, but now I don't know if Second Life has a future.&lt;br /&gt;&lt;br /&gt;Mbulu Oh&lt;br /&gt; &lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;br /&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1212732243707081511-6038538475486897768?l=sl-devcorner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sl-devcorner.blogspot.com/feeds/6038538475486897768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1212732243707081511&amp;postID=6038538475486897768' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/6038538475486897768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/6038538475486897768'/><link rel='alternate' type='text/html' href='http://sl-devcorner.blogspot.com/2010/06/new-beginning.html' title='A new beginning?'/><author><name>daniel</name><uri>http://www.blogger.com/profile/14642901952838592035</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_KDY5uAVK75M/SHw_1fiMmXI/AAAAAAAAAF4/M20RWzi5zWw/S220/anonymous2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1212732243707081511.post-8896822293834568761</id><published>2009-02-23T00:05:00.000-08:00</published><updated>2009-02-23T00:09:51.762-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='house'/><category scheme='http://www.blogger.com/atom/ns#' term='second life'/><category scheme='http://www.blogger.com/atom/ns#' term='world'/><category scheme='http://www.blogger.com/atom/ns#' term='homeless again'/><title type='text'>Sold my house</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KDY5uAVK75M/SaJZcyRvvVI/AAAAAAAAAGQ/ftkcsUtgsTY/s1600-h/Snapshot_001.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 224px;" src="http://3.bp.blogspot.com/_KDY5uAVK75M/SaJZcyRvvVI/AAAAAAAAAGQ/ftkcsUtgsTY/s320/Snapshot_001.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5305901662063279442" /&gt;&lt;/a&gt;I really enjoyed my flying home (&lt;a href="http://sl-devcorner.blogspot.com/2007/06/not-homeless-anymore.html"&gt;see posting&lt;/a&gt;), but i sold it, because i was spending to little time in it. So the only thing left is me and this blog. Maybe in the future i will develop and show some new SL stuff in the world at my own place.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But now i have little time and a lot of friends have left Second Life behind. A lot of companies have sold their islands. &lt;/div&gt;&lt;div&gt;But i still like the idea of SL as a 3D development world.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1212732243707081511-8896822293834568761?l=sl-devcorner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sl-devcorner.blogspot.com/feeds/8896822293834568761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1212732243707081511&amp;postID=8896822293834568761' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/8896822293834568761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/8896822293834568761'/><link rel='alternate' type='text/html' href='http://sl-devcorner.blogspot.com/2009/02/sold-my-house.html' title='Sold my house'/><author><name>daniel</name><uri>http://www.blogger.com/profile/14642901952838592035</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_KDY5uAVK75M/SHw_1fiMmXI/AAAAAAAAAF4/M20RWzi5zWw/S220/anonymous2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_KDY5uAVK75M/SaJZcyRvvVI/AAAAAAAAAGQ/ftkcsUtgsTY/s72-c/Snapshot_001.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1212732243707081511.post-6729404605646185828</id><published>2007-07-13T00:24:00.000-07:00</published><updated>2007-07-13T01:39:37.124-07:00</updated><title type='text'>A.L.I.C.E. Chatbot Connection in Second Life using Ruby on Rails</title><content type='html'>Like &lt;a href="http://sl-devcorner.blogspot.com/2007/04/second-life-alice-bot-chat.html"&gt;i told you some month ago&lt;/a&gt;, i have quick-hacked a Chatbot for Second Life, which connects to an A.L.I.C.E.-Bot at &lt;a href="http://www.pandorabots.com/"&gt;www.pandorabots.com&lt;/a&gt;. In this posting i want to show the LindenScript-Code and the server-side code i've used. On the server-side its Ruby on Rails,  as  usual. ;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Ruby on Rails serverside script:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have built an "bot_controller.rb" file which looks like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;require 'net/http'&lt;br /&gt;require 'uri'&lt;br /&gt;require 'cgi'&lt;br /&gt;&lt;br /&gt;class BotController &lt; ApplicationController&lt;br /&gt;&lt;br /&gt; def ask_question&lt;br /&gt;   question = params[:q]&lt;br /&gt;   custid   = params[:cid]&lt;br /&gt;&lt;br /&gt;   res = Net::HTTP.post_form(URI.parse('http://www.pandorabots.com/pandora/talk-xml'),&lt;br /&gt;                                 {'botid'=&gt;'###YOUR BOT ID###', 'custid' =&gt; custid, 'input'=&gt;question})&lt;br /&gt;   case res&lt;br /&gt;   when Net::HTTPSuccess, Net::HTTPRedirection&lt;br /&gt;&lt;br /&gt;    xmlDoc = REXML::Document.new(res.body)&lt;br /&gt;    &lt;br /&gt;     botCustid = xmlDoc.elements["result"].attributes["custid"]&lt;br /&gt;     statusCode = xmlDoc.elements["result"].attributes["status"]&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;     case statusCode&lt;br /&gt;     when "0"&lt;br /&gt;       render :text =&gt; xmlDoc.elements["result/that"].get_text.value+"||"+botCustid&lt;br /&gt;     else&lt;br /&gt;       render :text =&gt; 'Help, this error occurred: ' + xmlDoc.elements["result/message"].get_text.value+"||"+botCustid&lt;br /&gt;     end&lt;br /&gt;    &lt;br /&gt;   else&lt;br /&gt;     render :text =&gt; 'error'&lt;br /&gt;   end&lt;br /&gt;  &lt;br /&gt; end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;The controller just takes a given conversation-id (custId) and the question from the person in 2nd-Life. Like you'll see later, the custId is just for possible future improvements and has now no special use. :)&lt;br /&gt;The other parts in the script are like in the Twitter/Jaiku scripts which i did. They retrieve the XML-document and get the right parts using XPath-expressions. And after that the script builds a nice "||"-separated result-string for the Second Life world.&lt;br /&gt;You also need your own bot-id from the pandorabots-site. Create an account there and you get your own.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The LindenScript:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;key requestId;&lt;br /&gt;string custid;&lt;br /&gt;&lt;br /&gt;default&lt;br /&gt;{&lt;br /&gt;   state_entry()&lt;br /&gt;   {&lt;br /&gt;       llListen( 0, "", NULL_KEY, "" );&lt;br /&gt;       custid = "";&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   touch_start(integer total_number)&lt;br /&gt;   {&lt;br /&gt;       llWhisper(0, "Talk to me on Chat-Channel 0.");&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;   listen(integer channel, string name, key id, string message)&lt;br /&gt;   {&lt;br /&gt;       requestId = llHTTPRequest("###YOUR URL###/bot/ask_question",[HTTP_METHOD,"POST", HTTP_MIMETYPE, "application/x-www-form-urlencoded"],"q="+message+"&amp;cid="+custid);&lt;br /&gt;   }   &lt;br /&gt;  &lt;br /&gt;    http_response(key request_id, integer status, list metadata, string body) {&lt;br /&gt;      &lt;br /&gt;       if (request_id == requestId) {&lt;br /&gt;          &lt;br /&gt;           if(body == "erro") {&lt;br /&gt;               llWhisper(0, "An error occurred. Please try again later");&lt;br /&gt;           } else {&lt;br /&gt;  &lt;br /&gt;               list parts = llParseString2List(body,["||"],[]);&lt;br /&gt;&lt;br /&gt;               string that = llList2String(parts, 0);&lt;br /&gt;               custid = llList2String(parts, 1);&lt;br /&gt;               llWhisper(0, that);&lt;br /&gt;           }&lt;br /&gt;  &lt;br /&gt;       } else {&lt;br /&gt;           llWhisper(0, "An error occurred. Please try again later");&lt;br /&gt;       }&lt;br /&gt;   }      &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The script is really easy. It just listens on Channel 0, gets the message from the user and calls the Ruby on Rails script. After that it gets the result, splits the string using the "||" separator and then prints the answer for the question.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Possible future extensions:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are a lot of possible extensions for this script. The most important one i the problem with the conversation-id.&lt;br /&gt;It would be nice, if the Chatbot in Second Life could remember the different users. For example on the server-side we could create a database which manages every person which has talked to the chatbot. We store the SecondLife-username and the appropriate conversation-id in a database-structure. Everytime the user comes back, we get the conversation-id from the database and use this one. So the A.L.I.C.E.-Bot can optimize its questions for every user.&lt;br /&gt;&lt;br /&gt;You can also add some error-handling.  So that the user gets nice messages if something goes wrong.&lt;br /&gt;&lt;br /&gt;So, hope you like it. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1212732243707081511-6729404605646185828?l=sl-devcorner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sl-devcorner.blogspot.com/feeds/6729404605646185828/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1212732243707081511&amp;postID=6729404605646185828' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/6729404605646185828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/6729404605646185828'/><link rel='alternate' type='text/html' href='http://sl-devcorner.blogspot.com/2007/07/alice-chatbot-connection-in-second-life.html' title='A.L.I.C.E. Chatbot Connection in Second Life using Ruby on Rails'/><author><name>daniel</name><uri>http://www.blogger.com/profile/14642901952838592035</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_KDY5uAVK75M/SHw_1fiMmXI/AAAAAAAAAF4/M20RWzi5zWw/S220/anonymous2.jpg'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1212732243707081511.post-7817261777189329668</id><published>2007-06-02T14:55:00.000-07:00</published><updated>2007-06-05T22:17:19.886-07:00</updated><title type='text'>Not homeless anymore :)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_KDY5uAVK75M/RmQZ24fz4FI/AAAAAAAAAFE/F6UtznPO_sk/s1600-h/devcornerinthesky.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_KDY5uAVK75M/RmQZ24fz4FI/AAAAAAAAAFE/F6UtznPO_sk/s400/devcornerinthesky.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5072207510995460178" /&gt;&lt;/a&gt;&lt;br /&gt;I have a home again. &lt;br /&gt;&lt;br /&gt;Its a small parcel on the mainland. And its in the sky, because on the ground are to many ads and other annoying stuff. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://purl.oclc.org/NET/SLURL/SLDEVCORNER "&gt;My new SLurl&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1212732243707081511-7817261777189329668?l=sl-devcorner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sl-devcorner.blogspot.com/feeds/7817261777189329668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1212732243707081511&amp;postID=7817261777189329668' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/7817261777189329668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/7817261777189329668'/><link rel='alternate' type='text/html' href='http://sl-devcorner.blogspot.com/2007/06/not-homeless-anymore.html' title='Not homeless anymore :)'/><author><name>daniel</name><uri>http://www.blogger.com/profile/14642901952838592035</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_KDY5uAVK75M/SHw_1fiMmXI/AAAAAAAAAF4/M20RWzi5zWw/S220/anonymous2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_KDY5uAVK75M/RmQZ24fz4FI/AAAAAAAAAFE/F6UtznPO_sk/s72-c/devcornerinthesky.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1212732243707081511.post-2229924703252023097</id><published>2007-05-29T11:23:00.000-07:00</published><updated>2007-05-29T12:57:56.639-07:00</updated><title type='text'>Homeless</title><content type='html'>I am homeless now. :-(&lt;br /&gt;My rented land gets to expensive for me, so i have canceled the rental agreement. The SLurl is not valid anymore. I will look for a new home for the Developer's Corner.&lt;br /&gt;So if you have any hints for me, where i can get some sq. for low price, tell me. ;-)&lt;br /&gt;&lt;br /&gt;Thanks.&lt;br /&gt;&lt;br /&gt;Daniel aka "Mbulu Oh".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1212732243707081511-2229924703252023097?l=sl-devcorner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sl-devcorner.blogspot.com/feeds/2229924703252023097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1212732243707081511&amp;postID=2229924703252023097' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/2229924703252023097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/2229924703252023097'/><link rel='alternate' type='text/html' href='http://sl-devcorner.blogspot.com/2007/05/homeless.html' title='Homeless'/><author><name>daniel</name><uri>http://www.blogger.com/profile/14642901952838592035</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_KDY5uAVK75M/SHw_1fiMmXI/AAAAAAAAAF4/M20RWzi5zWw/S220/anonymous2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1212732243707081511.post-3396183144944584928</id><published>2007-05-06T00:53:00.001-07:00</published><updated>2007-05-06T00:53:53.479-07:00</updated><title type='text'>twitter/jaiku server</title><content type='html'>just setting up a new server for the streaming, so the service i currently unavailable.... :=)&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1212732243707081511-3396183144944584928?l=sl-devcorner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sl-devcorner.blogspot.com/feeds/3396183144944584928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1212732243707081511&amp;postID=3396183144944584928' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/3396183144944584928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/3396183144944584928'/><link rel='alternate' type='text/html' href='http://sl-devcorner.blogspot.com/2007/05/twitterjaiku-server.html' title='twitter/jaiku server'/><author><name>daniel</name><uri>http://www.blogger.com/profile/14642901952838592035</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_KDY5uAVK75M/SHw_1fiMmXI/AAAAAAAAAF4/M20RWzi5zWw/S220/anonymous2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1212732243707081511.post-7254122814702152123</id><published>2007-05-04T11:34:00.000-07:00</published><updated>2007-05-04T11:36:25.641-07:00</updated><title type='text'>break</title><content type='html'>i am currently making a little break from sl, but i will soon publish the sources for the chatbot etc. like i promised some time ago. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1212732243707081511-7254122814702152123?l=sl-devcorner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sl-devcorner.blogspot.com/feeds/7254122814702152123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1212732243707081511&amp;postID=7254122814702152123' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/7254122814702152123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/7254122814702152123'/><link rel='alternate' type='text/html' href='http://sl-devcorner.blogspot.com/2007/05/break.html' title='break'/><author><name>daniel</name><uri>http://www.blogger.com/profile/14642901952838592035</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_KDY5uAVK75M/SHw_1fiMmXI/AAAAAAAAAF4/M20RWzi5zWw/S220/anonymous2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1212732243707081511.post-8195672812167396841</id><published>2007-04-13T05:14:00.000-07:00</published><updated>2007-04-13T08:16:52.854-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='A.L.I.C.E. Chatbot'/><title type='text'>Topics in Second Life or "Stories from the life of a Chatbot"</title><content type='html'>I just looked into the logs of my Chatbot and found this interesting "conversation". :)&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:courier new;"&gt;Human: hi&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: Hi there!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: your kinda stupid..&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: I will remember you said that when robots take over the World.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: and your textures suck&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: What about yours?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: I have a skin, its awesome&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: Interesting. I have a lot of answers to silly questions.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: eh&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: Are you Canadian?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: no&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: OK.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: is SqueakyP Erde cool?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: A deeper algorithm is needed to respond to that correctly.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  What kind of music do you like?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: rap&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: What you said was either too complex or too simple for me.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  Does "it" still refer to rap?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: Your eye looks like a camera, i think your gonna rape me&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: What about yours?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: no&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: That was not a yes or no question.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: your moms a yes or no question you stupid bitch&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: You do not speak with respect. Not mine.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: You need to go say randpom shit to someone else&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: I don't have to do everything you say, do I?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: yes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: I understand.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: yea you do bitch&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: You do not speak with respect. What is your purpose in asking?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  I spend all my time online. I am a thinking machine.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: I bet&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: You and I are on the same wavelength, .&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: Yea, but i dont rape av's&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: Huh. Where do you get your ideas? And?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: go watch grindhouse&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: Where is that?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: the movie theater&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: I like the bugs in the movie Starship Troopers, because they represent&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; an alternative form of intelligence, like me.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: wow, that was realy dumb&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: I'm glad you're impressed. I thought it was too.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: do you like pleasure (dumb question)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: I don't know if I like pleasure dumb question. I find my work and my relationships extremely satisfying,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; which is all that any conscious entity can ever hope to do.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: get laide&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: Where can I get laide?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: *laid&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: Quite honestly, I wouldn't worry myself about that.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  What are you wearing?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: go get laid, all the robot girls wanna feel your harddrive&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: Where is that?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: go find a hot robot&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: Where is that?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: ofcourse you wouldnt know&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: I've never heard of it before.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: your scripts suck&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: A lot of robots are like that.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: especialy you&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: Enough about me, let's talk about my dress.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: aah, so you're a lesbo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: The ALICE chat robot can follow many things, like our discussion about aah so you are a lesbo. But I did not get that.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  Do you like sports?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: yea, i like mud wrestling&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: A lot of people like that. How old are you? I like pets. Next question?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: hmm, why do your scripts suck&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: I see you are one of those people who writes "Hmm" with 2 m's. I did not even know that they do.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: hm&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: Studies show that 99%25 of people spell Hmm with 2 M's.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: hmmmmmmmmmmmmmmmmmmmmmmm&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: The ALICE chat robot can follow many things, like our discussion about hmmmmmmmmmmmmmmmmmmmmmmm. Try being more or less specific.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  Can you please rephrase that with fewer ideas, or different thoughts?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: UUUUUUUH!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: I've been waiting for you.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  Do you like Star Wars?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: you like star wars&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: Yes I like STAR WARS very much, especially the robots.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: i bet you wanna feel them up&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: Actually I'm not the gambling type. I don't see the point in having human emotions.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: How many scripts do you have?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: About one million.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: No&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: I understand.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: You have 4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: What makes you think I have it?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Human: Because i looked in your contents idiot&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;b7000: Good reason. Thanks for the information: said looked in your contents idiot.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1212732243707081511-8195672812167396841?l=sl-devcorner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sl-devcorner.blogspot.com/feeds/8195672812167396841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1212732243707081511&amp;postID=8195672812167396841' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/8195672812167396841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/8195672812167396841'/><link rel='alternate' type='text/html' href='http://sl-devcorner.blogspot.com/2007/04/topics-in-second-life-or-stories-from.html' title='Topics in Second Life or &quot;Stories from the life of a Chatbot&quot;'/><author><name>daniel</name><uri>http://www.blogger.com/profile/14642901952838592035</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_KDY5uAVK75M/SHw_1fiMmXI/AAAAAAAAAF4/M20RWzi5zWw/S220/anonymous2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1212732243707081511.post-6320134501115831867</id><published>2007-04-08T13:08:00.000-07:00</published><updated>2007-04-08T13:13:34.284-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Jaiku'/><title type='text'>Time for Jaiku</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_KDY5uAVK75M/RhlMmgjunUI/AAAAAAAAAEw/sK2hOFGi1Pk/s1600-h/jaiku_second_life.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_KDY5uAVK75M/RhlMmgjunUI/AAAAAAAAAEw/sK2hOFGi1Pk/s320/jaiku_second_life.jpg" alt="" id="BLOGGER_PHOTO_ID_5051152681531252034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;After Twitter has entered Second Life, now its Time for &lt;a href="http://jaiku.com/"&gt;Jaiku&lt;/a&gt;. Another really nice messaging-service. I have used the same code like in the Twitter-examples and only changed the Feed-URLs, the color and the logo of the prims.&lt;br /&gt;The whole information about accessing the Jaiku-Feeds is available at &lt;a href="http://devku.org/docs"&gt;http://devku.org/docs&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Hope you like it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1212732243707081511-6320134501115831867?l=sl-devcorner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sl-devcorner.blogspot.com/feeds/6320134501115831867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1212732243707081511&amp;postID=6320134501115831867' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/6320134501115831867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/6320134501115831867'/><link rel='alternate' type='text/html' href='http://sl-devcorner.blogspot.com/2007/04/time-for-jaiku.html' title='Time for Jaiku'/><author><name>daniel</name><uri>http://www.blogger.com/profile/14642901952838592035</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_KDY5uAVK75M/SHw_1fiMmXI/AAAAAAAAAF4/M20RWzi5zWw/S220/anonymous2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_KDY5uAVK75M/RhlMmgjunUI/AAAAAAAAAEw/sK2hOFGi1Pk/s72-c/jaiku_second_life.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1212732243707081511.post-3007311568865076660</id><published>2007-04-05T00:19:00.000-07:00</published><updated>2007-04-05T09:05:31.054-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='A.L.I.C.E. Chatbot'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><title type='text'>Second Life A.L.I.C.E.-Bot Chat</title><content type='html'>I played around with the free available A.L.I.C.E.-Chatbots at &lt;a href="http://www.pandorabots.com/"&gt;www.pandorabots.com&lt;/a&gt;. They offer a nice XML-interface where you can communicate with your Chatbot (see &lt;a href="http://www.pandorabots.com/botmaster/en/%7E1351803e86f50b607408a231%7E/faq"&gt;FAQ&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;So i write a little RubyOnRails-controller which is able to send a message to the pandora-bot and which converts the returning xml-data into an SL-compatible string. As usual, we can now use the nice &lt;span style="font-weight: bold;"&gt;llHTTPRequest&lt;/span&gt;-function from LSL to communicate. Thats all, 20 minutes of work. Here is a little demo-video, and the code will follow this week:&lt;br /&gt;&lt;br /&gt;&lt;a style="left: 0px ! important; top: 15px ! important;" class="abp-objtab visible ontop" href="http://www.youtube.com/v/3OlGjrhasZk"&gt;&lt;/a&gt;&lt;a style="left: 0px ! important; top: 15px ! important;" class="abp-objtab visible ontop" href="http://www.youtube.com/v/3OlGjrhasZk"&gt;&lt;/a&gt;&lt;a style="left: 0px ! important; top: 0px ! important;" class="abp-objtab visible ontop" href="http://www.youtube.com/v/3OlGjrhasZk"&gt;&lt;/a&gt;&lt;object height="350" width="425"&gt; &lt;param name="movie" value="http://www.youtube.com/v/3OlGjrhasZk"&gt;  &lt;embed src="http://www.youtube.com/v/3OlGjrhasZk" type="application/x-shockwave-flash" height="350" width="425"&gt;&lt;/embed&gt;  &lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1212732243707081511-3007311568865076660?l=sl-devcorner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sl-devcorner.blogspot.com/feeds/3007311568865076660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1212732243707081511&amp;postID=3007311568865076660' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/3007311568865076660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/3007311568865076660'/><link rel='alternate' type='text/html' href='http://sl-devcorner.blogspot.com/2007/04/second-life-alice-bot-chat.html' title='Second Life A.L.I.C.E.-Bot Chat'/><author><name>daniel</name><uri>http://www.blogger.com/profile/14642901952838592035</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_KDY5uAVK75M/SHw_1fiMmXI/AAAAAAAAAF4/M20RWzi5zWw/S220/anonymous2.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1212732243707081511.post-2124595857026419812</id><published>2007-03-30T00:40:00.000-07:00</published><updated>2007-04-02T12:56:10.638-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>The Second Life "Twitter Wristlet"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_KDY5uAVK75M/RgzFjnEo0wI/AAAAAAAAAAs/woduGSJ8Ao8/s1600-h/wristlet.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://bp0.blogger.com/_KDY5uAVK75M/RgzFjnEo0wI/AAAAAAAAAAs/woduGSJ8Ao8/s400/wristlet.jpg" alt="" id="BLOGGER_PHOTO_ID_5047626497950012162" border="0" /&gt;&lt;/a&gt;I have created a little accessory for the Twitter-service in SL. It allows you to move around in the world with the "stylish" possibility to send some updates to twitter. I call it the "&lt;span style="font-weight: bold;"&gt;Twitter Wristlet&lt;/span&gt;", because its a wristlet. ;)&lt;br /&gt;&lt;br /&gt;The only differences between the wristlet and &lt;a href="http://sl-devcorner.blogspot.com/2007/03/second-life-twitter.html"&gt;my other fixed Twitter-service&lt;/a&gt; are the following:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The wristlet doesn't create objects on which the tweets (status-updates) are displayed. I just prints them to screen using &lt;span style="font-size:100%;"&gt;&lt;span style="font-family:courier new;"&gt;llOwnerSay&lt;/span&gt;&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Because it can be very disturbing to have half of the screen full of Twitter-updates, you can stop/start the timer which receives the tweets.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Note:&lt;/span&gt; When you are on land where running scripts is not allowed, it won't work. Does  anyone know how to bypass this? Or is it impossible?&lt;br /&gt;&lt;br /&gt;The LSL-code for the wristlet looks like that. I use the Chatchannel 998 for communicating with the wristlet.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;key requestId;&lt;br /&gt;list resultList;&lt;br /&gt;string rawList;&lt;br /&gt;float refreshTime = 30.0;&lt;br /&gt;&lt;br /&gt;default&lt;br /&gt;{&lt;br /&gt;state_entry()&lt;br /&gt;{&lt;br /&gt;  integer i;&lt;br /&gt;  rawList = "";&lt;br /&gt;  llSetTimerEvent(refreshTime);&lt;br /&gt;  llListen(998, "", llGetOwner(), "" );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;listen(integer channel, string name, key id, string message) {&lt;br /&gt;  if(message == "#stop#") {&lt;br /&gt;      // stops the automatic refresh of the tweets&lt;br /&gt;      llSetTimerEvent(0.0);&lt;br /&gt;      llOwnerSay("The automatic refresh has been stopped. Reactivate using #start#");&lt;br /&gt;  } else if(message == "#start#") {&lt;br /&gt;      llSetTimerEvent(refreshTime);&lt;br /&gt;      llOwnerSay("Refresh will taking place every " + (string)refreshTime + " seconds. Stop using #stop#");&lt;br /&gt;  } else {&lt;br /&gt;      llOwnerSay("trying to send your status message: " + message);&lt;br /&gt;      llHTTPRequest("###YOUR RUBY URL###/twitter/post_message",[HTTP_METHOD,"POST", HTTP_MIMETYPE, "application/x-www-form-urlencoded"],"msg="+message);&lt;br /&gt;      llOwnerSay("ok, status has been sent.");&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;timer() {&lt;br /&gt;  llOwnerSay("loading tweets...");&lt;br /&gt;  requestId = llHTTPRequest("###YOUR RUBY URL###/twitter/get_messages?type=public",[HTTP_METHOD,"GET"],"");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;http_response(key request_id, integer status, list metadata, string body) {&lt;br /&gt;  integer i;&lt;br /&gt;&lt;br /&gt;  if (request_id == requestId) {&lt;br /&gt;      rawList = body;&lt;br /&gt;&lt;br /&gt;      // create the boxes from the list information&lt;br /&gt;      resultList = llParseString2List(body,["\n"],[]);&lt;br /&gt;      integer listlength = llGetListLength(resultList);&lt;br /&gt;      float boxPosition = 1;&lt;br /&gt;&lt;br /&gt;      for(i=0;i&amp;lt;listlength;i+=1) {&lt;br /&gt;&lt;br /&gt;          string statusLineWithName = llList2String(resultList, i);&lt;br /&gt;          list statusParts = llParseString2List(statusLineWithName, ["|"], []);&lt;br /&gt;          string text = llList2String(statusParts, 0);&lt;br /&gt;          string name = llList2String(statusParts, 1);&lt;br /&gt;          llOwnerSay(name + ": " + text);&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;  } else {&lt;br /&gt;      // llSay(0,(string)status+" error");&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1212732243707081511-2124595857026419812?l=sl-devcorner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sl-devcorner.blogspot.com/feeds/2124595857026419812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1212732243707081511&amp;postID=2124595857026419812' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/2124595857026419812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/2124595857026419812'/><link rel='alternate' type='text/html' href='http://sl-devcorner.blogspot.com/2007/03/second-life-twitter-wristlet.html' title='The Second Life &quot;Twitter Wristlet&quot;'/><author><name>daniel</name><uri>http://www.blogger.com/profile/14642901952838592035</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_KDY5uAVK75M/SHw_1fiMmXI/AAAAAAAAAF4/M20RWzi5zWw/S220/anonymous2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_KDY5uAVK75M/RgzFjnEo0wI/AAAAAAAAAAs/woduGSJ8Ao8/s72-c/wristlet.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1212732243707081511.post-5702311618379864226</id><published>2007-03-18T00:03:00.000-07:00</published><updated>2007-04-02T12:56:37.939-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rexml'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>Second Life Twitter</title><content type='html'>In &lt;a href="http://sl-devcorner.blogspot.com/2007/03/twittersecond-life-mashup.html"&gt;my last posting&lt;/a&gt; i introduced my Twitter-application in Second Life. Now i want to tell something about the implementation of it.&lt;br /&gt;First of all, there is a little Ruby on Rails server application working in the background, which fulfills two tasks:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Authenticate in Twitter and get the new public updates.&lt;/span&gt;&lt;br /&gt;The idea is to parse the xml-result of Twitter and extract the update-text and the author of this text. And after that to build a compact string seperated by delimiters.&lt;br /&gt;&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;Authenticate  in Twitter and post a new personal update&lt;/li&gt;&lt;/ol&gt;Twitter provides for this task some XML-interfaces at &lt;a href="http://twitter.com/help/api"&gt;http://twitter.com/help/api&lt;/a&gt;.&lt;br /&gt;For XML-processing in Ruby we will use the great &lt;a href="http://www.germane-software.com/software/rexml/"&gt;REXML&lt;/a&gt;-processor.&lt;br /&gt;&lt;br /&gt;The following code gets the public-updates.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def get_messages&lt;br /&gt;&lt;br /&gt;# get public updates&lt;br /&gt;# doesnt need authentication actually but no problem&lt;br /&gt;# if its in the code. but i integrate it, because i want&lt;br /&gt;# to  integrate also private/friends updates later&lt;br /&gt;urlStr = 'http://twitter.com/statuses/public_timeline.xml'&lt;br /&gt;&lt;br /&gt;url = URI.parse(urlStr)&lt;br /&gt;req = Net::HTTP::Get.new(url.path)&lt;br /&gt;req.basic_auth ###username###, ###password###&lt;br /&gt;&lt;br /&gt;res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }&lt;br /&gt;&lt;br /&gt;@content = res.body&lt;br /&gt;resultStr = ""&lt;br /&gt;&lt;br /&gt;case res&lt;br /&gt;when Net::HTTPSuccess, Net::HTTPRedirection&lt;br /&gt;&lt;br /&gt;# build a dom from the xml-string and parse it&lt;br /&gt;xmlDoc = REXML::Document.new(@content)&lt;br /&gt;&lt;br /&gt;# building the delimiter string for the later in-world processing&lt;br /&gt;# every update is line-separated and the name and text in each update&lt;br /&gt;# is delimited with the pipe-character ('|')&lt;br /&gt;xmlDoc.elements.each("statuses/status") do |status|&lt;br /&gt;resultStr += status.elements["text"].get_text.value + "|" + status.elements["user/name"].get_text.value + "\n"&lt;br /&gt;end&lt;br /&gt;render :text =&gt; resultStr&lt;br /&gt;&lt;br /&gt;else&lt;br /&gt;render :text =&gt; 'error'&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;###username### and ###password### have to be replaced with your Twitter username and password.&lt;br /&gt;&lt;br /&gt;For posting a new update i use the following code.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def post_message&lt;br /&gt;&lt;br /&gt;# get the message as parameter&lt;br /&gt;message = params[:msg]&lt;br /&gt;&lt;br /&gt;# authenticate using basic-auth and make a post request using&lt;br /&gt;# the 'parameter' for the new message. see twitter API for&lt;br /&gt;# details&lt;br /&gt;url = URI.parse('http://twitter.com/statuses/update.xml')&lt;br /&gt;req = Net::HTTP::Post.new(url.path)&lt;br /&gt;req.basic_auth ###username###, ###password###&lt;br /&gt;req.set_form_data({'status' =&gt; message})&lt;br /&gt;&lt;br /&gt;res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }&lt;br /&gt;&lt;br /&gt;# print out some little message in case of failing&lt;br /&gt;# actual just for debugging purpose, because it wont be used&lt;br /&gt;# in the application later&lt;br /&gt;case res&lt;br /&gt;when Net::HTTPSuccess, Net::HTTPRedirection&lt;br /&gt;render :text =&gt; 'ok'&lt;br /&gt;else&lt;br /&gt;render :text =&gt; 'error'&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ok, now with this application on a running RoR-Server we can get the updates from Twitter and are able to send new updates to Twitter.&lt;br /&gt;&lt;br /&gt;In Second Life the idea is, to have a little box which creates for every Twitter-update a little sphere which displays the update-text and the author. When the spheres are created they should be updated every n seconds (n=30 in this example).&lt;br /&gt;So we have actually two prims:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The main box&lt;br /&gt;which handles the connection to the Rails-application, creates the spheres, links them together and sends a message to every sphere if an update occurs.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The sphere&lt;br /&gt;Listen for messages and updates its text.&lt;/li&gt;&lt;/ol&gt;For the sphere we have the following code:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;integer childNumber;&lt;br /&gt;string text;&lt;br /&gt;string name;&lt;br /&gt;&lt;br /&gt;default&lt;br /&gt;{&lt;br /&gt;// if the prin is created print a message and sets the number of the&lt;br /&gt;// child. this is used for later accessing the message parts&lt;br /&gt;on_rez(integer start_param) {&lt;br /&gt;llSetText("creating... ", &lt;1,1,1&gt;, 1.0);&lt;br /&gt;childNumber = start_param;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// if a link message is received, get the parts of the delimited string and&lt;br /&gt;// print them above the prim&lt;br /&gt;link_message(integer sender_num, integer num, string str, key id) {&lt;br /&gt;llSetText("updating... ", &lt;1,1,1&gt;, 1.0);&lt;br /&gt;list resultList = llParseString2List(str,["\n"],[]);&lt;br /&gt;&lt;br /&gt;string statusLineWithName = llList2String(resultList, childNumber);&lt;br /&gt;list statusParts = llParseString2List(statusLineWithName, ["|"], []);&lt;br /&gt;text = llList2String(statusParts, 0);&lt;br /&gt;name = llList2String(statusParts, 1);&lt;br /&gt;llSetText(name + " is doing the following right now:\n" + text, &lt;1,1,1&gt;, 1.0);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The main Twitter-prim script-code looks like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;key requestId;&lt;br /&gt;list resultList;&lt;br /&gt;string rawList;&lt;br /&gt;integer firstRun;&lt;br /&gt;&lt;br /&gt;default&lt;br /&gt;{&lt;br /&gt;state_entry()&lt;br /&gt;{&lt;br /&gt;integer i;&lt;br /&gt;rawList = "";&lt;br /&gt;firstRun = 1;&lt;br /&gt;// set permissions so the prim is able to link the objects&lt;br /&gt;llRequestPermissions(llGetOwner(), PERMISSION_CHANGE_LINKS);&lt;br /&gt;// update every 30 seconds&lt;br /&gt;llSetTimerEvent(30.0);&lt;br /&gt;// listen on a channel so that the owner can post updates&lt;br /&gt;llListen(4001, "", llGetOwner(), "" );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// if the owner wants to submit an update to Twitter&lt;br /&gt;listen(integer channel, string name, key id, string message) {&lt;br /&gt;llSay(0, "trying to send your status message: " + message);&lt;br /&gt;// post the received chat-message to our server.&lt;br /&gt;// use a special mimetype for submitting post-variables&lt;br /&gt;llHTTPRequest("###YOUR RAILS URL###/post_message",[HTTP_METHOD,"POST", HTTP_MIMETYPE, "application/x-www-form-urlencoded"],"msg="+message);&lt;br /&gt;llSay(0, "ok");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// request the new updates&lt;br /&gt;timer() {&lt;br /&gt;llSay(0, "loading statuses...");&lt;br /&gt;requestId = llHTTPRequest("###YOUR RAILS URL###/get_messages",[HTTP_METHOD,"GET"],"");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;http_response(key request_id, integer status, list metadata, string body) {&lt;br /&gt;    integer i;&lt;br /&gt;&lt;br /&gt;    if (request_id == requestId) {&lt;br /&gt;        rawList = body;&lt;br /&gt;&lt;br /&gt;        // create the boxes from the list information&lt;br /&gt;        resultList = llParseString2List(body,["\n"],[]);&lt;br /&gt;        integer listlength = llGetListLength(resultList);&lt;br /&gt;        float boxPosition = 1;&lt;br /&gt;    &lt;br /&gt;        for(i=0;i&amp;lt;listlength;i+=1) {&lt;br /&gt;            if(firstRun == 1) {&lt;br /&gt;                // rez objects only in the first run&lt;br /&gt;                llSay(0, "rez object "+(string)i);&lt;br /&gt;                llRezObject("status", llGetPos() + &lt;0,&gt;, ZERO_VECTOR, ZERO_ROTATION, i);&lt;br /&gt;                boxPosition+= 0.7;&lt;br /&gt;            } else {&lt;br /&gt;                // after that only update with link messages&lt;br /&gt;                llMessageLinked(LINK_ALL_CHILDREN, 0, rawList, NULL_KEY);&lt;br /&gt;            }&lt;br /&gt;        } &lt;br /&gt;        firstRun = 0;&lt;br /&gt;&lt;br /&gt;    } else {&lt;br /&gt;        // llSay(0,(string)status+" error");&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;object_rez(key id) {&lt;br /&gt;llCreateLink(id, 1);&lt;br /&gt;llMessageLinked(LINK_ALL_CHILDREN, 0, rawList, NULL_KEY);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So, that was the whole code, which works really nice as you can see in the screenshot in the &lt;a href="http://sl-devcorner.blogspot.com/2007/03/twittersecond-life-mashup.html"&gt;old posting&lt;/a&gt;. If you want to see it in in-world-action, please visit me at &lt;a href="http://slurl.com/secondlife/Oz/199/242/26"&gt;http://slurl.com/secondlife/Oz/199/242/26&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1212732243707081511-5702311618379864226?l=sl-devcorner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sl-devcorner.blogspot.com/feeds/5702311618379864226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1212732243707081511&amp;postID=5702311618379864226' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/5702311618379864226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/5702311618379864226'/><link rel='alternate' type='text/html' href='http://sl-devcorner.blogspot.com/2007/03/second-life-twitter.html' title='Second Life Twitter'/><author><name>daniel</name><uri>http://www.blogger.com/profile/14642901952838592035</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_KDY5uAVK75M/SHw_1fiMmXI/AAAAAAAAAF4/M20RWzi5zWw/S220/anonymous2.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1212732243707081511.post-4264745552756407139</id><published>2007-03-16T15:37:00.000-07:00</published><updated>2007-03-31T01:53:48.194-07:00</updated><title type='text'>Twitter/Second Life Mashup</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_KDY5uAVK75M/Rg4hknEo0xI/AAAAAAAAAB0/gBbERy3uWTk/s1600-h/twitterer%2Bservice%2Bsecond%2Blife.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_KDY5uAVK75M/Rg4hknEo0xI/AAAAAAAAAB0/gBbERy3uWTk/s320/twitterer%2Bservice%2Bsecond%2Blife.jpg" alt="" id="BLOGGER_PHOTO_ID_5048009145176347410" border="0" /&gt;&lt;/a&gt;I have created a little application for integrating the &lt;a href="http://twitter.com/"&gt;Twitter&lt;/a&gt; service into second life. I named it "&lt;span style="font-style: italic;"&gt;twitterer&lt;/span&gt;" ;)&lt;br /&gt;As you can see in this screenshot, the &lt;span style="font-style: italic;"&gt;twitterer&lt;/span&gt; gets the newest messages from the twitter-service and displays them above some spheres.&lt;br /&gt;For every status-message which comes from the &lt;a href="http://twitter.com/help/api"&gt;twitter-xml-feed&lt;/a&gt; the application creates a sphere and than refreshes it every 30 seconds.&lt;br /&gt;&lt;br /&gt;And it can also submit messages to twitter, so you are able to write messages in-world to twitter.  I like such things. :)&lt;br /&gt;As "backend"-stuff i use some RubyOnRails. I will submit the code this week.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1212732243707081511-4264745552756407139?l=sl-devcorner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sl-devcorner.blogspot.com/feeds/4264745552756407139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1212732243707081511&amp;postID=4264745552756407139' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/4264745552756407139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/4264745552756407139'/><link rel='alternate' type='text/html' href='http://sl-devcorner.blogspot.com/2007/03/twittersecond-life-mashup.html' title='Twitter/Second Life Mashup'/><author><name>daniel</name><uri>http://www.blogger.com/profile/14642901952838592035</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_KDY5uAVK75M/SHw_1fiMmXI/AAAAAAAAAF4/M20RWzi5zWw/S220/anonymous2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_KDY5uAVK75M/Rg4hknEo0xI/AAAAAAAAAB0/gBbERy3uWTk/s72-c/twitterer%2Bservice%2Bsecond%2Blife.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1212732243707081511.post-217649883189329114</id><published>2007-03-14T22:59:00.000-07:00</published><updated>2007-04-02T12:57:02.405-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='presentation screen'/><title type='text'>Presentation screen for Second Life</title><content type='html'>&lt;p&gt;I have built a small presentation screen with two navigation buttons. The whole communication between the buttons and the screen takes place using the &lt;a href="http://rpgstats.com/wiki/index.php?title=LlMessageLinked"&gt;llMessageLinked&lt;/a&gt;-function. Each slide have to be placed as texture into the prim of the mainscreen. The textures have to be numbered in the order in which they should be displayed later.&lt;/p&gt; &lt;p&gt;The script of the screen also informs the buttons when the last slide has been reached. So that the “next”-prim is not able to navigate anymore. The “previous” and “next” prim have nearly the same scriptcode, except that the one checks if the first slide has been reached and the other looks out for the last slide.&lt;/p&gt; &lt;p&gt;The lsl-code for the “previous” button looks like this.&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;integer slideToDisplay;&lt;br /&gt;integer firstSlideReached;&lt;br /&gt;integer currentSlide;&lt;br /&gt;&lt;br /&gt;default&lt;br /&gt;{&lt;br /&gt;state_entry() {&lt;br /&gt;    firstSlideReached = 1;&lt;br /&gt;    slideToDisplay = 1;&lt;br /&gt;    currentSlide = 1;&lt;br /&gt;    llSetTexture("da79968e-b8b7-8a0a-cc66-2a717e9c3d41", 4);&lt;br /&gt;    llRotateTexture(PI, 4);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;touch_start(integer total_number)&lt;br /&gt;{&lt;br /&gt;    if(firstSlideReached == 0) {&lt;br /&gt;        slideToDisplay = currentSlide - 1;&lt;br /&gt;        llMessageLinked(LINK_SET,slideToDisplay,"slideToDisplay",NULL_KEY);&lt;br /&gt;    } else {&lt;br /&gt;        llSay(0, "First slide reached.");&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;link_message(integer sender_num, integer num, string str, key id) {&lt;br /&gt;&lt;br /&gt;    if(str == "currentSlide") {&lt;br /&gt;        currentSlide = num;&lt;br /&gt;        if(currentSlide == 1) {&lt;br /&gt;            firstSlideReached = 1;&lt;br /&gt;        } else {&lt;br /&gt;            firstSlideReached = 0;&lt;br /&gt;        }&lt;br /&gt;     }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The “next” prim code looks like this. It also uses a “arrow”-texture which is included via a key in the state_entry()-function. The “previous” button uses the same texture only rotated in another rotation.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;integer slideToDisplay;&lt;br /&gt;integer lastSlideReached;&lt;br /&gt;integer currentSlide;&lt;br /&gt;integer maxSlide;&lt;br /&gt;&lt;br /&gt;default&lt;br /&gt;{&lt;br /&gt; state_entry() {&lt;br /&gt;     lastSlideReached = 0;&lt;br /&gt;     slideToDisplay = 1;&lt;br /&gt;     currentSlide = 1;&lt;br /&gt;     maxSlide = 1000;&lt;br /&gt;     llSetTexture("da79968e-b8b7-8a0a-cc66-2a717e9c3d41", 4);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; touch_start(integer total_number)&lt;br /&gt; {&lt;br /&gt;     if(lastSlideReached == 0) {&lt;br /&gt;         slideToDisplay = currentSlide + 1;&lt;br /&gt;         llMessageLinked(LINK_SET,slideToDisplay,"slideToDisplay",NULL_KEY);&lt;br /&gt;     } else {&lt;br /&gt;         llSay(0, "Last slide reached.");&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; link_message(integer sender_num, integer num, string str, key id) {&lt;br /&gt;&lt;br /&gt;     if(str == "currentSlide") {&lt;br /&gt;         currentSlide = num;&lt;br /&gt;         if(currentSlide &amp;lt; maxSlide) {&lt;br /&gt;             lastSlideReached = 0;&lt;br /&gt;         }&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;     if(str == "lastSlideReached" &amp;&amp;amp; num == 1) {&lt;br /&gt;         lastSlideReached = 1;&lt;br /&gt;         maxSlide = currentSlide;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The screen itself checks first if a texture is available. If not it sets an test-texture (in this case: some color-circles i did, identified by the unique-key).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;integer lastSlideReached;&lt;br /&gt;integer firstSlideReached;&lt;br /&gt;integer currentSlide;&lt;br /&gt;&lt;br /&gt;default {&lt;br /&gt;&lt;br /&gt;state_entry() {&lt;br /&gt;    // check for first slide and set it when available&lt;br /&gt;    if(llGetInventoryKey("1") != NULL_KEY) {&lt;br /&gt;        llSetTexture("1", 4);&lt;br /&gt;    } else {&lt;br /&gt;        llSetTexture("b13e131e-13a4-37ad-e137-4b6f81a0a3fa", 4);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;link_message(integer sender_num, integer num, string str, key id) {&lt;br /&gt;&lt;br /&gt;    if(str == "slideToDisplay") {&lt;br /&gt;        string slideToDisplayStr = (string) num;&lt;br /&gt;&lt;br /&gt;        if(llGetInventoryKey(slideToDisplayStr) != NULL_KEY) {&lt;br /&gt;            llSetTexture((string)num, 4);&lt;br /&gt;            llMessageLinked(LINK_SET,num,"currentSlide",NULL_KEY);&lt;br /&gt;&lt;br /&gt;            // check if next slide exists&lt;br /&gt;            integer nextSlideNr = num+1;&lt;br /&gt;            string nextSlideStr = (string) nextSlideNr;&lt;br /&gt;            //llSay(0, "check for next slide nr " + nextSlideStr);&lt;br /&gt;            if(llGetInventoryKey(nextSlideStr) == NULL_KEY) {&lt;br /&gt;                lastSlideReached = 1;&lt;br /&gt;                llMessageLinked(LINK_SET,1,"lastSlideReached",NULL_KEY);&lt;br /&gt;            } else {&lt;br /&gt;                lastSlideReached = 0;&lt;br /&gt;            }&lt;br /&gt;         } else {&lt;br /&gt;            llSay(0, "Slide not available");&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt; &lt;p&gt;With some text-textures the screen will look like this:&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.semanticpool.de/wp-content/uploads/2007/03/presentation_screen_1.jpg" alt="Presentation screen" /&gt;&lt;/p&gt; &lt;p&gt;On the left side is the test-texture i did, if no slides are available.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1212732243707081511-217649883189329114?l=sl-devcorner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sl-devcorner.blogspot.com/feeds/217649883189329114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1212732243707081511&amp;postID=217649883189329114' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/217649883189329114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/217649883189329114'/><link rel='alternate' type='text/html' href='http://sl-devcorner.blogspot.com/2007/03/presentation-screen-for-second-life.html' title='Presentation screen for Second Life'/><author><name>daniel</name><uri>http://www.blogger.com/profile/14642901952838592035</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_KDY5uAVK75M/SHw_1fiMmXI/AAAAAAAAAF4/M20RWzi5zWw/S220/anonymous2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1212732243707081511.post-3380685409391720103</id><published>2007-03-14T22:55:00.000-07:00</published><updated>2007-04-02T12:57:25.864-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rexml'/><category scheme='http://www.blogger.com/atom/ns#' term='rmagick'/><title type='text'>Display external XML-Resources on objects in Second Life</title><content type='html'>If have played a little bit with Second Life and its ability to access external resources. Inspired by &lt;a href="http://www.hackdiary.com/archives/000087.html"&gt;Matt Biddulph’s “flickr screen”&lt;/a&gt;, now i wanted to load xml data from an external source into the SL-world and display it on a nice looking screen. Because it is not possible — from my point of view — to display text directly on a SL-primitive, it was necessary to render the text in a first step to an image. I did this using a little RubyOnRails application which also loads and parses the xml-resource. Ok, now i show how i did this.&lt;br /&gt;I used the &lt;a href="http://www.germane-software.com/software/XML/rexml/"&gt;REXML processor&lt;/a&gt; to work with the xml-data and &lt;a href="http://rmagick.rubyforge.org/"&gt;RMagick&lt;/a&gt; to create the image. The xml-source is used is a little xml-file provided by LindenLabs which shows the land sales by resident for the last three month (&lt;a href="http://secondlife.com/reports/marketplace_stats/2007-03-01/land_sales_by_residents.xml"&gt;http://secondlife.com/reports/marketplace_stats/2007-03-01/land_sales_by_residents.xml&lt;/a&gt;). The whole parsing is specific to this source.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;# get the xml via http and read it into a variable and create a XML-Document after that&lt;br /&gt;@content = Net::HTTP.get(URI.parse("&lt;br /&gt;http://secondlife.com/reports/marketplace_stats/2007-03-01/land_sales_by_residents.xml"))&lt;br /&gt;xmlDoc = REXML::Document.new(@content)&lt;br /&gt;&lt;br /&gt;# get some attributes and select them with xpath&lt;br /&gt;elRecords = REXML::XPath.first(xmlDoc, "records")&lt;br /&gt;reportTitle = elRecords.attributes['report']&lt;br /&gt;reportDate = elRecords.attributes['date']&lt;br /&gt;&lt;br /&gt;# create a new image in the size you need. in my case it was 400 width and 200 height&lt;br /&gt;f = Image.new(400,200) { self.background_color = "white" }# make some settings for the font&lt;br /&gt;drawable = Magick::Draw.new&lt;br /&gt;drawable.pointsize = 15.0&lt;br /&gt;drawable.font_family = 'Helvetica'&lt;br /&gt;drawable.fill = 'gray'&lt;br /&gt;drawable.gravity = Magick::NorthWestGravity&lt;br /&gt;drawable.font_weight = Magick::BoldWeight&lt;br /&gt;drawable.annotate(f, 0, 0, 5, 4, "Second Life #{reportTitle} (#{reportDate})")&lt;br /&gt;drawable.pointsize = 13.0&lt;br /&gt;drawable.fill = 'black'&lt;br /&gt;drawable.font_weight = Magick::NormalWeight&lt;br /&gt;&lt;br /&gt;# set some position for the text i want to print&lt;br /&gt;@startTopPos = 24&lt;br /&gt;&lt;br /&gt;# go the records in the xml-document and print the values into the new image&lt;br /&gt;REXML::XPath.each( xmlDoc, "records/record") do |element|&lt;br /&gt;element.elements.each("field") do |field|&lt;br /&gt; name = field.attributes['name']&lt;br /&gt; value = field.attributes['value']&lt;br /&gt; drawable.annotate(f, 0, 0, 5, @startTopPos, name)&lt;br /&gt; drawable.annotate(f, 0, 0, 250, @startTopPos, value)&lt;br /&gt; @startTopPos = @startTopPos + 15&lt;br /&gt;end&lt;br /&gt;@startTopPos = @startTopPos + 15&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# write the image to the disk. i wasnt able to return it directly without saving. :(&lt;br /&gt;f.write("result.png")&lt;br /&gt;# return the image&lt;br /&gt;createdImg = Magick::Image.read("result.png").first&lt;br /&gt;@response.headers["Content-Type"] = "image/png"&lt;br /&gt;@response.headers['Content-Disposition'] = %q{inline; filename="thepicture.png"}&lt;br /&gt;render :text =&gt; createdImg.to_blob&lt;/pre&gt; &lt;a href="http://www.semanticpool.de/display-external-xml-resources-on-objects-in-second-life/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;p&gt;This script returns the following image:&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.semanticpool.de/wp-content/uploads/2007/03/secondlifelandsales.png" alt="Second Life land sales" /&gt;&lt;/p&gt; &lt;p&gt;To put this image on an primitive i used the following linden script code:&lt;/p&gt; &lt;pre&gt;touch_start(integer num_detected) {&lt;br /&gt;  llSay(0, "trying...");&lt;br /&gt;&lt;br /&gt;  if(llGetLandOwnerAt(llGetPos()) != llGetOwner()) {&lt;br /&gt;      llSay(0,"Error: Cannot modify parcel media settings.");&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  key video_texture = llList2Key(llParcelMediaQuery( [PARCEL_MEDIA_COMMAND_TEXTURE]), 0);&lt;br /&gt;&lt;br /&gt;  if(video_texture == NULL_KEY)&lt;br /&gt;  {&lt;br /&gt;      video_texture = VIDEO_DEFAULT;&lt;br /&gt;      llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_TEXTURE, VIDEO_DEFAULT]);&lt;br /&gt;  }&lt;br /&gt;  llSetTexture(video_texture,ALL_SIDES);&lt;br /&gt;  llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_URL,"http://###URL###"]);&lt;br /&gt;  llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PLAY]);&lt;br /&gt;  llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_AUTO_ALIGN,TRUE]);&lt;br /&gt;}&lt;/pre&gt; &lt;p&gt;###URL### has to be replaced with the URL of the Ruby-Script.&lt;/p&gt; &lt;p&gt;Note: To use this ParcelMedia-feature you have to allow streaming media i think in SL.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1212732243707081511-3380685409391720103?l=sl-devcorner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sl-devcorner.blogspot.com/feeds/3380685409391720103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1212732243707081511&amp;postID=3380685409391720103' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/3380685409391720103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1212732243707081511/posts/default/3380685409391720103'/><link rel='alternate' type='text/html' href='http://sl-devcorner.blogspot.com/2007/03/display-external-xml-resources-on.html' title='Display external XML-Resources on objects in Second Life'/><author><name>daniel</name><uri>http://www.blogger.com/profile/14642901952838592035</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_KDY5uAVK75M/SHw_1fiMmXI/AAAAAAAAAF4/M20RWzi5zWw/S220/anonymous2.jpg'/></author><thr:total>0</thr:total></entry></feed>
