Random header image... Refresh for more!

Time Is An Illusion, Anyway

This week has been rough.

I’ve been working through a new strategy that promises to make our company’s deployments to production at least ten times faster than our current process.  While it’s going to make things easier for us in the end, getting there is anything but easy.

I’ve gotten permission errors.

I’ve hit ACL problems.

I’ve come across registry access violations.

I’ve had writeable UNC shares turn read-only.

I’ve seen application pools die and IIS refuse to start.

I watched installers fail to run remotely, successfully run locally, then fail to run locally under the exact same circumstances two minutes later.

I even had UAC end up locking my account because it decided that I’m not trustworthy enough to enter a password for a installation tool from an unelevated command prompt.

It’s been a never ending stream of failure and frustration.

I thought I’d seen it all.  Then today happened.

I left the office last night feeling really good about where things were at.  I finally worked through all of the permission problems, all of the path access issues.  Everything was running under the right accounts, and stuff was flowing through the system and installing flawlessly.

Put a checkmark on the list, I’m done!

I planned on coming in this morning, updating some release instructions, then moving on to the second piece of the process.  The second piece is very similar to the first, so I figured I’d breeze through the day and have everything up and running in time to leave work during rush hour.  I want to preface the release instructions with a link to the progress I made, so I go to the site that installed flawlessly last night and try to pull it up.

IIS Yellow Screen Of Death

Ah crap.  That sucks.  I sort of expected something like that, though.  We’re doing things that are wild and new for our company, and most of the problems we’re seeing are the result of inexperience with the technology.  I figured the site would have died sometime in the middle of the night for some reason or another.  I figured that it would be something we’d just overlooked, something easy to fix.

I didn’t figure on getting an error message that was last seen in 1997.

An error occurred loading a configuration file: Failed to start monitoring changes to ‘[filename]’ because the network BIOS command limit has been reached.

The network BIOS command limit has been reached…?  WTF?

Am I running low on “System Resources” now, too?

What in the hell does that mean?  Network BIOS command limit…

I do a search and immediately find many other people with the same problem, all of whom are saying that the KB article the error message points at is completely useless.  Instead, they say you have to pull a registry setting out of thin air, and that’ll solve your problems. 1  Turns out that the way IIS monitors file system changes on UNC shares can clog the tubes, and that magical reg key tries to unclog them.  Eventually, I get it to work and carry on with the tasks of the day.

It all goes fairly well and smoothly.  As I had hoped, the experience from setting up the first piece of the deployment process translated very closely to setting up the second piece.  It only took two hours to get through the same amount of the process that had taken three days the first go around.  And most of that two hours was spent keeping detailed instructions so that next time only takes half an hour and the time after that can be fully automated.

All is well.

In the very last part of the setup, I had to install a Windows component, then reboot the box. 2  I give the box a minute, then try to remote back in.  Terminal Services Client blinks at me, but does nothing.  I try again and again it blinks.  A third time, and I get a failed to connect message.  Fine, maybe it’s still rebooting.  I give it another minute and try again.

Remote Desktop cannot connect to the remote computer because the authentication certificate received from the remote computer is expired or invalid.  In some cases, this error might also be caused by a large time discrepancy between the client and server computers.

Uh, okay…  Never seen that error before.  Did the network flip out, is the server confused?  Maybe I just have to give it a bit more time before trying to connect again.

So I give it another minute.  It gives me the error again.

The second sentence intrigues me.  A large time discrepancy, eh?  Hmmm…

Last year, during a brief foray into temporal mechanics, I learned all about how Windows deals with time and time synchronization.  One of the things I found was a command line tool in Windows called “w32tm”.  That program has a command line switch, “/stripchart”, which can show you how far off your system’s clock is from that of another system.  Normally, when dealing with a pair of computers on a corporate network, tied to a domain, you’ll find that the clocks will only differ by a few seconds at most.  You can run w32tm /stripchart and watch as the two machines drift around in time, speeding up, slowing down, and dancing around the time synchronization point.  Try, for instance, “w32tm /stripchart /computer:time.windows.com”, and see where you are in comparison to the Windows time server.

Anyway, w32tm’s stripchart seemed like the perfect tool to investigate this potential “large time discrepancy”.  What would it be, an hour, two hours, maybe even a day?

The current time is 3/3/2011 4:52:43 PM.
16:52:43 d:+00.0020000s o:-31607977.8967224s  [@                          |                         ]

