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.

Tuesday, November 06, 2001

Oriental Market

So I find myself in an Oriental food store with Spring. Soy bean snacks. Chocolate covered cracker sticks. Dried seaweed. Squid. Tea. Lots of tea but still no Black Currant. Supposedly sweet snacks made of rice. Or soy. Or octopus. Incense by the gross. Chop sticks. Tea pots. Pickled bamboo shoots. Pickled pepper. Pickled pickles. And even more odd food stuffs that my thoroughly Americanized palette refuses to believe is even edible, much less good as Spring insists.

But the soap smells nice. Mmmmmmmmmmmmm … sandalwood.


Slug buggy yellow …

While I've never really played before, Spring is a connoisseur of Punch Buggy. So since she's moved down here, I've had to come up to speed on the game.

So we're sitting in the Computer Room working away when “Punch Buggy blue and blue,” said Spring, lightly tapping me on the shoulder.

“What?” I turn around and she points to a picture on the screen—in a traffic snarl deep in some city are two VW Beetles.

“And it doesn't count on a car lot,” she said as I scrambled for a web browser.

“I'm not heading there,” I said, doing an image search on Google. “Slug buggy yellow, slug buggy blue, red, green, blue, um … yellow, blue, black—”

“Are you done yet?” said Spring.

“Wait a second … just a few more pages … ”

Wednesday, November 06, 2002

Music of the dead

But then, Tupac Shakur's Better Dayz, released later this month, is no ordinary album. It is the 16th Tupac release since the gangsta rapper's murder in September 1996.

Sixteen albums in six years would be a prodigious feat for an artist who was still breathing, particularly when you bear in mind that many of them are double CD sets. For a dead artist who released only four albums during his lifetime, it smacks of macabre exploitation, not to mention an ever-dipping quality control.

Via Robot Wisdom, Albums from the crypt

Tupac is certainly in the running to be the L. Ron Hubbard of the hip-hop set. Sixteen albums? That's good.

So let's see—to make it in the music industry, record lots of music. It doesn't have to be good, just there. Release an album or two and lead a very exciting or controversial life (preferably both) then fake your own death. Cut the proceeds 50/50 with the record industry and live the rest of your life in style.

I think it could work.


“Honey, play as long as you like … ”

A bit early for Valentines but this would also do well for a Christmas gift for that gamer girl in your life. It's … um … well … a multimedia game that extends … um … yea …

Let me just say the link is borderline work safe … and the game in question is definitely meant for home use …

Ahem.

Sunday, November 06, 2005

The good news is: I can fix it!

We use MRTG to monitor bandwidth at The Company. I've recently been tasked with taking over the monitoring machines for the network overall. I had to reinstall the operating system on one of the two monitoring systems, and once I get things settled with that server, I can then move on to reinstalling the other monitoring server.

If I weren't so darned diplomatic, I'd call MRTG a piece of XXXX, but I'm not like that, so let's just say that MRTG has it's problems.

I installed MRTG a few weeks ago but you'd never know it as random logfiles seem to get truncated mysteriously. So, now that things have more or less returned to normal, I start looking into this.

MRTG is buggier than a flea circus. I get a lot of this:

Use of uninitialized value in concatenation (.) or string at /usr/bin/mrtg line 1197.

Oh, guess what? MRTG is written in Perl.

Lovely.

Checking out the offending line:

        print HTML <<"TEXT";
<!-- maxin $peri $$maxin{$peri}{$router} -->
<!-- maxout $peri $$maxout{$peri}{$router} -->
TEXT

So, it's unlikely that $peri is undefined due to the context (it's the index of the loop this code appears in), so that leaves $router, %maxin or the hash referenced by $maxin{$peri}. It doesn't really hurt the program that one of these is undefined (since in a string context, Perl returns an empty string for an undefined reference or scalar or whatever is undefined at this point) but I get the warning anyway because the programmer added a use strict, which is used to track down such problems (I guess, otherwise, why use it?). I'm guessing that this isn't normally supposed to happen, and is indicative of a deeper problem in the code.

Somewhere.

