<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>lbsa71.net</title>
	<atom:link href="http://lbsa71.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://lbsa71.net</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Wed, 18 Aug 2010 12:20:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Stringless NMock2 Method names with C#3 extension methods &#8211; revisited</title>
		<link>http://lbsa71.net/2010/08/18/stringless-nmock2-method-names-with-c3-extension-methods-revisited/</link>
		<comments>http://lbsa71.net/2010/08/18/stringless-nmock2-method-names-with-c3-extension-methods-revisited/#comments</comments>
		<pubDate>Wed, 18 Aug 2010 11:20:16 +0000</pubDate>
		<dc:creator>lbsa71</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://lbsa71.net/?p=238</guid>
		<description><![CDATA[Today, I got to revisit an old but nifty hack to code around the fact that NMock2 uses strings for method names (or, you could supply a MethodInfo, clumsy and cumbersome) - this hack has been discovered, developed and distributed many times. A quick google turns up this which I will just take a bit [...]]]></description>
			<content:encoded><![CDATA[<p>Today, I got to revisit an old but nifty hack to code around the fact that NMock2 uses strings for method names (or, you could supply a MethodInfo, clumsy and cumbersome) - this hack has been discovered, developed and distributed many times. A quick google turns up <a href="http://codevanced.net/post/Touching-a-hot-iron-NMock2.aspx">this</a> which I will just take a bit further:</p>
<p>Now, being able to write</p>
<pre name="code" class="c#">Expect.Once.
    On(hand).Method&lt;Iron&gt;(hand.TouchIron).
    With(Is.Anything).
    Will(Throw.Exception(new BurnException()));</pre>
<p>Is all good, even if it's a bit annoying to have to specify return type of the mocked call (<code>Iron</code>) but I was more annoyed by the all-pervasive duplication of mock instance. </p>
<p>So, Instead, I give you the slightly revised syntax:</p>
<pre name="code" class="c#">Expect.Once.
    On&lt;Iron&gt;(hand.TouchIron).
    With(Is.Anything).
    Will(Throw.Exception(new BurnException()));</pre>
<p>and here's the extension method code to accomplish it:</p>
<pre name="code" class="c#"> 
        private static IArgumentSyntax BuildArgumentSyntax(Delegate d, IReceiverSyntax rcv)
        {
            MethodInfo mi = d.Method;
            object target = d.Target;

            IArgumentSyntax argumentSyntax = rcv.On(target).Method(mi.Name);

            return argumentSyntax;
        }

        public static IArgumentSyntax On(this IReceiverSyntax rcv, Action d)
        {
            return BuildArgumentSyntax(d, rcv);
        }

        public static IArgumentSyntax On&lt;TResult>(this IReceiverSyntax rcv, Func&lt;TResult> d)
        {
            return BuildArgumentSyntax(d, rcv);
        }

       // ... fill in more overloads as needed...</pre>
<p>As you can see, you need to supply an overload for every combination of parameter list and return type you want to be able to mock this way.</p>
<p>Happy mocking!<br />
/Stefan</p>
]]></content:encoded>
			<wfw:commentRss>http://lbsa71.net/2010/08/18/stringless-nmock2-method-names-with-c3-extension-methods-revisited/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>In Light of Recent Events</title>
		<link>http://lbsa71.net/2010/06/10/in-light-of-recent-events/</link>
		<comments>http://lbsa71.net/2010/06/10/in-light-of-recent-events/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 20:55:51 +0000</pubDate>
		<dc:creator>lbsa71</dc:creator>
				<category><![CDATA[OpenSimulator]]></category>

		<guid isPermaLink="false">http://lbsa71.net/?p=207</guid>
		<description><![CDATA[Diva just blogged about the Linden Labs layoffs, and what the recent change of course for Second Life could mean to the Open Simulator project.
Funnily, I had just decided to blog along the same lines.
For some time, I have coined what's happening with general-purpose virtual spaces "consolidation by biting dust".
To me, the picture is quite [...]]]></description>
			<content:encoded><![CDATA[<p>Diva just <a href="http://www.metaverseink.com/blog/?p=32">blogged</a> about <a href="http://nwn.blogs.com/nwn/2010/06/linden-layoffs.html">the</a> <a href="http://blogs.secondlife.com/community/features/blog/2010/06/09/a-restructuring-for-linden-lab">Linden Labs</a> <a href="http://firstlife.isfullofcrap.com/2010/06/the_date_may_be_6-9_but_in_the.html">layoffs</a>, and what the recent <a href="http://www.sonic.net/~rknop/blog/?p=272">change</a> of <a href="http://gwynethllewelyn.net/2010/06/10/reset-and-do-a-180º-turn/">course</a> for <a href="http://secondlife.com/">Second Life</a> could mean to the<a href="http://opensimulator.org/"> Open Simulator </a>project.</p>
<p>Funnily, I had just decided to blog along the same lines.</p>
<p>For some time, I have coined what's happening with general-purpose virtual <a href="http://www.virtualworldsnews.com/2010/02/forterra-sells-olive-to-saic.html">spaces</a> "<a href="http://www.lively.com/goodbye.html">consolidation </a><a href="http://www.virtualworldsnews.com/2010/02/oracle-abandons-project-wonderland.html">by</a> <a href="http://www.there.com/info/announcement">biting</a> <a href="http://rock-vacirca.blogspot.com/2010/04/birth-and-adolescence-of-webalive-and.html">dust</a>".</p>
<p>To me, the picture is quite clear. The general-purpose 3D worlds domain has not provided compelling enough content and services to reach the critical threshold needed for the technology to reach and secure mainstream adoption. For this hype cycle, that is; there will be a next one. But for this time, it's toast. And no quick-fix facebook integration or web embedding will change that.</p>
<p>Now it's about digging in and waiting for the next wave of technology convergence.</p>
<p>Allow me to elaborate: Technologies come and go, wax and wane. All technologies develop in 'clusters' together with other technologies - and more often than not, the maturity of these supporting technologies are more or less out of synch.</p>
<p>One example: internet (as in <a href="http://en.wikipedia.org/wiki/Arpanet">ARPANET</a>) has been around since forever. <a href="http://en.wikipedia.org/wiki/HyperCard">Hypermedia</a> too. The first version of html and the http protocol was defined in 1990.</p>
<p>But what else would be needed? An communications protocol stack simple enough to implement that the network hardware was affordable for consumers. Cheap enough bandwith to enough companies and households. Enough potential viewers (PC's) installed to motivate spending efforts on creating content and integrating services to the media. Enough flatbed scanners around to facilitate transfer of legacy 2D content and production of new digital content using old analogue sources. A dominating Operating System paradigm that provided a 2D GUI, and affordable (free) text and graphics manipulation programs available.</p>
<p>And of course, the promise to do away with costly and time-consuming transportation of tons and tons of paper with ink on it.</p>
<p>I would argue that the timing for the web was right - the supporting technology cluster was there - and the technology rode the hype cycle and by the end there was compelling content and services. Had any number of the supporting technologies been in a lesser state of maturity, we would probably not have seen the web as it is today - but my point is: eventually, it would have been inevitable.</p>
<p>Enter Second Life. General-purpose 3D. <a href="http://en.wikipedia.org/wiki/X3D">Again</a>. Now with a social media flavour. User Generated Content. Hell, it was <a href="http://www.imdb.com/title/tt0133093/">the Matrix</a>, or Neal Stephensons <a href="http://en.wikipedia.org/wiki/Snow_Crash#Metaverse">Metaverse</a>. Second Life was supposed to be the torch bearer in <a href="http://www.sweden.se/eng/Home/Lifestyle/Reading/Second-Life/">this</a> <a href="http://nyls.blogs.com/demoisland/">brave</a> <a href="http://www.5min.com/Video/How-Virtual-Reality-Redefines-User-Experience-294502555">new</a> <a href="http://www.businessweek.com/technology/content/oct2006/tc20061017_127435.htm">world</a> - attracting lots of bright people with lots of good ideas.</p>
<p>The genius central idea of Second Life, the thing that would make it thrive, is also the thing that will lead to its commercial <a href="http://www.massively.com/2010/06/12/the-virtual-whirl-the-bottom-line/">downfall</a>: there is no plot.</p>
<p>If you were there when the web started, you heard the same question over and over "but what's the POINT?" - and the answer always was "that's the brilliant thing about it, it can be anything to anyone."</p>
<p>The problem is, you can't run a company around that. At least not with mainstream customers. A company will always want to force the customers in one direction or the other, to make them make each others pay more. Stifle innovation, if innovation would lead the customer astray.</p>
<p>Case in point - fast forward to 2006 when I joined Second Life; was enamoured, created interactive 3D content for the first time, because it was SO EASY, like coding html in notepad and get stuff to &lt;blink&gt;. I was <a href="http://blog.businessofsoftware.org/2010/05/kathy-sierra-at-business-of-software-2009.html">awesome</a>.</p>
<p>But after doing my first big Second Life project for my then employer - a big web community site that wanted to mash their web content with this new and exciting media - I come to realize that Second Life would never cut it. There was just too few integration points. The experience was not brandable. We were in a co-opetition deadlock with SL, its API and its TOS. We had user integrity and security issues. We were supposed to ship our customers off to Second Life and loose precious screen time. It was a no-win situation.</p>
<p>It was at this time, when my then employer was starting to <a href="http://techcrunch.com/2007/07/14/will-the-last-corporation-leaving-second-life-please-turn-off-the-light/">pull</a> <a href="http://www.beatenetworks.com/blog/index.php?/archives/372-BMW-Leaving-Second-Life.html">out</a> of Second Life that I met Darren in <a href="http://openmetaverse.org/">#libsl</a>, him saying "I have this rough proof of concept for a Second Life server made in <a href="http://en.wikipedia.org/wiki/C_Sharp_(programming_language)">C#</a>"</p>
<p>This was the answer to the problems I saw with SL, why SL would never be anything but an AOL in a world that was ready for the web.</p>
<p>But it was more than that. We quickly realized that what we would have to do, was not to build an SL clone, but rather, wait for the compelling content and services that promised to come, and let those dictate the protocols and implementations that would be needed. Or put it in another way; we all saw that Second Life would fail to deliver the 3D web - but we had no clear idea of what the 3D web would actually look like, or why anybody would want to use it, so we set out to build a framework for those who might come up with the right ideas so that they could proof of concept and implement their services with less effort.</p>
<p>The proof is in the pudding, as they say. I can't say that this approach has paid off. Most efforts has been around cloning Second Life, the content and services that one could find there, but within own organizational boundaries. Which is okay, since that was one of my original pains with Second Life.</p>
<p>But; here's the kicker: it will come. The 3D web will come. Bandwith will rise, there is a number of technologies emerging that will simplify and lower cost for layman 3D media production and there will be services that leverage the richer environment that is 3D to the point where we think, again, "how is it possible that we ever used to enjoy this thing not in 3D?"</p>
<p>And at that point, there will be a need for a configurable and robust platform to deliver rich, shared and highly dynamic 3D scenes in an optimized and user-friendly manner. Probably more like an embedded interactive continuous video stream than like an embedded casual flash game.</p>
<p>That platform will not be Second Life. But it might be Open Simulator. This depends on where the OpenSim community decide to take the platform. It also depends on the service developers, <a href="http://blog.iliveisl.com/the-end-of-a-second-life-chapter/">the</a> <a href="http://ordinalmalaprop.com/engine/2010/01/31/explanation">innovators</a> <a href="http://alphavilleherald.com/2010/03/mayor-of-victoriana-30000-wasted-lindens-killed-the-dream.html">that</a> <a href="http://zonjacapalini.wordpress.com/2009/04/30/the-openspace-fiasco-six-months-later/">has</a> <a href="http://rezzable.com/blog/rightasrain-rimbaud/rezzable-moving-second-life">left</a> <a href="http://tentacolor.com/2010/04/23/a-bittersweet-fourth-rezday/">Second</a> <a href="http://antoniusmisfit.blogspot.com/2010/04/leaving-second-life-and-embracing.html">Life</a>, or are currently pulling their hairs over how the platform is step by step bereaving them of the degrees of freedom that is necessary for their success.</p>
<p>Will we meet on the other side of the next wave?</p>
<p>/Stefan</p>
<p><em>Disclosure: I'm one of the founders of Open Simulator. I also had a company trying to capitalize on Second Life/OpenSim that went belly up. Thus, I'm equipped with kick-ass 20-20 hindsight.</em></p>
<p><em><span style="font-style: normal;"><strong>Update</strong>: Diva did an excellent <a href="http://www.metaverseink.com/blog/?p=33">follow-up blog</a> that's a must-read.</span></em></p>
<p><strong>Update</strong>: Rob Knop wrote a great <a href="http://www.sonic.net/~rknop/blog/?p=272">blog</a> that fills in a bit more on why the LL change of direction is a change of direction away from the 3D web.</p>
]]></content:encoded>
			<wfw:commentRss>http://lbsa71.net/2010/06/10/in-light-of-recent-events/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>OpenSim unfinished symphony</title>
		<link>http://lbsa71.net/2009/12/02/opensim-unfinished-symphony/</link>
		<comments>http://lbsa71.net/2009/12/02/opensim-unfinished-symphony/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 20:14:12 +0000</pubDate>
		<dc:creator>lbsa71</dc:creator>
				<category><![CDATA[OpenSimulator]]></category>

		<guid isPermaLink="false">http://lbsa71.net/?p=166</guid>
		<description><![CDATA[Odd thing this; falling out of OpenSim development I feel like I imagine HAL did, parts of my self falling off and in the end I will probably do the programmer equivalent of droning "daaaisssyyy, daaaaaaiiisss..." and come to a grinding halt.
Before that actually happens, I'll just make sure to squeeze out this blog, listing [...]]]></description>
			<content:encoded><![CDATA[<p><em>Odd thing this; falling out of OpenSim development I feel like I imagine HAL did, parts of my self falling off and in the end I will probably do the programmer equivalent of droning "daaaisssyyy, daaaaaaiiisss..." and come to a grinding halt.</em></p>
<p><em>Before that actually happens, I'll just make sure to squeeze out this blog, listing the projects (aka 'really good and low hanging fruit kind of ideas') I wanted to do with OpenSim, but never got a chance to. If only for posterity. Here goes:</em></p>
<h1>Identifying assets with URL, not GUID</h1>
<p>The main idea would be to implement a model where the viewer and region communicated guids as asset id's, but that the regions communicated urls as asset identifiers to the back ends. This would lead to general awesomeness, as assets could truly be served by simple web servers. The region would then simply serve as an asset streamed redistribution cache, fetching data in arbitrary format and converting them locally to the format best suited for the given client. Of course, in the case of the LL stack, because asset data can reference other assets, you would have to substitute guids to urls and back in the asset data: the region would thus have to have a system to keep track of guid&lt;-&gt;url mapping, but it is my firm belief that this is doable.</p>
<p>Status: I did start on this in trunk, but stopped; now it's been removed, but I believe I proved the guid substitution in asset data approach is doable.</p>
<h1>Avatar Appearance defined by URL, not GUID</h1>
<p>A companion to the above, the avatar appearance would be defined as a http endpoint; an xml file outlining the appearance pointing to assets by urls instead of a guids. The content could then either be assembled procedural, thru a database, or as a simple published xml file. If this would then be expanded to an "aar" (avatar archive) file format that encapsulates all the assets involved, this would take avatar portability home.</p>
<p>Status: Pure dreamland, but probably not that hard given the appearance is already fetched over http with guids, and OpenSim already have oars and iars.</p>
<h1>Virtual Inventory Nodes</h1>
<p>Each inventory node would be identified with an url, not a guid; this would lead to being able to distribute a users inventory over several services - allowing for services to update inventory nodes in real time, for example after a service upgrade of some inventory asset, interacting with a web page or changing to premium services. Think of the inventory a bit like 3d web 'favorites' links to content that still can change.</p>
<p>Status: Pure dreamland, and the feature could get pretty messy real fast. Still, it's probably the way to go. Arguably not that hard either given that inventory is communicated as xml over http in OpenSim today.</p>
<h1>Unified UI Toolbox</h1>
<p>The main idea would be to implement a shell executable that loads Mono.Addins for functionality separated from user interface, where the latter can be implemented for any environment (winforms, silverlight, ajax, gtk, you name it) whilst sharing the functionality (intelligent ini configuration, connectivity troubleshooter, region launching and monitoring, console command&lt;-&gt;gui mapping, log file config and analysis, various launcher url schemes, database management et c) - this model would help developers cooperate on shared functionality and environment-specific UI separately.</p>
<p>Status: Proof of concept lying around on my harddrive, just editing a few ini settings in a WinForm gui. It works, and it's cool as heck.</p>
<h1>Tribal One Viewports</h1>
<p>In Tribal One, we had a 'viewport', which was a scene object defining a cube, in which content was governed by a http endpoint. In OpenSim, one could do a first implementation by implementing a non-backed up scene object that would "load xml" or "load oar" its content, rotated and displaced with the 'viewport'. The viewport also 'snapped' to other surfaces which let you for example define that a picture always hung on a vertical surface, or that a lamp always was aligned standing on the horizontal surface below it. Pure awesomeness taking building from generic objects so much easier. The idea was that content in a region would be 'assembled' from a great number of web sources, most of them probably programatically generated, procedurally or from databases, and other just simple static xml files.</p>
<p>Status: As with all Tribal One code, based on ~r2000 code, so a total mess to bring up to date.</p>
<h1>On-demand regions</h1>
<p>Basically, it would not be that hard to have OpenSim turn the solid-state running-region paradigm around, and allowing for on-demand regions that were started and loaded from database when somebody tried to teleport to them, and that closed down when nobody was around in them. This would mean the cpu capacity is not connected to land mass but to land use. Combined with the viewports, we're starting to look at something truly like a modern web page, where a region is started and generated in a response to a user need; you and I might be in very similar regions, but mine is subtly different because I wanted something subtly different.</p>
<p>Status: We did this in Tribal One, but all regions were started and served in one single instance, so didn't scale. Still, the result was amazing. In PIM, we had a 'pool' of region processes that were re-configured (re-loaded) as people wanted access to different 'class rooms'.</p>
<h1>Binary de-duplication and scavenging</h1>
<p>The idea is to split the asset table as so to extract the actual binary data out of it and into a separate table, with a foreign key. This way, you could make sure to do a SHA-256 hash on all new binary data and normalize the tables by making multiple assets point to the same binary data row and removing the duplicate. The process that computes SHA-256 and normalizes the asset table could run as a separate tool, or as a ROBUST service. On frequent archive (re-)loading, you would still have massive duplication of data rows, but at least the binary storage wouldn't swell just as fast.</p>
<p>Status: There's already a sha field in the asset database, this approach has been discussed back and forth, but nothing general has yet surfaced.</p>
<p><em>Epilogue: If anybody thinks any of this is a good idea, and want to know more of the thoughts behind it, I'd be more than happy to share. Same goes for code.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://lbsa71.net/2009/12/02/opensim-unfinished-symphony/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Open Source has its place</title>
		<link>http://lbsa71.net/2009/11/24/open-source-has-its-place/</link>
		<comments>http://lbsa71.net/2009/11/24/open-source-has-its-place/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 08:54:59 +0000</pubDate>
		<dc:creator>lbsa71</dc:creator>
				<category><![CDATA[OpenSimulator]]></category>

		<guid isPermaLink="false">http://lbsa71.net/?p=155</guid>
		<description><![CDATA[In his must-read article "The 'wisdom of crowds' loses steam" Matt Asay makes a number of good points:

As open source projects mature, scarcity of "easy fixes" and heightened thresholds for contributing (as quality and form is being prioritized over features) leads to volunteers leaving.
A handful of paid programmers can deliver better than a dispersed "community".
How you [...]]]></description>
			<content:encoded><![CDATA[<p>In his must-read article "<a title="http://news.cnet.com/8301-13505_3-10403780-16.html" href="http://news.cnet.com/8301-13505_3-10403780-16.html">The 'wisdom of crowds' loses steam</a>" Matt Asay makes a number of good points:</p>
<ul>
<li>As open source projects mature, scarcity of "easy fixes" and heightened thresholds for contributing (as quality and form is being prioritized over features) leads to volunteers leaving.</li>
<li>A handful of paid programmers can deliver better than a dispersed "community".</li>
<li>How you treat your "community" is not that different from how a corporation would treat their "partners" and "customers".</li>
<li>Companies relying on "community" to code for them is a bad idea.</li>
<li>"Communities" relying on companies to code for them is a bad idea.</li>
</ul>
<p>What I feel Matt fails to point out is that all his examples shows initiatives that at some time relied on volunteers to a high degree to get started, then slowly tranformed into various corporate-like structures. In effect, there is a "volunteer phase" in some initiatives which get them to market faster. One could argue that some initiatives would probably not get to market at all if it weren't for this phase.</p>
<p>A project does not consist of programmers alone; testers, evangelists, documentators, third party application programmers - with some of these roles you actually want a large and varied group that can approach issues from different angles.</p>
<p>Another point that is not clearly communicated is that there is two different perspectives on open source development communities; whether you're a company like MySql partly crowdsourcing your production, or if you're part of an community, where there is no clear corporate interest in, or control over, the community itself. Or to put it another way, If you're on the outside peeking in (possibly thru agents), or if you're on the inside looking out.</p>
<p>In the case of <a href="http://opensimulator.org">OpenSimulator</a>, the Open Source project I know best, I would translate this article to the following recommendations:</p>
<ul>
<li>As a commercial interest, you cannot rely on the community to function as your development department. If you need development, you need to secure dev resources for yourself.</li>
<li>As a member of the OpenSim community, you are essentially customer and partner to yourself.</li>
<li>In the far future, if and when the product has matured, OpenSim will eventually need some kind of governance, and the rate of volunteer effort will dwindle.</li>
<li>Key is to be getting the balance right between governance and volunteer effort, and getting a sound mix of dependencies on commercial sources. At the time being, I'd say the project have a healthy mix of large and small commercial and non-commercial interests.</li>
</ul>
<p>Do you agree?</p>
]]></content:encoded>
			<wfw:commentRss>http://lbsa71.net/2009/11/24/open-source-has-its-place/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Stepping down from OpenSim core</title>
		<link>http://lbsa71.net/2009/09/23/stepping-down-from-opensim-core/</link>
		<comments>http://lbsa71.net/2009/09/23/stepping-down-from-opensim-core/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 20:38:56 +0000</pubDate>
		<dc:creator>lbsa71</dc:creator>
				<category><![CDATA[OpenSimulator]]></category>

		<guid isPermaLink="false">http://lbsa71.net/?p=149</guid>
		<description><![CDATA[I've decided to step down from OpenSim core.
Since Tribal Media keeled over, my life situation simply does not allow me neither to participate in the dev community regularly nor contribute code. I have committed exactly three characters since we moved to git.
What I have come to respect the most in OpenSim is the disrespectful attitude [...]]]></description>
			<content:encoded><![CDATA[<p>I've decided to step down from <a href="http://opensimulator.org">OpenSim </a>core.</p>
<p>Since Tribal Media keeled over, my life situation simply does not allow me neither to participate in the dev community regularly nor contribute code. I have committed exactly three characters since we moved to git.</p>
<p>What I have come to respect the most in OpenSim is the disrespectful attitude against 'talk'.</p>
<p>OpenSim has always been about participating thru effort; testing, promoting, writing, coding, building. So while discussion has always been welcome, any kind of demands have always been met with "do it yourself, or pay someone to do it". A harsh sentiment, but ultimately the only viable attitude in a project like this.</p>
<p><a href="http://dague.net/">Sean Dague</a> disliked the term 'founding four', feeling that just because you were among the first didn't automatically give you authority. Back then, I didn't agree; for some time now, I have.</p>
<p>So rather than lingering, I'm leaving.</p>
<p>I wish to thank all core devs, past and present; thank you all gridnauts, testers, hosts, customers and partners - It's been an immensely satisfying ride. Hope to see you all on the 3D Web.</p>
<p>Best regards,<br />
<em>Stefan Andersson aka lbsa71</em></p>
]]></content:encoded>
			<wfw:commentRss>http://lbsa71.net/2009/09/23/stepping-down-from-opensim-core/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Introducing StyleCop on Legacy Projects using StyleCop for ReSharper</title>
		<link>http://lbsa71.net/2009/09/10/introducing-stylecop-on-legacy-projects-using-stylecop-for-resharper/</link>
		<comments>http://lbsa71.net/2009/09/10/introducing-stylecop-on-legacy-projects-using-stylecop-for-resharper/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 09:34:37 +0000</pubDate>
		<dc:creator>lbsa71</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[resharper]]></category>
		<category><![CDATA[stylecop]]></category>

		<guid isPermaLink="false">http://lbsa71.net/?p=116</guid>
		<description><![CDATA[Recently, I've been working with introducing StyleCop on some legacy projects using the StyleCop for ReSharper plug-in.
This Blog aims to collect my findings, and also give some idea of what one can expect from using ReSharper to achieve StyleCop compliance.
First, I'll go thru how I auto-cleaned issues in one project, and after that I'll give [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, I've been working with introducing <a href="http://code.msdn.microsoft.com/sourceanalysis">StyleCop</a> on some legacy projects using the <a href="http://www.codeplex.com/StyleCopForReSharper">StyleCop for ReSharper</a> plug-in.</p>
<p>This Blog aims to collect my findings, and also give some idea of what one can expect from using <a href="http://www.jetbrains.com/resharper/">ReSharper</a> to achieve StyleCop compliance.</p>
<p>First, I'll go thru how I auto-cleaned issues in one project, and after that I'll give some numbers from a complete solution.</p>
<h2>A Single Legacy Project</h2>
<p>The single legacy project was a measly 16 .cs files big, of which 2 were designer files. Just turning StyleCop onto this yielded 370 issues.</p>
<p>While this may come off as deterring at first, this blog is about how to use StyleCop for ReSharper to bring that down considerably.</p>
<h3>Excluding designer files and generated files</h3>
<p>Since Visual Studio .Designer.cs files aren't StyleCop compliant (no VS templates are) you probably want to exclude those from StyleCop.</p>
<p>These are your options:</p>
<ul>
<li>Doing it project-wide  from the "Detailed Settings" on the "Rules" tab of the <a href="http://blogs.msdn.com/sourceanalysis/pages/managing-source-analysis-project-settings.aspx">StyleCop Project Settings</a>.</li>
</ul>
<ul>
<li>Setting it per designer file by including a<br />
//&lt;auto-generated /&gt;<br />
comment in the file header.</li>
</ul>
<h3>Handling Documentation Issues</h3>
<p>First of all, you need to decide on how to handle the documentation issues, which normally will account for around half the warnings.</p>
<p>These are your options:</p>
<ol>
<li>Temporarily turn off all StyleCop rules but the documentation rules, and remedy those manually before going ahead with cleaning up the rest of the code.</li>
<li>Permanently turn off all StyleCop documentation rules, and concentrate on the code.</li>
<li>Auto-generate documentation tags by doing a "Code Cleanup" with all documentation cleanup modules enabled.</li>
</ol>
<p>I would not recommend number three, as it will pollute your code with less-than-meaningful documentation comments.</p>
<h3>Handling Header Formatting Documentation Issues</h3>
<p>StyleCop is quite strict on how the <a href="http://blogs.msdn.com/sourceanalysis/pages/configuring-file-header-company-and-copyright.aspx">file header</a> should be formatted. It needs to have the filename in a copyright element, and you're not allowed to wrap the header in a region, for example.</p>
<p>To fix the header, you have these options:</p>
<ol>
<li>If your policy dictates an StyleCop-incompatible header content, permanently disable StyleCop rules concerning file header.</li>
<li>If your policy dictates you have a multi-line copyright + licence text, manually Copy+Paste a compliant file header into each file, applying the quick fix to update the file="" attribute of the copyright element.</li>
<li>If your policy allows for a single-line copyright statement, let the Stylecop plugin create those for you on running Code Cleanup.  <a href="http://blogs.msdn.com/sourceanalysis/pages/configuring-file-header-company-and-copyright.aspx">Fill in 'Company Information' in the StyleCop Settings</a>, enable "Update file header" and let the StyleCop plugin "Replace entire header" in the Code Cleanup settings.</li>
</ol>
<p><a href="http://lbsa71.net/wp-content/uploads/2009/09/Update_file_header.PNG"><img title="Update_file_header" src="http://lbsa71.net/wp-content/uploads/2009/09/Update_file_header.PNG" alt="Update_file_header" width="381" height="47" /></a></p>
<p><a href="http://lbsa71.net/wp-content/uploads/2009/09/Update_file_header_2.PNG"><img title="Update_file_header_2" src="http://lbsa71.net/wp-content/uploads/2009/09/Update_file_header_2.PNG" alt="Update_file_header_2" width="479" height="48" /></a></p>
<p>Taking these measures brought down the number of issues to 302.</p>
<h3>Configuring StyleCop Code Cleanup</h3>
<p>You need to configure ReSharper to have the built-in Code formatting help auto-format for StyleCop compliance.</p>
<p>Fortunately, the StyleCop for ReSharper comes with a StyleCopCodeStyle.xml resharper codestyle export, that you can import from the ReSharper options dialog.</p>
<p><a href="http://lbsa71.net/wp-content/uploads/2009/09/Code_Style_Sharing.PNG"><img class="alignnone size-full wp-image-136" title="Code_Style_Sharing" src="http://lbsa71.net/wp-content/uploads/2009/09/Code_Style_Sharing.PNG" alt="Code_Style_Sharing" width="377" height="73" /></a></p>
<p>A couple of notes on applying the StyleCopCodeStyle.xml code styles:</p>
<ul>
<li>I set "Blank lines between using groups" to zero; otherwise I get the "usings should be sorted alphabetically" issue as the "sort usings" only do so within using groups.</li>
<li>I set "Wrap Lines" to zero, as StyleCop really doesn't like that.</li>
<li>And of course, you need re-specify your StyleCop and Code Cleanup settings for documentation and header file fixes as per above.</li>
</ul>
<h3>Running Code Cleanup</h3>
<p>After running the Code Cleanup with these settings and rebuilt, I'm now down to 24 issues - less than a tentht of the original number of warnings.</p>
<p>Running Code Cleanup a second time and rebuilding yields 21 warnings, a third cleanup round gives 16, and finally, doing it a fourth time and rebuilding I land on 10 issues.</p>
<p>This odd behaviour is because each cleanup round only adresses one of several potential issues per code block, and in the process, they sometime introduce new issues.</p>
<p>So just run Code Cleanup and rebuild until the number of issues stabilizes.</p>
<p>While working with this, the <a href="http://www.codeplex.com/StyleCopForReSharper/Wiki/View.aspx?title=Fixes">StyleCop Fixes page</a> is an invaluable resource to debug your ReSharper Code Cleanup settings.</p>
<h3>Manual fixes</h3>
<p>The last 10 issues were actual errors or issues where there isn't enough context for Code Cleanup to do automatic refactorings. All of them were easily remedied given the available ReSharper refactorings:</p>
<ol>
<li>SA1401: Public fields should be exposed thru properties – if there is a good reason for exposing public fields directly, this warning can be suppressed using the suppression quickfix.</li>
<li>SA1305: No Hungarian notation-like variable names.</li>
<li>SA1300: Function names should begin with upper-case letter.</li>
</ol>
<p>All in all, there were automatic or semi-automatic fixes for all issues.</p>
<h2>A Full Solution</h2>
<p>For my second test, I used a production solution consisting of 26 projects, all with roughly the same code content as my single project.</p>
<p>Turning StyleCop on yielded 5500+ issues.</p>
<p>Fixing Designer files, Documentation and header issues brought this down to 2924 issues.</p>
<ul>
<li>If you want to set StyleCop settings (exclude documentation, no designer files et c) on the full solution, copy/move a suitable Settings.StyleCop into the solution directory. The default for StyleCop is to try and merge the local project Settings.Stylecop with the one in the parent directory.</li>
</ul>
<p>Applying Code Cleanup iteratively took me down to 264, 261, 256 and finally 255 issues.</p>
<p>During both this test and the single project test I experienced 'hiccups' where a certain issue weren't fixed by a global Code Cleanup, but redoing it on the single file or using the quickfix would.</p>
<h2>Conclusion</h2>
<p>By using the StyleCop for ReSharper plugin, introducing StyleCop on legacy projects can be reasonably painless. The main part is to comply with the documentation rules; once these are handled, the issues remaining can be fixed reasonably simple and with a small amount of developer work, even for large solutions.</p>
<p>If you have questions, think there is something I've ommitted in this article or just want to share your experiences or good links with the world, please don't hesitate to comment.</p>
<p>Happy refactoring!</p>
<p><em>Stefan Andersson</em></p>
]]></content:encoded>
			<wfw:commentRss>http://lbsa71.net/2009/09/10/introducing-stylecop-on-legacy-projects-using-stylecop-for-resharper/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The OpenSim lightweight Release Cycle</title>
		<link>http://lbsa71.net/2009/05/26/the-opensim-lightweight-release-cycle/</link>
		<comments>http://lbsa71.net/2009/05/26/the-opensim-lightweight-release-cycle/#comments</comments>
		<pubDate>Tue, 26 May 2009 11:29:43 +0000</pubDate>
		<dc:creator>lbsa71</dc:creator>
				<category><![CDATA[OpenSimulator]]></category>

		<guid isPermaLink="false">http://lbsa71.net/?p=88</guid>
		<description><![CDATA[The goal of the OpenSim lightweight Release Cycle is to run a cycle that churns out recommended code snapshots with reasonably regular intervals, and with a minimum of work for any one human resource. It should be a community effort, and anyone should be able to move the cycle forward.]]></description>
			<content:encoded><![CDATA[<p>This is the current (as of the 0.6.5 release) <a href="http://opensimulator.org">OpenSim</a> lightweight Release Cycle recipe.</p>
<p>The goal is to run a cycle that churns out recommended code snapshots with reasonably regular intervals, and with a minimum of work for any one human resource. It should be a community effort, and anyone should be able to move the cycle forward.</p>
<p>If you're not acquainted with svn revision numbering schemes, see "<a href="http://lbsa71.net/2009/05/26/on-revisions-tags-and-branches/">On revisions, tags and branches"</a> for additional info.</p>
<p>The Cycle: </p>
<ol>
<li>Developers and Testers work on <em>/trunk</em> ("testers" being defined as "users feeding off trunk", also lovingly known as "trunkheads")</li>
<li>Developers and Testers identify suitable release candidate revisions, from the repository history. (for example, people on <a href="http://osgrid.org">osgrid.org </a> discuss this on their weekly meet-ups)</li>
<li>This revision is branched off as a "release candidate" (to <em>/branches/0.6.5-rc1</em> in this case), and the version number is upped and committed <em>only to this branch</em>. We don't want to up the version number in trunk until we know we have a release.</li>
<li>Testers now switch their focus to running the rc until they can give feedback on whether "rc <strong>sux</strong>" or "rc <strong>rox</strong>".<br />
Key issues:</p>
<ul>
<li>Has all version numbers been updated?</li>
<li>Does it play well with last version? Do we need to up the interface version as well?</li>
<li>Does it feel better or worse than last version?</li>
<li>Any critical errors that needs fixing first?</li>
</ul>
</li>
<li>If any <span style="text-decoration: underline;">critical but fixable</span> errors are found, these are fixed in trunk and the fixing revision is merged into the release candidate branch. (or vice versa, if that works out better)</li>
<li>If, even after this, testers agree that "rc sux" the project goes back to 1) to wait and look for the next rc (thusly named rc2)</li>
<li>If testers agree that "rc rox" the current rc revision is tagged as "-release" (to <em>/tags/0.6.5-release</em> in this case)</li>
<li>The "-rc1" branch is renamed to "-post-fixes"  (to <em>/branches/0.6.5-post-fixes</em> in this case) for continued service awaiting the next cycle. The svn rename lets us keep the revision history back thru the rc branch history.</li>
<li>The version number (and optionally interface version) uppage is merged back into trunk. (this is a minor merge which will probably always succeed without conflict)</li>
<li>The project goes back to 1)</li>
</ol>
<p>The output of this would be named revisions for each of these user categories:</p>
<ul>
<li><strong>Grid/Region owners running services in production</strong><br />
Feed off "-post-fixes" if they want stability first, or off "-release" if they want a known 'upgrade track'.</li>
<li><strong>Developers</strong><br />
Feed off <em>/trunk</em>, or off -rc or -post-fixes if they want some stability while hunting bugs or doing protoyping.</li>
<li><strong>Testers</strong><br />
Testers are committed to helping the devs find bugs at the prize of instabilities, crashes and loss of data. They therefore feed off the <em>/trunk</em> development branch or -rc depending on whether there is an RC pending release or not. (ie, is the latest version an RC, use that, if not, use <em>/trunk</em>)<br />
Everyone feeding off <em>/trunk</em> are collectively labeled 'testers', and any installation running on anything but a 'release' or 'post-fixes' revision is considered a 'test installation'.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lbsa71.net/2009/05/26/the-opensim-lightweight-release-cycle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On Revisions, tags and branches</title>
		<link>http://lbsa71.net/2009/05/26/on-revisions-tags-and-branches/</link>
		<comments>http://lbsa71.net/2009/05/26/on-revisions-tags-and-branches/#comments</comments>
		<pubDate>Tue, 26 May 2009 07:45:54 +0000</pubDate>
		<dc:creator>lbsa71</dc:creator>
				<category><![CDATA[OpenSimulator]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[0.6.5]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[versioning]]></category>

		<guid isPermaLink="false">http://lbsa71.net/?p=81</guid>
		<description><![CDATA[In light of some confusion in the wake of the 0.6.5 release of OpenSimulator, I just thought I'd share a couple of good-to-know points about SVN versioning;
In an SVN repo, the 'revision' is a discrete version of the software. But; the revision number is not an indication of sequential functional increment.
Revisions are based on a revision before [...]]]></description>
			<content:encoded><![CDATA[<p>In light of some confusion in the wake of the 0.6.5 release of <a href="http://opensimulator.org">OpenSimulator</a>, I just thought I'd share a couple of good-to-know points about SVN versioning;</p>
<p>In an SVN repo, the 'revision' is a discrete version of the software. But; the revision <em>number</em> is <span style="text-decoration: underline;">not</span> an indication of sequential functional increment.</p>
<p>Revisions are based on a revision before it, but that does not have to be the revision <em>immediately</em> before it.</p>
<p>The revision number counter is global to the svn repository, hence it is upped whenever somebody does something within the repo, regardless of what branch the thing happens to.</p>
<p>An example:</p>
<ul>
<li>I commit something to <em>trunk</em>, the rev number is upped to, say, <strong>1337</strong>, and my new version is given that number.</li>
<li>I now branch trunk into <em>/branches/mybranch</em>. I do this by doing a remote copy of trunk. This copy of trunk, although identical to 1337, is a new version and is thus given the revision number <strong>1338</strong>, the first revision on the new <span style="text-decoration: underline;">branch</span>.</li>
<li>Now I commit a number of changes to trunk, spinning past <strong>1339</strong>, <strong>1340</strong>, <strong>1341</strong> and <strong>1342</strong> - each being separate <span style="text-decoration: underline;">versions</span> but on the <span style="text-decoration: underline;">branch</span> called <em>/trunk</em> (think of it as paths)</li>
</ul>
<p>Now, if I commit some minor change to <em>/branches/mybranch</em>, what revision number will it get? You guessed it - <strong>1343</strong>.</p>
<p>If I now commit something to <em>/trunk</em> again, it will get <strong>1344</strong>. I then commit something to the really really old branch <em>/branches/reallyoldbranch</em> that was based on, say, revision 666. It will now get <strong>1345</strong>.</p>
<p>So, my point is: you should never talk about revision numbers when your're trying to convey an idea of some kind of sequential advancement of state.</p>
<p>Ie, in my example, 1344 is probably the one reflecting the most development, 1343 is essentially based on 1337 and 1345, currently the highest rev number, could basically be six months old, with just a minor modification.</p>
<p>Now on to tags:</p>
<p>Trunk, branches and tags are really all one thing: paths. The only real difference is by convention: there is a certain path called <em>/trunk</em> that serves a certain purpose, namely to be the focal point for developers. There is a certain name used for paths other than trunk, and that is "branches". Some branches <em>by convention</em> aren't meant to be modified, but serve as snapshots of a point in time - they are called "tags".</p>
<p>But to the server, they are all revisions along differerent link paths. There is really nothing stopping you from committing to a tag - it's just the svn client will be reluctant to do so, as it's aware of the convention.</p>
<p>Keep this in mind, when referring to a 'revision' - it might be on a totally different path, so be sure to mention what path you're really talking about. specifying "<em>trunk, between revision 1343 and 1780</em>" or "<em>0.6.2 post-fixes, between revision 1764 and 2006</em>" again lets you compare revision numbers to indicate advancement of state.</p>
<p>Also, don't tell people to check a certain revision out, unless you mean <span style="text-decoration: underline;">exactly</span> that code snapshot. If you want them to check out a certain version, tell them the logical path to it instead.</p>
<p>I hope this has cleared any potential confusion up.</p>
]]></content:encoded>
			<wfw:commentRss>http://lbsa71.net/2009/05/26/on-revisions-tags-and-branches/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tribes and Tribulations</title>
		<link>http://lbsa71.net/2009/05/18/tribes-and-tribulations/</link>
		<comments>http://lbsa71.net/2009/05/18/tribes-and-tribulations/#comments</comments>
		<pubDate>Mon, 18 May 2009 15:36:09 +0000</pubDate>
		<dc:creator>lbsa71</dc:creator>
				<category><![CDATA[OpenSimulator]]></category>

		<guid isPermaLink="false">http://lbsa71.net/?p=61</guid>
		<description><![CDATA[Tribal Media has gone out of the Virtual Worlds business. Quite simply, we never could get a sustainable income out of it so finally we decided to close shop.
Darren and I have now reverted to being 'just' lbsa71 and MW, and we will both continue working with the OpenSim community.
I would like to extend my [...]]]></description>
			<content:encoded><![CDATA[<p>Tribal Media has gone out of the Virtual Worlds business. Quite simply, we never could get a sustainable income out of it so finally we decided to close shop.</p>
<p>Darren and I have now reverted to being 'just' lbsa71 and MW, and we will both continue working with the OpenSim community.</p>
<p>I would like to extend my heart-felt gratitute to the prospects, clients, peers and partners we've had that made the last two years such an exciting ride - and I'm especially thankful for all the 3D webnauts that joined us in Tribal Net. You guys rocked!</p>
<p>Also, I'd like to extend a big thank you to Darren for working so hard with me to make our visions come to life - as head of R&amp;D he produced some pretty amazing stuff that one can only hope will see the light of day some day - and to Jim, who believed in us and our vision so deeply he put his money where our mouth was.</p>
<p>Together, we wrote what will surely be a chapter in the metaverse saga.</p>
]]></content:encoded>
			<wfw:commentRss>http://lbsa71.net/2009/05/18/tribes-and-tribulations/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Oracle 11gR2 taking 100% CPU utilization</title>
		<link>http://lbsa71.net/2009/05/18/oracle-11gr2-taking-100-cpu-utilization/</link>
		<comments>http://lbsa71.net/2009/05/18/oracle-11gr2-taking-100-cpu-utilization/#comments</comments>
		<pubDate>Mon, 18 May 2009 15:03:16 +0000</pubDate>
		<dc:creator>lbsa71</dc:creator>
				<category><![CDATA[Database Administration]]></category>

		<guid isPermaLink="false">http://lbsa71.net/?p=55</guid>
		<description><![CDATA[Firts of all, this can have an array of explanations, but I just wanted to share one of them and its solution. (Here's a related problem.)
Oracle has a "Provisioning Daemon" that runs jobs that are pre-populated in the oracle install. Now, apparently, if there is a mismatch in date settings (say, from having the wrong time settings when setting [...]]]></description>
			<content:encoded><![CDATA[<p>Firts of all, this can have an array of explanations, but I just wanted to share <a href="http://forums.oracle.com/forums/thread.jspa?threadID=621165&amp;start=15&amp;tstart=0">one of them</a> and its solution. (Here's <a href="http://forums.oracle.com/forums/message.jspa?messageID=2610951#2610951">a related problem</a>.)</p>
<p>Oracle has a "Provisioning Daemon" that runs jobs that are pre-populated in the oracle install. Now, apparently, if there is a mismatch in date settings (say, from having the wrong time settings when setting up Oracle) this job template will always be in the past, and consequently, the daemon will try to start a new job, until it consumes 100% and croaks. Fixing the time issue and restarting the server won't help, as the 'bad' jobs are still waiting there when the server comes up.</p>
<p>The solution is to</p>
<ul>
<li>Stop the console</li>
<li>Run<br />
<span style="font-size: 8.5pt; color: black; font-family: &quot;Tahoma&quot;,&quot;sans-serif&quot;;">create table mgmt_job_bad as select * from sysman.mgmt_job where job_name = 'PROVISIONING DAEMON';<br />
delete from sysman.mgmt_job where job_name = 'PROVISIONING DAEMON';<br />
commit;</span></li>
<li>Restart the installation.</li>
<li>Review the mgmt_job_bad to see what needs to be done.</li>
</ul>
<p>Caveat: Those jobs were put there for a reason - you should get to know exactly what went wrong before doing this in a production environment.</p>
]]></content:encoded>
			<wfw:commentRss>http://lbsa71.net/2009/05/18/oracle-11gr2-taking-100-cpu-utilization/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
