Archiv für den Monat Februar 2013

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!

Linkliste 00000100

Ein weiteres Online-Tutorial zu Python, das eine ganz angenehme Struktur hat. Ein Thema pro Seite, das wiederum aufgeteilt ist in viele Unterkategorien. So kann man etwas leichter hoch und runter scrollen um Wissenslücken zu füllen. Der Autor scheint vor allem vier Paradigmen zu folgen:

  • Keep it short. It is better for students to read 10 pages than not read 50 pages.
  • Be careful with vocabulary. I tried to minimize the jargon and define each term at first use.
  • Build gradually. To avoid trap doors, I took the most difficult topics and split them into a series of small steps.
  • Focus on programming, not the programming language. I included the minimum useful subset of Java and left out the rest.

Ich habe den Verdacht, dass es sich dabei um ein etwas schwierigeres Tutorial als das LPTHW handelt. Aber ich bin mir sicher, dass es auch für AnfängerInnen geeignet ist und Frustrationsmomente gut umgehen kann. Vielleicht probiert das jemand von euch mal aus und berichtet davon?

Die Seite stammt von meinem Lieblings-Lehrer, Zed A. Shaw (Es bleibt trotzdem etwas ganz besonderes zwischen uns, Erlehmann und Plom!). Ja, genau, der Autor des großartigen Learn Python the Hard Way Tutorials das ich gerade schwänze. Ich habe leider keine Ahnung, was er in seinem Manifest sagen will aber auf der „Become a programmer, motherfucker, hat er eine tolle Seite mit unendlich vielen Links zu frei verfügbaren Programmier-Lehrbücher.

Und das T-Shirt. Das T-Shirt!!
Kauft euch das T-Shirt, dann müsst ihr Programmieren lernen, um die Credibility zu haben um das T-Shirt tragen zu dürfen.

Das Projekt Euler stellt für erfahrenere ProgrammiererInnen jede Menge Aufgaben zur Verfügung, die mit ein bisschen mathematischem Denkvermögen und etwas Programmier-Skills (ja, haha, ich weiß, sonst weiter nichts, ne?) gelöst werden können und sollen. Die Diskussionen darum, welche Lösungsansätze verwendet wurden kann man erst einsehen, wenn man die Lösung programmiert hat. Ganz nette Idee für Leute, die ihre Programmierkenntnisse praktisch umsetzen wollen in kleinen Programmen, die mathematische Aufgaben lösen. Ich finde es selber nicht sooo spannend, aber vermutlich sollte ich mir mal wenigstens die ersten 5 vornehmen um die Umsetzung zu üben.

Letztes Mal im Schlangencode wies ich ja darauf hin, dass ich einen blöden Umlaut-Fehler in meinem Programm hatte, genauer: Einen Dekodierungsfehler. Dieser Artikel greift den Unterschied zwischen den manchmal verwirrenden Begriffen „Encoding, Decoding und An Encode auf“ und erklärt worauf man achten muss, um Unicode Errors zu vermeiden. Langer, für AnfängerInnen womöglich etwas komplexerer Artikel, aber es lohnt sich. Am Ende ist Einiges entwirrt.

Nach dem Pony-Skandal letzter Woche den einige von uns noch immer erst richtig verdauen müssen, gibt es schon wieder Neuigkeiten auf dem Pferdemarkt. Einerseits solltet ihr jetzt wirklich auf Eine-Mark-Fünfzig-Lasagne von Real verzichten, wenn ihr das aus gutem Grund nicht schon vorher getan habt, andererseits ist mir zu Ohren gekommen, dass der Geist der inkludierenden Programmiersprache wieder umgeht. Jetzt gibt es auch noch eine Programmiersprache, die von Ponys verstanden werden soll. Verrückt. Was würde der Superhacker Johl dazu sagen…? Ach lassen wir das…

Wenn ich von Leuten wie Avrilanda höre kriege ich Hitzewallungen! Stefan hat sich nach vielen Jahren endlich dazu entschlossen, mit dem Programmieren wieder anzufangen.Er wollte ursprünglich FLP nachprogrammieren, aber da er weitestgehend alleine lernt, habe ich ihm von Assembler als Einstieg abgeraten und stattdessen erstmal die Kommando-Schule von Zed A. Shaw empfohlen und anschließend den Python-Kurs. Ich hoffe, dass viele von euch ihm jetzt auf Twitter  folgen und dort mit Rat und Tat zur Seite stehen, wenn er mal eine Frage hat. Ich freue mich wirklich riesig über seine Fortschritte und hoffe bald wieder von ihm zu hören.

