Joho the BlogJoho the Blog - Let's just see what happens

February 14, 2016

How a dot invaded dweinberger’s privacy

Yesterday I started getting a stream of receipts from Amazon for goods I had not purchased. Mainly they were free games and apps so I only freaked out to 70% of maximum.

I changed my Amazon password and checked my credit cards just in case one of the purchases — there were dozens — was not free. All seemed in order.

The receipts cheerily exposed the person’s name to me, thanking “Dixxon Weinberger” for the $0.00 purchase. (I have changed Dixxon’s name because judging from the receipts and from the Facebook page I found under that name, he’s probably a minor.)

Because Dixxon’s name is spelled in an unusual way, I think I found the right Facebook page for him. It looks like an account he doesn’t check. But just in case, I left him a carefully written, friendly note suggesting that he clear up his email address at Amazon. The first thing I said in the message is that he should probably show this note to his parents. I did my best not to sound like an Internet creep, but it turns out that the harder you try, the creepier you sound. So I kept it to a minimum.

Then my son figured out what happened.

I own the email address I use it as my backup email in case my primary one ( breaks. It turns out that Gmail ignores dots in your name. So, will reach me, as will I’m sure there’s a good reason for this but I don’t really get why Gmail would so restrict its namespace. Anyway.

Dixxon apparently signed up at Amazon under, so all his mail from Amazon (and now from other places he’s signed up at) are coming to me. I am filing them without reading them because I don’t want to know what this kid is downloading, but it seems like a pretty big flaw that Amazon let someone sign up without sending an email requiring confirmation.

Let me now put this in the past tense: I just spent 20 mins on the phone with Amazon support. The support person was very patient. They have closed the d.weinberger account. The poor kid isn’t going to know why because the explanation will go to an address that ends up in my inbox.

Sorry, Dixxon! It’s better this way. And, Amazon, maybe do better at sending confirmation emails.

Of course it’s likely that I mistakenly/absently clicked some confirmation email, although I have no record or recollection of doing so. Nevertheless, I’ve learned that 97% of the mysteries in my life can be resolved by assuming I did something wrong.


February 8, 2016

Giving up on morality

Here’s something I took from Heidegger that may not be in Heidegger:

The basis of morality is the recognition that the world matters to each person, but matters differently.[1]

After that, I don’t know what to do except to be highly suspicious of anyone who cites moral precepts.

It turns out that I don’t find morality to be a very useful category since the way the world matters to us is so deeply contextual and individual: whether you should steal the loaf of bread has less to do with the general principle that it’s wrong to steal, and more to do with how hungry your family is, how much money you have, your opportunities to earn more money, the moral and legal codes of your culture, how kind the baker has been to you, what you know of the baker’s own circumstances, etc.

“Do unto others…,” Kant’s Categorical Imperative, the traditional Jewish formulation of “Don’t do unto others what you would not want done to you,” all are heuristics for remembering that the world matters to others just as much as it matters to you, but it matters differently. Trying to apply those heuristics without recognizing that the world can matter differently can lead to well-intentioned mistakes in which you substitute how your world matters to you for how theirs matters to them: you don’t believe in accepting blood transfusions so you refuse to give one to someone who believes otherwise.

This gets messy fast: You believe in the efficacy of blood transfusions, so you give one to someone who for religious reasons has stipulated that she does not want one. You are not treating her as an autonomous agent. Are you wrong? Once she’s under anesthesia should you let her die because she does not want a transfusion? I have my own inclination, but I have no confidence in it: Even the principle of always treating people as autonomous is hard to apply.

It’s easy to multiply examples, and very easy to find cases where I condemn entire cultures for how their world matters to them. For example, I’m really pretty sure that girls ought to be educated and women ought not to be subservient to men. I’d argue for that. I’d vote for that. I’d fight for that. But not because of morality. “Morality” just doesn’t seem like a helpful concept for deciding what one ought to do.

It can be useful as a name for the topic of what that “ought” means. But those discussions can obscure the particularities of each life that need to be as clear as possible when we talk about what we ought to do.

None of this is new or original with me. Maybe I’m just an old fashioned Existentialist — more Kierkegaardian than Satrean — but I feel like I could carry on the rest of my moral life without ever thinking about morality.

(No, I am not sure of any of the above.)


[1] That the world matters to us is certainly Heidegger. That it matters differently to us is more ambiguous. It’s captured in his notion of the existentiell, but his attempt at what seems to be a universal description of Dasein suggests that there may be some fundamental ways in which it matters in the same ways to us all. But it’s been a long time since I read Being and Time. Plus, he was a Nazi, so maybe he’s not the best person to consult about the nature of morality.


February 3, 2016

Trump’s "linguistic killshot"

Scott Adams, the Dilbert guy, writes perceptively about Trump’s skill verbally assassinating his opponents with what Scott kills a “linguistic killshot.” His example is Trump labeling Jeb! as “low-energy.” It’s the type of description that cannot be countered and cannot be unheard. Adams notes that Trump is both very calculating and very smart about this.

But he predicts that Trump’s shot against Hillary Clinton will be that she is not “credible.” I think I disagree. For one thing, that’s been the explicit beef against her for twenty years. For another, I don’t think it will have much traction with the people Trump needs to reach, because independents are just as likely to think that Trump negotiating with allies is more of a Dukakis-in-the-tank moment than a vision of credibility.

Assuming that Hillary is the nominee, I think maybe Trump will go after her as “always flapping her jaws,” as “chatty but no one can understand what she’s saying,” as “blah blah NATO blah blah Excuses blah blah Policy Report #45278 Part A.” But that’s not what America needs, he’ll tell us. We need someone who will stand up to our allies and kill our enemies. “It’s not that hard, folks. And we don’t need a Chatty Cathy for that.”

This has the effect of neutralizing her deep expertise, especially in foreign affairs, thus turning her strength against her. It makes her look weak-willed. There is no effective counter to it. And it’s deeply misogynistic. In short, it’s got Trump in big gold letters all over it.


February 1, 2016

Tung oil from a good vendor

We made the odd choice of replacing our miracle composite kitchen floor — zero upkeep — with a knotty pine floor. Pine is beautiful, and we think it helps make our kitchen look more inviting, but it’s very soft wood.

So we’re conditioning it with tung oil. Tung oil penetrates the wood and polymerizes, hardening it while enriching the color and giving it a satiny sheen. The floor will still be softer than our miracle composite, but you have to resign yourself to thinking of the dents and scratches as signs of its being lived in. Or on. Also, because tung oil penetrates the wood and isn’t a layer on top, you can sand out some dings, and you can always wipe on a little more oil. We may live to regret it, but we like it so far.

floor before and after

Unfortunately, tung oil is a pain in the tuchus when compared to, say, polyurethane. You brush poly on, you let it dry, you lightly scratch it up with brillo or sandpaper, and you do it again. Boom done. Tung oil takes several coats, it smells, it takes longer to dry before the next coat, and it takes much longer to fully polymerize.

After a lot of research — Thank you, Internet — we decided on going with Real Milk Paint tung products. The rational reasons are:

1. They seem to have high quality products. Since there are various types of tung oil pretenders on the market, that counts.

2. For the initial applications, the Internet recommends cutting the tung oil with a solvent. Real Milk has a pre-mixed prep called Half and Half that cuts the tung with citrus oil. True to the claims, we found that it dries quickly and doesn’t smell bad — sort of citrusy, unsurprisingly. (Nevertheless, we trained a fan over the floor while it dried to blow the odor away from us humans.)

But the real reason we went with Real Milk is that they seem like Real People who know their tung oil. I came to this conclusion by reading their discussion boards and watching their videos. They seem to be craftspeople who love finishes that bring out the beauty of the wood they have just worked. They are straightforward and non-defensive. They are on the side of their customers.

I confirmed this minutes ago by calling customer support with a question and talking with a couple of folks there. Our third coat wasn’t drying. They told me what to do about it (dry it) and reassured me that this is in fact a sign that the wood has been saturated. Now we just have to walk carefully on it for a month until it’s fully set.

Could I be wrong about the people and the company? Absolutely. I’m wrong about most things. Maybe they’ll turn out to be the robotic face of a Big Tung, a mega-corporation peddling relabeled motor oil drained from Chernobyl. But I will have at least been fooled for the right reasons.

And that counts for a lot.


January 28, 2016

Keep the Web unbroken, with Amber

When sites go down, they don’t take the links to them with them. So, your posts now point to 404s. That’s not just an inconvenience. It’s Web entropy and over time it will render the Web less and less useful and even less intelligible.

Amber fights Web entropy. It’s a plugin for WordPress or Drupal that automatically takes a snapshot of whatever you’re linking to. If the linked site goes down — or is taken down by a government that doesn’t like what it’s saying — your readers will still be able to read what was there when you linked to it.

For example, this is a page that I posted and then took down. It was here: It’s not there now. But if you hover over the link, Amber shows you what you’d otherwise be missing.

Amber’s pedigree literally could not be better. It’s a project from the Berkman Center, from an idea cooked up by Jonathan Zittrain and Tim Berners-Lee. It is a fully distributed system, thus helping to re-decentralize the Web, although you can opt to store the page images at sites like the Internet Archive,, and Amazon AWS.

What are you waiting for?



If you install Amber and it’s not working, make sure that you’ve created a folder called “amber” in your WordPress “uploads” directory: /wp-content/uploads/amber.


January 26, 2016

Oscars.JSON. Bad, bad JSON

Because I don’t actually enjoy watching football, during the Pats vs. Broncs game on Sunday I transposed the Oscar™ nominations into a JSON file. I did this very badly, but I did it. If you look at it, you’ll see just how badly I misunderstand JSON on some really basic levels.

But I posted it at GitHub™ where you can fix it if you care enough.

Why JSON™? Because it’s an easy format for inputting data into JavaScript™ or many other languages. It’s also human-readable, if you have a good brain for indents. (This is very different from having many indents in your brain, which is one reason I don’t particularly like to watch football™, even with the helmets and rules, etc.)

Anyway, JSON puts data into key:value™ pairs, and lets you nest them into sets. So, you might have a keyword such as “category” that would have values such as “Best Picture™” and “Supporting Actress™.” Within a category you might have a set of keywords such as “film_title” and “person” with the appropriate keywords.

JSON is such a popular way of packaging up data for transport over the Web™ that many (most? all?) major languages have built-in functions for transmuting it into data that the language can easily navigate.

So, why bother putting the Oscar™ nomination info into JSON? In case someone wants to write an app that uses that info. For example, if you wanted to create your own Oscar™ score sheet or, to be honest, entry tickets for your office pool, you could write a little script and output it exactly as you’d like. (Or you could just google™ for someone else’s Oscar™ pool sheet.) (I also posted a terrible little PHP script™ that does just that.)

So, a pointless™ exercise™ in truly terrible JSON design™. You’re welcome™!

Be the first to comment »

January 23, 2016

Guns, Sarah Palin, and other hilarious stuff

My brother Andy points to a New Yorker humor post by John Quaintance about the original intent of the Second Amendment. It’s simultaneously hilarious and sad.

Then, in the righthand column there’s a link to an Andy Borowitz post with an Onion-esque title that I enjoyed:

Palin Blames Obama for Her Defeat in 2008 Election

And while we’re on the subject of terribly sad mirth, here’s Colbert’s hilarious impersonation of the First Hockey Mom’s rhetorical style / way of thinking:


January 22, 2016

Open Syllabus Project goes live—Yay for open platforms!

The Open Syllabus Project has just gone live with a terrific beta Web site and a front page article about it by two of the main people on the project. (I’m proud to be an advisor to the group.)

The OSP is an open platform that so far has aggregated over a million syllabi. At the beta version of their search site you can do plain old searches, or filter by a number of factors. Want to see what is the most taught work at Harvard? In the state of Texas? In the field of Biology? Lucky you.

The project is computing what it calls a “Teaching Score” for each work, a number from 1-100. This is along the same lines of the StackScore I’ve been pushing for, a metric we use in Harvard’s LibraryCloud Project and that will be used in the Linked Data for Libraries project. (The OSP used Harvard’s open catalog metadata as a main source for book metadata and disambiguation; that metadata is available through LibraryCloud’s API. It’s an intertwingly world.)

The OSP plans on making its data available through open APIs, which will multiply the good effect it has. Sites will be able to integrate data from the OSP through the API, developers will be able to create apps that use that data, and researchers will find ways to investigate it that we literally cannot imagine.

Now, you’d think someone would have done something like the OSP years ago. In fact, there have certainly been efforts. For example, Dan Cohen (currently head of the DPLA) scoured the Web and aggregated about a million publicly available syllabi. But the sad truth is that most academic institutions don’t make their syllabi openly available. In fact, many institutions and many professors copyright their syllabi. That makes sense to me if they have written little essays in them. But as a listing of topics and works, I can’t imagine why anyone would insist on asserting copyright. What’s the worst that would happen? Some other teacher copies your syllabus perfectly? That teacher has learned from you, and you’re going to teach your course differently anyway. Meanwhile, the potential good from sharing syllabi is enormous: We can learn from one another. We can see unintended patterns that may express wisdom or bias.

The OSP is here. It’s going to make a real difference.


Good luck with the snow, my southern friends

I just got off the phone with a friend in DC where a couple of days ago one inch of snow caused 6-hour tie-ups, causing some people to abandon their cars. Now the city is expecting a record thirty inches (or what we in Boston call, “Oh, it looks like it may have snowed overnight”). Residents are being told to expect power outages.

Best of luck to you all. You have New England’s sympathies. (And you also have an offer of help from Boston’s mayor.)

At least we can look forward to the Republican snowball fight in Congress to prove that global warming is a myth.

1 Comment »

January 16, 2016

Getting the path from the Dropbox API

Suppose you’re using the Dropbox API to let a user choose a file from her Dropbox folder and open it in your application. Dropbox provides a convenient widget — the Chooser — you can more or less just drop into your Web page. But…suppose you want to find out the path of an item that a user opens. For example, you want to know not only that the user has opened “testfile.txt” but that it’s “Dropbox/testfolder/TestA/testfile.txt”. The chooser only tells you the link is something like:

Figuring out how to get that path information took me /for/ev/er. I know it shouldn’t have, but it did. So, here’s how I’m doing it. (As always, please try not to laugh at my efforts at coding. I am an amateur. I suck. Ok?) (I owe thanks to Andrew Twyman at Dropbox who went out of his way to help me. Thanks, Andrew! And none of this is his fault.)

The way to get the path is explained in Dropbox’s API documentation, but that documentation assumes I know more than I do. Dropbox also provides an API Explorer that lets you try out queries and shows you the code behind them. Very helpful, but not quite helpful enough for the likes of me, because I need to know what the actual PHP or JavaScript code is. (It’d be easier if I knew Python. Someday.)

So, here’s roughly how I got it working. I’m going to skip some of the preliminaries because I went through them in a prior post: how to register an app with Dropbox so you can embed the Dropbox Chooser that lets users browse their Dropbox folders and download a file.

That prior post included code that initializes the Chooser. I want to add a single line to it so we can get the pathname of the downloaded document:


var opts= {


success: function(files) {



var filename = files[0].link;


filename = filename.replace(“dl=0″,”dl=1”);








url: “./php/downloadDropboxContents2.php”,


data: {src : filename},


success: function(cont){








setCookie(“lastfile”,”/php/currentFile/” + filename);







error: function(e){











multiselect: false,


extensions: [‘.opml’],


linkType: “download”




var button = Dropbox.createChooseButton(opts);



When a user chooses a file from Chooser, the “success” function that starts on line 10 is invoked. That function is passed information about the files that have been opened by the user in an array, but since I’m only allowing users to open one file at a time, the information is always going to be in the first and only element of that array. That information includes something called “link,” which is a link to the file that does not include the path information. So, in line 15 — the only new line — we’re going to pass that link to a function that will get that elusive path.


function getDropboxPath(link){




type: “POST”,


beforeSend: function (request)




request.setRequestHeader(“Content-Type”, “application/json”);






data: JSON.stringify({url : link}),


success: function(cont){






error: function(e){









This is another AJAX call; it too assumes that you’ve included jQuery. (See the prior post.)

Now, how does this work. Well, I’m not entirely sure. But it’s sending a request to the Dropbox API. It’s doing this as a standard http web call, which means (I think) that you have to include metadata that web servers expect when you’re using http. (I could be wrong about this.) So, in line 6 you tell it that you are expecting to get JSON back, not a standard Web page. (JSON is a standard way of encoding human-readable, multipart information.)

In line 8 you’re constructing the URL you’re going to send your request to. Everything up to the question mark is simply the URL of the Dropbox API for getting metadata about a link. After the question mark you’re telling it that you’re authorized to make this request, which requites getting an authorization code from Dropbox. I’m probably cheating by using the one that the API Explorer gives you, but it works for now so I’ll worry about that when it breaks, which will probably be the next time I use it. Anyway, you need to insert your authorization code where it says “insert your authorization code” in all caps.

Line 9: The data is the internal link that the Chooser gave you as the URL of the file the user downloaded. I use JSON.stringify because it didn’t work until I did.

Line 10 is what happens when your query works. You’ll get an object from Dropbox that contains several different pieces of info. You want the one called “path_lower,” presumably because it gives you the path that is lower on the great Tree of Files that is a Dropbox folder. [LATER THAT DAY: Andrew tells me it’s actually called path_lower because it’s the path in all lower case, which is useful because the Dropbox file system is case insensitive. Frankly, I prefer my explanation on poetic grounds, so we’ll have to agree to disagree :)] Line 11 gets that path (cont.path_lower) and pops it into an alert box, which is almost certainly not what you actually want to do with it. But this is a demo.

That’s it. If you have questions, try to find someone who understands this stuff because I got here through many trials and even more errors.

Good luck.


Next Page »

Creative Commons License
Joho the Blog by David Weinberger is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 United States License.

Creative Commons license: Share it freely, but attribute it to me, and don't use it commercially without my permission.

Joho the Blog gratefully uses WordPress blogging software.
Thank you, WordPress!