Rants, rambles, news and notes from another geek

Nine Months of WoW UI Modding

A little over nine months ago, much to the dismay of my wife,&nbsp_place_holder;my addiction to World of Warcraft began. At first it was just another game to play in my spare time, but I quickly fell in love with the teaming aspects of playing in an online world with dozens of my friends and thousands of other people.

Shortly after that I discovered that the WoW client isn’t just a game shell, but is a fully customizable smart client environment. I started downloading mods from sites like WorldOfWar.net and WoWInterface.com. I started out simply with a set of addons called CTMod and slowly progressed into more and more addons.

Feb 08, 2006:
Mar 31, 2006:
Apr 01, 2006:

After that I discovered how amazingly configurable the environment can be when I discovered a set of addons called Discord Mods. DiscordFrameMover let me move, hide&nbsp_place_holder;or resize any visual element on the screen. DiscordUnitFrames let me create very rich frames of information about my players, my targets and the members of my group. DiscordActionBars let me create button bars that change as the environment changed around me. This was amazing stuff.

Apr 04, 2006:
Apr 06, 2006:
Apr 16, 2006:

Then I decided I was ready to see how these addon things really worked. I started exploring the Lua language, the WoW API and the XML-based widget language. I started working on my first Addon: a simple reminder to tell me when my rogue’s poisons expired. What I found was that writing well designed modular code was frighteningly hard using the out-of-the box tools and API. Frustrated, I started looking around for alternatives and finally stumbled on the Ace libraries.

Using these libraries I was able to recreate my poison addon with a dozen or so lines of code and I didn’t come away feeling dirty from all the spaghetti in my Lua files. I felt like my code was nice and modular. The object-oriented nature of the Ace approach felt good.

As I explored Ace I learned that these folks had spent a LOT of time thinking about performance and memory consumption in their addons and had rewritten a number of important addons using their framework and thereby consuming&nbsp_place_holder;a lot less resources. Another thing I liked that aligned well with my philosophically was the Ace attitude about using more small single minded addons instead of a few large monolithic addons. I immediately started systematically trying to replace all of my non-Ace addons with Ace replacements.

I also continued to expand my Rogue poison addon eventually turning it into a full blown ItemBuff management addon for all classes called FuBar_PoisonFu. When I finished that I realized that even though Ace is easier than stock WoW, there wasn’t really enough tutorial information to help people get started, so I wrote WelcomeHome - Your first Ace2 Addon over on the Ace wiki. I’m also working on two or three other addons that I will be publishing to WoWInterface.com via my authors portal.

Aug 21, 2006:
Aug 29, 2006:
Sept 06, 2006:
Sept 07, 2006:
Free Image Hosting at www.ImageShack.us

This is where I am today. That last screenshot has changes I made to the Unit Frames today. I still use DiscordUnitFrames and DiscordActionBars, but most of my other mods are Ace addons. My framerates are up, my memory consumption is down and I’m having as much fun being an addon author as I am playing the game.

Since I know people will ask, here is my Addons list at this point:

FuBar_DamageMetersFu FuBar_DPS
idChat2_Timestamps Informant

Many of these you can get from www.wowinterface.com&nbsp_place_holder;or ui.worldofwar.net. Others you have to dig a bit harder to find. Since most of the Ace developers use the same version control system, you can get up to the minute versions of many of the Ace mods from www.wowace.com/files. You should assume, however, that those are betas. If you prefer stable stuff, stick with the stuff published to the main sites.

Best of luck! If you play on Dragonblight, look me up. I’m Quaiche, Gaskett, Mirabel and Clavain in the&nbsp_place_holder;Lithe guild.

Patterns & Practices Needs Your Help

Don Smith, one of our Product Managers, has put up a few blog posts looking for feedback about how we engage with you. He is asking questions about things like:

  • How do you feel about the written part of our guidance?
  • How do you feel about having to join a site to access our stuff?
  • Do you want live source code access or just periodic releases?
  • Do you want access to the work queue and bug list? Would you submit bugs and feature suggestions?
  • Do you prefer web forums, mailing lists, or RSS feeds to stay informed and to talk to other people about p&p deliverable?
  • How do you feel about wikis as a way of providing and managing documentation content?
  • What can we do better to communicate more effectively with you, our customers?

Anyway, instead of posting a reply here, please go over to these two posts on Don’s blog and give him feeback on his questions.

Thanks for taking the time to help us out on this. It makes a difference.

Another Cool PowerShell + Subversion Hack

As I said before, I’ve been writing an Addon for World of Warcraft using the Ace2 libraries which are hosted on a subversion server.

I was trying to track down a bug that I couldn’t reproduce so I decided to completely refresh my entire Ace addon set from the svn server.

So I needed to run through every directory in my Addons folder and if it was a subversion working copy then I wanted to delete it and re-checkout that folder from the subversion server.

Again, this only took a single line of PowerShell script:

