<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    <title>Pet Pixels</title>
    <link>http://marcus.bointon.com/</link>
    <description>Skiing, Baking, PHP, Music, in variable order</description>
    <dc:language>en</dc:language>
    <admin:errorReportsTo rdf:resource="mailto:marcusblog@bointon.com" />
    <generator>Serendipity 1.4.1 - http://www.s9y.org/</generator>
    <pubDate>Mon, 07 Dec 2009 03:09:45 GMT</pubDate>

    <image>
        <url>http://marcus.bointon.com/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: Pet Pixels - Skiing, Baking, PHP, Music, in variable order</title>
        <link>http://marcus.bointon.com/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>Basic Linux-HA heartbeat and pound config</title>
    <link>http://marcus.bointon.com/archives/90-Basic-Linux-HA-heartbeat-and-pound-config.html</link>
            <category>Techie</category>
    
    <comments>http://marcus.bointon.com/archives/90-Basic-Linux-HA-heartbeat-and-pound-config.html#comments</comments>
    <wfw:comment>http://marcus.bointon.com/wfwcomment.php?cid=90</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://marcus.bointon.com/rss.php?version=2.0&amp;type=comments&amp;cid=90</wfw:commentRss>
    

    <author>marcus@bointon.com (Marcus Bointon)</author>
    <content:encoded>
    &lt;p&gt;I&#039;ve had trouble in the past setting up &lt;a href=&quot;http://www.linux-ha.org/&quot;&gt;Linux-HA&lt;/a&gt; a.k.a heartbeat to create a redundant front-end for a web service. The HA documentation is quite thorough and detailed, but it&#039;s lacking realistic examples to get a working system up and running. This is a quick guide to creating a 2-way cluster with one or more floating IP addresses and automatic failover on &lt;a href=&quot;http://www.ubuntu.com/&quot;&gt;Ubuntu&lt;/a&gt; 9.04. I also include a quick config for &lt;a href=&quot;http://www.apsis.ch/pound/&quot;&gt;pound&lt;/a&gt;, a reverse proxy / load balancer.&lt;/p&gt; &lt;br /&gt;&lt;a href=&quot;http://marcus.bointon.com/archives/90-Basic-Linux-HA-heartbeat-and-pound-config.html#extended&quot;&gt;Continue reading &quot;Basic Linux-HA heartbeat and pound config&quot;&lt;/a&gt;
    </content:encoded>

    <pubDate>Wed, 02 Dec 2009 17:05:36 +0000</pubDate>
    <guid isPermaLink="false">http://marcus.bointon.com/archives/90-guid.html</guid>
    <category>failover</category>
<category>heartbeat</category>
<category>ip</category>
<category>linux</category>
<category>load balancer</category>
<category>pound</category>
<category>redundancy</category>
<category>scalability</category>
<category>ubuntu</category>

</item>
<item>
    <title>MySQL backups with Percona's XtraBackup</title>
    <link>http://marcus.bointon.com/archives/87-MySQL-backups-with-Perconas-XtraBackup.html</link>
            <category>PHP</category>
            <category>Techie</category>
    
    <comments>http://marcus.bointon.com/archives/87-MySQL-backups-with-Perconas-XtraBackup.html#comments</comments>
    <wfw:comment>http://marcus.bointon.com/wfwcomment.php?cid=87</wfw:comment>

    <slash:comments>5</slash:comments>
    <wfw:commentRss>http://marcus.bointon.com/rss.php?version=2.0&amp;type=comments&amp;cid=87</wfw:commentRss>
    

    <author>marcus@bointon.com (Marcus Bointon)</author>
    <content:encoded>
    MySQL backup is sometimes very hard to do effectively. MySQL provides &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/backup.html&quot; title=&quot;MySQL backup docs&quot;&gt;various options for backup&lt;/a&gt;, but many of them are simply unsuitable for large systems, particularly if they need to remain active during backups. &lt;a href=&quot;http://www.percona.com/&quot;&gt;Percona&#039;s&lt;/a&gt; &lt;a href=&quot;https://launchpad.net/percona-xtrabackup/&quot;&gt;XtraBackup&lt;/a&gt; is an open-source clone of InnoBase&#039;s &lt;a href=&quot;http://www.innodb.com/products/hot-backup/&quot;&gt;InnoDB Hot Backup&lt;/a&gt; utility. So what makes XtraBackup a better solution, and how does it work?
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; on December 10th 2009, &lt;a href=&quot;http://www.mysqlperformanceblog.com/2009/12/09/xtrabackup-1-0/&quot;&gt;Percona released Xtrabackup 1.0&lt;/a&gt;.&lt;/p&gt; &lt;br /&gt;&lt;a href=&quot;http://marcus.bointon.com/archives/87-MySQL-backups-with-Perconas-XtraBackup.html#extended&quot;&gt;Continue reading &quot;MySQL backups with Percona&#039;s XtraBackup&quot;&lt;/a&gt;
    </content:encoded>

    <pubDate>Fri, 11 Sep 2009 12:18:00 +0100</pubDate>
    <guid isPermaLink="false">http://marcus.bointon.com/archives/87-guid.html</guid>
    <category>backup</category>
