CA-Networks2012-01-31T10:38:25Zhttp://www.ca-net.org/ArchivesChristian Assing2000-01-01T00:00:00Z2000-01-01T00:00:00Zhttp://www.ca-net.org/blogNoneChristian Assing2000-01-01T00:00:00Z2000-01-01T00:00:00Zhttp://www.ca-net.org/hetznertest python elixir sessionChristian Assing2008-04-14T00:00:00Z2008-04-14T00:00:00Zhttp://www.ca-net.org/blog/2008/04/python_elixir_session <p>Zur Zeit mache ich beim ZID mein Praxissemester, ich programmiere für uns den Python Computer Room Manager (pycrman). Dieses Projekt ist in Python geschrieben und benutzt verschiedene Python Erweiterung. Zur einer Erweiterung will ich hiermit ein bissel was&nbsp;schreiben&nbsp;:)</p> <h1 id="elixir">Elixir</h1> <p><a href="http://elixir.ematia.de/trac/wiki">Elixir</a> ist "dünner" Wrapper für die <a href="http://www.sqlalchemy.org/">SQLAlchemy Library</a>. Beide zusammen vereinfachen den Umgang mit einer Datenbank in Python um&nbsp;ein&nbsp;vielfaches.</p> <p>Hier ein kleines Beispiel mit&nbsp;2&nbsp;Tabellen:</p> <pre class="codehilite"><code class="language-python"># import elixir stuff from elixir import * # setup db connection metadata.bind = &quot;sqlite:///movies.sqlite&quot; metadata.bind.echo = True # first table class Device(Entity): &quot;&quot;&quot;representation of a device &quot;&quot;&quot; using_options(tablename='device', inheritance='multi') id = Field(Integer, primary_key=True) name = Field(String(127), required=True, unique=True) domain = Field(String(255), required=True) interfaces = OneToMany('Interface') def __repr__(self): return 'Device %s' % (self.name) # second table class Interface(Entity): &quot;&quot;&quot;network interfaces &quot;&quot;&quot; using_options(tablename='interface') id = Field(Integer, primary_key=True) name = Field(String(16), required=True) ip = Field(String(38), required=True, unique=True) mac = Field(String(17), unique=True) device = ManyToOne('Device') def __repr__(self): return '&lt;Interface: %s ip: %s mac: %s&gt;' % ( self.name, self.ip, self.mac) setup_all() drop_all() create_all()</code></pre> <p>und schon kann mal auf einfache und sehr elegante Weise diese 2&nbsp;Tabellen&nbsp;benutzen:</p> <pre class="codehilite"><code class="language-python"># create new device object device = Device(name=&quot;foobar&quot;) device.domain = &quot;test.localdomain&quot; # create new interface object interface = Interface(name=&quot;eth0&quot;, ip=&quot;1.1.1.1&quot;) # add interface object to device object device.interfaces = [interface] # store objects in db session.flush([device, interface]) # query device = Device.get_by(name=&quot;foobar&quot;) print device</code></pre> <p>Ein schönes Beispiel gibt es auch im <a href="http://elixir.ematia.de/trac/wiki/TutorialDivingIn">Elixir Tutorial</a>.</p> <p>Noch ein kleiner Beitrag zu den elixir/sqlalchemy sessions. In der Standard Einstellung sind die Elixir sessions sogenannte "scoped_session", d.h. das jeder Thread in einer threaded Umgebung seine eigene Elixir session hat. Das hat zur folge, das wenn ein Thread ein Objekt anlegt bzw. verändert, ein anderer Thread das nicht unbedingt mit bekommt, da Elixir/SQLAlchemy die Query Resultate cached. Am besten geht man damit um das man den&nbsp;Cache&nbsp;ausschaltet:</p> <pre class="codehilite"><code class="language-python">import elixir elixir.options_defaults['mapper_options'] = dict(always_refresh=True)</code></pre> <p>oder bei einer Query&nbsp;populate_existing()&nbsp;benutzt.</p> python elixir query optimierungChristian Assing2008-06-06T00:00:00Z2008-06-06T00:00:00Zhttp://www.ca-net.org/blog/2008/06/python_elixir_query_optimierung <p>Ich bin vor ein paar Tagen bei der Programmierung von PyCRMan fast verzweifelt. Wie ich schon in einem früheren Eintrag beschrieb, verwende ich <a href="http://elixir.ematia.de/trac/wiki">Elixir</a> als Wrapper für die Datenbank und mir ist aufgefallen, das Elixir bei meinen Model sehr viele DB-Queries generiert. Die Anzahl der Queries ist so hoch das die Netzwerk Latenzzeiten eine sehr große Rolle&nbsp;spielen&nbsp;:(</p> <p>Nach ewig langen erfolglosem Studieren der etwas dürftigen Elixir Dokumentation bin ich nachts um ca. 1 Uhr in der <a href="http://www.sqlalchemy.org/docs/04/index.html">SQLAlchemy Dokumentation</a> fündig geworden. Die "geheimen" Zauberwörter heißen "lazyload" und "eagerload", wenn ich das nur vorher schon gewußt&nbsp;hätte&nbsp;;)</p> <p>Hier ein&nbsp;kleines&nbsp;Beispiel:</p> <p>Als erstes mal ein kleines Model (ja das ist das Beispiel aus der Elixir Doku&nbsp;:)&nbsp;)</p> <pre class="codehilite"><code class="language-python">from elixir import * metadata.bind = &quot;sqlite:///:memory:&quot; metadata.bind.echo = True class Movie(Entity): title = Field(String(30)) director = ManyToOne('Director') def __repr__(self): return '&lt;Movie &quot;%s&quot;&gt;' % (self.title) class Director(Entity): name = Field(String(60)) movies = OneToMany('Movie') def __repr__(self): return '&lt;Director &quot;%s&quot;&gt;' % self.name setup_all() create_all()</code></pre> <p>Jetzt ein paar&nbsp;Werte&nbsp;einfügen:</p> <pre class="codehilite"><code class="language-python">rscott = Director(name=&quot;Ridley Scott&quot;) glucas = Director(name=&quot;George Lucas&quot;) unknown = Director(name=&quot;Nobody Unknown&quot;) alien = Movie(title=&quot;Alien&quot;, director=rscott) swars = Movie(title=&quot;Star Wars&quot;, director=glucas) brunner = Movie(title=&quot;No Name&quot;, director=unknown) session.flush() session.clear() for m in Movie.query.all(): print &quot;Movie: name=%s director=%s&quot; % (m.title, m.director.name)</code></pre> <p>Wenn man nun auf die letzten sql queries schaut, sieht man das erst alle movies aus der DB geladen werden und dann für jeden einzelnen Film wird der Director einzeln geholt. Ha nun ist klar warum das alles so langsam&nbsp;geht&nbsp;:)</p> <pre class="codehilite"><code class="language-sql">SELECT __main___movie.id AS __main___movie_id, __main___movie.title AS __main___movie_title, __main___movie.director_id AS __main___movie_director_id FROM __main___movie ORDER BY __main___movie.oid [] SELECT __main___director.id AS __main___director_id, __main___director.name AS __main___director_name FROM __main___director WHERE __main___director.id = ? [1] SELECT __main___director.id AS __main___director_id, __main___director.name AS __main___director_name FROM __main___director WHERE __main___director.id = ? [2] SELECT __main___director.id AS __main___director_id, __main___director.name AS __main___director_name FROM __main___director WHERE __main___director.id = ? [3]</code></pre> <p>Damit aus diesen beispielhaften 4 Queries EINE wird kann man an so einer Stelle <a href="http://www.sqlalchemy.org/docs/04/sqlalchemy_orm.html#docstrings_sqlalchemy.orm_modfunc_eagerload">eagerload</a>&nbsp;verwenden.</p> <pre class="codehilite"><code class="language-python"># import eagerload from sqlalchemy from sqlalchemy.orm import eagerload for m in Movie.query.options(eagerload(&quot;director&quot;)).all(): print &quot;Movie: name=%s director=%s&quot; % (m.title, m.director.name)</code></pre> <p>Und schon ist es&nbsp;eine&nbsp;Query:</p> <pre class="codehilite"><code class="language-sql">SELECT __main___movie.id AS __main___movie_id, __main___movie.title AS __main___movie_title, __main___movie.director_id AS __main___movie_director_id, __main___director_1.id AS __main___director_1_id, __main___director_1.name AS __main___director_1_name FROM __main___movie LEFT OUTER JOIN __main___director AS __main___director_1 ON __main___movie.director_id = __main___director_1.id ORDER BY __main___movie.oid, __main___director_1.oid</code></pre> <p>Alternativ zum "eagerload" kann man auch im Model das&nbsp;lazyload&nbsp;abschalten.</p> <pre class="codehilite"><code class="language-python">class Movie(Entity): title = Field(String(30)) director = ManyToOne('Director', lazy=False) # &lt;- lazyload now False def __repr__(self): return '&lt;Movie &quot;%s&quot;&gt;' % (self.title)</code></pre> <p>Und wenn man mal das ganze Gegenteil braucht, kann man <a href="http://www.sqlalchemy.org/docs/04/sqlalchemy_orm.html#docstrings_sqlalchemy.orm_modfunc_lazyload">lazyload</a> verwenden und im Model heißt die&nbsp;Option&nbsp;"deferred=True".</p> FotosChristian Assing2009-02-25T00:00:00Z2009-02-25T00:00:00Zhttp://www.ca-net.org/blog/2009/02/fotos <p><img alt="My new car" src="/media/images/blog/2009/02/c30.png" title="My new car" /></p> <p>Ich habe eine paar neue Fotos in meine Web Gallery gestellt, viel Spaß beim&nbsp;anschaun&nbsp;:)</p> <ul> <li><a href="http://picasaweb.google.com/christian.assing/VolvoC30">Mein neuer&nbsp;Volvo&nbsp;c30</a></li> <li><a href="http://picasaweb.google.com/christian.assing/Geocachen1">Geocachen</a></li> <li><a href="http://picasaweb.google.com/christian.assing/Wien">Wien&nbsp;Ausflug</a></li> </ul> iPhone unter LinuxChristian Assing2009-03-28T00:00:00Z2009-03-28T00:00:00Zhttp://www.ca-net.org/blog/2009/03/iphone_unter_linux <p>Ich habe mir jetzt ein <a href="http://www.apple.com/de/iphone/">iPhone</a> zugelegt und damit meinen iPod Touch ersetzt. Nur am Rande, wenn jemand überlegt sich eins dieser beiden Geräte zu zulegen, ich kann dazu nur sagen: "Mach&nbsp;es!!"&nbsp;:)</p> <p>Ok aber jetzt zum eigentlichen Artikel und dem Grund warum ich diesen Artikel&nbsp;schreiben&nbsp;musste. </p> <p>Anmerkung: Das iPhone und der iPod Touch verwenden die gleiche Software und somit sind folgende Informationen für beide&nbsp;Geräte&nbsp;gleich.</p> <h3 id="iphone-und-itunes">iPhone&nbsp;und&nbsp;iTunes</h3> <p>Bevor man das iPhone benutzten kann (telefonieren usw.) muss es via der <a href="http://www.apple.com/de/itunes/">iTunes</a> Software aktiviert werden. Da ich ja Linux benutzte stand ich nun vor einem großen Problem, die iTunes Software gibt es leider NUR für MacOS und Windows! :( Also was nun? Mac kaufen ... zu teuer! Eigene Windows Partition aufm Laptop ... aber wie kann dieses Windows auf meine Musik von der Linux Platte zu greifen? Das einzige und kostengünstige: <a href="http://www.vmware.com">VMware</a>!</p> <h3 id="itunes-in-einem-vmware-windows-xp">iTunes in einem VMware&nbsp;Windows&nbsp;XP</h3> <p>Die VMware Installation ist sehr einfach (ja auch unter Linux), herunterladen, Installer aufrufen, weiter, weiter, fertig! Dann schnell ein Windows XP in der VMware installiert und über die VMware meinen Music Ordner dem Windows gegeben. Das iTunes heruntergeladen&nbsp;und&nbsp;installiert.</p> <p>Das ist alles noch nicht die hohe Kunst, aber leider reicht das nicht um ein iPhone zu aktivieren bzw. zu&nbsp;syncen&nbsp;:(</p> <h3 id="konfiguration-von-hal">Konfiguration&nbsp;von&nbsp;HAL</h3> <p>Wenn man in dem jetzigen Setup das iPhone am Computer anschliesst, sehen das Linux und das Windows das iPhone. Dadurch funktioniert das iTunes im Windows nicht richtig, es können manche USB Kommandos nicht ausgeführt werden. Die Lösung bring dein Linux dazu das iPhone zu ignorieren, aber wie? Die Antwort lautet: Sag dem <a href="http://freedesktop.org/wiki/Software/hal">HAL</a>, das das iPhone ihn nix&nbsp;angeht&nbsp;:)</p> <ul> <li> <p>Finde die USB ID des&nbsp;iPhones&nbsp;heraus</p> <pre class="codehilite"><code class="language-bash">root@...# lsusb [snip] Bus 002 Device 002: ID 05ac:1292 Apple, Inc.</code></pre> </li> <li> <p>die USB ID (hier 05ac:1292) ist in der Hex Darstellung, das HAL braucht sie in der Dezimal&nbsp;Darstellung&nbsp;1452:4754</p> </li> <li> <p>in /etc/hal/fdi/preprobe/10-iphone.fdi&nbsp;folgendes&nbsp;eintragen</p> <pre class="codehilite"><code class="language-xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;!-- -*- SGML -*- --&gt; &lt;deviceinfo version=&quot;0.2&quot;&gt; &lt;device&gt; &lt;match key=&quot;usb.vendor_id&quot; int=&quot;1452&quot;&gt; &lt;match key=&quot;usb.product_id&quot; int=&quot;4754&quot;&gt; &lt;merge key=&quot;info.ignore&quot; type=&quot;bool&quot;&gt;true&lt;/merge&gt; &lt;/match&gt; &lt;/match&gt; &lt;/device&gt; &lt;/deviceinfo&gt;</code></pre> </li> <li> <p>HAL restarten und das Linux ignoriert das iPhone und das iTunes sollte ohne Probleme&nbsp;funktionieren&nbsp;:)</p> </li> </ul> Kletterwald HohenfeldenChristian Assing2009-04-30T00:00:00Z2009-04-30T00:00:00Zhttp://www.ca-net.org/blog/2009/04/kletterwald_hohenfelden <p>Hier ein paar Fotos zum Ausflug in den <a href="http://www.kletterwald-hohenfelden.de/">Kletterwald Hohenfelden</a> von David und&nbsp;mir&nbsp;:)</p> <table style="width:194px;"><tr><td align="center" style="height:194px;background:url(http://picasaweb.google.com/s/c/transparent_album_background.gif) no-repeat left"><a href="http://picasaweb.google.com/christian.assing/KletterwaldHohenfelden?feat=embedwebsite"><img src="http://lh6.ggpht.com/_lPet4fv-M6s/Sflrw41KSsE/AAAAAAAABTM/BCcilMCKMeI/s160-c/KletterwaldHohenfelden.jpg" width="160" height="160" style="margin:1px 0 0 4px;"></a></td></tr><tr><td style="text-align:center;font-family:arial,sans-serif;font-size:11px"><a href="http://picasaweb.google.com/christian.assing/KletterwaldHohenfelden?feat=embedwebsite" style="color:#4D4D4D;font-weight:bold;text-decoration:none;">Kletterwald Hohenfelden</a></td></tr></table> BungyChristian Assing2009-07-27T00:00:00Z2009-07-27T00:00:00Zhttp://www.ca-net.org/blog/2009/07/bungy <p>Ich habe es getan und mich, nur an einem Gummiseil befestigt, von der 96m hohen <a href="http://bungy.at/de/index_bungee.php">Jauntal Brücke</a> gestürzt. 3 ... 2 ... 1 ...&nbsp;JUMP&nbsp;:)</p> <table style="width:194px;"><tr><td align="center" style="height:194px;background:url(http://picasaweb.google.com/s/c/transparent_album_background.gif) no-repeat left"><a href="http://picasaweb.google.com/christian.assing/Bungy?feat=embedwebsite"><img src="http://lh6.ggpht.com/_lPet4fv-M6s/Sm06WXKYWdE/AAAAAAAABf8/YGcTSE-2CbQ/s160-c/Bungy.jpg" width="160" height="160" style="margin:1px 0 0 4px;"></a></td></tr><tr><td style="text-align:center;font-family:arial,sans-serif;font-size:11px"><a href="http://picasaweb.google.com/christian.assing/Bungy?feat=embedwebsite" style="color:#4D4D4D;font-weight:bold;text-decoration:none;">Bungy</a></td></tr></table> Bungy VideoChristian Assing2009-07-27T00:00:00Z2009-07-27T00:00:00Zhttp://www.ca-net.org/blog/2009/07/bungy_video <p><object width="400" height="300" ><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://www.facebook.com/v/1029839126414" /><embed src="http://www.facebook.com/v/1029839126414" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="400" height="300"></embed></object></p> Kärtnen Läuft HalbmarathonChristian Assing2009-08-23T00:00:00Z2009-08-23T00:00:00Zhttp://www.ca-net.org/blog/2009/08/kartnen_lauft_halbmarathon <p>Ich hab es hinter mich gebracht, 21km laufen von Velden am Wörthersee nach Klagenfurt ins Strandbad. Es war eine riesen Stimmung bei diesem immer gut besuchten Laufevent. Meine offizielle Zeit&nbsp;war&nbsp;1h55m. </p> <p><img src="http://www.ca-net.org/images/hm_kaernten_laeuft_2009.jpg" alt="Ein stolzer Finisher" /></p> Kletterwochenende in Arco ItalienChristian Assing2009-08-08T00:00:00Z2009-08-08T00:00:00Zhttp://www.ca-net.org/blog/2009/08/kletterwochenende_in_arco_italien <table style="width:194px;"><tr><td align="center" style="height:194px;background:url(http://picasaweb.google.com/s/c/transparent_album_background.gif) no-repeat left"><a href="http://picasaweb.google.com/christian.assing/KletternInArco?feat=embedwebsite"><img src="http://lh4.ggpht.com/_lPet4fv-M6s/Sn1qlzqUicE/AAAAAAAABlc/Tp_d1Y5YMaM/s160-c/KletternInArco.jpg" width="160" height="160" style="margin:1px 0 0 4px;"></a></td></tr><tr><td style="text-align:center;font-family:arial,sans-serif;font-size:11px"><a href="http://picasaweb.google.com/christian.assing/KletternInArco?feat=embedwebsite" style="color:#4D4D4D;font-weight:bold;text-decoration:none;">Klettern in Arco</a></td></tr></table> Kletterwochenende in Osp SlowenienChristian Assing2009-08-08T00:00:00Z2009-08-08T00:00:00Zhttp://www.ca-net.org/blog/2009/08/kletterwochenende_in_osp_slowenien <table style="width:194px;"><tr><td align="center" style="height:194px;background:url(http://picasaweb.google.com/s/c/transparent_album_background.gif) no-repeat left"><a href="http://picasaweb.google.com/christian.assing/KletternInOsp?feat=embedwebsite"><img src="http://lh3.ggpht.com/_lPet4fv-M6s/Sn1nkVrR49E/AAAAAAAABiM/8OSgSX-8X50/s160-c/KletternInOsp.jpg" width="160" height="160" style="margin:1px 0 0 4px;"></a></td></tr><tr><td style="text-align:center;font-family:arial,sans-serif;font-size:11px"><a href="http://picasaweb.google.com/christian.assing/KletternInOsp?feat=embedwebsite" style="color:#4D4D4D;font-weight:bold;text-decoration:none;">Klettern in Osp</a></td></tr></table> FallschirmspringenChristian Assing2009-09-07T00:00:00Z2009-09-07T00:00:00Zhttp://www.ca-net.org/blog/2009/09/fallschirmspringen <p>Wir waren am Wochenende Fallschirmspringen und haben es alle unbeschadet überlebt ;) Ich kann es nur jedem empfehlen!!! Hier ein&nbsp;paar&nbsp;Eindrücke:</p> <table style="width:194px;"><tr><td align="center" style="height:194px;background:url(http://picasaweb.google.com/s/c/transparent_album_background.gif) no-repeat left"><a href="http://picasaweb.google.com/christian.assing/Fallschirmspringen?feat=embedwebsite"><img src="http://lh6.ggpht.com/_lPet4fv-M6s/SqU27MeRgbE/AAAAAAAABpo/KB8u7CePn6Y/s160-c/Fallschirmspringen.jpg" width="160" height="160" style="margin:1px 0 0 4px;"></a></td></tr><tr><td style="text-align:center;font-family:arial,sans-serif;font-size:11px"><a href="http://picasaweb.google.com/christian.assing/Fallschirmspringen?feat=embedwebsite" style="color:#4D4D4D;font-weight:bold;text-decoration:none;">Fallschirmspringen</a></td></tr></table> <p>Das Video&nbsp;kommt&nbsp;später.</p> Mozartclub Geburtstagsfeier zum 30.Christian Assing2009-10-13T00:00:00Z2009-10-13T00:00:00Zhttp://www.ca-net.org/blog/2009/10/mozartclub_geburtstagsfeier_zum_30 <table style="width:194px;"><tr><td align="center" style="height:194px;background:url(http://picasaweb.google.com/s/c/transparent_album_background.gif) no-repeat left"><a href="http://picasaweb.google.com/christian.assing/GeburtstagsfeierImMozartclubZuMeinem30?feat=embedwebsite"><img src="http://lh6.ggpht.com/_lPet4fv-M6s/StSD_t4YujE/AAAAAAAABuU/oojD8I74z8k/s160-c/GeburtstagsfeierImMozartclubZuMeinem30.jpg" width="160" height="160" style="margin:1px 0 0 4px;"></a></td></tr><tr><td style="text-align:center;font-family:arial,sans-serif;font-size:11px"><a href="http://picasaweb.google.com/christian.assing/GeburtstagsfeierImMozartclubZuMeinem30?feat=embedwebsite" style="color:#4D4D4D;font-weight:bold;text-decoration:none;">Geburtstagsfeier im Mozartclub zu meinem 30.</a></td></tr></table> Von Wordpress zu statischen HTML SeitenChristian Assing2010-02-07T00:00:00Z2010-02-07T00:00:00Zhttp://www.ca-net.org/blog/2010/02/wordpress_turned_off <p>... oder "Wenn Designer jetzt PHP Code schreiben, dann muss ich meine Wordpress&nbsp;Installation&nbsp;abdrehen".</p> <p>Ich war gestern auf den <a href="http://www.barcamp.at/BarCamp_Klagenfurt_2010">Barcamp Klagenfurt 2010</a> und nahm zufällig an einer Session zum Thema "Wordpress Themes" teil. Danach hab ich den festen Entschluss gefasst meine Wordpress Installation zu löschen und gegen statische HTML Seiten zu tauschen. Wie ich das gemacht habe möchte ich&nbsp;hier&nbsp;zeigen.</p> <div class="toc"> <ul> <li><a href="#problemstellung">Problemstellung</a></li> <li><a href="#wordpress-seiteninhalte-auslesen-mit-jekyll">Wordpress Seiteninhalte auslesen&nbsp;mit&nbsp;Jekyll</a></li> <li><a href="#von-dr-jekyll-zu-mr-hyde">Von Dr. Jekyll zu&nbsp;Mr.&nbsp;Hyde</a></li> </ul> </div> <h1 id="problemstellung">Problemstellung</h1> <p>Da ich nicht auf einer grünen Wiese ohne Inhalt für meinen Blog anfangen wollte, musste ich erst einmal meine bisherigen Seiten in einem vernünftigen Format aus dem Wordpress heraus bekommen. Leider ist das nicht so einfach, es gibt zwar viele Konverter die mir Inhalt ins Wordpress rein bringen, aber heraus bekommen es nur wenige. Ich habe mich dann schlussendlich für das Ruby Tool <a href="http://github.com/mojombo/jekyll">Jekyll</a> entschieden. Diese Tool, welches selbst ein "static site generator" ist, möchte ich aber nur in der Migration Phase verwenden, danach bzw. jetzt setze ich <a href="http://ringce.com/hyde">Hyde</a> für die Generierung meiner&nbsp;Seiten&nbsp;ein.</p> <h1 id="wordpress-seiteninhalte-auslesen-mit-jekyll">Wordpress Seiteninhalte auslesen&nbsp;mit&nbsp;Jekyll</h1> <p>Erstmal die nötigen Software installieren. In meinem Fall auf einem <a href="http://www.debian.org">Debian</a>&nbsp;Lenny&nbsp;Server.</p> <p>Das es das <a href="http://github.com/mojombo/jekyll">Jekyll</a> nicht als Debian Packet gibt, muss man es von hand installieren. Erst einmal Ruby und&nbsp;Compiler&nbsp;...</p> <pre class="codehilite"><code class="language-bash">apt-get install ruby ruby1.8-dev rubygems build-essential libmysqlclient15-dev</code></pre> <p>Jetzt <a href="http://github.com/mojombo/jekyll">Jekyll</a>&nbsp;...</p> <pre class="codehilite"><code class="language-bash">gem sources -a http://gems.github.com gem install mojombo-jekyll</code></pre> <p>Nun weitere Ruby Packete die das Jekyll&nbsp;braucht&nbsp;...</p> <pre class="codehilite"><code class="language-bash">gem install mysql gem install sequel gem install rake-compiler -v 0.5.0</code></pre> <p>Da im Lenny ein zu altes rubygems vorhanden ist, quick <span class="amp">&amp;</span> dirty aus dem unstable&nbsp;installieren&nbsp;...</p> <pre class="codehilite"><code class="language-bash">wget http://ftp.de.debian.org/debian/pool/main/libg/libgems-ruby/rubygems1.8_1.3.5-2_all.deb dpkg -i rubygems1.8_1.3.5-2_all.deb</code></pre> <p>Nun das letzte Ruby&nbsp;Packet&nbsp;...</p> <pre class="codehilite"><code class="language-bash">gem install hoe</code></pre> <p>Jetzt kann man mit Jekyll den Wordpress Seiten Inhalt&nbsp;auslesen&nbsp;...</p> <pre class="codehilite"><code class="language-bash">export DB=my_wordpress_db export USER=dbuser export PASS=dbpass ruby -r '/var/lib/gems/1.8/gems/mojombo-jekyll-__VERS__/lib/jekyll/converters/wordpress' \ -e 'Jekyll::WordPress.process(&quot;#{ENV[&quot;DB&quot;]}&quot;, &quot;#{ENV[&quot;USER&quot;]}&quot;, &quot;#{ENV[&quot;PASS&quot;]}&quot;)'</code></pre> <p>Nun hat man im Verzeichnis "_posts" alle seine&nbsp;Wordpress&nbsp;Inhalte.</p> <p>Da ich auf meinen Server keine Ruby installiert haben will und schon garnicht einen Compiler, fliegt alles wieder runter. Zu erste die Debian&nbsp;Packete&nbsp;...</p> <pre class="codehilite"><code class="language-bash">apt-get --purge remove cpp cpp-4.3 gcc gcc-4.3 libc6-dev libgmp3c2 libgomp1 \ libmpfr1ldbl libruby1.8 linux-libc-dev ruby ruby1.8 ruby1.8-dev apt-file \ libapt-pkg-perl libconfig-file-perl liblist-moreutils-perl menu irb1.8 \ libreadline-ruby1.8 rdoc1.8 rubygems rubygems1.8 build-essential dpkg-dev \ g++ g++-4.3 libstdc++6-4.3-dev libtimedate-perl make libmysqlclient15-dev \ zlib1g-dev</code></pre> <p>Danach die installierten&nbsp;Rubygems&nbsp;...</p> <pre class="codehilite"><code class="language-bash">rm -rf /var/lib/gems</code></pre> <h1 id="von-dr-jekyll-zu-mr-hyde">Von Dr. Jekyll zu&nbsp;Mr.&nbsp;Hyde</h1> <p>Nun ist der Weg geebnet und ich konnte auf <a href="http://ringce.com/hyde">Hyde</a> umsteigen. Ich bin dabei einer Anleitung von <a href="http://stevelosh.com/blog/2010/01/moving-from-django-to-hyde/">Steve Losh</a> gefolgt, der seine Seite ebenfalls mit <a href="http://ringce.com/hyde">Hyde</a> betreibt. Da es mit Beispielen immer leichter geht, kann ich noch <a href="http://github.com/sjl/stevelosh/">Steve Losh Git</a> empfehlen, in dem man den kompletten Code seiner&nbsp;Seite&nbsp;sieht.</p> <p>Hier ist noch ein Script was die umgewandelten Wordpress Postings in die Hyde Verzeichnis Strutur umwandelt. Ich glaub der Code ist&nbsp;selbst&nbsp;erklärend.</p> <pre class="codehilite"><code class="language-text">#!/usr/bin/env bash outdir=&quot;www.ca-net.org/content/blog/&quot; indir=&quot;_posts&quot; mkdir -p $outdir cd $indir for f in *; do # get some metainfo from filename and file content year=`echo $f | cut -f1 -d'-'` month=`echo $f | cut -f2 -d'-'` day=`echo $f | cut -f3 -d'-'` # get post title title=`grep &quot;title: &quot; $f | cut -f2- -d&quot;:&quot;` # strip \&quot; from title title=${title//\\\&quot;/} # strip &quot; from title title=${title//\&quot;/} # convert url encoded german umlaute title=${title//\\xC3\\xBC/ü}; title=${title//\\xC3\\x9C/Ü}; title=${title//\\xC3\\xB6/ö}; title=${title//\\xC3\\x96/Ö}; title=${title//\\xC3\\xA4/ä}; title=${title//\\xC3\\x84/Ä}; # strip file extension fwe=`basename $f .markdown` # create output dir mkdir -p ../$outdir/$year/$month # build output file name outfile=&quot;../$outdir/$year/$month/`echo $fwe | cut -f4- -d'-' | tr -s '-' '_'`.html&quot; # write hyde heady cat - &lt;&lt; __EOF__ &gt; $outfile { % extends &quot;_post.html&quot; %} { % hyde title: &quot;$title&quot; created: $year-$month-$day categories: [&quot;private&quot;] %} { % block article %} __EOF__ # write content tail +7 $f &gt;&gt; $outfile # write hyde footer echo &quot;{ % endblock %}&quot; &gt;&gt; $outfile echo &quot;$outfile created&quot; done</code></pre> <p>Achtung: Im Script sind die 2 Zeichen "{" und "%" mit einen Leerzeichen dazwischen, bitte im abgespeicherten Script bei euch&nbsp;ab&nbsp;ändern.</p>