<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8450886134675526767</id><updated>2011-07-08T20:21:31.528+02:00</updated><category term='Organisatorisches'/><category term='Marketing'/><category term='Zope 3'/><category term='ZODB'/><category term='Tricks'/><category term='Fallstricke'/><title type='text'>Theuni on Zope</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-6451746658187740039</id><published>2009-10-16T11:55:00.005+02:00</published><updated>2009-10-16T12:04:45.588+02:00</updated><title type='text'>AJAX loading spinner without flickering artifacts</title><content type='html'>We were embedding a spinner to give user feedback while loading data from a server which might take a little longer (but can also be pretty quick in most cases).&lt;br /&gt;&lt;br /&gt;Implementing the spinner itself isn't that hard, but we found that quick responses from the server caused visual artifacts flickering up because the spinner was only visible for a few milliseconds (probably roughly 30ms).&lt;br /&gt;&lt;br /&gt;The solution we chose to implement looks like this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;before triggering the AJAX request, schedule the code that loads the spinner 150ms into the future&lt;/li&gt;&lt;li&gt;if the AJAX request returns and the spinner did not materialize yet, cancel the scheduled code&lt;/li&gt;&lt;li&gt;if the AJAX request returns and the spinner was materialized, schedule the code to hide the spinner 200ms into the future&lt;/li&gt;&lt;/ul&gt;We also had two smaller variations: if the replacement looks almost identical to what was shown before, don't hide it until the spinner actually shows up. If the replacement looks usually a lot different, then blank the area immediately waiting for the spinner to show up or not.&lt;br /&gt;&lt;br /&gt;We implemented this with MochiKit and here is some sample code:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: 13px; white-space: pre; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: 13px; white-space: pre; "&gt;var expansion_element = $('mydivcontainingstuff');&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;var spinner_loader = MochiKit.Async.callLater(0.15, function() {&lt;br /&gt;   MochiKit.DOM.addElementClass(expansion_element, 'loading');&lt;br /&gt;   MochiKit.DOM.addElementClass(expansion_element, 'loading-spinner');&lt;br /&gt;   spinner_loader = null;&lt;br /&gt;});&lt;br /&gt;d = MochiKit.Async.doSimpleXMLHttpRequest(ajax_url);&lt;br /&gt;d.addCallback(function(result){&lt;br /&gt;   $('mystuffdivcontainingstuff').innerHTML = result.responseText;&lt;br /&gt;&lt;br /&gt;   if (spinner_loader != null ) {&lt;br /&gt;       spinner_loader.cancel();&lt;br /&gt;   } else {&lt;br /&gt;       MochiKit.Async.callLater(0.2, function() {&lt;br /&gt;       MochiKit.DOM.removeElementClass(expansion_element, 'loading-spinner');&lt;br /&gt;       MochiKit.DOM.removeElementClass(expansion_element, 'loading');&lt;br /&gt;   });&lt;br /&gt;}&lt;/pre&gt;And here's the CSS:&lt;br /&gt;&lt;pre&gt;.loading-spinner {&lt;br /&gt;  width: 100px;&lt;br /&gt;  height: 100px;&lt;br /&gt;  margin-left: auto !important;&lt;br /&gt;  margin-right: auto !important;&lt;br /&gt;  background-image: url(ajax-loader.gif);&lt;br /&gt;  background-repeat: no-repeat;&lt;br /&gt;  background-position: 50% 50%;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;.loading * {&lt;br /&gt;  display: none;&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-6451746658187740039?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/6451746658187740039/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=6451746658187740039' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/6451746658187740039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/6451746658187740039'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2009/10/ajax-loading-spinner-without-flickering.html' title='AJAX loading spinner without flickering artifacts'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-8467119024501331758</id><published>2008-12-06T11:18:00.002+01:00</published><updated>2008-12-06T11:30:42.309+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tricks'/><title type='text'>z3c.recipe.tag</title><content type='html'>Nachdem &lt;a href="http://wosc.de"&gt;Wolfgang&lt;/a&gt; diese Woche auf der Suche nach Symboldefinitionen durch sein Egg-Verzeichnis gekrochen ist, haben wir &lt;a href="http://pypi.python.org/pypi/z3c.recipe.tag/"&gt;z3c.recipe.tag&lt;/a&gt; ausprobiert und waren auch sofort begeistert: Mit diesem Rezept werden Vim- und Emacs-kompatible ctags-Dateien erstellt, die alle Symbole des genannten Eggs und seiner Abhängigkeiten haben. Damit entfällt endlich die Pfad-Sucherei und die händische Prüfung der Versionsnummern.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-8467119024501331758?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/8467119024501331758/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=8467119024501331758' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/8467119024501331758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/8467119024501331758'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2008/12/z3crecipetag.html' title='z3c.recipe.tag'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-9163276570522402975</id><published>2008-07-08T13:44:00.002+02:00</published><updated>2008-07-09T16:32:48.489+02:00</updated><title type='text'>Python descriptor tutorial</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;small&gt;&lt;i&gt;Raymond Hettinger hat ein Tutorial gegeben, in dem er erklärt wie man mit Hilfe von Deskriptoren den Attributzugriff (lesen, schreiben, löschen) in Python für seine eigenen Zwecke anpassen kann.&lt;/i&gt;&lt;/small&gt;&lt;br /&gt;&lt;br /&gt;Die Folien zum Vortrag sind praktisch orientiert und sollten demächst online verfügbar sein. In der Zwischenzeit kann man sein bestehendes &lt;a href="http://users.rcn.com/python/download/Descriptor.htm"&gt;Deskriptor-Tutorial&lt;/a&gt; anschauen.&lt;br /&gt;&lt;br /&gt;Nebenbei wird erklärt, wie super() funktioniert und wie aus Funktionen Methoden werden.&lt;br /&gt;&lt;br /&gt;Update: Die eigentlichen Folien sind inzwischen im &lt;a href="http://www.europython.org/TalkMaterials?action=AttachFile&amp;amp;do=get&amp;amp;target=Descriptor+Tutorial.ppt"&gt;Europython-Wiki&lt;/a&gt; verfügbar.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-9163276570522402975?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/9163276570522402975/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=9163276570522402975' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/9163276570522402975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/9163276570522402975'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2008/07/python-descriptor-tutorial.html' title='Python descriptor tutorial'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-2452419090855164000</id><published>2008-07-08T10:28:00.003+02:00</published><updated>2008-07-21T20:54:12.715+02:00</updated><title type='text'>How we develop Launchpad at Canonical (and Bazaar too)</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;small&gt;&lt;i&gt;Steve Alexander hat über die Entwicklungsmethoden berichtet, die für Launchpad und Bazaar benutzt werden. Steve und ich haben lustige handgeschrieben Folien gebaut, die wir abfotografiert haben.&lt;/i&gt;&lt;/small&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/theuni/2682363527/" title="Steve Alexander by Christian Theune, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3139/2682363527_551c5b67a4_m.jpg" alt="Steve Alexander" style="margin: 1em; float: left; cursor: pointer;" height="240" width="160" /&gt;&lt;/a&gt;Eins der Hauptprobleme mit denen man sich in der Entwicklung bei Canonical, speziell bei den Launchpad- und Bazaar-Teams, beschäftigt ist die Frage wie man "Corporate-Style Development" mit einem völlig verteilten Team unter einen Hut bekommt.&lt;br /&gt;&lt;br /&gt;Der von Canonical verfolgte Ansatz lautet dabei: aus Methoden von agilen Prozessen und der Community-getriebenen Open-Source-Entwicklung ein Emulgat zu erzeugen, das sie "Community Agile" nennen.&lt;br /&gt;&lt;br /&gt;Um diese Prozessentwicklung intern fortlaufend zu gestalten, verwendet Canonical ebenfalls Elemente des "LEAN"-Prozesses. Dieser stammt ursprünglich aus der Autoproduktion von Toyota und und dem Kaizen: der kontinuierlichen Verbesserung von Produkten, der Organisation und der Prozesse.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Werte&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Die konkrete Ausgestaltung der Prozesse berücksichtigt einige feste Elemente, die Canonical als "Werte" bezeichnet. Diese Werte werden mit den Werten "klassischer" agiler Entwicklung kontrastiert dargestellt und beruhen auf den eigenen Erfahrungen:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Wissen und Motivation über Co-Lokation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Canonical möchte die besten Leute zusammenbringen und hat die Erfahrung gemacht, dass es produktiver ist die besten Leute miteinander über große Entfernungen arbeiten zu lassen, statt darauf zu bestehen, dass alle vor Ort arbeiten und dabei weniger gute Entwickler im Team zu haben.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Patches integrieren über Sprintplanung&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Canonical entwickelt die meisten Produkte gezielt als Open-Source. Dadurch kommt es zu Code-Spenden, die nicht unbedingt in die eigene Planung passen. Um das Gesamtprodukt für so viele Anwender wie möglich interessant zu machen ist man bestrebt Patches so schnell wie möglich in die Hauptlinie des Codes zu überführen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Gemeinschaft über In-House-Entwicklung&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Software profitiert in verschiedenen Aspekten davon, wenn sich um Sie eine Gemeinschaft bildet, die sie aktiv benutzt, erweitert und entwickelt. Dazu ist es nicht immer notwendig, dass die eigene Software Open-Source ist - extensive Schnittstellen und Plugin-Systeme helfen einer Community ebenfalls, sich zu etablieren und zur Entwicklung einer Software beizutragen.&lt;br /&gt;&lt;br /&gt;Im Vergleich zur agilen Entwicklung ist dies eigentlich eine konsequente Fortführung des Kunde-vor-Ort-Prinzips.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Hochwertige Builds&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ebenfalls ein aus der agilen Entwicklung fortgeschriebener Ansatz: Hochwertige Releases.&lt;br /&gt;&lt;br /&gt;Selbst bei zusammensitzenden Teams ist defekter Code problematisch. Wenn sich bei stark verteilten Teams ein Fehler einschleicht, kann dieser aufgrund der Zeitunterschiede schnell gesamte Arbeitstage vernichten, während man auf die Fehlerbehebung wartet. Daher müssen alle Tests nach jedem Checkin laufen. Und eigentlich ist man dann sowieso in der Lage nach jedem Checkin ein hochwertiges Release.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;LEAN&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Eine weite Frage bei LEAN ist auch, wie viel Arbeit verschwendet wird, um vom Beginn der Implementation eines Features zum Kunden zu kommen?&lt;br /&gt;&lt;br /&gt;Mit LEAN versucht man hohe Entwicklungsgeschwindigkeit zu erreichen, um Funktionen so schnell wie möglich zum Kunden zu bringen, denn solange eine Funktion in Arbeit ist, verursacht sie nur Kosten: die Spezifikationen können sich ändern, es erfordert Aufmerksamkeit der Entwickler, es fehlt dem Kunden. Je länger dieser Zustand dauert, desto teurer wird die Funktion am Ende.&lt;br /&gt;&lt;br /&gt;Ebenfalls ist es Verschwendung, wenn eine Funktion einmal bereitgestellt wurde, und wieder in die Entwicklung muss. Beispielsweise aufgrund fehlender Qualitätssicherung oder zu großer Arbeitspakete.&lt;br /&gt;&lt;br /&gt;Canonical versucht Verschwendung durch einige Methoden zu reduzieren:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Feste Release-Zyklen&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Launchpad hat einen Release-Zyklus von einem Monat, bei einem Planungshorizont von 4 Monaten. Ubuntu hat einen Release-Zyklus von 6 Monaten. Dadurch wird es einfacher für die verschiedenen Unternehmensbereiche (Marketing, Testing, Entwicklung) miteinander zu kommunizieren.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Gleichmäßige Arbeitsbelastung&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Gegenbeispiel: Wenn man einfach nur einen 1-Monatszyklusansetzt, passiert in der dritten Woche folgendes: Qualitätssicherung muss passieren. Dadurch versucht jeder seinen Code noch irgendwie ins Release zu bekommen, was für erhöhten Stress in dieser Woche führt (eigenen Code schreiben, Tests schreiben, anderer Leute Code reviewen, ...).&lt;br /&gt;&lt;br /&gt;Um dies zu umgehen, hat Canonical jeden Code-Reviewer einen Tag in der Woche auf Bereitschaft (jeweils an verschiedenen Tagen). Dadurch kann jeder Programmierer den bereitstehenden Reviewer sofort ansprechen und muss nicht auf die Qualitätssicherung in der dritten Woche warten. Durch synchrone Kommunikation (IRC, Voip) wird hier ebenfalls Verschwendung vermieden, da sowohl Reviewer als auch Entwickler Code und Konzepte gerade im Kopf haben und nicht "swappen" müssen.&lt;br /&gt;&lt;br /&gt;Weiterhin werden die Arbeitspakete bewußt kleingehalten: jeder Patch darf maximal 500 Zeilen inklusive Diff-Kontext sein. Ist er größer muss er in mehrere kleinere Einheiten zerteilt werden.&lt;br /&gt;&lt;br /&gt;Zum Schluss werden Änderungen so schnell wie möglich auf den Trunk gespielt um erneute Konflikte zu und damit Verschwendung zu vermeiden.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;span style="font-weight: bold;"&gt;Weiterführendes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Steve hat außerdem auf ein &lt;a href="http://people.ubuntu.com/%7Eianc/papers/community-agile/community-agile.html"&gt;Paper von Ian Clatworthy&lt;/a&gt; hingewiesen, in dem die Gedanken zur Community-getriebenen Entwicklung noch einmal vertieft dargestellt werden.&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-2452419090855164000?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/2452419090855164000/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=2452419090855164000' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/2452419090855164000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/2452419090855164000'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2008/07/how-we-develop-launchpad-at-canonical.html' title='How we develop Launchpad at Canonical (and Bazaar too)'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3139/2682363527_551c5b67a4_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-2533006779263051565</id><published>2008-07-07T16:04:00.003+02:00</published><updated>2008-07-07T17:25:30.011+02:00</updated><title type='text'>Discouraging the use of Python (or: How to keep the snakes off your plane)</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Harald Armin Massa hat typische FUD-Argumente gegen Python in einem unterhaltsamen Vortrag erfasst und deren Gegenargumente aufgezeigt.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Sneaking in Python&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Python schleicht sich ja wirklich überall ein: durch Mock-Anwendungen (die nie ersetzt werden), durch kleine Scripting-Tasks, durch Datenbanktransfers und andere Programmiertätigkeiten.&lt;br /&gt;&lt;br /&gt;Der geneigte Pointy-Haired-Boss (PHB) weiß, dass er jetzt vorsichtig sein muss, um zu verhindern, dass Python in seiner Abteilung um sich greift ...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Python is dangerous&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;... weil weniger Code geschrieben werden muss&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Dadurch braucht man weniger Programmierer, die eigene Abteilung wird kleiner, man bekommt ein kleineres Budget, kleineres Büro und einen schlechteren Parkplatz. Man verliert Macht!&lt;br /&gt;&lt;br /&gt;Aber ein anständiger PHB weiß: Python ist nur für kleine Anwendungen geeignet. Wir schreiben aber große Anwendungen. Python kann hier nicht benutzt werden!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;... weil Python-Code lesbarer ist.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dadurch können Nicht-Programmierer (oder Programmierer anderer Teams) verstehen was wir tun. Andere können Fehler in unserem Code finden! Die&lt;br /&gt;Urheber der Spezifikationen können unseren Code auf die Spezifikation prüfen!&lt;br /&gt;&lt;br /&gt;Für einen PHB ist das natürlich kein Problem: geistige Eigentumsrechte und Geschäftsgeheimnisse müssen gewahrt werden. Code kann nicht einfach weitergegeben werden!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;... weil selbst große Unternehmen Python einsetzen.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Früher konnte man als PHB gegen Python argumentieren, indem man auf eine große Firma setzt: Wir sind eine Microsoft-Firma. Wir nehmen nur Software von großen Firmen (MS, Sun, Oracle, IBM, ...). Aber das geht heute leider nicht mehr. Selbst Sun und Microsoft setzen Python ein. Sogar in der Microsoft Knowledgebase wird Beispielcode in Python veröffentlicht.&lt;br /&gt;&lt;br /&gt;Aber zum Glück ist Python keine Sprache erster Klasse. Jeder weiß, dass die richtigen Sprachen für .NET nicht IronIrgendwas heißen. Wenn Python eine Sprache erster Klasse wäre, müßte es ja Python# genannt werden!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;... weil Python frei ist.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Und zwar nicht nur frei (wie in Freiheit) sondern sogar frei (wie in Freibier). Dadurch hat die eigene Abteilung weniger Ausgaben, ein kleineres Budget und (siehe oben) der eigene Parkplatz ist gefährdet!&lt;br /&gt;&lt;br /&gt;Ein erfahrener PHB weiß jedoch, wie wichtig es ist im Team zu arbeiten. Um in einem Team zu arbeiten, braucht man gemeinsame Ziele. Unser Ziel ist: Profit. Das Ziel eines kommerziellen Softwaretool-Herstellers ist: Profit. Das Ziel der Python-Hersteller ist aber nicht Profit. Daher können wir nur mit Werkzeugen eines kommerziellen Herstellers arbeiten.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;... weil Python's Entwicklungsprozess sich an der Leistung der Mitglieder orientiert.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Das ist natürlich Diskriminierung und verstößt gegen viele viele Gesetze, denn Personen, die keine Leistung erbringen haben nichts zu sagen!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Merke: Ein guter &lt;a href="http://en.wikipedia.org/wiki/Pointy_Haired_Boss"&gt;Pointy-Haired-Boss&lt;/a&gt; weiß, wie man Python vermeidet!&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-2533006779263051565?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/2533006779263051565/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=2533006779263051565' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/2533006779263051565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/2533006779263051565'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2008/07/discouraging-use-of-python-or-how-to.html' title='Discouraging the use of Python (or: How to keep the snakes off your plane)'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-7710135877266319208</id><published>2008-07-07T14:42:00.003+02:00</published><updated>2008-07-07T14:51:21.308+02:00</updated><title type='text'>ZEORaid-Talk</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;i&gt;&lt;small&gt;Ich habe auf der EuroPython einen Talk über den aktuellen Entwicklungsstand von ZEORaid, unserer Replikationsslösung für die ZODB, gegeben.&lt;/small&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Der Vortrag lief recht gut, mit etwa 50 anwesenden Zuhörern. Es gabe einige interessante Nachfragen, speziell zum Problem ZEORaid selbst hochverfügbar zu machen, ohne komplizierte Lösungen (heartbeat et al) hinzuzuziehen.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://amy.gocept.com/%7Ectheune/zeoraid.pdf"&gt;Die Folien sind ebenfalls verfügbar.&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-7710135877266319208?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/7710135877266319208/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=7710135877266319208' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/7710135877266319208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/7710135877266319208'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2008/07/zeoraid-talk.html' title='ZEORaid-Talk'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-6680240064725122450</id><published>2008-07-07T11:21:00.001+02:00</published><updated>2008-07-07T11:21:03.898+02:00</updated><title type='text'>py.test: rapid testing with minimal effort</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;i&gt;&lt;small&gt;Holger Krekel hat ein 1-stündiges Tutorial gegeben um die Verwendung von py.test zu erläutern.&lt;/small&gt;&lt;/i&gt;&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Übersicht&lt;/strong&gt;&lt;br/&gt;&lt;ul&gt;&lt;li&gt;py.test ist projektübergreifend und hält den Test-Tool-Code in einer eigenen Bibliothek&lt;br/&gt;&lt;/li&gt;&lt;li&gt;sammelt Python-Tests automatisch auf und führt sie aus&lt;/li&gt;&lt;li&gt;versucht die Boiler-Plate innerhalb eines Projekts klein zu halten&lt;/li&gt;&lt;li&gt;kann projektspezifisch erweitert werden&lt;/li&gt;&lt;li&gt;läuft auf Linux, Windows, OSX und unter Python 2.3-2.5&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Grundlagen&lt;/strong&gt;&lt;br/&gt;&lt;ul&gt;&lt;li&gt;Installation als Egg, stellt "py.test" als Executable zur Verfügung&lt;/li&gt;&lt;li&gt;Der "py"-Namensraum hat einen automatischen Lazy-Importer, der alles unterhalb von "py.*" importiert, so dass man nur "py" importieren braucht, der Rest kommt automatisch mit.&lt;/li&gt;&lt;li&gt;Tests werden über Konventionen automatisch gefunden (Klasse mit Namen "Test*" und Methoden mit dem Namen test_*) automatisch gefunden.&lt;/li&gt;&lt;li&gt;Automatisches Auffinden kann über "--collectonly" nachverfolgt werden&lt;br/&gt;um zu sehen wie py.test vorgeht und was es tatsächlich sieht und findet.&lt;/li&gt;&lt;li&gt;Assertions werden über Python's "assert"-Statement formuliert. Exceptions können über eine Helferfunktion "py.test.raises" mit dem "assert"-Statement kombiniert werden.&lt;/li&gt;&lt;li&gt;Fehlerhafte Werte bei einem Fehler werden getraced um zu zeigen wie sie berechnet wurden.&lt;/li&gt;&lt;li&gt;Generative Tests: wenn eine Testmethode ein Generator ist, kann sie Callables und deren Parameter yielden, die dann als eigentlicher Test ausgeführt werden.&lt;/li&gt;&lt;li&gt;stdout/stderr werden umgeleitet und nur im Fehlerfall ausgegeben&lt;/li&gt;&lt;li&gt;--pdb lädt einen pdb nach einem Fehler&lt;/li&gt;&lt;li&gt;-x beendet den Testlauf nach dem ersten Fehler&lt;/li&gt;&lt;li&gt;--looponfailing: führt die fehlgeschlagenen Tests automatisch neu aus, wenn Dateien, die zu diesen Tests gehören verändert werden&lt;/li&gt;&lt;li&gt;setup/teardown: setup_module, setup_class, setup_method, teardown_*&lt;/li&gt;&lt;li&gt;setup_method bekommt das Methodenobjekt reingereicht, setup_module erhält das Modul-Objekt, setup_class erhält die Klasse&lt;/li&gt;&lt;li&gt;doctests werden anhand der Extension ".txt" automatisch gefunden&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Erweiterbarkeit&lt;/strong&gt;&lt;br/&gt;&lt;ul&gt;&lt;li&gt;py.test sucht nach "conftest.py"-Dateien, die die Konfiguration von py.test beeinflussen.&lt;/li&gt;&lt;li&gt;Mehrere conftest.py-Dateien können über Verzeichnisebenen miteinander kombiniert werden.&lt;/li&gt;&lt;li&gt;Diverse Elemente (Session, Collection, Module, ...) können beerbt werden, um eigene Funktionalität unterzubringen.&lt;/li&gt;&lt;li&gt;Dazu werden via "conftest.py" dynamisch die konkreten Klassen für Session, Collection, Module, ... nachgeschlagen, die unterhalb eines Verzeichnisses verwendet werden sollen.&lt;/li&gt;&lt;li&gt;Fehlerberichte können in HTMl generiert werden. Dies kann ältere Testläufe beinhalten, so dass man den historischen Verlauf einsehen kann.&lt;/li&gt;&lt;li&gt;Weitere Plugins für Prolog-Tests, JavaScript-Tests (via SpiderMonkey), verteilte Tests um Tests auf anderen Maschinen (mit ggfs. anderen Plattformen) auszuführen, Integration mit klassischen UnitTest&lt;/li&gt;&lt;li&gt;Reporting kann man momentan nicht (einfach) anpassen&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Fragen&lt;/strong&gt;&lt;br/&gt;&lt;ul&gt;&lt;li&gt;Ist die py-Import-Magic kompatibel mit py2exe? Antwort: Unbekannt.&lt;/li&gt;&lt;li&gt;Wie schwer wird es sein py.test auf Python 3k auszuführen? Antwort: Unbekannt&lt;/li&gt;&lt;li&gt;Parallele Ausführung: über verteilte Tests. Können sowohl lokal als auch remote verteilt werden inkl. Multi-CPU-Support.&lt;/li&gt;&lt;li&gt;Gruppierung von tests nach Setup ala Layer: Gibt es momentan nichts.&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-6680240064725122450?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/6680240064725122450/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=6680240064725122450' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/6680240064725122450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/6680240064725122450'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2008/07/pytest-rapid-testing-with-minimal.html' title='py.test: rapid testing with minimal effort'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-7820389187792914947</id><published>2008-07-07T09:37:00.001+02:00</published><updated>2008-07-07T09:37:29.222+02:00</updated><title type='text'>ReportLab Paragraphs Reloaded</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;small&gt;&lt;i&gt;Dinu Gherman gab einen Vortrag über &lt;a href='http://www.reportlab.org'&gt;ReportLab&lt;/a&gt;. Dabei ist er speziell auf die Implementation von Paragraphen, deren Probleme und einer Reimplementation eingegangen.&lt;/i&gt;&lt;/small&gt;&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;ReportLab-Übersicht&lt;/strong&gt;&lt;br/&gt;&lt;ol&gt;&lt;li&gt;Canvas, eine Zeichenfläche, die in etwa einer Seite entspricht. Kann auch als Bilddatei exportiert werden.&lt;/li&gt;&lt;li&gt;Platypus, "Page LAyout TYPography Using Scripts", bietet verschiedene Objekte (Frame, PageTemplate, DocumentTemplate, Content, Flowables) um Typographie und Inhalt einer oder mehrer Seiten zu beschreiben um daraus ein PDF zu erzeugen.&lt;/li&gt;&lt;li&gt;RML, "ReportLab Markup Language", ein Aufsatz für Platypus, der XML in Platypus-Anweisungen übersetzt (kommerziell, eine freie Drittanbieter-Implementation (z3c.rml) ist aber auch verfügbar)&lt;/li&gt;&lt;/ol&gt;Paragraphen sind Flowables aus der Platypus-Bibliothek, deren Hauptaufgabe die Berechnung von Zeilenumbrüchen ist. Außerdem wenden Paragraphen verschiedene Stile für Schriften, Einzüge und Anstriche an. Innerhalb eines Paragraphen können XML-Tags verwendet werden, um einige Stile auf Wortebene anzuwenden.&lt;br/&gt;&lt;br/&gt;Paragraphen können momentan nicht:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;eingebettete Bilder (im ReportLab SVN inzwischen doch)&lt;/li&gt;&lt;li&gt;Silbentrennung&lt;/li&gt;&lt;li&gt;Kerning&lt;/li&gt;&lt;/ul&gt;Außerdem ist der Code für Paragraphen nur sehr schwer verständlich und nicht erweiterbar. Leider ist das Hauptaugenmerk der Entwicklung bisher auf Geschwindigkeit gelegt worden.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;"Paragraphs Reloaded"&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;Ein neues Flowable, genauer: eine Familie von Paragraphen-Klassen, die abgeleitet werden können (und sollen).&lt;br/&gt;&lt;br/&gt;Der MinimalParagraph ist ausschließlich für die Berechnung von Zeilenumbrüchen und wenigen Paragraph-Stilen da.&lt;br/&gt;&lt;br/&gt;Paragraphen bieten ein Event-Schema, an dem eigener Code in das Layouting eingreifen kann. Beispielsweise an Wort- oder Zeilengrenzen.&lt;br/&gt;&lt;br/&gt;Beispiele für Erweiterbarkeit, die Dinu bereits implementiert hat: einzelne Wörter markieren, Silbentrennung, eingebettete Bitmap- und Vektorbilder, Zeilennummerierung.&lt;br/&gt;&lt;br/&gt;Beim Vergleich der Code-Komplexität der Original-Implementation fällt auf, dass der bisherige Paraph etwa 1400 Codezeilen hat, während die neue Minimalimplementation mit etwa 200 Zeilen auskommt.&lt;br/&gt;&lt;br/&gt;Im Geschwindigkeitsvergleich hat die bisherige Implementation die Nase vorn. Der neue Code braucht etwa 2-5mal länger um einen Vergleichbaren Paragraphen zu zeichnen. Nach Dinus Erfahrung ist das aber immer noch schnell genug für die meisten Aufgaben.&lt;br/&gt;&lt;br/&gt;In Zukunft will Dinu weitere Paragraphen-Attribute implementieren, sowie Kerning, eingebettetes XML, generische Callbacks und eventuell RTL-Unterstützung.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Fragen&lt;/strong&gt;&lt;br/&gt;&lt;ul&gt;&lt;li&gt;Frage nach der Verwendung des TeX-Zeilenumbruch-Algorithmus: nicht berücksichtigt. Andrew Kuchling hatte ihn mal teilweise implementiert, ist aber extrem langsam gewesen.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-7820389187792914947?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/7820389187792914947/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=7820389187792914947' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/7820389187792914947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/7820389187792914947'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2008/07/reportlab-paragraphs-reloaded.html' title='ReportLab Paragraphs Reloaded'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-4386158227217345912</id><published>2008-07-07T08:50:00.001+02:00</published><updated>2008-07-07T08:50:27.815+02:00</updated><title type='text'>EuroPython 2008</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Die &lt;a href='http://www.europython.org'&gt;EP 2008&lt;/a&gt; beginnt heute. Eine gute Neuerung des Hotels ist die freie Verfügbarkeit von WLAN auf den Zimmern, nicht nur im Konferenzbereich. Die Registrierung lief bedeutend einfacher als letztes Jahr: zur Anmeldung gehen, eigenes Namensschild und Konferenztüte nehmen, fertig.&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-4386158227217345912?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/4386158227217345912/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=4386158227217345912' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/4386158227217345912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/4386158227217345912'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2008/07/europython-2008.html' title='EuroPython 2008'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-7496816990273313375</id><published>2008-06-27T08:36:00.001+02:00</published><updated>2008-06-27T08:36:00.851+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ZODB'/><title type='text'>Neue Blob-Verzeichnisstrukturen</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Die ZODB unterstützt seit einiger Zeit große Dateien über den eigenen Datentyp "Blob". Bisher wurde für jeden Blob ein Verzeichnis angelegt, in dem sämtliche Revisionen des Blobs gespeichert wurden.&lt;br/&gt;&lt;br/&gt;Eine Installation brachte dies an die Grenze, da als Dateisystem ext3 benutzt wurde, und dort die Anzahl der Einträge je Verzeichnis auf 32k begrenzt ist. Da dies auch in anderen Dateisystemen der Fall ist habe ich das Blob-Verzeichnis etwas stärker strukturiert: 8 Ebenen von Verzeichnissen, abgebildet über die Little-Endian-Repräsentation der OID. Das garantiert maximal 256 Einträge je Verzeichnis und balanciert den Baum relativ einfach aus. Die Implementation ist abwärtskompatibel für alle, die bereits Datenbanken im alten Schema haben.&lt;br/&gt;&lt;br/&gt;Momentan lebt der Code noch auf einer Branch und ist für &lt;a href='http://svn.zope.org/ZODB/branches/ctheune-bushy-directory'&gt;ZODB-trunk&lt;/a&gt; und &lt;a href='http://svn.zope.org/ZODB/branches/ctheune-bushy-directory-3.8'&gt;ZODB 3.8&lt;/a&gt; verfügbar.&lt;br/&gt;&lt;br/&gt;Eine Einschränkung der Branches ist momentan, dass die Datenbankgröße nur ohne den Platz, den Blobs einnehmen berechnet werden kann, da getSize von ZEO in jeder Transaktion einmal aufgerufen wird, und bei der neuen Struktur sehr langsam wird.&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-7496816990273313375?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/7496816990273313375/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=7496816990273313375' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/7496816990273313375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/7496816990273313375'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2008/06/neue-blob-verzeichnisstrukturen_27.html' title='Neue Blob-Verzeichnisstrukturen'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-2951461847158255812</id><published>2008-05-22T08:45:00.006+02:00</published><updated>2008-05-22T08:55:25.044+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zope 3'/><title type='text'>Pakete von Drittanbietern konfigurieren</title><content type='html'>Ich hatte gestern mit &lt;a href="http://www.sw83.de/"&gt;Sebastian&lt;/a&gt; das Problem aus einem Python-Paket für Zope 3 (gocept.country) eine ZCML-Konfiguration (konkret: i18n:registerTranslations) relativ zu einem anderen Python-Paket (pycountry) zu spezifizieren.&lt;br /&gt;&lt;br /&gt;Leider erlaubt &lt;font style="font-style: italic;"&gt;i18n:registerTranslations&lt;/font&gt; nur eine relative Pfadangabe zum aktuell konfigurierten Paket. Glücklicherweise gibt es einen generischen Mechanismus in ZCML um Konfigurationsangaben im Kontext beliebiger Python-Pakete auszuführen: das &lt;font style="font-style: italic;"&gt;configure&lt;/font&gt;-Statement.&lt;br /&gt;&lt;br /&gt;&lt;font style="font-style: italic;"&gt;Configure&lt;/font&gt;-Statements können verschachtelt werden und erlauben die freie Angabe eines Pakets, das für alle darin eingebetteten Anweisungen als Kontext benutzt wird. Das ganze sieht dann folgendermaßen aus:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;configure package="pycountry"&amp;gt;&lt;br /&gt;  &amp;lt;i18n:registertranslations directory="locales"&amp;gt;&lt;br /&gt;&amp;lt;/i18n:registertranslations&amp;gt;&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-2951461847158255812?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/2951461847158255812/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=2951461847158255812' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/2951461847158255812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/2951461847158255812'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2008/05/pakete-von-drittanbietern-konfigurieren.html' title='Pakete von Drittanbietern konfigurieren'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-15720959020011924</id><published>2008-05-02T17:42:00.002+02:00</published><updated>2008-05-02T17:46:30.254+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ZODB'/><title type='text'>ZEORaid in Beta</title><content type='html'>Seit Mittwoch gibt es ZEORaid 1.0b1, das wir inzwischen auf einem internen Produktionsserver testweise einsetzen. Die initiale Replikation der 1.1 GB grossen ZODB hat etwas weniger als 15 Minuten gedauert und resultiert normalerweise in Byte-genauen Kopien der originalen Datenbank.&lt;br /&gt;&lt;br /&gt;Setzt man zwei identisch konfigurierte ZEORaid-Server auf, kann man auch ZEORaid selbst als einzelnen Ausfallpunkt ausschließen, wobei ein paar operative Einschränkungen zu beachten sind.&lt;br /&gt;&lt;br /&gt;ZEORaid unterstützt Zope ab Version 2.8, Blobs und alle anderen ZODB-Funktionen ausser "Versions".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-15720959020011924?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/15720959020011924/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=15720959020011924' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/15720959020011924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/15720959020011924'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2008/05/zeoraid-in-beta.html' title='ZEORaid in Beta'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-8357405633267452996</id><published>2008-03-14T20:47:00.004+01:00</published><updated>2008-03-14T21:13:39.913+01:00</updated><title type='text'>PyCon 2008</title><content type='html'>&lt;p&gt;PyCon 2008 (diesmal in Chicago) läuft seit einigen Stunden. &lt;a href="http://amy.gocept.com/%7Ectheune/photos/pycon2008/"&gt;Fotos gibt es ebenfalls.&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://amy.gocept.com/%7Ectheune/photos/pycon2008/113-IMG_1291.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px;" src="http://amy.gocept.com/%7Ectheune/photos/pycon2008/113-IMG_1291.JPG" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-8357405633267452996?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/8357405633267452996/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=8357405633267452996' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/8357405633267452996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/8357405633267452996'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2008/03/pycon-2008.html' title='PyCon 2008'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-2353937016514956743</id><published>2008-02-15T08:51:00.004+01:00</published><updated>2008-02-15T09:11:26.570+01:00</updated><title type='text'>psycopg, segfaults, Valgrind</title><content type='html'>Diese Woche habe ich einen Segfault in psycopg behoben, der bei einem Zope-Server häufig für Abstürze sorgte. Das interessante: psycopg hat immer wenn ein Client-Encoding angegeben wurde, das keine Binde- oder Unterstriche enthalten hat, ein Byte zu wenig alloziiert. Genaue Fehlerbeschreibung und Patch gibts im &lt;a href="http://www.initd.org/tracker/psycopg/ticket/211#comment:3"&gt;Trac&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Schlussendlich hat mir Valgrind sehr geholfen das Problem zu analysieren. Die Aufrufzeile um einen Zope-Server, der im Vordergrund läuft zu überwachen ist:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;valgrind --leak-check=yes --trace-children=yes  --suppressions=valgrind-python.supp bin/zopectl fg&lt;/code&gt;&lt;/blockquote&gt;Die Suppressions-Datei wird im Python-Source-Code mitgeliefert und sorgt dafür, dass Valgrind sich nicht von Python's Memory-Manager für kleine Objekte verwirren lässt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-2353937016514956743?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/2353937016514956743/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=2353937016514956743' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/2353937016514956743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/2353937016514956743'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2008/02/psycopg-segfaults-valgrind.html' title='psycopg, segfaults, Valgrind'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-7150882868078565182</id><published>2008-02-06T08:25:00.000+01:00</published><updated>2008-02-06T08:31:38.352+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='Zope 3'/><title type='text'>zc.resourcelibrary und virtual hosting</title><content type='html'>zc.resourcelibrary ist ein exzellentes Werkzeug um automatisch Pakete von Ressourcen (CSS, JS, Bilder) gemeinsam zu registrieren und in eine HTML-Seite (via PageTemplate oder View-Klasse) einzubinden. Dabei werden sogar Abhängigkeiten (z.B. "Meine JS-Files benötigen MochiKit") berücksichtigt.&lt;br /&gt;&lt;br /&gt;Da die URLs (CSS verweist auf Bilder) in einer Resource-Library statisch sind, muss man ein klein wenig aufpassen, wie man "Virtual-Hosting-kompatibel" bleibt.&lt;br /&gt;&lt;br /&gt;Der kleine Trick besteht darin, alle URLs in CSS-Dateien relativ anzugeben. Dadurch wird die (automatisch berechnete) Basis-URL der Resource-Library ebenfalls auf die statisch enthaltenen Verweise angewandt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-7150882868078565182?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/7150882868078565182/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=7150882868078565182' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/7150882868078565182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/7150882868078565182'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2008/02/zcresourcelibrary-und-virtual-hosting.html' title='zc.resourcelibrary und virtual hosting'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-8996302524767772662</id><published>2008-01-24T12:49:00.001+01:00</published><updated>2008-01-24T14:09:12.030+01:00</updated><title type='text'>Zope ist nicht simpel - und das ist auch gut so</title><content type='html'>Dr. Dewar und Dr. Schonberg haben in zwei Artikeln dargestellt, warum Softwareentwicklung mehr ist als "einfach mal was zusammenzustöpseln":&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.stsc.hill.af.mil/CrossTalk/2008/01/0801DewarSchonberg.html"&gt;&lt;span class="ctArticleTitle"&gt;Computer Science Education: Where Are the Software Engineers of Tomorrow?&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://itmanagement.earthweb.com/career/article.php/3722876"&gt;Who Killed the Software Engineer? (Hint: It Happened in College)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Beide Artikel bestärken meinen Eindruck in Bezug auf die handwerklichen Fähigkeiten, die ich von Software-Entwicklern erwarte und wie diese von Hochschulen durchgängig enttäuscht werden.&lt;br /&gt;&lt;br /&gt;Auch die typische Argumentation gegen Zope, dass es nicht "einfach sei", halte ich nicht für ein Problem, sondern für einen Vorteil. Nur weil es nicht simpel ist können wir komplexe und anspruchsvolle Probleme lösen und mehr tun als "zufällig die richtigen Komponenten raussuchen".&lt;br /&gt;&lt;br /&gt;Ich möchte damit nicht für sinnnlos komplizierte Systeme argumentieren. Einfachheit darf aber nicht mit Simplizismus verwechselt werden.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-8996302524767772662?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/8996302524767772662/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=8996302524767772662' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/8996302524767772662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/8996302524767772662'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2008/01/zope-ist-nicht-simpel-und-das-ist-auch.html' title='Zope ist nicht simpel - und das ist auch gut so'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-2925658018210664875</id><published>2007-12-20T15:59:00.000+01:00</published><updated>2007-12-20T16:04:32.872+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zope 3'/><category scheme='http://www.blogger.com/atom/ns#' term='Fallstricke'/><title type='text'>Datenbank-Generationen: Am besten immer initialisieren</title><content type='html'>Wir merken uns: wenn man in der Zukunft eventuell Datenbankgenerationen in seiner Zope-3-Anwendung/Bibliothek/... benutzen will, dann sofort eine leere Generation anlegen.&lt;br /&gt;&lt;br /&gt;Der Grund: Wenn die Generations-Infrastruktur noch nicht initialisiert ist, dann wird, wenn vorhanden, immer die `install`-Methode ausgefuehrt. Diese versetzt die Datenbank aber direkt in die aktuellste Generation.&lt;br /&gt;&lt;br /&gt;Hat man keine `install`-Methode und eine neue Datenbank wird die Datenbank ohne irgendetwas zu tun sofort in die aktuellste Generation gehievt.&lt;br /&gt;&lt;br /&gt;Im optimalen Fall beginnt man also immer bei 0. Beginnt man aber bei `None`, dann muss man den ersten Migrationsschritt immer noch in der Installation abbilden, was man eigentlich nicht sollte.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-2925658018210664875?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/2925658018210664875/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=2925658018210664875' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/2925658018210664875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/2925658018210664875'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2007/12/datenbank-generationen-am-besten-immer.html' title='Datenbank-Generationen: Am besten immer initialisieren'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-7343995074950461403</id><published>2007-11-08T14:50:00.000+01:00</published><updated>2007-11-08T14:54:15.474+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zope 3'/><title type='text'>Security-Target für Zope 3</title><content type='html'>Die Common-Criteria-Zertifizierung von Zope 3 geht wieder voran und wir haben einen konkreten Zeitplan, der die Arbeit bis zur Zertifizierung abdeckt. Als Zertifizierungstermin zielen wir März 2008 an.&lt;br /&gt;&lt;br /&gt;Als ersten Schritt habe ich heute eine überarbeitete Version des "&lt;a href="http://amy.gocept.com/%7Ectheune/SecurityTarget.pdf"&gt;Security Target" (ST)&lt;/a&gt; zum TÜV geschickt und bin mal gespannt ob wir mit unseren Überarbeitungen jetzt eine finale Version produziert haben. Im Dezember wird es dann mit den anderen Dokumenten wie im ST beschrieben weitergehen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-7343995074950461403?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/7343995074950461403/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=7343995074950461403' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/7343995074950461403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/7343995074950461403'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2007/11/security-target-fr-zope-3.html' title='Security-Target für Zope 3'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-7793293416579358912</id><published>2007-10-26T14:08:00.000+02:00</published><updated>2007-10-26T14:27:11.020+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Marketing'/><title type='text'>Buzzword-Compliance</title><content type='html'>Mir ist diese Woche bei technorati ein Blog-Eintrag aufgefallen, der einen Wikipedia-Artikel zitierte und das Beispiel des Buzzword-Compliance-Artikels aufführte. Ich will das Beispiel hier nicht selbst wiedergeben, habe aber endlich mal den Artikel bei der Wikipedia aufgeräumt. Die alte Version steht &lt;a href="http://de.wikipedia.org/w/index.php?title=Buzzword_compliance&amp;amp;oldid=37925536"&gt;hier&lt;/a&gt;, und ich wundere mich immer noch wer das mal formuliert hat ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-7793293416579358912?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/7793293416579358912/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=7793293416579358912' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/7793293416579358912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/7793293416579358912'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2007/10/buzzword-compliance.html' title='Buzzword-Compliance'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-1440258118612957882</id><published>2007-10-16T09:52:00.000+02:00</published><updated>2007-10-16T09:54:32.196+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Marketing'/><title type='text'>Zope auf der Systems 2007</title><content type='html'>Die DZUG wird auf einem Gemeinschaftsstand mit gocept und syslab Zope auf der Systems in München vertreten. Neben den Informationsständen gibt es auch 3 Vorträge im Programm.&lt;br /&gt;&lt;br /&gt;Details gibt es auf &lt;a href="http://www.zope.de/redaktion/dzug/termine/dzug-e-v-auf-der-systems/"&gt;zope.de&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-1440258118612957882?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/1440258118612957882/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=1440258118612957882' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/1440258118612957882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/1440258118612957882'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2007/10/zope-auf-der-systems-2007.html' title='Zope auf der Systems 2007'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-5126010740124906148</id><published>2007-09-10T10:07:00.000+02:00</published><updated>2007-09-10T10:27:41.052+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zope 3'/><title type='text'>Web-Formulare mit Zope 3</title><content type='html'>&lt;div class="plain"&gt;Wir bei gocept bereiten uns gerade auf einen Sprint vor. In diesem Sprint wollen wir die Probleme und Erfahrungen der letzten Projekte aufarbeiten, die sich um Web-Formulare drehen.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pypi.python.org/pypi/zope.formlib/"&gt;zope.formlib&lt;/a&gt; ist momentan das Standardpaket mit dem wir arbeiten und bietet eine prinzipiell solide Grundlage. Vor einer Weile ist &lt;a href="http://pypi.python.org/pypi/z3c.form"&gt;z3c.form&lt;/a&gt; erschienen, was einige Probleme der formlib zu beseitigen scheint. In der Vorbereitung zum Sprint evaluieren wir z3c.form als Grundlage unserer weiteren Bemühungen; wir wolle auf jeden Fall ein existierendes Projekt weiterentwickeln und nicht noch eine Baustelle aufreißen. Neben Code werden wir als Ergebnis auch die Dokumentation gängiger Patterns anstreben.&lt;br /&gt;&lt;br /&gt;Hier eine Liste der Probleme die uns momentan umtreiben:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Interface-Invariants validieren nur gegen Felder, die der Benutzer gerade bearbeitet hat&lt;/span&gt;&lt;br /&gt;Der Kontext und Werte von Feldern die im Formular nicht enthalten waren stehen nicht zur Verfügung.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Werte nach der Validierung aber vorm Schreiben auf Attribute zu verarbeiten ist nicht möglich (z.B. um Passwörter zu codieren)&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Im gleichen Zusammenhang: Validatoren scheinen etwas merkwürdig zu sein da sie die Daten modifizieren können (sollen).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Properties können helfen, sind aber schwierig&lt;/li&gt;&lt;li&gt;Evt. müsste man Feldern einen Mutator mitgeben&lt;/li&gt;&lt;li&gt;Noch eine Option: getrennte Interfaces mit Adapter bereitstellen um solche Werte ins Schema einfliessen zu lassen und auf dem Adapter eine Property definieren&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Constraint-Validierungen haben ein komisches Interface&lt;/span&gt;&lt;ul&gt;&lt;li&gt;True oder Exception&lt;/li&gt;&lt;li&gt;Fehlermeldung steht auf der Exception&lt;/li&gt;&lt;li&gt;Einige Constraints melden nur "Value too long" ohne dem Benutzer ausreichend Information zu geben&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Problem liegt in zope.app.form.interfaces.IWidgetInputError und der Implementierung in der zugehörigen Klasse.&lt;/li&gt;&lt;li&gt;Diese Implementierung hält nicht was sie verspricht und das Interface widerspricht der Benutzung in den Tests bzw. im View.&lt;/li&gt;&lt;li&gt;Aufgabe: WidgetInputError sauber machen, so dass über die doc()-Methode eine i18n-MessageID zurückgeliefert wird.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;Layout-Engine&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Eine getrennte Komponente um Formulare im Stil unseres Produktes "Jucon" zu layouten/generieren&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li style="font-weight: bold;"&gt;Widget-Definitionen&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Interfaces der Widgets aus zope.app.form sind nur intern und via Subclassing gemacht&lt;/li&gt;&lt;li&gt;Wie verhält sich z3c.form in dieser Hinsicht?&lt;/li&gt;&lt;li&gt;Anscheinend sind alle Widgets neu definiert.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li style="font-weight: bold;"&gt;Formulare mit ergänzenden Inhalten sind unsauber/unflexibel&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Z.B. beim Einbinden von Suchergebnissen&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Hier können Content-Provider oder Viewlets helfen.&lt;/li&gt;&lt;li&gt;Viewlets sind aber aufwändig zu deklarieren.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Abhängig definierte Felder&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Das typische Master-Slave-Szenario: Wert in Feld A auswählen so dass Feld B mit davon abhängigen Optionen gefüllt wird, natürlich via JavaScript&lt;br /&gt;&lt;/li&gt;&lt;li&gt;z3c.form und z3c.formjs scheint dafür noch keine fertige Lösung zu haben&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-5126010740124906148?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/5126010740124906148/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=5126010740124906148' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/5126010740124906148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/5126010740124906148'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2007/09/web-formulare-mit-zope-3.html' title='Web-Formulare mit Zope 3'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-1174072298529115253</id><published>2007-08-31T07:44:00.001+02:00</published><updated>2007-08-31T07:49:41.890+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zope 3'/><title type='text'>Stabilisierung von Zope 3.4</title><content type='html'>Zope 3.4 befindet sich seit einiger Zeit in der Stabilisierungsphase, wobei unser halbjährlicher Zyklus für den "Big Tree" mal wieder nicht eingehalten werden kann.&lt;br /&gt;&lt;br /&gt;Mit Zope 3.4 stehen alle Zope-Pakete jetzt als Python-Eggs zur Verfügung, so dass man sich für seine Anwendung genau die Elemente aussuchen kann, die man benötigt. Zope wurde in etwa 180 kleine Pakete zerteilt, die nun jeweils ihren eigenen kleinen Release-Zyklus erhalten. Dadurch kann bei Egg-basierter Entwicklung auf Fehler und neue Funktionen deutlich flexibler reagiert werden. Ich finde, dass dies ein exzellenter Schritt ist um die Flexibilität von Zope 3 auf einer weiteren Ebene zugänglich zu machen.&lt;br /&gt;&lt;br /&gt;Bevor demnächst die Zope 3.4 Release Candidate veröffentlicht werden kann gibt es eine &lt;a href="http://wiki.zope.org/zope3/StabilizeEggPackages"&gt;TODO-Liste&lt;/a&gt;  die alle noch als stabil zu releasenden Eggs auflistet. Mit diesen Eggs wird dann das klassische Release erzeugt. Diskussion zur Stabilisierung findet auf zope3-dev, ungefähr &lt;a href="http://mail.zope.org/pipermail/zope3-dev/2007-August/023455.html"&gt;hier &lt;/a&gt;statt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-1174072298529115253?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/1174072298529115253/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=1174072298529115253' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/1174072298529115253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/1174072298529115253'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2007/08/stabilisierung-von-zope-34.html' title='Stabilisierung von Zope 3.4'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-4575161966352402340</id><published>2007-08-15T14:25:00.000+02:00</published><updated>2007-08-31T07:43:47.107+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zope 3'/><title type='text'>Abhängigkeiten der Zope-Pakete</title><content type='html'>In unserem wöchentlichen Workshop bei gocept befassen wir uns seit einer Weile damit die Abhängigkeiten der offiziellen Zope-Pakete aufzuräumen. Einige der Pakete im zope.*-Namensraum haben beispielsweise Abhängigkeiten nach zope.app.*. Diese Abhängigkeiten erschweren die Wiederverwendbarkeit solcher Pakete außerhalb des Zope-Applikationsservers und sind daher unerwünscht.&lt;br /&gt;&lt;br /&gt;Wir haben inzwischen alle Pakete analysiert und den Zustand im &lt;a href="http://wiki.zope.org/zope3/EggificationOfZopePackages"&gt;Zope-3-Wiki&lt;/a&gt; dokumentiert. Für Pakete mit ungünstigen Abhängigkeiten suchen wir jetzt Möglichkeiten diese aufzulösen.&lt;br /&gt;&lt;br /&gt;Für &lt;span style="font-style: italic;"&gt;zope.annotation&lt;/span&gt; und &lt;span style="font-style: italic;"&gt;zope.location&lt;/span&gt; haben wir bereits Lösungen erarbeitet, die momentan &lt;a href="http://mail.zope.org/pipermail/zope3-dev/2007-August/023177.html"&gt;hier&lt;/a&gt; und &lt;a href="http://mail.zope.org/pipermail/zope3-dev/2007-August/023178.html"&gt;hier&lt;/a&gt; diskutiert werden. In den nächsten Wochen wird dieses Thema dann hoffentlich für die Pakete des zope.*-Namensraums erledigt.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(204, 0, 0);"&gt;Update (31.08.2007):&lt;br /&gt;&lt;/span&gt;Inzwischen sind nur noch wenige Pakete mit akutem Handlungsbedarf übrig: zope.traversing, zope.viewlet, zope.sendmail haben immernoch Abhängigkeiten nach zope.app.* - viewlet und sendmail werden noch diskutiert.&lt;br /&gt;&lt;br /&gt;Weiterhin gibt es noch einen ziemlichen Ausnahmefall: zope.formlib - dort gibt es  einige systematische Abhängigkeiten nach zope.app.* die nicht ohne weiteres aufgelöst werden können.&lt;br /&gt;&lt;br /&gt;Im Verlauf unserer Bemühungen ist noch einmal das Thema hochgekommen ob die strikte Trennung zope.*/zope.app.* wirklich gewollt ist:&lt;br /&gt;&lt;a href="http://mail.zope.org/pipermail/zope3-dev/2007-August/023349.html"&gt;http://mail.zope.org/pipermail/zope3-dev/2007-August/023349.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mail.zope.org/pipermail/zope3-dev/2007-August/023349.html"&gt;&lt;/a&gt;&lt;span style="font-style: italic; color: rgb(204, 0, 0);"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-4575161966352402340?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/4575161966352402340/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=4575161966352402340' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/4575161966352402340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/4575161966352402340'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2007/08/abhngigkeiten-der-zope-pakete.html' title='Abhängigkeiten der Zope-Pakete'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8450886134675526767.post-4775279233474279965</id><published>2007-08-12T00:04:00.000+02:00</published><updated>2007-08-12T00:17:19.153+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Organisatorisches'/><title type='text'>Mein Zope-Blog</title><content type='html'>Heute traf sich der Vorstand der Deutschsprachigen Zope User Group (DZUG e.V.). Das Protokoll der Sitzung wird in Kürze auf &lt;a href="http://www.dzug.org/verein/protokolle"&gt;dzug.org&lt;/a&gt; verfügbar sein.&lt;br /&gt;&lt;br /&gt;Unter anderem möchten wir die Vorgänge der Zope-Entwicklung und der Organisationsarbeit der Zope  Foundation und des DZUG e.V. auch Zope-Anwendern nahebringen, die nicht alle E-Mail-Listen im Detail verfolgen können.&lt;br /&gt;&lt;br /&gt;Wir hoffen mehr Personen zu motivieren Ihre Wahrnehmung mit anderen in Form eines deutschsprachigen Blogs zu teilen. Diese Blogs werden wir auf &lt;a href="http://www.zope.de"&gt;zope.de&lt;/a&gt; aggregieren.&lt;br /&gt;&lt;br /&gt;Ich werde versuchen meinen Teil in diesem Blog beizutragen und über die Entwicklung von und mit Zope berichten. Die Arbeit der Foundation und des DZUG werde ich ebenfalls berücksichtigen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8450886134675526767-4775279233474279965?l=theunionzope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theunionzope.blogspot.com/feeds/4775279233474279965/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8450886134675526767&amp;postID=4775279233474279965' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/4775279233474279965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8450886134675526767/posts/default/4775279233474279965'/><link rel='alternate' type='text/html' href='http://theunionzope.blogspot.com/2007/08/mein-zope-blog.html' title='Mein Zope-Blog'/><author><name>Christian Theune</name><uri>http://www.blogger.com/profile/15953221466525512943</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
