December 31, 2009

The End Of A Year Of Shifts

I don't think you'll be able to find many people who think this year has been a good year. I definitely don't think this was a good year as a whole, but I do think that several good things have happened this year. That said, this year was a culmination of a multi-year effort for me and to let you know what I'm talking about, I need to go back into history for a few minutes.

I started in quality assurance back in 1998 at Access Software, coming in at the end of Links LS 1999 Edition and coming into an extremely defective QA process. Even as defective as it was, it planted a seed in me that unleashed some latent talents. I quickly became a test lead and continued along that path at Microsoft after the acquisition. While the QA process at Microsoft was significantly improved, the environment had changed to the point where two things had happened: my connections to what I was testing became more ephemeral because of my position, and I started to feel disconnected from not only my department but my duties as well. It was affecting my performance and behavior in negative ways. Yvonne's illness gave me an excuse to start searching for a different job and I finally left Microsoft after working on Amped 2.

Now, even though QA was my passion, I've almost always coded. Coding had been a creative outlet for me, and I'd spend hundreds of dollars a month on books so I could learn new languages, new techniques, and new technologies. I had been writing games since I was five, and that coding experience helped me in QA because I could look at a feature, say to myself, "How would I develop this?" and test the code as if I wrote it. Because no two programmers will ever code a feature the same way, this dissonance helped me out significantly in my career. My coding experience also helped me land on my feet outside of Microsoft by working for my home town of Layton, Utah. I very nearly didn't get the job. After I was hired, my boss told me that he looked at me and saw someone who was burned out to the point of not caring anymore which was a very fair assessment. While the pay at Layton wasn't all that great, coding as a full-time job was reinvigorating. I got a much deeper understanding of data-driven coding, learned a lot about when you have to reinvent the wheel, and even though I look back on my code back then and laugh at how primitive it was, the experience taught me a lot about dealing with internal and external customers, requirements gathering, and more.

Now, before I had even started at Layton City, I had sent out tons of resumes as part of my effort to leave Microsoft. One of those resumes had been to Ritual Entertainment. I had been in discussions with them during my last year at Microsoft and finally had a chance to interview with them in March of 2004 and was told at that point that I was their choice. However, work they had been doing on the new Legacy of Kain title (a sequel to Defiance) had been canceled by Eidos and they had to suspend my hiring. They managed to get other projects and finally were able to make me an offer just before Thanksgiving in 2004 to be their new QA manager. My role was going to be to create their QA department and policies from scratch, and I eagerly accepted the role and moved to Dallas.

I had two motives when I accepted the job. The first was to introduce QA to Ritual without hitting any of the roadblocks that Microsoft hit retrofitting Access with their QA structure. The second was the belief that I had something to share with the industry and working for what I thought to be a premiere independent developer would give me a mouthpiece from which to speak.

Well, I failed at my first motive. I approached Ritual with kid gloves and while the approach was better received than the iron fist of law, it made it seem like I wasn't serious about getting QA in. As a result, I ended up having a total budget over my two year tenure of under $150,000...and that included salaries, config passes at external labs, hardware and more. Trying to be Mr. Nice Guy meant several necessary QA policies weren't going to be implemented until at least year four (if I made it that long).

I fared much better at succeeding on the second point. Interviews with the fansite and several gaming websites, dealing with the customer base directly, and access to several industry backchannels that were previously unavailable to me gave me a podium and I used it. I still have a lot of friendships from my efforts at the time.

Three things happened in my last year at Ritual. One of the three major projects we had (an expansion to a recently released game) was cancelled due to poor sales of the original title, another major project shipped but died in the marketplace, and Ritual had started to staff up for a third title that we were partnering with another local dev on that never materialized due to a license holder dicking everyone around. The end of that third piece coincided with my Sony post. Given that Ritual was shifting into survival mode, my layoff was understandable, but it still shook me to my core.

I fell back on my development experience and started work with a contracting firm, but even that experience had a ton of issues. They finally stopped when I accepted a full time position three years ago next month.

After the employment situation settled down, I found that I was still fairly shook up. A lot of my beliefs about myself and my abilities were tested at Ritual and found wanting. I needed to really take stock in who I was, what I believed and why, and that's what I've been doing over the last two and a half almost every aspect of who I am.