<category>innodb</category>
<category>mysql</category>
<category>percona</category>
<category>xtrabackup</category>

</item>
<item>
    <title>Google Charts API Simple and Extended Encoders in PHP</title>
    <link>http://marcus.bointon.com/archives/88-Google-Charts-API-Simple-and-Extended-Encoders-in-PHP.html</link>
            <category>PHP</category>
            <category>Techie</category>
    
    <comments>http://marcus.bointon.com/archives/88-Google-Charts-API-Simple-and-Extended-Encoders-in-PHP.html#comments</comments>
    <wfw:comment>http://marcus.bointon.com/wfwcomment.php?cid=88</wfw:comment>

    <slash:comments>5</slash:comments>
    <wfw:commentRss>http://marcus.bointon.com/rss.php?version=2.0&amp;type=comments&amp;cid=88</wfw:commentRss>
    

    <author>marcus@bointon.com (Marcus Bointon)</author>
    <content:encoded>
    Google&#039;s charting API has been around for quite a while now, but I&#039;ve only just needed to actually look at it. It became immediately obvious that I needed a PHP encoding function, so off to google I went. Though I found several implementations, they were all incomplete or deficient in one way or another (and it didn&#039;t help that there was an error in google&#039;s extended encoding docs), so I&#039;ve written my own based on several different ones. Both simple and extended encoders support automatic scaling, inflated maximum and lower-bound truncation, so you can pretty much stuff whatever data you like in, with no particular regard for pre-scaling and you&#039;ll get a usable result out. They have an identical interface, so you can use either encoding interchangeably according to the output resolution you need (contrary to popular belief, the encoding to use has very little to do with the range of values you need to graph). By default, the full range of possible values is used as it just seems silly not to. I deliberately omit the &#039;s:&#039; and &#039;e:&#039; prefixes so that you can call these functions for multiple data series, and I include a function that does just that. You still need to generate your own URLs and other formatting, but that&#039;s a different problem. Read on for the code... &lt;br /&gt;&lt;a href=&quot;http://marcus.bointon.com/archives/88-Google-Charts-API-Simple-and-Extended-Encoders-in-PHP.html#extended&quot;&gt;Continue reading &quot;Google Charts API Simple and Extended Encoders in PHP&quot;&lt;/a&gt;
    </content:encoded>

    <pubDate>Fri, 14 Aug 2009 09:34:27 +0100</pubDate>
    <guid isPermaLink="false">http://marcus.bointon.com/archives/88-guid.html</guid>
    <category>api</category>
<category>charts</category>
<category>encoding</category>
<category>google</category>
<category>php</category>

</item>
<item>
    <title>Why isn't UK voting anonymous?</title>
    <link>http://marcus.bointon.com/archives/86-Why-isnt-UK-voting-anonymous.html</link>
            <category>Personal</category>
    
    <comments>http://marcus.bointon.com/archives/86-Why-isnt-UK-voting-anonymous.html#comments</comments>
    <wfw:comment>http://marcus.bointon.com/wfwcomment.php?cid=86</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://marcus.bointon.com/rss.php?version=2.0&amp;type=comments&amp;cid=86</wfw:commentRss>
    

    <author>marcus@bointon.com (Marcus Bointon)</author>
    <content:encoded>
    I voted in the European election today. I was pre-registered and had received my voting card. I went to the polling station where they looked at my card, checked it against my name on the electroal roll, crossed it out, and &lt;em&gt;noted its number on a list next to the unique ID of the ballot paper&lt;/em&gt;. I made my choice and put the slip in the ballot box.

Much of this process is necessary in order to combat fraud and ballot rigging, however, it&#039;s clearly not anonymous - a simple reference back from the paper&#039;s ID to my voting card ID means that the government knows what I voted. Knowing what I voted gives no anti-fraud advantage I can see, and means that the collected data is &lt;em&gt;way&lt;/em&gt; more sensitive than it needs to be. The simple fact that this knowledge exists is likely to distort voting patterns - people might be afraid of their political leanings being exposed. I&#039;m not particularly worried about that personally, but those with more extreme views (like those that vote for the BNP) might not want this known, and it undermines the absolute right to freedom of association. Political affiliation is regarded as the highest form of &#039;personal data&#039; under the data protection act, along with ethnicity, sexual preference, medical records etc, and the best way to avoid problems with this kind of data is not to keep it in the first place, as the numerous leaks/losses/exposures of government information have highlighted. So why is it done? Aren&#039;t elections meant to be done by secret ballot? Did I miss something? Why aren&#039;t more people disturbed by this? 
    </content:encoded>

    <pubDate>Thu, 04 Jun 2009 10:59:27 +0100</pubDate>
    <guid isPermaLink="false">http://marcus.bointon.com/archives/86-guid.html</guid>
    <category>ballot</category>
<category>elections</category>
<category>eu</category>
<category>fraud</category>
<category>politics</category>
<category>voting</category>