[75] ┬╗ ls | ? { svn st $_ 2> out-null; return ($lastexitcode -eq 0) } | % { 
$xml = [xml] (svn info --xml $_ 2> out-null); $url = $xml.info.entry.url; 
del -recu -force $_; svn checkout $url $_ }

I love PowerShell. It rocks!

PowerShell Equivalents for Common "DOS" Commands: The DIR Command

Tommy Williams has started posting an lists of translations from CMD.EXE to PowerShell. His first post is the ever popular “DIR” command. Coming soon he promises a list of things you can do with PowerShell’s “get-childitem” command that you can’t do with DIR. (I already know a bunch of them, but I don’t want to spoil his thunder. )

You should subscribe to his PowerShell category to keep up with this project. Thanks Tommy!

Micro-Pairing Defined

Last year I wrote a blog post titled, “The Pair Programming TDD Game” where I described a way of doing pair-programming combined with TDD that changed the focus of the pair from one of “driver-navigator” to something more like “designer-implementer”.

Since then Brad Wilson and I have presented this concept (often with the help of our good friend Mitch Lacey) a number of times around Microsoft and in other forums, most recently at the Agile 2006 conference in Minneapolis.

After that session (which was very well recieved) Brad, Brian Button and I were talking and we decided that this technique needed a new name. A number of interesting proposals were named, but in the end the one I decided best described it was “Micro-Pairing”.

So, from now on that is what we will call it. Brad and I have evolved the thinking behind this quite a bit from that first blog post, and will probably be writing more on it soon enough.

For now, here are a few write-ups and reviews of our Agile 2006 talk:

PS. For those who see a similarity to “Ping-Pong Programming,”&nbsp_place_holder;we acknowledge that but we are very clear to point out that Micro-Pairing is more like a subset of ping-ponging because it provides more prescriptive guidance about how to pair, when to switch roles, and the part negotiation plays in the process.

Open Source Projects, Leadership and Money

There has been a meme going on lately where a number of folks have been talking about the death of NDoc and the implications of that on open-source .NET projects.

Kevin Downs, the leader of NDoc wrote this in an email to the NDoc list:

Unfortunately, despite the almost ubiquitous use of NDoc, there has been no support for the project from the .Net developer community either financially or by development contributions. Since 1.3 was released, there have been the grand total of eleven donations to the project. In fact, were it not for Oleg Tkachenko’s kind donation of a MS MVP MSDN subscription, I would not even have a copy of VS2005 to work with!

To put this into perspective, if only roughly 1-in-10 of the those who downloaded NDoc had donated the minimum allowable amount of $5 then I could have worked on NDoc 2.0 full-time and it could have been released months ago! Now, I am not suggesting that this should have occurred, or that anyone owes me anything for the work I have done, rather I am trying to demonstrate that if the community values open-source projects then it should do something to support them. MS has for years acknowledged community contributions via the MVP program but there is absolutely no support for community projects.

I hear what Kevin is saying, but it saddens me. It doesn’t sadden me that Kevin didn’t get paid. It saddens me that people weren’t jumping in to contribute to the project.

What good, successful open-source projects have is a solid core of contributors and a periphery of people submitting bugs, features and most importantly patches. But you know what? People don’t just step up and give their time for free just because they should. No. They have to be recruited. They have to be encouraged. And that is hard. It requires a project leader who is passionate, engaged, and who is interested in sharing responsibility with other people. It requires a leader.

Now, I don’t know if Kevin was a leader or not. I don’t know how Kevin ran his project. What I do know is that a large number of .NET open-source projects have a disease where the founder stands around wondering why he only hears from whiners wanting more and not from people volunteering time.

Is it because Microsoft has done something to squelch the community? I don’t think so. I think it is because most .NET open-source project leaders don’t understand that to build a team you have to work at it. You have to sell it. You have to recruit. You have to lead. Ruby and Java OSS project leaders get this. Our community doesn’t. I don’t know why.

I like what Scott Hanselman wrote on this front:

Personally, as an Open Source project co-leader, I’d much rather folks who use DasBlog pick a bug and send me a patch (unified diff format) than give money. I suspect that Kevin would have been happy with a dozen engineers taking on tasks and taking on bugs in their spare time.

Now, Scott also wrote this:

It’s a shame that Microsoft can’t put together an organization like INETA (who already gives small stipends to folks to speak at User Groups) and gave away grants/stipends to the 20 or so .NET Open Source Projects that TRULY make a difference in measurable ways. The whole thing could be managed out of the existing INETA organization and wouldn’t cost more than a few hundred grand - the price of maybe 3-4 Microsoft Engineers.

I think this is an interesting idea, but I don’t think INETA should do it. It should be another team, with a different goal and agenda. I’m not sure it would work though. What this ends up doing is monetizing the contributions of the project members. Suppose there was $20k available for NUnit development. Does this mean that someone can stop working their day job to work on NUnit? No. So I’m not sure how it will help. Healthy projects need people, not money. I know many .NET OSS project leads want to “get paid”, but that is about personal ego and not about the project’s success.

