<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Stut.net</title>
	
	<link>http://stut.net/blog</link>
	<description>Ramblings of a random software engineer</description>
	<lastBuildDate>Mon, 02 Nov 2009 12:51:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Stut" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>What’s going on?</title>
		<link>http://feedproxy.google.com/~r/Stut/~3/BPLmpYNJAMU/</link>
		<comments>http://stut.net/blog/2009/11/02/whats-going-on/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 12:25:32 +0000</pubDate>
		<dc:creator>Stut</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Stut.net]]></category>

		<guid isPermaLink="false">http://stut.net/blog/?p=388</guid>
		<description><![CDATA[I know it&#8217;s been a while since posted anything on this blog, but I&#8217;ve had a lot going on and it hasn&#8217;t really been at the forefront of my mind. So, what&#8217;s been going on?
Firstly I&#8217;ve shut TwitApps.com down. I won&#8217;t go into the reasons because they&#8217;re well documented in the blog post announcing it. [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fstut.net%2Fblog%2F2009%2F11%2F02%2Fwhats-going-on%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fstut.net%2Fblog%2F2009%2F11%2F02%2Fwhats-going-on%2F" height="61" width="51" /></a></div><p>I know it&#8217;s been a while since posted anything on this blog, but I&#8217;ve had a lot going on and it hasn&#8217;t really been at the forefront of my mind. So, what&#8217;s been going on?</p>
<p>Firstly <a href="http://twitapps.com/">I&#8217;ve shut TwitApps.com down</a>. I won&#8217;t go into the reasons because they&#8217;re well documented in <a href="http://3ft9.com/10-twitapps-shutting-down">the blog post announcing it</a>. I&#8217;ve also <a href="http://3ft9.com/17-twitapps-code-released">released the code</a> so anyone can make a clone if they feel so inspired. One big side effect of this is that I&#8217;m open to offers for that domain name and a bunch of others I don&#8217;t see myself using anymore. Please only contact me with serious offers.</p>
<p>Secondly I&#8217;ve been doing a lot of soul searching lately, and one of the results of that has been my <a href="http://stuartdallas.com/">new blog over at stuartdallas.com</a> where I&#8217;m writing for my benefit rather than as a service to others, which is how I view this site. Check it out and let me know what you think.</p>
<p>Finally I have been all over the place in terms of my career lately, which I&#8217;ve <a href="http://stuartdallas.com/my-new-plan">written about on my new blog</a> so I won&#8217;t repeat it here. Ultimately it means I&#8217;m on the lookout for interesting projects to get involved with. If you think I may be able to help you or your company please let me know.</p>
<p>Hopefully that explains where I&#8217;ve been. I plan to continue publishing tech and development posts on this site for the foreseeable future, but how often depends on how much my focus gets split in my new reality. I also plan to change the layout of this site &#8211; it&#8217;s starting to depress me because I never really finished it.</p>
<div id="crp_related"><h3>If you liked this you might also like these:</h3><ul><li><a href="http://stut.net/blog/2008/12/05/new-company-site-for-3ft9/" rel="bookmark">New company site for 3ft9</a></li><li><a href="http://stut.net/blog/2009/01/31/twitter-unfollows-too-much-information/" rel="bookmark">Twitter unfollows: too much information?</a></li><li><a href="http://stut.net/blog/2007/11/19/that-other-bit-of-news/" rel="bookmark">That other bit of news</a></li><li><a href="http://stut.net/blog/2007/05/05/switched-to-wordpress/" rel="bookmark">Switched to Wordpress</a></li><li><a href="http://stut.net/blog/2009/03/08/handling-email-notifications-from-twitter/" rel="bookmark">Handling email notifications from Twitter</a></li></ul></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Stut?a=BPLmpYNJAMU:NL2L8aheKqo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Stut?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=BPLmpYNJAMU:NL2L8aheKqo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Stut?i=BPLmpYNJAMU:NL2L8aheKqo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=BPLmpYNJAMU:NL2L8aheKqo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Stut?i=BPLmpYNJAMU:NL2L8aheKqo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=BPLmpYNJAMU:NL2L8aheKqo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Stut?i=BPLmpYNJAMU:NL2L8aheKqo:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Stut/~4/BPLmpYNJAMU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://stut.net/blog/2009/11/02/whats-going-on/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://stut.net/blog/2009/11/02/whats-going-on/</feedburner:origLink></item>
		<item>
		<title>PHP Job Queue</title>
		<link>http://feedproxy.google.com/~r/Stut/~3/FigNG7Uu6OM/</link>
		<comments>http://stut.net/blog/2009/05/29/php-job-queue/#comments</comments>
		<pubDate>Fri, 29 May 2009 20:26:58 +0000</pubDate>
		<dc:creator>Stut</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://stut.net/blog/?p=380</guid>
		<description><![CDATA[One of the pillars of a scalable website is ensuring that only activity which is required to build a page should be performed during the processing of a page request. Activities that fall under this category commonly include sending emails, recording statistics and general housekeeping such as removing temporary files.
Back when I started working on [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fstut.net%2Fblog%2F2009%2F05%2F29%2Fphp-job-queue%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fstut.net%2Fblog%2F2009%2F05%2F29%2Fphp-job-queue%2F" height="61" width="51" /></a></div><p>One of the pillars of a scalable website is ensuring that only activity which is required to build a page should be performed during the processing of a page request. Activities that fall under this category commonly include sending emails, recording statistics and general housekeeping such as removing temporary files.</p>
<p>Back when I started working on sites big enough for these activities to cause a problem I went down the obvious route of making a PHP CLI script for each job that needed doing and getting it to run using cron. This worked for a while but as the sites I was working on got bigger and more complex it quickly became clear that this was becoming difficult to manage, so I started to consider alternatives.</p>
<p><span id="more-380"></span>At the time all this happened I was mainly working with a site that ran on <a href="http://www.zend.com/en/products/platform/" target="_blank">Zend Platform</a>. One of the recent additions at the time was a module called <a href="http://www.zend.com/en/products/platform/product-comparison/job-queues" target="_blank">Job Queue</a> which appeared to do exactly what I needed. Unfortunately after spending a fair amount of time developing the infrastructure required to make it run the jobs I discovered that it really wasn&#8217;t very well tested; it was far from production quality <a href="#fn1">[1]</a> and nowhere near reliable enough so I went back to the drawing board.</p>
<h2>Time passes&#8230;</h2>
<p>After thinking about what I needed from such a system and what I had available I came up with an arrangement I&#8217;ve been using ever since with great success.</p>
<p>The core of the system is a DB table and a PHP script. The table contains the definition of jobs that need running and the script, erm, runs them.</p>
<p>I won&#8217;t go into the details of the table because the only important parts as far as this system go are the run_at, processor_pid and schedule_* fields.</p>
<p>The <em>run_at</em> field is a timestamp that simply indicates the time when that job should be executed.</p>
<p>The <em>processor_pid</em> field is an unsigned integer that defaults to 0 and will indicate the process that&#8217;s running a job if any.</p>
<p>The <em>schedule_*</em> fields specify how often the job should be executed. There are a number of ways of organising these depending on what your requirements are, but they fall into two general categories.</p>
<div style="padding-left: 1.5em;">
	<strong>Periodic only</strong><br />
	If you only need to say &#8220;run again in <em>n</em> seconds&#8221; then this is the one for you. Use a single field called <em>schedule</em> and put <em>n</em> in there.</p>
<p>	<strong>Complex</strong><br />
	If you need something more flexible then you&#8217;ll need to use a number of fields (or a single field you can parse) to specify how to calculate the next run_at time. For example a period (daily, weekly, monthly or anually) and a day/time field allows you to configure any of the following&#8230;</p>
<ul>
<li>Every day at 10am</li>
<li>Every Monday at 1am</li>
<li>The 1st of every month at midnight</li>
<li>Every year on February 14th at 8pm</li>
<li>etc&#8230;</li>
</ul>
</div>
<p>Before I move on to the script I apparently need to cover something that I missed when I first wrote this. <strong>You need to specify what to run in this table!</strong> I though this was pretty obvious but based on initial feedback I was wrong.</p>
<p>This can take any number of forms and will depend greatly on your specific application. Over the years I&#8217;ve used a number of different methods including a PHP script name, a CLI command and a method in a static class. Whatever you use you&#8217;ll want to make sure you do sufficient checks to ensure it&#8217;s secure.</p>
<p>Ok, on to the script which is designed to be run by cron according to a schedule that allows it to keep up with the size of the job queue you anticipate.</p>
<p>The following is a list of the basic steps the script performs. For this example I&#8217;m continuing with the assumption that the job queue is a table in a database.</p>
<ol>
<li>
		Get the pid and put it in $pid.
	</li>
<li>
		Execute this SQL query&#8230;</p>
<div style="padding-left: 1.5em; font-family: monospace;">
			update `job_queue`<br />
			set `processor_pid` = &#8220;$pid&#8221;<br />
			where `run_at` <= unix_timestamp()<br />
			&nbsp;&nbsp;and `processor_pid` = 0<br />
			order by run_at asc<br />
			limit 1
		</div>
</li>
<li>
		Check mysql_affected_rows() and exit if 0.
	</li>
<li>
		Execute this SQL query&#8230;</p>
<div style="padding-left: 1.5em; font-family: monospace;">
			select * from `job_queue`<br />
			where `processor_pid` = &#8220;$pid&#8221;
		</div>
<p>		Note that these SQL statements (step 2 and this one) atomically grab a job and lock it. If you&#8217;re using a different storage system for your queue you&#8217;ll need to lock it while you select a job to run and then mark it as in progress.
	</li>
<li>
		Run the job. As mentioned already this can mean any number of things and will depend on your particular application. One of the useful things you can do here is to set up a clean, safe environment for the job to run in, along with ways to capture errors and other outputs so you can do something useful with them.
	</li>
<li>
		As soon as the job has finished executing we mark it as completed and record the success or failure status.
	</li>
<li>
		If the job has a schedule (i.e. it&#8217;s a recurring job) we create a new job by effectively cloning the job we&#8217;ve just run. We now calculate the time it should be run according to the schedule definition and save that in the run_at field of the new job. Finally we set the <em>processor_pid</em> of the new job to 0 so it&#8217;s then available to step 2 of this process.
	</li>
<li>
		Depending on the job configuration and status we now either remove the completed job from the queue or archive it complete with errors and output for later inspection.
	</li>
<li>
		If this processor has been running for > 60 minutes it exits, otherwise it goes back to step 2 and looks for another job to run.
	</li>
</ol>
<p>To get this to do something useful we configure it to run via cron every <em>n</em> minutes where <em>n</em> depends upon the anticipated size of your job queue. For example running it every minute will automatically scale it up to 60 concurrent jobs at any one time. Running it every 5 minutes will reduce this to 12, and so on. There&#8217;s also nothing stopping you putting more than one line into the crontab so it runs two processes every minute which increases concurrent processors to 120.</p>
<p>Assuming your job queue is network accessible this system also scales across multiple machines with minimal changes. In fact the only change that&#8217;s required it to incorporate a machine identified into the <em>processor_pid</em> field. This could be as simple as <em>&lt;machine&gt;_&lt;pid&gt;</em>; the key thing is that it&#8217;s guaranteed to be unique to a given process across your entire infrastructure.</p>
<h2>Crashed jobs</h2>
<p>One problem you may need to deal with is how to handle crashed jobs. This will happen, you can&#8217;t get away from it and you&#8217;ll need a way to detect and deal with it when it does. Luckily the job queue makes detection fairly straightforward.</p>
<p>On a single machine you can implement a script (either run via cron separately or indeed run by the job queue) that will check that for each job that has a <em>processor_pid</em> > 0 there is a PHP process running with that PID.</p>
<p>If and when you&#8217;ve scaled across multiple machines this script essentially remains the same except that you need to run it on every machine that runs the job queue and filter the PID&#8217;s you check.</p>
<p>As far as what to do when you find a crashed job that&#8217;s really something you need to consider on a case-by-case basis. At the very basic level the script could simply reset the <em>processor_pid</em> field to 0 so it gets run again. At the other end of the spectrum in a very flexible system you could have a way to run a job with a flag to indicate that it had previously crashed; each job can then deal with crashes in their own custom way.</p>
<h2>Potential additions</h2>
<p>The components described above is just the core of a job queue system; you can add a lot of useful stuff above and around it to make it easier to manage and provide better feedback from your periodic tasks.</p>
<ul>
<li>
		<strong>Performance metrics</strong><br />
		Since you&#8217;re running all your jobs from a central script adding code around the actual execution to record execution time, load and possibly memory usage too is pretty simple. You then have the ability to compare the time a job took to previous executions of that job to detect potential errors.
	</li>
<li>
		<strong>Management interface</strong><br />
		Since you have all the information regarding the jobs in the queue, what&#8217;s running right now and the status of jobs that have previously been executed it&#8217;s a pretty small leap to build a UI that will let you view and manage the whole thing. This can be especially useful for presenting error messages and performance metrics.
	</li>
</ul>
<h2>Final thoughts</h2>
<p>I hope that&#8217;s useful to someone, I&#8217;ve certainly found it applicable to most web applications I now deal with. As I mentioned a few times you can implement the various parts in a number of ways, in particular how jobs are specified and how the scheduling works.</p>
<p>As an example of this flexibility I&#8217;ll make a passing mention to one implementation I&#8217;ve done that only needed to be able to execute scripts daily, hourly or every 15 minutes. To accomplish this I simply created a folder for the scripts, and three folders named <em>15min</em>, <em>hourly</em> and <em>daily</em> within that. The processor script uses a custom locking system and CLI arguments to run each set of scripts according the the directories they&#8217;re in.</p>
<p>This system has proven to work very well and will continue to do everything that site needs until we need to execute something at a specific time; a requirement that has not yet surfaced.</p>
<p>One of the many side projects I&#8217;m working on is a reusable version of this system. At the moment it&#8217;s a fairly messy combination of scripts that doesn&#8217;t work very well so far, but as soon as I have something worth sharing I&#8217;ll definitely do so on this blog. Stay tuned.</p>
<p>If you have an questions or suggestions for improvement please don&#8217;t hesitate to leave a comment or <a href="/who#contact">contact me privately</a>.</p>
<p><a name="fn1"></a> [1] <small>This was a few years back and I&#8217;ve heard that the Job Queue module has received some attention since then so is now a lot better, but I no longer use Zend Platform so I&#8217;m not in a position to comment. If budget is not an issue for you I&#8217;d recommend checking it out.</small></p>
<div id="crp_related"><h3>If you liked this you might also like these:</h3><ul><li><a href="http://stut.net/blog/2008/06/08/php-models-2/" rel="bookmark">PHP Models</a></li><li><a href="http://stut.net/blog/2005/06/11/pay-per-mile/" rel="bookmark">Pay per mile</a></li><li><a href="http://stut.net/blog/2008/06/18/sending-email/" rel="bookmark">Sending email</a></li><li><a href="http://stut.net/blog/2007/11/10/web-hosting-a-mugs-game/" rel="bookmark">Web hosting - a mugs game</a></li><li><a href="http://stut.net/blog/2005/02/05/rename-a-mysql-database/" rel="bookmark">Rename a MySQL Database</a></li></ul></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Stut?a=FigNG7Uu6OM:DBsI5LAe6HQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Stut?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=FigNG7Uu6OM:DBsI5LAe6HQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Stut?i=FigNG7Uu6OM:DBsI5LAe6HQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=FigNG7Uu6OM:DBsI5LAe6HQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Stut?i=FigNG7Uu6OM:DBsI5LAe6HQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=FigNG7Uu6OM:DBsI5LAe6HQ:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Stut?i=FigNG7Uu6OM:DBsI5LAe6HQ:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Stut/~4/FigNG7Uu6OM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://stut.net/blog/2009/05/29/php-job-queue/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://stut.net/blog/2009/05/29/php-job-queue/</feedburner:origLink></item>
		<item>
		<title>Facebook gets something right</title>
		<link>http://feedproxy.google.com/~r/Stut/~3/x2v4Fc8RjSk/</link>
		<comments>http://stut.net/blog/2009/04/29/facebook-gets-something-right/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 20:50:04 +0000</pubDate>
		<dc:creator>Stut</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://stut.net/blog/?p=376</guid>
		<description><![CDATA[A new phishing attack against Facebook has surfaced recently using the domain fbaction.net. Whenever I see these things I always reset my browser and try signing in with fake details to see what happens. In this case I got a nice surprise. When I got redirected to Facebook I got this&#8230;

This is fantastic. Every site [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fstut.net%2Fblog%2F2009%2F04%2F29%2Ffacebook-gets-something-right%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fstut.net%2Fblog%2F2009%2F04%2F29%2Ffacebook-gets-something-right%2F" height="61" width="51" /></a></div><p>A new phishing attack against <a href="http://www.facebook.com/">Facebook</a> has surfaced recently using the domain fbaction.net. Whenever I see these things I always reset my browser and try signing in with fake details to see what happens. In this case I got a nice surprise. When I got redirected to Facebook I got this&#8230;</p>
<div style="text-align:center;"><center><a href="http://www.flickr.com/photos/stuartdallas/3486344611/" title="Facebook gets something right by Stuart Dallas, on Flickr"><img src="http://farm4.static.flickr.com/3592/3486344611_f924e7c1d7_o.png" width="647" height="263" alt="Facebook gets something right" /></a></center></div>
<p>This is fantastic. Every site should do this. It&#8217;s a really simple check to do and immediately informs the user that they have probably been compromised complete with advice as to what they should do next.</p>
<p>Top marks to Facebook!</p>
<div id="crp_related"><h3>If you liked this you might also like these:</h3><ul><li><a href="http://stut.net/blog/2007/11/04/personal-info-on-facebook/" rel="bookmark">Personal info on Facebook</a></li><li><a href="http://stut.net/blog/2007/10/10/extracting-the-map-from-social-networks/" rel="bookmark">Extracting the map from social networks</a></li><li><a href="http://stut.net/blog/2007/08/22/links-for-2007-08-21/" rel="bookmark">links for 2007-08-21</a></li><li><a href="http://stut.net/blog/2007/11/25/information-responsibility/" rel="bookmark">Information Responsibility</a></li><li><a href="http://stut.net/blog/2009/01/23/automated-content-failure/" rel="bookmark">Automated content failure</a></li></ul></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Stut?a=x2v4Fc8RjSk:ZIInHRX8eU0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Stut?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=x2v4Fc8RjSk:ZIInHRX8eU0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Stut?i=x2v4Fc8RjSk:ZIInHRX8eU0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=x2v4Fc8RjSk:ZIInHRX8eU0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Stut?i=x2v4Fc8RjSk:ZIInHRX8eU0:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=x2v4Fc8RjSk:ZIInHRX8eU0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Stut?i=x2v4Fc8RjSk:ZIInHRX8eU0:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Stut/~4/x2v4Fc8RjSk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://stut.net/blog/2009/04/29/facebook-gets-something-right/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://stut.net/blog/2009/04/29/facebook-gets-something-right/</feedburner:origLink></item>
		<item>
		<title>Spam poetry</title>
		<link>http://feedproxy.google.com/~r/Stut/~3/RMxFVtEWswY/</link>
		<comments>http://stut.net/blog/2009/04/29/spam-poetry/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 15:07:31 +0000</pubDate>
		<dc:creator>Stut</dc:creator>
				<category><![CDATA[Annoyances]]></category>
		<category><![CDATA[Cool Stuff]]></category>
		<category><![CDATA[Internet]]></category>

		<guid isPermaLink="false">http://stut.net/blog/2009/04/29/spam-poetry/</guid>
		<description><![CDATA[I&#8217;ll take the position
assume the missionary part
you work by committee
you had me pegged from the start.
I&#8217;ll be pounce pony
phony maroney
pony before the cart.
I&#8217;ll be pounce pony.
this ceremony
only fills my heart.

who cast the final stone?
who threw the crushing blow?
someone has to take the fall
why not me?
a punch toy volunteer
a weakling on its knee.
is all you want [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fstut.net%2Fblog%2F2009%2F04%2F29%2Fspam-poetry%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fstut.net%2Fblog%2F2009%2F04%2F29%2Fspam-poetry%2F" height="61" width="51" /></a></div><div>I&#8217;ll take the position</div>
<div>assume the missionary part<br />
you work by committee<br />
you had me pegged from the start.<br />
I&#8217;ll be pounce pony<br />
phony maroney<br />
pony before the cart.<br />
I&#8217;ll be pounce pony.<br />
this ceremony<br />
only fills my heart.</div>
<div>
<p>who cast the final stone?<br />
who threw the crushing blow?<br />
someone has to take the fall<br />
why not me?</p>
<p>a punch toy volunteer<br />
a weakling on its knee.<br />
is all you want to hear<br />
and all you want to see.<br />
romantically, you&#8217;d martyr me<br />
and miss this story&#8217;s point<br />
it is my strength, my destiny<br />
this is the role that I have chosen.</p>
<p><em>Clarification: I received about 12 copies of this to various email addresses. While annoying I thought it was pretty well done and worth preserving. I have no idea who (or what) wrote it.</em></div>
<div id="crp_related"><h3>If you liked this you might also like these:</h3><ul><li><a href="http://stut.net/blog/2007/06/21/recruitment-agents-an-example/" rel="bookmark">Recruitment agents... an example</a></li><li><a href="http://stut.net/blog/2007/06/17/recruitment-agencies-just-say-no/" rel="bookmark">Recruitment Agencies - Just Say No!</a></li><li><a href="http://stut.net/blog/2008/06/18/sending-email/" rel="bookmark">Sending email</a></li><li><a href="http://stut.net/blog/2007/02/16/recruiting-home-owners/" rel="bookmark">Recruiting home owners</a></li><li><a href="http://stut.net/blog/2008/10/13/requiring_unnecessary_information/" rel="bookmark">Requiring unnecessary information</a></li></ul></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Stut?a=RMxFVtEWswY:4nDUY_iVxak:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Stut?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=RMxFVtEWswY:4nDUY_iVxak:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Stut?i=RMxFVtEWswY:4nDUY_iVxak:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=RMxFVtEWswY:4nDUY_iVxak:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Stut?i=RMxFVtEWswY:4nDUY_iVxak:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=RMxFVtEWswY:4nDUY_iVxak:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Stut?i=RMxFVtEWswY:4nDUY_iVxak:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Stut/~4/RMxFVtEWswY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://stut.net/blog/2009/04/29/spam-poetry/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://stut.net/blog/2009/04/29/spam-poetry/</feedburner:origLink></item>
		<item>
		<title>Regional Limitations</title>
		<link>http://feedproxy.google.com/~r/Stut/~3/btYgEZUkH_U/</link>
		<comments>http://stut.net/blog/2009/04/13/regional-limitations/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 04:18:42 +0000</pubDate>
		<dc:creator>Stut</dc:creator>
				<category><![CDATA[Annoyances]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://stut.net/blog/?p=370</guid>
		<description><![CDATA[It&#8217;s 5am and I can&#8217;t sleep. When this happens I usually fire up Boxee and find something to watch, so that&#8217;s what I did. I was happy to see that since the last time I used it Boxee appear to have added a bunch more internet sources, which is great. However, the following 15 minutes [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fstut.net%2Fblog%2F2009%2F04%2F13%2Fregional-limitations%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fstut.net%2Fblog%2F2009%2F04%2F13%2Fregional-limitations%2F" height="61" width="51" /></a></div><p>It&#8217;s 5am and I can&#8217;t sleep. When this happens I usually <a href="http://boxee.tv/">fire up Boxee</a> and find something to watch, so that&#8217;s what I did. I was happy to see that since the last time I used it Boxee appear to have added a bunch more internet sources, which is great. However, the following 15 minutes were nearly the most frustrating of my life so far.</p>
<p>I understand regional restrictions. I don&#8217;t necessarily agree with the reason they&#8217;re there, but I understand why.</p>
<p>What I can&#8217;t understand is why they&#8217;re not shown up-front when browsing available content. On sites like <a href="http://joost.com/">Joost</a>, <a href="http://thulu.com/">Hulu</a> and others you have to actually start streaming content before you get told you can&#8217;t view it. They clearly know where you&#8217;re coming from but they still insist on not telling you what you can and can&#8217;t watch until you actually try.</p>
<p>Maybe there&#8217;s a technical reason why it works this way (I can&#8217;t think of one that couldn&#8217;t be easily worked around), or maybe there&#8217;s a licensing reason for it. Whatever the reason it makes attempting to use any of these sites more and more frustrating the more region-limited content they contain.</p>
<p>So here&#8217;s my plea&#8230; please will these sites make it clear from the highest level possible in the browsable structure whether content is viewable from my current location. That&#8217;s all I ask.</p>
<p>Boxee themselves don&#8217;t help out with this problem. Take <a href="http://thewb.com/">theWB</a> for example. You can&#8217;t access the website at all if you&#8217;re outside the US (see below), but you can if you use Boxee. Right down to the content level, but when you start streaming you then get a message telling you it&#8217;s restricted.</p>
<p style="text-align:center"><a href="http://www.flickr.com/photos/stuartdallas/3437209682/" title="theWB - US only by Stuart Dallas, on Flickr"><img src="http://farm4.static.flickr.com/3663/3437209682_c06993a424_o.png" width="490" height="313" alt="theWB - US only" /></a></p>
<p>So, Boxee and co&#8230; sort it out!!</p>
<div id="crp_related"><h3>If you liked this you might also like these:</h3><ul><li><a href="http://stut.net/blog/2007/06/11/content-distribution/" rel="bookmark">Content distribution</a></li><li><a href="http://stut.net/blog/2008/02/15/new-stutnet-design/" rel="bookmark">New Stut.net design</a></li><li><a href="http://stut.net/blog/2009/01/31/twitter-unfollows-too-much-information/" rel="bookmark">Twitter unfollows: too much information?</a></li><li><a href="http://stut.net/blog/2009/01/23/automated-content-failure/" rel="bookmark">Automated content failure</a></li><li><a href="http://stut.net/blog/2007/05/06/canon-speedlite-580ex-flash/" rel="bookmark">Canon Speedlite 580EX Flash</a></li></ul></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Stut?a=btYgEZUkH_U:gbHPTs52JJc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Stut?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=btYgEZUkH_U:gbHPTs52JJc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Stut?i=btYgEZUkH_U:gbHPTs52JJc:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=btYgEZUkH_U:gbHPTs52JJc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Stut?i=btYgEZUkH_U:gbHPTs52JJc:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=btYgEZUkH_U:gbHPTs52JJc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Stut?i=btYgEZUkH_U:gbHPTs52JJc:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Stut/~4/btYgEZUkH_U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://stut.net/blog/2009/04/13/regional-limitations/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://stut.net/blog/2009/04/13/regional-limitations/</feedburner:origLink></item>
		<item>
		<title>Extreme Sheep LED Art</title>
		<link>http://feedproxy.google.com/~r/Stut/~3/JvB1hhSVxBw/</link>
		<comments>http://stut.net/blog/2009/03/23/extreme-sheep-led-art/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 11:21:57 +0000</pubDate>
		<dc:creator>Stut</dc:creator>
				<category><![CDATA[Misc]]></category>

		<guid isPermaLink="false">http://stut.net/blog/2009/03/23/extreme-sheep-led-art/</guid>
		<description><![CDATA[Not sure if I believe this is real or not, but either way it&#8217;s a pretty cool idea.
    
If you liked this you might also like these:Alexei Arkhipovskiy - SharmankaBigDog ... WOW!Amazing MachinesKnex Roller CoasterVerizonMath]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fstut.net%2Fblog%2F2009%2F03%2F23%2Fextreme-sheep-led-art%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fstut.net%2Fblog%2F2009%2F03%2F23%2Fextreme-sheep-led-art%2F" height="61" width="51" /></a></div><p>Not sure if I believe this is real or not, but either way it&#8217;s a pretty cool idea.</p>
<p>  <object height="295" width="480"><param name="movie" value="http://www.youtube-nocookie.com/v/D2FX9rviEhw&amp;hl=en&amp;fs=1&amp;rel=0" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed src="http://www.youtube-nocookie.com/v/D2FX9rviEhw&amp;hl=en&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash" height="295" width="480"></embed></object>  </p>
<div id="crp_related"><h3>If you liked this you might also like these:</h3><ul><li><a href="http://stut.net/blog/2009/01/25/alexei-arkhipovskiy-sharmanka/" rel="bookmark">Alexei Arkhipovskiy - Sharmanka</a></li><li><a href="http://stut.net/blog/2008/03/28/bigdog-wow/" rel="bookmark">BigDog ... WOW!</a></li><li><a href="http://stut.net/blog/2006/09/29/amazing-machines/" rel="bookmark">Amazing Machines</a></li><li><a href="http://stut.net/blog/2006/09/29/knex-roller-coaster/" rel="bookmark">Knex Roller Coaster</a></li><li><a href="http://stut.net/blog/2006/12/11/verizonmath/" rel="bookmark">VerizonMath</a></li></ul></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Stut?a=JvB1hhSVxBw:wSCtrvlVIYw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Stut?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=JvB1hhSVxBw:wSCtrvlVIYw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Stut?i=JvB1hhSVxBw:wSCtrvlVIYw:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=JvB1hhSVxBw:wSCtrvlVIYw:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Stut?i=JvB1hhSVxBw:wSCtrvlVIYw:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=JvB1hhSVxBw:wSCtrvlVIYw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Stut?i=JvB1hhSVxBw:wSCtrvlVIYw:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Stut/~4/JvB1hhSVxBw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://stut.net/blog/2009/03/23/extreme-sheep-led-art/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://stut.net/blog/2009/03/23/extreme-sheep-led-art/</feedburner:origLink></item>
		<item>
		<title>Handling email notifications from Twitter</title>
		<link>http://feedproxy.google.com/~r/Stut/~3/JFKLrd7RT3c/</link>
		<comments>http://stut.net/blog/2009/03/08/handling-email-notifications-from-twitter/#comments</comments>
		<pubDate>Sun, 08 Mar 2009 20:27:14 +0000</pubDate>
		<dc:creator>Stut</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[TwitApps]]></category>

		<guid isPermaLink="false">http://stut.net/blog/?p=362</guid>
		<description><![CDATA[I had a request recently to release some of the code from the TwitApps bots. The core of both bots is actually a shared email handler and I have no problem sharing it with the world.
Twitter-related stuff &#187; Handling email notifications
On the assumption that I&#8217;ll eventually get around to sharing some more Twitter-related stuff I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fstut.net%2Fblog%2F2009%2F03%2F08%2Fhandling-email-notifications-from-twitter%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fstut.net%2Fblog%2F2009%2F03%2F08%2Fhandling-email-notifications-from-twitter%2F" height="61" width="51" /></a></div><p>I had a request recently to release some of the code from the TwitApps bots. The core of both bots is actually a shared email handler and I have no problem sharing it with the world.</p>
<p style="text-align:center;"><a href="/projects/twitter/">Twitter-related stuff</a> &raquo; <a href="/projects/twitter/email_notifications.html">Handling email notifications</a></p>
<p>On the assumption that I&#8217;ll eventually get around to sharing some more Twitter-related stuff I&#8217;ve created a new section in the projects area of this site. If there&#8217;s anything related to Twitter integration that you&#8217;d like to see me cover there please let me know and I&#8217;ll be happy to help.</p>
<div id="crp_related"><h3>If you liked this you might also like these:</h3><ul><li><a href="http://stut.net/blog/2007/08/04/links-for-2007-08-04/" rel="bookmark">links for 2007-08-04</a></li><li><a href="http://stut.net/blog/2008/05/23/has-that-website-gone-titsup/" rel="bookmark">Has that website gone TitsUp?</a></li><li><a href="http://stut.net/blog/2008/04/04/twitter-public-timeline/" rel="bookmark">Twitter public timeline</a></li><li><a href="http://stut.net/blog/2009/01/31/twitter-unfollows-too-much-information/" rel="bookmark">Twitter unfollows: too much information?</a></li><li><a href="http://stut.net/blog/2008/01/28/tweetmeme-launch/" rel="bookmark">Tweetmeme Launch</a></li></ul></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Stut?a=JFKLrd7RT3c:sz9MG1LI8xg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Stut?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=JFKLrd7RT3c:sz9MG1LI8xg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Stut?i=JFKLrd7RT3c:sz9MG1LI8xg:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=JFKLrd7RT3c:sz9MG1LI8xg:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Stut?i=JFKLrd7RT3c:sz9MG1LI8xg:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=JFKLrd7RT3c:sz9MG1LI8xg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Stut?i=JFKLrd7RT3c:sz9MG1LI8xg:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Stut/~4/JFKLrd7RT3c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://stut.net/blog/2009/03/08/handling-email-notifications-from-twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://stut.net/blog/2009/03/08/handling-email-notifications-from-twitter/</feedburner:origLink></item>
		<item>
		<title>Twitter unfollows: too much information?</title>
		<link>http://feedproxy.google.com/~r/Stut/~3/i4reIuqOG5Y/</link>
		<comments>http://stut.net/blog/2009/01/31/twitter-unfollows-too-much-information/#comments</comments>
		<pubDate>Fri, 30 Jan 2009 23:54:19 +0000</pubDate>
		<dc:creator>Stut</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[TwitApps]]></category>

		<guid isPermaLink="false">http://stut.net/blog/?p=354</guid>
		<description><![CDATA[A couple of days ago I released a new TwitApps tool called Follows. I know I haven&#8217;t talked about TwitApps on this blog yet &#8211; that post is coming &#8211; but if you follow me on Twitter you should be aware of it.
The Follows service monitors your followers on Twitter and sends you a daily, [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fstut.net%2Fblog%2F2009%2F01%2F31%2Ftwitter-unfollows-too-much-information%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fstut.net%2Fblog%2F2009%2F01%2F31%2Ftwitter-unfollows-too-much-information%2F" height="61" width="51" /></a></div><p><img src="http://stut.net/blog/wp-content/uploads/2009/01/dont-follow-me-sign.gif" alt="dont_follow_me_sign.gif" border="0" width="310" height="310" align="right" />A couple of days ago I released a new <a href="http://twitapps.com/">TwitApps</a> tool called <a href="http://twitapps.com/follows/">Follows</a>. I know I haven&#8217;t talked about TwitApps on this blog yet &#8211; that post is coming &#8211; but if you <a href="http://twitter.com/stut">follow me on Twitter</a> you should be aware of it.</p>
<p>The Follows service monitors your followers on Twitter and sends you a daily, weekly or monthly email telling you who&#8217;s followed and who&#8217;s unfollowed you since your last email. Twitter itself has the facility to send you an email every time someone starts following you but does not offer any sort of notification when they stop.</p>
<p>I can see why Twitter have done it this way. When someone starts following you it&#8217;s likely you&#8217;ll want to check out their tweets and you might decide to follow them back. The same logic doesn&#8217;t really apply to when people stop following you, or does it?<br />
<span id="more-354"></span><br />
I built the Follows service primarily as a technical exercise, but also because I was curious to get some visibility on people who stop following me.</p>
<p>A while back a service called <a href="http://useqwitter.com/">Qwitter</a> appeared on the scene that offered an unfollow notification service so I signed up. Unfortunately it stopped working shortly after that for unknown reasons, but in the few days while it did work it was quite enlightening. By paying attention to both follow and unfollow notifications it was possible to spot some interesting trends.</p>
<p>By a strange coincidence it would appear that shortly after I launched my Follows service Qwitter started working again, but so far it doesn&#8217;t appear to be particularly reliable. It attempts to match an unfollow event to one of your tweets, effectively trying to find the cause of the action. This is daft primarily because there&#8217;s not always a single reason why people stop following you but also because they can&#8217;t possibly monitor your followers continuously &#8211; <a href="http://apiwiki.twitter.com/REST+API+Documentation#RateLimiting">the Twitter API has limits</a> that would prevent that &#8211; so it&#8217;s likely the tweet they attribute the action to was not your latest tweet at the time.</p>
<p>Since Follows went live I&#8217;ve been keeping track of what people tweet about it and Qwitter and I&#8217;ve noticed some interesting behaviour in response to notifications.</p>
<p>Quite a few users react to people unfollowing them by calling them out with a public tweet asking them why. I can understand the desire to get an explanation but doing it publicly seems a bit &#8230; well I dunno really, but it certainly isn&#8217;t the best way to go about asking the question.</p>
<p>The other common reaction is the realisation that their self-esteem can&#8217;t take being informed when people stop finding them interesting. Again I can understand this to a certain extent but it&#8217;s not something you can take personally and remain well-balanced. It&#8217;s the constant battle between the need for validation and the bliss of ignorance &#8211; part of the &#8220;human condition&#8221;.</p>
<p>Another interesting side-effect has been some comments from other Twitterers to the effect that such a service is pointless and/or purely egotistical, but I&#8217;m convinced there&#8217;s great value in getting visibility of the ongoing changes to your follower list.</p>
<p>I use the daily emails I get from Follows to do two things. First of all I check every new follower to see if it&#8217;s worth following them back, just like I did when I was getting the individual notifications from Twitter but now I only do it once a day which is far more efficient.</p>
<p>The second thing I do is have a look at every ex follower and if I&#8217;m following them I consider whether it&#8217;s worth continuing to follow them despite their decision to stop following me. I would never ask them about it because if someone has a problem with what I&#8217;m saying, whether it&#8217;s frequency or content, I would hope they&#8217;d tell me about it. It&#8217;s difficult to learn without feedback.</p>
<p>For me Twitter is not a popularity contest and it&#8217;s not an ego broadcasting outlet. It&#8217;s a conversation. If someone decides to stop following me I take that to mean they no longer want to participate in conversations with me. That&#8217;s fine, but it doesn&#8217;t necessarily mean I no longer want to participate in conversations with them, or that I&#8217;m no longer interested in what they have to say, but knowing they have made that decision is empowering.</p>
<p>What do you think? Do you see value in knowing if and when people stop following you or is it too much information?</p>
<div id="crp_related"><h3>If you liked this you might also like these:</h3><ul><li><a href="http://stut.net/blog/2008/04/04/twitter-public-timeline/" rel="bookmark">Twitter public timeline</a></li><li><a href="http://stut.net/blog/2008/05/23/has-that-website-gone-titsup/" rel="bookmark">Has that website gone TitsUp?</a></li><li><a href="http://stut.net/blog/2009/03/08/handling-email-notifications-from-twitter/" rel="bookmark">Handling email notifications from Twitter</a></li><li><a href="http://stut.net/blog/2008/01/28/tweetmeme-launch/" rel="bookmark">Tweetmeme Launch</a></li><li><a href="http://stut.net/blog/2007/11/19/that-other-bit-of-news/" rel="bookmark">That other bit of news</a></li></ul></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Stut?a=i4reIuqOG5Y:6BF1kfj0jcs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Stut?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=i4reIuqOG5Y:6BF1kfj0jcs:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Stut?i=i4reIuqOG5Y:6BF1kfj0jcs:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=i4reIuqOG5Y:6BF1kfj0jcs:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Stut?i=i4reIuqOG5Y:6BF1kfj0jcs:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=i4reIuqOG5Y:6BF1kfj0jcs:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Stut?i=i4reIuqOG5Y:6BF1kfj0jcs:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Stut/~4/i4reIuqOG5Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://stut.net/blog/2009/01/31/twitter-unfollows-too-much-information/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://stut.net/blog/2009/01/31/twitter-unfollows-too-much-information/</feedburner:origLink></item>
		<item>
		<title>Alexei Arkhipovskiy – Sharmanka</title>
		<link>http://feedproxy.google.com/~r/Stut/~3/bV3bmiLywDE/</link>
		<comments>http://stut.net/blog/2009/01/25/alexei-arkhipovskiy-sharmanka/#comments</comments>
		<pubDate>Sun, 25 Jan 2009 09:09:25 +0000</pubDate>
		<dc:creator>Stut</dc:creator>
				<category><![CDATA[Misc]]></category>

		<guid isPermaLink="false">http://stut.net/blog/2009/01/25/alexei-arkhipovskiy-sharmanka/</guid>
		<description><![CDATA[Absolute genius!
    
If you liked this you might also like these:Extreme Sheep LED ArtBigDog ... WOW!Amazing MachinesKnex Roller CoasterVerizonMath]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fstut.net%2Fblog%2F2009%2F01%2F25%2Falexei-arkhipovskiy-sharmanka%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fstut.net%2Fblog%2F2009%2F01%2F25%2Falexei-arkhipovskiy-sharmanka%2F" height="61" width="51" /></a></div><p>Absolute genius!</p>
<p>  <object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/F6pPP2kfHzU&amp;hl=en&amp;fs=1&amp;rel=0&amp;color1=0x3a3a3a&amp;color2=0x999999" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed src="http://www.youtube.com/v/F6pPP2kfHzU&amp;hl=en&amp;fs=1&amp;rel=0&amp;color1=0x3a3a3a&amp;color2=0x999999" type="application/x-shockwave-flash" width="480" height="385"></embed></param></param></param></object>  </p>
<div id="crp_related"><h3>If you liked this you might also like these:</h3><ul><li><a href="http://stut.net/blog/2009/03/23/extreme-sheep-led-art/" rel="bookmark">Extreme Sheep LED Art</a></li><li><a href="http://stut.net/blog/2008/03/28/bigdog-wow/" rel="bookmark">BigDog ... WOW!</a></li><li><a href="http://stut.net/blog/2006/09/29/amazing-machines/" rel="bookmark">Amazing Machines</a></li><li><a href="http://stut.net/blog/2006/09/29/knex-roller-coaster/" rel="bookmark">Knex Roller Coaster</a></li><li><a href="http://stut.net/blog/2006/12/11/verizonmath/" rel="bookmark">VerizonMath</a></li></ul></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Stut?a=bV3bmiLywDE:QDiXfBfpaZg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Stut?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=bV3bmiLywDE:QDiXfBfpaZg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Stut?i=bV3bmiLywDE:QDiXfBfpaZg:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=bV3bmiLywDE:QDiXfBfpaZg:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Stut?i=bV3bmiLywDE:QDiXfBfpaZg:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=bV3bmiLywDE:QDiXfBfpaZg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Stut?i=bV3bmiLywDE:QDiXfBfpaZg:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Stut/~4/bV3bmiLywDE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://stut.net/blog/2009/01/25/alexei-arkhipovskiy-sharmanka/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://stut.net/blog/2009/01/25/alexei-arkhipovskiy-sharmanka/</feedburner:origLink></item>
		<item>
		<title>OAuth and Twitter: Realistic expectations</title>
		<link>http://feedproxy.google.com/~r/Stut/~3/yRz8-iS9pVw/</link>
		<comments>http://stut.net/blog/2009/01/24/oauth-and-twitter-realistic-expectations/#comments</comments>
		<pubDate>Sat, 24 Jan 2009 18:43:37 +0000</pubDate>
		<dc:creator>Stut</dc:creator>
				<category><![CDATA[Annoyances]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://stut.net/blog/?p=326</guid>
		<description><![CDATA[
Twitter promised OAuth support a l-o-o-ong time ago, and it would appear to finally be here. Alex Payne sent a &#8220;Call for OAuth beta participants&#8221; to the developers list yesterday and had an overwhelming response. This predictably triggered a deluge of tweets and blog posts, but the one that caught my eye was on ReadWriteWeb [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fstut.net%2Fblog%2F2009%2F01%2F24%2Foauth-and-twitter-realistic-expectations%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fstut.net%2Fblog%2F2009%2F01%2F24%2Foauth-and-twitter-realistic-expectations%2F" height="61" width="51" /></a></div><div style="float:right;background-color:black;color:white;padding:4px;margin-left:1em;margin-bottom:0.25em;text-align:center;"><a href="http://www.flickr.com/photos/7913872@N03/2964858067" title="View 'Closed, keep off' on Flickr.com"><img src="http://farm4.static.flickr.com/3144/2964858067_fc3af26d40_m.jpg" alt="Closed, keep off" border="0" width="240" height="160" align="right" /></a></div>
<p><a href="http://twitter.com/">Twitter</a> promised OAuth support a l-o-o-ong time ago, and it would appear to finally be here. <a href="http://al3x.net/">Alex Payne</a> sent a &#8220;<a href="http://groups.google.com/group/twitter-development-talk/browse_thread/thread/42486bd3d7d136d0/f0e89b742bf0033e?show_docid=f0e89b742bf0033e&#038;pli=1">Call for OAuth beta participants</a>&#8221; to the developers list yesterday and had an overwhelming response. This predictably triggered a deluge of tweets and blog posts, but the one that caught my eye was on <a href="http://www.readwriteweb.com/">ReadWriteWeb</a> titled &#8220;<a href="http://www.readwriteweb.com/archives/why_twitters_new_oauth_matters.php">Why Twitter&#8217;s New Security Solution Could Pave the Way to a Future Web of Mashups</a>&#8220;.</p>
<p>A number of things disturbed me about this post so I posted <a href="http://www.readwriteweb.com/archives/why_twitters_new_oauth_matters.php#comment-124285">a comment or two</a> but I believe the issues involved deserve more attention.<br />
<span id="more-326"></span><br />
First of all the post asserts that sharing our Twitter password with other websites and applications &#8220;makes a lot of us very uncomfortable&#8221;. If doing that makes you feel uncomfortable, don&#8217;t do it. And this is my main criticism regarding this post. OAuth is being hailed as a solution to sharing your password with third parties, and it is, but it doesn&#8217;t protect your account once you&#8217;ve given a third party access. And surely the more important message is that if you care at all about the security of your Twitter account you should not be sharing your password with anyone but the Twitter site, an even then only after you&#8217;ve checked and double-checked that you&#8217;re on the actual Twitter site.</p>
<p>OAuth partially solves the problem in that third parties don&#8217;t get your password, but they still get access rights to your account. They&#8217;ll still be able to read your direct messages and post tweets and direct messages on your behalf.</p>
<p>The point here is that even with OAuth you are still giving a third party access to your account albeit slightly more limited access. We&#8217;re yet to see any details regarding the Twitter implementation of OAuth, and a lot will depend on how fine-grained the permissions system is and how their side of the user experience looks and works, but I think my point is easier to explain with an analogy.</p>
<div style="float:left;background-color:black;color:white;padding:4px;margin-right:1em;margin-bottom:0.25em;text-align:center;"><a href="http://www.flickr.com/photos/7913872@N03/481929512" title="View 'Online 2' on Flickr.com"><img src="http://farm1.static.flickr.com/172/481929512_f76fa4d5c9_m.jpg" alt="Online 2" border="0" width="240" height="149" align="left" /></a></div>
<p>The common analogy used with OAuth is that of a valet key for your car. These are special keys that only allow your car to be drive a few miles at most &#8211; just enough to be parked and then brought back to you, essentially giving limited access to the valet. However, consider that you&#8217;re still leaving your car with the valet unattended for maybe a few hours. They can get into the car. They can drive it on to a car transporter. They can then take it anywhere they want where they can take it apart to disable whatever security you have until they get full access. You&#8217;ve not made your car &#8220;secure&#8221;, you&#8217;ve limited the damage that can be done and made it harder to take it away from you, but if they&#8217;re determined you still may never see your car again.</p>
<p>Ok, so the analogy doesn&#8217;t completely work since you can&#8217;t take a persons Twitter account away with OAuth and gain full access given enough time, but the basic point remains. You&#8217;re still giving someone access to your account therefore implying you trust them.</p>
<p>This is known as security theatre which is another way of saying it gives people the illusion of security where the benefits are actually minimal.</p>
<p>OAuth comes with risks as well as benefits, and these are rarely covered. Let&#8217;s say I&#8217;m a &#8220;bad guy&#8221; and I want to collect Twitter users passwords. Pre-OAuth it&#8217;s pretty easy, you just come up with a viral application and work hard to get people using it. Post-OAuth it&#8217;s a little more difficult but how much more depends on how Twitter have imlemented it.</p>
<div style="float:right;background-color:black;color:white;padding:4px;margin-left:1em;margin-bottom:0.25em;text-align:center;"><a href="http://www.flickr.com/photos/7913872@N03/2965707606" title="View 'Just fishin'' on Flickr.com"><img src="http://farm4.static.flickr.com/3014/2965707606_ab1b2255fc_m.jpg" alt="Just fishin'" border="0" width="240" height="160" align="right" /></a></div>
<p> Let&#8217;s take the worst-case scenario in which Twitter have used a plain login page for OAuth authentication. I as the &#8220;bad guy&#8221; write my application so it appears to be taking users to Twitter to authenticate, but in actuality the login page is still on my website. It looks like Twitter, it acts like Twitter, and most enough users will believe it&#8217;s Twitter to make it work. Once they enter their username and password I can simulate a login against the actual Twitter site to confirm they&#8217;re correct, store them away and take the user to my application just as if they&#8217;d signed in on the real Twitter site.</p>
<p>The simple fact that OAuth redirects the user to the Twitter site for authentication allows this phishing attack to be pretty successful.</p>
<p>Now, Twitter can prevent this from happening using a personalisation feature such as allowing the user to upload a secret image that&#8217;s then shown to them on the login page. Because only Twitter has that image when a user sees that they know they&#8217;re on the real site &#8211; various OpenID providers use this system. Let&#8217;s hope Twitter has implemented something similar.</p>
<p>Ok, so having read all that you might get the impression I&#8217;m anti-OAuth. I&#8217;m certainly not. I believe that OAuth will be a great thing for Twitter, but I feel it&#8217;s important that all the coverage it&#8217;s getting also highlights that there&#8217;s still trust involved between the user and the third party. It&#8217;s about setting realistic expectations, because believing something is secure can be far more dangerous than it actually being insecure.</p>
<p>I&#8217;ve been accepted into the OAuth private beta and I&#8217;m excited to see what Twitter have implemented.</p>
<p>Finally I just want to state that I have great respect for Marshall Kirkpatrick and the work he does over at RWW. I wish I could blog as often as he does and stay interesting. Maybe in 2009 I should try it. Hmmm&#8230;</p>
<div id="crp_related"><h3>If you liked this you might also like these:</h3><ul><li><a href="http://stut.net/blog/2008/12/17/twitorfit/" rel="bookmark">Twitorfit</a></li><li><a href="http://stut.net/blog/2008/01/28/tweetmeme-launch/" rel="bookmark">Tweetmeme Launch</a></li><li><a href="http://stut.net/blog/2009/01/23/automated-content-failure/" rel="bookmark">Automated content failure</a></li><li><a href="http://stut.net/blog/2008/05/23/has-that-website-gone-titsup/" rel="bookmark">Has that website gone TitsUp?</a></li><li><a href="http://stut.net/blog/2009/03/08/handling-email-notifications-from-twitter/" rel="bookmark">Handling email notifications from Twitter</a></li></ul></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Stut?a=yRz8-iS9pVw:MyPRs0pcZQg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Stut?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=yRz8-iS9pVw:MyPRs0pcZQg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Stut?i=yRz8-iS9pVw:MyPRs0pcZQg:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=yRz8-iS9pVw:MyPRs0pcZQg:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Stut?i=yRz8-iS9pVw:MyPRs0pcZQg:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Stut?a=yRz8-iS9pVw:MyPRs0pcZQg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Stut?i=yRz8-iS9pVw:MyPRs0pcZQg:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Stut/~4/yRz8-iS9pVw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://stut.net/blog/2009/01/24/oauth-and-twitter-realistic-expectations/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://stut.net/blog/2009/01/24/oauth-and-twitter-realistic-expectations/</feedburner:origLink></item>
	</channel>
</rss>