</item>
<item>
    <title>Subversion 1.5 repository upgrade on SourceForge</title>
    <link>http://marcus.bointon.com/archives/85-Subversion-1.5-repository-upgrade-on-SourceForge.html</link>
            <category>PHP</category>
            <category>Techie</category>
    
    <comments>http://marcus.bointon.com/archives/85-Subversion-1.5-repository-upgrade-on-SourceForge.html#comments</comments>
    <wfw:comment>http://marcus.bointon.com/wfwcomment.php?cid=85</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://marcus.bointon.com/rss.php?version=2.0&amp;type=comments&amp;cid=85</wfw:commentRss>
    

    <author>marcus@bointon.com (Marcus Bointon)</author>
    <content:encoded>
    I&#039;ve just had a slightly tricky time upgrading a subversion repository on sourceforge. They have recently added support for subversion 1.5 at the server end. 1.5 brings major new features for merging, but as it&#039;s not backward compatible with older subversion clients, the upgrade is not done automatically. SF have also done a major rearrangement of their documentation while transferring everything to Trac, and it&#039;s not always easy to get the right info. Normally to upgrade a subversion repo, you just run the &#039;svnadmin upgrade /path/to/repo&#039;, however, it&#039;s not quite so simple on sourceforge as you don&#039;t have direct access to the repo, and &lt;a href=&quot;http://apps.sourceforge.net/trac/sourceforge/wiki/Subversion%20import%20instructions&quot;&gt;the instructions&lt;/a&gt; they give are &lt;a href=&quot;http://apps.sourceforge.net/trac/sourceforge/ticket/467&quot;&gt;slightly wrong at the time of writing&lt;/a&gt;. You&#039;re likely to get an error like this (it&#039;s not obvious that this is a fatal error) when you reload a dump file:
&lt;blockquote&gt;svnadmin: File already exists: filesystem &#039;/svnroot/projectname/db&#039;, transaction &#039;443-0&#039;, path &#039;tags&#039;
     \* adding path : tags ...&lt;/blockquote&gt;
This is because load is intended to add files to an existing repo, not to replace those that are already there, so you need to wipe the repo and start from scratch.

