<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Harrie Verveer</title>
	<atom:link href="http://www.harrieverveer.nl/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.harrieverveer.nl</link>
	<description>Professional PHP Developer &#38; Conference Speaker</description>
	<lastBuildDate>Sun, 22 May 2011 09:43:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>DB migrations: rename instead of drop</title>
		<link>http://www.harrieverveer.nl/2011/03/02/db-migrations-rename-instead-of-drop/</link>
		<comments>http://www.harrieverveer.nl/2011/03/02/db-migrations-rename-instead-of-drop/#comments</comments>
		<pubDate>Wed, 02 Mar 2011 09:46:43 +0000</pubDate>
		<dc:creator>harrie</dc:creator>
				<category><![CDATA[Tips & tricks]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[migrations]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://www.harrieverveer.com/?p=247</guid>
		<description><![CDATA[<p>In my talks and article I always mention that when it comes to database migrations it is generally a bad idea to rely on undo-patches for rollbacks. As an example I always use the same story: &#8220;Imagine you write a database patch that removes a column from a table, and then you write an undo-patch that adds the column back&#160;[&#8230;]</p>]]></description>
			<content:encoded><![CDATA[<div id="attachment_251" class="wp-caption alignright" style="width: 310px"><a href="/wp-content/uploads/2011/03/bad.png"><img class="size-medium wp-image-251" title="dbmigrations_drop" src="/wp-content/uploads/2011/03/bad-300x257.png" alt="" width="300" height="257" /></a><p class="wp-caption-text">Reverting a dropped column</p></div>
<p>In my talks and article I always mention that when it comes to database migrations it is generally a bad idea to rely on undo-patches for rollbacks. As an example I always use the same story: &#8220;Imagine you write a database patch that removes a column from a table, and then you write an undo-patch that adds the column back again. Sure, your database schema is now the same as it was before &#8211; but the content is gone!&#8221; And then I would move on by saying that you probably shouldn&#8217;t rely on undo-patches anyway for rollbacks, because it is better to thoroughly test everything before updating so you are absolutely certain that you won&#8217;t have to rollback. Also, I recommended to make backups first, and use that to revert database migrations when needed. Easier said than done!</p>
<p>The fact that I am in the luxurious position where this approach usually is an option, doesn&#8217;t mean that this is a solution for everyone. For other projects where, for example, larger databases are involved, rolling back by restoring a backup would be considered highly inefficient (and if the database is in use it would actually result in data loss). Being able to rollback patches can be convenient, but reverting dropped columns can&#8217;t be done off course.</p>
<p>When I did my talk at DPC10 in Amsterdam however, someone in the audience (sorry, I don&#8217;t remember who it was) suggested a very simple but very effective solution. In fact, it was such a simple solution that I couldn&#8217;t stand I hadn&#8217;t thought of it before: If you rename your column or table first instead of dropping it you can still just use an undo-patch to revert the change. In a later stage, when you are absolutely certain you don&#8217;t need to do a rollback anymore, you can simply drop the renamed column or table by writing another patch. For example in a next release.</p>
<div id="attachment_253" class="wp-caption aligncenter" style="width: 505px"><img class="size-full wp-image-253" title="better" src="/wp-content/uploads/2011/03/better.png" alt="" width="495" height="429" /><p class="wp-caption-text">Reverting a renamed column</p></div>
<p>As you can see, sometimes the simplest solution is the best. Beware though, as in some situations this approach might still cause problems: Records added to this table between the moment the patch was applied and the moment the undo file was applied won&#8217;t have a value in the age column, to name just one. As always when we are talking database version control, it all depends on the specific situation you are in.</p>
<p>I myself still refuse to write undo-patches as most patches create new tables or columns anyway, instead of removing them &#8211; and if patches actually do drop tables or columns they probably haven&#8217;t been very significant for quite some time anyway. Maybe the main reason is that I have simply never found myself in the situation where an undo-patch would have helped me. This might be different for you though, and if you are looking for a way to rollback dropped columns or tables, renaming them first might be a pretty good idea.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.harrieverveer.nl/2011/03/02/db-migrations-rename-instead-of-drop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Benchmarking Xdebug</title>
		<link>http://www.harrieverveer.nl/2011/02/01/benchmarking-xdebug/</link>
		<comments>http://www.harrieverveer.nl/2011/02/01/benchmarking-xdebug/#comments</comments>
		<pubDate>Tue, 01 Feb 2011 12:00:27 +0000</pubDate>
		<dc:creator>harrie</dc:creator>
				<category><![CDATA[Software development]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[benchmarking]]></category>
		<category><![CDATA[xdebug]]></category>

		<guid isPermaLink="false">http://www.harrieverveer.com/?p=201</guid>
		<description><![CDATA[<p>A very popular and widely used PHP extension for debugging and profiling PHP applications is <a href="http://www.xdebug.org/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.xdebug.org/?referer=');">Xdebug</a>. Normally this tool would be used on your development environment, or in rare occasions on some remote environment that is similar to the production environment. However, a little while ago one of my co-workers found a production environment running Xdebug, and we&#160;[&#8230;]</p>]]></description>
			<content:encoded><![CDATA[<p>A very popular and widely used PHP extension for debugging and profiling PHP applications is <a href="http://www.xdebug.org/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.xdebug.org/?referer=');">Xdebug</a>. Normally this tool would be used on your development environment, or in rare occasions on some remote environment that is similar to the production environment. However, a little while ago one of my co-workers found a production environment running Xdebug, and we wondered how severe this was influencing performance. Since you are adding extra overhead it is very likely things will run slower. But how significant is this difference. Would it be something worth considering?</p>
<p><strong>Disclaimer</strong><br />
Now I know that debugging a production environment is generally considered unnecessary and a really bad idea. I myself can&#8217;t really think of a situation where I would actually want to have Xdebug on my production machine – but that&#8217;s not the point. I just had a new question that I wanted to answer: “How much does installing Xdebug affect the performance of PHP?”</p>
<p><strong>The hardware</strong><br />
To be able to test this I first needed to find a proper testing environment. Unfortunately I don&#8217;t have any webservers laying around, and testing directly on my macbook would probably be a bad idea – since there are a million processes running that all influence the performance of the machine, and therefore would influence the results. After some pondering I realised that I had an old (well&#8230; more like ancient) laptop laying around that would actually suit this purpose quite well. When it comes to speed it doesn&#8217;t come anywhere close to a modern production environment – but since we will be looking at relative changes rather than absolute measurements I figured it would be just fine.</p>
<p><strong>The software</strong><br />
I downloaded and installed a fresh new copy of Debian. Once it was installed I decided to take the easy way and install PHP simply by using apt-get install php5. Finally, I installed xdebug using the PECL installer. With just this installed and nothing else, I was convinced my benchmark results would be quite reliable.</p>
<p>Software installed:</p>
<ul>
<li>Debian 5.0.8</li>
<li>PHP 5.2.6 with Suhosin-patch</li>
<li>Xdebug 2.1.0</li>
</ul>
<p><strong>The benchmark</strong><br />
Why write a benchmark when they already exist? For testing purposes I decided to use the <a href="http://svn.php.net/viewvc/php/php-src/trunk/Zend/bench.php?view=markup" target="_blank" onclick="pageTracker._trackPageview('/outgoing/svn.php.net/viewvc/php/php-src/trunk/Zend/bench.php?view=markup&amp;referer=');">bench.php</a> script that comes with the PHP source. This script does not run out-of-the-box when Xdebug is installed, because one test (Ackermann function) exceeds the default Xdebug limit of 100 nested function calls. Now I could of course increase this number, but I wanted to test how Xdebug performs without any modifications to the configuration – so I decided to simply skip this one test and just run the remaining ones.</p>
<p>Finally, after a lot of preparation, I was  ready to run the script. \o/</p>
<p><strong>The results</strong><br />
I decided to run the script three times with the xdebug extension enabled, and then another three times with the xdebug extension disabled. The results were pretty clear:</p>
<p><a href="/wp-content/uploads/2011/01/diagram.png"><img class="aligncenter size-medium wp-image-209" title="Bench.php - xdebug enabled and xdebug disabled" src="/wp-content/uploads/2011/01/diagram-300x199.png" alt="" width="300" height="199" /></a></p>
<table border="0" cellspacing="0" frame="VOID" rules="NONE">
<colgroup>
<col width="122"></col>
<col width="60"></col>
<col width="71"></col>
<col width="68"></col>
<col width="86"></col>
<col width="86"></col>
<col width="86"></col>
<col width="86"></col>
</colgroup>
<tbody>
<tr>
<td width="122" height="18" align="LEFT"></td>
<td colspan="3" width="199" align="LEFT"><strong>No Xdebug</strong><br />
(time in seconds)</td>
<td width="86" align="LEFT"></td>
<td colspan="3" width="257" align="LEFT"><strong>Xdebug</strong><br />
(time in seconds)</td>
</tr>
<tr>
<td height="17" align="LEFT"></td>
<td align="LEFT"><strong>Run 1</strong></td>
<td align="LEFT"><strong>Run 2</strong></td>
<td align="LEFT"><strong>Run 3</strong></td>
<td align="LEFT"></td>
<td align="LEFT"><strong>Run 1</strong></td>
<td align="LEFT"><strong>Run 2</strong></td>
<td align="LEFT"><strong>Run 3</strong></td>
</tr>
<tr>
<td height="18" align="LEFT">simple</td>
<td align="RIGHT">0.687</td>
<td align="RIGHT">0.648</td>
<td align="RIGHT">0.681</td>
<td align="LEFT"></td>
<td align="RIGHT">1.327</td>
<td align="RIGHT">1.361</td>
<td align="RIGHT">1.367</td>
</tr>
<tr>
<td height="18" align="LEFT">simplecall</td>
<td align="RIGHT">0.813</td>
<td align="RIGHT">0.744</td>
<td align="RIGHT">0.786</td>
<td align="LEFT"></td>
<td align="RIGHT">3.581</td>
<td align="RIGHT">3.770</td>
<td align="RIGHT">3.875</td>
</tr>
<tr>
<td height="18" align="LEFT">simpleucall</td>
<td align="RIGHT">1.138</td>
<td align="RIGHT">1.225</td>
<td align="RIGHT">1.169</td>
<td align="LEFT"></td>
<td align="RIGHT">4.439</td>
<td align="RIGHT">4.510</td>
<td align="RIGHT">4.877</td>
</tr>
<tr>
<td height="18" align="LEFT">simpleudcall</td>
<td align="RIGHT">1.289</td>
<td align="RIGHT">1.469</td>
<td align="RIGHT">1.336</td>
<td align="LEFT"></td>
<td align="RIGHT">4.621</td>
<td align="RIGHT">4.609</td>
<td align="RIGHT">4.747</td>
</tr>
<tr>
<td height="18" align="LEFT">mandel</td>
<td align="RIGHT">2.016</td>
<td align="RIGHT">2.259</td>
<td align="RIGHT">2.161</td>
<td align="LEFT"></td>
<td align="RIGHT">3.646</td>
<td align="RIGHT">4.028</td>
<td align="RIGHT">4.036</td>
</tr>
<tr>
<td height="17" align="LEFT">mandel2</td>
<td align="RIGHT">2.774</td>
<td align="RIGHT">2.753</td>
<td align="RIGHT">2.766</td>
<td align="LEFT"></td>
<td align="RIGHT">3.495</td>
<td align="RIGHT">4.008</td>
<td align="RIGHT">4.215</td>
</tr>
<tr>
<td height="18" align="LEFT">ary(50000)</td>
<td align="RIGHT">0.171</td>
<td align="RIGHT">0.175</td>
<td align="RIGHT">0.171</td>
<td align="LEFT"></td>
<td align="RIGHT">0.210</td>
<td align="RIGHT">0.224</td>
<td align="RIGHT">0.224</td>
</tr>
<tr>
<td height="17" align="LEFT">ary2(50000)</td>
<td align="RIGHT">0.136</td>
<td align="RIGHT">0.136</td>
<td align="RIGHT">0.136</td>
<td align="LEFT"></td>
<td align="RIGHT">0.172</td>
<td align="RIGHT">0.180</td>
<td align="RIGHT">0.184</td>
</tr>
<tr>
<td height="17" align="LEFT">ary3(2000)</td>
<td align="RIGHT">1.363</td>
<td align="RIGHT">1.365</td>
<td align="RIGHT">1.416</td>
<td align="LEFT"></td>
<td align="RIGHT">2.133</td>
<td align="RIGHT">2.463</td>
<td align="RIGHT">2.450</td>
</tr>
<tr>
<td height="18" align="LEFT">fibo(30)</td>
<td align="RIGHT">3.694</td>
<td align="RIGHT">3.517</td>
<td align="RIGHT">3.538</td>
<td align="LEFT"></td>
<td align="RIGHT">10.418</td>
<td align="RIGHT">12.364</td>
<td align="RIGHT">12.943</td>
</tr>
<tr>
<td height="17" align="LEFT">hash1(50000)</td>
<td align="RIGHT">0.212</td>
<td align="RIGHT">0.216</td>
<td align="RIGHT">0.214</td>
<td align="LEFT"></td>
<td align="RIGHT">0.515</td>
<td align="RIGHT">0.618</td>
<td align="RIGHT">0.638</td>
</tr>
<tr>
<td height="17" align="LEFT">hash2(500)</td>
<td align="RIGHT">0.264</td>
<td align="RIGHT">0.266</td>
<td align="RIGHT">0.266</td>
<td align="LEFT"></td>
<td align="RIGHT">0.283</td>
<td align="RIGHT">0.357</td>
<td align="RIGHT">0.342</td>
</tr>
<tr>
<td height="18" align="LEFT">heapsort(20000)</td>
<td align="RIGHT">0.676</td>
<td align="RIGHT">0.667</td>
<td align="RIGHT">0.671</td>
<td align="LEFT"></td>
<td align="RIGHT">1.026</td>
<td align="RIGHT">1.198</td>
<td align="RIGHT">1.196</td>
</tr>
<tr>
<td height="17" align="LEFT">matrix(20)</td>
<td align="RIGHT">0.556</td>
<td align="RIGHT">0.552</td>
<td align="RIGHT">0.555</td>
<td align="LEFT"></td>
<td align="RIGHT">0.810</td>
<td align="RIGHT">0.960</td>
<td align="RIGHT">0.936</td>
</tr>
<tr>
<td height="18" align="LEFT">nestedloop(12)</td>
<td align="RIGHT">1.221</td>
<td align="RIGHT">1.208</td>
<td align="RIGHT">1.311</td>
<td align="LEFT"></td>
<td align="RIGHT">2.197</td>
<td align="RIGHT">2.570</td>
<td align="RIGHT">2.573</td>
</tr>
<tr>
<td height="18" align="LEFT">sieve(30)</td>
<td align="RIGHT">0.786</td>
<td align="RIGHT">0.786</td>
<td align="RIGHT">0.789</td>
<td align="LEFT"></td>
<td align="RIGHT">1.105</td>
<td align="RIGHT">1.231</td>
<td align="RIGHT">1.226</td>
</tr>
<tr>
<td height="18" align="LEFT">strcat(200000)</td>
<td align="RIGHT">0.090</td>
<td align="RIGHT">0.093</td>
<td align="RIGHT">0.096</td>
<td align="LEFT"></td>
<td align="RIGHT">0.148</td>
<td align="RIGHT">0.173</td>
<td align="RIGHT">0.169</td>
</tr>
<tr>
<td height="17" align="LEFT"><strong>Total:</strong></td>
<td align="RIGHT"><strong>17.886</strong></td>
<td align="RIGHT"><strong>18.079</strong></td>
<td align="RIGHT"><strong>18.062</strong></td>
<td align="LEFT"><strong><br />
</strong></td>
<td align="RIGHT"><strong>40.126</strong></td>
<td align="RIGHT"><strong>44.624</strong></td>
<td align="RIGHT"><strong>45.998</strong></td>
</tr>
<tr>
<td height="17" align="LEFT"></td>
<td align="LEFT"></td>
<td align="LEFT"></td>
<td align="LEFT"></td>
<td align="LEFT"></td>
<td align="LEFT"></td>
<td align="LEFT"></td>
<td align="LEFT"></td>
</tr>
<tr>
<td height="24" align="LEFT"><strong><span style="font-size: medium;">Average:</span></strong></td>
<td colspan="3" align="CENTER"><strong><span style="font-size: medium;">18.009 seconds</span></strong></td>
<td align="LEFT"><span style="font-size: medium;"><br />
</span></td>
<td colspan="3" align="CENTER"><strong><span style="font-size: medium;">43.583 seconds</span></strong></td>
</tr>
</tbody>
</table>
<p>So there we go. Without Xdebug it takes about 18 seconds to run the script, and with Xdebug enabled is takes about 44 seconds: 241% of the original time (or: it took 2.41 times as long to run the script).</p>
<p><strong>So what does this mean?</strong><br />
In this situation adding Xdebug slowed down the execution of the benchmark script quite significantly.</p>
<p><strong>So what doesn&#8217;t this mean?</strong><br />
<a href="/wp-content/uploads/2011/01/diagram-breakdown.png"><img class="alignright size-thumbnail wp-image-211" title="Breakdown per test" src="/wp-content/uploads/2011/01/diagram-breakdown-150x150.png" alt="" width="150" height="150" /></a>This doesn&#8217;t mean that your application will slow down with the same relative percentages, nor does it mean that you can compensate for this by buying 2.41x more servers. When we look at the <a href="/wp-content/uploads/2011/01/diagram-breakdown.png" target="_blank">breakdown per test</a> it&#8217;s clear to see that the differences per test are quite significant as well. For example: the time needed to run the &#8216;ary&#8217;-test increased with only 27%, while the time needed for the &#8216;simplecall&#8217; test increased with a whopping 379%.</p>
<p>Apparently the overhead caused by running Xdebug varies and is related to what kind of operations you are running. Calling functions seems to be affected a lot by Xdebug, while the effect of manipulating strings or arrays is less severe.</p>
<table border="0" cellspacing="0" frame="VOID" rules="NONE">
<colgroup>
<col width="130"></col>
<col width="86"></col>
<col width="86"></col>
<col width="86"></col>
</colgroup>
<tbody>
<tr>
<td width="130" height="18" align="LEFT"><strong>Test</strong></td>
<td width="86" align="LEFT"><strong>No xdebug</strong></td>
<td width="86" align="LEFT"><strong>Xdebug</strong></td>
<td width="86" align="LEFT"><strong>Percentage</strong></td>
</tr>
<tr>
<td height="18" align="LEFT">simplecall</td>
<td align="RIGHT">0.78</td>
<td align="RIGHT">3.74</td>
<td align="RIGHT">479%</td>
</tr>
<tr>
<td height="18" align="LEFT">simpleucall</td>
<td align="RIGHT">1.18</td>
<td align="RIGHT">4.61</td>
<td align="RIGHT">391%</td>
</tr>
<tr>
<td height="18" align="LEFT">simpleudcall</td>
<td align="RIGHT">1.36</td>
<td align="RIGHT">4.66</td>
<td align="RIGHT">341%</td>
</tr>
<tr>
<td height="18" align="LEFT">fibo(30)</td>
<td align="RIGHT">3.58</td>
<td align="RIGHT">11.91</td>
<td align="RIGHT">332%</td>
</tr>
<tr>
<td height="17" align="LEFT">hash1(50000)</td>
<td align="RIGHT">0.21</td>
<td align="RIGHT">0.59</td>
<td align="RIGHT">276%</td>
</tr>
<tr>
<td height="18" align="LEFT">simple</td>
<td align="RIGHT">0.67</td>
<td align="RIGHT">1.35</td>
<td align="RIGHT">201%</td>
</tr>
<tr>
<td height="18" align="LEFT">nestedloop(12)</td>
<td align="RIGHT">1.25</td>
<td align="RIGHT">2.45</td>
<td align="RIGHT">196%</td>
</tr>
<tr>
<td height="18" align="LEFT">mandel</td>
<td align="RIGHT">2.15</td>
<td align="RIGHT">3.9</td>
<td align="RIGHT">182%</td>
</tr>
<tr>
<td height="18" align="LEFT">strcat(200000)</td>
<td align="RIGHT">0.09</td>
<td align="RIGHT">0.16</td>
<td align="RIGHT">176%</td>
</tr>
<tr>
<td height="17" align="LEFT">ary3(2000)</td>
<td align="RIGHT">1.38</td>
<td align="RIGHT">2.35</td>
<td align="RIGHT">170%</td>
</tr>
<tr>
<td height="18" align="LEFT">heapsort(20000)</td>
<td align="RIGHT">0.67</td>
<td align="RIGHT">1.14</td>
<td align="RIGHT">170%</td>
</tr>
<tr>
<td height="17" align="LEFT">matrix(20)</td>
<td align="RIGHT">0.55</td>
<td align="RIGHT">0.9</td>
<td align="RIGHT">163%</td>
</tr>
<tr>
<td height="18" align="LEFT">sieve(30)</td>
<td align="RIGHT">0.79</td>
<td align="RIGHT">1.19</td>
<td align="RIGHT">151%</td>
</tr>
<tr>
<td height="17" align="LEFT">mandel2</td>
<td align="RIGHT">2.76</td>
<td align="RIGHT">3.91</td>
<td align="RIGHT">141%</td>
</tr>
<tr>
<td height="17" align="LEFT">ary2(50000)</td>
<td align="RIGHT">0.14</td>
<td align="RIGHT">0.18</td>
<td align="RIGHT">131%</td>
</tr>
<tr>
<td height="18" align="LEFT">ary(50000)</td>
<td align="RIGHT">0.17</td>
<td align="RIGHT">0.22</td>
<td align="RIGHT">127%</td>
</tr>
<tr>
<td height="17" align="LEFT">hash2(500)</td>
<td align="RIGHT">0.27</td>
<td align="RIGHT">0.33</td>
<td align="RIGHT">123%</td>
</tr>
</tbody>
</table>
<p><strong>A more realistic setup &#8211; Testing WordPress with ApacheBench</strong><br />
The numbers from the previous test are quite clear &#8211; but they hardly represent a real world example of an application. To get a bit more insight in how enabling or disabling Xdebug would affect an actual real life application I decided to add Apache, MySQL and WordPress into the mix, and benchmark the default homepage of a standard WordPress installation using the benchmark tool ApacheBench (ab), which comes with Apache. Adding these applications means there will be a lot more factors to influence the results &#8211; but I was hoping the results would somehow give an indication on how much an average application would be affected by installing Xdebug.</p>
<p>I ran ApacheBench a number of times. Every time it fired a total of 100 requests and every time I changed the number of maximum concurrent requests. I assumed that when Xdebug was enabled the requests would take longer &#8211; but because of that it&#8217;s also more likely the maximum number of concurrent requests that&#8217;s still acceptable is reached sooner. After a couple of test runs I had the following figures:</p>
<table border="0" cellspacing="0" frame="VOID" rules="NONE">
<colgroup>
<col width="203"></col>
<col width="153"></col>
<col width="134"></col>
<col width="164"></col>
<col width="100"></col>
</colgroup>
<tbody>
<tr>
<td width="203" height="18" align="LEFT"><strong>Max. concurrent requests</strong></td>
<td width="153" align="LEFT"><strong>No Xdebug (req./sec.)</strong></td>
<td width="134" align="LEFT"><strong>Xdebug (req./sec.)</strong></td>
<td width="164" align="LEFT"><strong>Difference (req./sec.)</strong></td>
<td width="100" align="LEFT"><strong>Difference %</strong></td>
</tr>
<tr>
<td height="17" align="LEFT">1</td>
<td align="LEFT">2,79</td>
<td align="LEFT">2,22</td>
<td align="LEFT">0,57</td>
<td align="LEFT">20,43%</td>
</tr>
<tr>
<td height="17" align="LEFT">5</td>
<td align="LEFT">2,75</td>
<td align="LEFT">2,16</td>
<td align="LEFT">0,59</td>
<td align="LEFT">21,45%</td>
</tr>
<tr>
<td height="17" align="LEFT">10</td>
<td align="LEFT">2,73</td>
<td align="LEFT">2,13</td>
<td align="LEFT">0,6</td>
<td align="LEFT">21,98%</td>
</tr>
<tr>
<td height="17" align="LEFT">15</td>
<td align="LEFT">2,69</td>
<td align="LEFT">2,11</td>
<td align="LEFT">0,58</td>
<td align="LEFT">21,56%</td>
</tr>
<tr>
<td height="17" align="LEFT">20</td>
<td align="LEFT">2,64</td>
<td align="LEFT">2,1</td>
<td align="LEFT">0,54</td>
<td align="LEFT">20,45%</td>
</tr>
<tr>
<td height="17" align="LEFT">25</td>
<td align="LEFT">2,61</td>
<td align="LEFT">1,34</td>
<td align="LEFT">1,27</td>
<td align="LEFT">48,66%</td>
</tr>
<tr>
<td height="17" align="LEFT">30</td>
<td align="LEFT">0,95</td>
<td align="LEFT">- timeout -</td>
<td align="LEFT">0,95</td>
<td align="LEFT">100,00%</td>
</tr>
</tbody>
</table>
<p>or in a pretty graph:</p>
<p><a href="/wp-content/uploads/2011/01/diagram-wordpress.png"><img class="aligncenter size-medium wp-image-220" title="diagram-wordpress" src="/wp-content/uploads/2011/01/diagram-wordpress-300x171.png" alt="" width="300" height="171" /></a></p>
<p>So not only does it take about 20% more time to respond to requests in normal situations, the maximum number of requests your server can handle is also influenced significantly.</p>
<p><strong>Conclusion</strong><br />
So as a conclusion we can say what we actually already suspected, Xdebug influences performance quite a lot. How much exactly is hard to tell and depends on what your application does. Xdebug is a great tool, and pretty much irreplaceable when you are looking for a proper tool to debug or profile an application on your development- or testing environment. Running it on your production machines however is something that would only make sense in <em>very </em>specific situations, as it is typically unnecessary and it slows down your application a lot. Also, make sure you turn off Xdebug on environments that you want to use for benchmarking your application &#8211; as it will influence your results.</p>
<p><em><strong>Edit: </strong>Directly after publishing this article Xdebug <a href="http://twitter.com/xdebug/statuses/32418557572677632" target="_blank" onclick="pageTracker._trackPageview('/outgoing/twitter.com/xdebug/statuses/32418557572677632?referer=');">mentioned</a> on twitter that the current version in SVN is supposed to be a lot faster. I&#8217;ll benchmark this new version soon &#8211; and let you know if there is any significant different.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.harrieverveer.nl/2011/02/01/benchmarking-xdebug/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Organizing the Dutch PHP Conference</title>
		<link>http://www.harrieverveer.nl/2011/01/21/organizing-the-dutch-php-conference/</link>
		<comments>http://www.harrieverveer.nl/2011/01/21/organizing-the-dutch-php-conference/#comments</comments>
		<pubDate>Fri, 21 Jan 2011 13:00:26 +0000</pubDate>
		<dc:creator>harrie</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[dpc]]></category>
		<category><![CDATA[Ibuildings]]></category>

		<guid isPermaLink="false">http://www.harrieverveer.com/?p=182</guid>
		<description><![CDATA[<p><img src="/wp-content/uploads/2011/01/dpc11logo.png" alt="Dutch PHP Conference 2011" title="dpc11logo" width="286" height="226" class="aligncenter size-full wp-image-183" style="background-color: #282923" /><br />
Some of you might already have noticed, others might not, but this year I am part of the team at <a href="http://www.ibuildings.com" onclick="pageTracker._trackPageview('/outgoing/www.ibuildings.com?referer=');">Ibuildings</a> that is responsible for organizing the DPC: the <a href="http://www.phpconference.nl/" onclick="pageTracker._trackPageview('/outgoing/www.phpconference.nl/?referer=');">Dutch PHP Conference</a>. As you can imagine I am thrilled about this! It is hard to believe that a couple of years ago I was just a visitor&#160;[&#8230;]</p>]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/2011/01/dpc11logo.png" alt="Dutch PHP Conference 2011" title="dpc11logo" width="286" height="226" class="aligncenter size-full wp-image-183" style="background-color: #282923" /><br />
Some of you might already have noticed, others might not, but this year I am part of the team at <a href="http://www.ibuildings.com" onclick="pageTracker._trackPageview('/outgoing/www.ibuildings.com?referer=');">Ibuildings</a> that is responsible for organizing the DPC: the <a href="http://www.phpconference.nl/" onclick="pageTracker._trackPageview('/outgoing/www.phpconference.nl/?referer=');">Dutch PHP Conference</a>. As you can imagine I am thrilled about this! It is hard to believe that a couple of years ago I was just a visitor at the DPC, visiting one of my first conferences, and this year I am actually helping to put it all together!</p>
<p>Of course, I could not possibly do this just by myself. Just imagine what needs to be done: the website needs to be built, the talks need to be selected, the speakers need to be informed, the tickets sales have to be taken care of, the venue needs to be booked, the flights and hotel rooms for the speakers have to be arranged, the social event needs to be organized. Etc. Etc. The list just keeps going. Organizing the conference is a huge task and a lot of people at Ibuildings are helping to organize it. Luckily most members of the team are pretty experienced by now, as they have been involved with organizing the DPC from the very first edition. It is comforting to have such a solid base to rely upon.</p>
<p>I myself will be mainly working together with my colleague <a href="http://blog.felixdv.com/" onclick="pageTracker._trackPageview('/outgoing/blog.felixdv.com/?referer=');">Felix de Vliegher</a>. Together we are responsible for what I think is the most fun part of the entire operation: creating the conference schedule, communicating with the community and communicating with the speakers. We will also host the conference, which I think is pretty exciting. Yes I have spoken to groups before. Quite large groups actually. But this time I will be speaking to a fully packed room on the main stage. Cool! I suppose it is much like doing a talk – only this time I will not be talking about database version control, but about what kind of sunglasses we found on the floor of room B and when you will get your food.</p>
<p>At the moment we are very busy selecting the talks and creating the conference schedule. Together with a couple of colleagues we are trying to figure out which talks are the best ones. Not an easy task when you can only pick about 30 talks from 240 great proposals! I really enjoyed reading them all and it is interesting to see all the different subjects and ideas people come up with. It is sad that we will have to disappoint most of the submitters &#8211; but having them all would result in a 16 day conference or something, which would not be very realistic either now would it? <img src='http://www.harrieverveer.nl/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.harrieverveer.nl/2011/01/21/organizing-the-dutch-php-conference/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TechPortal article on database version control</title>
		<link>http://www.harrieverveer.nl/2011/01/11/techportal-article-on-database-version-control/</link>
		<comments>http://www.harrieverveer.nl/2011/01/11/techportal-article-on-database-version-control/#comments</comments>
		<pubDate>Tue, 11 Jan 2011 09:07:17 +0000</pubDate>
		<dc:creator>harrie</dc:creator>
				<category><![CDATA[Publications]]></category>
		<category><![CDATA[article]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[techportal]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://www.harrieverveer.com/?p=152</guid>
		<description><![CDATA[<p><img src="/wp-content/uploads/2011/01/techportal_logo-300x104.jpg" alt="techPortal" title="techPortal" width="300" height="104" class="alignright size-medium wp-image-153" />Last year I spoke at different conferences throughout Europe about database version control. However, a while ago I <a href="/2010/11/01/burying-a-talk-a-year-of-database-version-control/">decided</a> that I did the talk often enough and that it&#8217;s time to move on. Therefor I wrote a big wrap-up article that summarizes everything I told (and learned) during these events. I&#8217;m proud to announce that this article was published&#160;[&#8230;]</p>]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/2011/01/techportal_logo-300x104.jpg" alt="techPortal" title="techPortal" width="300" height="104" class="alignright size-medium wp-image-153" />Last year I spoke at different conferences throughout Europe about database version control. However, a while ago I <a href="/2010/11/01/burying-a-talk-a-year-of-database-version-control/">decided</a> that I did the talk often enough and that it&#8217;s time to move on. Therefor I wrote a big wrap-up article that summarizes everything I told (and learned) during these events. I&#8217;m proud to announce that this article was published on ibuildings&#8217; techPortal site today!</p>
<p>You can find the article here:<br />
<a href="http://techportal.ibuildings.com/2011/01/11/database-version-control/" onclick="pageTracker._trackPageview('/outgoing/techportal.ibuildings.com/2011/01/11/database-version-control/?referer=');">http://techportal.ibuildings.com/2011/01/11/database-version-control/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.harrieverveer.nl/2011/01/11/techportal-article-on-database-version-control/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Why my analogue year calendar rocks</title>
		<link>http://www.harrieverveer.nl/2011/01/08/why-my-analogue-year-calendar-rocks/</link>
		<comments>http://www.harrieverveer.nl/2011/01/08/why-my-analogue-year-calendar-rocks/#comments</comments>
		<pubDate>Sat, 08 Jan 2011 19:25:16 +0000</pubDate>
		<dc:creator>harrie</dc:creator>
				<category><![CDATA[Life hacking]]></category>
		<category><![CDATA[calendar]]></category>
		<category><![CDATA[efficiency]]></category>
		<category><![CDATA[life hacking]]></category>

		<guid isPermaLink="false">http://www.harrieverveer.com/?p=140</guid>
		<description><![CDATA[<p>I think most of us don&#8217;t have analogue calenders these days. Neither did I: for both my personal and my work calendar I use <a href="http://www.google.com/calendar" onclick="pageTracker._trackPageview('/outgoing/www.google.com/calendar?referer=');">Google Calendar</a>. My phone shows appointments in these calendars (Anroid built-in functionality) and I can set reminders on my phone for appointments I don&#8217;t want to miss. Useful, because I have my phone always with&#160;[&#8230;]</p>]]></description>
			<content:encoded><![CDATA[<p>I think most of us don&#8217;t have analogue calenders these days. Neither did I: for both my personal and my work calendar I use <a href="http://www.google.com/calendar" onclick="pageTracker._trackPageview('/outgoing/www.google.com/calendar?referer=');">Google Calendar</a>. My phone shows appointments in these calendars (Anroid built-in functionality) and I can set reminders on my phone for appointments I don&#8217;t want to miss. Useful, because I have my phone always with me, so I never miss anything. The same goes for my laptop. On both devices I can toggle personal and business appointments on or off based on what I want to see, and most importantly: everything is in one place. An absolute must from a time-management perspective.</p>
<p><div id="attachment_145" class="wp-caption alignright" style="width: 209px"><a href="/wp-content/uploads/2011/01/yearcalendar.jpg"><img src="/wp-content/uploads/2011/01/yearcalendar-199x300.jpg" alt="" title="My year calendar" width="199" height="300" class="size-medium wp-image-145" /></a><p class="wp-caption-text">The 2011 year calendar hanging next to my desk</p></div>Therefor I was a bit skeptical when Jeroen van Sluijs, one of my colleagues, told me about his analogue calendar. He showed me, and it was a simple piece of paper with the entire year calendar printed out on it. How on earth can this be useful when I have all this fancy technology to do the job? Nevertheless, I decided to give his calendar a try. I printed the calendar on a piece of paper and put it next to my desk. I used a text marker to mark all official holidays, as well as &#8220;days off&#8221;. The basic rule here is: pink means day off &#8211; you get to sleep out. During the year I started adding other stuff. Conferences, due-dates for call for papers. Important dates I definitely didn&#8217;t want to miss or was looking forward to. I decided to mark those my drawing a circle around that date and writing a 1-word description next to it. </p>
<p>And imagine what? It works great!</p>
<p>The reason that this is useful to have in addition to your existing calendar is that whenever the scale of your calendar-view changes, the significance of appointments changes as well. It&#8217;s quite easy: when I&#8217;m looking at a day-view I want to know exactly at what time what&#8217;s going on. I need to go to get a haircut at 3pm. Great, I&#8217;ll be there. On month-view however the time isn&#8217;t important &#8211; just the fact that I&#8217;m getting a haircut on that date will suffice. On a year view, seeing all year&#8217;s appointments simply would result in one big unusable and unreadable list. It&#8217;s far too detailed!</p>
<p>That&#8217;s exactly what this calendar next to my desk does: it gives me a filtered view of the year, only showing the appointments that are important on a year&#8217;s-view. I don&#8217;t mark my tennis lessons there every Friday. Neither do I put down when I&#8217;m getting a haircut &#8211; I&#8217;ve got Google Calendar to do that. The year calendar is for stuff like days off, conferences, deadlines of projects etc. It&#8217;s hanging next to my desk, so whenever I want to know something like that, I simply have to turn my head and I see directly what&#8217;s going on.</p>
<p>Everybody is different, and especially for these kind of things it&#8217;s important to not just do as you&#8217;re told, but choose the solution that works best for you. However, the calendar has worked great for me so far &#8211; so maybe it will work for you as well. Also, figure out your own standard &#8211; use different colors with different meanings. Write stuff next to it. Draw arrows. Maybe use certain shapes for lining-in certain dates. Get creative! It&#8217;s analogue, the sky is the limit!</p>
<p>The calendar I use was generated by this pre-historic but still working CGI script: <a href="http://cgi.dit.nl/kalender.cgi" target="_blank" onclick="pageTracker._trackPageview('/outgoing/cgi.dit.nl/kalender.cgi?referer=');">http://cgi.dit.nl/kalender.cgi</a> (dutch). Be sure to mark &#8220;Enkel de kalender (printen)&#8221; at the bottom, and off course any other options you prefer. English versions available as well and easy to find. You can find an example here: <a href="http://www.freeprintablecalendar.net/2011/printcalendar.aspx" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.freeprintablecalendar.net/2011/printcalendar.aspx?referer=');">http://www.freeprintablecalendar.net/2011/printcalendar.aspx</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.harrieverveer.nl/2011/01/08/why-my-analogue-year-calendar-rocks/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Video: me doing my database version control talk at PHPNW10</title>
		<link>http://www.harrieverveer.nl/2010/12/05/video-me-doing-my-database-version-control-talk-at-phpnw10/</link>
		<comments>http://www.harrieverveer.nl/2010/12/05/video-me-doing-my-database-version-control-talk-at-phpnw10/#comments</comments>
		<pubDate>Sun, 05 Dec 2010 13:25:00 +0000</pubDate>
		<dc:creator>harrie</dc:creator>
				<category><![CDATA[Speaking]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[phpnw]]></category>
		<category><![CDATA[speaking]]></category>
		<category><![CDATA[version control]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.harrieverveer.com/?p=87</guid>
		<description><![CDATA[<img class="size-full wp-image-88 aligncenter" title="Video: Database Version Control without pain at PHPNW10" src="http://www.harrieverveer.com/wp-content/uploads/2010/12/phpnw-talk.png" alt="Video: Database Version Control without pain at PHPNW10" width="300" height="178" />

As mentioned before I've done my talk "database version control without pain" a couple of times last year. When I did my talk at PHPNW10 in Manchester the organisation made videos of the different speakers, and last week they published the video of me doing my talk on blip.tv.

I found it [...]<p class="read-more"><a href="http://www.harrieverveer.nl/2010/12/05/video-me-doing-my-database-version-control-talk-at-phpnw10/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>As <a href="/2010/11/01/burying-a-talk-a-year-of-database-version-control/">mentioned before</a> I&#8217;ve done my talk &#8220;database version control without pain&#8221; a couple of times last year. When I did my talk at <a title="PHPNW10" href="http://conference.phpnw.org.uk/phpnw10/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/conference.phpnw.org.uk/phpnw10/?referer=');">PHPNW10</a> in Manchester the organisation made videos of the different speakers, and last week they published the video of me doing my talk on blip.tv.</p>
<p>I found it quite shocking to see myself doing my talk. I&#8217;m sure we&#8217;ve all been there: you record your own voice (for example on you answering machine) and when you hear it back it sounds really awkward. It&#8217;s that feeling, but then with video&#8230; in a foreign language&#8230; 1 hour long. Anyway, I learned a lot from seeing this back, and I can definitely use the video to improve my future talks. For example: I now see I really need to be more aware of where I keep my hands when I&#8217;m speaking, and that my English still has this annoying dutch accent going on <img src='http://www.harrieverveer.nl/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Anyway, if you missed the talk or if you want to see it again, or if you simply want to see me speak in front of an audience (hi mom!) this is your chance!</p>
<p style="text-align: center;"><a href="http://blip.tv/file/4462439" target="_blank" onclick="pageTracker._trackPageview('/outgoing/blip.tv/file/4462439?referer=');"><img class="size-full wp-image-88 aligncenter" title="Video: Database Version Control without pain at PHPNW10" src="/wp-content/uploads/2010/12/phpnw-talk.png" alt="Video: Database Version Control without pain at PHPNW10" width="300" height="178" /></a><br /><a href="http://blip.tv/file/4462439" target="_blank" onclick="pageTracker._trackPageview('/outgoing/blip.tv/file/4462439?referer=');">View the video on blip.tv</a></p>
<p style="text-align: left;">The slides hard to read on the video because of the low picture quality. Therefor I&#8217;d recommend keeping the <a title="Database Version Control Without Pain slides" href="http://www.slideshare.net/harrieverveer/database-version-control-without-pain-the-phpnw10-version" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.slideshare.net/harrieverveer/database-version-control-without-pain-the-phpnw10-version?referer=');">associated slides</a> next to it and click along with me.</p>
<p style="text-align: left;">Many thanks to <a title="PHPNW" href="http://www.phpnw.org.uk/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.phpnw.org.uk/?referer=');">PHPNW</a>, <a title="Magma Digital" href="http://www.magmadigital.co.uk/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.magmadigital.co.uk/?referer=');">Magma Digital</a> and everybody else involved in organizing this great conference and making and publishing the videos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.harrieverveer.nl/2010/12/05/video-me-doing-my-database-version-control-talk-at-phpnw10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sharing slides is a gesture</title>
		<link>http://www.harrieverveer.nl/2010/11/17/sharing-slides-is-a-gesture/</link>
		<comments>http://www.harrieverveer.nl/2010/11/17/sharing-slides-is-a-gesture/#comments</comments>
		<pubDate>Wed, 17 Nov 2010 20:53:56 +0000</pubDate>
		<dc:creator>harrie</dc:creator>
				<category><![CDATA[Speaking]]></category>
		<category><![CDATA[etiquette]]></category>
		<category><![CDATA[php community]]></category>
		<category><![CDATA[slides]]></category>
		<category><![CDATA[speaking]]></category>

		<guid isPermaLink="false">http://www.harrieverveer.com/?p=74</guid>
		<description><![CDATA[<p>Whenever I do a talk, it always surprises me how many people ask about my slides. Some people couldn&#8217;t make it to the conference and ask for the slides instead, others want to have the slides as a reminder of the talk and some of them might even use the slides to do a slide karaoke back at the office.&#160;[&#8230;]</p>]]></description>
			<content:encoded><![CDATA[<p>Whenever I do a talk, it always surprises me how many people ask about my slides. Some people couldn&#8217;t make it to the conference and ask for the slides instead, others want to have the slides as a reminder of the talk and some of them might even use the slides to do a slide karaoke back at the office. Great purposes, and usually I&#8217;m more than happy to share them with the world. What surprised me even more however, is that some people seem to get upset whenever a speaker decides to not share his slides – or simply forgets about uploading them, or hasn&#8217;t come round to doing it just yet. “Whenever a speaker doesn&#8217;t upload his slides to slideshare, God kills a kitten”, seems to be the general thought. I disagree for a number of reasons.</p>
<p><strong>My talk is more than just my slides</strong></p>
<div id="attachment_77" class="wp-caption alignright" style="width: 310px"><img class="size-medium wp-image-77" title="Me, talking about pizza at the DPC" src="/wp-content/uploads/2010/11/31151_1492105468974_1424137164_1323073_5348071_n-300x199.jpg" alt="Me, talking about pizza at the DPC" width="300" height="199" /><p class="wp-caption-text">Photo by Jeroen van Sluijs</p></div>
<p><strong> </strong> First of all, talks are usually more than just the slides. For example: during the most important part of my last talk, my slides showed a picture of a slice of pizza for about 3 minutes. By browsing through someones slides you might get a general idea on what the talk is about, but you&#8217;re missing out on the details – and probably the most important message the speaker is trying to get across. It gets even better when the speaker uses more “Presentation Zen”-like techniques. <a title="Thijs Feryn's blog" href="http://blog.feryn.eu/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/blog.feryn.eu/?referer=');">Thijs Feryn</a>&#8216;s talk &#8220;PHP through the eyes of a hoster” is a fantastic talk, but if you would download his slides you would mainly just end up with a bunch of beautiful, but meaningless photographs (and some keywords).</p>
<p>That however is the way slides should look! They should confirm and strengthen what the speaker is telling, not tell the story themselves. Therefore sharing your slides then is not only pointless, but whenever somebody is going to see your slides it&#8217;s likely that the viewer will get a crooked view of what you were trying to tell in the first place.</p>
<p><strong>Sharing slides is a gesture</strong><br />
I share them however, and most speakers do. My main reason is that people can browse through the slides again afterwards, and remember what I told them. If I did a good job the pizza-slide will then remind the viewer of the used metaphor and what I was trying to tell when this slide was on the screen. Even people that didn&#8217;t see my talk might still get a clue about the contents by looking at the slides. They will probably miss the main clue, but at least they will see a couple of mentioned tools that are worth giving a try – and if that makes you happy that&#8217;s just great! In such a case I&#8217;m glad you at least found some benefit in the work I&#8217;ve done.</p>
<p>Sharing slides is a gesture though. Something extra the speaker does especially for you. Not sharing slides is not “evil”, it&#8217;s normal. There are plenty of reasons why a speaker wouldn&#8217;t upload his slides. Maybe he thinks the slides themselves shouldn&#8217;t be viewed because the viewer would miss out on so much background information and explanations that it makes the talk look plain and stupid. Maybe there&#8217;s a reason like copyright restrictions on used photographs, or maybe the speaker doesn&#8217;t want to share his slides because he wants to do the same talk somewhere else next month and he doesn&#8217;t like it when people in the audience are already reading his slides before he has even started the talk.</p>
<p>Either way, it&#8217;s the speaker&#8217;s choice and not something that should be taken for granted. Sharing slides is a little bit extra a speaker did for you, and worth saying “thank you” for. Speakers don&#8217;t owe you anything, they usually don&#8217;t get paid (worse: they often even have to pay for their own expenses just to be at the conference) and they&#8217;ve usually put many hours into preparing their talks. All just for you! So next time, be grateful for the efforts they&#8217;ve put into it and give them a beer, instead of bitching about speakers that for whatever reason chose not to share their intellectual property with the entire world.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.harrieverveer.nl/2010/11/17/sharing-slides-is-a-gesture/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Burying a talk: a year of database version control</title>
		<link>http://www.harrieverveer.nl/2010/11/01/burying-a-talk-a-year-of-database-version-control/</link>
		<comments>http://www.harrieverveer.nl/2010/11/01/burying-a-talk-a-year-of-database-version-control/#comments</comments>
		<pubDate>Mon, 01 Nov 2010 19:16:50 +0000</pubDate>
		<dc:creator>harrie</dc:creator>
				<category><![CDATA[Speaking]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[dpc]]></category>
		<category><![CDATA[pbc]]></category>
		<category><![CDATA[pfcongres]]></category>
		<category><![CDATA[phpnw]]></category>
		<category><![CDATA[speaking]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://www.harrieverveer.com/?p=55</guid>
		<description><![CDATA[<p align="center"><img class="alignnone size-medium wp-image-57" title="Speaker badges" src="http://www.harrieverveer.com/wp-content/uploads/2010/11/badges-300x225.png" alt="" width="300" height="225" /></p>
About a year ago the idea was born to do a talk on database version control. Main reason: I didn’t really have a clue about database version control myself. What’s the right approach? What tools are out there? Am I doing database version control the right way, or is there a better way? While figuring all this out I decided [...]<p class="read-more"><a href="http://www.harrieverveer.nl/2010/11/01/burying-a-talk-a-year-of-database-version-control/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>About a year ago the idea was born to do a talk on database version control. Main reason: I didn&#8217;t really have a clue about database version control myself. What&#8217;s the right approach? What tools are out there? Am I doing database version control the right way, or is there a better way? While figuring all this out I decided to document all my steps, and finally use the results in a talk so I could share them with the rest of the world. I submitted a talk called &#8220;Database version control without pain&#8221; to the dutch conference PFCongres, and it got accepted!</p>
<p><strong>Zwolle, Amsterdam, Manchester and Barcelona</strong></p>
<p><strong><a href="/wp-content/uploads/2010/11/badges.png"><img class="alignnone size-medium wp-image-57" title="Speaker badges" src="/wp-content/uploads/2010/11/badges-300x225.png" alt="" width="300" height="225" /></a></strong></p>
<p>Soon after that I got to repeat the same talk at other places in Europe. During these events I met some great people, had a lot of fun, saw cities I had never been before and I learned a lot as well. I tried to improve my talk based on the feedback I got, and sure enough most people <a title="joind.in" href="http://joind.in/user/view/582" target="_blank" onclick="pageTracker._trackPageview('/outgoing/joind.in/user/view/582?referer=');">seemed to like it</a>!</p>
<p>In total, I did the talk four times now:</p>
<ul>
<li><a title="PFCongres" href="http://pfcongres.nl/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/pfcongres.nl/?referer=');">PFCongres</a>, Zwolle (The Netherlands)</li>
<li><a title="Dutch PHP Conference" href="http://www.phpconference.nl/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.phpconference.nl/?referer=');">DPC</a>, Amsterdam (The Netherlands)</li>
<li><a title="PHPNW10" href="http://conference.phpnw.org.uk/phpnw10/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/conference.phpnw.org.uk/phpnw10/?referer=');">PHPNW10</a>, Manchester (UK)</li>
<li><a title="PHP Barcelona" href="http://phpconference.es/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/phpconference.es/?referer=');">PHP Barcelona</a>, Barcelona (Spain)</li>
</ul>
<p><strong>Enough!</strong></p>
<p>I think four is enough. I assume that the majority of the European PHP community has visited at least one of the events above, and had the chance to see the talk (and besides that I&#8217;m getting a bit tired of repeating the same story over and over again <img src='http://www.harrieverveer.nl/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> ). It&#8217;s time for something new! I don&#8217;t exactly know what it will be, but I have several ideas on new talks so hopefully I can make at least one of those ideas into a talk, and start submitting to the calls for papers at the different conferences really soon!</p>
<p><strong>Article on database version control</strong></p>
<p><strong> </strong>As a last hoorah I&#8217;m planning to write an article on database version control, which will probably be published either here or on <a title="ibuildings techportal" href="http://techportal.ibuildings.com/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/techportal.ibuildings.com/?referer=');">techportal</a>. Missed the talk? Looking to refresh your memory? Or downloaded the slides and you&#8217;re still wondering what the heck I was talking about during the slide with the picture of a sunken boat? No worries! Just keep an eye on this site and you&#8217;ll be able to read all about it soon.</p>
<p>But for now: Farewell database version control talk! You&#8217;ve been a great friend!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.harrieverveer.nl/2010/11/01/burying-a-talk-a-year-of-database-version-control/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>The PHP community: not just about tree hugging geeks</title>
		<link>http://www.harrieverveer.nl/2010/10/26/the-php-community-not-just-about-tree-hugging-geeks/</link>
		<comments>http://www.harrieverveer.nl/2010/10/26/the-php-community-not-just-about-tree-hugging-geeks/#comments</comments>
		<pubDate>Tue, 26 Oct 2010 08:30:11 +0000</pubDate>
		<dc:creator>harrie</dc:creator>
				<category><![CDATA[PHP community]]></category>
		<category><![CDATA[down to earth]]></category>
		<category><![CDATA[hippies]]></category>
		<category><![CDATA[php community]]></category>

		<guid isPermaLink="false">http://www.harrieverveer.com/?p=40</guid>
		<description><![CDATA[<div style="float: right"><a href="/2010/10/26/the-php-community-not-just-about-tree-hugging-geeks/"><img src="http://farm3.static.flickr.com/2346/2266078656_36b79d857c_m.jpg" alt="1960, era de los hippies &#34;Paz y amor&#34;" width="175" height="240" /></a></div>
The interesting people you meet at user group meetings, all the stuff you learn at conferences and the freely available open source projects that are out there. Those are just three of many things that make the PHP community into something awesome. However, every once in a while I hear some plea for the great PHP community that makes me a bit nauseous. “Sharing code, knowledge, elePHPants, it's all so fun to share and be part of this great club of lovely people! I share my project with you and you share your project with me. And then we hug! Weeeee!!!” [...]<p class="read-more"><a href="http://www.harrieverveer.nl/2010/10/26/the-php-community-not-just-about-tree-hugging-geeks/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>The interesting people you meet at user group meetings, all the stuff you learn at conferences and the freely available open source projects that are out there. Those are just three of many things that make the PHP community into something awesome. However, every once in a while I hear some  plea for the great PHP community that makes me a bit nauseous. “Sharing code, knowledge, elePHPants, it&#8217;s all so fun to share and be part of this great club of lovely people! I share my project with you and you share your project with me. And then we hug! Weeeee!!!”</p>
<div class="wp-caption alignright" style="width: 185px"><a title="1960, era de los hippies &quot;Paz y amor&quot; by Nelson Piedra (nopiedra), on Flickr" href="http://www.flickr.com/photos/nopiedra/2266078656/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.flickr.com/photos/nopiedra/2266078656/?referer=');"><img src="http://farm3.static.flickr.com/2346/2266078656_36b79d857c_m.jpg" alt="1960, era de los hippies &quot;Paz y amor&quot;" width="175" height="240" /></a><p class="wp-caption-text">Photo by Nelson Piedra</p></div>
<p>Well f*ck that. Of course, whenever you regularly meet a group of people you will make some new friends, especially when you share a common interest. You might enjoy drinking beers with them or do some coding on their projects, because you think it&#8217;s a great project and you want to help them out. However, you will also make friends when you go out to the pub. Hell, you will probably even make friends at the weekly meeting for people with ingrown toenails – which is great, sure! But saying ingrown toenails are a great thing because “you meet such great people” just seems a bit awkward to me.</p>
<p>Don&#8217;t get me wrong: I love the sharing, partying and beer drinking as well, and I wouldn&#8217;t want to miss it. The most interesting people you meet on conferences are the people you meet on the social events afterwards, but it&#8217;s all a consequence, not a cause.  Saying you are part of the community because of it, is like saying to your date that you went through the whole process of “having sex and all” because you like smoking the cigarette at the end so much.</p>
<p>So besides the hippy arguments, the PHP community also has some great, more down-to-earth things to offer for companies, developers and everybody else involved. Below I just listed a couple of arguments I could come up with by brainstorming for ten minutes. I&#8217;m pretty sure I might have missed one or two, but it should at least give you an idea.</p>
<p><strong>Contributing to open source projects</strong><br />
On first sight, contributing to open source projects might look like charity. You and your noble steed have come to save the day, and with all your goodness you fix a bug in the project. Hooray! But contributing has some other upsides as well. First of all, it gives you a bit more renown and might make your resume look more interesting. How great would it be if you could put “regular contributor to the Zend Framework project” on there?  By contributing you would probably learn a lot as well, just by looking into other people&#8217;s code and writing documentation or tests for it.</p>
<p>Or if you&#8217;re using an open source product but you need to fix or extend it for your own purpose, giving back the changes you made means you can now keep updating to newer versions of the product. Your changes will be in it, so you won&#8217;t be stuck with the same version for the rest of your life because you added some custom hacks and an update would overwrite those changes.</p>
<p><strong>Open sourcing your own projects</strong><br />
This one is rather simple; open sourcing your own project means that – if you do it right – people will start contributing to it. When your company has developed a somewhat useful tool, open sourcing it will probably mean that other people will start using the tool as well. Eventually, some people might come and fix some bugs in it, improve the tool and build some new features for it. Your tool gets enhanced, extended, better – for free!</p>
<p><strong>Conferences and user group meetings</strong></p>
<p>Events like conferences are a great place to learn and to get inspired, but can also be used for recruitment and networking. People might learn from the talks, or from talking to each other. Talks can also be inspirational and work as a trigger for somebody to start investigating a technique or a tool he didn&#8217;t think of before.</p>
<p>If you do it right, speaking at such events will give you and the company you&#8217;re representing some great renown. Tens, maybe hundreds of potential colleagues, clients and people who might hire you see that you, and the company you&#8217;re representing, really know what it&#8217;s all about. As a company it&#8217;s a great way to show that you take software development seriously, and that your office is a great place to work. The speaker gets a bit more fame, and can add another interesting line on his resume.</p>
<blockquote><p>I did a little research on this subject by starting a <a title="twtpoll" href="http://twtpoll.com/r/jg92lh" target="_blank" onclick="pageTracker._trackPageview('/outgoing/twtpoll.com/r/jg92lh?referer=');">poll </a>about a week ago. The results were somewhat surprising, and they are probably hopelessly unreliable because of the group that answered the poll <img src='http://www.harrieverveer.nl/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Still, it gives you a bit of an idea:</p>
<p>67% goes there to talk to interesting people</p>
<p>58% goes there for the talks (which I had expected to be more, since that&#8217;s the main thing conferences have to offer &#8211; the stuff they&#8217;re selling)</p>
<p>53% goes there for the hugging and beer drinking</p>
<p>25% goes there to speak (you might see now what I meant by hopelessly unreliable <img src='http://www.harrieverveer.nl/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> )</p>
<p>24% goes there to promote themselves</p>
<p>16% goes there to promote their company, brand or product</p>
<p>8% goes there to recruit new developers</p>
<p>19% selected &#8220;other&#8221;. Answers included &#8220;I go there to convert all over to ruby&#8221; and one voter goes to PHP conferences to &#8220;be away from the missus&#8221;</p></blockquote>
<p><strong>The community online</strong><br />
Whether it&#8217;s on IRC or on some forum, there are some great resources out there for getting and sharing information, pretty much for the same reasons as the speaking and attending talks part: the person answering a question get a bit more renown, the person asking the question has his problem solved and can continue. Also, answering questions often forces you to do a little research yourself, how did this work again exactly? Somebody else might give an alternative answer to the question that would work just as well, but you hadn&#8217;t thought about that solution yet. You can really learn a lot from answering other people&#8217;s questions!</p>
<p><strong>The hippy thing</strong><br />
And then of course, there&#8217;s the hippy thing. A great network of people that help each other out, give each other advice, do an open source project together and then drink some beer. This post is to show that it&#8217;s not the only thing that matters – but of course it is an important reason why it&#8217;s a lot of fun to be a part of the PHP community.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.harrieverveer.nl/2010/10/26/the-php-community-not-just-about-tree-hugging-geeks/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>NetBeans&#8217; PHPUnit integration</title>
		<link>http://www.harrieverveer.nl/2010/10/18/netbeans-phpunit-integration/</link>
		<comments>http://www.harrieverveer.nl/2010/10/18/netbeans-phpunit-integration/#comments</comments>
		<pubDate>Mon, 18 Oct 2010 08:22:31 +0000</pubDate>
		<dc:creator>harrie</dc:creator>
				<category><![CDATA[Software development]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://www.harrieverveer.com/?p=16</guid>
		<description><![CDATA[<p>Although I&#8217;ve been using <a title="NetBeans.org" href="http://netbeans.org/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/netbeans.org/?referer=');">NetBeans</a> as an IDE for a couple of months now, I&#8217;ve just recently found out about the nifty <a title="PHPUnit.de" href="http://www.phpunit.de" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.phpunit.de?referer=');">PHPUnit</a> integration that comes with it. Once you&#8217;ve told NetBeans where your tests are, where PHPUnit is and how PHPUnit should be called to run your tests, you can run the unittests&#160;[&#8230;]</p>]]></description>
			<content:encoded><![CDATA[<p>Although I&#8217;ve been using <a title="NetBeans.org" href="http://netbeans.org/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/netbeans.org/?referer=');">NetBeans</a> as an IDE for a couple of months now, I&#8217;ve just recently found out about the nifty <a title="PHPUnit.de" href="http://www.phpunit.de" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.phpunit.de?referer=');">PHPUnit</a> integration that comes with it. Once you&#8217;ve told NetBeans where your tests are, where PHPUnit is and how PHPUnit should be called to run your tests, you can run the unittests and see the test results in the IDE!</p>
<p><strong>Step 1: tell NetBeans where your tests are</strong></p>
<p>Open the project preferences and enter the directory containing your unittests in the field &#8216;Test folder&#8217;.</p>
<p><a href="/wp-content/uploads/2010/10/Screen-shot-2010-10-17-at-17-okt-2010-week-41-15.57.22-.png"><img class="alignnone size-medium wp-image-18" title="NetBeans project properties dialog" src="/wp-content/uploads/2010/10/Screen-shot-2010-10-17-at-17-okt-2010-week-41-15.57.22--300x223.png" alt="NetBeans project properties dialog" width="300" height="223" /></a></p>
<p>If you did this right, you will notice that NetBeans doesn&#8217;t show this folder anymore in the projects tree, but instead it shows a separate tree: underneath the tree &#8220;Source files&#8221; there&#8217;s now also a tree called &#8220;Test files&#8221;:</p>
<p><a href="/wp-content/uploads/2010/10/Screen-shot-2010-10-17-at-17-okt-2010-week-41-16.02.15-.png"><img class="alignnone size-full wp-image-19" title="Project tree" src="/wp-content/uploads/2010/10/Screen-shot-2010-10-17-at-17-okt-2010-week-41-16.02.15-.png" alt="" width="273" height="238" /></a></p>
<p><strong>Step 2: tell NetBeans where PHPUnit is</strong></p>
<p>Go to Netbeans&#8217; general preferences, open the tab &#8216;PHP, and then the tab &#8216;Unit Testing&#8217;. Here, enter the path to PHPUnit:</p>
<p><a href="h/wp-content/uploads/2010/10/Screen-shot-2010-10-17-at-17-okt-2010-week-41-16.05.31-.png"><img class="alignnone size-medium wp-image-20" title="Unit Testing dialog" src="/wp-content/uploads/2010/10/Screen-shot-2010-10-17-at-17-okt-2010-week-41-16.05.31--300x258.png" alt="Netbeans Unit Testing dialog" width="300" height="258" /></a></p>
<p><strong>Step 3: tell NetBeans how to run the tests</strong></p>
<p>Finally, we need to tell NetBeans how to run our tests. This can be done by pointing it to the phpunit.xml, in the Project Properties dialog (PHPUnit menu):</p>
<p><a href="/wp-content/uploads/2010/10/Screen-shot-2010-10-17-at-17-okt-2010-week-41-16.10.40-.png"><img class="alignnone size-medium wp-image-21" title="Netbeans project properties dialog (phpunit)" src="/wp-content/uploads/2010/10/Screen-shot-2010-10-17-at-17-okt-2010-week-41-16.10.40--300x215.png" alt="Netbeans project properties dialog (phpunit)" width="300" height="215" /></a></p>
<p>That&#8217;s it! You can now run your unittests using NetBeans!</p>
<p><strong>Running unittests</strong><a href="/wp-content/uploads/2010/10/Screen-shot-2010-10-17-at-17-okt-2010-week-41-16.18.54-.png"><img class="alignright size-medium wp-image-23" title="Screen shot 2010-10-17 at 17 okt 2010   week 41  16.18.54" src="/wp-content/uploads/2010/10/Screen-shot-2010-10-17-at-17-okt-2010-week-41-16.18.54--300x84.png" alt="" width="300" height="84" /></a></p>
<p>In the &#8216;run&#8217; menu a new option has appeared. Just underneath &#8216;Run Project&#8217; option there&#8217;s a new option, &#8216;Test Project&#8217;. When you select this option NetBeans will run your unit tests and show the results:</p>
<p><a href="/wp-content/uploads/2010/10/Screen-shot-2010-10-17-at-17-okt-2010-week-41-16.20.58-.png"><img class="alignnone size-medium wp-image-25" title="NetBeans unittests result output" src="/wp-content/uploads/2010/10/Screen-shot-2010-10-17-at-17-okt-2010-week-41-16.20.58--300x127.png" alt="" width="300" height="127" /></a></p>
<p>As you can see something went wrong. It will not surprise you that clicking on the failed test will open the right unittest in your editor, showing you the line that failed so you can start figuring out what went wrong. The Test Results tab is sometimes a bit cryptic as to what went wrong, so it might help to open the Output dialog as well (menu Window -&gt; Output -&gt; Output), as the raw output of phpunit is captured here.</p>
<p><strong>Code coverage</strong></p>
<p>NetBeans can also capture the code coverage while you&#8217;re testing. To do this you first need to enable this by right-clicking the project and then selecting &#8220;Code Coverage&#8221; -&gt; &#8220;Collect and Display Code Coverage&#8221;. Please note that you have to got the xdebug extension installed before you can do this, otherwise PHPUnit won&#8217;t run.</p>
<p><a href="/wp-content/uploads/2010/10/Screen-shot-2010-10-17-at-17-okt-2010-week-41-16.26.12-.png"><img class="alignnone size-medium wp-image-26" title="NetBeans: collect and display code coverage" src="/wp-content/uploads/2010/10/Screen-shot-2010-10-17-at-17-okt-2010-week-41-16.26.12--300x143.png" alt="NetBeans: collect and display code coverage" width="300" height="143" /></a></p>
<p>Once enabled you can run phpunit again just as you did earlier, but when it&#8217;s done running it will show in your source files which code was tested and which code was not, by marking it either green or red:</p>
<p><a href="/wp-content/uploads/2010/10/Screen-shot-2010-10-17-at-17-okt-2010-week-41-16.31.26-.png"><img class="alignnone size-medium wp-image-27" title="Code coverage in netbeans" src="/wp-content/uploads/2010/10/Screen-shot-2010-10-17-at-17-okt-2010-week-41-16.31.26--300x205.png" alt="" width="300" height="205" /></a></p>
<p><strong>Upsides</strong></p>
<p>There are probably a lot more things you can do with the NetBeans &#8211; PHPUnit integration. I haven&#8217;t got time yet to investigate everything that&#8217;s possible, but I think that this already is quite nifty. Opening my iTerm and typing &#8216;phpunit&#8217; usually isn&#8217;t that much of a hassle, but generating, opening and browsing the code coverage HTML can sometimes be quite time consuming. Now, I can just press ^ F6 and the tests are run and the tested/untested lines are marked green and red in my editor. Great!</p>
<p><strong>Downsides</strong></p>
<p>There are downsides. First of all, you need to be able to run PHPUnit from the OS your IDE is on &#8211; so probably that means that you need to be running your webserver locally. Personally I like to run my webserver on a vmware image that represents the production environment, and I share the folder where my project is in using a hgfs mount. This means I couldn&#8217;t use PHPUnit that I installed on my vmware image, but I had to install it again on Mac OSX. This not only means extra work, but it also means the environment I&#8217;m running my tests on it not longer representative to the production environment.</p>
<p>Before updating your production environment, I think it&#8217;s a good idea to first run your tests once more on a more representative environment. Nevertheless the NetBeans &#8211; PHPUnit integration saves me quite some time when writing tests, because basically everything is happening in the same screen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.harrieverveer.nl/2010/10/18/netbeans-phpunit-integration/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