And it's not like it happens on the same log file. No, that would be too easy. Nope. It just randomly changes on which log file it's spewing this out on.

I thought that it might have something to do with the 95th percentile patch, but nope. That's been temporarily disabled and the errors are still cropping up.

Another lovely error I keep seeing:

Rateup WARNING: /usr/bin/rateup Can't rename uplink.tmp to uplink.log updating log file

MRTG uses a program called rateup to store the actual information. This time, rateup is a C program and the error code is less than stellar—why couldn't you rename the file? Would it have been that hard to print out the system error?

But this is open source, right? I can modify the code myself to include more information. So I grab the source code to the version of MRTG that's installed, and go to compile rateup

checking for gd.h... no

** Ooops, one of many bad things happened:

   a)  You don't have the GD library installed.
       Get it from http://www.boutell.com, compile it and
       use either --with-gd-lib=DIR and --with-gd-inc=DIR to specify
       its location. You might also have to use --with-z-inc,
             --with-z-lib and --with-png-inc, --with-png-lib for gd
             versions 1.6 and higher.  Check config.log for more
       information on the problem.

   b)  You have the GD library installed, but not the gd.h
       header file.  Download the source (see above) and use
       --with-gd-inc=DIR to specify where the file can be found.

   c)  You have the library and the header file installed, but
       you also have a shared GD library in the same directory. 
       Remove the shared library files and/or links (e.g. 
       libgd.so.2.0.0, libgd.so and libgd.so.2).  This is especially
             likely if you're using a recent (post 1.8.4) version of GD
       and didn't configure it with --disable-shared.

   d)  You have gd library installed and also it's headers, but you are
       missing libpng (and headers) or freetype (and headers)
       (mrtg does not use freetype, but if your copy of gd is precompiled
       against it, you have to install it ... 

   Consider following the instructions in doc/mrtg-unix-guide.txt

Okay, but this is a fresh Fedora Core install, so I should be able to use the package manager to install the GD developer libraries. All I need to do is find out what it's called:

GenericUnixPrompt# yum search gd

Ten minutes later, nine of which were spent updating the master list with a bazillion packages that have been added and/or updates since I installed about three weeks ago (and it seemed like it upated the master list multiple times no less!) I finally got a list of a few zillion matches.

So I run the command again, only this time redirect the output to a file that I can search. I find the package I need:

GenericUnixPrompt# yum install gd-devel

A minute goes by while it updates the half-zillion packages that have suddenly upgraded in the past two minutes, and it's asking me if I want to install half a dozen development libraries, including the X Windows development libraries!

No!

No!

I don't care for the X Windows development libraries.

But the package maintainers don't care about my wants! They, in their infinite wisdom, have decreed that if one wishes to develop using GD, then one must also with to develop with X Windows.

Sigh. What's another 10 megabytes of wasted disk space?

Hack. Hack. Hack. Compile. Install the new rateup.

Now I get:

Rateup WARNING: /usr/bin/rateup Can't rename uplink.log to uplink.old updating log file [No such file or directory]

Okay … so what happened to the log file?

And a missing log file only rates a warning?

This is some well written software here.

Ah well … back to debugging other people's code.

Monday, November 06, 2006

More photography of heavenly bodies

A few months ago Smirk was about to sell his Olympus C-5500 Zoom digital camera on eBay when I decided to buy it (price was right—about $100) for Spring, who had been wanting one for a long time.

It turns out that Spring didn't really like it—she preferred my digital camera. And looking over hers, I found it had many features I missed having in a digital camera—manual shutters, manual aperture, manual focus, higher resolution, better performance in low light, blah blah blah, that I preferred her camera.

So we traded.

[Loony over a digital camera]

Can you believe that's without a telescope? Just the Olympus C-5500 zoomed all the way out.

It's a nice camera.

Tuesday, November 06, 2007

A shot to the arm

[Back many years ago I wrote a humor column for the FAU newspaper (which doesn't exist as I knew it, but that's a story for another time), in which half the time I took a small incident in my life but put a highly fictional spin to it. Perhaps that's what I really need to do—get back to that gonzo mindset and relive my early childhood 20s as a semi-fictional writer. Or something like that.]

[Oh, and I forgot—you have been warned.]

Concerned for my health, Bunny thought it prudent that I get a flu shot, and she knows me well enough to know that I wouldn't willingly go get one on my own. I hate shots. I hate needles. It's probably the only thing that kept me from becoming a heroine junkie.

Well, that, and the relative lack of non-sequential US $100 bills.

But mostly it was the needles.

I was touched by her concern, but felt that dragging me kicking and screaming into the clinic by my ears was uncalled for; her .357 would have certainly made the point clear and been less painful [But as she's quick to point out to the writer, she doesn't have a concealed weapons permit. Yet. —Editor]. I will say that to the nurses' credit, they didn't bat an eye as we came in screaming; they just shoved forms our way and turned to the only other customer there, an older, chain smoking gentleman complaining about an upper respiratory problem, and chided him to put out those cigarettes.

I refused to fill out the forms.

Bunny refused to let go my ear, a bit harder this time.

After a few minutes of this painful stalemate, I compromised. I filled out the form, but left the Social Security field blank. I'm such the rebel.

I don't remember much past that though. I think I tossed the forms back at the nurses, then made a dash towards the door. I either ran into the older chain-smoking gentleman with an upper respiratory problem who was giving one of the nurses a piece of his mind with the most graphic of language, or Bunny body tackled me. In any case, the world quickly turned dark as I experienced sudden deceleration trauma.

I awoke to a piercing pain in my right arm. The nurse was grinning as she shoved a bit harder. I countered with a piercing shriek. She countered with shoving the syringe in hard. I countered by blacking out.

“There,” said Bunny when I finally awoke. I found myself lying on the floor, looking up. “That wasn't so bad, was it?”

Thursday, November 06, 2008

Because Dr. Raymond Stantz said to buy it …

I came across this last month, but well … it was rather crazy last month. Anyway, for my friend (and ex-roommate) Rob—Crystal Head Vodka (via Geekcentric)—because I think he'd appreciate vodka served from a crystal skull (as if Dan Aykroyd hawking The Super Bass-O-Matic 76 wasn't odd enough …).

Friday, November 06, 2009

I never really thought about website being available via IPv6

So I'm trying to view a website (via Bunny via email) and it's not coming up at all under the Mac. It's just a blank page.

It comes up under Linux, but since I don't have speakers hooked up to that computer, watching the video (“Deer for breakfast, anyone?” in Texas—it's not what you think) would be “suboptimal” as they say.