So, here is a working command sequence that needs to be run from a project login shell on sourceforge (it applies to the project you&#039;re logged in through, substitute your project&#039;s name for projectname):
&lt;blockquote&gt;adminrepo --checkout svn
svnadmin dump /svnroot/projectname &gt; svn.dump
rm -rf /svnroot/projectname/\*
svnadmin create /svnroot/projectname
svnadmin load /svnroot/projectname &lt; svn.dump
adminrepo --save svn&lt;/blockquote&gt;
Yes, you do need to delete the whole thing and re-import it, but it&#039;s quick and easy, and you have a backup in the dump file you take at the start. After the upgrade, make sure you get a new checkout of your project to ensure that you&#039;re using 1.5 all the way through. Now you&#039;ll find that commands like &#039;svn merge --reintegrate&#039; work. 
    </content:encoded>

    <pubDate>Tue, 05 May 2009 11:19:04 +0100</pubDate>
    <guid isPermaLink="false">http://marcus.bointon.com/archives/85-guid.html</guid>
    <category>project</category>
<category>repository</category>
<category>shell</category>
<category>sourceforge</category>
<category>subversion</category>
<category>upgrade</category>

</item>
<item>
    <title>Speaker &amp; room calibration</title>
    <link>http://marcus.bointon.com/archives/84-Speaker-room-calibration.html</link>
            <category>Music</category>
            <category>Techie</category>
    
    <comments>http://marcus.bointon.com/archives/84-Speaker-room-calibration.html#comments</comments>
    <wfw:comment>http://marcus.bointon.com/wfwcomment.php?cid=84</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://marcus.bointon.com/rss.php?version=2.0&amp;type=comments&amp;cid=84</wfw:commentRss>
    

    <author>marcus@bointon.com (Marcus Bointon)</author>
    <content:encoded>
    I was lucky enough to pick up a &lt;a href=&quot;http://www.behringer.com/EN/Products/DSP8024.aspx&quot;&gt;Behringer Ultracurve Pro DSP8024&lt;/a&gt; for a mere £50 on eBay recently. It turned out to have a buggy OS version (1.2), and Behringer very kindly sent me a replacement EPROM with a new 1.3 OS on it, which works just fine. I now have it installed between my Soundcraft mixer and my Wharfedale active monitors. I used its &quot;Auto-Q&quot; calibration routine and put up with some quite loud pink noise to calculate a room correction curve. Because it knows the spectrum it&#039;s generating, it assumes that what it gets back has been altered by the combination of speakers, room and microphone, so it can calculate an eq map to compensate for it. It&#039;s quite fun to watch as it has a nice big LCD screen to display the 31 1/3 octave bands - the initial spectrum is fairly peaky, but as it iteratively applies corrections you see (and hear) it flattening out. It&#039;s also very obvious that my monitors don&#039;t put out much below 50Hz (it analyses down to 20Hz), but that&#039;s to be expected from a moderately sized box with a 6.5&quot; driver. The results are really pretty good, sounds lovely and smooth, but the real surprise is when you&#039;ve been listening to it for a while and you switch out the EQ - it&#039;s really quite a shock to hear the uncorrected version. Lots of purists don&#039;t like room correction by EQ, saying it&#039;s better to fix the room in the first place, and also that EQ calculated like this is highly dependent on the listening position (which it is). I have a lots of bookshelves facing my speakers; they make fantastic diffusers, and I have some &lt;a href=&quot;http://www.universal-acoustics.com/&quot;&gt;Universal Acoustics&lt;/a&gt; absorber tiles on the sloping ceiling above my listening position. The longest room mode will be fairly undamped (I&#039;m not about to start hanging duvets around the walls!), but the resulting EQ is below 6db in either direction across the whole range - I&#039;ve heard of rooms with 24db peaks! Anyway, after all that, it sounds lovely, and I&#039;m happy! 
    </content:encoded>

    <pubDate>Fri, 20 Mar 2009 18:45:54 +0000</pubDate>
    <guid isPermaLink="false">http://marcus.bointon.com/archives/84-guid.html</guid>
    <category>acoustics</category>
<category>behringer</category>
<category>dsp8024</category>
<category>eq</category>
<category>music</category>
<category>tiles</category>
<category>universal acoustics</category>

</item>
<item>
    <title>The web developer's holy vhost trinity</title>
    <link>http://marcus.bointon.com/archives/83-The-web-developers-holy-vhost-trinity.html</link>
            <category>PHP</category>
            <category>Techie</category>
    
    <comments>http://marcus.bointon.com/archives/83-The-web-developers-holy-vhost-trinity.html#comments</comments>
    <wfw:comment>http://marcus.bointon.com/wfwcomment.php?cid=83</wfw:comment>

    <slash:comments>3</slash:comments>
    <wfw:commentRss>http://marcus.bointon.com/rss.php?version=2.0&amp;type=comments&amp;cid=83</wfw:commentRss>
    

    <author>marcus@bointon.com (Marcus Bointon)</author>
    <content:encoded>
    When you&#039;re developing web stuff, working with projects in path names (i.e. not at the top level of a domain) can be difficult (gets in the way of absolute links, rewrite rules etc), so you often need to set up a local apache virtual host, stick an entry in DNS and create an SSL certificate before you can get on with the serious business of doing some real work. This can get to be a drag when you do it a lot, but there is an extremely elegant solution that means you&#039;ll never have to do it again...
 &lt;br /&gt;&lt;a href=&quot;http://marcus.bointon.com/archives/83-The-web-developers-holy-vhost-trinity.html#extended&quot;&gt;Continue reading &quot;The web developer&#039;s holy vhost trinity&quot;&lt;/a&gt;
    </content:encoded>

    <pubDate>Fri, 20 Mar 2009 12:11:12 +0000</pubDate>
    <guid isPermaLink="false">http://marcus.bointon.com/archives/83-guid.html</guid>
    <category>apache</category>
<category>developer</category>
<category>php</category>
<category>ssl</category>
<category>web</category>
<category>wildcard</category>

</item>
<item>
    <title>Ginger and Honey Snaps</title>
    <link>http://marcus.bointon.com/archives/82-Ginger-and-Honey-Snaps.html</link>
            <category>Baking</category>
    
    <comments>http://marcus.bointon.com/archives/82-Ginger-and-Honey-Snaps.html#comments</comments>
    <wfw:comment>http://marcus.bointon.com/wfwcomment.php?cid=82</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://marcus.bointon.com/rss.php?version=2.0&amp;type=comments&amp;cid=82</wfw:commentRss>
    

    <author>marcus@bointon.com (Marcus Bointon)</author>
    <content:encoded>
    &lt;!-- s9ymdb:32 --&gt;&lt;img class=&quot;serendipity_image_left&quot; width=&quot;110&quot; height=&quot;83&quot; style=&quot;float: left; border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://marcus.bointon.com/uploads/ginger3.serendipityThumb.jpg&quot; alt=&quot;&quot; /&gt;I had this peculiarly specific desire to make some biscuits that were crunchy rather than chewy. Nigella didn&#039;t seem to have anything that fitted the bill, but I found this recipe in Rachel Allen&#039;s &quot;Bake&quot; book that I got for Christmas, and have had good results with so far. &lt;!-- s9ymdb:30 --&gt;&lt;img class=&quot;serendipity_image_left&quot; width=&quot;110&quot; height=&quot;83&quot; style=&quot;float: left; border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://marcus.bointon.com/uploads/ginger1.serendipityThumb.jpg&quot; alt=&quot;&quot; /&gt;When rolling out the biscuits (definitely the best part) I thought they looked oddly like small potatoes. Next time I won&#039;t squash them quite so much so that they stay a bit rounder. While I was baking there was an enormous rainstorm, really quite spectacular and unexpected as it had been quite sunny all day. &lt;!-- s9ymdb:33 --&gt;&lt;img class=&quot;serendipity_image_left&quot; width=&quot;110&quot; height=&quot;83&quot; style=&quot;float: left; border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://marcus.bointon.com/uploads/ginger4.serendipityThumb.jpg&quot; alt=&quot;&quot; /&gt; They came out brilliantly (if I say so myself), a lovely crisp mixture of sweet and spicy, exactly what I was after. As usual, the main problem with making biscuits is that I eat them, which isn&#039;t terribly good for me. I did send some round to Sandeep and Pam though, and they are proving handy for bribing Zoë. 
    </content:encoded>

    <pubDate>Mon, 09 Mar 2009 13:50:15 +0000</pubDate>
    <guid isPermaLink="false">http://marcus.bointon.com/archives/82-guid.html</guid>
    
</item>
<item>
    <title>Changing MacBook Bezel</title>
    <link>http://marcus.bointon.com/archives/81-Changing-MacBook-Bezel.html</link>
            <category>Techie</category>
    
    <comments>http://marcus.bointon.com/archives/81-Changing-MacBook-Bezel.html#comments</comments>
    <wfw:comment>http://marcus.bointon.com/wfwcomment.php?cid=81</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://marcus.bointon.com/rss.php?version=2.0&amp;type=comments&amp;cid=81</wfw:commentRss>
    

    <author>marcus@bointon.com (Marcus Bointon)</author>
    <content:encoded>
    I recently had cause to change the bezel on my rev A 13&quot; MacBook.  If you follow &lt;a href=&quot;http://www.ifixit.com/Guide/Repair/MacBook-Core-Duo-Front-Bezel/306/1#top&quot;&gt;the guide&lt;/a&gt; on MacFixit, it is a long and complicated procedure, involving dismantling nearly everything. Luckily, most of it is unnecessary - it&#039;s really quite easy to simply remove the bezel without dismantling anything; just &lt;a href=&quot;http://www.ifixit.com/Guide/Repair/MacBook-Core-Duo-Front-Bezel/306/12#s1209&quot;&gt;jump straight to step 35&lt;/a&gt; and carry on from there. 
    </content:encoded>

    <pubDate>Mon, 09 Mar 2009 13:15:11 +0000</pubDate>
    <guid isPermaLink="false">http://marcus.bointon.com/archives/81-guid.html</guid>
    
</item>
<item>
    <title>Web Hooks, Callbacks and Distributed Observers</title>
    <link>http://marcus.bointon.com/archives/80-Web-Hooks,-Callbacks-and-Distributed-Observers.html</link>
            <category>PHP</category>
            <category>Techie</category>
    
    <comments>http://marcus.bointon.com/archives/80-Web-Hooks,-Callbacks-and-Distributed-Observers.html#comments</comments>
    <wfw:comment>http://marcus.bointon.com/wfwcomment.php?cid=80</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://marcus.bointon.com/rss.php?version=2.0&amp;type=comments&amp;cid=80</wfw:commentRss>
    

    <author>marcus@bointon.com (Marcus Bointon)</author>
    <content:encoded>
    Someone at &lt;a href=&quot;http://www.amee.com/&quot;&gt;AMEE&lt;/a&gt; pointed out to me that there&#039;s been a &lt;a href=&quot;http://webhooks.pbwiki.com/&quot;&gt;flurry&lt;/a&gt; of &lt;a href=&quot;http://blog.webhooks.org/&quot;&gt;activity&lt;/a&gt; around so-called &quot;Web Hooks&quot; when I referred to the concept. This is quite heartening as I thought of this a couple of years ago and implemented this in &lt;a href=&quot;https://www.smartmessages.net/&quot;&gt;Smartmessages&lt;/a&gt; early last year! I call them callbacks, but the idea is the same - it&#039;s essentially a distributed observer pattern. I couldn&#039;t figure out why nobody seemed to understand what I was on about... When I get some interesting event (e.g. a message open, mailshot completion, clickthrough etc), I ping a user-supplied URL with the appropriate event data, pretty much the one-liner that Jeff alludes to. The reason we do it is that sync with external systems (usually CRM) is something that were always running into, and there seems to be no sensible, generic way of dealing with it other than this, so I&#039;m surprised it has not been discussed in this context before.
There&#039;s one downside as far as I can see - it is highly dependent on the receiver to be able to handle the event in a timely fashion. This isn&#039;t an issue if you&#039;re connecting say, Yahoo! to Google, but it could be a big problem if you connect Google to your Wordpress blog... My experience of CRM systems is that they are simply too slow to cope with the high rates of traffic that we are likely to generate, for example, if we point a stream of ~200 events per second at a CRM system, it will probably just bog down and fail (I&#039;m thinking of the SalesForce API here which typically takes 1-2 sec to deal with a single SOAP API call). Retrying will only make this worse. I have two solutions for this: limit events to those that don&#039;t happen so often (kind of lame!), or alternatively, use an outbound message queue to rate-limit the sending (&lt;a href=&quot;http://aws.amazon.com/sqs/&quot;&gt;Amazon SQS &lt;/a&gt;and &lt;a href=&quot;http://memcachedb.org/memcacheq/&quot;&gt;Memcacheq&lt;/a&gt; spring to mind). Queueing works, but you lose some of the real-time aspect. Ideally clients would implement their own incoming queue in order to allow them to process events at their leisure, but this is mostly beyond the vast majority of web authors (or at least those that host the CRM systems that we hear from!).
Anyway, it&#039;s nice to know that I&#039;m not completely barking... 
    </content:encoded>

    <pubDate>Wed, 04 Mar 2009 14:44:37 +0000</pubDate>
    <guid isPermaLink="false">http://marcus.bointon.com/archives/80-guid.html</guid>
    <category>callbacks</category>
<category>crm</category>
<category>php</category>
<category>smartmessages</category>
<category>web hooks</category>

</item>
<item>
    <title>PHP London Conference 2009</title>
    <link>http://marcus.bointon.com/archives/79-PHP-London-Conference-2009.html</link>
            <category>PHP</category>
    
    <comments>http://marcus.bointon.com/archives/79-PHP-London-Conference-2009.html#comments</comments>
    <wfw:comment>http://marcus.bointon.com/wfwcomment.php?cid=79</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://marcus.bointon.com/rss.php?version=2.0&amp;type=comments&amp;cid=79</wfw:commentRss>
    

    <author>marcus@bointon.com (Marcus Bointon)</author>
    <content:encoded>
    From this &lt;a href=&quot;http://www.phpconference.co.uk/&quot;&gt;truly excellent conference&lt;/a&gt;, I took away some good memories, some new ideas and a nasty bout of conference flu. There&#039;s nothing quite like being in close proximity to a few hundred people to really spread things around...
Highlight for me was &lt;a href=&quot;http://aralbalkan.com/&quot;&gt;Aral Balkan&lt;/a&gt;&#039;s keynote. It&#039;s always nice to see someone showing plain enthusiasm, and I couldn&#039;t agree more with him about the &quot;lost magic&quot; of computing. Had a chat with him afterwards about &lt;a href=&quot;http://www.amee.com/&quot;&gt;AMEE&lt;/a&gt; and other things. He also seems to have put together some odd but dull things that I had noticed a need for - EU VAT codings and ISO language references as web services!
I didn&#039;t really enjoy David Soria Parra&#039;s talk on sharding. It all came across as very negative and many of the ways of doing it and coping with the fallout were not really discussed. No mention of &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.1/en/partitioning.html&quot;&gt;MySQL 5.1&#039;s partitioning&lt;/a&gt; (which is limited, but is at least a start), or more radical approaches like &lt;a href=&quot;http://www.continuent.com/community/sequoia&quot;&gt;Sequoia&lt;/a&gt;.
David Axmark&#039;s talk on &lt;a href=&quot;https://launchpad.net/drizzle&quot;&gt;Drizzle&lt;/a&gt; was more interesting than I expected, nice to see effort being put into this direction.
Microsoft really does seem to be trying a bit harder these days - their CSS test suite for IE8 is very welcome, and the effort they are putting into PHP, apache and other projects benefits many people. It has to be said that while it&#039;s not a mainstream product, &lt;a href=&quot;http://www.microsoft.com/SURFACE/index.html&quot;&gt;Surface&lt;/a&gt; is really pretty cool to play with.
Chris Shiflett&#039;s talk was excellent too; his demos and examples were particularly good, and entertaining.
The post-conference social was great fun, I met lots of nice new people. After our move to France I suspect it will be harder to get to events like this, so I should make the most of them while I can!
I&#039;ve had several ideas for talks that I&#039;d like to do (I get sick of email sometimes!), so I guess I need to get a bit more proactive on actually submitting them to a call for papers. 
    </content:encoded>

    <pubDate>Mon, 02 Mar 2009 15:58:36 +0000</pubDate>
    <guid isPermaLink="false">http://marcus.bointon.com/archives/79-guid.html</guid>
    <category>aral balkan</category>
<category>conference</category>
<category>mysql</category>
<category>php</category>
<category>phplondon</category>
<category>phpuk2009</category>
<category>sequoia</category>
<category>surface</category>

</item>
<item>
    <title>Scalable irony</title>
    <link>http://marcus.bointon.com/archives/78-Scalable-irony.html</link>
            <category>PHP</category>
            <category>Techie</category>
    
    <comments>http://marcus.bointon.com/archives/78-Scalable-irony.html#comments</comments>
    <wfw:comment>http://marcus.bointon.com/wfwcomment.php?cid=78</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://marcus.bointon.com/rss.php?version=2.0&amp;type=comments&amp;cid=78</wfw:commentRss>
    

    <author>marcus@bointon.com (Marcus Bointon)</author>
    <content:encoded>
    &lt;a href=&quot;http://highscalability.com/scaling-digg-and-other-web-applications&quot;&gt;This article&lt;/a&gt; on highscalability.com is a really excellent rundown of some of the options available for scaling a site to the heights of Digg. Ironically enough, at the time of writing the highscalabilitycom web server shows this error:
&lt;blockquote&gt;Unable to connect to database server
The MySQL error was: User highscal_admin already has more than &#039;max_user_connections&#039; active connections. &lt;/blockquote&gt;I can point them at this really good article on how to avoid problems like this... oh, wait... 
    </content:encoded>

    <pubDate>Mon, 02 Mar 2009 15:52:13 +0000</pubDate>
    <guid isPermaLink="false">http://marcus.bointon.com/archives/78-guid.html</guid>
    
</item>
<item>
    <title>Mixers</title>
    <link>http://marcus.bointon.com/archives/77-Mixers.html</link>
            <category>Music</category>
    
    <comments>http://marcus.bointon.com/archives/77-Mixers.html#comments</comments>
    <wfw:comment>http://marcus.bointon.com/wfwcomment.php?cid=77</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://marcus.bointon.com/rss.php?version=2.0&amp;type=comments&amp;cid=77</wfw:commentRss>
    

    <author>marcus@bointon.com (Marcus Bointon)</author>
    <content:encoded>
    I&#039;ve had a little &lt;a href=&quot;http://www.behringer.com/EN/Products/UB802.aspx&quot;&gt;Behringer UB802&lt;/a&gt; mixer for some time and found it very frustrating to use as a front-end to my computer system. There&#039;s nothing particular wrong with it (clean audio, good functions, simple, reliable), it&#039;s just not very well suited to the job, mainly because its routing is not flexible enough to be used for audio input at the same time as output. One big problem I had was that the mic I use for audio input (mainly for Skype) routed to my speakers too; a recipe for feedback and poor input level.
In order to resolve all this, I&#039;d been contemplating a &lt;a href=&quot;http://www.soundcraft.com/product_sheet.asp?product_id=121&quot;&gt;Soundcraft Compact&lt;/a&gt; 10 as it seemed to have much better routing options. Last week I managed to pick up the smaller Compact 4 for a mere £30 on eBay (I figured I could live without the extra size and inputs for that price). What a difference! It achieves its wonders by having an additional &quot;recording&quot; mix buss. It also has separate routing for monitoring. Each channel has a button that when pressed, routes that input to the recording buss and removes it from the main mix. Similarly there is a monitor button that routes it to the monitor buss. if neither are pressed, it goes to the main mix, which you can conveniently route back to the monitor mix too. Multiple mix busses are par for the course on bigger mixers, but almost nobody does it for small mixers, yet there are tons of n:2 small mixers around that are used in this role, suggesting there are a lot of frustrated users that don&#039;t know there is a way out. As Soundcraft&#039;s manual says:
&lt;blockquote&gt;Why dont other manufacturers design consoles like this ? 
a)  Because they are out of touch ? 
b)  Because they are not very innovative ? 
c)  Because they dont have the experience ? 
d)  Because they dont listen to their users ? 
Who knows :-)&lt;/blockquote&gt;
The upshot of all this is that I can route the microphone to the computer&#039;s audio inputs &lt;em&gt;without&lt;/em&gt; having it also appearing on the mix bus going to the monitors. As far as I can tell, this routing flexibility makes the Soundcraft about the only small mixer that&#039;s actually designed for this role. Most seem to gloss over this routing problem, or not want to &quot;confuse&quot; users with the concept of an additional mix buss. As an added bonus, it has two headphone outputs that are independent of the mix output, so I can turn my speakers down without turning down my headphones. The Behringer tries to do this, but only by giving you main and monitor mix levels, but as far as I can see you never really need the main mix outputs, only the monitor mix. The only real workaround for simple n:2 mixers is to have a separate mixer for input and output, which is quite a reasonable proposition when you see &lt;a href=&quot;http://www.guitarampkeyboard.com/en/behringer-xenyx-502/70279&quot;&gt;the price&lt;/a&gt; of things like the &lt;a href=&quot;http://www.behringer.com/EN/Products/502.aspx&quot;&gt;Behringer Xenyx 502&lt;/a&gt;, but I&#039;m much happier having it in one box. Behringer make bigger mixers that have more busses (I think the cheapest is the &lt;a href=&quot;http://www.behringer.com/EN/Products/1222FX.aspx&quot;&gt;Xenyx 1222FX&lt;/a&gt;), but they are also bigger, more complex and more expensive - overkill for my application.
It&#039;s also interesting to contrast the marketing. Behringer describes the 802 as having 8 inputs, which is technically true - 2 mono, 2 stereo, and a stereo return - but in reality that&#039;s only 5 independent inputs (total of 10 input channels). Soundcraft go the other way - the Compact 4 has 5 independent inputs at a push, but you can actually squeeze 8 channels into it in total, and you can actually get 16 channels into the Compact 10. British understatement at work?
The Behringer is still a great little mixer, and I&#039;ll miss its diminutive size, the aux send, and a couple of extra inputs (which, now I&#039;m firmly in software-synth land, isn&#039;t really a problem any more). Anyone want to buy my UB802? 
    </content:encoded>

    <pubDate>Wed, 28 Jan 2009 16:07:37 +0000</pubDate>
    <guid isPermaLink="false">http://marcus.bointon.com/archives/77-guid.html</guid>
    
