Archive: June, 2014

Suppressing FormsAuth redirect when using OWIN external logins

posted by Jeff | Monday, June 30, 2014, 10:53 PM | comments: 1

This is probably the most specific post I’ve written in a long time, but given how long I let it fester, and how much debugging it took to figure out, I figure it’s worth saving someone the time. Last fall you might recall that I did a little bit of reverse engineering, and some cutting and pasting of source code, to use the OWIN-based external authentication stuff, decoupling it from ASP.NET Identity. This was a pretty exciting win for me because I was completely not interested in using yet another auth system in POP Forums, when the one I had was already pretty simple and embedded in some of my own projects.

When I integrated it into CoasterBuzz, it worked like a champ right away. Then I went to add it to another project I was working on, and it didn’t work. For reasons I can’t explain, the new project was forcing a redirect to the forms auth login page (which defaults to /login.aspx), and putting a referrer in the query string to /Forums/Authorization/ExternalLoginCallback, which was the intended callback URL. I was completely stumped, because obviously the forum assemblies were exactly the same on CoasterBuzz and the new project. I first assumed that it was some kind of routing problem, or maybe an ordering problem in the OWIN and other app startup pieces. I got exactly nowhere going down this road.

With fresh eyes, having not gone back to it in several months, I started to wonder where exactly the redirect was occurring. The MVC pipeline is a weird mix on top of ASP.NET, and while FormsAuthentication is certainly a construct of the ASP.NET days, it’s silly easy to use it in MVC. Instead of using HttpModules for plumbing in WebForms, I use action filters in MVC. One of the super convenient things in POP Forums is that you can set that filter to apply to every action in your app, and then opt out certain methods with a different attribute (think actions that return data like images). Thinking about all of that, I still assumed it was code specific to the external login magic.

What I could see is that execution got as far as the ExternalLogin action in the Authorization controller. That created a ChallengeResult instance, which I “borrowed” from the original source. What goes on beyond that I couldn’t tell you, because it’s in one of the Owin libraries, and I wasn’t brave enough to go digging there. All I knew for sure is that this was the last code to execute unless I ripped out the authorization element from my web.config, and that led me to believe this was ASP.NET getting in the way.

After much searching on various keywords like “formsauth redirect,” “override,” “prevent” and finally “suppress,” I found that HttpResponse gained a new property in v4.5 called SuppressFormsAuthenticationRedirect. It does exactly what it sounds like it does, and this fixed my problem. Setting this one property in the context of that “borrowed” ChallengeResult did the trick. The new project will bounce you through to Google or Facebook or whatever to login, as it does on a “naked” instance of the forum app. Life is good.

Not one of my proudest debugging moments, but I’ll sleep better tonight!

Nap time

posted by Jeff | Monday, June 30, 2014, 11:15 AM | comments: 0

Yesterday afternoon, Simon was climbing all over me, which usually leads to one or both of us getting hurt. I flopped down on the couch, and he asked to lay down with me. Like a switch, he turned off, and we both went to sleep.

These moments are pretty rare with a kid that likes to be moving most of the time, and they will only get more rare as he gets older. I'll take it.

Chicken and waffles

posted by Jeff | Wednesday, June 25, 2014, 10:41 PM | comments: 0

Back in the day when we were living in Snoqualmie, going on three years ago now, I made my first attempt at making chicken and waffles. Knowing that we didn't have a waffle iron at the time, I picked one up at Target for $10, maybe less. I had seen a recipe on the Internet for using the pancake mix as the primary component for breading the chicken. It was kind of a disaster.

I tried again at some point after moving to Orlando but before moving into the new house, and it was better. My BFF came over for dinner tonight, so I decided I would try and cook again, and decided the time was right to try chicken and waffles again. Based mostly on advice from Diana, this time it was an enormous success.

First off, she did her classic marinade, for which I don't even know the components, but added a healthy dose of Chipotle and Berbere seasoning from Penzey's. If you are unfamiliar with these masters of seasoning, and you don't have a cupboard full of their stuff, leave this blog and look it up right now. They're amazing.

Then I did a three-step coating. The first was flour with more of the two seasonings, plus a splash of hot curry powder (because I love how it smells). Then into the egg, though I actually used "beaters" instead. Finally into panko bread crumbs, though I added a little shredded cheddar cheese for fun. I think next time I would rather use some finely grated stuff instead, maybe even parmesan for a saltier flavor.

Into the oven it went for about 25 minutes at 400 degrees. We have a fantastic waffle iron (I tossed the shitty cheap one from Target years ago), which was rated tops by one of the organizations that rates such things. All told, it was a slam dunk. It was hot, too... but had really outstanding flavor. The only thing I didn't like about it was the color. The panko doesn't really brown when you bake it, so that's slightly unfortunate. Otherwise, it was the tits, and I can't wait to make it again.

Emotional eating

posted by Jeff | Tuesday, June 24, 2014, 10:25 PM | comments: 0

I know I'm getting back to a more sensible place in terms of eating when it's getting late and I'm already thinking about that leftover turkey burger for lunch tomorrow. It means I'm in that groove that leads to better decisions as a mode of daily lifestyle. I've been there before, and I know how I slip out of it, too.

In this case, I think I scared myself back into the groove. In purging some of my boxes of crap, I found a photo of myself from around the turn of the century that was, at the very least, not flattering. It was clearly from the time that I weighed about 30 pounds more than I do now, and that 30 pounds is pretty dramatic. I don't think I'm at risk of going back to that, but I do see that my old habits can be scary.

It's not really the weight that concerns me (though I'd be perfectly happy to shed another 20 pounds or so), but more my level of fitness. Prior to my realization around weight and fitness back in 2005, I would get winded going up stairs. I would play volleyball with the kids I was coaching, but I couldn't keep up. What a difference it made the year I did the high school season at The Elms. I couldn't believe how long I could play or how high I could jump, because I was focused on eating less and being just a little more active.

In the years since, I've been up and down a bit, but never back to those dark days. In Seattle it was warm enough to be walking about year-round. When I worked remotely, I played tennis. When I moved to Florida, well, how can you not be active outside when it's sunny almost every day? Getting a FitBit made me even more self-aware.

