Hackety hack hack

Atypisches Nutzerverhalten mit Rat und Tat.

So I wrote a bot for Mastodon and learned some things

Everything becomes hip and modern when you put the prefix “cyber” to it. And what could be more hip and modern than the wonderful world of governance and administration in Germany? You may (cynically!) think otherwise, but the German government really keeps up with the cyber. Case in point: It regularily publishes openings for dream jobs that have the word “cyber” in them. Let’s keep track of those and post them through a bot! (This wonderful idea originally comes from @didumdida).

Writing a bot for Mastodon is delightfully simple. There is a special instance that welcomes bots — botsin.space — and this is where the bot for federal cyber job offers or “Bundescyberjobangebote” in German (it’s a long word, but that’s kind of a German thing) currently lives as @bundescyberjob.

The listing of job offers from the federal government with the word “cyber” in it lives here as an RSS feed.

Reading in the RSS feed is pretty straight-forward with the feedparser Python module. Writing it to Mastodon is easy with the Python wrapper for the Mastodon API.

To keep everything clean and use the installed libraries like feedreader and Mastodon with exactly the version I needed, I used modern Python’s way to go: venv. But that gave me another problem: How can I call the Python script from cron now to make a daily post? After all, cron’s environment doesn’t really know about venv.

And another thing puzzled me about cron: I don’t want posts to be made at the exact time every day, that just looks ugly and automated. But cron doesn’t have a concept of “execute at a random time”.

To solve both problems, I don’t call the Python script directly from cron, but rather a wrapper written in bash. This thing only does two things: First, it sleeps up to twelve hours before it continues, spreading the actual posting at some time between 9am and 9pm in my time zone.

Then it just sources the venv activate script to use venv’s settings and lastly executes the Python script to post. It looks a little like this:

 
 
 
 
 
 
 
 
#!/usr/bin/env bash

# Sleep for up to 12 hours
sleep $((RANDOM % 43200))

# Run the bot
source /home/johl/bundescyberjobbot/bin/activate
python /home/johl/bundescyberjobbot/bundescyberjobbot.py

With all these pieces in place, I finally had a wonderful little bot to inform the world about cyber-related jobs. CYBER!

Diverse Fundstücke

Möglicherweise von Interesse

  • Africa” by Toto to play on eternal loop in Namib desert: ”Some Namibians love it and some say it’s probably the worst sound installation ever. I think that’s a great compliment.link
  • Wikipedia in Venezuela blockiert. Internetzensur wird stärker. link
  • Topf Secret — eine neue Verbraucherplattform von Frag den Staat zusammen mit Foodwatch. Ganz einfach die Hygienekontrollberichte von Lebensmittelbetrieben (Restaurant, Supermarkt, Bäcker etc.) anfragen. link
  • Sensation in der EU-Copyright-Reform! Verhandlungen auf Eis gelegt: EU-Ministerrat erteilt Uploadfilter und Leistungsschutzrecht vorerst eine Absage. link (bei Julia Reda)
  • NRW fördert Hackspaces auf dem Dorf. Neues Förderprogramm “Dritte Orte – Häuser für Kultur und Begegnung im ländlichen Raum” stärkt kulturelle Infrastruktur. Erste Förderphase mit 750.000 Euro jetzt ausgeschrieben, Bewerbungsschluss 30.4.19. link
  • Das ändert alles: animated URLs using Javascript and EMOJIS link
  • Brion Vibber has written up some notes on his EmbedScript project for using iframe sandboxing in MediaWiki pages to do click-to-play widgets and plugins. link
  • Neue Publikation der Bundeszentrale für Politische Bildung: ”Das metrische Wir - Über die Quantifizierung des Sozialen”: ”Ob bei Bildung, Gesundheit oder Konsum: In zahlreichen gesellschaftlichen Sphären werden massiv Daten gesammelt und ausgewertet. Diese Auswertungen bilden wiederum die Grundlage für Rankings, Vergleiche und Wertungen. Der Soziologe Steffen Mau zeigt die Risiken dieser umfassenden “Soziometrie” auf.link

