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).
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.
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.

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
A little known company called Valve released "The Orange Box" to the world a little while ago, and while it unarguably is a good value buy given the average game these days, I've been a little under whelmed by the actual content. This will probably be a series of posts broken up into each game.
Half-Life 2
Half-Life (1, the original, the first) was hailed as a break through in the First Person Shooter for it having a story line, a unique concept back in those days. For those who haven't played it (I didn't play it myself until the weeks before its sequel), the story can be found easily enough by searching for it, but I'll summarise it for the lazy
You're a physicist, Gordron Freeman, incapable of speech, hygiene (you never leave that suit), or actually doing physics, set to save the world after the Black Mesa research complex goes ape after a failed portal based research experiment. Since you've looked at guns before, you instantly know how to use them with better-than-military grade precision, and you have to save the world/your own ass by escaping Black Mesa.
But wait, there is more, once you do beat the impossible odds of battling Security Guards, Military Personal and random aliens, you'll teleport yourself to their planet, and beat the shit out of them, be 'liberated' by the "G-Man", and the games over. Congratulations.
In 1998/9, sure, story telling was weak in games because the budgets weren't there to hire non-geeks (ie, those who can write coherent sentences), and don't get me wrong, the game is fairly solid in gameplay and overall presentation - I just don't get why its hailed as the best thing to come out in the history of History.
Like all quality sequels, you start off where you were in the last game, except throw that into the HL universe and you start off in the nothingness which the G-Man left us in. Oh, and it's ten to twenty years in the future - you don't find out and official sources aren't sure. Once a company finds a good formula for making games/books/movies, they tend to stick to it, and Half-Life 2 is no different. You play Gordon Freeman, you wear a special suit, you don't talk, and you have to save the world.
There are some mind boggling changes to the game though. No longer do the evil aliens hail from the terrifying floating rocks called Xen, in fact some of them are even our new allies, for our new enemy is the Combine, who were behind the original invasion as-if-you-didn't-already-guess-that; Physics can now be handled by even the lowliest of physicists thanks to the Gravity Gun; and finally, Head Crab Zombies come in many different flavours.
Don't get me wrong, HL2 had some solid gameplay to it; AI was decent, weapons varied and interesting, and it was especially beautiful when it came out. However just like it's predecessor, it was hailed for having an incredibly rich story. The game was fairly short, the stories had plot holes that you could drive a small truck through, and the ending was incredibly lame; but that was overlooked by most because you had the gravity gun where you could cut zombies up with circular saw blades.
Half-Life 2: Episode One was meant to be the first in a rapid succession of episodic content for the Half Life saga which would give shorter game play but be more regularly produced, and at a reduced cost. Given it took six years for the sequel of Half-Life, slightly more regularly produced isn't setting their standards particularly high, and with Ep1, they certainly did give the shorter game play and more regular - only totaling about two-to-four hours of gameplay, and released a year after HL2.
Half-Life 2 and Doom3 were released close together, and HL2 was hailed as being much better because it actually had environments (plural) rather than just one-super-long-dark-corridor-with-a-poor-flashlight. The majority of Ep1 is made up of areas where you have little-to-no ammo, in the dark, shooting zombies. Sounds original and awesome right?
I suppose it would be wrong of me if I failed to mention just how cinematic Ep1 was. For a large slab of the game, it was like a movie, I forgot I was simply playing a game. I'm sure many industry analysts are wondering how you can achieve such immersion. Valves answer to that question is as simple as it is elegant…give the player no ammo in a First Person Shooter, but give them a "cute" female NPC that follows them around who has unlimited ammo but simply won't share. It wasn't that I was immersed, it was that I had to watch Alyx have all the fun.
I'm not far enough in to Half-Life 2: Episode Two to critisise it to the inevitable pointless rant I'll undoubtedly have in my head, but it certainly isn't promising much. It starts off with a train crash, and all of your weapons have been vapourised, yet Alex retains hers. You've also inexplicitly developed a separate battery pack so that the flashlight and running are no longer connected.
In all fairness, the Half Life games aren't bad. That is to say, they're not terrible, but they're not awesome. They fall somewhere in between, kind of what Yahtzee said about Halo 3. The Source engine is certainly good looking, and scales well, and etcetera and so forth about their technical capabilities, but at the end of the day, we've got a overly-hyped-underdelivered-game which for some reason, gets 95% or higher in "real" reviews.
1 Comment
I've been digging around in my registry lately, to find a few registry values for games I have installed for WGS (v0.2 was meant to be out yesterday, but I'm waiting 'till I get the DDE code right), and I found the gem to the side.
It really speaks for itself…EA, please go and buy a book on Windows Registry, or failing that, just use common sense - you do not need 4 keys for Battlefield 2142, let alone 2 'top-ish' level keys for essentially the same thing. I'd hate to think what would happen if I installed an expansion!
1 Comment
The word liar is thrown around a lot these days and I'm going to use it yet again tonight (perhaps inappropriately)
Monash, my fabulous tertiary educator, have stuffed up materials yet again. This time, the lecturer in charge, Shane Moore (who is one of the few good blokes at Monash), was furious with those in charge - and rightly so, its hard for students to study when the materials you promise them never show up (sound familiar?)
Eventually the material showed up, before the third week so it wasn't a disaster. Execpt, well, not all of the materials showed up.
The materials consist of three parts, a CDRom (UML software), the Study Guide, and the Reader. Of the three, the Reader didn't arrive.
Another student, quiet angry and stressed with the situation, blasted away asking for answers to where his reader was. I piped up that I still hadn't recieved mine, and shortly after Shane responded with the details of the despatch unit so we could chase it up.
It turns out Shane did a bit more than that, and actually chased it up for me a little, to see where my materials were.
Shane shot off an email to me
"According to Despatch, they sent all 3 items to you on 18th July"
I'm believe Shane in thats what they told him, but the hilarious thing is, in the 'Unit Packing Note' (the little slip that goes into everything Monash send out to you - material wise), it has the reader highlighted and "TO FOLLOW" stamped on it.
This is typical of Despatch, who last semester told one of my lecturers they'd be in touch with me immediately when the materials were dispatched. They never contacted me, because funnily enough, the materials were never dispatched for that unit.
Monash: We work hard at sucking
No Comments
Games often have bugs in them, usually in the form of not being able to complete a mission or quest, or in-balances like a knife being able to sniper.
While we're probably seeing more buggy games due to how quickly games tend to be pumped out these days, more often than not, these issues get addressed during the support lifespan of the game (at least in the PC arena).
Today I encountered what I must admit is the best bug I've ever seen in a game.
While trying to frag Ryan in FEAR (he had FEAR, I had FEAR Combat - the free multiplayer version), I discovered after about five minutes into the game, that my frame rate dropped from (what I perceived to be) 60 frames a second down to under 20 frames a second.
Given FEAR is a shooter, frame rates as well as low ping can make all the difference.
A restart of the game, fixed, at least for another five minutes. Fine, I rebooted my system, seeing that Visual Studio Orcas had half crashed. Again, once I reached that magical mark of 300 seconds, the frame rates plummeted like Lemmings.
As it did, Ryan managed to sneak a few bullets into me and shoved me into spectator mode, waiting for me to click to respawn. I decided a quick search on Google would be in order to see if I was the only one (search term was "fear slowdown"). The eight result yeilded something I initially dismissed as so rediculous it could never possibly be, that USB mice and keyboards were dropping my framerate.
Given I was on my laptop however, I decided that I'd give this preposterous idea a go, unplugging my Logitech G5 2007 and G15 (I'm a Logitech fanboy, I also run their Z-5400 speakers), and restarted the game.
Two hours later, my framerates continued to be far beyond that which was achivable with a mouse. It's a pity I can't say the same for my score.
No Comments
Google's unofficial motto was 'Don't be evil', a good motto most people would admit. That is, of course, until they contradict such a motto, and start being evil.

