Ideas for better data privacy usability

This morning I got an email like this:

Hi [customer],

If your inbox is anything like ours, it’s recently been filled with emails like this one: a company updating its policies. You’re probably going to receive many more before May 25 because of a new European privacy law called the General Data Protection Regulation (or GDPR). Companies are updating their policies to meet GDPR requirements, and are sending their customers notices about the changes. Today, we are releasing our own updated Privacy Policy, which provides greater clarity and detail about the information we collect, how we use it, and how we comply with GDPR. […]

Our new Privacy Policy has added some detail around what you can do with data we collect about you, and how you can exercise your privacy rights. It also provides increased transparency around the different purposes for which we use this data. […].

I don’t appreciate the meta comment about getting lots of emails like this. Its only a reminder of something I despise, hardly welcome.

Though it got me thinking: What’s so wrong with this? Isn’t it nice that companies are updating their privacy policies to the benefit of consumers?

The problem I have with this process is the asymmetric power and burden. As a consuming customer, the only leverage I have is to stop using their service. That’s an all-or-nothing game I don’t want to play. For example, I despise many things about Facebook, but I’m not yet taking the only leave-completely option, since there’s still too many things that I don’t want to miss out on.

Given that its a good thing for companies to pay attention to their data use and make their policies public, how could we remove the current burden from customers, and shift it somewhere else?

Here’s some ideas:

  • Companies have to provide a fact sheet, like insurance or investment products. On a single, well-formatted and readable page, list what data the company gathering, who its being shared with, how long its stored it and similar details. Optimize this for a quick read, in a standardized format (e.g., retention policy always in the upper-right box).
  • Companies have to submit their updated policies to a 3rd party, that they need to pay to have their documents reviewed. The contact details and review date are then added to the full public policy, so that consumers with doubts about the companies policies can contact the reviewer and have them confirm the review. This 3rd party could use a low-effort support system like Intercom (you can handle a lot of requests with chat), to provide free answers, with a paid phone support in addition.
  • Companies have to use standardized policy templates. ALL UPPERCASE LEGALESE IS STRICTLY FORBIDDEN. A clear and predictable structure makes it easy to find specific details.
  • Companies have to provide diffs when updating their policies. To keep the diff simple, the updates need to be kept under control, too.
  • Companies have to provide a machine readable version of the privacy policy, that your browser or a plugin can read and evaulate according to your preferences. The result could be displayed with an icon similar to the SSL-lock.

What I expect to happen instead:

Lach- und Sachgeschichten vom Baumarkt

Heute mit Bauhaus! Alle anderen Namen sind frei erfunden.

Vor ein paar Tagen kaufte ich beim Bauhaus um die Ecke eine Sackkarre. Eine solche hatte sich beim Umzug als sehr wertvoll erwiesen, da damit schwere Geräte wie der Kühlschrank wesentlich leichter zu transportieren sind. Da bei uns endlich die Küchenmontage anstand und wir unsere temporären Geräte (Kühlschrank, Spülmaschine) ausräumen mussten, schien eine Sackkarre eine sinnvolle Investition.

Als wir dann heute den Kühlschrank raus rollten, fiel auf, dass einer der Reifen platt war. Das machte die Sackkarre deutlich weniger nützlich, da sie mehr am schleifen als am rollen war. Da ich ohnehin noch ein paar Sachen besorgen wollte, beschloß ich kurzerhand, nochmal zu Bauhaus zu fahren, um dort die Reifen aufpumpen zu lassen.

Da ich nicht mal wieder mit der Sackkarre durch den riesigen Laden laufen wollte, fuhr ich direkt in die “Drive-In Arena” hinein – dort hatte ich die Sackkarre ursprünglich gefunden. Im Verkauf, ein beheizter, abgetrennter Raum innerhalb der sonst eiskalten “Arena”, fand ich Erwin, dem ich nach etwas Warten den Sachverhalt erklären konnte. Der delegierte das Aufpumpen dann an seinen Kollegen Anton, der sich der Sache annahm. Nachdem ich meinen PKW etwas weniger blockierend geparkt hatte, fand ich Anton mit der Sackkarre und einer mit Kompressor betriebenen Pumpe. Einen Moment später war er auch schon fertig und ich kehrte zum Wagen zurück. An der Kasse konnte ich schließlich erklären, dass ich das Gerät schon vorher gekauft hatte und nichts zu bezahlen habe. Nach Kontrolle des Kofferraums durfte ich dann auch wieder raus.

Nachdem ich die anderen Einkäufe erledigt hatte, rollte ich die Sackkarre wieder in die Wohnung und stellte sie erstmal zur Seite. Es gab noch einiges umzuräumen, bevor wir die Spülmaschine abmontieren und ebenfalls rausrollen könnten. Währenddessen gab es plötzlich einen sehr lauten Knall. Eine Tasche, die neben der Sackkarre lag, war sogar kurz in Bewegung. Nach einer Inspektion stellte sich schnell raus: Der linke Reifen war geplatzt! Wenn dieser auch ohne Belastung platzen konnte, hatte Anton offensichtlich zu viel Druck auf den Reifen gegeben.

