Drafts-Rezepte IIII: Hashes berechnen

Dann geht es fröhlich in der Reihe kleiner Skripte für Drafts und Pythonista weiter. Da ich hin und wieder mal Hashes als Prüfsummen benötige, hatte ich immer eigene Apps dafür auf dem iPhone. Da diese allerdings für ihren eigentlichen Zweck zu groß waren – sie waren allesamt auch noch hässlich -, habe ich sie nun durch folgendes Skript ersetzt. Das läuft bei mir ganz ordentlich.

Hierzu brauche ich wieder einen Action in Drafts, die in diesem Fall auf das Skript hasher in Pythonista zugreifen soll. Das sieht so aus:

pythonista://hasher?action=run&argv=[[draft]]

Import-Link

Etwas umfangreicher, daher auch erklärungsbedürftiger ist das Skript in Python. Dieses habe ich mal im Grunde angelegt, dass es wie ein Programm für die Shell genutzt werden kann.

# -*- coding: utf-8 -*-
import argparse
import clipboard
import hashlib
from sys import argv
import webbrowser

def hash_data(hashstring, hashfunction, url):
    '''Get the hash of given string.'''
    # Determine if a method for hashfunction
    # exists in hashlib. If no attribute/method is
    # found, default to sha1.   
    if hasattr(hashlib, hashfunction):
      hash_method = getattr(hashlib, hashfunction)
    else:
    	hash_method = hashlib.sha1

    # Put hash to clipboard, if hashstring exists.
    if hashstring:
    	clipboard.set(hash_method(hashstring).hexdigest())
    else:
        raise ValueError

    # Pythonista doesn't support x-callback.
    # So this is a pragmatic approach to calling
    # another app after hashing the string.
    webbrowser.open(url)

def parse_input(data):
    '''Parse input from Drafts command-line-like.'''
    parser = argparse.ArgumentParser(description='input a string to hash.')

    # Expects strings to hash.
    parser.add_argument('inputstring',
                        metavar='STRING',
                        nargs='*',
                        help='the string to hash')

    # Set the hash function.
    parser.add_argument('-hs', '--hs', '-hash', '--hash',
                        metavar='HASH-NAME',
                        default='sha1',
                        dest='hash',
                        help='the hash function of hashlib to use. defaults to sha1')

    # Intended to set a callback-like action.
    # Use to open a specific app via url scheme, if necessary. Otherwise will open Drafts.
    parser.add_argument('-u', '--u', '-url', '--url',
                        metavar='URL',
                        default='drafts://',
                        dest='url',
                        help='url scheme to call after hashing. use to call an app.')

    args = parser.parse_args(data)
    hash_data(' '.join(args.inputstring), args.hash, args.url)

if __name__ == '__main__':
    parse_input(argv[1].split(' '))

Gist

Ich muss also etwas erklären, was das Skript macht. Es kann drei Sorten von Input verarbeiten:

-hs (–hs, -hash, –hash) HASH_BEZEICHNUNG: Dieser Befehl ist optional und gibt die zu verwendenden Hashfunktion* an. Ist die Bezeichnung unbekannt oder falsch, wird der Standardwert ’sha1′ angenommen.

-u (–u, -url, –url) URL_SCHEMA: Dieser Befehl ist optional und gibt das URL-Schema einer aufzurufenden Anwendung an. Standardmäßig ist ‚drafts://‘ vorgegeben.

inputstring *STRING: Alle übrigen Übergabewerte werden zum Inputstring hinzugefügt, der gehasht wird.

Es lässt sich doch besser mit einigen Beispielen erklären. Nehmen wir mal folgenden Eingaben in Drafts an, wobei jede Zeile einer Eingabe entspricht:

Test

Test -s md5

Test -u tweetbot://

Test und noch mehr Test -s sha512

Die erste Eingabe würde den SHA1-Hash von ‚Test‘ berechnen, die zweite würde denselben String als MD5-Hash berechnen. Beide Eingaben führen dazu, dass nach der Berechnung in Pythonista wieder Drafts aufgerufen wird. Die dritte Eingabe berechnet den Standard, also SHA1, von ‚Test, kehrt aber nicht nach Drafts zurück, sondern öffnet Tweetbot (sofern es installiert wurde). Die letzte Eingabe nimmt ‚Test und noch mehr Test‘ und berechnet den SHA512-Hashwert für die Zeichenfolge.

