#Qualitätsjournalismus und Datenschutz

sz.de*) denkt sich wohl „was interessiert mich der Datenschutz meiner Besucher“.

an wen verpetzt mich die SZ alles? Natürlich ohne jeden Hinweis im Impressum - ganz zu schweigen davon das VORHER zu tun.

an wen verpetzt mich sz.de alles?
Hinweise versteckt weit unten im Impressum – allerdings wird selbst dort geschnüffelt und nicht vorher gefragt.

Danke Requestpolicy und ablopac, so bleiben mir die Schnüffler vom Hals.

*) andere große Verlage sind ähnlich, das ist im #Qualitätsjournalismus leider üblich.

lua & timezones by name

A bit hard to puzzle due to scarce documentation.

#!/usr/bin/env lua
local luatz = require 'luatz' -- https://github.com/daurnimator/luatz/
local tz_name = 'Europe/Berlin'
local ts_loc = luatz.time({year=2014, month=12, day=31, hour=23, min=59})
-- %z isn't supported yet: https://github.com/daurnimator/luatz/blob/523b2e0f1ece77c569f6db4c040886ed3124512e/luatz/strftime.lua#L178
local function tz_off_iso8601(tz_offset_seconds)
  local separator = '' -- 8601 %z compliant
  -- separator = ':' -- 8601 W3C compliant http://www.w3.org/TR/xmlschema-2/#dateTime-timezones
  local tz_offset_minutes = tz_offset_seconds / 60
  local sign = string.byte('+')
  if tz_offset_minutes < 0 then sign = string.byte('-') end
  return string.format('%c%02d%s%02d', sign, tz_offset_minutes / 60, separator, tz_offset_minutes % 60)
local tzi = assert(luatz.get_tz( tz_name ), 'No such timezone: \''..tz_name..'\'')
local ts_utc = tzi:utctime ( ts_loc )
local t_loc = luatz.timetable.new_from_timestamp( ts_loc )
local t_utc = luatz.timetable.new_from_timestamp( ts_utc )
print( t_loc:strftime('%F %T'), tz_off_iso8601(tzi:find_current( ts_utc ).gmtoff), tz_name )
print( t_utc:strftime('%F %T'), tz_off_iso8601(0), 'UTC' )

Why PHP is utterly broken

tl;dr: neither does DATE_RFC1123 produce a rfc1123-date, nor does DATE_RFC850rfc850-date. What sense does that make?

This example may look scrupulous but seems typical.

Mind the mandatory word ‚GMT‚ at the end of rfc1123-date. While DATE_RFC1123 renders something ending with +0000. Which is the same timezone but not the same string.

So DATE_RFC1123 is useless for HTTP headers (RFC2616). I wonder what else it should be there for.

While this isn’t an issue of PHP (the language) itself, it’s IMO typical for the actual PHP code existing. It does work somehow, despite the fact that it’s totally agnostic of the basics it claims to be based upon. So it may fail any given, unforeseeable, moment, when any of the implicitly assumed side-conditions change.

P.S.: The newer RFC7231 (HTTP-Date) and e.g. RFC 7232, Last-Modified don’t change a thing.

P.P.S.: I don’t do PHP, I just came across when patching https://github.com/mro/Shaarli a bit.

Update: Another nice one.

Validate GPX

xmllint --noout --schema http://www.topografix.com/GPX/1/1/gpx.xsd <gpx file or url>

T-Kom WLAN Hotspot auf einigen Bahnhöfen…

Nehmen wir mal kurz an, man ist T-Kom Kunde, steht im Zug auf dem Bahngleis und möchte per WLAN in’s Netz.

DB WLAN im Bahnhof: Täglich 30 Minuten kostenlos sagt:

30 Minuten gratis WLAN an über 120 Bahnhöfen

Das nennt man Service: Mit diesem innovativen und kundenorientierten Servicekonzept geben wir dem Warten eine neue Qualität.

Nutzen Sie Ihre Reisezeit noch effizienter: In über 120 Bahnhöfen bieten wir Ihnen einen Zugang zum Internet über das WLAN der Telekom. Jeden Tag sind die ersten 30 Minuten WLAN kostenlos, danach kann zu Telekom-Tarifen weiter gesurft werden.