Someone used an interesting analogy the other day about a different topic, but I think it applies here. Suppose you donate your time to your local community center to build them a cool new website. You spend a large amount of your spare time at night and on the weekends doing it. When you are done, you feel proud. You did something GOOD. You bring it to the community center leader and show it to him. “Wow. That is really great. Thank you so much. Here is $100.”

Right up until they offered you money you felt good. But as soon as the money got involved, the whole thing changed. You will start thinking things like, “$100? Are you kidding me? I spent a hundred hours on that project. If you want to pay me, pay me $10,000!!”

I’m worried that bringing money into the equation spoils the really cool part about community developed software: it is made by a community of people for the benefit of the community itself. Not for money.

As an aside for those who believe that Sandcastle is a result of the “not-invented here” syndrome inside of MSFT, you are wrong. Sandcastle is an OLD tool inside MSFT. Almost every API spec you’ve seen come out of MSFT was created with it. And people were asking for it. So we gave it away. This is what everyone asks us to do more of and yet when we do it, we get criticized even more.

This is just my 2¢ on this topic.

Just Released: Web Service Software Factory July 2006

From Tom Hollander’s Blog:

The patterns & practices team is pleased to announce the availability of the first “official” release of the Web Service Software Factory. The Service Factory is the latest addition to our fast-growing crop of factories, including the Smart Client Software Factory and the Mobile Client Software Factory.

I know many of you have been following the evolution of our factories for a long time, so I won’t bore you with too many details again - but if you are one of those people who are allergic to betas, you’re now out of excuses - so I’ll give a very quick spiel on what the Service Factory is about.

Like all of our factories, the Service Factory is a collection of guidance to help you build applications of a particular architectural style - in this case, service-oriented applications that expose an ASMX web service interface and provide security and business rules over a database. We have a nice graphic (which is updated from an older one you’re probably already familiar with) that shows the basic architecture and scope of the Service Factory:

The factory itself is a combination of several forms of guidance:

  • Written documentation, including architecture overviews, patterns and step-by-step guidance on how to build applications within the specified architecture
  • Guidance packages, built using the Guidance Automation Toolkit, which automate many development tasks, including creating service contracts, translating between different entity types, generating stored procedures and creating data access logic classes
  • Reference implementation, which is a made-up but realistic sample application which shows what type of services you can build with the factory.

The other very cool thing about the factory is that it is completely customizable (we ship all of the source) - so if the architecture or implementation details don’t quite match what you need for your organization or project, you can just go ahead and modify the factory.

Thanks to everyone who helped deliver this project, including our fantastic project team (Jason, Don, Chris, Nelly, Sanjeev, Ed, Wojtek, Pablo, Hernan, Brian, Juan, Larry, Carlos, Tushar, Arun, Lonnie, Paul to mention but a few); our expert advisors; everyone who has participated in our community by downloading previews and providing feedback, and countless other people in and outside of Microsoft who have given their advice and support. We hope you enjoy the result!

A couple of final notes: the version of Service Factory on MSDN today only supports C#, but we are working on a VB version now and we will get this out to you as soon as possible. Also, we’ve already started working on the next version of Service Factory, so please keep the feedback coming to help us make the next release even better.

Congrats to the team for a job well done!

PowerShell Function: Go

Yesterday&nbsp_place_holder;I was in a meeting with Fernando Simonazzi when he mentioned how much he has been falling in love with PowerShell. We talked for a bit about how cool the object pipeline is and then he said, you know what I’ve been thinking about writing is a “go” script that will jump to a set of named locations.

What&nbsp_place_holder;a great idea. I couldn’t leave well enough alone, this morning, so I wrote one and put it into my profile. Here it is:


	if( $GLOBAL:go_locations -eq $null ) {
	$GLOBAL:go_locations = @{}
	function go( [string] $location ) {
	if( $go_locations.ContainsKey($location) ) {
	set-location $go_locations[$location]
	} else {
	write-output "The following locations are defined:"
	write-output $go_locations

To use it, you can simply put this at the bottom of your profile script:

	. ~/scripts/go.ps1
	$go_locations.Add("home", "~")
	$go_locations.Add("dl", "~\Desktop\Downloads")
	$go_locations.Add("dev", "C:\Development")
	$go_locations.Add("scripts", "~\scripts")

And now you can do this:

	PS1> go home

Eventually, I will merge this into the “cd” script that Brad Wilson and I have been tweaking to really make directory navigation a breeze.

PowerShell Syntax File for Vim

After finally getting my machine setup back in order after and during the Agile 2006 conference, I realized that I hadn’t updated my Monad/MSH syntax file to support PowerShell (ps1).

The updates are done and I have uploaded the file to vim.org. FWIW, the changes are almost none… just a replace of “msh” with “ps1” and all is well. After I use it some more, I will update it as needed.

I will post some LUA-friendly installation instructions shortly, but for now you can use my old instructions (not-LUA friendly).