Links

  • A Hopeful Look At The Apocalypse: Cory Doctorow über Science Fiction, die nicht immer dystopisch sein muss: ”When you have story after story about how people turn on each other after disaster, Doctorow believes it gives us the largely false impression that people act like jerks in crises. When in fact, people usually rise to the occasion.
  • Project DeepSpeech: Mozillas DeepSpeech, eine Implementation in Tensor Flow einer Open Source Spracherkennungssoftware basierend auf Baidus Deep Speech Paper.
  • Wikidata hub: URLs bauen, die auf Punkte weiterleiten, die bei Wikidata verzeichnet sind. Zum Beispiel die gerade aktuelle Adresse von Sci Hub.
  • It Isn’t About The Technology: Das offene Web verschwindet und wird durch zentralisierte Plattformen ersetzt, aber es liegt nicht an der Technologie. ”Balkanization of the Web seems more likely than decentralization. If a decentralized Web doesn’t achieve mass participation, nothing has really changed. If it does, someone will have figured out how to leverage antitrust to enable it. And someone will have designed a technical infrastructure that fit with and built on that discovery, not a technical infrastructure designed to scratch the itches of technologists.
  • Diskussionsrunde auf dem 34C3: Warum haben wir aufgehört, Dinge ins Internet zu schreiben?: Notizen aus einer Diskussionsrunde zum Rückgang von Benutzendenbeiträgen im offenen Web.

Rezepte, Urheberrecht, Werke

Steile Thesen können zum Absturz führen oder wie eine Sprungschanze zum Weiterfliegen dienen. Hier ist eine steile These zum Urheberrecht, zum Werkbegriff und vielleicht zum Thema Geschlechter:

Bei 140 Zeichen auf Twitter ist selten alles so differenziert wie bei einem längeren Text. Zum Glück gibt es Blogs.

Ich bin davon überzeugt, dass es bei der Frage, was der Allgemeinheit gehört und was Privateigentum ist, keine Naturgesetze zum Tragen kommen. Einhegungen fallen nicht vom Himmel. Bei Fragen nach Urheberrecht und geistigem Eigentum lohnt es sich also immer, auch auf die Gesellschaft und ihre Machtverhältnisse zu schauen. Für mich spricht diese allgemeine Erkenntnis dafür, dass bei der Frage, warum Kochrezepte keinen Schutz nach dem Urheberrecht genießen, gesellschaftliche Machtverhältnisse und Zuschreibungen eine Rolle spielen. Sie spielen überall im Leben eine Rolle, warum dann nicht auch hier?

Jedoch: Es gibt ein paar Anzeichen dafür, dass die Aussage “Kochrezepte fallen nicht unter den Schutz des Urheberrechts, weil meistens Frauen kochen” in einer ganz vereinfachten Form auch problematisch ist:

  1. In der Spitze und deshalb auch bei den Autoren von Kochbüchern finden sich viele Männer (Bocuse, Oliver). Wenn Männer für ihre Werke Urheberrecht durchsetzen, um Geld zu verdienen, dann hätten sie hier durchaus eine wirtschaftliche Motivation.

  2. In anderen Bereichen, die Teile der Gesellschaft als traditionell weiblich lesen (Handarbeit, Mode), gibt es durchaus Copyfight: Auch wenn zumindest im amerikanischen Recht das Schnittmuster selbst nicht unter den Schutz des Copyright fällt, sondern nur Layout und Abbildung, so gibt es doch teilweise harte Kämpfe um Copyright und Nachnutzung, geführt sowohl von Unternehmen wie Burda als auch von Indie-Designer_innen im Internet.

Nach längerem Nachdenken (und Nachlesen im Internet) habe ich kein eindeutiges Fazit der steilen These.

Ich vermute, dass es Praxen gibt (in diesem Fall: kochen), die seit Jahrhunderten als völlig verschieden von dem Genius der schöpferischen Arbeit angesehen werden. Manchmal werden sie nicht mal als Arbeit gesehen (der Begriff der Care-Arbeit setzt hier an). Dann wiederum ist unbestreitbar, dass es Stars gibt (viele davon Männer), die mit urheberrechtlich geschützten Rezepten Geld verdienen könnten.