First it was censorship, then it was the stuff about scanning books, Google Earth's photos being security risk, inability to counter click-fraud on Adwords, the list goes on with the 'troubles' they've caused. Google Watch has more on this if you're interested.
Then you've got the whole 'we buy out everything' approach.
Recently Google bought FeedBurner. There was a bit of an uproar (sorry, didn't save the links) from a few bloggers who used Feedburner, they didn't want Google having that sort of power. Google would then be able to track content makers and through Google reader, the content readers. Thats some nasty privacy issues if you think about it.
The ironic thing is, I know of another company who has bought out a lot of other companies (and continues to do so), who is considered evil by millions of people - including the majority of its user base. They've been sued to hell over their lifespan, but are slowly changing their image to a 'friendly/decent' company. Microsoft.
Speaking of Microsoft, they've got this new product out, you may have heard of it. Vista.
One of Vista's best features was its fantastic search. Apple's OS X has the same sort of thing, dubbed Spotlight.
Apparently Google wasn't too happy with Vista's search, it was far too built into the OS, far too good, and was stopping them from implementing their own Google Desktop Search. So they bitched about it. Loudly. And its been brought to the Department of Justice, and Microsoft is being forced to change the way Vista handles its search.
Winxperts reports on it.
Okay, sure, Microsoft is apparently abusing its power to release features in its own products now. They've agreed to three things, the the one that stands out the most is point two. (emphasis is mine)
(2) The default desktop search program will be launched whenever Windows launches a new top-level window to provide search results. This will include an existing location on the Start menu that a user can select to display additional search results in a new window. Windows Vista also includes search boxes located in the upper-right hand corner of various windows in the operating system, such as Windows Explorer and the Control Panel. In these windows, when the user enters a query Windows Vista will continue to display the search results using the integrated desktop search functionality. Microsoft has agreed, however, to add a link that, if clicked, will launch the default desktop search program and display search results from that program.
What does that mean exactly? I'm not to sure, but it sounds like the search facilities in the Start Menu will have to pop out into another window. That defeats the point of having the search there at all!
Look, even if I'm wrong (please, please somebody prove me wrong on this one), Google has still over stepped their boundaries, and are moving into asshole territory.
Where is the complaints about Spotlight, doesn't it have the same level of integration?
The problem with all of this is how 'reliant' on Google's services/products I am.
- My homepage is set to iGoogle
- I use Google Reader several times a day to manage my RSS feeds
- I use GMail, both the G-Chat and mail features
- Picasa2 is fantastic for managing my photos
- Google Adwords lets me run my websites a bit easier.
- Google's Calendar is a wonderful organisation service…if only I could edit it with Windows Calendar
So whats the solution? Go to another 'services' provider? What happens when they start 'getting evil', or worse….Google buys them out?
Realistically, I'm now looking at having to port as many 'services' over to open source (or writing it myself - any such products I'd release under CC licensing) and running on my own servers as possible.
This blog is already running on such software, rather than using Blogger.
This gets rid of the 'privacy' issues that plague Google (and for good reasons!), but then has the pitfalls of I have to maintain it, patch security holes, etc.
I was already looking at writing a webmail app (did you know GMail doesn't allow attachments with exe's in it? Even if they are Zipped, TARed, RARed, etc), I'd toyed with the idea of adding Calendar integration. Now I just need to write/find a decent RSS Reader, photo manager (I'd be willing to pay for one if it was good enough…), and 'web portal'.
Sigh. You know the worst thing? All my research for this post was done through Google.
No Comments
Update: Turns out some of the later ones, apparently, cover material we didn't, so they won't be on the exam. Exams tomorrow. Good time for people to find that out Ray
One of my fellow students had queries about the "Some Typical Exam Questions" document posted by our lecturer, namely, the answers seemed to be wrong.
This was the response
Yes some of those earlier sample solutions were done incorrectly. Hopefully the later ones are correctly done.
Ray
…what? So, the sample solutions with you provide sample answers for isn't right? And you can only hope that the later ones are correct?
I think its about time I say "KTHXBAI" to Monash, as this certainly isn't the first thing on the list of complaints…
I'll post the letter I'll send to the head of school (started writing it a few days ago) once it's finished.
No Comments
"Sample Solution for assignment 1. Note I have put this together very quickly and it doesn't have a lot of comments. It also doesn't adhere completely to the specification, I've just done the major parts. There also appears to be a separate floor plan down below the building, this is in fact a representation of the array I have used to check for limitations on movement, I drew it to check it was right and then didn't remove it."
That's the note attached to the sample solution for Assignment 1 in my OpenGL unit.
It wouldn't be so bad if assignment 2 wasn't based on assignment 1. And it probably wouldn't be so bad if the note was vaguely true.
- Instead of 'it doesn't have a lot of comments', it should read as 'it has comments, most of which are useless due to their scarcity' (we're talking one comment per function, if we're lucky)
- 'It also doesn't adhere completely to the specification', should read 'I made it roughly like what you had to do, but if you submitted anything like this, you'd get no more than 50/100'. The task involves generating two rooms. The example incorrectly generates the second room (in several ways)
In any other unit, an example like this would receive zero marks for code layout (lack of comments, although, this is the first example he's given with consistent indentation), understandability (variable names? ugh), etc.
I have other problems with this unit, specifically, the language of choice. I don't have any real objections to C++/OpenGL, but I have objections to the way its taught.
If you visited the unit description, you'll see a good knowledge of Java OR C/C++, as well as two prerequisite units that are taught using Java.
At Monash, the languages in this course have been: Java, VB.NET, PHP/Perl. Two out of three (the two you actually 'compile') are heavily Object Orientated. In this subject, we're discouraged from using OO. That's right, discouraged.
To make matters worse, no C++ is taught, just the GLUT commands. While the syntax is similar, there are some things that are very different from Java (pointers, not being able to return arrays, etc etc)
To make matters worse, this is the best taught subject I'm doing this semester.
When chickz0r's mother had a heart attack, obviously my studies were effected, so I applied for an extension. Gour Karmakar, my lecturer for Enterprise Programming did not respond. In-fact, he hasn't even acknowledged I sent it, despite how many messages I've left in the discussion boards (being off-campus, I don't have any other access to staff).
For this subject, I'm yet to receive my unit book. We're in week 11 or 12 of the semester, and I'm yet to receive the unit book or DVD containing the virtual image we're supposed to be working off.
But when I complain, oh, how quickly did he jump to email somebody else to look after it. Note, that was a week ago, still no further contact, and no materials.
Although, I dont' know if I'd like the materials anyway, all of its from Douglas Thomson (not saying Doug is bad, from memory, he was one of the few who could actually teach! I mean it more in a 'I wish Gour would make/understand/read his own materials' sort of thing), who was fired by the Uni (I believe). Its rediculous that everything has his name written on it, lecture slides, assignments, etc, its as if Gour just doesnt' care!
And with my final subject, Operating Systems, the lecturer seems pretty lazy. I don't know if this is the case, but all the lecture slides/example materials come from the text book. I don't mean rewording or derivation from the text book, I mean, word-for-word copying of Tenembaum's Modern Operating Systems. The most hilarious thing is we're forced to do a Plagiarism Declaration before we can access the assignments.
2 Comments
Graphics cards, nVidia in particular, have a sucky model numbering system.
On the desktop, you have (current 8xxx series) 8800 which comes in Ultra, GTX, and GTS. The 8600's (and I think the 8500's too) get GTS and GT.
And in the laptop arena, you have GT and GS for the cards.
Thats five different suffixes for your graphics card to supposively tell you what is the best performance.
Its too bad the 7xxx series had GTX, GT, GS (oh, and I suppose GX2), so throwing in those two extra suffixes certainly helps confuse customers.
It also doesn't help that usually the difference in a series (ie, 8800) is based on ram amounts and core clock speeds. You overclock the lower rated model, and you effectivly have the higher rated model. Except when you get to the 8600GT and GS. The GS has half the amount of Stream Processors (or the same amount as the 8400 series) as the GT, as well as different clock rates - hardly seems like it fits into the 8600 category at all!
My Proposal: "xyzz"
- x = generation
This is already in place, and although this does lead to confusion, there isn't much you can do about it. Each generation needs to be clearly defined.
ie, 8yzz is the Geforce 8 series
- y = series
Again, this is already in place, but is nessicary. There should, however, been some tougher rules regarding where the realistic performance is.
For example, ATI/AMD's x1600 got a revision, the x1700. Was it worthy of the generation gap? Hardly, the performance was increased, but the main difference was that it was produced using strained silicon. Each series should be defined by being at least 20% greater performance.
- zz = performance within series
Get rid of this Ultra, GTX, GTS, GT, GS crap.
Usually sometime after each series is launched, revisions come along which offer minor performance increases. To cope with that, cap zz at 50 for the first generation. So your 8800GTX (Not Ultra, as it was released afterwards) would become the 8850, GTS would be 8830, GT would be 8820, GS would be 8810, and the Ultra would be the 8860 or 8870 - or something along those lines.
Much easier to follow.
2 Comments
Cloth is a very versatile substance.
You can use it in your printer, to write letters to people, heck, most people buy "the cloth" from The Herald Sun or The Age (in Melbourne) every day.
You can make cloth aeroplanes, oragami is made out of cloth.
I bet you are sitting back, looking at your monitor thinking "this guy is an idiot".
Well, I might be that, but in this case, I'm right. At least in the universe according to Midway.
When I preorder Lord of the Rings Online Special Edition, I was excited. The list of included goodies was pretty awesome
- Cloth map
- Figurine
- Soundtrack
I picked up my copy from EBGames today, only to find that there was no figurine. Sure, there was a soundtrack, and even a map. Silly me, however. I mistook the map as being made out of paper, not cloth, as Midway would never false advertise now would they?
It'd be just like if they advertised if you entered your preorder key, then your retail key, you could get special pricing offers (USD$199 lifetime, or USD$9.99/month) and couldn't. You know, sort of like what happened to me a few days ago with chickz0rs retail key.
Their first response to my (very polite, I swear!) email was:
Thank you for your inquiry. We have reviewed your account, and it is upgraded properly. We are
aware there were some issues with a small number of Founder's keys not properly providing access to
the Lifetime subscription option, however our system has been updated and you should now be able to
select that option by logging into your account at https://myaccount.turbine.com and changing your
subscription plan. If you continue to have issues with this billing option, please respond via the
link below and we will be happy to assist you.
Fantastic, we jump onto the account page, and…nothing. Awesome.
They responded today, and actually fixed it, this time requiring us to enter in another preorder key (which they provided).
Good start Turbine/Midway, you're going to go well in this "small" gaming market thing.
First you won't take my money, then you won't give me what I paid you for.
Needless to say, I'll be calling up Midway on Monday to abuse them.
1 Comment