Archive: May, 2014

Lego habits

posted by Jeff | Saturday, May 31, 2014, 10:59 PM | comments: 0

Diana and I got to talking about Lego the other day, because kids with different developmental strengths and weaknesses all tend to be drawn to the bricks at some point. This got me to thinking about how not typical I was with my treasured sets.

I'll never forget going to my daytime babysitter for the first time when I was in grade school, to find an enormous box of loose Lego bricks. There were thousands, and I was completely horrified... they weren't in their original boxes! I couldn't tell you what year I got my first set (I'm pretty sure these were from my early grade school days), but in those days the sets came in boxes with flip-open front faces and there were clear compartments inside for the bricks (presumably this was in part a store merchandising technique). Every last brick had a place, and when I precisely assembled the kit per the instructions, every piece went back to its place.

When I watch Simon play with his cars, carefully lining them up and exploring the mechanical ability of some of them, I can't help but think of me and these Lego sets. I had the command base, the rocket base, and the amazingly huge Galaxy Explorer ship. The command base in particular had a lot of moving parts. The memory of these is so incredibly vivid. I have to hand it to my family members who bought these, because I know they weren't cheap in late 70's/early 80's dollars, but they're the thing that really started to ignite my imagination.

I also had a police station, which I really loved. In fact, I remember being so locked into opening and closing the doors and shutters on it, which leads me to believe Simon and I may have had similar issues growing up.

Today I have two sets, both of which are obviously intended mostly for adults if for the price alone. The Grand Carousel is a beautiful model, but I don't think it has seen the light of day in at least three years. I've been thinking lately about building it. I also have the Red Cargo Train, which has been around our Christmas tree now for three years. Last Christmas we had to remove it early because Simon couldn't tear himself away from it, and kept breaking one of the cars apart causing meltdowns. We'll try again next year.

I still go back to the rigid organization though. I was probably a weird kid, or maybe I have more in common with my son than I thought. I guess I didn't care if it was someone else's bricks. I remember building this huge ship that looked very much like the Argo from the cartoon Star Blazers. (I remember the opening theme. I wonder if that show would be good today? I remember it as a predecessor to more popular Japanese anime like Robotech.)

Simon had a handful of Duplo, starting with a bucket of bricks and a zoo set (yes, I cringed a little when combining them). He seems to be branching out a little and using the bricks around his wood train tracks and such, so maybe he won't be as obsessive as I was.


Reconnecting with my boy

posted by Jeff | Saturday, May 31, 2014, 8:28 PM | comments: 0

I've had a tough go with Simon lately. In addition to the typical defiant 4-year-old behavior and the atypical reflexive hitting, Simon has been kind of a jerk lately toward me. I say that sort of in a joking context, because honestly I know that he doesn't hate me or dislike me. However, he has been insisting that I don't talk to him because he wants to talk to Mom, and he's vocal about it. I try not to feel hurt by that, but it certainly doesn't feel good either.

This morning he was bugging us to go to Epcot so he could ride Journey to Imagination. I loathe that ride, but I understand that it engages him a great deal. He's learning the song, he kind of dances during the ride, and he describes how it works mechanically (as best he can given his speech delays). Reluctantly, I understand the awful ride is probably good for him. I just couldn't stand to do it again today.

Instead, I took him to Animal Kingdom for the afternoon. Diana was feeling suboptimal, so she stayed home. This gave us a chance to bond and hang out, and talk about stuff. It was an exceptionally good day.

First, Simon was really good at explaining what he wanted to do. I still get frustrated that he sometimes can't find words for things, but generally he got it right today. He was very into being my buddy, too, which I definitely needed. In terms of his development though, the thing that struck me the most is he was genuinely interested in the animals instead of doors, gates, garbage cans and other things that he gets fixated on. That's a really big deal. He would stop and identify animals, or point them out as we walked by. He even engaged, gently, with the goats in the petting farm. Best of all, he was into Finding Nemo The Musical, not talking about the closing curtains at the exits or the "doors" on stage. He danced to the music and watched the characters ("Oh no, Dori!").

Simon really seemed to be looking to me for approval for things, almost as if he was being extra careful to make sure that he was behaving. That's a nice change of pace given how much we've struggled with behavior issues lately. Granted, his therapist is slowly making some headway, for sure, but it has been a real endurance test for us. Seeing him try harder is good.

For me, the thing I worry about most is being involved. Diana gets most of his waking time since I'm at work, so it's not entirely surprising that he tends to lean toward mom a bit. That will likely get a little better when some portion of my time is spent working from home, as I get an hour of my time back every day when I'm not commuting. Even tonight, he chose to spread out on the couch with me while we watched a movie. That was nice, because I know those times will only get more rare as he gets older.

I needed this.


The start of the change began seven years ago

posted by Jeff | Friday, May 30, 2014, 11:51 PM | comments: 0

For many years now, I've had "Firstdateaversary" on my calendar for May 31, because it's the anniversary of the day I met Diana in 2007. While I don't think I could declare this as being more important than our wedding anniversary (seeing as how I'd like to stay married), it's still an important day to remember because it was the day everything changed.

I've told the story many times, so I won't do it again. My point in remembering that day has more to do with the fact that even a somewhat slightly random event can set up a lifetime of change. We just rarely know it at the time. I could never have predicted all of the moving around and child raising on that day.

I try to remind myself that there's a chance that every event could lead to enormously awesome change. It could be bad change, too, but for the most part I think that's rare. When you think of it in that positive context, something that will happen tomorrow, whether by your design or completely random, could be the start of something amazing. It's a little hard to believe, but I think training your brain to think that way is a good way to live.

I've got a job transition coming up here as my contract gig is about to end, and I'm optimistic. It feels like all of the right stuff is there. You never quite know where things will lead you.


Mini-review: 13" MacBook Pro Retina

posted by Jeff | Friday, May 30, 2014, 10:55 PM | comments: 0

I finally pulled the trigger and bought a new laptop, even though my MacBook Air is under two years old. Diana will get that one, which is a serious upgrade over her 4-year-old+ 13" MBP with a crusty mechanical hard drive. I opted for the 13" MBP with retina display ("late 2013"), specifically the most equipped stock model (2.6 GHz i5, 8 gigs of RAM, 512 gig SSD). My hand was slightly forced on this, because I was out of room, and couldn't really delete anything else on the Air, which had half of the SSD space. Kind of interesting footnote, this config costs the same thing as the Air in 2012. I suppose Apple could introduce something new next week, or mostly likely in the fall to match Intel's CPU roadmap, but I doubt I would see a real difference.

The wins are pretty much what you would expect. The high resolution screen is completely awesome. It hurt to give up on the original 15" MBPr model I bought in 2012 with the screen problem. Windows 8.1 (in Parallels) works incredibly well with most apps, though most importantly, with Visual Studio. When you look at a lot of code, it's nice to have really sharp text. The typography in Windows 8 in general looks much better on a high-res screen, as you likely know if you've used a Surface 2.

Another win is that the just slightly larger machine lends itself to better cooling. This was the most annoying thing about the Air, in that pushing the CPU (with games, periodic Windows scanning or intensive code builds) would always ramp up the fan, and that was annoying. In testing the intensive scenarios, I haven't been able to get the fan to a loud place. It's also interesting that it cools very quickly when you give it a rest. That makes sense if only for the fact that there's a lot more aluminum to dissipate heat. I'm confident that I can use this computer for video editing, easily.

