How our Nissan Leaf deal got better

posted by Jeff | Wednesday, August 24, 2016, 3:00 PM | comments: 0

Today is the two year anniversary of the date we became EV people, when we brought home the 2015 Nissan Leaf. As we approached the end of the lease, we weren't sure what was next, but we wanted to try to extend the lease. I felt like we had a good deal, but now it's an absurdly good deal.

Leases can be good for cash flow, especially if you don't intend to hang on to a car for a long time. I tend to look at it from the view of how much money you put into it for the time you own the car, on a monthly basis. For a lease, that's whatever you put down plus your payments. For a purchased car, whatever you put down plus your payments, then whatever you get for selling it. Of course, if it's a cash purchase, even better, though that money can work a lot harder being invested when auto loans are 0 to 2% (borrowing money right now, in many scenarios is the right thing to do). I did the math when we got the car, and it worked out to $356/month for the $5k trade, $1k down and $106 payment times 24.

One of the reasons we leased was the fact that EV's are quickly evolving, especially in terms of battery capacity. I theorized that the Leaf wouldn't be particularly valuable as Nissan itself introduced new ones with bigger batteries, to say nothing of the competitors. I was right, and Nissan doesn't seem to be in a big hurry to take them back. We got a 1-year extension on the lease, and they agreed to pick up two months of payments. So now, when you do the math, $5k trade, $1k down and 34, $106 payments over 36 months, you end up with a per month cost averaging $267. For a new car, with relatively new technology, that seems like an extraordinary deal to me.

I feel validated, like I beat the system.


No! You don't need to use ASP.NET Identity!

posted by Jeff | Wednesday, August 24, 2016, 12:00 PM | comments: 0

Going way back to, I think, .NET v3, ASP.NET had this new thing called Membership. Maybe it was a version earlier. I dunno. "Neat," I thought, I can write a provider adhering to this interface and use my existing user and auth structure to plug into this system. Then I saw that the membership and role providers each had about a bazillion (maybe quadbazillion) members to implement, and reality set in that what I already had was working just fine. Some years later, ASP.NET offered Identity, this newer thing that did sort of the same thing. It even made its way into Core.

You don't need it. For real. I'm not saying that it isn't a useful piece of the framework, but you need to stop making it the default for user management. It's not hard or time consuming to build out your own system of user entities and permissions (roles, claims, etc.) as you see fit. The problem, as I see it, is that developers are confusing the act of persisting user information with authentication. I get why that may be, as Identity uses one line of code to both verify a user and sign them in (Core docs show how). But under the covers, there is code that first verifies the user/password against the database, then sets the auth cookie to indicate who the user is for future requests. You can in fact do one without the other.

Why would you do that? Part of it may just be an issue of control, but for me, it's because I want to be very specific about how I structure my user data. I also don't really want to use Entity Framework in many cases (read: most things I port from older apps), and EF is part of the magic of Identity. What I've seen in a number of projects is the use of Identity mixed with a home-grown set of user domain objects and a totally separate database or persistence mechanism. If you're doing all of that plumbing anyway, you definitely don't need the additional overhead of Identity.

Let's use ASP.NET Core as an example, first. In Startup, we use the Configure method to use cookie-based authentication:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
   AuthenticationScheme = CookieAuthenticationDefaults.AuthenticationScheme,
   AutomaticAuthenticate = true
});

In some kind of login method, from our MVC controller, we look up the user in the code that we wrote, with whatever backing store we made, and then sign in. Let's pretend that myUser is some construct we've made up:

var myUser = _myUserLookerUpperService(email, password);
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, myUser.Name)
}; var props = new AuthenticationProperties
{
IsPersistent = persistCookie,
ExpiresUtc = DateTime.UtcNow.AddYears(1)
};
var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
await HttpContext.Authentication.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity), props);

The code should be pretty straightforward. Whatever our domain-specific user thingy is, it's something built for us, instead of the generic thing that the Identity framework has created. We use that to construct a set of claims and authentication properties, and then use the built-in Authentication system to sign in with our newly constructed principal. This is what creates the encrypted cookie on the user's browser. It's not as magic as the Identity service, but remember that you're welcome to use any kind of schema that you want to persist user data, and that means you can query it or normalize it (if you must) against any other bits of data you have.

Naturally, you may want to set up some other context, or simply verify that they're still a known-good user on each request. To do that, you can wireup middleware in the Startup's Config method (app.UseMiddleware<MyMiddleware>();). Middleware doesn't use an interface (and I don't know why they chose convention over an interface), but it does expect an Invoke method to do stuff. It's here that you would look up the user based on the identity:

public class MyMiddleware
{
private readonly RequestDelegate _next;
public MyMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
var name = context.User.Identity.Name;
if (!string.IsNullOrWhiteSpace(name))
{
var userService = context.RequestServices.GetService<IMyUserLookerUpperService>();
var user = userService.GetUserByName(name);
if (user != null)
{
// do stuff here
}
else
{
// do something about your bad user
}
}
await _next(context);
}
}

Again, I believe that the Identity framework has some plumbing for this, but if you're a control freak like me, this is better. The official documentation has a really great write up on using this cookie mechanism without Identity.

If you're still using ASP.NET 4.5 and MVC on top of it (or even WebForms), you don't need to use Identity here either. In your MVC action, or your event handler in WebForms, you can use Forms Authentication to do the same work, without any setup (though you can change the cookie name and some other things via web.config):