Some things I've discovered have been obvious. I'm finally "out of the closet" so to speak regarding my atheism. On the Dawkins scale, I'm right on the 6. A huge shoutout goes to Matt Dillahunty and crew down at the Atheist Community of Austin for helping me along that path.

I've found my core strength to be divining requirements from poor definitions. My skills in QA and development are directly tied to this piece of the puzzle.

I've discovered that while QA is my passion and always will be, I'm not the proper advocate for it on a large scale. There are many levels where advocacy can be done and I am much better at being an advocate at a local scale. Besides, anything that takes my focus away from my project is a bad thing.

Likewise, I love game development with a passion, but it takes so much out of me that if I ever go back, I shouldn't stay for more than three years in any sort of individual contributor role. That's pretty much my tolerance level for the type of bullshit that the games industry piles on its workers.

I'm still extremely antipiracy, but I am extremely pro-fair-use. I believe that as long as you aren't giving someone else an exact copy of what you acquired legally, you should be able to do damn near whatever you want with it. Space-shift, time-shift, transcode, encode, format-shift, mashup, breakup,'s your business. As long as you don't demand support for your changes, go ahead.

Finally, I believe I've found the final use for this blog. Over the last several years, I've been posting little code snippets about how to solve or workaround various problems. No bullshit, no fluff...just a description of the problem and the code to make it go away. Aside from the occasional personal post like this one, that is going to be the focus of this blog going forward.

Thanks for sticking with this blog for nearly six years. It will be interesting to see if this blog makes it to the decade mark.

December 14, 2009

Workaround: Integrating Windows Identity Foundation and Sitefinity


After adding an STS reference to your Sitefinity web site, you are able to get to the STS login, but after logging in, the website goes into an infinite refresh loop.


Sitefinity takes over the ASP.NET pipeline at an inopportune moment for Windows Identify Foundation.


Add a new ASP.NET page to your project called STS.aspx. The page can be blank. It's just there so that the ASP.NET pipeline will remain active at the proper time.

In your web.config, update your audienceUris and realm in the windows.identity section to point to [domain]/STS.aspx instead of just [domain].

Comment out the WSFederationAuthenticationModule httpModule and add this one in its place:
<add name="SitefinityWSFederationAuthenticationModule" type="SitefinityWSFederationAuthenticationModule, App_Code" />

Add a new class to your App_Code folder called SitefinityWSFederationAuthenticationModule.cs with this code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.IdentityModel.Web;
using Telerik;

public class SitefinityWSFederationAuthenticationModule : WSFederationAuthenticationModule

protected override void OnRedirectingToIdentityProvider(RedirectingToIdentityProviderEventArgs e)
UriBuilder ub = new UriBuilder(HttpContext.Current.Request.Url);
ub.Path = "/STS.aspx";
ub.Query = String.Empty;
e.SignInRequestMessage.Realm = ub.Uri.ToString();


November 11, 2009

Pharyngula Gets Comforted

You have to love keyword-sensitive ads. PZ Myers' popular science/atheism blog Pharyngula, due to the constant run of Ray Comfort "Banana Man" jokes, has the funniest ad ever right now when taken in context.

October 26, 2009

FW: FW: FW: No "God" On Dollar Coin?

My wife just sent me this massive FW: FW: FW: designed to throw Christians and those who believe that the United States is a Christian nation into fits of religious paroxysm by claiming that the new gold dollar coins don't have "In God We Trust" on them.

Never mind the history behind this vacuous motto being placed on our currency, but the accusation being levied just isn't true.

Pick up any of the new gold dollar coins and look at the edge. You'll notice two mottos embossed around the outside. One is "In God We Trust." The other is the original motto of the United States of America: "E Pluribus Unum," or "Out of Many, One."

I also love how the E-mail claims that they checked it's obvious they didn't. The article on even has pictures to show how full of it they are.

If you are going to forward something thinking you are doing some good or advancing a cause, please do at least the bare amount of research necessary to see if what you are forwarding is actually true. Go to Go to Bing or Google the main keywords from what you are going to forward and at least check into it. Either you'll find out you are justified, or you'll learn something new. In either case, all of our inboxes will be better for it.

September 11, 2009

WORKAROUND: Catalyst 9 Drivers Blue Screen Windows 7 On Install