Things generally feel a little snappier, which makes sense between the faster CPU and the PCIe storage (which the Air didn't have at the time). I can run the Windows VM quite comfortably in 4 gigs of RAM, and will continue to do so. It's incredibly responsive, and I could probably give it more room since I typically don't have more than a browser open on the OS X side.

Most importantly though, I've got room to do stuff. That's what was killing me. I was at the point where I could no longer fit a copy of the archived CoasterBuzz database and then restore it because I was so stuck on room.

Overall, this isn't a remarkable upgrade, but the timing was appropriate. I've been thinking about it since the fall, but between the house and having to pay for my own insurance, I didn't feel comfortable. With all of the new development tools, and that constant evolution, it's helpful to have room for multiple VM's so you can learn and experiment without trashing your production dev environment.


First impression: Xamarin 3

posted by Jeff | Friday, May 30, 2014, 2:56 PM | comments: 0

Almost a year ago, I started to be a lot more interested in Xamarin, since I already was something of a Mac guy writing software for the Microsoft platform. I've been working in Windows VM's via Parallels for years. At work, the firm we were working with to build out our mobile apps was using Xamarin too. For me, it wasn't just about being able to use C# to write apps for iOS and Android, it was the idea that you could share a lot of code. That's pretty exciting.

So around the holidays, I started to make a bona fide attempt at porting some portion of my super simple CoasterBuzz Windows Phone app to at least one of the other two platforms. It's as simple as it looks... it makes some JSON API calls and fills screens with it. It's entirely unremarkable.

My attempt was not a good experience. The first part of my attempt involved creating a shared library to call just one of the endpoints (the one that gets all amusement parks). I tried using the HttpClient PCL, but it didn't seem to work on both platforms. I ended up doing some lightweight DI to inject the platform specific versions in. When I did get to the platform specific projects, it wasn't at all clear if the async/await paradigm worked. More specifically, I wasn't sure how to make it work in the last mile with the UI. The iOS design experience was so poor linking to Xcode and Apple's designer, and it mostly just crashed.

Quirky didn't quite describe that experience. Awful would be a better word. I gave up.

Now Xamarin 3 is out, and there are three important changes (among others). The first is that they have a solid iOS designer that does not depend on the Apple nonsense. It works from within Xamarin Studio, and if you could afford it, also Visual Studio. The second big win is something called Xamarin.Forms, which is an abstraction around the platform controls. As they describe it, you can specify a button in code or XAML, and get the right button on each OS. You can even override to create specific controls. The final new win is NuGet package management built into the IDE.

OK... good enough for me. I decided to give it another shot. I started from the same place, creating a shared library to hold the data fetching code. I added NuGet packages for JSON.net and the HttpClient libraries, and wrote some basic code to fetch that amusement park list. Bam, it compiles.

Next step was a base project for the app. I created a single XAML page with a button and a listview. I wired up a handler for the button that called the data fetching code from the other project, and it let me keep the async/await stuff. Then two new projects, one for iOS and one for Android, and the required start up code described in their tutorial.

Once I had all of the required SDK's and such, I ran each version in the emulators... and they worked.

Yes, the Android SDK and emulator scene is a mess at first, but I can't believe that this just worked. I'm honestly a little blown away.

My first impression of the updated product is pretty strong. I'm still not crazy about the pricing because of the per-platform requirements, because it makes it difficult for the hobbyist or developer trying to learn new stuff to justify the expense. It's not that I'm against paying for good software, I just think it's a little much if your job doesn't pay for it. With more and more people working in contract arrangements, that's going to get worse.

My next move is to research the recently released preview of the Cordova stuff for Visual Studio. The Xamarin drumbeat insists that native is better for many reasons, but with people getting new phones every two years and the hardware being so good, I'm not sure that something browser based isn't good enough inside of an app container. I kind of like what Basecamp had to say about hybrid approaches, so I want to explore that. The VS story is even more compelling with Typescript.

 


Pride and cheerleading is never enough

posted by Jeff | Tuesday, May 27, 2014, 8:20 PM | comments: 0

Watching the political climate is always a little depressing, given that it's so negative. It makes me long for a time I didn't live in, like the 60's, where there were strong leaders like JFK and Dr. King, musicians who got involved in a way that wasn't a joke, and a bigger sense of purpose. We put people on the moon! Of course, this is very much a romanticized perception on my part, as my parents' generation will tell you it wasn't all rainbows and free love.

Regardless of this, the thing that I see in the speeches and the historical record is generally an ambitious call to action. Leaders of all kinds seemed intent on challenging people. Again, it might be a romanticized take on history, but it's still a stark contrast to today. I feel like we're subjected to entirely too much of a meaningless group hug message. Being proud of whatever we're supposed to be and cheerleading aren't enough to make us great.

Aside from the leadership issues, we seem to have a growing culture of disregard for excellence that has been replaced by pride and cheerleading. For example, there's this growing and bizarre sentiment of disregard for science. Climate change is political, people blame things on vaccines and there's always a demonic substance we're not supposed to eat because the Internet said so. People are unwilling to stop and say, "I don't really have a lot of information about this, so I'm going to learn as much as I can and maybe even find a way to contribute." How sad is that in a time when we can learn and understand, if we choose to, faster than ever before?

There are, fortunately, people who push to make things better. Elon Musk has taken it upon himself to make space a commercial venture, and build electric cars for fun and profit. Bill Gates is trying to make philanthropy more efficient. Brad and Angelina are adopting all of the poor children they can. Just kidding about the last one, but I suppose that leads me to the point that we don't all have to attempt to change the world in a massive way. I think we can all bring about a more excellent world in smaller ways. It starts by not putting so much energy into anti-excellent stuff.


The intoxicating joy of others

posted by Jeff | Sunday, May 25, 2014, 10:40 PM | comments: 0

I have to admit that there have been times lately where I've been desperate for people to pay attention to me and do stuff for me. I think this comes naturally at times for everyone, and probably more frequently for parents. Some of this is my own doing I'm sure, because a part of me really likes being the provider. It even extends to work, where I strive to help others and do the right things.

It also happens to be one of the things that I thought would be great about working for a theme park company. Unfortunately, it wasn't much the case for me, as the corporate office is so disconnected from the parks. This is double true for contractors, since we didn't have park access. But I still get that context from decades of visiting parks as a guest. You see a thousand little moments happen around you, and even having nothing to do with them, it's awesome.

While I might need a little attention at times, there's no question that I get a lot of joy from seeing others experience joy. Simon is a little obsessed with Journey Into Imagination at Epcot, a horribly dated and annoying attraction that hasn't been updated since the 90's. But you know what, he smiles through that entire ride, and now he's been trying to sing the song from it. It's funny how something I've grown to dislike, I like anyway because it makes him so happy.

More importantly, I try to be in situations where I can see people be happy like that, whether I have anything to do with it or not. It's everything from my wife's satisfaction when she completes a quilting project, to my BFF feeding a giraffe. It's the nod two fathers give each other at Give Kids The World Village, not knowing each other but understanding each other's world. (By the way, still seeking donations for Coasting For Kids!)

It's too easy to get sucked into the drama and nonsense around you. Even experiencing joy by proxy is better for the soul.


I might have an ice cream problem

posted by Jeff | Saturday, May 24, 2014, 11:06 PM | comments: 0

I've always enjoyed ice cream. I think that's pretty normal. It's not uncommon to have some in the freezer at our house, usually something from Schwan's, because their vanilla (and various derivatives like chocolate chip) is pretty damn good.

When I lived in Cleveland, the problem was mostly a milkshake problem. Being just a mile from a Steak-n-Shake and a Sonic did not help things, and the time of year didn't matter. I think it has gotten worse though since moving to Florida. Now I branch out with Schwan's (Silvermint bars? Yes please!). There's a little local place in Windermere that has really good ice cream and shakes too. Oh, and if we're friends on Facebook, you know about my unhealthy obsession with Dolewhip, the pineapple soft serve you can get at Magic Kingdom and the Polynesian. It was at Epcot during the Flower & Garden Festival, and now it's also available at Animal Kingdom (with rum!). Granted, what I love the most is the float at Magic Kingdom... vanilla and pineapple swirl in pineapple juice. If there's a better cold dessert, I haven't found it. I've waited 20 minutes for that stuff.

This isn't good for my figure I'm sure. Today we were driving through Sanford, on the way back from the Central Florida Zoo, and found an old school Dairy Queen, like the walk-up kind with no dining room or hot food. I ordered, without shame, a large Arctic Rush raspberry float, and it was delicious. How long has it not been a "Mr. Misty?" Who cares, it was the right mix of soft serve and brain freeze.

Clearly if this ice cream problem does not improve, I'm going to have to get more exercise. There's no room for fried food or drinking.


Professional let downs and surprises

posted by Jeff | Thursday, May 22, 2014, 11:08 PM | comments: 0

I got a message today from a former skip-level boss congratulating me on scoring the new gig and having a good year at SeaWorld Parks. It meant a lot to hear from him, as he felt that I was unique and not the "same old" among technology folks. If you know me personally, I'm sure you understand why I liked to hear that.

I felt the same way about him in his role, because he stood out from his peers. I'm not sure if that helped or hurt him professionally, but regardless, I respected him for his ability. The funny thing is, I don't really expect to respect the people I respect the most. It's like they're kind of off the radar until your circumstances change, and then you realize how awesome they are.

Conversely, it's almost crushing to see someone crumble under the weight of your expectations. That's when someone you really admire turns out to be a total dud. I'm astonished at how often that happens. You think someone has the professional capability to ooze awesomeness, only to find that they're more title and tenure than leader and superior geek.

I've said it a hundred times, that it's other people who ultimately make you better. That's why these let downs and surprises are so tricky, because you get invested in people, and you don't always know who will have the greatest impact on you. Maybe it's just me, but I like to think that I'm usually a pretty good judge of character.


So long and thanks for all the fish

posted by Jeff | Thursday, May 22, 2014, 8:02 AM | comments: 0

I was trying to recall a suitable literary quote involving whales as a title, but we'll have to settle with this one, which involves dolphins leaving the planet. I'm not leaving the planet, but I work for a company that has dolphins, and my contract at SeaWorld Parks & Entertainment ends in a couple of weeks.

A year ago, I was just getting back from Seattle, interviewing for a gig at Microsoft that clearly wasn't right for me. At the same time, we were looking at our options for escaping Cleveland before another a winter (boy did we time that well), and I was dropping out of a short contract that paid crazy money and made me miserable. The world was ripe with possibility, and frankly it was pretty exciting. Things came together suddenly when I scored a contract gig with SeaWorld at the corporate office. It was the first and only job I pursued in Orlando.

Everything that I expected to get out of the job happened, which probably makes it the first time in my professional life that a job was exactly what I expected. It wasn't all puppies and rainbows, I knew what I was getting into in terms of the state of things, and I felt good about what I could contribute. The technical details are likely boring to most people, but I can say that I delivered a lot of value and worked in a lot of strategic efforts that people there weren't already thinking about. That makes me happy. I was able to develop some of the politicking and patience skills that one of my managers at Microsoft taught me a great deal about, necessary to deliver the "right" things.

The only real regret is that they couldn't figure out a way to convert the position to a full-time job, but it's not personal. It's validating that a lot of folks hate to see me go, which feels good because I felt very invested in the job, especially for a contract gig. I'll really miss the people there.

In any case, I'm moving on to a full-time position with a technology company that's growing quite a bit. I think it will be very challenging, and I'm encouraged (and maybe slightly intimidated) by all of the very smart people I met during the interview process. It's also primarily remote, but with enough face-to-face opportunity that it will still feel connected like an office job. I think that hybrid will be the best of both worlds.


Do you have to choose between screens?

posted by Jeff | Tuesday, May 20, 2014, 10:46 PM | comments: 0

Microsoft announced the Surface Pro 3 today, which is essentially a laptop squeezed into a 12" tablet. Without having seen one in real life yet, it's interesting from the standpoint that it doesn't really have any serious compromise as a tablet (unless it turns out to be hard to hold at that size, but it's awfully light and thin). If it's comfortable to use on your lap, which is what they're trying to prove, it might not even have significant compromises as a laptop.

I was always the skeptic around tablets early on because I just didn't see the need for a consumption device. I changed my mind finally when the screens started having higher resolution (the retina iPad and Surface 2). I enjoyed using them on the couch, at lunch and anywhere I just wanted to read and view pictures of cats.

But there always comes a time where I need to put the thing down and get the laptop for "real" work, even if it's just writing. My Surface 2 can do some of that work with the keyboard cover, but not being a "real" computer I can't run Visual Studio on it.

You can see what Microsoft is after here... they don't want you to have to choose. Mind you, that thing isn't a "tablet killer," because it's priced like a laptop, not a tablet. But it still asks, do you really have to choose? The various Windows based laptops are pretty solid these days, but I like the idea of being able to draw on the screen. And of course, Apple is too stubborn to do touch on the MacBooks, which frustrates me to no end given how great those laptops are otherwise.

And then there's that weird in between use case. I got one of those 8" Dell tablets for super cheap, and it's a fantastic and inexpensive little time waster. I tend to use it for music on headphones, Facebook and news reading. It's easy to toss in a bag or a glove box.

But there are too many screens. Add the phone to the mix. I honestly don't use it much beyond quick email, text messaging and updating Facebook with a status or photo. I just have to wonder if this new genre bending device could consolidate a few use cases. (I realize how absurd that is among people who have none of them, but keep in mind that this is what I do for a living... it's my job to understand this stuff.)