Also fuhr ich zurück zu Bauhaus: Wieder in die Arena, wieder parken, wieder zum Verkauf, wieder warten, wieder Erwin den Sachverhalt erklären. Seine erste Erwiderung, ungefähr: “Du hättest die Reifen ja selber aufpumpen können!”. Zum Glück brachte mich das nicht aus der Fassung, stattdessen erwiderte ich nur, dass es ja wohl nicht meine Schuld ist, wenn ein Mitarbeiter die Reifen mit zu viel Druck befüllt.

An dieser Stelle hätte die Geschichte zu Ende sein können: Defekte Ware ersetzen, fertig. Aber nein, eine solche Exekutiv-Entscheidung konnte Erwin unmöglich treffen, stattdessen musste er erstmal telefonieren. Beschluss: Kunde (mich) zur Eisenwaren-Abteilung schicken, dort passenden Reifen suchen lassen, damit zurückkommen und den geplatzten Reifen austauschen. Aus im Nachhinein nicht nachvollziehbaren Gründen habe ich es mitgemacht. Auf dem langen Weg (~5 Minuten Gehweg) beschloss ich, direkt dort zur Information zu gehen, da selber suchen in den riesigen Regalen ziemlich sinnlos ist.

An der Eisenwaren-Information war aber niemand, noch auf den anliegenden Gängen. Die Dame an der Selbstbedienungskasse daneben konnte mir lediglich sagen, man sei unterbesetzt und ich müsste in anderen Abteilungen oder an der Information fragen. Vorige Besuche hatten mir bereits gezeigt, das Abteilungs-fremde Mitarbeiter keine Ahnung haben, also suchte ich selber und fand irgendwann tatsächlich den Abschnitt mit einigen Reifen. Einige Minuten später entschied ich mich dann für einen Reifen, der zwar die passenden Maße, aber nicht denselben maximalen Druck (2 vs 2,5 bar) hatte. Damit machte ich mich dann auf den langen Rückweg…

Dort angekommen, entschloss Erwin immerhin, einen anderen Kunden erstmal warten zu lassen, und sich direkt mit meinem Fall zu beschäftigen. Zunächst machte er noch einen halbherzigen Versuch, das Thema loszuwerden (“Können Sie den Reifen selber wechseln?”). Mangels Werkzeug und Ahnung lehnte ich das ab. Mit einem winzigen Schraubenzieher bekam er die Kappe nicht ab, mit einem etwas größeren und viel Mühe löste er sich aber schließlich. Damit ließ sich dann der platte Reifen ab- und der neue aufziehen. Doch dann zeigte sich: Das passt nicht. Die Felge hatte die falsche Form, die Achse war so zu kurz und die Kappe passte auch nicht mehr.

An dieser Stelle hätte die Geschichte ebenfalls zu Ende sein können: Ersatz geben, fertig. Aber nein, Erwin überzeugte mich, doch nochmal zur Eisenwaren-Abteilung zurück zu kehren, und dort jemand zu finden, der den passenden Reifen ausfindig machen kann. Wie ihm auch diese Überzeugungsarbeit gelang, ist mir im Nachhinein völlig unklar. Ich machte mich also wieder auf den Weg, diesmal mit dem kaputten sowie dem unpassenden Reifen. Immerhin ohne die restliche Karre, die lehnte noch im Verkauf an einem Stapel Eimer.

Mir war schnell klar, das es die korrekten Reifen nicht gab, aber immerhin fand ich diesmal einen Verkäufer, der gerade einen anderen Kunden mit irgendwelchen Schrauben beriet. Also platzierte ich mich direkt neben ihm, um als nächstes dran zu sein. Als es soweit war, konnte ich dann Franz das Problem schildern. Auch Franz sah schnell ein, das er den richtigen Reifen nicht da hatte, aber ihm fiel eine Lösung ein: Schlauch austauschen! Ging aber auch nicht, da die passenden Schläuche nicht vorhanden waren. Da ich befürchtete, mit leeren Händen wieder zurück zu kehren, bekniete ich Franz, mich nicht im Stich zu lassen. Nachdem einem kurzen Telefonat mit Erwin beschloss er, mit mir mitzukommen, um von einer der anderen Sackkarren einen Reifen abzumontieren, und diesen an meine dran zu packen. Franz zeigte hier nicht nur Eigeninitiative, sondern auch etwas Vorrausicht: Er packte direkt passendes Werkzeug ein.

Nach ein paar weiteren Gehminuten in die allerletzte Arena-Ecke und etwas mehr Hebelei machten wir uns auf den Weg zurück zum Verkauf. An der Ecke fiel Franz dann auf, das dort allerhand Reifen gestapelt waren, inkl. dem passenden für meine Sackkarre. In der Arena! Und mich schickt man ganz woanders in! Franz grummelte etwas eher Unflätiges…