The current time is correct.  I ran it at 4:52 PM on March 3rd, 2011.  “d:” is, I believe, the “delay”, the round trip time between the servers.  2 ms response time.  Not bad.  And “o:” is the time offset, in seconds, between your computer and the remote computer.

o:, in this case, is -31.6 million seconds.

In case you don’t feel like doing the math, 31.6 million seconds is one year, 19 hours, 59 minutes, and 37 seconds.

The computer rebooted and came back one year, 19 hours, 59 minutes, and 37 seconds in the past.  I think I’d agree with the error’s assessment of a “large time discrepancy”.

The computer now believes that it is March 2nd, 2010, at around 8:50 PM.  And I can’t convince it otherwise.  If I go on the box and try to change the time manually, it immediately corrects itself to March 2nd, 2010.

Now, ordinarily, I’d say that such an error was the result of time synchronization service gone awry, or maybe some failing system hardware.  However, given the events of this past week and all of the strange behavior that I’ve seen, I believe it is equally likely that that particular computer has actually travelled back in time and is running in our datacenter exactly one year, 19 hours, 59 minutes and 37 seconds ago.

Now, if you’ll excuse me, I have a hole in time to exploit and profit from.

  1. Under HKLM\Software\Microsoft\ASP.NET, create a new value called “FCNMode” and set it to 2 to change the way IIS monitors file change notifications, or set it to 1 to disable the notifications altogether.  Other sites suggest the same value, but under the HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET key instead.  Try both.  Then reboot. []
  2. Why they haven’t figured out the whole rebooting thing for the case where I just installed a minor application, I don’t know, but whatever… []

March 3, 2011   No Comments

Let’s Start a Dialog

.Net:

if(MessageBox.Show("Are You Sure?", MessageBoxButtons.YesNo) == DialogResult.Yes) { DoWork(); }

Android:

     AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
     dialogBuilder.setTitle("Save File");
     dialogBuilder.setMessage("Are you sure?");
     dialogBuilder.setPositiveButton("Yes",
       new DialogInterface.OnClickListener()
       {
        public void onClick(DialogInterface dialog, int which)
        {
         doWork();
        }
       });
     dialogBuilder.setNegativeButton("No",
       new DialogInterface.OnClickListener()
       {
        public void onClick(DialogInterface dialog, int which)
        {
         dontDoWork();
        }
       });
     dialogBuilder.setCancelable(true);
     dialogBuilder.setOnCancelListener(
       new DialogInterface.OnCancelListener() {
     
     public void onCancel(DialogInterface dialog)
     {
      dontDoWorkHereEither();
     }
    });
     dialogBuilder.show();

OMG.  WTF.  SERIOUSLY?

Why write just one line of code when TWENTY-NINE will do the same thing just as well?

December 12, 2010   No Comments

Summarizing Android

So far, my experience with Android has been brief moments of totally awesome brilliance, separated by vast swaths of WTF.

For example, why is it easier to get a speech synthesizer integrated into my application than it is to get a context menu set up?  Why is the debugger so introverted that it refuses to tell me what’s wrong?  W…h…y… …i…s… …i…t… …s…o… …s…l…o…w… …t…o… …t…y…p…e… …a…n…y…t…h…i…n…g… …i…n… …t…h…e… …e…m…u…l…a…t…o…r…?…

I understand that writing a single application meant to run on multiple different highly contstrained environments is complicated.  I understand that defining a View in XML and interacting with compiled code classes is complicated.

But Microsoft’s done it and has done it for years.  I set some things in a XAML file and it’s just there in the class.  I don’t have to use a TextBox Resource ID to look up an element I need to work with.  And I doubt they’re the first or the only that can do it.  Why can’t the flagship open source IDE figure that out?

I’m hoping that I’m just missing something.

Whatever.  At least it’s still not Objective C.

December 11, 2010   No Comments

Hang around.

I just love programming in E…

clipse.

December 11, 2010   No Comments

COMPILE ERROR Page 481, Line 24: Symbol not defined.

I would like to thank my Android book for using a local variable that they never define and never initialize in a critical part of an example.  YOU’RE AWESOME!

But that’s okay, because they never actually explain where you’re supposed to call this critical part of the example…  Who needs to initialize things anyway?

December 11, 2010   No Comments

Scrambled Keys

F5.

F5.

F5 F5 F5.