</item>
<item>
    <title>Cookie frenzy</title>
    <link>http://marcus.bointon.com/archives/76-Cookie-frenzy.html</link>
            <category>Baking</category>
    
    <comments>http://marcus.bointon.com/archives/76-Cookie-frenzy.html#comments</comments>
    <wfw:comment>http://marcus.bointon.com/wfwcomment.php?cid=76</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://marcus.bointon.com/rss.php?version=2.0&amp;type=comments&amp;cid=76</wfw:commentRss>
    

    <author>marcus@bointon.com (Marcus Bointon)</author>
    <content:encoded>
    &lt;a class=&#039;serendipity_image_link&#039; href=&#039;http://marcus.bointon.com/uploads/cookies2.jpg&#039;&gt;&lt;!-- s9ymdb:28 --&gt;&lt;img class=&quot;serendipity_image_left&quot; width=&quot;110&quot; height=&quot;83&quot; style=&quot;float: left; border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://marcus.bointon.com/uploads/cookies1.serendipityThumb.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;I&#039;ve been baking some cookies for Christmas. Not your average tree decorations, I&#039;ve been attempting to bake Alsatian &quot;Bredele&quot;, which might be called &quot;petit-fours&quot; in French. These have traditionally been baked at Christmas since the mid 15th century in Alsace. I&#039;m working from a French recipe book called &quot;Bredele et Gâteaux de Noël&quot; by Thierry Kappler. So far I&#039;ve made (I&#039;m using the Alsatian names as they are more interesting!):
