<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Tech</title>
        <link>http://blogs.ipona.com/chris/category/87.aspx</link>
        <description>Programming, gadgets, IT stuff</description>
        <language>en-GB</language>
        <copyright>Chris Hart</copyright>
        <managingEditor>chris@digitalstrawberry.co.uk</managingEditor>
        <generator>Subtext Version 2.0.0.43</generator>
        <item>
            <title>Catching up</title>
            <link>http://blogs.ipona.com/chris/archive/2008/08/25/8526.aspx</link>
            <description>&lt;p&gt;I've been totally swamped with all sorts of projects recently, including hacking with OpenSim code, building a SharePoint deployment solution, building content for then hosting another fantastic event on Second Life, hosting Code Clinics on Microsoft Island every Wednesday, and watching Bob the Builder (we love BBC &lt;a title="BBC iPlayer" href="http://www.bbc.co.uk/iplayer"&gt;iPlayer&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;From the recent code clinics I've had requests for some links and follow-up materials, so catching up on the past few weeks here's what I've got (it's not an exhaustive list, sorry, but I'll try to keep more notes following meetings in future!):&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Data Access tricks - the Using statement&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This one generated a fair bit of feedback from members who'd not discovered this extremely handy tool. With minor tweaks to your code you can ensure that data access code always closes your connections cleanly. For example:&lt;/p&gt;