While I've stayed active enough to be able to log 10 miles around a theme park in any given day without being tired or hurting, I haven't been keeping honest about eating. I'm an emotional eater, and I know it. When I'm stressed, anxious or lonely, I throw portion control out the window. I actually feel intense sensations of joy when I hold a burrito in my hand or tear through a half-dozen boneless wings. I did that quite a bit starting in February, because of all the drama around the house and, for completely irrational reasons, my job search. Now we're getting comfortable in our house, and I'm in a full-time gig, so that has passed. (I still need to prove I don't suck, but I think I can do that.) I'm getting the mental bandwidth back to say, "No, stupid, you can't have a McHockeyPuck for breakfast, a burrito for lunch and chocolate covered chicken wings for dinner and expect to feel healthy."

Knowing that I'll go out for lunch a lot less will certainly help me a lot, too. If there's one thing that works for me when telecommuting, it's that I rarely miss breakfast, and I don't eat out as much. It does require being proactive about physical activity, since you don't even walk to your car, but I just need to find that groove.

Simon's therapy

posted by Jeff | Sunday, June 22, 2014, 7:57 PM | comments: 0

Getting Simon in school five days a week last year was probably the best thing ever for him. His teacher was really wonderful and patient, and we saw a lot of improvement in his learning ability. Next year we're likely to put him into regular preschool as well as the developmental delay school, making for an all-day thing. I'm a little worried that it might be too much for him, but we'll see.

Part of the journey in understanding what resources are available involved a few therapy options, and we settled on one that involves two hours, twice a week, at home. This ABA therapy is interesting because the therapist is looking for ways that Simon specifically responds to his environment in order to build constructive behavior. Remember, one of the problems with autism is that kids don't rationalize or respond to their environment in the same way other kids do. They don't have the same motivators either, so while a lot of kids may ride a bike or brush their teeth because they know it will please someone else, those more typical motivators aren't there. The therapist finds ways to get him to respond.

This therapy isn't cheap, and I'm dreading the bills that are forthcoming (I've only seen the insurance rejections so far, which we expected). Still, even after less than two months, the outcome of this therapy has been nothing short of amazing. The thing that I've gained the most is that parenting on instinct doesn't work very well because your instincts assume a certain mode of thinking. Understanding the alternate mode that Simon works in makes it easier to act and respond in a less emotional way that actually helps him.

I'm not going to lie, I don't have a huge role in any of this. The research and vetting of services is all Diana. I don't know how any parents that both work could ever manage this. All I can do is act on the findings of the therapist. Last week was interesting because I was home while she was here, working from my office. I could kind of hear how she worked with Simon, and this was the point where it was so obvious that she's worth every penny.

I think at this point that Simon is going to grow up to be fully functional, and potentially awesome. He exhibits certain cognitive abilities that are pretty fantastic, especially in areas of retention, and more and more in spatial observation (the latter of which he doesn't yet apply to play, but I think he'll get there). My biggest concern today is him starting regular school on time. Screw these parents who want to "redshirt" their kid so they have some bullshit "advantage" in school. I want my boy to be on time and go from there. The next six to nine months will be critical in that respect.

The biggest relief I have right now is that Simon is engaging in imaginative play in ways he never has before. Whereas he used to just park and organize cars, now he's starting to "drive" them. And for better or worse, he responds to Disney World activities in aways I would not have guessed. He sings the song from Journey Into Imagination, he plays with his monorail to simulate stopping in the hotel and picking up passengers, he opens and closes imaginary doors at our stairs... this all came up in the last month or two. It's really awesome.

I hope beyond hope that Simon's future is really one of those circumstances where his different wiring actually benefits him instead of completely hindering him. My enthusiasm for that outcome is sometimes tempered by the emergence of some of the more stereotypical behaviors, like the meltdowns, shutdowns and hand flapping, but at least he hasn't shown any real desire to withdraw and stop talking to people. In fact, he can order food with authority in a restaurant, and randomly says "hi" to kids at theme parks. That's encouraging.

The indie publisher moving to Azure, part 2: operation

posted by Jeff | Saturday, June 21, 2014, 12:21 AM | comments: 0

About a month ago, I wrote all about my experience migrating my sites off of dedicated hardware and into Azure. I figured I would wait awhile before writing about the daily operation of those sites, so I could gather enough experience to make a meaningful assessment. As I said in the previous post, this is a move that I was looking forward to make for a good three years or so, when I actually worked with Azure from within Microsoft. The pricing finally came down to a point where it made sense for an indie publisher, and here we are.

A lot has happened in the last month, which is remarkable when you think about it. They're moving pretty quickly at improving the service and making it better. They even fixed the scheduler problem I described last time (it was a problem with the portal). In a general sense, I've found it very stable outside of the problem I'll describe, but the database billing is screwed up. I'm finally to a point where I can stop watching it and trust that it works as intended, and there are definitely some pluses and unexpected savings.

So let's get the negatives out of the way. PointBuzz was crashing in a completely weird way. Basically it would just stop responding entirely. The logging didn't show anything, and there weren't 500 errors, and the browser would just hang out and not ever get anything back from the request. Also weird, while it would do it at any time of day (including during the great water main break at Cedar Point, a key time for the site), I saw it die several times during the 11 p.m. hour, which sure seemed not likely to be a coincidence. The only thing that I could think of that made it different was that the site ran on v3.5 of .NET instead of v4.5. After being frustrated with the people who handle billing support (tech support is an upcharge, which is a real problem when there's a real platform issue), I expressed my frustration to someone very high up the chain at Microsoft because I didn't know what else to do. He put me in touch with some people who looked deeper. They didn't find anything either, though they did observe that turning on the diagnostic functionality didn't work on any v3.5 site. That reinforced my theory that the framework version had something to do with the problem.

While the folks at Microsoft were looking into things, I refactored the site to run on v4.5. It took a few hours, but I eventually got it working. I redeployed, configured it for v4.5, and it hasn't had a single issue since. There's no resolution to the v3.5 problem that I'm aware of, but if you have something you want to put in Azure Web Sites on that version, I wouldn't recommend it.

The other problem that I can't explain is the database pricing. It's bad enough that they use a completely arbitrary "DB Unit" in the billing, but what's really frustrating is that with the deprecated-next-year Web/Business tiers, the amount they're charging me doesn't match what the pricing is supposed to be. As you may recall from the previous post, I tried to import the data originally into the newer Standard tier, but after several hours on a test run, it was getting nowhere. I settled for the old tiers, but the pricing makes no sense. According to the pricing details, CoasterBuzz should be priced for 10 gigs, at $45.96. And yet, after 24 days, it's already billed $67! What's that about? I'm going to file a ticket for it, but I don't expect any positive outcome.

Two good things since the SQL migration: They have improved the performance of all of the new tiers by a factor of five, and just as I started to write this, I noticed that you can finally migrate the old Web/Business tiers to the new Basic/Standard/Premium tiers. That means the big databases for PointBuzz and CoasterBuzz will be a flat $20/month, up to 250 gigs in size. The price doubles in a year, but I suspect the pricing will see drops anyway.

So for the first full month, I'm trending toward a total cost of about $190. If the new database pricing goes as expected, next month I think it will be around $130. The dedicated server I had was costing $167. My big fear about bandwidth turned out to be largely unfounded, because I never thought about the fact that my nightly backups to S3 were the reason I was pushing out around a terabyte every month. Now I'm backing up to storage within Azure, so that bandwidth cost goes away. I'm only pushing 150 gigs outbound.

There is a lot of goodness that makes this effort a lot more redundant, and I think this is where some of the greatest value is derived from using a cloud platform. First of all, the storage is already locally redundant, meaning the data is copied to another disk somewhere else in the data center. I also have the geo-redundancy enabled, meaning it's also copied to an entirely different data center in another part of the country. Right now I'm mostly using storage for nightly database backups, and I'm paying about $2 for almost 30 gigs. I could turn on geo-redundant with read-only access to the other regions for another dollar, if I wanted total overkill.

For all of my complaining about SQL Azure, it too is redundant without any intervention on my part. There are always at least two copies of the data, so hardware failures aren't something to really be concerned about. Then add in the nightly backups into storage. It's pretty solid. At some point they're supposed to add the ability to also restore back in time (via the transaction logs, I assume), but they haven't enabled it yet.

The Web Sites themselves I'm running on a small instance (1 core, 1.75 GB of RAM), using the standard tier. Not surprisingly, this is plenty of room because I write efficient code. :) Seriously though, the sites collectively serve a few million requests daily and CPU never goes over 10%, and the RAM usage hovers around 80%. I use the standard tier because for less than $20 more, you get a few SSL certificate slots, unlimited web sockets (the forums use this), automated backups, the scheduler, and probably my favorite feature, staging deployments. You can deploy to staging, and click a button in the portal to flip the staging and production sites. If it hopelessly fails, you're back up in two seconds.

There are other nice things too. Getting email alerts was helpful when the I had the PB problems (I have an alert to email two people when requests per 5 minutes goes less than 1). Endpoint monitoring gives me a good idea of response times from all over the world. WebJobs and queues are very cool new features, and I may likely use them in a future project. The free credits from SendGrid take care of the email connectivity. The various charts and graphs are cool. The new portal, in preview, shows promise but a lot of stuff doesn't work yet.

Maybe the most important question is: How is the performance? Generally speaking, it's awesome. Once the PointBuzz issue was worked out, it's also surprisingly consistent. CPU and RAM usage follow expected curves. The endpoint monitoring shows the PointBuzz home page with consistent response times below 30 ms from Virginia! CoasterBuzz varies a lot more, but I'm not sure exactly why. It still tends to clock in under 200 ms, but I need to look deeper.

Despite the problems, now I feel like everything is in a pretty good spot, and I'm pretty happy with it. The server in Dallas was solid, but having to maintain disk space and SQL logs and HTTP logs and all of that stuff got kind of old at times. I like the Azure platform because it takes all of that maintenance stuff out of your life, and instantly gives you tools and "hardware" if you need it. My sites aren't built to scale out (lots of local caching), but they could scale up if I had to at a moment's notice. As the TV commercial once said, "Yay cloud."

Car considerations

posted by Jeff | Friday, June 20, 2014, 12:32 PM | comments: 0

It's hard to believe it, but I think we're closing in on the time to replace Diana's car. As far as I can tell, there's nothing particularly wrong with it, or danger of some imminent failure, but it is over six years old. It actually has less than 40,000 miles on it, too. Maybe my concern is that the harsh Cleveland winters set something horrible in motion in terms of corrosion, and I want to head that off. Maybe I just don't like having older cars.

I know what I don't like, and that's having a car payment. We're only half way through our loan on the Prius V. I generally hate the expense of cars, and I'm not much of a car guy, so that makes me like spending money on them even less. Still, there's something to be said for something that is reliable and always works.

My best friend started dating a guy with a Tesla Model S. I'm not going to lie, I've been infatuated with that car since it was announced. Normally I associate expensive cars with people who worry about status, but that's not really the case with that car. Pretentious people may buy them, but mostly I think the market is nerds, gadget addicts and people who believe Elon Musk is like Tony Stark. (And yes, my friend's boyfriend is not pretentious at all.) I could probably buy one of these cars if I saved the way I did for our house, and it would make me happy, but this would fly in the face of my "experiences not stuff" modus operandi that I try to adhere to. I could go on dozens of cruises for that money.

