Archive: August, 2019

Our current theme park usage

posted by Jeff | Sunday, August 18, 2019, 2:57 PM | comments: 0

We've now lived in The OC for a little over six years. We acquired Walt Disney World passes quite literally the day after Simon and Diana arrived (I was down a week earlier). We were in the midst of the rainiest July on record for Orlando, but it felt totally amazing. To this day, I can enter those parks and have fuzzy feelings that remind me of vacationing here.

While it does feel more routine at this point, I still don't take it for granted at all. It's hard not to have a little smile as you walk over the bridge and see the Tree of Life, or take in the smells on your first Food & Wine Festival visit, or whatever. This year, renewing our passes had a little more sting though, as the total cost for three of us was $1,900, about $500 more than it was when we arrived in 2013. We went about 22 times last year, which is the fewest of any year if I had to guess, so the per-person cost for each visit was $28. Keep in mind most visits are around four or five hours, not full days.

This is a really weird situation now: We have passes to all three of the majors. Disney has been continuous, but now we have SeaWorld (which includes Aquatica and Busch Gardens Tampa), because a friend working at corporate generously gave us his friends-and-family passes, and Universal, because they had an 18-month deal for the price of 12 that I could not resist. Since April, we've visited each park at least once per month, so I think our total park visit count has actually increased a bit.

One consistent theme is that I see the different standards that the parks operate on. SeaWorld parks are beautiful and have pretty good food, but ride operations just aren't very good. Last weekend we watched a kid start the kiddie train with a mom still fastening her kid's seatbelt (and they let him keep operating with a supervisor watching). Universal has generally poor quality food at every turn, but ride operations are hit or miss depending on the ride. Disney is on another level with everything they do, and even counter service food is more than passable as a meal.

The Epcot Food & Wine Festival is around the corner, which will mean a lot of spontaneous visits, even for lunch now and then. The concert lineup isn't very strong this year, but last year they did a good job with more chicken dishes and fruity drinks. I can't wait.

There's never a shortage of things to do here, that's for sure. Theme parks aren't everyone's thing, and that's OK, but our family has a good time year-round visiting, and it's particularly nice to go when friends from out-of-town are here.

The struggle is (always) real

posted by Jeff | Thursday, August 15, 2019, 8:56 PM | comments: 0

This has been a tough week. Simon has completely missed his first week of school, and given the timing of his last fever, he should technically stay home tomorrow. There's literally nothing I can do about it, but it breaks my heart to see him miss the first week and all of the getting-to-know-you stuff. Work has been very challenging lately, in part for reasons I can control, but also reasons I can't. We worked through a big issue with the HOA this week, which I honestly wasn't that deep into, but I still had to contribute in any way that I could. I'm also preparing to entertain family this week. I'm mentally pretty spent.

Here's what really freaks me out though: It seems like regardless of your achievement, success (whatever that even means), age or experience, life is always something of a struggle. I think about the challenges that Simon has, and he's only 9, relating them to my own childhood experience. I think about Diana and her migraines. I think about my completely strange career path and all of the turbulence to get here. No amount of cruises or driving in electric space cars makes life feel like less of a struggle. I am not a Type-A overachiever personality by any stretch, but is anything ever easy? Is life a struggle in every context, or do we make it that hard?

I'm sensitive to this in part because I've largely tried to avoid miserable people. I don't want to be that guy. I know that I don't need permission to feel overwhelmed, exhausted or otherwise suboptimal, but I don't want to be one of the people who never seem happy. There's a whole lot of happy in my life, but some days it's hard to see when I feel so beat down. It comes in waves, and I'm in a big wave right now.

Meh, I just need to vent. After all these years, I'm still not good at balancing out life. I see a therpaist about every six weeks, and it's almost always the topic... understanding myself and how I move through the world in a way that leaves a positive effect without giving twice what I take. That's harder than it sounds. Idealistic, 20-year-old me would be horrified to know how deeply I want to leave a positive mark. I don't need the recognition (well, maybe a little recognition), monuments, fame or anything like that, I just want to die knowing I moved the needle in the right direction. That's hard when it's a struggle.

