The Boston Diaries

The ongoing saga of a programmer who doesn't live in Boston, nor does he even like Boston, but yet named his weblog/journal “The Boston Diaries.”

Go figure.

Wednesday, February 09, 2022

Chicken taco masala

Bunny and I found ourselves out and about and looking for dinner. Our first choice for dinner was “permanently closed” (pity, we liked that place). Our second choice was in the process of closing (for the night—not permanently). Frantic, I did a search for restaurants in our immediate area and that's how we found ourselves at Taco Masala.

Indian-Mexican fusion cuisine?

Sure, why not?

Okay, it's more Indian than Mexican, but still, it's not every day that I have Chicken Taco Masala (it's not called that on the menu, but seriously—it should be). And as far as Chicken Tikka Masalas go, it's good. Very good.

But a warning—their “medium” tends towards the hotter end of “medium,” and that's really the only complaint we had about the place.

Friday, February 11, 2022

Stockholm Agile

After spending the month of January yelling at anybody who would listen that The Process™ is not working (and that list includes my new manager and a Corporate Overlord Vice President, who is now listening in on our daily scrum meetings due to some disasterous deployments last year when the Corporate Overlords pretty much took over our department when our previous previous manager retired). It's been made clear (not in a bad way—I wasn't disciplined nor had to talk to HR about my concerns) that The Process is The Process and upper management is perfectly fine with our current course. And I'm finally coming to accept the things I cannot change, that I told upper management of my concerns (several times) so I did what I could. I think I'm finally accepting the fact that I am now doing “enterprise development,” which includes “Agile developement” and seven weekly departmental meetings (down from eleven—seriously!).

If only teaching paid more than it does …

I was in a nearly three hour meeting today (second of three), doing what is called a “transfer of knowledge.” I'm the only developer left on my team who actually knows how “Project: Wolowizard,” “Project: Sippy-Cup,” “Project: Lumbergh,” “Project: Cleese” and “Project: Seymore” all fit together in production (even if I don't fully understand all the business logic implemented by “Project: Lumbergh”). So I spent my time mostly talking and answering questions from the other developers, including the team leader. Bunny was concerned that it might lead to me being let go, but just for my own sanity (and because plenty of other people at The Corporation have told our Corporate Overlords that under no condition should I be let go) I decided not to sink into cynical dispair and treat it for what it is—getting some other developers up to speed on the various components.

At the end of the meeting, one of the new developers asked if I used to teach, or if I teach on the side, since my explanation of how everthing fit together was coherent and understandable, unlike instructors at his school. I told him that no, I've never been an instructor, nor do I teach on the side. He went on to say I have a gift in explaining things.

I'll take that as a win.

Get thee behind me, Satan

In my third meeting of the day with my latest new manager, I got some incredibly good news—I might be able to return Satan, the useless Windows Laptop whose only purpose is to be continuously updated when Network Security sends me an email saying it's 20 minutes out of date and needs to be updated and get to it, chop chop! The Corporate Overlords are planning on sending a Mac laptop that can get on both the Corporate VPN and the Corporate Overlords' VPN (but not at the same time—that's not allowed) which obviates the need for Satan the Windows laptop. Woot!

If a bug is found and no one cares, is it still a bug?

I've been enjoying reading The Codeless Code over the past month. It's been helping me to accept the process, but I'm not entirely sure what to make of “The Codeless Code: Case 219 Nothing Really Matters,” especially in the light of a recent event at work dealing with undefined behavior. To place the story in context, I'm the senior monk Wangohan, my team leader is the junior monk, yet has the attitude of master Kaimu.

The story is to inform us that since the language and and the tooling around the language didn't warn of the issues, then the junior monk was right in ignoring them, and Wangohan was wrong for chastising the junior monk. But in my case, it was undefined behavior—tools might not catch it! And I'm already weary of my team leader's dependence upon testing, using it (in my opinion) as a crutch.

I have to meditate on this.

Wednesday, February 16, 2022

A call for Gemini without TLS

There's currently quite a bit of talk in the Gemini community about dropping TLS support, or at least make a non-TLS version of Gemini available. I find this amusing since the entire reason for TLS in Gemini in the first place is that the creator of Gemini, solderpunk, wanted to add TLS to gopher. So when he designed Gemini, it started with TLS at the base. But over the years, the collection of people who want to remove TLS from Gemini come in two groups. The first group are the ones that wish to replace TLS with some other encryption scheme, because TLS sucks or is too complicated or subject to insecurities with the certificate authorities. As I stated a few weeks ago on Hacker News:

I think it even applies to “never implement crypto on your own”—are you sure you've taken into account side-channel attacks? Timing attacks? Random number generation (if it's required)? Cleaning memory after use? That memset() isn't optimized out? There's a lot to get right …