I like the idea of this new laplet/tabtop thing for the pen input, actually. I always have a couple of legal pads around for sketching out user interfaces and application architecture. It's much easier to bang something out and not get too attached to it.

These are good problems to have, I suppose. Computers went a good 15 years with the only significant change being that we didn't need a big box under the desk, we could have something on our lap. The changes in the last four years have been radical and fast. We live in the future!


He seems normal

posted by Jeff | Tuesday, May 20, 2014, 9:39 PM | comments: 1

This is a post I've had on my mind for a very long time. I've resisted writing it because right about the time I'm ready to, I'm pissed off and angry. I can probably explain this better when I'm not tweaked. Although, writing about it makes me a little tweaked.

Let me do a quick review. Simon has been diagnosed with Sensory Processing Disorder (SPD) and dyspraxia. Essentially that means that his brain doesn't always take input in the right order, creating a drag on the development of his motor skills. It also means he tends to seek more intense sensation, which contributes to the hitting and pinching he does, and why putting him in a beanbag or wrapping him in a sleeping bag chills him out. He's also been diagnosed with Autism Spectrum Disorder (ASD), though the people who have evaluated him generally don't observe cognitive delays, just the range of social, communication and repetitive behavior issues.

The genesis of all of this came out of concern from his pediatricians, that he exhibited certain markers for developmental delays. That's when we got the Help Me Grow people helping him out in Seattle, and subsequently the Birth-to-3 Intervention in Cleveland. It's why he's in preschool now.