Six weeks ago, I was flinging bread off the side of a boat at fish over a tropical reef in the Bahamas. That was not a struggle. Gotta keep that in perspective.

Behold, the Lego Millennium Falcon

posted by Jeff | Sunday, August 11, 2019, 5:12 PM | comments: 0

I waited about 20 months, which is pretty good self-control, before I finally bought the Ultimate Collector Series Millennium Falcon. But it was my birthday, and I decided that I deserved it. It is, in fact, glorious.

Judge me if you want, but spending $800 on the biggest Lego set ever created is pretty much what any adult Lego fan with disposable income would do. There are over 7,500 pieces in this thing. The next largest set in my collection is the roller coaster at 4,124 pieces, then the Disney Castle at 4,080. I'm not sure what the total build time was, but if I had to guess, it was probably around 30 hours.

I find myself stressed more than I'd like lately. I imagine it's a combination of work, parenting and just every day life. But the one thing that sets me at ease consistently is sitting down to build one of these big sets. I put on some tunes, grab a beverage, and start at step 1. I'm using my hands and my mind and turning a mess on the table into something cool. It's very satisfying.

Simon has a few of the small Star Wars sets, but I haven't bought any of them myself. The Death Star always seemed kind of neat, but I never pulled the trigger. The Millennium Falcon is arguably the most unique and junky space ship in science fiction, and it's an enduring work of art. I'm gonna cry a little when I finally see the one next door at Disney's Hollywood Studios. What makes it so interesting, and such a great candidate for a Lego model, is all of the detail and texture. Most of the surfaces on this thing are rich in that detail, and it looks amazing.

The build starts with a frame, and from there you snap the interior rooms into it, and then attach panels around everything. You don't want to "fly" it around making "pew! pew!" noises, because it's not durable like that. One of the last pages in the instructions actually shows how to carry it around so as not to break it.

The finished product has the original radar dish, which you can swap out for the replacement that appears in the newer movies, since the original was clipped off in the final Death Star battle. It comes with old Han Solo and the younger version minifigs, so you can pair them with Rey and Leia as appropriate. You'll also find BB-8, C-3PO and of course Chewbacca. There's a pair of little porgs too. The instruction book has a rich history of Millennium Falcon Lego sets, and stuff about the design of the ship in the movies. Also you should know the book is spiral bound and weighs 7 pounds.

I didn't find anything super challenging about the build, because they're really good at writing instructions, but some of that texture on certain panels can be a little tedious at times. You definitely have to count out all of the parts before each step to make sure you get them all on the model. There's a lot of rotating and flipping given the scope of this beast.