An vielen Bahnhöfen können Sie WLAN nutzen. Mit dem Service von Telekom und der Deutschen Bahn surfen Sie problemlos mit Ihrem WLAN-fähigen Smartphone oder Tablet kabellos im Internet. Überall, wo Sie nebenstehendes blaues Piktogramm sehen, können Sie online gehen.

Die folgende Anleitung hat 8(!) Schritte.

Und so sieht das in der Praxis aus (obwohl die T-Kom noch nicht mal dem Risiko der Störerhaftung ausgesetzt ist):

Continue Reading »

Key-based FTP authentication

  1. make a strong ssh key $ ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
  2. turn to RFC 4716 $ ssh-keygen -e -f ~/.ssh/id_rsa.pub
  3. add to ~/.ssh/authorized_sftpkeys on destination host
  4. try out:
    1. $ curl -u "<username>:" --key ~/.ssh/id_rsa --pubkey ~/.ssh/id_rsa.pub -T <file to upload> sftp://<target host>/<target path>/
    2. $ lftp -u <username>,xx ... sftp://<target host>

P.S.: Hetzner FAQ zum Thema SFTP + Keys.

Ad Blocking Proxy = abloprox

as an act of digital hygiene, I installed abloprox on a raspi and added this PAC file to save some keystrokes when configuring:

function FindProxyForURL(url, host) {
  if (shExpMatch(host,"*.fritz.box")) return "DIRECT";
  if (shExpMatch(host,"*.local")) return "DIRECT";
  if (shExpMatch(host,"*.akamaistream.net")) return "DIRECT";
  if (shExpMatch(host,"*.m945.mwn.de")) return "DIRECT";
  // auto config:
  // 1. ensure there's a host 'wpad' in the current network, see
  //   - https://en.wikipedia.org/wiki/Web_Proxy_Autodiscovery_Protocol#Context
  //   - http://fritz.box/net/network_user_devices.lua
  // 2. have a http webserver running on that host
  // 3. ensure http://wpad/wpad.dat or http://wpad.fritz.box/wpad.dat contains a PAC file like in http://blog.mro.name/2014/06/ad-blocking-proxy-abloprox/
  // return "PROXY wpad:3126"; // Default return condition is the proxy on host 'wpad'.
  return "PROXY &lt;hostname_of_the_raspi&gt;:3126"; // Default return condition is the proxy.

Update: I pushed this one step further recently and use the automatic proxy-configuration itself to filter — see http://purl.mro.name/wpad.

Update: hu – it took Android until version 5.0 (lollipop) to support PAC.

Opening Xcode projects and workspaces

Inspired by ortas post about it I came up with this one-liner:

alias openx='open *.xcworkspace 2>/dev/null || open *.xcodeproj 2>/dev/null || echo "nagnagnag"'

Download WWDC2014 session pdf + mov


cd "$(dirname "$0")"
for url in $(curl https://developer.apple.com/videos/wwdc/2014/ | egrep -hoe '[^"]+.pdf[^"]+')
  dst="$PREFIX/$(basename $url ?dl=1)"
  echo "$dst"
  curl --output "$dst" --time-cond "$dst" --remote-time --silent --create-dirs --location --limit-rate "$bwlimit" --url "$url" 2&gt;/dev/null
for url in $(curl https://developer.apple.com/videos/wwdc/2014/ | egrep -hoe '[^"]+_sd[^"]+')
  dst="$PREFIX/$(basename $url ?dl=1)"
  echo "$dst"
  curl --output "$dst" --time-cond "$dst" --remote-time --silent --create-dirs --location --limit-rate "$bwlimit" --url "$url" 2&gt;/dev/null

I think downloading them this way is fair use. If you think otherwise, leave a comment below and I shall take appropriate action.

P.S.: See also the awesome wwdc transcript fulltext index.

install ruby @ OS X

OS X comes with a pretty hung ruby (1.8.7) until ‚Mavericks‘. ruby 1.8.7 had it’s planned EOL long ago, even debian/stable nowadays comes with a newer one.

So if you’re still running Mountain Lion or older, you may need to install ruby.

I chose rbenv and here’s how I did:

  • RTFM
  • install rbenv: $ brew install rbenv ruby-build
  • add : $ brew install rbenv ruby-build
  • patch .bashrc
  • do a $ rbenv rehash
  • purge all previously installed gems: $ gem list | cut -d ' ' -f 1 | xargs sudo gem uninstall
  • restart terminal
  • install a ruby of choice, and happily bundle install ever after