Drafts-Rezepte V: Wetterdaten mit OpenWeatherMap

Ich habe mir wieder ein kleines Skript (current_weather.py) gebastelt, mit dem ich für einen beliebigen Ort die aktuelle Temperatur und Luftfeuchtigkeit erhalte. Als Datenquelle dient die API von OpenWeatherMap, abgerufen wird es wieder über Pythonista. Das Skript sieht folgendermaßen aus:

# -*- coding: utf-8 -*-
import clipboard
from console import alert
from json import loads
from sys import argv, exit
from urllib import urlopen, quote
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 filter_data(data):
	'''create output string from response'''
	weather = loads(data)
	temperature = weather['main']['temp']
	humidity = weather['main']['humidity']
	output = 'Temperatur: {0} Celsius\nLuftfeuchtigkeit: {1}%'.format(temperature, humidity)
	return output

def get_current_weather_in(data):
	'''get current weather data'''
	api_url_base = 'http://api.openweathermap.org/data/2.5/weather?q={0}&units=metric&lang=de'
	try:
		response = urlopen(api_url_base.format(data))
	except IOError:
		error_dialog('Connection Error', 'Unable to perform request.')
	if response.getcode() == 200:
		weather_data = filter_data(response.read())
		webbrowser.open('drafts://x-callback-url/create?text={0}'.format(quote(weather_data)))
	else:
		error_dialog('Error', 'Status code: {0} - Message: {1}'.format(response.getcode(), response.read()))

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

Gist

Das Skript kann dann über die Drafts-Action ausgeführt werden:

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

Import-Link

Im Grunde war das auch schon alles. In Drafts muss dann in einer neuen Notiz nur der Name der Stadt eingegeben werden. Gegebenenfalls sollte sicherheitshalber noch das Land hinzugefügt werden. So würde Hamburg, de mir die aktuelle Temperatur und Luftfeuchtigkeit für Hamburg geben.

Drafts: Ich automatisiere mich in Grund und Boden

Seit gestern bastele ich mit Drafts für iOS herum, das nicht mit Draft für Android zu verwechseln ist. Drafts ist weit mehr als ein Texteditor, was mir bisher aber nicht aufgegangen ist. Ich hatte übersehen, dass Drafts zu einer Schaltzentrale für Texte und die automatisierte Verarbeitung wird. Drafts unterstützt nicht nur URI Schemes, eigentlich basiert die ganze App darauf, sich über das Schema einen Workflow zu erstellen, bei dem verschiedene Apps, sofern sie das Schema unterstützen, miteinander verzahnt werden.

Eine simple Anwendung von Drafts‘ Fähigkeiten ist es beispielsweise, einen Text zu erstellen, der per selbstgeschriebener URL-Schema-Aktion bei mehreren Microblogging-Diensten gleichzeitig gepostet wird. Wir bauen uns also einen einen Kettenblitz für Twitter und app.net, wobei wir im URL-Schema einen Callback in einen Callback bauen:

drafts://x-callback-url/create?text=[[draft]]&action={{Tweet: DoctorProk}}&afterSuccess=Delete&x-success={{drafts://x-callback-url/create?text=[[draft]]&afterSuccess=Delete&action=Post%20to%20App.net}}

Damit schlage ich zwei Fliegen mit einer Drafts-Klappe. Es ist alles noch einwenig holprig in der Kette, tut seinen Dienst aber schon mehr als ordentlich.

Je umfangreicher die Callback-Kette wird, desto unübersichtlicher wird es natürlich. Mit der Zeit entstehen so URL-Schlangen, die an die abstrakte Kunst erinnern, die von BWLern in Excel fabriziert werden, weil sie nicht auf VBA umschwenken wollen. Diese Ungetüme kann kein Mensch mehr warten. Damit hat Drafts also doch eine natürliche Grenze bei den Aktionen, sobald es sich nicht mehr realistisch überblicken und warten lässt. Nicht ganz.

Es gibt noch ein weiteres Workflow-Genie auf iOS. Pythonista ist eine Perle. Schöner, praktischer und schneller geht Python auf Mobilgeräten nicht. Und manche übersehen schnell Pythonista ausgefeilte URL-Schema-Schnittstelle. Jedes Skript in Pythonista ist von externen Apps ausgührbar, sogar mit Argumenten. So können komplexere Aufgaben leicht und locker an Pythonista ausgelagert werden. Ist das Skript fertig, ruft es einfach Drafts auf, übergibt die Bearbeitung und es kann wieder weitergehen.

Mit Drafts wir schon vieles einfacher, zusammen mit Pythonista wird aus Textverarbeitung auf iOS ganz schnell elaboriertes Anrühren von Zaubertränke mit komplizierten Ingredenzien.