&lt;ul&gt;&lt;li&gt;Wiss un schwàrzi butter bredele (those chequered and spiral ones)&lt;/li&gt;&lt;li&gt;Vanille hernle (litttle vanilla crescents, no picture as they, um, got tasted a bit too much)&lt;/li&gt;&lt;li&gt;Spretz bredele (wiggly piped vanilla shapes)&lt;/li&gt;&lt;li&gt;Hernele (a.k.a. Fer à Cheval, i.e horseshoes)&lt;/li&gt;&lt;li&gt;Kokos Màkrone (coconut macaroons)&lt;/li&gt;&lt;li&gt;Spetzbuewe (home-made jammy dodgers!)&lt;/li&gt;&lt;/ul&gt;I&#039;ve run into a few problems; the coconut macaroons were looking perfect until I added the coconut, which made the meringue separate horribly in the piping bag; the hernele dough was far too crumbly to roll, so I added an egg; the spretz bredele dough was far too stiff to pipe; I don&#039;t know if it&#039;s my oven, but nearly all the recipes turn out undercooked, so I&#039;m adding on about 50% cooking time.
I&#039;ve still got a few more to do, but I&#039;m pretty happy with how these are turning out; they certainly look nice! 
    </content:encoded>

    <pubDate>Wed, 10 Dec 2008 14:31:19 +0000</pubDate>
    <guid isPermaLink="false">http://marcus.bointon.com/archives/76-guid.html</guid>
    <category>alsace</category>