I then try my standard diagnostic technique in such cases. From the command line, I telnet to the offending website and see what I get:

[spc]marvin:~>telnet www.snotr.com 80
Trying 2a00:d00:ff:131:94:228:131:131…
^C
[spc]marvin:~>

Oh! That's interesting!

marvin (the Mac) is trying to use IPv6 to connect to the site.

Ah! That's right! I was playing around with IPv6 several days ago on the local network here at Chez Boca and I configured Firefox to try connecting via IPv6 if possible. Turning that option off brought the site up immediately.

But! That also explains the difficulties I've been seeing in one of the sites I check daily: The Devil's Panties (think of it as a semi-fictionalized illustrated blog that presents itself as a webcomic). It was taking an inordinate amount of time to come up for the past several days and I kept thinking it was due to a network issue at Keenspot.

Nope—it was my browser attempting to connect to the IPv6 address first.

I think it's cool that there are sites responding to IPv6. I wonder how many more of them exist?


Technologically enhanced synaesthesia

“It was slightly strange at first,” Wächter says, “though on the bike, it was great.” He started to become more aware of the peregrinations he had to make while trying to reach a destination. “I finally understood just how much roads actually wind,” he says. He learned to deal with the stares he got in the library, his belt humming like a distant chain saw. Deep into the experiment, Wächter says, “I suddenly realized that my perception had shifted. I had some kind of internal map of the city in my head. I could always find my way home. Eventually, I felt I couldn't get lost, even in a completely new place.”

Then he brought out his SOES, a mesh of hard-shell plastic, elastic, and Velcro that fit over my arms and torso, strung with vibrating elements called tactile stimulators, or tactors. “The legs aren't working,” Schnell said, “but they never helped much anyway.”