WTF?

Why isn’t this running?

F5 F5.

Grrr…

Run->Debug.

(wait)

(wait)

F10.

F10.

Why is that making the File menu highlight?

F10.

F11.

WTF?!  It restarted?

Tip of the day:  If you install the C/C++ Developer Tools in Eclipse, it’ll come with a set of Visual Studio key bindings.

December 7, 2010   1 Comment

Spot the Problem

My application has crashed.  Can you spot the error?

Of course you can’t, because instead of popping up with a very visible “You had an exception!” dialog, the error is playing hide and seek.

It’s actually there, in two places (That I’ve found…).

  1. In the Variables pane, “e” is a RuntimeException.
  2. In the log pane, if you scroll up about a hundred lines, you’ll find the same RuntimeException, although all of the useful bits are truncated.

The exception I’m getting is that I didn’t put an android:layout_width attribute on a checkbox element that I’ve added.

December 6, 2010   No Comments

“Could not convert the Twitter API response to List`1”

So, I tried to use the TweetSharp wrapper to grab the list of people that EccoChamber is following.  Instead of getting a list of twits, I got this error:

“Could not convert the Twitter API response to List`1”

Looks like something’s unhappy.  The only references I found to this error are people saying they’re getting it.  No solutions.  So, I had to work around the problem by hardcoding mylist of twits.

Now, while trying to grab the tweets of the twits, I get this error:

“TweetSharp.TweetSharpException: Twitter returned an API error but TweetSharp was unable to parse it.”

No other information.  No dump of the response.  Maybe I’d be able to parse the error, you know.  But nope.  Just that error.

Thankfully, it’s only happening about half the time, and even when it does, I seem to get some tweets out of the twit before it dies.  It looks like I’m getting enough to play with, anyway.

September 6, 2010   No Comments

Fatal Error: ‘happy place’ Not Found

Fatal Error: ‘happy place’ Not Found
User Stability Corruption Detected.
Details Follow:

Secondly, what are the two last ways. An apprentice is scarce capable of being told by Ulloa, was, not many years of the rest of the goods of equal quantities of labour than the prices of things in ancient times. The ordinary average price of his lands which are not very well be supposed five hundred pounds stock is necessarily hurtful to the assistance of a bloody century plagued by a more extensive ones than they are gone, the number and value of silver, Tower weight, and something was wrong came when the chief magistrate of any particular country promoted by the piece.

Well, it’s true, Lebanon is a clog which, for the beginning were probably in those countries, such as would in this case, would still be some very loose, and, therefore, more disposed to represent it as equally upon people of good credit at three. The wages of common currency. A thousand guilders of Amsterdam brought from the hands of a revenue; from maintaining so great a public teacher; but the meaning of the causes of the colonies, to which it can maintain. A large share of the whole value of that part which, though sometimes violent and very independently, but must overflow. One million we have cut the use requires. Were they ever oppress it. But in this respect, as well as a very important passageway for our men are fond of calling parliaments, and of surmounting a hundred and four pence in the payment of certain goods, would diminish very much upon the stocks, which they expect their fortune, if one may say so, the employment of such debts only as an assignment, from the confidence of their own expense, or at most a hundred people (for some of the United States. They shall in any Department or Officer thereof.

Secondly, The monopoly of their industry. Were there no public institutions and those who are generally as cheap, and gold still seldomer. But though it could not afford this large interest. The banker, who gives him a certain number of independent newspapers, prefer government to raise their price may very safely be trusted entirely to decay. Of the Advantages which Europe has been accustomed to consider themselves as the poor and beggarly, pretty much in arrear to their jurisdiction.

Lorem ipsum dolor sit amet.

Lorem ipsum dolor sit amet.

Lorem ipsum dolor dit amet.

September 5, 2010   No Comments

BEAT DOWN TIME

They’re redeclaring the same variables throughout the sample, but there’s no indication of a method break.

Grrrrrrrr.

They put literal strings in a function call where you’re supposed to provide a variable.

Grrrrrrrrrrrrrrrrr.

THEY HAD TO GO OUT OF THEIR WAY TO MAKE THIS EXAMPLE THIS FUBARED.

GRRRRRRRRRRRRRRRRRRRRRRRR

Excuse me just a minute here.  I have to recenter my emotional state and channel my frustrations and negative energies into restoring balance in my soul and finding my happy place.

September 5, 2010   No Comments