Archiv der Kategorie: python

Haters gonna hate this bot

Ich habe es bisher leider noch nicht geschafft, den Beleidigungsbot fertig zu programmieren. Aus aktuellem Anlass würde ich gerne dem allgemeinen Alltagssexismus die Schuld dafür in die Schuhe schieben. Die europäische Flüchtlingspolitik  ist auch echt scheiße und überhaupt habe ich heute morgen sehr eklige Dinge aus der WG-Spülmaschine geholt.

Aber das was ich bisher gelernt habe, kann ich schonmal verbloggen. Der Code für den Beleidigungsbot ist für mich eh sehr neu, komplex und relativ lang, daher ist es vermutlich keine so blöde Idee, einen Teil schon vorab zu erklären. Danke Spülmaschine!

Für den Beleidigungsbot habe ich als erstes diese sehr hilfreiche Anleitung von Travis McCrea verwendet. Es müssen nur noch die Variablen verändert werden um einen simplen funktionierenden Bot zu bauen.
Leider ist in dem Artikel nicht alles was passiert detailliert erklärt. Das werde ich in den folgenden Blogposts mal selber versuchen. Dann kann ich mich auch dem Vorwurf entziehen, ich hätte seinen Artikel einfach geklaut – was nämlich stimmt. Aber wir sind hier ja auch in Internetland.

Um was geht es? 

Um das Programm wirklich einfach und zugänglich zu erklären, sollte ersteinmal geklärt werden, was IRC überhaupt ist.
IRC steht für Internet Relay Chat und ist ein Chat-System das auf dem IRC protocol beruht. Ein sehr altes aber effizientes Protokoll, welches jedoch auch etwas wacklig ist aufgrund seiner Netzwerktopologie. In Kürze: Zwischen den TeilnehmerInnen besteht immer nur eine Kommunikationsverbindung, was Kapazitäten schont, aber auch unsicher ist, da es keine sogenannten Redundanzen gibt. Das heißt, die Verbindung bricht ab, wenn ein Server mal ausfällt. So etwas wird „netsplit“ genannt und führt dazu, dass einige TeilnehmerInnen eines Channels rausfliegen und die Verbliebenen kichern [Anm.: Ich habe gerade erfahren, dass es sehr viel komplizierter ist. Aber ich finde die Erwähnung, dass Kommunikation, Liebesbeziehungen und Netsplits immer sehr viel komplizierter sind, als es auf den ersten Blick scheint, überflüssig].
Das IRC Protokoll ermöglicht das Chatten in Channels und Querys. Channels können problemlos eröffnet und wahlweise registriert werden. Beliebig viele TeilnehmerInnen können einen Channel betreten und dort miteinander chatten. Querys können von UserIn zu UserIn private Kommunikation ermöglichen.