var user = _myUserLookerUpperService(email, password);
var ticket = new FormsAuthenticationTicket(1, user.Name, DateTime.Now, DateTime.Now.AddDays(30), createPersistentCookie, "");
var encryptedTicket = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
cookie.Expires = DateTime.Now.AddDays(30);
context.Response.Cookies.Add(cookie);

Neat, right? The static FormsAuthentication class also has a SignOut method. Instead of middleware, we can use an IHttpModule or an IActionFilter to act on user data as appropriate.

To circle back, the point here is that Identity is great to spin up some user account persistence and authentication quickly, but if you want to do your own thing, or don't want EF involved, or you're a control freak, understand that you don't need Identity to auth your users.


Feeding the learning desire

posted by Jeff | Tuesday, August 23, 2016, 7:47 PM | comments: 0

I've had a lot of conversations with people in the software profession about the need and desire to learn new stuff. The need is there because stuff changes, and if you want to keep at it, you need to learn. It's also, for many people (I would argue the people you want to work with), a strong desire as well. I don't know where that comes from exactly, but I imagine anyone driven by curiosity wants to learn new things.

I've struggled with this for the last year or so. My job varies quite a bit, in that I've had projects where I've been very hands-on and in the weeds writing code, while also running a project and filling roles around compliance, architecture and more administrative stuff. Other times, I'm coaching on process or consulting around some specific client need. Right now, I'm running a project in a tech stack that I don't know deeply, but know enough to be reviewing code and design. All of this variation results in varying levels of desire to learn. As this mostly goes on after work, on my own time, the ability to dive in is not consistent. When I'm in the weeds, my capacity for learning is low, I imagine because I'm not in a hurry to write experimental code when I've already been doing it for much of the day. When I'm on projects that are more in process and consulting, the mental bandwidth and desire to learn is much higher.

In the last year, there have been a number of different projects and prototypes that I've wanted to dive into, using a number of frameworks and tools that I'm not deep into today, but I've not had enough time and energy to really go all-in for any sustained time. I struggle with that, because it might be to some degree career-stage appropriate, but many of the peers that I've known who don't know the new stuff seem kind of dinosaur-ish. I don't want to be that guy.

It's possible, maybe likely, that if I continue down my current path that hands-on work will be less and less a part of my job. Still, I never want to stop learning. I'll keep up on my open source project and stay involved in the community.


Being hipster

posted by Jeff | Monday, August 22, 2016, 6:59 PM | comments: 0

I know I love to make hipster jokes, and there is a culture of hipsterness that drives me a little nuts, but sometimes that core hipster value, liking something before it's generally accepted as cool or mainstream, isn't entirely without its value. It's not about being cool as much as it is having something a bit more to yourself.

Yes, the dude who says they liked Arcade Fire before they won a Grammy is someone you may want to punch in the face, but if you're a hipster about anything, you know that something you really loved is in some ways better before it catches on. (In terms of music, I'm not sure why you wouldn't want the band you love to be popular, but whatever.)

I feel this way about the Internets. Sure, Usenet was always a wasteland of venom and piss (and porn, lots of porn), but the Web and its early communities were pretty neat. People with common interests showed up and filled a million little niches, and there was sharing and spirited debate. I know because I started communities during that time. I was a little obnoxious at first, and I imagine a lot of people were, but we quickly learned to be cool with "our" people. Then AOL came along, and the masses started getting online. Smart phones made it even worse. Read any YouTube comments section to see the worst of humanity. Or check out Amy Schumer's Instagram for a dose of moronic bile ("Amy, you are one fat cow and I am not talking about your beauty. Why don't you die and be useful as a manure to some plants!"). People ruin everything.

When we first started considering buying a Tesla, researching it revealed this amazing community of people who were kind of car people, but mostly people obsessed like me about the future of electric vehicles. The enthusiasm was infectious, and it was remarkable how many of them were former Prius drivers. Sure, it's an attractive car, and frankly not economically ideal, but it's the future! Then, in the course of a year, the status people seemed to enter the scene. What used to be "our" future of science fiction gone real started to be co-opted by people obsessed with shiny things and appearance. Discussions went from how you teased the car into a low miles per kWh to how big your silly wheels could be (and by extension how much you spent on tires).

Travel is like this too. I remember there was a campground we frequented when I was a kid, and it was generally not busy, so we would have these wonderfully quiet weekends. It was a state park, so it wasn't really actively marketed or anything. As years went by, it got more and more popular, to the point that it was often booked solid, crowded, and loud well into the night. What a drag.

Restaurants are like this too, though to be fair, being a hipster diner likely means that your choice in establishments would wither and die without being popular, so maybe that's a bad analogy.

The point is, enjoy the things in life that are your little secret, because people may ruin them.


Two weeks of Olympic volleyball awesomeness

posted by Jeff | Saturday, August 20, 2016, 8:59 PM | comments: 0

It's no secret that volleyball is the only sport I've really cared all that much about. In fact, I'm sure a fair amount of my Facebook friends that are female and from high school, or currently 20-something played for me or on "my" high school team. It's the only sport I was ever good at, and even then, not until I started coaching it. The sport is regionally a big deal, and unfortunately not at all here in Florida because high schools tend to be gigantic and spread out (as opposed to Ohio, where every 5-5 mile township or smaller municipality has its own school). The point is, I don't get to see a lot of volleyball.

