EGamesExpo 07

18 November 2007 Tags  ,

ege_logo3d_white The EGames Expo was on again in Melbourne's Exhibition Centre,  and they've learnt a lot from the first event held last year.

Key differences over last year were

  • The booth babes were hotter
  • There were more booths
  • There were more freebies
  • You could bring bags in (and cameras!)

That being said, it still seems to have a long way to go. We (chickz0r and I) went today (Sunday, the final day), and it was packed but lacked excitement. Perhaps a combination of weather and being the closing day, but exhibitors and attendees just seemed to be a bit down on the whole day, compared to last year.

Fury again was one of the main attractions, but after being an alpha tester for the game, I had no interest in it. They had a "super special" on Fury, $30AUD for one, or $50AUD for two, instead of the RRP of $89.95. That isn't limited to EGE, you can also pick it up for about that price (or cheaper, given the exchange rate) from Auran's store. Auran had their own stage, with competitions (to win a Core2Quad system, I think), as well as a dozen or so other computers setup to play Fury. They really sure have spent a bit more on the demo systems they brought down from the Sunshine State…performance was worse than that of last years pre-alpha demo!

Crysis came in second for most coverage on the grounds, with PC's setup in a competitive "NetCafe" environment, as well as more casual ones setup on lounges with large (30"+) HDTV's. They were plagued with problems - many computers had to have the three finger salute (Ctrl + Alt + Del) performed on a regular basis by the staff operating the systems, some were even running in windowed mode!

Sony actually had something to present other than the PSP this year, with their PS3, but the majority of their systems were PSP and PS2's; they did however, have one large booth and competitions for Resistance: Fall of Man. Microsoft had a giant inflatable Master Chief helmet, with many 360's showing of Halo 3, to be expected. Nintendo rounded up the console giants by occupying the exact same spot as last time (right at the front door), but mostly had Wii sports going - rather disappointing!

I'm hoping that the cosplayers today weren't all that turned up for the event, because if they were, my Soundwave costume (if I had of finished it..) had a serious chance to take out best costume. I know I'm being overly critical for somebody who didn't dress up, but the Cosplay Parade had nearly half the audience leave before the second Cosplayer was on stage.

Freebies last time were nonexistent, however this time we managed to score 4 or 5 Seagate pens, and an Intel keychain. Not great, but we weren't there for long. There were other freebies being handed out (or thrown out in the case of the Frisbees), so at least some exhibitors have learnt.

I think over time EGE is going to get better and better, it is still in its infancy and isn't sure how the audience is going to react. This year was packed, so hopefully next year they learn a better layout and to include more consoles/pc's so people don't have to line up for more than half an hour to play one thing. I'd love more freebies, but what can they really give away?

Overall, I had less fun than last year, but it was good to see that the event is going strong and will more than likely continue on next year.


No Comments
 

Blog Redesign (Again!)

16 November 2007 Tags  

It wasn't that long ago since my last blog redesign, but I got sick of that quickly because of the harsh contrast between the dark blue and white, which made it a bit hard on the eyes when reading.

The theme update is part of a general change on my site, which involved moving the blog into a separate directory (/blog/), so that it was recognised by Dreamhosts OneClickInstaller (and upgrader). Later on I'll be implementing a /gallery/, once I've got the software up and running.

I've installed the Gravatar2 plugin, and while I'm having some teething problems with it, it seems to work pretty well. CForms II has been updated as well.

And finally, the required image of the new style for those reading via RSS, and for archiving purposes.

 newblog


2 Comments
 

CodeSnippet: Lets make us a Longhorn

15 November 2007 Tags  , ,

longhorn.jpg

Introduction

When Vista's codename was still Longhorn, there were grand plans which never eventuated such as WinFS, the global notifications system, and NGSCB, which would have all been rather significant features to the operating system. However, some of the more disappointing features that were dropped (that the general public would have noticed) were to do with the UI. Many elements of the system (such as Explorer) utilised WinFX (which became WPF) - thats right, Explorer was coded in .NET (which in itself is very interesting, such as why was it .NET? why is Vista's Explorer not .NET? What was the realistic performance of it?)