Flight became intuitive. When the plane tilted to the right, my right wrist started to vibrate—then the elbow, and then the shoulder as the bank sharpened. It was like my arm was getting deeper and deeper into something. To level off, I just moved the joystick until the buzzing stopped. I closed my eyes so I could ignore the screen.

Finally, Schnell set the simulator to put the plane into a dive. Even with my eyes open, he said, the screen wouldn't help me because the visual cues were poor. But with the vest, I never lost track of the plane's orientation. I almost stopped noticing the buzzing on my arms and chest; I simply knew where I was, how I was moving. I pulled the plane out.

Via Jason Kottke, Wired 15.04: Mixed Feelings

The topic just keeps coming up.

It's an interesting article about extending our senses into realms we aren't accustomed to, such as an innate ability to tell North, or feeling our way through righting an airplane. Forget about making our lives easier, the tools mentioned in the article give us abilities we don't even have! Tools? Crutches? Very hard to say.

And The Question gets deeper yet …


The world's best bike shed

For Wlofie, an automated bicycle garage. It's a pretty cool concept, although it looks to be rather expensive to install.

Thursday, November 06, 2014

Be it ever so humble …

There's no place like home.

Friday, November 06, 2015

Gretl's Bistro

Bunny and I are always on the lookout for a good German restaurant. The closest one to us, The Biergarten, is okay—it's no Little Munich (many many miles away to the north in Lake Worth) or Old Heidelberg (many many miles away to the south in Ft. Lauderdale) or Old Vienna (used to be many many miles away to the south west in Coral Springs before it closed a few years ago).

So it was great news to us when Gretl's Bistro opened up practically around the corner (it's right next to Mississippi Sweets BBQ for those of you who are familiar with that excellent place). I think this is the second week they've been open. And it's wonderful!

The menu is still a bit limited as they get up to speed, but what they had was incredible. Bunny and I were both very impressed with our meals. Sorry Little Munich and Old Heidelberg—you're just too far away now. As for Old Vienna, we found out that Gretl (yes, she's the real owner) used to run Old Vienna, and I am glad she deicded to re-open here in Boca Raton.

Tuesday, November 06, 2018

Assert yourself

Defensive programming is often touted as a better coding style, but it hides bugs. Remember, the errors we're talking about should never happen, and by safely handling them, you make it harder to write bug-free code.

… you don't want to hide bugs by programming defensively …

… No matter where you employ the defensive style, ask youself, “Am I hiding bugs in this code by using defensive programming?” If you might be, add some assertions to alert you to those bugs.

Writing Solid Code

Writing Solid Code is the rare book that forced me to change how I go about programming. I feel I'm in the minority, but after reading that book, I hate defensive programming. Don't get me wrong—at the input/output boundary, you need to be absolutely paranoid about checking data, but among functions? Not so paranoid.

And now class, story time …

Project: Cleese” was installed onto the QA system the other day, and by chance today, I noticed a core file produced by said program. This was odd, since both I and T (the QA engineer assigned to our team) had tested the program without incident.

I was able to isolate the crash to freeaddrinfo(), a function used to release memory used by getaddrinfo() when converting a domain name like “boston.conman.org” to an IP address. A summary of the code in question:

struct addrinfo  hints;
struct addrinfo *results;
const char      *hostname;
const char      *port;
int              rc;

memset(&hints,0,sizeof(hints));

results  = NULL;
hostname = ... ;
port     = ... ;

// code code ;

rc = getaddrinfo(hostname,port,&hints,&results);

// code code

for ( ; results != NULL ; results = results->ai_next)
{
  if (results->ai_protocol == protocol)
  {
    // code code
  }
}

freeaddrinfo(results);

It's a rookie mistake but hey, it happens. The issue is that results is linked list of results, which is traversed. By the time freeaddrinfo() is called, results is now NULL. Under Linux and Mac OS-X, it seems that freeaddrinfo() checks if it's given a NULL pointer and … just does nothing if it is. It doesn't crash, but it does leak memory (it's not much in this case, since this function is only called once upon startup, but a leak is still a leak). Linux and Mac OS-X use defensive programming, probably something along the lines of:

void freeaddrinfo(struct addrinfo *info)
{
  if (info == NULL)
    return;
  // code code code 
}

which hid a bug. Solaris (which we have to use for reasons) is not so forgiving and immedately crashed.

So on Linux and Mac OS-X, how would one even test for this type of issue? The code doesn't crash. It returns results. Yes, valgrind can easily find it:

[spc]lucy:/tmp>valgrind --leak-check=full --show-reachable=yes `which lua` x.lua
==31304== Memcheck, a memory error detector.
==31304== Copyright (C) 2002-2005, and GNU GPL'd, by Julian Seward et al.
==31304== Using LibVEX rev 1575, a library for dynamic binary translation.
==31304== Copyright (C) 2004-2005, and GNU GPL'd, by OpenWorks LLP.
==31304== Using valgrind-3.1.1, a dynamic binary instrumentation framework.
==31304== Copyright (C) 2000-2005, and GNU GPL'd, by Julian Seward et al.
==31304== For more details, rerun with: -v
==31304== 
==31304== 
==31304== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 25 from 2)
==31304== malloc/free: in use at exit: 48 bytes in 1 blocks.
==31304== malloc/free: 521 allocs, 520 frees, 43,016 bytes allocated.
==31304== For counts of detected errors, rerun with: -v
==31304== searching for pointers to 1 not-freed blocks.
==31304== checked 117,892 bytes.
==31304== 
==31304== 48 bytes in 1 blocks are definitely lost in loss record 1 of 1
==31304==    at 0x4004405: malloc (vg_replace_malloc.c:149)
==31304==    by 0xC40B5D: gaih_inet (in /lib/tls/libc-2.3.4.so)
==31304==    by 0xC445DC: getaddrinfo (in /lib/tls/libc-2.3.4.so)
==31304==    by 0x400A5FA: ???
==31304==    by 0x804EF69: luaD_precall (in /usr/local/bin/lua)
==31304==    by 0x80589E0: luaV_execute (in /usr/local/bin/lua)
==31304==    by 0x804F27C: luaD_call (in /usr/local/bin/lua)
==31304==    by 0x804F2BD: luaD_callnoyield (in /usr/local/bin/lua)
==31304==    by 0x804D145: f_call (in /usr/local/bin/lua)
==31304==    by 0x804E8AB: luaD_rawrunprotected (in /usr/local/bin/lua)
==31304==    by 0x804F6EB: luaD_pcall (in /usr/local/bin/lua)
==31304==    by 0x804D1A7: lua_pcallk (in /usr/local/bin/lua)
==31304== 
==31304== LEAK SUMMARY:
==31304==    definitely lost: 48 bytes in 1 blocks.
==31304==      possibly lost: 0 bytes in 0 blocks.
==31304==    still reachable: 0 bytes in 0 blocks.
==31304==         suppressed: 0 bytes in 0 blocks.
[spc]lucy:/tmp>

but given that “Project: Cleese” is written in Lua, a garbage collected language, memory leaks weren't foremost in the mind when testing. Had freeaddrinfo() on Linux (and Mac OS-X) not been so forgiving (or defensive) then this bug would most likely have been found immediately, and not hidden in the codebase for over five years! (I checked the history of the code in question—it had been there a long time—way before “Project: Cleese” was even started)

It is because of bugs like this that I am not a fan of defensive programming. They can hide. They can fester. They can be a nightmare to debug at 3:00 am on a production system sans a debugger.


Bohemian Rhapsody