But the Olympics is a chance to see lots of it, and I don't squander the opportunity. I'm still not a giant beach fan, though the whole Kerri Walsh Jennings story is certainly amazing and awesome, and she might be the greatest player of all time. She showed a lot of class when she and her partner, April Ross, lost in the semi-final. I'm not all that interested in the men, because honestly it's not as exciting to watch. Defense plays less of a role in their game.

This year, in Rio, NBC committed to streaming literally every event, so I didn't have to wait for the matches to show up on their normal TV schedule. This meant that some matches, I believe broadcast by the Olympics themselves, sometimes had no commentary at all, or really terrible commentary, but it was all there, and that's awesome. I did not miss a single match for the USA women, which is fantastic. As the favorites for the tournament, I wanted to see every last swing.

The first match I watched was in "our" Pool B, between the Netherlands and China. The Dutch were ranked something like 11th prior to the Olympics, so imagine my surprise when they wrestled away a win against China. There was something incredibly validating about their style of play, too, because they proved what I've always felt as a coach: Speed can beat power. The Chinese team was far stronger, but they weren't nearly as fast. You can get around powerful blockers and dig hard hits when you're fast.

The USA women won the pool, and the Netherlands only dropped their match to the USA. Pool B was definitely the stronger of the two (I thought), but when it came to the semi-finals, the USA lost to Serbia, and the Chinese (after shockingly beating Brazil) exacted revenge on the Dutch. My two favorites made so many unforced errors in their matches, and that made the difference. It was heartbreaking, but at least it meant I could be comfortable with either team winning the bronze (patriotism aside). The Netherlands should be extremely proud of their team, because no one expected them to go that far and they were amazing through most of the tournament. The Americans and their coach, the magnificent Karch Kiraly, walked away with bronze, and that's OK too.

The Serbia vs. China match is about to start, going for gold, and it should be a great match. I think it's going to go to Serbia. They have a lefty (Tijana Boskovic, the one with the braces and the dimples), who is one of the most consistent hitters and blockers I've ever seen, and she can pass all day, too. It's crazy how much of an impact she has on that team.

I'm thrilled to see so much good volleyball. I've watched as much as possible every games since college, and this has been the best tournament I've ever seen. It just sucks that I have to wait another four years, but thankful that the Internet made this possible.


Larry Wilmore's Nightly Show, cancelled

posted by Jeff | Thursday, August 18, 2016, 8:10 PM | comments: 0

I made a lot of Facebook posts expressing my enthusiasm for The Nightly Show with Larry Wilmore when it started on Comedy Central. Those first few weeks were pretty interesting. While they were constantly experimenting with the format, it was generally funny, and it seemed like it had potential.

Over the course of a year and a half, I slowly lost interest. I can't exactly tell you what happened. I was still watching it maybe once a week, but not religiously as I once had. I think that maybe the show was too tightly focused on a subset of race issues. It's not that they aren't important issues, but they aren't really funny. I remember a number of shows where he would finish the A-block, and I would be kind of angry or depressed in the way that I would be by watching news. That's probably not what you want out of a comedy show.

Politics in the context of comedy works so well that Jon Stewart did it for more than a decade and a half. Social issues, while often made political, don't work as well with comedy. I think that put Wilmore in a difficult position, because he was often quoted as saying that he wanted to give a voice to people who didn't have one in late night TV. It probably doesn't help that Trevor Noah's Daily Show, while also not scoring great ratings, has managed to be consistently good, so having to follow it isn't easy.

Wilmore has a series of TV successes as a writer and show runner, going as far back as In Living Color and as recent as Black-ish, including an Emmy for The Bernie Mac Show (I miss Bernie Mac). He'll have no issue working in the business, but I feel bad for his crew. Entertainment is a brutal business.


My kid is the clock that makes me hyperaware of time

posted by Jeff | Wednesday, August 17, 2016, 9:41 PM | comments: 0

Simon is, fortunately, a bit of a cuddle monkey. When he's not in his sensory seeking parental abuse mode, climbing on me, invading my space and otherwise likely to cause harm, he's content to prop himself up next to you to wind down with a book, or TV, or even playing with a small toy. Tonight he was tired and worn down from a sore mouth, and wanted to share the giant beanbag with me while he watched some video on his iPad. I was struck in this moment at how big he was. The little creature I could once football hold has personality and makes conversation. At 6, he's one-third of the way to legal adulthood.

I'm alarmed by this. Don't get me wrong, I don't want to go back to wiping his ass and waking up with him at insanely early times, but I'm also very aware of how fast his growing up seems to happening. By extension, this makes me aware of the passage of time in general, which I think people are already more sensitive to as they approach midlife. (I mean, a friend of mine, same age, is contemplating his approaching empty nest status... we got a late start.)

Look, I've said it before, it's not that I fear death per se. I accept and understand that I'm not here permanently, and I'm at peace with that. But if I found out I had three months to live, I'd likely skip the fear and sadness and go straight to being pissed. What is the alarm about? There are days when I feel that I haven't really done anything. Or maybe it's that I still have something to do. It's a ridiculous thing to have anxiety about, because if I look at my life, especially the last decade, I have seriously made it count, and it's been fairly epic.

I suppose I'm still not sure what I wanna be when I grow up, and watching my little boy grow up constantly reminds me of the wonder and fascination that goes with that age. Everything about where I've been and how it has shaped me has come into focus in ways I never expected. Heading toward middle age comes with some pretty outstanding self-awareness and experience. Now I actually know some of the things that I thought I knew when I was 21.