Pythonista: Längere Leine unter iOS

Die Botschaft in kurz lautet: Pythonista ist ein in Erfüllung gegangener Traum. Aber der Reihe nach, ich greife mir selbst voraus. Der Traum drehte sich darum, auf iOS-Geräten eine lauffähige Python-Umgebung zu haben. Dieser Traum war bescheiden, ging es doch nur darum, mal eben ein paar Zeilen testen zu können. Einfach mal eine Eingebung in Python skizzieren, damit sie später ausgearbeitet werden kann, das wäre schön genug. Es gibt da auch einige Möglichkeiten wie etwa Python for iOS, aus diversen Gründen fühlten sich diese nie auch nur ansatzweise rund an. Es klemmte an vielen Ecken.

Pythons großes Plus, neben vielen anderen, die um den Titel der größten Stärke konkurrieren, ist die konzeptionelle Schlichtheit der Sprache. Alles in Python ist auf Effizienz getrimmt, wobei die Syntax dabei im Vorbeigehen schönen Code produziert. Python ist ebenso elegant wie schlicht, keine der Apps für iOS hat diese Eigenschaften Pythons bisher zur Geltung gebracht. Manche nennen es das Zen von Python, was begrifflich mindestens eine Etage oberhalb dessen ist, was meine absolute Schmerzgrenze ist; ich teile also den Begriff nicht, weiß aber genau, was gemeint ist. Wie auch immer ich es nennen würde, Pythonista hat es.

Wo anfangen bei aller Begeisterung? Pythonistas Code-Editor ist so bequem wie es eben geht auf einem mobilen Gerät mit virtueller Tastatur. Der Editor verfügt über Syntax-Highlighting, was ich mindestens erwarte, die Themes sind dann schon eher schönes Beiwerk. Doch die Code-Vervollständigung ist eine Erleichterung, auf die zu hoffen ich nicht gewagt hätte. Über der erweiterten Tastaturleiste, in der syntaxrelevante Zeichen schneller zu erreichen sind, blitzen bei Bedarf einfach die Schlüsselwörter und Modulnamen auf. Antippen, weiter coden. Auf dem Desktop erwarte ich das von der IDE meiner Wahl, in Pythonista beeindruckt es mich wegen der Hilfe, die es ist, aber auch wegen der trotz aller Funktionalität immer aufgeräumten Darstellung. Es wirkt einfach nicht überfrachtet, nichts fehlt und alles hat seinen Platz.

Und so bedienerfreundlich geht es weiter, da bringt Pythonista nicht nur die ausführliche Sprachdokumentation mit, sondern wertet auch diese weiter auf. Beispielsweise können Code-Snippets aus der Dokumentation heraus sofort im Editor geöffnet, was mir Trial-and-error-Lerner ordentlich Unterstützung bietet. Es ist fast so, als komme Pythonista immer den einen Schritt extra entgegen, der mich wohlfühlen lässt. Daher verwundert es kaum noch, muss aber umso deutlicher unterstrichen werden, dass Pythonista nicht nur die umfassende Sammlung der Module aus der Standardbibliothek mitliefert, sondern auch noch nützliche Module, die sich als Quasi-Standards etabliert haben. Requests, BeautifulSoup, feedparser, PIL oder Dropbox sind im alltäglichen Gebrauch unverzichtbar geworden, daher werden sie in Pythonista unterstützt. Aber heißt das jetzt wirklich das, was sich einige jetzt darunter schon vorstellen können?

Genau das heißt es. Pythonista ist kein einfacher Editor mit eingebautem Prompt, der unter iOS in seiner eigenen Kapsel agiert. Die Abschottung von der Außenwelt reißt Pythonista nieder. Natürlich können damit HTTP-Requests an Web-APIs geschickt oder eben grundsätzliche Bildverarbeitungsschritte automatisiert werden. Spätestens an dieser Stelle war ich von Pythonista und seinen Möglichkeiten gebannt. Doch da hört es noch nicht auf. Es gibt aber noch eine dritte Sammlung von Modulen, die Pythonista vollends zum unverzichtbaren Scripting-Tool auf iOS macht. In eigens für die App geschriebenen Modulen wird die Interaktion mit dem Betriebssystem – so weit es Apple erlaubt – möglich. Die Zwischenablage ist nun per Script zugänglich, Töne können ausgegeben werden und auch einige der bekannten Systemdialoge stehen bereit. Aber das ist noch immer nicht das Ende, denn Pythonista stellt noch einen Canvas zur Verfügung, auf dem eigene UI möglich wird, mitsamt der nötigen Touchkontrolle.

