Tales from the jar side: A Groovy Podcast, OBS with chroma key, and the time Chuck Norris told me to cease and desist (really)
Dad joke: Where do criminal rainbows go? Prism, but with only a light sentence.
Welcome, fellow jarheads, to Tales from the jar side, the Kousen IT newsletter, for the week of January 31 - February 6, 2022. This week I taught my Managing Your Manager course and my Basic Android Development course on the O’Reilly Learning Platform. I also recorded a Groovy Podcast.
Regular readers of this newsletter are affectionately known as jarheads, and are widely acknowledged to be far more intelligent, sophisticated, and attractive than the average newsletter reader. If you wish to become a jarhead, please subscribe using this button:
Whenever my newsletter becomes too long for email (like this week, yet again), you can read the full version online. If you miss an issue, the entire archive is there as well, and everything is free and always will be.
New Groovy Podcast
This week Sergio del Amo and I recorded a new Groovy Podcast.
We talked about the release of Groovy 4, the new serialization and email modules in Micronaut 3.3.0, using Java 17, and much more. As usual, you can find all the video and audio versions of the Groovy Podcast on its home page, and all the show notes are here.
(As an aside, for no reason, we are most definitely not hosted on Spotify.)
In a seemingly unrelated note, as a kindness to Sergio, I’ve stopped sharing my Wordle results on Twitter. I’m still playing, but I don’t tweet about it any more. Of course, that has as much to do with the fact the New York Times bought the game as anything else.
(The definition of irony: “The company said the game would initially [emphasis added] remain free to new and existing players,” a statement that appears on the NY Times linked article inside the paywall. Sigh.)
Chuck Norris and the Cease and Desist Letter
This week a friend reminded me about the time I got a cease and desist email from the attorneys for Chuck Norris.
Yes, there’s a story about that, and I haven’t told it here yet. It involves publishing an Android app that got taken down, followed by an act of minor rebelliousness on my part.
The story dates way back to 2013, when I first started giving presentations on Android at the No Fluff, Just Stuff conferences, as well as teaching Android training courses. I needed an application to demonstrate how to access a RESTful web service, parse the results, and update the user interface.
The web service I chose is still going strong. It’s called the Internet Chuck Norris Database, and it has an API that serves up jokes in JSON format. You can try it out by clicking this link. Here’s an example, with a bit of formatting applied:
If you specify the firstName and lastName properties in the URL, you can change the name of the hero. This link recently gave me:
I recommend sticking with the nerdy category (as these do), as many of the other jokes are not, shall we say, suitable for public consumption. I wrote a simple Android app to do the job that used the Spring for Android library.
Remember the Spring for Android library? Neither does anybody else. Mostly it was restricted to a RestTemplate instance from Spring and a couple message converters, one of which worked with JSON data. I loved it, because it made the call and transformation a single line, but sadly, the project was abandoned years ago.
As a technical detail not directly related to the story but interesting anyway (at least to me): In Android, you can only access the network if you’re not on the UI thread, but then you can only update the user interface widgets if you get back onto the UI thread. To make that easy, Android created a class called android.os.AsyncTask. If you created a subclass of AsyncTask, the doInBackground method was automatically off the UI thread, and the onPostExecute method was back on the UI thread, and that was perfect for me. I also used the Gson library from Google to convert the JSON data to Java classes, and the relevant code looked like this:
All I had to do was go to the button’s onClick method, instantiate the JokeTask, and call its execute method, and it all worked just fine. Easy peasy, lemon squeezy.
You can still see a version of this original code in this GitHub repository, entitled ICNDB (for Internet Chuck Norris DataBase).
That worked for a while. First Spring for Android was abandoned, and I had to switch networking libraries. I reluctantly adopted the Retrofit library, which everybody in Android loved (both then and now), but I found it awkward and verbose, if very powerful.
(That’s a pattern that Android repeats constantly: take very simple code and replace it with something much more complicated but much more powerful. Sure, the end result is “better” — for certain values of better — but you lose the ability to do simple things simply. From a performance, security, maintenance, and even a look-and-feel point of view, I guess that’s good, but from a teaching point of view, in the classic words of Lindsay Ellis, “Thanks, I hate it.”)
The rewritten app is in another of my older GitHub repositories, ICNDB_AS, where the AS stands for Android Studio. That’s right, this time frame covers the transition away from the Android Developer Tools plugin for Eclipse (lots of yikes) to the much more stable and capable Android Studio.
(Incidentally, since Android Studio is very closely derived from IntelliJ IDEA, that transition is also when I finally bought my first IntelliJ license. Like so many developers, I’ve never looked back.)
The next part of Android to get abandoned was that AsyncTask, but that’s another story. I’ll just say that my highly unpopular Hot Take™ is that I never had a problem with AsyncTask and was very sorry to see it deprecated.
In order to demonstrate to the students how to publish an app, I added my ICNDB app to the Google Play store.
(Wait, did you hear a rumble of ominous foreshadowing? If not, please insert one now.)
Approximately one week later, I received an email from Patton Boggs, LLP, attorneys for Mr. Carlos Ray “Chuck” Norris. Here is the email, in full, dated July 11, 2013, with a couple of my own annotations in bold:
Dear Sir/Madam:
Patton Boggs LLP represents Carlos Ray Norris [emphasis mine], aka Chuck Norris, the famous actor and celebrity.
We are contacting you because we recently learned that you have developed and are distributing a software application that uses Mr. Norris’s name and/or image without authorization on Google Play.
Mr. Norris appreciates all of his fans [again, emphasis mine]. However, the unauthorized use of his name and/or image severely harms my client and jeopardizes his existing business relationships.[My free app severely harms Chuck Freakin’ Norris? I thought he was supposed to be tough!]
Mr. Norris owns legal rights in his name and image which includes copyright, trademark, and publicity rights (the “Norris Properties”). He uses the Norris Properties regularly in his own business endeavors. Therefore we have asked Google to remove your application from Google Play [again, emphasis mine] because it violates Mr. Norris’s intellectual property rights.
We request that you (1) immediately stop developing and distributing “Chuck Norris” applications; (2) remove all “Chuck Norris” applications that you have developed or control from all websites under your control; and (3) do not use Mr. Norris’s name or image, or any cartoon or caricature version of Mr. Norris’s name or image for any endeavor, including in connection with software applications, without Mr. Norris’s permission.
Thank you for honoring Mr. Norris’s legal rights. Please contact me if you have questions.Sincerely, …
I’m leaving out the lawyer’s name, partly because he was just doing his job and partly because my wife is a (retired) attorney and is sensitive about things like that. The email did include a direct phone number for that attorney, a main phone number for the firm, and even a fax number, because of course they still had a fax machine in 2013. I wonder if they called the IT staff in order to use it.
First observation: Did you know that Chuck Norris’s name is actually Carlos Ray Norris? I had no idea. I find that highly amusing, especially given his political views. Let’s just say grandpa watched too much Fox News and leave it at that.
Next, let me give you a couple of updates about the law firm:
It is now called Squire Patton Boggs, without the LLP, which was formed in 2014 when Patton Boggs and Squire Sanders merged. They’re now a world-wide firm with over 1500 partners and lawyers. Maybe I should rethink this whole “waving a red flag in front of a bull” thing.
I did check, and the person who sent me the email is no longer there. I found him on LinkedIn, though, and he’s now an Associate General Counsel - Commercial, working at some firm in Austin. I was tempted to try to contact him because I feel oddly connected, but that seemed unusually foolish even for me.
Back to our story:
What the letter fails to explain is exactly what I did wrong. My app didn’t cost anything. In fact, the source code is on a public GitHub repository, and the data that I’m consuming comes from a different, free website, which has no copyright or anything attached to it.
I decided to ignore the letter. Three days later, Google suspended my app.
I remember I was at an NFJS conference when that happened, because I can picture the hotel but I’m not sure what city it was in.
(Aside: Here’s a fun game you can play with your NFJS speaker as we resume live events starting in April. Corner them in some nondescript conference room right after a talk and say, “You have 10 seconds. What city are you in right now?” Watch as hilarity ensues.)
Now normally, I’m a total coward. The last thing I want to do is get into a confrontation, especially with a Big Star (not to mention Chuck Freakin’ Norris) with way more resources than me. But this time I got annoyed. I therefore went through my app and essentially did a global search-and-replace, changing the words “Chuck Norris” to “Carlos Ray” everywhere. I then created an image icon for the new app that included the law firm’s name right in it:
(Yeah, my artistic abilities are pretty limited, but you get the point. Presumably so did the law firm.)
I then published my new app, now christened the Internet Carlos Ray DataBase, at the Google Play store. I even gave it a five-star rating, with the following review:
I then told everybody about it during my NFJS talks. That led to a few more very funny 5-star ratings (“Best Carlos Ray app ever!” says one of them). At its peak, I had literally tens of users. Woo!
As you can probably guess from the fact the app is still there, nothing happened, and nothing has continued to happen ever since. I never heard a peep, and to be honest, I hadn’t given the app another thought for years until the tweet this week that reminded me of the story.
I should mention that I recently redid the whole app, this time using Retrofit and the Jetpack libraries for ViewModel, Data binding, and LiveData. You can find the new app in this GitHub repository, called JokeApp.
Here is a sample image from it:
In case you’re wondering about that image, I found it on Pinterest and the site promised it’s in the public domain:
See? It says it right there in the image: Free stock photo - public domain photo. It might even be true. I don’t really know. What I do know is that if you go to the Google Play store now and search for Chuck Norris, this is what you find:
I counted at least 25 apps, all doing what I was doing or more, and all with images of various levels of copyright and/or trademark infringement. Little do they know that I fought the non-battle that enabled all of them to be there.
Also, there’s still only one Carlos Ray app, however, so I have that going for me. Which is nice.
A couple of postscripts:
No, I haven’t published the revised app. More on that below.
I spent a fair amount of time rewriting my app to use ViewModel, LiveData, and Data binding. Once I’d finished, I found my ICNDB_Jetpack GitHub repository, which does all that pretty much the same way and even adds an additional layer for the networking. Yes, I’ve reached the stage in my career where I write entire apps only to discover that I’d already done the same thing years ago.
I can’t update that app in the Play store because it was published years ago and I did the one thing you can’t do: I lost the signing key. I can publish a new app (which I haven’t done yet, and probably won’t, because “been there, done that”), but I can’t even update the old one without the key, so it just keeps getting older. Oh well. At least I got a story out of it.
True Android developers would tell me I should be using Jetpack Compose for the view layer now. All I can say is I’m working on it. I’ve been going through the code labs for Compose, including learning how to handle state, recomposition, hoisting, and all those related topics. It’s taking a while.
For an example of Jetpack Compose done correctly, with multi-platform support, a Ktor client for networking, using Kotlin serialization and everything, see the People In Space app by John O’Reilly.
I Can Use OBS Now
I teach a lot of courses on the O’Reilly Learning Platform. One of the downsides of doing so is that once I share my screen, the students can no longer see me. For some reason, the platform can only show either the screen or the camera, but not both.
(Interestingly, that’s not an issue on Zoom calls, When I share my screen on Zoom, the attendees can still see me in the corner. The limitation I’m describing is for the On24 system used by the O’Reilly Learning Platform only.)
Not being able to see me is frequently to my advantage, given how often I teach early in the morning, before I am, shall we say, camera ready. Heck, most of the time I don’t even have on my Zoom outfit, which is a formal shirt and pajama bottoms.
(No, even though I joke about it, I don’t normally code naked. At least as far as you know.)
Still, it would no doubt be a better experience for the students to see me, especially when I’m using a lot of slides, as in my Managing Your Manager talk this week. One way to handle that is the OBS (Open Broadcaster Software) Studio application, which is a very popular free streaming app.
The other feature of OBS that I wanted to use was its Chroma Key filter. That’s how you make your own background transparent, so when you appear in front of an editor, web page, or other item, you don’t have your own background that covers up what you’re seeing. Here’s a snapshot of me with the transparent background:
When I turn on the “virtual camera” in OBS, I can display that image with me confined to the corner and not blocking more of the view than necessary.
This is only possible because over the holidays I got my new MacBook Pro with the M1 Max chip. I still have yet to hear the fan on the machine kick in. I don’t even know that it has a fan, and that’s exactly what I wanted when I bought it.
Hey, I’m Mildly Popular On Medium
For a few months both before and after my Help Your Boss Help You book was published in July, I was cranking out related articles on Medium roughly every week, in the Pragmatic Programmers publication.
Repetition has its advantages (wait, I thought familiarity breeds contempt? One of those). This week the Prags published a list of their Top Ten articles from 2021:
As my friend Dave Klein pointed out, I have three articles in the Top Ten:
I wound up very busy on technical issues, so I haven’t published another of those articles for a while, but I have at least two more in mind. Hopefully I can get back to that eventually. Here is the direct link to all my Medium publications.
Tweets 'N Stuff
Financial Incentives and NFTs
Like many people, I watched that cringe video between Paris Hilton and Jimmy Fallon about their Bored Ape NFT purchases, experiencing a level of dismay bordering on horror, and like everyone else I wondered what in the world brought that on. Fortunately, somebody did the research:
It turns out that many of the celebrities selling NFTs these days are represented by CAA, the Creative Artists Agency, and CAA is a big investor in OpenSea, the site that sells NFTs.
I’m sure that’s all just a coincidence, though.
Moonrise
I loved this picture:
All I could think was, “Yikes! The Moon sprung a leak!” I never got around to tweeting that, though.
Waiting for Babylon 5
The gist is that the CW is for sale, and there are several current potential buyers. The network decided they couldn’t buy as many pilots or series as they anticipated until this all gets sorted out. The result, according to this Patreon post by JMS, is that the development of the new Babylon 5 series is now scheduled for Fall of 2023 rather than this year.
The last, best hope for good sf will have to wait a while.
The Washington Football Team
On Groundhog Day, of all days, the owners of the Washington football team announced the new team name: The Washington Commanders.
The Washington Commies jokes practically wrote themselves:
I grew up as a third-generation fan of that team, but in Hall of Truly Awful Owners, Dan Snyder gets an entire wing to himself (no doubt part of the Jerry Jones complex). Any opportunity to poke fun at his expense is a good one.
Meanwhile, In the UK
The UK is undergoing a massive scandal that could turn into a constitutional crisis, and it’s being almost completely ignored on this side of the pond. Fortunately, this video will help.
I love that attending parties could be what brings down the Prime Minister. That feels like convicting Al Capone for tax evasion.
That’s right, all you Woodchuck Chuckers
Finally, my wife and I celebrated Feb 2 in the traditional manner:
So many great lines. A tiny sampler:
Phil: This is one time when television really fails to capture the excitement of a large squirrel predicting the weather.
Teacher: You say this is your first lesson?
Phil: Yes, but my father was a piano mover, so…
Rita: What did you do today?
Phil: Oh, same old, same old.
Phil: Why are you here?
Rita: You said stay, so I stayed.
Phil: I said say, so you stayed? I can’t even make a collie stay.
I could go on and on, but maybe I’ll save that for next year, which will be the 30th anniversary (!) of the release of the movie. In the meantime, don’t forget your booties, campers, because it’s cold out there today.
(It’s cold out there every day. What is this Miami Beach? Not hardly.)
As a reminder, you can see all my upcoming training courses on the O’Reilly Learning Platform here and all the upcoming NFJS Virtual Workshops here.
Last week:
Managing Your Manager, on the O’Reilly Learning Platform
Basic Android Development, on the O’Reilly Learning Platform
Groovy Podcast Season 6, Episode 1
This week:
Spring and Spring Boot in 3 Weeks, week 1, on the O’Reilly Learning Platform
Spring Data JPA, an NFJS Virtual Workshop
$ type chuck-norris
chuck-norris is aliased to `curl -s https://api.icndb.com/jokes/random?limitTo=[nerdy] | jq .value.joke'
$ type chuck-norris
chuck-norris is aliased to `curl -s https://api.icndb.com/jokes/random?limitTo=[nerdy] | jq .value.joke'