Archive: December, 2018

2018 Review

posted by Jeff | Friday, December 28, 2018, 9:00 PM | comments: 0

These retrospectives seem to come faster and faster. I am acutely aware of the passage of time lately. With that said, given the perception of urgency, let me get to it!

Career

This year was marked by a ton of anxiety, which is a new experience for me. I mean, I'm no stranger to stress, and how to deal with it, but anxiety is something different. When the last year ended, I felt good about the progress I made with my team after a grueling year of hiring, and it was good to turn a corner. But in April, the risk I accepted by joining a small bootstrapped company became a liability when I got let go, and the timing was pretty terrible. I have generally distilled work down to a simple business proposition, where a company gives you money, and you provide something of value, but I swung in the other direction where it was something very much attached to identity and purpose. I haven't felt that way about work in a long time, and in that sense it was a good reminder that we should strive to fall somewhere between those extremes. I let work-life balance get out of whack, and a year ago I knew that was a problem.

Honestly, there was a weight lifted at that point, though the timing was terrible even if the cash flow situation was good (I'll get to that). Around the same time, Gideon, our big cat, was dying of cancer, Simon was struggling at the end of school and picking his skin off because of meds and I was putting in way too many extra hours for work. I needed a break.

I ended up having three reasonable job offers, which frankly was lucky because work is harder to find at the level I'm at. Only one really fit the direction I wanted to go, and they found me, so that also involved a little luck. It was the position I didn't know I was looking for until the new ownership firm invited me to apply. I wasn't even sure it was for me until the second interview.

The gig at PowerDMS has been super challenging, but the thing that's really different is the scale. The difficulty is rooted in my ability to challenge the assumptions I have about how the familiar success patterns apply to a larger org. The good news is that I really like the people, the product and the market opportunity. I can see the future, and it's really exciting. I've not been in a company during a private equity growth phase. Should be an intense ride.

One thing I still struggle with is the balance. In six months I've only taken net 7 days off, even though we have unlimited time off. I did 14 weeks without a break, and even then I did a staycation, a series of date days with Diana. I'm finally taking a week off, on a boat, unplugging completely. I have to remember to do this, because not doing is making an excuse. There will always be something, in every job. Take the time off.

The business

After 7 straight years of decline, ad revenue finally went the other way, and in fact was up 24% year-over-year, which is remarkable since it's mostly from Google. That sounds great, but the decline over the 7 years was on the order of a 70% decrease, so it has to just about triple over this year's total to reach back to 2010 levels. What I still can't nail down is why CoasterBuzz traffic is twice as valuable as PointBuzz traffic. Part of it I'm sure is that PointBuzz leans heavily mobile (69%), and mobile is less lucrative in terms of advertising. It's not age, or at least not in the ratio I would expect, as PointBuzz leans just slightly older to the 35-44 group, according to Google. It's creepy that they know that.

Speaking of the mobile phenomenon, one of the interesting things is that CoasterBuzz sells way more club memberships to desktop users. 77% of club sales go to desktop even though they account for 41% of traffic. I've always maintained that the site is a workplace distraction that weights heavily to business hours, but this seems to reinforce that. Unsurprisingly, club members account for only 1.4% of traffic but view a staggeringly high 7 pages per visit, compared to 2 for anonymous users, and 5.5 for logged in, non-club users.

I need to think of something fun to build and run on the side that isn't world dominating or time consuming, but makes some nice side-coin. That's definitely not some kind of content, but perhaps some simple thing that people will give me recurring money for. I mean, if I could find some reason for people to give me $50 per month, I would only need 20 of them to score a grand per month.

Sustainable energy

We ended up replacing both of our EV's this year. Nissan wouldn't allow us to keep extending the lease on the Leaf, as we started at two years and ended at four. We replaced it with another Leaf, and it's pretty great with about 60% more range. We also sold our Tesla Model S and bought a Model 3, several months after our reservation came up. It's a less expensive car, but still pricey since the "inexpensive" model won't come until they can get to the volume that allows it. It's an amazing piece of technology, and while I like participating in this transition to sustainable transportation, I look forward to the day when a long-range EV costs the same amount as a Prius. After 3.5 years of being an all-EV family, I can't ever imagine going back to gas. Using gas seems completely absurd, and we have 80k miles to back up how much better electric is. I haven't been to a gas station in that time.

We also installed a 10 kW solar system on top of our house. It doesn't quite cover all of our electrical use in the summer, mostly because of the cars and the fact that I now commute. Still, after the federal tax credit, the return on investment period should be just under 9 years, and obviously it adds to the value of the house. We've been in the house for just about a year, and it's not cheap to keep it cool. (It didn't help that the insulation wasn't well distributed, but we had that taken care of in the warranty period.) If we had the roof space for another 4 kW of panels, I would consider it. I applaud California for mandating solar on new construction. It's so obvious that a distributed grid is our future, and looking at Kauai's evolving co-op as proof, we have the technology to get there.

Health

My yearly check up last summer was about where the other have been in recent years. I haven't lost enough weight, or in the case of this year gained, my cholesterol is just a little too high and triglycerides are way too high. But something interesting happened with blood pressure, because I got it down to normal at the time of the visit. I think I was moving around just enough to affect that, along with taking Omega-3 supplements per the doctor's orders. That was a relief.

But the truth is that I have largely treated eating as a sport this year. I definitely eat my feelings, and I let it get out of control this year. I can't tell you how often I've found myself eating to the point of discomfort. I wouldn't say that I've unlearned the habits of the last decade or so, but I definitely have not given respect to those habits. Mind you, I'm still generally avoiding the worst of it, like fried food, excessive junk food, etc., but eating three times your weight in low calorie foods is still overeating.

My activity level isn't good either. I mean, Fitbit actually says I did 2.1 million steps this year, over last year's 1.8 million, but an embarrassing amount of that walking was undoubtedly to lunch or around Epcot during the Food & Wine Festival. The biggest change is that I'm not working remotely, so I'm not getting out and walking around first thing in the morning. I really miss doing that. This is on me, obviously, and I need to make better choices.

The aforementioned anxiety definitely caused some problems for me, but I realized that much of the way I could roll with it was to make time to switch off. I've come to realize that for most of my life I've engaged in what others would call meditation, or some variation thereof. For me it's not an issue of trying to flush my head of all kinds of thoughts, but rather redirect myself toward whatever is present. It can be just feeling the sun on your face while you lie in the sun, or the sound of the ocean (or train whistles in the distance). I think it's also OK to let your mind drift toward fantasy and good memories, too. It's definitely good to have a nice nap now and then, because it's rest for your brain and your body.

This was the first year in a long time that stress was causing the physical manifestation of IBS. For me at least, it generally comes as the result of poor eating or being tweaked out, and in the case of this year, probably both. It got better toward the end of the year, but that extreme cramping in a constipation-diarrhea cycle sucks. It has generally been rare since moving to Florida, but it caused some rough days this year.

Diana had a few serious headaches this year, one requiring an ER visit to break, and also started on a medication that caused her to lose a ton of weight, to an unhealthy point. That was scary stuff, to see her kind of fade like that, but the doctor put her on something else that had weight gain as a side effect. I'd rather she had to watch her intake of delicious cheese than be skin and bones, so we'll take that.

Simon's ADHD medication situation changed a bunch, where he went from picking his skin off to not seemingly have any real effect on a different med, and I'm not sure where we really are now. The problem is that the cycle to prescribe, validate and adjust is so long that I worry it isn't going to help him in an already challenging year of school (because of the fucking testing expectations). It's also not particularly easy to explain medication to a kid who doesn't have anything physically wrong, especially when he also has ASD.

Parenting and family

I feel like I've turned a corner with parenting, but only after a mostly rough year. In all of my desire to see more empathy from Simon, I realized I wasn't exhibiting much toward him. I've spent a whole lot of time to trying to figure out how to balance his independence and helping him, leaning generally toward letting him flail a bit. That's made me the somewhat less liked parent, but I know it's what he needs. He still splits on developmental issues, getting ahead on some things while behind on others, and that causes us all anxiety. The testing pressure is getting to him because he believes that it's critical he not get anything wrong, and reading comprehension (or more specifically, retention) is hard when your mind is all over the place with ADHD. He struggles to even choose a story with the home based lessons, let alone get to reading them.

Where I do feel like I've made some progress is just generally being patient with him and trying not to react emotionally. I've got a long way to go on this, but I feel like I'm getting better at it. Just changing the expectation that I'm not going to flip out on him when he asks a question is a start. He can't compute sarcasm, and jokes don't always land with him, but he's got this level of scientific and relational intelligence being held back from the way he processes the inputs. I can relate to this so much, and when I'm patient, I can find other ways to package something so that he gets it.

More to the point though, I'm latching on to the experiences that make him happy. When he finds music he likes, I listen with him. When he engages in a topic that interests him, I go there. It's not usually social behavior that he gravitates to, but I connect with him anyway. I love his sense of wonder at the world, and wish I could bottle it because I know it doesn't last.

I hope that I've done a good job being a husband, because Diana is a slam dunk as a wife. Her role as mother is critically important because she handles the doctors, medications, IEP and extra activities, and I'm there to support her in all of that. She also looks out for me and checks in every day to see how things are going at work. She still manages to work part-time, and covers a non-trivial part of our budget.

The one thing we don't do enough of, or at least we get into streaks with, is alone time. We get our Broadway season nights off, but then we don't make time beyond that as much as we should. I realized this especially in December when we had a number of outings, compared to a really spread out set of date nights for much of the rest of the year.

We unexpectedly lost Gideon to cancer, our middle cat with all of the nicknames (Basement Cat, Big Papa, Thunder Paws, Fatty, Big Fucker, etc.), in the spring. We had a long run with four cats until Cosmo, my cat, passed in 2013. I expected that Emma, now 16, would be the next to go, but aside from some white fur seems to not be slowing down just yet. Gideon was my favorite of Diana's cats, even though he took the longest to warm up to me. I joke about his weight, but he was mostly just a really large cat. He still liked Diana better, but he was a lover when he wanted to be. I miss that cat, and the timing wasn't good with the job chaos.

We're pretty sure we want to get a pair of kittens once we're down to one cat. It will be nice to have cats that know us all from the start.

No moving

Yay! We didn't move this year! No change of address for an entire year. Getting settled this time seemed to take forever, maybe because it took six months just to get handles on the kitchen cabinets. But despite the slow going, the truth is that the place feels more like a home than anywhere else we've lived. We bought Simon some non-Ikea furniture, Diana's sewing studio has all of the vibes and my office, which I only worked out of consistently for six months, feels like a place where great things could happen. The kitchen has been a warm place where we've made everything from homemade pasta with family to drinks with friends. And there's so much natural light in the evenings, which is everything I love about Florida. The nightly fireworks, just 11,000 feet away, are pretty great as well.

I think this is the year where I finally get over the move away from Seattle. I love that town, to the extent that I still identify with it in some ways more strongly than I did with Cleveland, despite being there only two years. I may still regret leaving Microsoft to an extent, but leaving that beautiful part of the country ultimately created the opportunity for a life here in Central Florida that has been mostly great. I think the thing that made me realize this was just talking with my brother-in-law, who still lives there. The housing costs have become so insane there that you couldn't easily buy in unless you've been there for at least a decade or more building equity. Houses cost double at best, and usually more, and even with higher salaries there, you won't have the kind of financial flexibility you have here. We would have been long-term renters there, but here we've built two houses. Despite being burned by real estate in Cleveland, I still think the long term play is to have something to show for years of living somewhere instead of having nothing.

Vacationing

Toward the end of last year, I got an email about doing a verified fan purchase for Hamilton tickets in New York City. After more than a year of listening to that show, it was time to see it, and I had to get over my distaste for large cities (fueled largely by Chicago and a brief visit to LA). We scored tickets for April, around our anniversary, and made a four-night, three day tour of the trip. I won't rehash that trip here, but we saw HamiltonFrozen and Kinky Boots (with Wayne Brady!), as well as a taping of Seth Meyers. We stopped by Trinity Church to see where Alexander and Eliza were buried, the 9/11 Memorial and Museum, The Met, Grand Central and lots of subway tunnels. We packed a lot of stuff in, but we didn't over-do it, I think. It was just the right amount of adventure travel. I loved the city and can't wait to go back.

We booked a 5-night Bahamas cruise with two stops at Castaway Cay again this year, and while not particularly adventuresome, it's quite frankly one of the most relaxing vacations we can do. Beach days at Castaway are among the best you can have, so going 2x is a lot of best days. There is also a whole lot of built-in babysitting on those ships with the kids clubs, so we get lots of private time, adult meals and bar dates for "free." The down side is that it's so popular that the year-over-year price increased by a grand for the three of us, for the same itinerary at the same time of year. There aren't many deals these days for Disney cruises. That said, we did score a great rate on a three-night that we did just two weeks earlier by booking the last possible day. That seems redundant, but I didn't know what my vacation situation was going to look like once I went back to work (I had one offer by then, anticipating another), so we went big given the deal.

We ended the year on a week-long cruise to the Virgin Islands. To be honest, I enjoy the cruise experience but don't find the tropics to be that interesting as cruise destinations, and a lot of the decision making on these is influenced by the fact that we don't have to fly anywhere. But we still had not been on the Fantasy, so now we've seen the fleet before the new ships launch. We really want to hit the European itineraries, but we're not sure if that's a with or without Simon situation, and in the latter scenario, getting someone to watch him for an extended period might be hard.

Of course, when you live in Orange County, Florida, you do stuff all of the time that is vacation-like. When I finally took time off in the new job, I didn't travel, but I did a series of day dates with Diana. We went to theme parks, did mini-golf, rented a boat... tourist stuff. I'm not sure if that really counts, but there was a lot of festival food and drink at Epcot, and some early morning rides in the new Toy Story land.

On a related note, it has been years since I took so few photos. My phone logged only 1,200 photos, compared to 1,500 last year, this despite the fact that the Pixel 2 is an amazing phone with an amazing camera. I didn't bust out my Canons or my fantastic smaller Panasonic mirrorless either. I feel weird about that, because I love photography, but phones have come a long way, though their fake depth of field tricks are not entirely convincing. I need to do one of my little photo shoots with Diana and Simon this year.

Dollars and sense

This hasn't been a good year. It's hard to make that case when there hasn't been any net adverse effect on life (especially relative to the struggles of others), but whatever, my therapist says it's OK to measure life as it appears before you. The short version is that the fiscal plan for the year tanked in a big way, and there's a lot of real cost associated with it.

The year started with our house sale falling through because of a flaky buyer and a real estate agent (the buyer's) who sucked at life. I fully expected maybe two months of overlap between the two houses, but it ended up being six. Six months with two mortgages. No sooner was that resolved that I ended up forced into a few months of "self employment," which further derailed things. This all went down in the midst of trying to replace the car with the less expensive Model 3, and get solar installed on the roof. All of that adversely affected getting the equity from the previous house rolled into the new house so our cash flow wouldn't be totally screwed up. It cost us well into five figures, and that delayed recasting our mortgage by about seven months (plus another several voluntarily, because dammit, we were still going to vacation hard once in the winter no matter what).

The move to the newer house was totally within our means by all of the usual metrics in terms of housing as a percentage of income, debt ratios and all of that. Even then, I wanted to make sure that the net increase in monthly expenses didn't become astronomically high, so a smaller car payment and less electricity expense would help mitigate that. The end result is that we get there, but almost a year later than expected and no savings to show for it.

None of this is the end of the world, but as someone who used to carry a bunch of revolving debt for years, pissing away money, it doesn't feel good to even lean in that direction. I carried a balance mostly out of convenience for a couple of months (because I had to direct cash to the car replacements and solar, all in progress when stuff happened), and that felt gross. I was also surprised at how medical co-pays and deductibles stacked up, and it angers me that someone making $30k a year would be screwed or just not get the care if they had a similar situation.

On the plus side, the markets all ended the year on sale, thanks to the dipshit-in-chief that keeps freaking out investors with every Twitter hit. My return on retirement accounts is in the shitter this year, but I don't need to retire so whatever. It means I need to make solid contributions.

The world

Last year I said I was disappointed that we had, "Nazis, mass-shootings, massive hurricanes, wild fires, starvation, nuclear proliferation and my country is being represented by a man with no moral compass." Not much has changed this year, but people don't seem willing to admit to supporting a fascist in polite conversation as much as they did two years ago, so that's a step in the right direction. People are getting involved, especially women and minorities, and that's positive. I'm not as down on the world as I was a year ago. I see the seeds of a better future, and I'll do what I can to support that.

Stepping away from social media to some extent helped my world view as well. I get no notifications on my phone anymore, and at this point use Facebook and Instagram more as a historical record for myself than anything else. I only read news from real journalists. I see what good people are doing to change the world. It's not that I avoid politics, because you have to pay attention, but I don't let it dominate my head space.

Am I happy?

I struggled quite a bit in the spring and summer this year. I felt like I wasn't winning at very many things and something about my age was creating a sense of urgency for something I couldn't even define. I didn't think that I was being the father I needed to be. There were lots of uncomfortable feelings. But I eventually started to work things out, retain perspective and try to focus more on being present. While I'm still rolling with the challenges that come with entering midlife, and that's on me, I get so much joy by being around my darling son and wife. I feel like I beat the odds, getting to be with two people that wonderful.

Ultimately, the thing that's important to keep in mind is that we only have so much time, and using it to be unhappy is a choice we can't afford to make. That statement of fact is something that is driving more of my day to day to decisions.


The 2018 Playlist

posted by Jeff | Friday, December 21, 2018, 8:39 PM | comments: 0

Here it is, another yearly playlist in the books. This year's list was all over the place, in a good way. I like things a little weird.

The thing that dominates the playlist is the "Hamildrops," a bunch of songs covering or inspired by Hamilton. It's the gift that keeps giving. They decided not to do a Hamilton Mix Tape 2 album, so instead they released these individual songs all year. I ended up adding five of them, including the "One Last Time" that came out just today, with Chris Jackson and Barack Obama. Jackson played George Washington in the original cast, and Obama does the spoken word part of Washington's farewell address. It's brilliant.

Also weird, I was all about the music that SpaceX was using as the musical interlude to its launch webcasts. I found one of them on Soundcloud at the start of the year, and then was happy to buy the album Test Shot Starfish came out with later. I don't know if it's "good," I just like it because it reminds me to be excited about rocket launches and landings.

I didn't buy very many albums this year, but there were some notable efforts. Bishop Briggs released an amazing collection of songs. Chvrches released another one, but it wasn't as good as their previous albums (interesting because it was their first working with an outside producer, apparently). Wolf Alice also put out a solid effort, and "Sadboy" rocks hard after the bridge. Elle King is thankfully back, and I need to spend more time with that one.

Lots of singles this year that grabbed me. AJR has a lot of potential. Weezer is clearly doing whatever they want. I'm intrigued by this young Norwegian girl Sigrid and her brand of synth-pop (and interesting videos). Mike Shinoda is doing well post-Linkin Park, though many of his songs don't appeal to me at all. I'm really excited to see where the Regrettes go as well. That Bob Moses song I think came out a year or two before, but I didn't discover it until this year.

Overall, it was a good year for music, if a little slow in the middle of the year. I hope this means some momentum going into the next.


The long history of "devops" and my hobby development projects

posted by Jeff | Thursday, December 20, 2018, 10:10 PM | comments: 0

I submitted a speaking abstract for an event last week about how you can use all kinds of free stuff to do continuous integration for an open source project. Also just yesterday, at work we saw Microsoft light up some great integration between GitHub and Azure DevOps (formerly called VSTS, among other things). We're at a point where we're starting to take all of this automation for granted, but I thought it would be amusing to look back at where my own efforts have taken me over the years in the context of my hobby projects. Buckle up... it's a long story. 

If I go back to the launch of Guide to The Point (now called PointBuzz) in 1998, the site was a bunch of static HTML pages. I used an app called Microsoft FrontPage to work with all of the files, but was still mostly manipulating the HTML directly. I used some shared hosting account that was $20 per month. Here's where it gets more ridiculous: FrontPage was actually using extensions on the server so I could manipulate the files directly (over a modem and land line, of course). Every now and then I would use FTP to make a copy of them locally, but I was editing on the live server. There was a Perl-based bulletin board app called Ultimate Bulletin Board (UBB) that ran in its own folder.

By the end of 1999, I had written my own forum app in the old scripting platform called ASP, using the VBscript language. It actually had SQL injection vulnerabilities here and there because I did some dumb things, though none were exploited because bots and script kiddies weren't a thing then. I was still editing files directly on the server with FrontPage.

In 2000, I launched CoasterBuzz  and spent much of the year improving the forum, but my workflow didn't really change. My traffic on the sites was getting ridiculous, so I rented a dedicated server from a company called CrystalTech for a base $350 per month. They were getting annoyed with me because I was using a ton of bandwidth, on the order of 50 gigabytes per month, so I was starting to spend $600+ each month. Advertising was fortunately covering it, but ouch. I was starting to sell the forum app, too, which meant spending a few hundred dollars on a secure certificate for the site, plus fees for a merchant account. The important change during this time was that I installed Visual Source Safe, a very crappy source control system that Microsoft had at the time, on that server. I was still editing files on the server though.

In 2001, CrystalTech was giving me crap about the bandwidth, so I looked into getting a T-1 to my house. Sprint hooked me up, and it was about $1,000 per month, plus the cost of a server I built, SQL license and a Cisco router. Things went to shit that year, with the dotcom bust and 9/11, so I lost my job and my key advertising provider, Doubleclick (which would eventually be bought by Google for the ad serving tech), dropped me. That's the year I started CoasterBuzz Club, which saved my ass.

In 2002 I updated the forum and sites to run on ASP.NET Webforms. I finally started developing stuff locally, and using some combination of Visual Studio and FTP to deploy the sites manually to the server under my desk. And when I screwed up, I had everything in source control. After two years with the T-1, dedicated servers came down in price, and I was spending around $300 per month instead of a grand. By the end of that year, I started giving away the forum for free, because no one would buy it with other free options available.

It was some time in 2004 or 2005 that I switched from Visual Source Safe to Subversion as my source control, again, installed on my server. Beyond that, really nothing much had changed for years. Then, in 2010, while working at Microsoft in the group that also maintained CodePlex (I worked on MSDN/TechNet forums), I moved the source control for the forums to CodePlex so it could be a true open source project. I think I also switched to Mercurial at that time, which was the hotness for awhile and comparable to Git. I recall we used it on MSDN, and I think CodePlex itself was using Mercurial for source control. I didn't actually do a release for the forums on CodePlex until 2011, when I finally finished a conversion to the MVC framework on top of ASP.NET, with unit tests and everything!

Active development on CodePlex ended I believe around 2014, much to the dismay of me and some of my former teammates in Redmond. They didn't announce its closure until a few years later, but knowing of its imminent death, I moved POP Forums to GitHub around that time, which also means I obviously switched entirely to Git for source control.

Also in 2011, Microsoft started testing a cloud version of Team Foundation Server (TFS), and I signed up to be an internal beta tester. TFS had its own source control I think, but they were also going to support Git, which was exciting because CodePlex was doing that too. It was pretty rough, which is to say it barely worked. Even though I left the company late that year, I was able to stay in the beta program. In 2012 they started a public preview, and at that point I moved some of the Subversion repositories I had from my rented server (which had changed companies three times) to Git on what would officially open as Visual Studio Online in 2013. They would rebrand it as Visual Studio Team Services then this year as Azure DevOps. Somewhere in this window, probably closer to 2011, I started using Microsoft's "web deploy," which is a dumb name, to uh, deploy my sites via the web. It's tech that already sits in Visual Studio and most any Windows-based build system, so it's super convenient and very fast.

In 2014, the cost structure for cloud resources, specifically platform (PaaS) offerings and not infrastructure (IaaS), finally beat the curve and allowed me to migrate everything to Azure. That meant no more feeding servers with patches, maintaining backups, cleaning up logs or any of that nonsense. I also lit up a virtual machine there of the cheapest kind, and put my old remaining Subversion repositories there. That VM still has some of the old file structure from the dedicated servers, even though I keep it "off" so only the storage costs me these days.

Starting around 2005-ish, every job I had involved setting up some kind of continuous integration pipeline of building and deploying code. I'm not sure how it ended up being me in these jobs, but the tools were pretty terrible, and every year I had to relearn how to do it. I think at Microsoft we were using Team City and some hacky Powershell scripts to run msbuild or something, and it wasn't until I got to SeaWorld Entertainment where the tooling was intuitive enough to feel obvious. The basic tooling shell and gated nature of those pipelines is still there, but now we've thrown in constantly evolving things to package up front-end code and a lot of scripting to push out to any number of compute flavors.

Despite this work history, it wasn't until 2016 that I fully automated a CI build and release pipeline for POP Forums, the open source project I still maintain (though not very actively, so there's some ancient crappy code in there). It took a few years for the next iteration of .Net, Core, to stabilize, so I finally felt like it was worth it to deploy the latest bits somewhere that people could mess with. This year I went even further by publishing NuGet packages of the code as part of the build, and I use those packages to feed CoasterBuzz when I'm developing it (PointBuzz still uses the "old" version of ASP.NET MVC).

So my workflow today, and this goes a long way from where I started, pushing static HTML to a shared server, is this:

  • Commit and push code to GitHub for POP Forums.
  • Azure DevOps is triggered by GitHub to build the project with all dependencies and run all of the unit tests.
  • If the build is successful, it builds packages that are published to MyGet (I still need to add a step for an npm package, but I'll get to that when there's something interesting to publish).
  • The build is deployed via web deploy to an Azure App Service where the world can mess with it. All configuration is stored in the definition of the App Service, entered via the Azure portal.
  • CoasterBuzz is cloned from a private Git repository in Azure DevOps, and I work on it entirely locally.
  • The CB solution references the packages on MyGet, so I update them as needed. Even the views from the forum are in a package.
  • When I build it locally and it's ready with passing unit tests, I use web deploy from within Visual Studio to deploy CB to the staging slot in the app service, which uses the same configuration and same database (because changes are so rare).
  • I smoke test and validate the changes in the staging slot, and if everything is good, I click a button in the Azure portal that swaps the staging and production instances, and my changes are on the air.

The costs are fairly inexpensive as well. Here is the rough break down for all of the sites:

  • A single S1 service plan (1 CPU core, 1.75 gigs of RAM) hosts all of the sites at a cost of about $74/month. It averages about 80% memory utilization and CPU peaks around 5% during the day at most. I'm super proud at how fast it is, with page renders under 100ms.
  • An S0 SQL database for each site, at $15/month each, and another $5 each for a B database for the forum test site, my blog and PointBuzz Live (our live blog site). That's $45 total for all of the databases. CB and PB get 10 "DTU's," which is their abstraction around "transaction units," or how much you can push stuff in and out of the database. Typical load is around 20% during the day, but it tends to spike to 80% at times, in short bursts. The bursts come from the inefficient self-rolled search indexing I build into the forums. I would use Azure Search for this, but their pricing is terrible, based on storage instead of computing power.
  • Bandwidth is somewhere around 120 gigs most months, and costs about $10. Remember, that first dedicated server I had wanted $200 for less than half of that bandwidth back in 2001.
  • There are all kinds of things that come "free" with all of this, like the fact that there are always about three copies of the databases, and if the "server" ever dies for the sites, it transparently spins up another one. Right now this system barely breaks a sweat at 5 to 10 requests per second (that's not counting fetching static things like images or scripts), but I can scale it up almost instantly to the point it could handle 250 requests per second easily.

It's a crazy different world from 1998. It's still nothing compared to some of the things I've worked at in various jobs, like the MSDN reputation/profile system, which even then handled 100 million transactions per month. Still, all of this amazing technology to use, and much of it is free.


The false intimacy of social media

posted by Jeff | Wednesday, December 19, 2018, 6:26 PM | comments: 0

There is a lot of backlash lately toward social media platforms of all types. I think there is still an outstanding question about whether or not social media really reflects analog social patterns, or if it exaggerates them, or something else, but there are plenty of good reasons to distrust or otherwise not find value in those platforms. Indeed, the only reason I hang on to Facebook these days is that it's where the people are, and I only use it to keep up with a very narrow group of people I care about.

But for me there's a wider phenomenon that concerns me, that a lot of people treat social media as if it were the source of real or deep intimacy with other people. There are so many reasons that isn't the case. To start with, most people are only posting their happy things, so already you have a totally incomplete picture of what people are about. Worse, some will compare their own lives to this sanitized view of another. I think people don't want anything more than the happy path. When Simon was younger, I would post photos from tantrums and such, because frankly I want to remember the hard parts (I'm told I'm unusual for putting stuff on the Internet for myself as the primary audience), but others expressed shock and dismay over this. I still think they're wrong, because for this blog in particular, the people who communicate back to me are all responding to the hard things like parenting and the search for deeper meaning in hard circumstances.

Filtering aside, we have an entire culture of obsession over famous people, some of whom aren't famous for anything other than... being famous. Maybe I have the "benefit" of having met a lot of famous people, but I can assure you that they're probably not that interesting, and at best are ordinary people with exceptional visibility. Still, some feel that they have an intimate understanding of what those people are about, and that's not real.

So pervasive is this obsession that marketers have now embraced some of these people as "influencers." They will actually pay these people, some of whom have tens of thousands of followers for mostly posting the same selfies over and over again, to somehow work product placement into their posts. If ever you needed a reason to be suspect of the false intimacy of social media, a good start is the place when that perceived intimacy is bought and sold.

This is hardly new to the Facebook and Twitter era. In the days of Usenet or web-based forums, it was easy enough to make generalizations about a person based on what they would post, and it rarely connected with who they were in real life. We had personas, for sure, but so many of those people went on to become close (if distributed) friends that I talk to to this day. Like anyone, they're all complex and interesting people not defined by words on a page.

I'm not complaining about this arrangement, really, but I am frustrated with anyone who thinks that you have any real intimacy with people via screens. That's not what it is. Don't make it something deeper than it is.


Years of experience, not stuff

posted by Jeff | Monday, December 17, 2018, 5:00 PM | comments: 0

When we moved to Central Florida, more than five years ago now, we were at the tail end of a financial makeover that took several years. The recession, the housing situation, probably some poor decision making, all put me in a tough spot years before, so at that point there was great incentive to not get back into that hole. I never really had money in the bank before. We had also moved three times four years (and three times since, including to the OC), so we purged a lot of stuff. The two things are definitely connected. In my less responsible days, I used to buy a lot of stuff that I didn't need, mostly for the dopamine hit.

That behavioral change was not easy, but I've definitely stuck with it. One could argue that maybe I just make more money than I did a decade ago, but accounting for a child, geography, inflation and healthcare, the effective difference in income isn't that significant. Around the time of that move, we made something of a conscious decision to emphasize experiences, not things, which has become something of a trendy topic. I can say without question though that it has resulted in a "better" life, which is to say that it has been more memorable and I've felt more present.

So how am I doing this year? I caved and bought a few grownup Lego sets, but almost no gadgetry to speak of. I replaced my four-year-old laptop (business expense), but that was mostly it. Diana hasn't bought any significant quilting equipment. Simon doesn't have many new toys this year, but he's had the opportunity to do SeaWorld camps and do swim lessons, among other things. We traveled hard this year, with three cruises, a few overnight driving trips, beach trips, an extraordinary trip to New York and a quick drop for me into Cleveland for a too-brief Cedar Point visit.

I've had so many times this year where I've sunk into a chair, a little tired, and thought, "That was awesome... what's next?" I might be a little freaked out over the rapid growing of my child, and the growing old of me, but I've got a lot of great memories to show for it. That's what experiences over stuff is all about. Some of it may have come at the expense of some financial goals, but there's no regret there, the way there would be if I just bought crap.


Stumbling into accidental success

posted by Jeff | Wednesday, December 12, 2018, 9:04 PM | comments: 0

Naturally I've spent a lot of time thinking about career success in the last five or six years, in part because I look after my own, but also on behalf of the people that I work with. It's super important. The strange thing is that I'm not sure that success in day jobs is necessarily the kind that we value the most.

This thought came when a friend of mine (an Internet community friend, no less), was somewhat surprised at the long running success of his radio show for kids and parents that he does in Austin on a non-profit station, and syndicated nationally (is it syndication when it's non-profit?). A little record label has come out of it as well, and a whole lot of good times with his delightful kids. He's an attorney by day with some pretty serious academic credentials, but I don't know him for that.

Similarly, I wandered into coaching volleyball, and after a dozen or so seasons, with mostly middling teams, I consider it to be one of my greatest achievements. None of "my" kids, grownups now, have any idea what I do for a living. A lot of people only know me for building a couple of niche community web sites that have been bringing people together now for nearly two decades. I don't know if that's an achievement, but I do know it definitely matters to a lot of people. They don't know what I do for a living either.

Why is this interesting? Because sometimes the most successful things we do were accidental. I didn't go to college thinking, "I'm gonna coach moody teenagers and build some web sites!" (Shit, the first web site wasn't even a thing until a few days before I started college, and I didn't see one until my senior year. Ugh, I'm old.) But if I were hit by a bus tomorrow, those are the things by which most who know anything about me would gauge my success. Also, ironic to this story, radio was the first thing I did professionally in search of success, and despite some rapid and early success, it was a terrible business to work in.

This is normal to me, but the interaction today reminded me of accidental success. Our professional success mostly only matters to us, and maybe the people we work with at any given time, but I don't think it's the success that people really pay attention to. I wonder if this realization frustrates Type-A overachievers. I see people kill themselves for professional success, but why not enjoy the success that comes from simpler things like volunteering, hobby activities and participating in amateur sports? Heck, even parenting is an achievement, even if we never feel like we're successful at it.


Cooking the things

posted by Jeff | Monday, December 10, 2018, 11:00 AM | comments: 0

On the occasion that I want to complain about work being hard, I remind myself that I might be a little ridiculous when complaining between my free massage and lunch prepared by a chef. The guy we have makes some really fantastic food. I don't eat it all (because I don't eat red meat, for health reasons), but all of his poultry dishes are crazy ridiculous good. He has inspired me to try making new stuff.

For example, this weekend I decided to make chicken curry. I've done this a hundred times, but I've generally relied on curry powder alone. At work, he used a couple of different kinds of curry paste, which I never used because I just assumed curry is curry. This was a poor assumption on my part. Curry paste tends to have a lot more flavor density, and it's a richer combination of flavors compared to the powders. The paste I used wasn't very hot though, and so while I combined it with powder I had on hand, I didn't use the hot variety and would do that differently.

I've also had some stuff at work that has made me rethink how to cook certain things. They range from frying technique to breading to ways to cut food. This is another great example of how being exposed to people who can teach you things directly is in many ways more effective than just "looking it up." I've applied this professionally for a long time, but it's a great way to be better at virtually everything that you have to or want to do. Find experts, extract knowledge.


POP Forums wish list

posted by Jeff | Sunday, December 9, 2018, 3:31 PM | comments: 0

These days I don't write code for a job (unless you call email and Slack "writing code"), and though I do get my hands a little dirty with architecture, I get the itch periodically to exercise those coding skills. Fortunately I have those sites that have been with me for about two decades, plus POP Forums, which even had a couple of pull requests in the last year. I feel like niche community sites have some potential for a minor comeback, with all of the distaste for "big social" (I just made that up).

Here's the thing, the forum app does everything I need it to do today, so there's no huge incentive to mess with it. It's super SEO friendly, works mostly well on mobile and can scale to hundreds of requests per second if it had to. Just by cloud scaling the app (up, not out), I could quite easily get it to 500 rps with no code changes at all and it would still be reasonably responsive. I totally don't need that personally, because real traffic tends to burst to maybe 10 rps on a normal day. I've not even tried scaling out. Still, being as old as the app is, it needs to catch up in some ways. It took me almost three years to bring it to .Net Core, as I started from the early betas and it changed so much that it was a pain to get it there. But at least from a back end standpoint, it's reasonably modern. I have a wish list...

  • Adopt a new front end framework where practical. Forums are 98% static pages of text in terms of usage, so there is no good reason to make it a single-page application (SPA), and in fact with Google's evolving algorithms, that's risky anyway and might harm SEO. But there are areas where you can create silos of SPA-like functionality. The admin side is one area, which isn't indexed anyway. Some of the auto-updating and the user stuff could benefit from it as well. Today there's some fairly lean jQuery in there. I could never make a business case for these changes, but for just learning something new, I can. I'm leaning toward Vue.js, because it's well suited to these silos.
  • Finish the Azure Kit pieces. I already added some stuff to accommodate the use of Redis for caching and Azure Search, but didn't go as far as making a box to put the background services in Azure Functions and use proper queues. This isn't hard to do at all, which is why it's appealing. This would further help with the scaling that I don't need by moving that work to a different kind of compute resource, and enable multi-instance capability by getting it out of the web process.
  • Get back the unit testing on the web project. When I ported to ASP.NET Core, I ended up ditching most of the unit tests at the controller level. It doesn't make sense to do any of that until I figure out the previously mentioned front end bits, and I also don't care much for where the lines are between business logic and the controllers. Some of the decision making is in the controllers where I don't like it, which is an artifact of being code that's a decade old.
  • Make the web app all package installs. I'm part of the way there. You can package all of your views now into a NuGet package, so it's way easier to build a bigger app around it, like CoasterBuzz. Even now, I publish the latest build to a private NuGet feed as part of the CI process, so getting the latest bits into CB is easy. You can override any individual view as necessary with a local file. I need to go the rest of the way with the front end dependencies though to shore this up. Minimizing should also be part of the process.
  • Update Bootstrap. There has been a major new version of Bootstrap since I last approached style. It's different enough that there's some work to do there. I've never embraced any of the LESS/SASS for this project because there isn't much incentive to as an open source project. I set no colors or other variables. The CSS there is makes up for around 200 lines. I'm pretty happy that it mostly uses the conventions there.
  • Configuration cleanup. I'm pretty sure that config is done wrong, because that evolved during Core's many changes as well. I don't think localization is done right either, though it definitely works (six languages!).
  • Get the data plumbing cleaned up. Among the weird remnants of 2004 is the fact that you can't instantiate some domain objects without passing an ID into the constructor. This is a throwback to the days when I put CRUD logic in with domain objects. In my defense, that's the way we did it back in the day, when we didn't have ORM's and DDD wasn't widely practiced. I also have a series of little extension methods to streamline all of the SQL connection and command stuff. As much as I'm not crazy about taking dependencies on frameworks, I'm thinking about adopting Dapper to handle all of that.

That all will keep me busy for a long time, I suspect. Walt and I have vague and poorly defined desires to update PointBuzz, which is still running on the "old" ASP.NET MVC. Part of that might be exploring some traditional social media-like features, in which case having a solid base is important. I enjoy working on this stuff, but it's not the easiest thing to do as a hobby because it still requires you to be really plugged in and focused. That's not always easy when you just want to have a glass of wine and passively hang out after work.

I still, casually, wonder if I should work the app into a hosted, multi-tenant solution. That's a surprisingly uncrowded market. The persistence layer is so well isolated that it wouldn't be hard to get there. It would be worth it even for a few hundred bucks a month of slush money.


Apathy is a privilege

posted by Jeff | Friday, December 7, 2018, 11:30 PM | comments: 0

I made the mistake of looking at Twitter today, because on occasion I see interesting things about musical theater stuff or software development that's interesting. But these worlds don't all live in isolation, and of course politics bleed in. A software guy asserted that losing friends over politics means they weren't really your friends because politics "ain't that important."

I find that to be a wholly stupid view of the world.

Politics in America have the strange distinction of being both the reason and solution for our worst attributes. For example, politics both codified and eliminated Jim Crow laws. That it can change at all is likely the reason we've managed to keep the nation going at all, because without that hope that it's possible to change the things that are wrong, we wouldn't make it.

Generally, I hate the term "privilege" because it has been co-opted to trivialize any kind of achievement. Like, I may achieve milestones in my career, and some will use that term to imply that it was easy because I didn't have the obstacles that a person of color would have. It wasn't easy, it just wasn't made harder by a lack of whiteness. I wasn't entitled to reach those milestones. Regardless, privilege is absolutely the notion that you can be apathetic toward politics because you don't have anything at stake. The wisdom of Martin Luther King, Jr., explains it best in the Birmingham jail letter:

First, I must confess that over the past few years I have been gravely disappointed with the white moderate. I have almost reached the regrettable conclusion that the Negro’s great stumbling block in his stride toward freedom is not the White Citizen’s Council-er or the Ku Klux Klanner, but the white moderate, who is more devoted to “order” than to justice; who prefers a negative peace which is the absence of tension to a positive peace which is the presence of justice; who constantly says: “I agree with you in the goal you seek, but I cannot agree with your methods of direct action”; who paternalistically believes he can set the timetable for another man’s freedom; who lives by a mythical concept of time and who constantly advises the Negro to wait for a “more convenient season.” Shallow understanding from people of good will is more frustrating than absolute misunderstanding from people of ill will. Lukewarm acceptance is much more bewildering than outright rejection.

That last part is really important. Out of concern for other humans, it's important not to be complicit in their harm.


"Children are our clocks"

posted by Jeff | Wednesday, December 5, 2018, 9:39 PM | comments: 0

A friend of mine that I worked with a decade ago posted a photo of his oldest kid on Facebook today, and it occurred to me that she looked so... big. I commented that, "Our little humans don't stay little very long." He replied, "It's a bittersweet process if there ever was one." Another mutual coworker from that time responded, "I believe that our children are our clocks." That perfectly puts into words what I think every time I see a photo of Simon from even a few years ago. He'll never be that chubby little person again.

I think this is one of the reasons I've been somewhat anxious about aging in a way that I never have before. Simon is the only child we'll ever have, and he's almost as close to being a legal adult as he is to his birth date. The time has gone quickly, and it's not going to slow down. That might be why I put a lot of pressure on myself to be a good parent, because it doesn't seem like there's much time to course correct.

Our late start certainly makes it feel more urgent. Late 30's is a late time to get into parenthood, and inevitably I compare to friends that are quite literally grandparents now. My adult reboot is effectively 12 years in progress, which simultaneously feels like a lot of time and not that much.

But back to the kid... he'll never be this again. He'll never be younger again, either. It seems like every year brings different kinds of joy, different kinds of pain and unexpected challenges. The thing to keep in mind is that so far we have this epic series of memories, and we continue to emphasize those experiences. I try to keep that as my focus, and enjoy my time with the little man. There is more joy, pain and love to come.


I want to leave Facebook, but...

posted by Jeff | Sunday, December 2, 2018, 10:46 PM | comments: 0

The headlines around Facebook lately are not good. If being complicit in aiding the worst of humanity and playing a part in the social manipulation of people by foreign agents wasn't bad enough, now we've got reports about the executive team doing really douchey stuff.

My personal dislike of it has more to do with the way it has made niche publishers and communities somewhat obsolete. Sure, people share stuff via Facebook, but people don't really click through and read stuff. And for communities on any topic, any idiot can make a page and build a community instead of going to some independent thing. Facebook (along with Google) is the Internet for a lot of people, and it's the very opposite of what made the Internet so awesome, the widely distributed, anyone can force their way in nature of it.

To be sure, it's not that it's all a shit show and doesn't have utility. I've been able to maintain some long distance friendships for more than a decade, and might not have been able to otherwise, because of Facebook. It's strange how there are some friends from college that inevitably roll into Orlando, and we can pick up as if we never missed a day, despite thousands of miles of moves and kids and jobs. That is every manner of amazing. I've also found it valuable as a journal of sorts that records my travels and important events.

Social media in general also gets a bad rap for things that it is probably not inherently responsible for. Narcissists and people who lack humility would probably be that way without the Internet. I also don't buy that we only share a sanitized version of our lives online, because frankly I wouldn't share the worst of life in person with people I encounter at work or social circles. I do think the whole "influencer" thing and the micro-celebrity phenomenon is wholly ridiculous, but it's just a bigger version of the small town/big fish phenomenon.

Still, Facebook survives its bullshit for one reason: It's where the people are. If the people I care about stop using it, I will too. What sucks about that is that I'm not sure we'll find somewhere better. I've gone on record with saying that I would happily give money to a new social network where there were no brands, no ads and I was the customer instead of the product. The problem is, I don't think people would ever go for that, and that's unfortunate.


Remembering George H. W. Bush

posted by Jeff | Sunday, December 2, 2018, 5:26 PM | comments: 0

Richard Nixon was president when I was born, which I'm embarrassed to say I didn't realize that until today, because I never stopped to do the math. Gerald Ford came a year after I was born. Jimmy Carter was the first one I actually remember. Ronald Reagan was president most of my childhood. George H. W. Bush was elected my sophomore year of high school, so he's the first one that I knew in the context of learning about government and politics. I remember thinking at the time that it just seemed natural for a vice president to go on to president. I was sad to hear of his passing this weekend.

Presidents are first-hand witnesses to an extraordinary amount of history, but Bush might have seen the most, relative to a single term. The end of the cold war and the Soviet Union were extraordinary on their own, but then add in the invasion of Kuwait and the Gulf War. I also remember his leadership around getting the ADA passed, and his environmental concerns. The importance of volunteerism that he talked about also stuck with me. He was very moderate in retrospect, and his many philanthropic partnerships with Bill Clinton after his presidency make it clear that he was a man of solid character.

I'm a lot more politically aware than I used to be. I imagine that I would be fairly split on Bush's policy today, but he still represented what a president is supposed to be: A voice of leadership and hope even in difficult times. As much as I didn't care for Bush's son's horrible foreign policy, he was the person we needed for 9/11. It's incredible, how important a president's words are, even if their policy has less obvious effects.

My thoughts are with the Bush family. "Poppy" had an extraordinary life.