It’s you and me against the world

So when do we attack?

  • When I released the Treasure Hunt Radar, it started picking up publicity and sales, and then, Second Life had a major grid crash.
  • When I released the Lucky Chair Detector plugin, it just started taking off and then, another grid crash happened, though a smaller one.
  • Now there’s Designer Showcase Network. And three days into it’s operation, the server just keels over with no explanation or anything, causing the momentum it accumulated to severely decrease.

I think this universe has something against me.

Well, the universe will be very sorry later!


Boot virus

It all started with boots.

First, I saw a notice in FabFree about two pairs of boots being available as group gifts from two different designers. Good overknee boots are actually a major rarity, so I thought nothing about grabbing both freebies, as well as buying several more pairs in my favourite colors.

Then I took a closer look at them. Then an even closer one.

All of them used an identical sculpt map, and a largely identical surface texture.

Mind you, these are very good sculpt maps, and very good textures… well, the base shadowmap that comes with them is. Apparently, everyone else thought so too, because very soon, I noticed a very familiar sight in a report about boots released by Thalia’s. At a lower price than they were previously too.

I laughed. And went to check out Nightshade Designs on a report of another outfit I wanted to consider getting, and there they were, waiting for me and glittering the added crosses and laces.

Slightly altered. Still highly recognisable.

Slightly altered. Still highly recognisable.

Well, that’s magnitudes better than just selling them raw, but that’s not worth L$600 if you ask me.

Later that day, they were offered for free at the Vinyl Cafe. (And the other pair featured in this post is also a prefab sculpt…) I thought that would be the end of it, but…

Today, I glanced at the XStreetSL and noticed them staring at me from the two newest entries on the front page. From KaShoez and Safii.

While I don’t think they became much better, you got to admire the effort that went into the latter. But anyway…

Further search revealed moreofthesame for as far down as I cared to scroll.

Dear designers.

I understand that this set of sculpts is probably the first in it’s class, and definitely, by far, the best. But could you at least, try doing one of the following:

  • Wait until everyone forgets the releases of your competitors. Trust me, it doesn’t take that long! More than a week, though.
  • Be more earnest like Nightshade and Safii and actually use the boots as a base to build something upon instead of packaging them and hoping for quick profits.
  • Instead of just selling the boots as is, use them to enhance an outfit, since they’re so widely available that you’ve got to be insane if you think the market won’t get oversaturated in a few more weeks.
  • Failing either of the above, give some credit to the original author. I hope they’re much richer for all this charade. Still, at L$3000 per pack, I sort of doubt this.
  • Above all, don’t consider your customers too stupid to notice.

I’m watching you.

Merry Christmas to all, and to all a good afterlife…

Something occurred to me recently, and it was so startling, I have to write about it. It might have an interesting scientific conclusion to it or it might not, but that’s beside the point. It’s a personal blog post more than anything else.

I just noticed that a table is the most useless piece of furniture in Second Life.

A chair animates you. It has some purpose to it, it’s part of a system of expression that you get to transmit symbolic information. A bed is even more so. A dresser is actually useful to keep backups of your stuff, that’s what I use mine for.

But a table serves no purpose. You can put things on it but they don’t really need it. You can pull the table out from under them and they still stay up. It’s purely decorative. It doesn’t need legs, even, because it hangs in the air too. We don’t need bathrooms or toilets, but we still have them. And we very definitely do not need food. But there’s no end to prop food in my inventory.

And then it hit me.

The term “Second Life” sounds so much like “Afterlife” for a reason. It is common knowledge that the Pharaohs took furniture and utensils with them because they believed they needed them. But I suspect this might need some rethinking.

We really are ghosts. We don’t need food, or furniture, we could just as well sit on the thin air. We can’t really hug each other, because there is no hope to compute the physics of a complex polygonal mesh, the servers aren’t even strong enough for a ragdoll model. It is our afterlife, a world with no body, or space, a world where time is distorted and fluid because of the network lag, where we can be anything, as long as that ‘anything’ is what others agree us to be.