I'm still interested in electric cars though, which got me to thinking about the Nissan Leaf again. The one I rented about a year ago was a lot of fun to drive. With its limited range, of course it's only good for in-town commuting, but I don't imagine that we would ever need both cars to be out on long distance trips at any given time. They have a lease deal right now where we could probably get the payment down close to zero with trade, but I'm not sure I would want to commit to three years. Last year they had a two-year that was more interesting.

The forthcoming 2015 Prius is interesting, if you believe the "spy photos" of the car that you can find on the Internet. They're doing a new drive train for it, and the rumors suggest that they can push 60 mpg out of it. The styling is a little more aggressive, though the overall shape won't change much, since that's part of what gives it such high fuel economy. It's probably kind of boring and safe, but I've been really happy with both of our Prii.

There's no real time frame we have to commit to, though obviously Diana's car isn't exactly appreciating in trade value. I'll be content to work something out this year.

Tackling my big boxes of crap

posted by Jeff | Friday, June 20, 2014, 12:27 AM | comments: 0

I've got four or five tote boxes that have traveled about 5,000 miles with me, and they're full of stuff that I've saved over the years. Keep in mind that I haven't added to them much in many years, I just haven't really thought about them at all. Today I was thinking about them because they're just taking up space in my garage, and I need less stuff in my life.

