<?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>Software and Opinions &#187; twitter</title>
	<atom:link href="http://ianloic.com/tag/twitter/feed/" rel="self" type="application/rss+xml" />
	<link>http://ianloic.com</link>
	<description>from Ian McKellar</description>
	<lastBuildDate>Thu, 19 Nov 2009 22:05:43 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Users&#8217; names and usernames</title>
		<link>http://ianloic.com/2009/11/19/users-names-and-usernames/</link>
		<comments>http://ianloic.com/2009/11/19/users-names-and-usernames/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 22:05:43 +0000</pubDate>
		<dc:creator>Ian McKellar</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://ianloic.com/?p=155</guid>
		<description><![CDATA[A few years ago my friend Jack built a cute little application. It was a text message multiplexer. You could send it a text message and it would send that message to all of your friends. You signed up using your phone number and gave it your name. It was somewhere between addictive and annoying [...]]]></description>
			<content:encoded><![CDATA[<p>A few years ago my friend <a href="http://en.wikipedia.org/wiki/Jack_Dorsey">Jack</a> built a cute little <a href="http://twttr.com/">application</a>. It was a text message multiplexer. You could send it a text message and it would send that message to all of your friends. You signed up using your phone number and gave it your name. It was somewhere between addictive and annoying but completely social, since basically all of the users were our friends. We mostly used it as a free-form <a href="http://en.wikipedia.org/wiki/Dodgeball_(service)">Dodgeball</a>, to work out when friends were out at bars and inevitably they added the ability to send a message directly to a contact. There were no usernames so twttr would cleverly work out who you meant based on the first name you supplied and your contacts list. This never worked right, they added usernames and now I&#8217;m <a href="http://twitter.com/ian">@ian</a>. Unfortunately then the whole @reply thing happened and people <em>do</em> just use their friends first names. Look at <a href="http://search.twitter.com/search?q=@ian">how many people use @ian</a> &#8211; most of them are not talking to me, but other Ians.</p>
<p>Facebook resisted giving people anything other than a free-form name and a numeric user ID for the longest time. They finally gave in and let people pick vanity URLs but still refuse to make that URL useful for anything but getting to your profile. When they added @ support they pop up UI to autocomplete friends names from your contacts list. It works really well, but it depends on a rich message composition UI, something that&#8217;s not possible on the simple mobile devices that twitter was targeting.</p>
<p>I wonder how the next site will approach this.</p>
]]></content:encoded>
			<wfw:commentRss>http://ianloic.com/2009/11/19/users-names-and-usernames/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter Translation</title>
		<link>http://ianloic.com/2008/04/22/twitter-translation/</link>
		<comments>http://ianloic.com/2008/04/22/twitter-translation/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 05:37:48 +0000</pubDate>
		<dc:creator>Ian McKellar</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[greasemonkey]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[translation]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[userscript]]></category>

		<guid isPermaLink="false">http://ianloic.com/?p=52</guid>
		<description><![CDATA[My friend Britt mentioned today that he was about to launch twitter.jp. How exciting! But I don&#8217;t understand Japanese. If only I could easily translate all those tweets in languages I don&#8217;t understand.
I played around with Google&#8217;s new AJAX Translation API before and I wondered how hard it would be to use that from a [...]]]></description>
			<content:encoded><![CDATA[<p>My friend <a href="http://twitter.com/bs">Britt</a> mentioned today that he was about to launch <a href="http://twitter.jp/">twitter.jp</a>. How exciting! But I don&#8217;t understand Japanese. If only I could easily translate all those tweets in languages I don&#8217;t understand.</p>
<p>I played around with Google&#8217;s new <a href="http://code.google.com/apis/ajaxlanguage/">AJAX Translation API</a> <a href="http://ianloic.com/2008/03/20/google-ajax-apis-outside-the-browser/">before</a> and I wondered how hard it would be to use that from a <a href="http://www.greasespot.net/">GreaseMonkey</a> script. The answer: hard. I&#8217;m not sure what the exact problem was but every way I tried to include Google&#8217;s APIs into the pages I was manipulating, including creating my own <code>iframe</code> and using <code>document.write</code> failed. In the end I used a static proxy html file (hosted in one of my Amazon S3 buckets for cheap efficiency) with some sneaky cross-site communication (the request goes over in location.hash, the response comes back in window.name).</p>
<p>My script is now up on userscripts.org: <a href="http://userscripts.org/scripts/show/25508">twitlator.user.js</a></p>
<p>To use it simply go to a page listing a bunch of tweets, like the <a href="http://twitter.com/public_timeline">public timeline</a> and find a tweet in a language you don&#8217;t under stand. For example:</p>
<p><img class="alignnone size-full wp-image-53" title="A tweet" src="http://ianloic.com/wp-content/uploads/2008/04/twitlator-1.png" alt="" /></p>
<p>Click the <strong>translate!</strong> link and several moments later you&#8217;ve got:</p>
<p><img class="alignnone size-full wp-image-54" title="A translated tweet" src="http://ianloic.com/wp-content/uploads/2008/04/twitlator-2.png" alt="" /></p>
<p>Yep. People aren&#8217;t posting anything interesting in Japanese either.</p>
<p>I&#8217;m pretty sure my script will only work on <a href="http://www.mozilla.com/en-US/firefox/all-beta.html">Firefox 3</a>. I&#8217;m using <code>getElementsByClassName</code> which I think wasn&#8217;t introduced until Firefox 3. Why aren&#8217;t you running it already?</p>
]]></content:encoded>
			<wfw:commentRss>http://ianloic.com/2008/04/22/twitter-translation/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A simpler mobile OpenID workflow?</title>
		<link>http://ianloic.com/2008/01/13/a-simpler-mobile-openid-workflow/</link>
		<comments>http://ianloic.com/2008/01/13/a-simpler-mobile-openid-workflow/#comments</comments>
		<pubDate>Mon, 14 Jan 2008 04:56:09 +0000</pubDate>
		<dc:creator>Ian McKellar</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[openid]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://ianloic.com/2008/01/13/a-simpler-mobile-openid-workflow/</guid>
		<description><![CDATA[Chris Messina posted today about the problems with current OpenID work-flows for mobile users. In spite of a long list of chores I was intending to complete today I had a bit of an experiment with an approach to solving this.
The main problem I wanted to solve was to allow a user to prove their [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://factoryjoe.com/">Chris Messina</a> posted today about the <a href="http://factoryjoe.com/blog/2008/01/13/the-openid-mobile-experience/">problems with current OpenID work-flows</a> for mobile users. In spite of a long list of chores I was intending to complete today I had a bit of an experiment with an approach to solving this.</p>
<p>The main problem I wanted to solve was to allow a user to prove their identity without having to enter a password. Most mobile devices lack physical alphanumeric keyboards, and without that it&#8217;s very hard to fill out password fields.</p>
<p><span id="more-42"></span>My initial approach was to offer an OpenID URL for phone numbers and use an SMS message containing a one-time password to verify that the person attempting to log in had access to that mobile phone. Unfortunately there&#8217;s no free web service for sending SMSes, so did the next best thing and built it on top of <a href="http://www.twitter.com/">Twitter</a>.</p>
<p>I began with JanRain&#8217;s <a href="http://openidenabled.com/php-standalone-openid-server">PHP Standalone OpenID Server</a> and hacked it to pieces. I removed the requirement for registration &#8211; it transparently adds accounts as you use it. It doesn&#8217;t use password authentication, it sends a Twitter direct message with a one-time token to verify identity. I removed the OpenID Simple Registration support since the server has no idea about the user&#8217;s profile information &#8211; it might be possible in the future to put that back in, pulling the data over from the user&#8217;s twitter profile.</p>
<p>The server seems to work okay for the couple of services I tried it with. If there&#8217;s interest in this I might continue to develop it. Right now it&#8217;s up at <a href="http://twauth.ianloic.com/">http://twauth.ianloic.com/</a>. It might be broken, it might go away at any point, it likely has security holes. Have a play and let me know what you think.</p>
<p>What I <em>really</em> want is a variation on this. I want to be able to use this simple single-use-token authentication when I&#8217;m on a mobile device and use a more traditional system the rest of the time. <a href="http://ma.gnolia.com/">Magnolia</a> allows me to associate multiple OpenID identities with my account so it&#8217;s easy there, but most services have a one-to-one relationship between identities and accounts.</p>
]]></content:encoded>
			<wfw:commentRss>http://ianloic.com/2008/01/13/a-simpler-mobile-openid-workflow/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>The Making Of LOL Feeds</title>
		<link>http://ianloic.com/2007/06/06/the_making_of_lol_feeds/</link>
		<comments>http://ianloic.com/2007/06/06/the_making_of_lol_feeds/#comments</comments>
		<pubDate>Wed, 30 Nov -0001 00:00:00 +0000</pubDate>
		<dc:creator>Ian McKellar</dc:creator>
				<category><![CDATA[lolcats]]></category>
		<category><![CDATA[meme]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Last week I wrote and released my <a href="http://lol.ianloic.com/">LOL Feeds</a> site. It takes RSS or Atom feeds from the web and makes a series of lolcat-style images on a web page. It's really way funnier than it sounds.

Initially I wanted to be able to auto-generate <a href="http://www.jerkcity.com/">Jerk City</a> comic strips based on my friends' <a href="http://www.twitter.com/">twitter</a>s, but when that seemed hard I opted for lolcats style images. After all we'd been seeing a lot of the lolcats on twitter - they're displayed when the site is undergoing maintenance.

The original version of the script was very very clever. It used the <a href="http://code.google.com/apis/ajaxfeeds/">Google AJAX Feed API</a> and the <a href="http://www.flickr.com/services/api/">Flickr API</a> to pull in feeds and random images of cats from Flickr, combine them together with a PHP script I wrote to generate transparent PNGs of text live onto the page. It used the browser's own text-flowing algorithms to lay out the text. It was however amazingly slow. 

Browsers only allow a low number of concurrent connections to one site - four or eight I think - and this made the text crawl in. Also while the Google AJAX Feed API and Flickr API are pretty snappy they're way slower than doing it server side. I was sad about this because I'm kind of in love with fully dynamic client-side applications (just look at my <a href="http://ian.mckellar.org/">home page</a>) but I actually wanted this to see the light of day.
]]></description>
			<content:encoded><![CDATA[<p>Last week I wrote and released my <a href="http://lol.ianloic.com/">LOL Feeds</a> site. It takes RSS or Atom feeds from the web and makes a series of lolcat-style images on a web page. It&#8217;s really way funnier than it sounds.</p>
<p>Initially I wanted to be able to auto-generate <a href="http://www.jerkcity.com/">Jerk City</a> comic strips based on my friends&#8217; <a href="http://www.twitter.com/">twitter</a>s, but when that seemed hard I opted for lolcats style images. After all we&#8217;d been seeing a lot of the lolcats on twitter &#8211; they&#8217;re displayed when the site is undergoing maintenance.</p>
<p>The original version of the script was very very clever. It used the <a href="http://code.google.com/apis/ajaxfeeds/">Google AJAX Feed API</a> and the <a href="http://www.flickr.com/services/api/">Flickr API</a> to pull in feeds and random images of cats from Flickr, combine them together with a PHP script I wrote to generate transparent PNGs of text live onto the page. It used the browser&#8217;s own text-flowing algorithms to lay out the text. It was however amazingly slow. </p>
<p>Browsers only allow a low number of concurrent connections to one site &#8211; four or eight I think &#8211; and this made the text crawl in. Also while the Google AJAX Feed API and Flickr API are pretty snappy they&#8217;re way slower than doing it server side. I was sad about this because I&#8217;m kind of in love with fully dynamic client-side applications (just look at my <a href="http://ian.mckellar.org/">home page</a>) but I actually wanted this to see the light of day.</p>
<p>So a rewrite ensued. I pulled down a static set of cute cats from the <a href="http://www.flickr.com/groups/cutecat/">cute cat</a> group on Flickr, filtered by <a href="http://creativecommons.org">creative commons</a> license of course. I removed a ton I didn&#8217;t like and added a couple of pictures of cats I know well. I reworked the script that generated single words into one that could place words on a JPEG. I had to write my own text layout algorithms but it turned out to be pretty simple.</p>
<p>I used <a href="http://magpierss.sourceforge.net/">Magpie RSS</a> to generate a page that referenced my image generation script. To make the image generation stable (so that everyone looking at the same feed would get the same images for the same text) the image is selected based on a hash of the message. Nothing is actually random.</p>
<p>Then I glued it together with a good helping of <a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html">mod_rewrite</a></p>
<p>This version worked pretty well. There were some issues with non-ascii characters and even funny characters like ? and &amp; due to some URL encoding issues but it worked well. I <a href="http://loic.livejournal.com/94213.html">posted</a> about it told some friends and waited to see what would happen.</p>
<p>Things were going fine till I hit <a href="http://www.metafilter.com/61678/lolfeeds">metafiler</a>. Dreamhost, my friendly cheap hosting provider (100% carbon neurtral &#8211; yay!) noticed my image generation script was slowing down my shared machine and turned it off.</p>
<p>Adding an image caching layer was pretty straight-forward. I turned the image generation script from a .php to a .inc and included it in my feed processing script. Instead of generating an image every time it generates an MD5 of image parameters and uses a cached image if one exists. I was able to update the existing image generation script to use the same code and send a redirect to the cached version. In the past 5 days the script has generated just over 50,000 unique images which have been accessed almost half a million times. That&#8217;s a lot of cats saying stupid things. And a lot of saved CPU cycles.</p>
<p>I also wrote a <a href="http://apps.facebook.com/lolcatslol/">Facebook Platform</a> application, but that&#8217;s a story for another day.</p>
]]></content:encoded>
			<wfw:commentRss>http://ianloic.com/2007/06/06/the_making_of_lol_feeds/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