When you try to install the Catalyst 9.x drivers for your ATI Radeon video card on Windows 7 RTM on a machine with an Intel ICH9 chipset, the installation blue screens at the device detection phase.


You have a USB device plugged in that isn't compatible with the Catalyst device detection routines.


Unplug every USB device except for your keyboard and mouse. If your system has a Windows SideShow device on it, you may have to disable it in the BIOS.

After doing this, reboot your machine.

Install the drivers.

After a successful install, reboot your machine.

Plug everything back in.

September 3, 2009

Silverlight's Trojan Horse

Microsoft found the perfect way to get Silverlight out to more getting the Java guys to bundle it with their runtime.

Yes, the Bing Toolbar is powered by Silverlight. Personally, I think this is a great idea. After spending over a year learning Java, I realize exactly how much better the .NET Framework is for everyday development. With more penetration, perhaps more developers will see it as well.

August 17, 2009

Mail Server Down

For some reason, the mail server has gone away. I'm working on figuring out what happened. If you need to contact me in the interim, send it to romsteady [at] gmail.

July 6, 2009

Heading Back To Utah...For Work

I'm going to be back in Utah this coming Friday evening through Wednesday noon for work.

If any of the old SLGTest guys are reading this, feel up for dinner Friday night?

June 24, 2009

Unfortunately Accurate


By the way, a new skin will be coming to the site shortly to move nav back to the left to keep things like this from getting chopped off by the nav.

June 22, 2009

Enforcing MaxLength On TextBox Controls

If you use ASP.NET, you've probably encountered situations where you need to restrict the overall length of input and you've tried using the MaxLength property on the TextBox controls.

For the most part, that works. Most browsers properly restrict the length on the client side. However, some browsers do not properly restrict the entry length, some browsers have loopholes that allow overlong entry (copy/paste, etc.), and you can't forget malicious users.

So you can properly restrict the sizes using ASP.NET's validators, do the following.

Drag over a CustomValidator and point it to the TextBox you want to enforce length limits on.

Point the CustomValidator's ServerValidate function to this function...

protected void TextLength_ServerValidate(object source, ServerValidateEventArgs args)
CustomValidator v = (CustomValidator)source;
if (v != null)
TextBox t = (TextBox)this.FindControl(v.ControlToValidate);
if (t != null && t.MaxLength > 0)
args.IsValid = args.Value.Length <= t.MaxLength;
args.IsValid = true; // If custom validator wasn't set up correctly, assume valid

June 6, 2009

Kait and Joel

This is my granddaughter Kait and Joel Hodgman from Mystery Science Theater 3000 and Cinematic Titanic.

Kait and Joel

I can't believe how much she has grown up. Tonight was her first live riff and she had a blast.

May 24, 2009

Glenn Beck and Courts Overturning

I just want to say one thing regarding this little clip from Glenn Beck, one of the two loudest reasons I'm considering leaving the Republican party.

Our Constitution has this particular separation of powers for one really good reason. It keeps the rights of the minority from being taken away or suppressed by the whims of the majority.

The exact same arguments were being made just over 30 years ago. Remember Loving v. Virginia?

May 1, 2009


Wow...six months of hardcore development and my current project is "done."

I'm putting "done" in quotes because we had to cut several corners to get the website to launch at the same time as the new back-end architecture, and aside from one really bad bug that I'm still trying to track down, the new build going live tonight should make things work significantly better.

Over the next week, I'll be filling in the feature gaps for what had to be delayed slightly, polishing up the features that need them, and hopefully find the database transaction issue that is affecting the first person after a process recycle.

I've put in 276 hours of work over the last three weeks. It's the worst crunch I have done since leaving Microsoft. I hope it will never happen again, but unfortunately I know better.

Tomorrow, haircut.

April 17, 2009

How I Got Sitefinity To Scale (Code)

I've got a new Sitefinity website going live on Monday, April 27.

For the most part, I've really enjoyed Sitefinity. I've liked it so much that I'm going to be wiping my existing site this summer and replacing it with a Sitefinity CMS-based system...but there was one problem with Sitefinity that kept hitting me: scalability.

Sitefinity was designed for small- to mid-sized sites, and for that it works admirably. However, once you start getting above about 2,000 pages, while the visitor-facing portion still performs admirably, the admin side starts to fall to pieces. The new site has over 9,300 pages. You can imagine the problems.