I really enjoyed this build, more than any other set (the Disney Castle is a close second, if you're wondering). The disassembly should be interesting. As I mentioned last year, I do disassemble to the numbered bags used in the original packaging. The fun is the building, not just the finished product. I wouldn't drop $800 to build it once. This one will probably be pretty easy, if a little time consuming, because most of the 17 bags are just panels over the frame.

Overall, I strongly endorse this set. When it was announced, it seemed a little ridiculous, but I think it's entirely worth it now that I've got it. I look forward to rebuilding it for years to come.

I wrote a tiny library: POP Identity

posted by Jeff | Sunday, August 11, 2019, 4:20 PM | comments: 0

Many years ago, I decided to take advantage of the third-party "social" logins that were available in conjunction with the evolving ASP.NET frameworks. Being able to sign in to something using a Google or Facebook account is convenient. When I went down that road, the tough part is that it was so heavily baked into the Identity libraries and Entity Framework. After much digging and looking at source code, I was able to decouple it enough to use it in POP Forums, but what a pain. It evolved a little when ASP.NET Core finally shipped, but it was still a lot of magic.

A few months ago I started looking at ways to make the forums run in a multi-tenant environment, and the external login stuff just wasn't compatible, because it has to be configured at start up. That doesn't work when every tenant has different client ID's and secrets. I started to think about this as high level as possible. What was I really after? All I wanted was to get the third-party's ID for the user, and maybe the name and email if I could get it. Most of these services are using OAuth2, which is a pretty simple protocol to use, where you bounce the user off of their server, and exchange the resulting token for the claims you're looking for. All of that complexity seemed pretty unnecessary.

So I wrote a little library to make it work called POP Identity. I put the intention right in the readme:

This is for people who think that the existing ASP.NET Core external login system is too much magic, or too tightly coupled to Identity and/or EntityFramework. It didn't evolve much from the old OWIN days. It has the following goals:

  • Be super light-weight, handing off just enough mundane detail to the library.
  • Allow code to change client ID's, secrets and other parameters at request time, as opposed to the built-in framework that sets this all at startup. This makes it appropriate for multi-tenant situations.
  • Allow the developer to persist the resulting data (external ID's, name, email, etc.) in whatever manner makes sense. This library has no persistence.
  • Defer authorization logic to the developer. It doesn't setup any claims identity... that's up to you.

Phil Haack recently made the correct observation that it's pretty rare that you get identity claims from third-parties and make it durable for use in your application (a few days after I started this mini-project... timely!). There really isn't a need for auth schemes and more configuration in startup to enable all of this if you're not using the Identity libraries and the persistence that goes with it. My sample shows how you can get these basics and bake them into whatever you need them for. In POP Forums, I get a little more serious, first with a single controller action that redirects you to the appropriate service, then a callback action that either logs you in based on an ID and provider match, or starts a workflow to associate your social account with a new or existing account in the forum app. No references to the Identity libraries. The only part I'm leveraging from the framework is the sign-in mechanism that creates a cookie to identify the user. From then on, I use simple middleware to check that the user's request is legit and that they are in fact still a user in good standing (and cache the user data for the duration of the request). That might all require a longer post to describe, but the important part is the calls to POP Identity.

I haven't built anything for general use in a long time, and I remember why I don't want to ever write frameworks or generic libraries. Even if you're the clever idiot who figures out how to break it, you have to try and account for those situations. That's exhausting! I figured this was so limited in scope that it would be easy, but I started poking holes in it right away when I added it to the forums. For now though, it supports Google, Facebook, Microsoft and any generic OAuth2 provider that returns JWT's. Twitter still uses old OAuth, so I didn't bother with them.

A 9-year-old view on mass shootings, Trump and other news

posted by Jeff | Monday, August 5, 2019, 7:56 PM | comments: 0

Diana and I will typically watch the evening world news, generally NBC's 6:30 show. With a journalism education, I can't say that I always agree with how they rank things as newsworthy, but I do believe they report truthfully and have an appropriate amount of depth for a 22-minute show. Simon tends to wander in or out, and we're generally pretty careful about not letting him see anything particularly disturbing, but we instinctively didn't think we should hide the weekend's shootings from him. He has to do active shooter drills at school, and a little context seems appropriate.

The distraught family members mourning their loss seemed to upset him the most. But it's interesting to hear his angle on things that we've never really talked about. On guns: "You should only have guns to protect yourself, not murder lots of people!" He associated "big" guns with bad guys. I explained to him that it's not so much the size as what the technology enables.

"When I grow up, I want to have cameras around my house so it's secure." I felt like I had to ease his fears a little there, and explain that it's pretty rare that anyone gets shot, but especially at home.

The next story was about President Trump, and his carefully scripted speech denouncing hate crimes. Understandably, the story showed how contradictory he has been, with any number of things that he's said previously. This is an area that I've been particularly careful with, because while I think the guy is a toxic embarrassment to our nation, I don't want to diminish the seriousness and importance of the office. Again, a child's view is one that adults often willingly dismiss. "Why does anyone like him? He's so mean to everybody. He's not nice to people." That isn't the first time he's said that in response to news, and I've tried to explain to him that no other president in my lifetime has ever been like that. (I didn't tell him "from either party," because he's not going to know what that means.) The kid is no stranger to bullies or unkind people. Kids can be real dicks to each other, and he knows what that looks like.

Maybe this is partly the ASD, and his general disregard for social contracts he can't reconcile, but racism is completely over his head. I mean, I'm happy that's the case, but he can't rationalize that it even exists. Certainly that makes sense, given that he's never gone to school in or lived in a place where most everyone around him was white. I hope his generation does better than every one before it.

He has weighed in on other topics as well. Weather stories are disturbing to him, and he's asked about the frequency of tornadoes and hurricanes. The science is a little mixed on that, I told him, because there is possible correlation between location, strength and other factors, but frequency is a harder one to pin down. But there are clearer links between climate change, which is scientifically attributed to human causes, with sea level rise, drought and wildfires. He doesn't understand why gasoline cars are still a thing either, because they're "stinky." That's five years of EV-driving for him.

Simon is fond of the kicker stories in the news, which inevitably involve a person overcoming adversity, or something with pets, or anything that otherwise reminds you that human beings don't all suck. It's a relatively simple truth that we all need to be reminded of. Sometimes 9-year-olds have the best view.

Wanting to retreat

posted by Jeff | Sunday, August 4, 2019, 12:51 PM | comments: 0

There was only one notification on my phone when I woke up this morning. It was from the New York Times, mentioning the shootings in Dayton, a day after those in El Paso, and a few more after the deaths in Gilroy.

This is not unfamiliar territory. On the morning of June 12, 2016, Facebook was encouraging me to check in and mark myself "safe," for reasons that weren't immediately clear. A few minutes later I was watching TV, where every local affiliate was on Orange Avenue, blocks away from where Diana and I work, reporting that someone shot a bunch of people at Pulse, and no one was really sure how bad it all was. Knowing that Pulse was primarily a gay nightclub, I frantically started checking the social media of my local friends, hoping they were OK. By Tuesday, I found all of my friends were not involved, but they were far from fine. It was their community that was attacked, and few people were more than one person away from someone who had died.

The next few days will be predictable. People rightfully outraged by the violence, especially given its hate and racist fueled origins in El Paso, will demand action. Gun rights advocates will insist that there's nothing anyone can do, that the guns aren't the problem. They might even suggest more people should be armed, which is a wholly insane suggestion when it happens in a Walmart in Texas.

And then nothing will change.

The same cycle will occur with the environment, which is also objectively in trouble. Money in politics will continue to keep the system broken, and it won't change either. The president will say something else that's racist, and people will cheer him on.

I look at my boy, and wonder how things are going to turn out for him. I'm not optimistic. I thought that after the last recession, we as a society were moving in a responsible and accountable direction. In the last four or five years, I've seen the opposite. It makes me want to retreat into a cocoon somewhere, sleep it off, and hope things are better when I wake up. Hope, unfortunately, is not a strategy.

Today was a good day

posted by Jeff | Friday, August 2, 2019, 9:48 PM | comments: 0

 I was talking with a candidate at work about time off, which happens to be unlimited. Maybe that sounds like something ripe for abuse, but on average I believe people take about three weeks off per year. All things considered, that's actually pretty good in America, if well below what Europeans take.

For people at my career stage, you'd probably start with four weeks off even if they keep track. In my first year, I took 16 days off, and none of that time was five straight days that included a non-holiday. You could look at that two ways. The first is that I'm really dedicated to my job, and that's good. The second is that I may have been neglecting my priorities as a father and spouse. The reality is probably somewhere in the middle.

Summer went by fast, and suddenly I realized that we were coming up again on the start of school. Simon has one last camp next week, and then it's back to the classroom. My window for family time was slamming shut. So last week, faced with an insane amount of meetings, I made a day off for today happen. Originally we planned to go to Busch Gardens Tampa, but the rain forecast was dire, so we went to Universal instead (where most of the rides are indoors). When the rains did come, I spent time with Diana just binge watching some Veronica Mars.

Today was a good day.

I can't let time get away from me like that anymore.