Archive: September, 2016

We really needed a good day

posted by Jeff | Monday, September 26, 2016, 5:45 PM | comments: 0

Parenthood has not been the most fun thing since Simon started school. We've had a fair amount of discomfort that involves some of the regular defiant 6-year-old stuff, and some ASD-related stuff to make it more interesting. He has been obsessively playing with the "rides" has has constructed across the playroom floor, and doing anything to break that focus (namely homework) causes him distress. Random routine changes, that flexibility problem, can set him off too. He had a mini-meltdown when a substitute bus driver went the wrong way. He continues to struggle with cause and effect, with consequences.

When Saturday rolled around, Diana spent the day getting her learning on, so that left Simon and I to entertain ourselves. It was a beautiful day, because Florida, and I figured we would go out to Disney's Hollywood Studios, because lately he seems to get a lot of joy from that. I scored Fastpasses for the afternoon, and didn't indicate we would go at all. I wanted to see how his behavior was for the morning. I was spending some time working on one of my projects as well, so there was potential for conflict if he wasn't getting the time he felt he needed from me. He was doing everything I asked and being pleasant, so before lunch, I told him we would go to DHS provided he ate all of his lunch (we've almost got the won't-eat-the-crust thing beat).

Knowing full well it might be a bad idea, I booked our first pass to be on Tower of Terror, or as he calls it, "the elevators." We've been trying to get him on that ride for probably close to two years, as long as he's been 40 inches. I told him about our other two passes... Toy Story Midway Mania and Star Tours... but didn't offer the big reveal until we were on the midway. I calmly explained that he didn't have to ride it, but if he did, I would take him to the Lego Store after we were done, and he could pick any sub-$20 set he wanted. I'm not proud of the bribery, but appealing to his sense of Legolove was a worthwhile strategic risk. To my shock, he agreed.

While in the short Fastpass queue, Simon indicated that he was "getting very worried," and asked if I would text Mommy after to let her know he did it, because she would be very proud of him. I did my best to distract him by pointing out how dirty the "hotel" lobby was, and the stuff in the "basement," and of course his most favorite thing, the ordering of the seats and rows in loading the ride. Yes, you bet the signs and instructions appeal to our ASD tendencies.

Not surprisingly, he loved the ride, and he couldn't stop talking about it. He talked the ear off of a cast member about it over at Star Tours, and I'm so glad that the pixie-dust-snorting people will indulge a kid like that. We had a little ice cream, where he was surprisingly zen about the melting and dripping in the hot afternoon. He got deep into what he saw as the mechanical aspects of Toy Story. He even (correctly) predicted which water fountain would be coldest. Indeed, that he could use a water fountain at all feels like a small miracle not possible six months ago.

He was shockingly flexible about where we sat on the parking tram, another frequent issue, and at the Lego Store, he found the set he identified as a "like" several months ago (I confirmed with the photo, still on my phone), and we quickly got out after he told the cashier all about his ride on Tower of Terror.

That evening, he slowed down a bit, and may have had a minor fever as he began fighting a sore throat, but there was no fighting over getting pajamas on or going to bed. It was, end-to-end, a good day. I don't remember the last time we had one of those.

If I could summarize parenting at this stage, it's the constant battle to both fight and encourage independence, while firmly keeping an understanding that you love your kid. And I know I trivialize our ASD experience as minor compared to those of other parents, but sometimes the singular focus and inflexibility, and especially the lack of empathy for certain social contracts, sometimes makes me think about the dreaded "n-word" (that is, "normal"). Simon is who he is, and that's a smart, loving little boy. Every kid has unique challenges, and I imagine every parent feels a little beat down from time to time. That's why I'm thankful when we have a really good day like we did on Saturday.


Adventures in load testing

posted by Jeff | Sunday, September 25, 2016, 1:33 PM | comments: 0

I'm at a point now where POP Forums is mostly ported to ASP.NET Core, and I'm super happy with it. I've done some minor tweaks here and there, but mostly it's the "old" code running in the context of the new framework. I mentioned before that my intention is not to really add a ton of features for this release, but I do want to make it capable of scaling out, which is to say run on multiple nodes. I haven't done any real sniffing on SQL performance or anything, but I noticed that I had some free, simple load testing available as part of my free-level Visual Studio Team Services account, so that seemed convenient.

I want POP Forums to be capable of running across multiple nodes (scale out, as opposed to scale up, which is just faster hardware). Getting it there involves a few straight forward changes:

  • Shared cache. v13 used in-memory cache only, but swapping it out for something off the box is easy enough. Since Redis is all the rage, and available in Azure, I picked that.
  • Changing the SignalR backplane for the real-time client notifications of updates. When there's a new post, we want the browser to know. Turns out, Redis does pub/sub as well, so I'll add that. It looks like it's almost entirely configuration.
  • Queued background activity. There are four background processes that run in the app, right under the web context. These are email, search indexing, scoring game calculation and session management. Except for the last of those, I had to do some proper queuing so multiple instances could pick up the next thing. It has been a solved problem for a long time, and wasn't hard to adjust.

The incentive to run multiple nodes isn't strictly about scale, it's also about redundancy. Do apps fail in a bad way very often? Honestly, it hasn't happened for me ever. In the cloud, you only need redundancy for the few minutes where an instance's software is being updated. I speculate that I've encountered this at weird times (my stuff only runs on a single instance), when the app either slowed to a crawl or wasn't responsive.

Writing a cache provider for Redis was pretty straight forward. I spun up to two instances in my Azure dev environment, and with some debugging info I exposed, could see requests coming from both instances. I had to turn off the request routing affinity, but even then, it seems to stick to a particular instance based on IP for awhile. More on that in a minute. I've started to go down the road of hybrid caching. There are some things that almost never change, chief among them is the "URL names," the SEO-friendly forum names that map to forum ID's appearing in the URL's, and the object graphs that describe the view and post permissions per forum. I was storing these values in the local memory cache ("long term") and sending messages via Redis' pub/sub messaging to both commit them to local cache and invalidate them. I think what I'm going to do is adopt StackOverflow's architecture of an L1/L2 cache. Cached data only crosses the wire if and when it's needed, but collectively is only fetched from the database once.