For now, I cherish those little moments with my little guy. He might have 12 years to graduation, but the time when Dad is uncool comes a lot sooner.


Respect the creators of things

posted by Jeff | Monday, August 15, 2016, 8:15 PM | comments: 0

Working in something of a technology bubble for most of my adult life, I'm sure that I've fallen into the trap of thinking that all of the great things being created are software. It was all web services at first, and now, everyone thinks they can change the world with an app, chasing unicorns. The latter seems almost like a cliche now, and I miss the days of calling them applications.

I'm starting to come around though to see that the things being created that inspire, entertain and serve us come from so many different places, and from so many people. Popular art, like movies and music, affect us in very real, emotional ways. Craftsmen make beautiful objects like furniture, and they can lead to a lifetime of something that you identify as home. Some professionals, like teachers, create processes and systems that serve as frameworks to better people. Huge teams of people create physical technology that potentially change the world, too (I'm thinking electric space cars, as you might expect).

Creativity, and the act of creation, is all around us. There is also a lot of noise being created at all times (thanks, Internet), but it's not hard to find the sheer will that makes stuff. I greatly respect the people who create things, regardless of the scope. Creativity, making things, is what drives humanity.


Why science literacy matters

posted by Jeff | Sunday, August 14, 2016, 1:43 PM | comments: 0

I'm genuinely concerned about the general disregard for science, or the desire to understand it at even a fundamental level in American culture. Certainly the most obvious example of this is people who think that climate change isn't a real thing, but we've also seen the pockets of anti-vaccination people (thanks, Jenny McCarthy) and anti-GMO people. Facts be damned, people will believe what they want to believe. Maybe the scariest thing is that looking at things in an intellectual manner is somehow being an elitist. What the hell is that about? People celebrating willful ignorance?

Therein lies the problem: Science is not a belief system. Science is a continuous cycle of observation and experimentation, with a fairly well developed intellectual scrutiny applied. You can believe in God because you can't really perform experiments to prove or disprove Her existence. Science reaches conclusions with a high standard of reasoning. While not a perfect process, it's the reason that we can cure diseases, put machines on Mars and look up virtually anything we want with a super computer we carry in our pocket. Culturally, we're not in awe of this capability, and I think that's a problem.

You probably saw during the Olympics that a number of athletes had what looked like big circular hickies all over their bodies. These were caused by a "treatment" called "cupping," which essentially creates a vacuum that pulls on the skin and underlying tissue. While it's proponents believe that it does... something... there is no actual scientific evidence that it does anything, and there is anecdotal evidence that it may be harmful. Calling it pseudoscience is probably giving it too much credit.

I saw countless people say, "Well what does it matter if it's just a placebo?" It matters for a few reasons. First of all, money changes hands for goods and services that have no benefit. Second, it's another way to discount critical thinking. Look, if people just said, "I think it feels good," that would be fine, but that's not what's going on. People who are, for better or worse, role models are making claims that have no basis in fact, and people just go along with it.

The Internet has spawned fake celebrities propagating nonsense and anti-science as well. The worst of these is someone like the "Food Babe" who is constantly talking about "toxins" and "natural" food. It's all bullshit. This is a willfully ignorant person who once claimed that airlines pumped up to 50% nitrogen into their planes to save money, and that it wasn't pure oxygen. I don't know about you, but I recall in middle school learning that our atmosphere is 78% nitrogen. Somewhere in high school I recall learning that pure oxygen would in fact cause your lungs to fill with fluid and kill you (this varies with pressure). So why do we take diet advice from someone who doesn't know fundamental chemistry?

Capitalism has had its share of science hating, too. "Alternative medicine" accounts for billions of dollars in sales every year, and worse, fake fitness science involves billions more. People spend $130 a month on Shakeology, where the fine print reads that it's a dietary supplement, not a meal. There isn't a reputable dietitian in the world that would prescribe the product as anything more than a snack. How many actual meals could you buy with $130? But you have an inherently evil multi-level marketing machine behind it that benefits only the company making the product, and a few of its top earners, under the guise of "helping people" achieve whatever kind of bullshit goals they're serving. That's not science. You want to eat and live healthier? Talk to an actual dietitian and a trainer and make lasting lifestyle changes. You can't drink that shit for the rest of your life.

The worst science denial of all is still climate change, or specifically the denial that man can affect it. Few scientific phenomena have been as carefully scrutinized as climate change, and yet, politicians continue to make it something other than science. Politicians being morons I kind of expect, but the average human who isn't seeking reelection has no excuse for the denial.

Crack a virtual book, humans. A little science isn't going to kill you. It will make you better.


POP Forums roadmap

posted by Jeff | Friday, August 12, 2016, 4:00 PM | comments: 0

The volatility over ASP.NET Core made me pause (twice) since last fall when it came to porting POP Forums to the new platform. Every new release broke things to the point of frustration, and the RC2 reboot was hard. With SignalR falling a bit behind, it made things worse. But alas, that seems to be mostly behind us, and I've started committing stuff to a branch again, a little at a time, to run on the new ASP.NET. It's not at all usable, and every change seems to invite more changes, but I'm starting to see the potential and love for ASP.NET Core.

With the experimentation behind me, and a reasonable amount of stability, I'll start populating the issue log with tasks to do. I wanted to explicitly create a roadmap so I can stay focused. I do not have a timeline in mind, which is probably fine because I don't think people are flocking just yet to the new framework. The truth is that porting is not straight forward, and a lot of stuff can break. With that in mind, here's the plan...

