<?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>Web 2.1</title>
	<atom:link href="http://web.2point1.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://web.2point1.com</link>
	<description>Tim Whitlock's home in the Blogohedron</description>
	<lastBuildDate>Sun, 21 Feb 2010 15:46:56 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Facebook privacy creep</title>
		<link>http://web.2point1.com/2010/02/21/facebook-privacy-creep/</link>
		<comments>http://web.2point1.com/2010/02/21/facebook-privacy-creep/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 15:28:47 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[privacy]]></category>
		<category><![CDATA[social networking]]></category>

		<guid isPermaLink="false">http://web.2point1.com/?p=314</guid>
		<description><![CDATA[Always the punctual adopter, I joined Facebook around the end of 2007. Since then I've observed many tweaks to Facebook's features, but not until recently when I set up a second account for work, did I really take notice of certain changes, especially those that relate to privacy and sharing of data.
If you don't already [...]]]></description>
			<content:encoded><![CDATA[<p>Always the punctual adopter, I joined Facebook around the end of 2007. Since then I've observed many tweaks to Facebook's features, but not until recently when I set up a <a href="http://www.facebook.com/profile.php?id=100000668227766" target="_blank">second account for work</a>, did I really take notice of certain changes, especially those that relate to privacy and sharing of data.</p>
<p>If you don't already know that I'm a huge cynic, then you will do shortly. I'm going to lay out my observations as factually as I can, but they will be tainted with my usual dose of suspicion, fear and resentment. Below is a list of feature creep that I've observed, but there is an underlying point. If you don't want to read the list, just skip to <a href="http://web.2point1.com/2010/02/21/facebook-privacy-creep/#end">the bit at the end</a>.</p>
<p><span id="more-314"></span></p>
<h3>Account verification via mobile phone</h3>
<p><a href="http://twitpic.com/14jksu" target="_blank"><img class="alignright" style="margin-left: 10px; margin-right: 10px;" src="http://twitpic.com/show/thumb/14jksu" alt="" width="150" height="150" /></a>I thought I'd start with this one, because it erks me the most. My personal account has long since been verified. i.e. Facebook is satisfied that I am a real person, and not a <em>robot</em>.  If you aren't verified you must pass a <a href="http://en.wikipedia.org/wiki/CAPTCHA" target="_blank">CAPTCHA</a> test for any significant activity such as posting, or friend-adding. This isn't new, but what seems to be new is that the <em>only</em> option for verifying that you are human now seems to be a SMS-based security check.</p>
<p>What erks me about this is that the CAPTCHA itself is the human/robot test &#8211; the mobile phone check is not proof of life; it is in fact little better than an email-based method which just proves an email address exists; it doesn't prove that there's a person at the end of it. I question Facebook's motivation here. The upshot of this is that if you don't give Facebook your mobile number you will be <em>badgered </em>with CAPTCHAs until you get so annoyed you verify. It also suggests they put a lower value on your email address. (<a href="http://techcrunch.com/2010/02/05/facebooks-project-titan-a-full-featured-webmail-product/" target="_blank">Project Titan</a> anyone?)</p>
<p>The &quot;username&quot; (vanity URL) feature is also denied to you if you do not verify. I particularly like the prompt to try another time.</p>
<p><img src="http://twitpic.com/show/full/14jji5" alt="" /></p>
<h3>iPhone address book feature</h3>
<p><a href="http://twitpic.com/yq0cb" target="_blank"><img class="alignright" src="http://twitpic.com/show/thumb/yq0cb" alt="" width="150" height="150" /></a>Continuing the mobile phone number theme: The superb Facebook iPhone app recently added a new feature which allows you to add your Facebook friends' profile pictures to the corresponding entries in your phone's address book. Before you enable this feature, you must make this fabulous <a href="http://en.wikipedia.org/wiki/Clickwrap" target="_blank">clickwrap</a> agreement (see image):</p>
<p>Now, don't get me wrong &#8211; I'm not suggesting that Facebook are doing evil things with your friend's numbers, I'm sure they really do need the phone numbers to automate this feature. I assume it's the only unique identifier that could associate an address book entry with a Facebook profile and a manual process would ask too much of the user. But regardless of the technical reasons, this is still an example of the increasingly prevalent &#8216;<em>features for data'</em> trade we are becoming more comfortable with. It can only make us more complacent about our own privacy.</p>
<h3>&quot;Tim W is no longer in a relationship&quot;</h3>
<p>This was actually the first of my recent observations. Facebook used to have user settings that allowed you to prevent certain events from being published as &#8216;news stories'. The example of relationship status is pertinent in that it is so personal. I actually went though a &#8216;Facebook breakup' in 2008, but had the publishing of this story disabled. I also had the &quot;X is now friends with Y&quot; story disabled (for reasons I can't be bothered to go into), but the point is that these options have disappeared. <em>Why</em>? Because Facebook want <em>more</em> activity not less, and that's no secret.</p>
<p>The real-time shift accelerated by Twitter at al is to blame for this. Much of Facebook's UX tweaks in 2009 were blatantly geared towards encouraging more chatter, more sharing, more data. Again we're <em>encouraged</em> to publish more activity, but in this example it's been achieved through denying us the right to keep it private. In my view, that's sneaky.</p>
<h3>&quot;friends-of-friends&quot;</h3>
<p>This relatively new privacy option took me by surprise. Certain rather innocuous settings, such as showing the &quot;Add as a friend&quot; button have had their tightest option reduced to friends-of-friends. This seems reasonable, but with 300 friends each having 300 of their own, we're talking about 90,000 people. The chance of a colleague, employer, or client being amongst that is high &#8211; In my case it's guaranteed. Fortunately the most sensitive settings, such as photo albums, still have much tighter options, but the option itself is still a nudge toward publishing more data to more people.<br />
<a name="end"></a></p>
<h3>The bit at the end</h3>
<p>I must point out that I'm not accusing Facebook of any evil-doing, or breaking any laws. These examples are here to illustrate what I think is a clear direction in our use of the <a href="http://en.wikipedia.org/wiki/Gratis_versus_Libre" target="_blank">free (as in beer)</a> web, and our relationships with companies like Facebook and Google where our activity has become both <em>product </em>and <em>payment</em>.</p>
<p>The greatest threat to our privacy is our own complacency over it. We want features, we want them for free, and we're increasing willing to hand over whatever data is required to access them. What worries me is not what companies are doing with this data now, and not even what they might do with it in future; what worries me is how this creep is discreetly changing our behaviour such that we [as a society] no longer even care about our privacy.</p>
<p>We need to keep an eye on the direction in which we're being nudged and keep an eye on the organisations that are doing the nudging. <a href="http://en.wikipedia.org/wiki/Geolocation" target="_blank">Geolocation</a> is clearly the next thing for us to get complacent about, and personal data doesn't get much more personal than your physical location. The recent <a href="http://pleaserobme.com/" target="_blank">Please Rob Me</a> site, however tongue-in-cheek, should be enough for even the least educated to sit up and pay attention to the potential dangers of publishing your location.</p>
]]></content:encoded>
			<wfw:commentRss>http://web.2point1.com/2010/02/21/facebook-privacy-creep/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Facebook Repost feature</title>
		<link>http://web.2point1.com/2010/01/16/facebook-repost-feature/</link>
		<comments>http://web.2point1.com/2010/01/16/facebook-repost-feature/#comments</comments>
		<pubDate>Sat, 16 Jan 2010 19:47:14 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[privacy]]></category>

		<guid isPermaLink="false">http://web.2point1.com/?p=298</guid>
		<description><![CDATA[I've noticed a lot of Facebook privacy creep recently. I intend to go into more detail in my next post, but this week saw a new Facebook feature worth a special mention because some are commenting that it breaks Facebook's privacy model. I ran my own test to see for myself that [-Spoiler warning-] it [...]]]></description>
			<content:encoded><![CDATA[<p><strong>I've noticed a lot of Facebook privacy creep recently</strong>. I intend to go into more detail in my next post, but this week saw a new Facebook feature worth a special mention because some are commenting that it breaks Facebook's privacy model. I ran my own test to see for myself that [-<em>Spoiler warning-</em>] it does a bit, but not as much as you might have feared. Read on and decide for yourself whether they are breaking their privacy assurances.</p>
<h3><span id="more-298"></span>What's the new feature?</h3>
<p>Essentially it's Facebook's version of forwarding content through the network, as retweeting is to Twitter. I can't find an <em>official</em> announcement of this feature. <a href="http://mashable.com/2010/01/16/facebook-via/" target="_blank">Mashable</a> and <a href="http://www.allfacebook.com/2010/01/facebook-retweets-via/" target="_blank">All Facebook</a> have referred to it as the &quot;<strong>via</strong>&quot; feature, or the &quot;Facebook retweet&quot;. Both ugly terms. I prefer &quot;repost&quot;, although &quot;reshare&quot; would be more inline with the Facebook lexicon. To cut a long story short, it lets you share with your friends something that a friend of yours has shared with you. At first glance this may seem like it circumvents the walled garden of your friend network. i.e. people you don't want seeing your content seeing your content. gasp.</p>
<h3>The repost privacy test</h3>
<p>From my <em>personal </em>account (where I am simply known as Tim W and have every privacy feature locked down its strictest setting) I posted a link with appropriately alarming status update, as follows:</p>
<p><a href="http://web.2point1.com/wp-content/uploads/2010/01/reshare1.jpg"><img class="alignnone size-full wp-image-304" style="border: 1px solid black;" title="reshare1" src="http://web.2point1.com/wp-content/uploads/2010/01/reshare1.jpg" alt="reshare1" /></a></p>
<p>Then from my <a href="http://www.facebook.com/profile.php?id=100000668227766" target="_blank">professional account</a> (which is 100% public having the loosest privacy settings) I temporarily befriended myself and naturally saw the post from the elusive Tim W in its full glory. Nothing unexpected so far. I clicked the &quot;share&quot; button and reposted this link for all my friends on this profile to see.</p>
<p>Now I needed a third account that wasn't friends with Tim W, but as a Facebook member could access the second profile in full. So I set up a Facebook account in the imaginative name of <a href="http://www.facebook.com/profile.php?ref=name&amp;id=100000641244370" target="_blank">Mit Kcoltihw</a> (Polish I imagine) and accessed the page of my public, professional profile. Lo and behold there was the reposted link, as below:</p>
<p><a href="http://web.2point1.com/wp-content/uploads/2010/01/repost2.jpg"><img class="alignnone size-full wp-image-305" style="border: 1px solid black;" title="repost2" src="http://web.2point1.com/wp-content/uploads/2010/01/repost2.jpg" alt="repost2" /></a></p>
<p>( ignore, if you can, the fact that my profile photos are the same. The repost doesn't show the original poster as it does in Twitter)</p>
<p>What we see is that the posted link, and its meta data are visible, but my status update is missing. A non-friend seeing your link even if you set &quot;Posts by me&quot; to &quot;Only friends&quot; looks rather like a breach. It seems Facebook doesn't consider this content as being &quot;by you&quot; as it came from a public source. However, if you change the link description text to your own text when posting the original link, this is also visible, and that's definitely a loophole.</p>
<p>Links are one thing, but photos are a bit more serious. I tried the same test with a wall photo post, and you'll be relieved to hear that the repost was completely invisible to third parties. Good.</p>
<p><strong>So in conclusion</strong> &#8211; not so black and white. Your privacy settings are maintained to an extent, and you don't need to worry about status updates and photos getting into the wrong hands, but there is definitely creep here. I think the  &quot;posts by me&quot; privacy setting is now misleading and needs addressing, and the reposting of custom link descriptions is highly questionable. I won't lose any sleep over this one, but I won't be getting complacent any time soon either. If you've spotted a loop hole let me know by commenting below, but double check your privacy settings first.</p>
<p>More in my next post about Facebook privacy creep.</p>
<p><strong> </strong></p>
]]></content:encoded>
			<wfw:commentRss>http://web.2point1.com/2010/01/16/facebook-repost-feature/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Why I didn&#8217;t buy &#8216;Killing in the Name&#8217;</title>
		<link>http://web.2point1.com/2009/12/21/why-i-didnt-buy-killing-in-the-name/</link>
		<comments>http://web.2point1.com/2009/12/21/why-i-didnt-buy-killing-in-the-name/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 21:13:52 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[music]]></category>
		<category><![CDATA[ratm4xmas]]></category>
		<category><![CDATA[social media protest]]></category>

		<guid isPermaLink="false">http://web.2point1.com/?p=288</guid>
		<description><![CDATA[Well I did buy it in 1992, or rather I bought the album; but in 2009 I did not buy it as part of the ratm4xmas campaign to keep Joe McElderry (read: Simon Cowell) from the UK Christmas No.1 spot. Here's why &#8230;
Firstly, the debate around this movement is a total mess. People seem confused [...]]]></description>
			<content:encoded><![CDATA[<p>Well I did buy it in 1992, or rather I bought the album; but in 2009 I did <strong>not</strong> buy it as part of the <a href="http://www.ratm4xmas.com/" target="_blank">ratm4xmas</a> campaign to keep Joe McElderry (read: Simon Cowell) from the UK Christmas No.1 spot. Here's why &#8230;</p>
<p><span id="more-288"></span>Firstly, the debate around this movement is a total mess. People seem confused about what they are supposedly protesting against.</p>
<ul>
<li><strong>It clearly isn't rejecting commercialism</strong>, or the record industry, because it involves buying a record. In fact, as the purchasers of &#8216;Killing in the Name' probably wouldn't have purchased Joe McElderry's track in the first place, this protest most likely generated more record sales than the industry would have otherwise.</li>
<li><strong>It clearly isn't rejecting crowd mentality</strong> either, because the whole notion is a collective endeavor, and arguably worse, because I doubt all the participants even like the music of RATM.</li>
</ul>
<p>The intial protagonists of the campaign never suggested it protested against any of these things. It was simply to prevent Simon Cowell's &quot;kareoke act reaching number 1&quot; as a &quot;protest to the X-factor monotony&quot;. As <a href="http://news.bbc.co.uk/newsbeat/hi/music/newsid_10000000/newsid_10003400/10003411.stm" target="_self">Simon Cowell himself pointed out</a>, it was a direct attack on him and the content he is responsible for producing. And yes, I think that content is tripe too. Cowell may well be spoon-feeding the next genertion a self-perpetuating culture of celebrity-obsessed drivel, but this protest is just worthless.</p>
<ul>
<li>The X-factor monotony doesn't bother me [most of the time], because I avoid it. I don't watch Cowell's TV programmes, I don't read trashy tabloid entertainment columns, and I don't listen to commercial radio. <em>Easy</em>.</li>
<li>If you like the music of RATM then the UK pop charts are probably not your cup of tea. People who follow the pop charts take enjoyment from it. Why ruin it for them, just because you don't like their music?</li>
<li>I have not been aware of a Christmas No.1 since I was at school. The cultural meme of the Christmas No.1 has no impact or relevance to my life, and I go to no effort to achieve this. This year has obviously ruined that.</li>
<li>Getting RATM to number 1 surely didn't mean less sales to Cowell, because they are clearly two separate groups buying the records</li>
<li>Who is supposed to take notice of this protest? It won't stop Cowell pumping out drivel and it won't stop people liking it.</li>
<li>It seems only to have served to generate a load of press, social media noise, and a bunch of extra record sales for <a href="http://www.epicrecords.com/" target="_self">Epic Records</a> who have signed other such subversive musical acts as Jessica Simpson and Shakira.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://web.2point1.com/2009/12/21/why-i-didnt-buy-killing-in-the-name/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Beating noisy Twitter apps</title>
		<link>http://web.2point1.com/2009/11/29/beating-noisy-twitter-apps/</link>
		<comments>http://web.2point1.com/2009/11/29/beating-noisy-twitter-apps/#comments</comments>
		<pubDate>Sun, 29 Nov 2009 12:25:51 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[viral]]></category>

		<guid isPermaLink="false">http://web.2point1.com/?p=269</guid>
		<description><![CDATA[I woke up this morning to the apparent viral spread of the TweetCloud app that unoriginally, but very nicely displays your most tweeted words of the year, or month, or .. you get the idea. Here's mine -&#62;
If you're impatient, you may wish to skip to the good bit.
Preamble
Now, how did this app manage such [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://web.2point1.com/wp-content/uploads/2009/11/tweetcloud.png"><img class="alignright size-full wp-image-271" title="tweetcloud" src="http://web.2point1.com/wp-content/uploads/2009/11/tweetcloud.png" alt="tweetcloud" width="234" height="188" /></a>I woke up this morning to the apparent viral spread of the TweetCloud app that unoriginally, but very nicely displays your most tweeted words of the year, or month, or .. you get the idea. Here's mine -&gt;</p>
<p><span id="more-269"></span>If you're impatient, you may wish to <a href="#goodbit">skip to the good bit</a>.</p>
<h3>Preamble</h3>
<p>Now, how did this app manage such spread when there are so many like it? <em>Possibly</em> because it tweets from your account when your results are ready. This is not uncommon and it can be a nice feature that I might recommend. With the difference that it should be a 100% opt-in feature. TweetCloud's start button says &quot;<em>make and tweet cloud</em>&quot;, so it does warn you. But people don't read &#8211; they click.</p>
<p>TweetCloud insists that you log in before you can use it. It uses OAuth for this which is good (+1 point). Doing this means it can make calls to the Twitter API within <em>your</em> hourly request limit, rather than exhaust its own. (useful if you're not whitelisted). But the real reason you must authenticate with TweetCloud is so that it can update your status. When building an app you have to seriously justify asking the user to authenticate/register etc.. As a general rule, the user should see that this action is for their benefit, not yours.</p>
<p>Good examples of this done right would be:</p>
<ul>
<li><em>TwitPic</em>, which has a genuine use for tweeting on your behalf.</li>
<li><em>Canabalt</em>, a game where you <em>want</em> to share your score for social kudos.</li>
</ul>
<p>Both of these apps make the tweet opt-in <em>each</em> time.</p>
<p><a name="goodbit"></a></p>
<h3>The good bit</h3>
<p>While TweetCloud was busy generating the cloud (which took a minute or so) I dived off to my Twitter settings and revoked the permission I had granted the app. If you don't know how to do this, it's under &quot;settings &gt; connections&quot;, or here: <a href="http://twitter.com/account/connections" target="_blank">http://twitter.com/account/connections</a></p>
<p><a href="http://web.2point1.com/wp-content/uploads/2009/11/tweetrevoke.png"><img class="alignnone size-full wp-image-273" title="tweetrevoke" src="http://web.2point1.com/wp-content/uploads/2009/11/tweetrevoke.png" alt="tweetrevoke" width="517" height="217" /></a></p>
<p>As soon as you revoke this permission the app can no longer use the access key that it has obtained. It needs this for any API call that <em>must</em> be authenticated. <em>e.g.</em> getting your public timeline of tweets does not require authentication, whereas updating your status does.</p>
<p>Interestingly the cloud generation continued to churn away. This suggests that the app was actually paging through my timeline without even using authentication. i.e. making public API calls under its own rate limit.</p>
<p>Lo and behold, upon completion there was no tweet from my account.</p>
<p>I also decided to post my cloud as a <a href="http://twitpic.com/rfxe0" target="_blank">TwitPic</a>, just to say &#8230; well, you know.  TwitPic doesn't use OAuth, which it should, but that's another post.</p>
<p>A few other things to note about &quot;connections&quot;:</p>
<ul>
<li>When you grant access to an app, it can store its access key <strong>forever</strong>. i.e. Twitter don't provide a key expiry feature like Facebook do. So you should revoke permissions from any app that you've stopped using.</li>
<li>My statistics from <a href="http://twitblock.org" target="_blank">TwitBlock</a> suggest that about 1% of people actually do this. (about 400 of 30,000 users have revoked my key)</li>
<li>Signing out of Twitter does not prevent the app using this access. An app with an access key can tweet from your account whenever it wants until you revoke</li>
<li>The read/write permission you can see is set by the app, not by you. Twitter doesn't offer granular permissions like Facebook do</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://web.2point1.com/2009/11/29/beating-noisy-twitter-apps/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>jParser and jTokenizer released</title>
		<link>http://web.2point1.com/2009/11/14/jparser-and-jtokenizer-released/</link>
		<comments>http://web.2point1.com/2009/11/14/jparser-and-jtokenizer-released/#comments</comments>
		<pubDate>Sat, 14 Nov 2009 17:24:52 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jParser]]></category>
		<category><![CDATA[parsing]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rainy day]]></category>

		<guid isPermaLink="false">http://web.2point1.com/?p=243</guid>
		<description><![CDATA[After nearly two years I've finally gotten around to releasing my PHP JavaScript parser, although documentation is still thin on the ground.

Download jParser 1.0.0 (recommended)

Download jParser devel package (Full source and build scripts)
See the library examples running at timwhitlock.info/jparser

The library has been split in two:

jTokenizer &#8211; A JavaScript tokenizer designed to mimic the PHP tokenizer.
jParser [...]]]></description>
			<content:encoded><![CDATA[<p>After nearly two years I've <em>finally</em> gotten around to releasing my PHP JavaScript parser, although documentation is still thin on the ground.</p>
<ul>
<li><strong><a href="http://web.2point1.com/wp-content/uploads/2009/11/jparser-1-0-0.tgz">Download jParser 1.0.0</a> </strong><strong>(recommended)<br />
</strong></li>
<li><a href="http://web.2point1.com/wp-content/uploads/2009/11/jparser-devel-1-0-0.tgz">Download jParser devel package</a> (Full source and build scripts)</li>
<li>See the library examples running at <a href="http://timwhitlock.info/jparser/" target="_blank">timwhitlock.info/jparser</a></li>
</ul>
<p>The library has been split in two:</p>
<ol>
<li><strong>jTokenizer</strong> &#8211; A JavaScript tokenizer designed to mimic the <a href="http://www.php.net/manual/en/book.tokenizer.php" target="_blank">PHP tokenizer</a>.</li>
<li><strong>jParser </strong>- The fully blown JavaScript syntactical parser which generates a parse tree.</li>
</ol>
<p><span id="more-243"></span>The reason for the split is that for most purposes where you think you need a parser, you in fact just need a tokenizer. The tokenizer library is about 15KB, whereas the parser is over 700KB (minified), so you can see why you might not want to include it unnecessarily.</p>
<p>The library files <code>jparser.php</code> and <code>jtokenizer.php</code> are self-contained, minified files for production use. If you wish to inspect or modify the code you will need to download the devel package. This package provides a build script which collates the libraries into their distributable files.</p>
<h3>jTokenizer</h3>
<p>Possible uses for the tokenizer include code highlighting and simple manipulation of JavaScript source code.</p>
<p>The main function you will want to use is <code>j_token_get_all</code> which behaves the same as the PHP <a href="http://www.php.net/manual/en/function.token-get-all.php" target="_blank">token_get_all</a> function with the addition of a column number as well as a line number. Additionally there is the <code>j_token_name</code> as per the PHP <a href="http://www.php.net/manual/en/function.token-name.php" target="_blank">token_name</a> function.</p>
<h3>jParser</h3>
<p>This is a full, syntactical parser. On its own it simply generates a parse tree which can be traversed and manipulated. There is no proper documentation on this yet, but take a look at the node classes in the devel package if you are serious about doing something useful with this parser.</p>
<h3>Some other notes in no particular order</h3>
<p>The full parser uses a lot of juice. I recommend giving PHP loads of memory, and be careful what you throw at it if you're going to run it on a production server.</p>
<p>A parser is not an interpreter or a JavaScript engine. If you want to develop such a thing in PHP you might be insane, but it could be done with this parser as a base.</p>
<p>The JParser parse tree is purposefully not a full tree, it collapses redundant nodes to save memory. If you want to see a full tree then take a look at the <code>JParserRaw</code> class. (devel package required)</p>
<p>Splitting the parsing process into two parts (tokenize/parse) is probably not the most efficient and probably uses more memory than it would another way. However, I figured it would be neat to mimic the PHP tokenizer functionality so that parsers could be built that take a stream of PHP tokens.</p>
]]></content:encoded>
			<wfw:commentRss>http://web.2point1.com/2009/11/14/jparser-and-jtokenizer-released/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>A B-listers first thoughts on Google Wave</title>
		<link>http://web.2point1.com/2009/10/18/a-b-listers-first-thoughts-on-google-wave/</link>
		<comments>http://web.2point1.com/2009/10/18/a-b-listers-first-thoughts-on-google-wave/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 13:55:37 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google wave]]></category>
		<category><![CDATA[realtime web]]></category>

		<guid isPermaLink="false">http://web.2point1.com/?p=222</guid>
		<description><![CDATA[- or &#8211; &#34;Confessions of a Google Wave N00b&#34;
After scrounging myself a B-list Google Wave preview, I've been playing around with it for a week or so. Rather than read more and think deeply about it, I thought I'd blurt out my half-formed opinions now. In fact, this is one of those posts I'll probably [...]]]></description>
			<content:encoded><![CDATA[<h3>- or &#8211; &quot;Confessions of a Google Wave N00b&quot;</h3>
<p><strong>After scrounging myself a B-list <a href="http://wave.google.com/help/wave/about.html" target="_blank">Google Wave preview</a>, I've been playing around with it for a week or so</strong>. Rather than read more and think deeply about it, I thought I'd blurt out my half-formed opinions now. In fact, this is one of those posts I'll probably regret in a year's time. It might look as naive as some of my <a href="http://web.2point1.com/2009/01/11/i-am-eating-a-sandwich/">early thoughts on Twitter</a> when I didn't quite get it, but that's blogging for you&#8230; so here goes.</p>
<h3><span id="more-222"></span>Comparison with existing paradigms</h3>
<p>When a new service comes along, it's normal to bring along preconceptions from services you're already comfortable with. New Twitterers tend to bring their Facebook habits, because they're pretty similar right? Well it's natural anyway; how else can you understand something so abstract? Look no further than email which is not much different from sending a letter in the post. This probably accounts for its widespread adoption by even the least technical of people.</p>
<p>The situation with Google Wave at the time of writing is that nobody really knows what they're doing. There are no hardened <em>Wavers</em> to learn from, everyone is a <a href="http://www.urbandictionary.com/define.php?term=n00b" target="_blank"><em>n00b</em></a>. So how do we use it? If I wrote this blog in a wave you could edit it, so it's a wiki? It looks more like a discussion forum, but there's an inbox, so it's more like email? One of the <acronym title="Key Selling Point">KSP</acronym>s is that the whole thing is real-time, so it's a chat room?</p>
<p>The way I described Google Wave to <a title="Public is where I work init" href="http://publicreative.com/" target="_blank">Public</a> was <em>&quot;MSN on steroids has a love child with Facebook&quot;</em>. I will undoubtedly regret this statement before long, if not already. The fact is that these preconceptions are not that useful. They may get us off to a flying start, but they constrain us to habits which may mask the format's real potential. First and foremost, it's a real-time medium, but it brings with it some associations that we may do well to shake off.</p>
<h3>Google Wave as chat client</h3>
<p>Of all the comparisons we might make, its most common adoption initially seems to be <em>chat</em> &#8211; Most of us are just using it like MSN. It's far too easy to do this because the real-time element is so compelling. However, as soon as you fall into this trap you find things that break the model. How do you know when the person is online? How do you end a conversation when it stays in your &quot;inbox&quot; forever? These may only be superficial features that need to be addressed, but maybe not &#8211; maybe we're just missing the point &#8211; it's just not a chat room and we just need to get over that.</p>
<p><strong>[ Update: 19 Oct ]</strong><br />
As of this morning I see that there is now an online status indicator.</p>
<h3>Google Wave as email</h3>
<p>We are well used to the idea of sending messages that won't get an immediate response. The etiquette of email may not be perfect, but at least it's universally understood as an asynchronous exchange. You <em>send</em> an email in the same way you send a letter &#8211; it leaves your control and your copy is literally that. Eventually you may receive a new message.</p>
<p>Google Wave has a kind of <em>inbox</em>, although this familiar term is less useful when you realise it's also an <em>outbox</em>. The process of starting a wave can appear similar to email &#8211; you add the addressee[s] and fire it off for their attention. As with email, your recipients may not be online but that's not a requirement for sending an email; you don't even need to know.</p>
<p>Perhaps the idea of basing electronic mail so closely on paper-based mail was as temporary solution that is well out of date and well overdue a successor. Google must want to fix this &#8211; Certainly Microsoft tried to <em>fix</em> email in the form of Microsoft Exchange, but that's another blog post and I don't want to get upset right now.</p>
<h3>Google Wave as living document</h3>
<p>A Wave need not be correspondence at all; it can just be a <em>document</em>. You can just publish it, whatever that means. Maybe you'll add collaborators later when you're ready. Maybe you'll make it public and tag it with keywords. So in this sense it is more like a wiki, but let's stop with the comparisons &#8211; Ultimately it's what ever you want it to be &#8211; in Google's own words:</p>
<blockquote><p><em>&quot;Google Wave is an online communication and collaboration tool that makes real-time interactions more seamless &#8212; in one place, you can communicate and collaborate using richly formatted text, photos, videos, maps, and more.&quot;</em></p></blockquote>
<h3>The real-time shift</h3>
<p>The biggest issue that underpins conversation around Google Wave is the web's apparent evolution from archive to a real-time medium. However, I think even this distinction is something we have to get over. There's a reason we no longer refer to the Internet as the &quot;<em>information super highway</em>&quot; &#8230; we know it's full of information, so we don't need to bang on about it all the time. Eventually the novelty of real-time will be as transparent as it is in the real world. Your consciousness and your memory are not mutually exclusive &#8211; you kinda need them both.</p>
<p>I think Google Wave will play a big part in continuing this blend of time and data, much like Twitter has started to do. It's no secret that Google Search is not so hot when it comes to up-to-the minute data. They have certainly made improvements in this area, but their search index is fundamentally an archive.</p>
<p>The most exciting changes Google Wave brings about probably won't be in the Wave client that we're currently mucking about with &#8211; I can't wait to see what developers start doing with <a href="http://code.google.com/apis/wave/guide.html" target="_blank">gadgets, and bots</a> and most importantly the underlying <a href="http://en.wikipedia.org/wiki/Google_Wave_Federation_Protocol" target="_blank">Wave protocol</a>, but that's another post.</p>
]]></content:encoded>
			<wfw:commentRss>http://web.2point1.com/2009/10/18/a-b-listers-first-thoughts-on-google-wave/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Is Facebook Connect a phishing scam waiting to happen?</title>
		<link>http://web.2point1.com/2009/10/14/is-facebook-connect-a-phishing-scam-waiting-to-happen/</link>
		<comments>http://web.2point1.com/2009/10/14/is-facebook-connect-a-phishing-scam-waiting-to-happen/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 23:07:06 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[phishing]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://web.2point1.com/?p=192</guid>
		<description><![CDATA[Two things happened today that inspired me to write this post tonight.

A brief back-and-forth on Twitter with @kaigani where I outlandishly claimed that Facebook Connect is a phishing scam waiting to happen
The warning of another Twitter scam that typically exploits the layman's inability to spot a fake URL.

Facebook and Twitter both offer authentication services arguably [...]]]></description>
			<content:encoded><![CDATA[<p>Two things happened today that inspired me to write this post tonight.</p>
<ol>
<li>A brief back-and-forth on Twitter with <a href="http://twitter.com/kaigani/status/4858023858" target="_blank">@kaigani</a> where I outlandishly claimed that Facebook Connect is a <a href="http://twitter.com/timwhitlock/status/4858148685" target="_blank">phishing scam waiting to happen</a></li>
<li>The warning of another <a href="http://mashable.com/2009/10/14/twitter-phishing-scam/" target="_blank">Twitter scam</a> that typically exploits the <em>layman</em>'s inability to spot a fake URL.</li>
</ol>
<p>Facebook and Twitter both offer authentication services <a href="http://en.wikipedia.org/wiki/Single_sign-on#Shared_Authentication_Schemes_which_are_not_Single_Sign-On" target="_blank">arguably</a> known as &quot;single sign-on&quot;. <a href="http://developers.facebook.com/connect.php" target="_blank">Facebook Connect</a> is a proprietary system, and Twitter offers a system based on the <a href="http://oauth.net/about" target="_blank">OAuth</a> standard. These services do something quite marvellous &#8211; They allow you to authenticate with a another website without the third party ever seeing your password. What's makes it even more handy is that you're probably already signed in to these popular services, so you may not need to enter your password at all. <strong>The problem is when you do</strong>.</p>
<p><span id="more-192"></span>If the <em>mother</em> service decides you aren't logged in, it will have to present you with a username/password prompt just as if you were entering the main site. Here's an example Facebook Connect popup:</p>
<p><img class="alignnone size-full wp-image-197" title="fbconnect_popup" src="http://web.2point1.com/wp-content/uploads/2009/10/fbconnect_popup.png" alt="fbconnect_popup" width="464" height="499" /></p>
<p>A complacent user is likely to fill in these credentials without checking whether this <em>page</em> belongs to Facebook. This is the classic <a href="http://en.wikipedia.org/wiki/Phishing" target="_blank">Phishing</a> model, and I would argue that it is made worse by the additional trust the user may place in this familiar system. Furthermore, some implementations present this dialogue in a overlay form where no address bar appears at all.</p>
<h4>There are various lines of defence available to the user at this point, and they are all in the browser.</h4>
<p><strong>1. The URL</strong><br />
Most phishing scams use <a href="http://en.wikipedia.org/wiki/Phishing#Link_manipulation" target="_blank">cleverly manipulated URLs</a> that can easily trick an untrained eye. The fact is that the address bar and the URL are (from an end-user perspective) quite technical aspects of using the Internet. These &quot;connect&quot; dialogues are prone to this problem, and to make it easier for the phishing gangs they don't have to recreate the whole home page,  just one small window. Even for Internet professionals, an accurately copied design may provide little reason to glance at the address bar.</p>
<p><strong>2. The SSL Certificate<br />
</strong>In the unlikely event that hackers have infiltrated your ISP, you still have the server certificate to ensure the site is legit. Observant readers will notice that the above image does not show a secure page. This is a failing of the vendor and of Facebook. A secure page does exist for Facebook Connect [see below] but Facebook should not offer standard HTTP at all and in this example the vendor should have used the SSL version.</p>
<p><img class="alignnone size-full wp-image-201" title="fbconnect_popup_ssl_cert" src="http://web.2point1.com/wp-content/uploads/2009/10/fbconnect_popup_ssl_cert.png" alt="fbconnect_popup_ssl_cert" width="464" height="414" /></p>
<p>Twitter also fails to restrict their authentication screen exclusively to SSL. To make matters worse their SSL screen does not contain full identity information (see below). Many Twitter apps don't use the SSL page, and in fact the application settings page for developers lists the OAuth service URLs as HTTP variants only.</p>
<p><img class="alignnone size-full wp-image-205" style="border: 1px solid black;" title="twitter_ssl_cert_crop" src="http://web.2point1.com/wp-content/uploads/2009/10/twitter_ssl_cert_crop.png" alt="twitter_ssl_cert_crop" width="427" height="298" /></p>
<h4>Is this a technology problem, or a human problem?</h4>
<p>These scams exploit ignorance and complacency &#8211; Two things that user-friendly web services like these can only perpetuate. All the cryptography magic and clever security models behind these services can't actually prevent phishing scams, and as they become more common and more trusted, perhaps they just make phishing scams easier to pull off.</p>
<p>I'm not convinced these problems can be solved by technology; at least not by technology in the websites themselves.  I think this can only be solved by something that sits between the user and the trap &#8211; For example: the web browser, your ISP, or the HTTP protocol itself.</p>
<ul>
<li>Chrome and IE8 both offer a neat address bar feature where the host name is bolder than the rest of the URL making fake URLs much easier to spot;</li>
<li>Firefox has more obvious server certificate and identity information, makes more of song and dance about invalid certificates and shows the host name in the status bar;</li>
<li>Various browsers offer warnings of known scam URLs and no doubt many ISPs aid this effort</li>
</ul>
<p>However, these features still require education and awareness. Above all, any solution requires the attention of the complacent masses who just want to get on with their life and click &quot;OK&quot; until they get what they want.</p>
]]></content:encoded>
			<wfw:commentRss>http://web.2point1.com/2009/10/14/is-facebook-connect-a-phishing-scam-waiting-to-happen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter changes break TwitBlock [again]</title>
		<link>http://web.2point1.com/2009/09/19/twitter-changes-break-twitblock-again/</link>
		<comments>http://web.2point1.com/2009/09/19/twitter-changes-break-twitblock-again/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 19:43:58 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[twitblock]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://web.2point1.com/?p=168</guid>
		<description><![CDATA[Last week a another change to Twitter caused me problems with my personal project TwitBlock. For the impatient, see my Google groups post about it. (It didn't go down very well).
If you're a Twitter user, you're probably familiar with this image:

It is/was the default profile image for users that have not uploaded a custom avatar. [...]]]></description>
			<content:encoded><![CDATA[<p>Last week a another change to Twitter caused me problems with my personal project <a href="http://twitblock.org/" target="_blank">TwitBlock</a>. For the impatient, see my <a href="http://groups.google.com/group/twitter-development-talk/browse_thread/thread/ee7839d0c82ea17a?hl=en" target="_blank">Google groups post</a> about it. (It didn't go down very well).</p>
<p>If you're a Twitter user, you're probably familiar with this image:</p>
<p><img class="alignnone size-full wp-image-169" title="default_profile_normal" src="http://web.2point1.com/wp-content/uploads/2009/09/default_profile_normal.png" alt="default_profile_normal" width="48" height="48" /></p>
<p>It is/was the default profile image for users that have not uploaded a custom avatar. You may also have noticed last week that Twitter has introduced a new version. Actually they they made seven of them in different colours:<br />
<img class="alignnone size-full wp-image-170" title="default_profile_0_normal" src="http://web.2point1.com/wp-content/uploads/2009/09/default_profile_0_normal.png" alt="default_profile_0_normal" width="48" height="48" /> <img class="alignnone size-full wp-image-171" title="default_profile_1_normal" src="http://web.2point1.com/wp-content/uploads/2009/09/default_profile_1_normal.png" alt="default_profile_1_normal" width="48" height="48" /> <img class="alignnone size-full wp-image-172" title="default_profile_2_normal" src="http://web.2point1.com/wp-content/uploads/2009/09/default_profile_2_normal.png" alt="default_profile_2_normal" width="48" height="48" /> <img class="alignnone size-full wp-image-173" title="default_profile_3_normal" src="http://web.2point1.com/wp-content/uploads/2009/09/default_profile_3_normal.png" alt="default_profile_3_normal" width="48" height="48" /> <img class="alignnone size-full wp-image-174" title="default_profile_4_normal" src="http://web.2point1.com/wp-content/uploads/2009/09/default_profile_4_normal.png" alt="default_profile_4_normal" width="48" height="48" /> <img class="alignnone size-full wp-image-175" title="default_profile_5_normal" src="http://web.2point1.com/wp-content/uploads/2009/09/default_profile_5_normal.png" alt="default_profile_5_normal" width="48" height="48" /> <img class="alignnone size-full wp-image-176" title="default_profile_6_normal" src="http://web.2point1.com/wp-content/uploads/2009/09/default_profile_6_normal.png" alt="default_profile_6_normal" width="48" height="48" /></p>
<p>At least I think they made seven; I can't find any more, but I can't find any official document stating how many are out there either.</p>
<p><span id="more-168"></span></p>
<h3>So what?</h3>
<p>So &#8230; TwitBlock crawls Twitter for <a href="http://www.twitblock.org/report_pics.php" target="_blank">duplicate profile pics</a> to help identify spam accounts. The app needs to know what images are the default ones, because otherwise it will penalize people heavily for having what <em>appears </em>to be the same image as thousands of other people.</p>
<p>This relies rather delicately on factors that are liable to change and that aren't strictly a part of the <a href="http://apiwiki.twitter.com/" target="_blank">developer API</a>, so I have to keep a close eye on things. I concede this is not a very robust solution, and I certainly wouldn't base a commercial product around such weak &quot;technology&quot;. In fact I'm not sure I'd base a commercial product around Twitter at all.</p>
<p>I get a lot of emails and DMs from people telling me that they've received errors using TwitBlock. Almost always this is due to the Twitter API failing to respond &#8211; either timing out or sending back some HTTP error. It's quite embarrassing, and I can only imagine how much worse this would be if people were paying for a Twitter-based service.</p>
<p>A Twitter app doesn't just rely on the API, it relies on everything that makes up the Twitter service. This includes its full feature set and its hardware infrastructure. I am of the opinion that the above-described profile image change was significant enough that Twitter should have documented the change in advance. Facebook do a good job of addressing the community far in advance of changes, and I think this is yet another indicator that Twitter is out of its depth.</p>
]]></content:encoded>
			<wfw:commentRss>http://web.2point1.com/2009/09/19/twitter-changes-break-twitblock-again/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Twitter bots using Tweetie?</title>
		<link>http://web.2point1.com/2009/08/29/twitter-bots-using-tweetie/</link>
		<comments>http://web.2point1.com/2009/08/29/twitter-bots-using-tweetie/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 20:44:14 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://web.2point1.com/?p=146</guid>
		<description><![CDATA[There is a kind of spambot that I call a Sleeper. It poses as a legitimate account by &#34;stealing&#34; arbitrary tweets from the public timeline and tweeting them as its own. As it follows people, a proportion will follow back. Eventually this account will have built a mature  following and can &#34;wake up&#34;. i.e. it [...]]]></description>
			<content:encoded><![CDATA[<p>There is a kind of spambot that I call a <em><strong>Sleeper</strong>. </em>It poses as a legitimate account by &quot;stealing&quot; arbitrary tweets from the public timeline and tweeting them as its own. As it follows people, a proportion will follow back. Eventually this account will have built a mature  following and can &quot;wake up&quot;. i.e. it can start tweeting its cargo and even send DMs.</p>
<p>These bots are usually easy to spot because their tweets all show as being &quot;From API&quot;, meaning that the update wasn't sent by a registered app using <a href="http://apiwiki.twitter.com/OAuth-FAQ" target="_blank">OAuth</a>. If I was a spammer, I'd be wanting to fix that because it's a dead give away. I've also seen other services such as <a href="http://hellotxt.com/" target="_blank">HelloTxt</a> being used by these bots, but just now I spotted something new. &#8211; <strong>Tweets from Tweetie</strong>.</p>
<p><span id="more-146"></span></p>
<p><a href="http://web.2point1.com/wp-content/uploads/2009/08/margy7267search.png" target="_blank"><img class="size-full wp-image-150" style="border: 0pt none; margin: 0pt 10px 0pt 0pt;" title="margy7267search" src="http://web.2point1.com/wp-content/uploads/2009/08/margy7267search.png" alt="margy7267search" width="339" height="150" /></a></p>
<p>This example (<a href="http://www.twitblock.org/~Margy7267" target="_blank">@margy6727</a>) was flagged in a <a href="http://twitblock.org/" target="_blank">TwitBlock</a> scan due to aggressive following and being largely ignored. This <a href="http://search.twitter.com/search?q=&quot;thinking+about+DRIVING+to+school&quot;" target="_blank">search result</a> shows the original tweet below, and the one above is the bot cloning the tweet and updating somehow via <a href="http://www.atebits.com/" target="_blank">Tweetie</a>.</p>
<p><span style="text-decoration: line-through;"><strong>Now how have they done this?<br />
</strong>Have they reverse engineered one of the Tweetie apps and obtained the API key and secret to use in their own bots? Have they developed something that can automate Tweetie externally? (AppleScript was suggested by <a href="http://twitter.com/pepijndevos/statuses/3630955710" target="_blank">@pepijndevo</a>). Do they have a <a href="http://www.1up.com/do/feature?cId=3141815" target="_blank">sweatshop of chinese teenagers</a> cut-and-pasting for 50 cents/hr? Perhaps there's some loophole on the Twitter end? Twitter aren't exactly <a href="http://www.davidnaylor.co.uk/massive-twitter-cross-site-scripting-vulnerability.html" target="_blank">buttoned up on the security front</a> and they clearly don't check new app registrations very rigorously.</span></p>
<p><span style="text-decoration: line-through;">Suggestions welcome.</span></p>
<p><strong>[ UPDATE ]</strong><br />
This <a href="http://apiwiki.twitter.com/FAQ#HowdoIget%E2%80%9CfromMyApp%E2%80%9DappendedtoupdatessentfrommyAPIapplication" target="_blank">Twitter FAQ</a> is misleading. I am <a href="http://twitter.com/tweetie/statuses/3631979184" target="_blank">informed by Tweetie</a> that Basic Auth apps registered &quot;pre-OAuth&quot; can indeed still pass the [now] discontinued source parameter to spoof the user-agent. I just <a href="http://twitter.com/twerminal/status/3632857520" target="_blank">tried it</a> and all you have to do to make your tweet appear to have come from Tweetie is add &quot;source=tweetie&quot; to your API call. That's a real shame.</p>
]]></content:encoded>
			<wfw:commentRss>http://web.2point1.com/2009/08/29/twitter-bots-using-tweetie/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>WPTouch</title>
		<link>http://web.2point1.com/2009/08/28/137/</link>
		<comments>http://web.2point1.com/2009/08/28/137/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 21:50:38 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://web.2point1.com/?p=137</guid>
		<description><![CDATA[I just installed the WPTouch WordPress plugin which gives iPhone and Android visitors a tailored mobile UI.
It' s great, here's a pic of the iPhone interface (courtesy of @pepijndevos)

]]></description>
			<content:encoded><![CDATA[<p>I just installed the <a href="http://www.bravenewcode.com/wptouch/" target="_blank">WPTouch WordPress plugin</a> which gives iPhone and Android visitors a tailored mobile UI.</p>
<p>It' s great, here's a pic of the iPhone interface (courtesy of <a href="http://twitpic.com/photos/pepijndevos" target="_blank">@pepijndevos</a>)</p>
<p><span id="more-137"></span></p>
<div id="attachment_140" class="wp-caption alignnone" style="width: 424px"><img class="size-full wp-image-140" title="26226005-8196aba93e4cd8e2855d88c6d52a19b8.4a9850d7-full" src="http://web.2point1.com/wp-content/uploads/2009/08/26226005-8196aba93e4cd8e2855d88c6d52a19b8.4a9850d7-full.png" alt="WPTouch iPhone screen grab " width="414" height="770" /><p class="wp-caption-text">WPTouch iPhone screen grab </p></div>
]]></content:encoded>
			<wfw:commentRss>http://web.2point1.com/2009/08/28/137/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