Bunny and I saw “Bohemian Rhapsody,” the movie obstensibly about Queen but concentrates more on Freddie Mercury. Thoroughly enteraining with a masterful performance by Rami Malek as Freddie and an incredible killer sound track (how could it not be? It's Queen!) I do wish the film had gone a bit deeper with Freddie's relationship with his girlfriend and with the other band members (not only does Brian May have a Ph.D. in astrophysics, but he also worked on the New Horizons Pluto mission—he's the closest person we have to Buckaroo Banzai for crying out loud).

There's also the issues of accuracy—the movie has Freddie contracting AIDS and informing the band just prior to the LIVE AID concert where in real life, he was diagnosed with AIDS two years afterwards. This, and the other inaccuracies were probably done for story reasons, so be advised that historical accuracy is … not this movie's strong point.

Did I mention the killer concert scenes?

So even though it's not historically accurate, it's still very fun to watch (make sure to watch out for Mike Myers) and the last twenty minutes where the LIVE AID concert is reenacted, is definitely worth the price of admission.

Saturday, November 06, 2021

Extreme doors of perception, Roanoke, Virginia edition

Bunny and I partook of a secondary road trip today, driving 275 miles to Roanoke, Virginia for our second visit to Black Dog Salvage. Unlike our last visit where the TV cast were out salvaging, this was an “open house” so they were there. Not that we saw much of them—we only saw one TV cast member but he was too busy to stop and chat (although he did say “Hello!”).

We did, however, get lost in a large hallway full of doors:

[A hallway full of doors. No, really, they're stacked on each other] You might think there's a mystery behind every door, but no, it's no mystery—it's another door.

But don't say we weren't warned though:

[Picture of a sign that says “MORE DOORS”] I wasn't kidding when I said there were more doors.

And yes, there were a lot of doors.

[A picture of more stacked doors in the door corridor] But it's the type of place where you could expect “opening” a door might lead to some other world, but I'd rather not let in a despotic queen into our world.

We did manage to find a door that lead out.


Observations of a few oddities, this time on the Intarwebs

Two observations about previous post:

  1. While at Black Dog Salvage Bunny took a picture of me standing next to a large slab of cherry wood (price—a cool $800, and that wasn't the most expensive slab of wood) and then we went on to get lost in the Hall of Doors.

    Once we got back to Brevard, I started noticing online advertising for slabs of wood. I wish I was making that up, but no, I started receiving ads for slabs of wood. I'm hoping it was because Bunny and I watched a few wood working videos on Youtube and not because of a picture Bunny took of me.

    But I'm not holding my breath.

  2. I use Duck Duck Go as my search engine. While I was writing the previous entry, I used Duck Duck Go to search for the Black Dog Salvage Company website. The first link, I click, and I'm redirected directly to some spam pharmacy site wishing to extend my mortgage by 3″ (or 8cm for those Imperially challenged).

    Hmmm, I thought, perhaps they let their domain expire.

    Curious, I go back to a previous entry just to check the link there, and no, it goes to the Black Dog Salvage site.

    Now I'm paranoid. I check the link on Duck Duck Go, and it's https://www.blackdogsalvage.com/. I check the link on the Black Dog Salvage site I'm viewing, and it's https://www.blackdogsalvage.com/. It's the same text! I have no idea what to think! Perhaps some black arts to game the results in Duck Duck Go? I don't know.

Okay, I decided to dig a bit deeper into that last one. I used Google to search for “Black Dog Salvage,” clicked on the obvious result and … ended up at that same sketchy pharmacy site. Now I think that the Black Dog Salvage site has been hacked to redirect people to the sketchy pharmacy site when coming from a search engine, and not something wrong with Duck Duck Go or Google.

Sigh.


Notes on an overheard conversation at the Red House Inn

“Hello!”

“Hello!”

“Where did you get your take out food?”

“A Thai restaurant on east Main street called Love Eat Thai Kitchen. What do you have”

“We got this Mexican food from … oh … it has a weird name.”

“Yea, I think it's a Japanese place downtown.”

“Really?”

“Yeah, on Broad Street just south of Main.”

“That wouldn't happen to be ‘Quixote?’”

“Yes! That's the place!”

Obligatory Picture

[Self-portrait with my new glasses]

Obligatory Contact Info

Obligatory Feeds

Obligatory Links

Obligatory Miscellaneous

Obligatory AI Disclaimer

No AI was used in the making of this site, unless otherwise noted.

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: https://boston.conman.org/, then add the date you are interested in, say 2000/08/01, so that would make the final URL:

https://boston.conman.org/2000/08/01

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-2025 by Sean Conner. All Rights Reserved.