April 2009 Blog Posts

Random Thoughts from 4/25 Weekend

Lots of random thoughts that came up between Saturday and now, figured I'd get them down. None probably of interest to anyone but me, but we'll get 'em down anyway.

Saw State of Play this weekend for my dad's birthday. It was decent and had some good plot twists, but I think there were parts that could have moved a little faster. Jenn got bored and there were definitely a few spots where I was like, "come ONNNNNN." I won't be buying the DVD, but it was worth seeing. Maybe wait for the rental.

I cleaned our Sunsetter retractable awning this weekend to prepare it for the season. I find that I have to do this every year because the moisture from the winter gets inside the rolled up awning and it gets a little moldy. Covering the awning doesn't help. It's not a bad build-up, just a little dirty looking. Sprayed it down with some "30 Seconds" and it came out looking very nice, but I didn't realize the cleaner has bleach in it... so my jacket came out looking like it had rained white on me. Not a big deal since it was my outdoor work jacket, but sort of weird, especially since it says "safe to use around plants and animals" on it.

We got some La-Z-Boy recliners delivered, completing our game room, but I always seem to have problems with things that other people don't. The leather looks great, I sat in one before the delivery guy left and it felt good, then later that night Jenn and I were sitting there (Jenn in the one I didn't sit in) and it turns out the seat on that one is tilted to the right so it feels like you're sliding sideways. The repair guy will be here on Wednesday for that. (There's a repair guy coming today for another piece of furniture we had delivered a couple of weeks ago where the leather was scratched.)

Oh, and my Ion Drum Rocker is on the fritz. I was playing the "Drum Trainer" mode in Rock Band 2, doing reasonably well, but at random intervals the "up" directional arrow thought it was getting pushed so the tempo would speed up on me without warning. A few times of that and I called their support. The control box for that is getting repaired now but it could be seven to eight weeks before I'm back up and running. I've got a call in to see if I can get that sped up. We really wanted to have a Rock Band party but you kinda can't without drums.

Jenn and I got tickets to see the B-52's and Tears for Fears (two different concerts, not one concert with two acts) this summer at the Oregon Zoo. Looking forward to that.

While I was zoning out getting my teeth cleaned this morning, I was thinking that eventually there's got to be a system of record for human intelligence. It doesn't necessarily have to contain all of human intelligence, but it needs to at least index it. Then we'll end up with little implants that have wireless network access in them and can call into that system. I don't know if it'd be Google or Wikipedia. I guess it depends on whether the system actually needs to contain the information or just index it. Hmmm. Anyway, thinking about how that would work kept me busy while I was getting my teeth cleaned.

I downloaded the BlackBerry app from Amazon and I must say so far I'm impressed. It's much better than the mobile web experience and it has that thing built in where you can take a picture of something and it'll find similar items that they sell on Amazon. I haven't tried that yet. Might have to later. I wonder what happens if I send a picture of myself in - what items do they sell that are similar to me?

BlackBerry Calendar Not Synchronizing? Check Default Services

I noticed this morning that my BlackBerry Curve, using the BlackBerry Desktop Manager software, was not synchronizing my calendar. It'd sync everything else, just not calendar. It worked before... what changed?

Well, I had installed a new theme, so I uninstalled that. No luck. I had installed the new Facebook app to see if it would get me more into Facebook, so I uninstalled that. Still no luck. I upgraded the BlackBerry Desktop Manager software (which took like an hour to download/install/reboot/re-setup). No luck. I ransacked my Outlook calendar and archived all of the appointments up to about two months ago that weren't relevant anymore (kept the recurrences, etc.). Still no luck. Ran SCANOST and SCANPST on my Outlook profile. Nothing.