&lt;pre&gt;Using conn As New SqlConnection(dsn)&lt;br /&gt;  Using cmd As New SqlCommand("SELECT * FROM Employees", conn)&lt;br /&gt;    conn.Open()&lt;br /&gt;      Using rdr As SqlDataReader = cmd.ExecuteReader()&lt;br /&gt;        While rdr.Read()&lt;br /&gt;          Console.WriteLine(rdr(0))&lt;br /&gt;        End While&lt;br /&gt;      End Using&lt;br /&gt;  End Using&lt;br /&gt;End Using &lt;/pre&gt;
&lt;p&gt;And here is the C# version:&lt;/p&gt;
&lt;pre&gt;using (SqlConnection conn = new SqlConnection(dsn))&lt;br /&gt;using (SqlCommand cmd = new SqlCommand("SELECT * FROM Employees", conn))&lt;br /&gt;{&lt;br /&gt;  conn.Open();&lt;br /&gt;  using (SqlDataReader rdr = cmd.ExecuteReader())&lt;br /&gt;  {&lt;br /&gt;    while (rdr.Read())&lt;br /&gt;       Console.WriteLine(rdr[0]);&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;And it can be used for much more than just data access code too. Here's a starting resource for you:  &lt;a title="http://msdn.microsoft.com/en-us/library/yh598w02(VS.80).aspx" href="http://msdn.microsoft.com/en-us/library/yh598w02(VS.80).aspx"&gt;http://msdn.microsoft.com/en-us/library/yh598w02(VS.80).aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Themes in Visual Studio&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tools - Options, in almost any flavour of Visual Studio. Head into that menu and you can customise your entire environment, showing line numbers, control how your code is formatted, and change your font styles and colours completely. &lt;a title="Visual Studio Themes" href="http://www.hanselman.com/blog/VisualStudioProgrammerThemesGallery.aspx"&gt;Scott Hanselman's&lt;/a&gt; blog post on this has some great links to some dark themes for Visual Studio.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VS 2008 &amp;amp; .NET 3.5 SP1&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Quite a lot of new features bundled in the latest point release - yes, the numbering system for .NET really is all over the place, since this service pack includes new features, not just bug fixes. But no, it's 3.5 SP1, not 3.6. Numbering aside, for more information, and links to the download, head &lt;a title="Visual Studio 2008 Service Pack 1 and .NET Framework 3.5 Service Pack 1" href="http://msdn.microsoft.com/en-us/vstudio/products/cc533447.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SQL Server 2008&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The latest and greatest database from the MS; personally I'm interested in seeing if I can get my OpenSim database down from 1.4Gb to something more realistic with some of the new data compression wizardry! For more about new data types, new features, and the rest, head &lt;a title="SQL Server 2008 Overview" href="http://www.microsoft.com/sqlserver/2008/en/us/overview.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10 Tips to Better Javascript&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;From the recent discussion on how to improve your JavaScript life came the following:&lt;/p&gt;
&lt;pre&gt;/* JavaScript &lt;br /&gt;    - it's not as bad as you think */ &lt;br /&gt;
/* 10 steps to better JS Code */ &lt;/pre&gt;
&lt;br /&gt;
&lt;pre&gt;var agenda = [&lt;br /&gt;    'Use a proper editor and debugger',&lt;br /&gt;    'Use var obsessively',&lt;br /&gt;    'Understand "falsiness" and "truthiness"',&lt;br /&gt;    'Learn to love object, function and array literals',&lt;br /&gt;    'Grasp the symbol/string dichotomy',&lt;br /&gt;    'Learn to use regexes and JS string functions',&lt;br /&gt;    'Master scope and closures',&lt;br /&gt;    'Don\'t try to build classes like you\'re used to',&lt;br /&gt;    'Grok "this" and functions as values',&lt;br /&gt;    'Use JQuery'&lt;br /&gt;];&lt;/pre&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;If you've not yet joined us for a Code Clinic on Microsoft Island, or have never even logged onto Second Life, why not give it a try? It's a great way to meet peers and learn about new and existing technology without having to leave your own home. Drop me a line if you need convincing - chris at codetorque dot com.&lt;/p&gt;&lt;img src="http://blogs.ipona.com/chris/aggbug/8526.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Chris Hart</dc:creator>
            <guid>http://blogs.ipona.com/chris/archive/2008/08/25/8526.aspx</guid>
            <pubDate>Mon, 25 Aug 2008 18:03:37 GMT</pubDate>
            <wfw:comment>http://blogs.ipona.com/chris/comments/8526.aspx</wfw:comment>
            <comments>http://blogs.ipona.com/chris/archive/2008/08/25/8526.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ipona.com/chris/comments/commentRss/8526.aspx</wfw:commentRss>
        </item>
        <item>
            <title>OpenSim on SQL Server</title>
            <link>http://blogs.ipona.com/chris/archive/2008/06/11/8502.aspx</link>
            <description>&lt;p&gt;Over the past week I've made some great progress on my OpenSim experiment. For starters, I've got my server configured in Grid mode, and I have all four of the main servers running on SQL Server. This did require a bit of development - the inventory server was quite broken for SQL Server, so James and I fixed the code and submitted a patch, but the good news is that this means it'll be in a better state for the rest of you from now on.&lt;/p&gt; &lt;p&gt;If you're committed to switching from SQLite as much as possible then I would recommend configuring your server to run in grid mode. Even if you are working locally, there's something a bit more comforting about seeing messages relevant to each server on each of the console windows, rather than all jumbled up in one console window. Makes it much easier to see bugs and have a think about how to fix them, for starters.&lt;/p&gt; &lt;p&gt;So, where to start? Well, good news and bad news - the good news is that this is possible, the bad news is that it's not simple, and unless you figure out how to export content from a SQLite-based OpenSim, you'll be starting from scratch on your new sim. Before you start, you obviously need a SQL Server to work with. As long as you can install SQL Express on your OpenSim server, you have everything you need, and since SQL Express is a free download, there's no cost involved. Get SQL Express from &lt;a title="SQL Express product page" href="http://www.microsoft.com/sql/editions/express/default.mspx" target="_blank"&gt;here&lt;/a&gt;, then get SQL Management Studio Express from &lt;a title="SQL Server Management Studio Express" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c243a5ae-4bd1-4e3d-94b8-5a0f62bf7796&amp;amp;displaylang=en" target="_blank"&gt;here&lt;/a&gt; - this will give you a tool for running queries and editing your database.&lt;/p&gt; &lt;p&gt;Now, I'm assuming you've done the right thing and already configured your system so you have a Subversion client installed, right? &lt;a href="http://tortoisesvn.tigris.org/" target="_blank"&gt;TortoiseSVN&lt;/a&gt; is my favourite, with its extremely simple shell integration. So, you have an OpenSim directory and you can grab the latest source code from the Subversion repository - this is pretty important, since the code changes very frequently. Now you will need to head to SQL Management Studio Express and create a database ready to store your OpenSim data. Right-click on the Databases node and and select &lt;strong&gt;New Database&lt;/strong&gt;. Call it &lt;strong&gt;OpenSim&lt;/strong&gt;, accept all defaults and click OK.&lt;/p&gt; &lt;p&gt;The next step is to create a user account for running your OpenSim on SQL Server. Firstly, you need to enable Mixed Mode authentication on SQL Server.  &lt;/p&gt;&lt;p&gt;Right-click on your database server in Management Studio and select &lt;strong&gt;Properties&lt;/strong&gt;, then go to the &lt;strong&gt;Security&lt;/strong&gt; tab and select &lt;strong&gt;SQL Server and Windows Authentication&lt;/strong&gt; mode, click OK. Back in Management Studio, expand the &lt;strong&gt;Security&lt;/strong&gt; node and in the &lt;strong&gt;Logins&lt;/strong&gt; section right-click and create a new user, called whatever you like, select &lt;strong&gt;SQL Server authentication&lt;/strong&gt;, give it a strong password and select the &lt;strong&gt;OpenSim&lt;/strong&gt; database as the default database. Click OK.  &lt;/p&gt;&lt;p&gt;Then navigate to the OpenSim database and go to the &lt;strong&gt;Security&lt;/strong&gt;, then &lt;strong&gt;Users&lt;/strong&gt; section. In there, create a new user, select your new admin account and make sure it has the &lt;strong&gt;db_owner&lt;/strong&gt; role in the &lt;strong&gt;Database role membership&lt;/strong&gt; section. Click OK and you should be ready to use that account to connect to the database.  &lt;/p&gt;&lt;p&gt;Next step is to create the tables you'll need to store all the data from OpenSim. I have my OpenSim code in C:\OpenSim, so on my system, I navigate to &lt;strong&gt;C:\OpenSim\OpenSim\Data\MSSQL\Resources&lt;/strong&gt; to find the SQL scripts you'll be needing to create the base tables in the database. Open each script in turn in Management studio and click Execute against them all. Provided you have no errors, you will be good to go with running OpenSim in grid mode on SQL Server!  &lt;/p&gt;&lt;p&gt;Time to edit the Ini file. I recommend heading to the OpenSim documentation on &lt;a href="http://opensimulator.org/wiki/OpenSim_Configuration" target="_blank"&gt;configuration&lt;/a&gt; for more in-depth details on this process, but here's an abbreviated version that might help fill in some gaps for you. While there is a mssql_connection.ini file, I also have settings in my main ini file too - I haven't yet dug through the code thoroughly enough to know which ones are used and which ones are not. There's a sample mssql_connection.ini.example file in the OpenSim code repository, so make a copy, rename it &lt;strong&gt;mssql_connection.ini&lt;/strong&gt; and replace the appropriate values with the correct data for your server. As an example: &lt;/p&gt;&lt;pre&gt;[mssqlconnection]&lt;br /&gt;data_source=servername\SQLEXPRESS&lt;br /&gt;initial_catalog=OpenSim&lt;br /&gt;persist_security_info=True&lt;br /&gt;user_id=adminuser&lt;br /&gt;password=password &lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;In the main ini file,&lt;/p&gt;&lt;pre&gt;gridmode = True&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;storage_plugin = OpenSim.Data.MSSQL.dll&lt;br /&gt;storage_connection_string = "Data Source=servername\sqlexpress;Database=OpenSim;User=adminuser;password=password;";&lt;br /&gt;storage_prim_inventories = True &lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;appearance_persist = true&lt;br /&gt;appearance_database = "MSSQL"&lt;br /&gt;appearance_connection_string = "Data Source=servername\sqlexpress;Database=OpenSim;User=adminuser;password=password;";&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;inventory_plugin = OpenSim.Data.MSSQL.dll&lt;br /&gt;inventory_source = "Data Source=servername\sqlexpress;Database=OpenSim;User=adminuser;password=password;";&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;userDatabase_plugin = OpenSim.Data.MSSQL.dll&lt;br /&gt;user_source = "Data Source=servername\sqlexpress;Database=OpenSim;User=adminuser;password=password;";&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;asset_database = MSSQL&lt;br /&gt;asset_plugin = OpenSim.Data.MSSQL.dll&lt;br /&gt;asset_source ="Data Source=servername\sqlexpress;Database=OpenSim;User=adminuser;password=password;";&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;The other part of the puzzle is getting your sim running in grid mode, and for that to work you need to be a little more clever with IP addresses and the like, but don't let that put you off. Know your server's IP address, then enter it in the following section with the following port numbers:&lt;/p&gt;&lt;pre&gt;grid_server_url = http://192.168.0.1:8001&lt;br /&gt;grid_send_key = null&lt;br /&gt;grid_recv_key = null&lt;br /&gt;user_server_url = http://192.168.0.1:8002&lt;br /&gt;user_send_key = null&lt;br /&gt;user_recv_key = null&lt;br /&gt;asset_server_url = http://192.168.0.1:8003&lt;br /&gt;inventory_server_url = http://192.168.0.1:8004 &lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;Notice there are some keys listed in here that are null - you should change these so that you only allow access to people who know both your server's IP AND the appropriate keys to grid up with you. And from looking through the code, it appears that the keys are any valid string value, though I haven't yet tested this out. 
&lt;/p&gt;&lt;p&gt;You may also want to double-check that the IP address is configured correctly for your region (head to the OpenSim\bin\Regions\default.xml file) and make sure that the IP addresses are set appropriately. Again, check the OpenSim site for a bit more information on this. 
&lt;/p&gt;&lt;p&gt;Once you have configuration sorted, time to run the servers and keep your fingers crossed! The OpenSim site strongly recommends starting servers in a specific order: UGAIS: UserServer, GridServer, AssetServer, InventoryServer, Sim. Note that the first time that you fire up the servers in grid mode, you are asked for some information to create some system-specific configuration files. Make sure that when you start up each server you enter the data correctly - the data you will need to enter is exactly the same as that entered in the ini file, so make sure you fill in the fields so that they match. Once you have configured one server, move on to the next. Once you have all five running, you're almost ready to log in! 
&lt;/p&gt;&lt;p&gt;Here's a handy tip - now you have 5 console windows open, click on one of them on the task bar, then &lt;strong&gt;ctrl+click&lt;/strong&gt; on the other four windows. Right-click on any of them and select &lt;strong&gt;Tile Horizontally&lt;/strong&gt; and you will see all your servers neatly arranged, and you can watch things happening as you log in and do stuff on your sim. 
&lt;/p&gt;&lt;p&gt;Just before you connect, you need to create a user account, so go to the user console and create a new user account. Then it's time for the client bit - if you're using the SL client, set your loginuri startup switch as before, but this time you'll connect to port 8002, not port 9000, so for example: &lt;/p&gt;&lt;pre&gt;"C:\Program Files\SecondLife\SecondLife.exe" -loginuri http://192.168.0.1:8002 &lt;/pre&gt;
&lt;p&gt;Once you launch your client, you should be able to connect to your grid and off you go. Fingers crossed, and I hope it works for you. Note that I think there's a bug with creating folders in your inventory, so watch for errors there. You may have to go with a completely unorganised inventory for a while until that's fixed (which may well be soon).&lt;/p&gt;&lt;img src="http://blogs.ipona.com/chris/aggbug/8502.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Chris Hart</dc:creator>
            <guid>http://blogs.ipona.com/chris/archive/2008/06/11/8502.aspx</guid>
            <pubDate>Thu, 12 Jun 2008 01:03:11 GMT</pubDate>
            <wfw:comment>http://blogs.ipona.com/chris/comments/8502.aspx</wfw:comment>
            <comments>http://blogs.ipona.com/chris/archive/2008/06/11/8502.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ipona.com/chris/comments/commentRss/8502.aspx</wfw:commentRss>
        </item>
        <item>
            <title>SharePoint Content Deployment Walkthrough</title>
            <link>http://blogs.ipona.com/chris/archive/2008/05/29/8497.aspx</link>
            <description>&lt;p&gt;I've just been through two days of pain trying to get content deployment to work from an internal authoring site, authenticated against Active Directory, to a live site that is Internet-facing (hence allows anonymous access), and has a forms authentication user store. It's more of an admin nightmare than a developer task, but as I've found over many months, working with SharePoint as a developer involves a lot of the admin side of things too. This blog post is a guide to a proof-of-concept, and not meant for a live production environment. &lt;/p&gt;
&lt;p&gt;So, what can I share with you that might help? Well, let's list a few links that you need to read first:&lt;/p&gt;
&lt;p&gt;&lt;a title="http://technet.microsoft.com/en-us/library/cc263428.aspx" href="http://technet.microsoft.com/en-us/library/cc263428.aspx"&gt;http://technet.microsoft.com/en-us/library/cc263428.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a title="http://www.harbar.net/archive/2007/06/27/Content-Deployment-Ensure-your-platform-hygiene-before-randomly-abusing-the.aspx" href="http://www.harbar.net/archive/2007/06/27/Content-Deployment-Ensure-your-platform-hygiene-before-randomly-abusing-the.aspx"&gt;http://www.harbar.net/archive/2007/06/27/Content-Deployment-Ensure-your-platform-hygiene-before-randomly-abusing-the.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a title="http://blogs.msdn.com/sharepoint/archive/2006/05/02/content-deployment.aspx" href="http://blogs.msdn.com/sharepoint/archive/2006/05/02/content-deployment.aspx"&gt;http://blogs.msdn.com/sharepoint/archive/2006/05/02/content-deployment.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So, that out of the way, here's how I got it to work. And bear in mind that this is on a development machine where all sites are hosted on the same box - albeit in different web applications. Different applications, different authentication, same central administration application.&lt;/p&gt;
&lt;p&gt;Firstly, you'll need to have two sites, one for authoring, one for live. If you want a forms auth site as your live site, there are many resources - &lt;a href="http://www.devcow.com/blogs/jdattis/archive/2007/02/23/Office-SharePoint-Server-2007-Forms-Based-Authentication-FBA-Walkthrough-Part-1.aspx"&gt;this&lt;/a&gt; one is pretty good. When you create your sites, the golden rule applies:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The target site for content deployment MUST be created using the BLANK site template&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Even better, if you can get it to work (and I could only get this to work for an AD-based site, not the forms auth site, but I digress), you can try the following once you have created the web application to create your target site collection:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;STSADM.EXE -o createsite -url &amp;lt;url-to-site-collection&amp;gt; -ownerlogin domain\user -owneremail &amp;lt;email-address&amp;gt;&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;So, you have a blank target site. I'm going to assume you have an authoring site set up to use some kind of template - I set mine up as a collaboration portal. Another word of warning - as yet, I've not tried content deployment against a site with custom features, web parts, etc. As far as I know, those have to be installed separately and available on the destination server prior to deployment - I may have to write a follow up to this article when I get that far. Enter some content to make it clear that your site has been deployed - I added some images to the main images library and edited a couple of content editor parts. Now, over to Central Administration console you go.&lt;/p&gt;
&lt;p&gt;Head to the Operations tab and there you will find the option to change your content deployment settings and to set up deployment paths and jobs. In my Content Deployment Settings, I have configured my server to accept all incoming deployment jobs, and selected my server from the import and export server drop-downs. Worth a note - the temporary files entry on here specifies a local path for temporary storage of deployment data. I have read that you need to make sure this directory can be written to by your service account, so I added appropriate security settings to that path to make sure there would be no grumbles there.&lt;/p&gt;
&lt;p&gt;Now, to set up some paths and jobs. I created a new path and selected my source application as the authoring site. Make sure you select the appropriate site collection - mine all use the root site collection, so this was a simple setting. The URL to your Central Administration application should be simple enough to enter, and you need to make sure you can connect to that application using the appropriate credentials. One of the benefits of a hacky dev environment is a central user account for all application pools. Again, this is a proof-of-concept. Select the destination web application and site collection, then decide on what to export - user names, other security information - the choice is yours depending on your configuration. I've set this up to only deploy role definitions. Click OK, and fingers crossed the first part is done.&lt;/p&gt;
&lt;p&gt;If this works ok, you'll have a quick deploy job set up already. Try running that and pray for success (keep clicking on the Status column header to refresh the grid). If you get a fail, you may need to double-check some settings. And if you chose anything other than a blank site when you started out, don't blame me :) Now, bear in mind that this quick deploy &lt;strong&gt;&lt;em&gt;doesn't&lt;/em&gt;&lt;/strong&gt; deploy the content! This is a big thing I found - I was expecting it to have deployed everything - not so. If you browse to your site now it will look pretty empty, so you should now create a new job to deploy content from authoring to live.&lt;/p&gt;
&lt;p&gt;Create a new content deployment job for that same path and set it to deploy the entire site collection, and deploy all content, including anything previously deployed. You may be able to run this with just deploying new content, but my first instinct was to deploy everything first time. Later on, create a job to deploy changed content and set it to run on a schedule if you like. Run the job, make a coffee, then come back and find that the whole thing has run perfectly... well, that's the theory, and I certainly hope it works for you. If not, there are a lot of resources out there with suggestions for how to make it run a bit more smoothly, and there's a great blog post from &lt;a href="http://www.andrewconnell.com/blog/archive/2008/05/20/MOSS-2007-Content-Deployment-QFE-Pack-Now-Available-via-MSFT.aspx"&gt;Andrew Connell&lt;/a&gt; with information on a couple of hotfixes that might help solve some issues.&lt;/p&gt;
&lt;p&gt;I'm going to be doing a lot of work on a project that involves this configuration over the next few weeks, so I may write some more on this as and when I can. In the meantime, I'd like to thank Nebulae Voom, friendly SharePoint guru from the &lt;a href="http://slurl.com/secondlife/Microsoft%20Island/189/74/22"&gt;.NET group&lt;/a&gt; in Second Life, and &lt;a href="http://twitter.com/SharePoint"&gt;SharePoint&lt;/a&gt; from twitter (The official tweetstream of the SharePoint product group) - while neither solved this for me, you helped my brain think the right way!&lt;/p&gt;&lt;img src="http://blogs.ipona.com/chris/aggbug/8497.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Chris Hart</dc:creator>
            <guid>http://blogs.ipona.com/chris/archive/2008/05/29/8497.aspx</guid>
            <pubDate>Fri, 30 May 2008 00:06:39 GMT</pubDate>
            <wfw:comment>http://blogs.ipona.com/chris/comments/8497.aspx</wfw:comment>
            <comments>http://blogs.ipona.com/chris/archive/2008/05/29/8497.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ipona.com/chris/comments/commentRss/8497.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Exploring the OpenSim Universe</title>
            <link>http://blogs.ipona.com/chris/archive/2008/05/28/8495.aspx</link>
            <description>&lt;p&gt;Over the past few weeks I've taken a big leap into the world of Open Source development and started messing around with &lt;a title="OpenSim Main Site" href="http://opensimulator.org/wiki/Main_Page"&gt;OpenSim&lt;/a&gt;, the BSD licenced 3D virtual world based on Second Life, but reinvented from scratch using C#. It's an immense project that's been in development for a while, and it's starting to look pretty good.&lt;/p&gt;
&lt;p&gt;Getting hold of OpenSim is relatively easy, especially if you're a developer and have used &lt;a title="Subversion" href="http://en.wikipedia.org/wiki/Subversion_(software)"&gt;Subversion&lt;/a&gt; before. Grab the latest &lt;a title="Download OpenSim" href="http://opensimulator.org/wiki/Download"&gt;code&lt;/a&gt;, run the pre-build tool, build the solution and you're just about ready. Make sure you run the correct exe for your system (64bit machines have to run a 32bit launcher), and you are hosting your own little simulator that you can connect to.&lt;/p&gt;
&lt;p&gt;So, next step is to connect to the newly-created world. You can either use the standard Second Life client with a modified startup shortcut, or you can download and use the &lt;a title="realXtend viewer" href="http://www.realxtend.org/page.php?pg=downloads"&gt;realXtend&lt;/a&gt; viewer and specify your server as part of the launch. And then you're in your own little world...&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ipona.com/images/blogs_ipona_com/chris/WindowsLiveWriter/ExploringtheOpenSimUniverse_9B49/sf5_2.png"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="151" alt="sf5" width="244" border="0" src="http://blogs.ipona.com/images/blogs_ipona_com/chris/WindowsLiveWriter/ExploringtheOpenSimUniverse_9B49/sf5_thumb.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Now, since that picture was taken I've completely broken the server by attempting to hook it up to SQL Server, but that's all part of the fun - and there are so many bits and pieces to look at and tweak that this is proving to be quite an entertaining project. &lt;/p&gt;
&lt;p&gt;So, why am I doing this? Well, I've been working with &lt;a title="Reaction Grid" href="http://www.reactiongrid.com/"&gt;Kyle&lt;/a&gt; for a while on MS Island on Second Life, and this is part of an exploration of open source alternatives to the Linden Labs controlled world. &lt;a title="Project Manhattan" href="http://www.reactiongrid.com/projects.aspx"&gt;Project Manhattan&lt;/a&gt; is the first project we're working on, and it's still in its early stages - but it certainly makes a welcome change from SharePoint development. &lt;/p&gt;&lt;img src="http://blogs.ipona.com/chris/aggbug/8495.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Chris Hart</dc:creator>
            <guid>http://blogs.ipona.com/chris/archive/2008/05/28/8495.aspx</guid>
            <pubDate>Wed, 28 May 2008 22:58:59 GMT</pubDate>
            <wfw:comment>http://blogs.ipona.com/chris/comments/8495.aspx</wfw:comment>
            <comments>http://blogs.ipona.com/chris/archive/2008/05/28/8495.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ipona.com/chris/comments/commentRss/8495.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Help, my window has disappeared</title>
            <link>http://blogs.ipona.com/chris/archive/2008/05/06/8493.aspx</link>
            <description>&lt;p&gt;Handy tip that &lt;a title="James Hart's blog" href="http://blogs.ipona.com/james"&gt;James&lt;/a&gt; pointed out the other day - my Virtual PC machine console window keeps disappearing (perhaps thinking that I have an external monitor plugged in). You can see it on the task bar, but clicking on it doesn't bring it to the top of the pile on the desktop, so, how do you get it back on your main screen?&lt;/p&gt; &lt;p&gt;In the following order: &lt;/p&gt; &lt;ul&gt; &lt;li&gt;alt &lt;/li&gt; &lt;li&gt;space&lt;/li&gt; &lt;li&gt;m&lt;/li&gt; &lt;li&gt;any arrow key&lt;/li&gt; &lt;li&gt;move the mouse&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Hey presto, the window snaps to under your mouse cursor and you can drop it wherever you like. Very handy and useful to remember.&lt;/p&gt;&lt;img src="http://blogs.ipona.com/chris/aggbug/8493.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Chris Hart</dc:creator>
            <guid>http://blogs.ipona.com/chris/archive/2008/05/06/8493.aspx</guid>
            <pubDate>Tue, 06 May 2008 21:10:48 GMT</pubDate>
            <wfw:comment>http://blogs.ipona.com/chris/comments/8493.aspx</wfw:comment>
            <comments>http://blogs.ipona.com/chris/archive/2008/05/06/8493.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ipona.com/chris/comments/commentRss/8493.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Heroes Happen Here in Second Life</title>
            <link>http://blogs.ipona.com/chris/archive/2008/04/17/8487.aspx</link>
            <description>&lt;p&gt;April 26th is the day for your diary; all our preparation work finally gets load tested to the extreme as we host the &lt;a title="Heroes Happen Here in Second Life" href="http://blogs.msdn.com/zainnab/archive/2008/04/13/heroes-happen-here-launch-in-second-life-april-26th-2008.aspx"&gt;Heroes Happen Here&lt;/a&gt; launch event for Visual Studio 2008, Windows Server 2008 and SQL Server 2008 on Second Life. We're getting three extra islands for launch day so we can make the event run as smoothly as possible for all the attendees, and there'll be much partying and some freebies for those who come along to &lt;a title="Location link to Microsoft Island in Second Life" href="http://slurl.com/secondlife/Microsoft%20Island/190/73/22"&gt;the island&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;Before that happens, I'm travelling to Orlando for 3 days (figured I'd need jet lag before a major launch event), for the &lt;a title="Dev Connections Conference site" href="http://www.devconnections.com/"&gt;DevConnections&lt;/a&gt; conference, where I'm hoping to get up to speed on some of the cool new stuff that's been coming out recently. I've not had a chance to play with &lt;a title="Scott Guthrie's overview of Silverlight 2" href="http://weblogs.asp.net/scottgu/archive/2008/02/22/first-look-at-silverlight-2.aspx"&gt;Silverlight&lt;/a&gt; yet, or look into the new &lt;a title="Scott Guthrie's overview of the MVC framework" href="http://weblogs.asp.net/scottgu/archive/2007/10/14/asp-net-mvc-framework.aspx"&gt;MVC framework&lt;/a&gt;, since I've been so busy with SharePoint code and SL fun. And there's also a load of SharePoint talks happening at the same time, so I'm hoping to chat to some gurus about SharePoint Internet site projects (my next piece of work, starting soon).&lt;/p&gt; &lt;p&gt;I also mentioned recently that I was in a recording of &lt;a title=".NET Rocks site" href="http://www.dotnetrocks.com"&gt;.NET Rocks&lt;/a&gt; recently; well, the show is now &lt;a title=".NET Rocks show on Developing for Second Life" href="http://www.dotnetrocks.com/default.aspx?ShowNum=334"&gt;live&lt;/a&gt;, so hit the &lt;a title=".NET Rocks show on Developing in Second Life" href="http://www.dotnetrocks.com/default.aspx?ShowNum=334"&gt;link&lt;/a&gt; and hear a bit more about what I've been doing (along with &lt;a title="Kyle's site" href="http://www.weblevels.com"&gt;Kyle&lt;/a&gt; and &lt;a title="Zain's blog" href="http://blogs.msdn.com/zainnab/default.aspx"&gt;Zain&lt;/a&gt;) on &lt;a title="Second Life" href="http://secondlife.com/"&gt;Second Life&lt;/a&gt;, and some discussion of why it's not (as many people think of it) a game. &lt;a title="Zain's blog" href="http://blogs.msdn.com/zainnab/default.aspx"&gt;Zain Naboulsi&lt;/a&gt; does a great job of explaining that too in his recent &lt;a title="Video interview with Zain Naboulsi" href="http://blogs.technet.com/keithcombs/archive/2008/04/05/making-any-money-on-your-island.aspx"&gt;video interview&lt;/a&gt; with &lt;a href="http://blogs.technet.com/keithcombs/default.aspx"&gt;Keith Combs&lt;/a&gt; and &lt;a href="http://blogs.technet.com/matthewms/default.aspx"&gt;Matt Hester&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.dotnetrocks.com/default.aspx?ShowNum=334" href="http://www.dotnetrocks.com/default.aspx?ShowNum=334"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ipona.com/chris/aggbug/8487.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Chris Hart</dc:creator>
            <guid>http://blogs.ipona.com/chris/archive/2008/04/17/8487.aspx</guid>
            <pubDate>Fri, 18 Apr 2008 01:47:08 GMT</pubDate>
            <wfw:comment>http://blogs.ipona.com/chris/comments/8487.aspx</wfw:comment>
            <comments>http://blogs.ipona.com/chris/archive/2008/04/17/8487.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ipona.com/chris/comments/commentRss/8487.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Getting data into Second Life using .NET</title>
            <link>http://blogs.ipona.com/chris/archive/2008/02/17/8465.aspx</link>
            <description>&lt;p&gt;I've been having fun getting objects in Second Life talking to a database on my dev server using .NET code, so I thought I'd share the magic with those of you who are interested.&lt;/p&gt;
