Feature Requests

I’m experimenting with using Google Moderator to handle feature requests. Head over there, vote on a suggestion, or make a new one yourself!

Is your password secure ? Probably not secure enough!

Okay, this topic rears its head again.

  1. Your Second Life password cannot be longer than 16 characters. several of the examples Jeska provides are invalid because of this arbitrary limit.
  2. There is no good reason for passwords being limited to 16 characters.
  3. OpenID logins for Second Life are trivial to implement..

Auto-discovery of OpenSim Simulator Creations


Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3643

Warning: Invalid argument supplied for foreach() in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3643

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3651

Warning: Invalid argument supplied for foreach() in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3651

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3654

Warning: Invalid argument supplied for foreach() in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3654

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 1925

Warning: Invalid argument supplied for foreach() in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 1925

Warning: Invalid argument supplied for foreach() in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 2290

Warning: implode() [function.implode]: Argument must be an array in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3242

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3265

Warning: Invalid argument supplied for foreach() in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3265

Warning: Invalid argument supplied for foreach() in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3306

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3357

Warning: Invalid argument supplied for foreach() in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3357

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3502

Warning: Invalid argument supplied for foreach() in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3502

Update: After poking around the Microformats Wiki, I’ve altered my proposal slightly to use the enclosure value.

Timeless Prototype

With the recent increase in OpenSim usage, the natural progression will be for people to offer entire simulator creations for download.

What we now need is a searchable tag to easily find such downloadable simulators. I’m finding that a whole lot of the obvious acronyms are already taken up by other technologies.

You can read more on the original post, but the basic gist is that Timeless is proposing the use of a short blurb of link text, more commonly known as a “tag”. Well… there are a few problems with this- semantic ones, mainly.

  1. The presence of the matching tag does not guarantee that the link in question has anything to do with OpenSim.
  2. The use of the tag makes no distinction between documents that are OpenSim Region archive files, and post about OpenSim Region archives.
  3. The use of link text makes it a little difficult to have descriptive link text (also known as “click here” syndrome).

As I suggested to Timeless on his blog post, a more semantic method would be to use the rel attribute of the anchor tag, as opposed to the link text, using something such as opensim-region-archiveopensim-region enclosure.

Listing multiple region archives.

W3C: Basic HTML Data Types

Authors may use the following recognized link types, listed here with their conventional interpretations. In the DTD, %LinkTypes refers to a space-separated list of link types. White space characters are not permitted within link types.

These link types are case-insensitive, i.e., “Alternate” has the same meaning as “alternate”.

User agents, search engines, etc. may interpret these link types in a variety of ways. For example, user agents may provide access to linked documents through a navigation bar.

<a href=”http://example.org/foo.tgz” rel=”opensim-region enclosure nofollow” type=”application/x-gzip”>ZOMG DOWNLOAD MAH SIM NAO, LOL!!!!111!ONE</a>

Lolcats aside, the previous piece of html anchor code indicates that the document the link refers to is an OpenSim Region archive (it also instructs search engines not to go poking around the link, since fully fleshed-out simulators may be quite large, even when compressed). The humorous link text is also sufficiently human readable to English-reading web users, and wholly ignorable for machine reading/web crawler purposes- it doesn’t lock link text down to anything specific, so wouldn’t cause any problems with internationalisation/localisation.

So multiple anchor tags using the rel method can be embedded in a document, all with unique, descriptive strings for the link text- making it suitable for environments such as a MDC‘s catalogue. Those of you familiar with HTML at all will know that the rel attribute can be found on another HTML element- link.

Listing the download source for a region archive.

<link rel=”alternate opensim-region enclosure nofollow” type=”application/x-gzip” href=”http://example.org/foo.tgz” />

In some circumstances, individual pages will be given to an OpenSim Region archive- again, in the MDC catalogue scenario, but also perhaps on a dedicated review site for OpenSim Regions. Now, there’s nothing stopping such a site using anchor tags, but the link tag has extra geekery in its’ implementation- the use of the alternate rel value. This may or may not be borking things slightly, though a link tag with a rel value of “alternate stylesheet” is often used to allow a browser to switch between multiple skins- just having a rel value of “opensim-region-archive” alone would be enough to indicate that an OpenSim Region archive for the current document was available at the specified location.