Als Zwischenergebnis bleibt für mich nur: Urheberrecht ist verwirrend – und manchmal eben auch willkürlich.

Nachtrag: Ich wurde auf einen extrem lesenswerten Artikel zum Thema bei iRights hingewiesen.

Noch ein Nachtrag: Julia Reda hat einen kluge Kommentar auf Facebook zu dem Thema:

Komplimente per Knopfdruck mit dem Dash-Button

Seit Dezember betreibe ich ein kleines Experiment am Arbeitsplatz. Mit einem Amazon Dash-Button und einem Raspberry PI habe ich eine kleine Installation angebracht, denn Wertschätzung ist wichtig: ein Button, der auf Knopfdruck zufällige Komplimente per Mail an eine zufällige Kollegin oder einen zufälligen Kollegen verschickt.

Drückt jemand auf den WLAN-getriebenen Internet-of-Things-Button bekommt irgendjemand im Büro ein Kompliment per Mail.

Gezielte Komplimente können natürlich auch weiterhin persönlich und analog überbracht werden, aber digital ist besser.

Grundlage des Projekts ist dasher.

Es gibt auch eine Aufnahme von einem der ersten Knopfdrücke.

Leider hat sich der Amazon Dash Button als nicht besonders gut für das Experiment herausgestellt: Nach einer geringen 3-stelligen Anzahl von Knopfdrücken stellt dieser den Betrieb ein. Wenn wir jetzt jedes Mal den Button neu kaufen, würde uns das ca. 4ct pro Kompliment kosten. Das ist es uns natürlich Wert, aber wir sollten auch an die Umwelt denken.

Im Moment arbeiten wir an einem Ersatz auf der Basis von NodeMCU. Sobald diese Lösung fertig ist gibt es auch das gesamte Projekt unter einer freien Lizenz.

Bemerkenswerte Datensätze

Wer Dinge mit Daten veranstalten möchte, braucht Datensätze. Das Netz ist voll mit Datensätze, auch solche mit zweifelhafter Ethik.

Hier sind ein paar interessante, die mir aufgefallen sind:

Orte, die mit ‘ow’ oder ‘itz’ enden

Ich hatte eine Hypothese, auf die ich durch ein Lied gebracht wurde: Orte, die mit “ow” oder “itz” enden, befinden sich mehrheitlich nicht in Westdeutschland (aka die alten Bundesländer).

Schön, dass sich diese Hypothese mit Wikidata überprüfen lässt:

Hier lässt es sich ausprobieren

Ergebnis der Query Ich muss sagen, das Ergebnis erstaunt mich. Es gibt ein paar Ausrutscher, aber das Cluster der Punkte bildet ziemlich genau die Umrisse der ehemaligen DDR. In dieser Deutlichkeit hatte ich nicht erwartet, dass die Hypothese belegt wird. Woher kommt es?

Die Namen auf -ow finden sich vor allem in Nordostdeutschland, wo Ortsnamen slawischer Herkunft häufig sind. Mithin in Mecklenburg, Vorpommern, weiten Teilen Brandenburgs (in der Lausitz seltener), dem Norden und Osten der Altmark, dem Wendland und Teilen des Herzogtums Lauenburg. Auch unter den deutschen Namen von Orten im Osten von Pommern und im Osten von Brandenburg, die heute in Polen liegen, finden sich solche auf -ow. Dagegen sind in Gegenden wie Sachsen oder Teilen von Österreich, wo es eine Reihe von Ortsnamen slawischer Herkunft gibt, keine auf -ow zu finden.

Ebenso slawischen Ursprungs und in Ostdeutschland verbreitet ist die Endung -itz.

Gotta catch ‘em all if they are prime

Pokemon collection

Pokémon, as Wikipedia tells us, is a multi-billion dollar media franchise controlled by video game giant Nintendo, and created by Satoshi Tajiri around 1995. Interestingly enough, Pokémon has had quite an impact on the Wikipedia project, with the completeness of Pokémon characters resulting in the Pokémon test, so named after editors used similar arguments to try to “keep” other articles—if [named Pokemon character] has an article, why shouldn’t this topic? For example, in arguing against the deletion of an article in 2005, one editor wrote “Wikipedia is not paper; if we can have articles for every minor character in Star Wars, Star Trek, and each of those pesky Pokémon, we can have an article about Professor Hopper.” (See the article on the Wikimedia blog for the full story).

