<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Mikkel Høgh blogs</title>
  <subtitle>Coding the web since 1999</subtitle>
  <link rel="alternate" type="text/html" href="http://mikkel.hoegh.org/blog"/>
  <link rel="self" type="application/atom+xml" href="http://mikkel.hoegh.org/blog/atom/feed"/>
  <id>http://mikkel.hoegh.org/blog/atom/feed</id>
  <updated>2008-10-11T19:36:26+02:00</updated>
  <entry>
    <title>Preparing for Drupal 7 by changing the way to make parameters for db_query.</title>
    <link rel="alternate" type="text/html" href="http://mikkel.hoegh.org/blog/2008/preparing_for_drupal_7_by_changing_the_way_to_make_parameters_for_db_query" />
    <id>http://mikkel.hoegh.org/blog/2008/preparing_for_drupal_7_by_changing_the_way_to_make_parameters_for_db_query</id>
    <published>2008-11-16T19:49:01+01:00</published>
    <updated>2008-11-16T19:55:27+01:00</updated>
    <author>
      <name>mikkel</name>
    </author>
    <category term="Drupal" />
    <category term="Drupal 6" />
    <category term="Drupal 7" />
    <category term="hacks" />
    <category term="PlanetDrupal" />
    <category term="SQL" />
    <category term="tips" />
    <category term="tricks" />
    <summary type="html"><![CDATA[<p>After attending DrupalCon in Szeged and following the new database stuff, I thought a bit about how to make the transition easier when Drupal 7&nbsp;comes&nbsp;out.</p>

<p>I didn&#8217;t think that it was anything special, but <a href="http://robshouse.net/">Robert Douglass</a> encouraged me to share it, so here&nbsp;you&nbsp;are:</p>

<p>I figured out that you can actually use the Drupal 7-style of arguments to <span class="geshifilter"><code class="geshifilter-text">db_query</code></span> right now (more&nbsp;or&nbsp;less).</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>After attending DrupalCon in Szeged and following the new database stuff, I thought a bit about how to make the transition easier when Drupal 7 comes&nbsp;out.</p>

<p>I didn&#8217;t think that it was anything special, but <a href="http://robshouse.net/">Robert Douglass</a> encouraged me to share it, so here you&nbsp;are:</p>

<p>I figured out that you can actually use the Drupal 7-style of arguments to <code>db_query</code> right now (more or&nbsp;less).</p>

<p>The thing is that <code>db_query</code> in Drupal 6 allows you to use <em>either</em> the classic way with an arbitrary number of extra arguments to the <code>db_query</code> function <em>or</em> arguments as an array which is the future&nbsp;style.</p>

<p>The deal is that Drupal 6 takes the arguments in order, where Drupal 7 will use array keys (so I&#8217;d have <code>:title</code> in my query instead of <code>%s</code>).</p>

<p>So you can use the same arguments in Drupal 6 and Drupal 7, because Drupal 6 doesn&#8217;t care about which keys you have in your arguments&nbsp;array.</p>

<p>So whithout further ado, an example query from my <a href="http://github.com/mikl/drupal-tsearch/tree/master">TSearch module</a> (the implementation of PostgreSQL&#8217;s TSearch in&nbsp;Drupal):</p>

<div class="geshifilter"><pre class="geshifilter-drupal6"><a href="http://api.drupal.org/api/function/db_query/6"><span class="kw5">db_query</span></a><span class="br0">&#40;</span><span class="st0">&quot;<span class="caps">UPDATE</span> {tsearch_node} <span class="caps">SET</span> vid = %d,
          node_tsvector =
            setweight(to_tsvector('%s'), 'A') ||
            setweight(to_tsvector('%s'), 'B') ||
            setweight(to_tsvector('%s'), 'C') ||
            setweight(to_tsvector('%s'), 'D'),
          updated = %d
          <span class="caps">WHERE</span> nid = %d&quot;</span>,
         <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">':vid'</span> =<span class="sy0">&gt;</span> <span class="re0">$node</span>-<span class="sy0">&gt;</span><span class="me1">vid</span>,
               <span class="st0">':title'</span> =<span class="sy0">&gt;</span> <span class="re0">$text</span><span class="br0">&#91;</span><span class="st0">'title'</span><span class="br0">&#93;</span>,
               <span class="st0">':extra'</span> =<span class="sy0">&gt;</span> <span class="re0">$text</span><span class="br0">&#91;</span><span class="st0">'extra'</span><span class="br0">&#93;</span>,
               <span class="st0">':teaser'</span> =<span class="sy0">&gt;</span> <span class="re0">$text</span><span class="br0">&#91;</span><span class="st0">'teaser'</span><span class="br0">&#93;</span>,
               <span class="st0">':body'</span> =<span class="sy0">&gt;</span> <span class="re0">$text</span><span class="br0">&#91;</span><span class="st0">'body'</span><span class="br0">&#93;</span>,
               <span class="st0">':time'</span> =<span class="sy0">&gt;</span> <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">'REQUEST_TIME'</span><span class="br0">&#93;</span>,
               <span class="st0">':nid'</span> =<span class="sy0">&gt;</span> <span class="re0">$nid</span>,
        <span class="br0">&#41;</span><span class="br0">&#41;</span>;</pre></div>

<p>Isn&#8217;t that neat? I&#8217;ve become quite fond of this syntax, because I think it&#8217;s easier to see what&#8217;s going on, and it&#8217;ll be even better in Drupal 7, where I don&#8217;t have to care about the ordering any&nbsp;longer.</p>
    ]]></content>
  </entry>
  <entry>
    <title>DrupalCamp 2008 slides and code</title>
    <link rel="alternate" type="text/html" href="http://mikkel.hoegh.org/blog/2008/drupalcamp_2008_slides_and_code" />
    <id>http://mikkel.hoegh.org/blog/2008/drupalcamp_2008_slides_and_code</id>
    <published>2008-11-16T18:34:04+01:00</published>
    <updated>2008-11-16T19:08:50+01:00</updated>
    <author>
      <name>mikkel</name>
    </author>
    <category term="Drupal" />
    <category term="Drupal 6" />
    <category term="DrupalCamp" />
    <category term="PlanetDrupal" />
    <category term="slides" />
    <summary type="html"><![CDATA[<p>Just a public service announcement – here are my slides and the small twitter-like module I created for my &#8220;Drupal&nbsp;modules&nbsp;101&#8221;-session.</p>

<p>In addition to that, you can go check out the <a href="http://github.com/mikl/drupal-tsearch/tree/master">code for my PostgreSQL TSearch module</a> and <a href="http://cvs.drupal.org/viewvc.py/drupal/contributions/docs/developer/examples/scaffolding_example/">the excellent scaffolding_example module</a>.</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>Just a public service announcement – here are my slides and the small twitter-like module I created for my &#8220;Drupal modules&nbsp;101&#8221;-session.</p>

<p>In addition to that, you can go check out the <a href="http://github.com/mikl/drupal-tsearch/tree/master">code for my PostgreSQL TSearch module</a> and <a href="http://cvs.drupal.org/viewvc.py/drupal/contributions/docs/developer/examples/scaffolding_example/">the excellent scaffolding_example module</a>.</p>
    ]]></content>
  </entry>
  <entry>
    <title>Book Meme</title>
    <link rel="alternate" type="text/html" href="http://mikkel.hoegh.org/blog/2008/book_meme" />
    <id>http://mikkel.hoegh.org/blog/2008/book_meme</id>
    <published>2008-11-13T10:25:14+01:00</published>
    <updated>2008-11-13T10:30:28+01:00</updated>
    <author>
      <name>mikkel</name>
    </author>
    <category term="books" />
    <category term="django" />
    <category term="JavaScript" />
    <category term="PlanetDrupal" />
    <summary type="html"><![CDATA[<p><span class="dquo">&#8220;</span>Variables in JavaScript are fundamentally the same as object properties&#8221;
From &#8220;JavaScript – The Definitive Guide,&nbsp;5th&nbsp;edition&#8221;</p>

<p>A meme from <a href="http://jtauber.com/blog/2008/11/12/book_meme/">James Tauber</a>, <a href="http://www.20seven.org/journal/2008/11/book-meme.html">Greg Newman</a>, <a href="http://justinlilly.com/blog/2008/nov/12/book-memery/">Justin Lilly</a>, <a href="http://oebfare.com/blog/2008/nov/12/book-memery/">Brian Rosner</a> and <a href="http://www.eflorenzano.com/blog/post/book-meme/">Eric Florenzano</a>.</p>

<p>Instructions</p>

<ul>
<li>Grab the&nbsp;nearest&nbsp;book.</li>
<li>Open it to&nbsp;page&nbsp;56.</li>
<li>Find the&nbsp;fifth&nbsp;sentence.</li>
<li>Po</li>
</ul>
    ]]></summary>
    <content type="html"><![CDATA[<p><span class="dquo">&#8220;</span>Variables in JavaScript are fundamentally the same as object properties&#8221;<br />
From &#8220;JavaScript – The Definitive Guide, 5th&nbsp;edition&#8221;</p>

<p>A meme from <a href="http://jtauber.com/blog/2008/11/12/book_meme/">James Tauber</a>, <a href="http://www.20seven.org/journal/2008/11/book-meme.html">Greg Newman</a>, <a href="http://justinlilly.com/blog/2008/nov/12/book-memery/">Justin Lilly</a>, <a href="http://oebfare.com/blog/2008/nov/12/book-memery/">Brian Rosner</a> and <a href="http://www.eflorenzano.com/blog/post/book-meme/">Eric Florenzano</a>.</p>

<h4>Instructions</h4>

<ul>
<li>Grab the nearest&nbsp;book.</li>
<li>Open it to page&nbsp;56.</li>
<li>Find the fifth&nbsp;sentence.</li>
<li>Post the text of the sentence in your journal along with these&nbsp;instructions.</li>
<li>Don&#8217;t dig for your favorite book, the cool book, or the intellectual one: pick the&nbsp;<span class="caps">CLOSEST</span>.</li>
<li>No cheating&nbsp;:)</li>
</ul>
    ]]></content>
  </entry>
  <entry>
    <title>Drupal and Varnish HTTP accellerator</title>
    <link rel="alternate" type="text/html" href="http://mikkel.hoegh.org/blog/2008/drupal_and_varnish_http_accellerator" />
    <id>http://mikkel.hoegh.org/blog/2008/drupal_and_varnish_http_accellerator</id>
    <published>2008-10-17T15:03:12+02:00</published>
    <updated>2008-11-01T15:02:27+01:00</updated>
    <author>
      <name>mikkel</name>
    </author>
    <category term="Drupal" />
    <category term="performance" />
    <category term="PlanetDrupal" />
    <category term="servers" />
    <category term="sysadmin" />
    <category term="Varnish" />
    <summary type="html"><![CDATA[<p>For many reasons, it&#8217;s a good idea to have a <span class="caps">HTTP</span> accelerator/reverse proxy on your webserver to take some of the burdens of <span class="caps">HTTP</span> and cache away from Apache and <span class="caps">PHP</span>. <a href="http://www.squid-cache.org/">Squid</a> is most commonly used for this purpose, but after hearing about fellow Dane <a href="http://people.freebsd.org/~phk/">Poul-Henning Kamp</a>&#8217;s creation, <a href="http://varnish.projects.linpro.no/">Varnish</a>, I decided to try that out before messing with that many-armed&nbsp;monster,&nbsp;Squid.</p>

<p>And I was very&nbsp;pleasantly&nbsp;surprised.</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>For many reasons, it&#8217;s a good idea to have a <span class="caps">HTTP</span> accelerator/reverse proxy on your webserver to take some of the burdens of <span class="caps">HTTP</span> and cache away from Apache and <span class="caps">PHP</span>. <a href="http://www.squid-cache.org/">Squid</a> is most commonly used for this purpose, but after hearing about fellow Dane <a href="http://people.freebsd.org/~phk/">Poul-Henning Kamp</a>&#8217;s creation, <a href="http://varnish.projects.linpro.no/">Varnish</a>, I decided to try that out before messing with that many-armed monster,&nbsp;Squid.</p>

<p>And I was very pleasantly surprised. It took me all of 20 minutes to get working, and the greater part of that was changing all my VHost files to use a different port number, as Varnish is now taking port&nbsp;80.</p>

<p>If you&#8217;re reading this, it was served through Varnish. Drupal appears to have no issues at all with being accessed through Varnish. All my sites work as they ought&nbsp;to.</p>

<p>All I did&nbsp;was:</p>

<ol>
<li><a href="http://sourceforge.net/project/showfiles.php?group_id=155816&amp;package_id=173643">Grab the latest release</a> .debs for Ubuntu Hardy&nbsp;64-bit </li>
<li>Install them on my&nbsp;webserver</li>
<li>Uncomment the <code>backend default</code> setting in <code>/etc/varnish/default.vcl</code> </li>
<li>Change the port numbers in <code>/etc/default/varnish</code></li>
<li>Change the port numbers in <code>/etc/apache/ports.conf</code></li>
<li>Restart Apache and&nbsp;Varnish</li>
<li>Profit!</li>
</ol>

<p>I did do some tests before number 6 to make sure that everything was working, but I didn&#8217;t have to change anything. Varnished worked as it should out of the box, and with very little labour, my webserver is now much better prepared if I should ever get&nbsp;Digg&#8217;d.</p>

<p>This is of course part of a <em>defense in depth</em>, so I still have <span class="caps">APC</span> cache running as well, and some other tricks up my sleeve, should everything go&nbsp;crazy.</p>

<p>But I&#8217;d just like to take the opportunity to say thank you, phk and the rest of the Varnish team, for making my life&nbsp;easier.</p>
    ]]></content>
  </entry>
  <entry>
    <title>Drupal database performance: MySQL and PostgreSQL compared.</title>
    <link rel="alternate" type="text/html" href="http://mikkel.hoegh.org/blog/2008/drupal_database_performance_mysql_and_postgresql_compared" />
    <id>http://mikkel.hoegh.org/blog/2008/drupal_database_performance_mysql_and_postgresql_compared</id>
    <published>2008-10-13T03:13:00+02:00</published>
    <updated>2008-10-14T22:00:19+02:00</updated>
    <author>
      <name>mikkel</name>
    </author>
    <category term="database" />
    <category term="Drupal" />
    <category term="MySQL" />
    <category term="performance" />
    <category term="PlanetDrupal" />
    <category term="PostgreSQL" />
    <category term="siege" />
    <category term="sysadmin" />
    <category term="test" />
    <summary type="html"><![CDATA[<p>As a long time open source user and a chronic challenger of own assumptions, I often test out the alternatives to my current prefrences. While I used Linux, I tended to switch desktop environments every two months or so. I tried out all the e-mail clients, all the browsers, all the VCSes, and even (almost) all the text editors. Before settling with Drupal, I tried out all the CMSes I&nbsp;could&nbsp;find.</p>

<p>I have long felt compelled by PostgreSQL, although it is in many ways a bastard in the&nbsp;Drupal&nbsp;community.</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>As a long time open source user and a chronic challenger of own assumptions, I often test out the alternatives to my current prefrences. While I used Linux, I tended to switch desktop environments every two months or so. I tried out all the e-mail clients, all the browsers, all the VCSes, and even (almost) all the text editors. Before settling with Drupal, I tried out all the CMSes I could&nbsp;find.</p>

<p>I have long felt compelled by PostgreSQL, although it is in many ways a bastard in the Drupal community. Through officially supported, it is used by a very little minority of Drupal users, and it has proven exceedingly difficult to find someone to maintain Drupal&#8217;s compatibility with&nbsp;PostgreSQL.</p>

<p>Still, I&#8217;ve tried it out. When I first started using it, I marvelled at how fast everything felt, but such impressions can be (and often are)&nbsp;misleading.</p>

<p>So, I&#8217;ve put it to the test with a customer site. I&#8217;ve created to sites as identical as I can make them, one on MySQL 5.0.51a with InnoDB and one on PostgreSQL&nbsp;8.3.3.</p>

<p>This was the test: 5 concurrent logged in users hammering the front page. I know this could be much more scientific, but here&#8217;s the&nbsp;configuration:</p>

<pre><code>siege -H "Cookie: drupalsessid" -c 5 "http://drupal-site.local/" -b -t30s
</code></pre>

<p>I ran it thrice for each database server. This is all running on the same webserver - in fact, the same server that&#8217;s powering this blog. <span class="caps">APC</span> was enabled in all these tests. Here are the&nbsp;numbers:</p>

<h4>MySQL</h4>

<p>Transactions:                325 hits
Availability:             100.00 %
Elapsed time:              29.94 secs
Data transferred:           6.19 <span class="caps">MB</span>
Response time:              0.46 secs
Transaction rate:          10.86 trans/sec
Throughput:             0.21 <span class="caps">MB</span>/sec
Concurrency:                4.97
Successful transactions:         325
Failed transactions:               0
Longest transaction:            5.81
Shortest transaction:&nbsp;0.23</p>

<p>Transactions:                245 hits
Availability:             100.00 %
Elapsed time:              30.46 secs
Data transferred:           4.67 <span class="caps">MB</span>
Response time:              0.61 secs
Transaction rate:           8.04 trans/sec
Throughput:             0.15 <span class="caps">MB</span>/sec
Concurrency:                4.93
Successful transactions:         245
Failed transactions:               0
Longest transaction:            1.27
Shortest transaction:&nbsp;0.27</p>

<p>Transactions:                273 hits
Availability:             100.00 %
Elapsed time:              30.03 secs
Data transferred:           5.20 <span class="caps">MB</span>
Response time:              0.54 secs
Transaction rate:           9.09 trans/sec
Throughput:             0.17 <span class="caps">MB</span>/sec
Concurrency:                4.95
Successful transactions:         273
Failed transactions:               0
Longest transaction:            1.34
Shortest transaction:&nbsp;0.25</p>

<h4>PostgreSQL</h4>

<p>Transactions:                171 hits
Availability:             100.00 %
Elapsed time:              29.51 secs
Data transferred:           3.62 <span class="caps">MB</span>
Response time:              0.85 secs
Transaction rate:           5.79 trans/sec
Throughput:             0.12 <span class="caps">MB</span>/sec
Concurrency:                4.92
Successful transactions:         171
Failed transactions:               0
Longest transaction:            2.19
Shortest transaction:&nbsp;0.44</p>

<p>Transactions:                178 hits
Availability:             100.00 %
Elapsed time:              30.33 secs
Data transferred:           3.77 <span class="caps">MB</span>
Response time:              0.84 secs
Transaction rate:           5.87 trans/sec
Throughput:             0.12 <span class="caps">MB</span>/sec
Concurrency:                4.95
Successful transactions:         178
Failed transactions:               0
Longest transaction:            2.18
Shortest transaction:&nbsp;0.44</p>

<p>Transactions:                163 hits
Availability:             100.00 %
Elapsed time:              30.06 secs
Data transferred:           3.45 <span class="caps">MB</span>
Response time:              0.90 secs
Transaction rate:           5.42 trans/sec
Throughput:             0.11 <span class="caps">MB</span>/sec
Concurrency:                4.88
Successful transactions:         163
Failed transactions:               0
Longest transaction:            1.56
Shortest transaction:&nbsp;0.46</p>

<hr />

<h4>Conclusion</h4>

<p>I played a bit with these numbers, even throwing together a snazzy little&nbsp;spreadsheet.</p>

<p><img src="http://img.skitch.com/20081013-qwqa84xy1dgwd68u5sasmb5ff2.png" alt="Comparison spreadsheet" /></p>

<p>And however much I play with these numbers, there&#8217;s nothing to hide the fact that MySQL outperforms PostgreSQL by a wide margin, even though MySQL in this case is configured to use InnoDB, although that is rumoured to be slower than&nbsp;MyISAM.</p>

<p>So, yes, MySQL is the faster database to run Drupal on (for this particular load, at any&nbsp;rate).</p>

<p>What is the cause of this? Is PostgreSQL just inherently slower than MySQL, or is it the that Drupal fails to take advantage of Postgres. I know that we in many cases could conserve resources in the database by using a more specific column type, but I have no clear idea how much that would gain&nbsp;us.</p>

<p>It might also be because my PostgreSQL is improperly configured. It it more less as it came out of the Ubuntu Server box, whereas MySQL is set up to my own liking, though not with a whole lot of performance&nbsp;tweaks.</p>

<p>I will probably continue to use and play with PostgreSQL, but until proven otherwise, I&#8217;m going to assume that MySQL is the best performing database for my Drupal sites. I&#8217;m looking forward to see how these numbers would come out with Drupal&nbsp;7.</p>

<h4>Update</h4>

<p>Thanks to the nice guys on <a href="http://archives.postgresql.org/pgsql-general/">pgsql-general</a>, I found both that Drupal can&#8217;t figure out how to use sockets with PostgreSQL and that Ubuntu enables <span class="caps">SSL</span> on all PostgreSQL <span class="caps">HTTP</span>-connections <em>including localhost</em> out-of-the-box. That obviously skews the benchmark to the point where it becomes completely&nbsp;unreliable.</p>

<p>I have now changed PostgreSQL not to use <span class="caps">SSL</span> for localhost, and it changes the picture quite a bit – these are&nbsp;the&#8230;</p>

<h4>new numbers for&nbsp;PostgreSQL</h4>

<p>Transactions:                283 hits
Availability:             100.00 %
Elapsed time:              29.63 secs
Data transferred:           6.08 <span class="caps">MB</span>
Response time:              0.52 secs
Transaction rate:           9.55 trans/sec
Throughput:             0.21 <span class="caps">MB</span>/sec
Concurrency:                4.93
Successful transactions:         283
Failed transactions:               0
Longest transaction:            1.31
Shortest transaction:&nbsp;0.32</p>

<p>Transactions:                291 hits
Availability:             100.00 %
Elapsed time:              30.19 secs
Data transferred:           6.25 <span class="caps">MB</span>
Response time:              0.51 secs
Transaction rate:           9.64 trans/sec
Throughput:             0.21 <span class="caps">MB</span>/sec
Concurrency:                4.96
Successful transactions:         291
Failed transactions:               0
Longest transaction:            1.29
Shortest transaction:&nbsp;0.31</p>

<p>Transactions:                288 hits
Availability:             100.00 %
Elapsed time:              30.51 secs
Data transferred:           6.18 <span class="caps">MB</span>
Response time:              0.52 secs
Transaction rate:           9.44 trans/sec
Throughput:             0.20 <span class="caps">MB</span>/sec
Concurrency:                4.93
Successful transactions:         288
Failed transactions:               0
Longest transaction:            1.19
Shortest transaction:&nbsp;0.32</p>

<h4>And for&nbsp;MySQL</h4>

<p>Transactions:                429 hits
Availability:             100.00 %
Elapsed time:              30.16 secs
Data transferred:           8.18 <span class="caps">MB</span>
Response time:              0.35 secs
Transaction rate:          14.22 trans/sec
Throughput:             0.27 <span class="caps">MB</span>/sec
Concurrency:                4.98
Successful transactions:         429
Failed transactions:               0
Longest transaction:            1.17
Shortest transaction:&nbsp;0.22</p>

<p>Transactions:                403 hits
Availability:             100.00 %
Elapsed time:              30.16 secs
Data transferred:           7.68 <span class="caps">MB</span>
Response time:              0.37 secs
Transaction rate:          13.36 trans/sec
Throughput:             0.25 <span class="caps">MB</span>/sec
Concurrency:                4.98
Successful transactions:         403
Failed transactions:               0
Longest transaction:            1.32
Shortest transaction:&nbsp;0.23</p>

<p>Transactions:                406 hits
Availability:             100.00 %
Elapsed time:              30.42 secs
Data transferred:           7.74 <span class="caps">MB</span>
Response time:              0.37 secs
Transaction rate:          13.35 trans/sec
Throughput:             0.25 <span class="caps">MB</span>/sec
Concurrency:                4.95
Successful transactions:         406
Failed transactions:               0
Longest transaction:            1.28
Shortest transaction:&nbsp;0.22</p>

<p>And an updated comparison table:
<img src="http://img.skitch.com/20081014-844u36n94ayuchtnd8mtxh92yr.png" alt="Comparison spreadsheet" /></p>

<p>As you can see, that brings the difference down to about 30%. I suppose we could reduce it further, if I could make Drupal use sockets for connecting to&nbsp;PostgreSQL.</p>
    ]]></content>
  </entry>
  <entry>
    <title>I&#039;m starting my own Drupal shop</title>
    <link rel="alternate" type="text/html" href="http://mikkel.hoegh.org/blog/2008/im_starting_my_own_drupal_shop" />
    <id>http://mikkel.hoegh.org/blog/2008/im_starting_my_own_drupal_shop</id>
    <published>2008-10-01T00:26:23+02:00</published>
    <updated>2008-10-01T00:56:10+02:00</updated>
    <author>
      <name>mikkel</name>
    </author>
    <category term="business" />
    <category term="colours" />
    <category term="Drupal" />
    <category term="PlanetDrupal" />
    <category term="Reveal IT" />
    <category term="webdesign" />
    <summary type="html"><![CDATA[<p>So, I&#8217;m finally able to break the news. I&#8217;ve been planning this since before DrupalCon, but there&#8217;s been a lot of things needing to get done before I could take the final step and&nbsp;do&nbsp;it.</p>

<p>I am, as of half an hour ago, a registered independent business owner in the kingdom of Denmark. I am not alone in this. I have a very good friend and mentor backing me up and guiding me every step of the way – and for that&nbsp;I&#8217;m&nbsp;grateful.</p>

<p>The company name is&nbsp;&#8220;Reveal&nbsp;<span class="caps">IT</span>&#8221;.</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>So, I&#8217;m finally able to break the news. I&#8217;ve been planning this since before DrupalCon, but there&#8217;s been a lot of things needing to get done before I could take the final step and do&nbsp;it.</p>

<p>I am, as of half an hour ago, a registered independent business owner in the kingdom of Denmark. I am not alone in this. I have a very good friend and mentor backing me up and guiding me every step of the way – and for that I&#8217;m&nbsp;grateful.</p>

<p>The company name is &#8220;Reveal <span class="caps">IT</span>&#8221;. That is perhaps a bit silly, but I hope to help my clients to find out how to tap into the potential of <span class="caps">IT</span>, so I don&#8217;t think it&#8217;s too far&nbsp;fetched.</p>

<p>I&#8217;m going to offer Drupal-related services, primarily consulting and development, but also hosting for my clients. I&#8217;m not going into the hosting business for real, but I want to host the solutions I create for my customers myself, if at all possible, to avoid the hassles of shared&nbsp;hosting.</p>

<p>Besides working like crazy at <a href="http://peytz.dk/">Peytz <span class="amp">&amp;</span> Co.</a> (now as a freelancer), I have been working on my presentation for saturday, where I&#8217;ll be presenting Drupal, filling in for <a href="http://robshouse.net/">Robert Douglass</a>, and trying to work out design, identity and website for my new company. I&#8217;ve settled on a font (Gill Sans), but I&#8217;m struggling with the colours. Perhaps something like <a href="http://www.colourlovers.com/palette/497335/Limeade_on_Ice">this</a>. 
Or <a href="http://kuler.adobe.com/#themeID/15325">this</a>. 
Or <a href="http://www.colourlovers.com/palette/495367/lemon_mint">this</a>, <a href="http://www.colourlovers.com/palette/534887/KeepingMyFeet2TheSky">this</a>, <a href="http://kuler.adobe.com/#themeID/2313">this</a>, <a href="http://www.colourlovers.com/palette/536701/I_miss_old_polaroids">this</a>, <a href="http://www.colourlovers.com/palette/92095/Giant_Goldfish">this</a>, <a href="http://kuler.adobe.com/#themeID/110175">this</a>, <a href="http://www.colourlovers.com/palette/520464/inside_this_moment">this</a> or <a href="http://www.colourlovers.com/palette/526139/perspective">this</a>?<br />
What do you&nbsp;think?</p>

<p>Anyways, I&#8217;m going to get a website up as fast as I can make it with more details, but if you are in the eastern part of Denmark and in need of Drupal assistance of any kind, feel free to hit me up via my <a href="/contact">contact form</a> or call me at +45 22 17 29&nbsp;98.</p>

<p>Also, I&#8217;m going to partner with <a href="http://acquia.com/">Acquia</a> (congratulations on launching, by the way), and I look forward to working with them and other partners. I&#8217;ve been beta-testing their product for a while, and I can only say that if you&#8217;re into Drupal, you should certainly check it out. Highly&nbsp;recommended.</p>

<p>So, that&#8217;s all for now. If you have any ideas concerning colours, logo or other things, I&#8217;d love to hear from&nbsp;you.</p>
    ]]></content>
  </entry>
  <entry>
    <title>My six months with Mollom</title>
    <link rel="alternate" type="text/html" href="http://mikkel.hoegh.org/blog/2008/my_six_months_with_mollom" />
    <id>http://mikkel.hoegh.org/blog/2008/my_six_months_with_mollom</id>
    <published>2008-09-23T09:09:11+02:00</published>
    <updated>2008-09-23T09:10:06+02:00</updated>
    <author>
      <name>mikkel</name>
    </author>
    <category term="Drupal" />
    <category term="future" />
    <category term="internet" />
    <category term="Mollom" />
    <category term="PlanetDrupal" />
    <category term="spam" />
    <summary type="html"><![CDATA[<p>As many Drupallers know, <a href="http://mollom.com/">Mollom</a> has been out for a while now, six months in fact, and I just wanted to share my enthusiasm&nbsp;about&nbsp;it.</p>

<p>I had the pleasure of speaking a bit with <a href="http://buytaert.net/">Dries</a> about it in the shuttle bus back from Szeged, and it seems that Molloms future is&nbsp;truly&nbsp;exciting.</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>As many Drupallers know, <a href="http://mollom.com/">Mollom</a> has been out for a while now, six months in fact, and I just wanted to share my enthusiasm about&nbsp;it.</p>

<p>I had the pleasure of speaking a bit with <a href="http://buytaert.net/">Dries</a> about it in the shuttle bus back from Szeged, and it seems that Molloms future is truly&nbsp;exciting.</p>

<p>Before Mollom, I&#8217;ve been using spam.module and Akismet with varying degrees of success, and when Mollom first came out, I wondered why we needed another Akismet, but decided to try it out to support&nbsp;Dries.</p>

<p>The answer to that question is that Mollom is in fact not just another Akismet. Spam blocking is just one of the things it does. That does not mean that Mollom is not good at blocking spam. My experience is that Mollom is more effective than Akismet and spam.module&nbsp;combined.</p>

<p>But the thing that Mollom does is intelligent text recognition with a much broader scope. Mollom can decipher what language content is written in, and even more importantly, the &#8220;quality&#8221; of the content. Quality is such an elusive thing, and it is of course not all aspects of quality that Mollom is able to figure out, but Mollom has learned many of them, and I think we&#8217;re going to see more services in the future taking advantage of&nbsp;this.</p>

<p>Because spam is not the only challenge to internet users today, it is merely the first and most glaring. The ability to find the proverbial needle in the haystack, the few well-informed and interesting remarks in the torrent of ill-informed, poorly written tripe that is the standard Digg comment&nbsp;page.</p>

<p>Or perhaps the ability to filter out content that is not necessarily spam, but just unwanted for any kind of reason. Recognising link-whoring, trolling, racism and similarly unpleasant&nbsp;content.</p>

<p>As I understand it, all that and more is in the power of Mollom, and it&#8217;s going to be highly interesting to see where Dries, Ben and Wim are going to take it in the&nbsp;future.</p>
    ]]></content>
  </entry>
  <entry>
    <title>Thank you, DrupalCon</title>
    <link rel="alternate" type="text/html" href="http://mikkel.hoegh.org/blog/2008/thank_you_drupalcon" />
    <id>http://mikkel.hoegh.org/blog/2008/thank_you_drupalcon</id>
    <published>2008-08-31T23:26:49+02:00</published>
    <updated>2008-09-02T02:50:45+02:00</updated>
    <author>
      <name>mikkel</name>
    </author>
    <category term="Drupal" />
    <category term="DrupalCamp Copenhagen" />
    <category term="DrupalCon" />
    <category term="DrupalCon Szeged" />
    <category term="PlanetDrupal" />
    <summary type="html"><![CDATA[<p>So, DrupalCon is now over. I&#8217;m sitting here in the shuttle bus to Budapest with Dries, Webchick, Addison Berry, Tiburon and Drew. It&#8217;s been an exciting week for me, so many new friends and so much&nbsp;new&nbsp;knowledge.</p>

<p>Of all the 503 participants, there were only a precious few I had met in real life before, so it was all a bit daunting, but now I&#8217;m really glad&nbsp;I&nbsp;went.</p>

<p>It&#8217;s hard to find words for how great I think it has been. Meeting so many talented and friendly people has been inspiring. There is something special about the&nbsp;Druapl&nbsp;community.</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>So, DrupalCon is now over. I&#8217;m sitting here in the shuttle bus to Budapest with Dries, Webchick, Addison Berry, Tiburon and Drew. It&#8217;s been an exciting week for me, so many new friends and so much new&nbsp;knowledge.</p>

<p>Of all the 503 participants, there were only a precious few I had met in real life before, so it was all a bit daunting, but now I&#8217;m really glad I&nbsp;went.</p>

<p>It&#8217;s hard to find words for how great I think it has been. Meeting so many talented and friendly people has been inspiring. There is something special about the Druapl community. Unlike other computer events or conferences I have been at, everyone has been friendly and open to me, especially the Palantir guys who I had the pleasure of spending a great deal of time&nbsp;with.</p>

<p>I have had the opportunity to talk to a lot of the great minds in the Drupal-community. Thank you for all your hard work for the Drupal-community, and thank you for taking the time to share your experience with me and others. So thank you all, and a special thanks to Gabor and Kristof who managed to arrange all this, and to Dries who still manages to keep this community together and moving&nbsp;forward.</p>

<p>It was also nice meeting the guys from Århus, and a big thank you to the Erdfish-guy who found my&nbsp;iPhone.</p>

<p>Also thanks to Mark Griffith for accommodating me and a friend for two nights in Budapest. I hope you enjoyed&nbsp;DrupalCon.</p>

<p>I&#8217;m flying home to Denmark in 12 hours, and since Morten.dk talked me into holdnig a DrupalCamp in Copenhagen with me, it is probably going to be a hectic time, but I do hope to see some of you in Copenhagen, 15.-16. November&nbsp;2008.</p>
    ]]></content>
  </entry>
  <entry>
    <title>Less pagination on the web, please.</title>
    <link rel="alternate" type="text/html" href="http://mikkel.hoegh.org/blog/2008/less_pagination_on_the_web_please" />
    <id>http://mikkel.hoegh.org/blog/2008/less_pagination_on_the_web_please</id>
    <published>2008-08-14T16:56:45+02:00</published>
    <updated>2008-08-20T09:37:14+02:00</updated>
    <author>
      <name>mikkel</name>
    </author>
    <category term="annoyances" />
    <category term="rants" />
    <category term="web" />
    <summary type="html"><![CDATA[<p>I recently had the pleasure of a client at <a href="http://peytz.dk">work</a> that wanted pagination for his online newspaper-thing, and so I had the opportunity to think a bit about pagination on the web in general, and why it, in many cases, is a&nbsp;bad&nbsp;idea.</p>

<p>First, let me make&nbsp;a&nbsp;distiction:</p>

<p>Logical&nbsp;pagination</p>

<p>Now, this is the good pagination. The kind of pagination (Ajax or not) that saves my browser from having to load all the 538 comments on an interesting piece of news on <a href="http://digg.com">Digg</a>.</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>I recently had the pleasure of a client at <a href="http://peytz.dk">work</a> that wanted pagination for his online newspaper-thing, and so I had the opportunity to think a bit about pagination on the web in general, and why it, in many cases, is a bad&nbsp;idea.</p>

<p>First, let me make a&nbsp;distiction:</p>

<h4>Logical&nbsp;pagination</h4>

<p>Now, this is the good pagination. The kind of pagination (Ajax or not) that saves my browser from having to load all the 538 comments on an interesting piece of news on <a href="http://digg.com">Digg</a>. The kind that gives logical separation of a manual or a long&nbsp;book.</p>

<p>This difference here being that the pagination is either not of the main content or separation of a document you probably don&#8217;t want to read in its entirety anyway.<br />
The only real exception to this is books presented on the web, which are (in my opinion) too big for the web. If I&#8217;m reading a book, I find that it&#8217;s a completely different thing that reading the web. For books I prefer some kind of downloadable format that i can use with my e-book reader, <a href="http://www.lexcycle.com/stanza">Stanza</a>.</p>

<h4>Superfluous&nbsp;pagination</h4>

<p>Now, this is something else entirely. The splitting up of something that belongs together. I&#8217;m not completely sure why it is done, but I suppose the purpose is to show us more ads to drive up the revenue, but the fact is that many online publications today use this&nbsp;approach.</p>

<p>This annoys me greatly. When I&#8217;m reading an interesting article on something, I&#8217;m forced to break my flow and find the link and wait for the page to load. And often, I&#8217;m not even on the web when I read stuff. I have a strategy to go through my <span class="caps">RSS</span> feeds before going for a train ride or something else where I won&#8217;t be online and open all the interesting stuff in tabs in Firefox so I can read it&nbsp;later.</p>

<p>Besides this costing me extra time, it also costs resources. Each pageload adds costs, both for me and for the content provider, so while it might look nice on your page impressions statistics, it probably won&#8217;t bring you more revenue, only&nbsp;costs.</p>

<p>So in my opinion, any kind of article, opinion piece or whatever is atomic. Either I want to read it all, and then you might as well just give it to me immediately, or I don&#8217;t want to read it at all. I mean, whoever reads only 1/3 of an&nbsp;article?</p>

<h4>Final&nbsp;thoughts</h4>

<p>So please, if you have paginated content on your website, or are thinking about adding it, please consider this. Why do it? Besides showing more ads, I can&#8217;t really think of a&nbsp;reason.</p>

<p>Although I wrote this the 14th, I didn&#8217;t get around to post it until the 20th. In the meantime, I found that John Gruber <a href="http://daringfireball.net/linked/2008/08/18/self-links">apparently agrees</a>.</p>
    ]]></content>
  </entry>
  <entry>
    <title>When Free is actually limiting</title>
    <link rel="alternate" type="text/html" href="http://mikkel.hoegh.org/blog/2008/when_free_is_actually_limiting" />
    <id>http://mikkel.hoegh.org/blog/2008/when_free_is_actually_limiting</id>
    <published>2008-07-18T11:41:33+02:00</published>
    <updated>2008-07-18T23:25:10+02:00</updated>
    <author>
      <name>mikkel</name>
    </author>
    <category term="Apple" />
    <category term="FSF" />
    <category term="GPL" />
    <category term="Open Source" />
    <summary type="html"><![CDATA[<p>Is no big surprise that the <a href="http://www.fsf.org/">Free Software Foundation</a> doesn&#8217;t like the way things are going with Apple and its iPhone.
There is no doubt that the App Store is a great blow to the free&nbsp;software&nbsp;movement.</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>Is no big surprise that the <a href="http://www.fsf.org/">Free Software Foundation</a> doesn&#8217;t like the way things are going with Apple and its iPhone.
There is no doubt that the App Store is a great blow to the free software movement. It is currently impossible to distribute <span class="caps">GPL</span>-licensed software through it, without violating the <span class="caps">GPL</span>&#8217;s&nbsp;restrictions.</p>

<p>Given that the App Store is the only way for most consumers to get software on their new, shiny devices, the free software guys stand in a position where their license is actually a barrier to&nbsp;adoption.</p>

<p>Their article &#8220;<a href="http://www.fsf.org/blogs/community/5-reasons-to-avoid-iphone-3g">5 reasons to avoid iPhone 3G</a>&#8221; is predictable. Apple has control of what software they allow to be distributed through its channels. Apple does <span class="caps">DRM</span>. Apple doesn&#8217;t support Ogg Vorbis and&nbsp;Theora.</p>

<p>These are all valid concerns, but they continue on to call Steve Jobs a snake oil salesman and claiming that there&#8217;s better options on the horison, in form of the <a href="http://www.openmoko.com/">OpenMoko-based Neo Freerunner</a>.</p>

<p>And while OpenMoko might be an interesting project, it&#8217;ll probably be several years before the project is actually in a state where it could be found useful by the average consumer. It might actually never get there. That is the curse of free software.
Never finished, never polished, never fully working the way it&#8217;s supposed to has been the story of the Linux desktop for year and the Linux phone story seems to be no different. OpenMoko might be currently shipping with <span class="caps">GTK</span>-based software, but about the same time as they started shipping, they decided to switch to Qtopia. So, now they have not one buggy stack of software to support on their phones, but two.&nbsp;Wonderful.</p>

<p>And while you can say many things about Steve Jobs, calling him a snake oil salesman just undermines your own credibility. He&#8217;s a fabulous salesman, but what he sells are real computers, real phones, real gadgets and real software. All products that millions of people use and are glad to&nbsp;use.</p>

<p>So to the <span class="caps">FSF</span>, I have only one thing to say: &#8220;Put up or shut up.&#8221; - if you think that free software can do better, prove it. If ever OpenMoko materialises as a solid, polished product that someone like my boss would buy, I&#8217;ll be&nbsp;impressed.</p>

<p>Until then, you should perhaps consider your future. Its not much that keeps your software from getting on the iPhone, only your misguided insistence that even the cryptographic keys for signing the code should be open source as well. No body is saying that Open Source is a bad idea. I think it&#8217;s a great idea, but please don&#8217;t let ideology get in the way of the&nbsp;software.</p>

<p>I think we should encourage open source around the iPhone instead. While you cannot distribute the source code through the App Store, there is (as I understand it) nothing hindering you from publishing it somewhere else. And while only the holder of the keys can build and publish the code, there&#8217;s nothing that hinders you from editing it, sending patches or using it for something&nbsp;else.</p>

<p><em>Update</em>:
Another (hilarious) take on the <span class="caps">FSF</span>&#8217;s iPhone-slamming: 
<a href="http://www.theangrydrunk.com/2008/07/16/how-did-i-miss-this-tripe/" title="http://www.theangrydrunk.com/2008/07/16/how-did-i-miss-this-tripe/">http://www.theangrydrunk.com/2008/07/16/how-did-i-miss-this-tripe/</a></p>
    ]]></content>
  </entry>
  <entry>
    <title>New server (again)</title>
    <link rel="alternate" type="text/html" href="http://mikkel.hoegh.org/blog/2008/new_server_again" />
    <id>http://mikkel.hoegh.org/blog/2008/new_server_again</id>
    <published>2008-07-05T03:14:40+02:00</published>
    <updated>2008-07-04T23:52:43+02:00</updated>
    <author>
      <name>mikkel</name>
    </author>
    <category term="Drupal" />
    <category term="OpenSolaris" />
    <category term="servers" />
    <category term="website" />
    <summary type="html"><![CDATA[<p>As you might have read earlier on this blog, I&#8217;ve been self-hosting this website along with a lot of friends and clients on a rented server at <a href="http://easyspeedy.com/">EasySpeedy</a>. I have done this for about 18 months, and it&#8217;s been fun to have my very own webserver with 2 GiB <span class="caps">RAM</span> and the works, but as I&#8217;ve come to realise, this is a huge waste of money&nbsp;and&nbsp;resources.</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>As you might have read earlier on this blog, I&#8217;ve been self-hosting this website along with a lot of friends and clients on a rented server at <a href="http://easyspeedy.com/">EasySpeedy</a>. I have done this for about 18 months, and it&#8217;s been fun to have my very own webserver with 2 GiB <span class="caps">RAM</span> and the works, but as I&#8217;ve come to realise, this is a huge waste of money and&nbsp;resources.</p>

<p>A few thousand visits a day across 20 or so sites on a server of that magnitude, so it spends the most of its time idle, so I&#8217;ve been on the lookout for something else. Shared hosting is a pain in the rear quarters – I&#8217;ve been unable to find something that suited me since TextDrive closed down. The many Linux-based <span class="caps">VPS</span>&#8217; didn&#8217;t appeal to me either, since that usually involves <a href="http://www.xen.org/">Xen</a> or some other virtualisation-system – and&nbsp;pain.</p>

<p>So I&#8217;ve been reading a lot of good stuff about <a href="http://opensolaris.org/">OpenSolaris</a> in general and it&#8217;s <a href="http://opensolaris.org/os/community/zones/">Zones/Containers</a> technology in particular, so after playing a bit around with it in a virtual machine on my Mac, I decided to try it out for real with a <a href="http://www.joyent.com/accelerator/">Joyent Accelerator</a>.</p>

<p>All the marketing hyperbole aside (check out the page, it&#8217;s kinda hard to see what they&#8217;re actually selling), I&#8217;ve now got a small server of my own. Or in fact, I have a slice of a very big server. I think the Solaris Zones thing is somewhere between virtualisation and <span class="caps">BSD</span> jails. All the customers on this server share the same Kernel and all the essential stuff, but I have root access to play in my own little world. I can reboot my zone without actually rebooting the server – and best of all, its <em>fast</em>.</p>

<p>I&#8217;ve moved this site over on the Accellerator, and after figuring out where everything was on the file system, I had no problems setting it&nbsp;up.</p>

<p>I can&#8217;t feel a real difference between my Accelerator and my old server when it comes to serving pages quickly, even though the old server had a lot more resources. So that&#8217;s positive. And I&#8217;m only going to pay half of what I did before. So yay for Accellerators. I can truly recommend trying it out, even if OpenSolaris is a bit different that what you&#8217;re used to. I might even grow to like OpenSolaris&nbsp;better.</p>

<p>And goodbye, EasySpeedy. I&#8217;d still recommend these guys if you actually need a full server. But since I don&#8217;t, it&#8217;s nice to know that I&#8217;m going to save a bundle on sharing – and it&#8217;s even good for the environment&nbsp;:)</p>
    ]]></content>
  </entry>
  <entry>
    <title>Goodbye, my love (I hate you)</title>
    <link rel="alternate" type="text/html" href="http://mikkel.hoegh.org/blog/2008/goodbye_my_love_i_hate_you" />
    <id>http://mikkel.hoegh.org/blog/2008/goodbye_my_love_i_hate_you</id>
    <published>2008-06-12T18:45:08+02:00</published>
    <updated>2008-06-28T10:30:13+02:00</updated>
    <author>
      <name>mikkel</name>
    </author>
    <category term="Linux" />
    <category term="rants" />
    <category term="software" />
    <category term="X11" />
    <summary type="html"><![CDATA[<p>Thom Holwerda has posted an <a href="http://www.osnews.com/story/19846" title="X Server 1.4.1 Is Released, No Joke">interesting piece</a> on the state of <a href="http://www.x.org/wiki/" title="X.org home">X11</a>&nbsp;development.</p>

<p>This particular passage made&nbsp;me&nbsp;smile:</p>

<p>&gt; For such an important piece of software, this is not an&nbsp;ideal&nbsp;situation.</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>Thom Holwerda has posted an <a href="http://www.osnews.com/story/19846" title="X Server 1.4.1 Is Released, No Joke">interesting piece</a> on the state of <a href="http://www.x.org/wiki/" title="X.org home">X11</a>&nbsp;development.</p>

<p>This particular passage made me&nbsp;smile:</p>

<p>&gt; For such an important piece of software, this is not an ideal&nbsp;situation.</p>

<p>Besides the obvious understatement, the part about it being an important piece of software makes me realise how little i miss it. Because X is no longer important to me. Since I got my Mac, the only thing I run in X11 is Internet Explorer 6.0 and below, using Darwine. So I get to use two pieces of software that should have died long ago,&nbsp;simultaneously.</p>

<p>Why go hatin&#8217; on X, you might ask? Well, five years of full-time Linux desktop use has given me nothing but hate for&nbsp;X.</p>

<p>Because no matter how nice and subdued it might be under the tight wraps of the newest Ubuntu, it&#8217;ll use whatever chance it get to jump out and party like it&#8217;s&nbsp;1984.</p>

<p>If you could enumerate the amount of human time that&#8217;s been wasted on developing around the limits of this system, on lost productivity from X crashes, on fixing your config files again and again, on trying to get multiple displays, mice with more than three buttons, modern display adapters or just simple keyboards to work, it would amount to many&nbsp;lifetimes.</p>

<p>It is the great exception to the rule that Linux-developers (the <span class="caps">OS</span> in general, not the kernel) are more willing than Microsoft to break backwards compatibility to get rid of awful legacy systems and use better&nbsp;solutions.</p>

<p>It is the bleeding ulcer in the belly of each and every Linux installation. And instead of fixing it, Linux and other Unix-based system just pile layer upon layer of extra stuff on top of it to try and work around its&nbsp;flaws.</p>

<p>The brave souls that work on X deserve the greatest respect, but the free software community needs more dictators able to do a Steve Jobs and say &#8220;<em>That sucks, lets&#8217; start over</em>&#8220;…</p>
    ]]></content>
  </entry>
  <entry>
    <title>We still don&#039;t know what we&#039;re doing…</title>
    <link rel="alternate" type="text/html" href="http://mikkel.hoegh.org/blog/2008/we_still_dont_know_what_were_doing" />
    <id>http://mikkel.hoegh.org/blog/2008/we_still_dont_know_what_were_doing</id>
    <published>2008-05-30T18:06:11+02:00</published>
    <updated>2008-05-30T18:22:53+02:00</updated>
    <author>
      <name>mikkel</name>
    </author>
    <category term="community" />
    <category term="Drupal" />
    <category term="PlanetDrupal" />
    <category term="rants" />
    <summary type="html"><![CDATA[<p>Drupal&#8217;s popularity has really taken off on these parts – the last year has seen amazing growth, from a few hobbyists people meeting in Copenhagen now and then to large and respectable organisations deploying Drupal in really&nbsp;ambitious&nbsp;projects.</p>

<p>One of the things I have noticed as a result of the change, is how many that do not understand the why&#8217;s and the how&#8217;s of&nbsp;Drupal&#8217;s&nbsp;development.</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>Drupal&#8217;s popularity has really taken off on these parts – the last year has seen amazing growth, from a few hobbyists people meeting in Copenhagen now and then to large and respectable organisations deploying Drupal in really ambitious&nbsp;projects.</p>

<p>One of the things I have noticed as a result of the change, is how many that do not understand the why&#8217;s and the how&#8217;s of Drupal&#8217;s&nbsp;development.</p>

<p>I&#8217;ve had to put up with a lot of grumbling about Drupal&#8217;s pace of development, our unstable <span class="caps">API</span>, even from my new colleagues (I&#8217;ve been working full-time with Drupal since January 7th.), who now work with Drupal on a daily basis – you know who you are, curmudgeons&nbsp;;)</p>

<p>So, [this blog post by Moshe Weitzman from 2006][moshe] still seems highly relevant ([thanks, chx][chx]). Truth is, we <em>still</em> don&#8217;t know what we&#8217;re doing. We <em>still</em> have no road map or master plan. We will probably <em>still</em> see sweeping <span class="caps">API</span> changes every now and&nbsp;then.</p>

<p>My point is that you should be glad that this is so, because all these things are the very reasons for Drupal&#8217;s success. Let me&nbsp;explain.</p>

<p>I&#8217;ve used Drupal as my main <span class="caps">CMS</span> for two years now, although I&#8217;ve tried it out earlier – at Drupal 4.5. And <em>my</em>, we&#8217;ve come a long way since that. It would be disrespectful to say that Drupal 4.5 sucked, but compared to what we have today, it&nbsp;did.</p>

<p>So why do you clamour for <span class="caps">API</span> stability? Do you truly wish that we would have sat down at Drupal 4.5 and said that this <span class="caps">API</span> is just <em>fine</em>, thank you very&nbsp;much…?</p>

<p>No you don&#8217;t. And the same goes for road maps and master plans. It can be a good thing to have plans, but when it comes to a thing that changes as quickly as the Internet does, it is all but useless to plan more than 12 months ahead, because there&#8217;s probably a technology right around the corner that will change things – and make your 5-year plan&nbsp;useless.</p>

<p>At Drupal 4.6 or 4.7, nobody could have predicted our current situation accurately – so why are you asking for us to do the same with Drupal 8 or&nbsp;9?</p>

<h3>Community&nbsp;matters</h3>

<p>My final point is the community. I think the main reason people find Drupal hard to grok is the community aspect of it. We often describe ourselves as the colloquial &#8220;we&#8221;. We the Drupal community. We the&nbsp;people.</p>

<p>The thing is, that there is no coherent &#8220;we&#8221; when it comes to the Drupal community. &#8220;We&#8221; is a huge schizophrenic choir. A huge smattering of individual, each with their own issues, their own vision, their own itches. Each has an idea of what would be great for the next version of Drupal. And many of us set out to make that idea become reality by doing what we can. Translate stuff, file bugs, help out with the issue queue or write code. Or maybe just advocate Drupal to others, since the more of us there are, the greater chance there is that someone will have the same itch as you – and go scratch&nbsp;it.</p>

<p>So while Dries is a great leader and has plans and visions for Drupal, his voice is not the only one, just the loudest one. And since he has yet to get his own army and secret police to come wake us up at night and make us code what he wants us to, there is never going to be coherent focus in the development&nbsp;process.</p>

<p>And that&#8217;s good too. Because even doctors of Computer Science have been know to make mistakes from time to time. So if he was some day to make a mistake, we would not follow him blindly. And I personally think that that&#8217;s the way it&#8217;s supposed to&nbsp;be.</p>

<p>So the next time you feel like griping, remember that Drupal is what it is, because of all these things, not in spite of&nbsp;them.</p>

<p>[moshe]:         (We don&#8217;t know what we are doing)
[chx]:        (chx: Four&nbsp;today)</p>
    ]]></content>
  </entry>
  <entry>
    <title>History meme</title>
    <link rel="alternate" type="text/html" href="http://mikkel.hoegh.org/blog/2008/history_meme" />
    <id>http://mikkel.hoegh.org/blog/2008/history_meme</id>
    <published>2008-05-02T19:10:02+02:00</published>
    <updated>2008-06-24T08:59:31+02:00</updated>
    <author>
      <name>mikkel</name>
    </author>
    <category term="bash" />
    <category term="cli" />
    <category term="geek" />
    <category term="terminal" />
    <summary type="html"><![CDATA[<p>It has become all the rage for geek bloggers to post a list of the most used commands on their command lines, but since I found my own results interesting, I will post them&nbsp;here&nbsp;nevertheless.</p>

<p>First, our company development server at (<a href="http://peytz.dk/" title="http://peytz.dk/">http://peytz.dk/</a>) where I spend a lot of time messing around with <span class="caps">CVS</span>&#8230; <em>sigh</em></p>

<div class="geshifilter"><pre class="geshifilter-text">-(mih@dev0)-(84/pts/4)-(~/www/drupal5/sites/asdfasdf-dk.drupal5.dev.peytz.dk/)-
-($ history | awk '{a[$2]++}END{for(i in a){print a[i] &quot; &quot; i}}' | sort -rn | head
296 cvs
210 ls
209 cd
40 rm
29 realDiff
29 mv
25 vim
22&nbsp;wget</pre></div>
    ]]></summary>
    <content type="html"><![CDATA[<p>It has become all the rage for geek bloggers to post a list of the most used commands on their command lines, but since I found my own results interesting, I will post them here&nbsp;nevertheless.</p>

<p>First, our company development server at (<a href="http://peytz.dk/" title="http://peytz.dk/">http://peytz.dk/</a>) where I spend a lot of time messing around with <span class="caps">CVS</span>&#8230; <em>sigh</em></p>

<pre><code>-(mih@dev0)-(84/pts/4)-(~/www/drupal5/sites/asdfasdf-dk.drupal5.dev.peytz.dk/)-
-($ history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head
296 cvs
210 ls
209 cd
40 rm
29 realDiff
29 mv
25 vim
22 wget
20 tar
15 peytzPublish
</code></pre>

<p>realDiff and peytzPublish are some of our home brewed utilities, but the rest you should be familiar with. Funny thing that the number of <span class="caps">CVS</span> commands exceeds both cd and ls. (I don&#8217;t ignore cd and ls in my history as many do, since I like to be able to repeat them just by pressing&nbsp;up.)</p>

<hr />

<p>Next, my MacBook Pro. I&#8217;ve only had it for two weeks, but there&#8217;s already plenty of&nbsp;history:</p>

<pre><code>-(mikl@Barak)-(1/ttys002)-(~)-
-($ history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head
153 cd
131 ls
103 svn
46 ssh
29 rm
23 sudo
22 mv
22 dig
20 vim
20 cp
</code></pre>

<p>Not many surprises there. I use <span class="caps">SVN</span> for revision control for Drupal Danmark, our Danish Drupal community. Most of my hobby project use git or bzr, but I have not worked with any of them since I got my&nbsp;Mac.</p>

<hr />

<p>Finally, my web&nbsp;server:</p>

<pre><code>231 ls
210 cd
72 git
64 sudo
55 wget
51 rm
47 bzr
37 vim
32 tar
29 mv
</code></pre>

<p>Not many surprises here. Apparently, I have been using git more than bzr lately, probably due to my work on a <a href="http://mikkel.hoegh.org/blog/2008/a_git_mirror_for_drupal_cvs">git mirror for Drupal <span class="caps">CVS</span></a>. This is from a rather long period, since I rarely do much other than log in, do a <code>sudo aptitude</code> and maybe update a few Drupal modules with wget and&nbsp;tar.</p>

<hr />

<p>For more of these shell history lists, see <a href="http://diveintomark.org/archives/2008/04/15/history-meme" title="http://diveintomark.org/archives/2008/04/15/history-meme">http://diveintomark.org/archives/2008/04/15/history-meme</a></p>

<hr />

<p>In other news, I have started using Markdown for this blog. I have wavered a bit between writing my own <span class="caps">HTML</span>, <span class="caps">WYSIWYG</span> and Textile for a while, but I decided to give Markdown a try, and I find the syntax a bit more natural to me than Textile. But giving my tendancy to change my mind often, this might not the the final word in the&nbsp;matter&#8230;</p>
    ]]></content>
  </entry>
  <entry>
    <title>A Git mirror for Drupal CVS </title>
    <link rel="alternate" type="text/html" href="http://mikkel.hoegh.org/blog/2008/a_git_mirror_for_drupal_cvs" />
    <id>http://mikkel.hoegh.org/blog/2008/a_git_mirror_for_drupal_cvs</id>
    <published>2008-02-19T13:01:03+01:00</published>
    <updated>2008-10-11T19:36:26+02:00</updated>
    <author>
      <name>mikkel</name>
    </author>
    <category term="development" />
    <category term="Drupal" />
    <category term="DVCS" />
    <category term="Git" />
    <category term="PlanetDrupal" />
    <category term="SCM" />
    <category term="VCS" />
    <summary type="html"><![CDATA[<p>For some weeks, I have on-and-off been trying to create my own mirror of cvs.drupal.org in Git, and now it seems I&#8217;ve&nbsp;finally&nbsp;succeeded.</p>

<p>I have set it up with Gitweb and everything, and it seems to have complete fidelity with regards to the&nbsp;original&nbsp;data.</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>For some weeks, I have on-and-off been trying to create my own mirror of cvs.drupal.org in Git, and now it seems I&#8217;ve finally&nbsp;succeeded.</p>

<p>I have set it up with Gitweb and everything, and it seems to have complete fidelity with regards to the original data. It has all the branches/heads and tags that Drupal has, meaning that you can use checkouts from this reppository to keep your Drupal installations&nbsp;up-to-date.</p>

<h4>Here&#8217;s the&nbsp;links:</h4>

<p>Github: <a href="http://github.com/mikl/drupal/tree/master" title="http://github.com/mikl/drupal/tree/master">http://github.com/mikl/drupal/tree/master</a><br />
Repository (git clone this):&nbsp;git://github.com/mikl/drupal.git</p>

<p>I am currently working on a cron job to keep it up to date. I&#8217;ll set it up to update from cvs.drupal.org every 6 hours or so. I think that&#8217;s sensible, but if you have a better opinion, feel free to post it&nbsp;below.</p>

<p>I do hope that this could get to be an official thing, hosted at git.drupal.org and everything, but for now, I just hope that you guys won&#8217;t wreck my server by hitting Gitweb like there&#8217;s no tomorrow&nbsp;:)</p>

<p>For those interested, here&#8217;s the command to create such a repository, though a fair warning should be in order: <em>It takes <strong>hours</strong> to do</em> and probably generates a fair bit of load on cvs.drupal.org, so unless you have a solid reason to do so, you should <em>just clone my repository with&nbsp;Git!</em></p>

<p>With no further ado, the&nbsp;command:</p>

<pre><code>git-cvsimport -v -d:pserver:anonymous@cvs.drupal.org:/cvs/drupal -o upstream drupal
</code></pre>

<p>If this fails, you will probably need to do a <span class="caps">CVS</span> login first, like&nbsp;this:</p>

<pre><code>cvs -d:pserver:anonymous:anonymous@cvs.drupal.org:/cvs/drupal login
</code></pre>

<p>If you have a Drupal <span class="caps">CVS</span> account, you should be able to use that as&nbsp;well.</p>

<h4>Update&nbsp;2008-10-11:</h4>

<p>Since my server is kinda hard to get to, I&#8217;ve started pushing the aforementioned repository to Github instead. I&#8217;ve changed the URLs&nbsp;above.</p>
    ]]></content>
  </entry>
</feed>