POP Forums v14:

  • A straight port to ASP.NET Core, no new feature work. Right now I'm developing against .NET v4.6, but the goal is to go all Core. The two dependencies I'm using from the "old" framework are for image manipulation (the WPF stuff), and calling an SMTP server. Fortunately, it looks like ImageProcessorCore and MailKit will, respectively solve those problems and allow me to go all Core and cross-platformy. I may even try writing code on a Mac with JetBrains' Project Rider, if I'm feeling sassy.
  • Get out of the single-node problem. The app today depends on in-process caching to be fast, which doesn't work if you have to spin up to additional nodes. This requires some changes:
    • Use external caching, probably Redis. I've done a little testing, and it's super easy. It's also an easy to use service in Azure, where my stuff lives anyway.
    • Revisit background processing. A number of "services" run in the background in the context of the web app (sessions, emailer, search indexer, point/award calculation). These can probably run multi-node, or maybe as an option run stand-alone, but at the very least needs some queueing mechanisms or something. You don't want two instances trying to send the same email at the same time. Solvable problem, just need to think it out.
    • Need to figure out configuration for SignalR backplanes. Knowing there is a new post before you hit "reply" is important, and to this day my favorite feature.
  • Developer friendly. The documentation has not been well kept, and as long as I could figure out how to get it working in my sites, good enough. I don't want to be that guy anymore.
  • Secondary objective: See if the app itself can be packaged in a way that you can hitch it on to an existing ASP.NET Core solution.
  • Secondary objective: Refactor as time allows. There is still stuff written in the WebForms days that lingers, like 2002 linger, and it's not my best work.

That's it. It sounds simple enough, but it's a ton of work. I've ported much of the base library and UI stuff, but I'm still sorting through views and the conversion of things like HtmlHelpers to TagHelpers and using view components where it makes sense. Adapting slowly to claims based auth and middleware, but still not going to take any dependencies on Identity or EF. I've yet to port unit tests, but part of that is because I'm trying to really break stuff out into places that make sense. Part of that was getting MVC and SignalR stuff out of the base library, for example.

POP Forums v15:

  • Modernize the UI. I'm not sure what this means yet, but you can do things in a web app that were not possible before, due to the rich world of open source software. I don't think it means going to a full on single-page application (SPA) model, because of the effects around indexability and SEO, but there is potential for new things. The classic "UBB" style has some long-standing conventions that work, so the idea is not to get radical, but keep text at the center of the world.
  • Optimize for performance. Come up with arbitrary targets for page render times. Look for database tweaking opportunities (probably not much there, after 15 years of tweaking). Make a real effort to load test.

Going to Core makes this the fourth platform in the 16-ish years I've been at this silly thing. It started on old ASP, then ASP.NET WebForms, then ASP.NET MVC and now we move on to ASP.NET Core. It still forms the basis of CoasterBuzz. It runs in six languages. I hope to continue to maintain it for a long time to come, and welcome this next iteration.


First grade, frequent tears and frustration

posted by Jeff | Thursday, August 11, 2016, 9:32 PM | comments: 0

We met Simon's new teacher today, and our initial impression is good. We kind of warned her that we're having some issues with him lately, and I'm crossing my fingers that she'll be able to help.

This has been a rough summer, filled with what feels like developmental regression. I don't even know if that's a thing, but the kid who ended kindergarten in an academically great place has fallen apart in other ways, and pushed us to the point of not really knowing what to do.

The first challenge is that his inability to adapt, in a wide range of situations, has gotten a lot worse. When something doesn't go as expected, a serious meltdown can come very fast. I think I've been incorrectly chalking this up to a lack of patience, but if I put my ASD hat on I'm pretty sure it's an inability to reconcile the actual versus desired outcome, and connect the cause and effect (not to mention the ranking of how important the thing is relative to other things). For example, today he ripped the top off of one of those yogurt tubes, and it came off at an angle, instead of straight across, and didn't easily come off. This led to an almost immediate meltdown, the inconsolable kind that has to work itself out and is not intended to seek comfort or help (that is, the difference between a "meltdown" and a "tantrum"). These have become more frequent, often because a toy isn't performing as desired, he can't easily manipulate his food, Netflix is down, etc. It happens so quick that often it's not even possible to understand what happened because he's too upset to verbalize anything. In fact, expressive language has become a struggle for him. It's so hard to see these visceral and intense reactions from him, when frankly they don't make a lot of sense in a neurotypical way, and as a parent it's hard to be rational when you see what appears to be genuine suffering by your kid.

This seemingly involuntary reaction to adversity seems to have inspired similar voluntary reactions to not getting his way. For example, he wants something other than what he gets for dinner, or isn't happy with a TV prohibition. These come with tantrums, not meltdowns, and they're clearly designed to prompt a reaction from us. I think this we've brought on ourselves a bit by not following through with consequences, but we've made some course corrections and I think he's starting to see we mean business. This scenario doesn't make me feel incapable as a parent. It will take time, but this we can fix.

The other challenge is that Simon's sensory issues have kicked into high gear, especially in the last month. He's become physically rough with us, and I'm not joking when I say we keep getting hurt. His "chin thing" has come back, too, where he will press his chin into whatever body part he can to get the resistance that his body seems to want. Some of this is certainly being holed up in the house for long periods, when it's raining or we just don't have time to get out with him, but it's present even on days when he had tennis camp or other activities. My hope is that this will get better just with the routine and activity of school, but my worry is that this manifests itself in ways that clearly violate the personal space of others, which we know adversely affects him socially.

