if ( document.comments_form.url ) { document.comments_form.url.value = getCookie("mtcmthome"); }
I know there are hundreds of World of Warcraft screenshots out there, but it just so happens that I felt compelled to take two of these myself within a half-hour time, which is rare enough, so I thought I'd share my experience (and said pictures).
I took these two screenshots in Alterac Valley, which is one of WoW's three player-vs-player (PvP) areas. In these areas, members of the main two factions are pitted against each other and assigned certain goals. In Alterac Valley, the goal is to conquer the enemy's fortress and kill its general before your opponents do the same.
Alterac Valley is a big battleground with various buildings and constructions that you can choose to conquer or skip, depending on your strategy. The Alliance put up a good fight in one of their advanced bunkers and it took us numerous attempts to finally capture it. The fights were fierce and all classes of combatants were involved. I died several times myself along the way, but since the graveyard was nearby, I was able to come back and continue the fight.
Finally, we were done, and when the flag eventually converted to our color, I emerged from the bunker, still pumped with adrenaline and ready to move on to the next target, but the landscape outside just stopped me in my track. The moon was rising behind the hills and a pond way down below the valley was reflecting its silvery rays. The entire scenery looked so peaceful and it contrasted so starkly with the intense scrimmage I was just submitted to that I paused and took this picture. The two blue banners in the distance are set on the Alliance fortress, which is our next goal.
The moon rises over the Frost Wolf Fortress
Click for the large version (3 megs)
There are various ways you can make the fight for Alterac Valley more interesting. One of them is being able to summon various elite characters or animals that will help you in your fight against the other faction. You need to fulfill certain conditions before you can do this (such as turn in items collected on the dead bodies of your enemies), but once you're done, it's definitely worth making a quick run for the altar and do the summoning.
While the Horde can summon a creature called the Ice Lord, the Alliance can invoke the help of Gryphons, which hover high above the fight scene and have the ability to cast a powerful knock back that will throw all the troops under it at a distance. It doesn't harm anyone, but it causes chaos that is very valuable to the attackers.
The Gryphons fly so high that you usually never notice them until you feel yourself lifted in the air for no reason. This is exactly what happened to us during that fight and the group reacted immediately by concentrating their firepower to the harmless-looking creature flapping its wing over our heads. Again, the sight was so taking that I stepped back on a nearby hill and snapped several pictures to immortalize the instant...
A Gryphon becomes the target of a Horde group in Alterac Valley
Click for the large version (3 megs).
Say what you want about World of Warcraft, but I have yet to come across a game that, one year and a half after I started playing it, is still making me live such intense and gratifying moments...
That's it.
Well, almost: after your round, you receive a new supply of armies based on the number of conquests, which are then randomly assigned to your countries (and incidentally, I still haven't figured out how this number is calculated, so if you know, please share!).
Don't be fooled by the simplicity of the rules, as they allow for some singularly sophisticated strategies. For example, you might be tempted initially to pick a pile of six dice and plow through enemy territories until you run out. This will get you a nice supply of new armies, but it will also leave a wake of countries protected by only one dice, which will undoubtedly be taken back by the opponents at the next round (which will also allow them to insert a wedge through your possessions, another bad thing). However, you also quickly realize that a pile of eight dice is useless if it's only surrounded by friendly territories, so in some way, you want to invite the enemy to come nearby so you can unleash your stockpile...
The game allows for two to eight players, but I strongly recommend starting with four and work your way up from there...
Enjoy!
A lot has gone into this release, and instead of boring you with a standard product announcement, I thought I'd try something new by giving you not only the list of the new features (at least the most important ones) but also a quick explanation why this feature was added. Read on, because this is no unusual product announcement!
Let's start with a quick overview of the main TestNG 5.0 features:
Okay, I was just kidding about that last one. Just making sure you're paying attention.
Let's go into details now.
Configuration annotations
In the early days of TestNG, the idea of an annotation that would indicate that a method has a special role was obvious to me. What was not obvious was: what should it be called? Believe it or not, I was already hesitating back then between @BeforeSuite and @Configuration(beforeSuite = true). That was two years ago.
I could find virtues in either of these approaches, but I eventually opted for the latter because of IDE support. I thought that if all the configuration options can be gathered under one convenient annotation, it would be very easy for an IDE user to have a list of everything that's available: they can just type @Configuration(<ctrl-space> and they would get the full list.
I still think this argument holds, but one can argue that it's equally easy to type @Before<ctrl-space> to get a list of all the "before types" that you can use. On top of that, the newer style has two extra benefits:
Of course, the old annotations are still recognized, but they are now deprecated.
New report structure
While TestNG lets you invoke multiple test suites easily (e.g. java org.testng.TestNG testng1.xml testng2.xml), the reports didn't maintain this distinction and bunched up all the results in the main output directory. I thought I would take advantage of this release to clean up this structure and have each suite create its reports in its own directory (named after the suite name). Additionally, the output directory now contains a single index.html that gives a composite view (and links) of all the suites that were run along with their outcome.
Also, the reports are now using a CSS file and their appearance has been improved. They also contain additional information, such as a pointer to the testng.xml that was used for a particular suite.
suiteName and testName
These two attributes belong to the @Test annotation and they can be used as follows:
@Test(suiteName = "My suite", testName = "My test")
public class Test {
This feature will be of interest to users who don't want to use a testng.xml and, instead, prefer to use the command line or ant to invoke their test suite. With these two new attributes, these users can now get the benefit of seeing their test suites end up in a specific report.
Of course, classes that use these attributes will have their reports generated in the structures as described in the previous paragraph.
expectedExceptions
This attribute used to have its own annotation (@ExpectedExceptions), but it was pointed to me that this annotation made little sense if it wasn't coupled with a @Test annotation, so this was definitely a design mistake that needed to be corrected. As of 5.0, @ExpectedExceptions is deprecated and you should now use the new expectedExceptions attribute from @Test:
@Test(expectedExceptions = NumberFormatException.class)
public void shouldThrow() {
Friendly stack traces
This was another heavily-requested feature. Whenever a test fails, it does so with an AssertionException which shows the entire stack trace, including TestNG's internal frames, reflection, etc... These stack traces will now be hidden by default so that the report only shows what you really care about:
Before:
java.lang.NullPointerException
at java.util.Hashtable.put(Hashtable.java:396)
at java.util.Properties.setProperty(Properties.java:128)
at org.testng.xml.XmlSuite.toXml(XmlSuite.java:318)
at org.testng.reporters.SuiteHTMLReporter.generateXmlFile(SuiteHTMLReporter.java:81)
at org.testng.reporters.SuiteHTMLReporter.generateReport(SuiteHTMLReporter.java:72)
at org.testng.TestNG.run(TestNG.java:613)
at test.configuration.BeforeTestOrderingTest.verifyBeforeTestOrdering(BeforeTestOrderingTest.java:47)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.testng.internal.MethodHelper.invokeMethod(MethodHelper.java:552)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:411)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:785)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:110)
at org.testng.TestRunner.privateRun(TestRunner.java:687)
at org.testng.TestRunner.run(TestRunner.java:567)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:242)
at org.testng.SuiteRunner.run(SuiteRunner.java:148)
at org.testng.TestNG.createAndRunSuiteRunners(TestNG.java:899)
at org.testng.TestNG.runSuitesLocally(TestNG.java:861)
at org.testng.TestNG.run(TestNG.java:611)
at org.testng.TestNG.privateMain(TestNG.java:999)
at org.testng.TestNG.main(TestNG.java:936)
After:
java.lang.NullPointerException
at java.util.Hashtable.put(Hashtable.java:396)
at java.util.Properties.setProperty(Properties.java:128)
at test.configuration.BeforeTestOrderingTest.verifyBeforeTestOrdering(BeforeTestOrderingTest.java:47)
... Removed 21 stack frames, click here to show them.
Finally, here is the complete TestNG 5.0 change log:

