<?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>boakes.org &#187; WordPress</title>
	<atom:link href="http://boakes.org/tag/wordpress/feed/" rel="self" type="application/rss+xml" />
	<link>http://boakes.org</link>
	<description>A place for words and data that I publish (for the benefit of persons unknown).</description>
	<lastBuildDate>Wed, 08 Feb 2012 09:34:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>[wp]gang 2012</title>
		<link>http://boakes.org/links/wpgang-2012/</link>
		<comments>http://boakes.org/links/wpgang-2012/#comments</comments>
		<pubDate>Tue, 15 Nov 2011 19:40:13 +0000</pubDate>
		<dc:creator>Rich</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[camp]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[content management]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[meet]]></category>
		<category><![CDATA[meetup]]></category>
		<category><![CDATA[pfmeet]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wp]]></category>

		<guid isPermaLink="false">http://boakes.org/wpgang-2012/</guid>
		<description><![CDATA[A plan to hold a WordPress event, similar to wordcamp, but a one day gig in Portsmouth during spring 2012.]]></description>
			<content:encoded><![CDATA[<p>A plan to hold a WordPress event, similar to wordcamp, but a one day gig in Portsmouth during spring 2012.</p>
]]></content:encoded>
			<wfw:commentRss>http://boakes.org/links/wpgang-2012/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Delicious-to-WordPress</title>
		<link>http://boakes.org/link_republisher/</link>
		<comments>http://boakes.org/link_republisher/#comments</comments>
		<pubDate>Fri, 03 Sep 2010 23:44:47 +0000</pubDate>
		<dc:creator>Rich</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[bookmarks]]></category>
		<category><![CDATA[custom post type]]></category>
		<category><![CDATA[delicious]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[import tags]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[links]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[sync]]></category>
		<category><![CDATA[synchronize]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://boakes.org/?p=1927</guid>
		<description><![CDATA[Having tried several solutions for publishing delicious bookmarks on WordPress I came to the conclusion that nothing did what I wanted. What I wanted was each link on the front page, interspersed with any articles I write, so that the time-line of links and articles becomes apparent and the main page is a more dynamic [...]]]></description>
			<content:encoded><![CDATA[<p>Having tried several solutions for publishing <a href="http://delicious.com">delicious</a> bookmarks on WordPress I came to the conclusion that nothing did what I wanted.  What I wanted was each link on the front page, interspersed with any articles I write, so that the time-line of links and articles becomes apparent <em>and</em> the main page is a more dynamic thing that is more useful for me (this is, after all, a long-running set of technical experiments and what-ifs rather than a vanity site).  So my experimental sync plug-in is now operational and links can be seen (requires a stylesheet reload), currently, as green items, whereas articles show up blue.  Simple, huh?<span id="more-1927"></span></p>
<p>Technical minded folk may be interested to know that the plug-in uses a custom post type to keep the content sane and the formatting and editing simple.<br />
Tags <em>appear</em> to be working in the plug-in, but I need to tweak my theme.</p>
<p>In the spirit of release-early-release-often the code is here:</p>
<pre language="php">
< ?php
/*
 Plugin Name: Link Republisher
 Plugin Version: 0.17
 Plugin Author: Rich Boakes
 Plugin Author URI: http://boakes.org/
 Plugin URI: http://boakes.org/link_republisher
 Plugin License: GPL v3 ( http://www.gnu.org/licenses/gpl.html )
 Plugin Description: Retrieves the n most recent links from a JSON delicious, feed ordered by date, and creates a slug based on the title of the bookmark.  If the slug does not exist a custom type post is created with the slug, link  name as the title, description as the body, tags set to match those in delicious.  Additionally the custom post type can be set to appear in the loop, so links appear as stories.  Link publish time is set to the time that the link appears on delicious rather than the time the script runs. The internal cron system is used to run the lookup hourly.
*/

// The Delicious feed URI is: http://feeds.delicious.com/v2/{format}/{username}

// TODO
// [   ] Extract default vars for easy tweaking / addition of a UI one day
// [   ] Someone outside of GMT might want to improve the date settings
// [   ] Abstract the uri &#038; data map to work with other JSON feeds such as twitter,
//       e.g. twitter https://twitter.com/statuses/user_timeline/15493170.json
// [   ] Lookup user ID for when writing posts

// Change Log
// [0.1] Get basic functionality working
// [0.2] Add link metadata
// [0.3] Create special post template so link is rendered
// [0.4] Switch default status to Published rather than Draft
// [0.5] load every 15 minutes.
// [0.6] revert load every 15 minutes - silly idea
// [0.7] moved wp_cron registration to plugin activation event and added deactivation event
// [0.8] added cleanup to ensure multiple cron registrations are removed on deactivation
// [0.9] re-added 15 minute refresh
// [0.10] links are now downloaded when plugin is activated
// [0.11] added JSON based log
// [0.12] Get tags importing properly
// [0.13] Make it so that the entries really do show up for tag searches.  Tags included in link pages now appear in /tag/tagname pages making them useful.
// [0.14] Listen for the download links action so the cronjob now has an effect
// [0.15] various tweaks to try, unsuccessfully to make the cron event do anything at all
// [0.16] cron appears to be working again (hurrah!).
// [0.17] include links in RSS feeds 

$link_republisher_debug = false;
$delicious_user_id = "ear1grey";
$delicious_article_count = 10;

// Add a LINK post type
function create_post_type() {
  global $wp_rewrite;
  register_post_type( 'rjb_link',
    array(
      'labels' => array(
        'name' => __( 'Links' ),
        'singular_name' => __( 'Link' )
      ),
      'public' => true,
      'rewrite' => array('slug' => 'links'),
      'supports' => array(
        'title','editor','author','thumbnail','comments', 'custom-fields'
      ),
      'taxonomies' => array('post_tag')
    )
  );
  // is this a performance hit?  RSVP anyone with an answer!
  $wp_rewrite->flush_rules();
}

// include the LINK post type in the feed
function rjb_get_posts( $query ) {
	if ( is_home() &#038;&#038;
            false == $query->query_vars['suppress_filters']
        ) {
	    $query->set( 'post_type', array( 'post', 'rjb_link' ) );
	}
	return $query;
}

function download_links() {
	global $delicious_user_id, $delicious_article_count;
	json_log("Loading links.");
	load_links($delicious_user_id, $delicious_article_count);
}

function load_links($user, $count=10) {
	$raw_content = file("http://feeds.delicious.com/v2/json/ear1grey?count=10");
//	$raw_content = file("http://feeds.delicious.com/v2/json/$user?count=$count");
	$content = json_decode($raw_content[0]);
	foreach ($content as &#038;$bookmark) {
		import_link($bookmark);
	}
}

function slug_exists($slug) {
	global $wpdb;
	return $wpdb->get_row(
            "SELECT post_name FROM wp_posts WHERE post_name = '$slug';"
        );
}

function import_link($bookmark) {
	$slug = sanitize_title( $bookmark->d );
	if (!slug_exists($slug)) {
		// Create array for wp_update_post or wp_insert_post
		$id = wp_insert_post(
			array(
				'post_status' => 'publish',
				'post_type' => 'rjb_link',
				'post_title' => $bookmark->d,
				'post_content' => $bookmark->n,
				'post_name' => sanitize_title( $bookmark->d ),
				'post_date' => date('Y-m-d H:i:s', strtotime($bookmark->dt)),
				'post_date_gmt' => date('Y-m-d H:i:s', strtotime($bookmark->dt)),
				'tags_input' => $bookmark->t
			)
		);

		update_post_meta($id, 'url', $bookmark->u);

		wp_set_post_terms($id,$bookmark->t,'post_tag',true);
		json_log("Add: " . $bookmark->u);
	} else {
		json_log("Ignoring: " . $bookmark->u);
	}
}

register_deactivation_hook( __FILE__, 'linkrepublisher_off' );
register_activation_hook(__FILE__, 'linkrepublisher_on');
add_action( 'init', 'create_post_type' );
add_filter( 'pre_get_posts', 'rjb_get_posts' );

function linkrepublisher_on() {
	reset_log();
	json_log("link republisher on");
	wp_schedule_event(time()+200, 'hourly', 'link_republisher_update');
	wp_schedule_event(time()+1100, 'hourly', 'link_republisher_update');
	wp_schedule_event(time()+2000, 'hourly', 'link_republisher_update');
	wp_schedule_event(time()+2900, 'hourly', 'link_republisher_update');
	json_log("events scheduled");
	download_links();
}

add_action('link_republisher_update', 'download_links');

function linkrepublisher_off() {
	json_log("link republisher off");
	// ensure any and all crons are killed.
	wp_clear_scheduled_hook( 'link_republisher_update' );
}

function reset_log() {
	$log = array();
	update_option('json_log',json_encode($log));
}

function json_log($msg) {
	$raw_log = get_option('json_log');
	if ($raw_log) {
		$log = json_decode($raw_log);
	} else {
		$log = array();
	}
	$date = date('Y-m-d H:i:s',time());
	$log[] = array("t" => $date, "m" => $msg);
	update_option('json_log',json_encode($log));
}

add_filter('posts_where', 'include_rjb_links' );

function include_rjb_links( $q ) {
  if( is_tag() ) {
    // regex used under GPL from:
    // http://www.michelem.org/wordpress-plugin-tags4page/
    return preg_replace(
       "/ ([0-9a-zA-Z_]*\.?)post_type = 'post'/",
       "(${1}post_type = 'post' OR ${1}post_type = 'rjb_link')", $q );
   }

  return $q;
}

/*
 * Debug Page
 */
function lr_debug_menu() {
	$raw_log = get_option('json_log');
	$log = json_decode($raw_log);
	echo "</pre>
<pre>";
	print_r($log);
	echo "</pre>
<p>&#8220;;<br />
}<br />
function add_admin_menu($s) {<br />
	add_submenu_page(&#8216;tools.php&#8217;, &#8216;LR Debug&#8217;, &#8216;LR Debug&#8217;, &#8216;administrator&#8217;, dirname(__FILE__) , &#8216;lr_debug_menu&#8217;);<br />
	return $s;<br />
}<br />
add_action(&#8216;admin_menu&#8217;, &#8216;add_admin_menu&#8217;);</p>
<p>// add rjb_link entries to the any rss feed<br />
function myfeed_request($qv) {<br />
	if (isset($qv['feed']) &#038;&#038; !isset($qv['post_type']))<br />
		$qv['post_type'] = array(&#8216;post&#8217;, &#8216;rjb_link&#8217;);<br />
	return $qv;<br />
}<br />
add_filter(&#8216;request&#8217;, &#8216;myfeed_request&#8217;);</p>
<p>?></p>
<p>Released under the GPLv2 license as always.</p>
]]></content:encoded>
			<wfw:commentRss>http://boakes.org/link_republisher/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>boakes.org » Postalicious is Breaking</title>
		<link>http://boakes.org/links/boakes-org-%c2%bb-postalicious-is-breaking/</link>
		<comments>http://boakes.org/links/boakes-org-%c2%bb-postalicious-is-breaking/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 15:03:04 +0000</pubDate>
		<dc:creator>Rich</dc:creator>
				<category><![CDATA[automatic]]></category>
		<category><![CDATA[bookmarks]]></category>
		<category><![CDATA[delicious]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://boakes.org/boakes-org-%c2%bb-postalicious-is-breaking/</guid>
		<description><![CDATA[This is a test to see if my postalicious fix works.]]></description>
			<content:encoded><![CDATA[<p>This is a test to see if my postalicious fix works.</p>
]]></content:encoded>
			<wfw:commentRss>http://boakes.org/links/boakes-org-%c2%bb-postalicious-is-breaking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shifting Mind » Postalicious</title>
		<link>http://boakes.org/links/shifting-mind-%c2%bb-postalicious/</link>
		<comments>http://boakes.org/links/shifting-mind-%c2%bb-postalicious/#comments</comments>
		<pubDate>Fri, 06 Aug 2010 05:40:43 +0000</pubDate>
		<dc:creator>Rich</dc:creator>
				<category><![CDATA[automatic]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[del.icio.us]]></category>
		<category><![CDATA[delicious]]></category>
		<category><![CDATA[links]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wp]]></category>

		<guid isPermaLink="false">http://boakes.org/shifting-mind-%c2%bb-postalicious/</guid>
		<description><![CDATA[Alternative to delicious auto-log-posting. Control the conent. No XMLRPC necessary.]]></description>
			<content:encoded><![CDATA[<p>Alternative to delicious auto-log-posting.  Control the conent.  No XMLRPC necessary.</p>
]]></content:encoded>
			<wfw:commentRss>http://boakes.org/links/shifting-mind-%c2%bb-postalicious/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blog Posting</title>
		<link>http://boakes.org/links/blog-posting/</link>
		<comments>http://boakes.org/links/blog-posting/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 20:46:42 +0000</pubDate>
		<dc:creator>Rich</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[del.icio.us]]></category>
		<category><![CDATA[posting]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wp]]></category>
		<category><![CDATA[xml-rpc]]></category>

		<guid isPermaLink="false">http://boakes.org/blog-posting/</guid>
		<description><![CDATA[Schedule delicios to automatically post to a WordPress blog.]]></description>
			<content:encoded><![CDATA[<p>Schedule delicios to automatically post to a WordPress blog.</p>
]]></content:encoded>
			<wfw:commentRss>http://boakes.org/links/blog-posting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Custom post types in WordPress</title>
		<link>http://boakes.org/links/custom-post-types-in-wordpress/</link>
		<comments>http://boakes.org/links/custom-post-types-in-wordpress/#comments</comments>
		<pubDate>Thu, 08 Jul 2010 14:48:00 +0000</pubDate>
		<dc:creator>Rich</dc:creator>
				<category><![CDATA[custom]]></category>
		<category><![CDATA[custom-post-types]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[posts]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://boakes.org/custom-post-types-in-wordpress/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://boakes.org/links/custom-post-types-in-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPad Frenzy</title>
		<link>http://boakes.org/ipad-frenzy/</link>
		<comments>http://boakes.org/ipad-frenzy/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 11:52:41 +0000</pubDate>
		<dc:creator>Rich</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iPod]]></category>
		<category><![CDATA[slate]]></category>
		<category><![CDATA[tablet computing]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WPSuperCache]]></category>

		<guid isPermaLink="false">http://boakes.org/ipad-frenzy/</guid>
		<description><![CDATA[Wow, my iPad article from 5 years back is having a bit of a friendship day, and as a result the server is having its busiest day ever. top - 12:40:22 up 134 days, 2:52, 1 user, load average: 10.24, 6.99, 5.46 Tasks: 90 total, 15 running, 75 sleeping, 0 stopped, 0 zombie Cpu(s): 94.7%us, [...]]]></description>
			<content:encoded><![CDATA[<p>Wow, my <a href="http://boakes.org/iPad">iPad</a> article from 5 years back is having a bit of a friendship day, and as a result the server is having its busiest day ever.<span id="more-1253"></span></p>
<pre>top - 12:40:22 up 134 days,  2:52,  1 user,  load average: 10.24, 6.99, 5.46
Tasks:  90 total,  15 running,  75 sleeping,   0 stopped,   0 zombie
Cpu(s): 94.7%us,  4.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.7%hi,  0.7%si,  0.0%st</pre>
<p>Everything&#8217;s locked down using <a href="http://wordpress.org/extend/plugins/wp-super-cache/">WP Super Cache</a> and as a result the server seems to be coping, though its CPU use is way up.</p>
<p>Note: if you&#8217;re going to reference the article please just link to it, and don&#8217;t hotlink the image.  Depending on how much residual traffic the current hotlinking generates I may have to deny access to the image and redirect to a picture of a kitten, or something.</p>
]]></content:encoded>
			<wfw:commentRss>http://boakes.org/ipad-frenzy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WordCamp UK 2009 Tickets</title>
		<link>http://boakes.org/wordcampuk-2009/</link>
		<comments>http://boakes.org/wordcampuk-2009/#comments</comments>
		<pubDate>Sat, 11 Apr 2009 19:24:37 +0000</pubDate>
		<dc:creator>Rich</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Cardiff]]></category>
		<category><![CDATA[Tickets]]></category>
		<category><![CDATA[WordCamp]]></category>
		<category><![CDATA[WordCampUK]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://boakes.org/?p=1068</guid>
		<description><![CDATA[Last year&#8217;s WordCamp UK was a huge success. Around sixty people turned up to the Birmingham gig with backgrounds as diverse as one might hope for and expect, given that WordPress is used by all kinds of people for all sorts of things: bloggers, developers, hackers, journalists, authors, academics, idealists and dreamers were all there, [...]]]></description>
			<content:encoded><![CDATA[<p>Last year&#8217;s WordCamp UK was a <em>huge</em> success.  Around sixty people turned up to the Birmingham gig with backgrounds as diverse as one might hope for and expect, given that WordPress is used by all kinds of people for all sorts of things: bloggers, developers, hackers, journalists, authors, academics, idealists and dreamers were all there, and most stood up and talked for a few minutes on what they&#8217;re doing with WordPress, or how they&#8217;re making WordPress better, or how they&#8217;d like to do stuff if only they could find the help (and lo, the help was forthcoming, and it was good).  Following on from that success, it made sense to make WordCampUK an annual affair, so <a href="http://wordcamp.org.uk/en/">WordCampUK 2009</a> was born.<span id="more-1068"></span></p>
<p>The money and confidence left over from last year has allowed a bigger venue too, which means the potential for an even more diverse collection of presenters and attendees increases, so, if you&#8217;re a WordPress user, a blogger who&#8217;d like to do more than just write articles, a potential user, a PHP hacker looking for an outlet, or if you just like hanging out in un-conferences with interesting people, head for Cardiff in July (18th &#038; 19th).</p>
<p>The evening entertainment, laid on by Jon Bounds was one of the funniest pub quizzes we&#8217;ve witnessed too:<br />
<img style="float:none;clear:both;"  src="http://farm4.static.flickr.com/3165/2685143667_7975777d3e.jpg" alt="Jon Bounds Pub Quiz, WordCampUK 2008" /></p>
<p>The above pic (taken by <a href="http://benjaminellis.co.uk/">Benjamin</a>, with me being artistically blurry bottom left) and <em>loads</em> of others from the weekend can be <a href="http://www.flickr.com/search/?q=wordcampuk">found on flickr</a>. So far, <a href="http://otrops.com/archive/2009/04/11/wordcamp-uk-2009-update/">Jeff</a>, <a href="http://davepress.net/">Dave</a>, <a href="http://www.proseknitic.de/">xxx</a>, </p>
<p>Find out more about WordCamp 2009 at: <a href="http://wordcamp.org.uk/en/">http://wordcamp.org.uk/en/</a><br />
Tickets can be purchased from Eventbrite: <a href="http://wordcampuk2009.eventbrite.com/">http://wordcampuk2009.eventbrite.com/</a></p>
<p>Tickets are being snapped up already by the likes of <a href="http://backpass.org/">Matt</a>, <a href="http://zed1.com/journalized/">Mike</a>, <a href="http://www.proseknitic.de/">Holly</a>, <a href="http://peter.westwood.name/">Westi</a>, <a href="http://www.peterjharrison.me/">Peter</a>, <a href="http://www.uk-experience.com/">Rob</a>, <a href="http://puffbox.com/">Simon</a>, <a href="http://www.hms69.com/">Martyn</a>, <a href="http://tonyscott.org.uk/">Tony</a>, <a href="http://furious-angel.com/me/">Vixx</a>, <a href="http://www.simonwheatley.co.uk/">Simon</a>, &#038; <a href="http://wordcamp.org.uk/en/attendees/">others</a> and whilst the venue is bigger, spaces <em>are</em> limited, so please book early to avoid disappointment!</p>
]]></content:encoded>
			<wfw:commentRss>http://boakes.org/wordcampuk-2009/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>bv2.co.uk</title>
		<link>http://boakes.org/bv2/</link>
		<comments>http://boakes.org/bv2/#comments</comments>
		<pubDate>Wed, 30 Jul 2008 08:41:19 +0000</pubDate>
		<dc:creator>Rich</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Aside]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://boakes.org/?p=781</guid>
		<description><![CDATA[My colleague Barrett Abernethy has drunk from the WordPress fountain for the first time and found it to be good. He&#8217;s writing at bv2.co.uk on coding for GPUs, games consoles and (I predict) cycling.]]></description>
			<content:encoded><![CDATA[<p>My colleague Barrett Abernethy has drunk from the WordPress fountain for the first time and found it to be good.   He&#8217;s writing at <a href="http://www.bv2.co.uk">bv2.co.uk</a> on coding for GPUs, games consoles and (I predict) cycling.</p>
]]></content:encoded>
			<wfw:commentRss>http://boakes.org/bv2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress for iPhone</title>
		<link>http://boakes.org/wordpress-for-iphone/</link>
		<comments>http://boakes.org/wordpress-for-iphone/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 08:00:16 +0000</pubDate>
		<dc:creator>Rich</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[automattic]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[WordCamp]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://boakes.org/wordpress-for-iphone/</guid>
		<description><![CDATA[One of the coolest future applications that was discussed at WordCamp UK last weekend is the WordPress client for the Apple iPhone. Well, it&#8217;s just arrived on the iTunes store (here), and I&#8217;m using it to write this short test article. After the initial setup (for which I only needed to enter a hostname, user [...]]]></description>
			<content:encoded><![CDATA[<p>One of the coolest future applications that was discussed at WordCamp UK last weekend is the WordPress client for the Apple iPhone.  Well, it&#8217;s just arrived on the iTunes store (<a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=285073074&#038;mt=8">here</a>), and I&#8217;m using it to write this short test article.<span id="more-763"></span></p>
<p>After the initial setup (for which I only needed to enter a hostname, user I&#8217;d and password) I was imwdiately [sic] able to begin writing.  The very good predictive spelling correction on the iPhone means it&#8217;s remarkably easy to write quickly, but it&#8217;s not entirely mistake free so proof reading is still a necessity.</p>
<p>In use, entering categories was a doddle using scroll &#038; point.  Tags had to be hand entered and it wasn&#8217;t obvious if they should be comma separated or not.  Slug control wasn&#8217;t obviously possible so careful title selection is necessary. The other obvious omissions from the basic toolset are a link helper and insertion of the &#8220;more&#8221; button.</p>
<p>There&#8217;s a preview button that shows the content as it will appear when published.  Also pictures in the camera roll or taken live can be uploaded very easily although they&#8217;re not visible until the post is published (and there doesn&#8217;t seem to be a way to rotate pictures yet), and they&#8217;re only appended to the end of the content.</p>
<p>The main omission is an iPhone standard problem &#8211; the lack of copy and paste.  It&#8217;s common for me to want to rearrange sentences after they&#8217;re written and this is not possible without a lot of deleting and retyping.</p>
<p>Generally it&#8217;s a very slick and very much needed tool that for v1 does everything it needs to do.  Mobile WordPress use just became very simple!</p>
<p>Read the <a href="http://iphone.wordpress.org/2008/07/22/wordpress-for-iphone-available-now/">launch announcement</a>, or <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=285073074&#038;mt=8">download WordPress for iPhone</a> here.</p>
<p><a href="http://boakes.org/wp/wp-content/uploads/2008/07/p-640-480-55e9df59-5227-435d-8340-7908445e7973.jpeg"><img src="http://boakes.org/wp/wp-content/uploads/2008/07/p-640-480-55e9df59-5227-435d-8340-7908445e7973.jpeg" alt="photo" width="225" height="300" class="alignnone size-full wp-image-364" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://boakes.org/wordpress-for-iphone/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WordCamp UK Breaks Even</title>
		<link>http://boakes.org/wordcampuk-breaks-even/</link>
		<comments>http://boakes.org/wordcampuk-breaks-even/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 13:49:14 +0000</pubDate>
		<dc:creator>Rich</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[bbPress]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Open Standards]]></category>
		<category><![CDATA[Website]]></category>
		<category><![CDATA[WordCamp]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://boakes.org/?p=756</guid>
		<description><![CDATA[The very good news on the grapevine is that the first WordCamp UK has, already broken even (through sponsorship and ticket sales) with a full 10 days of ticket sales still to go. This is particularly good news since it pretty much guarantees the success of this years event, and future events. If you&#8217;ve been [...]]]></description>
			<content:encoded><![CDATA[<p>The very good news on the grapevine is that the first <a href="http://uk.wordcamp.org/">WordCamp UK</a> has, already broken even (through sponsorship and ticket sales) with a full 10 days of ticket sales still to go.  This is particularly good news since it pretty much guarantees the success of this years event, and future events.  If you&#8217;ve been thinking about popping along to say hello, now&#8217;s a very good time to <a href="http://wordcampuk2008.eventbrite.com/">get your ticket</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://boakes.org/wordcampuk-breaks-even/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WordCamp UK</title>
		<link>http://boakes.org/wordcamp-uk/</link>
		<comments>http://boakes.org/wordcamp-uk/#comments</comments>
		<pubDate>Fri, 30 May 2008 11:48:27 +0000</pubDate>
		<dc:creator>Rich</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Website]]></category>
		<category><![CDATA[wordcampuk wordpress]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://boakes.org/?p=751</guid>
		<description><![CDATA[WordCamp is coming to the UK.Â  WordCamp is a weekend event where the users and developers of WordPress (i.e. members of the general public) can get together for a series of formal presentations, less formal discussions and informal refreshments. I&#8217;ve run this site on WordPress since 2003.Â  I&#8217;ve also written a couple of plugins for [...]]]></description>
			<content:encoded><![CDATA[<p>WordCamp is coming to the UK.Â  WordCamp is a weekend event where the users and developers of WordPress (i.e. members of the general public) can get together for a series of formal presentations, less formal discussions and informal refreshments.</p>
<p>I&#8217;ve run this site on WordPress since 2003.Â  I&#8217;ve also written a couple of plugins for WordPress. So that&#8217;s why I&#8217;m interested in WordCamp.Â  It&#8217;s a chance for me to put some faces to names and hopefully to help others along the path to publishing using zero cost, free (as in liberty), open source software that adheres to, and promotes global open standards.</p>
<p>If you&#8217;re a user of WordPress, or if you&#8217;ve gone further and started to develop your own plugins, or if you&#8217;d like to start a website but don&#8217;t know where to start, or if you&#8217;re generally interested in the development of open standards or open source content management systems (and the satellite web services that support them) &#8211; WordCamp may be of interest to you.</p>
<ul>
<li>Date: Saturday and Sunday 19-20 July 2008</li>
<li style="text-decoration: line-through;">Venue: Aston University, Birmingham</li>
<li>Venue: <a href="http://www.orangestudio.co.uk/">The Studio</a>, Birmingham</li>
</ul>
<p>Find out more at the <a title="Wordcamp UK" href="http://uk.wordcamp.org/">WordCamp UK website</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://boakes.org/wordcamp-uk/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>b0rked</title>
		<link>http://boakes.org/b0rked/</link>
		<comments>http://boakes.org/b0rked/#comments</comments>
		<pubDate>Wed, 02 Apr 2008 15:43:07 +0000</pubDate>
		<dc:creator>Rich</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Spam]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Website]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://boakes.org/?p=740</guid>
		<description><![CDATA[Something&#8217;s broken on the database that runs this site, specifically there&#8217;s b0rkage in the comment table, and the ssh daemon is not reachable. Perhaps it&#8217;s to do with the larger than normal amount of spam that&#8217;s been arriving today (for &#8220;larger than normal&#8221; read: one metric truckload). More info later after I&#8217;ve had a poke [...]]]></description>
			<content:encoded><![CDATA[<p>Something&#8217;s broken on the database that runs this site, specifically there&#8217;s <a href="http://en.wiktionary.org/wiki/Bork">b0rkage</a> in the comment table, and the ssh daemon is not reachable.  Perhaps it&#8217;s to do with the larger than normal amount of spam that&#8217;s been arriving today (for &#8220;larger than normal&#8221; read: one metric truckload).  More info later after I&#8217;ve had a poke around.  Film at 11.<span id="more-740"></span></p>
<p><strong>Update1:</strong> Comments recovered, the DB had become corrupt somehow, possibly an overloading issue as the trackback comments were recorded.</p>
<p><strong>Update 2:</strong> I&#8217;m not sure what caused the see-saw to tip over but when rebooted the load average was starting at 1 and heading skywards through 6 before the ssh session died.  This all happened after I upgraded to WP2.5 (though I&#8217;ve been on the bleeding edge builds for ages, so it&#8217;s unlikely to be related&#8230;  For a while I thought it could be file permissions.  Thankfully the folks at <a href="http://www.bytemark.co.uk">bytemark</a> provide a VM admin shell that enabled me to reboot the machine whilst it was under siege, gaining a couple of minutes after each reboot during which I could invoke some countermeasures.</p>
<p><strong>Update 3:</strong> I&#8217;ve installed <a href="http://ocaoimh.ie/wp-super-cache/">Donncha&#8217;s WPSuperCache</a> plugin which has reduced the load average down enough that the server is at least usable again, so I can do more investigation.</p>
<p><strong>Update 4:</strong>Looking at my helpfully rotated log files I notice that today&#8217;s log is approximately 25x the size of a normal log. a grep of the logfile suggests that we&#8217;ve been hit with approximately 25000 trackback spam messages between 4am and 2pm &#8230; <em>hmmm</em>.
<pre>labs:/home/www/boakes.org/logs# grep -c "/trackback HTTP" access.log.1
<strong>24447</strong></pre>
<p><strong>Update 5:</strong> I&#8217;ve also installed <a href="http://www.bad-behavior.ioerror.us/">Mike Hampton&#8217;s Bad Behaviour</a> and that&#8217;s helped reduce the load too&#8230;</p>
<p>The sooner I can get automatic htaccess level banning working again on WP2.5 the better! Today the server&#8217;s fielded fewer trackback requests, just 7000 between 4am and 11am, a mere 1000 per hour.</p>
<p><strong>Update 6 (48 hours on):</strong> top is now showing a 15 minute load average of 0.15, something way better than the previous normality has been resumed.  What&#8217;s particularly interesting is that Google analytics for the day shows a lower than normal page view count and the number of advert clicks was also proportionally down.  This suggests that spammers do little or no automatic clicking on adverts, which will be reassuring to customers of Google Adsense!</p>
<p><strong>Update 7 4 days later:</strong> After more tweaking of super cache (it seems it was only enabling the default cache due to a mod_rewrite configuration problem) the load average on top now looks like this&#8230;<br />
<code><br />
top - 19:05:01 up 3 days, 20:51,  1 user,  load average: 0.07, 0.00, 0.00<br />
Tasks:  62 total,   1 running,  61 sleeping,   0 stopped,   0 zombie<br />
Cpu(s):  0.7%us,  0.0%sy,  0.0%ni, 99.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st<br />
</code></p>
<p>That&#8217;s a fifteen minute load average of 0.00 &#8230; <em>very</em> low!</p>
]]></content:encoded>
			<wfw:commentRss>http://boakes.org/b0rked/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Worst Offenders for WordPress 2.5 &#8211; Pre-Alpha</title>
		<link>http://boakes.org/worst-offenders-for-wordpress-25/</link>
		<comments>http://boakes.org/worst-offenders-for-wordpress-25/#comments</comments>
		<pubDate>Thu, 13 Mar 2008 16:26:55 +0000</pubDate>
		<dc:creator>Rich</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[akismet]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Spam]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Website]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[worst offenders]]></category>

		<guid isPermaLink="false">http://boakes.org/?p=738</guid>
		<description><![CDATA[I&#8217;m in the process of rewriting the Worst Offenders plugin for the soon-to-be-released WordPress 2.5. Before I make a tested and polished version of the code globally available, I&#8217;d be interested to hear from anyone who&#8217;d like to alpha test it. As before Worst Offenders works cooperatively with other anti-spam plugins: its primary purpose is [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m in the process of rewriting the Worst Offenders plugin for the soon-to-be-released WordPress 2.5.   Before I make a tested and polished version of the code globally available, I&#8217;d be interested to hear from anyone who&#8217;d like to alpha test it.</p>
<p>As before Worst Offenders works cooperatively with other anti-spam plugins: its primary purpose is identifying and deleting the comments that are 100% definitely spam (sent by the very worst offenders) so that any &#8220;false positives&#8221; (sent by real genuine humans) can be rescued from the spam bin!<span id="more-738"></span></p>
<div style="float: right; padding-left: 1em;"><a href="http://wordpress.org/extend/plugins/worst-offenders/"><img  alt="Download this file" src="/misc/download.png" /><br />Download it from<br /> WordPress.org</a></div>
<p>I&#8217;ve got it working on this site already, where it&#8217;s proved faster than the previous versions &#8211; it also has a nicer user interface.  There are a few minor operational features that need to be finalised, but it&#8217;s basically capable of doing what it&#8217;s supposed to.</p>
<p>This version has a pluggable interface, so different &#8220;litmus tests&#8221; can be applied to spam at the same time, and third parties can easily write tests without having to write a whole interface.</p>
<p><img class="soloimg" src="/pics/2008/wo/wo3.0.0a.png" alt="The Worst Offenders v3.0.0.0alpha User Interface" /></p>
<p>I&#8217;m keen to hear from people who:</p>
<ul>
<li>Know their way around WordPress/PHP already.</li>
<li>Can take a look at the litmus test API and comment on ways to improve it.</li>
<li>Suffer from very high spam loads (hundreds or thousands per day) who&#8217;ll be able to give the existing litmus tests a bit of a workout to check if their SQL is as efficient as I hope.</li>
</ul>
<p>Development SVN is being kindly hosted by <a href="http://dev.wp-plugins.org/browser/worst-offenders">Automattic</a> and releases will be available <a href="http://wordpress.org/extend/plugins/worst-offenders/">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://boakes.org/worst-offenders-for-wordpress-25/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Akismet Billion</title>
		<link>http://boakes.org/akismet-billion/</link>
		<comments>http://boakes.org/akismet-billion/#comments</comments>
		<pubDate>Wed, 21 Mar 2007 15:12:05 +0000</pubDate>
		<dc:creator>Rich</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Spam]]></category>
		<category><![CDATA[Website]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://boakes.org/akismet-billion/</guid>
		<description><![CDATA[It&#8217;s only 15 months since I mentioned the rocket-like acceleration of Akismet which went from a standing start to the point where it had fended off a million spam messages for its users in just 4 months. If things had continued at that pace it would have squashed a cool 5 million spams by now. [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s only 15 months since I mentioned the rocket-like acceleration of <a href="http://akismet.com">Akismet</a> which went from <a href="http://boakes.org/akismet">a standing start</a> to the point where it had fended off <a href="http://boakes.org/akismet-million">a million spam messages</a> for its users in just 4 months.  If things had continued at that pace it would have squashed a cool 5 million spams by now.<span id="more-717"></span></p>
<p>There&#8217;s been a bit of a ramp, however:
<ol>
<li>Nine months ago Akismet caught it&#8217;s 100 millionth spam.</li>
<li>Sometime this week Akismet will kill spam number <em>one billion</em>.</li>
</ol>
<p>Check out the stats, watch it happen <em><a href="http://akismet.com/stats">live</a></em>.</p>
<p>A virtual high-5 to everyone at <a href="http://automattic.com">Automattic</a>.  Great job guys, a great service, and the scaling has been perfectly handled.</p>
<p>Perhaps we should start a sweep-stake for how long it will take to hit one trillion?</p>
]]></content:encoded>
			<wfw:commentRss>http://boakes.org/akismet-billion/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google Analytics Plugin for BBPress</title>
		<link>http://boakes.org/analytics-bbpress/</link>
		<comments>http://boakes.org/analytics-bbpress/#comments</comments>
		<pubDate>Fri, 20 Oct 2006 01:06:29 +0000</pubDate>
		<dc:creator>Rich</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[bbPress]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Website]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://boakes.org/analytics-bbpress/</guid>
		<description><![CDATA[The plugin system on BBPress is still rather rudimentary (you create a folder called &#8220;my-plugins&#8221;) and any php that exists therein is considered to be an activated plugin. The good news here is, that (a) it works and (b) it&#8217;s so similar to the WordPress that many plugins will magically work without modification. My Google [...]]]></description>
			<content:encoded><![CDATA[<p>The plugin system on BBPress is still rather rudimentary (you create a folder called &#8220;my-plugins&#8221;) and any php that exists therein is considered to be an activated plugin.  The good news here is, that (a) it works and (b) it&#8217;s so similar to the WordPress that many plugins will magically work without modification.  My <a href="/analytics">Google Analytics Plugin for WordPress</a> is (almost) one such example.<span id="more-646"></span></p>
<p>I was surprised, upon installing the <a href="/talk">forum</a> at how many people were signing up, and I wanted to be able to monitor it&#8217;s popularity, so naturally I set about porting my existing plugin with a view to keeping it usable on both WordPress and BBPress platforms.</p>
<p>In total it required about three small code changes, and the upshot is that the same code can now be installed on BBPress and WordPress.</p>
<p>The main difference is that if you&#8217;re using it on BBPress there is no nice user interface in which to set the uastring, you must do this by hand.</p>
<p><strong>Instructions</strong></p>
<ol>
<li><a href="/download/googleanalytics.txt"><img style="float:right;" alt="Download this file" src="/misc/download.png" />Download this file</a></li>
<li>Edit line 27, changing $uastring = &#8220;UA-00000-0&#8243;; to whatever your ua string is.</li>
<li>Create a folder called &#8220;my-plugins&#8221; within your bbpress directory.</li>
<li>Save the file as &#8220;googleanalytics.php&#8221; to your my-plugins folder.</li>
</ol>
<p>&#8230;and that&#8217;s all there is to it.  Of course, it takes Google a few hours to actually show any results, so I have no idea if it&#8217;s working perfectly yet, but if you reload any forum page and scroll to the bottom of the source you can see the analytics code in place, doin&#8217; it&#8217;s thing.  <img src='http://boakes.org/x/wp/live/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://boakes.org/analytics-bbpress/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>BBPress Released</title>
		<link>http://boakes.org/bbpress-released/</link>
		<comments>http://boakes.org/bbpress-released/#comments</comments>
		<pubDate>Sat, 14 Oct 2006 09:25:58 +0000</pubDate>
		<dc:creator>Rich</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[bbPress]]></category>
		<category><![CDATA[Eulogize]]></category>
		<category><![CDATA[Slashdot]]></category>
		<category><![CDATA[Website]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://boakes.org/bbpress-released/</guid>
		<description><![CDATA[In a market where BB software is two-a-penny (or cheaper, given the open-source nature of most good software) what's BBPress got that made me use it?]]></description>
			<content:encoded><![CDATA[<p><a href="http://bbpress.org">BBPress</a> has been <a href="http://bbpress.org/blog/2006/10/bbpress-072/">released</a> today (<a href="/talk">try it</a>).  For quite some time now I&#8217;ve been quietly using <a href="http://bbpress.org/">BBPress</a> for managing thoughts and discussions on another website.  This has been possible for two reasons: firstly, the pre-release version of BBPress has been quite stable and secondly, I&#8217;ve been using it in a password protected area so it&#8217;s not been open to public use and abuse.<span id="more-640"></span></p>
<p>BBPress is, quite simply, just another <a href="http://en.wikipedia.org/wiki/PHP">PHP</a> based bulletin board (BB) system which to the layman means it is the software that runs forum websites.  So in a market where BB software is two-a-penny (or cheaper, given the open source nature of most good software) what&#8217;s BBPress got that made me use it?</p>
<ol>
<li><strong>A Trusted Open Source</strong><br />It&#8217;s core development is being handled by the same loose group of <a href="http://automattic.com">folks</a> that build <a href="http://wordpres.org">WordPress</a>, which has powered this website for the last few years.</li>
<li><strong>Minimalist Design</strong><br/>Every other BB that I looked at was full of bells, whitls, frills and flourishes that I didn&#8217;t need or want &#8211; and I certainly didn&#8217;t want the hassle of mainting or disabling such irrelevancies.  BBPress eschews these in favour if a lean core, everything else (just like wordpress) can be done with plugins.</li>
<li><strong>Extensible</strong><br/>Yep, I said plugins.</li>
<li><strong>Integrable</strong><br/>I mentioned WordPress already, well, it can integrate nicely with it&#8217;s user database, so if you&#8217;ve got wordpress ID&#8217;s and roles that you already manage, they can be seamlessly used by bbpress, keeping admin to a minimum.</li>
<li><strong>No Spam</strong><br/>BBPress can be protected by Akismet, the same service that already protects this site, which has now been blissfully spam free for over a year.</li>
<li><strong>Released</strong><br/>I started using it before it&#8217;s release because I knew I had a fairly safe walled garden in which to get friendly with it.  Now that version 0.72 &#8220;Bix&#8221; to give it it&#8217;s full name has been released, others with more public websites may want to have a play.</li>
</ol>
<p>If you&#8217;re wondering what it feels and looks like, you can <a href="/talk">have a go</a> on this site.  Eventually I plan to move most discussion over to the BB side of things and leave comments open for trackbacks and pingbacks only.</p>
]]></content:encoded>
			<wfw:commentRss>http://boakes.org/bbpress-released/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Akismet htaccess extension</title>
		<link>http://boakes.org/akismet-htaccess-extension/</link>
		<comments>http://boakes.org/akismet-htaccess-extension/#comments</comments>
		<pubDate>Thu, 08 Jun 2006 16:57:57 +0000</pubDate>
		<dc:creator>Rich</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Spam]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://boakes.org/akismet-htaccess-extension</guid>
		<description><![CDATA[My spam counter in Akismet has been steadily rising of late, and it&#8217;s been approaching 10,000 caught spams very quickly. Yesterday it went through 9,950 and with my average of over 100 spams per day it should have gone through the 10,000 barrier by now. But instead I&#8217;ve had about 3 spams today. Did I [...]]]></description>
			<content:encoded><![CDATA[<p>My spam counter in Akismet has been steadily rising of late, and it&#8217;s been approaching 10,000 caught spams very quickly.  Yesterday it went through 9,950 and with my average of over 100 spams per day it should have gone through the 10,000 barrier by now.  But instead I&#8217;ve had about 3 spams today.  Did I just find an off button for spam?<span id="more-612"></span></p>
<h3>Worst Offenders</h3>
<p>I wrote the other day about <a href="http://boakes.org/akismet-worst-offenders">a small Akismet extension</a> that I&#8217;d been playing with that helps remove the worst offenders from the list of caught spam &#8211; this in turn makes false positives easier to recognize.  One of the things that the extension notices is which IP addresses are particularly prolific, it&#8217;s this information that helped me to a 95% (and rising) reduction in the spam that I send to Akismet to be checked.</p>
<h3>htaccess</h3>
<p>When writing about the extension on the Akismet mailing list, I suggested that hooking the worst offenders IP list apache htaccess file should provide a simple dynamic means of rejecting spams before the http request has been processed by the server (and before the akismet plugin has had to check it against it&#8217;s server).</p>
<p>So I tried it, and it works, <em>apparently</em> flawlessly so far.  In my access log I can see that over 100 requests have been rejected so far today.  That&#8217;s 100 requests that are not sat in my &#8220;spambox&#8221; waiting for me to check for false positives.</p>
<p>Todays Akismet spam count is in the single figures, instead of the triple figures.</p>
<p>Fantastic.</p>
<h3>Ongoing Thoughts</h3>
<p>So what does this mean for this site?</p>
<ol>
<li>If a spammer does manage to leave a message here, then it&#8217;s caught by Akismet and marked as such, it never gets through.</li>
<li>When I remove those messages, I can optionally ban the IP address from whence they came.</li>
<li>Bandwidth usage is reduced becuse the server does not accept connections from spammers, and fewer two way chats with the Aksimet server are necessary.</li>
<li>The comment database does not get needlessly filled with temporary comments that are removed once their spammyness has been identified, so the DB and DB indexer has less work to do.</li>
<p>So what does this mean for the Akismet project?</p>
<ol>
<li>There will be fewer hits from this site, so more time to concentrate on others.</li>
<li>If the changes can be used by others, the net effect will be a more scalable and responsive service.</li>
<li>If large scale uptake was achieved, the spam zeitgeist might start to look different because the number of spams being checked daily should significantly reduce.</li>
</ol>
<p>There are several obstacles to global spam nirvana, including:</p>
<ol>
<li>The installation proecess will require a tiny bit of &#8220;hand cranking&#8221; to ensure the htaccess file is in a suitable state for automatic updating.</li>
<li>The system should probably exist as a separate plugin that hooks into the Akismet plugin at appropriate points, but those points haven&#8217;t been defined yet.</li>
<li>The system should probably exist as a separate plugin that hooks into the Akismet plugin at appropriate points, but those points haven&#8217;t been defined yet.</li>
<li>Not everyone uses Apache, so not everyone has an htaccess file.</li>
<li>Not everyone uses WordPress, so Akismet service users on other platforms will have to re-implement the idea.</li>
</ol>
<h3>Download</h3>
<div class="highlight">Note: this is an <em>experimental</em> extension to Akismet.  It <em>appears to work</em> for me, and I will be <em>delighted</em> if others try it an can give useful feedback for the experiment.<br /><strongPro's and PHP/Apache black-belts only at the moment.</strong><br />i.e. Please don&#8217;t ask linux/htaccess questions &#8211; I&#8217;d love to help, but I don&#8217;t currently have time to hand-hold on a non-production experiment.</div>
<p>Still keen?  Great.</p>
<p>If you&#8217;re really brave and want to try it out, you need to carefully follow these steps.</p>
<ol>
<li>Precondition: Follow the installation instructions for <a href="http://akismet.com">Akismet</a> and ensure it&#8217;s working correctly.</li>
<li>Download the <a href="http://boakes.org/download/akismet-1.15-wo-hta-tpfix.zip">Extended Akismet Plugin</a>.</li>
<li>Replace the akismet plugin with the one you just downloaded &#8211; it should pick up all the configuration from the &#8220;official&#8221; version of the plugin.</li>
<li>In the WP admin interface Open the &#8220;Manage | Files&#8221; tab, and check that your htaccess file is writable.</li>
<li>The automatic IP banning is written between two markers that are &#8220;# BEGIN worst-offenders&#8221; and &#8220;# END worst-offenders&#8221;.  If you already have a deny list in your htaccess file, just add the markers to the list.  Mine looks like this:
<pre>Order Allow,Deny
# BEGIN worst-offenders
Deny from 202.75.49.130
Deny from 202.75.49.131
Deny from 202.75.49.133
Deny from 202.75.49.134
# END worst-offenders
Allow from all</pre>
</li>
<li>From now, when you look at your &#8220;Worst Offenders&#8221; list in Akismet, you should see the option to ban the spamming IP addresses when you delete the messages.</li>
<li>Feedback and ask questions below</li>
</ol>
<h3>FAQ</h3>
<ol>
<li><span class="faq">Is this a polished and buffed plugin that&#8217;s ready for the prime time?</span><spanclass="answer"><strong>No! Absolutely not!</strong>  For many reasons.  This is <em>an experiment</em> to see if the idea works and to generate some discussion around what&#8217;s needed for dynamic spam blocking systems to work.  It&#8217;s public so that those with the right skills can try it, or examine it, and perhaps learn from or contribute to it.  If you&#8217;re an armchair amateur blogger, this plugin is not for you; yet.</span></li>
<li><span class="faq">Why are some items in the list of offenders not ticked?</span><span class="answer">Items with fewer than 4 spam messages are not ticked &#8211; this is flexible within the plugin, but not yet configurable.</span></li>
<li><span class="faq">Why do I only see 10 &#8220;Worst Offenders&#8221; at once?</span><span class="answer">Items with fewer than 4 spam messages are not ticked &#8211; this is flexible within the plugin, but not yet configurable.</span></li>
<li><span class="faq">I have an idea for making this better, what should can I do?</span><span class="answer">Discuss it, implement it, share it.</span></li>
<li><span class="faq">Does all this IP address checking add more load onto my poor server?</span><span class="answer">The benefits far outweigh the costs.  It&#8217;s a small increase at the front end, but a massive decrease overall.  Comparing an IP address is mathematically simple task, so it is very fast.  Storing the comment, sending it to the Akismet service and then removing it from the database is much more work.</span></li>
<li><span class="faq">Could this be an end to spam?</span><span class="answer">No.  The number of zombie machines out there is too large to block them all, this method reduces spam from zombies that know about your website, so it directly saves your resources whilst reducing the number of calls your server makes to the Akismet service.</span></li>
<li><span class="faq">How many machines can this method block?</span><span class="answer">Currently IP addresses drop off the end of the list after 400 are added, so the least recent disappear.  This is adjustable in the software but not user-configurable yet.</span></li>
<li><span class="faq">If I&#8217;m blocking spam at source, will capability of Akismet be diminished, because it might not see new variants of spam as they emerge?</span><spanclass="answer">I don&#8217;t know.  I doubt it.  Maybe Matt can add detail without giving too much away.</span></li>
<li><span class="faq">Can it block legitimate comments from non-spammers?</span><spanclass="answer">It&#8217;s possible, but improbable.  In cases where the spammer comes through a proxy, the IP address of the proxy might get banned, so anyone attempting to connect to the site through that proxy would get a &#8220;403&#8243;.  Similarly, in shared IP pools for dial-up users, it&#8217;s feasible (though highly improbable) that a spammer might dial up, spam, become banned and then hang up, relinquishing the IP address to the next user.  If that user happens to visit your site then they&#8217;ll get a 403.  The lower threshhold of &#8216;n&#8217; spams from an IP address or a domain is there to decrease these possibiities, but it cannot negate the issue.</span></li>
<li><span class="faq">How long does the ban last?</span><spanclass="answer">Currently there is a rather arbitrary limit of 400 IP addresses in a FIFO queue.   When an address gets to the end it&#8217;s dropped off the list and is thus allowed to connect again.</span></li>
<li><span class="faq">I think I&#8217;m ok with .htacces files, but what if i&#8217;m not?</span><spanclass="answer">Take a backup before you start: <code>cp .htaccess .htaccess.bak</code> in your wordpress root.  Then if you want to revert <code>rm .htaccess</code> then <code>cp .htaccess.bak .htaccess</code>.</span></li>
<li><span class="faq">Can I revert to the vanilla Akismet plugin?</span><spanclass="answer">Yes.    No changes are made that affect the standard akismet functions, so you can swap back and forth by replacing the akismet.php file as many times as you like.</span></li>
<li><span class="faq">I want it, but I&#8217;m not an uber-geek, is there any hope?</span><spanclass="answer">Yes.  If you think it&#8217;s a useful idea, the most helpful thing you can do is blog about it.  If people red your blog and like the idea then it will help generate interest.  Interest generates ideas, which increase the likelyhood that this could turn into something really useful.</span></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://boakes.org/akismet-htaccess-extension/feed/</wfw:commentRss>
		<slash:comments>36</slash:comments>
		</item>
		<item>
		<title>Akismet Worst Offenders Extension</title>
		<link>http://boakes.org/akismet-worst-offenders/</link>
		<comments>http://boakes.org/akismet-worst-offenders/#comments</comments>
		<pubDate>Sun, 04 Jun 2006 12:06:54 +0000</pubDate>
		<dc:creator>Rich</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Spam]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://boakes.org/akismet-worst-offenders</guid>
		<description><![CDATA[This last few weeks the site has been very heavily hit by comment spammers hawking their usual reprobate websites and wasting internet bandwidth. Akismet has been doing a sterling job of catching this spam and not one message has made it onto the site (I wrote about Akismet&#8217;s effectiveness in the pre-launch testing previously). In [...]]]></description>
			<content:encoded><![CDATA[<p>This last few weeks the site has been very heavily hit by comment spammers hawking their usual reprobate websites and wasting internet bandwidth.  <a href="http://akismet.com/">Akismet</a> has been doing a sterling job of catching this spam and not one message has made it onto the site (I wrote about <a href="akismet">Akismet&#8217;s effectiveness in the pre-launch testing</a> previously).  In the bad old days before Akismet I&#8217;d have to go through the &#8220;unmoderated comments list&#8221; in order to find the occasional real comment amidst all the spam, this is no longer necessary, which is wonderful.  Comment-Spam-Nirvana has not been reached yet, however.<span id="more-609"></span></p>
<p><img class="soloimg" src="/pics/2006/worst-offenders/inuse" alt="A screengrab showing a list of common spammers." /></p>
<p>In order to help keep Akismet working well, and also, to ensure that &#8220;false positives&#8221; do not go unnoticed it is still necessary to trawl through the &#8220;spam list&#8221; and look for real comments.  So although the problem has been turned on it&#8217;s head, the requirement on the responsible user is still the same.</p>
<p>The latest version of the Akismet plugin (v1.15) makes this &#8220;de-spamming&#8221; process easier, but it still leaves the poor website owner with the responsibility of looking at every single spam message in case there are any real comments that have been mistakenly marked as spam.</p>
<p>Informing the Akismet server about these false positives is important because it helps improve Akismet&#8217;s accuracy, which benefits everyone by ensuring fewer false positives &#8211; one hand washes the other, so to speak.</p>
<p>So I wrote a small addition to Akismet 1.15 (pictured above) that tries to help.  It pre-processes the spam comments and identifies the worst offenders in terms of the domain that&#8217;s being advertised, or (perhaps more usefully) the IP Address of the spamming computer.</p>
<p>It&#8217;s not uncommon for me to get several hundred spam comments each day, so certain machines and websites are hitting my site many times.  What the plugin does is make those worst offenders really obvious, so they can be removed en masse, reducing the ham-hunting to a smaller and more managable task.</p>
<p>Download it here: <strike><a href="http://boakes.org/download/akismet-1.15-wo.zip">Akismet 1.15 plus Worst Offenders Extension</a>.</strike>  A stand alone version is available which works with newer versions of Akismet, see the <a href="/talk/tags/worstoffenders">discussion on the forum</a> for more details.</p>
]]></content:encoded>
			<wfw:commentRss>http://boakes.org/akismet-worst-offenders/feed/</wfw:commentRss>
		<slash:comments>44</slash:comments>
		</item>
		<item>
		<title>Categories were Temporarily Kaput</title>
		<link>http://boakes.org/cats-kaput/</link>
		<comments>http://boakes.org/cats-kaput/#comments</comments>
		<pubDate>Tue, 21 Feb 2006 01:47:28 +0000</pubDate>
		<dc:creator>Rich</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Website]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://boakes.org/cats-kaput</guid>
		<description><![CDATA[For some reason, ever since I upgraded to WordPress 2.0, the categories on this site haven&#8217;t been working. I&#8217;ve now upgraded to 2.0.1 and they&#8217;re still not happy. I had hoped that the upgrade would help&#8230; but alas&#8230; Long ago I took the decision to use the shortest URL fomat possible, which is why you [...]]]></description>
			<content:encoded><![CDATA[<p>For some reason, ever since I upgraded to WordPress 2.0, the categories on this site haven&#8217;t been working.  I&#8217;ve now upgraded to 2.0.1 and they&#8217;re still not happy.  I had hoped that the upgrade would help&#8230; but alas&#8230; <span id="more-562"></span></p>
<p>Long ago I took the decision to use the shortest URL fomat possible, which is why you see pages from &#8220;<strong>boakes.org</strong>&#8221; not &#8220;www.boakes.org&#8221; and critically, why each story isn&#8217;t hidden away in an impossible directory structure like &#8220;<strong>/this/that/here/there/</strong>&#8221; it&#8217;s just &#8220;<strong>boakes.org/postname</strong>&#8220;, simple.</p>
<p>Well, it should be simple, and it&#8217;s worked up until now; but something&#8217;s clashing with the category names and I can&#8217;t spot what it is.  Previously, wordpress made heavy use of mod_rewrite, but that doesn&#8217;t seem to be the case any more, so it&#8217;s gone from the voodoo art of url re-writing (which is complex, but documented) to a more proprietary format, it would seem, which appears to be too cutting edge to be well documented.</p>
<p>This then, shall grow into a solution, once I find it, or as soon as someone offers a little wizdom.  In the mean time, I&#8217;m afraid the categories are temporarily bent out of shape, so please use the search instead.</p>
<p>FWIW, the &#8220;custom structure&#8221; in use is &#8220;<strong>/%postname%</strong>&#8221; and the category base is &#8220;<strong>/category</strong>&#8220;.</p>
<h2>WordPress Categories Fixed</h2>
<p>The problem, it turns out, was to do with <a href="http://fucoder.com/2006/02/permalink-redirect-wordpress-plugin-05/">a redirect plugin</a> I had forgotten I was using.  I diagnosed the issue by downloading the latest version, then adding an extra header so that I could be sure it was the output from the plugin that was doing the redirect.  With the plugin disabled, categories are once again working like a charm.</p>
<p>Originally I&#8217;d instaled the plugin to ensure the folk who requested pages using &#8220;the old system&#8221; of (for example) <code>http://boakes.org/index.php?p=222</code> would get redirected to the approriate &#8220;nice&#8221; permalink of <code>http://boakes.org/ameri-who</code>.  This also ensures that any search engines don&#8217;t get confused and think the content is duplicated.</p>
<p>It seems that with the upgrade to 2.0, and with my particular setup, the plugin is a bit broken.  Hopefully there&#8217;ll be another bugfix along soon and it&#8217;ll all play nicely again.  It may, in fact, already handle this specific case through a passthough mechanism that&#8217;s recently been added, but it&#8217;s not exactly clear yet if this is the case &#8211; time, and experimentation, will tell.</p>
]]></content:encoded>
			<wfw:commentRss>http://boakes.org/cats-kaput/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