I was about to recreate my freaking Outlook profile (I've had sync problems before due to corrupt profile) when I started searching through the BlackBerry help site. As I was typing in my search for sync problems, I noticed this item in the "What's New" section:

Default Calendar service is changed after installing Facebook for BlackBerry 1.5

What, now? I had installed that... but I uninstalled it. Uninstalling it doesn't fix it. You have to go into your "Options" on the BlackBerry and, under "Advanced Options," look at "Default Services." That sonofabitch is set to Facebook. Even if you told the Facebook app not to integrate with your calendar. Even if you uninstalled the app.

Switch the default calendar service back to what it was. For me it's my Verizon BlackBerry email address. Re-sync and everything works peachy keen.

On a side note, fuck you, Facebook. I didn't like you before, and now I really, truly can't stand you. The only reason I use Facebook is because I have family and friends on there and I want to keep up with what they're doing. I don't post, I don't add content there, I don't participate in apps, I have Twitter update my status, and that's that.

Cheap Way to get Warner Brothers Blu-Ray Discs

Warner Brothers has created a service called Red2Blu that lets you convert your HD DVD collection into Blu-Ray by sending them $5 per HD DVD title along with the paper insert from the case. You keep the disc, just send the cover art.

Combine that with iNetVideo.com, a clearing house for old HD DVDs. You can get some as low as $1.99.

Let's say you want 300 on Blu-Ray. At Amazon, it's $22.49. On the other hand, you can get the HD DVD for $1.99 at iNetVideo.com and upgrade at Red2Blu for $4.99. That's a total of $6.98 for the movie, saving you $15.51.

Now, you've got to consider shipping costs - it's $6.95 shipping for the Red2Blu conversion on an order up to 25 discs and the shipping from iNetVideo varies - so you wouldn't want to do just one movie... but if you have several, like if you want all of the Harry Potter movies or something, you can save a bundle.

Challenges of Multi-Tenant, Enterprise ASP.NET Applications

I've been doing ASP.NET for a while, mostly at my current employer where we make large-scale online banking web sites. During that, what I've noticed more and more as new features come out for ASP.NET is that there's a heavy focus on rapid application development - drag, drop, and ship - and less around the idea of creating a commercial application using ASP.NET. There are a few products like Community Server and DotNetNuke out there, but not many (or not as many as there could be) and I'd wager a lot of it has to do with lack of framework support for that sort of app.

To put what I'm talking about in context, let me first describe at a high level the kind of application I'm working on. Customers might want to have us host the application for them or they might want to host it themselves, so it needs to be something fairly easy to deploy. In a hosted environment, the customers want to be able to change their settings easily, so there's a sort of "configuration user interface" that has to be put in place. Changes might include not only application settings, but text that appears on the various pages, so localization comes into play. It needs to be easily upgraded, deployed, and managed, so you don't want a full copy of the application out there for every customer; you want a single copy with different IIS apps pointing at it... but that means the application has to support multi-tenancy (you can't just stick all your config in web.config because there's only one, right?). In a custom deployment, the application will be taken by a team, put into the customer's environment, and programmatically customized, which means it needs to have a lot of extensibility points.

So, with that context, here are the big challenges.

Multi-Tenancy

Everything in the .NET framework assumes there's only one tenant running on the application. When you ask for a configuration value, the value comes from The One Configuration Source and that's that. There's no qualifier in there anywhere to say "I want this configuration value for this specific tenant." You have to write that. If you want a default value for all tenants on the app and the ability for individual tenants to override the value, you have to write that. Same thing with localization - you can't say "I want this string for this tenant." There's one big bucket of resources and that's it.

The lack of multi-tenancy support is pervasive and means a lot of work for the development group that wants to have a multi-tenant app. That's unfortunate, particularly in light of the "Software as a Service" push that was going on just a couple of years back. What ever came of that?

Localization

Where do resources get stored? In compiled assemblies, right? What if I need some text on a page changed at runtime but for security reasons I don't want to be recompiling assemblies and deploying them on the fly? (Multi-tenancy really hurts here since you can't have a different set of resource assemblies per tenant.) There's no out-of-the-box alternative to storing localized resources. You want to store things in SQL Server? You get to write that. Want the out-of-the-box stuff (like the ASP.NET localization expressions) to work with it? You get to write the factories and providers for that, too.

Theming

The whole ASP.NET theming thing is broken. Not "broken" in that it doesn't work, but "broken" in that there are actually two different ways to theme things - skins and master pages. And they sort of work together, but when you define a single "style" for your pages, you have to manually track that "Style X means Skin Y and Master Page Z." That's crap.

Don't forget each tenant wants their own theme, too.

Configuration

There are a lot of things that you might want to configure in an app. Unfortunately, the place that stuff gets stored by default is in an application configuration file. In the filesystem. You want to give someone an interface to configure things, you either have to create a configuration service that stores things in a database and make your interface (and your app) talk to that proprietary service OR you have to allow your interface to somehow update web.config on the fly. In some cases, you can't escape web.config - for example, if someone enables/disables a feature that means you need to register/unregister an HttpModule, you can't do that because you can only register modules through web.config.

Oh, and throw in that multi-tenancy thing, too.

Extensibility