There is literally nothing in this world except people, and we bring with us the ideas of a table, a spoon, a cup of ‘hot’ tea, because they allow us to think of the abstract prims, which are nothing but numbers, in terms of a familiar daily life. We bring the abstract prims meaning that we inherited from generations prior, in a different world.

Can we truly be sure that the Egyptians did not send their dead to colonize a lifeless world such as this, where everything is merely some abstract ‘substance’, weightless and invisible ectoplasm? Could it be that they didn’t give them things because they thought these things would be needed, but because they could not otherwise cope with thinking of a world of abstract virtuality where there is, literally, nothing except people?

Is Second Life, in truth, nothing but a monstrously big tomb?

It is depressing, to a degree, though I’m not sure it’s actually a bad thing if it’s true. The idea that I’m actually dead and was stubbornly refusing to believe it for ten years is not something new for me. It’s supposed to be Christmas, a time of happiness and merriment, and everybody sends each other gifts and greeting cards. It is supposed to be my birthday, but, I have nobody to invite over for it, and no time to be happy, because I’m forced to do mildly impossible, disgusting things of bureaucratic nature, to avoid worse consequences, working literally against the clock, to keep something I know has no future anyway.

Because I have had no future for years. This is my way to be invincible, it’s a very static position in a first life that I cannot break out of. It’s far more comfy than that of many other people, but it has no future to it, no growth, no chance of improvement unless something external happens to give me a chance. And there’s nothing that can do it but a person. This position has such a supply of stability that all attempts have, so far, failed, but it’s stable because there’s no way down from here. Eventually, as soon as I get a lucky break, something happens to make me unable to take advantage of it, or just takes it away from me, or… or simply the person betrays me for some other interest, that’s probably the most common. It’s a very personal kind of hell.

As if everything conspires to bring me into this dead end, starting in a few hours, where the last opportunities to ever meet living breathing people in a context where I’m not an outsider will be extinguished, and I’ll be left completely alone, in a day after day after day…

Any life takes you away from somebody else’s. Every time you think you have broadened your horizons, they have actually narrowed in some other place, the length of your horizon is finite. Every person you give your limited social ties to means that some other person will not get them. And all the friends I have and trust, have their own lives, their own problems to deal with. Peter said today, that “Most people are here becase they have a cross to carry”. I sure know I have mine, and you probably have yours. But if you still hear me… if my seasons greetings mean anything to you…

Go and live tomorrow like this is the last day of your life. First or second one, it doesn’t matter. Be nice to someone. Help someone. Save someone. Give your warmth to someone. And if there’s still anything left after you gave it all to a special someone, find someone else who needs it, too. Be a faithful lover. Be a good friend. Create something and spread it around. Share your knowledge and share your connections. Find someone’s problem and solve it. If you can’t do it, help find someone who can. Bring people together, there is nothing at all in the entire universe except people.

That’s the only kind of compassion there truly is. That’s the only way you are alive.

Find someone else’s cross and maybe together we can make a raft out of all this bloody wood. Failing that, we could all wear nice uniforms and go lynch Hallmark.

That, at least, will get some of us dates.

On copying

People who spread myths about Copybot blot out the google.

I’ve heard a lot of nonsense about it. Some people say it’s a script, so making your land noscript should stop it from working. Others say that IMing it with “!quit” will make it quit, or that reconstructing items copied with Copybot requires a script, which causes LL to ban the user upon compilation. Yet someone else banned a girl from their sim just because she looked at every vendor, thinking that she was copybotting the contents.