* Laut der Dokumentation für Python 2.7, das von Pythonista genutzt wird, werden folgende Hashfunktionen unterstützt:

This module implements a common interface to many different secure hash and message digest algorithms. Included are the FIPS secure hash algorithms SHA1, SHA224, SHA256, SHA384, and SHA512 (defined in FIPS 180-2) as well as RSA’s MD5 algorithm (defined in Internet RFC 1321).

Spellwood: Hogwords oder so was

Ich lobe mir ein kleines Spiel mit Wörtern, also nicht nur Wortspiele, sondern auch Spiele mit und um Wörter. Aber ich teile die Welt in eine vor und eine nach Letterpress, das für mich noch immer die absolute Referenz ist.

Spellwood würde aber auch in einer Welt, bevor es Letterpress gab, nicht wirklich überzeugen. Es ist ein fader Abklatsch von Scrabble, dessen biederer Charme zwar ab und zu mal zu erkennen ist. Zum Zeitvertreib taugt Spellwood für mich aber nicht, dazu ist die etwas aufgebohrte Variante des Klassikers nicht innovativ genug. Eine fade Hintergrundgeschichte um Worte als Zauber taugt nicht zu einem ordentlichen Spiel, schon gar nicht als Rechtfertigung für belangloses Gameplay. Da klicke ich mir ein bestenfalls zweisilbiges Wort zusammen, wie aufregend. Zauberspruchrollen, mit denen Wort- oder Buchstabenwerte vervielfacht werden sind nicht gerade aufregend.

Dabei steckt doch eigentlich unter all der Eintönigkeit eine gute Idee, Gegner mit Wortwerten in die Knie zu zwingen. So richtig Fahrt nimmt aber kein "Kampf" auf. Da eiern dann zwei Spielerinnen oder Spieler durch einfache Wortwechsel, bis einer mal einen vorteilhaften Buchstaben zog. Gerade gegen die erstaunlich nachdenklichen, also langsamen Computergegner kommen in mir reizvollere Gedanken auf. Ich könnte statt Spellwood zu spielen auch Geschirr spülen. Oder sonst etwas Sinnvolleres mit meinem Leben anfangen. Aber das so mit ihnen umgegangen wird wie in Spellwood, das haben Wörter nicht verdient.

Drafts-Rezepte III: hAppy

Ein kleines Häppchen zwischendurch für den meines Erachtens grundsätzlich sympathischsten Client für ADN, den ich auf iOS finden konnte. hAppy* ist eine Grinsebacke. Es unterstützt auch einige Aktionen über das URL-Schema. Nicht alles lässt sich hier praktisch umsetzen. Sinnvoll sind aus meiner Sicht diese Actions, um sie aus Drafts zu starten.

Neuen Post erstellen

happy://create?text=[[draft]]

Link-Import

Post anzeigen
Eigentlich eine schöne Sache, allerdings müssen wir für die Posts ihre numerische ID angeben.

happy://post?postId=[[draft]]

Link-Import

Profil anzeigen
Auch hier ist die ID ein numerischer Wert, nicht aber der öffentlich bekannte Name.

happy://profile?userId=[[draft]]

Link-Import

Die folgenden Actions sind aus Drafts heraus etwas unpraktisch, weil sie eigentlich nur Ansichten in hAppy öffnen. Außerdem wird die Angelegenheit dadurch erschwert, dass Drafts keine leeren Drafts als Ausgangspunkt für Actions erlaubt. Das ist nachvollziehbar, aber führt dazu, dass mindestens ein Zeichen gegeben werden muss, damit eine der folgenden Actions zündet.

Stream öffnen

happy://stream

Link-Import

Mentions öffnen

happy://mentions

Link-Import

Direktnachrichten öffnen

happy://messages

Link-Import

Explore öffnen

happy://explore

Link-Import

Mit den nächsten kleinen Rezepten wird es noch spannender, weil ich mich daran machen werde, deutlich mehr Funktionalität einzubinden.

