<?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>Coyote Tracks &#187; Twitter</title>
	<atom:link href="http://kagan.mactane.org/blog/tag/twitter/feed/" rel="self" type="application/rss+xml" />
	<link>http://kagan.mactane.org/blog</link>
	<description>The prints of an Internet-enabled coyote.</description>
	<lastBuildDate>Tue, 31 Jan 2012 03:26:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>What Characters Are Allowed in Twitter Usernames</title>
		<link>http://kagan.mactane.org/blog/2009/09/22/what-characters-are-allowed-in-twitter-usernames/</link>
		<comments>http://kagan.mactane.org/blog/2009/09/22/what-characters-are-allowed-in-twitter-usernames/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 21:12:05 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[learning]]></category>
		<category><![CDATA[regex]]></category>
		<category><![CDATA[the world-wide conversation]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/2009/09/22/what-characters-are-allowed-in-twitter-usernames/</guid>
		<description><![CDATA[A while back, when I was writing Hummingbird, I needed to look for Twitter usernames in various strings. More recently, I&#8217;m doing some work that involves Twitter at my new job. Once again, I need to find and match on Twitter usernames. Luckily, this time, Twitter seems to have updated its signup page with some [...]]]></description>
			<content:encoded><![CDATA[<p>A while back, when I was writing Hummingbird, I needed to look for Twitter usernames in various strings. More recently, I&#8217;m doing some work that involves Twitter at my new job. Once again, I need to find and match on Twitter usernames.</p>
<p>Luckily, this time, Twitter seems to have updated its signup page with some nice AJAX that constrains the user&#8217;s options, and provides helpful feedback. So, for anyone else who needs this information in the future, here&#8217;s the scoop:</p>
<ol>
<li>Letters, numbers, and underscores only. It&#8217;s case-blind, so you can enter <code>hi_there</code>, <code>Hi_There</code>, or <code>HI_THERE</code> and they&#8217;ll all work the same (and be treated as a single account).</li>
<li>There is apparently no minimum-length requirement; <a href="https://twitter.com/a">the user a exists on Twitter</a>. Maximum length is 15 characters.</li>
<li>There is also no requirement that the name contain letters at all; <a href="https://twitter.com/69">the user 69</a> exists, as does a user <a href="https://twitter.com/____">whose name I can&#8217;t pronounce</a>.</li>
</ol>
<p>If you want a regex to match on this, <code>/[a-zA-Z0-9_]{1,15}/</code> would be nice and safe for use in both POSIX and Perl-style regex syntax. (If you&#8217;ve got Perl-compatible regexes, <code>/\w{1,15}/</code> is quick and easy.)</p>
]]></content:encoded>
			<wfw:commentRss>http://kagan.mactane.org/blog/2009/09/22/what-characters-are-allowed-in-twitter-usernames/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Hummingbird Updated to Version 0.60</title>
		<link>http://kagan.mactane.org/blog/2009/08/20/hummingbird-updated-to-version-0-60/</link>
		<comments>http://kagan.mactane.org/blog/2009/08/20/hummingbird-updated-to-version-0-60/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 02:49:27 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[announcements]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[Hummingbird]]></category>
		<category><![CDATA[my projects]]></category>
		<category><![CDATA[oops]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[should have known better]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=109</guid>
		<description><![CDATA[I&#8217;ve always questioned the wisdom of building a startup company based around someone else&#8217;s platform, like Facebook games or Gmail inbox add-ons. You&#8217;re totally at the mercy of the other company. (Many people have found out how silly it was to go up against Microsoft or Apple in just the same way.) And yet, here [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve always questioned the wisdom of building a startup company based around someone else&#8217;s platform, like Facebook games or Gmail inbox add-ons. You&#8217;re totally at the mercy of the other company. (Many people have found out how silly it was to go up against Microsoft or Apple in just the same way.)</p>
<p>And yet, here I am with <a href="/software/hummingbird/">Hummingbird</a>, which is totally dependent on Twitter&#8217;s bandwidth. (In my own defense, I can only point out that: a) I wrote it because I needed the functionality; and b) I&#8217;m not building a money-making company around Hummingbird. I&#8217;m just giving it away.)</p>
<p>In the past couple of weeks, I&#8217;ve noticed that Twitter can sometimes take an astonishingly long time to provide an update. Hummingbird works by requesting URLs like <a href="http://twitter.com/statuses/user_timeline/kmactane.xml?count=25">http://twitter.com/statuses/user_timeline/kmactane.xml?count=25</a>, and (up until now) it worked on the assumption that Twitter couldn&#8217;t possibly take longer than 10 or 15 seconds to respond to such a request.</p>
<p>That turns out not to be the case.</p>
<p>In fact, my recent tests have shown that Twitter can sometimes take <em>over 5 full minutes</em> to finish responding to such a request. This is a problem, because the default installation of Hummingbird tries to update its cached data once every 5 minutes. And since I assumed the request would be fulfilled in, at most, 10% of that time, I didn&#8217;t bother building in any concurrency checking.</p>
<p>I&#8217;ve just completely reorganized most of Hummingbird&#8217;s architecture. The interface that a blog owner sees (in the sense of the configuration variables in <code>hummingbird.php</code>, and the calling syntax for blog pages and cron jobs) is still the same. However, all of the code for retrieving data from Twitter has been spun off into a new <code>hummingbird-cache.php</code> file, which can be launched into the background by the rest of Hummingbird, so that it can patiently take as long as it needs to in order to update the blog&#8217;s tweets cache.</p>
<h3>The Major Change This Causes</h3>
<p>In Hummingbird&#8217;s previous incarnations, it would freshen an out-of-date cache before displaying it. The assumption was that every once in a while, someone might have to wait a few more seconds before seeing your blog page. However, everyone would always see an up-to-date record of your tweets. (Where &#8220;up-to-date&#8221; means &#8220;no more than 5 minutes old, absolute tops&#8221;. If you tweet so relentlessly that that&#8217;s a problem, you probably don&#8217;t have enough time to keep up your blog&#8230;)</p>
<p>Now that we know that Twitter can take over 5 minutes to give you the data needed to freshen your tweets cache, that design is not acceptable. Instead, Hummingbird is now committed to showing the contents of your tweets cache as quickly as possible, and <em>only then</em> does it fork the cache-update process into the background.</p>
<p>This means that, <em>if you&#8217;re not using cron</em> or some other automatic job-scheduling facility to run Hummingbird every 5 minutes, visitors who arrive at your blog after a period of inactivity will see an out-of-date, stale listing of your tweets. </p>
<p>If you have a cron job set to keep Hummingbird fresh, you&#8217;ll be fine. (A page view will also trigger an update, so if you get so much traffic that there&#8217;s never a 5-minute period during which your page doesn&#8217;t get hit, you&#8217;ll also be fine.)</p>
]]></content:encoded>
			<wfw:commentRss>http://kagan.mactane.org/blog/2009/08/20/hummingbird-updated-to-version-0-60/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Announcement: Hummingbird Upgraded to Version 0.51</title>
		<link>http://kagan.mactane.org/blog/2009/07/15/announcement-hummingbird-upgraded-to-version-0-51/</link>
		<comments>http://kagan.mactane.org/blog/2009/07/15/announcement-hummingbird-upgraded-to-version-0-51/#comments</comments>
		<pubDate>Wed, 15 Jul 2009 22:11:10 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[docs]]></category>
		<category><![CDATA[my projects]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=91</guid>
		<description><![CDATA[I&#8217;ve just upgraded Hummingbird from version 0.5 to its new version: 0.51. Since I recently starting using the #PalmPr&#275; hashtag in my tweets, I suddenly noticed that Hummingbird didn&#8217;t make hashtags clickable. Well, now it does. The change is pretty minimal, but it also incurred some overhead in my web site: the Hummingbird web page [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just upgraded Hummingbird from version 0.5 to its new version: 0.51. Since I recently starting using the #PalmPr&#275; hashtag in my tweets, I suddenly noticed that Hummingbird didn&#8217;t make hashtags clickable.</p>
<p>Well, now it does.</p>
<p>The change is pretty minimal, but it also incurred some overhead in my web site: <a href="http://kai.mactane.org/software/hummingbird/">the Hummingbird web page</a> needed to be updated to match the new feature. And since that feature meant adding a new CSS class, I had to update the &#8220;CSS Styling&#8221; section as well as the &#8220;Features&#8221; section&#8230; and add a new &#8220;Version History&#8221; section&#8230;</p>
<p>All in all, it was harder to update the documentary web page than to update the software itself. In a way, that implies that my code was pretty clean. If you want, you can <a href="http://kai.mactane.org/software/libraries/download/hummingbird.php">download the new version here</a>.</p>
<p>See, I&#8217;m not neglecting everything to work on Palm Pr&#275; programming! (I&#8217;m also doing some contracting, which is taking up even more time.) </p>
]]></content:encoded>
			<wfw:commentRss>http://kagan.mactane.org/blog/2009/07/15/announcement-hummingbird-upgraded-to-version-0-51/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Announcing Hummingbird</title>
		<link>http://kagan.mactane.org/blog/2009/05/27/announcing-hummingbird/</link>
		<comments>http://kagan.mactane.org/blog/2009/05/27/announcing-hummingbird/#comments</comments>
		<pubDate>Wed, 27 May 2009 20:01:06 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[announcements]]></category>
		<category><![CDATA[my projects]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=57</guid>
		<description><![CDATA[If you read Coyote Tracks*, you&#8217;ve probably noticed that I recently set up a thing over there in the right-hand side that says &#8220;My Latest Tweets&#8221;. At first, that was just a little PHP widget that I&#8217;d hacked together myself. But then I realized it could actually be useful to other people, because it does [...]]]></description>
			<content:encoded><![CDATA[<p>If you read <cite>Coyote Tracks</cite>*, you&#8217;ve probably noticed that I recently set up a thing over there in the right-hand side that says &#8220;My Latest Tweets&#8221;. At first, that was just a little PHP widget that I&#8217;d hacked together myself. But then I realized it could actually be useful to other people, because it does a bunch of things that many of the other &#8220;latest tweets&#8221; widgets in existence <em>don&#8217;t</em> do.</p>
<p>So I decided to get it cleaned up and make a real, distributable software package out of it. That took a few days, especially when I started banging on it, and trying to ensure that it had a prayer of working on anyone else&#8217;s server. Plus there was the time involved for writing the docs.</p>
<p>But now that all of that stuff is done, I am pleased to announce: <a href="/software/hummingbird/">Hummingbird</a>. A lightweight, pretty, and compact gizmo for displaying your latest tweets on a blog or other PHP-powered web page.</p>
<p>* And if you don&#8217;t read <cite>Coyote Tracks</cite>&#8230; what the heck is wrong with you? *g*</p>
]]></content:encoded>
			<wfw:commentRss>http://kagan.mactane.org/blog/2009/05/27/announcing-hummingbird/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>When Have You Accomplished Enough?</title>
		<link>http://kagan.mactane.org/blog/2009/05/10/when-have-you-accomplished-enough/</link>
		<comments>http://kagan.mactane.org/blog/2009/05/10/when-have-you-accomplished-enough/#comments</comments>
		<pubDate>Mon, 11 May 2009 00:36:54 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[diary]]></category>
		<category><![CDATA[Dreamwidth]]></category>
		<category><![CDATA[Livejournal]]></category>
		<category><![CDATA[my projects]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[source control]]></category>
		<category><![CDATA[system administration]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=43</guid>
		<description><![CDATA[Okay, let me see if I can take stock of the day: I started off by getting my /etc, /usr/local/bin and /usr/local/sbin, and /var/named directories under version control. That&#8217;s good. Plus I think I&#8217;ve got things set up to where I can upgrade WordPress plugins on my local setup, then reliably push the changes through [...]]]></description>
			<content:encoded><![CDATA[<p>Okay, let me see if I can take stock of the day:</p>
<p>I started off by getting my <code>/etc</code>, <code>/usr/local/bin</code> and <code>/usr/local/sbin</code>, and <code>/var/named</code> directories under version control. That&#8217;s good. Plus I think I&#8217;ve got things set up to where I can upgrade WordPress plugins on my local setup, then reliably push the changes through version control to my live site.</p>
<p>Oh, and my Twitter feed importer is a little prettier, in terms of how it displays how long ago a tweet was posted.</p>
<p>But then there&#8217;s the Live+Press plugin&#8230; I have high hopes that I&#8217;ll be able to use that to automatically crosspost from here to my new Dreamwidth account, but for now, it only seems to communicate with Livejournal. Since there&#8217;s a feature request open in <a href="http://code.google.com/p/livepress/wiki/WishList">the project&#8217;s wish list</a> to make it work with other LJ-codebase sites, I figure I may as well pick that up and run with it.</p>
<p>Of course, that just slows me down on LJ Content Sieve&#8230; <i>*sigh*</i></p>
<p>Because I don&#8217;t have <em>everything</em> done, I feel like I didn&#8217;t accomplish much today. That&#8217;s silly, but knowing that it&#8217;s silly doesn&#8217;t chance my feelings much.</p>
]]></content:encoded>
			<wfw:commentRss>http://kagan.mactane.org/blog/2009/05/10/when-have-you-accomplished-enough/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

