<?xml version="1.0" encoding="utf-8"?>

<feed xmlns="http://www.w3.org/2005/Atom"><title>CA-Networks</title><link href="http://www.ca-net.org/feed/" rel="self" /><link href="http://www.ca-net.org"/><updated>2013-11-11T18:34:56Z</updated><id>http://www.ca-net.org/</id><entry><title type="html">Archives</title><author><name>Christian Assing</name></author><link href="http://www.ca-net.org/blog"/><updated>2000-01-01T00:00:00Z</updated><published>2000-01-01T00:00:00Z</published><id>http://www.ca-net.org/blog</id><content type="html"></content></entry><entry><title type="html">None</title><author><name>Christian Assing</name></author><link href="http://www.ca-net.org/hetznertest"/><updated>2000-01-01T00:00:00Z</updated><published>2000-01-01T00:00:00Z</published><id>http://www.ca-net.org/hetznertest</id><content type="html"></content></entry><entry><title type="html"> python elixir session</title><author><name>Christian Assing</name></author><link href="http://www.ca-net.org/blog/2008/04/python_elixir_session"/><updated>2008-04-14T00:00:00Z</updated><published>2008-04-14T00:00:00Z</published><id>http://www.ca-net.org/blog/2008/04/python_elixir_session</id><content type="html">
              
                
      
&lt;p&gt;
  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 :)
&lt;/p&gt;

&lt;a href=&quot;http://elixir.ematia.de/trac/wiki&quot;&gt; Elixir &lt;/a&gt; ist &quot;dünner&quot; Wrapper für die &lt;a href=&quot;http://www.sqlalchemy.org/&quot;&gt; SQLAlchemy Library &lt;/a&gt;. Beide zusammen vereinfachen den Umgang mit einer Datenbank in Python um ein vielfaches.

Hier ein kleines Beispiel mit 2 Tabellen:

&lt;pre class=&quot;prettyprint&quot;&gt;
# 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=&#39;device&#39;, inheritance=&#39;multi&#39;)

  id = Field(Integer, primary_key=True)
  name = Field(String(127), required=True, unique=True)
  domain = Field(String(255), required=True)
  interfaces = OneToMany(&#39;Interface&#39;)

  def __repr__(self):
    return &#39;Device %s&#39; % (self.name)

# second table
class Interface(Entity):
  &quot;&quot;&quot;network interfaces
  &quot;&quot;&quot;
  using_options(tablename=&#39;interface&#39;)

  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(&#39;Device&#39;)

  def __repr__(self):
    return &#39;&lt;Interface: %s ip: %s mac: %s&gt;&#39; % (
        self.name, self.ip, self.mac)

setup_all()
drop_all()
create_all()
&lt;/pre&gt;

&lt;p&gt;
  und schon kann mal auf einfache und sehr elegante Weise diese 2 Tabellen benutzen:
&lt;/p&gt;

&lt;pre class=&quot;prettyprint&quot;&gt;
# 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
&lt;/pre&gt;

&lt;p&gt;
  Ein schönes Beispiel gibt es auch im &lt;a href=&quot;http://elixir.ematia.de/trac/wiki/TutorialDivingIn&quot;&gt; Elixir Tutorial &lt;/a&gt;
&lt;/p&gt;

Noch ein kleiner Beitrag zu den elixir/sqlalchemy sessions. In der Standard Einstellung sind die Elixir sessions sogenannte &quot;scoped_session&quot;, 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:

&lt;pre class=&quot;prettyprint&quot;&gt;
import elixir

elixir.options_defaults[&#39;mapper_options&#39;] = dict(always_refresh=True)
&lt;/pre&gt;

oder bei einer Query &lt;code&gt;populate_existing()&lt;/code&gt; benutzt.


    
              
            </content></entry><entry><title type="html"> python elixir query optimierung</title><author><name>Christian Assing</name></author><link href="http://www.ca-net.org/blog/2008/06/python_elixir_query_optimierung"/><updated>2008-06-06T00:00:00Z</updated><published>2008-06-06T00:00:00Z</published><id>http://www.ca-net.org/blog/2008/06/python_elixir_query_optimierung</id><content type="html">
              
                
      
&lt;p&gt;
  Ich bin vor ein paar Tagen bei der Programmierung von PyCRMan fast verzweifelt. Wie ich schon in einem früheren Eintrag beschrieb, verwende ich &lt;a href=&quot;http://elixir.ematia.de/trac/wiki&quot;&gt; Elixir &lt;/a&gt; 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 :(
&lt;/p&gt;

&lt;p&gt;
  Nach ewig langen erfolglosem Studieren der etwas dürftigen Elixir Dokumentation bin ich nachts um ca. 1 Uhr in der &lt;a href=&quot;http://www.sqlalchemy.org/&quot;&gt; SQLAlchemy Library &lt;/a&gt; fündig geworden. Die &quot;geheimen&quot; Zauberwörter heißen &quot;lazyload&quot; und &quot;eagerload&quot;, wenn ich das nur vorher schon gewußt hätte ;)
&lt;/p&gt;

&lt;p&gt;
  Hier ein kleines Beispiel:
&lt;/p&gt;

&lt;p&gt;
  Als erstes mal ein kleines Model (ja das ist das Beispiel aus der Elixir Doku :) )
&lt;/p&gt;

&lt;pre class=&quot;prettyprint&quot;&gt;
from elixir import *
metadata.bind = &quot;sqlite:///:memory:&quot;
metadata.bind.echo = True

class Movie(Entity):
  title = Field(String(30))
  director = ManyToOne(&#39;Director&#39;)

  def __repr__(self):
    return &#39;&lt;Movie &quot;%s&quot;&gt;&#39; % (self.title)


class Director(Entity):
  name = Field(String(60))
  movies = OneToMany(&#39;Movie&#39;)

  def __repr__(self):
    return &#39;&lt;Director &quot;%s&quot;&gt;&#39; % self.name

setup_all()
create_all()
&lt;/pre&gt;

&lt;p&gt;
  Jetzt ein paar Werte einfügen:
&lt;/p&gt;

&lt;pre class=&quot;prettyprint&quot;&gt;
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)
&lt;/pre&gt;

&lt;p&gt;
  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 :)
&lt;/p&gt;

&lt;pre class=&quot;prettyprint&quot;&gt;
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]
&lt;/pre&gt;

&lt;p&gt;
  Damit aus diesen beispielhaften 4 Queries EINE wird kann man an so einer Stelle [eagerload](http://www.sqlalchemy.org/docs/04/sqlalchemy_orm.html#docstrings_sqlalchemy.orm_modfunc_eagerload) verwenden.
&lt;/p&gt;

&lt;pre class=&quot;prettyprint&quot;&gt;
# 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)
&lt;/pre&gt;

&lt;p&gt;
  Und schon ist es eine Query:
&lt;/p&gt;

&lt;pre class=&quot;prettyprint&quot;&gt;
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
&lt;/pre&gt;

&lt;p&gt;
  Alternativ zum &quot;eagerload&quot; kann man auch im Model das lazyload abschalten.
&lt;/p&gt;

&lt;pre class=&quot;prettyprint&quot;&gt;
class Movie(Entity):
  title = Field(String(30))
  director = ManyToOne(&#39;Director&#39;, lazy=False) # &lt;- lazyload now False

  def __repr__(self):
    return &#39;&lt;Movie &quot;%s&quot;&gt;&#39; % (self.title)
&lt;/pre&gt;

&lt;p&gt;
  Und wenn man mal das ganze Gegenteil braucht, kann man &lt;a href=&quot;http://www.sqlalchemy.org/docs/04/sqlalchemy_orm.html#docstrings_sqlalchemy.orm_modfunc_lazyload&quot;&gt; lazyload &lt;/a&gt; verwenden und im Model heißt die Option &lt;code&gt;deferred=True&lt;/code&gt;.
&lt;/p&gt;


    
              
            </content></entry><entry><title type="html"> Fotos</title><author><name>Christian Assing</name></author><link href="http://www.ca-net.org/blog/2009/02/fotos"/><updated>2009-02-25T00:00:00Z</updated><published>2009-02-25T00:00:00Z</published><id>http://www.ca-net.org/blog/2009/02/fotos</id><content type="html">
              
                
      

  &lt;img src=&quot;http://www.ca-net.org/media/images/blog/2009/02/c30.png&quot;&gt;

  &lt;p class=&quot;margin-top: 15px&quot;&gt;
    Ich habe eine paar neue Fotos in meine Web Gallery gestellt, viel Spaß beim anschaun :)
  &lt;/p&gt;

  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://picasaweb.google.com/canet.org/VolvoC30&quot;&gt; Mein neuer Volvo C30&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://picasaweb.google.com/canet.org/Geocachen1&quot;&gt; Geocachen &lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://picasaweb.google.com/canet.org/Wien&quot;&gt; Wien Ausflug &lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;


    
              
            </content></entry><entry><title type="html"> iPhone unter Linux</title><author><name>Christian Assing</name></author><link href="http://www.ca-net.org/blog/2009/03/iphone_unter_linux"/><updated>2009-03-28T00:00:00Z</updated><published>2009-03-28T00:00:00Z</published><id>http://www.ca-net.org/blog/2009/03/iphone_unter_linux</id><content type="html">
              
                
      
&lt;p&gt;
  Ich habe mir jetzt ein &lt;a href=&quot;http://www.apple.com/de/iphone/&quot;&gt; iPhone &lt;/a&gt; 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: &quot;Mach es!!&quot; :)
&lt;/p&gt;

&lt;p&gt;
  Ok aber jetzt zum eigentlichen Artikel und dem Grund warum ich diesen Artikel schreiben musste.
&lt;/p&gt;

&lt;p&gt;
  Anmerkung: Das iPhone und der iPod Touch verwenden die gleiche Software und somit sind folgende Informationen für beide Geräte gleich.
&lt;/p&gt;


&lt;h3&gt;iPhone und iTunes&lt;/h3&gt;

&lt;p&gt;
  Bevor man das iPhone benutzten kann (telefonieren usw.) muss es via der &lt;a href=&quot;http://www.apple.com/de/itunes/&quot;&gt; iTunes Software &lt;/a&gt; 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: &lt;a href=&quot;http://www.vmware.com&quot;&gt; VMware &lt;/a&gt;!
&lt;/p&gt;


&lt;h3&gt;iTunes in einem VMware Windows XP&lt;/h3&gt;

&lt;p&gt;
  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.
&lt;/p&gt;

&lt;p&gt;
  Das ist alles noch nicht die hohe Kunst, aber leider reicht das nicht um ein iPhone zu aktivieren bzw. zu syncen :(
&lt;/p&gt;


&lt;h3&gt;Konfiguration von HAL&lt;/h3&gt;

&lt;p&gt;
  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 &lt;a href=&quot;http://freedesktop.org/wiki/Software/hal&quot;&gt; HAL &lt;/a&gt;, das das iPhone ihn nix angeht :)
&lt;/p&gt;

&lt;p&gt;
  Finde die USB ID des iPhones heraus
&lt;/p&gt;

&lt;pre class=&quot;prettyprint&quot;&gt;
  # lsusb
  [snip]
  Bus 002 Device 002: ID 05ac:1292 Apple, Inc.
&lt;/pre&gt;

&lt;p&gt;
 die USB ID (hier &lt;code&gt; 05ac:1292 &lt;/code&gt;) ist in der Hex Darstellung, das HAL braucht sie in der Dezimal Darstellung &lt;code&gt; 1452:4754 &lt;/code&gt;
 in &lt;code&gt;/etc/hal/fdi/preprobe/10-iphone.fdi&lt;/code&gt; folgendes eintragen
&lt;/p&gt;

&lt;pre class=&quot;prettyprint&quot;&gt;
  &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;
&lt;/pre&gt;

&lt;p&gt;
 HAL restarten und das Linux ignoriert das iPhone und das iTunes sollte ohne Probleme funktionieren :)
&lt;/p&gt;

    
              
            </content></entry><entry><title type="html"> Kletterwald Hohenfelden</title><author><name>Christian Assing</name></author><link href="http://www.ca-net.org/blog/2009/04/kletterwald_hohenfelden"/><updated>2009-04-30T00:00:00Z</updated><published>2009-04-30T00:00:00Z</published><id>http://www.ca-net.org/blog/2009/04/kletterwald_hohenfelden</id><content type="html">
              
                
      

&lt;div class=&quot;row&quot;&gt;
  &lt;div class=&quot;span4&quot;&gt;
  Hier ein paar Fotos zum Ausflug in den &lt;a href=&quot;http://www.kletterwald-hohenfelden.de/&quot;&gt;Kletterwald Hohenfelden&lt;/a&gt; von David und mir :)
  &lt;/div&gt;

  &lt;div class=&quot;span7&quot;&gt;
  &lt;table style=&quot;width:194px;&quot;&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; style=&quot;height:194px;background:url(http://picasaweb.google.com/s/c/transparent_album_background.gif) no-repeat left&quot;&gt;&lt;a href=&quot;http://picasaweb.google.com/canet.org/KletterwaldHohenfelden?feat=embedwebsite&quot;&gt;&lt;img src=&quot;http://lh6.ggpht.com/_lPet4fv-M6s/Sflrw41KSsE/AAAAAAAABTM/BCcilMCKMeI/s160-c/KletterwaldHohenfelden.jpg&quot; width=&quot;160&quot; height=&quot;160&quot; style=&quot;margin:1px 0 0 4px;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;font-family:arial,sans-serif;font-size:11px&quot;&gt;&lt;a href=&quot;http://picasaweb.google.com/canet.org/KletterwaldHohenfelden?feat=embedwebsite&quot; style=&quot;color:#4D4D4D;font-weight:bold;text-decoration:none;&quot;&gt;Kletterwald Hohenfelden&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
  &lt;/div&gt;
&lt;/div&gt;


    
              
            </content></entry><entry><title type="html"> Bungy</title><author><name>Christian Assing</name></author><link href="http://www.ca-net.org/blog/2009/07/bungy"/><updated>2009-07-27T00:00:00Z</updated><published>2009-07-27T00:00:00Z</published><id>http://www.ca-net.org/blog/2009/07/bungy</id><content type="html">
              
                
      
&lt;div class=&quot;row&quot;&gt;
  &lt;div class=&quot;span4&quot;&gt;
  Ich habe es getan und mich, nur an einem Gummiseil befestigt, von der 96m hohen &lt;a href=&quot;http://bungy.at/de/index_bungee.php&quot;&gt;Jauntal Brücke&lt;/a&gt; gestürzt. 3 ... 2 ... 1 ... JUMP :)
  &lt;/div&gt;

  &lt;div class=&quot;span7&quot;&gt;
  &lt;table style=&quot;width:194px;&quot;&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; style=&quot;height:194px;background:url(http://picasaweb.google.com/s/c/transparent_album_background.gif) no-repeat left&quot;&gt;&lt;a href=&quot;http://picasaweb.google.com/canet.org/Bungy?feat=embedwebsite&quot;&gt;&lt;img src=&quot;http://lh6.ggpht.com/_lPet4fv-M6s/Sm06WXKYWdE/AAAAAAAABf8/YGcTSE-2CbQ/s160-c/Bungy.jpg&quot; width=&quot;160&quot; height=&quot;160&quot; style=&quot;margin:1px 0 0 4px;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;font-family:arial,sans-serif;font-size:11px&quot;&gt;&lt;a href=&quot;http://picasaweb.google.com/canet.org/Bungy?feat=embedwebsite&quot; style=&quot;color:#4D4D4D;font-weight:bold;text-decoration:none;&quot;&gt;Bungy&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
  &lt;/div&gt;
&lt;/div&gt;


    
              
            </content></entry><entry><title type="html"> Bungy Video</title><author><name>Christian Assing</name></author><link href="http://www.ca-net.org/blog/2009/07/bungy_video"/><updated>2009-07-27T00:00:00Z</updated><published>2009-07-27T00:00:00Z</published><id>http://www.ca-net.org/blog/2009/07/bungy_video</id><content type="html">
              
                
      
&lt;object width=&quot;400&quot; height=&quot;300&quot; &gt;&lt;param name=&quot;allowfullscreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot; /&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.facebook.com/v/1029839126414&quot; /&gt;&lt;embed src=&quot;http://www.facebook.com/v/1029839126414&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;400&quot; height=&quot;300&quot;&gt;&lt;/embed&gt;&lt;/object&gt;

    
              
            </content></entry><entry><title type="html"> Kärtnen Läuft Halbmarathon</title><author><name>Christian Assing</name></author><link href="http://www.ca-net.org/blog/2009/08/kartnen_lauft_halbmarathon"/><updated>2009-08-23T00:00:00Z</updated><published>2009-08-23T00:00:00Z</published><id>http://www.ca-net.org/blog/2009/08/kartnen_lauft_halbmarathon</id><content type="html">
              
                
      
&lt;div class=&quot;span4&quot;&gt;
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.
&lt;/div&gt;

&lt;img src=&quot;/media/images/blog/2009/08/hm_karnten_laeuft.jpg&quot;&gt;


    
              
            </content></entry><entry><title type="html"> Kletterwochenende in Arco Italien</title><author><name>Christian Assing</name></author><link href="http://www.ca-net.org/blog/2009/08/kletterwochenende_in_arco_italien"/><updated>2009-08-08T00:00:00Z</updated><published>2009-08-08T00:00:00Z</published><id>http://www.ca-net.org/blog/2009/08/kletterwochenende_in_arco_italien</id><content type="html">
              
                
      
&lt;table style=&quot;width:194px;&quot;&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; style=&quot;height:194px;background:url(http://picasaweb.google.com/s/c/transparent_album_background.gif) no-repeat left&quot;&gt;&lt;a href=&quot;http://picasaweb.google.com/canet.org/KletternInArco?feat=embedwebsite&quot;&gt;&lt;img src=&quot;http://lh4.ggpht.com/_lPet4fv-M6s/Sn1qlzqUicE/AAAAAAAABlc/Tp_d1Y5YMaM/s160-c/KletternInArco.jpg&quot; width=&quot;160&quot; height=&quot;160&quot; style=&quot;margin:1px 0 0 4px;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;font-family:arial,sans-serif;font-size:11px&quot;&gt;&lt;a href=&quot;http://picasaweb.google.com/canet.org/KletternInArco?feat=embedwebsite&quot; style=&quot;color:#4D4D4D;font-weight:bold;text-decoration:none;&quot;&gt;Klettern in Arco&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

    
              
            </content></entry><entry><title type="html"> Kletterwochenende in Osp Slowenien</title><author><name>Christian Assing</name></author><link href="http://www.ca-net.org/blog/2009/08/kletterwochenende_in_osp_slowenien"/><updated>2009-08-08T00:00:00Z</updated><published>2009-08-08T00:00:00Z</published><id>http://www.ca-net.org/blog/2009/08/kletterwochenende_in_osp_slowenien</id><content type="html">
              
                
      
&lt;table style=&quot;width:194px;&quot;&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; style=&quot;height:194px;background:url(http://picasaweb.google.com/s/c/transparent_album_background.gif) no-repeat left&quot;&gt;&lt;a href=&quot;http://picasaweb.google.com/canet.org/KletternInOsp?feat=embedwebsite&quot;&gt;&lt;img src=&quot;http://lh3.ggpht.com/_lPet4fv-M6s/Sn1nkVrR49E/AAAAAAAABiM/8OSgSX-8X50/s160-c/KletternInOsp.jpg&quot; width=&quot;160&quot; height=&quot;160&quot; style=&quot;margin:1px 0 0 4px;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;font-family:arial,sans-serif;font-size:11px&quot;&gt;&lt;a href=&quot;http://picasaweb.google.com/canet.org/KletternInOsp?feat=embedwebsite&quot; style=&quot;color:#4D4D4D;font-weight:bold;text-decoration:none;&quot;&gt;Klettern in Osp&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

    
              
            </content></entry><entry><title type="html"> Fallschirmspringen</title><author><name>Christian Assing</name></author><link href="http://www.ca-net.org/blog/2009/09/fallschirmspringen"/><updated>2009-09-07T00:00:00Z</updated><published>2009-09-07T00:00:00Z</published><id>http://www.ca-net.org/blog/2009/09/fallschirmspringen</id><content type="html">
              
                
      

&lt;div class=&quot;row&quot;&gt;
  &lt;div class=&quot;span4&quot;&gt;
    Wir waren am Wochenende Fallschirmspringen und haben es alle unbeschadet überlebt ;) Ich kann es nur jedem empfehlen!!! Hier ein paar Eindrücke:
  &lt;/div&gt;

  &lt;div class=&quot;span7&quot;&gt;
    &lt;table style=&quot;width:194px;&quot;&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; style=&quot;height:194px;background:url(http://picasaweb.google.com/s/c/transparent_album_background.gif) no-repeat left&quot;&gt;&lt;a href=&quot;http://picasaweb.google.com/canet.org/Fallschirmspringen?feat=embedwebsite&quot;&gt;&lt;img src=&quot;http://lh6.ggpht.com/_lPet4fv-M6s/SqU27MeRgbE/AAAAAAAABpo/KB8u7CePn6Y/s160-c/Fallschirmspringen.jpg&quot; width=&quot;160&quot; height=&quot;160&quot; style=&quot;margin:1px 0 0 4px;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;font-family:arial,sans-serif;font-size:11px&quot;&gt;&lt;a href=&quot;http://picasaweb.google.com/canet.org/Fallschirmspringen?feat=embedwebsite&quot; style=&quot;color:#4D4D4D;font-weight:bold;text-decoration:none;&quot;&gt;Fallschirmspringen&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
  &lt;/div&gt;
&lt;/div&gt;

    
              
            </content></entry><entry><title type="html"> Mozartclub Geburtstagsfeier zum 30.</title><author><name>Christian Assing</name></author><link href="http://www.ca-net.org/blog/2009/10/mozartclub_geburtstagsfeier_zum_30"/><updated>2009-10-13T00:00:00Z</updated><published>2009-10-13T00:00:00Z</published><id>http://www.ca-net.org/blog/2009/10/mozartclub_geburtstagsfeier_zum_30</id><content type="html">
              
                
      
&lt;table style=&quot;width:194px;&quot;&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; style=&quot;height:194px;background:url(http://picasaweb.google.com/s/c/transparent_album_background.gif) no-repeat left&quot;&gt;&lt;a href=&quot;http://picasaweb.google.com/canet.org/GeburtstagsfeierImMozartclubZuMeinem30?feat=embedwebsite&quot;&gt;&lt;img src=&quot;http://lh6.ggpht.com/_lPet4fv-M6s/StSD_t4YujE/AAAAAAAABuU/oojD8I74z8k/s160-c/GeburtstagsfeierImMozartclubZuMeinem30.jpg&quot; width=&quot;160&quot; height=&quot;160&quot; style=&quot;margin:1px 0 0 4px;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;font-family:arial,sans-serif;font-size:11px&quot;&gt;&lt;a href=&quot;http://picasaweb.google.com/canet.org/GeburtstagsfeierImMozartclubZuMeinem30?feat=embedwebsite&quot; style=&quot;color:#4D4D4D;font-weight:bold;text-decoration:none;&quot;&gt;Geburtstagsfeier im Mozartclub zu meinem 30.&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

    
              
            </content></entry><entry><title type="html">Von Wordpress zu statischen HTML Seiten</title><author><name>Christian Assing</name></author><link href="http://www.ca-net.org/blog/2010/02/wordpress_turned_off"/><updated>2010-02-07T00:00:00Z</updated><published>2010-02-07T00:00:00Z</published><id>http://www.ca-net.org/blog/2010/02/wordpress_turned_off</id><content type="html">
              
                
      


  &lt;p&gt;
    ... oder &quot;Wenn Designer jetzt PHP Code schreiben, dann muss ich meine Wordpress Installation abdrehen&quot;.
  &lt;/p&gt;

  &lt;p&gt;
    Ich war gestern auf den &lt;a href=&quot;http://www.barcamp.at/BarCamp_Klagenfurt_2010&quot;&gt; Barcamp Klagenfurt 2010 &lt;/a&gt; und nahm zufällig an einer Session zum Thema &quot;Wordpress Themes&quot; 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.
  &lt;/p&gt;

  &lt;h3&gt;Problemstellung&lt;/h3&gt;

  &lt;p&gt;
    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 &lt;a href=&quot;http://github.com/mojombo/jekyll&quot;&gt; Jekyll &lt;/a&gt; entschieden. Diese Tool, welches selbst ein &quot;static site generator&quot; ist, möchte ich aber nur in der Migration Phase verwenden, danach bzw. jetzt setze ich &lt;a href=&quot;http://ringce.com/hyde&quot;&gt; Hyde &lt;/a&gt; für die Generierung meiner Seiten ein.
  &lt;/p&gt;

  &lt;h3&gt;Wordpress Seiteninhalte auslesen mit Jekyll&lt;/h3&gt;

  &lt;p&gt;
    Erstmal die nötigen Software installieren. In meinem Fall auf einem &lt;a href=&quot;http://www.debian.org&quot;&gt; Debian &lt;/a&gt; Lenny Server.
  &lt;/p&gt;

  &lt;p&gt;
    Das es das &lt;a href=&quot;http://github.com/mojombo/jekyll&quot;&gt; Jekyll &lt;/a&gt; nicht als Debian Packet gibt, muss man es von hand installieren. Erst einmal Ruby und Compiler ...
  &lt;/p&gt;

&lt;pre class=&quot;prettyprint&quot;&gt;
apt-get install ruby ruby1.8-dev rubygems build-essential libmysqlclient15-dev
&lt;/pre&gt;

  &lt;p&gt;
    Jetzt Jekyll ...
  &lt;/p&gt;

&lt;pre class=&quot;prettyprint&quot;&gt;
gem sources -a http://gems.github.com
gem install mojombo-jekyll
&lt;/pre&gt;

  &lt;p&gt;
    Nun weitere Ruby Packete die das Jekyll braucht ...
  &lt;/p&gt;

&lt;pre class=&quot;prettyprint&quot;&gt;
gem install mysql
gem install sequel
gem install rake-compiler -v 0.5.0
&lt;/pre&gt;

  &lt;p&gt;
    Da im Lenny ein zu altes rubygems vorhanden ist, quick &amp; dirty aus dem unstable installieren ...
  &lt;/p&gt;

&lt;pre class=&quot;prettyprint&quot;&gt;
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
&lt;/pre&gt;

  &lt;p&gt;
    Nun das letzte Ruby Packet ...
  &lt;/p&gt;

 &lt;pre class=&quot;prettyprint&quot;&gt;
gem install hoe
&lt;/pre&gt;

  &lt;p&gt;
    Jetzt kann man mit Jekyll den Wordpress Seiten Inhalt auslesen ...
  &lt;/p&gt;

&lt;pre class=&quot;prettyprint&quot;&gt;
export DB=my_wordpress_db
export USER=dbuser
export PASS=dbpass

ruby -r &#39;/var/lib/gems/1.8/gems/mojombo-jekyll-__VERS__/lib/jekyll/converters/wordpress&#39; \
     -e &#39;Jekyll::WordPress.process(&quot;#{ENV[&quot;DB&quot;]}&quot;, &quot;#{ENV[&quot;USER&quot;]}&quot;, &quot;#{ENV[&quot;PASS&quot;]}&quot;)&#39;
&lt;/pre&gt;

  &lt;p&gt;
    Nun hat man im Verzeichnis &quot;_posts&quot; alle seine Wordpress Inhalte.
    Da ich auf meinen Server keine Ruby installiert haben will und schon garnicht einen Compiler, fliegt alles wieder runter. Zu erste die Debian Packete ...
  &lt;/p&gt;

&lt;pre class=&quot;prettyprint&quot;&gt;
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
&lt;/pre&gt;

  &lt;p&gt;
    Danach die installierten Rubygems ...
  &lt;/p&gt;

&lt;pre class=&quot;prettyprint&quot;&gt;
rm -rf /var/lib/gems
&lt;/pre&gt;

  &lt;h3&gt;Von Dr. Jekyll zu Mr. Hyde&lt;/h3&gt;

  &lt;p&gt;
    Nun ist der Weg geebnet und ich konnte auf Hyde umsteigen. Ich bin dabei einer Anleitung von &lt;a href=&quot;http://stevelosh.com/blog/2010/01/moving-from-django-to-hyde/&quot;&gt; Steve Losh &lt;/a&gt; gefolgt, der seine Seite ebenfalls mit Hyde betreibt. Da es mit Beispielen immer leichter geht, kann ich noch &lt;a href=&quot;http://github.com/sjl/stevelosh/&quot;&gt; Steve Losh Git &lt;/a&gt; empfehlen, in dem man den kompletten Code seiner Seite sieht.
  &lt;/p&gt;

  &lt;p&gt;
    Hier ist noch ein Script was die umgewandelten Wordpress Postings in die Hyde Verzeichnis Struktur umwandelt. Ich glaub der Code ist selbst erklärend.
  &lt;/p&gt;

&lt;pre class=&quot;prettyprint&quot;&gt;
#!/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&#39;-&#39;`
  month=`echo $f | cut -f2 -d&#39;-&#39;`
  day=`echo $f | cut -f3 -d&#39;-&#39;`

  # 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&#39;-&#39; | tr -s &#39;-&#39; &#39;_&#39;`.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
&lt;/pre&gt;

  &lt;div class=&quot;alert alert-error&quot;&gt;
    Achtung: Im Script sind die 2 Zeichen &quot;{&quot; und &quot;%&quot; mit einen Leerzeichen dazwischen, bitte im abgespeicherten Script bei euch ab ändern.
  &lt;/div&gt;

  &lt;h6&gt; Links &lt;/h6&gt;
  &lt;ul&gt;
    &lt;li&gt; Barcamp Klagenfurt 2010: &lt;a href=&quot;http://www.barcamp.at/BarCamp_Klagenfurt_2010&quot;&gt;http://www.barcamp.at/BarCamp_Klagenfurt_2010&lt;/a&gt; &lt;/li&gt;
    &lt;li&gt; Jekyll: &lt;a href=&quot;http://github.com/mojombo/jekyll&quot;&gt;http://github.com/mojombo/jekyll&lt;/a&gt; &lt;/li&gt;
    &lt;li&gt; Hyde: &lt;a href=&quot;http://ringce.com/hyde&quot;&gt;http://ringce.com/hyde&lt;/a&gt; &lt;/li&gt;
    &lt;li&gt; Debian: &lt;a href=&quot;http://www.debian.org&quot;&gt;http://www.debian.org&lt;/a&gt; &lt;/li&gt;
    &lt;li&gt; Steve Losh: &lt;a href=&quot;http://stevelosh.com/blog/2010/01/moving-from-django-to-hyde/&quot;&gt;http://stevelosh.com/blog/2010/01/moving-from-django-to-hyde/&lt;/a&gt; &lt;/li&gt;
    &lt;li&gt; Steve Losh GIT: &lt;a href=&quot;http://github.com/sjl/stevelosh/&quot;&gt;http://github.com/sjl/stevelosh/&lt;/a&gt; &lt;/li&gt;
    &lt;li&gt; Fabric: &lt;a href=&quot;http://fabfile.org&quot;&gt;http://fabfile.org/&lt;/a&gt; &lt;/li&gt;
  &lt;/ul&gt;


    
              
            </content></entry><entry><title type="html">Lanyrd Web Application Tricks</title><author><name>Christian Assing</name></author><link href="http://www.ca-net.org/blog/2012/02/lanyrd-talk"/><updated>2012-02-11T00:00:00Z</updated><published>2012-02-11T00:00:00Z</published><id>http://www.ca-net.org/blog/2012/02/lanyrd-talk</id><content type="html">
              
                
      
  &lt;p style=&quot;margin-top: 15px&quot;&gt;
    Ich habe vor kurzen den sehr interessante Talk &lt;a href=&quot;http://lanyrd.com/2011/brightonpy-building-lanyrd/sgptt/&quot;&gt;Building Lanyrd&lt;/a&gt; von dem &lt;a href=&quot;http://lanyrd.com&quot;&gt;Lanyrd&lt;/a&gt; Co-Founder &lt;a href=&quot;http://en.wikipedia.org/wiki/Simon_Willison&quot;&gt;Simon Willison&lt;/a&gt; gesehen. Am Ende seines Talks zeigt/beschreibt er ein paar Tipps&amp;amp;Tricks die ich ziemlich gut finde. Damit ich diese nicht vergesse, will ich sie hier festhalten :)
  &lt;/p&gt;

  &lt;h2&gt;Phantom Load Testing&lt;/h2&gt;
  &lt;ul style=&quot;list-style-type: square; margin-left: 20px&quot;&gt;
    &lt;li&gt;Neue Version der Site auf eigenen Server/Cluster deployen&lt;/li&gt;
    &lt;li&gt;Alte Version der Site bestehen lassen&lt;/li&gt;
    &lt;li&gt;Unsichtbaren img link &lt;code&gt;&amp;lt;img src=&#39;new_server/cluster&#39; width=1 heigth=1&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;/ul&gt;

  &lt;h2&gt;cache_version&lt;/h2&gt;
  &lt;ul style=&quot;list-style-type: square; margin-left: 20px&quot;&gt;
    &lt;li&gt; model.py
      &lt;pre class=&quot;prettyprint&quot;&gt;
class Conference(models.Model):
  ...
  cache_version = models.IntegerField(default=0)
  ...
  def save(self, *args, **kwargs):
    self.cache_version += 1
    super(Conference, self).save(*args, **kwargs)
      &lt;/pre&gt;
    &lt;/li&gt;
    &lt;li&gt; template.html
      &lt;pre class=&quot;prettyprint&quot;&gt;

{%&amp;nbsp;cache 36000 conf-topics conference.pk conference.cache_version&amp;nbsp;%}
  the cached template code

  {{&amp;nbsp;conference.name&amp;nbsp}} ...

  {%&amp;nbsp;for topic in conference.topics.all&amp;nbsp;%}
    {{&amp;nbsp;topic.description&amp;nbsp;}}
  {%&amp;nbsp;endfor&amp;nbsp;%}
{%&amp;nbsp;endcase&amp;nbsp;%}

      &lt;/pre&gt;
    &lt;/li&gt;
  &lt;/ul&gt;

  &lt;h2&gt;Signing&lt;/h2&gt;
  &lt;ul style=&quot;list-style-type: square; margin-left: 20px&quot;&gt;
    &lt;li&gt;Django &gt;= 1.4&lt;/li&gt;
    &lt;li&gt;zb Username im Cookie &#39;abspeichern&#39; für &#39;You are logged in as foobar&#39;. Somit kein Datenbankzugriff nötig&lt;/li&gt;
    &lt;li&gt;
      &lt;pre class=&quot;prettyprint&quot;&gt;
from django.core import signing

signing.dumps({&quot;foo&quot;: &quot;bar&quot;})

signing.loads(signed_string)

response.set_signed_cookie(key, value, ...)

response.get_signed_cookie(key)
      &lt;/pre&gt;
    &lt;/li&gt;
  &lt;/ul&gt;

  &lt;h2&gt;Hash static asset filesnames&lt;/h2&gt;
  &lt;ul style=&quot;list-style-type: square; margin-left: 20px&quot;&gt;
    &lt;li&gt;
      &lt;pre class=&quot;prettyprint&quot;&gt;
global.js

global.ed1d119.js

static.foobar.host.com/js/global.ed1d119.js
&lt;/pre&gt;
    &lt;/li&gt;
    &lt;li&gt;Benefits
      &lt;ul style=&quot;list-style-type: square; margin-left: 20px&quot;&gt;
        &lt;li&gt;Far future expiry header
          &lt;pre class=&quot;prettyprint&quot;&gt;
Cache-Control: max-age=315360000
Expires: Fri, 18 Jun 2021 00:00:00 -0000 GMT
&lt;/pre&gt;
        &lt;/li&gt;
        &lt;li&gt;Keine Client Cache Problem mit CSS oder JS (zb im IE)&lt;/li&gt;
        &lt;li&gt;Deployment von assets in advance&lt;/li&gt;
        &lt;li&gt;schnelles Rollback möglich, alte Version ist noch auf der Platte&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;./manage.py push_static
      &lt;ul style=&quot;list-style-type: square; margin-left: 20px&quot;&gt;
        &lt;li&gt;Minifies JS and CSS&lt;/li&gt;
        &lt;li&gt;Renames files to include sha1(contents)[:6]&lt;/li&gt;
        &lt;li&gt;Push all assets to static server&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
  &lt;/ul&gt;

  &lt;h2&gt;mysql-proxy&lt;/h2&gt;
  &lt;ul style=&quot;list-style-type: square; margin-left: 20px&quot;&gt;
    &lt;li&gt;Lua customisable proxy für mysql traffic&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://gist.github.com/1039751&quot;&gt;log.lua&lt;/a&gt; - logs out ALL queries &lt;/li&gt;
  &lt;/ul&gt;

  &lt;h2&gt;NoSQL == Not Only SQL&lt;/h2&gt;
  &lt;ul style=&quot;list-style-type: square; margin-left: 20px&quot;&gt;
    &lt;li&gt;Suchen statt Datenbank Joins&lt;/li&gt;
    &lt;li&gt;Die Joins denormalisieren und Daten in Redis und Solr ablegen&lt;/li&gt;
  &lt;/ul&gt;

  &lt;h2&gt;MVC Mini Profiler&lt;/h2&gt;
  &lt;ul style=&quot;list-style-type: square; margin-left: 20px&quot;&gt;
    &lt;li&gt;&lt;a href=&quot;http://www.codinghorror.com/blog/2011/06/performance-is-a-feature.html&quot;&gt;http://www.codinghorror.com/blog/2011/06/performance-is-a-feature.html&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;Die Joins denormalisieren und Daten in Redis und Solr ablegen&lt;/li&gt;
  &lt;/ul&gt;

  &lt;h2&gt;Global Settings are BAD&lt;/h2&gt;
  &lt;ul style=&quot;list-style-type: square; margin-left: 20px&quot;&gt;
    &lt;li&gt;Feature Switches verwenden (gargoyle)&lt;/li&gt;
    &lt;li&gt;Einstellungen (DEBUG, TIME_ZONE, MIDDLEWARE, ...) in DB ablegen&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;
    &lt;h6&gt; Links &lt;/h6&gt;
    &lt;table class=&quot;table table-bordered table-striped&quot;&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
         &lt;th&gt;Talk + Slides&lt;/th&gt;
         &lt;td&gt;&lt;a href=&quot;http://lanyrd.com/2011/brightonpy-building-lanyrd/sgptt/&quot;&gt;http://lanyrd.com/2011/brightonpy-building-lanyrd/sgptt/&lt;/a&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;th&gt;Lanyrd&lt;/th&gt;
          &lt;td&gt;&lt;a href=&quot;http://lanyrd.com&quot;&gt;http://lanyrd.com&lt;/a&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;th&gt;log.lua&lt;/th&gt;
          &lt;td&gt;&lt;a href=&quot;https://gist.github.com/1039751&quot;&gt;https://gist.github.com/1039751&lt;/a&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;th&gt;MVC Mini Profiler&lt;/th&gt;
          &lt;td&gt;&lt;a href=&quot;http://www.codinghorror.com/blog/2011/06/performance-is-a-feature.html&quot;&gt;http://www.codinghorror.com/blog/2011/06/performance-is-a-feature.html&lt;/a&gt;&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/p&gt;

    
              
            </content></entry><entry><title type="html">CA-Networks update</title><author><name>Christian Assing</name></author><link href="http://www.ca-net.org/blog/2012/02/canet_update"/><updated>2012-02-07T00:00:00Z</updated><published>2012-02-07T00:00:00Z</published><id>http://www.ca-net.org/blog/2012/02/canet_update</id><content type="html">
              
                
      
  &lt;p&gt;
    Auf den Tag genau 2 Jahre nach meinen letzten Posting habe ich endlich mal wieder meinen Blog aufgefrischt.
  &lt;/p&gt;

  &lt;p&gt;
    Design: &lt;a href=&quot;http://twitter.github.com/bootstrap/&quot;&gt; Twitter Bootstrap &lt;/a&gt;
  &lt;/p&gt;

  &lt;p&gt;
    Kommentarfunktion: &lt;a href=&quot;http://disqus.com&quot;&gt; Disqus &lt;/a&gt; (macht weiter so Jungs)
  &lt;/p&gt;

  &lt;p&gt;
    Noch immer powered by &lt;a href=&quot;http://www.python.org&quot;&gt; Python &lt;/a&gt; und &lt;a href=&quot;http://ringce.com/hyde&quot;&gt; Hyde&lt;/a&gt;.
  &lt;/p&gt;

  &lt;h6&gt; Links &lt;/h6&gt;
  &lt;ul&gt;
    &lt;li&gt; Twitter Bootstrap: &lt;a href=&quot;http://twitter.github.com/bootstrap/&quot;&gt;http://twitter.github.com/bootstrap/&lt;/a&gt; &lt;/li&gt;
    &lt;li&gt; Disqus: &lt;a href=&quot;http://disqus.com&quot;&gt;http://disqus.com&lt;/a&gt; &lt;/li&gt;
    &lt;li&gt; Hyde: &lt;a href=&quot;http://ringce.com/hyde&quot;&gt;http://ringce.com/hyde&lt;/a&gt; &lt;/li&gt;
  &lt;/ul&gt;


    
              
            </content></entry><entry><title type="html">InstaDoc</title><author><name>Christian Assing</name></author><link href="http://www.ca-net.org/blog/2012/02/instadoc"/><updated>2012-02-07T00:00:00Z</updated><published>2012-02-07T00:00:00Z</published><id>http://www.ca-net.org/blog/2012/02/instadoc</id><content type="html">
              
                
      
  &lt;img src=&quot;http://www.ca-net.org/media/images/blog/2012/02/instadoc.png&quot;&gt;

  &lt;p style=&quot;margin-top: 15px&quot;&gt;
    Ich wollte mir schon seit einiger Zeit das JavaScript Framework &lt;a href=&quot;http://backbonejs.org/&quot;&gt; Backbone.js &lt;/a&gt; anschauen.
    Als Demo zu diesem Framework habe ich &lt;a href=&quot;http://instadoc.ca-net.org&quot;&gt; InstaDoc &lt;/a&gt; gebaut, eine WebApp mit der man schnell in Dokumentationen nachschlagen kann, zZ. weil ich diese am meisten brauche, Python, CSS, JavaScript, HTML und jQuery.

    Die Applikation ist in Python/Django geschrieben und benutzt ausserdem &lt;a href=&quot;http://twitter.github.com/bootstrap/&quot;&gt; Twitter Bootstrap &lt;/a&gt; für das Design.&lt;br/&gt;
    Der Quellcode steht in meinem &lt;a href=&quot;http://github.com/chassing/instadoc&quot;&gt; GitHub &lt;/a&gt; Repository zur verfügung.
  &lt;/p&gt;

  &lt;p&gt;
    &lt;h6&gt; Links &lt;/h6&gt;
    &lt;ul&gt;
      &lt;li&gt; InstaDoc: &lt;a href=&quot;http://instadoc.ca-net.org&quot;&gt;http://instadoc.ca-net.org&lt;/a&gt; &lt;/li&gt;
      &lt;li&gt; Backbone.js: &lt;a href=&quot;http://backbonejs.org/&quot;&gt;http://backbonejs.org/&lt;/a&gt; &lt;/li&gt;
      &lt;li&gt; GitHub: &lt;a href=&quot;http://github.com/chassing/instadoc&quot;&gt;http://github.com/chassing/instadoc&lt;/a&gt; &lt;/li&gt;
      &lt;li&gt; Twitter Bootstrap: &lt;a href=&quot;http://twitter.github.com/bootstrap/&quot;&gt;http://twitter.github.com/bootstrap/&lt;/a&gt; &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/p&gt;

    
              
            </content></entry></feed>