(The whole thread is interesting to read)

I do recall on the Gemini mailing list (when it was available) that one person said TLS should be replaced, did an actual implementation of an alternative encryption scheme and decided that wasn't such a good idea after all. The conversation pretty much died after that (imagine that!).

The second group of anti-TLS people also argue that TLS sucks or is too complicated or subject to insecurities with the certifacate authories, and just want TLS removed entirely—go plain text. Well, that currently exists—gopher. It's even easier than Gemini sans TLS—there's no URLs to parse or relative links to resolve. Also, just because TLS is a third-party library isn't an argument I would make because while TCP comes with operaing systems today, that wasn't always the case. Back in the 90s, the entire TCP/IP stack was at one point a third-party library for the most popular operating systems that weren't derived from Unix. And today it's the case that the new Google hotness, QUIC, is a protocol only available as a third-party library. No, a better argument is that current TLS libraries suck to use, and it's hard to know which ones to use. That agument, I can sympathize with.

Furthermore, let's say Gemini never specified TLS to begin with. I guarentee you that someone shortly after it appeared would be screaming for TLS to be added, because “encrypt all the things! Why didn't you bake in TLS from the start? Why do you hate us?”

You just can't win here.

Thursday, February 17, 2022

Congratulations Apple! You made a laptop as annoying to use as Microsoft Windows

The new Mac laptop arrived today. I will say that Apple packaging is top notch and beautiful in a Zen-simplistic way. Just beautiful. The laptop itself? Eh … it's physically smaller than my previous laptop, and it has that insipid touch bar across the top of the keyboard. And the less said about that keyboard, the better. Upon turning the laptop on, I was beset with pleading messages to update software from Apple, the Apple Store and from … Microsoft?


Thing is only thirty minutes old, so of course it's ancient and not worth the brushed aluminium it's made from. Burn it to the ground, salt the earth, and start over again.

Damn this upgrade treadmill.

If that wasn't bad enough, Apple is now copying Microsoft's playbook and made a ton of gratuitous changes to the various system configuaration windows, making it all the more difficult to adapt the settings to how I like them. For a period of time, it looked as if my entire work flow just wouldn't be possible (mainly, I log into my work Mac laptop via ssh and do all my development via the command line with a Real Keyboard™ and not the utter XXXX that is passed off as keyboards on laptops of any make these days), but I did find the tweakable option to enable ssh access. Of course, twenty seconds of not using the physical laptop will cause it to sleep, thus making it unresponsivle via ssh and none of the settings I've tweaked has stopped it from doing that.


So while I have a ton of corporate crap like Microsoft Word, Excel, PowerPoint and big brother-esque spyware to prevent me from “infecting” the computer, it did not come with any development software on it. Of course it didn't! Who uses computers for development these days? Granted, if I purchased said laptop, I would expect to have to install the development software, but for a corporate pre-installed laptop for my job? That involves writing software? I have no words.

So yeah, I no longer have to use Satan, the useless Windows Laptop. Now I have to use Belial, the annoying Mac Laptop. I suppose I could try asking for a Linux laptop … yeah, who am I kidding? That will never happen.

Monday, February 21, 2022

This will take some time

Belial, the annoying Mac Laptop proved to be too annoying to use last week, so I left it off to do some actual work on Friday. I set aside today just to do updates, and the first thing was to install the developer tools, per the popup message when I tried running the C compiler. The initial time estimate to download and install the developer tools? 104 hours—over four days. In reality, the estimate kept bouncing up and down quite a bit—Apple certainly took a lot of notes from Microsoft—and it ended up taking a few hours. But hey, the process is the process, and we must process the process to ensure the process has been processed, right? Right.

Next up was Microsoft Teams. We use it for meetings and it refused to run on the new Mac laptop until its been updated. Of course. So let that run its course over a few more hours and hurrah! It runs! So now I can attend meetings on Belial, the annoying Mac Laptop. Hurrah?

I also had to update some security software running on the box. I swear, it seems like my job is to just update the corporate laptops.

Tuesday, February 22, 2022

Because each update takes longer than 20 minutes, it's obsolete upon finishing, so more updates—welcome to the update treadmill

Day two of updates on a day filled with twos.

No, seriously. I'm still updating software on Belial, the annoying Mac Laptop. This time the rest of the Microsoft suite of programs. That took an additional half day to finish (party because there was a lot to download, and party because the Microsoft update program would spazz out and stop downloading at random), but in the meantime, I can use the laptop to attend meetings (sigh). On the plus side, one day closer to Satan, the useless Windows Laptop being sent back from whence it came.