If you compare the animations between Vista's Explorer and those we're able to see in the Longhorn preview video above (and this isn't necessarily the best Longhorn preview video out there), it is easy to see that WPF is capable of some very cool thing, but again, it is disappointing to see that Microsoft isn't "dog-fooding" such capabilities (except ironically in XAML tools such as Expression Blend and Design). This is emphasised when you look at some of the new applications coming out from Microsoft, such as those under the "Live" brand. Live Photo could have very well been Phodeo, which would have actually been a great application to demonstrate some "wow" with Vista.

Now that my rant is out of the way, this CodeSnippet will be about recreating the "Music" view from Explorer in the video above (1:22 to 1:25, so not much to really go on, but enough to get something pretty). This will be done using WPF, both its 2D and 3D elements, and API calls to Windows Media Player (so, if you don't already use WMP, you'll need to add one or two items to its library otherwise you wont' see anything appear).

mediahorn

Download

Source
Exe

Requirements

The Interface

Because Blend is particularly good at prototyping interfaces, I started with piecing together roughly what I wanted it to look like. If you've never used Blend before, it is much like Visual Studio's visual interface editor, but with a dark (by default) theme, and somewhat more powerful for creating custom interfaces. If you are unfamiliar with Expression Blend, the included help file is actually pretty useful - its what has taught me all I know about Blend!

For the time being, lets just use a boring 2D element for the large album art view. Later on we'll replace this with a 3D object created using Zam3D, exported to XAML.

mediahorn_stage

The Logic

Switching over to Visual Studio, open up the project. Since we're working with WMP's library, we need a reference to wmp.dll, its under COM under the Add Reference Dialog, Windows Media Player (make sure you select wmp.dll, not msdxm.dll). Any time we need to access WMP, don't forget to add a "Using WMPLib;"

The general idea is to let WPF's databinding power do as much work as possible, so we'll need to arrange our data in a particular way. This isn't entirely necessary to get the concept working, but in the long run its better practice and allows further flexibility in the program.

classdiagram

public class Albums
{

    private List<String> TempAlbumList = new List<String>();

    private ObservableCollection<Album> albumList;

    public ObservableCollection<Album> AlbumList
    {
        get { return albumList; }
    }

    public Albums()
    {

        albumList = new ObservableCollection<Album>();

        WindowsMediaPlayer wmp = new WindowsMediaPlayer();
        IWMPPlaylist playlist = wmp.mediaCollection.getByAttribute("MediaType", "Audio");
        for (int i = 0; i < playlist.count; i++)
        {

            IWMPMedia tempPl = playlist.get_Item(i);
            String artist = tempPl.getItemInfo("AlbumArtist");
            String title = tempPl.getItemInfo("Title");
            String album = tempPl.getItemInfo("Album");
            String sourceurl = tempPl.getItemInfo("SourceUrl");

            String alba = album + artist;

            if (!TempAlbumList.Contains(alba) && alba != "") {
                try 
                {
                    if (artist == "")
                        artist = tempPl.getItemInfo("Artist");
                    albumList.Add(new Album(album, artist, Path.GetDirectoryName(sourceurl)));
                    TempAlbumList.Add(alba);
                }
                catch (Exception e)
                {
                   // MessageBox.Show(e.Message + " on " + album +title + sourceurl);
                }
            }

            for (int j = 0; j < albumList.Count; j++)
            {
                if (albumList[j].Title == album)
                {
                    albumList[j].AddTrack(new Track(title, sourceurl));
                    break;
                }
            }
        }
    }
}

ObservableCollections are much like any other generic collections, except WPF laps these up like there is no tomorrow. ObservableCollections don't reside in System.Collections.Generic, however, they are in System.Collections.ObjectModel, so don't forget to add a using statement. The reason ObservableCollections is loved by WPF so much is because it implements INotifyCollectionChanged, which allows for dynamic binding to UI elements (such as our ListBoxes) so that when we add, remove or modify anything in our collection, the UI is updated automagically.

public class Album
{
    private String title;
    public String dir;
    private String coverart;
    private String artist;
    private ObservableCollection<Track> trackList;
    public Album(String title, String artist, string dir)
    {
        this.title = title;
        this.dir = dir;
        this.artist = artist;

        this.coverart = GetArtwork();
        trackList = new ObservableCollection<Track>();
    }
    public String Title
    {
        get { return title; }
        set
        {
            title = value;

        }
    }
    public String Artist
    {
        get { return artist; }
        set
        {
            artist = value;
        }
    }
    public String CoverArt
    {
        get { return coverart; }
        set
        {
            coverart = value;

        }
    }
    public void AddTrack(Track t)
    {
        trackList.Add(t);
    }
    public ObservableCollection<Track> TrackList
    {
        get { return trackList; }
    }
    private string GetArtwork()
    {
        string filename = null;
        string[] filenames = Directory.GetFiles(this.dir, "AlbumArt*Large.jpg");

        if (filenames.Length > 0)
            filename = filenames[0];
        else
        {
            FileInfo file = new FileInfo(Path.Combine(dir, "Folder.jpg"));

            if (file.Exists)
            {
                filename = file.FullName;
            }
        }
        return filename;
    }
}
public class Track
{
    public String Title;
    public String path;

    public Track(String title, String path)
    {
        this.Title = title;
        this.path = path;
    }

    public override string ToString()
    {
        return Title;
    }
}

If this was production code, I'd implement INotifyPropertyChanged on both the Track and Album classes, so that the UI would automatically update when changes were made to any of the properties.

Now we switch over to XAML (Window1.xaml) - this can be done via Blend or Visual Studio (or even Notepad), but I find VS a bit more powerful/useful.

<Window.Resources>
    <local:Albums x:Key="Albums" />

    <!-- this style makes the format gridlike rather than just a list -->
    <Style x:Key="AlbumListStyle" TargetType="{x:Type ListBox}">
        <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <WrapPanel />
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" />
    </Style>

    <!-- Change the artwork from text to actual images -->
    <DataTemplate x:Key="AlbumListTemplate">
        <StackPanel>
            <Border Margin="10,10,10,10">
            <Image Source="{Binding Path=CoverArt}" Width="50" Height="50"/>
            </Border>
        </StackPanel>
    </DataTemplate>

    <DataTemplate x:Key="TrackListTemplate">
            <TextBlock Text="{Binding Path=Title}" />
    </DataTemplate>

</Window.Resources>

By making local:Albums (note, to get the local prefix, add xmlns:local="clr-namespace:MediaHorn" to the Window tag) available through the Albums key, we're able to bind all our elements in XAML markup rather than in C#. In Albums constructor, it populates its albumList, because when the program launches, it immediately calls the class.

<ListBox
    x:Name="lbAlbums"
    Style="{StaticResource AlbumListStyle}"
    ItemsSource="{Binding Source={StaticResource Albums}, Path=AlbumList}"
    IsSynchronizedWithCurrentItem="True"
    ItemTemplate="{DynamicResource AlbumListTemplate}"
    SelectedIndex="0"
    MouseDoubleClick="lbAlbums_MouseDoubleClick" />

<ListBox
    x:Name="lbTracks"
    DataContext="{Binding ElementName=lbAlbums, Path=Items}"
    ItemsSource="{Binding Path=TrackList}"
    IsSynchronizedWithCurrentItem="True"
    MouseDoubleClick="lbTracks_MouseDoubleClick" />

<TextBlock
    x:Name="tbTitle"
    Text="{Binding Path=Title}"
    DataContext="{Binding ElementName=lbAlbums, Path=Items}" />
<TextBlock
    DataContext="{Binding ElementName=lbAlbums, Path=Items}"
    x:Name="tbArtist"
    Text="{Binding Path=Artist}"/>
<Image DataContext="{Binding ElementName=lbAlbums, Path=Items}"
       Source="{Binding Path=CoverArt}" />

The Dimensions of Three

Zam3D is a pretty cool little application by Electric Rain. It won't win awards for sheer power in high end, bump mapped, megatextures; but then again…neither will WPF. If you are into higher end 3D modelling and animation, Zam3D will import from 3DS files (3D Studio Max), and Electric Rain have plugins for other 3D applications.

They've released four training/introductory videos, which are a little lengthy but are nice at getting your way around their program.

I'm not going to go into lengths about creating the 3D Model we need using Zam3D because that's an article in itself. All we want is a box primitive, resized, slightly skewed, and animated such that it does 1.25 revolutions, and then at a slower rate rotates -.25 revolutions. Switch into the advanced editor, hit 'edit mesh', select 'faces selection' mode, and select the two triangles that make up the front of the box, and apply a bitmap texture. Save, export to XAML, and we're done with Zam3D.

For simplicity sake, I cut and paste the entirety of the exported XAML file to inside the grid (below the listboxes), then moved it around in Blend.

We're almost done with our WPF 3D, but there are a few things we need to adjust. First, find the texture you applied, and rename it to "AlbumArtTextureMR2" (making sure you rename all instances of it), as well as deleting the contents of that material group. Next, any time we add our own material, you might notice it is upside down, so find the object (it will be a GeometryModel3D, the name will be something meaningful like Box01OR10GR12, and add to it:

<GeometryModel3D.Transform>
    <Transform3DGroup>
        <RotateTransform3D >
            <RotateTransform3D.Rotation>
                <AxisAngleRotation3D Angle="180" Axis="0 0 1"/>
            </RotateTransform3D.Rotation>
        </RotateTransform3D>
        <ScaleTransform3D ScaleX="-1" ScaleY="1" ScaleZ="1"/>
    </Transform3DGroup>
</GeometryModel3D.Transform>

The placeholder we had for the 3D element had its source databound to the selected album. Unfortunately, MaterialGroup/ImageBrushes can't be databound, so we'll need to handle that in code.

public void onSelectAlbum(Object sender, EventArgs e)
{
    if (lbAlbums.SelectedIndex > 0)
    {
        Album temp = ((Album)lbAlbums.SelectedItem);

        if (temp.CoverArt != null)
        {
            BitmapImage img = new BitmapImage(new Uri(temp.CoverArt, UriKind.Relative));
            ImageBrush iB = new ImageBrush(img);

            MaterialGroup AlbumArtMaterial = (MaterialGroup)ZAM3DViewport3D.FindResource("AlbumArtTextureMR2");
            AlbumArtMaterial.Children.Clear();
            AlbumArtMaterial.Children.Add(new DiffuseMaterial(iB));
        }
((Storyboard)ZAM3DViewport3D.FindResource("OnLoaded")).Begin(this);

    }
}
 The line with the storyboard starts our animation every time a new album is selected.

Finishing Touches

To make it a proper media player/viewer, we need to actually allow audio playback. Again we can make use of WMPLib.

public void lbAlbums_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    if (lbAlbums.SelectedItem != null)
    {
        Album tempAlb = (Album)lbAlbums.SelectedItem;
        IWMPPlaylist tempPL = wmp.playlistCollection.newPlaylist(tempAlb.Title);
        foreach(Track t in tempAlb.TrackList)
        {
            tempPL.appendItem(wmp.newMedia(t.path));
        }
        wmp.currentPlaylist = tempPL;
    }
}
private void lbTracks_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    if (lbTracks.SelectedItem != null)
    {
        wmp.URL = ((Track)lbTracks.SelectedItem).path;
    }
}