I went through two of them today, and tossed a ton of stuff. I had hand written notes from girls in high school, and autograph books from grade 6 and 8. That's 1985 and 1987, by the way. I actually had the remnants of my braces. What the fuck was I thinking? Not sure why I saved all of the issues of Rolling Stone from 1996 either. Some things I tossed despite being novel, like the envelope of letters sent by my grade 9 science classmates in Cleveland, sent after I moved out to Brunswick by my teacher. That was a hard transition, and it was a sweet gesture.

I found other things that I obviously would not throw away, like my high school and college diplomas, photos from grade school and little creative things I did. I actually typed up pages for a Voltron "choose your own adventure" style book, with illustrations. Can you believe that? No one gave a shit when I was a kid, but I was pretty proud of myself. I also found some audio carts that played stuff inside the defunct Richfield Coliseum, which I found as they were tearing down the building. My original Optimus Prime Transformer toy was in there too, along with a few other robots. Oh, there was a big stash of high school senior pictures too, which were a big hit on Facebook for "throwback Thursday."

I wonder why we hold on to stuff like this. Like I said, a lot of it I honestly didn't even realize I still had, but at some point in my 20's, I must have thought it was important. It's funny how we think about our past and how it links to our identity.

Why typical software design isn't common

posted by Jeff | Wednesday, June 18, 2014, 9:42 PM | comments: 0

As my contract gig ended, I started a new job where I've assumed the role of technical architect. It's a little like a cross between a development manager, development lead and traditional architect role. I'd like to think that it plays to all of my strengths, but I suppose I'll have to still demonstrate that!

In any case, the first project that I'm on is one that already exists. I think I can safely say that most people in development circles would prefer to just land on something totally new, because inheriting a project often means taking on a train wreck. Not so in this case. Everything is generally designed and laid out as I would expect it, using predictable and manageable patterns. It doesn't try to reinvent things, and it has mostly grown in a sane way. I still have the burden of acquiring a lot of domain knowledge and such, but I won't be stuck scratching my head constantly trying to understand what the hell is going on.

I complimented the previous TA, indicating that it was pretty easy to understand how the solution was set up in the bigger sense. What he told me is true: "This is just typical industry practice on this platform." He's totally right, of course, but why aren't these typical practices more common?

My opinion is that it's the usual education and experience problem. It's surprising how this kind of knowledge is not frequently shared, but I also suspect that it's partly because it isn't generally a solving a problem that people are thinking about. It's fairly typical to search StackOverflow for a solution to a specific problem, but I don't know if anyone really starts a project and says, "How should I build this?"

So how do people arrive at a place where they have this knowledge? For me, I can only say it's because of my experience and interaction with other people. This is obviously not ideal for the profession, because it's hard to say how one can encounter the right people and circumstances. In a general sense, sure, it's not uncommon for people in tech heavy markets to change jobs every 18 months, but that isn't the case everywhere. You also can't necessarily be sure about what you're getting into (though I would argue that you should be asking good questions in the interview process... it's still a worker's market in most places).

There are really two ways to solve this problem, from two directions. The first is to make sure that a company or development team has someone with these "typical" design skills. That might be a little tricky if the hiring manager isn't a technical person, but certainly there are a million staffing companies that want to help you with that. The other way to attack it is from the individual developer angle, by getting folks the information and mentoring that they need. This requires a certain level of self-motivation on the part of developers, but I generally have observed that they'll come along for the ride if you offer.

The unexpected gift of fatherhood: More self-awareness

posted by Jeff | Sunday, June 15, 2014, 8:59 PM | comments: 0

My general malaise for what I call "greeting card" holidays is well-known. This includes Father's Day. Since my parents split, I didn't see my dad all that often growing up, and my step-father and I were not really close (the reasons for which vary, and probably don't matter). While I did have father-like figures in a collective sense, I can't say that I have much of a blueprint for being a dad. It's possible that I overthink being Simon's father.

I think being a parent can be challenging at times no matter who you are or who your kid is. Some have it easier than others, but it's a lot like romantic relationships in that any two people with predisposed personality types have certain kinds of chemistry. With your kid, you get to shape that to an extent, but you also don't get to ditch the relationship if you grow tired of it.

The last year has been full of extra learning around ASD and SPD. It's understanding that many parents would be distraught over any kind of diagnosis like these, but honestly for us it was a sigh of relief because it enabled us to take concrete steps (well, Diana mostly took the steps) toward helping him. Developmental delays were present in some of his earliest checkups, and I'm grateful that Dr. Cargo Pants was so on top of things back in Seattle, when we got him into an early intervention program.

I spend a lot of time having to be a disciplinarian these days, which is likely true for any parent of a 4-year-old. His therapist continues to give us a framework to help him learn and understand his own behavior. The progress in the last year has been astounding. We're also lucky that while some stereotypical behaviors of ASD become more evident, others are absent completely, especially his social abilities (the kid can order food at a restaurant like a champ, which is difficult or impossible for many kids on the spectrum).

I don't think any of this is new information. I've written about all of this before. What I find most amazing is that I find myself relating to him. It's really intense. Learning about the sometimes subtle, sometimes extreme ways that he thinks differently brings me back to childhood with crystal clear memories. For example, when he plays with his trains, he gets his face right down there, watching the wheels move over the track junctions and opening or closing the gates. I can see him observing the most extraneous details about the way simple things work. I used to do that constantly. When he has what people often describe as an "autism meltdown," with no regard to the social context or a desired outcome, I feel what he's feeling because I've been there. (Yes, Mom... that time in grade 5 was one of these situations, I'm certain of it.) When I see him spending more time disassembling and reassembling certain toys instead of playing with them as intended, that was me.

