Rund um Robin - Programmieren tag:www.robin.st,2008:mephisto/programmieren Mephisto Noh-Varr 2007-12-24T14:51:37Z Robin Stocker tag:www.robin.st,2007-12-24:700 2007-12-24T14:50:00Z 2007-12-24T14:51:37Z Automated Python Refactoring Using Type Inference <p>Das ist der Titel der Studienarbeit von Reto Schüttel und mir, die wir am Freitag pünktlich um 17:00 eingereicht haben. Die Arbeit hat viel Zeit und Nerven gekostet, aber auch Freude gemacht und ich denke das Ergebnis kann sich sehen lassen :).</p> <p>Übersetzt heisst der Titel soviel wie <em>Automatisierte Python-Refactorings mit Typinferenz</em>. Für PyDev, eine Eclipse-basierte <span class="caps">IDE</span> für Python, haben wir die wohl nützlichsten Refactorings implementiert, wie zum Beispiel <strong>Rename Method</strong>, <strong>Rename Class</strong> und <strong>Rename Attribute</strong>. <a href="http://peptic.ifs.hsr.ch/trac/wiki/Showcase">Screenshots</a> und unseren <a href="http://peptic.ifs.hsr.ch/doc/document.pdf">Bericht</a> gibts auf <a href="http://peptic.ifs.hsr.ch/">dem Wiki</a>. Interessierte Python-Programmierer können das ganze relativ einfach über unsere <a href="http://peptic.ifs.hsr.ch/updateSite/">Update-Site</a> für Eclipse ausprobieren.</p> <p>Nachfolgend noch das Abstract unserer Arbeit. Ach ja, und frohe Weihnachten :)!</p> <hr /> <p>Software development is often an unpredictable process, the goals change, an approach turns out to be inefficient or a complex part has to be split up into several pieces. Keeping up with this process often results in the need to make structural changes, so called refactorings. Automating these kinds of adjustments is often desirable, as it saves time and reduces the risk of faults.</p> <p>There are several development environments available for the Python programming language, but only a few offer automatic refactoring. The aim of this project was to extend the refactoring support of PyDev, an Eclipse-based development environment. We implemented the following refactorings:</p> <ul> <li>Generate Docstring</li> <li>Inline Local Variable</li> <li>Extract Local Variable</li> <li>Rename Local Variable</li> <li>Rename Method</li> <li>Rename Attribute</li> <li>Rename Class</li> </ul> <p>To be able to automatically rename methods, classes or attributes, it is essential to know the types of all involved objects. In a dynamically typed language like Python, the exact type of objects is not known before running the actual program. To still be able to determine these types in advance, a heuristic called type inference was implemented. Although the type inference heuristic still has some limitations, it turned out to be very powerful and an essential helper.</p> <p>As more advanced refactorings often depend on knowing the type of objects, the type inference engine will make implementing these refactorings much simpler. But the engine also appears to be useful for many other common <span class="caps">IDE</span> tasks, like finding the references of a given attribute or method, searching for a definition or providing overall structural information.</p> Robin Stocker tag:www.robin.st,2007-11-25:659 2007-11-25T16:21:00Z 2007-11-25T16:27:27Z Besser erklärt <p>Wie funktionieren eigentlich verteilte Versionsverwaltungssysteme<a href="http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/">?</a> Ist der Satz von Pythagoras nur für Dreiecke<a href="http://betterexplained.com/articles/surprising-uses-of-the-pythagorean-theorem/">?</a> Was ist schon wieder der Unterschied zwischen Permutationen und Kombinationen<a href="http://betterexplained.com/articles/easy-permutations-and-combinations/">?</a></p> <p>Diese und andere interessante Fragen werden auf der Seite <a href="http://betterexplained.com/">betterexplained.com</a> auf verschiedene Arten (unterschiedliche Menschen brauchen unterschiedliche Erklärungen) angegangen und mit anschaulichen Bildern verständlich erklärt. Es ist das Blog von Kalid Azad, der gerne seine Erkenntnisse mit anderen teilt und der Spass daran hat, (komplizierte) Sachverhalte verständlich zu erklären.</p> <p>Die Themen sind Mathematik, Programmieren und Kommunikation. Ich habe noch nicht alles angeschaut, aber beim Lesen der Artikel ist mir schon ein paar Mal ein Licht aufgegangen – ein gutes Gefühl :).</p> Robin Stocker tag:www.robin.st,2007-08-31:506 2007-08-31T22:50:00Z 2007-08-31T22:54:46Z Python 3.0 Alpha 1 verfügbar <p>Die erste Alpha-Version von Python 3.0, auch bekannt als Python 3000 (scherzhaft nach dem voraussichtlichen Erscheinungsjahr benannt), ist auf der Python-Website <a href="http://python.org/download/releases/3.0/">verfügbar</a>. Sie ist vor allem für Programmierer gedacht, die einen ersten Eindruck von Python 3 haben möchten.</p> <p>Im Lauf des Jahres wird es noch mehrere Alpha-Versionen geben, im 2008 dann Betas und die finale Version ist für August 2008, also in einem Jahr geplant. Bin gespannt was zuerst draussen ist, Python 3 oder Ruby 2 – am Ende noch Perl 6 ;).</p> <p>Bei Python habe ich ein gutes Gefühl, der ganze Prozess wird in diversen PEPs (Python Enhancement Proposals) ziemlich transparent dokumentiert und auch die Mailing-Liste <em>Python 3000</em> ist informativ.</p> <p><a href="http://www.python.org/doc/essays/ppt/accu2006/Py3kACCU.ppt">Diese Präsentation von Guido</a> zeigt die wichtigsten Änderungen im Vergleich mit Python 2. Hier meine Zusammenfassung, mit Links zu den PEPs:</p> <ul> <li>Viele Altlasten (z. B. klassische Klassen) entfernt und generell Codebasis verbessert</li> <li><code>bytes</code> und <code>str</code> anstatt <code>str</code> und <code>unicode</code>, also Strings sind standardmässig Unicode-Strings, zu/von <code>bytes</code> muss explizit konvertiert werden</li> <li><a href="http://www.python.org/dev/peps/pep-3116/">Ein-/Ausgabe</a> überarbeitet, verschachtelbare Streams wie in Java, aber grundlegende Dinge bleiben einfach</li> <li><a href="http://www.python.org/dev/peps/pep-3101/">Neue String-Formatierung</a>, <code>"{0.name} ({0.alter})".format(person)</code> anstatt <code>"%s (%i)" % (person.name, person.alter)</code></li> <li><a href="http://www.python.org/dev/peps/pep-3119/">Abstrakte Basisklassen</a> (ABCs) für eingebaute und eigene Klassen; ähnlich wie Interfaces von Java, nur dass Methoden auch Implementierung haben können und dank Mehrfachvererbung von mehreren abgeleitet werden kann</li> <li><a href="http://www.python.org/dev/peps/pep-3107/">Optionale Annotationen für Funktionsparameter</a> wie zum Beispiel <code>def haul(item: Haulable, *vargs: PackAnimal)</code>, die für Python selber keine Bedeutung haben, aber zum Beispiel für generische Funktionen verwendet werden können</li> <li><code>range()</code>, <code>zip()</code>, <code>map()</code>, <code>filter()</code> geben Iteratoren zurück</li> <li><code>dict.keys()</code> und ähnliche geben <a href="http://www.python.org/dev/peps/pep-3106/">nicht mehr</a> eine Liste zurück, sondern eine View (Sicht), was schneller ist</li> </ul> <p>Ach ja, Python 3 wird keine geschweiften Klammern anstelle von Einrückung verwenden, hier Pythons Meinung dazu:</p> <pre><code>&gt;&gt;&gt; from __future__ import braces File "&lt;stdin&gt;", line 1 SyntaxError: not a chance </code></pre> <p>:). <code>python -c 'import this'</code> ist auch was lustiges zum ausprobieren.</p> Robin Stocker tag:www.robin.st,2007-05-17:326 2007-05-17T18:58:00Z 2007-05-17T19:00:35Z Unicode-Bezeichner in Python <p>Momentan sind für Bezeichner (z. B. Variablennamen) in Python nur <span class="caps">ASCII</span>-Zeichen erlaubt. Dies ist schade, da für nicht-englische Programmierer, die Bezeichner in ihrer Muttersprache schreiben wollen, nichts anderes übrig bleibt, als die Wörter ins lateinische Alphabet zu transkribieren – was zum Teil nur mit Einschränkungen möglich ist – oder zu versuchen, die Wörter ins Englische zu übersetzen.</p> <p>Für <a href="http://en.wikipedia.org/wiki/Python_3">Python 3.0</a> wurde <a href="http://www.python.org/dev/peps/pep-3131/"><span class="caps">PEP 3131</span></a> (Python Enhancement Proposal, Python-Verbesserungsvorschlag) geschrieben, der vorschlägt für Bezeichner die von Unicode dafür empfohlenen Zeichen-Bereiche zu erlauben.</p> <p>Am Anfang war Guido van Rossum, der Autor von Python, dem Vorschlag gegenüber eher <a href="http://mail.python.org/pipermail/python-3000/2007-May/007524.html">ablehnend gestimmt</a>. Es gab sowohl Fürsprecher als auch Widersprecher, doch nach viel Diskussion konnte Guido umgestimmt werden und er <a href="http://mail.python.org/pipermail/python-3000/2007-May/007744.html">nahm den <span class="caps">PEP</span> an</a>.</p> <p>Ich war von Anfang an dafür und bin froh, dass der <span class="caps">PEP</span> angenommen wurde. Dies ist ein weiterer kleiner Schritt weg von der <span class="caps">ASCII</span>-Armut und hin zur Unicode-Vielfalt, jee :).</p> Robin Stocker tag:www.robin.st,2007-03-11:79 2007-03-11T22:21:00Z 2007-03-11T22:22:46Z Gespiegelte CD-Covers mit Cairo <p>In der Prüfungszeit gibt’s viel zu tun, aber ab und zu muss man was anderes machen als lernen :). Man kann zum Beispiel versuchen, was ähnliches wie die <a href="http://images.google.ch/images?q=itunes+cover+flow">CD-Cover-Ansicht</a> von iTunes zu implementieren.</p> <p>Auf die Idee gekommen bin ich durch einen <a href="http://zrusin.blogspot.com/2007/03/reflections.html">Blogeintrag von Zack Rusin</a>, einem Qt-Entwickler. Der hat es natürlich in <a href="http://www.trolltech.com/products/qt">Qt</a> nachgebaut, und zwar in ungefähr 300 Zeilen Code, ganz geil.</p> <p>Für meine eigene Implementierung hätte ich QtRuby nehmen können, aber den Qt-Teil hat ja Zack Rusin schon gemacht. Darum entschied ich mich für Cairo und Python. Cairo ist eine C-Bibliothek zum Zeichnen von 2D-Grafiken und es gibt eine offizielle Python-Anbindung namens <a href="http://cairographics.org/pycairo">Pycairo</a>. Für das Fenster hab ich <a href="http://gtk.org/"><span class="caps">GTK</span>+</a> verwendet, natürlich auch mit Python.</p> <p>Hier ein Bild, wie’s rausgekommen ist:</p> <p><img title="Gespiegeltes CD-Cover mit Cairo" src="/blog/assets/2007/3/11/cover.py.jpg" alt="Gespiegeltes CD-Cover mit Cairo" /></p> <p>Sieht doch schon ganz nett aus, oder?</p> <p>Mit Cairo kann man leider nur <a href="http://de.wikipedia.org/wiki/Affine_Abbildung">affine Transformationen</a> ausführen. Deshalb sind perspektivische Verzerrungen nicht möglich, was für weitere Covers schräg neben dem in der Mitte nötig wäre.</p> <p>Der Code ist 70 Zeilen lang. Der schwierigste Teil war, die richtige Transformations-Matrix rauszufinden, um das Spiegelbild zu bekommen:</p> <pre><code>mirror_m = cairo.Matrix(1, 0, 0, -self.mirror_factor, 0, img_h + self.mirror_factor*img_h)</code></pre> <p>Das self.mirror_factor ist 0.7 und entspricht der Stauchung. Der Wert wird negativ übergeben, um die Spiegelung zu erhalten. Das letzte Argument ist dafür da, die Spiegelung an die richtige Position zu bringen. Danach wird noch ein Verlauf von halb durchsichtig bis durchsichtig darübergelegt, und fertig ist das Spiegelbild.</p> <p>Den Code zum ausprobieren gibt’s <a href="/blog/assets/2007/3/11/mirrored-cover.py">hier</a>. Das anzuzeigende Bild muss <code>cover.png</code> heissen und im selben Verzeichnis liegen.</p> Robin Stocker tag:www.robin.st,2006-11-26:18 2006-11-26T21:42:00Z 2006-11-26T21:43:18Z Rails und Django im Vergleich <p>Beides sind relativ neue, viel gelobte Web-Frameworks in dynamischen Programmiersprachen – <a href="http://www.rubyonrails.org/">Rails</a> in Ruby und <a href="http://www.djangoproject.com/">Django</a> in Python. Der englischsprachige Artikel <a href="http://docs.google.com/View?docid=dcn8282p_1hg4sr9">A Rails/Django Comparison</a> vergleicht die beiden und befindet sie für ziemlich gleichwertig.</p> <p>Habe Rails mal angeschaut, allerdings noch nie was richtiges damit gemacht. Django finde ich interessant, da es Rails ähnlich ist, aber eigene Wege geht. Zum Beispiel werden in Django die Modelle nicht aus einer bestehenden Datenbank abgeleitet, sondern man gibt sie in Python-Code an, woraus dann die Datenbank generiert wird. Meiner Meinung nach ist der Ansatz von Django sauberer und flexibler.</p> <p>Dann wäre da Djangos <a href="http://code.djangoproject.com/wiki/RemovingTheMagic">magic-removal branch</a>, ein Entwicklungszweig, bei dem es darum ging, unnötige “Magie” loszuwerden und Ordnung zu schaffen – etwas das Rails vermutlich auch nicht schaden würde.</p> <p>Auch das Dokumentieren scheint anders zu laufen, es wird an einem freien <a href="http://www.djangobook.com/">Django-Buch</a> mit 21 Kapiteln geschrieben, wo man beim Lesen gleich Verbesserungsvorschläge anbringen kann.</p> <p>Ich bin auf die weitere Entwicklung der beiden Projekte gespannt. Django ist bei mir auf jeden Fall mal als Kandidat für ein allfälliges zukünftiges Webprojekt vorgemerkt.</p>