<?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>Dan Cryer - Leeds Web Developer</title>
	<atom:link href="http://www.dancryer.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.dancryer.com</link>
	<description>Dan Cryer - Leeds Web Developer</description>
	<lastBuildDate>Wed, 03 Mar 2010 13:07:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>I&#8217;m an uncle again!</title>
		<link>http://www.dancryer.com/2010/02/im-an-uncle-again</link>
		<comments>http://www.dancryer.com/2010/02/im-an-uncle-again#comments</comments>
		<pubDate>Fri, 26 Feb 2010 17:45:21 +0000</pubDate>
		<dc:creator>Dan Cryer</dc:creator>
				<category><![CDATA[Other Things]]></category>
		<category><![CDATA[life]]></category>

		<guid isPermaLink="false">http://www.dancryer.com/?p=495</guid>
		<description><![CDATA[I&#8217;m a bit late in making this post, as it&#8217;s almost week-old news, but I&#8217;ve been waiting for the pictures to go up on Facebook before I posted anything.
My sister had her second child on Saturday 20th February, baby Nathan. He weighed in at exactly eight pounds, with blond hair and apparently, big hands and [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-medium wp-image-496" title="Baby Nathan" src="http://www.dancryer.com/wp/wp-content/uploads/2010/02/nathan-300x225.jpg" alt="Baby Nathan" width="300" height="225" />I&#8217;m a bit late in making this post, as it&#8217;s almost week-old news, but I&#8217;ve been waiting for the pictures to go up on Facebook before I posted anything.</p>
<p>My sister had her second child on Saturday 20th February, baby Nathan. He weighed in at exactly eight pounds, with blond hair and apparently, big hands and feet!</p>
<p>So I&#8217;m &#8220;Uncle Dan&#8221; for a fourth time! It doesn&#8217;t matter how many times that happens, it&#8217;s still just as amazing and exciting as the first.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dancryer.com/2010/02/im-an-uncle-again/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Opinions: Encouraging Comments and DoFollow Links</title>
		<link>http://www.dancryer.com/2010/02/encouraging-comments-and-dofollow-links</link>
		<comments>http://www.dancryer.com/2010/02/encouraging-comments-and-dofollow-links#comments</comments>
		<pubDate>Mon, 22 Feb 2010 22:26:06 +0000</pubDate>
		<dc:creator>Dan Cryer</dc:creator>
				<category><![CDATA[Search Engine Optimisation]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[blogging]]></category>

		<guid isPermaLink="false">http://www.dancryer.com/?p=485</guid>
		<description><![CDATA[Since I started blogging early last year, I&#8217;ve noticed that I tend to get more feedback on my posts on Twitter (and now Google Buzz) than I do on my blog itself. Comments come rarely and are far outnumbered by the number of spam ones Akismet blocks for me. Now, I don&#8217;t blog for the [...]]]></description>
			<content:encoded><![CDATA[<p>Since I started blogging early last year, I&#8217;ve noticed that I tend to get more feedback on my posts on Twitter (and now Google Buzz) than I do on my blog itself. Comments come rarely and are far outnumbered by the number of spam ones Akismet blocks for me. Now, I don&#8217;t blog for the sake of getting comments, but I&#8217;d like to encourage discussion on the blog from people who are working on similar problems or could use some help, but I&#8217;m not quite sure how.</p>
<p>One thing I&#8217;ve thought about before is turning off the &#8220;nofollow&#8221; attribute in my comments to allow people to get a link that counts for something when they post on my blog. Obviously I&#8217;d need to monitor my comments more closely, but I can only see that as being a good thing. It could also spark &#8220;shallow&#8221; commenting that is designed purely to get a link out from the blog, rather than to promote actual discussion, which is definitely not what I&#8217;m looking for.</p>
<p>What sparked this post is a video Matt Cutts just posted, here&#8217;s what he has to say about the idea:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="560" height="340" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/NQfOhncTXRU&amp;hl=en_US&amp;fs=1&amp;rel=0" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="560" height="340" src="http://www.youtube.com/v/NQfOhncTXRU&amp;hl=en_US&amp;fs=1&amp;rel=0" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>I&#8217;d really appreciate some feedback on this one, what do you think about the idea? Is it a bad way to encourage commenting? Would it work? Have you done the same or done it and changed back?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dancryer.com/2010/02/encouraging-comments-and-dofollow-links/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Moving on to pastures new</title>
		<link>http://www.dancryer.com/2010/02/moving-on-to-pastures-new</link>
		<comments>http://www.dancryer.com/2010/02/moving-on-to-pastures-new#comments</comments>
		<pubDate>Fri, 19 Feb 2010 19:01:26 +0000</pubDate>
		<dc:creator>Dan Cryer</dc:creator>
				<category><![CDATA[Other Things]]></category>
		<category><![CDATA[media wow]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://www.dancryer.com/?p=470</guid>
		<description><![CDATA[I got a call a couple of weeks ago about a great opportunity at a small full-package media and marketing agency in Leeds, Media Wow. After a short, successful interview process, I was offered the job on Monday. I&#8217;m going to be helping them create a web development department from scratch to compliment their recent addition [...]]]></description>
			<content:encoded><![CDATA[<p>I got a call a couple of weeks ago about a great opportunity at a small full-package media and marketing agency in Leeds, <a href="http://www.mediawow.co.uk/">Media Wow</a>. After a short, successful interview process, I was offered the job on Monday. I&#8217;m going to be helping them create a web development department from scratch to compliment their recent addition of online marketing services and expand their digital offering. The job will include choosing the technologies we&#8217;ll use, setting up processes, meeting with clients and developing great things.</p>
<p>This is a bit of a strange post to write, as I&#8217;m naturally very excited about the challenge I&#8217;m going to be facing, but also sad to be leaving behind the great development team I&#8217;ve been working with at Stickyeyes. I&#8217;ve worked through some great challenges with the guys and learned a lot, I&#8217;m looking forward to doing the same and more in my new role.</p>
<p>Naturally, as with all my other posts, if anyone has any wisdom or advice they&#8217;d like to give, it would of course be greatly appreciated.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dancryer.com/2010/02/moving-on-to-pastures-new/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google Chrome Frame</title>
		<link>http://www.dancryer.com/2010/02/google-chrome-frame</link>
		<comments>http://www.dancryer.com/2010/02/google-chrome-frame#comments</comments>
		<pubDate>Thu, 11 Feb 2010 22:16:44 +0000</pubDate>
		<dc:creator>Dan Cryer</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[webkit]]></category>

		<guid isPermaLink="false">http://www.dancryer.com/?p=468</guid>
		<description><![CDATA[I&#8217;m sure by now, if you work in web development, you&#8217;ll have heard of Google Chrome Frame. The plugin for Internet Explorer that replaces the entire rendering engine with Google Chrome, on demand.
Whilst I understand that this is a less than ideal solution, as if a user can install a plugin, they can probably replace [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m sure by now, if you work in web development, you&#8217;ll have heard of <a rel="nofollow" href="http://www.google.com/chromeframe">Google Chrome Frame</a>. The plugin for Internet Explorer that replaces the entire rendering engine with Google Chrome, on demand.</p>
<p>Whilst I understand that this is a less than ideal solution, as if a user can install a plugin, they can probably replace the browser anyway. However, they released an interesting update today that makes implementation a little more feasible for site owners. You can now issue the &#8220;X-UA-Compatible&#8221; string as a HTTP response header instead of a meta tag, meaning your Chrome Frame enabled pages can validate again! It also means you can, to clients that support it, serve appropriate MIME type headers that IE does not support, such as application/xhtml+xml.</p>
<p>The Apache configuration snippet to enable this functionality is as follows, you&#8217;ll need mod_setenvif and mod_headers enabled to use it:</p>
<p><code>&lt;IfModule mod_setenvif.c&gt;<br />
&lt;IfModule mod_headers.c&gt;<br />
BrowserMatch chromeframe gcf<br />
Header append X-UA-Compatible "chrome=1" env=gcf<br />
&lt;/IfModule&gt;<br />
&lt;/IfModule&gt;</code></p>
<p>I&#8217;ve implemented it on this server, so now any Internet Explorer visitors with Chrome Frame installed going to any of my sites, will see them as I designed them originally &#8211; in Webkit.</p>
<p>For more information about this update to Chrome Frame, see <a rel="nofollow" href="http://blog.chromium.org/2010/02/google-chrome-frame-developer-updates.html">this blog post</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dancryer.com/2010/02/google-chrome-frame/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP UK Conference 2010</title>
		<link>http://www.dancryer.com/2010/02/php-uk-conference-2010</link>
		<comments>http://www.dancryer.com/2010/02/php-uk-conference-2010#comments</comments>
		<pubDate>Thu, 11 Feb 2010 19:13:44 +0000</pubDate>
		<dc:creator>Dan Cryer</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[conferences]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[scaling]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://www.dancryer.com/?p=465</guid>
		<description><![CDATA[I&#8217;ve been meaning to post about this for weeks now, but haven&#8217;t got around to it. The PHP UK Conference is coming up on the 26th of February in London and my boss, Remo Biagioni, is one of the speakers. Here&#8217;s some information about Remo and the talk from the official site:
Remo&#8217;s Bio:
Remo is Head [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dancryer.com/wp/wp-content/uploads/2010/02/php-logo.gif"><img class="alignright size-full wp-image-443" title="PHP Logo" src="http://www.dancryer.com/wp/wp-content/uploads/2010/02/php-logo.gif" alt="PHP Logo" width="200" height="160" /></a>I&#8217;ve been meaning to post about this for weeks now, but haven&#8217;t got around to it. The <a rel="nofollow" href="http://www.phpconference.co.uk/">PHP UK Conference</a> is coming up on the 26th of February in London and my boss, Remo Biagioni, is one of the speakers. Here&#8217;s some information about Remo and the talk from the official site:</p>
<p><strong>Remo&#8217;s Bio:</strong></p>
<blockquote><p>Remo is Head of Research &amp; Development at Stickyeyes, a search marketing agency based in Leeds. The R&amp;D team works on a mixture of client site builds, internal reporting tools and Market Defender a search marketing intelligence tool. His team works mainly with PHP, MySQL and Apache. Remo graduated with an MSc in pure mathematics having covered programming in Fortran, Pascal, Lisp &amp; C; he joined BT&#8217;s R&amp;D Labs at Martlesham Heath working on large scale systems (a dozen mainframes, a few hundred Unix servers&#8230;) before getting an MBA and leaving to set up his own web development business. Remo sold the business in 2008 and joined Stickyeyes. Remo is passionate about object-orientated coding and can talk for hours about the Liskov Subsitution Principle, test driven development and solid software engineering.</p></blockquote>
<p><strong>The Talk &#8211; Database Optimisation:</strong></p>
<blockquote><p>A real life example getting more throughput with fewer queries.</p>
<p>Over the last year we&#8217;ve grown a database from a few hundred megabytes to just over one terabyte. The database is reported on and populated by a network of servers using PHP. As the database has grown we&#8217;ve had to look again our initial assumptions and ways of working. One table has over 2billion rows; 2.5 million rows every day are added to another table. This talk will cover how we use explain, foreign keys, normalising data without sacrificing performance, queuing and using memcache. And, how we&#8217;ve made the system run faster now than it did with a much smaller database.</p></blockquote>
<p>Without going into too much detail, the talk basically centres around the work that myself, Wade and the rest of our team have been doing over the course of the last year and a half.</p>
<p>Much of the content will be familiar to those who read my blog. It&#8217;s about scaling MySQL from a couple of hundred megabyte data store in our office, to a two server set up holding over a terabyte of data, fed by tens of servers, all the whileincreasing the speed at which we could store and retrieve data. It&#8217;ll cover how we implemented beanstalkd and memcached to lessen database load, and I&#8217;d imagine it will also touch on our ongoing implementation of HAProxy load balancing.</p>
<p>If you&#8217;re attending the conference and this sounds interesting to you, make sure you get to the talk. Wade and I will be around as well, to answer any questions that might come up throughout the day. As always, you can also ask the questions here, and if the answer is interesting enough, it might make it into the talk (though no promises!)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dancryer.com/2010/02/php-uk-conference-2010/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Buzz Followup</title>
		<link>http://www.dancryer.com/2010/02/google-buzz-followup</link>
		<comments>http://www.dancryer.com/2010/02/google-buzz-followup#comments</comments>
		<pubDate>Thu, 11 Feb 2010 18:33:18 +0000</pubDate>
		<dc:creator>Dan Cryer</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[buzz]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[wave]]></category>

		<guid isPermaLink="false">http://www.dancryer.com/?p=461</guid>
		<description><![CDATA[I posted on Wednesday, just as Google Buzz was announced, asking whether Google Buzz was just Google Wave done right. I&#8217;ve now had Google Buzz in my GMail account for just over 24 hours, and I think I can answer the question: Not quite yet.
Why?
Google Buzz has a lot of the hallmarks of Google Wave. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dancryer.com/wp/wp-content/uploads/2010/02/google-buzz-logo1.png"><img class="alignright size-full wp-image-459" title="Google Buzz Logo" src="http://www.dancryer.com/wp/wp-content/uploads/2010/02/google-buzz-logo1.png" alt="Google Buzz Logo" width="286" height="68" /></a>I posted on Wednesday, just as Google Buzz was announced, asking whether <a href="/2010/02/is-google-buzz-just-wave-done-right">Google Buzz was just Google Wave done right</a>. I&#8217;ve now had Google Buzz in my GMail account for just over 24 hours, and I think I can answer the question: Not quite yet.</p>
<p><strong><em>Why?</em></strong></p>
<p>Google Buzz has a lot of the hallmarks of Google Wave. It allows you to easily share a message with your friends, or publicly. It allows you to share links and photos easily. It&#8217;s got a nice UI and expands well on what the competition, Twitter, provides. However, it&#8217;s not as technically cool as Wave. Google Buzz lacks the killer feature of Wave, for me, though I know it&#8217;s going to sound incredibly sad &#8211; it&#8217;s missing the ability to drag and drop pictures from your computer to the internet.</p>
<p>As far as general opinions on Google Buzz go, I like it and think it stands a real chance. If nothing else, it should light some fires under the feet of the Twitter team, which can only be a good thing. Buzz has a few niggles, such alerting me whenever something changes in my stream &#8211; but then not highlighting those changes clearly enough on the resulting page, but I&#8217;m sure that&#8217;ll get sorted quickly enough. Twitter integration is nice, but it&#8217;s too slow to be useful &#8211; I don&#8217;t want to see what people were saying an hour ago.</p>
<p>I&#8217;m intrigued how quickly this blog entry will make it into Buzz. This blog is fed to Twitter, pings various sites on posting, and also has PubSubHubBub integrated. The theory is that it should be near-instant.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dancryer.com/2010/02/google-buzz-followup/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Is Google Buzz just Wave done right?</title>
		<link>http://www.dancryer.com/2010/02/is-google-buzz-just-wave-done-right</link>
		<comments>http://www.dancryer.com/2010/02/is-google-buzz-just-wave-done-right#comments</comments>
		<pubDate>Tue, 09 Feb 2010 21:02:25 +0000</pubDate>
		<dc:creator>Dan Cryer</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[buzz]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[wave]]></category>

		<guid isPermaLink="false">http://www.dancryer.com/?p=457</guid>
		<description><![CDATA[I&#8217;m sure those of you who read this blog will have heard what Google Buzz is already. If you haven&#8217;t, Buzz is a real time sharing service, much like Twitter. It allows you to post status updates, like Twitter, but what it adds is the ability to share pictures and videos directly. Services like TwitPic [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dancryer.com/wp/wp-content/uploads/2010/02/google-buzz-logo1.png"><img class="alignright size-full wp-image-459" title="google-buzz-logo" src="http://www.dancryer.com/wp/wp-content/uploads/2010/02/google-buzz-logo1.png" alt="" width="286" height="68" /></a>I&#8217;m sure those of you who read this blog will have heard what Google Buzz is already. If you haven&#8217;t, Buzz is a real time sharing service, much like Twitter. It allows you to post status updates, like Twitter, but what it adds is the ability to share pictures and videos directly. Services like TwitPic are not required. For a bit better introduction to the service, check out the video from their announcement:</p>
<div style="text-align: center;"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="560" height="340" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/yi50KlsCBio&amp;hl=en_US&amp;fs=1&amp;rel=0" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="560" height="340" src="http://www.youtube.com/v/yi50KlsCBio&amp;hl=en_US&amp;fs=1&amp;rel=0" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>
<p>As soon as I saw this, it reminded me a lot of Google Wave. It strikes me as a way for Google to push a Wave-like service out in a way that users will understand, since many, <a href="/2009/10/i-dont-get-google-wave">including me</a>, didn&#8217;t have a clue what it was for. I&#8217;m hoping that Google have carried over Wave&#8217;s best features, like the ability to drag and drop photos from your computer to upload. If they have, I think they will be taking away a key barrier to entry for &#8220;normal users&#8221; to get started sharing online, as figuring out how to share pictures on Twitter is hardly simple.</p>
<p>The key difference between Buzz and Wave, for me, is that they&#8217;re not trying to replace a well established system (i.e. email) with a new protocol. They are trying to compete with the current &#8220;trendy&#8221; site, perhaps thinking a little too much of their own influence, but sites come in and out of fashion all the time &#8211; email does not. They&#8217;re also giving it to all GMail users straight away, and allowing you to link it with your Twitter profile, making the potential audience pretty huge.</p>
<p>I&#8217;m looking forward to seeing how Google Buzz develops, and whether or not anyone actually uses it after the initial&#8230; err, Buzz&#8230; has died down. Of course, my first question is, when&#8217;s the first Wordpress &#8220;Buzz New Posts&#8221; plugin coming?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dancryer.com/2010/02/is-google-buzz-just-wave-done-right/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Minor improvements to the site</title>
		<link>http://www.dancryer.com/2010/02/minor-improvements-to-the-site</link>
		<comments>http://www.dancryer.com/2010/02/minor-improvements-to-the-site#comments</comments>
		<pubDate>Mon, 08 Feb 2010 23:12:46 +0000</pubDate>
		<dc:creator>Dan Cryer</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[design]]></category>

		<guid isPermaLink="false">http://www.dancryer.com/?p=454</guid>
		<description><![CDATA[I decided to go with a very minimalist approach when I redesigned my blog, and I&#8217;ve been very happy with that decision. The new design is easier to read, easier to modify, and loads a lot faster to boot. However, I felt there were some minor improvements I could make, here&#8217;s a few things I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p>I decided to go with a very minimalist approach when I <a href="/2010/01/new-blog-design">redesigned my blog</a>, and I&#8217;ve been very happy with that decision. The new design is easier to read, easier to modify, and loads a lot faster to boot. However, I felt there were some minor improvements I could make, here&#8217;s a few things I&#8217;ve added, that I hope improve the appearance and functionality of the site, without detracting from the simplicity:</p>
<ul>
<li><strong>Related posts: </strong>I&#8217;d thought about this before I redesigned, but then forgot to put it in. I&#8217;ve added a simple plugin (Yet Another Related Posts Plugin) that pulls in related posts by category and tags. It&#8217;s capable of comparing title and body text, but I&#8217;ve opted against using that. The related posts on this site show at the bottom of a post, just before the comments. I thought it would be handy for articles like the HAProxy load balancing guide, or for finding all my posts about scaling.</li>
<li><strong>Bordered content: </strong>When I first put this design live, the content was on a white background, inset straight into the blue of the overall page background. Whilst that was fine, I thought it could use a little further visual separation, so I&#8217;ve added a deeper blue border, which I feel gives it a nice little lift.</li>
<li><strong>Highlighted comments: </strong>Just as a little added extra, I discovered that Wordpress 2.9 makes it incredibly easy to highlight comments written by the post author, so I&#8217;ve thrown in a highlight for my comments on the blog. Perhaps best for those who want to quickly scroll past everything I say.</li>
<li><strong>Archive pages no longer have a full post at the top: </strong>They&#8217;re now simply a list of posts, no featured entry, etc. &#8211; except on the home page.</li>
<li><strong>Previous / Next are now buttons: <span style="font-weight: normal;">Restyled the links as buttons.</span></strong></li>
<li><strong>Consolidated CSS: </strong>Rolled reset.css into dancryer.css, to drop the number of hits to the server by one.</li>
</ul>
<p>I realise these are all very tiny changes, none of which are likely to make a difference to your reading of the site, or not doing so &#8211; whichever the case may be. I set out aiming to improve the site iteratively, changing little bits at a time and gradually improving it, I&#8217;m hoping these little changes will eventually build up and make it a great design.</p>
<p>I&#8217;d really appreciate any feedback you may have, no matter how big or small, whether it&#8217;s to say you&#8217;re not fond of the colour of the links, or that you simply like the site. Either is great, drop me a comment below.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dancryer.com/2010/02/minor-improvements-to-the-site/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HipHop for PHP, The PHP Compiler by Facebook</title>
		<link>http://www.dancryer.com/2010/02/hiphop-the-facebook-php-compiler</link>
		<comments>http://www.dancryer.com/2010/02/hiphop-the-facebook-php-compiler#comments</comments>
		<pubDate>Tue, 02 Feb 2010 17:35:18 +0000</pubDate>
		<dc:creator>Dan Cryer</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[hiphop]]></category>
		<category><![CDATA[hyper php]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.dancryer.com/?p=442</guid>
		<description><![CDATA[Facebook have just announced the release of their new PHP compiler, HipHop for PHP. News of the compiler was leaked in an interview on The Rumpus in mid january, and expanded upon by Read Write Web earlier this week. That, combined with members of the PHP core development team being invited to the Facebook headquarters yesterday, this [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dancryer.com/wp/wp-content/uploads/2010/02/php-logo.gif"><img class="alignright size-full wp-image-443" title="PHP Logo" src="http://www.dancryer.com/wp/wp-content/uploads/2010/02/php-logo.gif" alt="PHP Logo" width="200" height="160" /></a>Facebook have just announced the release of their new PHP compiler, <strong>HipHop for PHP</strong>. News of the compiler was leaked in an <a rel="nofollow" href="http://therumpus.net/2010/01/conversations-about-the-internet-5-anonymous-facebook-employee/?full=yes">interview on The Rumpus</a> in mid january, and <a href="http://www.readwriteweb.com/archives/facebook_gets_faster_debuts_homegrown_php_compiler.php">expanded upon by Read Write Web</a> earlier this week. That, combined with members of the PHP core development team being invited to the Facebook headquarters yesterday, this announcement comes as very little surprise.</p>
<p>The announcement states that running HipHop has reduced the CPU footprint of the Facebook code base by 50%, over using the standard PHP runtime. Whilst those improvements may not be reflected by all PHP applications, due to the special nature of the Facebook codebase, it represents an undeniably vast improvement to what was previously an engine known for being somewhat hacked together.</p>
<p>As the improved engine is seemingly so much more efficient, I assume a significant portion of the PHP developer community will now start tinkering with <strong>HipHop for PHP </strong>and the crazier amongst us will start making the switch over on our personal sites and projects. This is going to have a huge impact on the PHP community, web hosting industry and those who work in either. I can only assume that some hosts are already receiving their first &#8220;When will we get <strong>HipHop for PHP</strong>?&#8221; emails.</p>
<p>I&#8217;m going to set it up on a sub-domain of this site when it&#8217;s released this evening, assuming it can run under Apache at the moment, and see how much it affects performance running simple web sites powered by software like Wordpress and IP.Board. If it is compatible and makes much of a performance difference, I&#8217;ll switch the whole server over here, and start looking at it more seriously for our systems at work.</p>
<p>For more information, see the <a href="http://developers.facebook.com/news.php?blog=1&amp;story=358" rel="nofollow">official announcement by Facebook</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dancryer.com/2010/02/hiphop-the-facebook-php-compiler/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Finally time to drop Internet Explorer 6?</title>
		<link>http://www.dancryer.com/2010/02/time-to-drop-internet-explorer-6</link>
		<comments>http://www.dancryer.com/2010/02/time-to-drop-internet-explorer-6#comments</comments>
		<pubDate>Tue, 02 Feb 2010 11:58:24 +0000</pubDate>
		<dc:creator>Dan Cryer</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[internet explorer]]></category>

		<guid isPermaLink="false">http://www.dancryer.com/?p=440</guid>
		<description><![CDATA[A lot of web designers and developers have hated Internet Explorer 6 for years, it holds back progress on the web and is the bane of many people&#8217;s lives, so naturally we all get excited every time there&#8217;s some big news about it being phased out. Unfortunately, however, until now there&#8217;s never really been a [...]]]></description>
			<content:encoded><![CDATA[<p>A lot of web designers and developers have hated Internet Explorer 6 for years, it holds back progress on the web and is the bane of many people&#8217;s lives, so naturally we all get excited every time there&#8217;s some big news about it being phased out. Unfortunately, however, until now there&#8217;s never really been a definitive moment to call time on the browser. A significant portion of the world&#8217;s big corporations still enforce usage of Internet Explorer 6, as their old systems require features only it can provide, and even the news about Google account hacking being caused by flaws in IE6 were not enough to change that.</p>
<p>However, Google has now announced that it will be <a rel="nofollow" href="http://googleenterprise.blogspot.com/2010/01/modern-browsers-for-modern-applications.html">dropping support for Internet Explorer 6</a>, starting with Google Apps as early as March 1st. Google Mail and their other properties will also phase out support shortly afterwards. This strikes me as the moment that Google has decided that IE6 market share is no longer big enough to allow it to hold back progress any longer. This announcement is big enough that it&#8217;s <a rel="nofollow" href="http://news.bbc.co.uk/1/hi/technology/8492862.stm">one of the top three stories</a> on the BBC News homepage.</p>
<p>So one question comes up. Does this mean that we, as regular every day web developers, can finally drop support for Internet Explorer 6 in our own work? My site doesn&#8217;t work in the browser currently, but purely due to laziness on my part, can I now say that actually, it never will? It feels like it could be that moment.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dancryer.com/2010/02/time-to-drop-internet-explorer-6/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL Load-Balanced Cluster Guide – Part 3</title>
		<link>http://www.dancryer.com/2010/01/load-balancing-mysql-with-ha-proxy</link>
		<comments>http://www.dancryer.com/2010/01/load-balancing-mysql-with-ha-proxy#comments</comments>
		<pubDate>Thu, 28 Jan 2010 17:14:00 +0000</pubDate>
		<dc:creator>Dan Cryer</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[PHP Conference 2010]]></category>
		<category><![CDATA[replication]]></category>
		<category><![CDATA[scaling]]></category>
		<category><![CDATA[servers]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.dancryer.com/?p=434</guid>
		<description><![CDATA[This article is the last in my MySQL Load-Balanced Cluster Guide series, following on from my earlier post today on setting up MySQL Monitoring on the cluster nodes, this article is a guide to setting up the load balancer with HAProxy, using the monitoring scripts we&#8217;ve created to check the node status.
HAProxy is a well [...]]]></description>
			<content:encoded><![CDATA[<p>This article is the last in my MySQL Load-Balanced Cluster Guide series, following on from my earlier post today on <a href="http://www.dancryer.com/2010/01/mysql-monitoring-with-xinetd">setting up MySQL Monitoring on the cluster nodes</a>, this article is a guide to setting up the load balancer with HAProxy, using the monitoring scripts we&#8217;ve created to check the node status.</p>
<p>HAProxy is a well known, powerful load balancer. Best known for use with HTTP servers, but it can work with any kind of TCP traffic, including MySQL. Upcoming versions will support native MySQL monitoring, so we&#8217;ll be able to retire the custom scripts we created in the previous step, when they&#8217;re available in apt-get.</p>
<p><strong>1. Install HAProxy using the following apt-get command: </strong>apt-get install haproxy</p>
<p><strong>2. Delete the file /etc/haproxy/haproxy.cfg and create a new one with the following contents:</strong></p>
<p><code>global<br />
log 127.0.0.1   local0<br />
maxconn 4096<br />
user haproxy<br />
group haproxy<br />
daemon</code></p>
<p><code> </code></p>
<p><code>defaults<br />
log     global<br />
mode    tcp<br />
option  tcplog<br />
option  dontlognull<br />
retries 3<br />
option redispatch<br />
maxconn 2000<br />
contimeout      4000<br />
clitimeout      50000<br />
srvtimeout      30000<br />
stats enable<br />
stats scope	.</code></p>
<p><code>frontend mysql_cluster<br />
bind {load-balancer-ip}:3306<br />
default_backend	mysql_cluster</code></p>
<p><code>backend mysql_cluster<br />
mode tcp<br />
balance roundrobin<br />
stats enable<br />
option tcpka<br />
option httpchk<br />
server {node-name} {ip-address}:3306 weight 1 check port 9200 inter 5s rise 2 fall 2<br />
server {node-name} {ip-address}:3306 weight 1 check port 9200 inter 5s rise 2 fall 2</p>
<p></code></p>
<p><code>listen stats {load-balancer-ip}:80<br />
mode http<br />
option httpclose<br />
balance roundrobin<br />
stats uri     /<br />
stats realm   Haproxy\ Statistics<br />
stats auth    {username}:{password}<br />
</code></p>
<p>Once you&#8217;ve modified this file with settings appropriate to your environment, you&#8217;ll have a ready to go load balancer for MySQL. It&#8217;ll open port 3306 on the load balancer and forward those connections using round-robin load balancing to your two cluster servers. If either server goes down, it&#8217;ll be removed from the pool and no connections will be sent to it until it comes back up.</p>
<p>Additionally, it&#8217;ll create a statistics interface similar to the following, which you can access by going to your load balancing server&#8217;s address in your browser.</p>
<p><a href="http://www.dancryer.com/wp/wp-content/uploads/2010/01/haproxy.png"><img class="aligncenter size-large wp-image-437" title="HA Proxy" src="http://www.dancryer.com/wp/wp-content/uploads/2010/01/haproxy-1024x566.png" alt="HA Proxy Web Interface" width="450" height="248" /></a></p>
<p>Each cluster node should be listed under the first &#8220;mysql_cluster&#8221; section. They should all appear in green, as they should all be live. If a server is down, it&#8217;ll appear red, as explained in the key at the top of the page. From this interface you can also see how long the load balancer has been up, how long each server has been up, how much downtime each have had, as well as the individual number of downtime incidents. As you can see in the image above, our &#8216;cluster-1&#8242; server has had 21 separate downtime incidents, totalling just over 9 minutes of downtime.</p>
<p>So what do you need to change in your haproxy.cfg file? Here&#8217;s a quick rundown:</p>
<ul>
<li>Firstly, you&#8217;ll need to change the line starting &#8216;bind&#8217; to use your load balancer&#8217;s public IP address.</li>
<li>Secondly, make the same change on the line starting &#8216;listen stats&#8217;. You may also choose to put this service on a different port than port 80.</li>
<li>Next, change the {username} and {password} section of the &#8217;stats auth&#8217; line to ones of your choosing. This provides password protection to your web interface.</li>
<li>Finally, for each of your MySQL cluster nodes, you&#8217;ll need an appropriate &#8217;server&#8217; line in the &#8216;mysql_cluster&#8217; backend group. The things you need to change are {node-name}, to the name of the cluster node you defined earlier (e.g. cluster-1, cluster-2) and {ip-address} to the cluster node&#8217;s internal IP address.</li>
</ul>
<p>You may also wish to change the interval at which the load balancer will poll the MySQL servers, by changing &#8216;inter 5&#8242; to a different number. For more information on HAProxy configuration, their detailed &#8211; if a little unfriendly &#8211; documentation is available <a rel="nofollow" href="http://haproxy.1wt.eu/download/1.3/doc/configuration.txt">here</a>.</p>
<p>The final step to get this running, is to restart haproxy: /etc/init.d/haproxy restart - You should now be able to access both your web interface on port 80 and your brand new MySQL cluster on port 3306!</p>
<p>If you&#8217;ve got any questions about these guides or setting up a similar cluster, please leave a comment below and I&#8217;ll do my best to answer it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dancryer.com/2010/01/load-balancing-mysql-with-ha-proxy/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MySQL Load-Balanced Cluster Guide – Part 2</title>
		<link>http://www.dancryer.com/2010/01/mysql-monitoring-with-xinetd</link>
		<comments>http://www.dancryer.com/2010/01/mysql-monitoring-with-xinetd#comments</comments>
		<pubDate>Thu, 28 Jan 2010 16:28:35 +0000</pubDate>
		<dc:creator>Dan Cryer</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[PHP Conference 2010]]></category>
		<category><![CDATA[replication]]></category>
		<category><![CDATA[scaling]]></category>
		<category><![CDATA[servers]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.dancryer.com/?p=425</guid>
		<description><![CDATA[Following on from yesterday&#8217;s guide to setting up MySQL master-master replication, the first of today&#8217;s guides is how to set up a script to monitor the status of your MySQL cluster nodes, which we&#8217;ll use in the next guide to set up our proxy.
On every one of your MySQL cluster nodes, follow the steps below [...]]]></description>
			<content:encoded><![CDATA[<p>Following on from yesterday&#8217;s guide to <a href="/2010/01/mysql-circular-replication">setting up MySQL master-master replication</a>, the first of today&#8217;s guides is how to set up a script to monitor the status of your MySQL cluster nodes, which we&#8217;ll use in the next guide to set up our proxy.</p>
<p>On every one of your MySQL cluster nodes, follow the steps below to get it ready for status reporting:</p>
<p><strong>1. Run the following apt-get command: <em>apt-get install xinetd php5-cli php5-mysql</em></strong> &#8211; We need xinetd to host our status server, and php5 for the status checking script.</p>
<p><strong>2. Put the following code into a new file: /etc/xinetd.d/mysqlchk</strong> &#8211; This creates an xinetd &#8220;server&#8221; on port 9200, using the /opt/mysql-status.php file to generate the response. Our proxy will connect to this server to check the status of the node.</p>
<p><code>#<br />
# /etc/xinetd.d/mysqlchk<br />
#<br />
service mysqlchk<br />
{<br />
flags           = REUSE<br />
socket_type     = stream<br />
protocol        = tcp<br />
port            = 9200<br />
wait            = no<br />
user            = mysql<br />
server          = /opt/mysql-status.php<br />
log_on_failure  += USERID<br />
disable         = no<br />
}</code></p>
<p><strong>3. Add the following line at the bottom of /etc/services</strong> &#8211; This registers your newly created xinetd service with the system to allow it to function.<br />
<code>mysqlchk	9200/tcp	# MySQL Monitoring</code></p>
<p><strong>4. Create the PHP file /opt/mysql-status.php with the code below.</strong><br />
This script tries to connect to your MySQL server, and if it succeeds, checks the &#8216;Seconds_Behind_Master&#8217; value of the slave status to make sure it is not too far behind it&#8217;s master. If either of these checks fail, it will return a 503 error to the client, telling it that the server is down.<br />
<code>#!/usr/bin/php<br />
&lt; ?php<br />
/**<br />
*	MySQL Replication Monitor<br />
*/</code></p>
<p><code>// Connection details:<br />
$_host     = 'localhost';<br />
$_username = '{username}';<br />
$_password = '{password}';<br />
$_timeout  = 60; // Number of seconds behind master this node can fall before being marked as "down".</p>
<p>try<br />
{<br />
$pdo = new PDO('mysql:host='.$_host, $_username, $_password);<br />
$pdo-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);</p>
<p>$stmt   = $pdo-&gt;query('SHOW SLAVE STATUS');<br />
$status = $stmt-&gt;fetch(PDO::FETCH_ASSOC);</p>
<p>if($status == false)<br />
{<br />
serverIsDown('Querying slave status failed.');<br />
}</p>
<p>if(intval($status['Seconds_Behind_Master']) &gt; $_timeout)<br />
{<br />
serverIsDown('Slave is behind.');<br />
}<br />
}<br />
catch(Exception $ex)<br />
{<br />
if(!is_null($pdo))<br />
unset($pdo);</p>
<p>serverIsDown('Failed to connect to MySQL.');<br />
}</p>
<p>unset($pdo);</p>
<p>serverIsUp();</p>
<p>function serverIsDown($message)<br />
{<br />
$output = 'Server is currently down. Message:' . $message;<br />
print "HTTP/1.1 503 Service Unavailable\r\n";<br />
print "Date: " . date('r') . "\r\n";<br />
print "Server: MySQL Monitor/1.0\r\n";<br />
print "Connection: close\r\n";<br />
print "Content-Type: text/plain\r\n";<br />
print "Content-Length: " . strlen($output) . "\r\n";<br />
print "\r\n";<br />
print $output;<br />
die;<br />
}</p>
<p></code></p>
<p><code>function serverIsUp()<br />
{<br />
$output = 'Server is up. All is okay.';<br />
print "HTTP/1.1 200 OK\r\n";<br />
print "Date: " . date('r') . "\r\n";<br />
print "Server: MySQL Monitor/1.0\r\n";<br />
print "Connection: close\r\n";<br />
print "Content-Type: text/plain\r\n";<br />
print "Content-Length: " . strlen($output) . "\r\n";<br />
print "\r\n";<br />
print $output;<br />
die;<br />
}</code></p>
<p><strong>5. chown -fv mysql:mysql /opt/mysql-status.php</strong> &#8211; Give ownership of the status checking script to mysql.<br />
<strong>6. chmod -fv +x /opt/mysql-status.php</strong> &#8211; Give execute permissions on the script.<br />
<strong>7. /etc/init.d/xinetd restart</strong> &#8211; Restart xinetd, to make all of the changes we&#8217;ve just made live.</p>
<p>Having completed the steps above, you will now have a script that checks the current status of your MySQL server, responding to connections on port 9200 of your server. In the next article, I&#8217;ll describe how to set up your load balancing server with HAProxy, and utilise the server we&#8217;ve just created to check which nodes are live at any given time.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dancryer.com/2010/01/mysql-monitoring-with-xinetd/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Forum Insider &#8211; We&#8217;re off to a good start!</title>
		<link>http://www.dancryer.com/2010/01/forum-insider-good-start</link>
		<comments>http://www.dancryer.com/2010/01/forum-insider-good-start#comments</comments>
		<pubDate>Wed, 27 Jan 2010 21:22:21 +0000</pubDate>
		<dc:creator>Dan Cryer</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[forum insider]]></category>
		<category><![CDATA[forums]]></category>
		<category><![CDATA[ip.board]]></category>
		<category><![CDATA[vbulletin]]></category>

		<guid isPermaLink="false">http://www.dancryer.com/?p=421</guid>
		<description><![CDATA[I posted a couple of weeks ago about my new site, Forum Insider, and I thought I should post a bit of an update. Whilst we&#8217;ve not had many members sign up, and we&#8217;re still very light on posts&#8230; there&#8217;s some great content going up.
We&#8217;ve had interviews with all these people:

Brandon Farber &#8211; IP.Board Developer
Josh [...]]]></description>
			<content:encoded><![CDATA[<p>I posted a couple of weeks ago about my new site, <a href="http://www.foruminsider.com/community/">Forum Insider</a>, and I thought I should post a bit of an update. Whilst we&#8217;ve not had many members sign up, and we&#8217;re still very light on posts&#8230; there&#8217;s some great content going up.</p>
<p>We&#8217;ve had interviews with all these people:</p>
<ul>
<li><a href="http://www.foruminsider.com/community/blog/1/entry-2-interview-with-brandon-farber-ipboard-developer/">Brandon Farber</a> &#8211; IP.Board Developer</li>
<li><a href="http://www.foruminsider.com/community/blog/1/entry-3-interview-with-josh-williams-ipboard-developer/">Josh Williams</a> &#8211; IP.Board Developer</li>
<li><a href="http://www.foruminsider.com/community/blog/1/entry-4-interview-with-henry-sudhof-phpbb-developer/">Henry Sudhof</a> &#8211; phpBB Developer</li>
<li><a href="http://www.foruminsider.com/community/blog/1/entry-5-interview-with-josh-barraza-administrator-of-tortoiseforumorg/">Josh Barazza</a> &#8211; TortoiseForum.org Administrator</li>
<li><a href="http://www.foruminsider.com/community/blog/1/entry-6-interview-with-ryan-gordon-mybb-lead-developer/">Ryan Gordon</a> &#8211; MyBB Lead Developer</li>
<li><a href="http://www.foruminsider.com/community/blog/1/entry-7-interview-with-lee-liu-administrator-of-idolforumscom/">Lee Liu</a> &#8211; IdolForums.com Administrator</li>
</ul>
<p>And, I&#8217;ve just posted the next one, an <a href="http://www.foruminsider.com/community/blog/1/entry-8-interview-with-vbulletins-kevin-sours-and-don-kuramura/">interview with Kevin Sours, lead vBulletin developer, and Don Kuramura, vBulletin’s Director of Product Management</a>.</p>
<p>I hope people are enjoying the content. If you are interested in the forum software industry, or run a forum of your own, please sign up and get involved, we&#8217;d love your input!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dancryer.com/2010/01/forum-insider-good-start/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL Load-Balanced Cluster Guide &#8211; Part 1</title>
		<link>http://www.dancryer.com/2010/01/mysql-circular-replication</link>
		<comments>http://www.dancryer.com/2010/01/mysql-circular-replication#comments</comments>
		<pubDate>Wed, 27 Jan 2010 17:35:21 +0000</pubDate>
		<dc:creator>Dan Cryer</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[PHP Conference 2010]]></category>
		<category><![CDATA[replication]]></category>
		<category><![CDATA[scaling]]></category>
		<category><![CDATA[servers]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.dancryer.com/?p=409</guid>
		<description><![CDATA[I&#8217;m currently working on setting up a load-balanced many-master MySQL cluster at work, without using MySQL Cluster as it&#8217;s incompatible with our needs. Finding good guides on how to do this has proven incredibly difficult, so I thought I would document the process here.
This first post is going to cover setting up the servers themselves [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m currently working on setting up a load-balanced many-master MySQL cluster at work, without using MySQL Cluster as it&#8217;s incompatible with our needs. Finding good guides on how to do this has proven incredibly difficult, so I thought I would document the process here.</p>
<p>This first post is going to cover setting up the servers themselves and configuring MySQL replication.</p>
<p><strong>1. Set up the following three servers:<br />
</strong></p>
<ul>
<li><strong>Cluster Load Balancer</strong> &#8211; One Public IP, One Internal IP &#8211; Ubuntu Jaunty Basic installation</li>
<li><strong>Cluster MySQL 1</strong> &#8211; One Public IP, One Internal IP &#8211; Ubuntu Jaunty Basic + MySQL Server 5.x</li>
<li><strong>Cluster MySQL 2</strong> &#8211; One Public IP, One Internal IP &#8211; Ubuntu Jaunty Basic + MySQL Server 5.x</li>
</ul>
<p>We&#8217;re using <a rel="nofollow" href="http://manage.aff.biz/z/146/CD2815/">VPS.NET</a>. If you&#8217;re going to do the same, use the &#8216;Ubuntu 8.04 LTS 64-bit Basic Installation&#8217; template for the Load Balancer and &#8216;Ubuntu 8.04 x64 MySQL&#8217; for the MySQL nodes. You&#8217;ll then need to do the following to upgrade to Jaunty:</p>
<ul>
<li>Edit the file &#8216;<em>/etc/update-manager/release-upgrades</em>&#8216; and change the line &#8216;<em>Prompt=lts</em>&#8216; to &#8216;<em>Prompt=normal</em>&#8216;.</li>
<li>Run the command &#8216;<em>do-release-upgrade</em>&#8216;. Let it go through the entire process of installing Intrepid, then reboot.</li>
<li>Repeat the step above again to install of Jaunty.</li>
</ul>
<p><strong>2. On the two MySQL servers, edit /etc/mysql/my.cnf and comment out the line &#8216;<em>bind-address 127.0.0.1</em>&#8216; &#8211; the servers need to allow remote TCP/IP connections.<br />
</strong><br />
<strong>3. On each server, add the following to the /etc/mysql/my.cnf file:<br />
</strong><br />
<code>server-id = 1                         # Increment this number by one for each server, so 1 for cluster-1, 2 for cluster-2<br />
auto_increment_increment = 2          # Set to the number of nodes you have (or are likely to have)<br />
auto_increment_offset = 1             # Set to the same as the server-id<br />
replicate-same-server-id = 0          # To ensure the slave thread doesn't try to write updates that this node has produced.<br />
log-bin                               # Turn on binary logging (neccessary for replication)<br />
log-slave-updates                     # Neccessary for chain or circular replication<br />
relay-log                             # As above<br />
relay-log-index                       # As above</code></p>
<p><strong>Note:</strong> On our servers, we&#8217;ve used an <em>auto_increment_increment </em>of 4, to allow us to add two more nodes to our cluster at a later date, without hitting auto-increment problems.</p>
<p><strong>4. Restart MySQL on both servers.<br />
</strong><br />
<strong>5. On Cluster 1, log into the MySQL Console and run the following queries:<br />
</strong><br />
<code>STOP SLAVE;<br />
CHANGE master TO master_host="cluster-2.yourdomain.com", master_user="{username}", master_password="{password}", master_log_file="mysqld-bin.000001", master_log_pos=98;<br />
START SLAVE;</code></p>
<p><strong>Note:</strong> To verify the master_log_pos value, execute the query: &#8220;SHOW MASTER STATUS;&#8221; and check the Position column. Also, you may wish to use your internal IP addresses for the master_host option.</p>
<p><strong>6. On Cluster 2, log into the MySQL Console and run the following queries:<br />
</strong><br />
<code>STOP SLAVE;<br />
CHANGE master TO master_host="cluster-1.yourdomain.com", master_user="{username}", master_password="{password}", master_log_file="mysqld-bin.000001", master_log_pos=98;<br />
START SLAVE;</code></p>
<p><strong>Note:</strong> If on either server you get an error message at this point, verify that:</p>
<ul>
<li>a) the master_log_file name in the query above matches the ones your servers are generating</li>
<li>b) your username and password for the other server are correct</li>
<li>c) that your servers can communicate with each other using the host names you specified.</li>
<li>Additionally, you may wish to remove AppArmor, as that can interfere with MySQL replication and cause all kinds of miscellaneous problems. To do so, run &#8216;<em>apt-get remove apparmor</em>&#8216; followed by &#8216;<em>apt-get purge apparmor</em>&#8216;.</li>
</ul>
<p>You should now have master to master replication set up and running across your two MySQL servers. To test, create a database on cluster-1, then create a table within that database and insert some data into it. Next, log on to cluster-2 and you should be able to see that newly created table, complete with data.</p>
<p>If you want to ensure that it works both ways, insert some data on cluster-2 and you should see it on cluster-1. You will also want to test that your auto-increment settings are working correctly.</p>
<p>If you&#8217;ve got any questions about this article, or have any problems setting up the replication, please leave a comment below and I&#8217;ll do my best to help. The next article in this guide will cover setting up a proxy on the load balancer and hopefully, implementing failover.</p>
<ul>
<li>Next Step: <a href="http://www.dancryer.com/2010/01/mysql-monitoring-with-xinetd">Setting up MySQL Monitoring on the cluster nodes</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.dancryer.com/2010/01/mysql-circular-replication/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Blog Design</title>
		<link>http://www.dancryer.com/2010/01/new-blog-design</link>
		<comments>http://www.dancryer.com/2010/01/new-blog-design#comments</comments>
		<pubDate>Tue, 26 Jan 2010 23:31:00 +0000</pubDate>
		<dc:creator>Dan Cryer</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[design]]></category>

		<guid isPermaLink="false">http://www.dancryer.com/?p=406</guid>
		<description><![CDATA[So, after about a year of blogging on this new site, I&#8217;ve finally gotten around to making my own design to replace the WooThemes one I was using &#8220;just for now.&#8221; It&#8217;s very rough around the edges, and likely doesn&#8217;t work at all in Internet Explorer yet, but I wanted to put it up to [...]]]></description>
			<content:encoded><![CDATA[<p>So, after about a year of blogging on this new site, I&#8217;ve finally gotten around to making my own design to replace the WooThemes one I was using &#8220;just for now.&#8221; It&#8217;s <em>very </em>rough around the edges, and likely doesn&#8217;t work at all in Internet Explorer yet, but I wanted to put it up to get some opinions on it.</p>
<p>I decided to go for something simple and lightweight, as I like to think that if people come here at all, it&#8217;s for the content. My old design was nice, but it wasn&#8217;t particularly easy on the eyes when reading long posts, and was quite image heavy overall. The new site also has everyone&#8217;s favourite &#8220;share this&#8221; type links throughout, so you can spam other people with my stuff, if you so desire.</p>
<p>Let me know what you think! Your opinions and suggestions are greatly appreciated.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dancryer.com/2010/01/new-blog-design/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