Understand that we're the kind of parents frustrated with all of the helicopter parent, participation trophy bullshit that seems to dominate the world of children today. I can't stand all of this crap around making every kid special and shielded from adversity. That's not to say we haven't helped Simon where he should have flailed a bit. We shouldn't have helped him as much as a baby when it came to rolling over, for example, and helping him get shoes on just because we were in a hurry didn't do him any favors either. But for the most part, we're OK with him experiencing difficulty and learning from it.

But here's the thing, if professionals have diagnosed specific problems with his development, you better believe we're going to do everything we can afford to do in order to get him caught up. Who wouldn't?

So when someone spends a little time with him, and says something like, "He seems normal to me," it pisses me off. You're not qualified to make that assessment. Autism doesn't mean he's like Rainman. It means that his brain is simply wired differently, and we have to figure out what that means. Your perception is irrelevant compared to the opinions of professionals with degrees and clinical experience. You know that reflex test doctors do, when they tap your knee? His leg doesn't move. The kid can't draw a circle and just now is learning to catch a ball. He's not hitting people because he wants to be a dick, he's doing it because that intense sensation is what his brain needs. Don't tell me what "normal" is. That comment is offensive, because you're invalidating all of the information we have that led to us deciding to get him therapy. Don't imply we don't know what we're doing or that we're being over cautious. You don't know. Conventional wisdom doesn't work with a child who has no use for convention.

I love Simon, in a way that I don't think anyone really understands until they have a child. We constantly struggle with the balance of rolling with things and providing for him, always hoping we're preparing him for life and that he's learning at every turn. We're in a race to get him prepared for kindergarten on time. We see the seeds of extraordinary cognitive ability inside, but the differences in how he's wired definitely come with challenges. Diana in particular spends most of her waking moments working with these challenges.

So please, don't judge us, and don't judge my kid. His normal isn't your normal. We accept the differences, because pretending they don't exist doesn't do anyone any good. We embrace Simon for who he is, because knowing that truth is what allows us to serve him best.


The ugly evolution of running a background operation in the context of an ASP.NET app

posted by Jeff | Sunday, May 18, 2014, 11:27 PM | comments: 2

If you’re one of the two people who has followed my blog for many years, you know that I’ve been going at POP Forums now for over almost 15 years. Publishing it as an open source app has been a big help because it helps me understand how people want to use it, and having it translated to six languages is pretty sweet. Despite this warm and fuzzy group hug, there has been an ugly hack hiding in there for years.

One of the things we find ourselves wanting to do is hide some kind of regular process inside of an ASP.NET application that runs periodically. The motivation for this has always been that a lot of people simply don’t have a choice, because they’re running the app on shared hosting, or don’t otherwise have access to a box that can run some kind of regular background service. In POP Forums, I “solved” this problem years ago by hiding some static timers in an HttpModule. Truthfully, this works well as long as you don’t run multiple instances of the app, which in the cloud world, is always a possibility. With the arrival of WebJobs in Azure, I’m going to solve this problem.

This post isn’t about that.

The other little hacky problem that I “solved” was spawning a background thread to queue emails to subscribed users of the forum. This evolved quite a bit over the years, starting with a long running page to mail users in real-time, when I had only a few hundred. By the time it got into the thousands, or tens of thousands, I needed a better way. What I did is launched a new thread that read all of the user data in, then wrote a queued email to the database (as in, the entire body of the email, every time), with the properly formatted opt-out link. It was super inefficient, but it worked.

Then I moved my biggest site using it, CoasterBuzz, to an Azure Website, and it stopped working. So let’s start with the first stupid thing I was doing. The new thread was simply created with delegate code inline. As best I can tell, Azure Websites are more aggressive about garbage collection, because that thread didn’t queue even one message. When the calling server response went out of scope, so went the magic background thread. Duh, all I had to do was move the thread to a private static variable in the class. That’s the way I was able to keep stuff running from the HttpModule. (And yes, I know this is still prone to failure, particularly if the app recycles. For as infrequently as it’s used, I have not, however, experienced this.)

It was still failing, but this time I wasn’t sure why. It would queue a few dozen messages, then die. Running in Azure, I had to turn on the application logging and FTP in to see what was going on. That led me to a helper method I was using as delegate to build the unsubscribe links. The idea here is that I didn’t want yet another config entry to describe the base URL, appended with the right path that would match the routing table. No, I wanted the app to figure it out for you, so I came up with this little thing:

public static string FullUrlHelper(this Controller controller, string actionName, string controllerName, object routeValues = null)
{
	var helper = new UrlHelper(controller.Request.RequestContext);
	var requestUrl = controller.Request.Url;
	if (requestUrl == null)
		return String.Empty;
	var url = requestUrl.Scheme + "://";
	url += requestUrl.Host;
	url += (requestUrl.Port != 80 ? ":" + requestUrl.Port : "");
	url += helper.Action(actionName, controllerName, routeValues);
	return url;
}

And yes, that should have been done with a string builder. This is useful for sending out the email verification messages, too. As clever as I thought I was with this, I was using a delegate in the admin controller to format these unsubscribe links for tens of thousands of users. I passed that delegate into a service class that did the email work:

Func<User, string> unsubscribeLinkGenerator = 
	user => this.FullUrlHelper("Unsubscribe", AccountController.Name, new { id = user.UserID, key = _profileService.GetUnsubscribeHash(user) });
_mailingListService.MailUsers(subject, body, htmlBody, unsubscribeLinkGenerator);

Cool, right? Actually, not so much. If you look back at the helper, this delegate then will depend on the controller context to learn the routing and format for the URL. As you might have guessed, those things were turning null after a few dozen formatted links, when the original request to the admin controller went away. That this wasn’t already happening on my dedicated server is surprising, but again, I understand why the Azure environment might be eager to reclaim a thread after servicing the request.

It’s already inefficient that I’m building the entire email for every user, but going back to check the routing table for the right link every time isn’t a win either. I put together a little hack to look up one generic URL, and use that as the basis for a string format. If you’re wondering why I didn’t just use the curly braces up front, it’s because they get URL formatted:

var baseString = this.FullUrlHelper("Unsubscribe", AccountController.Name, new { id = "--id--", key = "--key--" });
baseString = baseString.Replace("--id--", "{0}").Replace("--key--", "{1}");
Func unsubscribeLinkGenerator =
	user => String.Format(baseString, user.UserID, _profileService.GetUnsubscribeHash(user));