* Für den Theme-Editor per IAP lohnt sich hAppy schon. Das ist unter den ADN-Clients extrem innovativ.

Serien-Bildungslücken: Buffy

Ich werde nicht mehr um die Serie herumkommen. Auch wenn ich mich erfolgreich widersetzt habe, Buffy ist dann doch zu groß, um die Serie nur in Ausschnitten gesehen zu haben. Allerdings kann ich nach zwei Folgen schon sagen, dass ich zumindest in der ersten Staffel für mein langes Warten bestraft wurde.

Die erste Strafe für mich ist die ganz und gar altbackene Inszenierung der Serie. 1997 ist gar nicht so lange her, doch die Serie wirkt optisch auf mich nach einer größeren Zeitreise, die mehr als etwas über fünfzehn Jahre in die Vergangenheit geht. Ich will nicht voreilig sein, denn ich habe bislang nur die einleitende Doppelfolge aktuell gesehen und einige Erinnerungen an einige spätere Folgen. Buffy hat aber eindeutig ein sehr langsames Erzähltempo, das mich sehr hart getroffen hat. Auch knirscht es an allen Ecken und Enden hölzern, die Regie hat bei Fernsehserien in den letzten Jahren eine Qualität gewonnen, die nicht mit den Neunzigern zu vergleichen ist. Um es mit Buffy zu sagen:

Buffy

Deal with that outfit for a moment.

Giles

It’s dated?

Buffy

It’s carbon-dated.

Dieses Zitat zeigt eine große Qualität, die so leicht nicht veraltet: Die Dialoge sprühen vor Witz. Das lässt mich allen Staub, der auf der Serie liegt, locker vergessen. Ich will endlich mitreden können, also gebe ich mir die volle Ladung Buffy.

Badland: Manchmal öd, nie leer

Durch die Ödnis taumelt ein keiner Scherenschnitt, er weicht Hindernissen aus und vermehrt sich manchmal sogar auf wundersame Weise. Das One-Touch-Gameplay von Badland ist kurzweilig, wenn das kleine Wesen auf meinen Fingerzeig hin durch die Luft fliegt.

Das Spiel verlangt mehr als nur bloße Reaktion wie einige Genrekollegen, auch Geschicklichkeit ist gefragt. Besonders aber auch ein Bauchgefühl dafür, welche Widrigkeiten auf dem Weg zum Ziel aus der Umgebung entstehen könnten. Dabei ist das Design herausragend, denn mit subtilen Hinweisen gibt es einen Ausblick auf Dinge, die geschehen mögen. Leises Bröckeln kündigt abstürzendes Geröll an, und wenig später muss ich schnell ausweichen, da mir die Decke entgegenkommt. Atmosphärisch ist Badland fantastisch, spielerisch war mir zwischen einigen großen Augenblicken etwas mehr Einerlei, als ich es brauchte.

Drafts-Rezepte II: Kurzlinks mit is.gd

Es ist ja durchaus sinnvoll, Links ab und an mal zu verkürzen, jedoch dafür extra eine App zu installieren erscheint mir etwas übertrieben. Das lässt sich zwar auch im Browser erledigen, artet aber in eine Klickorgie aus, auf die ich auch keine Lust habe. Mit Pythonista und Drafts ist das im Handumdrehen erledigt.

Dieses kleine Script habe ich als isgd.py im Dokumentenverzeichnis von Pythonista angelegt:

import clipboard
from console import alert
from sys import argv, exit
from urllib import urlopen
import webbrowser

def error_dialog(title, message):
	'''A diaolog box for error messages.'''
	try:
		alert(title, message)
	except KeyboardInterrupt:
		pass
	webbrowser.open('drafts://')
	exit(message)

def shorten_with_isgd(long_url):
	'''basic link-shortening via is.gd.'''
	api_url_base = 'http://is.gd/create.php?format=simple&url='
	try:
		response = urlopen(api_url_base + long_url)
	except IOError:
		error_dialog('Connection Error', 'Unable to perform request.')
	if response.getcode() == 200:
		short_link = response.read()
		clipboard.set(short_link)
	else:
		error_dialog('Error', 'Status code: {0} - Message: {1}'.format(response.getcode(), response.read()))
	webbrowser.open('drafts://')