The arrival of the school year is welcome, that's for sure. I'm concerned it's going to be a challenging year, but there's relief in the idea that professionals will again have an impact on him. We've had help since the time he was 1, and it has made a huge difference. I'm cautiously optimistic, because I don't know what else to be for Simon.


Borrowing my happy from the future

posted by Jeff | Tuesday, August 9, 2016, 8:18 PM | comments: 0

My last post about the excitement around big life change really got me to thinking about what makes me happy on a day to day basis. I have to admit that there have been mornings in the last few weeks where I woke up and thought, "Meh, what choices can I make that would let me go back to sleep and dream some more?" I don't think I've been depressed or anything, and I'm thankful every day for the miracle that is my life, but I've definitely felt like something was missing.

It didn't take long to figure this out. As soon as we returned from our Alaska cruise, I realized that we have absolutely nothing on the books to look forward to. No vacations or special events. Nothing to break the routine. (Not entirely true... we'll be celebrating the starting of school next week.) This realization brings the questions about enjoying the journey versus the destination. I definitely borrow some of my happiness from things to come.

Like many people, I suspect, some of what makes me feel alive is emotionally intense experiences. I have a theory that this might be why some people are so dramatic with their family, at work, or whatever, but it feels good to have these rich and exciting experiences. They vary in scope, and don't have to be cruises, but I do need them. They come from small gatherings of people that you like, a day out with your family, and yeah, from vacations.

In between, you have that excitement and anticipation, and hopefully a lot of smaller moments. I routinely have these with my wife and kid, and sometimes with little victories at work. I appreciate the moments "in the now," but I'm selfish I want to look forward to the bigger moments, too. Something about knowing that those are on the radar makes the routine more interesting. It's hard to explain.

The bottom line is that we need to get something on the books for some fun.


The magic and excitement of change

posted by Jeff | Friday, August 5, 2016, 6:51 PM | comments: 0

I was talking to someone about how we ended up here in Orange County, and I specifically recalled the process of flying down on my own to interview at SeaWorld Parks for a contract gig. That day is so vivid in my memory, I suppose in part because the physical place obviously became familiar very quickly, but mostly it's because of the intense feeling of hope and excitement for a significant change for life.

I wish I could bottle that. Those kinds of scenarios used to scare the shit out of me and cause anxiety, but now that's not the case. I had the same experience after my SeaWorld contract, as I moved to AgileThought and into a new house, and I had it when we moved out to Seattle too. It's hard to describe the feeling, but it's very cool.

Two years into home and job stability, I can tell you for sure that I have no interest in moving. I mean, never say never, but we've got a good thing going, and change just for the sake of change is unnecessary. I still crave that feeling. I'm not sure where else you get it.


Why can't I just like "old" music like my peers?

posted by Jeff | Thursday, August 4, 2016, 6:15 PM | comments: 0

I've noticed that a number of my friends from high school and college jump at the chance to see bands that they loved back in the day. I certainly can't blame anyone for that. As a teenager, I just didn't get the "adults" hanging on to classic rock (which in retrospect is terrifying, because that music at the time was no older than, say, Nirvana's Nevermind is now). But something weird happened when I got older. I abandoned most of the growing up music.

OK, so maybe "abandoned" is a strong word. Let's put it this way: I tend to listen to new stuff most of the time. For years I've made yearly playlists, compilations of stuff that I'm into, and I use those as a jumping off point to listen to various albums that those songs are from. When I'm at my desk, or taking a walk, I'll hit those lists most of the time, and go back maybe a year or two. I unfairly avoid 2012, because it reminds me of going back to Cleveland from Seattle and I still can't let that go. The lists also act as soundtracks to my life, apparently.

What I don't do is think, "Gosh, I really need to listen to Def Leppard." That was my favorite band in high school, though I was no stranger to Depeche Mode and Tears for Fears at the time. In fact, high school music in general is something I just kind of find cringeworthy now. Maybe once a year, I get a little fit of nostalgia, but it never lasts very long. I do have a stronger opinion about a lot of music from the 80's, but that '88 to '91 era didn't have much going for it.

Stuff from college, and the late 90's, still creeps into my head some of the time, and I still like it even if I don't actively listen to it. The grunge/alt rock thing resulted in a lot of fun and excellent stuff. A few bands have managed to keep going even today. I have playlists from those years, which at the time were things called "mix tapes." I had a really nice tape deck.

Still, my daily routine is mostly current stuff, and I don't know why that is. I resisted change so much in my early adulthood, and now I need certain kinds of it to be continuous, including the music. I realize that this is atypical of people my age.


Body movin'

posted by Jeff | Wednesday, August 3, 2016, 10:09 PM | comments: 0

I had to make the trip to Tampa today for work, which is normal to do every few weeks because we have clients there. It ends up being close to 200 miles round trip, and it's an incredibly stressful trip because Florida. Today I was surprised at how much my back hurt, not because my car is uncomfortable, but because I tend to be on high alert while driving, and that's where I hold that stress.

The thing is, the physical manifestation of driving stress doesn't usually bother me when I'm moving around daily. I started battling an annoying sore throat and fever last week, so I spent a ton of time on my back. In fact, I've been kind of inactive the last two weeks, mostly because I haven't prioritized moving around enough. I'm starting to get to an age where my body gets just as pissed moving around too little as it would too much.