Word is trying to look cool
There is something really beautiful about transparency on a computer screen. I can definitely remember the shock of seeing transparent waters in Far Cry or some of the numerous operating systems that support alpha-blending. But the sad truth is... it's never worked for me.
I've tried to use transparency in many different ways (transparent terminals, transparent dialogs, etc...) but it always ends up looking ugly, and I always end up making all my windows opaque again. Maybe it's because I'm a proficient windows switcher and that I can do so extremely fast with keyboard shortcuts, but the bottom line is that the few times when a window is partially obscuring another window that I'm trying to read, I find it faster to Alt-Tab twice than trying to make sense of the blended backgrounds.
But maybe it's just me...
Are you using transparent windows on your desktop? How? (and feel free to post links to screenshots if you have any)
I'd like to come back to my initial observations on Mac OS' handling of window management because the more I figure it out, the less it makes sense.
You will notice that comments on my initial blog entry on this topic are usually along the lines of "I use Exposé all the time, I've never had any problem" and "Just use the right side of the dock, that's what it's for".
The problem is that both these answers are wrong, and I'm beginning to understand why. The first hint I got was my realization that sometimes, pressing Alt-~ would only cycle through three FireFox windows while I'm pretty sure that I have more than six windows open. Where did the other three go?
And then, the same remark with Exposé: I know I have six windows, why do I only see three when I press F9?
The answer is probably obvious to Mac OS veterans but baffling to anyone else: Exposé and Alt-~ will only show you windows that are not minimized. If you want to pick a window that was minimized, your only choice is to click on an icon on the right side of the Dock.
This is bad for two reasons:
This also explains some of the comments I have received on my previous entry, such as "I rarely ever minimize, I just leave all the windows open all the time". I initially thought the person who wrote that was kidding, but I know now that he was serious, and the reason is obvious now: when you have a mix of minimized and open windows, finding the right one becomes a challenge, so your only bet is to always minimize or to never minimize. Coming from Windows, this is a philosophy that's extremely hard to embrace.
I understand the initial intent of trying to separate "applications" from "documents", but this metaphor is completely broken nowadays. Is a FireFox windows with many tabs open an application or a document? Well, this is actually the wrong question, you should really ask "Did I minimize that window last time I saw it or did I just move it in the background?".
Again, Windows gets it right by putting all the windows in the same stack. Whenever you need to look for one, you look in one place, and some third-party utilities let you refine your search.
Well, to be honest, Windows only gets it partially right as well, since it won't let you narrow down your search to only windows of the current application, hence my confessed love for TaskSwitch XP.
The ultimate window switcher?
So what't the solution to this window management mess on Mac OS? There actually is one, and interestingly, it was never suggested by any of my expert MacOS buddies: if you right click on the icon of the application on the Dock (the left side, not the right side), you will get a list of all the open windows, minimized or not.
Right-click for the win!
This is exactly what I need and my experience with window switching has become a lot smoother since I discovered this.
It's not perfect, though, and this leads me to my second main gripe with MacOS X, which I will address in the next entry. Until then, feel free to share how you switch windows on Mac OS in the comments, since I'm really curious to learn about the working habits of veteran users.
The title says it all... Test your typing speed!
I recommend doing it three times in a row and take the average speed. I seem to score between 120 and 130 words per minute.
How about you?
I've been using computers pretty much since the age of 10 and since then, I have moved from programmable HP calculators to small computers (PC-1211 anyone?) then Apple ][, Amiga and finally, Windows pretty much ever since. I have spent a lot of time on Linux as well in the early days (back then, we were already saying that Linux was going to break through any day now) but gave up on it in despair five years ago after I realized how much it was stagnating.
At my work, I now find myself constantly switching between Windows, Linux and Mac OS. And I'm not exaggerating. I'm using at least two of these operating systems every day and more and more often, all three of them.
Finally, I don't succumb easily to the fan syndrome and I try to keep a technical and objective judgment on everything.
Now that this is out of the way, here are my impressions after one week of diving into Mac OS.
While Mac OS contains a decent number of tools for power users (I really love having a native UNIX shell on my laptop), its newbie-oriented interface still shows in a lot of the operations that I do on a daily basis: big fonts, big colored buttons, primitive task and window switching, shortage of keyboard shortcuts (e.g. minimizing a single window), double clicks everywhere, no delete key, no right click, etc...
Unfortunately, Apple hasn't really shown any good sign nor will to modernize their operating system in these various areas. This might not be a bad idea, since the biggest audience remains the casual user, but until these details are addressed, Mac OS will never be the ultimate hacker operating system (which remains Windows, in my opinion).
Finally, I'd like to say that despite these gripes, the experience has been fairly pleasant so far and I'm looking forward to exploring Mac OS further, but this initial foray shows that while Mac OS has some distinct advantages for hardcore geeks like me, it's still not the ultimate combination of hardware and software for geeks.