I also got the laptop on both the Corporate Overlords' VPN (the entire reason for the useless Windows laptop) and the Corporate VPN. Of course, you can't be on both at the same time. And of course, the Corporate VPN isn't in the list of default VPNs on the software being used, so I have to type in the server every time I want to use the Corporate VPN, which is daily. It's not like The Corporation is a second class citizen in our Corporate Overlords' eyes or anything. No, not at all.


Wednesday, February 23, 2022

How I spent my day updating yak shaving


That's all I've been doing this week on Belial, the annoying Mac Laptop.


So I'm all ready to checkout our source code repositories:

[sconner]belial:~/repo>svn checkout
-bash: svn: command not found


I install the developer tools, and Subversion is not installed?

usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]

These are common Git commands used in various situations:

start a working area (see also: git help tutorial)
   clone             Clone a repository into a new directory
   init              Create an empty Git repository or reinitialize an existing one

work on the current change (see also: git help everyday)
   add               Add file contents to the index
   mv                Move or rename a file, a directory, or a symlink
   restore           Restore working tree files
   rm                Remove files from the working tree and from the index
   sparse-checkout   Initialize and modify the sparse-checkout

examine the history and state (see also: git help revisions)
   bisect            Use binary search to find the commit that introduced a bug
   diff              Show changes between commits, commit and working tree, etc
   grep              Print lines matching a pattern
   log               Show commit logs
   show              Show various types of objects
   status            Show the working tree status

grow, mark and tweak your common history
   branch            List, create, or delete branches
   commit            Record changes to the repository
   merge             Join two or more development histories together
   rebase            Reapply commits on top of another base tip
   reset             Reset current HEAD to the specified state
   switch            Switch branches
   tag               Create, list, delete or verify a tag object signed with GPG

collaborate (see also: git help workflows)
   fetch             Download objects and refs from another repository
   pull              Fetch from and integrate with another repository or a local branch
   push              Update remote refs along with associated objects

'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.
See 'git help git' for an overview of the system.

So you have git but not Subversion.

Oh! You removed Subversion from the developer tools!


Oh, I can install it with MacPorts? Cool.

belial:~ root# port install subversion
-sh: port: command not found
belial:~ root#

Oh. Okay. I see. How do I get it installed? Oh, I need to install Xcode and the Xcode command line tools. I just have the command line tools.

Oh, XCode is only available via the Apple Store. I don't have an account to use the Apple Store. I mean, I do, but there's no way in XXXX I'm going to use my private account for work. Let me see if I can compile Subversion from source.

I'll spare you the details—I can't. Subversion requires The Apache Portable Runtime Project and that project can't quite figure out the system and I'm not versed enough (nor paid enough) to debug autoconf tool issues.

When I ask the Corporate Overlords about updates via the Apple Store, I'm told that that particular issue hasn't actually been hashed out yet. Nice to know that Mac users aren't second class citizens in our Corporate Overlords' eyes. I end up creating a new account for use with the annoying Mac laptop and hope any changes to my credit card can get expensed.

Oh, XCode is over 12G in size?


The initial estimated 104 hours to update is actually turning out to be rather accurate.

Of course I'm opinionated—if I wasn't, I would be in a cult

One of the other developers on my team ran part of our code through SonarQube and well … I have issues with its issues with our C code.

Out of the 600+ issues it flagged, about 500 or so seem to be related to the use of restrict in the code. For example (using my own code):