To that end, living here has made it a lot easier to get off of my ass. While it is kind of gross outside in July and August, it doesn't entirely prevent you from going outside the way that snow and winter does. Having massive theme parks to around in doesn't hurt either. I weigh less than I did when I got here, and I generally feel better, too. The challenge though is being more consistent, because I think age is causing intolerance to inactivity.


Parental beat-down

posted by Jeff | Sunday, July 31, 2016, 8:18 PM | comments: 0

Diana and I have had a rough summer as far as parenthood goes. Our darling little boy has learned the art of rage, and it comes fast and without warning. It mostly involved shouting on his behalf, but there has been some hitting and head butting along with it. The push-pull action at 6 has become more extreme than it ever has. While he'll be fiercely independent about some things like putting on a seatbelt or taking a shower, he'll flip out if he doesn't get help instantly for a toy that isn't doing what he'd like.

As know-it-all non-parents, of course we assumed that kids who misbehave do it because of some parental action (or non-action). While we now know it isn't that simple in the context of various behavioral and developmental disorders, and yes, including ASD, we still look to our past to understand what we may have done to encourage the behavior, so we can correct it. On the one hand, I think we've mostly given him the chance to "struggle," so we haven't shielded him from adversity. I do recall one professional or another telling us however that there would be things where he simply can't logically reconcile a situation the way others would, so he will likely need help developing coping strategies in those cases. On the other hand, it's quite possible that he doesn't understand consequences because frankly we don't enforce them very well. We let him push us to the limit, and then he complies. That's definitely on us, so we've had to start issuing concrete consequences for things immediately, spelling them out in the only warning and then following through. The shouting and hitting, however, have immediate consequences.

I think our frustration peaked recently, and especially on the last cruise. That's a hard time to have a realization, when it's difficult to enforce any kind of consequences. What do you tell him, "No, you can't be on the boat anymore?" We'll have to come up with some proactive plans the next time we vacation.

Our fatigue is partly rooted in summer, I think, and it would be a lot worse if Diana didn't enroll him in various activities throughout this time. I'm grateful that we can afford to give him those opportunities. Our neighbors and his classmate moved a few blocks away, so his most convenient social connections aren't as convenient now. Other area friends of course are doing stuff and taking vacations, so that's hard too. We look forward to him having the structure and regular schedule of school again. Meanwhile, we need to remember to take time off now and then and have regularly scheduled grownup time. I don't know why we forget to do this. It's not like we started being parents last week.


Interior design challenges

posted by Jeff | Sunday, July 31, 2016, 5:17 PM | comments: 0

We went through a pretty serious HGTV phase, lasting through our 18 months or so back in Cleveland and into our first year in the new house in Orange County. It was the makeover and renovation stories that we liked, because it was amazing to see how beautiful these living spaces were. We don't watch the TV shows that often anymore, but we do go through the model homes in the neighborhood as new ones pop up (I think there are 10 builders now). They make me feel like we really suck about furnishing and decorating, especially after being in the house for two years.

I do have some excuses though, not the least of which is that we let Simon kind of stretch out all over the place. He has toys in five places right now, or six if you count the one or two things that end up in my office. The level of room engagement varies, and I admit that we've let him have a little too much at times. There's a part of me that wants to say, "This is your area, and the living room stays clear," but as an only child, that would mean he would be playing alone a lot of the time.

At some point between the holidays last winter, we decided to go all-in with an Ikea BESTÅ renovation for the TV and such. I wanted to ditch the old stand that we had with doors because it was baking our Xbox, and everything else in it. I also really wanted some display shelves mounted to the wall, so when it went on sale, we did that. Some people think the Ikea stuff looks cheap, but I think if you do it right, it's pretty solid. Mind you, I felt good about it until I saw my brother-in-law's custom built-in that he did at his new house. It's completely beautiful. I have to remind myself that he's an architect. Combined with some custom curtains and pillows that Diana made, the living room is definitely comfortable. We still would like to get some better light fixtures, a coffee table and a new chair.

The dining area, which is really all the same room, still lacks a good table. We've just not found one that we like. We did add a wine rack and cabinet that matches the kitchen pretty well. Diana has added accents above the cabinets as well. We still think we want a backsplash in there, but again, haven't found anything we like.

Simon spontaneously said he wanted his room to be Star Wars themed, and Diana responded by jumping into action. She just finished painting the walls in a two-tone, with a dark blue in the top two feet, and glow-in-the-dark star decals. She even painted over the cheap dresser that once doubled as his changing table.

Unfortunately, we hate our room. It's the room with the most expensive floor, too. We originally were going to do a light blue that looked terrible, then ended up doing the whole thing a dark blue. We have nothing on the walls. We want an accent rug, but haven't found the one we want. And it occurs to me that our light furniture may clash with the floor. I really wanted the tray ceiling, but we had upgrade fatigue when we ordered the house. I did see in a model a way to simulate that depth, by framing off part of the ceiling and painting up to it. We may still do that.

The one bright spot is that my office is comfortable and decorated, mostly with stuff we already had. I bought some picture frames to match some others I already had, and it's a wonderfully comfortable place. Since I work from home a minimum of 70% of the time, that's a good thing. I still would like to get a big closet to hide all of my crap, but otherwise it's a functional space.

I give us slack because on TV, they pay people to do this stuff. Heck, so do the builders in their models. Assuming that we aren't going anywhere, we've got time. It's not a race.


When your parent remarries