I was never diagnosed with any flavor of autism, maybe because when I was growing up, anything less than the main character in Rainman was "normal." I'm not qualified to make that assessment, but it would explain so much about the way I grew up, likely fitting into that category of people who have many of the traits. I'm surprised at the number of artists who were thought to have some form of autism, and less surprised at the number of highly technical people on the spectrum (social dysfunction in particular isn't exactly rare in my line of work). In some ways, it seems like if you get the right combination of behaviors, one might even find them beneficial in adult life, even if it meant a lot of issues in childhood. This could also be me projecting, that my kid is going to grow up and be awesome, too, because frankly that's the only outcome I can imagine for him.

In any case, learning about the challenges that Simon faces gives me so much understanding about myself at that age, and maybe why I am the way I am. I try to teach him, and he constantly teaches me. I love that about him. The idea that you're charged with helping this small human being grow up to be a contributing member of society, and they can in turn help you achieve the same thing is a part of parenthood I never expected. It's awesome.

I am so ready for life to be boring for awhile

posted by Jeff | Friday, June 13, 2014, 4:53 PM | comments: 0

I think we've finally turned a corner toward a more mellow life for awhile. Truth be told, I'm all ready for boring routine.

It's kind of weird to think about some of my friends who have essentially lived in the same place with the same jobs for a decade or more. A part of me thinks, "How can they stand that?" I wonder if they ever wonder if they're missing out on something. They seem perfectly happy though, so who am I to judge?

So here we are, in a house we don't have to leave, and I'm starting a non-contract job. Simon will be enrolled in school again in the fall. Basically we have some kind of routine that we would really like to maintain for awhile. That feels good, but also slightly horrifying for some reason. Maybe because when you're swimming through chaos, there's always some destination in mind. That's less true when you have some kind of long-term routine.

I don't think I have a point, but living in the moment has been hard at times, despite having a lot of amazing adventures. Coming up on the anniversary of our move, I'm being all reflective and stuff. I could really go for a boring year.

The Naked and Famous: 6.10.14 at The Beacham, Orlando

posted by Jeff | Wednesday, June 11, 2014, 9:32 PM | comments: 0

Finally... I got to see The Naked and Famous last night. While they're not naked, and only a little famous, I've been eager to see them since buying their first album some time in 2011. I was familiar with the singles they had on AltNation (SiriusXM), but didn't actually buy Passive Me, Aggressive You until it had been out almost a year. It was instantly a favorite.

When they released "Hearts Like Ours" as a single last year, I was so stoked for the full album, In Rolling Waves. It was even better than the first. I honestly can't understand why they're not bigger than they are beyond the fact that the recording industry and its promotion is a mess, and people generally have poor taste in music. It could also just be that my tastes are often not compatible with others.

If I had to describe why I'm into them, it's because they blend a female vocal, electronic sounds, guitars, fantastic percussion, and a whole lot of noise into something that I find awesome. Many of their songs kind of build and build into this delicious noise.

I found out that they would be here in Orlando just a few weeks ago, and our friend and neighbor offered to watch Simon for the evening. We arrived about a half-hour before the time listed on the tickets to find that they weren't letting anyone in. We ducked into a little bar across the street from the Beacham, which is downtown on Orange. It was a cheesy little tiki bar, but ideal because it was virtually empty. At 8:10, we peeked outside to see they still hadn't let people in, and it was raining. Lame. We hung out there until 8:45 or so.

The Beacham was apparently a vaudeville theater when it opened nearly a hundred years ago, and then went decades as a movie theater. It's your typical standing room arrangement, with long stair ways down each side, and a balcony in the back. The balcony doesn't have a lot of room, but it's the kind of place I like to hang out to not spill my beer (though I did not have a beverage this time). It reminds me of the Odeon in Cleveland a little, may it rest in peace.

I'll be honest, I hate standing room shows. I've kind of outgrown them, I guess, which is to say that maybe I'm too old for that shit. Diana doesn't care for them either. If that weren't enough, there were two opening bands, which was also suboptimal because we don't do late nights very well. Probably because we have a child. I did enjoy White Sea, however. I didn't get the name of the first band.

The naked folk took the stage at 10:30, and played 14 songs in about 75 minutes. Obviously, with only two albums, there's only so much material to draw from, but the set made me realize just how much I like almost every song they have. In fact, they probably played my four favorite songs first: "A Stillness," "Hearts Like Ours," "Girls Like You" and "Rolling Waves." It was like I was out of breath in the first 20 minutes because I was completely blown away. They're so tight on stage, without it sounding "like the album." The two singers are great live. And the drummer... I guess I just took it for granted that it was all machines, but he was fantastic.

What's cool is that many of their songs lend themselves to live music because of that "building" feeling they have. "The Sun" starts out softly and has a constant vocal that works almost as a chant, with the noise getting louder and louder over it. Meanwhile, "Punching In A Dream" and "Young Blood" are crowd favorites that get the crowd singing along.

It's worth noting that their light show was pretty epic and imaginative for the relatively small number of instruments they were using. I haven't seen a good light show in awhile, and I really appreciate that.

Go see them if you get a chance, but buy both albums from The Naked and Famous regardless. I think they're really excellent, and they make the kind of music that you can just lose yourself in with headphones on.

Customer service is the opportunity

posted by Jeff | Wednesday, June 11, 2014, 3:32 PM | comments: 0

Despite last weekend's dreadful headaches, we encountered several instances of excellent customer service. I have to say that I'm surprised when someone goes out of their way to provide great service. I blame what I often call the "walmarting" of America, where people don't give a shit along as they can spend as little as possible. (And seriously, if you shop at Walmart, you're just adding to the problem.)

We've rented cars with Enterprise on our last two trips. Sure, they were the cheapest, but they're so crazy about treating you well, making it such a stand-out experience, that I would be willing to pay a little more if they did charge a little more. It's so night and day from the cattle mentality that I would get over and over from Alamo, which used to have a lock on pricing.

We also found ourselves in a Wendy's last weekend. I hate fast food, but given the location and circumstances, it was the best we could do. They had a person roaming the dining room, offering drink refills, taking trays and even getting condiments. It was pretty weird for a fast food place (certain "fast casual" joints not withstanding) to have someone like that, but I will remember it.

It made me think about the airlines. Air travel has become such a completely shitty experience that everyone hates it. They're not going to give you more room or start flying your bags for free, but it seems like there are places they could do a better job of making you feel welcome without breaking the bank. At least give everyone a free cookie or pretzels, maybe give them WiFi. At the very least, be nicer to people. That would certainly earn some loyalty.

My point is that in a sea of suck, where customer expectations are already low, service can easily be the differentiator that wins you more business. It seems so completely obvious to me.

Worst vacation ever, almost