int btm_cmp(
        struct btm const *restrict d1, /* it doesn't like this */
        struct btm const *restrict d2  /* or this */
  int rc;
  assert(d1 != NULL);
  assert(d2 != NULL);
  if ((rc = d1->year  - d2->year))  return rc;
  if ((rc = d1->month - d2->month)) return rc;
  if ((rc = d1->day   - d2->day))   return rc;
  if ((rc = d1->part  - d2->part))  return rc;
  return 0;

I don't care what MISRA says about it—it signals intent. That these two pointer parameters to the same type are distinct objects and should not be the same object! All you have to see is the function prototypes for the standard functions memcpy() and memmove() to see this. memcpy() is:

extern void *memcpy(void *restrict s1,void const *restrict s2,size_t n);

and thus, the two memory regions aren't supposed to overlap; for memmove():

extern void *memmove(void *s1, void const *s2,size_t n);

the function states the memory regions can overlap. Intent. Geeze.

Of the rest, I don't agree its arbitrary limit of 20 items in a union. The union in question describes packet types of a custom protocol, and I will not split it up just to satisfy some arbitrary limit in the scanning software. Who came up with goto labels being all upper case? No, I don't agree with that as it clashes with over fourty years of C convention where purely uppercase is reserved for constants and macros. I don't agree with the excessive casts it suggests, and I don't agree with removing the one cast I do have.

I disagree about the “useless” parentheses around isdigit because I'm signalling my itent to take the address of the function, not the macro. The C99 standard says this (from section 7.1.4):

Any function declared in a header may be additionally implemented as a function-like macro defined in the header, so if a library function is declared explicitly when its header is included, one of the techniques shown below can be used to ensure the declaration is not affected by such a macro. Any macro definition of a function can be suppressed locally by enclosing the name of the function in parentheses, because the name is then not followed by the left parenthesis that indicates expansion of a macro function name. For the same syntactic reason, it is permitted to take the address of a library function even if it is also defined as a macro.

(emphasis added). The code it's complaining about is:

if (!extract_token(tmp,sizeof(tmp),&p,(isdigit)))
  /* ... */

The various is*() functions are often defined as macros (they are on the compilers we use). I also dislik the “remove useless parentheses” crowd, if only because the C precedence table is screwed up compared to most other languages.

I'm not going to refactor the code just because some scanner thinks the function is doing too much—it's not. Yes, the function itself might be long, but it's converting a rather complex structure from C to Lua (or Lua back to C). I'm not going to break it up just because. Besides, naming things is one of the two hard problems in Computer Science (the others being cache invalidation and off-by-one errors) and I would have to come up with some name for all the new one-use only functions.

But I'm not going to reject everything it said. The suggestions such as reducing scope of variables or making some const are fine. And there were two bugs found, but overall, there was quite a bit of noise to go through. Hopefully, I can argue my case for the ones I disagree with.

We shall see.

Get thee behind me, Satan, part II

Woo hoo! I just received the shipping label to return Satan, the useless Windows Laptop!

Friday, February 25, 2022

An update on all the updates

I finally got Subversion installed on Belial, the annoying Mac Laptop, not via MacPorts but with Homebrew (suggested by several people, both at work and elsewhere). I did end up installing OpenSSL from source when I coudn't seem to install the headers for development, but then, I'm an old grey beard so I'm used to installing packages from source (I have both OpenSSL and LibreSSL installed on my home development system for example, but the less said about that, the better). But I get to keep the old Mac laptop around, just in case.

The new Mac laptop just doesn't quite feel like a Mac. I'm not sure what it is, but it just feels a bit … off, as a Mac. I'm not sure if it's the corporate big brother software installed on it, the gratuitous changes Apple has done to the UI, or the other subtle changes that have been done over the years, but it just doesn't have that … fun feeling it did back in 2005 when I started using Macs. I'm finding it hard to articulate why I feel this way. At least the updates don't require a reboot.

Satan, the useless Windows Laptop has been packaged up, the mailing label slapped on the box, and tomorrow it will be dropped off so that FedEx can send Satan back to whence it came.


Monday, February 28, 2022

The process of starting at a company I've worked at for a decade

[I almost used the word “on-boarding” in the title, but then I realized that's marketspeak and I don't want to use marketspeak as I find the synergism incondusive to the synchronistic harmonizing of perpendicular incentives. Or something like that. I digress … ]

Now that the Corporate Overlords are in full Borg mode (“Resistance is futile. You will be assimilated.”) I just have to laugh at the process. Last Friday, I was sent instructions about signing up to the Corporate Overlords' Gitlab instance in email. The email consisted of “Here's the steps” followed by an image of the list of items to do, where the first item consisted of a few steps, the last of which was:

… and send an email to some-address-

followed by the text “thk.” So I wrote back saying the instructions appeared to be cut off partway through. Today I received a reply. The reply consisted of a Microsoft Word document, which included an image of the list of items to do, where the first item consisted of a few steps, the last of which was:

… and send an email to some-address-

followed by the text “thk.”

That is comedy gold right there.

Obligatory Picture

[It's the most wonderful time of the year!]

Obligatory Contact Info

Obligatory Feeds

Obligatory Links

Obligatory Miscellaneous

You have my permission to link freely to any entry here. Go ahead, I won't bite. I promise.

The dates are the permanent links to that day's entries (or entry, if there is only one entry). The titles are the permanent links to that entry only. The format for the links are simple: Start with the base link for this site:, then add the date you are interested in, say 2000/08/01, so that would make the final URL:

You can also specify the entire month by leaving off the day portion. You can even select an arbitrary portion of time.

You may also note subtle shading of the links and that's intentional: the “closer” the link is (relative to the page) the “brighter” it appears. It's an experiment in using color shading to denote the distance a link is from here. If you don't notice it, don't worry; it's not all that important.

It is assumed that every brand name, slogan, corporate name, symbol, design element, et cetera mentioned in these pages is a protected and/or trademarked entity, the sole property of its owner(s), and acknowledgement of this status is implied.

Copyright © 1999-2022 by Sean Conner. All Rights Reserved.