if __name__ == '__main__':
	shorten_with_isgd(argv[1])

Gist

Es ist alles recht simpel gehalten, die Fehler werden nur rudimentär behandelt, aber es sollte ganz gut aufgehen. is.gd habe ich für den Anfang als Dienst gewählt, weil dort nicht großartig Registrierungen notwendig sind, um mit der API Links zu kürzen.

In Drafts muss dann nur die folgende Action angelegt werden, um das Script auszuführen.

pythonista://isgd?action=run&argv=[[draft]]

Import

Die Handhabung ist nun denkbar einfach: In Drafts in einer neuen Notiz die lange URL eingeben, danach die Action auslösen. Es wird sich Pythonista öffnen. Sofern keine Fehlermeldung aufpoppt, ist der Kurzlink in die Zwischenablage kopiert worden. Auf jeden Fall wird aber wieder Drafts geöffnet.

Linkgebliebenes 26

Das Video mit den Kapuzineräffchen, das entrüstet die Belohnung ablehnt, wenn ein anderes Äffchen bessere Belohnungen erhält, hatte ich schon. Das ist noch kein Beweis für Moral bei nicht-menschlichen Tieren, aber ein interessanter Hintergrund für Hypothesenbildung.

Ein trauriger Tag, wenn eine Wimbledon-Siegerin nicht als Normschönheit daherkommt und dafür attackiert wird. Ihre Reaktion ist aber ein Muster für Gleichgültigkeit. Marion Bartoli hat Wimbledon gewonnen, was haben die Trolle geleistet?

Was für ein Text darüber, was es heißt, Unterdrückung in einem patriarchalen, fundamentalistischen System zu erfahren und ihr zu entkommen.

Ein Lehrstück über Klassismus gefällig? Sag mir deinen Vornamen ubd ich sage dir, ob du mit meinem Kind Umgang haben darfst.

Zur Situation von Edward Snowdwb, Prism und Tempora ist viel geschrieben, aber kaum Schlüsse gezogen. Ansätze gibt es hier:

Verschlüsselung wird allerorten empfohlen. Eine Anleitung gibt es hier:

Andere sehen es aber als ein Zeichen des Versagens, dass noch keine endanwendertaugliche Lösung gefunden wurde.

Und Lösungen, die es gibt, haben anscheinend erhebliche Sicherheitsrisiken.

Hier mal eine Streitschrift, okay, ein Streitartikel zum Elitarismus in der Open-Source-Gemeinschaft.

Geklaute Apps im App Store gobt es nicht? Gibt es wohl.

Ich verstehe dank des folgenden Textes nun einerseits besser, warum das Cochlea-Implantat als ‚technischer Genozid‘ angesehen wird, aber auch, warum diese Wortwahl deutlich überzogen ist.

Wie kann ein Mann ein wenig mehr über den Sexismus unter Spielern und Spielerinnen erfahren? Einfach mal den Account der Freundin nehmen etwa.

Und was für eines

Natürlich fühle ich mich gefährdet, wenn ein Fahrradfahrer mit für mich gefühlt irrem Tempo knapp an mir vorbeifährt. Dabei aus meinem Rücken kommt. Und natürlich schnauze ich solche Fahrerinnen und Fahrer an, sollten sie, wie heute geschehen, an der Eisdiele etwa fünfundsiebzig Meter später ihre Erfrischungen holen wollen.

Und es ist keine Ausrede, dass es sich nicht um eine Fußgängerzone handelte, in der sein Rasen stattfand. Stimmt, aber selbst auf einer ganz normalen Straße ist er zur Rücksichtnahme angehalten. Und selbst wenn es keine Bestimmung gäbe, gibt es kein Recht, mich so zu gefährden. Ich brauche nur einen Schritt nach rechts machen, schon fährt er mich, eigentlich uns, über den Haufen. Aber wir befanden uns in einem Verkehrsberuhigten Bereich.