&lt;p&gt;For the SecondLife bit, I'll use the &lt;a title="llHTTPRequest on the LSL wiki" href="http://wiki.secondlife.com/wiki/LlHTTPRequest"&gt;llHTTPRequest&lt;/a&gt; object to request data from my external source. The real-world bit is some ASP.NET code running on a development server. In order to understand how this code works, you need to understand the underlying structure of a HTTP request. If you've not done anything like this before, here's a quick dive in.&lt;/p&gt;
&lt;p&gt;Each time you view a web page with your browser you're making a request to a web server for a web page. In response, the server sends the requested page data back to you. Each web request consists of request headers and the body of the request. Request headers are sent as a series of key/value pairs (though each key could have many values). The request headers that are sent as part of a request from IE7 (32bit) on a Windows Vista 64 machine with a fair few applications installed may contain the following values for the Accept and User-Agent keys respectively:&lt;/p&gt;
&lt;pre&gt;Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application, 
application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, 
application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, 
application/x-silverlight, application/x-shockwave-flash, */* &lt;/pre&gt;
&lt;pre&gt;User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; 
SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; Media Center PC 5.0; InfoPath.2; .NET CLR 3.5.21022; MS-RTC LM 8) &lt;/pre&gt;
&lt;p&gt;Chances are you'll be sending information like this with every request you make to a web server (note to self - that's a LOT of information!), and it helps application developers to know who their audience are and what browser they are using. In addition, if you fill in a form online and submit it to the server, you'll also be sending information as part of the body of the request. For example, I've got a simple HTML page with an input box and a submit button (which comes in handy for testing later):&lt;/p&gt;
&lt;pre&gt;&amp;lt;form action="VisitorTracker.aspx" method="post"&amp;gt;&lt;br /&gt;  &amp;lt;input name="avatar" type="text" /&amp;gt;&lt;br /&gt;  &amp;lt;input type="submit" /&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;/pre&gt;
&lt;p&gt;Nothing special here, and no server-side code to look at, but the interesting bit is in the request body once the form is submitted. If I enter "MyAvatar Name" in the textbox and submit the form, I will have sent a key of "avatar" (because the input has a name attribute of "avatar") with the value of "MyAvatar Name" to the server. As long as your target for the submitted form, in this case, a page called VisitorTracker.aspx, exists, you can add code to that page to handle the data when it arrives and do something with it. &lt;/p&gt;
&lt;p&gt;As well as using an HTML form to gather data and send it to the server, I can send the same request to the server from Second Life if I create a prim in-world and add some script to that prim. The following is an extract from some code I'll show you later: &lt;/p&gt;
&lt;pre&gt;llHTTPRequest("http://devsite/visitortracker.aspx", 
[HTTP_METHOD, "POST", HTTP_MIMETYPE, "application/x-www-form-urlencoded"], 
"avatar=MyAvatar%20Name");&lt;/pre&gt;
&lt;p&gt;There are a few things to note here. The llHttpRequest method takes three arguments; a string of the url of the page you are sending the data to, a list of HTTP request parameters, and the body of the request. Since we want to send the request data using a POST (the method you'd use if submitting a form to a server), this is specified in here, along with the fact that the form data has to be &lt;a href="http://en.wikipedia.org/wiki/Query_string#URL_encoding"&gt;URL encoded&lt;/a&gt;. This is why the avatar name "MyAvatar Name" has a %20 in the middle of the string, since a space character becomes a %20 when it's encoded.&lt;/p&gt;
&lt;p&gt;Right, so we've made a request to a web server for a page and have sent some information in the body of the request. Time to tell the server how to handle the request. Because my development server runs Microsoft's IIS web server, which supports writing server-side code using the ASP.NET platform, I'm going to use a simple ASP.NET page (on other servers you might use PHP or Perl or Ruby). If you are using Visual Studio 2005/2008 (Visual Web Developer Express edition or better), you can create a new web project with just one page in it. Call it visitortracker.aspx, and make sure you check the box to place the code in a separate file. I'm a C# person, though you can do it with whatever language you feel comfortable using. Here's my code:&lt;/p&gt;
&lt;p&gt;VisitorTracker.aspx:&lt;/p&gt;
&lt;pre&gt;&amp;lt;%@ Page Language="C#" AutoEventWireup="true" CodeFile="VisitorTracker.aspx.cs" Inherits="VisitorTracker" %&amp;gt;&lt;/pre&gt;
&lt;p&gt;(yes, that's all of it - delete everything else in the file; you don't need it)&lt;/p&gt;
&lt;p&gt;VisitorTracker.aspx.cs:&lt;/p&gt;
&lt;pre&gt;using System.Web;&lt;br /&gt;using System.Web.Security;&lt;br /&gt;using System.Web.UI;&lt;br /&gt;using System.Web.UI.HtmlControls;&lt;br /&gt;using System.Web.UI.WebControls;&lt;br /&gt;using System.Web.UI.WebControls.WebParts;&lt;br /&gt;using System.Xml.Linq; 
&lt;p&gt;public partial class VisitorTracker : System.Web.UI.Page&lt;br /&gt;{&lt;/p&gt;&lt;p&gt;  protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;  {&lt;br /&gt;  } &lt;/p&gt;
&lt;p&gt;  protected override void Render(HtmlTextWriter writer)&lt;br /&gt;  {&lt;br /&gt;    string detectedAvatar = (string)Request.Form["avatar"];&lt;br /&gt;    writer.WriteLine("Detected avatar: " + detectedAvatar);&lt;br /&gt;    base.Render(writer);&lt;br /&gt;  }
&lt;br /&gt;}&lt;/p&gt;&lt;/pre&gt;
&lt;p&gt;This code essentially turns the page into a web service of sorts - I'm making a very simple request of the page, and all I'm getting back is data, without any markup or presentation logic. As it happens, the data is human-readable, and we can use this to display a confirmation message on a test prim in Second Life. You can send back whatever you like in the Render method using the writer object, but bear in mind that there is a restriction on the length of the response body in Second Life - you get a maximum of 2048 bytes; if it is longer it will be truncated (with thanks to the LSL wiki for that nugget of information!) Make sure it all builds, then, if you want to test this file without logging into SecondLife, you can create a simple HTML page containing the code I showed earlier between the HTML &lt;strong&gt;body&lt;/strong&gt; tags, then try submitting that form. You should see the message:&lt;/p&gt;
&lt;pre&gt;Detected avatar: MyAvatar Name&lt;/pre&gt;
&lt;p&gt;(or whatever name you entered in the input box.)&lt;/p&gt;
&lt;p&gt;Back in SecondLife, you can enter the following script into the script file on your prim (changing the name of the server as appropriate) to submit a nice request when the prim is touched, and handle the response received from the server:&lt;/p&gt;
&lt;pre&gt;key http_request_id;&lt;br /&gt;default&lt;br /&gt;{&lt;br /&gt;  state_entry()&lt;br /&gt;  { &lt;br /&gt;  } &lt;br /&gt;  http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;  {&lt;br /&gt;    if (request_id == http_request_id)&lt;br /&gt;    {&lt;br /&gt;       llOwnerSay(body);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  touch_start(integer total_number)&lt;br /&gt;  {&lt;br /&gt;    integer i = 0; 
&lt;br /&gt;    while (i &amp;lt;= total_number)&lt;br /&gt;    {&lt;br /&gt;      if (llDetectedKey(i) != NULL_KEY)&lt;br /&gt;      {&lt;br /&gt;        string avatarName = llEscapeURL(llDetectedName(i));&lt;br /&gt;        string formData = "avatar="+avatarName;            &lt;br /&gt;        http_request_id = llHTTPRequest("&lt;a href="http://devserver/visitortracker.aspx&amp;quot;"&gt;http://devserver/visitortracker.aspx"&lt;/a&gt;,
 [HTTP_METHOD, "POST", HTTP_MIMETYPE, "application/x-www-form-urlencoded"], formData);&lt;br /&gt;      }&lt;br /&gt;      ++i;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}
&lt;/pre&gt;
&lt;p&gt;Now, when you save the script and touch the prim, assuming everything worked as planned, you'll see that same confirmation message in your chat window, except with your avatar name inserted into the message. Notice the &lt;strong&gt;http_response&lt;/strong&gt; handler in this code that takes the response data and tells you all about it. The truth is that there's not a lot to this stuff - send a request, handle the response - more simple than it might first appear.&lt;/p&gt;
&lt;p&gt;One last thing you might want to try. In the request headers that come across from Second Life, there is a surprisingly large amount of data. To see this data, add the following code to your render method in your aspx.cs file (insert it just before the call to base.Render):&lt;/p&gt;
&lt;pre&gt;string[] keys = Request.Headers.AllKeys;&lt;br /&gt;foreach (string key in keys)&lt;br /&gt;{&lt;br /&gt;  if (key.Contains("SecondLife"))&lt;br /&gt;  {&lt;br /&gt;    writer.WriteLine("Key: " + key);&lt;br /&gt;    // Get all values under this key.&lt;br /&gt;    string[] values = Request.Headers.GetValues(key);&lt;br /&gt;    for (int i = 0; i &amp;lt; values.Length; i++)&lt;br /&gt;    {&lt;br /&gt;      writer.WriteLine("Value " + i + ": " + Server.HtmlEncode(values[i]));&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}
&lt;/pre&gt;
&lt;p&gt;Now, you will probably find that when you get this data back in Second Life that you hit the maximum for the size of the response, but in there you could well see the name of the owner of the prim, the region and co-ordinates in that region in which the prim currently resides, and much more. A full list of Second Life http headers can be found on page on &lt;a title="llHTTPRequest on the LSL wiki" href="http://wiki.secondlife.com/wiki/LlHTTPRequest"&gt;llHTTPRequest&lt;/a&gt; on the LSL wiki. I'll leave it up to you to decide what to do with these headers and the code on the prim... You could add a sensor to the prim to detect arrivals to your plot and record the name of the visitor and the time they came to visit in a database, or you could detect visits by newcomers to your plot and send them a welcome message detailing upcoming events. There are so many different things you can do with both prims and data on the server that really it's up to you what you do with the data - the mechanism of sending data to and from Second Life and a web server in the real world is extremely simple, and that's what I find so appealing about it. I don't have to spend hours writing pages of code to get things working, and I don't need to install special components on my web server, and yet I have this elegant and simple mechanism to talk to Second Life. It's not the same as pushing data in-world (for that you will need to look into &lt;a href="http://en.wikipedia.org/wiki/XML-RPC"&gt;XML RPC&lt;/a&gt;, &lt;a href="http://wiki.secondlife.com/wiki/Category:LSL_XML-RPC"&gt;XML RPC in LSL&lt;/a&gt;, and possibly &lt;a href="http://www.xml-rpc.net/"&gt;XML RPC in .NET&lt;/a&gt;, if you're a .NET person), but for most situations where you might want to send data in-world, you can probably find a way to pull it in instead using one of the built-in methods of LSL as a trigger (sensor, timer, listener, etc.) and handle the data appropriately on the server.&lt;/p&gt;&lt;img src="http://blogs.ipona.com/chris/aggbug/8465.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Chris Hart</dc:creator>
            <guid>http://blogs.ipona.com/chris/archive/2008/02/17/8465.aspx</guid>
            <pubDate>Mon, 18 Feb 2008 10:57:55 GMT</pubDate>
            <wfw:comment>http://blogs.ipona.com/chris/comments/8465.aspx</wfw:comment>
            <comments>http://blogs.ipona.com/chris/archive/2008/02/17/8465.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ipona.com/chris/comments/commentRss/8465.aspx</wfw:commentRss>
        </item>
        <item>
            <title>A .NET Second Life</title>
            <link>http://blogs.ipona.com/chris/archive/2008/01/30/8459.aspx</link>
            <description>&lt;p&gt;I've recently become involved with the &lt;a href="http://www.sldnug.net"&gt;.NET user group&lt;/a&gt; on &lt;a title="Second Life" href="http://www.secondlife.com"&gt;Second Life&lt;/a&gt;, which (for those of you who've not yet tried it), is a great way to meet people from all over the world in a 3D virtual world. I've been a resident on there for a while now, but I'm only just starting to really make the most of it, and it's a real buzz. Last weekend, the &lt;a title="Microsoft Island on Second Life" href="http://world.secondlife.com/place/35c27f97-29e8-2b72-0848-ec3b99f9251e"&gt;Microsoft Visual Studio Island&lt;/a&gt; on Second Life played host to a talk on &lt;a title="Silverlight" href="http://www.microsoft.com/silverlight/"&gt;Silverlight&lt;/a&gt; by &lt;a title="Silverlight Presentation by Todd Anglin from Telerik" href="http://telerikwatch.com/2008/01/silverlight-presentation-in-second-life.html"&gt;Todd Anglin from Telerik&lt;/a&gt;. Members of the user group, represented by Avatars in this virtual world, sat around in an outdoor auditorium and were able to listen to the talk, and to view the slide presentation, in a similar fashion to a real world presentation.&lt;/p&gt;
&lt;p&gt;I worked alongside the team who rebuilt the new auditorium for the island (the old one was not universally liked!), and I've had a great time bouncing ideas off &lt;a title="GSquared's site" href="http://www.siliconreef.net/"&gt;G2 (GSquared)&lt;/a&gt;, in particular, for figuring out how we can improve the experience for session attendees. With a complete lack of US TV imports to watch over the past couple of weeks, James and I set about designing some special chairs for the auditorium that would give the audience some increased level of participation in the event. We ended up with a system that gave the speaker some control over the session, enabling the audience to vote yes/no on various matters, with arms being raised and lowered accordingly, and with a visual indicator at the back of the stage for live poll results. We intend to make it possible to upload these results to the website (&lt;a href="http://www.sldnug.net"&gt;http://www.sldnug.net&lt;/a&gt;) for viewing later, and we've got plenty of other ideas to help make the whole experience more worthwhile.&lt;/p&gt;
&lt;p&gt;Perhaps one of the best things about a user group of this nature, aside from the fact that it's free, is the fact that you don't have to worry about travel costs, accommodation, or any of the other factors that could get in the way of attending (such as having a small child to look after!) And while you can watch webcasts online, or listen to podcasts, the freedom of just walking up to a speaker and asking them questions, very much like you can do at a real conference, is liberating. In addition, I've made some valuable business contacts, and some good friends, which makes working from home that little bit easier. So, if you happen to be visiting Visual Studio Island on Second Life, and happen to bump  into my avatar (Strawberry Fride), feel free to pop over and say hi.&lt;/p&gt;&lt;img src="http://blogs.ipona.com/chris/aggbug/8459.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Chris Hart</dc:creator>
            <guid>http://blogs.ipona.com/chris/archive/2008/01/30/8459.aspx</guid>
            <pubDate>Thu, 31 Jan 2008 03:21:04 GMT</pubDate>
            <wfw:comment>http://blogs.ipona.com/chris/comments/8459.aspx</wfw:comment>
            <comments>http://blogs.ipona.com/chris/archive/2008/01/30/8459.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ipona.com/chris/comments/commentRss/8459.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Troubles with installing .NET 3.5</title>
            <link>http://blogs.ipona.com/chris/archive/2007/11/27/8448.aspx</link>
            <description>&lt;p&gt;I had a bit of trouble installing .NET 3.5 recently. My machine had decided to install some Windows Updates at the same time as installing .NET 3.5 and I think the combination of the two caused the entire machine to fall over in a heap. One by one all my applications stopped responding, including ctrl+alt+del, so I resorted to hitting the Big Reset Button, but this left my 3.5 install in a very broken state. It wasn't installed and it couldn't be installed - each time I tried, Setup threw an exception.&lt;/p&gt;
&lt;p&gt;I looked through all the installed programs, trawled through all the logs, but couldn't see why I couldn't install 3.5. Then I came across &lt;a title="Aaron Stebner's blog" href="http://blogs.msdn.com/astebner/default.aspx"&gt;Aaron Stebner's&lt;/a&gt; blog, where he lists a load of &lt;a title="tools and articles" href="http://blogs.msdn.com/astebner/articles/454956.aspx"&gt;tools and articles&lt;/a&gt; that could help - after trying a couple of other tools, I struck gold when I clicked the the &lt;a title="What to do if other .NET Framework setup troubleshooting steps do not help" href="http://blogs.msdn.com/astebner/archive/2005/10/11/479928.aspx"&gt;What to do if other .NET Framework setup troubleshooting steps do not help&lt;/a&gt; link! Finally, I was able to install .NET 3.5, and all is well with the world once more.&lt;/p&gt;&lt;img src="http://blogs.ipona.com/chris/aggbug/8448.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Chris Hart</dc:creator>
            <guid>http://blogs.ipona.com/chris/archive/2007/11/27/8448.aspx</guid>
            <pubDate>Tue, 27 Nov 2007 21:37:30 GMT</pubDate>
            <wfw:comment>http://blogs.ipona.com/chris/comments/8448.aspx</wfw:comment>
            <comments>http://blogs.ipona.com/chris/archive/2007/11/27/8448.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ipona.com/chris/comments/commentRss/8448.aspx</wfw:commentRss>
        </item>
        <item>
            <title>CMYK vs RGB JPEGs</title>
            <link>http://blogs.ipona.com/chris/archive/2007/11/21/8446.aspx</link>
            <description>&lt;p&gt;I had an interesting bug to fix this week, discovered in the context of a SharePoint application, but that equally affects anyone producing content for display on the web. The client I've been working with recently has been having trouble displaying marketing images from a SharePoint picture library. Given that the picture library in question was customised quite heavily (to include custom columns) as part of the solution I've been working on, my first assumption was that there was an error in the provisioning code. The library in question was working perfectly with many of their images - photos of members of staff had been uploaded without trouble, and the two standard size thumbnails had been generated automatically as normal. Clicking the images from thumbnail view (where small thumbnails are displayed) of a picture library takes you to the detail view for the item (where the larger auto-generated thumbnail is displayed). At that point, clicking on the image once more should take you to the full-size image file itself. Photos of staff were displaying correctly, but marketing shots of swirly things and pretty patterns weren't displaying correctly.&lt;/p&gt;
&lt;p&gt;After a fair bit of investigation, I discovered that those images that refused to work with SharePoint couldn't be opened in IE at all, though Windows would happily preview the image for me. When I attempted to view the image in Paint Shop Pro I had a strange error message about the colour profile information, and that's when things started to become clear. After some chatting with James, we discovered that the .jpg file had CMYK metadata, instead of RGB. So, this was a CMYK JPG, not an RGB JPG, and that's the problem. If you want to view a CMYK JPEG file in a browser, you need Safari or Opera (at time of writing), or possibly some kind of plugin, if one exists, that could fix this issue on IE or Firefox.&lt;/p&gt;&lt;img src="http://blogs.ipona.com/chris/aggbug/8446.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Chris Hart</dc:creator>
            <guid>http://blogs.ipona.com/chris/archive/2007/11/21/8446.aspx</guid>
            <pubDate>Thu, 22 Nov 2007 03:44:13 GMT</pubDate>
            <wfw:comment>http://blogs.ipona.com/chris/comments/8446.aspx</wfw:comment>
            <comments>http://blogs.ipona.com/chris/archive/2007/11/21/8446.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ipona.com/chris/comments/commentRss/8446.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>