ASP.NET apps basically aren't extendable at the page level. You can't "derive and override" markup. If you want to interject your own logic, you have roughly three choices:

  1. Put code blocks inside the markup.
  2. Override the page class and change the markup to inherit from your custom page.
  3. Try to anticipate what people might want to extend and allow plugins through inversion of control, Microsoft Extensibility Framework, or some similar approach.

None of those are terribly great. Options one and two have you changing the ASPX markup, which makes it impossible to track what has been customized on that application instance (and is difficult to manage on a per-tenant basis) and option three quickly leads to YAGNI as you try to make everything infinitely extensible.

This actually has a direct impact on...

Deployment and Upgradeability

So, you put together your web app installer, run the MSI, and it puts a bunch of markup and config in the filesystem and some assemblies in the "bin" folder. Six months later, an implementation team has customized this thing using the "extensibility points" you've provided above, and they need to upgrade the base application.

Which markup files did they change? What config settings did they change in web.config? It becomes a tedious task of manually merging markup and config. (This is something that users of Subtext and other blogging engines are familiar with, too.)

Could you track checksums on the markup files and compare whether they've changed or not? You could... but you'd have to track every checksum for every file for every version ever released because someone might skip upgrading from 1.1 to 1.2 and go directly from 1.1 to 1.3.

Could you compile the pages? Sure, but that not only affects your extensibility (see above) but still requires those markup placeholder pages.

Pages aren't the only things out there in the filesystem, though. Don't forget your skins, master pages, and other markup files. In some cases, you can't even move the locations.

Things in the filesystem that aren't binary end up being problematic from a deployment and upgrade standpoint. You can address some of this with a custom VirtualPathProvider that serves things from embedded resources, but there are still some things you can't hide behind a VPP - web.config, for example, and skins.

Why Isn't This Stuff Addressed?

There are a lot of challenges with making large scale, multi-tenant applications. The above items aren't an exhaustive list, but they're some of the more obvious issues. Why hasn't this been addressed in the framework? Is the majority case really the IT guy dragging a couple of grids and a DataSource onto a page and publishing the app right from Visual Studio? Or is it a case of self-fulfilling prophecy, where the features aren't there so people don't make these apps... and because people aren't making these apps, the features aren't considered important so they aren't there?

Mysto & Pizzi

I won't lie - I'm a sucker for heavily produced electronic dance music. The new Lady GaGa album is in constant rotation at my house. If you're not into that sort of thing, this post isn't for you.

If you are, though, I was surfing around and found Mysto & Pizzi - some up and coming music producers. They do the remake of "Somebody's Watching Me" that you might have heard in the background of a Geico commercial. Anyway, if you're into this sort of thing, there are some great tracks they've made available for free.

And, like I said, free. Can't beat that.

Slightly off topic, but sort of not - I've noticed some of these newer artists (like Lady GaGa and Mysto & Pizzi) going a different direction with how they handle downloads and such. Like, when the Lady GaGa album came out, it was the Amazon MP3 deal of the day for like $5. Mysto & Pizzi aren't putting crap tracks from some band you've never heard of out there, they're putting out stuff from well-known artists. Free. And you know how often I see stuff for these folks online and hear stuff from my friends? All the time. It gets their music out there, gets the names out there, and gets them fans... who will keep coming back, see concerts, buy the merch, etc. Makes me wonder if they aren't onto something here.

Need Input: CR_Documentor Features In Use

I'm trying to figure out what people are using in CR_Documentor (and what they're not) so I know where I can focus my attention (and what I can nuke from the codebase). If you are a CR_Documentor user and you have a couple of seconds, can you take my eight-question survey on it?

Go to the survey site and use survey number 68141.

CR_Documentor 2.3.0.1 Released

With the release of DXCore 9.1.3 I've also released a new version of CR_Documentor. Some changes in DXCore caused the previous versions of CR_Documentor to fail, so if you've upgraded your DXCore/CodeRush/Refactor install, you'll want the new CR_Documentor to go with it.

Vegas Vacation Spring 2009

Jenn and I went to Las Vegas for three days this week (Tuesday through Thursday) and had a great stay at the Paris Las Vegas. As usual, we walked our asses off, so bad that I can still feel the pain in my hip sockets. I'm pretty sure I never got fully recovered from the previous trip to Vegas a couple of weeks back for MIX09. The Las Vegas Monorail saved us a lot of wear and tear, but apparently not enough.

We saw the "Criss Angel: Believe" show at the Luxor. Neither of us really knew what to expect, but we came out liking it. It's probably better described as a "magic show with a story" where the assistants and dancers are all Cirque du Soleil performers. For the folks looking for a Cirque show, it's really more magic than Cirque. Great dancers, really cool costumes, and some great effects... but definitely more "magic" than "Cirque." We both liked the show a lot, though I feel a bit like it cost a lot for what you get. It's the most expensive show Jenn and I have seen down there and I think Ka was probably a better value.

