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&nbsp;schreiben&nbsp;:)</p> <h1 id="elixir">Elixir</h1> <p><a href="http://elixir.ematia.de/trac/wiki">Elixir</a> ist "dünner" Wrapper für die <a href="http://www.sqlalchemy.org/">SQLAlchemy Library</a>. Beide zusammen vereinfachen den Umgang mit einer Datenbank in Python um&nbsp;ein&nbsp;vielfaches.</p> <p>Hier ein kleines Beispiel mit&nbsp;2&nbsp;Tabellen:</p> <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">&quot;sqlite:///movies.sqlite&quot;</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">&quot;&quot;&quot;representation of a device</span> <span class="sd"> &quot;&quot;&quot;</span> <span class="n">using_options</span><span class="p">(</span><span class="n">tablename</span><span class="o">=</span><span class="s">&#39;device&#39;</span><span class="p">,</span> <span class="n">inheritance</span><span class="o">=</span><span class="s">&#39;multi&#39;</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">&#39;Interface&#39;</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">&#39;Device </span><span class="si">%s</span><span class="s">&#39;</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">&quot;&quot;&quot;network interfaces</span> <span class="sd"> &quot;&quot;&quot;</span> <span class="n">using_options</span><span class="p">(</span><span class="n">tablename</span><span class="o">=</span><span class="s">&#39;interface&#39;</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">&#39;Device&#39;</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">&#39;&lt;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">&gt;&#39;</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&nbsp;Tabellen&nbsp;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">&quot;foobar&quot;</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">&quot;test.localdomain&quot;</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">&quot;eth0&quot;</span><span class="p">,</span> <span class="n">ip</span><span class="o">=</span><span class="s">&quot;1.1.1.1&quot;</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">&quot;foobar&quot;</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&nbsp;Cache&nbsp;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">&#39;mapper_options&#39;</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&nbsp;populate_existing()&nbsp;benutzt.</p> python elixir query optimierungChristian Assing2008-06-06T00:00:00Z2008-06-06T00:00:00Zhttp://www.ca-net.org/blog/2008/06/python_elixir_query_optimierung <p>Ich bin vor ein paar Tagen bei der Programmierung von PyCRMan fast verzweifelt. Wie ich schon in einem früheren Eintrag beschrieb, verwende ich <a href="http://elixir.ematia.de/trac/wiki">Elixir</a> als Wrapper für die Datenbank und mir ist aufgefallen, das Elixir bei meinen Model sehr viele DB-Queries generiert. Die Anzahl der Queries ist so hoch das die Netzwerk Latenzzeiten eine sehr große Rolle&nbsp;spielen&nbsp;:(</p> <p>Nach ewig langen erfolglosem Studieren der etwas dürftigen Elixir Dokumentation bin ich nachts um ca. 1 Uhr in der <a href="http://www.sqlalchemy.org/docs/04/index.html">SQLAlchemy Dokumentation</a> fündig geworden. Die "geheimen" Zauberwörter heißen "lazyload" und "eagerload", wenn ich das nur vorher schon gewußt&nbsp;hätte&nbsp;;)</p> <p>Hier ein&nbsp;kleines&nbsp;Beispiel:</p> <p>Als erstes mal ein kleines Model (ja das ist das Beispiel aus der Elixir Doku&nbsp;:)&nbsp;)</p> <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">&quot;sqlite:///:memory:&quot;</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">&#39;Director&#39;</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">&#39;&lt;Movie &quot;</span><span class="si">%s</span><span class="s">&quot;&gt;&#39;</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">&#39;Movie&#39;</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">&#39;&lt;Director &quot;</span><span class="si">%s</span><span class="s">&quot;&gt;&#39;</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&nbsp;Werte&nbsp;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">&quot;Ridley Scott&quot;</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">&quot;George Lucas&quot;</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">&quot;Nobody Unknown&quot;</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">&quot;Alien&quot;</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">&quot;Star Wars&quot;</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">&quot;No Name&quot;</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">&quot;Movie: name=</span><span class="si">%s</span><span class="s"> director=</span><span class="si">%s</span><span class="s">&quot;</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&nbsp;geht&nbsp;:)</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>&nbsp;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">&quot;director&quot;</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">&quot;Movie: name=</span><span class="si">%s</span><span class="s"> director=</span><span class="si">%s</span><span class="s">&quot;</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&nbsp;eine&nbsp;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&nbsp;lazyload&nbsp;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">&#39;Director&#39;</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"># &lt;- 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">&#39;&lt;Movie &quot;</span><span class="si">%s</span><span class="s">&quot;&gt;&#39;</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&nbsp;Option&nbsp;"deferred=True".</p> FotosChristian Assing2009-02-25T00:00:00Z2009-02-25T00:00:00Zhttp://www.ca-net.org/blog/2009/02/fotos <p><img alt="My new car" src="/media/images/blog/2009/02/c30.png" title="My new car" /></p> <p>Ich habe eine paar neue Fotos in meine Web Gallery gestellt, viel Spaß beim&nbsp;anschaun&nbsp;:)</p> <ul> <li><a href="http://picasaweb.google.com/christian.assing/VolvoC30">Mein neuer&nbsp;Volvo&nbsp;c30</a></li> <li><a href="http://picasaweb.google.com/christian.assing/Geocachen1">Geocachen</a></li> <li><a href="http://picasaweb.google.com/christian.assing/Wien">Wien&nbsp;Ausflug</a></li> </ul> iPhone unter LinuxChristian Assing2009-03-28T00:00:00Z2009-03-28T00:00:00Zhttp://www.ca-net.org/blog/2009/03/iphone_unter_linux <p>Ich habe mir jetzt ein <a href="http://www.apple.com/de/iphone/">iPhone</a> zugelegt und damit meinen iPod Touch ersetzt. Nur am Rande, wenn jemand überlegt sich eins dieser beiden Geräte zu zulegen, ich kann dazu nur sagen: "Mach&nbsp;es!!"&nbsp;:)</p> <p>Ok aber jetzt zum eigentlichen Artikel und dem Grund warum ich diesen Artikel&nbsp;schreiben&nbsp;musste. </p> <p>Anmerkung: Das iPhone und der iPod Touch verwenden die gleiche Software und somit sind folgende Informationen für beide&nbsp;Geräte&nbsp;gleich.</p> <h3 id="iphone-und-itunes">iPhone&nbsp;und&nbsp;iTunes</h3> <p>Bevor man das iPhone benutzten kann (telefonieren usw.) muss es via der <a href="http://www.apple.com/de/itunes/">iTunes</a> Software aktiviert werden. Da ich ja Linux benutzte stand ich nun vor einem großen Problem, die iTunes Software gibt es leider NUR für MacOS und Windows! :( Also was nun? Mac kaufen ... zu teuer! Eigene Windows Partition aufm Laptop ... aber wie kann dieses Windows auf meine Musik von der Linux Platte zu greifen? Das einzige und kostengünstige: <a href="http://www.vmware.com">VMware</a>!</p> <h3 id="itunes-in-einem-vmware-windows-xp">iTunes in einem VMware&nbsp;Windows&nbsp;XP</h3> <p>Die VMware Installation ist sehr einfach (ja auch unter Linux), herunterladen, Installer aufrufen, weiter, weiter, fertig! Dann schnell ein Windows XP in der VMware installiert und über die VMware meinen Music Ordner dem Windows gegeben. Das iTunes heruntergeladen&nbsp;und&nbsp;installiert.</p> <p>Das ist alles noch nicht die hohe Kunst, aber leider reicht das nicht um ein iPhone zu aktivieren bzw. zu&nbsp;syncen&nbsp;:(</p> <h3 id="konfiguration-von-hal">Konfiguration&nbsp;von&nbsp;HAL</h3> <p>Wenn man in dem jetzigen Setup das iPhone am Computer anschliesst, sehen das Linux und das Windows das iPhone. Dadurch funktioniert das iTunes im Windows nicht richtig, es können manche USB Kommandos nicht ausgeführt werden. Die Lösung bring dein Linux dazu das iPhone zu ignorieren, aber wie? Die Antwort lautet: Sag dem <a href="http://freedesktop.org/wiki/Software/hal">HAL</a>, das das iPhone ihn nix&nbsp;angeht&nbsp;:)</p> <ul> <li> <p>Finde die USB ID des&nbsp;iPhones&nbsp;heraus</p> <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&nbsp;Darstellung&nbsp;1452:4754</p> </li> <li> <p>in /etc/hal/fdi/preprobe/10-iphone.fdi&nbsp;folgendes&nbsp;eintragen</p> <div class="codehilite"><pre><span class="cp">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span> <span class="c">&lt;!-- -*- SGML -*- --&gt;</span> <span class="nt">&lt;deviceinfo</span> <span class="na">version=</span><span class="s">&quot;0.2&quot;</span><span class="nt">&gt;</span> <span class="nt">&lt;device&gt;</span> <span class="nt">&lt;match</span> <span class="na">key=</span><span class="s">&quot;usb.vendor_id&quot;</span> <span class="na">int=</span><span class="s">&quot;1452&quot;</span><span class="nt">&gt;</span> <span class="nt">&lt;match</span> <span class="na">key=</span><span class="s">&quot;usb.product_id&quot;</span> <span class="na">int=</span><span class="s">&quot;4754&quot;</span><span class="nt">&gt;</span> <span class="nt">&lt;merge</span> <span class="na">key=</span><span class="s">&quot;info.ignore&quot;</span> <span class="na">type=</span><span class="s">&quot;bool&quot;</span><span class="nt">&gt;</span>true<span class="nt">&lt;/merge&gt;</span> <span class="nt">&lt;/match&gt;</span> <span class="nt">&lt;/match&gt;</span> <span class="nt">&lt;/device&gt;</span> <span class="nt">&lt;/deviceinfo&gt;</span> </pre></div> </li> <li> <p>HAL restarten und das Linux ignoriert das iPhone und das iTunes sollte ohne Probleme&nbsp;funktionieren&nbsp;:)</p> </li> </ul> Kletterwald HohenfeldenChristian Assing2009-04-30T00:00:00Z2009-04-30T00:00:00Zhttp://www.ca-net.org/blog/2009/04/kletterwald_hohenfelden <p>Hier ein paar Fotos zum Ausflug in den <a href="http://www.kletterwald-hohenfelden.de/">Kletterwald Hohenfelden</a> von David und&nbsp;mir&nbsp;:)</p> <table style="width:194px;"><tr><td align="center" style="height:194px;background:url(http://picasaweb.google.com/s/c/transparent_album_background.gif) no-repeat left"><a href="http://picasaweb.google.com/christian.assing/KletterwaldHohenfelden?feat=embedwebsite"><img src="http://lh6.ggpht.com/_lPet4fv-M6s/Sflrw41KSsE/AAAAAAAABTM/BCcilMCKMeI/s160-c/KletterwaldHohenfelden.jpg" width="160" height="160" style="margin:1px 0 0 4px;"></a></td></tr><tr><td style="text-align:center;font-family:arial,sans-serif;font-size:11px"><a href="http://picasaweb.google.com/christian.assing/KletterwaldHohenfelden?feat=embedwebsite" style="color:#4D4D4D;font-weight:bold;text-decoration:none;">Kletterwald Hohenfelden</a></td></tr></table> BungyChristian Assing2009-07-27T00:00:00Z2009-07-27T00:00:00Zhttp://www.ca-net.org/blog/2009/07/bungy <p>Ich habe es getan und mich, nur an einem Gummiseil befestigt, von der 96m hohen <a href="http://bungy.at/de/index_bungee.php">Jauntal Brücke</a> gestürzt. 3 ... 2 ... 1 ...&nbsp;JUMP&nbsp;:)</p> <table style="width:194px;"><tr><td align="center" style="height:194px;background:url(http://picasaweb.google.com/s/c/transparent_album_background.gif) no-repeat left"><a href="http://picasaweb.google.com/christian.assing/Bungy?feat=embedwebsite"><img src="http://lh6.ggpht.com/_lPet4fv-M6s/Sm06WXKYWdE/AAAAAAAABf8/YGcTSE-2CbQ/s160-c/Bungy.jpg" width="160" height="160" style="margin:1px 0 0 4px;"></a></td></tr><tr><td style="text-align:center;font-family:arial,sans-serif;font-size:11px"><a href="http://picasaweb.google.com/christian.assing/Bungy?feat=embedwebsite" style="color:#4D4D4D;font-weight:bold;text-decoration:none;">Bungy</a></td></tr></table> Bungy VideoChristian Assing2009-07-27T00:00:00Z2009-07-27T00:00:00Zhttp://www.ca-net.org/blog/2009/07/bungy_video <p><object width="400" height="300" ><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://www.facebook.com/v/1029839126414" /><embed src="http://www.facebook.com/v/1029839126414" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="400" height="300"></embed></object></p> Kärtnen Läuft HalbmarathonChristian Assing2009-08-23T00:00:00Z2009-08-23T00:00:00Zhttp://www.ca-net.org/blog/2009/08/kartnen_lauft_halbmarathon <p>Ich hab es hinter mich gebracht, 21km laufen von Velden am Wörthersee nach Klagenfurt ins Strandbad. Es war eine riesen Stimmung bei diesem immer gut besuchten Laufevent. Meine offizielle Zeit&nbsp;war&nbsp;1h55m. </p> <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&nbsp;paar&nbsp;Eindrücke:</p> <table style="width:194px;"><tr><td align="center" style="height:194px;background:url(http://picasaweb.google.com/s/c/transparent_album_background.gif) no-repeat left"><a href="http://picasaweb.google.com/christian.assing/Fallschirmspringen?feat=embedwebsite"><img src="http://lh6.ggpht.com/_lPet4fv-M6s/SqU27MeRgbE/AAAAAAAABpo/KB8u7CePn6Y/s160-c/Fallschirmspringen.jpg" width="160" height="160" style="margin:1px 0 0 4px;"></a></td></tr><tr><td style="text-align:center;font-family:arial,sans-serif;font-size:11px"><a href="http://picasaweb.google.com/christian.assing/Fallschirmspringen?feat=embedwebsite" style="color:#4D4D4D;font-weight:bold;text-decoration:none;">Fallschirmspringen</a></td></tr></table> <p>Das Video&nbsp;kommt&nbsp;später.</p> Mozartclub Geburtstagsfeier zum 30.Christian Assing2009-10-13T00:00:00Z2009-10-13T00:00:00Zhttp://www.ca-net.org/blog/2009/10/mozartclub_geburtstagsfeier_zum_30 <table style="width:194px;"><tr><td align="center" style="height:194px;background:url(http://picasaweb.google.com/s/c/transparent_album_background.gif) no-repeat left"><a href="http://picasaweb.google.com/christian.assing/GeburtstagsfeierImMozartclubZuMeinem30?feat=embedwebsite"><img src="http://lh6.ggpht.com/_lPet4fv-M6s/StSD_t4YujE/AAAAAAAABuU/oojD8I74z8k/s160-c/GeburtstagsfeierImMozartclubZuMeinem30.jpg" width="160" height="160" style="margin:1px 0 0 4px;"></a></td></tr><tr><td style="text-align:center;font-family:arial,sans-serif;font-size:11px"><a href="http://picasaweb.google.com/christian.assing/GeburtstagsfeierImMozartclubZuMeinem30?feat=embedwebsite" style="color:#4D4D4D;font-weight:bold;text-decoration:none;">Geburtstagsfeier im Mozartclub zu meinem 30.</a></td></tr></table> Von Wordpress zu statischen HTML SeitenChristian Assing2010-02-07T00:00:00Z2010-02-07T00:00:00Zhttp://www.ca-net.org/blog/2010/02/wordpress_turned_off <p>... oder "Wenn Designer jetzt PHP Code schreiben, dann muss ich meine Wordpress&nbsp;Installation&nbsp;abdrehen".</p> <p>Ich war gestern auf den <a href="http://www.barcamp.at/BarCamp_Klagenfurt_2010">Barcamp Klagenfurt 2010</a> und nahm zufällig an einer Session zum Thema "Wordpress Themes" teil. Danach hab ich den festen Entschluss gefasst meine Wordpress Installation zu löschen und gegen statische HTML Seiten zu tauschen. Wie ich das gemacht habe möchte ich&nbsp;hier&nbsp;zeigen.</p> <div class="toc"> <ul> <li><a href="#problemstellung">Problemstellung</a></li> <li><a href="#wordpress-seiteninhalte-auslesen-mit-jekyll">Wordpress Seiteninhalte auslesen&nbsp;mit&nbsp;Jekyll</a></li> <li><a href="#von-dr-jekyll-zu-mr-hyde">Von Dr. Jekyll zu&nbsp;Mr.&nbsp;Hyde</a></li> </ul> </div> <h1 id="problemstellung">Problemstellung</h1> <p>Da ich nicht auf einer grünen Wiese ohne Inhalt für meinen Blog anfangen wollte, musste ich erst einmal meine bisherigen Seiten in einem vernünftigen Format aus dem Wordpress heraus bekommen. Leider ist das nicht so einfach, es gibt zwar viele Konverter die mir Inhalt ins Wordpress rein bringen, aber heraus bekommen es nur wenige. Ich habe mich dann schlussendlich für das Ruby Tool <a href="http://github.com/mojombo/jekyll">Jekyll</a> entschieden. Diese Tool, welches selbst ein "static site generator" ist, möchte ich aber nur in der Migration Phase verwenden, danach bzw. jetzt setze ich <a href="http://ringce.com/hyde">Hyde</a> für die Generierung meiner&nbsp;Seiten&nbsp;ein.</p> <h1 id="wordpress-seiteninhalte-auslesen-mit-jekyll">Wordpress Seiteninhalte auslesen&nbsp;mit&nbsp;Jekyll</h1> <p>Erstmal die nötigen Software installieren. In meinem Fall auf einem <a href="http://www.debian.org">Debian</a>&nbsp;Lenny&nbsp;Server.</p> <p>Das es das <a href="http://github.com/mojombo/jekyll">Jekyll</a> nicht als Debian Packet gibt, muss man es von hand installieren. Erst einmal Ruby und&nbsp;Compiler&nbsp;...</p> <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>&nbsp;...</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&nbsp;braucht&nbsp;...</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">&amp;</span> dirty aus dem unstable&nbsp;installieren&nbsp;...</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&nbsp;Packet&nbsp;...</p> <div class="codehilite"><pre>gem install hoe </pre></div> <p>Jetzt kann man mit Jekyll den Wordpress Seiten Inhalt&nbsp;auslesen&nbsp;...</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">&#39;/var/lib/gems/1.8/gems/mojombo-jekyll-__VERS__/lib/jekyll/converters/wordpress&#39;</span> <span class="se">\</span> -e <span class="s1">&#39;Jekyll::WordPress.process(&quot;#{ENV[&quot;DB&quot;]}&quot;, &quot;#{ENV[&quot;USER&quot;]}&quot;, &quot;#{ENV[&quot;PASS&quot;]}&quot;)&#39;</span> </pre></div> <p>Nun hat man im Verzeichnis "_posts" alle seine&nbsp;Wordpress&nbsp;Inhalte.</p> <p>Da ich auf meinen Server keine Ruby installiert haben will und schon garnicht einen Compiler, fliegt alles wieder runter. Zu erste die Debian&nbsp;Packete&nbsp;...</p> <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&nbsp;Rubygems&nbsp;...</p> <div class="codehilite"><pre>rm -rf /var/lib/gems </pre></div> <h1 id="von-dr-jekyll-zu-mr-hyde">Von Dr. Jekyll zu&nbsp;Mr.&nbsp;Hyde</h1> <p>Nun ist der Weg geebnet und ich konnte auf <a href="http://ringce.com/hyde">Hyde</a> umsteigen. Ich bin dabei einer Anleitung von <a href="http://stevelosh.com/blog/2010/01/moving-from-django-to-hyde/">Steve Losh</a> gefolgt, der seine Seite ebenfalls mit <a href="http://ringce.com/hyde">Hyde</a> betreibt. Da es mit Beispielen immer leichter geht, kann ich noch <a href="http://github.com/sjl/stevelosh/">Steve Losh Git</a> empfehlen, in dem man den kompletten Code seiner&nbsp;Seite&nbsp;sieht.</p> <p>Hier ist noch ein Script was die umgewandelten Wordpress Postings in die Hyde Verzeichnis Strutur umwandelt. Ich glaub der Code ist&nbsp;selbst&nbsp;erklärend.</p> <div class="codehilite"><pre>#!/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 </pre></div> <p>Achtung: Im Script sind die 2 Zeichen "{" und "%" mit einen Leerzeichen dazwischen, bitte im abgespeicherten Script bei euch&nbsp;ab&nbsp;ändern.</p>