Reply of the New Colossus
Your fear has made you tiny,
Your hate has made you weak;
Our love has made us stronger,
Our hope stands tall and defends the meek.
Your days are cloaked in darkness,
But in your nights, you will not sleep;
Our light shines the brightest;
It penetrates the deepest ratholes of your keep.
You have betrayed our birthright,
Sold our future to meet the mortgage on your debts.
We will not be silent;
We will rise with the truth to meet your threats.
Your lies are become baldfaced,
Your crimes recorded to be reaped;
The deluge of History is coming,
And in triumph, Justice will sweep.
“Give me your tired, your poor,
Your huddled masses yearning to breathe free,
The wretched refuse of your teeming shore.
Send these, the homeless, tempest-tost to me,
I lift my lamp beside the golden door!”
Venus and the crescent moon at sunset, Lawrenceville, GA, January 29, 2017
Today’s DealNews Apple (née DealMac) newsletter:
DealNews Apple newsletter, November 1, 2016
On the heels of September’s Android game as “today’s best Apple deal,” now we have a $300 Dell computer as the best Apple deal!? Fonzie, you can keep your shark.
A couple of years ago, Google decided that it was going to insert its own image proxy between your Gmail messages and any remote images referenced therein. Before this, if an email included an image that was not sent along with the email (an external or remote image), when you read the email, your web browser saw the image reference in the message and loaded the image directly from the source. Now, however, Google rewrites the email message to refer to the image via Gmail’s image proxy, which loads and caches the image from the original location, and when you read the email, your web browser loads the image from Gmail’s image proxy rather than the original source. There are a number of benefits to this approach, but there are also drawbacks—namely, new bugs.
Periodically, I receive an email to my Gmail account from Zacks, the large investment research firm, which contains a remote image that has spaces in its filename, e.g. “motm cash sidelines image_624.png” in Sunday’s email. Not only are there spaces in the image filename, but these spaces aren’t escaped or encoded when the image URL is inserted into the HTML content of the email:
<img style="width: 624px; height: 269px; float: left; margin: 0px 8px 0px 0px;" src="https://staticx-tuner.zacks.com/images/articles/thumbnail/motm cash sidelines image_624.png" alt=""/>1 It’s certainly not best-practices to include spaces in any part of a URL, nor to include such URL in HTML with the spaces unescaped/unencoded, but as we have long-since left behind the world of strict and restrictive DOS and UNIX filename conventions, it is not unexpected these days to see humane filenames and file paths on the web (and, anyway, every reasonable web browser and email client knows how to handle such cases properly).
This is what Gmail, using its image proxy to load the external image, displays:
This is what Mac OS X Mail displays when viewing the same email:
Finally, this is what a web browser (Safari, in this case, though any modern browser should display similarly) displays when viewing the HTML content of the same email:
Both Mail and Safari know how to handle image URLs with (unescaped) spaces in them, and they do so correctly. Gmail, and its image proxy, fail.
The end result of the Gmail image proxy’s involvement in my email is that I have to extract the (rewritten) image URL from the message, strip off the part referring to the image proxy, and then fix the proxy’s broken encoding of the spaces in the original URL order to have an image URL I can then feed back to my browser and have it load the image (in another tab). Then I have the privilege of switching back and forth between the email text and the image the text is discussing. It’s a pain, but manageable, for one image. If there are several images in the email, repeating the process each time becomes quite annoying.
Back to investigating the problem—this is the URL for the “missing” image in Gmail:
https://ci4.googleusercontent.com/proxy/k0FVMVoNhpmHkkXhL6u7S4wzeMzBpLic1ugVLVVM4u-oIK79_Yb7WdjqITdHi0swAcPIGtpPGAK3B_MzoSvG32IRc2E6my-AqwWfDUPCvKezzfDRKGY-Ki9R3JORGPAhydwzYdLH_uxX7lKB2VCT93w=s0-d-e1-ft#https://staticx-tuner.zacks.com/images/articles/thumbnail/motm+cash+sidelines+image_624.png (Google’s systems, e.g., Blogger/Blogspot, tend to use the strange, non-standard practice of escaping/encoding spaces in URLs with the plus sign, even though they percent-encode everything else.) Recall that the filename of the image on the Zacks server is “motm cash sidelines image_624.png” but that the filename shown in the URL in Gmail is “motm+cash+sidelines+image_624.png”, and then evidence of the problem becomes apparent. If the Gmail image proxy tried to request “motm+cash+sidelines+image_624.png” from the Zacks web server, of course that image is not going to be found!
Without knowing more details about how the entire process of scanning an email for external image references, fetching and storing (caching) them via the image proxy, and the rewriting the original email’s image reference to point to the image proxy instead, it’s difficult to tell exactly where the problem lies. For instance, if the part of the image proxy that does the fetching of the external image encodes the URL using Google’s “standard” encode-spaces-with-plus-signs method and tries to fetch that, it won’t find the image. If the fetching part properly percent-escapes/encodes the URL before fetching but stores the image on the proxy server either with its original filename or as the percent-encoded version (which would be “motm%20cash%20sidelines%20image_624.png” for those keeping track), but the rewriting part uses the plus sign-encoding when rewriting the reference in the mail message, things will be broken. (Though it seems ridiculous to have one subsystem do thing one way and another subsystem do the same thing another way, it’s probably not uncommon in large, complex software—I’ve seen things like that before—and may only fail in edge or corner cases that the developer or team might not consider.) Or, if for some reason the image proxy assembles the entire URL that is later found in the Gmail message and then encodes it (using Google’s “standard” encode-spaces-with-plus-signs method) when inserting it back into the email, and then only tries to fetch the image once I, or someone else getting the same Zacks newsletter asks Gmail to load images (or has automatic image loading turned on), it’s going to fail if it doesn’t first change the plus signs back to spaces (or percent-encoded spaces).
It’s hard to say exactly where the bug might be, but make no mistake, it’s a bug; it’s Google’s bug (and it is no doubt caused in part by Google’s use of a non-standard encoding mechanism—spaces escaped with plus signs—in their web software).
1 The content of the email itself is actually sent encoded as Quoted-Printable, to protect it from such gremlins as 7-bit mail servers, but that’s not relevant to this bug and so I have decoded the Quoted-Printable here to make the HTML snippet more readily understandable. ↩︎
Michael Tsai recently linked to Ricardo Mori’s lament on the unfashionable state of the Mac, quoting the following passage:
Having a mandatory new version of Mac OS X every year is not necessarily the best way to show you’re still caring, Apple. This self-imposed yearly update cycle makes less and less sense as time goes by. Mac OS X is a mature operating system and should be treated as such. The focus should be on making Mac OS X even more robust and reliable, so that Mac users can update to the next version with the same relative peace of mind as when a new iOS version comes out.
I wonder how much the mandatory yearly version cycle is due to the various iOS integration features—which, other than the assorted “bugs introduced by rewriting stuff that ‘just worked,’” seem to be the main changes in every Mac OS X (er, macOS, previously OS X) version of late.
Are these integration features so wide-ranging that they touch every part of the OS and really need an entire new version to ship safely, or are they localized enough that they could safely be released in a point update? Of course, even if they are safe to release in an update, it’s still probably easier on Apple’s part to state “To use this feature, your Mac must be running macOS 10.18 or newer, and your iOS device must be running iOS 16 or newer” instead of “To use this feature, your Mac must be running macOS 10.15.5 or newer, and your iOS device must be running iOS 16 or newer” when advising users on the availability of the feature.
At this point, as Mori mentioned, Mac OS X is a mature, stable product, and Apple doesn’t even have to sell it per se anymore (although for various reasons, they certainly want people to continue to upgrade). So even if we do have to be subjected to yearly Mac OS X releases to keep iOS integration features coming/working, it seems like the best strategy is to keep the scope of those OS releases small (iOS integration, new Safari/WebKit, a few smaller things here and there) and rock-solid (don’t rewrite stuff that works fine, fix lots of bugs that persist). I think a smaller, more scoped release also lessens the “upgrade burnout” effect—there’s less fear and teeth-gnashing over things that will be broken and never fixed each year, but there’s still room for surprise and delight in small areas, including fixing persistent bugs that people have lived with for upgrade after upgrade. (Regressions suck. Regressions that are not fixed, release after release, are an indication that your development/release process sucks or your attention to your users’ needs sucks. Neither is a very good omen.) And when there is something else new and big, perhaps it has been in development and QA for a couple of cycles so that it ships to the user solid and fully-baked.
I think the need not to have to “sell” the OS presents Apple a really unique opportunity that I can imagine some vendors would kill to have—the ability to improve the quality of the software—and thus the user experience—by focusing on the areas that need attention (whatever they may be, new features, improvements, old bugs) without having to cram in a bunch of new tentpole items to entice users to purchase the new version. Even in terms of driving adoption, lots of people will upgrade for the various iOS integration features alone, and with a few features and improved quality overall, the adoption rate could end up being very similar. Though there’s the myth that developers are only happy when they get to write new code and new features (thus the plague of rewrite-itis), I know from working on Camino that I—and, more importantly, most of our actual developers1—got enormous pleasure and satisfaction from fixing bugs in our features, especially thorny and persistent bugs. I would find it difficult to believe that Apple doesn’t have a lot of similar-tempered developers working for it, so keeping them happy without cranking out tons of brand-new code shouldn’t be overly difficult.
I just wish Apple would seize this opportunity. If we are going to continue to be saddled with yearly Mac OS X releases (for whatever reason), please, Apple, make them smaller, tighter, more solid releases that delight us in how pain-free and bug-free they are.
1 Whenever anyone would confuse me for a real developer after I’d answered some questions, my reply was “I’m not a developer; I only play one on IRC.”2 ↩︎
2 A play on the famous television commercial disclaimer, “I’m not a doctor; I only play one on TV,” attributed variously, perhaps first to Robert Young, television’s Marcus Welby, M.D. from 1969-1976.3 ↩︎
3 The nested footnotes are a tribute to former Mozilla build/release engineer J. Paul Reed (“preed” on IRC), who was quite fond of them. ↩︎
Today’s DealNews Apple (née DealMac) newsletter:
DealNews Apple newsletter, September 22, 2016
Really!? I know that DealMac hasn’t been what it was a decade ago, or even five years ago, for a while now—a definite shadow of its old self1—and that many Mac users may have Android phones, but, really, Android games are the best/most relevant Apple-related deal for the day? I find that extremely difficult to believe.
1 After reading the “new” DealNews Apple-format newsletter for a while after the changeover last year, I sent their feedback system a list of a half-dozen or so suggestions on how they could improve the newsletter experience and make it easier to see/find relevant deals. Needless to say, none of the suggestions have been implemented. ↩︎
One of the rules I’ve used […] is not to argue with “I bet lots of people are like me and want feature X,” but instead say why you specifically want feature X, or why you’d prefer some behavior or design change.
In other words: instead of just asserting that a thing would be better or more popular if done a different way, tell a story with details.
Maybe that’s not right for every beta test, but that’s what works for me. I like stories. A single person can convince me with a good story.
Brent has written about this point before, in the “Tuesday Whipper-Snapping” section of How to manipulate me (or, Tuesday Whipper-Snapping),1 but it’s an important point that bears repeating: when you are a user trying to explain to a developer/QA/support that you’d like feature X or think feature Y would work better in some other way, tell us why. Tell us what you’re trying to do, why you’re trying to do it. As Brent says, tell us a story, with details, about what you need/want to do with the software.
First, as the quotation above indicates, a good use-case (“story”) can often convince the person/people behind the software right off the bat of the importance and/or awesomeness of your proposed feature. Second, as Brent mentioned a decade ago (!) in the discussion of Exposé in “Tuesday Whipper-Snapping,” your story is important because it may lead to the developer(s) devising a new or easier or more clever way of helping you to accomplish your task, rather than the specific implementation you may have conceived yourself.
So, tell us stories about what you hope to do.
1 Which I’ve linked to before in my compilation of great “Brent Simmons on software development for end-users” articles. ↩︎
For some time, I’ve been meaning to start a series of posts that outline software/website issues I run across on a daily basis (because I *do* run across buggy or poorly designed software/websites on a daily basis), in part in an effort to blog more often, but also to shine the light on what we as technology-using people deal with on a daily basis. It’s taken me a while—blogging is hard , and so is documenting and writing a good bug report—but herewith the first entry in Your Daily QA.)
The National Geographic Society, in partnership with the National Trust for Historic Preservation and American Express, has been running a vote to divy up $2 million in funding to help preserve or restore various sites in National Parks: #VoteYourPark.
It’s a lovely site and a nice idea, but there are a couple of wonky implementation details that routinely drive me crazy.
When you try to sign in using your email address, the sign-in form doesn’t work like a typical form. In most forms, pressing return in a text field will submit the form (or trigger the default button), and if you’ve been using the web on the desktop for a long time, you have finely-trained muscle memory that expects this to be true. Not for this form, however. Even worse, the “button” (it’s really a link camouflaged by CSS to look like a button) isn’t in the tab chain (or at least isn’t in the tab chain in the right location), so you can’t even tab to it and trigger the form via the keyboard after entering your password. Instead, every single day you have to take your hand off of the keyboard and click the “button” to log in.
The fun doesn’t end with the sign-in form, though. After you’ve voted for your parks, you have the opportunity to enter a sweepstakes for a trip to Yellowstone National Park. To do so, you have to (re)provide your email address.
In this form, though, pressing return does do something, because instead of being offered the opportunity to enter the sweepstakes, pressing return shows this:
It appears that you have lost your opportunity to enter the sweepstakes as a result of pressing return to submit the form. (If you close the message and then look closely at the area of the page that originally contained the sign-in information, there is a link that will let you enter the sweepstakes after the voting procedure is complete, but it’s fairly well hidden; I didn’t find it until muscle memory in the form submission had caused me to miss several chances to enter by triggering the above screen.)
There are other annoyances (like the progress meter that appears when loading the page and again after logging in), but they’re minor compared to breaking the standard semantics of web forms—and breaking them in different ways in two different forms on the same page. By all means, make your form fit with your website’s needs, but please don’t break basic web form semantics (and years of users’ muscle memory) in the process.
Wedding portrait of John Ardisson and Mary Julia Adamic
Delmont, PA ⚜︎ June 15, 1916
One hundred years ago today, June 15, 1916, in the Reformed Church Parsonage in Delmont, Pennsylvania, John Ardisson and Mary Julia Oswald were married.
John, born May 2, 1894 in Export, PA, son of Stefano Serafino Ardissone (himself born September 2, 1862 in Baldissero Canavese, Torino, Piedmont, Kingdom of Italy) and Maria D. Silva-Pramone (born January 30, 1865, also in Baldissero Canavese) was 22 years old.
Mary, born January 9, 1900, in Thompson Run, Allegheny County, PA, daughter of Anton Osvalt (himself born January 10, 1865, in Novicote(?), Slovenia [Duchy of Carniola], Austrian Empire) and Mary Adamic (born August 15, 1874 in Ribnica, Slovenia [Duchy of Carniola], Austria-Hungary) was 16 years old on her wedding day.
John and Mary would go on to raise four children, Dorothy Anna, Edward Stephen, Gerald John, and Eugene Anthony, all of whom served their country in the United States Army (Nurse Corps, Air Corps/Air Forces, Artillery) during World War II, and who would return home safely and begin the rest of their lives. There would then be nine grandchildren, and, though neither John nor Mary would live to see all of them, nineteen great-grandchildren, and, finally, at last count, fifteen great-great-grandchildren. John and Mary were married for 59 years, until his death on October 28, 1975.
The picture in the frame was taken on that wedding day, 100 years ago today, with a camera that was no doubt 100 times larger than the one used today to take this photograph of it. Happy 100th Anniversary, Grandma and Grandpap Ardisson!
Announcement of the fiftieth wedding anniversary of Mr. and Mrs. John Ardisson
The News-Dispatch (Jeanette, PA), Friday, June 3, 1966
It has been a long, storied career as you have set records and ensured your place among the pantheon of the sport, inspired players and fans alike, and tonight we celebrate you for the outstanding athlete and person you are.
Thank you, Abby, for all you have done playing the beautiful game.
No man is an island, entire of itself; every man is a piece of the continent, a part of the main. If a clod be washed away by the sea, Europe is the less, as well as if a promontory were, as well as if a manor of thy friend’s or of thine own were: any man’s death diminishes me, because I am involved in mankind, and therefore never send to know for whom the bell tolls; it tolls for thee.
—Excerpt of Meditation XVII, Devotions upon Emergent Occasions (John Donne, 1623)