<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Fresh out of the labs</title>
	<atom:link href="http://blogea.bureau14.fr/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogea.bureau14.fr</link>
	<description>A collection of thoughts related to the challenges of software engineering</description>
	<lastBuildDate>Wed, 01 Feb 2012 09:16:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>NoSQL is a term doing us a disservice</title>
		<link>http://blogea.bureau14.fr/index.php/2012/02/nosql-is-a-term-doing-us-a-disservice/</link>
		<comments>http://blogea.bureau14.fr/index.php/2012/02/nosql-is-a-term-doing-us-a-disservice/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 09:16:36 +0000</pubDate>
		<dc:creator>Edouard</dc:creator>
				<category><![CDATA[technical]]></category>
		<category><![CDATA[acid]]></category>
		<category><![CDATA[altsql]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[rdbms]]></category>
		<category><![CDATA[transaction]]></category>
		<category><![CDATA[wrpme]]></category>

		<guid isPermaLink="false">http://blogea.bureau14.fr/?p=462</guid>
		<description><![CDATA[Although we edit NoSQL software, I always disliked calling our product a NoSQL database. I know we say in the third paragraph of our web page that wrpme is a NoSQL database, but see, right after it says that we prefer to call it a postmodern database as proposed by Dr. Richard Hipp. The obvious [...]]]></description>
			<content:encoded><![CDATA[<div align="center">
<img src="http://blogea.bureau14.fr/wp-content/uploads/2012/02/P1010276.jpg" alt="I, destructor" class="aligncenter size-full wp-image-442" width="425" height="319"/></div>
<p>Although we edit <a href="http://en.wikipedia.org/wiki/NoSQL">NoSQL</a> software, I always disliked calling our product a NoSQL database. I know we say in the third paragraph of <a href="http://www.wrpme.com/">our web page</a> that wrpme is a NoSQL database, but see, right after it says that we prefer to call it a postmodern database as proposed by <a href="http://www.hwaci.com/drh/">Dr. Richard Hipp</a>.</p>
<p>The obvious reason why we use this fancy word is because we’re French which makes us pretty much the pinnacle of snobbery and pedantry. The other reason is because we weren’t able to come up with a better term.</p>
<p>There’s also the thing that we don’t like NoSQL is because it’s a negative term that suggests our software is here to destroy Relational Database Management Systems (RDBMS) which are the one true evil.</p>
<p>I think I can safely say that no one is trying to destroy anything.</p>
<h2>Where I say good things about RDMBS</h2>
<p>I guess the NoSQL term originated from someone who was fed up with yet another pervert use of relational databases. </p>
<p>I’ve seen my share, I can relate to that feeling.</p>
<p>The first thing that comes to my mind is any software that uses a RDBMS to serialize data. That's pretty overkill, isn't it? After all, I however think I prefer the “one table to rule them all” scheme. Wait. One table is good, but, I’ve heard primary keys are good too so if we make everything a primary key it must be very good. Oh, and more indexes please, I can’t get enough of them. I know that I will somehow need to research those binary blobs, so index them please. And index the indexes to make the indexes faster.</p>
<p>So yes, it can get <em>very</em> silly.</p>
<p>Let’s not forget one thing though:  an incredible amount of intelligence has been poured for more than forty years into RDBMS. People much more intelligent than you, maybe almost as intelligent as us (and that’s saying a lot, see paragraph two), have worked very hard to solve extremely complex problems. And succeeded. </p>
<p>Please, please, please, make sure it dwells very well in your mind: RDBMS work, and they work reliability, and they can adapt to your business case very well, and they when you account everything they do. They have their limits - like everything in the universe - but every time you book a flight, order a book or send money they’re proving to yourself and to the world how dependable they are. </p>
<p>NoSQL engines are for the most part crude, useless and unreliable and as for us, we know we still have a long way to go in terms of flexibility, features and <em>proven</em> reliability.</p>
<p>When you complain that your relational database is too slow, the problem is not the database. The problem is most likely how you use it.</p>
<h2>Let’s talk performances</h2>
<div align="center">
<img src="http://blogea.bureau14.fr/wp-content/uploads/2012/02/speed_limit_curve_ahead_small.jpg" alt="Speed limit, curve ahead" class="aligncenter size-full wp-image-442" width="425" height="319"/></div>
<p>So, am I killing our business? Not really. </p>
<p>RDBMS are fast, but <del datetime="2012-01-31T17:10:44+00:00">NoSQL</del> postmodern databases can be <em>damn</em> fast. Although you may not need the speed, you may like the fact you need less computing power to handle the same load.</p>
<p>Additionally, to be fast, relational databases have to be used properly. Let’s be realistic for a second, it’s hard to be good at SQL. Non-relational databases are “more obvious” and closer to how the typical programmer thinks and for simple use cases you are most likely to do the right thing with a NoSQL engine than with a relational one.</p>
<p>Ever tried hammering a reasonably sized RDBMS with one thousand distinct clients? A real one? With <a href="http://en.wikipedia.org/wiki/ACID">atomic, consistent, isolated and durable (ACID)</a> transactions? With each client querying the database like there’s no freaking tomorrow? Did it also end up with a database administrator in the air vent with a crossbow aimed at you? I think I made my point.</p>
<p>RDBMS, in certain contexts, can be slow because one of their best features, ACID transactions, come with a hefty price. This is not because RDBMS are poorly done, it’s because to truly ensure that your transaction is atomic, consistent, isolated and durable <a href="http://en.wikipedia.org/wiki/Two-phase_commit_protocol">the database needs to do a lot of work</a>.</p>
<p>And while we’re on the topic of ACID transactions, this important feature is also the reason why they don’t scale very well. Distributing ACID transactions is difficult. You can’t just add commodity servers and expect a linear increase in performance. </p>
<p>Did I say difficult? I wanted to say near-impossible.</p>
<p>To scale a modern relational database, you partition data into buckets and spread the load over buckets (this is an over-simplification, but bear with me). This is called partitioning or sharding, depending on how you split the data. The limit with this approach is that it requires carefully planning the partitions as it’s much more difficult to adjust later. This is not unlike partitioning a hard drive when you install your operating system. This is generally not something you tweak later on production systems, even if you can.</p>
<p>I know, I know. Some new engines are coming out, claiming they can offer the speed of NoSQL and the reliability of ACID transactions. </p>
<p>Are they lying? </p>
<p>Well, we haven’t benchmarked them (yet), but one thing is certain: if they offer truly ACID transactions, they have a performance tax to pay. They can be clever about it and there’s clearly room for achieving great things, but they will always be disadvantaged.</p>
<p>In other words, state of the art relational databases with ACID transactions will always be an order magnitude slower than state of the art non-relational databases without ACID transactions.</p>
<h2>Let’s talk money</h2>
<p>The other big problem is that over time relational databases became bloated with “wtf” features, because you really need to be able to do Java inside SQL, right? </p>
<p>The dark shroud of enterprise software obfuscated the qualities of otherwise fine products. That means you will need someone to shepherd the weak through the valley of darkness: a database administrator. </p>
<p>Do you really need more weird people in your organization? I submit you do not.</p>
<p>Which brings us to a topic top management understands very well:  storage is an order of magnitude more expensive on relational databases. You see that terabyte drive you can buy for 50 €? Want to add a terabyte to your RDBMS? That will be 5 000 €, thank you very much (I’m not making this up).</p>
<p>This last piece of information probably helps you understand why there is a strong interest for non-relational databases as <a href="http://www.economist.com/node/21537922">we enter the yotta world</a>.</p>
<h2>When should you go non-relational?</h2>
<div align="center">
<img src="http://blogea.bureau14.fr/wp-content/uploads/2012/02/IMG_0359.jpg" alt="Architecture" class="aligncenter size-full wp-image-442" width="425" height="319"/></div>
<p>RDBMS are great, but they’re not great at everything and sometimes they truly suck. </p>
<p>That’s why we have non-relational databases, because if you throw away relations and transactions, you can do interesting things in terms of processing, scalability and pure performance.</p>
<p>But do you really want to throw away relations and transactions? Do you need to?</p>
<p>How many gadgets has Batman? We will agree on a number much greater than one. Since you’re probably an order of magnitude below Batman in terms of awesomeness, you will agree that you need to be at least as much prepared as he is. In other words: tool up.</p>
<p>That’s why, if you start a new project, you should definitely consider non-relational databases and include them in your architecture. I guarantee you that you have non-relational data that will be cheap and efficient to store in a post-modern database, and you might even be able to go fully non-relational! <a href="http://bureau14.fr/">Ask us</a> or our beloved competition if you need help.</p>
<p>For existing projects however, we’ve seen that many performance problems can be solved with database tuning and proper caching. </p>
<p>Nevertheless, once you have done that, you may still have performance issues. The thing to understand is that the transition from a relational to a partially (or fully) non-relational schema can be extremely disruptive. One approach is to locate the “hot” data and either duplicate or relocate it into a postmodern database.</p>
<p>I could write a lot more on this topic actually and there’s much to be said.</p>
<p>What I wanted to show is that NoSQL is more about shifting the balance a little less on the relational side than killing RDBMS. Maybe the term AltSQL is a better one as it is a reminder that we’re trying to find new, not trying to demean existing ones.</p>
<p>As for us we will stick to the term postmodern database for now and throw a party for overloading another customer’s network (true story that will be the topic of another post).</p>
]]></content:encoded>
			<wfw:commentRss>http://blogea.bureau14.fr/index.php/2012/02/nosql-is-a-term-doing-us-a-disservice/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The future is now</title>
		<link>http://blogea.bureau14.fr/index.php/2012/01/the-future-is-now/</link>
		<comments>http://blogea.bureau14.fr/index.php/2012/01/the-future-is-now/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 11:04:39 +0000</pubDate>
		<dc:creator>Edouard</dc:creator>
				<category><![CDATA[interlude]]></category>
		<category><![CDATA[robot]]></category>
		<category><![CDATA[space]]></category>

		<guid isPermaLink="false">http://blogea.bureau14.fr/?p=458</guid>
		<description><![CDATA[For New Year’s Eve, my significant other and I watched Quadrille . An elder man sat next to me and instead of patiently waiting for the play to start, he took his smartphone and played a game. A couple of weeks ago, a friend of mine had a heart attack. As he felt a strong [...]]]></description>
			<content:encoded><![CDATA[<p>For New Year’s Eve, my significant other and I watched <a href="http://fr.wikipedia.org/wiki/Quadrille_%28pi%C3%A8ce_de_th%C3%A9%C3%A2tre%29" title="Quadrille">Quadrille </a>. An elder man sat next to me and instead of patiently waiting for the play to start, he took his smartphone and played a game.</p>
<p>A couple of weeks ago, a friend of mine had a heart attack. As he felt a strong pain in both arms, he called for help. Less than fifteen minutes later firemen arrived and took him to the hospital. As soon as he arrived he was promptly directed to the operating theater. There, the doctors inserted a needle in his arm, acceded the heart, removed the thrombus and placed a stent. Two days later he was dismissed. Except for his daily medicine intake and a very small scar near the wrist, it’s impossible to know he had a heart attack less than a month ago.</p>
<p><a href="http://www.youtube.com/watch?v=e_lGPRIRG3Y&#038;feature=related">Cars no longer need people</a> to be operated and <a href="http://www.youtube.com/watch?v=zul8ACjZI18">robots move like humans</a>.  If you combine both, it’s not difficult to imagine fully automated delivery services. For example, you could order an item online and have it delivered to you without any human intervention.</p>
<p>And as I type these words, <a href="http://voyager.jpl.nasa.gov/">a man-made object is leaving the solar system</a>...</p>
<p>Happy new year 2012. Welcome to the future.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogea.bureau14.fr/index.php/2012/01/the-future-is-now/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parrots</title>
		<link>http://blogea.bureau14.fr/index.php/2011/11/parrots/</link>
		<comments>http://blogea.bureau14.fr/index.php/2011/11/parrots/#comments</comments>
		<pubDate>Sat, 05 Nov 2011 16:25:38 +0000</pubDate>
		<dc:creator>Edouard</dc:creator>
				<category><![CDATA[interlude]]></category>
		<category><![CDATA[parrot]]></category>
		<category><![CDATA[pet]]></category>
		<category><![CDATA[pirate]]></category>

		<guid isPermaLink="false">http://blogea.bureau14.fr/?p=441</guid>
		<description><![CDATA[Parrots are wonderful creatures of Earth. How many animals can you actually talk to? Not that many. One might retort that parrots only stupidly repeat what they hear. A valid point, except it's completely wrong. Parrots are amongst the most intelligent birds on Earth. Some species are even able to associate words with meanings. The [...]]]></description>
			<content:encoded><![CDATA[<div align="center"><img src="http://blogea.bureau14.fr/wp-content/uploads/2011/11/parrot_small.jpg" alt="Parrots" title="Parrots" width="425" height="282" class="aligncenter size-full wp-image-442" /></div>
<p>Parrots are wonderful creatures of Earth. How many animals can you actually talk to? </p>
<p>Not that many.</p>
<p>One might retort that parrots only <em>stupidly</em> repeat what they hear.  </p>
<p>A valid point, except it's completely wrong.</p>
<p>Parrots are amongst the most intelligent birds on Earth. Some species are even able to associate words with meanings. The African Grey Parrot, in particular, has a degree of intelligence comparable to dolphins and great apes. They understand our language to the point they can form sentences and even display a sense of humor.</p>
<p>Owning a parrot is a huge responsibility as it's likely to outlive you. Overmore, it will be depressed if you are gone missing for too long, is bored or hasn’t been bred properly. </p>
<p>Surely, the last thing you want is to have a bird looking at you with sad eyes as she loses her feathers.</p>
<p>On the other hand, if you have the time, dedication and patience, one day you will be able to walk around with your pet seating on your shoulder.</p>
<p>As she shares witty comments with the audience you will realize one thing: you just made one huge step toward becoming a mighty pirate.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogea.bureau14.fr/index.php/2011/11/parrots/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On quality and code size</title>
		<link>http://blogea.bureau14.fr/index.php/2011/09/on-quality-and-code-size/</link>
		<comments>http://blogea.bureau14.fr/index.php/2011/09/on-quality-and-code-size/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 19:13:30 +0000</pubDate>
		<dc:creator>Edouard</dc:creator>
				<category><![CDATA[technical]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[quality]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://www.bureau14.fr/blogea/?p=435</guid>
		<description><![CDATA[I recently came across a great blog post asserting - based on numerous studies - that size is the best predictor of code quality. According to my own experience, this is spot on. I can think of a couple of explanations: Concise code is generally the work of experienced and skilled developers. Removing dead code [...]]]></description>
			<content:encoded><![CDATA[<p>I recently came across <a href="http://blog.vivekhaldar.com/post/10669678292/size-is-the-best-predictor-of-code-quality">a great blog post</a> asserting - based on numerous studies - that size is the best predictor of code quality.</p>
<p>According to my own experience, this is spot on.</p>
<p>I can think of a couple of explanations:</p>
<ol>
<li>Concise code is generally the work of experienced and skilled developers.</li>
<li>Removing dead code greatly increases code quality.</li>
<li>Refactored code tends to be smaller (Adding features is not refactoring).</li>
</ol>
<p>Point 2 and 3 result in a smaller code base and are a sign of a continuous code review process ("no code is set in stone" principle). In my experience, re-reading the code regularly is one of the greatest contributors to code quality, much more than unit testing and continuous integration (which are nevertheless required to make frequent refactoring possible).</p>
<p>I know that the best bug fixes I did were generally fixes that reduced the line count. Those bug fixes were generally a case of <em>"Who the hell did something that complex for a problem that simple?! Oh wait, I did..."</em>.</p>
<p>In other words if you put efforts into code quality, this will generally result in reduced code size. This, to me, explains more the correlation between size and quality: concision is more an indicator of quality than a cause.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogea.bureau14.fr/index.php/2011/09/on-quality-and-code-size/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Talk less</title>
		<link>http://blogea.bureau14.fr/index.php/2011/03/talk-less/</link>
		<comments>http://blogea.bureau14.fr/index.php/2011/03/talk-less/#comments</comments>
		<pubDate>Mon, 28 Mar 2011 19:59:47 +0000</pubDate>
		<dc:creator>Edouard</dc:creator>
				<category><![CDATA[business]]></category>
		<category><![CDATA[meetings]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://www.bureau14.fr/blogea/?p=410</guid>
		<description><![CDATA[Few are agreeable in conversation, because each thinks more of what he intends to say than of what others are saying and listens no more when he himself has a chance to speak. -François de la Rochefoucauld You’ve certainly experienced reunions where you told yourself "This person isn’t saying anything interesting and this meeting is [...]]]></description>
			<content:encoded><![CDATA[<div align="center"><img src="http://www.bureau14.fr/blogea/wp-content/uploads/2011/03/silence.jpg" alt="Silence" title="Silence" width="480" height="399" class="aligncenter size-full wp-image-414" /></div>
<blockquote><p><em>Few are agreeable in conversation, because each thinks more of what he intends to say than of what others are saying and listens no more when he himself has a chance to speak.</em><br />
-François de la Rochefoucauld</p></blockquote>
<p>You’ve certainly experienced reunions where you told yourself <em>"This person isn’t saying anything interesting and this meeting is going nowhere."</em>.</p>
<p>In my case it's not really a problem since I'm the boss and I can punch people in the face and get away with it (you probably can't). By the way being allowed to kill people is one of the top reasons why you should start your own startup, provided you keep the death toll within the limits allowed by the law.</p>
<p>But I disgress. What can <strong>you</strong> do to help the meeting go somewhere?</p>
<p>As strange as it may sound talking less is part of the answer. This is because silence alleviates stress and forces oneself to actually listen. When you listen, you communicate better. Better communication means better meetings.</p>
<h2>An experiment</h2>
<p>At <a href="http://www.bureau14.fr"/ target="_blank">Bureau 14</a> we're pretty awesome scientists. And I'm not talking about all the computer science we do all day (C++ is more black magic than science actually), but more like the one that confirmed that interns can't survive without oxygen.</p>
<p>The one you can do is the following: the <strong>next meeting you attend, do not talk at all</strong>.</p>
<p>It’s highly likely you will notice the following things:</p>
<ol>
<li>Every attendant  is saying the same thing over and over with a varying degree of eloquence;</li>
<li>The amount and the distribution of information is unchanged by the meeting (unmodified entropy);</li>
<li>What you could have said wasn't that useful, intelligent or unique (ouch!).</li>
</ol>
<h2>Problem ? Solution ?</h2>
<p>You might tell me: <em>"I'm going to enforce some rule during meetings to fix that"</em>:</p>
<blockquote><p>Unless one has a genuine question, needs information or has something valuable and related to share there is absolutely no reason to speak.</p></blockquote>
<p>That sounds like a pretty obvious rule on which everybody could easily agree. But that would not change a thing.</p>
<p>Let's be realistic for a minute.</p>
<p>We all think that what we say is pretty clever. Actually what happens is that our overinflated ego makes us believe it's ok to reharse what the person next to us just said because, really, it's important to participate and it's less boring to spend one hour talking than listening and by the way it's probably a good opportunity to disgress and talk about the latest Family Guy episod.</p>
<p><em>Newsflash:</em> we're not that intelligent and what we have to say doesn't matter that much. Actually most of the time it's completely out of topic.</p>
<p>In other words, we may have the feeling to genuinely contribute when we aren't.</p>
<h2>Stop creating rules</h2>
<p>Stop believing that every problem must be taken in your own (capable?) hands and needs to be addressed. Stop "managing issues". This is something much more complex and inherent to human nature than just a "problem". It needs education.</p>
<p>The education process is a simple matter of forcing yourself to speak as little as possible, as if you were underwater and you had to keep your precious oxygen for mundane things such as staying alive. Everytime you want to speak, double check that it is relevant and new. Once you've double checked, check again, and again. Listen more, observe.</p>
<p>After a while, you will talk less, be more relaxed and listen more. You'll be a better participant and people will look after your presence. This is the moment when you will realize that contributing to the success of your company is more a matter of listening than a matter of talking.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogea.bureau14.fr/index.php/2011/03/talk-less/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Am I getting too old for this?</title>
		<link>http://blogea.bureau14.fr/index.php/2010/09/am-i-getting-too-old-for-this/</link>
		<comments>http://blogea.bureau14.fr/index.php/2010/09/am-i-getting-too-old-for-this/#comments</comments>
		<pubDate>Mon, 27 Sep 2010 17:46:30 +0000</pubDate>
		<dc:creator>Edouard</dc:creator>
				<category><![CDATA[business]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://www.bureau14.fr/blogea/?p=396</guid>
		<description><![CDATA[<p>I thought I took enough care of myself to further postpone this day...</p>]]></description>
			<content:encoded><![CDATA[<div align="center"><img src="http://www.bureau14.fr/blogea/wp-content/uploads/2010/09/facepalm.jpg" alt="" title="Facepalm" width="480" height="320" class="aligncenter size-full wp-image-398" /></div>
<p>I thought I took enough care of myself to further postpone this day...</p>
<p>I have a balanced diet. I exercise at least four hours per week. I don’t smoke. I certainly do not fry my brain with illicit substances. I sleep regularly, well and enough. Well except when I have to wake up at three in the morning to catch a plane back to Paris and lose my bag in the taxi. Ah! The stress! That reminds me I’ll have to buy myself a <a href="http://www.gulfstream.com/products/g550/">G550</a> when <a href="http://www.bureau14.fr/">Bureau 14</a> rules the world.</p>
<p>For the record, Zeus tried to strike me with lightning several times out of jealousy. I had to climb the Olympus for a private “exhibit” of my Wing Tsun. No wonder I don’t have time for programming with all these delays. For the record the game <a href="http://www.youtube.com/watch?v=ssrKvNVJ41k" target="_blank">God of War 3</a> is based on my story.</p>
<p>Well, guess what?  Despite all of this, I’m obviously a brain-dead old man as I reach the extremely advanced age of 33.</p>
<p>What the hell am I talking about? <a href="http://www.google.com/instant/">Google Instant</a>! I mean what the Hell?! I feel like I’m using software for hyperactive kids drinking liters of a homemade mix of cocaine and caffeine.</p>
<p>First of all I don’t think the spider is crawling the web according to my search requests, so don’t call it real time search thank you very much. In the finance industry we call the stock streams real-time although they have at least 15 minutes of delay, but we have the right to because we’re bankers and bankers have no soul.</p>
<p>Second Google Instant is extremely confusing. I'm not a designer, but I’m pretty sure it’s a big design mistake to display partial – and potentially unwanted – results in the same place as normal results.</p>
<p>Last but not least, I don’t understand how this is supposed to “save time”. All it does is request searches for items I’m not interested in. Despite me being an old crank, I’m quite able to press the enter key when needed! It’s a waste of bandwidth and CPU time if anything. Visual feedback gives you the illusion of speed, like a progress bar reduces the impression of waiting, but that’s all it is: <em>an illusion</em>.</p>
<p>The heart of the problem is that it’s not just an illusion, it’s also <em>a distraction</em>. It’s not real time search it’s real time advertisement. It feels like watching American TV: there are so many commercials that after a while you forget what you were watching in the first place.</p>
<p>It's pretty clear to me that the purpose of this feature is not to ease my searches it’s to tease me with links. The purpose of Google instant is to increase Google’s revenues.</p>
<p>To that I say: fair enough. Google isn’t a philanthropic institution and as an entrepreneur I fully understand they do everything they can to maximize profits. As an user however I’m dissatisfied.</p>
<p>The feature of Google I like the most is accurate and fast search. As long as they keep improving it that keeps me happy. Although to make me really happy, I’d love them to stop that data-based design nonsense and hire top notch designers to make something of their websites. I'll be 100% honest however and admit that it would only be ice on the cake (That being said, there is to me a market for a web application that does a better job at presenting Google’s results than Google).</p>
<p>In the end, I really don’t understand Google Instant. What am I missing? I am just too old to get it? Or is Google Instant just too nerdy?</p>
]]></content:encoded>
			<wfw:commentRss>http://blogea.bureau14.fr/index.php/2010/09/am-i-getting-too-old-for-this/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Ah! The mirth!</title>
		<link>http://blogea.bureau14.fr/index.php/2010/09/ah-the-mirth/</link>
		<comments>http://blogea.bureau14.fr/index.php/2010/09/ah-the-mirth/#comments</comments>
		<pubDate>Mon, 13 Sep 2010 18:56:01 +0000</pubDate>
		<dc:creator>Edouard</dc:creator>
				<category><![CDATA[business]]></category>
		<category><![CDATA[humor]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[team]]></category>

		<guid isPermaLink="false">http://www.bureau14.fr/blogea/?p=382</guid>
		<description><![CDATA[When was the last time you laughed at work? Yesterday? Last week? Last month? You don’t even remember?]]></description>
			<content:encoded><![CDATA[<div align="center">
<img src="http://www.bureau14.fr/blogea/wp-content/uploads/2010/09/IMG_1145.jpg" alt="" title="Destroy him my robots!" width="480" height="320" class="aligncenter size-full wp-image-386" />
</div>
<p>When was the last time you laughed at work? Yesterday? Last week? Last month? You don’t even remember?</p>
<p>Do not make the mistake of thinking that a place where you regularly laugh is a place where nothing gets done. Quite the contrary.</p>
<p>Serious work requires – amongst other things – <em>concentration</em>, <em>cohesion</em> and <em>fluent communication</em>. Laughter is an outstanding catalyst for all these things.  </p>
<p>If you want <em>a spark of creativity</em> to light a team of competent and intelligent people, mirth is what you need. The thrill and energy that fills you when you shared a good laugher is an incredible creativity booster. </p>
<p>Amusement is very good for bounding as well. Is there a need to demonstrate you like to work with people with whom you have fun?</p>
<p>Finally, humor encourages direct communication. You’ll feel more comfortable to discuss mistakes and errors without unnecessary ado when the mood is joyful.</p>
<p>If we were pirates on a ship we would sing merry songs to achieve this result, but geeks in an office prefer to crack up dark jokes.</p>
<p>When I interview people, I do my best to pin down their ability to get along with the rest of the team and to be honest with you, I test their wit.</p>
<p>Using humor during interviews has got the incredible side effect of detecting flexibility and (some sort of) cleverness. For example, asking a candidate if he tends to stab colleagues with whom he disagrees opens the door to a very unusual but effective test of personality. You might even add that a past of serial killer is <em>generally</em> a recruitment’s deterrent.</p>
<p>We’re looking for competent, bright and insightful people that will resist pressure and are fun to be around. Of course we’re not hiring comedians as we want – first of all – people to be able to write outstanding software. </p>
<p>When the team is under pressure because of an angry customer, that a flurry of bugs magically appeared in the repository (really, it can’t be me!) and everybody is working too much, being around people with whom you can blow off steam is a much better feat than free gourmet food or complimentary massages.</p>
<p>To be completely honest with you, there’s also the <em>thing </em> related to the fact that we can’t afford the free gourmet food.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogea.bureau14.fr/index.php/2010/09/ah-the-mirth/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Please don&#8217;t forget the invoice</title>
		<link>http://blogea.bureau14.fr/index.php/2010/07/please-dont-forget-the-invoice/</link>
		<comments>http://blogea.bureau14.fr/index.php/2010/07/please-dont-forget-the-invoice/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 18:48:12 +0000</pubDate>
		<dc:creator>Edouard</dc:creator>
				<category><![CDATA[business]]></category>
		<category><![CDATA[invoices]]></category>

		<guid isPermaLink="false">http://www.bureau14.fr/blogea/?p=375</guid>
		<description><![CDATA[<p>When I order software online, I'm always surprised to see my confirmation email and my registration code come <em>without</em> an invoice.</p>
]]></description>
			<content:encoded><![CDATA[<p>When I order software online, I'm always surprised to see my confirmation email and my registration code come <em>without</em> an invoice.</p>
<p>Invoices are generally useless for individuals, but they are a necessity for companies.</p>
<p>They are required because your local <del datetime="2010-07-11T18:25:30+00:00">doom kommando</del> fiscal administration will ask for them as a proof you did indeed spend the money. And before they ask for them, your accountant will because if you want him to put his John Hancock on your anual report, you better make sure it's pretty clean of vague, non-business releated  entries such as "<a href="http://en.wikipedia.org/wiki/Aston_Martin_DB9">DB9</a> leasing" and "Casino losses".</p>
<p>The invoice must have the name of the company, its registration number, an address (including the country), the name of the customer, the name of the customer's company (if any), the items list with a clear and consise description for each - don't scratch your head as long as the word "software" is in the description, the accountant will understand what it's all about - a price and finally the taxes and a grand total. Export that in a printable format (PDF is a <em>de facto</em> standard) and attach it to all your confirmation emails.</p>
<p>What I just said might sound extremely silly, but for ten software licenses I bought I received a valid invoice only three times. Generally speaking I'm more inclined to do business with companies that make my life easier.</p>
<p>Make sure you have all the details of your business process straight.</p>
<blockquote><p>By the way, Hi! How are you doing? Long time no see! <a href="http://www.bureau14.fr/">Here</a>, we're going great and are working very hard on our first product!</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blogea.bureau14.fr/index.php/2010/07/please-dont-forget-the-invoice/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Setting up a high performance wordpress server</title>
		<link>http://blogea.bureau14.fr/index.php/2010/04/setting-up-a-high-performance-wordpress-server/</link>
		<comments>http://blogea.bureau14.fr/index.php/2010/04/setting-up-a-high-performance-wordpress-server/#comments</comments>
		<pubDate>Sun, 18 Apr 2010 11:50:53 +0000</pubDate>
		<dc:creator>Edouard</dc:creator>
				<category><![CDATA[technical]]></category>
		<category><![CDATA[freebsd]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.bureau14.fr/blogea/?p=359</guid>
		<description><![CDATA[<p>Our website isn't critical, in the sense that, if the website goes down, our operations remain unaffected.  However, lately, the website was becoming extremely slow and it was turning into bad publicity.</p>]]></description>
			<content:encoded><![CDATA[<p>Our website isn't critical, in the sense that, if the website goes down, our operations remain unaffected.  However, lately, the website was becoming extremely slow and it was turning into bad publicity.</p>
<p>Over the time I grew tired of this slowness until, one day, I decided to address the issue once for all. I bought a dedicated server, installed FreeBSD, nginx and everything needed to have our corporate website and the blog running and decommissioned the old server.</p>
<p>Unfortunately, you may have noticed that this last week, the quality of service was pretty low. This is entirely my fault as I switched to the new server too quickly.</p>
<p>Nevertheless, we're now pretty satisfied with the responsiveness and resource consumtion of the new production environment.</p>
<p>This post is a recollection of the steps I went through last week.</p>
<h2>Gearing up</h2>
<p>We  generally favor a <a href="http://en.wikipedia.org/wiki/List_of_BSD_operating_systems">BSD setup</a> for servers. We've had very good experience with <a href="http://www.microsoft.com/windowsserver2008/en/us/default.aspx">Windows Server 2008</a> and <a href="http://www.ubuntu.com/products/whatIsubuntu/serveredition">Ubuntu Server Edition</a> but whenever we can, we go BSD because that's what l33t d00dz do.</p>
<p>Ideally we would have opted for <a href="http://www.openbsd.org/">OpenBSD</a>, but OpenBSD dedicated hosting is extremely hard to come by, and we wanted to have provider support for the OS. We didn't want to get a random Linux box and bootstrap an OpenBSD installation on it. If ever we got a problem with the box at some point, the support would have answered <em>"please use a supported operating system"</em>.</p>
<p><a href="http://www.freebsd.org/">FreeBSD</a> remains an outstanding server operating system, and we happily leased a FreeBSD box with much more disk space and computing power we need.</p>
<p>When considering which webserver to use, this is a no-brainer: you want speed, you chose <a href="http://www.nginx.net">nginx</a>.</p>
<p>As we use WordPress for the blog, it means we'll also have to install <a href="http://www.mysql.com/">MySQL</a>.</p>
<h2>FreeBSD</h2>
<p><a href="http://www.freebsd.org/">FreeBSD</a> isn't <a href="http://www.openbsd.org/">OpenBSD</a> when it comes to security, but the default security configuration is pretty decent if you opt for a minimal install.</p>
<p>The first good reflex is to set up <a href="http://www.openbsd.net/faq/pf/index.html">PF</a> to only allow incoming transmission to the SSH server and the web server. It can also be used to normalize the incoming packets and protect against spoofing.</p>
<blockquote><p>
In case you were wondering what PF is, well, put simply, <strong>PF is the best IP filter available</strong>. Its strength comes from its clear and unambiguous  grammar and its linear complexity. What do I mean by linear complexity? If you have a simple setup, your configuration file will be small and simple. If you have more advanced needs, the grammar enables you to go very deep in the details. It's one of these products you test and never look back.
</p></blockquote>
<p>Without any further ado, here is a minimal PF configuration file with normalization, antispoofing and only ssh and https incoming traffic allowed:</p>
<div class="codecolorer-container bash twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># skip the loopback</span><br />
<span style="color: #000000; font-weight: bold;">set</span> skip on lo<br />
<span style="color: #666666; font-style: italic;"># packet normalization</span><br />
scrub <span style="color: #000000; font-weight: bold;">in</span> <br />
<span style="color: #666666; font-style: italic;"># block everything in </span><br />
block <span style="color: #000000; font-weight: bold;">in</span><br />
pass out keep state<br />
<span style="color: #666666; font-style: italic;"># antispoofing</span><br />
antispoof quick <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span> lo <span style="color: #007800;">$ext_if</span> <span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<span style="color: #666666; font-style: italic;"># allow ssh and web in</span><br />
pass <span style="color: #000000; font-weight: bold;">in</span> on <span style="color: #007800;">$ext_if</span> proto tcp to <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">$ext_if</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> port \<br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">&#123;</span> <span style="color: #c20cb9; font-weight: bold;">ssh</span>, http, https <span style="color: #7a0874; font-weight: bold;">&#125;</span> flags S<span style="color: #000000; font-weight: bold;">/</span>SA modulate state</div></div>
<p>A good security habit - which is not limited to FreeBSD - is to set up a non-root account, disable ssh root login (an option in /etc/ssh/sshd_config) and use sudo and su when privileges are needed (your additional account needs to be in the wheel group for this to work).</p>
<p>SSH login should be done only via a key and the password for all the accounts need to be extremely strong (more than 100-bit of entropy). Using SSH keys for login makes it possible to use extremely strong password.</p>
<p>It is possible to setup the SSH server to listen on a different port than 22, but it might be incompatible with your local firewall policy. When you do that, make sure that you have a way to access your box should something go wrong.</p>
<p>A good sanity check is that when you run the "netstat -an" command, you should only see the SSH server listening to the outside. All other servers must be bound to localhost (or better, an unix socket). I know we set up a firewall to protect against that kind of attacks, but good security is achieved through redundancy.</p>
<p>Recompiling the kernel and getting rid of everything you don't use is a nice final touch. Why have IPV6 when your server is only IPV4? If your machine got rooted via IPV6, would you be able to realize it easily?</p>
<p>Recompiling the kernel on BSD requires creating a configuration file, compiling it with <a href="http://www.freebsd.org/cgi/man.cgi?query=config&#038;apropos=0&#038;sektion=0&#038;manpath=FreeBSD+8.0-RELEASE&#038;format=html">config(5)</a> and then run make. It's a bit less user friendly than in Linux (as far as kernel compilation friendliness goes).</p>
<h2>nginx</h2>
<p><a href="http://nginx.net/">nginx</a> is an excellent webserver, with a very low memory footprint and very high capability. I've spent a great deal of time inside the bowels of this software and although I regret the choice of old-school C (over template-intensive C++), I really think it's a nice piece of software. It's clean, rigorous and consistent. Our industry needs more software of this quality.</p>
<p><strong>nginx has got an extremely good security history</strong> and is delivered secure by default. It doesn't mean the default configuration cannot be improved.</p>
<p>The most obvious is to limit the number of connections per client, set up more aggressive timeouts and limit the buffers' size a client might send. This offers some minimal protection against <a href="http://en.wikipedia.org/wiki/Denial-of-service_attack">DoS</a>. Tread carefully however as they can have a bad impact on performance.</p>
<p>You can restrict things further by only allowing GET, HEAD and POST commands, denying all these weird HTTP requests you never use.<br />
Last but not least, you will want to hide the <a href="http://nginx.net/">nginx</a> version you are using, no need to make exploit lookup easier, isn't it?</p>
<p>In the http section you will therefore want to add the following:</p>
<div class="codecolorer-container ruby twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;"># hide nginx version</span><br />
server_tokens off;<br />
<span style="color:#008000; font-style:italic;"># limit connections</span><br />
limit_zone slimits <span style="color:#ff6633; font-weight:bold;">$binary_remote_addr</span> 5m;<br />
limit_conn slimits <span style="color:#006666;">20</span>;<br />
<span style="color:#008000; font-style:italic;"># set up restricting client buffers</span><br />
client_header_buffer_size 4k;<br />
client_max_body_size 5M;<br />
large_client_header_buffers <span style="color:#006666;">2</span> 8k;<br />
<span style="color:#008000; font-style:italic;"># set up aggressive timeouts</span><br />
client_body_timeout &nbsp; <span style="color:#006666;">10</span>;<br />
client_header_timeout <span style="color:#006666;">10</span>;<br />
keepalive_timeout &nbsp; &nbsp; <span style="color:#006666;">5</span> <span style="color:#006666;">5</span>;<br />
send_timeout &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color:#006666;">10</span>;</div></div>
<p>and in the server section</p>
<div class="codecolorer-container ruby twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;"># only allow GET, HEAD and POST</span><br />
<span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span>$request_method !~ ^<span style="color:#006600; font-weight:bold;">&#40;</span>GET<span style="color:#006600; font-weight:bold;">|</span>HEAD<span style="color:#006600; font-weight:bold;">|</span>POST<span style="color:#006600; font-weight:bold;">&#41;</span>$ <span style="color:#006600; font-weight:bold;">&#41;</span> <br />
<span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#006666;">444</span>;<br />
<span style="color:#006600; font-weight:bold;">&#125;</span></div></div>
<p>Using a dedicated partition is a possibility. It enables you to prohibit features such as setuid bits and even executable permissions at the partition level. It also protects against flooding, should your users be able to upload content.</p>
<p>The drawback of using a dedicated partition is that it makes space (re)allocation more difficult.</p>
<h2>MySQL</h2>
<p>If you ask me, I'll tell you that relational databases are overused. But we didn't program WordPress, and WordPress only works with <a href="http://www.mysql.com/">MySQL</a>, we therefore need to install it on the box.</a></p>
<p>Set up a strong password for the MySQL root account and add another account that will have only access to the databases your web server will use. <strong>Never use the root account to access your tables from a web server</strong>, this is a major security risk.</p>
<p>If for any reason you lose the control of your web server, or someone achieves to extract the login credentials, they will only be able to access your web server database. With the root account, the attacker would - for example - be able to create accounts and even lock you out of your databases!</p>
<p>Additionally, you need to make sure that MySQL only listen to an unix socket (if the MySQL server sits on the same server than nginx), this is done with the option "--skip-networking".</p>
<p>I strongly recommend against installing <a href="http://www.phpmyadmin.net/">phpMyAdmin</a> or any equivalent software on production machines.</p>
<h2>PHP</h2>
<p>On FreeBSD, <a href="http://www.php.net/">PHP</a> comes by default with a decent security configuration, including the <a href="http://www.hardened-php.net/">Suhosin</a> patch, which is much better that the safe mode.</p>
<p>Nevertheless, it's good to disable all the extensions you're not going to use, not only this will increase stability and decrease memory usage, but it will reduce the attack surface.</p>
<p>Install <a href="http://www.php.net/">PHP 5</a> from the ports where you will be able to activate FastCGI, this is important as <a href="http://www.nginx.net">nginx</a> doesn't have a <em>native</em> PHP support <em>à l'Apache</em>.</p>
<h2>Configuring the PHP FastCGI server</h2>
<p><strong>The PHP FastCGI server exits after a certain number of requests is done.</strong> Since PHP isn't a very stable parser, preventing it from running a long time increases resilience. The drawback is that you have to keep the server running manually.</p>
<p>We will use <a href="http://cr.yp.to/daemontools.html">daemontools</a> to keep the FastCGI server up, but any <em>process monitor</em> will do.</p>
<p>It's advised to use <a href="http://redmine.lighttpd.net/projects/spawn-fcgi">spawn-fcgi</a> to run your PHP FastCGI server, as it will enable you to set finer privileges and it works very well with <a href="http://cr.yp.to/daemontools.html">daemontools</a>.</p>
<p>Here is a <em>run script</em> example for <a href="http://cr.yp.to/daemontools/supervise.html">supervise</a>:</p>
<div class="codecolorer-container bash twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/bin/sh</span><br />
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PHP_FCGI_CHILDREN</span>=<span style="color: #000000;">3</span><br />
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PHP_FCGI_MAX_REQUESTS</span>=<span style="color: #000000;">250</span><br />
<span style="color: #7a0874; font-weight: bold;">exec</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>spawn-fcgi <span style="color: #660033;">-n</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>php_fcgi.socket \<br />
&nbsp; &nbsp; <span style="color: #660033;">-u</span> www <span style="color: #660033;">-U</span> www <span style="color: #660033;">-g</span> www \<br />
&nbsp; &nbsp; <span style="color: #660033;">--</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>php-cgi</div></div>
<p>You can see that we bind the FastCGI server to an unix socket instead of a TCP port.</p>
<h2>Adding PHP support to nginx</h2>
<p>nginx needs to be configured to redirect php parsing to the FastCGI server, you just need to add the following to your server section:</p>
<div class="codecolorer-container ruby twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">index index.<span style="color:#9900CC;">php</span>;<br />
&nbsp; &nbsp; <br />
log_not_found off;<br />
<br />
location ~ \.<span style="color:#9900CC;">php</span>$ <br />
<span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; try_files <span style="color:#ff6633; font-weight:bold;">$uri</span> = <span style="color:#006666;">404</span>;<br />
&nbsp; &nbsp; fastcgi_index &nbsp; index.<span style="color:#9900CC;">php</span>;<br />
&nbsp; &nbsp; fastcgi_param &nbsp; SCRIPT_FILENAME \<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#ff6633; font-weight:bold;">$document_root</span>$fastcgi_script_name;<br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">include</span> &nbsp; &nbsp; &nbsp; &nbsp; fastcgi_params;<br />
&nbsp; &nbsp; fastcgi_pass &nbsp; &nbsp;127.0.0.1:<span style="color:#006666;">9000</span>;<br />
&nbsp;<span style="color:#006600; font-weight:bold;">&#125;</span></div></div>
<p>While we are at it, we will add the required lines to make WordPress work nicely. We need to make sure that WordPress' crafted URLs are not interpreted as 404 by the nginx server:</p>
<div class="codecolorer-container ruby twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">location <span style="color:#006600; font-weight:bold;">/</span>blog<br />
<span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; try_files <span style="color:#ff6633; font-weight:bold;">$uri</span> <span style="color:#ff6633; font-weight:bold;">$uri</span><span style="color:#006600; font-weight:bold;">/</span> <span style="color:#0066ff; font-weight:bold;">@wp_blog</span>;<br />
<span style="color:#006600; font-weight:bold;">&#125;</span> &nbsp;<br />
<br />
location <span style="color:#0066ff; font-weight:bold;">@wp_blog</span><br />
<span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">include</span> &nbsp; &nbsp; &nbsp; &nbsp; fastcgi_params;<br />
&nbsp; &nbsp; fastcgi_param &nbsp; SCRIPT_FILENAME \<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#ff6633; font-weight:bold;">$document_root</span><span style="color:#006600; font-weight:bold;">/</span>blog<span style="color:#006600; font-weight:bold;">/</span>index.<span style="color:#9900CC;">php</span>;<br />
&nbsp; &nbsp; fastcgi_param &nbsp; QUERY_STRING q=$uri<span style="color:#006600; font-weight:bold;">&amp;</span>$args;<br />
&nbsp; &nbsp; fastcgi_pass &nbsp; &nbsp;unix:<span style="color:#006600; font-weight:bold;">/</span>tmp<span style="color:#006600; font-weight:bold;">/</span>php_fcgi.<span style="color:#9900CC;">socket</span>;<br />
&nbsp; &nbsp; fastcgi_param &nbsp; SCRIPT_NAME <span style="color:#006600; font-weight:bold;">/</span>blog<span style="color:#006600; font-weight:bold;">/</span>index.<span style="color:#9900CC;">php</span>;<br />
<span style="color:#006600; font-weight:bold;">&#125;</span></div></div>
<p>Note that you need to replace "/blog"  with the actual path to your blog and fastcgi_pass will require the hostname and port to your FastCGI server (127.0.0.1:9000 by default, in our case we use an unix socket).</p>
<p>Now that your web server is set up, you might want to be able to monitor its activity. You can do this with <a href="http://www.nginx.eu/nginx-rrd.html">nginx-rrd</a>. I won't go too much into the details, just make sure you don't make your status page world readable.</p>
<h2>Installing WordPress</h2>
<p>Despite the recurring security issues of <a href="http://wordpress.org/">WordPress</a>, we didn't want to switch to another engine. WordPress is full featured, very well supported and well, <a href="http://www.supercloud.com/">Matt</a> already did an incredible layout for the blog...</p>
<p>Making WordPress work with nginx is everything but straightforward. The good news is that we've already done the toughest.</p>
<p>Before installing WordPress, create a dedicated database and user with MySQL, as using root to access a shared database is a very bad idea (<em>bis repetita placent</em>).</p>
<p>Once you have your database credentials working, you can install WordPress in following the infamous <a href="http://codex.wordpress.org/Installing_WordPress#Famous_5-Minute_Install">5-Minute install procedure</a>.</p>
<p>WordPress only requires you to edit one configuration file: <em>wp-config.php</em>. You will also see four entries named AUTH_KEY, SECURE_AUTH_KEY, LOGGED_IN_KEY and NONCE_KEY require a passphrase. Generate a cryptographically strong passphrase with the following command:</p>
<div class="codecolorer-container bash twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">dd</span> <span style="color: #007800;">if</span>=<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>random <span style="color: #007800;">bs</span>=<span style="color: #000000;">32</span> <span style="color: #007800;">count</span>=<span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">|</span> sha256</div></div>
<p>The last line - the hexadecimal number - is your secure passphrase. Now your friends will look at you differently.</p>
<p>For our setup we have only one mandatory plugin: the <a href="http://wordpress.org/extend/plugins/nginx-compatibility/">nginx compatibility</a> one. Should you wish to increase performance, <a href="http://wordpress.org/extend/plugins/wp-super-cache/">WP Super Cache</a> is highly recommended.</p>
<h2>Installing memcached?</h2>
<p>If you run a high-traffic web site, you will need to install a cache server.</p>
<p><a href="http://memcached.org/">memcached</a> is supported by WordPress through this <a href="http://plugins.trac.wordpress.org/browser/memcached/trunk">plugin</a>. I do not know how it cooperates with <a href="http://wordpress.org/extend/plugins/wp-super-cache/">WP Super Cache</a>, but I submit the two are mutually exclusive.</p>
<blockquote>
<p>At <a href="http://www.bureau14.fr/">Bureau 14</a>, we don't use memcached for the very simple reason we've developed our own high-performance cache engine that runs faster and scales better. It also comes with more fur. Don't worry, we won't keep this software to ourselves for ever: we will run a closed beta this summer. Should you wish to know more, feel free to <a href="mailto:announce-subscribe@bureau14.fr">subscribe to our mailing list</a>.</p>
</blockquote>
<p>Using memcached (or any cache engine) for static files generally yields no performance improvement. The reason is that nginx already caches static files.</p>
<h2>Closing words</h2>
<p>Although this setup is not as straightforward as the classic Linux/Apache combo, I truly think you will find the trouble to be worth it.</p>
<p>We surely do.</p>
<blockquote><p>
Do you need help tuning and securing your servers? <a href="http://www.bureau14.fr/conseil">We can help</a>.
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blogea.bureau14.fr/index.php/2010/04/setting-up-a-high-performance-wordpress-server/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Up and down</title>
		<link>http://blogea.bureau14.fr/index.php/2010/04/up-and-down/</link>
		<comments>http://blogea.bureau14.fr/index.php/2010/04/up-and-down/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 06:09:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[interlude]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://www.bureau14.fr/blogea/?p=357</guid>
		<description><![CDATA[<p>The server is going up and down as we tune it for maximum performance. We apologize for the poor service quality.</p>]]></description>
			<content:encoded><![CDATA[<p>The server is going up and down as we tune it for maximum performance. We apologize for the poor service quality.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogea.bureau14.fr/index.php/2010/04/up-and-down/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