Here’s some truth for you.

  1. You cannot stop people from taking your textures, ever, period. Don’t even try, it doesn’t work and it annoys the pig. Textures are cached on the hard drive of everyone who ever sees them. They already have them. That includes the baked texture of your clothing as you wear it when someone else sees you. To recover these textures from cache needs just a page of code, very simple. The format the cache is stored in, uncharacteristically for LL, is well documented, and the code required to recover all textures from it in JPEG2000 format is about a page long. The binaries that come with OpenJPEG project can quickly unpack those J2C files into TGA, which is well supported by more or less anything under the sun. That includes sculptmaps. No, blanking out the alpha channel doesn’t stop this approach at all.
  2. Shape slider data are cached, as well as all other slider data. To recover them, one needs the Slice utility, some brains to get it to compile, and some more brains to understand how to translate the stored data back into slider positions, which is fully described in the XML files that come with SL viewer.
  3. Animations are cached just like textures. While there is currently no software to recover animations from the binary format they’re stored in back into BVH, one can be written, because the viewer uses the binary data and therefore contains open, readable source code to parse it and tell what means what. I imagine nobody’s doing it because of the unimaginable amount of mud they will be pulled through after they do it. (post factum update: Someone actually noticed you can upload binary animations as is without having to decompile them at all – congratulations.)
  4. If your object has modify permissions, the size-type-position parameters of every prim in it can be recovered by a script that will need to be dropped inside. Making your land noscript will not stop anyone from buying a single copy and then creating duplicates in the comfort of their own home, but it will cause your customers undue inconvenience. But a script cannot see which prim is textured with which texture, even though it can grab the texture repeat parameters, and fully automatic duplication or a non-fullperm object with a script is impossible. That includes which sculpt map every prim uses.
  5. Any object, any object at all, once someone can rez it or see it when it is rezzed, can be duplicated completely and automatically through the use of a special client, that is, a bot. “Copybot” is just the most famous one, since the source was released, numerous forks exist. It’s not hard to get, though the source code is a bit less widespread. With enough effort, it can be recreated anew. You cannot stop anyone from using such a client by doing anything to your land, because they can buy a single copy of your object and do it in private.
  6. Nothing, ever, can copy something it cannot get from the server as part of the data needed to display the world. No things that are in people’s inventories and not attached to their avatars, or inventories of other people’s objects that are not rezzed at the moment it’s copied can ever be gotten at, unless someone discovers a new bug in SL server itself — which, while not unheard of, is not something you should worry about more than the ceiling falling on you. Enough people try every day to make it sufficiently unlikely.
  7. Scripts only exist and are executed serverside. They are not needed to display the world, so no bot, or viewer, or anything, ever gets them.

In short, copy protection doesn’t work and wastes your resources and annoys your customers. If people spent more time actually creating things and less time worrying about how someone else is copying them or stealing their ideas, Second Life would be a considerably better place.


#if 0
	if (gSavedSettings.getBOOL("ImagePipelineUseHTTP"))
		LLViewerRegion* region = gAgent.getRegion();
		if (region)
			http_url = region->getCapability("RequestTextureDownload");

No comments.

To quote:

Can you please give me more details on ImagePipelineUseHTTP? Not sure about that (does it noticeably effect higher-end PCs?), but “FolderAutoOpenDelay” sounds like it could be a quick, eclectic Tip of the Week. I like it. —Torley

From what I’ve been able to gather, ImagePipelineUseHTTP changes the mechanism that the Viewer uses to download the textures. It is turned off by default. I did find this reference to it which implies it’s a new feature, perhaps not yet fully implemented? Not having a high end machine, I can’t tell if it’s noticable on them, but I know that it helps me and it’s helped a friend who has a PC on the lower end of what can run SL. — Sougent

No, really no comments.

I was just hoping to actually get some real caching going on.

64kb ought to be enough for everyone

That’s what they must have thought, when they introduced Mono virtual machine to SL.

Well, I must say that LL’s LSL to Mono compiler sucks immensely. I noticed there were some things odd about it, recently, but today I have working and largely irrefutable proof on my hands of how much it sucks and I’m telling you it ain’t pretty.

As I have mentioned before all over, I have been working on a complex, highly automated, and hopefully, blonde-proof device to help with setting up treasure hunts of the more interesting and fun kinds. It’s almost ready for release and is currently in field testing, growing in features so much that it frustrates me to no end. This is a rather big project for LSL, and monstrously big for my LSL coding experience, totaling around 3000 lines of code in about 30 individual scripts scattered over 6 prims. Some of the scripts are particularly memory-intensive, because they manipulate long lists of keys, which is what makes the whole thing so versatile and, well, cool, if I say so myself. The core script is almost constantly operating at the limits of free memory right next to a stack-heap collision, it’s largely impossible to move many more components out of it into another script without slowing the whole thing into treacle, and I’ve been looking for ways to optimize it all the time I worked with it.