posted by Jeff | Monday, June 9, 2014, 11:36 PM | comments: 0

Words can't really express how excited I was to go back to Cleveland for a few days so we could spend the weekend at Cedar Point. The primary motivation was to be there for the 6th annual Coasting For Kids fundraiser benefiting Give Kids The World, an event I co-founded in 2009 that has ballooned into this huge thing. My involvement these days is mostly just promoting the crap out of it, but especially now that GKTW is local to us, it's super important to see that this event keeps going.

The event is only one day, across all of the Cedar Fair parks, but we decided to make a weekend of it. Sure, we live next door to Walt Disney World now, but there will always be something special about Cedar Point. Some of our best times have been there (we actually got engaged on Giant Wheel), and we have a great many friends who work there, too. Really good people, and I'm a little jealous that they get to work there. Being there just feels like home. If that weren't enough, they comped us a room at the Breakers Hotel since we were up for the fundraiser.

As a total coincidence, Friday was also the annual Coastermania event, which includes tons of exclusive ride time for coaster nerds. And on top of that, it was also the kick-off party for Luminosity, their night time singing-dancing-light show. In other words, this had the potential for being the most epic weekend ever.

It got off to an amazing start. After we checked into the hotel, arriving late because of a delayed departure at MCO, we headed into the park. We immediately did two rides on Sky Ride ("the baskets," as Simon calls them), a lap on the carousel, and once around the Antique Cars with no waiting. Once the party started, we were treated to completely amazing food (including turkey that was crazy moist and covered in something spicy), and a wonderful supply of Columbia Valley Riesling. Met up with many friends I really miss seeing on a regular basis. Learned the details of what it takes to plan a WDW wedding, too (friends getting married there next year). Finally met the new GM in person. Diana and Simon snuck out of the social activity to ride Giant Wheel and one of the kiddie circular rides. After the party, Diana and I each got a lap on Maverick, which was running brilliantly. To top the night off, Simon and I took a spin on the new Lake Erie Eagles. He sort of liked it, but said it made him dizzy.

We left the park after walking down the beautiful new Gemini midway, and there were plenty of warm and fuzzy feelings (and not just from the alcohol). Cedar Point is just not something that can be replaced. But don't worry... I can assure you we're not moving back to Cleveland.

Saturday had no agenda, but despite the late night, we were all up by 8:30. I started the morning by posting a photo of the skyline as seen from our 9th floor window. It was a little weird that by 9:30 they weren't even testing Magnum. Another friend commented on the photo, asking if we had water. We did not.

By 10, we were at the beach gate to find they weren't letting people in because none of the park had water. The next hour would reveal a stream of bad news. The water main feeding the park had burst, and they decided to close the park. With no running water, you can't flush toilets, serve food or fight fires. Naturally that meant they had to evacuate the hotels as well. At that point, it wasn't clear what would happen for us as resort guests, but we decided to bail so we could get lunch. We packed our stuff in the car because it was unclear if the hotel would be open that night. It then took us an hour to get off of the peninsula. On the way out, we could see where the main was broken, at the corner of the main parking lot. We redirected down the chaussee to avoid the traffic on Cleveland Road, then backtracked to Perkins for lunch.

We had lunch at Chet & Matt's, which might be our favorite pizza joint anywhere. They were slammed, but aside from a brief moment of emptiness, the buffet was stocked. Their chicken alfredo and hot wing and cheddar pizzas are amazing. The dessert pizza is yummy as well.

While Diana was doing the Ask-a-Mom panel thing for Great Wolf Lodge, we got to know the GM at the Sandusky location, and of course she's an Ashland Eagle, so we have that in common. We told her we would be in town, so she graciously left some day passes for us to use the water park there. This turned out to be a perfect arrangement, because we had no where else to go. They didn't have any rooms, unfortunately, because it was bike week and there was a big fantasy convention down the street, but we were able to spend a couple of hours there while I gathered information.

By 2:30, they made the call that the hotels would be closed until Monday afternoon, because getting them up to pressure and tested was not going to happen quickly. Shit. We just became homeless. By 5 they would also announce that the park would be closed Sunday as well. Double shit... no Coasting For Kids.

While at GWL, I booked a hotel where our friend from GKTW was staying. It was in Vermilion, 20 minutes away or so, but on the plus side we figured it was also close enough to Cleveland to show our friend a good dinner at the Winking Lizard. When we got there, they had no room. Somehow, the Holiday Inn Express site hosed me and changed the dates. The hits kept on coming. Just as we were about to try and find something else, someone called to cancel, and we got their room. It was a king, so all three of us had to pile in there, but despite being suboptimal, it was functional.

I helped get the announcement out of the alternate plan options for C4K participants, and we resolved to go out and do something for Sunday. Our first idea was the Toledo Zoo, which at least had a carousel and a train. Simon was struggling to understand why we couldn't just go back to Cedar Point, and even as he was going to bed, he kept telling us, "We'll try to go to Cedar Point tomorrow." Honestly, this was the most heartbreaking thing. The whole situation sucked, and it couldn't be helped, but at least as an adult I can process it. He had a harder time. Seeing your kid upset sucks.

We woke up to a total washout. The zoo wasn't going to happen. One could argue that the event at the park would have been crappy as well, but at least we would be at the park, and could see some shows. That, and we would retreat to our view of the park at the hotel there. I figured we could try the Great Lakes Science Center. At the very least, we could spend a few hours there doing inside stuff.

Admittedly, it was kind of neat to be in downtown Cleveland. I didn't know this, but they apparently moved some of the more important artifacts from the NASA visitor center there. That makes a lot of sense, because as a stand-alone attraction it was struggling at the actual research center near the airport. Security was ridiculous, too.

While there, Simon had two meltdowns when we had to physically carry him out of the play area with the rubber balls. These are becoming more frequent and more scary, and they're starting to resemble the more stereotypical ASD meltdowns we've read about.

Since we were in Cleveland, and it was still raining, we thought that maybe we would try to get some lunch at Melt in Lakewood, since it was on the way west back to the hotel. Despite getting there at 3:15, they still had a 40 minute wait. Shit. We weren't destined to do anything we actually wanted to do this weekend. There was no way Simon could wait that long given his state. It might have been repetitive, but we went down the street to a different Winking Lizard and sat right down. Simon peacefully played with his cars, and reached a bit of a zen place. Incidentally, our original plans were to visit the Brunswick Lizard on Friday so we could see my favorite bartender ever, but that didn't happen because of United's massive delay.