Sollte noch jemand von euch vor kurzem oder Längerem mit dem Programmierenlernen angefangen haben, Motivation brauchen, Fragen haben oder jemanden zum gemeinsamen Fluchen über Semikolons bei einem Tee benötigen freue ich mich immer über Kontaktaufnahme über Twitter, in den Kommentaren oder per E-Mail!

Was zum….

Wer von euch hat davon gewusst?!

 

004195890-fiona-bd-7-fiona-lernt-ponysprache

beleidigungsmaschine

Manchmal ist das was einem ein Programm so ausgibt so gehaltvoll wie eine Reiswaffel. Es wird Zeit zurückzuschlagen!

Frohlocket, denn heute programmieren wir eine simple Beleidigungsmaschine. Frei nach einem Comic von Foxitalic. Wir lernen dabei drei verschiedene Methoden kennen um einen Input vom User zu generieren.

#beleidigungsmaschine_1.py

print "\tBELEIDIGUNGSMASCHINE"

print "Hi, what's your name?"
name = raw_input()
print "Pffffhahaha, okay, alright, %s!\n" % name
print "So errr how are you doing, %s?" % name
how = raw_input()
print "Hihihi, I think your Mum is %s!" % how

Ausführen, aufregen, Computer zu Kleinholz schlagen. So einfach ist das! Die Beleidigungsmaschine gibt erst die Frage (auch „prompt“ genannt) nach dem Namen aus. Im nächsten Schritt gibt der oder die Userin eine Antwort ein. Das wird vom Programm mit raw_input „eingelesen“ und die Variable name erhält den string, der zurückgegeben wird. In der nächste Zeile kann ich diesen string gleich einarbeiten. Und so weiter. Das geht allerdings auch etwas eleganter:

#beleidigungsmaschine_2.py 

print "\tBELEIDIGUNGSMASCHINE"
name = raw_input("Hi, what's your name?\n")
how = raw_input("Pfffhaha. Yeah right. So errrr how are you doing?\n")
print "So, apparently your name is %s, and you know what else? I think your Mum is really %s!\n" % (    
    name, how)

Hier kannst du also die Frage an die Userin direkt in die Klammern schreiben. Die Frage wird gestellt und die Antwort als String an die Variable gegeben.
Es geht aber auch noch ein bisschen eleganter! Wer beleidigen will, muss schick aussehen.Oder zumindest ein Skript schreiben können, das Argumente annimmt:

#beleidigungsmaschine_3.py

print "\tBELEIDIGUNGSMASCHINE"

from sys import argv       #1

script, name, how = argv   #2

print "Hi douchebag, I heard your name is", name
print "And somebody told me you're feeling", how
print "You know, who's also", how, "?"
print "Your mom, huehuehue!"

Um das Programm auszuführen reicht es allerdings nicht, einfach nur das übliche python beleidigungsmaschine_3.py in die Konsole zu tippen. In diesem Falle werden gleich beim Aufrufen des Programms die „Argumente“ für die Variablen mitgeliefert. Ich gebe z.B.

python beleidigungsmaschine_3.py Fiona, fine

ein. Das Programm gibt mir

 BELEIDIGUNGSMASCHINE
Hi douchebag, I heard your name is Fiona,
And somebody told me you're feeling fine
You know, who's also fine ?
Your mom, huehuehue!

aus. Bei #1 wird bestimmt, dass das Skript die Argumente von der Kommandozeile nimmt. Was genau passiert ist aber für die Verwendung nicht so wichtig. Das was in der Zeile bei #2 passiert ist sehr viel spannender. Wir haben drei Variablen: script, name und how. Wenn ich das Programm aufrufe gebe ich genau genommen vier Dinge ein:
python, beleidigungsmaschine_3.py, Fiona und how

Außer Python sind diese Dinge „Argumente“. Sie werden in diesem Skript den Variablen zugeordnet. Skript wird mit „beleidigungsmaschine_3.py belegt, name mit „Fiona“ und how bekommt „Fine“ zugewiesen. Ich weise den Variablen also schon beim Aufrufen des Programmes Werte zu. Der Hammer!

Die Beleidigungsmaschine ist natürlich noch ein Prototyp und ich wäre froh, wenn jemand den Kram weiterentwickelt. Oder vielleicht bessere prompts vorschlagen kann. Ich freue mich (und hoffe) auf viele kleine süße Beleidigungsmaschinen-Kinder in den Kommentaren. Vielleicht kann auch jemand meine Maschine so exploiten, dass sie sich selber beleidigt? Ich kann das Nachprogrammieren jedenfalls nur empfehlen. Es ist leicht, macht Freude, macht Freunde, und es ist wenigstens ein bisschen nützlicher als schlecht.s.