There were really only two things that colored the trip for me.

First, when I stayed at The Venetian for MIX09 (and MIX07), the front desk offered to print my airplane boarding pass for me when I checked out. Both times. No charge. It's a little thing, but so nice and convenient it definitely makes a difference. The Paris Las Vegas insists you use either their business office or one of the myriad internet kiosks they have around so they can charge you $5. Is $5 a huge amount? No, but then, it's just two pieces of stupid paper. Do they really need to nickel-and-dime me for $5? It's the little things like that which make a "good" hotel into a "great" hotel. I talked to the front desk about that and "that's the policy." Needless to say, I filed a complaint about that. I'll update this entry if I hear something back, but I'm not holding my breath.

Second, after we checked out, we wanted to leave our bags at the front desk until our shuttle bus arrived. The conversation around that went something like this:

Travis: Hey, we'd liike to leave our bags here until later when our bus thing comes to get us.
Bellhop: [condescending] "Bus thing?" What is a "bus thing?"
Travis: The, uh, the shuttle bus. To the airport.
Bellhop: Ah. I see. I can help you with that. Let me tag those bags.
Travis: OK.
Bellhop: [after tagging the bags] Here's your claim ticket. Around when will you be back to get them?
Travis: Well, the shuttle leaves a little after 5:00, so around then.
Bellhop: I won't be here at 5:00 when you come back.
Travis: Uh... [thinking: So what? I just need to... OH. He's asking for a tip. Wow, that's a little forward.] Right. Um... [thinking: All I have is a $20 bill. I'm not giving this guy $20 to check two carry-on bags.] Can I get some change?
Bellhop: I can give you change.
Travis: OK, I need change for $20. [hands the bellhop the $20 bill]
Bellhop: [hands me two $5 bills and stops] How much did you need?
Travis: [thinking: What? You seriously think I'm giving you $10 to hold two stupid carry-on bags? Seriously?] Um, $18. [thinking: $2 is way more than enough for you, asshole, considering I'm going to also have to tip the guy I pick this up from.]
Bellhop: [glaring at me] $18?
Travis: [thinking: You know what, shithead? Why not give me all $20 back and take a different tip - don't be an asshole. I don't owe you shit. You're a fucking bellhop. You get paid to take my God damn bags. Take them and shut the fuck up.] Yes, $18. [taking the last $8] Thanks.

Now, I know it's a tip-oriented culture down there, but this guy was pretty demanding and blunt about the whole thing.

I filed a complaint about that, too.

Other than that, our stay was great. The room was great, the rest of the service was great, the food was great... Hopefully the Paris won't turn into a low-end nickel-and-dime you sort of establishment. I've loved my stays before, and aside from these two issues it was another good stay.

Solution to Dell Studio Hybrid HDMI Sleep Problems?

Something I'd noticed in recent times: My Dell Studio Hybrid media center PC wouldn't display a video signal after resuming from sleep.

This would work:

  1. Turn the TV on.
  2. Turn the Dell Studio Hybrid on (power on).
  3. Put the Dell Studio Hybrid to sleep.
  4. Wake the Dell Studio Hybrid up.

Doing that sequence you would correctly see the PC go to sleep, wake up, and still display a signal on the screen. This, on the other hand, would not work:

  1. Turn the TV on.
  2. Turn the Dell Studio Hybrid on (power on).
  3. Turn the TV off.
  4. Put the Dell Studio Hybrid to sleep.
  5. Turn the TV on.
  6. Wake the Dell Studio Hybrid up.

Doing that sequence, the TV would never get the video signal from the PC again. You'd have to hard power off and power it back on to get the signal. (As it turns out, it's not putting it to sleep that's the problem, it's the power option to "Turn off display" - the machine doesn't have to go fully to sleep, but if the display turns off, you still see this problem.)

I also noticed that there was a problem where occasionally the TV would lose signal just switching inputs away from the Dell Studio Hybrid and back.

  1. Turn the TV on.
  2. Switch the TV to the HDMI input for the Dell Studio Hybrid - everything looks fine.
  3. Switch the TV to some other input.
  4. Switch the TV back to the HDMI input for the Dell Studio Hybrid - signal lost.

This would only happen when Windows Media Center was running full screen. If you were looking at the desktop, or if WMC was in windowed mode, you'd never lose signal. Only when WMC was full screen would it be a problem.

I updated all the drivers, no luck. I messed around with different driver settings, no luck. After searching around, I found several workarounds.

What worked for me: I bought a little $20 HDMI switchbox based on this blog entry here. Putting that between the TV and the PC seems to have cleared up my signal loss issue.

Other workarounds include...

Use the "Bubbles" screen saver. For some reason, I found the "Bubbles" screen saver does something that other screen savers don't seem to do and the signal doesn't get lost when it's on. It does mean you have to set the computer up so it never goes to sleep and the video signal never shuts off, but if you do that (and set the screen saver to start at something like one minute) then as long as you don't switch the TV input to the PC when the screen saver isn't running, you're fine. Worst case, you switch away from the PC and wait one minute before switching back. Even with the HDMI switchbox, I'm still running the "Bubbles" screen saver, though it's running at 15 minutes now instead of one minute.

Switch the ACPI suspend type to S1. I stumbled on this while searching through forums. It didn't work for me, but it works for some folks. By default, it's set to S3 - suspend to RAM. Switching it to S1 (sleep) seems to have resolved it, at least in my tests thus far. I can now do the sequence that wouldn't work - turn the TV off, put the DSH to sleep, turn the TV on, and wake up the DSH with the video signal intact. I learned a little about what the different modes mean while I was figuring this out. This is a great FAQ if you want to know more.

UPDATE (5/28/09): I reformatted this post to be a little more clear about the issue and possible solutions.

posted @ Sunday, April 05, 2009 12:43 PM | Feedback (0) | Filed Under [ Media ]

Verizon FiOS Router Auto-Updating and Configuration Problems

This is more of a vent than anything else, but there's a bit of a lesson learned, at least for me, here.

I just spent the last three hours fighting my home network. I got a little snippy with Jenn, who didn't deserve it, due to the ridiculously high frustration levels. Darn close to broke a lot of stuff at random just because I was so pissed.

The problem: Xbox Live was not connecting and, on testing, was telling me that my NAT settings were set to "moderate."

Let me give you a little background.

Xbox Live requires certain ports to be freely available to it. I don't recall which ones and I'm too irritated right now to go Google them for you so I'll trust you can do that on your own. The ports are not the point. The point is, if you don't have these ports available, Xbox Live will sometimes decide to throw little network curve balls your way, like you'll be able to connect to half of your gaming group but not the other half. Or you'll be able to do video chat but you'll get no audio. Crap like that.

In order to determine if you've figured out the magic combo, you do a "network test" from the Xbox dashboard and it basically gives you either a green light or an unhelpful message telling you about a problem. The message will say something about your "NAT settings are Moderate" or your "NAT settings are Strict."

You don't want Moderate or Strict, you want Open. Open means Xbox Live can get to all the stuff it needs to get to and will choose not to hose you in the middle of your Call of Duty session with your dad and uncle.

Usually I have no problems. My NAT has always been Open. Every once in a while, though, and it's ever since we got Verizon FiOS, my NAT will suddenly change from Open to Moderate. I've never hit Strict, but it doesn't matter, because it may as well be black and white - Moderate is bad news.

The trouble is that I can't predict when it's going to decide to change. Sometimes it just "changes" and rebooting the Xbox will fix it. Sometimes rebooting the router fixes it. Sometimes waiting an hour fixes it. Sometimes checking an arbitrary setting on the router and then unchecking it again - just change something and change it back - fixes it. It's entirely unpredictable. I think I figured out what causes it, though.

Tonight I got the Moderate NAT problem. Again. So I was trolling through my settings and found that there were a bunch of weird port forwarding rules that I don't remember setting up. Innocuous stuff for valid applications like MS Messenger, but I didn't set them up - they got set up by UPnP. I also noticed that the admin interface was slightly different from the last time I was in there.

Verizon auto-updates stuff.

I knew they auto-updated the firmware on the set-top boxes, but I didn't think about the damn routers. They've been updating crap and I'd bet dollars to donuts the NAT problems I see crop up sporadically coincide with these helpful updates.

I couldn't figure out how to fix it this time. I had the Xbox as a DHCP client, so I switched it to a static IP and added some port forwarding rules. No luck. I messed around with all sorts of crazy settings, no luck. NAT = Moderate.

In the end, I went catastrophic. Full reset to factory defaults. Put the WEP key back in, put the SSID back in, reconfigure everything. And you know what?

THAT FIXED IT. Suddenly the NAT was back to Open.

What a load of crap.