<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>Code Penguin</title>
	
	<link>http://laurent.bachelier.name</link>
	<description>Musings on software, internet and technology by Laurent Bachelier</description>
	<lastBuildDate>Tue, 15 May 2012 17:38:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="laurentb" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://laurent.bachelier.name/feed/" /><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Flaurent.bachelier.name%2Ffeed%2F" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Flaurent.bachelier.name%2Ffeed%2F" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Flaurent.bachelier.name%2Ffeed%2F" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://laurent.bachelier.name/feed/" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Flaurent.bachelier.name%2Ffeed%2F" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Flaurent.bachelier.name%2Ffeed%2F" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Flaurent.bachelier.name%2Ffeed%2F" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.plusmo.com/add?url=http%3A%2F%2Flaurent.bachelier.name%2Ffeed%2F" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Flaurent.bachelier.name%2Ffeed%2F" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Flaurent.bachelier.name%2Ffeed%2F" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsalloy.com/?rss=http%3A%2F%2Flaurent.bachelier.name%2Ffeed%2F" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.live.com/?add=http%3A%2F%2Flaurent.bachelier.name%2Ffeed%2F" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Flaurent.bachelier.name%2Ffeed%2F" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.yourminis.com/subscribe.aspx?u=http%3A%2F%2Flaurent.bachelier.name%2Ffeed%2F" src="http://www.yourminis.com/images/addtoyourminisbadge.gif">Subscribe with Yourminis.com</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Flaurent.bachelier.name%2Ffeed%2F" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Flaurent.bachelier.name%2Ffeed%2F" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://hub.netomat.net/account/account.autoSubscribe.jspa?urls=http%3A%2F%2Flaurent.bachelier.name%2Ffeed%2F" src="http://www.netomat.net/blogger/images/icon_netomat_feedbutton.gif">Subscribe with netomat Hub</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Flaurent.bachelier.name%2Ffeed%2F" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Flaurent.bachelier.name%2Ffeed%2F" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.wikio.com/subscribe?url=http%3A%2F%2Flaurent.bachelier.name%2Ffeed%2F" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Flaurent.bachelier.name%2Ffeed%2F" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item>
		<title>GitHub kinda sucks</title>
		<link>http://laurent.bachelier.name/2012/05/github-kinda-sucks/</link>
		<comments>http://laurent.bachelier.name/2012/05/github-kinda-sucks/#comments</comments>
		<pubDate>Tue, 15 May 2012 17:38:34 +0000</pubDate>
		<dc:creator>laurentb</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://laurent.bachelier.name/?p=318</guid>
		<description><![CDATA[First, GitHub isn&#8217;t that bad. I was tempted to go away from it completely, because of reasons I will explain below, but it does a simple job and does not screw up too much. It&#8217;s fairly slow and unreliable, especially compared to my cheap server (Roubaix, while located in the Far North, is after all [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:7493737c2abbc8f4800f282af7da785183da87a7'><p>First, <strong>GitHub isn&#8217;t that bad</strong>. I was tempted to go away from it completely, because of reasons I will explain below, but it does a simple job and does not screw up too much.</p>
<p>It&#8217;s fairly slow and unreliable, especially compared to my cheap server (Roubaix, while located in the Far North, is after all much closer to me than the United States). <strong>Yet, most of the time it does its job and does not bother me.</strong> Creating a new repository is annoying, though after years GitHub developers finally realized the page had to be accessible in more than one obscure way, compared to just pushing to my server (thanks to a Gitolite rule, it creates the repo automatically). <code>git-daemon</code> and <code>cgit</code> are fast, but GitHub sure would handle heavy load better than my server.</p>
<p>The fact that GitHub is <a href="https://github.com/rails/rails/commit/b83965785db1eec019edf1fc272b1aa393e6dc57">insecure</a> and use stupid frameworks isn&#8217;t the issue either. It&#8217;s hard to miss rogue commits since it means non-fast-forward push, and PGP signatures are the real solution for authentication. I don&#8217;t care if they have proper backups either, I have mine: I now push to my server directly, which then pushes to multiple mirrors (this is easy to do with gitolite).</p>
<p><strong>The real issue</strong> is mostly GitHub refusing to acknowledge one size does not fit all, and a lot of obnoxious GitHub users.</p>
<p><strong>My biggest issue is &#8220;pull requests&#8221;.</strong> The thing is, you can&#8217;t disable them. You can disable issues, wiki (and I do, since they pretty much lock you to GitHub; you don&#8217;t own the data anymore like you do with git), but not pull requests.<br />
It already has been explained by other people (<a href="https://github.com/torvalds/linux/pull/17">[1]</a> and pretty much all other PRs, <a href="https://github.com/sitaramc/gitolite/wiki/">[2]</a>), and probably better than I will. The reaction of GitHub developers was, roughly, &#8220;<a href="https://github.com/torvalds/linux/pull/11">Linus is wrong</a>&#8220;. I&#8217;m pretty sure the opinion of the creator of git, and the manager of one of the biggest software project ever, isn&#8217;t all that wrong.</p>
<p>As a <em>manager</em>, pull requests are annoying, because they require you to add a remote for every user sending a PR. Even for a 2 line patch from an user that will contribute once. The remote URL isn&#8217;t displayed straight on the PR, of course.<br />
Actually, I learned you can get a patch by adding .patch to the URL, but it isn&#8217;t advertised anywhere. Maybe some GitHub developer actually has sense and snuck that feature in.<br />
Or of course you can merge the commit from the web. Seriously, you can merge it, without even getting it on your machine (to, you know, test it, read it, etc.), from your web browser. That&#8217;s retarded, right? Well, it&#8217;s even worse: it makes a silly merge commit, even if it is fast-forward.</p>
<p>As a <em>contributor</em> (and this is the part that wasn&#8217;t covered by the other critics), pull requests are even more painful.<br />
GitHub projects usually expect pull requests, and only them. So you<br />
<strong>have to</strong> do it the GitHub way: &#8220;fork&#8221; it (from the web),<br />
commit, push on your repo, and make the pull request (from the web). The web interfaces are, as most of them are, slow and annoying. Pull requests are from a branch to a branch, so you have to create a branch if you want to continue working on it without updating the PR automatically. Since I tend to do a lot of small contributions, it spend more time fighting with GitHub than actually altering the code.<br />
On sane projects, you send a patch to an e-mail address. Two simple git commands, and you&#8217;re done. Oh, and there&#8217;s no way of attaching files to GitHub issues, so don&#8217;t think about it.</p>
<p><strong>When the pull request is closed, you don&#8217;t receive anything.</strong> No notification, no mail. There is no way to list your past or pending PRs (or issues).</p>
<p>To sum up, <strong>GitHub restricts your workflow</strong>, while git is all about flexibility.</p>
<p><strong>The last issue is GitHub users.</strong> It&#8217;s not much of a pain because it&#8217;s easy to ignore them, except being on GitHub could make you likened to them, like having a MySpace page kind of makes you lame too.</p>
<p>Poor commit messages, custom smileys (even in commits!) and <a href="https://github.com/torvalds/linux/pull/6>unfunny</a> tired memes. A lot of discussions look like there are two intelligent people, and ten others <a href="https://github.com/torvalds/linux/pull/9">&#8220;me too</a>&#8221; trying to look good. A lot of projects seem to spend more time advertising themselves than actually trying to work. At least they&#8217;re publishing code?</p>
<p><strong>Project forks and watchers mean nothing.</strong> Some people will &#8220;fork&#8221; projects before having done anything, and will likely never commit on it. Yet, it will get listed. Watchers do not mean potential contributors either, or even… users.</p>
<p>I heard some people actually pay <a href="https://github.com/plans">that much</a> for sub-par git hosting. I think it tells <em>something</em> about GitHub users.</p>
<p>GitHub could listen to the critics of pull requests, or just acknowledge other ways of contributing, but I doubt it will happen.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://laurent.bachelier.name/2012/05/github-kinda-sucks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Updating DNS zones serial numbers automatically</title>
		<link>http://laurent.bachelier.name/2012/02/updating-dns-zones-serial-numbers-automatically/</link>
		<comments>http://laurent.bachelier.name/2012/02/updating-dns-zones-serial-numbers-automatically/#comments</comments>
		<pubDate>Sun, 19 Feb 2012 15:51:16 +0000</pubDate>
		<dc:creator>laurentb</dc:creator>
				<category><![CDATA[Sysadmin]]></category>

		<guid isPermaLink="false">http://laurent.bachelier.name/?p=298</guid>
		<description><![CDATA[If there is something I always forget, it is to update serial numbers of DNS zones. Serial numbers is the only source used for zones transfers, so if you forget to update them, the secondary NS will keep serving the old zone. When you use a fancy DNS server, which has a database backend for [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:c5ecd42cf0aa959150b44de08415d7fa02c7965d'><p>If there is something I always forget, it is to update serial numbers of DNS zones.</p>
<p><a href="https://en.wikipedia.org/wiki/DNS_zone_transfer#Serial_number_changes">Serial numbers</a> is the only source used for zones transfers, so if you forget to update them, the secondary NS will keep serving the old zone.<br />
When you use a fancy DNS server, which has a database backend for intance, it can compute the serial number automatically (which is usually in the <code>YYYYMMDDxx</code> format). In my case, it is much simpler to rely on BIND-style zone files.</p>
<p>My first solution was adding at the top of my zone files:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
<span style="color: #666666; font-style: italic;">; DO NOT FORGET TO UPDATE THE SERIAL NUMBER ;</span>
<span style="color: #666666; font-style: italic;">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span></pre></div></div>

<p>However, it still required me to update the serial number manually, which is pretty annoying.</p>
<p>Then I discovered the <code>dnstouch</code> tool from <a href="http://www.chrysocome.net/ndu">ndu</a> (that tool does not require BIND). When you run it on a zone file, it updates the serial number with the current date, and even handles the last two digits (a simple counter).</p>
<p>This inspired me to automate even the part of starting <code>dnstouch</code>. Now, I simply run <code>make</code> and the serial numbers are updated, only if required.</p>
<p>Here is the <code>Makefile</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="make" style="font-family:monospace;"><span style="color: #990000;">.SUFFIXES</span><span style="color: #004400;">:</span> <span style="color: #004400;">.</span>zone <span style="color: #004400;">.</span>zonetouch
&nbsp;
zones <span style="color: #004400;">:=</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #0000CC; font-weight: bold;">patsubst</span> <span style="color: #004400;">%.</span>zone<span style="color: #004400;">,%.</span>zonetouch<span style="color: #004400;">,$</span><span style="color: #004400;">&#40;</span><span style="color: #0000CC; font-weight: bold;">wildcard</span> <span style="color: #004400;">*.</span>zone<span style="color: #004400;">&#41;</span><span style="color: #004400;">&#41;</span>
&nbsp;
all<span style="color: #004400;">:</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">zones</span><span style="color: #004400;">&#41;</span>
&nbsp;
<span style="color: #004400;">.</span>zone<span style="color: #004400;">.</span>zonetouch<span style="color: #004400;">:</span>
	dnstouch <span style="color: #000088; font-weight: bold;">$&lt;</span> <span style="color: #004400;">&amp;&amp;</span> touch <span style="color: #004400;">-</span>r <span style="color: #000088; font-weight: bold;">$&lt;</span> <span style="color: #000088; font-weight: bold;">$@</span></pre></div></div>

<p>What does it do:</p>
<ul>
<li>Declare that *.zone and *.zonetouch are generic actions</li>
<li>Find out what the *.zone files are, and deduce the .zonetouch files that should be updated or generated</li>
<li>Declare the default action is to generate all the .zonetouch files</li>
<li>Declare the action to generate a .zonetouch file from a .zone file. If the .zonetouch is outdated, the commands will be ran. If not, make runs dnstouch, and then creates or updates the .zonetouch file, with the same modification time.</li>
</ul>
</pre>
</div>]]></content:encoded>
			<wfw:commentRss>http://laurent.bachelier.name/2012/02/updating-dns-zones-serial-numbers-automatically/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Achievement</title>
		<link>http://laurent.bachelier.name/2011/06/achievement/</link>
		<comments>http://laurent.bachelier.name/2011/06/achievement/#comments</comments>
		<pubDate>Thu, 16 Jun 2011 20:27:17 +0000</pubDate>
		<dc:creator>laurentb</dc:creator>
				<category><![CDATA[Meta]]></category>
		<category><![CDATA[giddyup]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[seinfeld]]></category>

		<guid isPermaLink="false">http://laurent.bachelier.name/?p=281</guid>
		<description><![CDATA[While the Seinfeld calendar greatly helped me to get the habit of doing something productive, the service I used has its flaws. First, it&#8217;s restricted to GitHub. Also, since it only counts commits, and not the fact that I can work without any finished product, it made me prefer short work and postpone doing stuff I [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:0f5549b3f417205157e1e6db82704e292bc7750b'><p><a href="http://calendaraboutnothing.com/~laurentb"><img src="http://laurent.bachelier.name/wp-content/uploads/2011/06/seinfeld.png" alt="Seinfeld calendar, 100 days" width="148" height="76" class="alignnone size-full wp-image-282" /></a></p>
<p>While the <a href="http://lifehacker.com/281626/jerry-seinfelds-productivity-secret">Seinfeld calendar</a> greatly helped me to get the habit of doing something productive, the <a href="http://calendaraboutnothing.com/">service</a> I used has its flaws. First, it&#8217;s restricted to GitHub. Also, since it only counts commits, and not the fact that I can work without any finished product, it made me prefer short work and postpone doing stuff I wasn&#8217;t sure I would finish before 00:00 (the fact I start late does not help either). The notion of a day is also wrong — committing at 00:30 should not be counted for the current day but the previous one.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://laurent.bachelier.name/2011/06/achievement/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Some clarifications on symfttpd</title>
		<link>http://laurent.bachelier.name/2011/03/some-clarifications-on-symfttpd/</link>
		<comments>http://laurent.bachelier.name/2011/03/some-clarifications-on-symfttpd/#comments</comments>
		<pubDate>Thu, 24 Mar 2011 18:24:15 +0000</pubDate>
		<dc:creator>laurentb</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Sysadmin]]></category>

		<guid isPermaLink="false">http://laurent.bachelier.name/?p=267</guid>
		<description><![CDATA[The basic idea is to start a server without any central configuration to maintain, and no need for any root access, hence generic virtual hosts features of Apache or lighttpd are not complete alternatives, as they at least require editing /etc/hosts. It uses the FastCGI backend (or &#8220;SAPI&#8221;) and can by default handle 3 concurrent [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:30364a44b1994a1c50b606c2b8fdf1711e44bc58'><p>The basic idea is to start a server without any central configuration to maintain, and no need for any root access, hence generic virtual hosts features of Apache or lighttpd are not complete alternatives, as they at least require editing <code>/etc/hosts</code>.</p>
<p>It uses the FastCGI backend (or &#8220;SAPI&#8221;) and can by default handle 3 concurrent requests, which is more than enough for development. On the production side, I only use symfttpd to generate the rewrite rules (since lighttpd is also my production server of choice). If you have an opcode cache installed (for instance APC or xcache), it will be used, as fastcgi processes are seldom restarted (by default every 100 requests, I use a higher number on production though). It also does not rely on any hacks to simulate a web request in the CLI: you are doing real requests using a real PHP HTTP backend.</p>
<p>One of the future improvements could be using <a href="http://php.net/manual/en/install.fpm.php">FPM</a> instead of FastCGI.</p>
<p><a href="https://github.com/laurentb/symfttpd">Symfttpd</a> can optionality use the <code><a href="http://php.net/manual/en/function.pcntl-fork.php">fork</a></code> function to provide two nice features: automatically restart when rewriting rules change, and display the access and error log. However, if you do not have fork support compiled in (it is enabled by default in at least Gentoo, Debian and Ubuntu), it does not mean only one request can be answered at a time (<a href="http://www.lighttpd.net/">lighttpd</a> does not need <code>fork()</code> by the way, which is one of the reasons it is very fast).</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://laurent.bachelier.name/2011/03/some-clarifications-on-symfttpd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The sad quest for a portable audiophile setup</title>
		<link>http://laurent.bachelier.name/2011/03/the-sad-quest-for-a-portable-audiophile-setup/</link>
		<comments>http://laurent.bachelier.name/2011/03/the-sad-quest-for-a-portable-audiophile-setup/#comments</comments>
		<pubDate>Thu, 03 Mar 2011 22:37:12 +0000</pubDate>
		<dc:creator>laurentb</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[music]]></category>
		<category><![CDATA[standards]]></category>

		<guid isPermaLink="false">http://laurent.bachelier.name/?p=251</guid>
		<description><![CDATA[I don&#8217;t like to listen to stuff loud. People usually listen loud because their setups are bad and it compensates somewhat. Well, I&#8217;d like to preserve my hearing — already imperfect — as much as possible. With my current IEMs, the outside noise is actually louder than when I wear them and play music. In [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:1234b822e110050c24bf9c6fcc0f21c30158ac77'><p>I don&#8217;t like to listen to stuff loud. People usually listen loud because their setups are bad and it compensates somewhat. Well, I&#8217;d like to preserve my hearing — already imperfect — as much as possible. With my current <a href="http://en.wikipedia.org/wiki/In-ear_monitor">IEMs</a>, the outside noise is actually louder than when I wear them and play music. In a way, it&#8217;s even better for my hearing!</p>
<p>The issue is that nowadays, pretty much all portable players are crap. They rarely support interesting formats. Their amplifier stages are tuned for loudness and sacrifice the <a href="http://en.wikipedia.org/wiki/Loudness_war">dynamic range</a>. Their interfaces are animated and shiny, yet don&#8217;t get shit done.</p>
<p>The most popular remedy to bad amplifiers is to use an Apple device, as the proprietary connector provides line out, which is an unamplified signal, and to use an external amplifier. Some other devices provide line out, but are much harder to find. The recommended choice is an iPod 5.5th generation or below, as their <a href="http://en.wikipedia.org/wiki/Digital-to-analog_converter">DACs</a> are of reasonable quality, but mostly because they are not as locked down as the new ones.</p>
<p>Hopefully, you can replace Apple&#8217;s horrible software by <a href="http://www.rockbox.org/">Rockbox</a>, an open source alternative that will allow you to get rid of the iTunes dependency or support open and high-quality formats such as FLAC and Ogg Vorbis. One of the perks I get with it is the speaking menus — you can more or less control the device without looking at it, which is not easy to do when there are no buttons but only the ergonomic absurdity that is the &#8220;clickwheel&#8221;. It can also announce the battery status. The ReplayGain feature prevents me from having to adjust the volume between albums.</p>
<p>Another issue with iPods is the usage of an hard drive. While cheaper than Flash memory, it is much more unreliable and requires more power. You can however <a href="http://www.tarkan.info/20080126/tutorials/32gb-compact-flash-ipod">replace the hard drive by a CompactFlash card</a>.</p>
<p>My current setup consists of an iPod 5.5g 30gb, with the hard drive replaced by a 32 GB flash drive (it wasn&#8217;t much of a choice, given the horrible noise the drive was making). It uses a SendStation Line Out and Micro USB adapter (no need to use a proprietary cable!), which is then hooked to an <a href="http://www.ibasso.com/en/products/show.asp?ID=37">iBasso T4 amplifier</a>. The amplifier provides me with an hardware volume potentiometer which for that reason alone is worth it. The final stage is handled by the <a href="http://anythingbutipod.com/2007/06/future-sonics-atrio-m5-m8-review/">Future Sonics Atrio M5</a>.</p>
<p><a href="http://laurent.bachelier.name/wp-content/uploads/2011/03/dap.jpg"><img src="http://laurent.bachelier.name/wp-content/uploads/2011/03/dap-300x216.jpg" alt="" title="My setup" width="300" height="216" class="aligncenter size-medium wp-image-253" /></a></p>
<p>Am I happy with it? Well, the sound quality is more than enough. I doubt I could enjoy my music more by upgrading to something else. However, I have a lot of unrelated complaints:</p>
<p>I spent 80€ on the iPod yet much more to make it suck less. And it still sucks. The build quality is shoddy, I frequently have to open it to reconnect components. It powers itself on even when the &#8220;lock&#8221; switch is activated, draining the battery needlessly. The clickwheel is a pain to use and I can sense it dying. The screen is shiny and obviously unreadable under the sun. Dust is getting inside. It is very slow to power on. The battery isn&#8217;t in a good shape, but the Flash memory and usage of an external amplifier compensate for now.</p>
<p>iTunes wasn&#8217;t able to restore the iPod properly when I changed the drive, so I had to mirror the drive exactly to the CompactFlash card (losing the additional 2 GB of space), contrarily to what was stated on the adapter&#8217;s website. Since I&#8217;m probably not the only one with the same issue out there, here is a <a href="http://stuff.laurent.bachelier.name/raw_ipod.img.xz">raw copy</a> of the drive with Rockbox installed as the only OS. It also was a bitch to open, even for an Apple product.</p>
<p>Uploading files to the iPod is slow as hell, and sometimes fails. It seems it doesn&#8217;t like writing more than a few gigabytes in a row. And the dock adapter has a tendency to come out.</p>
<p>To sum up, I&#8217;m using an iPod but discarding its software, and half its hardware.</p>
<p>The iBasso T4 uses a proprietary cable to recharge. Other than that, it caught many shocks but still works flawlessly. And it can be opened with a screwdriver.</p>
<p>As for the Atrio, for 100€, they were a solid choice. Now that they cost twice as much (and still are the same product) there probably are better options. I use Comply T100 foam tips, and they are generally compatible with Shure eartips (which motivated my choice since I have a bunch of them in stock). One nice touch is that the user&#8217;s manual recommends against any artificial bass enhancements: you know you&#8217;re not dealing with crappy phones.</p>
<p>So, what would I recommend instead? Well, I&#8217;d probably get a FiiO E7 or another iBasso model. But for the media player, I&#8217;m stuck. Hence the title.</p>
<p>There might be some hope on the side of the <a href="http://en.wikipedia.org/wiki/PDMI">PDMI connector</a>, though.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://laurent.bachelier.name/2011/03/the-sad-quest-for-a-portable-audiophile-setup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>symfttpd 1.1.1 released</title>
		<link>http://laurent.bachelier.name/2011/02/symfttpd-1-1-1-released/</link>
		<comments>http://laurent.bachelier.name/2011/02/symfttpd-1-1-1-released/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 23:00:57 +0000</pubDate>
		<dc:creator>laurentb</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[lighttpd]]></category>

		<guid isPermaLink="false">http://laurent.bachelier.name/?p=242</guid>
		<description><![CDATA[You can now use genconf without linking or copying it inside the project. It also makes the usage of mksymlinks more or less optional if you just want to use spawn. Not much else too see apart from small bug fixes and documentation improvements. Download symfttpd 1.1.1. More information on GitHub. There is also a [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:b73559fc46954f736eb03798d60f5a76cdd438bf'><p>You can now use <code>genconf</code> without linking or copying it inside the project. It also makes the usage of <code>mksymlinks</code> more or less optional if you just want to use <code>spawn</code>.</p>
<p>Not much else too see apart from small bug fixes and documentation improvements.</p>
<p>Download <a href="https://github.com/downloads/laurentb/symfttpd/symfttpd-1.1.1.tar.bz2">symfttpd 1.1.1</a>.<br />
More information on <a href="https://github.com/laurentb/symfttpd">GitHub</a>.</p>
<p>There is also a <a href="https://github.com/fabriceb/symfttpd/tree/symfony2">adaptation</a> of the current code for usage with Symfony2. However, it removes support of 1.x versions; a multiple-application update of symfttpd is coming soon.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://laurent.bachelier.name/2011/02/symfttpd-1-1-1-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>symfttpd 1.1.0 released</title>
		<link>http://laurent.bachelier.name/2011/02/symfttpd-1-1-0-released/</link>
		<comments>http://laurent.bachelier.name/2011/02/symfttpd-1-1-0-released/#comments</comments>
		<pubDate>Thu, 03 Feb 2011 23:48:33 +0000</pubDate>
		<dc:creator>laurentb</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[lighttpd]]></category>

		<guid isPermaLink="false">http://laurent.bachelier.name/?p=237</guid>
		<description><![CDATA[This version brings one huge usability change: you don&#8217;t have to restart spawn anymore when a file is added in the web/ directory root. Enjoy being truly lazy! Along with some miscellaneous enhancements, the output of the tools is now colored, and you can display lighttpd&#8217;s logs in the terminal with the -t option. As [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:903e6777568523d183d477167ea1070e07bd0301'><p>This version brings one huge usability change: you don&#8217;t have to restart <code>spawn</code> anymore when a file is added in the <code>web/</code> directory root. Enjoy being truly lazy!</p>
<p>Along with some miscellaneous enhancements, the output of the tools is now colored, and you can display lighttpd&#8217;s logs in the terminal with the <code>-t</code> option.</p>
<p>As always, suggestions and contributions are welcome.</p>
<p>Download <a href="https://github.com/downloads/laurentb/symfttpd/symfttpd-1.1.0.tar.bz2">symfttpd 1.1.0</a>.<br />
More information on <a href="https://github.com/laurentb/symfttpd">GitHub</a>.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://laurent.bachelier.name/2011/02/symfttpd-1-1-0-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>More of me</title>
		<link>http://laurent.bachelier.name/2011/01/more-of-me/</link>
		<comments>http://laurent.bachelier.name/2011/01/more-of-me/#comments</comments>
		<pubDate>Mon, 31 Jan 2011 20:45:25 +0000</pubDate>
		<dc:creator>laurentb</dc:creator>
				<category><![CDATA[Meta]]></category>

		<guid isPermaLink="false">http://laurent.bachelier.name/?p=232</guid>
		<description><![CDATA[If the activity of my blog leaves you frustrated and demanding for more, rejoice! I am also writing on my employer&#8217;s blog.]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:16d93eb7337c2e8fe32eac0bbb05e05d9eac6686'><p>If the activity of my blog leaves you frustrated and demanding for more, rejoice! I am also writing on my <a href="http://www.theodo.fr/blog/">employer&#8217;s blog</a>.</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://laurent.bachelier.name/2011/01/more-of-me/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A positive note</title>
		<link>http://laurent.bachelier.name/2011/01/a-positive-note/</link>
		<comments>http://laurent.bachelier.name/2011/01/a-positive-note/#comments</comments>
		<pubDate>Mon, 31 Jan 2011 20:20:13 +0000</pubDate>
		<dc:creator>laurentb</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[symfttpd]]></category>

		<guid isPermaLink="false">http://laurent.bachelier.name/?p=230</guid>
		<description><![CDATA[I have grown very fond of Symfony 1.4. It&#8217;s pretty much Symfony 1.2 with all the quicks ironed out. It showed me how much polish is important in a software project. It&#8217;s almost all I have been doing in my own little project after the main features were implemented, symfttpd: making it less annoying to [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:bb66278d89610a1c6688cd7e7074f081b41e94a1'><p>I have grown very fond of Symfony 1.4. It&#8217;s pretty much Symfony 1.2 with all the quicks ironed out. It showed me how much <em>polish</em> is important in a software project.</p>
<p>It&#8217;s almost all I have been doing in my own little project after the main features were implemented, <a href="https://github.com/laurentb/symfttpd">symfttpd</a>: making it less annoying to use, less unpredictable, etc. And I must say, the current stable version has at least one very annoying quirk (but if it&#8217;s documented, does it count as a feature?).</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://laurent.bachelier.name/2011/01/a-positive-note/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Don’t forget the other kind of WTF</title>
		<link>http://laurent.bachelier.name/2010/08/dont-forget-the-other-kind-of-wtf/</link>
		<comments>http://laurent.bachelier.name/2010/08/dont-forget-the-other-kind-of-wtf/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 23:53:14 +0000</pubDate>
		<dc:creator>laurentb</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[wtf]]></category>

		<guid isPermaLink="false">http://laurent.bachelier.name/?p=195</guid>
		<description><![CDATA[Sometimes, the code looks good, but it doesn&#8217;t mean that the whole project in itself is good. First, a project should be simple to install. The install documentation should exist and always be up to date. I encounter too many projects where &#8220;inside knowledge&#8221; is required to install the application, and you don&#8217;t know if [...]]]></description>
			<content:encoded><![CDATA[<div class='microid-mailto+http:sha1:c04175613e3e20ff4a07ac0cf840ab340e34af5c'><p>Sometimes, the code looks good, but it doesn&#8217;t mean that the whole project in itself is good.</p>
<p>First, a project should be simple to install. The install documentation should exist and always be up to date. I encounter too many projects where &#8220;inside knowledge&#8221; is required to install the application, and you don&#8217;t know if it doesn&#8217;t work because you didn&#8217;t install it right or it just doesn&#8217;t work. There should be a single command (makefiles or shell scripts are here for that) for a single task. It should not require weird system settings (this is very annoying with PHP when a lot of the language is customizable through <code>php.ini</code>).</p>
<p>On a similar note, the architecture should be simple to comprehend. When it feels too much like &#8220;magic&#8221;, when a simple action has too many unsaid consequences, something is wrong. There should not be hundreds of classes and inheritances when an option would be enough (this is an idea found at least in Python and Symfony 1.4 that I quite like). Names should be readable and short, not everyone has or likes using auto-completion.</p>
<p>I&#8217;m not sure what creates this kind of WTF. Inexperienced but talented programmers? Programmers who think too high of themselves? Programmers that are <em>not</em><em> lazy enough?</em></p>
</div>]]></content:encoded>
			<wfw:commentRss>http://laurent.bachelier.name/2010/08/dont-forget-the-other-kind-of-wtf/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss><!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using memcached
Object Caching 740/853 objects using memcached

Served from: laurent.bachelier.name @ 2012-05-15 17:52:00 -->