<category>baking</category>
<category>biscuits</category>
<category>cookies</category>
<category>french</category>
<category>recipe</category>

</item>
<item>
    <title>Synths, synths, synths</title>
    <link>http://marcus.bointon.com/archives/75-Synths,-synths,-synths.html</link>
            <category>Music</category>
    
    <comments>http://marcus.bointon.com/archives/75-Synths,-synths,-synths.html#comments</comments>
    <wfw:comment>http://marcus.bointon.com/wfwcomment.php?cid=75</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://marcus.bointon.com/rss.php?version=2.0&amp;type=comments&amp;cid=75</wfw:commentRss>
    

    <author>marcus@bointon.com (Marcus Bointon)</author>
    <content:encoded>
    Right now I&#039;m inundated with synthesizers. It&#039;s a hobby of mine to buy up old synths, refurbish them as best I can, then sell them on. Just recently I got very lucky on a &lt;a href=&quot;http://www.gumtree.com/&quot;&gt;Gumtree&lt;/a&gt; ad and picked up 4 in various states of disrepair: a Korg DS-8, Korg DW-8000, Roland JV-80 and a Roland D-70.
 &lt;br /&gt;&lt;a href=&quot;http://marcus.bointon.com/archives/75-Synths,-synths,-synths.html#extended&quot;&gt;Continue reading &quot;Synths, synths, synths&quot;&lt;/a&gt;
    </content:encoded>

    <pubDate>Tue, 09 Dec 2008 00:05:41 +0000</pubDate>
    <guid isPermaLink="false">http://marcus.bointon.com/archives/75-guid.html</guid>
    <category>electronics</category>
<category>korg</category>
<category>music</category>
<category>repair</category>
<category>roland</category>
<category>sample</category>
<category>synth</category>
<category>vintage</category>
<category>yamaha</category>

</item>

</channel>
</rss>