_mailingListService.MailUsers(subject, body, htmlBody, unsubscribeLinkGenerator);

And wouldn’t you know it, the new solution works just fine. It’s still kind of hacky and inefficient, but it will work until this somehow breaks too.


Favorite things in Windows Phone 8.1

posted by Jeff | Saturday, May 17, 2014, 10:40 PM | comments: 0

I've been a fan of Windows Phone from the start. I've tried to be an advocate of the platform, while being honest about its shortcomings. It has been good to me overall, though I have to admit I've never been an app person. Aside from a few games, I've just never been very interested in what most apps do (especially since their Web counterparts pretty much can do the same thing). I'm probably not typical in that sense.

With the wave of Nokia hardware that came out about a year and a half in, specifically the awesome Nokia models with the great cameras, and the update that Windows Phone 8 brought, I was definitely sold to stay on board. iOS started to feel old and dated to me. The contextual "journeys" always made sense, and live tiles are still great because you don't need to open stuff up.

But there were little things that needed to get better. The calendar UI was awkward. Notifications across apps and core phone functions weren't unified. Every once in awhile you still had the rogue background thing that would zap your battery, and you wouldn't know why.

The new 8.1 updated addressed all of this, and I think the platform is more or less at app parity with the other platforms (my only complaint is the lack of an Amazon Cloud Player). Here are some screen shots of my favorite things.

First there is Cortana. Named after the artificial intelligence construct in the Halo video games, she's your personal assistant, roughly analogous to Siri on iOS. You can tell her the usual stuff with your voice or typing, like "call Diana" or "find Indian restaurants," and she'll help you out. She's also pretty good at things like "remind me to call Diana at 4pm," and stuff like that. Where she really adds value is when you allow her to look at all of your stuff, like e-mail and your calendar, and she just takes it upon herself to do it. She'll get status updates on your flights found in e-mail, or if you have an address on an event, let you know when you need to get your ass in the car. That's seriously cool. She's still quirky at times, but usually gets things done. You can even teach her how to pronounce your name (so Kara could be properly addressed as "car-uh" if she wanted).

The new word shaping keyboard, or whatever they're calling it other than swipe keyboard, is completely awesome. I don't know how it does it, but you drag your finger around over letters and it figures out what you want to say. It's right most of the time. It took a little while to learn four letter words, but it's there now. It even suggests a little brown icon shaped like dog poo when I type "shit."

I'm also a fan of the new lock screen and start screen, the latter of which allows you to use a parallax scrolling background that shines through the solid color tiles. The only problem with it is that most photos you have probably just look busy and distracting. It wasn't until things clicked that I had the image at right that we snapped on our last cruise. Having the ship at the top and gradient color of the ocean water as it gets deeper is pretty much the perfect background. Of course, when you scroll to the bottom, you'll see Diana's feet, but hopefully that's not too weird.

One of the more useful things is the new battery saver controls. They've always had a battery saver feature, which turned off background stuff when you reached 20%, but now they give you tons of control over everything, as well as data. You can opt out specific apps to the 20% rule (at your peril, of course), so they will run in the background no matter what. More importantly though, you can see how much juice any particular app is using, and then get a further breakdown to see if it's being an energy hog in the background, or just when you're using it. Windows Phone in the general sense is pretty good about this stuff, but in the event that something is going a little nuts, you can at least identify it. Just today, when I took the screenshot below, Facebook was misbehaving, and I could see right away what the problem was.

 

Of similar awesomesauce is the ability to see what apps are data hogs, and they're broken down by cellular and wi-fi totals. We're not usually big data users, especially since we tend to have wi-fi in most places. There's a new feature called "wi-fi sense" that helps you find free wi-fi, and even gets you passed the "agree to terms" screens in the background, but honestly I don't really trust it. I don't like to connect unless I know what I'm connecting to. Not only that, we get more cellular bandwidth than we need, and it's usually pretty fast.

On a side note, we recently switched to AT&T's "mobile share" plan and added a friend to our account. Now we split the base $100 three ways and add $15 for each phone, and we save a ton (I still get the MSFT discount on the core $100 as well). The plan includes 10 gigs of data, and so far we haven't gone over 4 gigs total.

Also a win, since switching to this plan, I can use the wi-fi tethering. That means I can use my laptop or tablets pretty much anywhere, and I have a few times. Even with that, my share of the data usage has never gone over a gig or so. Again, I'm not really sure if that's typical or not.

Notifications were a huge weak spot before if you really had a lot of apps notifying you of stuff. That problem is totally fixed. Now you have super fine grained control of how things alert you, and it's all aggregated into one notification screen (that also has four assignable buttons, for which I use wi-fi, Bluetooth, airplane mode and tethering). This was probably one of the biggest missing features if you came from iOS, so it was a legitimate gripe.

What I like is that now you can control, on an individual app basis, how each thing notifies you. You can choose whether or not to show it in the notification log, whether it should show the toasts, whether or not it should make a sound, and whether or not it should vibrate. So for example, I don't need to react to email when it arrives, but if I happen to have the phone in view, I don't mind if it pops up the toast on the screen. I don't need sound or vibration. Particularly since they've moved a lot of the social features out of the native operating system (more on that in a minute), this is a nice configuration option to have. It means that Facebook or WhatsApp messaging can work just like text messaging in terms of notification behavior.

The new calendar UI is nicer too. I was never fond of the infinite scrolling day view, so now you swipe to go between days. The weekly view is also much nicer than the "agenda" view, which sucked because it left out days where you didn't have anything, making for a weird sequence of things out of context to actual time. And of course, Cortana will pop stuff in there whenever you ask.

There are a few things I'm not crazy about, but they're mostly "moved my cheese" moments. For example, the native Facebook stuff is largely gone. I can see why they did it, because the app is far easier to change, but it's not nearly as fast. On the plus side, because you can "deep link" to places inside of Windows Phone apps, it's still pretty seamless to get to a status update or photo upload. I just mourn the loss of speed. Facebook is also a little crashtastic on startup, where you might have to start it four times before it works. Presumably this is a temporary problem since it's not technically released yet.

Overall, I'm happy with the updates, and for now at least, the phone is more than just a utilitarian thing, and I'm enjoying using it. In fact, I feel like I'm rediscovering some of the nice things about the hardware, especially the amazing screen and camera. Now that Microsoft owns Nokia, I can't wait to see what happens.


Star Wars and Simon

posted by Jeff | Saturday, May 17, 2014, 7:59 PM | comments: 0

Diana and I got a little grown up time this afternoon while my BFF watched Simon. It was much needed, as we've been having a hard time with him lately. One of the things we sometimes forget is that, while we live next door to Disney World, we almost never get to do anything we want to do there, because it's always for Simon. So while there are all kinds of things to do around Orlando, we are theme park geeks, and we desperately want to do some of the stuff we like. Almost a year into living here, we still had not been on Tower of Terror or Rock-n-Rollercoaster, and that's a shame. So off we went to Hollywood Studios, with the bonus being that it's the first Star Wars Weekend, and I've wanted to do one of those for a long time.