I played around with the Wikidata Query Service and SPARQL queries recently. As one of the first projects on Wikidata was WikiProject Pokémon (initially known as the Pokémon Task Force), information on the fictional Pokémon species and their numbers (the Pokédex numbers) is rather complete. A query with SPARQL for all Pokémon is easy:

 
 
 
 
 
 
 
 
# Gotta catch 'em all
SELECT ?pokemon ?pokemonLabel ?pokedexNumber
WHERE
{
  ?pokemon wdt:P31 wd:Q3966183.
     ?pokemon wdt:P1112 ?pokedexNumber
SERVICE wikibase:label { bd:SERVICEParam wikibase:language "en" }
} ORDER BY (?pokedexNumber)

You can try out this query.

But I wanted a query that was a little more complex: Find all Pokémon with a number in the Pokédex that is prime. My first try didn’t work. The mistake I made: I wanted to compare the Pokédex number with the label of a prime number. Unfortunately, the label service in the Wikidata Query Service fills in labels too late to use them in a subquery. But the community was helpful as ever. User:Nikki pointed me in the correct direction: Use rdfs:label instead. Here’s the solution:

 
 
 
 
 
 
 
 
 
 
 
 
 
# Gotta catch 'em all if they are prime
SELECT ?pokemon ?pokemonLabel ?pokedex WHERE {
{ 
  SELECT ?prime WHERE {
    ?p wdt:P31 wd:Q49008;
   rdfs:label ?prime FILTER (lang(?prime) = "en") .
         }
  }
  ?pokemon wdt:P31 wd:Q3966183;
   wdt:P1112 ?pokedex FILTER (xsd:integer(?pokedex) = xsd:integer(?prime)).
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }.
}
ORDER BY ?pokedex

Try it out

But there’s an even simpler solution without a subquery that is obvious once you wrape your head around the fact that query doesn’t work like map in functional languages but is rather closer to declarative programming. It’s basically: “Find a solution that satisfies all the triples given above”.

See it here:

 
 
 
 
 
 
 
 
 
 
 
# Gotta catch 'em all if they are prime
SELECT ?pokemon ?pokemonLabel ?pokedex WHERE {
?prime wdt:P31 wd:Q49008;
   wdt:P1181 ?pokedex .
      
?pokemon wdt:P31 wd:Q3966183;
 wdt:P1112 ?pokedex .

SERVICE wikidatabase:label { bd:serviceParam wikibase:language "en". }.
}
ORDER BY ?pokedex

Try out this

Thanks again, User:Nikki!

Nebeneinkünftequartett der Bundestagsabgeordneten – Offene Karten mit offenen Daten

Seit einiger Zeit gibt es die Nebeneinkünfte der Bundestagsabgeordneten als offene Daten. Die Berliner von OpenDataCity haben seinerzeit daraus eine JSON-Datei gebastelt, die in zehn Stufen einmalige, monatliche und jährliche Nebeneinkünfte vermerkt (noch genauer wollten es die Abgeordneten dann doch nicht haben mit der Transparenz).

Mit Python, Wikidata, Mustache und SVG habe ich mich hingesetzt und daraus Spielkarten gebastelt, für besinnliche Quartettrunden mit Offenen Daten an langen Winterabenden.

So sieht etwa die Spielkarte für Dr. h. c. Hans Michelbach aus der CDU/CSU-Fraktion aus:

Dr. h. c. Hans Michelbach

Den kompletten Satz aller Spielkarten gibt es als .zip-Datei zum Download.

Das Python-Skript, um die Spielkarten selbst zu generieren, liegt auf github. Nicht in allen Fällen konnte ich mit Wikidata ein Bild des oder der Abgeordneten finden, im Zweifel liegt das aber an mir.

Viel Spaß beim Spiel und möge das höhere Nebeneinkommen gewinnen. Oder so.