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 schreiben :)</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 ein vielfaches.</p>
<p>Hier ein kleines Beispiel mit 2 Tabellen:</p>
<pre class="codehilite"><code class="language-python"># import elixir stuff
from elixir import *
# setup db connection
metadata.bind = "sqlite:///movies.sqlite"
metadata.bind.echo = True
# first table
class Device(Entity):
"""representation of a device
"""
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):
"""network interfaces
"""
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 '<Interface: %s ip: %s mac: %s>' % (
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 Tabellen benutzen:</p>
<pre class="codehilite"><code class="language-python"># create new device object
device = Device(name="foobar")
device.domain = "test.localdomain"
# create new interface object
interface = Interface(name="eth0", ip="1.1.1.1")
# add interface object to device object
device.interfaces = [interface]
# store objects in db
session.flush([device, interface])
# query
device = Device.get_by(name="foobar")
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 Cache 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 populate_existing() 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 spielen :(</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 hätte ;)</p>
<p>Hier ein kleines Beispiel:</p>
<p>Als erstes mal ein kleines Model (ja das ist das Beispiel aus der Elixir Doku :) )</p>
<pre class="codehilite"><code class="language-python">from elixir import *
metadata.bind = "sqlite:///:memory:"
metadata.bind.echo = True
class Movie(Entity):
title = Field(String(30))
director = ManyToOne('Director')
def __repr__(self):
return '<Movie "%s">' % (self.title)
class Director(Entity):
name = Field(String(60))
movies = OneToMany('Movie')
def __repr__(self):
return '<Director "%s">' % self.name
setup_all()
create_all()</code></pre>
<p>Jetzt ein paar Werte einfügen:</p>
<pre class="codehilite"><code class="language-python">rscott = Director(name="Ridley Scott")
glucas = Director(name="George Lucas")
unknown = Director(name="Nobody Unknown")
alien = Movie(title="Alien", director=rscott)
swars = Movie(title="Star Wars", director=glucas)
brunner = Movie(title="No Name", director=unknown)
session.flush()
session.clear()
for m in Movie.query.all():
print "Movie: name=%s director=%s" % (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 geht :)</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> 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("director")).all():
print "Movie: name=%s director=%s" % (m.title, m.director.name)</code></pre>
<p>Und schon ist es eine 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 lazyload abschalten.</p>
<pre class="codehilite"><code class="language-python">class Movie(Entity):
title = Field(String(30))
director = ManyToOne('Director', lazy=False) # <- lazyload now False
def __repr__(self):
return '<Movie "%s">' % (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 Option "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 anschaun :)</p>
<ul>
<li><a href="http://picasaweb.google.com/christian.assing/VolvoC30">Mein neuer Volvo 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 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 es!!" :)</p>
<p>Ok aber jetzt zum eigentlichen Artikel und dem Grund warum ich diesen Artikel schreiben musste. </p>
<p>Anmerkung: Das iPhone und der iPod Touch verwenden die gleiche Software und somit sind folgende Informationen für beide Geräte gleich.</p>
<h3 id="iphone-und-itunes">iPhone und 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 Windows 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 und installiert.</p>
<p>Das ist alles noch nicht die hohe Kunst, aber leider reicht das nicht um ein iPhone zu aktivieren bzw. zu syncen :(</p>
<h3 id="konfiguration-von-hal">Konfiguration von 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 angeht :)</p>
<ul>
<li>
<p>Finde die USB ID des iPhones 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 Darstellung 1452:4754</p>
</li>
<li>
<p>in /etc/hal/fdi/preprobe/10-iphone.fdi folgendes eintragen</p>
<pre class="codehilite"><code class="language-xml"><?xml version="1.0" encoding="UTF-8"?> <!-- -*- SGML -*- -->
<deviceinfo version="0.2">
<device>
<match key="usb.vendor_id" int="1452">
<match key="usb.product_id" int="4754">
<merge key="info.ignore" type="bool">true</merge>
</match>
</match>
</device>
</deviceinfo></code></pre>
</li>
<li>
<p>HAL restarten und das Linux ignoriert das iPhone und das iTunes sollte ohne Probleme funktionieren :)</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 mir :)</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 ... JUMP :)</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 war 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 paar 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 kommt 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 Installation 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 hier zeigen.</p>
<div class="toc">
<ul>
<li><a href="#problemstellung">Problemstellung</a></li>
<li><a href="#wordpress-seiteninhalte-auslesen-mit-jekyll">Wordpress Seiteninhalte auslesen mit Jekyll</a></li>
<li><a href="#von-dr-jekyll-zu-mr-hyde">Von Dr. Jekyll zu Mr. 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 Seiten ein.</p>
<h1 id="wordpress-seiteninhalte-auslesen-mit-jekyll">Wordpress Seiteninhalte auslesen mit Jekyll</h1>
<p>Erstmal die nötigen Software installieren. In meinem Fall auf einem <a href="http://www.debian.org">Debian</a> Lenny 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 Compiler ...</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> ...</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 braucht ...</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">&</span> dirty aus dem unstable installieren ...</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 Packet ...</p>
<pre class="codehilite"><code class="language-bash">gem install hoe</code></pre>
<p>Jetzt kann man mit Jekyll den Wordpress Seiten Inhalt auslesen ...</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("#{ENV["DB"]}", "#{ENV["USER"]}", "#{ENV["PASS"]}")'</code></pre>
<p>Nun hat man im Verzeichnis "_posts" alle seine Wordpress 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 Packete ...</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 Rubygems ...</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 Mr. 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 Seite sieht.</p>
<p>Hier ist noch ein Script was die umgewandelten Wordpress Postings in die Hyde Verzeichnis Strutur umwandelt. Ich glaub der Code ist selbst erklärend.</p>
<pre class="codehilite"><code class="language-text">#!/usr/bin/env bash
outdir="www.ca-net.org/content/blog/"
indir="_posts"
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 "title: " $f | cut -f2- -d":"`
# strip \" from title
title=${title//\\\"/}
# strip " from title
title=${title//\"/}
# 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="../$outdir/$year/$month/`echo $fwe | cut -f4- -d'-' | tr -s '-' '_'`.html"
# write hyde heady
cat - << __EOF__ > $outfile
{ % extends "_post.html" %}
{ % hyde
title: "$title"
created: $year-$month-$day
categories: ["private"]
%}
{ % block article %}
__EOF__
# write content
tail +7 $f >> $outfile
# write hyde footer
echo "{ % endblock %}" >> $outfile
echo "$outfile created"
done</code></pre>
<p>Achtung: Im Script sind die 2 Zeichen "{" und "%" mit einen Leerzeichen dazwischen, bitte im abgespeicherten Script bei euch ab ändern.</p>