Als wir dann den Verkaufsraum betraten, wunderte ich mich, wieso sowohl der Stapel Eimer als auch die Sackkarre am Boden lagen. Die Karre hatte ja nur noch einen Reifen, bei einer näheren Untersuchung stellte sich raus: Jetzt war auch der andere platt! Der musste in meiner Abwesenheit geplatzt sein, und hatte dabei den Stapel Eimer mitgerissen. Erstaunlicherweise (oder auch nicht) ignorierte mich Erwin jetzt komplett. Auch Anton sagte kein Wort, obwohl zumindest einer von beiden den Knall mitbekommen haben musste.

Auch hier zeigte Franz wieder seine kompetente Seite und traf endlich die lange überfällige Entscheidung: “Holen Sie sich einfach einen Ersatz.”

Als ich dann damit nochmal in den Verkaufsraum zurück kehrte, wurde ich weiterhin ignoriert. Franz war inzwischen verschwunden. Nach einer Minute beschloss ich dann, die Karre wieder ins Auto zu packen und damit wieder zum Ausgang, respektive Kasse, zu fahren. Nach einer weiteren Kofferraum-Inspektion und der Erklärung, das ich jetzt Ersatz hätte, durfte ich dann auch wieder fahren…

Implementing HTTP/2 push in Java

This is another guest post by my friend Tobi. —Jörn

The story:

Some months ago I started to play around with HTTP/2 and wondered what should get better with this piece of technology, where are the limitations and pitfalls. So I first went to Wikipedia and read the Wikipedia article about HTTP/2 and the RFC 7540 standard. I was quite impressed about the idea to reduce the latency of web pages.

Because I am familiar with JEE development I just had a look at how to integrate this technology in an existing JEE application and read about PushBuilder API. Cool – a Java API which handles to push resources before the actual response is submitted to the client. I thought this sounds good and build up my first application with it.

First I tried to configure tomcat with SSL and HTTP/2, but I failed sadly as you can read within this mailing list topic Apache Tomcat 9.0.0-M4 and http/2 on Mac OS X 10.11.4 (If you have any hints what I did wrong please let me know!). Then I tried it by configure a Jetty Servlet Container which was a great straight forward implementation as you can see in this Sample.

Ok the first implementation was made.

Then I had a look into the console of my browser and saw the resources are pushed all the time and I thought this might cause a big impact on the network traffic which outweighs the latency benefit. So I posted a question at stackoverflow about “Jetty respond with status 200 instead of 304 while using http2” and happily Martin Grigorov (Tomcat Committer) and Simone Bordet (Jetty core developer) helped me within this question and a corresponding issue ticket jetty.project issues 801 to understand that it is up to the developer when a resource should be pushed and when the browser should use the cache. One sentence I want to quote: “I think there is a misunderstanding of what the push APIs do. Right now, they just push.”

By consolidating those new information I came up with a new Implementation for Apache Wicket to handle HTTP/2 push very easily. You can find the implementation in the corresponding PushHeaderItem class in the wicket git repository

Here are some facts / pitfalls that you should consider when using HTTP/2 push:

  1. Think about when should resources be pushed and when it makes more sense to get them out of the browser cache with a minor “overhead request” – depending on this you have to build up your own implementation
  2. Some browsers like Chrome do not cache resources if the SSL cert is self signed – consider this if you check the caching behavior of your implementation
  3. Try to implement your push API docile so that the browser can also use HTTP/1 and get the resources in a normal way as fallback
  4. You can check the push behavior of your implementation / example application. Chrome example: chrome://net-internals/#http2

Conclusion:

When using HTTP/2 and PushBuilder API you have to think about a lot of marginal conditions like Caching, SSL implementations, traffic impact to find a good solution that does exactly what you want.

Release: Validation Plugin 1.15.1

I’m happy to announce the first patch release for the jQuery Validation plugin 1.15.x series.

11 people helped out to add a few enhancements and fix some bugs. Kudos to all of you, namely: adhayward, Bill Sorensen, Brahim Arkni, Hugo, Huseyn, Jordan Clark, Markus Staab, Michael Hohlovich, svrx, TLib and Torgny Bjers.

This is another release which would not have been possible without the help of Brahim Arkni. Thanks again for your support!

For a full list of all the changes, check out the changelog below.

Download this release.

  • Please post questions to the official Using jQuery Plugins Forum, tagging your question with (at least) “validate”. Keep your question short and succinct and provide code; a testpage makes it much more likely that you get an useful answer in no time.
  • Please post bug reports and other contributions (enhancements, features, e.g. new validation methods) to the GitHub issue tracker

The full changelog:

Additional

  • Fix multiple mime-type validation
  • IBAN require at least 5 chars (Closes #1797, Fixes #1674)
  • Correct notEqualTo jQuery reference

Core

  • Added failing test for #1805
  • Fix group validation with 3 and more fields
  • Fix regressions introduced in #1644 and #1657 (Closes #1800)
  • Update step validation to handle floating points correctly
  • Fix error when calling $.fn.rules() on a non-form element
  • Call errorPlacement in validator scope
  • Fixed issue with contenteditable elements in forms where events for single input validation would cause exceptions

Demo

  • Add links to Bootstrap and Semantic-UI demos to index.html
  • Use .on() instead of .validateDelegate()

Localization

  • Added Azeri language

Tests

  • Added regression unit tests for PR #1760