CA-Networks2010-02-07T21:31:28Zhttp://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>
<div class="codehilite"><pre><span class="c"># import elixir stuff</span>
<span class="kn">from</span> <span class="nn">elixir</span> <span class="kn">import</span> <span class="o">*</span>
<span class="c"># setup db connection</span>
<span class="n">metadata</span><span class="o">.</span><span class="n">bind</span> <span class="o">=</span> <span class="s">"sqlite:///movies.sqlite"</span>
<span class="n">metadata</span><span class="o">.</span><span class="n">bind</span><span class="o">.</span><span class="n">echo</span> <span class="o">=</span> <span class="bp">True</span>
<span class="c"># first table</span>
<span class="k">class</span> <span class="nc">Device</span><span class="p">(</span><span class="n">Entity</span><span class="p">):</span>
<span class="sd">"""representation of a device</span>
<span class="sd"> """</span>
<span class="n">using_options</span><span class="p">(</span><span class="n">tablename</span><span class="o">=</span><span class="s">'device'</span><span class="p">,</span> <span class="n">inheritance</span><span class="o">=</span><span class="s">'multi'</span><span class="p">)</span>
<span class="nb">id</span> <span class="o">=</span> <span class="n">Field</span><span class="p">(</span><span class="n">Integer</span><span class="p">,</span> <span class="n">primary_key</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">Field</span><span class="p">(</span><span class="n">String</span><span class="p">(</span><span class="mi">127</span><span class="p">),</span> <span class="n">required</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">unique</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">domain</span> <span class="o">=</span> <span class="n">Field</span><span class="p">(</span><span class="n">String</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span> <span class="n">required</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">interfaces</span> <span class="o">=</span> <span class="n">OneToMany</span><span class="p">(</span><span class="s">'Interface'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s">'Device </span><span class="si">%s</span><span class="s">'</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="c"># second table</span>
<span class="k">class</span> <span class="nc">Interface</span><span class="p">(</span><span class="n">Entity</span><span class="p">):</span>
<span class="sd">"""network interfaces</span>
<span class="sd"> """</span>
<span class="n">using_options</span><span class="p">(</span><span class="n">tablename</span><span class="o">=</span><span class="s">'interface'</span><span class="p">)</span>
<span class="nb">id</span> <span class="o">=</span> <span class="n">Field</span><span class="p">(</span><span class="n">Integer</span><span class="p">,</span> <span class="n">primary_key</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">Field</span><span class="p">(</span><span class="n">String</span><span class="p">(</span><span class="mi">16</span><span class="p">),</span> <span class="n">required</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">ip</span> <span class="o">=</span> <span class="n">Field</span><span class="p">(</span><span class="n">String</span><span class="p">(</span><span class="mi">38</span><span class="p">),</span> <span class="n">required</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">unique</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">mac</span> <span class="o">=</span> <span class="n">Field</span><span class="p">(</span><span class="n">String</span><span class="p">(</span><span class="mi">17</span><span class="p">),</span> <span class="n">unique</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">device</span> <span class="o">=</span> <span class="n">ManyToOne</span><span class="p">(</span><span class="s">'Device'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s">'<Interface: </span><span class="si">%s</span><span class="s"> ip: </span><span class="si">%s</span><span class="s"> mac: </span><span class="si">%s</span><span class="s">>'</span> <span class="o">%</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">ip</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">mac</span><span class="p">)</span>
<span class="n">setup_all</span><span class="p">()</span>
<span class="n">drop_all</span><span class="p">()</span>
<span class="n">create_all</span><span class="p">()</span>
</pre></div>
<p>und schon kann mal auf einfache und sehr elegante Weise diese 2 Tabellen benutzen:</p>
<div class="codehilite"><pre><span class="c"># create new device object</span>
<span class="n">device</span> <span class="o">=</span> <span class="n">Device</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">"foobar"</span><span class="p">)</span>
<span class="n">device</span><span class="o">.</span><span class="n">domain</span> <span class="o">=</span> <span class="s">"test.localdomain"</span>
<span class="c"># create new interface object</span>
<span class="n">interface</span> <span class="o">=</span> <span class="n">Interface</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">"eth0"</span><span class="p">,</span> <span class="n">ip</span><span class="o">=</span><span class="s">"1.1.1.1"</span><span class="p">)</span>
<span class="c"># add interface object to device object</span>
<span class="n">device</span><span class="o">.</span><span class="n">interfaces</span> <span class="o">=</span> <span class="p">[</span><span class="n">interface</span><span class="p">]</span>
<span class="c"># store objects in db</span>
<span class="n">session</span><span class="o">.</span><span class="n">flush</span><span class="p">([</span><span class="n">device</span><span class="p">,</span> <span class="n">interface</span><span class="p">])</span>
<span class="c"># query</span>
<span class="n">device</span> <span class="o">=</span> <span class="n">Device</span><span class="o">.</span><span class="n">get_by</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">"foobar"</span><span class="p">)</span>
<span class="k">print</span> <span class="n">device</span>
</pre></div>
<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>
<div class="codehilite"><pre><span class="kn">import</span> <span class="nn">elixir</span>
<span class="n">elixir</span><span class="o">.</span><span class="n">options_defaults</span><span class="p">[</span><span class="s">'mapper_options'</span><span class="p">]</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">always_refresh</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
</pre></div>
<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>
<div class="codehilite"><pre><span class="kn">from</span> <span class="nn">elixir</span> <span class="kn">import</span> <span class="o">*</span>
<span class="n">metadata</span><span class="o">.</span><span class="n">bind</span> <span class="o">=</span> <span class="s">"sqlite:///:memory:"</span>
<span class="n">metadata</span><span class="o">.</span><span class="n">bind</span><span class="o">.</span><span class="n">echo</span> <span class="o">=</span> <span class="bp">True</span>
<span class="k">class</span> <span class="nc">Movie</span><span class="p">(</span><span class="n">Entity</span><span class="p">):</span>
<span class="n">title</span> <span class="o">=</span> <span class="n">Field</span><span class="p">(</span><span class="n">String</span><span class="p">(</span><span class="mi">30</span><span class="p">))</span>
<span class="n">director</span> <span class="o">=</span> <span class="n">ManyToOne</span><span class="p">(</span><span class="s">'Director'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s">'<Movie "</span><span class="si">%s</span><span class="s">">'</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">title</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Director</span><span class="p">(</span><span class="n">Entity</span><span class="p">):</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">Field</span><span class="p">(</span><span class="n">String</span><span class="p">(</span><span class="mi">60</span><span class="p">))</span>
<span class="n">movies</span> <span class="o">=</span> <span class="n">OneToMany</span><span class="p">(</span><span class="s">'Movie'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s">'<Director "</span><span class="si">%s</span><span class="s">">'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>
<span class="n">setup_all</span><span class="p">()</span>
<span class="n">create_all</span><span class="p">()</span>
</pre></div>
<p>Jetzt ein paar Werte einfügen:</p>
<div class="codehilite"><pre><span class="n">rscott</span> <span class="o">=</span> <span class="n">Director</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">"Ridley Scott"</span><span class="p">)</span>
<span class="n">glucas</span> <span class="o">=</span> <span class="n">Director</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">"George Lucas"</span><span class="p">)</span>
<span class="n">unknown</span> <span class="o">=</span> <span class="n">Director</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">"Nobody Unknown"</span><span class="p">)</span>
<span class="n">alien</span> <span class="o">=</span> <span class="n">Movie</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">"Alien"</span><span class="p">,</span> <span class="n">director</span><span class="o">=</span><span class="n">rscott</span><span class="p">)</span>
<span class="n">swars</span> <span class="o">=</span> <span class="n">Movie</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">"Star Wars"</span><span class="p">,</span> <span class="n">director</span><span class="o">=</span><span class="n">glucas</span><span class="p">)</span>
<span class="n">brunner</span> <span class="o">=</span> <span class="n">Movie</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">"No Name"</span><span class="p">,</span> <span class="n">director</span><span class="o">=</span><span class="n">unknown</span><span class="p">)</span>
<span class="n">session</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
<span class="n">session</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">Movie</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">all</span><span class="p">():</span>
<span class="k">print</span> <span class="s">"Movie: name=</span><span class="si">%s</span><span class="s"> director=</span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">title</span><span class="p">,</span> <span class="n">m</span><span class="o">.</span><span class="n">director</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</pre></div>
<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>
<div class="codehilite"><pre><span class="k">SELECT</span> <span class="n">__main___movie</span><span class="p">.</span><span class="n">id</span> <span class="k">AS</span> <span class="n">__main___movie_id</span><span class="p">,</span> <span class="n">__main___movie</span><span class="p">.</span><span class="n">title</span> <span class="k">AS</span> <span class="n">__main___movie_title</span><span class="p">,</span> <span class="n">__main___movie</span><span class="p">.</span><span class="n">director_id</span> <span class="k">AS</span> <span class="n">__main___movie_director_id</span>
<span class="k">FROM</span> <span class="n">__main___movie</span> <span class="k">ORDER</span> <span class="k">BY</span> <span class="n">__main___movie</span><span class="p">.</span><span class="n">oid</span>
<span class="p">[]</span>
<span class="k">SELECT</span> <span class="n">__main___director</span><span class="p">.</span><span class="n">id</span> <span class="k">AS</span> <span class="n">__main___director_id</span><span class="p">,</span> <span class="n">__main___director</span><span class="p">.</span><span class="n">name</span> <span class="k">AS</span> <span class="n">__main___director_name</span>
<span class="k">FROM</span> <span class="n">__main___director</span>
<span class="k">WHERE</span> <span class="n">__main___director</span><span class="p">.</span><span class="n">id</span> <span class="o">=</span> <span class="o">?</span>
<span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="k">SELECT</span> <span class="n">__main___director</span><span class="p">.</span><span class="n">id</span> <span class="k">AS</span> <span class="n">__main___director_id</span><span class="p">,</span> <span class="n">__main___director</span><span class="p">.</span><span class="n">name</span> <span class="k">AS</span> <span class="n">__main___director_name</span>
<span class="k">FROM</span> <span class="n">__main___director</span>
<span class="k">WHERE</span> <span class="n">__main___director</span><span class="p">.</span><span class="n">id</span> <span class="o">=</span> <span class="o">?</span>
<span class="p">[</span><span class="mi">2</span><span class="p">]</span>
<span class="k">SELECT</span> <span class="n">__main___director</span><span class="p">.</span><span class="n">id</span> <span class="k">AS</span> <span class="n">__main___director_id</span><span class="p">,</span> <span class="n">__main___director</span><span class="p">.</span><span class="n">name</span> <span class="k">AS</span> <span class="n">__main___director_name</span>
<span class="k">FROM</span> <span class="n">__main___director</span>
<span class="k">WHERE</span> <span class="n">__main___director</span><span class="p">.</span><span class="n">id</span> <span class="o">=</span> <span class="o">?</span>
<span class="p">[</span><span class="mi">3</span><span class="p">]</span>
</pre></div>
<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>
<div class="codehilite"><pre><span class="c"># import eagerload from sqlalchemy</span>
<span class="kn">from</span> <span class="nn">sqlalchemy.orm</span> <span class="kn">import</span> <span class="n">eagerload</span>
<span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">Movie</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">options</span><span class="p">(</span><span class="n">eagerload</span><span class="p">(</span><span class="s">"director"</span><span class="p">))</span><span class="o">.</span><span class="n">all</span><span class="p">():</span>
<span class="k">print</span> <span class="s">"Movie: name=</span><span class="si">%s</span><span class="s"> director=</span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">title</span><span class="p">,</span> <span class="n">m</span><span class="o">.</span><span class="n">director</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</pre></div>
<p>Und schon ist es eine Query:</p>
<div class="codehilite"><pre><span class="k">SELECT</span> <span class="n">__main___movie</span><span class="p">.</span><span class="n">id</span> <span class="k">AS</span> <span class="n">__main___movie_id</span><span class="p">,</span> <span class="n">__main___movie</span><span class="p">.</span><span class="n">title</span> <span class="k">AS</span> <span class="n">__main___movie_title</span><span class="p">,</span> <span class="n">__main___movie</span><span class="p">.</span><span class="n">director_id</span> <span class="k">AS</span> <span class="n">__main___movie_director_id</span><span class="p">,</span> <span class="n">__main___director_1</span><span class="p">.</span><span class="n">id</span> <span class="k">AS</span> <span class="n">__main___director_1_id</span><span class="p">,</span> <span class="n">__main___director_1</span><span class="p">.</span><span class="n">name</span> <span class="k">AS</span> <span class="n">__main___director_1_name</span>
<span class="k">FROM</span> <span class="n">__main___movie</span> <span class="k">LEFT</span> <span class="k">OUTER</span> <span class="k">JOIN</span> <span class="n">__main___director</span> <span class="k">AS</span> <span class="n">__main___director_1</span> <span class="k">ON</span> <span class="n">__main___movie</span><span class="p">.</span><span class="n">director_id</span> <span class="o">=</span> <span class="n">__main___director_1</span><span class="p">.</span><span class="n">id</span> <span class="k">ORDER</span> <span class="k">BY</span> <span class="n">__main___movie</span><span class="p">.</span><span class="n">oid</span><span class="p">,</span> <span class="n">__main___director_1</span><span class="p">.</span><span class="n">oid</span>
</pre></div>
<p>Alternativ zum "eagerload" kann man auch im Model das lazyload abschalten.</p>
<div class="codehilite"><pre><span class="k">class</span> <span class="nc">Movie</span><span class="p">(</span><span class="n">Entity</span><span class="p">):</span>
<span class="n">title</span> <span class="o">=</span> <span class="n">Field</span><span class="p">(</span><span class="n">String</span><span class="p">(</span><span class="mi">30</span><span class="p">))</span>
<span class="n">director</span> <span class="o">=</span> <span class="n">ManyToOne</span><span class="p">(</span><span class="s">'Director'</span><span class="p">,</span> <span class="n">lazy</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span> <span class="c"># <- lazyload now False</span>
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s">'<Movie "</span><span class="si">%s</span><span class="s">">'</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">title</span><span class="p">)</span>
</pre></div>
<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>
<div class="codehilite"><pre>root@...# lsusb
<span class="o">[</span>snip<span class="o">]</span>
Bus 002 Device 002: ID 05ac:1292 Apple, Inc.
</pre></div>
</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>
<div class="codehilite"><pre><span class="cp"><?xml version="1.0" encoding="UTF-8"?></span> <span class="c"><!-- -*- SGML -*- --></span>
<span class="nt"><deviceinfo</span> <span class="na">version=</span><span class="s">"0.2"</span><span class="nt">></span>
<span class="nt"><device></span>
<span class="nt"><match</span> <span class="na">key=</span><span class="s">"usb.vendor_id"</span> <span class="na">int=</span><span class="s">"1452"</span><span class="nt">></span>
<span class="nt"><match</span> <span class="na">key=</span><span class="s">"usb.product_id"</span> <span class="na">int=</span><span class="s">"4754"</span><span class="nt">></span>
<span class="nt"><merge</span> <span class="na">key=</span><span class="s">"info.ignore"</span> <span class="na">type=</span><span class="s">"bool"</span><span class="nt">></span>true<span class="nt"></merge></span>
<span class="nt"></match></span>
<span class="nt"></match></span>
<span class="nt"></device></span>
<span class="nt"></deviceinfo></span>
</pre></div>
</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>
<img src="http://www.ca-net.org/images/hm_kaernten_laeuft_2009.jpg" alt="Ein stolzer Finisher" />
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>
<div class="codehilite"><pre>apt-get install ruby ruby1.8-dev rubygems build-essential libmysqlclient15-dev
</pre></div>
<p>Jetzt <a href="http://github.com/mojombo/jekyll">Jekyll</a> ...</p>
<div class="codehilite"><pre>gem sources -a http://gems.github.com
gem install mojombo-jekyll
</pre></div>
<p>Nun weitere Ruby Packete die das Jekyll braucht ...</p>
<div class="codehilite"><pre>gem install mysql
gem install sequel
gem install rake-compiler -v 0.5.0
</pre></div>
<p>Da im Lenny ein zu altes rubygems vorhanden ist, quick <span class="amp">&</span> dirty aus dem unstable installieren ...</p>
<div class="codehilite"><pre>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
</pre></div>
<p>Nun das letzte Ruby Packet ...</p>
<div class="codehilite"><pre>gem install hoe
</pre></div>
<p>Jetzt kann man mit Jekyll den Wordpress Seiten Inhalt auslesen ...</p>
<div class="codehilite"><pre><span class="nb">export </span><span class="nv">DB</span><span class="o">=</span>my_wordpress_db
<span class="nb">export </span><span class="nv">USER</span><span class="o">=</span>dbuser
<span class="nb">export </span><span class="nv">PASS</span><span class="o">=</span>dbpass
ruby -r <span class="s1">'/var/lib/gems/1.8/gems/mojombo-jekyll-__VERS__/lib/jekyll/converters/wordpress'</span> <span class="se">\</span>
-e <span class="s1">'Jekyll::WordPress.process("#{ENV["DB"]}", "#{ENV["USER"]}", "#{ENV["PASS"]}")'</span>
</pre></div>
<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>
<div class="codehilite"><pre>apt-get --purge remove cpp cpp-4.3 gcc gcc-4.3 libc6-dev libgmp3c2 libgomp1 <span class="se">\</span>
libmpfr1ldbl libruby1.8 linux-libc-dev ruby ruby1.8 ruby1.8-dev apt-file <span class="se">\</span>
libapt-pkg-perl libconfig-file-perl liblist-moreutils-perl menu irb1.8 <span class="se">\</span>
libreadline-ruby1.8 rdoc1.8 rubygems rubygems1.8 build-essential dpkg-dev <span class="se">\</span>
g++ g++-4.3 libstdc++6-4.3-dev libtimedate-perl make libmysqlclient15-dev <span class="se">\</span>
zlib1g-dev
</pre></div>
<p>Danach die installierten Rubygems ...</p>
<div class="codehilite"><pre>rm -rf /var/lib/gems
</pre></div>
<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>
<div class="codehilite"><pre>#!/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
</pre></div>
<p>Achtung: Im Script sind die 2 Zeichen "{" und "%" mit einen Leerzeichen dazwischen, bitte im abgespeicherten Script bei euch ab ändern.</p>