These two functions provide playback for albums and individual tracks respectively. In the first function, we need to create a temporary playlist so that we can play more than one item, which is achieved through simple iteration.

In the second function, we only need to set the URL of the current file to play back a single track.

private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{

    switch (e.Key)
    {
        case System.Windows.Input.Key.MediaStop:
            wmp.controls.stop();
            break;
        case System.Windows.Input.Key.MediaNextTrack:
            if (wmp.playState == WMPPlayState.wmppsPaused)
                wmp.controls.play();
            wmp.controls.next();

            break;
        case System.Windows.Input.Key.MediaPlayPause:
            if (wmp.playState == WMPPlayState.wmppsPaused || wmp.playState == WMPPlayState.wmppsStopped)
                wmp.controls.play();
            else
                wmp.controls.pause();
            break;
        case System.Windows.Input.Key.MediaPreviousTrack:
            wmp.controls.previous();
            break;

    }
}

Since we don't have any media controls, I added play/pause/skip/stop through 'media keys' on keyboards (or some laptops that have 'special' function keys). This works for that, but the only problem is that it only works when the application has focus.

Conclusion

There are still bugs in this, but remember, it is more of a 'proof of concept' application that production ready. Several of the errors are derived from the WMP library which seems to keep a hold of albums that no longer exist, and thus while processing generate a few exceptions (so I've just chucked a few try/catch blocks around the offenders).

If you would like to further extend this, I've got a couple of ideas

  • Add progress bars for how far you are through the track
  • Add "+" buttons to build custom playlists
  • Different views (ie, video, or list, grid, text, by song name, by artist etc)
  • Sorting in different views (artist, a->z, most recently played, etc)
  • Implement a way to add to the WMP Library, or create your own library structure that doesn't rely on WMPLib (maybe just for 'importing' a library)
  • Add "Now Playing" functionality so that it communicates with WLM

 

References


1 Comment
 

More Cakes! Sonic and Astroboy

12 November 2007 Tags  

A few weeks ago, my soon-to-be-brothers-in-law (twins) celebrated their 27th birthday, with family and friends. Things were getting a bit hectic, so I volunteered to make the birthday cakes. Using the same recipe as my engagement party cake for the base, I went about constructing one for each of them, crafted as some of their favourite characters from their childhood - Sonic and Astroboy. The icing was a combination of butter-cream icing, and royal icing (eyes). The fancy effect on the butter-cream icing was achieved by curdling the icing first.

There really isn't much to report, but I do have the precious photos, as I'm rather proud of my work.

n597184413_387897_7521.jpg

Sonic for Michael…

 

n597184413_387898_7876.jpg

…Astroboy for Aaron


No Comments
 

I tried to be a blogger…

11 November 2007 Tags  

I tried to be a better blogger, I really did, but it seems every time I start getting into the routine of regular posting, something in reality steps up to delay or deter me. This time around, Chickz0r came down with a very serious bout of gastro, which had her hospitalised for a few hours. She's okay, but she still hasn't recovered completely. Given our wedding is looming, things have got a bit hectic because of this.

On the plus side, I've had a bit of time to do some research while I watch her sleep, so I do have a few sizable blog posts coming up, covering WCF, WPF, my HTPC case and a new blog theme.

Things should return to normal sometime next week, so I might once again attempt to be a regular blogger!


No Comments
 

PCCaseGear: Thumbs up from me

8 November 2007 Tags  

Often you hear about all the bad retailers, the way they rip people off or have terrible customer service (or try and breach the Trade Practices Act). I know for those reasons I don't shop at Harvey Norman, CPL, CentreCom, or Nintek anymore. However, those companies who do make a name for themselves because of excellent customer service aren't heard of as much.

Well, PCCaseGear are one of them. No, not a sponsored post (although, could do with it for my HTPC…hint hint), just excited about my order that just arrived.

I ordered it on Monday, it arrived today (Thursday).

Big deal you say? Well, I ordered about 10pm on Monday night, it was processed on Tuesday - a public holiday (Cup Day), and arrived today. I've had about a dozen orders to them, and all but two have been two or three day turn around.

Their prices may not always be the cheapest, but they have a very interesting variety of parts, and very knowledgeable staff when it comes to the products they do sell. So, once again, I say YAY FOR PCCG!

25472 For the record, my order was ("just") a Corsair VX-450 PSU (pictured) to replace my dying Antec SmartPower 2.0 500w PSU (again). The SP2 has developed a high pitched noise which makes it impossible for me to use my desktop without suffering great pain because of my headaches. The VX450 is recommended by many, more efficient, has a quieter overall operation than the SP2 and suited my budget.


No Comments
 

My experience with Windows Home Server

7 November 2007 Tags  ,

Windows_Home_Server_logo

Thanks to Nick, I've been able to get my hands on the Windows Home Server (WHS) 120 day Trial, although unlike Nick, I've gone for the "roll your own" approach to it, rather than buying one off the shelf (his experience with that side is certainly encouraging, if not fuzzy).

The test hardware I have at the moment is:

  • AMD Athlon XP 2600+ ("Barton" core)
  • 512mb (2×256mb) DDR333
  • ATI 256mb 9600 Pro
  • Abit NF7-S
  • 1×80gb, 2×60gb IDE seagate hdds

Initially I only had the 2×60gb HDDs, so WHS wouldn't install as it requires 80gb minimum. If I had an IDE RAID card, that would have fixed the problem, but alas, I didn't and I had to wait till I returned from Chickz0rs place with our spare 80gb HDD.

Installation was smooth after getting over the storage prerequisite, select location, keyboard layout, it goes about its business, reboots a few times, and then asks for server name and password. There was a bit of a hickup in that it didn't have drivers for all the onboard components of the motherboard….including the NIC. Given how well Vista has been at detecting drivers - even on that hardware - I'd just forgotten about installing drivers to get online. No matter, nvidia had all the nForce 2 Unified drivers still available, and after that it updated nicely.

After I installed the client software (WHS Connector), that was it - it was up and running, ready for backups. Being a geek, I didn't leave it at that, but I really appreciate the lack of hours of configuration needed to get the box secure, and ready for its listed operations.

So far I've been really impressed with WHS - setting up remote access (https) was a breeze (two clicks!) and the remote access was responsive; backup and duplication happens very easily, as does adding extra drives to the "pool". The extensibility of WHS looks pretty cool too, with a fair few addins coming out already (I particularly like the remote backup ones - if I was to continue to use WHS, I'd look at one for my Dreamhost account).