The first thing I did was run some load tests against the app in a single instance, using various app service and database configurations, and all of them ran without any exceptions logged. This was using the VSTS load testing, which is kind of a blunt instrument though, at "250 users," because it doesn't appear to space out requests. The tests result in tens of thousands of requests in a single minute, which wouldn't happen for 250 actual users unless they read really fast. If I set up just "5 users," using the lowest app service and database, it results in comfortable average response times of 49ms and an RPS of 35. That's a real life equivalent of 400-ish unique users in my experience.

App Service Database Average response time Requests per second
S1 (1 core) B (5 DTU's) 2.5 sec 261 
S2 (2 cores) S0 (10 DTU's) 2.5 sec 316 
S3 (4 cores) S1 (20 DTU's) 1.5 sec 522

Honestly, these results were better than I expected. That's almost 2 million usable requests per hour, and you can go higher on the database if you had to push more through it. The app service certainly had plenty of overhead to work with.

Next up, I switched to the Redis cache and spun up three instances. This is where things got... not great. The first problem is that I couldn't really do an accurate test, because the load balancing mechanism does not spread the load very well. It appears to route to the same instance based on IP, even when the routing affinity is turned off. When you're using VM's in Azure, the affinity mechanism has three modes, the last of which essentially round-robins the requests, even if they're from the same IP. I am not certain if there's any way to force this with App Services the way you do VM's. The bottom line is that I couldn't really test this across three nodes.

The second problem is that I was logging a ton of Redis timeouts. If the Redis call fails, I catch the exception and let the app read from the database (and further cause issues by trying to write the data back to the cache). I'm using the Stackexchange.Redis client. I left it at the default of 1 second to timeout. As best as I can tell from the exception, it's an issue with the client queuing up more requests than it can handle, because the resources of the Redis instance aren't even remotely stressed. The log entries indicate long queues for the client, in the thousands, even when I set it to allow asynchronous, non-serial responses. I'm still trying to work this problem. It seems strange that the client can't handle a large volume of calls. I can increase the timeout a little, but it still fails, and if you get to two seconds, you might as well be calling from the database. I'm sure going to the SO cache architecture will mitigate this as well.

Performance and scale problems are fun, provided you're working in a solid code base. I'm not sure I would entirely call POP Forums solid, because it really is an evolutionary mess after 15 years or so (from ASP to WebForms to MVC, with a lot of recycled code), but at least the various concerns are generally well-factored. This is all largely academic for me, because none of the sites that I run require enormous scale. I need to find someone to use the app in more extreme circumstances. Maybe I need to see if I still know anyone over in MSDN for those forums. Having worked in that code years ago, I know how much work it needs.


Healthy stages

posted by Jeff | Friday, September 23, 2016, 7:25 PM | comments: 0

I finally went to a doctor this week for what's supposed to be an annual physical. My last one was in 2012, so that's way too long in between. It's included in pretty much all insurance, so it's silly not to take advantage of it. Growing up, I saw a lot of doctors because I had that issue that many boys have where they don't go to the bathroom, and in holding it in stretch out their colon until it just seeps out crap. Nothing like involuntarily crapping your pants until you're 10. That soured me on doctors a bit. In any case, heading toward middle-age, certainly I need to be paying attention.

The good news is that there's nothing particularly unexpected. The blood work came back all normal. What isn't normal is the stuff associated with weight: LDL is a little high, triglycerides are a little high, blood pressure might be a little high (I guess any one sitting isn't a great indicator, need more data). So while my BMI suggests that I'm too short, I can't really move that lever, and I have to move the weight lever. I haven't been very active the last two months. so none of the results are surprising. It has been a combination of work stress stealing brain cycles, Florida summer hotness and generally poor priorities. There isn't any mystery about the changes I need to make.

I've gone through a number of gradual stages in getting where I need to be. The first one came in 2005 with the life crisis of separation, flavored with consulting job dissatisfaction. The good thing that came out of that was "full-time" high school volleyball coaching, because I was burning obscene calories almost every day. I dropped almost 30 pounds that year. The next year or so I put about 10-ish back on. I blame dating. For someone untrained as I was in eating, you get comfortable when someone wants to play with your naughty bits.

Moving to Seattle and having a baby caused a fair amount of stress eating in the '09-'10 winter, but the weight gain was temporary. Moving to Florida in 2013 got me motivated again, because sun, and I got back down to my 2005 weight. I've been up and down from that point since, and only around 4 pounds over that right now.

Each of these stages of being healthier were rooted in long-term behavior changes. Before I ever started to get my shit together in 2005, I stopped eating beef. It wasn't some political thing, I just ate way too much of it, and not eating it at all I associate with feeling better. That was the year that I got portion control down, and to this day I can't eat too much without feeling lethargic. Since then I have over time been able to get certain things in moderation, like soda consumption. I still as a percentage lean too much on carbohydrates, because I love potatoes, but I never have packaged dessert food and rarely buy chips (and when I do, I put a few in a small bowl). I do like to knock down some Pei Wei or Tijuana Flats once a week, but I try to be reasonable.

The exercise side has been harder, because I hate exercise for the sake of exercise. I don't have an excuse. When it's not so damn hot, I will walk a couple of miles in the morning, and that's where I've fallen off the horse a bit. I also like to play tennis, but it's hard to make time for that, or I don't prioritize it. It should be easier with Simon in school. What I just can't do is go to a gym and exercise. It's boring in a way I can't reconcile.

So while my eating is pretty consistent, if not perfect, it's the physical activity side where I have inconsistent habits. The habits are getting better, just not in a wholly sudden way. I'm OK with that. I haven't been the guy wearing 38" pants in over a decade.


My state of coaster enthusiasm

posted by Jeff | Wednesday, September 21, 2016, 5:00 PM | comments: 0

I did a podcast interview at work today. They've been doing a series of these for awhile now, profiling various people in the company, I imagine as a means to build our reputation and brand. I think it's a good idea, because I work with some pretty great people, and collectively I think we're really good at what we do. But it got me to thinking about the podcast I used to do for CoasterBuzz. We stopped doing it about four years ago. I really enjoyed it, in part because it reminded me of the good old (poor) days of working in radio, and mostly because I got to virtually hang out with a very dispersed group of people that I've met over the years that I really enjoy hanging out with.

What I find interesting about that circle of people is that none of us are at the level of roller coaster nerd that we were then. Not that I've surveyed that gang, but I imagine that life has generally changed for us quite a bit, and so have our priorities. Some of us have kids, our interests have changed, and I think there may have been a fair amount of fatigue that set in. I was pretty hardcore about traveling to parks and what not in the early oughts, but as the decade wore on, I think there was a level of sameness. I know people who travel all over the world to hit as many rides as possible, but I'm barely motivated to visit the next state for something not that different from what I've been on before.

Even when we were doing the podcast, we had more fun talking about stuff in the peripheral, about the business and travel and often things that were completely unrelated. The deep fascination with the rides themselves isn't there, because again, sameness I think. When I actually spent a year working for a theme park company, there weren't really any big surprises, having observed them for more than a decade, but even when it's something you're passionate about, it's funny how you don't necessarily want to take it home from work.

The other thing is that the community got weird. I mean, it was always weird, but I'm talking a different kind of weird. When I was all giddy about the construction of Millennium Force in late 1999, I hung out with a bunch of dorks that would meet up at a park, ride a bunch, have some beers and share excitement about whatever was going up. A few years later, all that seemed to matter to people was the perks they thought they deserved as members of clubs, and people counting how many rides they had. Online community was even more weird, and the attention I got for running sites made me uncomfortable in the way that stalkers showed up at my radio appearances back in the day. I never wanted to be the CoasterBuzz guy, I just wanted the site to be a thing people liked to use.

What about the sites? PointBuzz (then Guide to The Point) was something I started in order to share photos and content. Regardless of the time and effort we have to devote to it, I'm sure Walt and I will keep it going indefinitely, with peaks and valleys of improvements (I think our second version famously took five years). That thing has been around for 18 years! CoasterBuzz has shifted in purpose many times. In 2000 I wanted to rule the online community. By 2005, I got tired of generating content, and apparently so did everyone else because the hundreds of niche sites went away. That was the year that ad revenue peaked. In 2010, my interest in maintaining community was probably at an all-time low (I was just-married, had a child, moved cross-country, started working for MSFT and had two houses to sell), but the site was still a proving ground for technology to me. By 2013, my interest returned, but I didn't feel like I could ethically commit to it while working at a theme park company. Today it's back to a proving ground, largely for my open source project, but it sees 50% more unique users than it did in 2010 (go figure), and ad revenue has stabilized, even if it's a third of what it was in 2005. Outside of the software, I doubt I average more than an hour per week maintaining it, so there's no reason to stop.

I still love roller coasters, of course, and I'm hoping that Simon also latches on to more of them now that he's 48-ish inches tall. I can see getting back into it as he gets older. For now, I feel like life is pretty full, in a good way, but not likely to include a lot of coasters beyond Big Thunder Mountain Railroad. I think I got into it for the people, and while the riding may not be as frequent, I still know all of the people.


Food & Wine is our new fall tradition

posted by Jeff | Friday, September 16, 2016, 9:07 PM | comments: 0

While there were not a ton of things that I liked about living in Northeast Ohio in the final years I was there, especially after Seattle, there's no doubt that Halloweekends at Cedar Point was pretty much the best thing ever. Fall Friday evenings at the park were magical in a way that I couldn't quite explain. It wasn't the attractions, per se, but the combination of good friends, the cooler weather, the color in the trees, the decorations and the smells associated with that time of year. We loved it.

Now we're entering our fourth fall in Orange County. I'm sure that I don't have to tell you that Disney does fall stuff as well. A lot of it is the decorations, and they do have a special extra-ticket event in September and October at Magic Kingdom, but we've never gone. The cruise line is also doing Halloween stuff, and we'll do that again this year. What we do enjoy, to an extraordinary degree, is the International Food & Wine Festival at Epcot. This may illustrate completely how my priorities have changed, but the bottom line is that this may be one of my favorite things to do in the fall. This year, the event lasts a full two months!

Weather down here doesn't feel like "fall" in the Midwest sense until late December at best, and that's OK. F&W is obviously mostly about food, but as much as I dislike crowds at theme parks, there is definitely a certain enthusiasm and energy at Epcot during the festival. Much of the food is the kind of thing you can only get at fancy restaurants, and while there aren't a ton of things I'll eat (because I don't eat red meat), there are about a half-dozen main course type foods that I do enjoy. Then pile on the drinks and desserts, and I'm a happy camper. If that were not enough, the music lineup gets better every year. This year there are at least five acts that I want to see, chief among them is Toad The Wet Sprocket, which I have not seen since the late 90's, and they were one of my favorites.

Not only is this year a longer festival, but they've added a ton. There are several completely new pavilions, including one that does exotic chocolate desserts, and the overall drink selection is extraordinary. Way more ciders this year, as well as hard soda floats. There's little question that I will piss away a lot of money this year (pun possibly intended).

One of the best things, and this is how spoiled I am, is that it's a pretty easy lunch outing. With Simon in school, Diana and I can run out there for lunch, and be back in 90 minutes without feeling particularly rushed. When work isn't super busy, it's easy to do this. That's a nice lifestyle perk for where we live.


The delicious hard orange soda float


Chocolate raspberry torte, and nitro chocolate and almond (without the almond) truffle. The truffle is actually chocolate mousse dropped into a vat of liquid nitrogen, then smashed on the plate and drizzled with caramel sauce.


Embracing chaos, letting go of control

posted by Jeff | Wednesday, September 14, 2016, 1:51 PM | comments: 0

"The kind of control you're attempting simply is... it's not possible." - Ian Malcolm, Jurassic Park

One of the great themes of that first dinosaur park movie is one about the conflict of chaos and control. The two things are by definition at odds. Nature and the environment are influenced by many variables, and when you add the input of humanity, it gets even more chaotic. The beautiful thing about complex systems is that it's so hard to predict an outcome, let alone control it.

Life itself is very much a complex system. I've been very contemplative of life lately, something I tend to do every few years, and it's remarkable to think about how one thing or another set off a chain of events that led to where I am. It's even more remarkable to think about how one different little thing may have produced a radically different outcome.

This crazy amount of chaos is one of the reasons that I think it's important to embrace chaos. We all have things that are within our control, but many more that we do not. I think we can get into ruts where we are constantly fighting the chaos to assert control, and we're not really free from it until we let go a bit. I can't imagine being a super Type-A personality, because like Jurassic Park, the kind of control they attempt simply is not possible. I think if I were to generalize about Type-A people that I've known, most are miserable. Imagine if they could embrace the chaos a bit, let go of the control.

Embracing chaos doesn't mean that you simply wander about the earth aimlessly. Just the other day I wrote about mastering your own destiny. What I'm saying is that you might be able to check all of the boxes of what you believed you must achieve, and life will likely still be kind of a messy and chaotic thing. Exerting control has its limitations.

It's probably hard to see how the chaos impacts your life at a young age. When I look at life in 5-year increments, and I've had four since college now, I get it. I could not have foreseen much of the important details of my life five years prior to those milestones. I mean, not even close. Five years from now, I know that I'll be five years older, and hopefully I will have saved a little money, but I can't predict much more than that. It's not for a lack of desired control... I have goals and aspirations... it's just that chaos will intervene.

The old interview question about, "Where do you see yourself in five years?" is total bullshit. It doesn't matter. It won't likely turn out like that, and frankly the reality is often just as good or better.


Robotic pragmatism

posted by Jeff | Tuesday, September 13, 2016, 11:13 PM | comments: 0

Reading the tech sites, I was enduring my annual surprise that people are willing to spend $650 on a phone every year. I commented about it on Facebook, and a friend of mine, who is probably right about this sort of the thing a lot of the time, suggested that I was "developing an almost robot-like pragmatic view on life." I chuckled, because it isn't far from the truth... sometimes.

Sometimes, I say, because given the stupid car that I have and my obsession with cruises, I'm obviously not pragmatic with everything. Come to think of it, the same friend helped me rationalize the car by suggesting it enabled memorable experiences, and therefore does not contradict my "experiences not stuff" m.o. I'm also free wheeling with cash when it comes to charitable giving, buying a friend lunch, tipping high and generally disregarding the cost of any leisure travel. No roboticness there!

But for whatever reason, yeah, there are certain categories of things where I enforce a realistic and largely data-driven view of the world. The phone thing, that's just a perception that it's wasteful, that the annual expense doesn't make life $650 better. That's weird of me to say, because God knows I've been known to have a gadget problem. But if I wasn't driving electric vehicles for science, I'd be content to drive a sensible Prius. I don't need a bigger house, either, even if I could afford it. Ikea furniture is perfectly functional to me. Working remotely is efficient.

I wasn't always this way. I'm pretty sure it's because I messed around a lot in my 20's and made poor decisions, and now I'm trying to overcompensate for that. In my head at least, I've acquired enough data and seen enough to make what I see as logical decisions. I suppose I need to remember that such pragmatism is what put me back in Cleveland, and we all know that was a terrible idea.


Being outside more

posted by Jeff | Tuesday, September 13, 2016, 10:45 PM | comments: 0

Diana was quite literally wrestling a quilt that she's been working on tonight, so I figured it might be a good time to sit down at the computer and continue my recent binge of learning and coding. We had a serious line of storms roll through, apparently associated with the tropical depression that just landed, and without a lot of lightning I decided to go hang out on the patio. Really epic downpours and a nice breeze. The rain has stopped, and when my neighbor's air conditioning isn't on, there's a pleasant sound of dripping and critters. Right now, I'm hearing the end, and seeing the flashes in the sky, of the Halloween Party version of the fireworks at Magic Kingdom. The distant sound of the train whistle I'm sure isn't far behind. It's a lovely night for the senses.

If there is anything I could identify as being a critical quality of life issue, it's the ability to be outside. Living in Florida means that you can do that pretty much all year. I'm not saying you can't go out in places that have real winter, but it's not particularly fun or comfortable, and can in fact be fatal. Yeah, you can ski and such, but I'm talking about leaving your home without putting on a parka.

Sure, summer can be pretty hot. Late-June to early-September, the heat gets a little old by August, and it feels a little gross if you're outside for extended periods. It's still not terrible, and when you're enjoying "jacket weather" in January, you know, because it's just under 70, there's no arguing that the summer hotness is totally worth it. Wear your sunscreen, stay hydrated, and it's all good.

As rainy (or misty, to be more accurate) as Seattle could be in the winter, I have to say that being outside was pretty easy to do there as well. When I worked on the Microsoft campus, the people I hung out with had a lunch rotation among various buildings, and it was never a big deal to get out and walk, all year. Heck, we had walking trails in the "woods" at the edge of campus, and I wasn't afraid to use them any time of year. Of course, in the summer it was 74 and sunny pretty much every day, Poppins perfect even. Being outside generally put you in view of those beautiful mountains, too.

This just wasn't the scene, growing up in the Midwest. Fall was the most wonderful time of the year, with the cool weather, the smells, the colorful trees... and then there was November. It may not have snowed right away, but it was coming. The trees appear dead. The skies turn gray for days on end, and temperatures take a dump. You may finally get a glimmer of warm weather in March, but you might get snow, too. That's a solid four plus months of coldness that forces you inside, and it sucks. I don't know if I could ever go back to that. I did once, and it was awful.

The bottom line for me is that I need to live where I can be outside as much as possible. I'm not even really a big outdoor activity kind of guy (unless you count theme parks), I just like having the fresh air.


Making your future, sort of

posted by Jeff | Monday, September 12, 2016, 10:38 PM | comments: 0

I'm totally hooked on Mr. Robot, that show on USA. It would be a pretty intense show if it was only about the place of corporations and government and computers, but it also throws in plenty of mental illness, deep philosophical questions, sex and strong themes of identity. I'm only a few episodes into the second season, but it's going in the direction of understanding what you want your future to be, and making it happen.

Making your future is a subject that's near and dear to me, because I spent the first dozen years or so of my post-college life kind of meandering and allowing the future to mostly happen to me. I made a few deliberate moves, chief among them changing careers, but mostly I was avoiding any specific action, or even thinking about what I wanted my future to be. I suppose it's because I figured that it would just be obvious, and happen like a Cameron Crowe movie (most of which I've been obsessed with). You'll have a coming-of-age moment, the future will be clear, and you'll be making out with the girl when the credits roll. Seriously, that's how most Crowe movies end.

After I met Diana in 2007, you could start to see the economy go kind of sideways. For the most part, I liked the people at my job, though I couldn't see where it was going. Two and a half years in, when the layoffs started, I kept hearing this theme about how it was an opportunity. I spent the next year or so wading in and out of "opportunities," until I realized that I was falling into old patterns. I was letting life happen to me again. I had to start dreaming and being deliberate in making my future.

It turns out that my future making resulted in a whole lot of moving around. There's no question that I was happier for this action. I made some mistakes, but none of them were irreversible. Making your future requires defining it, and acting on it, yes, but what the last six years have taught me is that you have to be OK with being wrong about your goals and your actions. You have to challenge your assumptions and your normal.

Where am I going with this? I think I haven't been deliberate enough in defining my future lately. I'm comfortable, and sometimes comfort breeds complacency. In those first dozen grownup years, I equated comfort with happiness. I have to better understand what I want to be as a parent, a husband and a professional, and go there.

As a cautionary tale, I have to admit that the future that we get is rarely what we dreamed, even when we are deliberate in our actions. That's a pretty crazy thing to think about. I'm suggesting that you have to make your future in a world where it doesn't go the way you expect. That might be because we're too specific in our expectations. If I split up my life into five-year chunks, I'm never where I thought I would be from one to the next. I look around me today and have a total Talking Heads moment and ask, "Well, how did I get here?" The answer is the actions I took got me here, it's just not the expected "here." I would argue that it's probably better than what I expected. Time, experience, circumstances and maybe just dumb luck have a way of refining your future in exciting ways.


The stuff and the status are not the goal

posted by Jeff | Monday, September 12, 2016, 5:30 PM | comments: 0

There are two groups of people in the US that definitely fall into the "hurting" category, and we hear about them all of the time in this election cycle. The first group are minorities, and African-Americans in particular. There isn't a lot of mystery about why they're hurting given our nation's history of institutional racism, and the socioeconomic problems around it. But the other group, the working poor, is a more complicated problem that I'm still learning about. It's not as simple as a group of people who make poor decisions, and raising minimum wage isn't the simple solution either.

In a discussion on Facebook, a guy I vaguely know online responded to a friend's post commenting that he often wondered why he didn't have a nicer car, or live in a nicer house, etc. His phrasing struck me as interesting, in that he said he no longer believed in "the American dream." I took this to mean that the things he didn't have were the American dream.

That got me to thinking about our expectations, as a culture and as a society. That Americans are characterized as generally materialistic is not surprising. Our rabid consumerism is arguably out of control, and I think it has really screwed up our definition of normal. Maybe it wasn't a "good" normal even when I was a kid. That definition was about a degree, a nice house, two cars, two kids and fat pensions. My suspicion is that it's the nuance in that definition that has changed, because the minimum viable way to live is actually just having shelter, food to eat, healthcare and a job.

I'm probably not the right person to talk about this, seeing as how I drive an electric car and live in the suburbs in a McMansion (is it still called that under 3k sq. ft.?), but external factors aside, I wouldn't be here if I didn't challenge the notion of what the dream is supposed to be. I subscribed to that vision in my 20's, bought crap that I didn't need on credit and tried to adhere to a lifestyle that probably had little to do with what I actually needed. As soon as I had a little money, I rushed to buy a house. When the economy took a dump, twice in the oughts, I eventually learned that maintaining this version of the dream was not sustainable. I imagine the jarring experience of divorce reinforced this.

There is some anecdotal evidence that the classic dream is not the goal it used to be. Many 20 somethings are hoarding cash and living college-style. Small homes (and tiny homes!) are becoming trendy. Some people even, gasp, hang on to their smart phones for more than a year!

Challenging the dream that was defined as stuff and status was something I should have done 10 years earlier than I did, but it has made a huge difference in the quality of my life. I may have been able to course-correct only because I work in a fairly lucrative field. I live comfortably, but I have no desire to live at a more expensive level even though I could. Living expensive is not something to confuse with quality of life. Living expensive as possible should not be the goal.


In fondness of my portable super computer (and other screens)

posted by Jeff | Sunday, September 11, 2016, 8:42 PM | comments: 0

I found myself today trying to explain Facebook on my phone to Simon. I went through the feed, showing posts from my friends in Chicago, some in Seattle, etc. Saw another post from my best friend's mom. I don't think he totally understood it. The Internet, to him, is this abstract thing that's just a fact of life. Heck, I don't think most people understand the Internet at all.

I'm sure I've pointed out before that it strikes me as wholly absurd that he has no context of a life before small electronic devices with screens capable of displaying images and text without seeing the dots that make them up, let alone devices connected to all of the world's information. I was expressing my frustration with this lack of appreciation less than two weeks ago. I feel like I have some duty to teach him how relatively recent this innovation is, and not to take it for granted.

When I'm looking back at my own life, there are some pretty obvious points where screens and the devices underneath had a huge impact on me. Here they are, in order:

  • The Atari 2600. Other kids and families had these before we did, but when my mom and step-dad surprised us with one (I'm going to go with 1983), it was like time stopped. My 11-year-old brain extrapolated these blocky graphics as if I was having an adventure with E.T. or flying through space playing Star Raiders. It was transformative to me. And yeah, I still have that console, 32 years later.
  • The TRS-80. In grade 6, my school, Benjamin Franklin Elementary in Cleveland, had one of these computers, and sometimes we had it in our classroom. I was obsessed with getting time on it, and started getting COMPUTE! magazines from the library with code listings to type in. (A Facebook search indicates that my teacher, who was awesome, died in 2010, which is sad.)
  • The VHS VCR. I think we scored ours shortly before Top Gun was released for home video, probably 1986. Video rentals, and the stores, were already a thing, and it was a special time when we would go to the video store and come home with a couple of tapes to watch. I remember the first store we went to had little key tags on hooks in front of the boxes, so you'd take the tag to the counter to rent your tape. Top Gun was the first to be priced-to-own at $20.
  • The Atari 600XL. I think my dad scored this thing after attending a time share presentation or something. Eventually he gave it to me, and it was the first time I had the chance to write BASIC code, somewhere around 1986.
  • The IBM PCjr. My junior high school had a lab full of these computers, and I got very hardcore about messing around with these. I would write out code on paper, referencing the IBM manuals that the math teacher running the lab would loan me, and then try entering them when I had an hour in the room. I remember drawing lines on the screen as if it were an act of sheer creation. That teacher tried to get me a chance to borrow one of those computers for a summer, but it never worked out.
  • The Apple II+. When my step-dad got laid-off in late 1987, the company gave him an old Apple II+, along with dual disk drives, a green monochrome monitor and a wide carriage dot-matrix printer. What made this fun was that there were actual games I could play on it, and with disks I could actually persist data. To this day, I consider my first "real" software to be a program that I wrote to save and edit Dungeons and Dragons character profiles, and it even printed them out.
  • The original Nintendo GameBoy. My first job, other than the contract work I did for the city for local cable TV, was at Ames, a department store back in the day. The GameBoy was released around the time I started, shortly after turning 16 (that's 1989). I think I bought it before Christmas that year, at the crazy price of $90. At $3.35 an hour, before taxes, that was a lot of money to save! I fondly remember that magical little machine, with its tiny little 160x144 screen and its few shades of gray. It came with Tetris, and I bought a Super Mario game and the external rechargeable battery. It seemed impossible to have that power in my hand.
  • My academic advisor's Gateway PC. There was nothing special about his computer, but connected to Ashland University's network, with Windows 3.1, Trumpet Winsock and the Mosaic browser, I saw my very first web pages in 1994, my senior year. We worked together trying to figure out how to make this work, and it was like magic. Armed with a bottle of Zima, the girly clear malt beverage that was all the rage that year, it was the first commercial URL I had ever seen printed on something, so it was the first commercial site I had ever seen.
  • Various game consoles. The Super NES, Nintendo 64, Sega Dreamcast, the first Sony Playstation, the Xbox, these were all significant steps forward in video games, spanning eight or nine years. Computers weren't making huge leaps, and in those days I upgraded a generic box with parts every year, but the game consoles got more interesting every generation.
  • The Palm V. Personal digital assistants (PDA's) were pretty amazing for being things that weren't actually connected to the network in any way. In retrospect, it was probably this very thing that kept me from seeing the obvious end game of ubiquitous wireless connectivity. (Salesforce seems to be the only company that really could see it, if you look at history.) But I had this little thing that recognized my handwriting on a monochrome screen, and I could sync it with my desktop computer to store my contacts. Oh, and I could play solitaire. It was a big deal for 2000.
  • The iPhone. It wasn't until 2007 that the next amazing screen would appear. Smart phones were already a thing, but they sucked. A bunch of clunky things built on some variation of Windows were kind of terrible, and too expensive. When they announced the iPhone, I had to have one, and I did, the day after it came out. Most screens before then were incremental changes to the universe of computing, but the original iPhone was extraordinary. It didn't have "apps" yet, but it didn't matter. Its interface was obvious and intuitive, and it could access the web over cellular.

Three years later, I wold score the first Windows Phone while working at Microsoft. It wasn't revolutionary, but it was a dramatic improvement in user experience, even if it didn't catch on. In fact, I would argue it's still the best, but it does no one any good if it's no one is supporting it or making amazing devices. Last year I relented and bought an Android phone, a "pure" build from Google, and I've been very happy with it. It's extraordinary what a midrange device can do these days.

So the next time you unlock that little screen, think about how awesome it is before you share that next cat photo or complain about whatever. The thing in your hand is amazing, and impossible a decade ago.


Nobody knows the trouble I've seen

posted by Jeff | Friday, September 9, 2016, 5:00 PM | comments: 0

I was talking yesterday with a friend and coworker about many of the things we've seen in our lives, personally and professionally, and the ways that it all shapes us. It can be striking, the way that the events in our lives, big and small, good and bad, can alter the trajectory of our understanding of the world. For better or worse, it makes us who we are.

That made me very contemplative, on the way home. As much as we get to make choices about how we conduct our lives, these events color every decision. The good things undoubtedly make us better, but the bad things can be so difficult to process and move beyond. Other things may have simply been neutral in their nature, but established a baseline for how we operate.

I think it's safe to assume that most people want to be "better" in some way, improving their own lives, the lives of others and maybe even improve the world. Age seems to make this more possible, but what I observe as people get older is that they either learn to let go of the ugly parts of their lives and be amazing, or they hang on to the bad stuff and become cynical and miserable. I never want to be the latter. I have certainly seen my fair share of pain and sorrow, but I won't hang on to it.

Indeed, "What doesn't kill you makes you stronger," is a silly cliche, but hopefully it's true.


Five years after Microsoft

posted by Jeff | Friday, September 9, 2016, 10:00 AM | comments: 0

On this day in 2011, I turned in my blue badge, Prime card, AmEx and ORCA card at Microsoft, in a somewhat unceremonious visit to some random office on the Redmond campus. The range of feelings was pretty broad, and the decision to leave the company and Seattle is something that I've struggled with, and often regretted, ever since. I'm not sure why I've never been able to let it go. On this day in 2009, I began the process of making arrangements to fly out and interview there.

My mindset at the time was this: I was indifferent about the group I was working in at Microsoft. I felt that I had been underhired, not in the leadership role that was becoming routine success for me at my previous jobs. (Looking back, apparently they were interested in me in a leadership capacity, but for whatever reason it didn't work out that way, and the second group I worked in didn't lead much of anything, or ship anything.) The psychic weight of my unsold house in Cleveland was getting to me, not because it made money tight, but because we weren't accumulating anything. I thought I missed the social impact of living in Cleveland. All of these things combined made it seem like moving back into the house in Brunswick, Ohio, was a good idea.

I've written countless times about the outcome of the decision. Financially, it was huge, reversing some relatively minor credit card debt to massive savings. That was pretty much the end of the upside. Career wise, there was nothing excellent in CLE, and in fact I spent a year working remote for Humana, an opportunity that sharpened my soft skills considerably, but wore on my soul (because health insurance and healthcare is broken). I landed some consulting work at ridiculous rates that further padded my bank account, but there was nothing for us in Cleveland. Even our social circles weren't what they once were.

We missed Seattle, and it was on the table, but Orlando won when I scored the contract gig at SeaWorld Parks. The house sold in 48 hours. We've been in Orange County now for three years. I'm not saying it's permanent, but we do like it here. No winter, lots of sun and theme parks aren't a bad way to go.

The funny thing about working at Microsoft is that no one in Seattle cares. It doesn't make you special. Tens of thousands of people in the Puget Sound region work for the company. But move to the east, and it's surprisingly a big deal. Finding work was not hard. The crappy agency I worked at for a few weeks ("work," because they had nothing for me to do) involved no technical interview. My Humana interview was 20 minutes, and I'm still not sure how they found me. Fortunately, my two Florida jobs involved real interview processes, but the experience I had in Redmond played heavily into the conversations. The scale of what I got to work on was a bid deal. The program manager position may have not been ideal, but my takeaways from it still play well into my skills and experience. The bottom line is that my Microsoft experience made me better in every way, and it has opened countless doors for me since.

I still look fondly at the company. In my years there, it was a company very much in transition. At a high level, they were starting to understand the toxic side effects of stack ranking (a disincentive to collaborate) and golden handcuff incentives (hanging out just for the money). At the smaller levels, one group at a time was learning to be agile and faster. From what I hear, that transition is still in progress, but it's getting better because of the culture change that is largely advocated from the top. I'm impressed with what has been going on with the developer tools and Azure in particular. Lots of growing pains, but they've come a long way in five years.

Would I ever go back? Yes, but the only way I would ever leave my current gig and Central Florida is if the job was really the kind of clear, forward motion opportunity that makes the move logical. Going there the first time would have been a lateral move if not for the fact that there was no work in Cleveland, but the market isn't like that now. Relocating life has to come with clear advantages. But yes, I still admire the company, and I'm amazed at where it has gone in the last five years.


Adding a Bootstrap CSS class for validation failure in ASP.NET Core

posted by Jeff | Monday, September 5, 2016, 3:41 PM | comments: 0

While porting a form from POP Forums to ASP.NET Core, I was surprised to find that there is not a TagHelper version of the old HtmlHelper AddValidationClass. In the old world, you could do a field group like this, using the Bootstrap magic:

<div class="form-group @Html.AddValidationClass("Email", "has-error")">
<label for="Email" class="col-xs-2 control-label">E-mail</label>
<div class="col-xs-10">
@Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Email)
</div>
</div>

That would render the has-error class name in the parent div when the validation failed, and the Bootstrap CSS will shade the label and the text box:

There is no equivalent of this with the TagHelper bits in ASP.NET Core. Sure, you can use the old HtmlHelper, but where's the fun in that? Fortunately, this is a super-simple opportunity to write your own tag helper. I like these helpers because they look like HTML, and feel less abrupt than the @Html.Whatever style of the HtmlHelpers. You can render completely custom markup with your own tag, or you can have the framework make improvements to existing tags, like a div, in this case. I think TagHelpers are also way easier to unit test since they're full classes and not extension methods.

Thinking in design terms first, imagine that we want our markup to look like this to achieve the same effect after failed validation:

<div class="form-group" pf-validation-for="Email" pf-validationerror-class="has-error">
<label for="Email" class="col-xs-2 control-label">E-mail</label>
<div class="col-xs-10">
<input asp-for="Email" class="form-control"/>
<span asp-validation-for="Email" class="text-danger"></span>
</div>
</div>

What we want is for the tag helper to add the has-error class to the class attribute of the div, but only when the Email field has been marked as invalid. Here's the code I came up with.

using System.Linq;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.TagHelpers;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;

namespace PopForums.Web.Areas.Forums.TagHelpers
{
[HtmlTargetElement("div", Attributes = ValidationForAttributeName + "," + ValidationErrorClassName)]
public class ValidationClassTagHelper : TagHelper
{
private const string ValidationForAttributeName = "pf-validation-for";
private const string ValidationErrorClassName = "pf-validationerror-class";

[HtmlAttributeName(ValidationForAttributeName)]
public ModelExpression For { get; set; }

[HtmlAttributeName(ValidationErrorClassName)]
public string ValidationErrorClass { get; set; }

[HtmlAttributeNotBound]
[ViewContext]
public ViewContext ViewContext { get; set; }

public override void Process(TagHelperContext context, TagHelperOutput output)
{
ModelStateEntry entry;
ViewContext.ViewData.ModelState.TryGetValue(For.Name, out entry);
if (entry == null || !entry.Errors.Any()) return;
var tagBuilder = new TagBuilder("div");
tagBuilder.AddCssClass(ValidationErrorClass);
output.MergeAttributes(tagBuilder);
}
}
}

Before I go in to the details, note that your view needs an @addTagHelper directive, or you can put it in your _ViewImports.cshtml file. This directive allows you to use whatever classes derive from TagHelper it can find. In my case, it looks like this:

@addTagHelper *, PopForums.Web

We have to inherit from TagHelper. Then we put an attribute on the class that describes that we're targeting the div tag for modification, and we're looking for two specific attributes. The two properties are what our attribute values are mapped to. It's worth noting that because the For property is of type ModelExpression, we get nice Intellisense in Visual Studio that let's us pick a model property in the view. The ViewContext property is injected by magic by the framework.

The Process method is the meat. There's also an async version of this method, but you should only use one or the other. We navigate through the object graph to see if the current ModelState has the property we're looking for, and if so, we get the ModelStateEntry for it. If it doesn't exist or has no errors, we bail. If there is a validation nastygram there, we create a TagBuilder and add a CSS class to it. Using the TagHelperOutput, we combine our new CSS class values with those of the existing tag, and we get the desired markup. That means that the div will render with both the form-group class we originally specified, as well as, in this case, has-error.

The code needs a little clean up, for null checks and such, but you get the idea. It's a pretty simple way to programatically alter some arbitrary markup.


My little Blue Man Group fan

posted by Jeff | Monday, September 5, 2016, 2:08 PM | comments: 1

Last night we went to see what I think was my 15th Blue Man Group show (counting the arena shows, plus Orlando, Chicago and Las Vegas). My former officemate from Microsoft was in town with his wife, so I asked if they were interested in seeing the show, as there was a $36 plus tax special running for tickets. That's an amazing price, considering I've spent a hundred in Vegas. We spent more at dinner! It was going to be Simon's fourth show.

Simon is a smart kid, but his challenges with sensory development and ASD have been something, at times, to keep us up at night. My personal concern was always whether or not he would really "get" music and more creative endeavors, given that much of his early play exhibited intense organization and not imagination. Heck, even now, a theme park ride has no magic for him... it's all mechanical. Even some of the stage shows are about little more than the tech to him. It's frustrating when we go see Finding Nemo: The Musical at Animal Kingdom and all he can talk about is the doors on the stage and the wires that fly around the actors. But it has been a relief to see him enjoy music, want to dance to it, and in a few cases even sing a few bars. I introduced him to Blue Man Group pretty early in life, and it stuck with him.

Last night's show was the kind of pure joy that I doubt any parent sees that often. It was like him on Big Thunder Mountain Railroad, his favorite roller coaster, only that enthusiasm lasted the entire hour and a half of the show. He loved it, smiled the entire time, flashed his "Floppy The Banjo Clown Hand Puppet" sign frequently. He couldn't stop talking about what a good day it was, even this morning, and I think we all needed that with some of the behavioral issues we've had lately.

I love my little BMG fan.


We bought a grownup table

posted by Jeff | Monday, September 5, 2016, 1:28 PM | comments: 0

We've been living in our house now for about two and a half years. If you go back to 2014 me, I would tell you all about how excited I was that it will be fun to have a place that is totally ours, and a fresh start. The house ended a series of five moves in under five years. Me and Red Delicious were all about a little nesting, decorating, homemaking.

The reality is that there wasn't much decorating going on. We immediately bought a couch, because I hated the cheap one we had. We didn't go super nuts on that, either, and landed a leather deal from Ikea. This is, in many ways, representative of how we roll. We're Ikea people to an extent, and not ashamed. It kind of ended there. Over the course of the next two years, we would paint the living room and kitchen. Diana made some custom curtains. I installed a towel rack that matched our bathroom faucets. Between the holidays last winter, I we went all Ikea again and installed a long TV bench and some cabinets with glass doors above, basically matching the showroom. We're just not particularly fancy, and pretty content to have functional and vaguely trendy-to-us stuff.

We did decide at some point that we really wanted a nicer table for dining. We were using an Ikea table (surprise!) that Diana had scored many years before we met. It was adequate for four people, but it sucked any time we had anyone over. In our heads, we knew what we wanted... something that looked somewhat distressed, with industrial looking touches. We weren't looking hard for one, but we had one eye open. We even saw one that was close to what we thought we wanted while visiting North Carolina the year before last. It wasn't convincing. Then, two weeks ago, Diana saw the table, I agreed, it was the one. Just like that, we finally bought a table.

We feel like our house is comfortable. My office is cozy (essential since I work at home), Diana's sewing room is highly functional, we have comfortable places to sit. But we hate the flooring in most of the house, most rooms are still not painted, there is no backsplash in the kitchen, our bedroom walls are a crappy color and nothing hangs on them, my bedroom furniture is too light on a dark floor... and it's all just fine. I don't think we're cheap, but we're not big on spending money on stuff. Maybe it's because I secretly fear we'll move again. Maybe we just need to hire the people that stage the model homes in the area.

I'm particularly jealous of my brother-in-law, who not only has good taste in furnishings (he's an architect), but also built this amazing built-in for his new living room. It incorporates the fireplace, the TV, shelves, cabinets, and it's just beautiful. I don't have the skills for that. I'd like to, but like learning Spanish or the guitar, I'll probably never commit. Maybe my satisfaction with mediocrity is rooted in that!