I don't have enough time right now to go over the specifics about why this fixes the problem, but I do have time to share the code. This fix only fixes the "Pages" view, but given that is where most user time is spent here, it was the proper place to focus.

Note: the project linked below will require that you update the assembly references. It also isn't the highest quality...a lot of it is Reflector-then-hack. However, it reduced load time on the Pages view from over 4 minutes to 10 seconds, so I'm a happy camper and so are my users.

Some restrictions placed on users: users are not allowed to create new base-level pages, and only the 500 most recently edited pages are queried for the "All Pages" views.

This is unsupported, use at your own risk.

(, 153,346 bytes)

April 10, 2009

Why attack evolution?

For the longest time, I was trying to figure out why fundamentalists were attacking evolution. Most fundamentalists don't take their holy texts literally. You rarely see them advocating that schools teach the flat earth theory (Isaiah 11:12; Revelation 7:1). You don't see them fighting blood transfusions (Leviticus 17:10-14; Acts 15:20, 28, 29). Most of them take and enjoy what science why fight this one school?

The answer was startlingly simple. They fight evolution because it goes against the central tenet of their faith...than Man is a special creation.

The fringe elements of the texts can easily be blamed on the failings of man transcribing the will of their Gods, but the core of nearly any religious belief system is that people are a special case and evolution shows that we aren't.

Evolution is well supported by other schools of science, and so they get attacked as well. Geology helps support evolution by providing multiple means of dating the fossil record and it gets attacked by saying that it's all sediment from the Flood. Genetics provided the method for evolution to occur that Darwin's original theory lacked and we can show evolution occur through genetic shifts, but it is attacked nonetheless with a pathetic attempt made to show that all of the data in our genome has been there since the beginning.

The sad thing is that all of this argument by those of Faith trying to show that we are a special creation misses the fact that even if we were not created by a creator, we are still special. We are one of the few creatures in the world that has created a means of passing on learned knowledge. (Some of our mammalian relatives are doing this as well now, such as chimpanzees.)

It's just sad that we have a portion of society that is trying to prevent or pervert the knowledge that should be passed on.

April 8, 2009

WORKAROUND: Sitefinity 3.6 Search Can't Handle Redirects


If you create a control that uses Response.Redirect(), Sitefinity's search engine crawler will not advance past that page. If you are using the Administrator console to force an index, when the crawler hits that page, it will redirect the page and abort further indexing.


Somewhere prior to the Response.Redirect(), abort out if Telerik.CmsContext.IsCrawlerRequest is true.


This is a huge issue. Response.Redirect() is the most common tool used to move around a .NET application. It's bad enough that having a Response.Redirect() occur in any of your controls in design mode redirects you out of the page design surface, but having Response.Redirect() kill the crawler is unacceptable.


As you can see in the comments below, a fix for this is forthcoming.

March 31, 2009

"No" To Conscience Protections

I received an E-mail today from the Heritage Foundation asking me to voice my support to keep conscience protections in place for medical professionals.

I can't in good faith do this for two reasons.

First, if I am offered a job and I know that as part of that job I will have to do something I disagree with and I still take the job, I have no grounds to complain if I am disciplined for not doing the tasks I disagree with.

For example, let's say I was Jewish. The Sabbath must be protected per my deeply held religious beliefs. I am offered a job as a chef, but one of the requirements of the job is that I must work on the Sabbath. Mind you, the Torah specifically forbids cooking on the Sabbath.

If I take the job with that requirement in place, I have no right to complain. I accepted a responsibility and failure to follow through on those responsibilities will appropriately result in discipline up to and including termination.

Second, the existing regulations are so vaguely worded that not only do they allow nearly any insane belief to be protected, but they offer little to no protection to the patient.

Under existing regulations, a nurse can force her personal beliefs on a patient without reproach. Under existing regulations, a doctor who is a practicing Christian Scientist can refuse to treat you with anything other than prayer. Under existing regulations, a nurse who is a Jehovah's Witness can refuse to grant you a blood transfusion because of a verse from Acts.

The only requirements that exist for the health care provider is that the people who are going to object should work near people who don't have these objections, that the objections must be made within a timely fashion, and that a referral process must be in place.