The thing to note about WHS is that there isn't much to it. I don't mean that in the sense that "its not worth it", I mean that once you have the Connector software installed, things just work. WHS boxes from the likes of TranquilPC, Hewlett Packard, Intel and Medion (and many more) won't require the installation but some very basic configuration (that's IF you want to configure it). I'd like to say something was wrong with it, but given the functionality/features and its target market, there doesn't seem to be much to complain about. It works, expandable, extensible, and its easy.

The interesting thing is that between the many reboots during install, it goes into 'Text Mode' installer, with the label "Windows 2003 Small Business Server" (W2K3). It's not just during installation that you see that WHS is in many ways "on top of" W2K3.

  • The default screen saver is called 'Windows 2003 server'
  • There is the 'Windows 2003' background
  • When you add certain Windows Components (through Control Panel -> Add/Remove Software), it asks for Service Pack 2 Disc
  • You can install/run DHCP/DNS services
  • IIS6 is installed, and you can use it to run other websites - great for those like me who want/need a local webserver for development

The upshot of it being based on Windows 2003 is that its pretty damn stable and secure, and that if any vulnerabilities are found with the operating system, they're Win2K3 vulnerabilities and Win2k3 patches (through Windows Update), rather than waiting for the WHS team themselves to fix the insecurity (not that they'd do a bad job, just size of each team effects response times)

