{"id":2510,"date":"2026-10-30T12:41:51","date_gmt":"2026-10-30T12:41:51","guid":{"rendered":"https:\/\/www.oubliette.org\/blog\/?p=2510"},"modified":"2026-10-30T23:03:26","modified_gmt":"2026-10-30T23:03:26","slug":"the-last-place-you-look","status":"publish","type":"post","link":"https:\/\/www.oubliette.org\/blog\/index.php\/2026\/10\/30\/the-last-place-you-look\/","title":{"rendered":"The Last Place You Look"},"content":{"rendered":"\n<p class=\"has-drop-cap wp-block-paragraph\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20261026-00\/?p=112797\/\" target=\"_blank\" rel=\"noopener\">This<\/a> post from Raymond Chen &#8211; about helping a customer figure out why running a program through a script didn&#8217;t work but launching it by double-clicking it in Explorer did &#8211; triggered a flashback, and a bit of PTSD.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Prepare for a trip in the waaaaay back machine.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In 1996 I joined the newly-formed \u201c<a href=\"https:\/\/disney.fandom.com\/wiki\/Disney_Online\" target=\"_blank\" rel=\"noopener\">Disney Online<\/a>\u201d as a systems guy.&nbsp;I built and maintained internal networks and network services &#8211; file services, email, that sort of thing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Disney web properties, such as they were at the time, were hosted on a few &#8220;big&#8221; (for 1996) Sun SPARC machines.&nbsp;A lot of the site was dynamic, written in Perl.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[Before you snicker, it was <strong>1996<\/strong>.&nbsp;And there was one notable exception to the \u201cperl cgi\u201d architecture &#8211; the Disney Store Online, where you could buy things like customized Winnie the Pooh balloon bouquets.&nbsp;Thanks to some ex-NeXT folks, like Kevin Wells, the store was written in WebObjects &#8211; developed on intel boxes running <a href=\"https:\/\/en.wikipedia.org\/wiki\/NeXTSTEP\" target=\"_blank\" rel=\"noopener\">NeXTStep<\/a> and deployed on <a href=\"https:\/\/en.wikipedia.org\/wiki\/OpenStep\" target=\"_blank\" rel=\"noopener\">OpenStep<\/a> on Solaris. I\u2019d used NeXT hardware in labs at uni, but Disney was where I first wrote &#8220;real code&#8221; in <a href=\"https:\/\/en.wikipedia.org\/wiki\/Objective-C\" target=\"_blank\" rel=\"noopener\">Objective C<\/a>, a language I&#8217;d still choose over C++ every day and twice on Sunday.]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One day, Disney Online decided to hook up with Microsoft and <a href=\"https:\/\/news.microsoft.com\/source\/1997\/03\/31\/disney-online-and-the-microsoft-network-announce-relationship-to-distribute-disneys-daily-blast\/\" target=\"_blank\" rel=\"noopener\">signed a deal<\/a> to use their tech. It was mostly, IIRC, about the forward-looking &#8220;Disney&#8217;s Daily Blast,\u201d but it also meant migrating &#8220;the main site&#8221; (disney.com) from Solaris and Netscape Enterprise Server (I think, it was a long time ago) to Windows NT (3.1) and Internet Information Services (IIS).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A plan was made to replace the SPARCs with (I&#8217;m not kidding) a few <em>racks<\/em> of Compaq-made Windows boxes hosted in the <a href=\"https:\/\/en.wikipedia.org\/wiki\/UUNET\" target=\"_blank\" rel=\"noopener\">UUNET<\/a> data center in <a href=\"https:\/\/en.wikipedia.org\/wiki\/Reston_virus\" target=\"_blank\" rel=\"noopener\">Reston<\/a> Virginia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u201cPorting\u201d the site (i.e. adapting the code for <a href=\"https:\/\/en.wikipedia.org\/wiki\/ActivePerl\" target=\"_blank\" rel=\"noopener\">ActivePerl<\/a>) had gone ok, and in the days long before good off-the-shelf tools for graceful transitions, the webmasters fiddled DNS records and TTLs to start pointing live traffic at the new infrastructure.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Things would seem fine for a while, but boxes would start mysteriously becoming unresponsive.&nbsp;The web developers were trying to figure out what was going wrong, and not making much progress. My <a href=\"https:\/\/www.linkedin.com\/in\/randydragon\/\" target=\"_blank\" rel=\"noopener\">bosses boss<\/a>, knowing I was &#8220;reasonably good at figuring shit like this out,\u201d asked me to help get the site stable by going to the data center in Virginia and working with the devs in California. We agreed that once I&#8217;d fixed this we\u2019d have a discussion about why back office folks weren\u2019t included in the bonus program, and I got a one way ticket to Reston, VA.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">(This was all happening in late November\/early December.&nbsp;Dawnise and I were getting married just before Christmas.&nbsp;She was, let&#8217;s say, &#8220;not thrilled&#8221; about the one way, no definite return date aspect of all this.)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I got to Virginia and started poking around. Machines wouldn\u2019t die on a predictable schedule, and once they were unresponsive to web requests there was a <em>really<\/em> short window before they became unresponsive to their console.&nbsp;I managed to get logged into a couple before they went totally tango-uniform and all I could initially tell was that there were a ton of processes running &#8211; and they looked like perl scripts that were part of the site. If it was a *nix machine I\u2019d have said it had been \u201c<a href=\"https:\/\/en.wikipedia.org\/wiki\/Fork_bomb\" target=\"_blank\" rel=\"noopener\">fork bombed<\/a>.\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To add icing to the cake, I don&#8217;t think we had remote power (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Power_distribution_unit\" target=\"_blank\" rel=\"noopener\">PDU<\/a>) control &#8220;back then,&#8221; so if the machine couldn\u2019t be rebooted before it went totally catatonic, someone had to go physically push a reset switch.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I spent a couple long days (and nights) in that data center, talking to the engineering teams in California, testing different theories.&nbsp;Nothing seemed to be helping.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And then, magic happened.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I left myself logged in on one of the machines, and our UUNET (or Compaq, I forget) account rep wandered over to it and started clicking around.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And <em>that<\/em> machine stopped crashing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>What the actual fuck<\/em>?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I asked her (she wasn\u2019t super technical, but she definitely wasn\u2019t dumb) to show me what she\u2019d done.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">She hadn&#8217;t knowingly &#8220;done&#8221; anything, but we took another machine, and I watched over her shoulder as she \u201cdid it again.\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And as soon as she \u201cdid it\u201d I was confident I understood the problem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">She was clicking around through the site\u2019s files on disk and double-clicked a perl script (the same one, to her credit, she thought she\u2019d double clicked on the other machine).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Explorer popped up the \u201cthere\u2019s no association for this file type, what do you want to use to open it\u201d dialog.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And she picked something.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That was it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You\u2019d be totally forgiven if your response is \u201cwhat? huh?\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">What I realized in that moment was that the site had been authored on *nix.&nbsp;So, of course, when a perl script needed to run something else it just\u2026 ran it, using popen(), or system() or whatever. It called some perl function that ultimately fork\u2019d and exec\u2019d the target, waited for it to exit, and returned its exit status.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The code gave that function the command line it wanted run, and assumed the thing was runnable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That was true even if the thing it wanted to run was another perl script, which of course was runnable, because it started with <a href=\"https:\/\/en.wikipedia.org\/wiki\/Shebang_(Unix)\" target=\"_blank\" rel=\"noopener\">shebang<\/a> (aka. &#8220;bang magic\u201d).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But bang magic relies on a bunch of stuff that\u2019s pretty *nix specific &#8211; all the way down.&nbsp;And was not a thing on Windows. Still isn\u2019t.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So when a perl script \u201csystem\u2019d\u201d an actual executable (like <a href=\"https:\/\/en.wikipedia.org\/wiki\/ImageMagick\" target=\"_blank\" rel=\"noopener\">ImageMagick<\/a>, which has been a swiss army knife jabbed in the side of the internet for basically forever) it was fine. Windows would launch the exe, the exe would do its job and exit (or crash and exit) and life would continue.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The hypothesis I formed in that moment was that in the absence of any other mechanism, IIS was using the file extension type mappings in the Registry (exposed and managed by Explorer) to figure out how to run things that weren&#8217;t natively executable. But in this case there <em>was no type mapping<\/em>, and there was no GUI to ask for one.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I wasn\u2019t sure what exactly would happen, but I thought there was a pretty good chance I was seeing it, and it wasn\u2019t good.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So I picked another machine, and associated Perl scripts with ActivePerl, and waited. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And it didn\u2019t crash.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And in the days before fleet management tools for Windows (cue jokes about how these days are still those days), my next step was to log in to each machine and lather, rinse, repeat.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And just like that, the fleet was stable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I stayed another day to make sure it wasn\u2019t a fluke, and survived reboots and redeploys before flying home.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">While I&#8217;d been away, the guy who&#8217;d asked me to help had sent some flowers and a nice potted ficus to my fiancee.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We had that ficus for years. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>This post from Raymond Chen &#8211; about helping a customer figure out why running a program through a script didn&#8217;t work but launching it by double-clicking it in Explorer did &#8211; triggered a flashback, and a bit of PTSD. Prepare for a trip in the waaaaay back machine. In 1996 I joined the newly-formed \u201cDisney &hellip; <a href=\"https:\/\/www.oubliette.org\/blog\/index.php\/2026\/10\/30\/the-last-place-you-look\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;The Last Place You Look&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[7,5],"tags":[],"class_list":["post-2510","post","type-post","status-publish","format-standard","hentry","category-i-hate-computers","category-life-the-universe-and-everything"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/www.oubliette.org\/blog\/index.php\/wp-json\/wp\/v2\/posts\/2510","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.oubliette.org\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.oubliette.org\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.oubliette.org\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.oubliette.org\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=2510"}],"version-history":[{"count":7,"href":"https:\/\/www.oubliette.org\/blog\/index.php\/wp-json\/wp\/v2\/posts\/2510\/revisions"}],"predecessor-version":[{"id":2517,"href":"https:\/\/www.oubliette.org\/blog\/index.php\/wp-json\/wp\/v2\/posts\/2510\/revisions\/2517"}],"wp:attachment":[{"href":"https:\/\/www.oubliette.org\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=2510"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.oubliette.org\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=2510"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.oubliette.org\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=2510"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}