posted by Jeff | Saturday, July 30, 2016, 10:26 PM | comments: 0

My mom got married today to a gentleman from the next "village" (the subdivisions of The Villages). This comes a few years after my step-dad passed away. I imagine it would be weird to be dating in your 60's, but the cool thing about The Villages is that everyone there is retirement age. I'm happy for her, and that environment has been good to her in so many ways.

Diana's dad is also getting married later this year. She lost her mom shortly before we met for the first time, and in fact we were connected online just before that. I never got to meet her, but her family assures me that she would totally have understood my personality and sense of humor. I think that's a compliment. My new step-mother-in-law was a friend long before this, and also knew her mom. I'm glad they're making it official.

When I got divorced, a decade ago, I was really dating for the first time. I mean, obviously Stephanie and I dated, but I didn't seriously date anyone else. (I know... people who knew me at the time may debate this, but long-distance puppy love and random make-outs aren't really functional relationships.) There was a weird conclusion that I had reached when talking about my fears and apprehension about dating to my therapist at the time: All relationships end in a break-up or death. How's that for morbid? I know, it sounds horrible, but really, there was something completely freeing about acknowledging that. It's not at all romantic, but it's a small and finite list of things that could happen.

As it turns out, there is something kind of romantic about this. If you lose your spouse, probably one of the worst pains you can endure, and you find someone you can love enough to marry after that, then lightning has struck twice. That's pretty awesome. I feel like I've been incredibly lucky to have all of my serious relationships, but there's something to be said for having another chance, especially later in life, following incredibly awful circumstances.


Is racism environmental? Does it even matter?

posted by Jeff | Friday, July 29, 2016, 6:56 PM | comments: 0

One of the things that I found most difficult about my teen and college years was trying to understand how people could be racist. It's easy enough for me to say that it isn't logical, but as a learned behavior, environment obviously matters. I can anecdotally observe that there are fewer people who are blatantly racist every generation, especially if you compare my grandparents' generation to Millennials, for example, but where does it come from?

As much as I can write it off as something that's simply illogical, I'm willing to admit that maybe my own experience leads that thinking. Starting in second grade, I was a part of the desegregation effort in Cleveland. I was bused across town so the schools would not be overwhelmingly black or white. Naturally, as a kid that age, other kids were just other kids, and if it weren't for the fact that school administrators weren't always taking race counts, we wouldn't know any better. It wasn't until I moved to an almost entirely white suburb in high school that I encountered racism, and it was shocking.

College ended up being surprisingly diverse for a school in rural Ohio, but involvement in residence life and a robust international program certainly helped with that. It was my first exposure to the non-Christian religions, and a broad group of people from India, Japan, the Middle East and Europe. And of course, working in software, I don't have to tell you that it's not entirely unlike working in the United Nations. I feel very strongly that this diversity has given me a more complete world view.

Here's the thing though... I really can't reconcile the idea that a grown adult can engage in hate based on race, religion or any other factor, just because they may have been subjected to it in their youth. Eventually you reach a point in life where you should be deciding for yourself what you want to be, and how you want to exist in the world. There is no upside to racism, misogyny, homophobia or any of the other -ism's. None. You gain nothing.


Revolutions usually fail, but a hundred small victories succeed

posted by Jeff | Tuesday, July 26, 2016, 9:05 PM | comments: 0

The years that I worked at Microsoft were a particularly fascinating time for the company (still is, actually). The company was looking for its new purpose in life, beyond the reliance on the cash cows of Windows and Office. One of the things that struck me as odd, coming from the outside, was the arrogance with which a lot of people approached software development. "This is how it's done, this is software development," they would tell me. I would shake my head, as someone who worked in teams that delivered software on a monthly or even more frequent basis, because these words would come from people who shipped software once a year, at best. In their minds, all of the overhead, armies of people, thousands of meetings... this was normal.

The group that I was hired into wasn't like this, of course. We were in the mode of delivering stuff quickly and frequently, and getting feedback from our users constantly. For many of us, especially with experience from outside the bubble, we knew that this was the way the company had to roll in order to evolve, maybe even to survive. I had a lot of conversations with my manager about this, because it was fascinating to see the transition. It drove me a little nuts though that it was slow. I had been in my share of jobs where this need for change was urgent, and I was impatient.

My boss had been at it though for about a decade. His advice on the topic has stuck with me, too. He was effective because he was patient, and methodically built consensus, one small victory at a time. He formalized what I suppose I always knew: You can't show up among other people and expect a revolution. It's true that I have, for much of my adult life, not really practiced this, and probably pissed off more than my share of people. In my current and previous job, something clicked, and I became an effective agent of change myself, and I'm proud of the things I've accomplished. Getting people to come around to your way of thinking is a slow process, and you undoubtedly have to make some compromises, but you can get it done.

This seems like an important topic in light of the current political climate. Putting aside all of the hateful, divisive dipshittery for a moment, the strong convictions of a portion of the Bernie Sanders fans have turned bitter and unable to "settle" for anything less than their guy and his policy. It's not fair for me to characterize this as immature idealism, because being an idealist is what most people do in their younger years. Experience is what gets you to my point of not going for the revolution. Revolutions fail most of the time, and that's true throughout history. But incremental change, that's possible, and as time passes, you can move the world closer to your ideals. That's how it's done. "Fuck the system" is masochistic, and it causes you more pain and angst. Working the system, bending it and changing it gradually, works.

Small victories. That's how you change the world when not everyone agrees with you.