Ich fasse zusammen: Erstklassiger Editor, hervorragende Dokumentation, Zusatz-Module, das alles bietet Pythonista und setzt trotzdem noch einen drauf. Denn der Editor selbst ist erweiterbar, schließlich bringt Pythonista noch ein Modul für den Editor selbst mit, damit kann die Arbeit im noch an eigene Bedürfnisse und Gewohnheiten angepasst werden. In den Einstellungen werden die Scripts dann als Erweiterung des Editors eingebettet, nichts leichter als das. Pythonista gibt damit ein Stück Freiheit unter iOS zurück, die ich oft schmerzlich vermisst habe.

Dabei ist noch nicht alles perfekt, aber meist liegt das an Beschränkungen durch Apple. Zwar könnte ich prinzipiell damit Spiele und Apps erstellen, oder immerhin Prototypen davon, aber die Interaktion zwischen den Apps ist, von Apple gewollt, dürftig. Die kurze Leine, an die Apple uns bietet, nutzt Pythonista immerhin voll aus, also auch das URL-Schema für rudimentären Datenaustausch zwischen einzelnen Apps. Deshalb kann ich mir nun immerhin Scripte schreiben, die meine tägliche Arbeit auf dem iPhone oder iPad erleichtern. Aber nicht nur mir geht das so, auch andere haben die Möglichkeiten erkannt. Und im Forum schlagen schon massenweise grandiose Scripte auf, die noch viel mehr versprechen.Da liegen schon erste Ansätze für Datei-Manager, Spiele, Heimautomatisierung über WLAN mit dem Raspberry Pi sowie Editorerweiterungen. Auf einmal kann ich dank Pythonista auf iOS von ganz anderen Dingen träumen, die Freiheit ist wieder da.

Codecademy hat Web-API-Kurse

Mir ist jetzt erst aufgefallen, dass Codecademy nicht CodeAcademy heißt. Ist eigentlich auch egal, dort gibt es gute Grundlagenkurse in gängigen Skript-/Programmiersprachen und Webtechniken. Seit Neuestem werden dort auch kostenlose Kurse zu APIs angeboten. Das trifft sich hervorragend, denn bei meinen bislang kurzen Auseinandersetzungen, habe ich noch nicht wirklich Grundsätzliches gelernt.

Die Übungen sprechen diverse APIs an, auch wenn derzeit nicht die geläufigsten Namen der Social-Media-Welt dabei sind. Das macht nicht wirklich etwas, da die Grundprinzipien bei den gängigen RESTful-APIs vergleichbar sind.

Im Moment sind Kurse für drei Sprachen vorhanden. Für JavaScript, Ruby oder Python gibt es jeweils einen kurzen Grundkurs zu den Basics von APIs, also wozu diese Schnittstellen dienen oder wie das mit den HTTP-Request ist. Darauf folgen die eigentlichen inhaltlichen Online-Kurse, in denen ein geführter Gang durch Code in der jeweiligen Sprache beginnt.

Da ich mich derzeit auf Python eingeschossen habe, habe ich dort angefangen. Der simpelste Kurs ist mit Sicherheit der, in dem nur ein wenig Katzencontent als Platzhalter geladen wird. Da ist noch recht wenig Arbeit zu leisten. Etwas umfassender wird es bei der API von bitly, doch der für mich schwerste Brocken waren die Kurse zu den APIs von NPR.

Hierzulande wird dieses spendenfinanzierte, öffentliche Radio der USA weniger bekannt sein. Die Unterschiede sind gewaltig, doch hat der Sender selbst einen Bildungsanspruch, der mit denen der öffentlich-rechtlichen in Deutschland vergleichbar ist. Daher bietet NPR auch viele verschiedene Formate, Texte, Radiosendungen, Mitschriften und Videos frei zugänglich an.

Dementsprechend ist die Story-API enorm groß. NPR wirft mit riesigen Datenobjekten um sich. Glücklicherweise sind die Übungen in Python gut strukturiert, sodass es leicht fällt, recht zügig die erste Basis-URL mit Query-Elementen versehen zu haben, die mit JSON-, XML- oder andern Objekten gewürdigt werden. Danach geht es darum, aus diesen Objekten die relevanten Informationen auszulesen.

Diese Kurse zu NPR-APIs haben den Vorteil, dass sie auf zusätzliche Bibliotheken verzichten. Zwar ist es dadurch weniger komfortabel, doch der Lerneffekt ist größer, solange die Querys und Objekte „von Hand“ erstellt werden. Bibliotheken, die Requests vereinfachen oder beim Parsen der Datenobjekte Zeit sparen, nehmen am Anfang zu viel Last ab und würden den Blick auf die Konzepte verstellen.