The people watching opportunities are fun, too. Lots of costumes and Star Wars tattoos. Now that Disney owns Lucasfilm, I think they're really going to step it up a notch. You wonder why they're dicking around with this Avatar nonsense at Animal Kingdom instead of going full-on Star Wars crazy. The original trilogy is classic, the prequels could have been one movie (maybe two). With JJ Abrams taking over for new films, I think there is potential for them to be epic, though anything short of the greatest science fiction movie of all time will probably be a let down.

The afternoon at DHS got me to thinking about introducing Simon to Star Wars, and I think this might be the year. I couldn't help but think of Scott Hanselman's post on the subject two years ago, when he introduced his kids to Star Wars. I think Simon might be ready later this year, assuming that he continues to make progress in terms of his communication. I know he tends to understand us, but he's not always good at asking questions, and I want that from him.

One of the things that really struck me at the park was how many younger people, from pre-teens and up, were in shirts and costumes. Even more striking was that so many of them were young girls. I saw one girl, I'm guessing around 14, who had an outfit that she appeared to have made, clearly inspired by the more formal clothes of some of the women on Coruscant in Episodes I-III. That blew me away. That these movies continue to draw in people across many generations is amazing. I look forward to sharing them with Simon.


Front porch

posted by Jeff | Saturday, May 17, 2014, 10:15 AM | comments: 0

Last night, we all went and sat on the front porch for awhile after dinner. Even though we've been in the house now for more than two months, we've never really spent any time there. When it's in the mid-70's, not humid, and the sky is blue, that sure is a good time to hang out there.

This was, I think, one of the first times that I felt like this was our house. After so many years of rentals and wanting to not own the house in Cleveland, I just haven't felt any attachment to a dwelling. I'm not sure I feel that now, but having struggled for years with what makes a place "home," I'm actually starting to feel at home in our, uh, home.

I've turned a corner in some of the attitudes that made me reject the abstract idea of home. I no longer associate owning a home with a lack of mobility, because now homes actually sell, and frankly I don't want to be mobile at this point. The expense isn't as much of a concern either, because the mortgage and taxes are less than rent, and we're slowly getting away from the cash crunch that involved blowing away our savings for a down payment. (Granted, now we have the expense of Simon's therapy, so it seems like there's always something.) Living in Florida no longer feels like an experiment, and that makes it feel OK to really relax and enjoy where we live.

Simon has already lived in five different places, and he's only 4. I think settling down for awhile is a good plan.


Motivational poster leadership isn't leadership at all

posted by Jeff | Thursday, May 15, 2014, 5:46 PM | comments: 0

I admire great leaders. They're intoxicating to be around. They're also pretty hard to come by. There are a lot of things that they have to be to fill those leaderhosen (see what I did there?). Conversely, there are a lot of things that they aren't, and this is one of those things. There is a class of people that largely designate themselves as leaders who are completely full of crap, and I call them "motivational poster leaders." They're a caricature of manipulative and hollow marketing practices. Heck, they're at the center of much of the self-help and fitness product world.

Talk is cheap. (Talk is even cheaper on the Internets.) It takes almost no effort at all to tell people how awesome they are, how they can do anything, and that they can fart pixie dust if they really believe. That isn't leadership. Leadership acknowledges shortcomings and helps people build a plan of action toward real accomplishment. They get the risks, and they take them into account. Self-awareness about weakness is a strength.

We all know a Susie Sunshine, or have worked with one at some point. They're people who seem impossibly happy and positive at all times. I distrust people like that. If someone isn't visibly concerned or partially motivated by fear, risk or negativity, I don't think they're realistically viewing the world. I'm not convinced they're truly passionate about anything either, because without a little passion, you can't be concerned with failure. I once worked with a guy like this outside of my reporting lines. When the part of the business he worked in imploded, he was completely broadsided. Don't get me wrong, being positive and upbeat is contagious and essential to solid leadership. It just ain't right when it's 100% all of the time.

Let's be honest, the motivational poster crowd is not successful. Sure, they might bank some nice coin, but it doesn't mean that the people who are influenced by them or that work with them are successful. That's what it really comes down to. Success and accomplishment as a leader goes beyond you, and especially beyond your bank account. If you really are awesome, you'll be swimming in awesomesauce up to your neck. If you're a motivational poster leader, you'll just be up to your neck in bullshit. That's stinky.


The indie publisher moving to Azure, part 1: migration

posted by Jeff | Tuesday, May 13, 2014, 7:05 PM | comments: 2

I've been a big fan of cloud-based infrastructure for a long time. I was fortunate enough to be on a small team of developers who built the reputation system for MSDN back in 2010, on Microsoft's Azure platform. Back then, there was a serious learning curve because Azure was barely a product. At the end of the day, we built something that easily could handle millions of transactions per month without sweating, and that was a sweet opportunity. Most people never get to build stuff to that scale.

My personal projects, specifically CoasterBuzz and PointBuzz, have been on everything from shared hosting in the early days to dedicated servers at my house and in various data centers. These sites are pretty modest in terms of traffic (low millions of requests per month), and the forum engine I wrote (POP Forums) is pretty efficient for the most part, so they don't require a ton of horsepower. That said, the overall cost of the various cloud services were still too high, or in some cases just didn't make a lot of sense to use. Bandwidth was the biggest cost problem. Even then, some services, like Amazon, might have been roughly equivalent on price, but if it's mostly just replacing a server with a virtual machine, that's a lateral move.

I've been a fan of Azure because the toolbox is so big. More specifically, their platform-as-a-service (PaaS) options take a lot of the nonsense out of running and administering stuff, which is a lot more fun. The Azure Web Sites and Cloud Service products, essentially purpose-built virtual machines, are really fantastic. Throw in the storage, queues, caches, etc., there's a lot to love.

With the recent price cuts, it was time to make the switch. The daily use and monitoring is a different topic to write about, and certainly I want to wait a few weeks until I have some experience with it. I want to talk about the migration effort here, which was relatively easy, but I do see a pretty big flaw that frankly should have been addressed years ago.

There isn't anything horribly exotic about my sites. They range from ASP.NET Webforms to MVC. There are also some other minor sites that are a little scary and do suboptimal things, mostly because they haven't changed in many years. As is typical, the little stuff ends up causing the most work. For example, the old CoasterBuzz blog site writes its MP3's to the file system. That, as it turns out, is a little tricky to handle because you can't just RDP into the server and set file permissions. Instead, you have to do that as part of the deployment. I haven't totally figured that out, so I can't share how that's done just yet. We have a similar function where we FTP up photos and bulk import them to photo albums.

Microsoft recently introduced the concept of a "hosting plan," which is roughly equivalent to a virtual server (or many instances thereof) that has all of the sites you want to group together. You can scale these up (server and CPU) and out (multiple instances behind a load balancer) as a group. This is cool, but it's also something of a minor liability. My sites tend to do a ton of caching, but that caching happens in the local memory. Therefore, I can't scale out, because the memory isn't shared across instances, and cache invalidation would be broken. I've actually done some prototyping on POP Forums that makes this easy to fix, but the older sites, especially PointBuzz, aren't ready for that. Fortunately, I don't expect to have to scale out any time soon. My stuff isn't built for multiple instances.

Setting up the sites in the Azure portal is super easy. Most of the default settings are good, though you have to open up web sockets for your SignalR stuff (the forums use it). Beyond that, there are some backup options to enable, and this requires you to be on the standard tier. Deployment is super easy as well from Visual Studio, as it performs web.config transforms as necessary and connects right up to the platform.