In solch einer Zone gilt Schrittgeschwindigkeit. Schrittgeschwindigkeit, die der Fahrradfahrer nie im Leben gefahren ist. Denn je nach Meinung liegt sie bei drei bis maximal zehn Kilometern in der Stunde. Wenn ich konservativ schätze, war der Fahrer aufgrund der Länge der Hausfassade, die er nach mir passiert hatte, kurze Zeit später schon weit weg. Ich nehme eigentlich an, dass er nach einer Sekunde etwa fünf Meter von mir entfernt war. Ich nehme sogar mehr an, aber ich bleibe mal konservativ. Er war also mit mindestens

5m * 3600s = 18000m/h = 18km/h

immer noch schnell unterwegs. Gefährlich schnell für Fußgänger, die nicht wissen, was kommt. Es ist definitiv keine Schrittgeschwindigkeit mehr. Sein Abstand zu mir kann ebenfalls nicht sehr groß gewesen, wenn ich den Fahrtwind durch das Hemd spürte. Es wird also nicht besser.

Warum lege ich das alles so aus? Weil ich mich versichern muss, wie gerechtfertigt es war, den Fahrradfahrer nach seinem Verweis "Ich darf fahren wie ich will. Ist keine Fußgängerzone." ein Arschloch genannt zu haben. Was für ein Arschloch.

Sherlock: Geskriptete Gottesbeweise

Wunder geschehen immer wieder. Im Fernsehen wie in Filmen treten sie in einer Häufigkeit auf, die daran zweifeln lässt, etwas Besonderes in ihnen sehen zu müssen. Wunder gibt es dabei gerade in Medien so oft, weil sie eben keine Ereignisse sind, die in der Wirklichkeit gebunden sind; das Wunder an sich ist eine Erzählung. Jedes Wunder wird mittels des Erzählens erst zu dem, was es ist. Jedes Wunder zerbricht bei näherer Betrachtung an der Realität. Warum funktionieren Gottesbeweise etwa in religiösen Schriften so prächtig? Warum nehmen wir die göttliche Rettung in Filmen als gegeben an? Weil sie fiktive Stoffe sind, sie sind zu zerbrechlich für die harte Welt da draußen. Also werden sie in die luftige Welt der Geschichten gebettet.

Hinter das fingierte Zustandekommen wundersamer Ereignisse in narrativen Medien blicken die meisten Menschen kraft ihrer Vertrautheit damit mittlerweile recht ordentlich durch die einfachsten dieser Tricks. Andere, nicht weniger wundersame Erzähltechniken werden dennoch hingenommen. So etwa der des Genius. Das meisterliche Genie, das alle anderen Menschen um sich herum in den Schatten stellt. Doch wie bei aller Magie des Storytellings ist auch das erzählte Genie gebunden an den sehr weltlichen – und in der Regel begrenzten – Verstand derer, die das Genie erdenken. Das Genie wird meist mit einem einfachen wie verachtenswerten narrativen Taschenspielertrick in gottgleichen Status versetzt: Drehbuchautorinnen und -autoren schaffen nicht geniale Figuren, sondern solche, denen ein unsichtbares Kraftfeld mitgegeben wird, das sie in die Lage versetzt, die Intelligenz aller umgebenden Menschen drastisch zu senken. Das relative Genie, nicht wirkliche Denker, das schaffen die meisten Geschichten nur. Ähnlich ist es bei der BBC-Serie Sherlock.

Die messerscharfe deduktive Methode, der klare Verstand und die ganze Apotheose des Kriminalisten. Alles Fassade. Nicht einmal sehr geschickt versteckt sich hinter hanebüchen konstruierten Fällen in Sherlock eine schwülstige Arroganz, die Zuschauerinnen und Zuschauer zu simplen Konsumäffchen degradiert. Zu oft bricht hervor, dass Steven Moffat den ganzen fatalen Zirkelschluss beschreitet: Er ergötzt sich daran, Sherlock geschrieben zu haben, der offenkundig ein Genie ist. Ergo muss Moffat selbst ein Genie sein. Bewaffnet mit dieser Erkenntnis rennt Moffat dann zusammen mit den anderen am Drehbuch beteiligten Kollegen in jene Selbstgefälligkeit, die gerade einen Sherlock Holmes ihrer Einfalt wegen aufbrausen lassen würde. Sie scheren sich schlicht nicht um Kongruenz, Plausibilität oder Logik.