We retreated back to the hotel by 5, and honestly were feeling generally defeated. Simon had one more meltdown over I don't even remember what. He spent a good 90 minutes in bed talking to himself and not sleeping. He didn't get to sleep until after 10.

Cedar Point announced that they would definitely be open Monday, and we resolved to do whatever it took to get three good hours in the park. The massive shitstorm had to end.

First pile of awesome: I was able to claim the Fastlane pass earned from my fundraising efforts. I got the call on the way to the park, and this was well-timed because I don't think we'll be back to the park this year. Later that morning they decided to reschedule the Coasting For Kids riding out a couple of weeks. They totally didn't have to do that, but they did it anyway. I won't be there for it, but it's still great.

We got to spend about 20 minutes talking to our friends in marketing, which wasn't long enough. Honestly, they're busy people anyway, and just got through a crisis, but I selfishly wish there was more time. I miss those people.

Once in the park, we only had time to use Fastlane for two rides (GateKeeper and Giant Wheel), but anything helped. Love GateKeeper, even though I haven't been on it in almost a year. It's a serious winner. We did sneak in some fresh-cut fries, and they were delicious. The 10% off discount for passholders makes so much more sense this year. We ended up skipping grown-up rides to make sure Simon could get his fill after two days of disappointment and stress. He got to ride the cars and sub twice each along with the train in Planet Snoopy, Giant Wheel, Sky Ride, the Kiddie Kingdom carousel, Rub-a-Dub's Tubs (which should not have been operating as they were full of water and mufflehead filth), the CP&LE, Snoopy Bounce, Woodstock Express and two double laps on Jr. Wilderness Run Gemini. That's 11 rides or so in just three hours. It was so worth missing Millennium Force and other rides to see how happy it made him. He really misses Cedar Point, even though he gets to visit WDW almost once a week.

The drive back to CLE was uneventful, and it turned out that our friend Kaylee from GKTW got bumped up to our earlier flight. It's still completely weird to leave CLE and end at MCO as home, but it's all good. Cleveland was "cold" to us. Florida has made us soft.

The weirdest thing about all of this failure is that we initiated this trip on our dime for the purpose of charity fundraising. Shouldn't we have scored massive karma points? What started out as mostly just an airfare expense turned out to include two hotel nights and other attractions, and a whole lot of emotional injury. For 48 hours, most everything that could go wrong did. The odds of that happening seem impossible in retrospect.

Meh, shit happens. I get that. My expectations were very high for the trip, and came on the heels of a couple of really awesome weeks. Now that I've committed the fiasco to bits, I hope to just leave the middle part out of my mind and remember the end caps. The weekend ended up being about 80% suck, but it started and ended well.

What a weird last day in a theme park giant

posted by Jeff | Thursday, June 5, 2014, 9:52 PM | comments: 0

Today was my last day at SeaWorld Parks & Entertainment. It was weird. I'm not sure how else to describe it. I spent much of the last two days helping others get up to speed on things that I designed and/or bootstrapped, explained why certain things were best pointed in certain directions, and listening to a few rants about how things will go when I'm gone.

It was weird because I went in never having any expectation of the job ever becoming full-time, but I got really invested and really engaged anyway. That's unusual for IT contractors (it's apparently unusual for trades contractors too, given the shitty work they did on my house). It was a little different this time partly because it went so long, and partly because it's a business that I have a lot of passion for. Being a somewhat new company (they went public early last year), it felt like there was a lot of potential there to make an impact, and I'm proud of the work I did. Sure, it was frustrating to not have park access, and the context that went with it, but there aren't many businesses that combine theme parks, zoos, resorts, culinary, retail, etc. all into one entity.

As I left my desk for the last time, it was strange to think that I wouldn't be going back there again. Maybe a part of me felt like I wasn't finished. Maybe I just hated that I wouldn't see the people every day that helped me get settled in Orlando. I only half jokingly refer to our house as the house that SeaWorld built. What saved me from feeling entirely bad about it was the fact that my next job, which is an FTE gig, has so much potential.

Sometimes I don't think they get much respect, being the #3 player in town, but the company is bigger than Six Flags or Cedar Fair in terms of revenue. Universal is printing Harry Potter money, and Disney is spending on NextGen like it's the Obamacare site, but SEAS is still a fairly large player. I suspect it will go through a lot of cultural changes over the next few years, just because it has never been independent (and technically, I think Blackstone still has a controlling interest). The years under InBev sounded crappy, but the years prior under Anheuser-Busch seemed to be a lot better.

The thing that did get old was the people hating on the company, and bringing up the Blackfish movie. Seriously, I haven't seen it, but that's as much a documentary as Fox is news. I've met the zoological people, and they're good people who care very deeply about the welfare of the animals and conservation. It seems like they're saving a critter every day. No one is trying to exploit the whales while swimming in a pool of money like Scrooge McDuck. While one can't easily predict an alternate universe, I suspect the public awareness around oceans, dolphins, sea turtles and other animals would not be as strong were it not for the company. Mind you, I might be a little biased growing up in Cleveland, where we had a SeaWorld park.

It was a good year. I'm really happy that I had the chance to work there, even if it was just for a year. It wasn't always rainbows and unicorns, but it was definitely interesting and challenging work. I've certainly got the resume bullet points to show for it! Not only that, but my perspective is forever changed about the industry. I used to just be a deeply networked observer, but now I have enormous context from the inside. That's satisfying.

Coasting For Kids: I need your help!

posted by Jeff | Wednesday, June 4, 2014, 4:06 PM | comments: 0

I'm raising money again this year for Give Kids The World Village here in Central Florida. I'm one of the founders of the Coasting For Kids event, now going to its sixth year! GKTW is an amazing organization that hosts the families of kids with life-threatening illness for a cost-free vacation away from the doctors and hospitals. Diana and I have had the opportunity to volunteer there now that we're local, and it really is an amazing place. The smiles from the kids is obviously priceless, but it's equally satisfying to see parents who have never met see each other, and totally get each others' circumstances with little more than a nod.

