Tuesday, March 05, 2019
“We the willing”
I'm was still trying to process that the process of our process is to process the process to ensure the process has processed the process when I came across this rather insightful comment about the F izzBuzz Enterprise Edition:
A combination of wasteful architecture astronomy and legitimate need to divvy up absolutely mammoth line-of-business applications among teams with hundreds of members operating for years with wildly varying skill levels, often on different subsystems from different physical locations, with billions of dollars on the line. You can't let the least senior programmer in the Melbourne office bring down the bank if he screws up with something, so instead you make it virtually impossible for him to touch anything than the single DAO which he is assigned to, and you can conclusively prove that changing that only affects the operation of the one report for the admin screen of a tier 3 analyst in the risk management group for trans-Pacific shipping insurance policies sold to US customers.
The tradeoff is, historically, that you're going to have to hire a team of seven developers, three business analysts, and a project manager to do what is, honestly speaking, two decent engineers worth of work if they were working in e.g. Rails. This is a worthwhile tradeoff for many enterprises, as they care about risk much, much, much more than the salary bill.
(I spent several years in the Big Freaking Enterprise Java Web Applications salt mines. These days I generally work in Rails, and vastly prefer it for aesthetic and productivity reasons, but I'm at least intellectually capable of appreciating the advantages that the Java stack is sold as bringing to users. You can certainly ship enterprise apps in Rails, too, but "the enterprise" has a process which works for shipping Java apps and applying the same development methodology to e.g. a Rails app would result in a highly effective gatling gun for shooting oneself in the foot.)
A comment on HackerNews about F izzBuzz Enterprise Edition
And how having attended several scrum meetings (at the behest of our Corporate Overlords) for “Project: Gibbons” (a slimmed down and simplified version of “Project: Lumbergh”) I can see how this “enterprise development” is shaking out—it's a form of Conway's Law: “[O]rganizations which design systems … are constrained to produce designs which are copies of the communication structures of these organizations.” It's gone from what should be a simple one week project (because all it's doing is looking up a name based upon a phone number and that's it) into a multi-month project mired in internal bureaucratic overhead. I'm not going to go into details, but just note that yes, Dilbert is a documentary.
The Electric King James Bible Remake
It's been a long time since I last mentioned The Electric King James Bible, an experiment I did back in late 1999 in URL addressing a portion of a document (which influenced the structure of my blog). The code hasn't changed much since 1999 (there was a bug fix around 2010 it seems), and thus, it has sat there, chugging along with little attention to the greater world.
Until the past month when I've had email discussions with two different people about The Electric King James Bible. Both people were interested in the addressing scheme, which I think is still unique on the Internet. How many sites will let you link directly to a portion of the Bible and get Noah's Ark or Samson and Delilah? It can also handle some pretty bad misspellings (levitakus 19:19 anyone?). One of the respondents mentioned it would be nice if The Electric King James Bible was available via Gopher.
Well, yeah, I do have a gopher site, so it wasn't all that difficult to present a similar interface (in fact, it uses the same data files as the web version). So of course now you can get your Noah's Ark story and Samson and Delilah story from gopherspace. And any other Bible story you care to, just as long as you know where in the Bible it resides.
The Quick and Dirty B-Movie Plot Generator, now in Gopherama!
As long as I was making The Electric King James Bible available via Gopher, I thought I might as well adapt The Quick and Dirty B-Movie Plot Generator to Gopher as well. It pretty much works the same as the web version. Just reload the page for different plots and when you find one you like, you can just bookmark it.
Thursday, March 14, 2019
A recreation of a scene at an office
The breakroom of the Ft. Lauderdale Office of the Corporation. On the counter are several boxes clearly labled “Krispy Kreme.” Sean walks in.
- Sean
-
Dum de dum.
He stops dead in his tracks as he spots the Krispy Kremes.
Um …
- Booming Voice
-
We don't see the person speaking, but it's a booming, Brian Blessed like, voice. As a side note, perhaps we can get Brian Blessed to play this part. Anyway, booming voice, unseen person.
Make a SAVE vs. Krispy Kreme!
- Sean
-
Reaches into his pocked and pulls out a twenty-sided die. He shakes it in his fist and then rolls it on the counter. His eyes goes wide. CUT to die rolling on the counter.
- D20
-
ZOOM to CLOSE-UP of the die on the counter. You can clearly make out the “1” on the top face of the die.
- Sean
-
Nooooooooooooo!
Sean then dives into the Krispy Kreme boxes …
Nom nom nom nom nom …
“Is there a way to convert this integer to an integer?”
I would like to write an Apache client to have a specific layout for requests to a secure site, making a static website, not locally, that may look like a assembly loader. This is my first attempt at using SSL. It's a bit simple to do with a few steps, asking the user to decide whether I should use "Google App Engine" or "Google Apps", and then have them send a sort of hash in the request to that domain. However, I still want my site to be public so I can just open it in Google App Engine.
The reason is that my client does not want to do a simple submit / form put into my app, since that 'd be possible with the Google App Engine. The reason I want to use the Google App Engine is that it works as expected. However, neither of the examples I found for handling the request from the parent page (which I am guessing are compatible with the Apache re - server - side tomcat) work as discussed in the link at How to open an IE include in a new application in Python? and all, and the one i've tried. Is there any way I can help my client AJAX to connect to my Python app?
Via Hacker News, Configure Google App Engine to redirect to localhost
This is not a real question, no one actually asked for this. This question (and every question on the site) is a computer generated word salad that almost, but not quite, makes sense. You know, like a few questions actually asked by real people at Reddit or Stack Overflow who don't quite grasp the whole concept of programming, or English, or both.
And the creator of the page is a bit worried about this site being indexed by Google. It's a valid concern that this site will pollute search results, given that the corpus used to generate the questions are questions on other sites like Reddit and Stack Overflow. There were also some comments about autogenerating answers but given the questions are maddenly close to comprehension, the lack of answers might be a good thing.
But this does give me an idea for National Novel Generation Month 2019 …
The Repair Culture
I was using my computers when all of a sudden, I couldn't select anything with the mouse. My intial reaction was well, there goes the other PS/2-to-USB converter, but some subsequent experiments proved to me that wasn't the case—I could still move the mouse pointer, and the middle and right mouse buttons worked. It was just the left mouse button that no longer functioned.
I have a Logitech Trackman Marble from the 90s (it's not the same as what is being sold today as the Trackman Marble), and it's the second such unit I've used. The first one wore out and I had to go to Ebay to find a replacement a few years ago, I liked it that much. The thought that I would have to go through that trouble yet again filled me with dread.
In the meantime, I couldn't effectively use my computers. As Bunny and I were scambling to find a replacement mouse at Chez Boca, I decided to crack open the Trackman and see what might be the issue. It was easy enough to open, remove four screws and the innards were exposed. My initial thought was that the left mouse button (which gets the most use) had worn out. It was, but not in the way I expected. There's a portion of the button you press that activates the switch below it. It's a small vertical piece of plastic that pushes down on the horizontally oriented switch. And in that small vertical piece a groove had formed over the years of use.
After discussing the problem with Bunny, the solution we came up with was to use a small amount of Elmer's Glue (applied with a toothpick) to fill in the groove that had formed.
I want to report that the solution worked wonderfully! The Elmer's Glue hardened enough to make the left button work and if it ever wears out, I know how to fix it.
Saturday, March 16, 2019
I'm not addicted to the Internet. I can give it up at any time. What? You mean it's down? Aaaaaaaaaah!
Ah, the sweet fast Internet is back at Chez Boca.
Late Thursday, the Internet here at Chez Boca went bonkers (that's a technical term). One second we were smoothly surfing the Intarwebs and then the next, we smacked against the concrete pylons of a pier (if I'm to keep with the surfting metaphore). The connection wasn't down, and it wasn't as if there was massive packet loss. It was just that each packet was taking, on average, about eight seconds to traverse the link.
Things would be fine for a few seconds, maybe enough to start loading a page but then—BAM! 10 seconds! 8 seconds! 11 seconds! 4 seconds! For the next few hours or so. Then then latency would drop to around 30ms for a minute or so, then the multisecond latencies would drive right back up.
And the packet loss was usually less than 2%.
It was weird and annoying.
When we called our ISP, we were first told that someone would be available to check on Tuesday, but when Bunny suggested to tech support to look for any cancellations, they were able to find an opening for today.
It turned out to be a bad DSL port.
In looking back over our nearly 30 hours sans Internet, it's amazing how dependent we've become on it just being there. No email. No Netflix. No quick Google searches when doing a crossword puzzle. No MyFaceGoogleLinkedSpaceBookPlusIn.
Okay, that last one isn't bad at all.
But the rest … wow.
Thursday, March 21, 2019
Observations on the drive home from work
I was driving through the neighborhood leading to Chez Boca when I saw two people walking in the street, not an uncommon sight in this neighborhood as it lacks side walks. What was uncommon though, were the identical clothes the pair were wearing and the identical hair styles. As I passed them, I also noticed they were wearing the same pair of glasses. It was also apparent by this time that I was seeing a father and son (or a man and his young clone) walking about the neighborhood.
That was not the oddest though. A few seconds later I noticed a car driving the other way. A small car with two occupants, dressed as clowns! I passed a clown car, in the wild, driving home this evening.
I don't think David Lynch moved into our neighborhood …
Monday, March 25, 2019
It took thirty-odd years for web browsers to get automatic hypenation and almost a decade for me to notice
Automatic hyphenation on the web has been possible since 2011 and is now broadly supported. Safari, Firefox and Internet Explorer 9 upwards support automatic hyphenation, as does Chrome on Android and MacOS (but not yet on Windows or Linux).
Via inks, All you need to know about hypenation in CSS | Clagnut by Richard Rutter
I had no idea that hyphenation has been supported for eight years now. And
adding support was easy enough—I already mark the blog as being English so
the only remaining bit was adding the bit of CSS to enable it. I've been manually (for various values of
“manual”) hyphenation hints with the use of ­
, such as
when I mention FaceGoogleLinkedMyBookPlusInSpace or when I do my XXXXXXXXXXXXX XXXXXXXXXXX XXXXXXX censor bars.
Now, it looks like I don't have to do that anymore. Sweet!
“Woe unto all who reveal the Secrets contained herein for they shall be Hunted unto the Ends of the Universe”
This is a document I wrote in early 1984 at the behest of the System Development Foundation as part of Xanadu’s quest for funding. It is a detailed explanation of the Xanadu architecture, its core data structures, and the theory that underlies those data structures, along with a (really quite laughable) project plan for completing the system.
At the time, we regarded all the internal details of how Xanadu worked as deep and dark trade secrets, mostly because in that pre- open source era we were stupid about intellectual property. As a consequence of this foolish secretive stance, it was never widely circulated and subsequently disappeared into the archives, apparently lost for all time. Until today!
Via Lobsters, Habitat Chronicles: A Lost Treasure of Xanadu
It is the Xanadu concept
of tumblers that is core to how
mod_blog
works, although
more in idea than in actual implementation detail. And the web in general has
a limited form of transclusion which
is pretty much just images (still and moving) and sound. A general version of transclusion would probably be
very difficult (if not outright impossible) to implement. But there are still
concepts that Xanadu has that are still hard to understand, and I'm hoping
the document mentioned above is enough to shed some light on some of the more
esoteric concepts of Xanadu. I don't think we'll ever see a fully blown
Xanadu system ever, but there are still ideas lurking in it that deserve some
investigation.
A lesson in economics
Bunny received the following in email and couldn't wrap her brain around it. Neither could her brother, nor the person who sent it to her:
It's a slow day in the small town of Pumphandle, Saskatchewan, and the streets are deserted. Times are tough, everybody is in debt, and everyone is living on credit.
A tourist visiting the area drives through town, stops at the motel, and lays a $100.00 bill on the desk, saying he wants to inspect the rooms upstairs to choose one for the night.
As soon as he walks upstairs, the motel owner grabs the bill and runs next door to pay his debt to the butcher.
The butcher takes the $100.00 and runs down the street to retire his debt to the pig farmer.
The pig farmer takes the $100.00 and heads off to pay his bill to his supplier, the Co-op.
The guy at the Co-op takes the $100.00 and runs to pay his debt to the local prostitute, who has also been facing hard times and has had to offer her "services" on credit.
The hooker rushes to the hotel and pays off her room bill with the Hotel Owner.
The hotel proprietor then places the $100.00 back on the counter so the traveler will not suspect anything.
At that moment, the traveler comes down the stairs, states that the rooms are not satisfactory, picks up the $100 bill and leaves.
No one produced anything, no one earned anything.
However, the whole town now thinks that they are out of debt and there is a false atmosphere of optimism and glee.
And that, my friends, is how a “government stimulus package” works.
Bunny then sent it to me, asking if I could wrap my brain around it. And upon first reading, yeah, it's hard to grok what exactly happened and how it happened. But I think I can pull this apart.
First off, one way to look at money is as a means of exchange of goods and services. Farmer Bob raises cows but wants some poultry to eat for a change. Farmer Chuck has the chickens and wouldn't mind some beef. I've just checked the current spot prices for beef and chicken:
animal | weight in pounds | cost per pound |
---|---|---|
cow | 1,400 | $4.25 |
chicken | 4 | $2.00 |
That's nearly 350 chickens per cow. I'm sure that Farmers Bob and Chuck could come to some agreement, like a chicken for a pound of beef. This is easy, because Farmer Bob has something that Farmer Chuck wants, and Farmer Chuck has something that Farmer Bob wants—there's a direct exchange. This can even be extended to “debt”—Farmer Chuck could give a chicken to Farmer Bob for later payment in beef. But it gets tiresome working out the “price of chickens” in asparagus or the “price of beef” in potatoes. Thus some commodity that everyone agrees upon to exchange for goods and services—in our case today, United States dollars (I realize the dollar isn't a commodity like pork bellies or gold and is in fact, a fiat currency, but I don't want to bog this down any more than necessary).
Now to our particular example. There is a circle of debt between the proprietor, butcher, pig farmer, co-op, hooker and back to the proprietor. It's a larger circle of debt than between our example of Farmers Bob and Chuck, but it is there, it just took a bit for it to manifest itself. And no one had the entire picture—the proprietor was in debt to the butcher, but was a creditor to the hooker; the pig farmer was in debt to the co-op, but a creditor to the butcher. This mutual debt wasn't broken until the introduction of money from the tourist to unravel the debt ring. Remove the hooker from our little story, and the proprietor would be on the hook for $100 to the tourist, or his debt to the butcher would still exist, and so on down the line to the co-op.
In addition, the story also hinges on the mutual debt all being the same amount. But say the debt had been $50 between the proprietor and butcher but $100 for everyone else and the debt doesn't vanish at all—it just kind of moves about a bit. So I don't think the story is that good of an example of a “government stimulus package” at all—not everyone's debt is the same, nor is all debt in the United States local to the United States. Someone is going to end up holding onto some debt.
Tuesday, March 26, 2019
Notes on an overheard conversation about a dish at a restaurant being featured on television
“Yeah … no. Get rid of the sweet plantains and I'd be all over that. With the plantains, no.”
“But you eat plantains when you have the skirt steak at Cuban restaurants.”
“Yes, but I save those for dessert.”
“Everything goes to the same place—your stomach.”
“Yeah, but my stomache doesn't have taste buds.”
“You're just like my brother. He wants everything separated on his plate.”
I'd like to see the unit test for this bug
“Sean—”
“Aaaaaaaaaah!”
“—it's time to get up … oh dear. I have to scrape you off the ceiling again.”
“No problem—just give me a moment to get my heart started again.”
I'm convinced I've found a bug on the iPhone.
I use my iPhone as an alarm clock. It's there, and I can set multiple alarms to remind me of various tasks other than waking up, such as scrum mettings.
I also tend to keep the ringer off my iPhone, due to the sheer number of spam calls I receive (during the week, it's not uncommon for me to receive a few spam calls per day—so far three today, but the most I've received up to seven). But having the ringer off does not mean the alarm is silent—it still goes off (loudly). It's just that anyone calling won't wake me.
So now we come to the bug—if I receive a call at the same time as the alarm goes off, no sound is emitted! And with no alarm, I keep sleeping until my backup alarm, Bunny, comes in and scares the XXXX out of me.
I could solve this by setting silence as a default ring tone, but alas, the iPhone does not come with silence as an option for a ring tone (hint hint!). So I would have to sample John Cage's 4′33″ to use as a default ring tone.
Yeah, I know, first world problem. But only if something was being done about spam calls …
And part of our process of processing the process is to ensure we process the process safely
So our Corporate Overlords have assigned us a workplace safety pamphlet to read followed by a workplace safety video to watch. It wasn't nearly as bad as previous “training sessions” where we had to watch videos of text slides as someone read them aloud slowly and badly. No, this time we got to read the pamphlet at our own speed and watch a scare mongering video about the proper response to a workplace shooting—flee, hide or as a last resort, fight. Unfortunately, the video lacked proper closure as it cut just as the group of office workers were forced to fight the lone gunman shooting up the office, so we never get to see if they succeeded or not. I found this German forklift safety video much more entertaining than what I watched.
Funny to think the Germans have a better sence of work humor than us Americans.
Wednesday, March 27, 2019
Notes on an overheard conversation in or near Chez Boca
“Woot!”
“What?”
“It's Opening Day!”
“What?”
“Opening Day!”
“What's that?”
“You don't know what Opening Day is?”
“No. Did J. C. Penney's open a new store?”
“No! You really don't know what Opening Day is, do you?”
“No.”
“Baseball! What else would it be?”
“Well, doesn't football, basketball, soccer or curling have an opening day?”
“No, it's only baseball. I'm surprised you didn't grok Opening Day.”
“You know the word ‘grok?’”
“Pththththththththththth!”
Sunday, March 31, 2019
Why adding crypto to gopher isn't that easy
I'm talking about the fact that my hypothetical new protocol operated strictly over TLS connections - plaintext straight up wasn't an option. I am of the opinion that the widespread lack of encryption in gopherspace today is the protocol's biggest shortcoming, and I actually suspect that this point alone discourages some folks who would otherwise be on board from adopting it. …
We only need to add ubiquitous encryption to gopher to end up with the best of both worlds!
Now, let me be clear exactly what I mean by "adding encryption to gopher". I don't want to advocate anybody serving anything on port 70 which isn't backward compatible with standard gopher, because that would be a tragedy for the gopher community. And I also don't want plaintext gopher to disappear entirely, because it's great that something like gopher exists which can be utilised on 40 year old machines which are too slow to do effective crypto. What I would like is to see something new which is basically "gopher plus crypto, maybe a little more" appear alongside the existing options. Something which could be thought of as a "souped up gopher" or as a "stripped down web", depending on your perspective. Something which meant people weren't forced to choose between two non- overlapping sets of massive and obvious shortcomings but could just USE the internet for sharing static content in a non-awful way - whether that static content is "just" phlog posts, ASCII art or old zines, or whether it's serious political dissent, cypherpunk activism, sexually explicit writing or non-trivial free software development.
As I metioned before, adding
TLS to gopher is
relatively straightforward, as it can be added between the TCP layer and the gopher layer
with both clients and servers. That's the trivial part. The next step is to
register the gophers:
URI scheme, and to register a default TCP port number for the gophers:
URI. This too, is trivial (it just
needs to be done once by somebody).
What's not so trivial is shoehorning the “secure gopher” into the gopher index file. There's no real place for it. The “gopher index” file is a machine readable file that indicates the contents of a gopher server and it looks something like:
1This is a pointer to another siteHTthis-selects-the-fileHTgopher.conman.orgHT70CRLF 0About this siteHTabout-site.txtHTexample.comHT70CRLF gOur LogoHTlogo.gifHTexample.comHT70CRLF IOur office spaceHToffice.jpgHTexample.comHT70CRLF
The first character of each line is an indication of what to expect when retrieving the data, a “1” indicates a gopher index file (an example of which you see above), a “0” is a text file, a “g” is a GIF file and “I” is for other image types. This is followed by a human readable description meant to be displayed, followed by a “selector,” followed by the hostname and port number. There is nothing there to indicate “use TLS.” A flag could be added past the port value to indicate “use TLS when retrieving this data” but:
- old gopher clients won't see the flag (most will just ignore it) and try to connect without TLS—at best, the client just errors out and at worst, crash;
- it breaks gopher clients that actually use the enhansed gopher protocol (alternative link)—they will either error out at best, or at worst, crash.
One solution is to just say “okay, port 70 is plain text, any other port
is TLS” but again, we're back
to the problem with older gopher clients that don't understand this. Another
solution that would work is to assign new “gopher types” (the “0”, “g”, “I”,
“1” etc.) for a TLS connection.
That just involves picking about two dozen new characters. Old gopher clients
will ignore “types” they don't understand and new clients can use TLS. Unfortunately, it does mean that
information about the connection type leaks out. HTTP doesn't have this problem because the
http:
(and https:
) URI does not include what the link is, unlike the
gopher:
URI (or
the linking information in the gopher index file) which does include
what the link is.
So I think it comes down to picking your poison:
- potentially breaking old client;
- doubling the number of “types” to support;
- or even a new type of protocol entirely, but then you start falling into HTTP territory …
Update on Tuesday, September 28TH, 2021
There might be a fourth way, but I think it's a hack.
Update on Monday, Debtember 6TH, 2021
There are more than four ways to do this, but I don't think any are worth implementing.