As much as I enjoyed my WHS experience, I won't be using this iteration of it on a fulltime basis. Yes it was fast, yes it was stable, yes it was easy, but I want a single "always on" box - something to handle both HPTC duties and centralised storage. While there are many HTPC packages that will run under Win2K3, they don't seem to have the same features, or lack a decent UI (or require waaay too much configuration) when compared against as Media Center (Vista or MCE2005). This problem may be solved in vNext of WHS, but I'm not holding my breath for it - I'd be better off waiting for virtualisation software which works with Direct X 9 :)


No Comments
 

Mix On Campus

6 November 2007 Tags  ,

poster3_revised As both Long and Michael have already beat me to the punch, I'll have to use some fancier graphics to point out that Mix On Campus is on its way for later this month. Mix On Campus is a free event for Australian students, aimed at "innovating your web knowledge". Think of it as a cut down version of Remix (which itself was fun, but not free, and a cut down version of Mix, which was rather expensive).

The dates are out, the speaker schedule is released, and the prizes are juicy looking (nom-nom-nom, jelly beans, as well as Xbox 360's, Hoodies, Vista Ultimate, and webcams. But seriously, jelly beans!)

Mix On Campus will be held in Brisbane, Melbourne and Sydney (on the 20th, 26th and 30th of November respectively) running from 10am to 4pm.

Brisbane
Tuesday, 20 November at QUT City Campus - Room 117, B Block, 2 George St, Brisbane (Register, Map of venue)

Melbourne
Monday, 26 November at Melbourne Conference Centre (near RMIT), 333 Swanston Street, Melbourne (Register, Map of venue)

Sydney
Friday, 30 November at UTS City Campus - Guthrie Theatre, Building 6, 702 Harris Street, Ultimo (Register, Map of venue)

The schedule for each venue is looking pretty nice, I'm particularly interested in the XNA Development that wasn't at Remix, although I'm disappointed about the lack of Cheezeburger Studio that was demonstrated at TechEd. I'll definitely be at the Melbourne event, even if just to keep Long company and to heckle Nick Hodge during his Popfly demonstration.

Be sure to register, and for more details check out the official blog and Nick Ellery's blog.


1 Comment