Consider the seriousness of what these families deal with. There's a great story where a kid was visiting the faith-agnostic chapel at the village, which is beautifully decorated with a "sky" of clouds around the ceiling. That evening, when the parents went to tuck him in, his blanket was missing. When they asked the child where it was, he said he threw it up into the clouds at the chapel so Jesus could hold it for him until he arrived in heaven. That's the gravity of what these families deal with. They deserve a week of fun, and a chance to make great memories.

I set my fundraising goal at $1,000 this year, but I'm still a little short, with the deadline looming. If you could donate just a few dollars, every bit will help!

You can donate here:

Thank you in advance for your support!

Everything is awesome

posted by Jeff | Wednesday, June 4, 2014, 3:50 PM | comments: 0

I so need to see The Lego Movie.

I feel like I'm coming out of a stress tunnel or something. It's not that life has been overwhelmingly bad or negative, there were just a lot of things that added up to cause me to be a little tweaked out, a lot of the time. Getting the house to a final and definite place was awful. When it was clear that SeaWorld wasn't going to get the head count to make my job full-time, then I also had that on my plate. It wasn't an issue of finding work as much as it was finding work that I wanted. I'm pretty zen about starting the new gig because everyone at the company impressed me so much.

But there's a lot to feel good about right now. I'm wrapping up a year at a job that I'm pretty proud of. I leave feeling like I really accomplished some important things with lasting impact. I also learned to exercise patience in doing the right things, something I learned from my first boss at Microsoft years ago. I'm a lot more confident in my leadership ability, in part because I better understand how and when to collaborate. People have been very complimentary and even bummed out about my departure, which I did not expect. It's that thing where I might not need validation, but it sure feels good to get it anyway.

It's also an interesting time professionally, because the tools I generally work with are getting more interesting, and I'm really energized about all of the new stuff I can learn about. It's an amazing time to work in software. I feel like there are things that I can imagine that I can bring to life more easily than I could have even five years ago. For someone who loves to create, that's a big deal.

Closing in on the first anniversary of our move to Orange County, I feel surprisingly comfortable and at home here. I wish our social circle was a little more broad, but I have a small network of people to associate with from work, we have good neighbors, and of course my "bestie" lives here too. We can get around to things easily, we're learning about more places to go to eat and play, we're involved in a local charity, and I'm starting to get a little more engaged in what goes on with local government.

Similarly, we're feeling at home in our, uh, home. I get warm fuzzies knowing I'll be working from it much of the time. I'm not generally about "stuff," but I like that we have a great kitchen and comfortable spaces to relax and play. I can't predict that we'll live here forever, but I'm comfortable enough to not feel transient. I haven't felt that way in a long time.

More importantly though, I think I'm just looking forward to having a week off between gigs. This year was rough. I don't remember any time where I went a year without taking any significant time off. Much of it was due to the savings marathon leading to the down payment on the house, since not working when you're contracting means you're not getting paid. I was able to come up for air during the extended weekends for the cruises and our visit to Kings Island, but I haven't had a week off since before we moved. I've got ten days coming up where I don't have to think about anything work related at all.

I'm thankful for this pile of awesomeness right now. Life has its waves, for sure, and it's nice to be at the top of one for awhile. There are exciting new adventures starting right now!

Apple's pile of awesome: Programmed with crap

posted by Jeff | Monday, June 2, 2014, 11:43 PM | comments: 0

There is no question that Apple has changed the world, and its most important influence has been in just the last eight years. My first Mac landed on my desk at work in 1998 or so, for the purpose of editing video. Then in 2003 or so, Stephanie scored an iBook with a G3. OS X was pretty cool. When they switched to Intel in 2006 and I could run OS X and Windows, I switched. I'm on my 4th Mac laptop now, and each one has been my favorite computer. Then there were the iPhones that I loved (I had the original and the 3GS), and the iPods before that. I never got into the iPad as much, but I do have one, and I get how important they are.

But with all of these awesome shiny objects, the one thing that has been remarkable is how completely awful Apple's development tools have been. The underlying API's and class libraries are a little convoluted, but not terrible. It's the Objective-C language that is something right out of a previous generation. It's too low level at times, hard to understand, hard to read, lacks language features that others take for granted... it's just awful. If that weren't bad enough, Xcode, Apple's IDE (integrated development environment), is probably the worst programming tool I've ever tried to use. The interface designer in particular is strikingly bad.

To be fair, sure, my experience is not incredibly broad. I started with Atari Basic, then Apple Basic, then MS Basic, a little Pascal, a little Perl, and eventually Javascript, VBscript, Visual Basic (the .NET version, not "classic"), a little Java, and the language that has more or less sponsored my career, C#. I've dabbled and done some "hello world" stuff with Ruby and Python, but never anything serious. The IDE I know best is obviously Visual Studio, and particularly with the ReSharper plug-in, it's like delicious coding and debugging magic. I've also used Eclipse a little, and recently Xamarin Studio.

Still, I don't think I have a bias problem. I mean, I totally get why people love Ruby, and I mostly used Notepad in my experimentation with it! I don't go deeper with it because the work (and admittedly, the money) is where I already have better skills. If I had to concentrate on Ruby, that would be OK, because I don't think it sucks. Objective-C is entirely different, in a bad way. Look around the Interwebs for questions asking if it has generics or async tasks or anything else we take for granted, and you'll get horrible solutions that get way too in the weeds for things that a compiler should take care of for you.

"But Jeff," you say, "Look at how many people code with this, and how many millions of apps there are!" Well of course people are doing it... because it's where the consumers are! They frankly don't have much of a choice if they want to sell to people using this platform. The people I've talked to who live in this world daily aren't crazy about it at all, especially if they have experience with Java or C#. That's an anecdote, sure, but who cares? My opinion is still that it's a terrible language.

Not only that, but there's the amazing evolution of open source around other languages that blows the mind. Throw in package management, and you can get to real shipping products pretty quickly.

And that's where a glimmer of hope surfaced for a new direction. Apple today announced a new language called Swift. My first impression is that it's far better than Objective-C, but certainly not as evolved as other languages. I guess the best I can do is interpret it as a forward moving change. It doesn't look like Xcode is getting any better aside from a "sandbox" mode that allows for real-time execution, though that's the kind of thing that to me is better vetted with unit testing.

But hey, you can write "iCode" now in C# if you're willing to pay for Xamarin, so that's an option.