First thing that ran out of memory was another script, though, the script used to display the dialog menu interface, which brought me on to discover that simply declaring an empty state in Mono results in 3kb memory gone immediately. States weren’t critical for it, so I recoded it to work without them and went on my merry way. I was too busy to consider the possible implications.

And along that way I wanted to save memory by using a function to replace llListReplaceList(list,[data],pointer,same pointer) with something like l2r(list,data,pointer), hoping it would save me some bytecode.

Well, it doesn’t.

In fact, one function declaration and 100 (!) calls to that function, a short one, invariably results in more bytecode than 100 calls to the original function. I jotted down that result and went on my merry way again.

Today, I looked at the script again and suddenly had an eureka moment. I replaced all the long functions I only called once or twice, duplicating their code in the states. Then I replaced all the shorthand functions I called often, like signal(string) with llWhisper(COMM_CHANNEL,string). There were a lot of calls to those.

And the result was 5kb (!) more free memory and a significant gain in the amount of treasure items a single server box can handle.

My only theory to explain this is that declaring a function causes the compiler to generate code required to create a function context. Even more is probably required to define a script state. For a general purpose virtual machine that may well be less efficient than for the original LSL one. But instead of storing that code globally somewhere and calling it when required, like good compilers do, LL’s compiler just dumps a fixed size code block in, one that is at least 700 bytes long, and pretends that is nice and proper.

Well, it bloody hell isn’t nice, isn’t proper, and I bloody have no words.

What the fuck do they think they’re doing, pardon the term, doing something like that and then blaming people for ‘overusing openspace’?!

P.S., long after: Idea: an offworld preprocessor to unroll shorthand functions. And maybe allow list[start:end] instead of llList2List and friends. I can’t fix this braindead language, but hopefully I can make it more tolerable and prevent further blisters on my fingers.

My favourite bugs

Second Life has a lot of bugs, that much everyone knows. But some of these I would consider highly embarrassing if I was involved in making it, yet, they’re here, some are here to stay, and many have been around for years, known and apparently, ignored.

VWR-7957: The “boots to your waist” bug. Many video card manufacturers have stopped supporting palettized textures, because nobody was using them. Second Life was, even though it isn’t depending on them. In particular, it was using them for whatever unknown reason to cover baking clothing textures onto the avatar mesh, which results in texture parts that shouldn’t be visible covering the parts of your avatar they otherwise cannot. Since the baked texture is then on uploaded to the server, everyone else sees you this way. For three months the issue was blamed on the asset server eating clothes, on NVidia drivers being buggy, until they eventually caved in and said that it will be fixed in 1.22.

Update: It turned out that the reason for this happening was a single character typo in card feature detection code. Oh, the humanity…

VWR-1286: Whenever you try to alt-cam on an inner surface of a hollow or cut prim, the camera goes to great pains to stay outside the cut parts as if they’re still there. Makes it a very annoying to live in a house built with hollows, in particular, any cylindrical or spherical building. Been around for a year at least.

VWR-8920: Introduced in the latest release cycle, this causes prim attachments to vanish in certain camera positions. Instead of kicking at it until it was fixed, they labeled it as a known issue and released the new version anyway as a “stable” one.

SVC-472: Sim crossing. We now have warning lines to tell people about sim crossing. The issue has been around forever.

VWR-1298: Group chat delays. Never worked right, as far as I remember. There’s a whole bouquet of bugs related to group chat.

VWR-7331: Another arbitrary limit, which, incidentally, prevents me from putting up a Hands of Omega TARDIS in my skybox which is way above 1000m….

Update: How could I miss this one…

SVC-412: E-mail messages sent from inside SL do not contain correct header information, which results in all non-English letters horribly mangled. Been reported for a year. Estimated requirements to fix — one line of code, but obviously, nobody cares about people who don’t speak ISO-8859-1.

What are your favourite bugs?