Über Logik lässt sich, das macht jedes erzählende Medium so unaufrichtig, hinwegschreiben. So auch hier. Jedes Argument, das dem Meister nicht gefällt, fort damit. Meist ist nicht einmal der Erwähnung wert, warum. Ist denn nicht so offensichtlich, wie falsch alle sind, wenn sie Holmes widersprechen? Hat eine Serie dann noch zwei so hervorragende Darsteller wie Benedict Cumberbatch und Martin Freeman ist der Räson kaum noch zu helfen. Ein Cumberbatch redet sich in Rage und nicht zufällig in solch einem Stakkato über die dem Genie zugeflogene deduktive Leistung hinweg, dass bei so selbstbewusst vorgetragener Knobelei kein Widerspruch mehr erlaubt ist. Mit großen Augen gibt Freeman die Bewunderung für den Meister vor. Schon ist wieder ein kritischer Punkt im Flickenteppich der Logik gestopft.

Das Ärgerliche an einer Serie wie Sherlock ist, wie sehr sie sich die Herablassungen des vermeintlichen Genies gegenüber dem Publikum zu eigen macht. Dabei unterstellt sie dem Protagonisten eine erkenntnistheoretische Unfehlbarkeit, die einem wahrhaft gebildeten Menschen zuwider sein müsste. Genau das vergällt zumindest mir den Spaß an einer ansonsten beneidenswerten Inszenierung, deren Modernität deutsche Kriminalgeschichten besonders leicht in Grund und Boden stampft. Es sind manipulative, dennoch unterhaltsame Dialoge und Vorgänge, die da abgefeuert werden. Sherlock bleibt im Geiste aber ein voraufgeklärtes Kriminalstück, das intellektuell nur leidlich besser ist als jedes CSI.

Drafts-Rezepte I: Yubnub

Mit Drafts ist die Automatisierung auf iOS sehr viel einfacher geworden. Ich habe mir vorgenommen, in der nächsten Zeit mal ein paar nützliche Rezepte zu posten, die den Alltag erleichtern können. Spätestens wenn Pythonista ins Spiel kommt, wird es etwas komplexer. Den Anfang will ich aber mit einem vergleichsweise einfachen Fall machen, der mir das Leben aber ungemein erleichtert.

Ich habe noch nie einen Hehl aus meiner Begeisterung für Yubnub* gemacht. Auf dem Desktop wandele ich alle Browser-Adresszeilen in eine Art Kommandozeile für’s Web ab. Da das Web zu durchsuchen unter iOS eine Qual ist, hätte ich gerne Yubnub auch dort. Mit Drafts ist das sehr einfach. Ich lege ein neues Draft an, beispielsweise mit einem Yubnub-typischen Suchkürzel und den Suchbegriffen wie etwa g iPhone Bumper. In diesem Fall würde Yubnub die Anfrage nach iPhone Bumper an Google weiterleiten. Dann löse ich zum Beispiel folgende URL-Action auf den Draft aus:

Safari

http://yubnub.org/parser/parse?command=[[draft]]

Import-Link

Aber nicht alle von uns wollen im schnöden Safari durchs Web. Auch da lässt sich was machen, solange ein installierter Browser sich mit einem URL-Schema bei iOS angemeldet hat.

Chrome

googlechrome://yubnub.org/parser/parse?command=[[draft]]

Import-Link

Dolphin

dolphin://http://yubnub.org/parser/parse?command=[[draft]]

Import-Link

Das sind nur Beispiele für eine Vielzahl von iOS-Browsern, die das Schema unterstützen und damit auch nun mit Yubnub mehr Komfort ins mobile Surfen bringen. Ein Liste mit weiteren Browsern findet sich bei HandleOpenURL. Das Schema muss in der Regel nur um die Browserbezeichnung ergänzt werden.

In den kommenden Tagen werden hier noch mehr Rezepte für URL-Actions aufschlagen. Das war bislang nur der Anfang. Es geht noch sehr viel mehr.

* Yubnub als zwischengeschalteter Dienst kann natürlich alle Suchanfragen protokollieren – zusätzlich zu den eigentlichen Zielseiten. Die Abwägung von Nutzen und Datenschutzaspekten kann ich niemandem abnehmen.