Ich selber bin in einigen IRC-Channeln ab und zu oder regelmäßig unterwegs. Zum Beispiel im Channel zu diesem Blog (##fionalerntprogrammieren, ich bin nicht immer dort, freue mich aber auf BesucherInnen und Austausch im Channel, sonst sind da meistens ein paar harmlose Lurker/Trolle). Insbesondere in der Hacker- und Nerd-Szene ist IRC recht beliebt. Ich habe eine Weile darüber nachgedacht, woran das wohl liegt, aber die schönste Liebeserklärung kam von Nerds in einem IRC-Channel selbst:

15:38 <Fotografiona> man kann aber verschlüsselt kommunzieren oder?
15:38 <erlehmann> naja, niedrige barriere, gibt quasi überall clients, keine 
absichtlichen inkompatibilitäten.
15:38 <plomlompom> Fotografiona, es ist so schön text-only / minimalistisch.
15:38 <erlehmann> hmmnaja. zum server schon über SSL.
15:39 <erlehmann> fotografiona, das einzige chat-protokoll, dass ähnliche vorteile 
von verbreitung und unterstützung durch unendlich viele clients hat ist XMPP und 
das ist sehr viel schwieriger zu implementieren.
15:40 <plomlompom> Ja, ein IRC-Client ist recht einfach zu schreiben.
15:40 <erlehmann> und max-nachrichtenlänge sind 512 bytes, nicht 140 zeichen wie 
bei SMS-twitter
15:41 <plomlompom> IRC ist ein Hacker-Traum, offen und dezentral, und leicht zu 
implementieren.
15:41 <erlehmann> es gibt viele irc-clients und dies hier ist meiner 
#http://blog.dieweltistgarnichtso.net/uii-a-minimalist-irc-client
15:41 -oiler_in|#nodrama.de- uii – a minimalist IRC client | Die Welt ist 
gar nicht so. <http://blog.dieweltistgarnichtso.net/uii-a-minimalist-irc-client>
15:41 <erlehmann> plomlompom „leicht zu implementieren“ mein arsch
15:41 <moeffju> Damals gab es auch noch keine Geheimdienste.
15:42 <Fotografiona> verstehe komplett
15:42 <Fotografiona> ich nehm das als zitat

Aber wie so oft wäre es vermutlich am Besten, wenn ihr einfach mal selber IRC ausprobiert, um euch ein Bild zu machen. Dafür könnt ihr euch einen Client installieren, also ein Programm mit welchem ihr am IRC teilnehmen könnt, oder über einen Browser chatten, so wie damals bei knuddels! Die meisten Channels die ich kenne laufen auf dem freenode-Server. Ihr könnt beispielsweise mal in den #debian oder #linux channel reinschauen oder in meinen (nicht die zwei Rauten vergessen!). In den genannten Channels wird allerdings nicht allzu viel los sein. Womöglich werden dort aber hin und wieder Äußerungen nach einem bestimmten redundanten Muster hineingeschrieben – von einem Bot.

Was wollen wir?

In IRC-Channels gibt es manchmal einen oder mehrere Bots, welche z.B. die Überschrift eines Links ausgeben, falls jemand diesen in den Chat postet. Andere Bots regeln den Rausschmiss von UserInnen und manche sind nur da, um andere Leute zu beleidigen und Zwietracht zu säen. Bots sind genauso wie du und ich Mitglieder des Channels, aber automatisiert durch ein Skript, beispielsweise in Python. Der Bot muss also in der Lage sein, sich über das IRC Protokoll mit dem Channel zu verbinden und dort entweder nur zu lauern oder eine Handlung auszuführen.

Ich möchte einen Bot bauen, der vor allem das mit dem Zwietracht macht. Um besonders fies zu sein und möglichst viel Schaden anzurichten, habe ich mir verschiedene Handlungen und Eigenschaften des Bots überlegt und versucht, diese in Code umzusetzen. Bis ich damit fertig bin, wird es noch dauern, bis dahin reicht ein Bot, der in einen Channel hineingeht und dort kollektiv die Leute beleidigt.

Was programmieren wir?

Der Code beginnt wieder mit einer she-bang-Zeile. Danach werden ein paar Module importiert, dann die Variablen definiert und anschließend kommen einige socket-Funktionen und zum Ende ein paar Schleifen.

#!/usr/bin/env python

import sys
import socket
import string
HOST="irc.freenode.net"
PORT=6667
NICK="beleidigungsbot"
IDENT="beleidigungsbot"
REALNAME="beleidigungsbot"
CHAN="##fionalerntprogrammieren"
readbuffer=""
s=socket.socket( )
s.connect((HOST, PORT))
s.send("NICK %s\r\n" % NICK)
s.send("USER %s %s bla :%s\r\n" % (IDENT, HOST, REALNAME))
s.send("JOIN :%s\r\n" % CHAN)
s.send("PRIVMSG %s :%s\r\n" % (CHAN, "Na ihr Penner?"))

while 1:
    readbuffer=readbuffer+s.recv(1024)
    temp=string.split(readbuffer, "\n")
    readbuffer=temp.pop( )

    for line in temp:
        line=string.rstrip(line)
        line=string.split(line)
        
        if(line[0]=="PING"):
            s.send("PONG %s\r\n" % line[1])

Die Teile des Codes die verändert werden müssen, sind die Werte und Strings mit denen die Variablen im ersten Block belegt werden. Wenn ihr auf einem freenode Server bleibt, dürften die ersten Werte aber gleich bleiben. Nur die Namen unter nick, ident und realname müsst ihr ändern. Dann noch den Channel-Namen einfügen und natürlich das was ihr eurem Chat mitteilen wollt am Ende des zweiten Blocks. Probiert’s einfach aus.

Und jetzt?

1.  Code kopieren
2. Modifizieren
3. Speichern
4. Ausführen
5. Debuggen
6. Ausführen
7. Lauern
8. Magie
9. Freuen

So einfach ist das!

In den nächsten Posts werd ich versuchen, das Ganze zu erklären, aber das hier dürfte ersteinmal reichen. Es lohnt sich, für das Verständnis ersteinmal die Einleitung des RFCs (Request for Comments) über IRC zu lesen. Ich muss aber selber erst noch ein paar Dinge über das Programm verstehen, da das auch meine erste Anwendung ist, die irgendwas mit dem Internet macht.

Bis dahin viel Spaß beim Trollieren!

Übrigens:

Eine kleine Sache die ich schon dazuprogrammiert habe, ist eine etwas größere Auswahl an Beleidigungen in einer Liste. Also muss eine Liste (zum Beispiel namens beleidigungen) angelegt werden, die mehrere Elemente umfasst. Mit „from random import choice“ kann ich daraus ein zufälliges Element zurückgeben lassen und diese Variable anstelle der manuell eingetippten Nachricht einsetzen. In den letzten Posts steht eigentlich alles notwendige dafür, insbesondere in „Zufallssex„.

LINKLISTE #00000110

David Bauer hat den Selbstversuch gewagt und Programmieren innerhalb eines Jahres überwiegend mit Code Academy gelernt. Er schreibt in diesem Artikel über seine Erfolge, Misserfolge und was ihn dann doch wieder motivieren konnte. Er sieht erfreulicherweise auch davon ab, am Ende seiner Entwicklung sich selbst als Superprogrammierer zu sehen. Er betont stattdessen, was er auf dem Weg zu einem programmierenden Journalisten, der für „Programmierer-Maßstäbe“ nichts kann, alles gelernt hat. Er war auf jeden Fall sehr viel fleißiger als ich und hat auch schon kleine Webanwendungen gebaut und auf github gestellt.

Moeffju war so nett, meine Sexwürfel auf Github zu forken (haha wie das klingt!) und dem Code ein bisschen mehr Stil zu verleihen. Es gibt bestimmte Konventionen, die im oben verlinkten Style Guide nachgelesen werden können und an welche man sich der Lesbarkeit halber halten sollte.

Das erste Smartphone!
Danke Leitmedium.

We are all DOOOOOOOMED!
Danke Jakob.

Das Forum InformatikerInnen für Frieden und gesellschaftliche Verantwortung vergibt einen Preis für Abschlussarbeiten, welche sich mit Informatik und Gesellschaft auseinandersetzen. Einreichungen bis zum 31. Mai.

Eine lange, traurige Geschichte über Encryption Standards und das Erklären von Encryption Standards. Mit Strichmännchen. Aber es hat irgendwie auch ein Happy End.

Hätte ich das gewusst. Hier wird sehr knapp, aber dennoch überraschend verständlich die Architektur eines x86-Prozessors in einer Übersicht erklärt.

Netzpolitik.org ist ein wichtiges Blog, wo zentrale Diskussionen der Netzpolitik aufgegriffen, analysiert und wiedergegeben werden. Bzw. was noch viel wichtiger ist: Teilweise werden sie dort erstmal zu zentralen Diskussionen gemacht. Damit das so bleibt, braucht Netzpolitik.org GELDGELDGELD. Ihr könnt und solltet ein paar Euro spenden, ich werd auch mal schauen, was sich tun lässt. Besser ist natürlich ein Dauerauftrag. Von den 30 000 LeserInnen (ich habe aus dramaturgischen Gründen deren Statistik übernommen) könnten ja wenigstens 50% einen Euro jeden Monat spenden und damit unabhängige Berichterstattung über die Politik im Internet, dem wichtigsten Medium der jetzigen und zukünftigen Zeit, finanzieren.
Tut es besser jetzt und rühmt euch mit euren heldenhaften Motiven, bevor wir es alle nur noch tun, um die nervigen Banner loszuwerden. Aber die Fotos sind echt gut! (Disclaimer: Die Fotos sind von m..ach lassen wir das)

Linkliste #00000110

Getaggt mit , , ,

Zufallssex

Ich hab’s getan!

Ihr kennt das vielleicht aus eurer Jugend, als die erotischste Konsumerfahrung noch das Vorbeigehen an halbherzigen Sextoys und aufblasbaren Schafen in einem Laden für kiffende Mittelschicht-Punks war. Also bei mir war das zumindest so. Man könnte meinen, daran habe sich nie etwas geändert, als ich Freitagabends nichts besseres zu tun hatte, als Pizza zu essen und zu programmieren.

Gestern besuchte mich Genosse Erlehmann und als ich ihn gerade rauswerfen wollte, bestellten wir stattdessen im Affekt Essen (Wir guckten einen Flyer an). Um die Stunde, die wir aneinander gebunden waren, zu überbrücken, wollte ich etwas kleines programmieren. Ich wollte nicht aus dem Muster ausscheren und programmierte daher nach dem schlecht.s-Programm, der Beleidigungsmaschine, dem editor und dem Schlangenkuchenrezept erneut etwas völlig sinnloses. Und zwar:

Terminalbasierte Sexwürfel!

Und hier der Code dazu:

#!/usr/bin/env python
print "L I E B E S W U E R F E L"

# wie = ("zaertlich", "fest", "brutal", "schlecht", "angewidert", "lustig")
wo = ("Nippel", "PENIS", "Pussy", "Schenkel", "Bauch", "Po")
was = ("kuessen", "saugen", "lecken", "knabbern", "streicheln", "kitzeln")

from random import choice
# print choice (wie)
print choice (wo)
print choice (was)

Das ist ein sehr sehr sehr einfaches Programm und jedeR sollte das verstehen können. Erlehmann zeigte mir erst in einer Python-Shell, wie man choice verwendet und wie eine Liste erzeugt wird. Eine Python-Shell ist das, was passiert, wenn du im Terminal „python“ eintippst. Du kannst dann sozusagen „live“ Python Befehle ausführen, anstatt sie in ein Programm zu schreiben, das sie für dich nach und nach ausführt. Die simpelste Anwendung ist sicherlich, die Shell wie einen Taschenrechner zu verwenden. Aber die Funktion „Choice“ bspw. kann ich darin auch verwenden. In der Pythonshell lernte ich ersteinmal, wie choice überhaupt funktioniert und konnte es dann in das Programm einbinden.

Im Programm sexwuerfel.py werden zunächst die Variablen mit einer Liste belegt. Das Format ist denkbar simpel:

variable = (1, 2, 3, ..., n-1, n)

Wenn du Zufallszahlen generieren möchtest, kannst du die Zahlen einfach durch Komma getrennt in Klammern setzen. In diesem Fall gebe ich Wörter in Form von Strings in die Liste, also müssen sie in Anführungszeichen gesetzt werden, damit sie als Strings erkannt werden. Damit belege ich drei Variablen. Wobei eine auskommentiert ist, mit einer Raute (#) davor. Dadurch wird die danach folgende Zeile „wirkungslos“ gemacht, sie spielt keine Rolle mehr im Programm. Das ist lediglich Schadensbegrenzung. Kompetente und ganz besonders versaute LeserInnen können die Zeilen ja wieder reinkommentieren.

Der Korrektheit halber: Eigentlich sind die Listen keine Listen, sondern Tupel. Aber egal. Choice ist nicht besonders wählerisch und nimmt alles, was irgendwie abzählbar ist.

In der Zeile

from random import choice

weise ich das Programm an, aus dem Python-Modul „random“ die Funktion(sdefinition) „choice“ zu importieren. Das kennt die geneigte Leserin vielleicht schon aus diesem Post wo ich dasselbe mit „from sys import arg“ verwende.

Die nächsten Zeilen erklären sich eigentlich von selbst. Ich jage die „choice“-Funktion auf die Variablen, die mit den Listen belegt sind. Mit print wird mir das Ergebnis – also ein zufällig aus der Liste ausgewähltes Element – ausgegeben.

Es können natürlich beliebig viele Listen und choices noch hinzugefügt werden. Zum Beispiel

ort = ("kueche", "wohnzimmer", "aufzug", "buergeramt" ...)

oder

wer = ("ich", "du", "aufblasbares Schaf", "deine mutter",...)

und so weiter.

Jetzt brauche ich nur noch ein paar Beta-Tester, die das Spiel ein paar mal… ähm… durchspielen und Verbesserungsvorschläge und Erfahrungsberichte einreichen. Freiwillige?

Hier hört die Erklärung des Programm eigentlich schon auf, aber es folgt noch eine überspringbare Kleinigkeit, für Fortgeschrittene und alle die es werden wollen über Berechtigungen, Unix-Benutzergruppen und zur allerersten Zeile:

#!/usr/bin/env python

Das ist eine sogenannte „Shebang“-Zeile. Ja, wirklich. Sie weist das Betriebssystem beim Ausführen der Datei darauf hin, welcher Interpreter das Programm -nunja- interpretieren kann. Den Tip gab mir Erlehmann und ich weiß bei seinen Hinweisen immer nicht so genau, wie sinnvoll und notwendig die sind. Es hat aber auf jeden Fall den Vorteil, dass nicht etwa

python sexwuerfel.py

in die Kommandozeile eingetippt werden muss, sondern einfach nur

./sexwuerfel

um das Programm auszuführen. Die Endung .py hat übrigens keine Funktion, sie ist einfach nur ein Hinweis an den Menschen, dass es sich um ein Python-Programm handelt. Um eine Datei auf diese Art und Weise ausführbar zu machen, mussten wir allerdings noch ein paar Berechtigungen ändern.

Wenn ich in meinem Terminal

ls sexwuerfel.py -l

eintippe, sehe ich die Berechtigungen: -rw-r–r–
Das kann man aufspalten in  rw-, r– und r–. Das sind drei verschiedene Berechtigungen für mich, den user, die group und other
user (ich) darf:

rw-

Ich habe ein r (lesen) und ein w (schreiben, also das Programm verändern), das heißt ich darf die Datei lesen und reinschreiben. Wo ein x stehen könnte, steht ein Strich, ich darf die Datei also nicht ausführen. Group und Other dürfen nur lesen. Group bezieht sich auf eine definierte Benutzergruppe, ist aber in diesem Falle irrelevant.

Als Userin kann ich die Berechtigungen verändern. Das mache ich mit dem Befehl „chmod“, das steht für „change mode“. Mit

chmod a+x sexwuerfel.py

gebe ich allen (a) Usern das Recht, die Datei auszuführen (x). Jetzt bekomme ich mit

ls sexwuerfel.py -l

das Ergebnis rwxr-xr-x. Aufgespalten wäre das: rwx, r-x, r-x. Also kann ich jetzt als userin lesen, schreiben und ausführen und groups und others dürfen lesen und ausführen aber weiterhin nicht schreiben. Jetzt kann das Programm von jedem mit ./ ausgeführt werden.

Bessere Erklärungen zu chmod gibt es hier und hier gibt es detaillierte Erklärungen zu den Unix-Benutzergruppen.

Getaggt mit , , , , , , ,

Linkliste #00000101

Semesterferien sind manchmal auch nichts weiter als eine vorlesungsfreie Zeit, ehrlich. Das alte Lied: Ich finde im Moment überhaupt keine Zeit zum Programmierenlernen und das wird sich die nächsten zwei Wochen voraussichtlich auch nicht ändern. Zwischen Hausarbeiten, Lernen, Artikel und Geburtstag-Feier-Marathon ist es natürlich auch eine Frage der Prioritätensetzung, das gebe ich zu. Aber die Zeit rennt davon und da sich Bafögzahlung und Zeit in einer verhängnisvollen Abhängigkeit zueinander befinden, muss ich wohl oder übel meine Prüfungen schreiben.
Und ja, ich hatte Geburtstag, da habt ihr richtig gelesen. Abgesehen von meinem Gejammer gibt es auch gute Nachrichten! Ich habe nämlich viele tolle Geschenke bekommen, z.B. eine Heißklebepistole (Peng! Danke Sigi!) oder das Buch „What Technology Wants“ (Danke Mspro!), oder ein Buch von Kathrin Passig, überreicht von Kathrin Passig persönlich! (Ich glaube sie würde es gut finden, wenn ich erwähne, dass ich mir dieses Buch selber gewünscht habe)  Aber all die lieben Leute, die an mich dachten müssen neidlos anerkennen, dass dieses Geschenk das mit Abstand sinnvollste war:

pony

Vielen lieben Dank, Linuzifer – auf dich ist Verlass!

Für die Streberin-Credibility habe ich auch extra die Brille aufgelassen, damit ihr mir das mit den Hausarbeiten glaubt. Stressige Geschichte das mit dem Studieren. Aber ich hoffe, dass zumindest eine erlesene Auswahl an Links euch bei Laune hält. Viel Spaß!

Eine Liste mit zehn Programmen, die vom Terminal aus gesteuert werden. Ein sicherer Umgang mit der Konsole ist der erste wichtige Schritt beim Programmierenlernen und auch für die generelle Auseinandersetzung mit dem Computer das A und O. Von hier aus können Prozesse manuell gesteuert werden und es werden sehr viel mehr Handlungsoptionen jenseits des Klickbaren ermöglicht. Das Tutorial von Zed Shaw habe ich schon mehrfach erwähnt und kann es gar nicht häufig genug tun: Auf Learn Code The Hard Way werden  einem die grundlegenden Befehle für’s Terminal vermittelt.
Mit dem minimalistischen Window Manager i3, der weitestgehend ohne klickbares Interface funktioniert, habe ich mich selber quasi dazu gezwungen, mehr mit der Konsole zu arbeiten. Aber es muss nicht gleich das komplette Interface unklickbar gemacht werden. Einen Anfang können auch Terminal-basierte Programme darstellen, um die Logik der Befehlseingabe kennenzulernen und sich daran zu gewöhnen, in schwarzen Fenstern zu agieren, statt zwischen bunten Buttons hin- und herzuklicken.
Bisher kenne ich nur vim und irssi von der Liste, würde aber gerne mal Mutt, einen E-Mail-Client ausprobieren und Cmus, einen Music Player, besser kennenlernen.
Es macht mir auf jeden Fall Spaß, solche Programme näher kennenzulernen und sich in die Befehle einzufuchsen. Es steht dem eigentlich nichts im Wege, es müssen nur die Befehle gelernt und verinnerlicht werden und im Zweifelsfall findet sich immer jemand aus der Community, der oder die einem weiterhelfen kann.

Scott Hanselman hat einen sehr erfrischenden Artikel inmitten der manchmal etwas einseitigen Diskussion über das Programmierenlernen geschrieben.

People seem to fall on the side of „Everyone should learn to code! Teach the babies Common Lisp!“ or „Not everyone can be a programmer! Relax!“ […]

We need to teach kids to think and to be excited about thinking.

Code should be taught – in age appropriate ways – as part of a larger „solving problems“ curriculum.

Hanselman geht es eher dabei eher um die Fähigkeit, Abstraktionen und Algorithmen grundlegend zu verstehen und die Logik dahinter zu begreifen, also darum, ein spezifisches Nachdenken zu erlernen und damit Probleme zu lösen.

Ich bemühe mich selber häufig darum, Leuten zu erklären, dass es mir ebenfalls weniger wichtig ist, dass ich schnell lerne, möglichst viel Code zu produzieren. Ich hätte auch kein Problem damit, wenn ich niemals auch nur irgendein Programm schreibe, viel wichtiger und interessanter finde ich es, die Praxis des Programmierenlernen zu durchschauen und bestimmte Logiken dahinter zu verstehen. Sicherlich ist der Titel meines Blogs dahingehend etwas irreführend, aber ich denke, jede und jeder Lernende muss für sich selber entscheiden, wieviel er oder sie erlernen möchte, wieviel Zeit dafür investiert wird und was die Ziele sind. Universelle Zielsetzungen wie „Du hast erst Programmieren gelernt, wenn du ein Patch für den Linux-Kernel schreibst oder ein Datenverarbeitungsprogramm erfunden hast“ sind dabei nicht konstruktiv und hindern im Zweifelsfall Leute eher daran, sich überhaupt mit der Thematik auseinanderzusetzen. Zumindest mache ich die Erfahrung bei mir und häufig im Gespräch mit Leuten, die mit dem Programmieren lernen anfangen wollen. Zu hohe Ansprüche stehem dem Vorhaben manchmal im Wege, deswegen weise ich oftmals darauf hin, dass es vollkommen in Ordnung ist, wenn am Ende des Lernprozesses nicht die Verwandlung in eine Programmierexpertin steht. Stattdessen sollte der Spaß am Lernen, die Beschäftigung mit Code und eine Begeisterung für neue technische Themen im Vordergrund stehen.

Ich denke allerdings weiterhin, dass es zwischen der Fähigkeit, eine verstopfte Toilette zu reparieren und dem Verständnis für Code einen Unterschied gibt, der in den resultierenden Verschiebungen von Machtverhältnissen liegt. Aber…ach, ihr wisst schon.

Und nochmal ein schöner Link mit Terminal-Content. Ein Twitter-Account, der regelmäßig schöne Commands für die Konsole twittert. Ich verstehe nicht immer alles und gerade habe ich einen Command ausprobiert, den ich nicht richtig verstanden habe:

PS1="\e[32m$PS1\e[0m"

Jetzt ist meine Kommandozeile irgendwie zur Hälfte dunkelgrün und das was ich eingebe oder was ich als Output bekomme ist hellgrün, so wie vorher.

Screenshot - 03192013 - 06:47:35 PM

Was hab ich bloß getan? Ich habe keine Ahnung!

Aber ist auch nur halb so wild. Immerhin habe ich euch den dummen Fehler vorweggenommen, einen  Befehl, den ich nicht komplett verstehe und rückgängig machen kann, einzugeben. Ich hoffe ihr habt dabei etwas gelernt!

Mail-Verschlüsselung ist eine unheimlich wichtige Sache. Das weiß ich ganz genau, ich habe nämlich immer noch keine und werde dafür regelmäßig beschimpft. Zu Recht!
Gerade im Bereich des Aktivismus ist es eigentlich unerlässlich und eine Sache der gegenseitigen Rücksichtnahme, seine E-Mails und Chats zu verschlüsseln und den sensiblen Content nicht … sagen wir… Gmail oder so in die Hände spielt. Ähem.
Im Moment fliegen vermutlich 99 Prozent des verschlüsselten Mailverkehrs von Nerd zu Nerd. Und machmal bestimmt auch zu einem Nicht-Nerd, der aufgrund schmerzhafter Erfahrungen und seiner prekären Situation bereits gecheckt hat, wie wichtig Verschlüsselung sein kann. Oder hätte sein können.
Cryptocat ist eine Möglichkeit, dieses Gefälle in Chats aufzubrechen, wenn es auch einige Sicherheitsmängel gegenüber der professionellen Verschlüsselung aufweist. Aber das ist immer noch besser als gar keine Verschlüsselung.

Cryptocat is an open source web application intended to allow secure, encrypted online chatting. Cryptocat encrypts chats on the client side, only trusting the server with data that is already encrypted. Cryptocat is delivered as a browser extension and offers plugins for Google Chrome, Mozilla Firefox and Apple Safari.

Eine ausreichende Alternative zu PGP ist es natürlich nicht, und jedeR sollte sich jetzt zumindest mal in den Wikipedia Artikel zu PGP einlesen. Die Profis unter euch können ja mal die nächste Gelegenheit nutzen, um sich jemanden Geneigtes aus dem nähren Umfeld zu schnappen, um den Kram beizubringen. Verschlüsselter E-Mail-Verkehr ist eine zunehmend wichtige Voraussetzung um sich gegen Interventionen zu schützen. Von welcher Seite diese auch immer kommen mögen. Eine aktuelle interessante Debatte darüber anhand der De-Mail gibt es übrigens morgen im Bundestag.

Die siebenjährige Lina kann jedem Buchstaben seinen Binärcode zuordnen. Wie ein kleiner Computer! Coole Sache.
Schade, dass einem jungen Mädchen, das sich so sehr aus dem Fenster tradierter Geschlechterrollen herauslehnt trotzdem eine überdimensionierte rosa Tastatur und Bühne gebaut werden mussten.

Editing Editors

Schreibprogramme. Wir alle kennen und lieben sie und haben unsere dunkelsten Momente mit ihnen geteilt als die Deadlines an uns vorbei zogen. Wir sind bei ihnen geblieben, obwohl ihre völlig widersinnigen Einrückungsparameter nie Sinn ergaben, dafür boten sie uns Hours of Procrastination beim Formatieren unserer Hausarbeiten. Und alles nur weil wir nie LaTex gelernt haben.

Heute lernen wir wieder ein Stück theoretischer Emanzipation von der herkömmlichen Software und schreiben unseren eigenen simplen Texteditor. Bei genauerem Hinsehen werdet ihr merken, dass er nicht so optimal geeignet ist für jeden Text der über ein Hentai oder wie das heißt hinausgeht aber bei NOCH genauerem Hinsehen werdet ihr erst merken, dass es darum gar nicht geht. Genauer gesagt geht es um das

Arbeiten mit Dateien in Programmen.

Dieses Programm habe ich aus der 16. Übung aus Learn Python the Hard Way und ein bisschen verändert.
Es ist wirklich sehr simpel und dient vor allem dem Erlernen des Umgangs mit Dateien, die ich in ein Programm einbinden will bzw. wie ich Programme schreibe die etwas mit meinen Dateien anstellen.

1. Was macht das Programm?

Grob gesagt: Es öffnet eine von dir bestimmte Datei, um den Inhalt dann zu löschen (weswegen du dir gut überlegen solltest, welche Datei du dem Programm gibst). Danach kannst du dem Programm drei Zeilen geben, die direkt in das Programm neu reingeschrieben werden. Am Ende liest es dir nochmal den Inhalt des Programms vor.

2. Datei anlegen

Das Programm wird dich nach einer Eingabe fragen die direkt in eine Textdatei geschrieben wird. Diese Textdatei kann entweder eine bereits existierende sein, die aber ACHTUNG gelöscht wird um neu beschrieben zu werden oder du erstellst einfach eine neue, leere, um sicherzugehen. Das kannst du bspw. auf der Linux-Konsole mit dem Befehl „nano haiku“ machen. Dann wird eine neue Datei angelegt, die du mit CTRL+O speicherst. Du kannst sie mit „nano haiku“ auch jederzeit wieder aufrufen, modifizieren und neu abspeichern. Es kann natürlich jeder andere beliebige Texteditor angewandt werden. Ich persönlich mag es simpel.

(Wenn dir Begriffe wie Editor, Konsole, Nano usw. nicht sagen, solltest du dich erstmal mit den notwendigen Basics bekannt machen. Das geht schön unterhaltsam und kompakt bei http://cli.learncodethehardway.org/ )

3. Code schreiben

Die Datei heißt bei mir ex16.py, sie kann aber auch haiku.py oder fiona.py heißen. Du erstellst sie wieder mit nano oder einem anderen Editor. Hier der Code (immer schön abtippen, Kinder!)

from sys import argv

script, filename = argv                               # 1

print "We're going to erase the content of %r. " % filename
print "If you don't want that, hit CTRL-C (^C) ."
print "If you do want that, hit RETURN."

raw_input("?")                                        #2

print "Opening the file..."
target = open(filename, 'w')                          #3

print "Truncating the file. Goodbye!" 
target.truncate()                                     #4 

print "Now I'm going to ask you for three lines."

line1 = raw_input("line 1: ")
line2 = raw_input("line 2: ")
line3 = raw_input("line 3: ")

print "I'm going to write these to the file."

target.write(line1)                                   #5  
target.write("\n")
target.write(line2)
target.write("\n")
target.write(line3)
target.write("\n")

print "And finally, we close it."
target.close()                                       #6

txt = open(filename)                                 #7

print "Here's the new content of your file %s:" % filename
print txt.read()                                     #8

4. Das Programm ausführen

Ich rufe das Programm auf und gebe dabei die Datei, in welche ich schreiben will als Parameter mit. Also tippe ich

python ex16.py haiku

in meine Konsole. Es erscheinen die ersten paar Zeilen, die mich fragen, ob ich wirklich weitermachen will. Wenn ich entsprechend RETURN drücke, erscheinen die nächsten Zeilen nach dem Fragezeichen, die mich freundlich darauf hinweisen, dass jetzt wirklich die Datei „haiku“ geöffnet und geleert wird.

We're going to erase 'haiku'.
If you don't want that, hit CTRL-C (^C) .
If you do want that, hit RETURN.
?
Opening the file...
Truncating the file. Goodbye!

Als nächstes werden drei Zeilen die ich eintippe eingelesen.
Ich habe mich nach langem Überlegen für ein 5-7-5-Versmaß entschieden und gebe es an das Programm weiter. Die Zeilen werden in meine Datei  „haiku“ geschrieben und um das zu überprüfen lasse ich mir gleich nochmal den Inhalt von „haiku“ vorlesen, bzw. ausgeben:

Now I'm going to ask you for three lines.
line 1: Der Frühling kommt bald
line 2: Sonne scheint hell auf die Stadt
line 3: Egal, Computer.
I'm going to write these to the file.
And finally, we close it.
Here's your file haiku:
Der Frühling kommt bald
Sonne scheint hell auf die Stadt
Egal, Computer.

5. Code erklärt

Keine Sorge. Es ist ein wirklich super einfaches Programm, es folgt nur so viel Text weil ich so gut wie möglich versuche, es ganz detailliert und für AnfängerInnen verständlich zu schreiben. Einiges habe ich selber noch gar nicht verstanden, aber das ist mit dem angemessenen Warnhinweis versehen. Olé! Los geht’s:

Was bei #1 und #2 passiert wird bereits in der Beleidigungsmaschine ausführlicher erklärt. Die Zeile bei #1 sorgt dafür, dass du beim Aufrufen des Programms die Werte für die hier angewandten Variablen bestimmst und sie nicht in das Programm reincodest. In diesem Fall gebe ich nicht einfach nur „python ex16.py“ ein, sondern „python ex16.py haiku“ – auf das python folgt nicht nur der script-Name sondern auch der filename.

Bei #2 wird etwas das du tippst eingelesen, der „Prompt“, bzw. die Fragestellung dazu steht in Klammern und beläuft sich hier auf ein einfaches Fragezeichen. In den Zeilen mit print wird einfach ausgenutzt, dass du ein Programm jederzeit mit Ctrl+C abbrechen kannst. Wenn du Return drückst, geht es natürlich weiter. Also ein billiger Trick, der später mit Konstruktionen, die Bedinungen darstellen umgesetzt wird.

#3 Wir öffnen eine Datei mit open(filename, ‚w‘). Filename ist bereits bestimmt durch den Parameter den wir beim Aufrufen des Programms dazugeliefert haben, hier: „haiku“. In diesem Falle wird die Datei im „write“-Modus geöffnet, wofür das ‚w‘ hinzugefügt wurde. Ich fand es selber etwas schwierig herauszufinden, ob das ‚w‘ notwendig ist, aber vielleicht hat ja jemensch eine Antwort in den Kommentaren. Ihr merkt vielleicht, dass nicht nur die Datei geöffnet wird, sondern der Prozess auch die Variable „target“ mit einem Wert belegen soll. Denn das Öffnen der Datei liefert ein „file object“ zurück. Das ist nicht der Inhalt der Datei, sondern ein Objekt auf das wir uns im weiteren Verlauf des Programms beziehen können.

Was ein Objekt genau ist, ist eine eigentlich etwas wichtigere Frage, die ich aber selber noch nicht ausreichend beantworten kann. Beizeiten!

#4 Hier wird der Inhalt der Datei gelöscht mit truncate. Als nächstes werden drei Zeilen via raw_input eingelesen. Es ist recht offensichtlich, dass diese bei #5 Stück für Stück in die Datei eingearbeitet werden. Das kann eleganter gelöst werden, sobald wir Schleifen programmieren können. Die sind genau dafür da, dumme Aufgaben immer wieder ausführen zu lassen, das habe ich schon einmal erklärt als ich noch C lernte (oder es versuchte).

#6 Hier wird die Datei sozusagen geschlossen und bei #7 öffne ich sie wieder um sie in den folgenden Zeilen zu lesen. Das hätte ich auch weniger umständlich machen können aber der Einfachheit halber mache ich diesen Umweg. Filename ist weiterhin diejenige Datei, die ich beim Aufrufen des Programms als Parameter mitgebe. Der Name wird als String ausgegeben statt des Platzhalters %s.

Bei #8 wird die Datei, die wir gerade erst beschrieben haben schließlich gelesen und ausgegeben mit print. Damit kannst du überprüfen ob der Inhalt korrekt in die Datei geschrieben wurde.

Editorial

Streng genommen habe ich keine Ahnung ob man das Programm überhaupt als Editor bezeichnen kann. Aber das ist auch egal. Wichtig ist, dass gelernt wird, wie man in Programmen mit Dateien rumsaut. Ab jetzt kann ich mit einem Programm nicht nur eigens für das Programm angelegten Text bearbeiten sondern auch bereits vorhandenen Text in Dateien analysieren (wieviele Wörter?) und modifizieren (jedes „Leistungsschutzrecht“ in einem Text mit „Pferdefleisch“ ersetzen). Das öffnet Tor und Tür für die vielen Möglichkeiten, Programme als Werkzeuge zu verwenden, die euch den Alltag erleichtern oder euch dabei helfen, ein Problem zu  bewältigen bzw. technisch zu lösen.

Ich bin selber noch nicht sehr viel weiter im LPTHW, brauche auch noch ein bisschen, bis ich bspw. mit meiner Datei „tagebuch“ rumexperimentieren kann. Denkbar wäre ein Programm, das mir jeden Tag den Eintrag vor einem Jahr ausgibt, das hat leitmedium auch schon mal gemacht. Aber bis ich wirklich auf ein Jahr Tagebuch zurückschauen kann, dauert es zum Glück noch ein wenig, bis dahin möchte ich das aber gerne verstanden haben um es dann nachzuprogrammieren und zu modifizieren.

Haiku Five!