Autodiscovery.

While there are many sites out there- such as del.icio.us and Technorati that are “tag friendly”, as I mentioned earlier, the presence of the tag alone does not guarantee that the document is in fact, an archive. This means that any web crawler or browser extension would likely have to download the linked resource *first* in order to ensure that the resource is actually an archive, and not just a blog post relating to the subject.
The rel attribute method on the other hand, allows for a web crawler, browser extension or even userscript to identify the presence of OpenSim Region archives available for download- consider the following piece of javascript:

1
var oar = document.evauluate('*//*[contains(@rel,"opensim-region enclosure")]',document,null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
2
if(oar && oar.snapshotLength >= 1){
3
alert("There are " + oar.snapshotLength + " OpenSim Regions available for download via this page.");
4
}

An advanced web-crawler would use similar XPath queries, queue the resource in question for download, then at some point in the future, automatically attempt to “restore” the archive to a (firewalled, no need to let external script comms work) local OpenSim grid, checking for any error output- thereby validating the contents of the OpenSim Region archive, and adding it to the index of Regions it has found.

HTTP/1.1 204 No Content: A Usability Problem

If the client is a user agent, it SHOULD NOT change its document view from that which caused the request to be sent. This response is primarily intended to allow input for actions to take place without causing a change to the user agent’s active document view, although any new or updated metainformation SHOULD be applied to the document currently in the user agent’s active view.

Joyous differences between “SHOULD NOT” and “MUST NOT” aside, I’m finding that every browser’s implementation of 204 No Content creates a usability problem. Lets break the process down.

What the spec appears to state

  1. User agent (web browser) loads a document (web page).
  2. User interacts with the document via the user agent to load a new document (clicking a link on the web page).
  3. Server responds with 204 No Content
  4. User agent active view (the window/tab the first document was loaded in) does not change, allowing for actions to take place without causing a change to the user agent’s active document view (js alert boxes set on a timeout so many seconds after an anchor tag has been clicked ?).

How browser implementation of 204 No Content causes a usability problem.

  1. User agent (web browser) loads a document (web page). Example (Codie’s land listing on sw.slr)
  2. User interacts with the user agent- not the document in active view- to load a new document (clicking a bookmark or manually pasting in an URL). Example (Marv’s land listing on sw.slr)
  3. User agent active view does not change.

A Usability Problem

In the example, it appears to the average user that the second document is identical to the first, or if Codie were to sell all her land and sims, and the page was loaded by clicking a bookmark for the same active view as a previous version of the document, it would appear that Codie still owns regions.

The issue of 204 No Content as a usability problem doesn’t appear to lie with the HTTP spec. It explicitly states it SHOULD NOT change its document view from that which caused the request to be sent. However, it seems to be the case that a User Agent’s UI is not part of the document view, so the HTTP spec should not need to be updated in order to clarify this (given the diversity of applications, the protocol spec really shouldn’t make any attempt to reference any UI elements past, present or future possibilities).

It seems that browsers (perhaps all browsers) are at fault here, though on first glance it doesn’t seem to be that big a deal- you could say “Why not use 404 Not Found instead ?”. Yes, 404 Not Found could indeed get around the usability problem, as it allows a message body to be sent alongside the response- whereas 204 No Content MUST NOT include a message-body, and thus is always terminated by the first empty line after the header fields.. However, 204 No Content is for when the server has fulfilled the request but does not need to return an entity-body, and might want to return updated metainformation., and 404 is for when the server does not wish to reveal exactly why the request has been refused, or when no other response is applicable. Semantically speaking (in my examples), with 204 No Content, the server is saying “Yes, I understood your request, but there’s nothing to see, though I might have some extra info relating to your request.”, but with 404 Not Found, the server is saying “Okay, nothing to see here”.

In short…

In short, if the HTTP spec does not mean to include a user agent’s UI in it’s “active view”, then the behaviour of all browsers needs to change so that the user is informed- either via an alert or error page- if a 204 No Content header is received in response to an attempt to load a document from anywhere other than the document in the “active view” (bookmarks, manual paste/type, browser extensions, external programs).

PHP5 LLSD Parser example


Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3643

Warning: Invalid argument supplied for foreach() in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3643

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3651

Warning: Invalid argument supplied for foreach() in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3651

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3654

Warning: Invalid argument supplied for foreach() in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3654

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 1925

Warning: Invalid argument supplied for foreach() in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 1925

Warning: Invalid argument supplied for foreach() in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 2290

Warning: implode() [function.implode]: Argument must be an array in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3242

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3265

Warning: Invalid argument supplied for foreach() in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3265

Warning: Invalid argument supplied for foreach() in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3306

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3357

Warning: Invalid argument supplied for foreach() in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3357

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3502

Warning: Invalid argument supplied for foreach() in /home/signpostmarv/signpostmarv.name/wp-content/plugins/devformatter/geshi/geshi.php on line 3502

I recently committed my LLSD parser to the public SVN server, after someone posted on the RegAPI mailing list asking for a LLSD parser that worked under PHP5.First the example script, then a step by step explanation of the output.

01
< ?php
02
header('Content-Type:text/plain'); # makes it easier to read the output
03
define('UHU_DEBUG_MODE',true); # enables extended error reporting
04
define('UHU_ERROR_AS_EXCEPTION',true); #
05
define('UHU_ROOT','s:/uhu public SVN/trunk/uhu-5'); # change to the directory
06
define('UHU_CONFIG_PATH','s:/uhu public SVN/trunk/uhu-5/uhu-config.php'); # change the path also
07
define('UHU_LIBS','s:/uhu public SVN/trunk/uhu-5/libs'); # ditto
08
require_once(UHU_ROOT . '/uhu.php'); # no need to change this
09
uhu::load_apps(); # an empty call needs to be made if the install root is not declared inside the config or if it needs to be overriden.
10
uhu_install_config::set('uhu::install::site_root','s:\localhost',true); # change to the path of the root directory for the install- not the web root, as some UHU components like to use a cache directory etc.
11
uhu::load_components('LLSD'); # loads the LLSD parser
12
$source = file_get_contents('./sample.llsd'); # go nab http://wiki.secondlife.com/wiki/LLSD#Example_XML_Output
13
$LLSD = new uhu_LLSD($source);
14
echo
15
	print_r($LLSD->struct()->struct(),true),"\n\n", # yeah, I should probably refactor this double geekery out.
16
	uhu_LLSD::save($LLSD->struct(),0),"\n\n",
17
	uhu_LLSD::save(NULL_KEY,0),"\n\n",
18
	uhu_LLSD::save(new uhu_LLSD_UUID(NULL_KEY),0),"\n\n",
19
	uhu_LLSD::save(new uhu_LLSD_integer_NaN,0)
20
;
21
?>

Read More »

pure CSS3 tree navigation

Here’s a little something I put together earlier- tree/branch style navigation, powered entirely by CSS3 selectors, using valid XHTML 1.1 Strict code.

It seems to work in every browser, though IE7 doesn’t seem to support the coolest feature- the ability to have the page keep branches open while you navigate through branches higher up the tree. Not entirely sure what causes the borkage of course, but hey- IE’s Trident engine has never been one to play nice :-P

Userscript to circumvent lack of Content-Type header setting support

After finding that the new support in LSL didn’t allow the Content-Type header to be set, I developed a Userscript for Greasemonkey to circumvent the issue by utilising Firefox’s support for data URIs.

Install Userscript.

Images of Agni

Once again, I’ve updated the composite and distribution guide maps.

Read More »

rediscovery

I’m discovering that I liked the works of Neil Gaiman when I was younger, and didn’t know it. Here’s a quote from a comic I took out from the library once:

John Constantine, issue 2 of “The Books of Magic”

You know, when I was a kid, I thought America was a magic land. It’s so big… and you’d hear all that stuff about superheroes, and you’d believe it, because it was America.

I mean, when I was a kid, it was somewhere that anything could happen. They had all this incredible stuff, you know, pizzas, and fire hydrants, and Hollywood, and the Empire State building.

And they had superheroes, and magic, and aliens, and, I dunno, all we had was Supercar.

Anyway. Then I came out to America, and I discovered that it was just like every movie or TV show or cliché about America you’ve ever heard or imagined.

It’s all here, somewhere. If you can imagine it…

Now me, I prefer England.

I prefer to live in a country that’s small, and old and where no one would ever have the nerve to wear a cape in public, whether they could leap tall buildings in a single bound or not.

I’ve re-discovered things I enjoyed when I was younger. For years I passively searched for a film I enjoyed when staying at my gran’s place on a friday night- passively because I couldn’t remember much about the film (only that I enjoyed it, some characters and a few scenes), and didn’t know where or how to start looking. By the time I was in Second Life, I could only remember a few frames of the intro sequence. Though by this time, I owned a couple Studio Ghibli DVDs- I found myself becomnig quite a fan of Hayao Miyazaki’s work.

On one of the rare occasions where my sense of capitalism rears its ugly head, I went and bought the (then) entire Studio Ghibli DVD collection (minus the DVDs I already owned). Over the course of a few weeks, I watched the entire collection (seriously, don’t watch Grave of the Fireflies unless you’re prepared to watch a depressing, albeit profound film). When I came to watch Laputa: Castle in the Sky, the moment that aforementioned intro sequence began to play, I had this sense of anticipation strike me as the remnants of what memories I had of the film came flooding back, the DVD filling in the blanks as it played.

I found that one of the first films I remember watching was by one of my favourite directors.

I wonder if, 20, 30, even 40 years down the line, I’ll be able to experience a similar sense of rediscovery. Of finding that a fleeting experience long since past is intimately connected to something I find myself being quite fond of.

Since I can’t tell if this blog will be around when I’m in my 60s (assuming I reach that age), let me put you all in a more convenient frame of mind. Since it’s safe to say that the majority of the people who read this blog are involved in Second Life in some way, I’ll pose all you midbies and oldbies a challenge.

Those of you who started off in Second Life out of curiosity, exploration (not those who immediately got an economic jump-start through employment)- how many of you have explored the grid recently, to come across a familiar stretch of prims- finding a location you visited during your first weeks in this virtual world of ours ? I myself discovered that when Gwyn and I moved SLOpenID into Lanercost, that the new office was just a few hundered meters away from a build I briefly visited during my first week of Second Life.

Go out. Explore. Try and rediscover something, perhaps some insignificant detail in times past, but now seemingly closely related to who you are now.

More cartographical goodness

While preparing to test the viability of monthly map updates, including automated generation of the continental images (I didn’t update those during the last update), I started work this afternoon on a script that’ll calculate what regions are in each of Agni’s continents.

It was surprisingly easy to get the script up and running (the whole process completing in under 4 minutes on the local box)- it’s now setup as a cron-job to update on the 2nd of every month (the images being tentatively generated on the 1st).

After having this take a surprisingly little amount of time to complete, I tried thinking of ways to play with the data before I start playing with the automated image generation on Thursday. After an hour or so of coding and debugging, I came up with this: CSS3-enhanced Continental Maps.

I’ve used the CSS3 :target selector, combined with some Javascript DOM geek-fu to highlight the region currently being hovered over in the list on the left. The map is currently a rather plain absolutely-positioned CSS arrangement, though I hope to use the aforementioned images to make things more interesting to look at.

Gecko- (Firefox and the in-world browser) has no problem with the CSS3 + JS setup, though both Presto (Opera) and WebKit (Safari) handle the CSS3 aspect fine, the JS used to assist the CSS3 code (or rather, what happens as a result of the location changing) results in the page appearing to auto-scroll up and down. Trident (Internet Explorer 7) being Trident, can’t handle the CSS3 at all and thus degrades gracefully to a plain list with a dull looking blob next to it. It also has a rather odd tiling effect which is also likely a result of Trident’s inadequacies.

Bad Behavior has blocked 143 access attempts in the last 7 days.