<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0"> <channel><title>Mage::blog()</title> <link>http://www.mageblog.de</link> <description>Alles rund um Magento!</description> <lastBuildDate>Fri, 16 Dec 2011 14:45:47 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3</generator> <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/MageBlog" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="mageblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>Vorsicht bei der Verwendung von isset() mit Arrays</title><link>http://www.mageblog.de/2011/12/16/vorsicht-bei-der-verwendung-von-isset-mit-arrays/</link> <comments>http://www.mageblog.de/2011/12/16/vorsicht-bei-der-verwendung-von-isset-mit-arrays/#comments</comments> <pubDate>Fri, 16 Dec 2011 14:44:45 +0000</pubDate> <dc:creator>David Fuhr</dc:creator> <category><![CDATA[Allgemein]]></category> <guid isPermaLink="false">http://www.mageblog.de/?p=1505</guid> <description><![CDATA[Manchmal sucht man Fehler, die man wieder und wieder überliest, weil man die falschen Annahmen getroffen hat und der Code oberflächlich richtig aussieht. Erfahrungsgemäß gibt es dann ein paar &#8220;übliche Verdächtige&#8221;, die man sich genauer anschaut. Zuweisungen im if-Statement, Vergleiche ohne Typprüfung, empty() und isset() sind dabei immer heiße Kandidaten. Wenn man die Handbuch-Seite zu [...]]]></description> <content:encoded><![CDATA[<p>Manchmal sucht man Fehler, die man wieder und wieder überliest, weil man die falschen Annahmen getroffen hat und der Code oberflächlich richtig aussieht. Erfahrungsgemäß gibt es dann ein paar &#8220;übliche Verdächtige&#8221;, die man sich genauer anschaut. Zuweisungen im <a
href="http://php.net/manual/control-structures.if.php">if-Statement</a>, Vergleiche ohne Typprüfung, <a
href="http://php.net/manual/empty.php"><code>empty()</code></a> und <a
href="http://php.net/manual/isset.php"><code>isset()</code></a> sind dabei immer heiße Kandidaten.</p><p>Wenn man die Handbuch-Seite zu <code>isset()</code> durchliest, klingt es, als wäre es problemlos möglich auch die Existenz von Array-Keys zu prüfen. Sogar ein <a
href="http://php.net/manual/function.isset.php#example-4726">schönes Beispiel</a> gibt es dazu:</p><div
class="wp_syntax"><div
class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'test'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'hello'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'pie'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'a'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'apple'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'test'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>            <span style="color: #666666; font-style: italic;">// TRUE</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'foo'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>             <span style="color: #666666; font-style: italic;">// FALSE</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'hello'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>           <span style="color: #666666; font-style: italic;">// FALSE</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// The key 'hello' equals NULL so is considered unset</span>
<span style="color: #666666; font-style: italic;">// If you want to check for NULL key values then try: </span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array_key_exists</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'hello'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// TRUE</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Checking deeper array values</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'pie'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'a'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>        <span style="color: #666666; font-style: italic;">// TRUE</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'pie'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'b'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>        <span style="color: #666666; font-style: italic;">// FALSE</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'cake'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'a'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'b'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">// FALSE</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div><p>Doch ganz so einfach ist es leider nicht. <span
id="more-1505"></span> Interessant ist hier vor allem die letzte Zeile. Erst auf den zweiten Blick fällt auf, dass <strong>als erster Schlüssel &#8220;cake&#8221; statt &#8220;pie&#8221;</strong> verwendet wird. Und das ist der einzige Grund dafür, dass <code>FALSE</code> zurückgegeben wird. <strong>Ändert man nämlich den ersten Schlüssel auf &#8220;pie&#8221;, wird <code>TRUE</code> zurückgegeben</strong>, auch wenn der dritte Key nicht existiert:</p><div
class="wp_syntax"><div
class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'test'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'hello'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'pie'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'a'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'apple'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'pie'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'a'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'b'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">// TRUE</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div><p>Das Problem und die <a
href="http://php.net/manual/function.isset.php#47396">Lösung wird auch in einem Kommentar von 2004</a> angesprochen. Die Prüfung mit <code>isset()</code> reicht nicht aus. Zusätzlich muss auf den vorletzen Key mit <a
href="http://php.net/manual/function.is-array.php"><code>is_array()</code></a> geprüft werden:</p><div
class="wp_syntax"><div
class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'test'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'hello'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'pie'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'a'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'apple'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'pie'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'a'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'b'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'pie'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'a'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">// FALSE</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div><p>Wichtig ist hier auch, dass man <strong>zuerst das <code>isset()</code> und danach das <code>is_array()</code></strong> schreibt, sonst bekommt man einen Undefined-index-Fehler, wenn der Schlüssel komplett nicht vorhanden ist. Ein alleinstehendes <code>isset()</code> in Verbindung mit einem Array sollte einen also immer misstrauisch machen. Je nach Fall sollte ein <code>is_array()</code> ergänzt oder ein <a
href="http://php.net/manual/function.array-key-exists.php"><code>array_key_exists()</code></a> bevorzugt werden.<div
class="fblike_button" style="margin: 10px 0;"><iframe
src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.mageblog.de%2F2011%2F12%2F16%2Fvorsicht-bei-der-verwendung-von-isset-mit-arrays%2F&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;font=verdana&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div> ]]></content:encoded> <wfw:commentRss>http://www.mageblog.de/2011/12/16/vorsicht-bei-der-verwendung-von-isset-mit-arrays/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Grep für Application-Logs</title><link>http://www.mageblog.de/2011/12/07/grep-fur-application-logs/</link> <comments>http://www.mageblog.de/2011/12/07/grep-fur-application-logs/#comments</comments> <pubDate>Wed, 07 Dec 2011 10:51:25 +0000</pubDate> <dc:creator>David Fuhr</dc:creator> <category><![CDATA[Allgemein]]></category> <category><![CDATA[bash]]></category> <category><![CDATA[cli]]></category> <category><![CDATA[grep]]></category> <category><![CDATA[php]]></category> <guid isPermaLink="false">http://www.mageblog.de/?p=1491</guid> <description><![CDATA[Bei der Fehlersuche bieten einem die Application-Logs oftmals einen guten Einstiegspunkt. Doch die Suche darin kann zum Teil recht mühsam sein. Vor allem wenn man nicht nach der Fehlermeldung selbst suchen will, sondern zum Beispiel alle Fehler haben will, die einen bestimmten Methodenaufruf im Stacktrace haben. Und dann wollte ich auch nicht nur die Zeile [...]]]></description> <content:encoded><![CDATA[<p>Bei der Fehlersuche bieten einem die Application-Logs oftmals einen guten Einstiegspunkt. Doch die Suche darin kann zum Teil recht mühsam sein. Vor allem wenn man nicht nach der Fehlermeldung selbst suchen will, sondern zum Beispiel alle Fehler haben will, die einen bestimmten Methodenaufruf im Stacktrace haben. Und dann wollte ich auch nicht nur die Zeile haben, sondern den ganzen Log-Eintrag, inklusive Message und komplettem Stacktrace.</p><p>Ich habe mir dafür ein kleines PHP-Skript geschrieben. Vielleicht findet es ja sonst jemand nützlich:</p><div
class="wp_syntax"><div
class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">// loggrep.php 2011-12-08</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span> <span style="color: #339933;">!==</span> <span style="color: #000088;">$argc</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #cc66cc;">3</span> <span style="color: #339933;">!==</span> <span style="color: #000088;">$argc</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;USAGE: <span style="color: #006699; font-weight: bold;">{$argv[0]}</span> &lt;pcre-pattern&gt; &lt;file&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$filename</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'php://stdin'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$argv</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$filename</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$argv</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000088;">$fp</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fopen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$filename</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'r'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// &quot;2011-11-22T02:16:34+01:00 - &quot;</span>
<span style="color: #000088;">$startPattern</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'#^\d{4}(-\d{2}){2}T\d{2}(:\d{2}){2}\+\d{2}:\d{2} - #'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$searchPattern</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$argv</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$found</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$line</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fgets</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$startPattern</span><span style="color: #339933;">,</span> <span style="color: #000088;">$line</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span> <span style="color: #339933;">===</span> <span style="color: #000088;">$found</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$buffer</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$bufferedLine</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$bufferedLine</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000088;">$buffer</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$found</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$searchPattern</span><span style="color: #339933;">,</span> <span style="color: #000088;">$line</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$found</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000088;">$buffer</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$line</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div><p>Der Aufruf sieht dann so aus:</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;">$ php loggrep <span style="color: #ff0000;">&quot;#Mage_Core_Block_Template#&quot;</span> exception.log</pre></div></div><p>Wichtig ist, dass der Suchbegriff mit <a
href="http://php.net/manual/pcre.pattern.php">PCRE-Syntax</a> (inklusive Delimiter) angegeben wird.</p><h4>Update 08.11.2011</h4><p>Jetzt neu: Falls keine Datei angegeben wird, kann das Skript auch von STDIN lesen. Damit kann man auch einfach in gepackten Dateien suchen:</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">zcat</span> exception.log.1.gz <span style="color: #000000; font-weight: bold;">|</span> php loggrep <span style="color: #ff0000;">&quot;#Mage_Core_Block_Template#&quot;</span></pre></div></div><div
class="fblike_button" style="margin: 10px 0;"><iframe
src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.mageblog.de%2F2011%2F12%2F07%2Fgrep-fur-application-logs%2F&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;font=verdana&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div> ]]></content:encoded> <wfw:commentRss>http://www.mageblog.de/2011/12/07/grep-fur-application-logs/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Der Guru ist zurück</title><link>http://www.mageblog.de/2011/11/21/der-guru-ist-zuruck/</link> <comments>http://www.mageblog.de/2011/11/21/der-guru-ist-zuruck/#comments</comments> <pubDate>Mon, 21 Nov 2011 18:26:58 +0000</pubDate> <dc:creator>David Fuhr</dc:creator> <category><![CDATA[Allgemein]]></category> <category><![CDATA[guru]]></category> <category><![CDATA[steam]]></category> <guid isPermaLink="false">http://www.mageblog.de/?p=1467</guid> <description><![CDATA[Nicht nur Virtualbox kennt den Guru, sondern auch bei Valve scheint er bekannt zu sein:]]></description> <content:encoded><![CDATA[<p>Nicht nur <a
href="/2011/10/05/virtualbox-guru-meditation/">Virtualbox kennt den Guru</a>, sondern auch bei Valve scheint er bekannt zu sein:</p><p><a
href="http://www.mageblog.de/wp-content/uploads/2011/11/steam-guru.png"><img
src="http://www.mageblog.de/wp-content/uploads/2011/11/steam-guru-300x200.png" alt="" title="steam-guru" width="300" height="200" class="aligncenter size-medium wp-image-1468" /></a><div
class="fblike_button" style="margin: 10px 0;"><iframe
src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.mageblog.de%2F2011%2F11%2F21%2Fder-guru-ist-zuruck%2F&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;font=verdana&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div> ]]></content:encoded> <wfw:commentRss>http://www.mageblog.de/2011/11/21/der-guru-ist-zuruck/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>New is always better – Google passt Suchalgorithmus an</title><link>http://www.mageblog.de/2011/11/04/new-is-always-better-%e2%80%93-google-passt-suchalgorithmus-an/</link> <comments>http://www.mageblog.de/2011/11/04/new-is-always-better-%e2%80%93-google-passt-suchalgorithmus-an/#comments</comments> <pubDate>Fri, 04 Nov 2011 16:32:07 +0000</pubDate> <dc:creator>Christoph Bauer</dc:creator> <category><![CDATA[E-Commerce]]></category> <category><![CDATA[Suchmaschinenoptimierung]]></category> <category><![CDATA[google]]></category> <category><![CDATA[seo]]></category> <category><![CDATA[suchalgorithmus]]></category> <guid isPermaLink="false">http://www.mageblog.de/?p=1452</guid> <description><![CDATA[“New is always better – it’s a rule”, bekannte Serienheld Barney Stinson, als er wieder einmal seine Abneigung gegenüber der Monogamie begründen wollte. Doch diese Aussage scheint auch bei den Entwicklern im Hause Google angekommen zu sein, denn diese haben mal wieder den Suchalgorithmus der weltweit wichtigsten Suchmaschine angepasst und wollen diesmal vor allem aktuellere [...]]]></description> <content:encoded><![CDATA[<p>“New is always better – it’s a rule”, bekannte Serienheld Barney Stinson, als er wieder einmal seine Abneigung gegenüber der Monogamie begründen wollte. Doch diese Aussage scheint auch bei den Entwicklern im Hause Google angekommen zu sein, denn diese haben mal wieder den <strong>Suchalgorithmus der weltweit wichtigsten Suchmaschine angepasst</strong> und wollen diesmal vor allem <strong>aktuellere Ergebnisse</strong> in den Vordergrund stellen.</p><p>Im <a
href="http://googleblog.blogspot.com/2011/11/giving-you-fresher-more-recent-search.html">hauseigenen Blog</a> erklären die Entwickler, dass diese Änderung sowohl Seiten über aktuelle als auch wiederkehrende Ereignisse wie beispielsweise die olympischen Spiele betrifft. Die Idee dahinter: Sucht jemand im Mai 2012 nach dem Begriff „Olympische Spiele“, so sollen dem User nicht die Auflistung der Leichtathletik-Medaillengewinner von 1956, sondern möglichst viele Informationen zu den Spielen 2012 in London als Ergebnisse weit oben in den SERPs präsentiert werden.</p><p>Betroffen werden vor allem viele alte Foreneinträge sein. Jedem ist es sicherlich schon einmal passiert, dass er bei einer Suche zu einem aktuellen Software-Problem zunächst Forendiskussionen aus dem Jahr 2003 zu Gesicht bekam, deren Lösungsansätze in der schnelllebigen IT-Welt natürlich mittlerweile unbrauchbar waren. Dies soll nun der Vergangenheit angehören.</p><p>Nach dem vor allem auf relevante und userfreundliche Inhalte abzielenden <a
href="http://www.spiegel.de/netzwelt/web/0,1518,780231,00.html">Panda-Updates</a>, hat sich Google nur also dem Problemfeld „Aktualität“ angenommen. Das besondere: Die Google-Entwickler schätzen, dass <strong>35% aller Suchanfragen betroffen</strong> sein werden. Eine deutlich höhere Anzahl als bei Panda.</p><p>Für Webseiteninhaber und Betreibern von Online Shops heißt dies nun, ebenfalls verstärkt auf neue Inhalte zu setzen. Ideal eignen sich dafür <strong>integrierte Blogs oder News-Ticker</strong>, die aktuelle und relevante Ereignisse oder Aktionen rund um die Webpräsenz behandeln und Google zeigen, dass auf diesen Seiten neue Inhalte zu finden sind. In Magento-Shops ist die Einbindung solcher Features relativ einfach möglich, wird allerdings bisher erst in wenigen Fällen genutzt. Auch der dynamische Bereich von Social Media wird dadurch weiter gefördert werden, denn es ist zu vermuten, dass Google auch diesen Faktor in seine Aktualitätsberechnungen berücksichtigen wird. In Kombination werden <strong>Social Media</strong> und <strong>aktuelle Inhalte</strong> sicher eine große Rolle unter den von Google berücksichtigten Ranking-Faktoren einnehmen und sollten deshalb auch verstärkt gepusht werden.<div
class="fblike_button" style="margin: 10px 0;"><iframe
src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.mageblog.de%2F2011%2F11%2F04%2Fnew-is-always-better-%25e2%2580%2593-google-passt-suchalgorithmus-an%2F&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;font=verdana&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div> ]]></content:encoded> <wfw:commentRss>http://www.mageblog.de/2011/11/04/new-is-always-better-%e2%80%93-google-passt-suchalgorithmus-an/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Magento Fatal error: Call to undefined method Mage_Core_Model_Config_Element::getName()</title><link>http://www.mageblog.de/2011/11/04/magentofatal-error-call-to-undefined-method-mage_core_model_config_elementgetname/</link> <comments>http://www.mageblog.de/2011/11/04/magentofatal-error-call-to-undefined-method-mage_core_model_config_elementgetname/#comments</comments> <pubDate>Fri, 04 Nov 2011 15:58:47 +0000</pubDate> <dc:creator>Thorsten Reiser</dc:creator> <category><![CDATA[Magento]]></category> <category><![CDATA[Fatal Error]]></category> <category><![CDATA[Magento Fatal Error]]></category> <guid isPermaLink="false">http://www.mageblog.de/?p=1446</guid> <description><![CDATA[Fatal error: Call to undefined method Mage_Core_Model_Config_Element::getName() in &#8230;/lib/Varien/Simplexml/Element.php on line 390 Das Problem ist warscheinlich eine veraltete PHP-Version. In dem aktuellen Fall ist Magento 1.4.0.1 im Einsatz. Magento setzt die Funktion SimpleXMLElement::getName vorraus, welche erst seit (PHP 5 &#62;= 5.1.3) implementiert ist. Die Lösung bei einem &#8220;Shared Host&#8221; wäre eine nette Mail an den [...]]]></description> <content:encoded><![CDATA[<p>Fatal error: Call to undefined method Mage_Core_Model_Config_Element::getName() in &#8230;/lib/Varien/Simplexml/Element.php on line 390</p><p>Das Problem ist warscheinlich eine veraltete PHP-Version. In dem aktuellen Fall ist Magento 1.4.0.1 im Einsatz. Magento setzt die Funktion SimpleXMLElement::getName vorraus, welche erst seit (PHP 5 &gt;= 5.1.3) implementiert ist.<br
/> Die Lösung bei einem &#8220;Shared Host&#8221; wäre eine nette Mail an den Support mit der Bitte um Umstellung auf die aktuelle Version. Ein Wunder das Magento überhaupt läuft.</p><p>&nbsp;<div
class="fblike_button" style="margin: 10px 0;"><iframe
src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.mageblog.de%2F2011%2F11%2F04%2Fmagentofatal-error-call-to-undefined-method-mage_core_model_config_elementgetname%2F&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;font=verdana&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div> ]]></content:encoded> <wfw:commentRss>http://www.mageblog.de/2011/11/04/magentofatal-error-call-to-undefined-method-mage_core_model_config_elementgetname/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Magento-Module – goldenes Kalb oder die Büchse der Pandora?</title><link>http://www.mageblog.de/2011/10/25/magento-module-goldenes-kalb-oder-die-buchse-der-pandora/</link> <comments>http://www.mageblog.de/2011/10/25/magento-module-goldenes-kalb-oder-die-buchse-der-pandora/#comments</comments> <pubDate>Tue, 25 Oct 2011 13:12:49 +0000</pubDate> <dc:creator>Michael Türk</dc:creator> <category><![CDATA[Allgemein]]></category> <category><![CDATA[Enterprise Edition]]></category> <category><![CDATA[Magento]]></category> <guid isPermaLink="false">http://www.mageblog.de/?p=1327</guid> <description><![CDATA[Eines der größten Argumente für Open-Source-Systeme wie Magento sind verfügbare Module, welche die Funktionalität des Grundsystems um Lösungen für wiederkehrende Aufgabenstellungen erweitern. Magento bietet auf seiner Plattform Connect sowohl unentgeltliche als auch kostenpflichtige Module an. Das Installieren wird dem Shop-Betreiber durch den Magento Connect Manager auch sehr einfach gemacht, ein neues Modul ist in Nullkommanichts installiert [...]]]></description> <content:encoded><![CDATA[<p>Eines der größten Argumente für Open-Source-Systeme wie <a
href="http://www.magento.com">Magento</a> sind verfügbare <strong>Module</strong>, welche die Funktionalität des Grundsystems um <strong>Lösungen für wiederkehrende Aufgabenstellungen</strong> erweitern. <a
href="http://connect.magentocommerce.com">Magento bietet auf seiner Plattform Connect</a> sowohl <strong>unentgeltliche als auch kostenpflichtige Module</strong> an. Das Installieren wird dem Shop-Betreiber durch den <strong>Magento Connect Manager</strong> auch sehr einfach gemacht, ein neues Modul ist in Nullkommanichts installiert und vollführt von nun an seinen Dienst. Doch gerade die mit der geringen Komplexität einhergehende niedrige Hemmschwelle beim Integrieren neuer Module kann zu großen Problemen führen. Die meisten Betreiber von Magento-Online-Shops gehen mit der Installation von Modulen deutlich zu unkritisch, teilweise naiv um und sollten die Extensions deutlich häufiger hinterfragen. Die Liste der Problematiken, die durch Module heraufbeschworen werden können, ist relativ lang:</p><p><span
id="more-1327"></span></p><dl><dt><strong>Funktionalität</strong></dt><dd>Macht das Modul wirklich, was ich mir darunter vorstelle? Die Beschreibung passt, die Screenshots sehen sehr viel versprechend aus. Aber ob im Kern und im Detail dann auch wirklich ein Modul dahinter steckt, was genau die <strong>speziellen Anforderungen des jeweiligen Shops</strong> erfüllt, ist fraglich. Woher bezieht es seine Daten? Entspricht die Logik dem, was sich der Shop-Betreiber vorgestellt hat? Wie hoch ist der Aufwand, um eine &#8220;kleine Änderung&#8221; durchzuführen? Kann man die Ausgaben an die eigenen Vorstellungen anpassen? Die Antworten auf all diese Fragen können nicht mittels Screens und Co., sondern erst nach einer detaillierten Prüfung des Programms gegeben werden.</dd><dt><strong>Sicherheit</strong></dt><dd>Es sollte bei der Integration eines Moduls geprüft werden, ob die installierten Mechanismen <strong>grundlegende Regeln der Sicherheit</strong> einhalten. <a
href="http://de.wikipedia.org/wiki/SQL-Injection">SQL Injection</a>, <a
href="http://de.wikipedia.org/wiki/Cross-Site-Scripting">Cross-Site-Scripting</a> oder <a
href="http://de.wikipedia.org/wiki/Cross-Site_Request_Forgery">Cross-Site Request Forgery</a> sind nur drei mögliche Angriffsmöglichkeiten, die in einem guten Magento-Modul nicht vorkommen sollten. Die Sicherheit sollte jedoch nicht als gottgegeben angenommen werden &#8211; hier ist der Betreiber einer Seite selbst aufgerufen, dies explizit zu überprüfen.</dd><dt><strong>Performance</strong></dt><dd>Jedes Modul wird die<strong> <a
href="http://t3n.de/magazin/magento-tunen-227618/">Leistungsfähigkeit des gesamten Systems</a></strong> ein Stück mehr bremsen. Das fängt mit einer Verlängerung der Konfiguration an und setzt sich über die Verarbeitung des eigentlichen Zwecks eines Moduls fort. Das wird man nicht verhindern können &#8211; allerdings sollte man darauf achten, dass ein Modul seine Arbeit möglichst effizient durchführt. Es sollte darauf geachtet werden, dass <strong>Caches genutzt</strong> und somit unnötige Rechenoperationen vermieden werden.</dd><dt><strong>Skalierbarkeit</strong></dt><dd>Ein Modul kann im Kontext eines <strong>kleinen Shops</strong> mit einer Handvoll Produkten und Kunden <strong>sehr gut funktionieren</strong>, bei der Verarbeitung eines <strong>Enterprise Stores</strong> mit einer Million Produkten jedoch komplett <strong>versagen</strong>. Im schlimmsten Fall hieße das: Der Shop ist bei eingeschalteter Funktionalität einfach nicht mehr zu erreichen.</dd><dt><strong>Wartbarkeit</strong></dt><dd>Für den Betrieb eines Online-Shops sowie dessen kontinuierliche Weiterentwicklung ist es von zentraler Bedeutung, dass alle eingesetzten Module die notwendigen Eingriffe &#8220;sanft&#8221; durchführen. Dies bedeutet zu allererst, dass Änderungen in dem Sinne ausgeführt werden, der von Magento zur Änderung vorgesehen wurde. Man muss sich auch im Klaren darüber sein, dass durch die <strong>Veränderung einiger Prozesse</strong> andere Änderungen oder Module von der Installation ausgeschlossen werden. Auch Updates auf neue Magento-Versionen werden durch die Vielzahl von installierten Magento-Modulen in der Regel deutlich erschwert.</dd></dl><div
id="attachment_1438" class="wp-caption alignleft" style="width: 226px"><a
href="http://www.mageblog.de/wp-content/uploads/2011/10/111025_Magento-Module-Baukastensystem1.jpg"><img
class="size-medium wp-image-1438" title="111025_Magento Module Baukastensystem" src="http://www.mageblog.de/wp-content/uploads/2011/10/111025_Magento-Module-Baukastensystem1-216x300.jpg" alt="Magento Module" width="216" height="300" /></a><p
class="wp-caption-text">Magento Module können der entscheidende Baustein zum Erfolg sein - oder aber auch das ganze System zum Einsturz bringen.</p></div><p>Noch etwas brisanter ist die Problematik im Rahmen von Professional- oder <a
href="http://www.mageblog.de/category/enterprise-edition/">Enterprise-Editions</a>. Hier bezahlt der Betreiber eines Shops für die professionelle Lizenz, durch die im Härtefall auch eine Verbesserung oder Kompensation von Magento erzielt werden soll. Je mehr Module jedoch in die Verarbeitung der Original-Prozesse eingreifen, desto unwahrscheinlicher wird jedoch der <strong>Haftungsfall für Magento</strong>, könnten doch eben die installierten Module für die fehlerhafte Leistung verantwortlich sein.</p><p>Ein großer Vorteil der Enterprise-Edition ist der <strong>Full-Page-Cache</strong>. Damit dieser jedoch ordnungsgemäß funktionieren kann, müssen auch die installierten Module hierzu kompatibel sein. In der Praxis schaut der Kunde hier gleichwohl aufgrund inkompatibler Entwicklung oft in die Röhre und der teuer bezahlte Full-Page-Cache bleibt ausgeschaltet.</p><p>Problematisch bei kommerziellen Modulen ist darüber hinaus, dass man die Qualität eines Moduls erst überprüfen kann,<strong> nachdem man bereits dafür bezahlt ha</strong>t. Andernfalls müsste man beim Hersteller eines Moduls zunächst eine Test-Version beantragen, um bei positiver Prüfung die Vollversion zu erwerben. Kommerzielle Module sind darüber hinaus häufig mit<strong> <a
href="http://www.ioncube.com/">IonCube</a> verschlüsselt</strong> und können somit gar nicht oder nur mit hohem Aufwand auf Schwachstellen überprüft werden. Auch entstehen hiermit Aufwände für die Administration des IonCube-Moduls für PHP.</p><p>Wenn man nun bedenkt, dass oben genannte Punkte sowohl im Rahmen der <strong>Installation als auch bei jedem Update</strong> eines Moduls überprüft werden müssen, kann die vermeintlich kostenfreie Extension relativ schnell <strong>zeitintensiv</strong> und damit sehr <strong>teuer</strong> werden.</p><p>Insgesamt möchten wir nicht davon abraten, kostenfreie oder kostengünstige Module von der Stange einzusetzen &#8211; im Gegenteil: diese Möglichkeit stellt für viele Shop-Betreiber eine <strong>günstige Alternative</strong> dar, um oft gewünschte <strong>Funktionalitäten</strong> nachzurüsten. Auch wir stellen bekanntlich einige Module für Magento &#8211; selbstverständlich kostenfrei &#8211; zu Verfügung. Wir möchten aber gerade aufgrund unserer Erfahrung mit anderen Modulen umso dringender dazu raten, alle Erweiterungen detailliert zu überprüfen und im Zweifel eine externe<strong> Expertenmeinung</strong> einzuholen. Wenn hierdurch eine Downtime oder ein Datenverlust verhindert werden kann, ist eine tief greifende Untersuchung gut investierte Zeit bzw. gut investiertes Geld.</p><p>PS: Die Problematik ist nicht Magento-spezifisch! Diese Ausführungen lassen sich auf diverse andere Systeme genauso anwenden.<div
class="fblike_button" style="margin: 10px 0;"><iframe
src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.mageblog.de%2F2011%2F10%2F25%2Fmagento-module-goldenes-kalb-oder-die-buchse-der-pandora%2F&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;font=verdana&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div> ]]></content:encoded> <wfw:commentRss>http://www.mageblog.de/2011/10/25/magento-module-goldenes-kalb-oder-die-buchse-der-pandora/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>IPC 2011 – Tag 3</title><link>http://www.mageblog.de/2011/10/12/ipc-2011-tag-3/</link> <comments>http://www.mageblog.de/2011/10/12/ipc-2011-tag-3/#comments</comments> <pubDate>Wed, 12 Oct 2011 20:19:17 +0000</pubDate> <dc:creator>David Fuhr</dc:creator> <category><![CDATA[Allgemein]]></category> <category><![CDATA[Entwicklung]]></category> <category><![CDATA[ant]]></category> <category><![CDATA[clean code]]></category> <category><![CDATA[deployment]]></category> <category><![CDATA[jenkins]]></category> <category><![CDATA[maven]]></category> <category><![CDATA[zend server]]></category> <category><![CDATA[zend studio]]></category> <guid isPermaLink="false">http://www.mageblog.de/?p=1386</guid> <description><![CDATA[Heute morgen gab es keine Keynote zu verpassen, daher starteten wir direkt mit der Aufforderung von Kore Nordmann und Tobias Schlitt (Qafoo) &#8220;Make your project SOLID!&#8221;. Die beiden stellten die von Martin C. Fowler (Uncle Bob) geprägten SOLID-Prinzipien vor. Wer Clean Code gelesen hat und sich bereits mit Clean Code Development beschäftigt hat, dürfte wenig [...]]]></description> <content:encoded><![CDATA[<p>Heute morgen gab es keine Keynote zu verpassen, daher starteten wir direkt mit der Aufforderung von Kore Nordmann und Tobias Schlitt (<a
href="http://qafoo.com/">Qafoo</a>) <strong>&#8220;Make your project SOLID!&#8221;</strong>. Die beiden stellten die von Martin C. Fowler (Uncle Bob) geprägten <a
href="http://de.wikipedia.org/wiki/Prinzipien_Objektorientierten_Designs#SOLID_Prinzipien">SOLID-Prinzipien</a> vor. Wer <a
href="http://www.amazon.de/Clean-Code-Refactoring-Patterns-Techniken/dp/3826655486/">Clean Code</a> gelesen hat und sich bereits mit <a
href="http://clean-code-developer.de/">Clean Code Development</a> beschäftigt hat, dürfte wenig Neues erfahren haben. Für alle anderen eine gute Zusammenfassung und Einführung in das Thema.</p><p><span
id="more-1386"></span></p><p>Danach stellte Jan Burkl von <a
href="http://www.zend.com/de/">Zend</a> das neue <strong>Package-Deployment-Feature von <a
href="http://www.zend.com/de/products/studio/">Zend Studio</a> und <a
href="http://www.zend.com/de/products/server/">Zend Server</a></strong> vor. Im Studio kann mann sich über ein nettes GUI eine deployment.xml erstellen lassen, mit der man sich anschließend eine Zend-Package (*.zpk, ein Zip mit anderer Dateiendung) erstellen lassen kann. Dieses kann man daraufhin auf den Zend Server deployen, wo definierte Vorraussetzungen geprüft und Abhängigkeiten aufgelöst werden können. Das Ganze ist in beiden Produkten sauber integriert und lässt sich auch über die Kommandozeile skripten.</p><p>In der Keynote <strong>&#8220;Cloud by Example&#8221;</strong> vor dem Mittagessen informierte Dr. Matt Wood, &#8220;Technology Evangelist for Amazon Web Services&#8221;, über die Features und Möglichkeiten mit <a
href="http://aws.amazon.com"><abbr
title="Amazon Web Services">AWS</abbr></a>. Sehr schnell, sehr viel Inhalt, recht vertriebsorientiert.</p><p>Da heute DevOps-Day war ging es den restlichen Tag auch weiter um das Thema Deployment. Zunächst folgte Thorsten Rinne von <a
href="http://www.mayflower.de">Mayflower</a> mit <strong>&#8220;One Click Deployment with Jenkins&#8221;</strong>. Dazu wird für jede Zielinstanz (testing, staging, production) ein Projekt in Jenkins angelegt, dass jeweils von den benötigten anderen Projekten durch die <a
href="https://wiki.jenkins-ci.org/display/JENKINS/Build+Pipeline+Plugin">Build Pipeline</a> abhängt. Das Projekt &#8220;Deployment Testing&#8221; kann dann automatisch angestoßen werden, sobald der Build des Hauptprojekts erfolgreich war. Somit wird verhindert, dass kaputte Versionen auf Testing gelangen. Anschließend kann der &#8220;Build&#8221; für das Deployment auf Staging oder Production manuell über <a
href="http://jenkins-ci.org/">Jenkins</a> angestoßen werden.</p><p>Nachdem André Neubauer am <a
href="http://www.mageblog.de/2011/10/11/ipc-2011-tag-1/">Montag</a> bereits über die Einführung von Scrum bei <a
href="http://www.immobilienscout24.de/">Immobilienscout24</a> berichtet hatte, waren heute die Fortschritte bei der Verkürzung der Deployment-Zyklen auf dem <strong>&#8220;steinigen Weg zum Continuous Live Deployment&#8221;</strong> das Thema. Immobilienscout hat dazu den Weg über <a
href="http://maven.apache.org/">Maven</a>, den <a
href="http://www.jetbrains.com/teamcity/">CI-Server TeamCity</a> und den <a
href="http://nexus.sonatype.org/">Repository Manager Nexus</a> gewählt. Features werden mit dieser Infrastruktur regelmäßig einmal wöchentlich live gestellt, dringende Bugfixes natürlich schneller.</p><p>Im letzten Talk der Konferenz <strong>&#8220;Vom lokalen Build zum Deployment&#8221;</strong> stellte Manuel Pichler (<a
href="http://qafoo.com/">Qafoo</a>) sein neustes <a
href="https://github.com/manuelpichler/build-commons">Open-Source-Projekt build-commons</a> vor. Damit lässt sich das Problem angehen, dass Build-Skripte oft von Projekt zu Projekt kopiert werden, und das Rad in dieser Hinsicht noch zu oft neu erfunden wird. Die build-commons umfassen eine Vielzahl von Ant-Skripten, die in einer festen Reihenfolge ausgeführt werden, jedoch nahezu überall Erweiterungsmöglichkeiten bieten. Die Struktur der Verzeichnisse und Bezeichnungen der Skripte orientiert sich an Maven. Die Skripte benötigen <a
href="http://ant.apache.org/">Apache Ant</a> 1.8+.</p><p>Alles in allem wieder mal eine interessante Konferenz von der man mit vielen Anregungen und Ideen zurückkommt. Jetzt muss ich mich erstmal ausschlafen, um morgen wieder für den Arbeitsalltag gewappnet zu sein <img
src='http://www.mageblog.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><div
class="fblike_button" style="margin: 10px 0;"><iframe
src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.mageblog.de%2F2011%2F10%2F12%2Fipc-2011-tag-3%2F&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;font=verdana&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div> ]]></content:encoded> <wfw:commentRss>http://www.mageblog.de/2011/10/12/ipc-2011-tag-3/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>IPC 2011 – Tag 2</title><link>http://www.mageblog.de/2011/10/12/ipc-2011-tag-2/</link> <comments>http://www.mageblog.de/2011/10/12/ipc-2011-tag-2/#comments</comments> <pubDate>Wed, 12 Oct 2011 08:56:18 +0000</pubDate> <dc:creator>David Fuhr</dc:creator> <category><![CDATA[Entwicklung]]></category> <category><![CDATA[ext js]]></category> <category><![CDATA[ipc]]></category> <category><![CDATA[php]]></category> <category><![CDATA[rest]]></category> <category><![CDATA[sencha touch]]></category> <category><![CDATA[symfony]]></category> <category><![CDATA[xdebug]]></category> <category><![CDATA[zend]]></category> <category><![CDATA[zend framework]]></category> <guid isPermaLink="false">http://www.mageblog.de/?p=1361</guid> <description><![CDATA[Da wir gestern noch bis spät geschäftliche Besprechungen hatten, haben wir die Keynote heute morgen leider verpasst. Wir sind daher pünktlich für den zweiten Kaffee des Tages vor dem zweiten Slot in der Rheingoldhalle angekommen Den ersten Vortrag des Tages bildete somit &#8220;Zend Framework 2: State of the Art&#8221;. Enrico Zimuel (Zend) gab einen groben [...]]]></description> <content:encoded><![CDATA[<p>Da wir gestern noch bis spät geschäftliche Besprechungen hatten, haben wir die Keynote heute morgen leider verpasst. Wir sind daher pünktlich für den zweiten Kaffee des Tages vor dem zweiten Slot in der Rheingoldhalle angekommen <img
src='http://www.mageblog.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><p>Den ersten Vortrag des Tages bildete somit <strong>&#8220;Zend Framework 2: State of the Art&#8221;</strong>. Enrico Zimuel (<a
href="http://www.zend.com/">Zend</a>) gab einen groben Überblick zu den Veränderungen und Neuerungen in <a
href="http://framework.zend.com/zf2">ZF2</a> und zur aktuellen Zeitplanung: eine erste Beta soll noch im Oktober veröffentlicht werden. Das Autoloading in ZF2 wurde grundlegend erweitert. Zwar unterstützt der Autoloader nach wie vor die alte include-path-basierte Methode, zusätzlich kann man Namespaces mit Verzeichnissen verknüpfen woraufhin der Loader Klassen dieser Namespaces direkt aus dem spezifizierten Verzeichnis lädt. Das bringt laut den Zend-Benchmarks mit Opcode-Cache bis zu 40% Performancegewinn. Bis zu 60% schneller ist der Loader mit einer statischen Classmap. Dabei wird das gleiche Prinzip wie bei <a
href="https://github.com/theseer/Autoload">Arne Blankerts Autoload</a> verwendet. Dependency Injection wird über Container, Interfaces und Setter ermöglicht, die auch über Annotationen konfigurierbar sind. Beispiele dazu finden sich auf <a
href="https://github.com/ralphschindler/zf2-di-use-cases">Ralph Schindlers Git-Repository</a>. Ebenfalls neu sein wird der EventManager sowie das eventgetriebene MVC-Framework, dass sich auch modular erweitern lassen soll.</p><p><span
id="more-1361"></span></p><p><a
href="http://derickrethans.nl/">Derick Rethans</a> erläuterte Möglichkeiten, Herangehensweisen und Fallstricke beim <strong>Profiling von PHP Anwendungen</strong>. Er warnte auch davor &#8220;Tipps&#8221; aus dem Internet einfach zu glauben, da viele dieser &#8220;Verbesserungsvorschläge&#8221; nicht (mehr) stimmen (zum Teil stark abhängig von der PHP-Version) oder für Microoptimierungen die Wartbarkeit des Codes drastisch verschlechtern. Bei der Analyse von Performanceproblemen ist zunächst wichtig den Flaschenhals zu finden. <code><a
href="http://en.wikipedia.org/wiki/Vmstat">vmstat</a></code> erlaubt häufig bereits die Eingrenzung auf einen der Problembereiche Datenbank (langsame Queries), <abbr
title="Input/Output">IO</abbr> (zuviele Lese-/Schreiboperationen von der Festplatte), System (möglicherweise beschäftigt mit anderen Aufgaben) oder Code. Dazu lassen sich viele parallele Zugriffe mit <a
href="http://www.joedog.org/index/siege-home">siege</a> oder <a
href="http://www.hpl.hp.com/research/linux/httperf/">httperf</a> simulieren. Sollte sich dabei der Code als Flaschenhals herausstellen kann man sich mit Zeitmesspunkten (z.B. mit <a
href="http://incubator.apache.org/zetacomponents/documentation/trunk/Debug/phpdoc/ezcDebug.html">ezcDebug</a>), der Analyse der includes mit <a
href="http://pecl.php.net/package/inclued">inclued</a>, der Auswertung von <a
href="http://xdebug.org/">Xdebug</a>-Traces mit den <a
href="https://github.com/technosophos/ValaXdebugTools">Vala Xdebug Tools</a> oder <a
href="http://kcachegrind.sourceforge.net/">KCachegrind</a>, <a
href="http://valgrind.org/">Valgrind</a> oder die Verwendung (bei Bedarf mit entsprechender Konfiguration auch im Live-Betrieb) von <a
href="http://pecl.php.net/package/xhprof">XHProf</a> und XHGui.</p><p>Nach der Mittagspause kam der David-Zülke-Doppelschlag (<a
href="http://www.bitextender.com/">Bitextender</a>) zu RESTful Webservices. Zuerst die Keynote <strong>&#8220;How the Web Evolves with Hypermedia&#8221;</strong> und direkt anschließend <strong>&#8220;Designing HTTP Interfaces and RESTful Web Services&#8221;</strong>. Im Zentrum beider Vorträge stand Roy Fieldings Aussage</p><blockquote
cite="http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven"><p>&#8220;[...] if the engine of application state (and hence the API) is not being driven by hypertext, then it cannot be RESTful and cannot be a REST API.&#8221;</p></blockquote><p>sowie das <a
href="http://martinfowler.com/articles/richardsonMaturityModel.html">Richardson Maturity Model</a>. Wichtig ist vor allem die Verwendung der <a
href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html">HTTP-Verben</a> (GET, PUT, POST, DELETE) und der korrekten <a
href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html">HTTP-Status-Codes</a>, <a
href="http://www.w3.org/Provider/Style/URI">unveränderliche, logisch strukturierte URLs</a> sowie die Verwendung von <a
href="http://en.wikipedia.org/wiki/HATEOAS">Hypermedia als treibende Kraft des Anwendungszustands</a>. Ein gut geplanter und implementierter REST Webservice bedeutet am Anfang zwar etwas mehr Aufwand, bietet aber Zuverlässigkeit und Konsistenz für die Clients auf lange Zeit. Durch die Erweiterbarkeit von XML und die Navigierbarkeit über die Hypermedia-Informationen können Clients auf Änderungen automtisch reagieren und funktionieren auch weiterhin.</p><p>Lukas Smith (<a
href="http://www.liip.ch/">Liip</a>) stellte in seinem Talk powerpointfrei das im Juli veröffentlichte <strong><a
href="http://symfony.com/">Symfony2</a> anhand von Codebeispoielen</strong> vor. Dabei demonstrierte er unter anderem die Möglichkeiten zur Einbindung von bundles, das Routing, die Verwendung der Template-Engine, den generellen Ablauf der Anwendung und ging auf einzelne Fragen ein.</p><p>Nachdem Thorsten Suckow-Homberg als Referent für den Vortrag <strong>&#8220;&#8216;Mobile&#8217; Backends &#8211; Backend-Entwicklung für Ext JS/Sencha Touch&#8221;</strong> kurzfristig ausfiel, übernahm <a
href="http://www.muh-die-kuh.de/">Hans-Christian Otto</a> (<a
href="http://www.crosscan.com/">Crosscan</a>) spontan das Thema. Nach einem Überblick über <a
href="http://www.sencha.com/products/extjs/">Ext JS</a> und <a
href="http://www.sencha.com/products/touch/">Sencha Touch</a> ließ sich feststellen, dass es zwischen beiden Bibliotheken, vor allem in Verwendungsdetails, zwar Unterschiede gibt, sie aber noch viel Gemeinsamkeiten haben. Vor allem die Anbindung von Datenbackends ist bei beiden Frameworks nahezu identisch, womit es problemlos möglich ist von beiden Oberflächen aus den selben Webservice anzusprechen. Da sich die einzelnen Komponenten von Ext JS schlecht herauslösen lassen, kann man sich als Alternative für den Datenzugriff ohne Ext JS <a
href="http://documentcloud.github.com/backbone/">backbone.js</a> anschauen. Als Editor wurde <a
href="http://spket.com/">Spket</a>, dass auch als Eclipse-Plugin verfügbar ist, empfohlen.</p><p>Nach dem Vortragsprogramm gab es noch Abendessen, Freibier und -wein, Roulette, Black Jack, Texas Hold&#8217;em, Waffeln und Vanilleeis. Nachdem die Getränke alle waren und die Croupiers Feierabend machen wollten haben wir noch auf zwei oder drei Drinks in der <a
href="http://www.cuban-bar.de/">Cuban Bar</a> vorbeigeschaut.<div
class="fblike_button" style="margin: 10px 0;"><iframe
src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.mageblog.de%2F2011%2F10%2F12%2Fipc-2011-tag-2%2F&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;font=verdana&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div> ]]></content:encoded> <wfw:commentRss>http://www.mageblog.de/2011/10/12/ipc-2011-tag-2/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>IPC 2011 – Tag 1</title><link>http://www.mageblog.de/2011/10/11/ipc-2011-tag-1/</link> <comments>http://www.mageblog.de/2011/10/11/ipc-2011-tag-1/#comments</comments> <pubDate>Tue, 11 Oct 2011 00:40:26 +0000</pubDate> <dc:creator>David Fuhr</dc:creator> <category><![CDATA[Allgemein]]></category> <category><![CDATA[Entwicklung]]></category> <category><![CDATA[kanban]]></category> <category><![CDATA[php]]></category> <category><![CDATA[redis]]></category> <category><![CDATA[scrum]]></category> <guid isPermaLink="false">http://www.mageblog.de/?p=1352</guid> <description><![CDATA[Juhu, es ist wieder so weit: Konferenz! Nach viel zu frühem Aufstehen (7 Uhr) ging es heute morgen auf nach Mainz zur IPC 2011. Dort konnte ich beweisen, dass die Android-Navigation den nächsten McDonalds besser findet als angebissenes Obst. Zur Rheingoldhalle konten beide Navigationssysteme gleich gut navigieren. Auf der Konferenz angekommen gab Johannes Schlüter (Oracle) [...]]]></description> <content:encoded><![CDATA[<p>Juhu, es ist wieder so weit: Konferenz! <img
src='http://www.mageblog.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Nach viel zu frühem Aufstehen (7 Uhr) ging es heute morgen auf nach Mainz zur <a
href="http://phpconference.com/2011/">IPC 2011</a>. Dort konnte ich beweisen, dass die Android-Navigation den nächsten McDonalds besser findet als angebissenes Obst. Zur Rheingoldhalle konten beide Navigationssysteme gleich gut navigieren.</p><p>Auf der Konferenz angekommen gab <a
href="http://schlueters.de/">Johannes Schlüter</a> (Oracle) zunächst ein <strong>Update bezüglich PHP 5.4</strong>. Dabei wurde unter anderem auf <a
href="http://blog.mayflower.de/archives/731-Traits-in-PHP-5.4.html">Traits</a>, die <a
href="https://wiki.php.net/rfc/shortsyntaxforarrays#syntax">neue Array-Syntax</a> und den <a
href="https://wiki.php.net/rfc/builtinwebserver">internen PHP-Dev-Webserver</a> eingegangen. Verbunden war das Ganze mit der eindringlichen Aufforderung die Nightly-Builds zu testen um solche <a
href="http://www.php.net/ChangeLog-5.php#5.3.8">Bugs wie in PHP 5.3.7</a> und andere zu vermeiden. PHP würde zwar von einer Test-Suite getestet, doch &#8220;unbeabsichtigte&#8221; (sprich: nicht im Sinne der PHP-Entwickler) Verwendungen von Funktionen würden von dieser Test-Suite eben nicht erfasst, was auch zum <a
href="http://www.byte.nl/blog/2011/09/23/security-bug-in-is_a-function-in-php-5-3-7-5-3-8/">aktuellen Problem mit der is_a()-Funktion</a> führe.</p><p><span
id="more-1352"></span></p><p>Anschließend hat <a
href="http://kore-nordmann.de/">Kore Nordmann</a> (<a
href="http://qafoo.com/">Quafoo</a>) <strong>&#8220;A generic PHP Application Installer&#8221;</strong> vorgestellt. Bei der Entwicklung des <a
href="http://arbitracker.org/">Projekttracking-Tools Arbit</a> stellte sich das Problem der Installation. Da es für dieses Problem derzeit keine generische Lösung gibt, wird derzeit für jede Software ein eigener Installer entwickelt. Da das offensichtlich wenig effizient ist, haben sich die Jungs von Quafoo daran gemacht einen generischen, wiederverwendbaren Installer zu schreiben (<a
href="svn://arbitracker.org/arbit/projects/installer/trunk">svn://arbitracker.org/arbit/projects/installer/trunk</a>). Damit lassen sich Aufgaben sowie optionale und verpflichtende Abhängigkeiten zwischen den Aufgaben definieren, die dann vom Installer in der gewünschten Reihenfolge abgearbeitet werden. Wiederrum als Unterprojekt des Installers entstand daraufhin Phync (<a
href="svn://arbitracker.org/arbit/projects/phync/trunk">svn://arbitracker.org/arbit/projects/phync/trunk</a>), um die Dateien des zu installierenden Pakets an die richtigen Stellen zu kopieren. Phync nutzt dazu die PHP-Stream-Wrapper und ist ebenfalls erweiterbar ausgelegt.</p><p>Frisch gestärkt vom Mittagessen stellte André Neubauer (<a
href="http://www.immobilienscout24.de/">ImmobilienScout24</a>) seine <strong>Erfahrungen bei der Einführung von <a
href="http://de.wikipedia.org/wiki/Scrum">Scrum</a></strong> vor. ImmobilienScout stellte 2008 seine internen Entwicklerteams schrittweise vom <a
href="http://de.wikipedia.org/wiki/Wasserfallmodell">Wasserfallmodell</a> auf Scrum um. Nach und nach wurden die ursprünglich reinen Entwicklerteams mit Mitarbeitern aus den Bereichen Qualitätssicherung, Grafik und Anwendungsbetrieb (Operations) verstärkt um eine vertikale Prozessdurchdringung zu erreichen. Wichtig für die Einführung sei neben der Verbindlichkeit (Commitment) und dem Einhalten der Scrum-Regeln die Hinzunahme von externer Hilfe. Zum einen hat ein externer Berater bringt zum einen die Erfahrung als auch einen unbefangenen Blick auf die bestehenden Prozesse und Hemmnisse (Impediments) mit. Inzwischen verfolgt ImmobilienScout eine Null-Bug-Strategie und setzt Scrum auch bei den externen Teams ein. Wobei die Einbindung der Externen aufgrund der räumlichen Entfernung nicht immer einfach ist.</p><p>Thementreu ging es danach bei den agilen Methoden mit einem <strong><a
href="http://de.wikipedia.org/wiki/Kanban_in_der_IT">Kanban</a>-Planspiel</strong> von <a
href="http://www.it-agile.de/">it-agile</a> weiter. Das Zusammenspiel der &#8220;Analysten&#8221;, &#8220;Entwicklern&#8221; und &#8220;Testern&#8221; wurde so spielerisch erprobt und von den &#8220;Trackern&#8221; aufgezeichnet. Die Analysten mussten einfache mathematische Aufgaben zur Berechnung von Punkten im Koordinatensystem lösen. Diese wurden daraufhin von den Entwicklern ins Koorinatensystem auf Papier übertragen und zu Drei- oder Vierecken verbunden. Anschließend kontrollierten die Tester die Rechnungen sowie das Papierergebnis und setzen die Aufgabe bei Übereinstimmung auf &#8220;erledigt&#8221;. Zusätzlich zu den aus Scrum bekannten Unterscheidungen zwischen &#8220;Zu erledigen&#8221;, &#8220;In Bearbeitung&#8221; und &#8220;Erledigt&#8221; lassen sich mit Kanban auch besser aufeinanderfolgende, abhängige Prozessschritte wie eben Analyse, Entwicklung, Testen und Abnahme besser tracken. Durch die Limitierung der maximal erlaubten Tickets pro Prozessschritt lässt sich außerdem einfach ein starkes Druckmittel auf die anderen Prozessschritte installieren: wird das Limit bei einem Schritt erreicht, darf dieser solange kein neues Ticket ziehen, bis der darauffolgende Schritt erledigt ist. Durch den offensichtlichen Stillstand wird der Druck zur Bearbeitung auf die anderen Schritte erhöht, außerdem kann die freie Kapazität zur Unterstützung von überlasteten Schritten genutzt werden.</p><p>Zum Abschluss des heutigen Vortragsprogramms referierte <a
href="http://seld.be/">Jordi Boggiano</a> (<a
href="http://nelm.io/">Nelmio</a>) über <strong>&#8220;Redis &#8211; Your advanced in-memory key-value Store&#8221;</strong>. <a
href="http://www.redis.io/">Redis</a> ist zunächst ein schneller Key-Value-Store, vergleichbar mit Memcached, speichert die Daten jedoch zusätzlich persistent auf der Festplatte. Außerdem bietet Redis eine Reihe von Features, mit denen Memcached nicht dienen kann. Es erlaubt die Speicherung von verschiedenen Datenmengen wie Sets, Maps und Listen inklusive der entsprechenden Operationen wie pop und push sowie Subskription von Variablen, Master-Slave-Setups, atomare In- und Dekrements und Transaktionen. Für PHP existieren die beiden Module <a
href="https://github.com/nicolasff/phpredis">phpredis</a> und <a
href="https://github.com/seppo0010/phpiredis">phpiredis</a> sowie die Plain-PHP-Implementierung <a
href="https://github.com/nrk/predis">predis</a>.</p><p>Nach einem kurzen Zwischenstopp im Hotel ließen wir den Tag mit einem Abendessen im <a
href="http://www.alexgastro.de/">Alex</a> sowie dem einen oder anderen Getränk im <a
href="http://www.heiliggeist-mainz.de/">Heiliggeist</a> und <a
href="http://www.sausalitos.de/">Saustallitos</a> ausklingen.<div
class="fblike_button" style="margin: 10px 0;"><iframe
src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.mageblog.de%2F2011%2F10%2F11%2Fipc-2011-tag-1%2F&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;font=verdana&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div> ]]></content:encoded> <wfw:commentRss>http://www.mageblog.de/2011/10/11/ipc-2011-tag-1/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>VirtualBox Guru Meditation</title><link>http://www.mageblog.de/2011/10/05/virtualbox-guru-meditation/</link> <comments>http://www.mageblog.de/2011/10/05/virtualbox-guru-meditation/#comments</comments> <pubDate>Wed, 05 Oct 2011 13:42:45 +0000</pubDate> <dc:creator>David Fuhr</dc:creator> <category><![CDATA[Allgemein]]></category> <guid isPermaLink="false">http://www.mageblog.de/?p=1341</guid> <description><![CDATA[Wenn der VirtualBox Guru mal meditiert&#8230; &#8230; heißt das, dass die VM abgestürzt ist. Schön, dass diese Fehlermeldung schon so alt ist und eine Tradition hat, das sie sogar einen eigenen Wikipedia-Artikel hat.]]></description> <content:encoded><![CDATA[<p>Wenn der VirtualBox Guru mal meditiert&#8230;</p><div
id="attachment_1342" class="wp-caption aligncenter" style="width: 310px"><a
href="http://www.mageblog.de/wp-content/uploads/2011/10/virtualbox-guru.png"><img
src="http://www.mageblog.de/wp-content/uploads/2011/10/virtualbox-guru-300x209.png" alt="VirtualBox Guru Meditation" title="VirtualBox Guru Meditation" width="300" height="209" class="size-medium wp-image-1342" /></a><p
class="wp-caption-text">VirtualBox Guru Meditation</p></div><p>&#8230; heißt das, dass die VM abgestürzt ist. Schön, dass diese Fehlermeldung schon so alt ist und eine Tradition hat, das sie sogar einen <a
href="http://de.wikipedia.org/wiki/Guru_Meditation">eigenen Wikipedia-Artikel</a> hat.<div
class="fblike_button" style="margin: 10px 0;"><iframe
src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.mageblog.de%2F2011%2F10%2F05%2Fvirtualbox-guru-meditation%2F&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;font=verdana&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div> ]]></content:encoded> <wfw:commentRss>http://www.mageblog.de/2011/10/05/virtualbox-guru-meditation/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> </channel> </rss><!-- Dynamic page generated in 3.589 seconds. --><!-- Cached page generated by WP-Super-Cache on 2012-02-05 07:20:03 -->

