SucheBlog abonnierenVerwaltung des BlogsKategorienKontaktMarkus Brückner |
Tuesday, 18. November 2008Pylons und Elixir + Session-HandlingWer mal entspannt Webapplikationen entwickeln will/muss, dem sei Pylons ans Herz gelegt. Nettes Framework, noch einige kleinere Ecken, aber schonmal sehr angenehm zum Entwickeln geeignet. Meist liegt hinter einer Webapplikation ja ein entsprechendes Datenmodell in Form einer Datenbank. Um die bequem ansteuern zu können (SQL von Hand zu coden ist mittlerweile definitiv nicht mehr schön) bringt Pylons eine Integration für SQLAlchemy mit. Nun ist SQLAlchemy flexibel und mächtig, dafür aber manchmal etwas komplexer als nötig. Für viele Anwendungsfälle reichen die Möglichkeiten, die Elixir mitbringt (Elixir ist eine auf SQLAlchemy aufsetzende Bibliothek, die einen deklarativen Stil zur Erstellung des Datenmodells ermöglicht). Mit diesem Trio kann man schonmal recht viel Interessantes tun. Blöd nur, wenn man ein wenig faul bei der Einbindung der verschiedenen Module ist. Dann kann es nämlich dazu kommen, dass plötzlich folgende Fehlermeldung auftritt, wenn man versucht was in der Nutzersession im Pylons zu speichern: TypeError: 'ScopedSession' object is unsubscriptable Der Datentyp deutet es an: das session-Objekt von Pylons ist unter diesem Namen nicht verfügbar. Der Fehler ist simpel: im Datenmodell der Applikation stand mal from elixir import * (um Schreibarbeit bei den Elixir-Datentypen zu sparen). Im Controller wiederum wurde das Datenmodell mit from app.model import * importiert. Tja... Elixir definiert dummerweise ein eigenes session-Objekt, welches durch diese Import-Kette in den Namensraum der Applikation gerät und dort dann das eigentliche Pylons-Objekt überschreibt. Als Lösung bleiben drei Möglichkeiten: man kann den Import im Datenmodell in import elixir ändern und allen Datentypen ein elixir. voransetzen, die benötigten Elixirtypen mittels from elixir import Field, .... im Datenmodell importieren (und dabei keinesfalls session mit reinnehmen) oder in der Applikation das Datenmodell mittels import app.model as m und dann jedem Zugriff auf Elemente des Modells ein m. voranstellen. Danach hat man wieder wie gewünscht Zugriff auf seine Session und kann Daten darin speichern und daraus lesen. Friday, 7. November 2008KombinationsessenIrgendwie sollte ich mal wieder was technisches schreiben, bevor das hier komplett zu nem Food-Blog verkommt. Aber da grad nix gravierendes technische anliegt geht's halt erstmal wieder um Essen... Mir wurde ein Buch geliehen. Jamie Oliver - "Kochen für Freunde". So verrückt ich das finde, dass ausgerechnet ein Engländer der Welt das Kochen beibringt: der Kerl ist gut. Das Buch auch. Jedenfalls fühlte ich mich spontan inspiriert, heute selbst Nudeln zu bauen. Zutaten sind relativ simpel: 250g Mehl (Typ 405), 250g Hartweizengries, 8 Eigelb, 3 Eier. Teig kneten, kühlen, ausrollen, schneiden, fertig. Funktioniert als Bandnudeln, Lasagneplatten etc.pp. Soweit so gut. Sieht, wenn fertig, so aus: ![]() 2 Meter Nudeln Ja, wir mussten spontan noch eine Stange in der Küche einziehen um die Nudeln aufhängen zu können. Wer bei dem Rezept aufgepasst hat, dem fällt was auf: es bleiben 8 Eiweiß übrig. Das ist ne Menge. Was macht man nun damit? Wegschmeißen ist irgendwie doof, also muss noch was damit gemacht werden. Das naheliegendste: Eiweiß, Zucker, etwas Salz und Zitronensaft und fertig sind die Baiser. Ok, wenn man sich doof anstellt (haben wir) und nicht mit ner Spritztüte umgehen kann (können wir nicht), dann isses ne Heidensauerei. Spaß macht's trotzdem. ![]() Küken und Baiserrohmasse ![]() Fertisch... Keine Reste übrig, beide Sachen hoffentlich lecker. Morgen oder so. Sunday, 2. November 2008ErntezeitEigentlich wollten wir ja nur ein wenig Wandern gehen. Trainieren für Neuseeland und so. Ganz gemütlich ein wenig durch die Ausläufer des Thüringer Wald laufen (sehr schicke Ausläufer übrigens). Dann kamen aber so Sträuche dazwischen. Sträucher voll Hagebutten. Da wir letztens schonmal spontan welche mitgenommen und sehr lecker Hagebuttengelee draus gebaut hatten, konnte ich nicht so recht vorbeigehen. Irgendwann wurde es den anderen dann zu langweilig und sie haben mir halt beim Sammeln geholfen, wie man sieht... ![]() Hagebutten, überall Hagebutten. Oh, und Manu, Anja und Wastl. Später an der Strecke stand dann da noch so ein Holunderstrauch. Wastls blöder Kommentar: "Eigentlich ist Holundergelee ja auch ganz lecker." führte dazu, dass wir den spontan auch noch abgeerntet haben. (Ein echtes Problem hierbei ist übrigens der Transport der Früchte ohne entprechende Ausrüstung. Speziell Holunder hinterlässt hässliche Flecke...). Wieder zuhause angekommen konnten wir eine stattliche Ausbeute begutachten: ![]() Die eigentliche Arbeit kommt ja erst noch... Auf ging's zur Verarbeitung der Früchte. Holunderbeeren ablesen, waschen, kochen und auspressen: ![]() Nein, da ist niemand gestorben. Hagebutten schneiden, kochen und durchs Sieb gießen: ![]() Anstrengend aber lohnenswert. Die ausgekochten Hagebutten enthalten übrigens immernoch jede Menge Saft, was meine Mitstreiter spontan veranlasste, ein Alkoholexperiment zu wagen. Hagebuttenlikör. Steht hier rum und sieht zum Fürchten aus. Probieren werd ich den bestimmt nicht, wenn er fertig ist. ![]() Nein, kein Hackfleisch, sondern zerriebene Hagebutten. Das Ergebnis der Mühen: Holundergelee, Holunderessig, Holunderlikör, Hagebuttengelee, Hagebutten-Apfel-Gelee, Hagebuttenlikör und Holunder-Apfel-Hagebuttentee (nicht alles im Bild zu sehen). ![]() Fast das komplette Ergebnis. Meine Holde hat übrigens beschlossen für all die Dinge, die wir so gebastelt haben ein Symbolbild für die Küche zu malen. Hier ist schonmal das vor einiger Zeit gekochte Apfelmus: ![]() Apfelmusaquarell Saturday, 25. October 2008Was ist das?Welchen Pfennigartikel stellt folgendes Bild dar?
. Ganz klar:
BILDERHACKEN! Wenn der Praktikant das Packungsdesign macht... So gesehen heute im Netto. Tuesday, 21. October 2008Wie im Ameisenhaufen......geht es jeden Tag im Luftraum weltweit zu. Das zeigt zumindest ein Video einer entsprechenden Simulation bei YouTube. Setzt man das mal in Verhältnis zu den Unfallzahlen, dann versteht man, warum Fliegen als die sicherste Art zu reisen gilt... Monday, 20. October 2008QWidget auf minimal notwendige Größe bringenManchmal kann man sich auch einen Wolf suchen. Ziel war: ein Widget in dem sich mehrere Children befinden (QLineEdit, Checkboxen, QTableView) immer auf die minimal notwendige Größe zu bringen. Das gilt speziell dann, wenn der QTableView unsichtbar wird. Mit etwas um die Ecke denken geht's: widget->setMaximumHeight(0). (Im dem Fall ging es nur um die Höhe). Muss man erstmal drauf kommen... Update: Unsinn gelöscht. Man schaue sich mal QWidget::adjustSize() an... Sunday, 19. October 2008Wir bauen uns einen Wasserfall......dachten sich offenbar einige Leute in Trusetal vor langer Zeit. Gesagt, getan: Flussaufwärts Wasser abzweigen, in einer Rinne am Berg entlang bis zu einem Felsen leiten, *platsch*. Verrückt... ![]() Trusetaler Wasserfall (Bild unter CC-BY-NC) Saturday, 11. October 2008Apfelsaison......ist eigentlich nicht so meins. Irgendwie werde ich mit Äpfeln partout nicht warm. Aber die Eltern der (größtenteils) besten Frau von ganze Welt haben mal wieder so viele Äpfel übrig, dass man sie entweder essen, verschenken, wegschmeißen oder verarbeiten kann. Wegschmeißen ist doof, geschenkt haben will fast schon keiner mehr welche, weil man grad überall Äpfel bekommt und essen... naja, wie gesagt: nicht so meins. Bleibt noch die Verarbeitung. Zu Apfelmus um genau zu sein, das esse ich nämlich durchaus (sogar recht gern). Das Rezept ist simpel:
Die Äpfel schälen – oder wahlweise ungeschält verarbeiten und am Schluss durch ein Nudelsieb drücken – und von den Kerngehäusen befreien. Das sollte man übrigens gründlich tun, weil die harten Stellen des Kerngehäuses nicht mit zerkochen. Danach in Viertel schneiden und mit wenig Wasser kochen. Das Wasser sollte bloß dafür sorgen, dass die Äpfel nicht anbrennen. Keinesfalls dürfen die Äpfel bedeckt sein, sonst wird die Pampe zu dünn! Beim Kochen kann man mit einem Kartoffelstampfer oder Quirl nachhelfen um aus den Stückchen ein Mus zu machen. Wie ich schmerzhafterweise gelernt habe ist es dabei eine gute Idee, den Topf von der Herdplatte zu nehmen. Apfelmus explodiert unter Hitzeeinwirkung regelrecht. Ein Deckel auf dem Topf ist Pflicht, sonst sind die Arme verbrannt und die Küche versaut. Beim Kochen schmeißt man die Zimtstange und das Päckchen Vanillezucker mit in den Topf um dem ganzen den typischen Geschmack zu geben. Hat man die Äpfel ungeschält verarbeitet, so müssen jetzt die Schalen entfernt werden indem man die Masse durch ein Nudelsieb drückt. Zum Schluss kann man je nach Vorlieben das ganze noch mit dem Pürierstab bearbeiten. Ich mag mein Apfelmus ohne Bröckchen, daher kam der Pürierstab zum Einsatz. Wer's etwas gröber mag lässt das einfach weg. Ach ja, wichtig: die Zimtstange vorher entfernen!. Zimtstange und Pürierstab werden eigentlich nie Freunde, wie ich feststellen musste. So, da man nach fleißiger Befolgung des Rezeptes schätzungsweise 2 Liter Apfelmus hat, muss man das ja irgendwie haltbar machen. Wir haben den noch heißen Mus kurzerhand in Einweckgläser gefüllt und diese wie üblich verschlossen. Sollte hinreichend lang halten. Wer das nicht machen mag muss halt ein paar Leute einladen und den Kram vernichten. Oder in Portionen einfrieren. Eigentlich ganz einfach, so ein Apfelmus. Vorausgesetzt man stellt sich nicht allzu dämlich an. Und lecker ist es, wie Geschmacksproben zeigen, auch noch. Und so sieht das Ganze dann fertig aus: ![]() ~2 Liter Apfelmus P.S: Keine Diskussionen ob es "der" oder "das" Mus heißt. Laut Duden geht beides und mein Mus ist männlich. So... Wednesday, 8. October 2008Englische Aussprache...Grad von einem Kollegen bekommen: The Chaos von Gerard Nolst Trenité. Ein amüsantes Lehrstück der englischen Aussprache. Oft möchte man sich in der Tat dem letzten Satz anschließen... Wednesday, 1. October 2008Panoramapotpourri IINachdem das letzte Panoramapotpourri schon wieder geraume Zeit her ist, hat sich auf meiner Festplatte wieder ein wenig was angesammelt... Los geht's mit einigen Bildern von Fachgebietsausflug nach Bad Kösen. Sehr faszinierendes Teil. Im Tal wird die Saale mittels eines Wehrs (dazu gleich mehr) aufgestaut und ein Wasserrad angetrieben. Dieses überträgt über ein riesiges Gestänge die Kraft den Berg rauf (ein Teil des Gestänges ist im Vordergrund zu sehen) um Salzwasser aus dem Berg zu pumpen und an der Saline runtertropfen zu lassen. Die komplexe Konstruktion war notwendig, weil die Kraft für die Pumpen nicht am Entstehungsort (dem Wasserrad), sondern weiter oben benötigt wurde. Gab ja noch keinen Strom damals. (Link zur großen Version, 4139x2500 px, 2 MB) Irgendwo muss die Kraft ja herkommen und dazu ist es üblich, den eh schon vorhandenen Fluss mittels eines Wehres etwas anzustauen. Ich finde so einen vertikalen Knick im Fluss ja immer wieder faszinierend... (Link zur großen Version, 6456x1992px, 3,6MB) Burg Saaleck und Rudelsburg Unser Wandertag führte uns zum Mittagessen auf die Rudelsburg und dann weiter zur Burg Saaleck. Beides Punkte, von denen man schöne Panoramen machen kann. (Link zur großen Version, 3064x3408 px, 2,6MB) Zwei Ansichten des Saaletals, die gar nicht mal so weit auseinander liegen und doch recht unterschiedlich sind. Die Saale fließt an der Stelle in mehreren engen Bögen quer durch das Tal, so dass man recht abwechslungsreiche Ansichten geboten bekommt. Die Rudelsburg liegt weit oberhalb der Saale auf einem Felsen an der Außenseite einer "Linkskurve", während die Burg Saaleck zusammen mit dem gleichnamigen Örtchen quasi auf einer Landzunge in den Fluss reinzuragen scheint.(Große Version von der Rudelsburg aus, 7052x1500 px, 2,1MB)(Großversion von der Burg Saaleck aus, 8000x2577 px, 2,5MB) Stausee Mauthaus Zum Schluss noch zwei Bilder aus unserem bevorzugten Skaterevier: Stausee Mauthaus bei Nordhalben. Die Farben sind übrigens nicht gefälscht, das Wasser schimmert dort wirklich so blau. Wer sich mal mit Inlineskates und ähnlichem so richtig austoben will, dem sei eine Fahrt dorthin empfohlen. 11km Rundkurs um den See asphaltiert, nur geringe Steigungen, insgesamt also ideal für gemütliches Rollen und Quatschen. Alle Bilder sind wie üblich unter Creative Commons-Namensnennung-Keine kommerzielle Nutzung 3.0 Deutschland lizenziert. Sunday, 14. September 2008Tollkühne Männer auf ihren klapprigen Kisten......trifft es nicht ganz. Klapprig waren zumindest die meisten der Kisten nicht, sondern sehr gut gepflegt. Gabelbachrennen in Ilmenau: anlässlich des 95. Streckenjubiläums gab es gestern und heute eine Neuauflage ausgerichtet vom Freundeskreis Gabelbach-Bergrennen 1993 e.V.. Autos und Motorräder älter als meine Großeltern fahren vom Start am Ortsausgang Ilmenau den Berg hoch bis zum Ziel unterhalb des Heusser-Gedenksteins. Ein paar Eindrücke... ![]() Buick Modell 45 aus dem Jahr 1923. Stilecht mit Comic-Hupe. ![]() Melkus MT 77 – ein Rennwagen aus der DDR aus dem Jahr 1977. ![]() Schüttoff Sport. Ein Rennmotorrad von 1927. ![]() Ein K-Wagen, die Go-Karts der DDR. Man beachte: der Fahrer kann sich wirklich fast die Ohren mit den Knien zuhalten. ![]() Laut Starterheft eine Benelli 400. Unter dem Begriff findet man heute nur noch häßliche Roller... ![]() Eine Raleigh 7HP von 1924. Schicke Hupe... ![]() Die glücklichsten Kinder des Tages: der Gespannfahrer hatte ihnen tags zuvor eine Mitfahrt versprochen und nun war es soweit: Helme auf, festhalten und ab! ![]() Simson Supra von 1925. Langlebige Qualität aus Suhl... Saturday, 30. August 2008Wehe wenn sie losgelassen oder Extreme Programming unter verschärften BedingungenGeekigster Abend seit langem... Man nehme: eine gute Mischung aus Partyvolk und Geeks, Alkohol, ein Trinkspiel und eine blöde Idee. Man lasse auf jeden Fall weg: einen Würfel. Problem: für jenes spezielle Trinkspiel wird einer benötigt. Was macht der gemeine Geek, wenn er keinen Würfel hat? Richtig: er programmiert sich einen. Los ging es damit (aller Code in Python, das heute mal wieder seine Würdigkeit als RAD-Sprache gezeigt hat): import random print random.randint(1,6) Irgendwann wurde das Partyvolk übermütig und verlangte nach einer Klicki-Bunti-Lösung. Da ich ja sowieso grad im PyQt-Wahn bin und nie Alkohol trinke, konnte ich ja programmieren. Das Ende vom Lied: ![]() FeM möge uns 1000x verzeihen für den Mißbrauch ihres Logos. Im Prinzip simpel: die Software sagt, wer als nächstes welches Glas wahlweise zu trinken oder zu füllen hat und gibt dafür zwei Minuten Zeit (der Balken am oberen Rand). Ist der Betreffende zu langsam, sieht er sich damit konfrontiert: ![]() Lahme Ente! Die ganze Würfelei ist natürlich mit netten Animationen untermalt (die Herrschaften wollten schließlich was geboten haben!). Was hab ich mir nen Wolf programmiert... Ach ja, zum Thema Spätfolgen: sie hat nichtmal mitgespielt. Der doofe Hut ist neu und daher toll. Oder so... Wo ist mein Bett? P.S: Auf Wunsch einer einzelnen (mir unbekannten) Person gibt es den Quellcode zum Runterladen. Natürlich ohne den ganzen FeM-Kram darin. Zum Ausführen ist Python und PyQt4 notwendig. Alkohol ist von Vorteil. Auch für die Ansicht des Codes, der... naja, gewöhnungsbedürftig ist. Thursday, 28. August 2008PyQt4 und QAbstractItemViewNach zweitägiger Suche: Python und QT können manchmal sehr hässlich zusammenstoßen, wenn es um die Lebensdauer von Objekten geht. Folgender Code:
class MainWindow(QMainWindow):
[...]
def initTreeView(self, top_level_cats):
model = CategoryModel(top_level_cats)
self.treeview.setModel(model)
[...]
Sieht an sich erstmal unverdächtig aus: ein Model wird erzeugt (wie auch immer geartet) und dem Ein winzig kleine Änderung des Codes bringt die Lösung. Hier fast die gleiche Funktion:
class MainWindow(QMainWindow):
[...]
def initTreeView(self, top_level_cats):
self.model = CategoryModel(top_level_cats)
self.treeview.setModel(self.model)
[...]
Der einzige Unterschied: statt einer lokalen Variable ist Eigentlich logisch. Wenn man's einmal weiß... Sunday, 24. August 2008Eclipse Ganymede und SubversionDer Titel sagt es schon: es geht um Eclipse Ganymede und Subversion. Beides meiner Meinung fantastische Tools zur Softwareentwicklung, in Kombination allerdings gerade etwas zickig. Das Problem: bei Eclipse Europa (3.3) wurde meist für die Subversion-Integration das Plugin Subclipse verwendet. Für Ganymede (3.4) gibt's das allerdings noch nicht. Dafür gibt es ein neues Plugin direkt im Ganymede-Repository: Subversive. Dieses Plugin soll wohl bald standardmäßig in Eclipse integriert werden. Es ist quasi deckungsgleich mit dem schon bestehenden CVS-Plugin und integriert sich sehr gut in die Oberfläche. So schick das Plugin ist: mir scheint, die Eclipse-Jungs und -Mädels haben bei der Zusammenstellung von Ganymede gepennt. Dummerweise ist nämlich der eigentliche Team-Provider integriert, die Library zum Zugriff auf die SVN-Repositories allerdings nicht. Die darf man sich zu Fuß nachinstallieren. Dabei darf man sich dann auch noch entscheiden, welche man nimmt. Ich hab mich letztlich für SVNKit entschieden, weil mir die Idee gefällt, allen Kram gleich in Java abzuwickeln, statt externe Libs einbinden zu müssen. Dummerweise begrüßt mich mein Eclipse bei der Installation von SVNKit mit folgenden Zeilen: Cannot find a solution where both Match[requiredCapability: org.eclipse.equinox.p2.iu/org.eclipse.team.svn.feature.group/[0.7.1.I20080612-1500,0.7.1.I20080612-1500]] and Match[requiredCapability: org.eclipse.equinox.p2.iu/org.eclipse.team.svn.feature.group/[0.7.2.I20080801-1500,1.0.0)] can be satisfied. Unsatisfied dependency: [org.polarion.eclipse.team.svn.connector.svnkit.feature.group 2.0.2.I20080801-1500] requiredCapability: org.eclipse.equinox.p2.iu/org.eclipse.team.svn.feature.group/[0.7.2.I20080801-1500,1.0.0) Unsatisfied dependency: [org.polarion.eclipse.team.svn.connector.svnkit.feature.group 2.0.2.I20080801-1500] requiredCapability: org.eclipse.equinox.p2.iu/org.polarion.eclipse.team.svn.connector.feature.group/0.0.0 Unsatisfied dependency: [org.polarion.eclipse.team.svn.connector.svnkit15.feature.group 2.0.2.I20080801-1500] requiredCapability: org.eclipse.equinox.p2.iu/org.eclipse.team.svn.feature.group/[0.7.2.I20080801-1500,1.0.0) Unsatisfied dependency: [org.polarion.eclipse.team.svn.connector.svnkit15.feature.group 2.0.2.I20080801-1500] requiredCapability: org.eclipse.equinox.p2.iu/org.polarion.eclipse.team.svn.connector.feature.group/0.0.0 Unsatisfied dependency: [org.polarion.eclipse.team.svn.connector.feature.group 2.0.2.I20080801-1500] requiredCapability: org.eclipse.equinox.p2.iu/org.eclipse.team.svn.feature.group/[0.7.2.I20080801-1500,1.0.0) Ja, diese Fehlermeldung ist auch im Original so unlesbar. Nach längerem Suchen bin ich in einem Blog auf die Lösung gestoßen: Seit 3. August möchte SVNKit eine neuere Version von Subversive haben (oder andersrum, so 100% schlau bin ich noch nicht draus geworden). Die ist dummerweise nicht in den Ganymede-Repositories, sondern muss unter http://download.eclipse.org/technology/subversive/0.7/update-site/ extra bezogen werden. Diese URL packt man in die Update-Site, muss sie dann noch einmalig via "Manage Sites..." aktivieren und schon kann man sich ein neueres Subversive installieren, was dann auch mit SVNKit spielen mag. Schade, dass die Standardintegration in Ganymede so kaputt ist. Bis zum Nachfolger dauert es ja doch ein wenig und bis dahin sind wahrscheinlich schon einige an Subversion und Eclipse verzweifelt und benutzen glatt wieder CVS *brrrr*... Update: Wie Deka in den Kommentaren angemerkt hat scheint es mit Subclipse 1.4 wohl doch einen Release für Ganymede zu geben. Saturday, 16. August 2008Lecker Essen...Beim Radfahren kam uns heute spontan die Idee, dass man ja mal wieder kochen könnte. Also spontan de.rec.mampf angeschmissen, ein paar Leute eingeladen, eingekauft und raus kam: ![]() Korianderlendchen von der Pute mit Knoblauch-Chiligarnelen Nachzulesen ist das Rezept beim ZDF bei Volle Kanne
(Seite 1 von 20, insgesamt 287 Einträge)
» nächste Seite
|