The one thing that has required a bit of work is the weekly execution of a stored procedure. I calculate the top 100 roller coasters by running a sproc (those who know me will find that odd, because I so don't like doing this sort of thing with SQL). What I ended up doing was firing this from an MVC action that looks for a certain request body over SSL. Azure has a scheduler that handles this call. The problem is that the scheduler won't update via the management portal to include the text you want to send in that body, so that's borken. I reached out on the forums and found someone else with the same problem. No MSFT response so far.

As I expected, SQL is still a big mess. On one hand, I am so endlessly impressed with the way that Microsoft is iterating quickly with the web products and frameworks, and open sourcing much of it on top of that. Ditto with the ever expanding Azure toolbox. Moving stuff to Azure has been pretty easy for the most part, even into PaaS components, despite much of my stuff being written for traditional n-tier server scenarios.

But SQL Azure still has the worst migration story ever. I understand most of the other constraints that the platform has when compared to the on-premise version of SQL Server. You basically have two ways to get your data into SQL Azure. You can use the sync framework, which will junk up your database with triggers and stuff (as far as I remember... I haven't looked at it in years). The other alternative is you can import a BACPAC file that you have uploaded into blob storage. I chose the latter, and here's what happened.

The CoasterBuzz database weighs in over 8 gigs. Yes, I'm storing image data in there, but that only accounts for around a gig, maybe two, of that data. I created the BACPAC on my old dedicated server, and it took about an hour and 15 minutes. I should also mention that using SQL Studio caused it to lock up, but the command line version worked fine. It's an old box with slow disks, so whatever. I can hydrate the resulting BACPAC on my MacBook Air in less than 10 minutes. Restoring it to a SQL Azure database, using the "business" tier, took about 2 hours and 15 minutes. That's pretty terrible. What was even more terrible, however, was trying to import it into one of the new basic or standard tiers, which will eventually replace web and business. In the basic tier, I did test runs for the much smaller PointBuzz database (around 2 gigs in size), and I gave up after 6 hours. Reading the MSDN forums, this is a widespread problem, in that people with even a slightly large database can't get the data in fast enough to avoid significant down time. I get throttling the database under normal use conditions, but importing really shouldn't be neutered like that.

All told, it took me four hours to move the database, which for something that isn't trivial like a site for roller coaster nerds, would be totally unacceptable. A lot of the reason comes down to the fact they won't support two tried and true methods that would minimize, if not eliminate, down time. In the old world of dedicated servers, we had two options. We could turn on replication between databases (ignoring licensing for a moment, because an indie publisher like me certainly wouldn't have two licenses). Then you have a near-real-time copy of the database, and you can mostly just flip the DNS switch to the new location and/or connection strings and you're done. Alternatively, you can do a full back up, as in .bak files, and hydrate the database in the new location. When you're ready to cut over, you take down the site, do an incremental backup, then apply that backup that to the new location. This is what I did on my last move back in 2010, and it worked like a champ. I was down for 10 minutes, late at night when I had minimal traffic anyway.

I'm super enthusiastic about Azure, but if this were some bigger thing related to a "day job" project, I would not be OK with this crappy migration story. With all of this magic and innovation, it's weird that the SQL story is so poor. It has been that way since the beginning. (Disclaimer: I have some context about why that might be from my time working in Redmond, so that may color my discontent.) Considering how important the SQL part is of the Microsoft stack, you would think this would be a great priority. I mean, they still have an awful Silverlight based management portal for SQL Azure that doesn't even work in Chrome.

Putting all of that complaining aside, I can say that I'm super happy to be migrated and done. I love the idea that I no longer have to feed and care for a dedicated server. No more shipping transaction logs or patching or configuring. Stuff mostly just works now, and whenever I need something new, it can be created in a matter of seconds. That's where the magic is. Where we would not, once upon a time, ever think about using things like queues and table storage and service buses, now we can. That's so powerful, and it's not expensive.


Low parenting morale

posted by Jeff | Sunday, May 11, 2014, 10:04 PM | comments: 0

We had an incident of sorts with Simon today that made us feel pretty defeated and generally lousy about being his parents. Honestly, we've had a lot of days like that lately. It's been kind of exhausting, and acknowledging it actually makes us feel worse. For me at least, it's because I feel like Simon's issues are "easy" compared to what other parents go through. Nothing quite like invalidating your own feelings. No chance that could lead to issues of resentment!

We're very much in a transitional stage with Simon. Between school and therapy, he's starting to catch up with his delay issues. The advice of the therapist for some of his behavioral issues are also really helpful, because some of the ways we react are somewhat counterintuitive due to his ASD wired brain. The motivation in his head for things like pinching and hitting, and the responses we offer, aren't at all logical for the neurotypical.

I find we have to hang on to the progress he's making, because it helps to offset the exhaustion he unintentionally causes. For example, we see motor skills like walking on stairs, alternating steps, suddenly clicking. We see him engaging in imaginative play, finally, which is huge. He's even ordering for himself in restaurants. I focus on those things, because at the same time we're starting to see more of the classic "autism shutdowns" and complete disregard for certain social contracts.

I know people like to say we're doing an awesome job, and I appreciate that support, but sometimes we need to just vent. I'm also tired of hearing people say things like "he seems normal" as some kind of comfort, because he's not. (That's undoubtedly a future blog post all its own... we live with the kid, we took him to see experts, and no, your conventional wisdom won't work.)

Fortunately, we know that this is a cyclical phenomenon. We have days (sometimes weeks) of suck, and then he's the sweetest and easiest kid ever. We get more answers every week on how we should handle the difficult behaviors. Right now, I think we both just need a break. We haven't even been sticking to our regular date night plan, which makes a day or two on an overnight trip even harder to fathom, so we need to correct that.

Sometimes, just unloading the blog vomit makes things better.


Live blog is live

posted by Jeff | Thursday, May 8, 2014, 11:07 PM | comments: 0

I didn't get to Cedar Point's media event this year (I have something of a proximity problem), but we did fire up our live blog for it. Walt posted photos and video from the event in real-time, which was a lot of fun to watch. I wrote about creating the little app last year.

I didn't go completely nuts this year with it on a bunch of virtual hardware that I didn't need, but it did once again run in Azure. This time it was on Azure Web Sites, and the performance was pretty great. It only peaked at 50 concurrent SignalR connections, but of course it never broke a sweat. Response times were consistently under 100 ms from this end of the country.

It's a lot of fun to build little things like this now and then with performance in mind. There's something satisfying about getting even simple things to run very quickly, and part of that is just the joy of learning where improvement is possible. I've been fortunate to work on some giant things that push insane traffic (MSDN forums), and those really force you to think about how to make things simple and efficient.

PointBuzz has been running on Azure for almost two weeks, and I'm going to try to get CoasterBuzz there next. I'm hoping that this is the last month I ever pay for a physical dedicated server.


Disney Cruise #3: Disney Dream, May 2014

posted by Jeff | Wednesday, May 7, 2014, 10:33 PM | comments: 0

We finished up our third cruise with the rat last weekend. It was our second time on the Dream, and this time we did it with our friends from Chicago and their two little girls. This was the trip we were planning for at the start of the year, when we spontaneously booked the three-night Bahama trip on the Magic for February. All three cruises have been the same itinerary, but one of these days we'll do a longer one.

Mike and Artemisa have literally been "vacation friends" for almost ten years now. Mike also did the CoasterBuzz Podcast with me back in the day. It's always fun to kind of pick up where we left off with them, only now, we all have kids. I picked them up from the airport, and they used one of my cars to drive to the port. This is a point of frustration we've seen many times now for cruising with Disney. There are no cost effective ways to get there unless you're also booking a lengthy stay at the theme parks. This way, at least, all they had to pay for was the $60 parking for the car (plus assorted beverages that they graciously bought us).

We had a slightly different room this time, with a neat circular shower that felt less cramped. The room was a little longer, too. Our co-travelers had a concierge room, which was super roomy. On the plus side, they had an amazing verandah that faces both forward and port, but because it was also a handicap accessible room, the bathroom was gigantic but not not particularly luxurious. The benefits of concierge include the private deck, pre-dinner drinks, more people waiting on you, and of course the bigger rooms that you don't really spend that much time in. We wanted to try this, but the rooms were all booked.

As much as we enjoyed our trip on the Magic, there is something that is just so amazing about the Dream. It holds a lot more people, but it never felt too crowded except during the boarding period prior to the emergency drill. You walk into the lobby, and it's such a "wow" moment. Deck 4 has a bigger, classic feel when you walk around. The theater is beautiful. Oh, and the pizza is better too. Like I said, I loved the Magic as well, and frankly would have to like it if we ever get serious about doing one of the Europe itineraries, but the Dream is special for a ship that "only" does 3 and 4-night itineraries to the Bahamas.

Generally speaking, there isn't a lot new to talk about over the previous trips, because the food and service was exactly what we expect. The bar is set pretty high, and they get there. That said, we did have one snafu when we boarded to have lunch. They didn't have PB&J, and two restaurants asked Diana to run all over the ship looking for it. No one would own the problem. It probably shouldn't be a problem, but Simon having the issues that he does, this is one of those situations where he can't understand when he can't have something he's used to getting, and he shuts down. It doesn't happen often, but it's heartbreaking when it does. I calmly explained my disappointment to guest services, and that afternoon, room service showed up with a half-dozen Uncrustables to stock our fridge. They went above and beyond, and that's why I love this cruise line.

They're offering a whole lot of opportunities to spend extra. They aren't just selling fruity drinks, they're selling 12 bottles for the price of 10, delivered to your room. Mike and I bought in to it, and that made our beach day a lot more fun, for sure. They were also pushing packs of water, and coolers to carry stuff around the ship or to Castaway Cay.

Probably the biggest differentiator of this trip, aside from the obvious fact that we went with another family, was the rental of a cabana on Castaway Cay. Honestly, this isn't something we would ever spend money on if it was just us, because it's crazy expensive. But share it with another family, when you're spending a significant portion of your trip on that island, and it is completely worth it. They give you all the snacks and non-alcoholic beverages you can consume, sunscreen, sand toys for the kids, a call button for bar service, etc. They drive you out there in a golf cart.

The cabana itself is a nice raised up structure with cushy furniture, an interior area (with a curtain for a changing area), as well as a deck with a semi-shade canvas cover. The kids loved the hammock just down the steps from there. The beach itself is semi-private, has the usual chairs and umbrellas, and tubes and stuff to play on (no rental required).

Having a more "catered" beach experience, with a little more privacy and a whole lot of comfort made this awesome. Throw in our beer stash from the ship, and we had a fantastic time. We played with the kids building sand castles, talked about career and parent stuff, had beverages and soaked in the awesome views that come with that island. It's going to be difficult to ever do Castaway Cay the normal way after this. I am so not a beach person, and this was probably the best six hours on a beach I've ever had.

Other notes and observations...

  • The BBQ pizza at Luigi's is the tits, and the reason I gained weight over the weekend.
  • The DJ they had for the evening following the fireworks was surprisingly good, and the vibe on the deck was weird but cool. It was like a bunch of moms dressed like hookers brought their husbands and kids to the club.
  • Having a room on deck 10 midship seems awesome because of the proximity to everything going on up there, but it's not great if you want to go to bed before midnight.
  • Simon had a meltdown that we still can't understand. We left him in the Oceaneer's Club, and he seemed to play for a bit and then cried uncontrollably.
  • People ask if a Disney cruise is right without kids. Let me ask you, do you like having adult-only areas that aren't crowded? If so, I suspect nothing would be better than a Disney cruise.
  • I still find it annoying that you can get a burger and pizza on deck 11, but if you want popcorn for a movie or the theatrical show, they charge for it.
  • The breakfast buffets are the best thing ever. I just wish they'd make the scrambled eggs a little drier.
  • We watched Frozen in the Buena Vista while in port at Nassau. It was by Simon's request. For as much as I've seen that movie, I was surprised at how much I had seen and heard for the first time. I think they have a 4k projector, because I couldn't see a pixel.

Life is like a backlog

posted by Jeff | Tuesday, May 6, 2014, 10:54 PM | comments: 0

I've been basking in the afterglow of our third family cruise, which happened last weekend. We did it this time with our friends from Chicago, and we had an epic good time. In fact, I had the single most fun day on a beach ever, which is saying a lot because I'm not a beach fan. I keep reminding myself that I need to blog about the experience, because it's worth writing about.

The truth is, I haven't, because it hasn't been a priority. Writing in general hasn't been a priority, and while it bothers me, it's one of a number of things (like watching movies, learning about new things, exercising more and other personal issues) that I simply haven't placed in the right order of things. A friend of mine was asking today about how you balance all of this stuff, and I realized that I don't follow my own advice. When my life was more, to be kind, turbulent, I wrote about and thought about life balance all of the time.

In the software world, specifically where we do things in an "Agile" fashion (capital "A" because it's sort of almost a proper noun), we look at all of our work and put it into a backlog. I happen to think that you don't even bother differentiating between kinds of work. A task to implement a feature goes right along side of a bug. We prioritize the backlog, and decide what's most important. Then we look at a given period of time, maybe it's a week or two, and schedule items from the backlog into that period of time (often referred to as an iteration or sprint). For the most part, we predictably get the results we were looking for when we're done.

Life is surprisingly like a backlog. We all have a finite amount of time to do stuff. For the most part, I think people figure out what they can do in any given amount of time. Where we do not succeed is in the prioritization part. We get too fixated on certain categories of tasks in our backlog. Some people believe that even the smallest detail at work requires full attention and extra time, even if it's something that in reality could be cast aside or handled by someone else. Others put every moment into their children, missing out on time with their spouse or other family. Still others may disappear into a life of leisure activities while nearly everything else is neglected. None of these scenarios has a positive outcome.

I'm not suggesting that we have to plan out every "iteration" of life. I'm actually suggesting that we live more in the present and find a balance between the things in our life backlog. The risk of being one-dimensional and focused on a narrow part of life is high if we don't step back and look at how we spend our time. If you turn 50 and look back, do you want to have the realization that all you did was work? You ignored your needs entirely so you could provide for a child? You partied and ignored your professional life? None of these extremes are necessary, but it seems like I encounter people all of the time who lacked this balance, and they can't get that time back.