Sorry, but if I am going to the hospital, every minute counts. If the hospital down the street has a staff that refuses to treat me, I may not have the opportunity to get to get to whomever they refer me to.

Just as I expect a politician to check their own self interest at the door when they represent me, I expect my physician to check their own interests at the door when they treat me.

March 27, 2009

IE8 and Team Foundation Client

If you are using Visual Studio and the Team Foundation Client and find that while the menu options work but Team Explorer doesn't after installing IE8, uninstall IE8.

Team Explorer relies on some COM objects that had breaking changes in IE8.

March 18, 2009

Voltron Season 1 On Hulu

Enough said.

Performance Issues with Windows XP on an SSD

If you have an solid-state disk drive (SSD) and are running Windows XP (say, with a netbook) and you are having performance issues, make sure that your page file is set to a fixed size.

To do this, tap Windows Key + Break or Control Panel > Performance and Maintenance > System or Control Panel > System, depending on your preferences.

Under "System Properties," go to the "Advanced" tab.

Click the "Settings" button under "Performance."

Under "Performance Options," go to the "Advanced" tab.

Click the "Change" button under "Virtual memory."

Under "Drive [Volume Label]", pick the drive that has a "Paging File Size" next to it.

Under "Paging file size for selected drive," ensure that "Custom size" is selected and set both the initial size and maximum size to the same value (preferably the "Recommended" value listed at the bottom of the dialog.)

Hit the "Set" button.

Hit "OK" and continue to hit "OK" until you are back to the desktop.

You may have to reboot afterward.

March 11, 2009

Date Of Creation According To Oracle

Oracle is meant for big iron databases.

If you are crunching numbers on data for dates before January 1, 1753, you are either using a varchar field storing the UTC value of the date or you are using Oracle.

But what if you are trying to go back further, say, to the beginning of recorded human history? Well, the DATE column in Oracle can't handle that.

Evidently, they thought that nobody would want to store a date prior to the dates that "young earth" creationists point to as the date the world was created.

So if your date is before 4713 B.C., tough luck. ;)

Admittedly, this does cover the date range back to the earliest reported date in the Egyptian calendar (4241 B.C.), but that still misses out on the nearly six thousand years of Egyptian pre-history.

February 19, 2009


It's always nice when you spend time reinventing the wheel when you don't need to.

For example, take my recent post on associating a label to an ASP.NET mangled control name.

Turns out the functionality is built into ASP.NET.

Let's say you have the following ASP.NET code...

<asp:label runat="server" text="Search" /><asp:textbox id="query" runat="server" />

...and you want to link the Label to the TextBox. Set the AssociatedControlID property on the Label and it will automatically handle mangled control names for you.

<asp:label runat="server" text="Search" AssociatedControlID="query" /><asp:textbox id="query" runat="server" />

I'm still going to leave up my original post because knowing how to recursively work with HtmlControls is a good thing, but I hate it when I miss something this obvious.

February 15, 2009

Come On, Utah, Shape Up!

According to the Pew Study, only 22% of Mormons accept evolution as the best explanation for the origins of human life on Earth.

Now, I think we can at least in part blame the way the question was phrased. (Evolution has nothing to do with the origin of life, just the diversity of life.) That said, I find it ironic that a church that would help create one of the top 20% biology programs in the nation has a membership where 4 out of 5 members deny the very keystone science associated with it.

But I guess it shouldn't surprise me. The position of the LDS church has been quite clear...

"Diversity of opinion does not necessitate intolerance of spirit, nor should it embitter or set rational beings against each other... Our religion is not hostile to real science. That which is demonstrated, we accept with joy; but vain philosophy, human theory and mere speculations of men, we do not accept nor do we adopt anything contrary to divine revelation or to good common sense."*

No further official statement has been made by the church since then. Essentially, they are saying that where the word of God is silent, the church will accept anything, but anything that potentially conflicts with the "word" shall not be accepted.

It's sad when Texas, even with the massive SBOE debacle, is still more sane than my home state...

* First Presidency (Joseph F. Smith, John R. Winder, Anthon H. Lund), "Words in Season from the First Presidency", Deseret Evening News, 1910-12-17, sec. 1, p. 3.

February 13, 2009

The Crunch Is Upon Me

Today was the last day of a twelve-day shift.