So sind die Kurse zu den APIs gute, praxisbezogene Lerneinheiten für alle Einsteigerinnen und Einsteiger, die ihre Kenntnisse in den jeweiligen Sprachen auf die Probe stellen wollen. Gerade das anfangs überwältigende der NPR-Objekte macht dabei klar, wie wichtig gute Kenntnisse sind, wie diese Daten am besten zu verarbeiten sind.

Dunkle Seite der Worte: Letterpress

Okay, ich wollte es nicht in mein Review aufnehmen, muss es aber sagen. Das Spiel ist gut, bietet aber anscheinend jede Menge Gelegenheit zum Trollen und Cheaten. Auch wenn ich es nicht gerne zugebe, getreu dem Motto Gelegenheit macht Diebe bringen gerade Wortpuzzle eine schattige Seite in mir hoch. Warum gerade diese Spiele, keine Ahnung? Der Spaß an Letterpress kann schon ordentlich verdorben werden, wenn Gegner in die Trickkiste greifen.

Impliziter Chat

In Letterpress werden Worte gebildet. Zwar gibt es in dem Spiel keine direkte Form der Kommunikation zwischen Kontrahenten. Einfallsreiche Spieler und besonders Trolle können die Spielmechanik selbst für einige Übergriffe nutzen. Die Matrix der Buchstaben gibt oft was her, um dem Gegenüber einen vor den Kopf zu knallen.

Keine drei Partien hatte ich hinter mir, da lief es auf einen deutlichen Sieg hinaus. Es war absehbar, dass mein Gegner nicht mehr Land – oder Buchstabenflächen – gewinnen würde, also verstieg er sich auf einen rüden Abschied. Im vorletzten seiner Züge bildete er aus den Buchstaben FUCKING. Ich hatte noch nicht Lunte gerochen, bereitete das Spielende mit einem weitern Wort vor und fing mir dann einYOU von ihm.

Ich musste lachen. Nicht schlecht. Letztlich ist auch ungewiss, was genau damit gesagt werden sollte. Wer längere Zeit im Netz – besonders in Spielen – verbringt, nimmt so etwas hin. Man trägt es manchmal sogar als Auszeichnung. Andererseits dürfte es anderen nicht gefallen, wenn es ausarten sollte. In diesem Fall bleibt nur, Spielernamen notieren und zukünftig alle zufällig zugelosten Partien beenden.

Simpler Cheat

Der Spaß kann auch durch eine andere Methode gebrochen werden. Bei Worträtseln lässt sich leicht schummeln. Jeder dürfte schnell ein Wörterbuch zur Hand haben oder Suchmaschinen hinreichend bedienen können. So hagelt es dann schon gerne mal reichlich abstrus erscheinende Wörter. Aber ehrlich, es geht noch schlimmer.

Vorher noch eine Warnung: Wer wie in der Folge beschrieben cheatet, versaut nicht nur anderen den Spaß, sondern langfristig auch sich selbst.

Um inLetterpress in kürzester Zeit das Feld abzudecken, braucht es nicht viel:

  1. Als erstes brauchen wir eine Liste mit einem ordentlichen englischen Wortschatz. Nicht schlecht ist beispielsweise das Official 12Dicts Package. 12Dicts ist nicht schlecht, da es das 2of12inf-Wörterbuch enthält. Inklusive Flexionen verfügt es über 81536 Wörter des Englischen. Das reicht für eine ordentliche Rechtschreibkontrolle – wofür es eigentlich gedacht ist – und wird auch für einen Cheat langen.
  2. Wie machen wir den Abgleich zwischen den uns gegebenen Buchstaben aus Letterpress mit dem Wörterbuch? Reguläre Ausdrücke. Die regulären Ausrücke bieten sich eigentlich für jede Art etwas aufwändigerer Textsuche an, die aber keine linguistische Auswertung liefern soll. Die regulären Ausdrücke sind nicht leicht zugänglich, aber einfach genug. Jeder heutige Texteditor sollte eigentlich eine Regex-Suche unterstützen. Damit kann das Wörterbuch auf diejenigen Wörter reduziert werden, die möglich sind.
  3. Mit ein wenig Scripting geht sogar noch mehr. Ich habe noch nicht die Zeit gehabt, aber sollte nicht so schwer sein, ein Script zu schreiben, in das die aktuelle Matrix des Spiels und der Spielstand angegeben wird, um dann nach einem Wörterbuchabgleich das Wort zu spielen, das möglichst viele Punkte bringt. Weitere Aufgaben und Optimierungen sind hiervon auch nicht weit entfernt.

Mal sehen, ich denke nicht, dass ich mein Script einsetzen werden, sofern ich es beendet habe. Es hat mich nur in den Fingern gejuckt, ein praktisches Projekt zu haben, das selbst ich mit meinen geringen Scripting-Mitteln kurzfristig lösen kann. Den Spaß will ich mir und anderen aber nicht wirklich verderben.