I've got a three-day weekend ahead of me, and then I start another eleven-day shift.

I'll be taking a single day off for a Shackmeet, then I'm on for another six days.

I'll be taking that weekend off to head down to Austin for the second Cinematic Titanic live riff I'll have ever attended, and then...crunch.

Twenty-six days straight.

This will be a living hell, but the end result will be worth it.

February 11, 2009

TIP: How to use form labels with ASP.NET controls


You want to use <label> to point to fields in your ASP.NET controls, but due to HTML ID mangling, you cannot.


Walk the control tree on load and update the "for" attribute on the <label>.

For example, let's say you have the following code in your control:

<label for="UserName">User Name</label>
<asp:textbox id="UserName" runat="server" columns="30">

First, add runat="server" and an ID to your <label> like so:

<label ID="UserNameLabel" for="UserName" runat="server">
User Name</label>
<asp:textbox id="UserName" runat="server" columns="30">

The ID keeps Visual Studio happy.

Then, in your Page_Load(), call the following helper function:

private void UpdateLabelsWithClientID(Control c)
foreach (Control c1 in c.Controls) UpdateLabelsWithClientID(c1);
if (c is HtmlGenericControl && ((HtmlGenericControl)c).TagName == "label")
string controlName = ((HtmlGenericControl)c).Attributes["for"];
Control c2 = this.FindControl(controlName);
if (c2 != null) ((HtmlGenericControl)c).Attributes["for"] = c2.ClientID;

If you are in an ASP.NET control, you would call it as UpdateLabelsWithClientID(this);.

February 7, 2009

SiN 1 in SiN: Episodes

Before we started working on SiN: Episodes, one of the things we started working on to properly learn Source was a Source engine version of the original SiN ala Half-Life: Source.  A lot of the work was done by Dale Broadbent.

It didn't get very far and barely functions, but there's enough here that some Source engine modders might get a kick out of it.

What is here requires S:E1 to work. Use at your own risk. No warranties are expressed or implied.

February 6, 2009

The Suck

Moving sucks.

Unpacking sucks more.

The first is done.

The second, nowhere near.

January 12, 2009

Sitefinity: Clean Up Search Results


You are using Sitefinity 3.x and your page templates and other non-desirable parts of the pages are showing up in search results.


Sitefinity spiders your site instead of searching the data. For the most part, this is a good thing, but it pollutes your search data.


Sitefinity gives us the tools to hide the template from the search spider, but they are rather hidden. To use this workaround, I am going to work under the assumption that all of your templates have a standardized naming scheme for their ContentPlaceHolder objects. For example, all of my pages have the main content in a ContentPlaceHolder named "Content," my sidebar is in a ContentPlaceHolder named "SideBarContent," and so on.

First, create a new master page that is empty except for the ContentPlaceHolder objects you want included in the search results and the header tag ContentPlaceHolder. Since I only want what is in my primary content area to appear in the search results, I have one ContentPlaceHolder in my body named "Content." Upload this into Sitefinity.

Second, if you do not have an App_Code folder in your Sitefinity project, add one to the project root.

Third, create a BasePage class. This class will inherit from InternalPage. Override the OnPreInit() function and drop in the following code...

if (CmsContext.IsCrawlerRequest)
this.MasterPageFile = "~/App_Master/SearchOverrideMasterPage.master";

...where SearchOverrideMasterPage.master is the name of the new master page you want to uploaded in step one.

Fourth, go into the Sitefinity folder and edit cmsentrypoint.aspx. Change...
Inherits="Telerik.Cms.Web.InternalPage" be...
...where ClassNameOfBaseClass is the name of the class you created in Step 3.

Fifth, go into your App_Data/Search folder and delete the folders contained therein to delete the current search indices and results.

Finally, go into Sitefinity's Administration tab and under Services / Search, click "Start indexing" under each search index.

January 8, 2009

Sitefinity: Making a Custom Site Map

As part of a redesign of our current website at work, we're going to be changing to Sitefinity for our CMS.

The only downside is that working sans JavaScript is still a fairly big requirement for us and some of the built-in controls rely on JavaScript to function.

So...I'm rewriting some of the controls.

Here is a simple sitemap control that works with Sitefinity. Control is written in VB.NET, set up for CSS styling, and is free for customization as you see fit. (1,150 bytes)