<?xml version="1.0" encoding="UTF-8"?>

<rss version='2.0'
     xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule">
    <channel>
        <!-- This XML Feed shows details for the page Alex Bosworth&#039;s Weblog -->
        <creativeCommons:license>http://creativecommons.org/licenses/by-sa/2.5/
          </creativeCommons:license>
        <title>Alex Bosworth&#039;s Weblog</title>
        <description>&lt;p&gt;*this blog has been moved to a new url: see &lt;a rel=&#039;nofollow&#039; href=&quot;http://blog.alexbosworth.net&quot;&gt;http://blog.alexbosworth.net&lt;/a&gt; *&lt;/p&gt;


	&lt;p&gt;Subscribe to my blog @ &lt;a style=&#039;font-size:10pt;&#039; href=&#039;http://feeds.feedburner.com/AlexBosworth&#039;&gt;
http://feeds.feedburner.com/AlexBosworth&lt;/a&gt; &lt;a href=&quot;http://www.bloglines.com/sub/http://feeds.feedburner.com/AlexBosworth&quot; style=&#039;display:inline;&#039;&gt; &lt;img src=&quot;http://www.bloglines.com/images/sub_modern1.gif&quot; border=&quot;0&quot; alt=&quot;Subscribe with Bloglines&quot; &gt;&lt;/a&gt;. Or if you want the bliki subscription, just prepend &amp;#8216;xml&amp;#8217; to this page url.&lt;/p&gt;
</description>
                <category>weblog</category>
        <category>user:alex</category>

        <pubDate>Tue, 27 Sep 2005 00:48:39 -0700</pubDate>
        <lastBuildDate>Mon, 06 Aug 2007 16:02:27 -0700</lastBuildDate>
            
        <item>
            <title>I&#039;m Leaving SourceLabs</title>
            <link>http://swik.net/User:alex/Alex+Bosworth%27s+Weblog/I%27m+Leaving+SourceLabs/8t55</link>
            <description>&lt;p&gt;Just a heads up to readers of my blog.&lt;/p&gt;


	&lt;p&gt;You may know that &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/SourceLabs&quot;&gt;SourceLabs&lt;/a&gt; hase employed me for the past two and a half or so years. But today is my last day at SourceLabs: my plans are to travel, take some time to think and adventure, and I plan on continuing to work on little projects and prototypes &amp;#8211; that&amp;#8217;s just what I like to do.&lt;/p&gt;


	&lt;p&gt;It&amp;#8217;s been a crazy time here at SourceLabs, in most ways I couldn&amp;#8217;t imagine a better job: design and build a website and then run and grow it. &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/SWiK&quot;&gt;SWiK&lt;/a&gt; has grown from a small prototype I wrote 2 years ago to something that is serving 125+ pages on open source every minute to about a million unique visitors a month.&lt;/p&gt;


	&lt;p&gt;When SourceLabs started it was an idea with no name, and I started talking to Byron (SourceLabs &lt;span class=&quot;caps&quot;&gt;CEO&lt;/span&gt;) about his ideas for a public community oriented website about open source software. After a while SourceLabs picked up a name, an office, we stopped meeting in coffee shops and out of our houses and got an office in Seattle. SourceLabs has come a long way since then, and I recommend highly the startup experience.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m going to try posting more often on my blog, however if you want to keep receiving new posts you might want to double check which url you are subscribed to and make sure it&amp;#8217;s &lt;a href=&quot;http://feeds.feedburner.com/AlexBosworth&quot;&gt;http://feeds.feedburner.com/AlexBosworth&lt;/a&gt; &amp;#8211; I&amp;#8217;m probably going to switch over to the domain I snapped up recently: &lt;a href=&quot;http://alexbosworth.net&quot;&gt;alexbosworth.net&lt;/a&gt; (nothing there atm). I need to figure out blog engine stuff before I post over there, but if you subscribe to the feedburner feed you won&amp;#8217;t even notice.&lt;/p&gt;


	&lt;p&gt;Anyways stay tuned I will probably continue to churn out little projects and such you may be interested in, or points on development, tech, and other fun stuff.&lt;/p&gt;
</description>
            
            <pubDate>Tue, 29 May 2007 13:35:55 -0700</pubDate>
        </item>
            
        <item>
            <title>Digg CommentSpy</title>
            <link>http://swik.net/User:alex/Alex+Bosworth%27s+Weblog/Digg+CommentSpy/5dm7</link>
            <description>&lt;p&gt;Over the weekend I made another script based on the Digg &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;: &lt;a href=&quot;http://sandbox.sourcelabs.com/commentspy/&quot;&gt;Digg CommentSpy&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;This one tracks live comments posted to &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Digg&quot;&gt;Digg&lt;/a&gt;, ala &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/LiveMarks&quot;&gt;LiveMarks&lt;/a&gt;. Blue posts are replies to the top thread, yellow are replies to another comment.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m now a huge fan of &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/JSON&quot;&gt;&lt;span class=&quot;caps&quot;&gt;JSON&lt;/span&gt;&lt;/a&gt; feed based APIs. These scripts have 0 server code, all the work is done in Javascript. This means that scaling the mashup is all on the remote service, not on my puny server.&lt;/p&gt;


	&lt;p&gt;If you&amp;#8217;re using my Digg javascript function, commentspy uses a slightly revised version that allows for &amp;#8216;min timestamp&amp;#8217; &amp;#8211; I use this so that I don&amp;#8217;t ask for already seen comments.&lt;/p&gt;
</description>
            
            <pubDate>Mon, 30 Apr 2007 09:51:05 -0700</pubDate>
        </item>
            
        <item>
            <title>You Need Friends on Digg</title>
            <link>http://swik.net/User:alex/Alex+Bosworth%27s+Weblog/You+Need+Friends+on+Digg/4y52</link>
            <description>&lt;p&gt;I&amp;#8217;ve written another of my little javascript web apps, this time based on Digg&amp;#8217;s new &lt;a href=&quot;http://apidoc.digg.com/&quot;&gt;expansive &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;The &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; is very well designed and I&amp;#8217;ve only found a couple problems with it: the license is very restrictive and getting back some info requires many multiple calls to digg, but I guess it points to the problems with web apis as just being poor proxies for direct database calls.&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://sandbox.sourcelabs.com/tinc/&quot;&gt;The Digg application is a friends browser.&lt;/a&gt; &amp;#8211; It basically asks the question: &amp;#8220;Who&amp;#8217;s digging you&amp;#8221;.&lt;/p&gt;


	&lt;p&gt;I wrote this script because i&amp;#8217;ve noticed that the front page of Digg is guarded by social networks of people who digg each other&amp;#8217;s stories. If you want to get your story noticed, you want to have digg friends.&lt;/p&gt;


	&lt;p&gt;Enter any top digger name, you will see a high ratio of repeat diggers &amp;#8211; the same is true of &lt;a href=&quot;http://sandbox.sourcelabs.com/tinc/alex.bosworth&quot;&gt;my submissions as well&lt;/a&gt; (Thanks Pawfoots!).&lt;/p&gt;


	&lt;p&gt;As I wrote it, I was interested really in just browsing around the networks, so I thought that was fun enough for an app. It&amp;#8217;s kind of like an earlier script I wrote: &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/delimages&quot;&gt;delimages&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Anyways my app started with a single function basically that gives you back a digg response object with what you want. If you write a Digg script, you can use my little Digg function:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
var Digg = 
{
    apikey : &#039;http://sandbox.sourcelabs.com/&#039;
};

Digg.request = function (path, count, cbkName, offset)
{
    var url = &#039;http://services.digg.com/&#039; + path;

    if (!offset) offset = 0; 

    var params = $H(
    {
        &#039;count&#039;    :  count, 
        &#039;type&#039;     : &#039;javascript&#039;, 
        &#039;appkey&#039;   :  Digg.apikey, 
        &#039;callback&#039; :  cbkName,
        &#039;offset&#039;   :  offset
    });

    url += &#039;?&#039; + params.toQueryString();

    var head = document.getElementsByTagName(&#039;head&#039;)[0];
    var request = document.createElement(&#039;script&#039;);
        request.type = &#039;text/javascript&#039;;
        request.src = url;

    head.appendChild(request);
}
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;All of these &lt;span class=&quot;caps&quot;&gt;JSON&lt;/span&gt; Apis are really hurting my Javascript &lt;span class=&quot;caps&quot;&gt;OOP&lt;/span&gt; sensibilities. XMLHttpRequest is cool with you making an anonymous function on the fly as the callback, but with &lt;span class=&quot;caps&quot;&gt;JSON&lt;/span&gt; the best approach probably is having a callback name passed in the object return, which isn&amp;#8217;t the cleanest.&lt;/p&gt;


	&lt;p&gt;I tried to make do &lt;a href=&quot;http://sandbox.sourcelabs.com/superfriends/main.js&quot;&gt;in my script&lt;/a&gt; as best I could though.&lt;/p&gt;
</description>
            
            <pubDate>Thu, 26 Apr 2007 18:21:35 -0700</pubDate>
        </item>
            
        <item>
            <title>Clay Shirky: Warcraft pwns Second Life</title>
            <link>http://swik.net/User:alex/Alex+Bosworth%27s+Weblog/Clay+Shirky%3A+Warcraft+pwns+Second+Life/vwoh</link>
            <description>&lt;p&gt;I read a lot of Clay Shirky&amp;#8217;s stuff and he has some great thoughts. In &lt;a href=&quot;http://many.corante.com/archives/2007/01/29/second_life_games_and_virtual_worlds.php&quot;&gt;his newest essay&lt;/a&gt; he puts forward the premise: &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Second-Life&quot;&gt;Second Life&lt;/a&gt; Sucks, &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/World-of-Warcraft&quot;&gt;World of Warcraft&lt;/a&gt; Rules.&lt;/p&gt;


	&lt;p&gt;He puts it a little better than that though:&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;Games have at least three advantages other virtual worlds don’t. First, many games, and most social games, involve an entrance into what theorists call the magic circle, an environment whose characteristics include simplified and knowable rules. The magic circle saves the game from having to live up to expectations carried over from the real world.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;blockquote&gt;
		&lt;p&gt;Second, games are intentionally difficult. If all you knew about golf was that you had to get this ball in that hole, your first thought would be to hop in your cart and drive it over there. But no, you have to knock the ball in, with special sticks. This is just about the stupidest possible way to complete the task, and also the only thing that makes golf interesting. Games create an environment conducive to the acceptance of artificial difficulties.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;I&amp;#8217;m not sure what he means by a magic circle, but as I put in my previous post on Warcraft and Second Life: Warcraft is very controlled but also very entertaining.&lt;/p&gt;


	&lt;p&gt;Valleywag and the social software cognoscenti on &lt;a href=&quot;http://many.corante.com/&quot;&gt;Many 2 Many&lt;/a&gt; apparently have it in for  Second Life, probably in response to the gushing and false press reports about Second Life&amp;#8217;s successes.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m not very interested in Second Life, but I do think that Warcraft is escaping a lot of criticism in these posts. Sure Warcraft is popular, and lots of people like it, but is it good? &lt;a href=&quot;http://www.ericrice.com/blog/?p=321&quot;&gt;Eric Rice&lt;/a&gt; raises this point by pointing at MySpace: it&amp;#8217;s a social software success, but there&amp;#8217;s a lot to hate about it.&lt;/p&gt;


	&lt;p&gt;My main criticism of Warcraft is pretty obvious: it&amp;#8217;s a big time waste. Ultimately wasting time is not the best experience. It&amp;#8217;s entertaining, but it&amp;#8217;s basically like TV: you sit there for a while and it&amp;#8217;s not so much a hobby as something to keep you occupied.&lt;/p&gt;


	&lt;p&gt;As &lt;a href=&quot;http://swik.net/User:alex/Alex+Bosworth&#039;s+Weblog/Social+Software:+Second+Life+or+World+of+Warcraft%3F/rp22&quot;&gt;I posted earlier&lt;/a&gt;,  
Warcraft is a controlled experience with carefully planned areas, kind of like a theme park or Disneyland whereas Second Life is an uncontrolled anarchy. But why can&amp;#8217;t we have a mix of both?&lt;/p&gt;


	&lt;p&gt;Take Lego for example, it&amp;#8217;s a toy I played with a lot as a kid. With Lego, you get a box full of bricks and it&amp;#8217;s a fun experience just to follow the instructions and put them together like they are on the box. But Lego&amp;#8217;s genius is that you don&amp;#8217;t always do that. A lot of times you just build stuff with Lego, to make your own designs.&lt;/p&gt;


	&lt;p&gt;We need more game design like that: not to the pointless extreme of Second Life, but a game wherein you can play the game by itself and have fun, or invent diversions from the game to be creative and just build stuff.&lt;/p&gt;
</description>
            
            <pubDate>Tue, 30 Jan 2007 13:20:26 -0800</pubDate>
        </item>
            
        <item>
            <title>What are Machine Tags?</title>
            <link>http://swik.net/User:alex/Alex+Bosworth%27s+Weblog/What+are+Machine+Tags%3F/u8s4</link>
            <description>&lt;p&gt;straup from &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Flickr&quot;&gt;Flickr&lt;/a&gt; recently &lt;a href=&quot;http://www.flickr.com/groups/api/discuss/72157594497877875/&quot;&gt;posted about a new tagging feature&lt;/a&gt; in Flickr called &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Machine-Tags&quot;&gt;Machine Tags&lt;/a&gt;:&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;We are rolling out a new feature called &amp;#8220;machine tags&amp;#8221; that allows users to be more precise in how they tag, and how they search, their photos.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;blockquote&gt;
		&lt;p&gt;- When a user tags an event with an upcoming ID (for example :
&amp;#8220;upcoming:event=81334&amp;#8221;) we display a link back to the upcoming.org
site.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;We&amp;#8217;ve thought about this idea in &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/SWiK&quot;&gt;SWiK&lt;/a&gt;, and I&amp;#8217;ve seen something similar on another &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Yahoo&quot;&gt;Yahoo&lt;/a&gt; property: &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/del.icio.us&quot;&gt;del.icio.us&lt;/a&gt; with &lt;a href=&quot;http://del.icio.us/tag/system:filetype:jpg&quot;&gt;system:filetype:jpg&lt;/a&gt; tags that I use to power &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/delimages&quot;&gt;delimages&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;I wonder if it would be too crazy to formalize machine tagging and give it domain namespaces?&lt;/p&gt;


	&lt;p&gt;For example, if you tag a bookmark on del.icio.us &amp;#8220;upcoming.org:event=foocamp&amp;#8221;, del.icio.us could run off to upcoming.org and grab some info about foocamp.&lt;/p&gt;


	&lt;p&gt;Another advantage to machine tags is giving you search access and combination opportunities to locked up system metadata. &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/GMail&quot;&gt;GMail&lt;/a&gt; has a good example of this: if you want to find emails from Alex in gmail, you can search using &amp;#8220;From:alex&amp;#8221;. There&amp;#8217;s a laundry list of these &lt;a href=&quot;http://mail.google.com/support/bin/answer.py?answer=7190&quot;&gt;Machine Tags&lt;/a&gt; on gmail.&lt;/p&gt;


	&lt;p&gt;Google of course has the luxury of making every word in your gmail a tag that describes it, but they also add these system tags to add power above that.&lt;/p&gt;


	&lt;p&gt;Adding domain specific tags could help in gmail too. Making a label in gmail called &amp;#8220;upcoming.org:event=foocamp&amp;#8221;, tagging emails with that label, and then having Google Calendar remind me on the date of Foocamp all the emails I tagged as related to the event.&lt;/p&gt;
</description>
            
            <pubDate>Wed, 24 Jan 2007 15:51:26 -0800</pubDate>
        </item>
            
        <item>
            <title>Social Software: Second Life or World of Warcraft?</title>
            <link>http://swik.net/User:alex/Alex+Bosworth%27s+Weblog/Social+Software%3A+Second+Life+or+World+of+Warcraft%3F/rp22</link>
            <description>&lt;p&gt;There are an unprecedented number of new online ventures seeking to create user based software, but among these hundreds of offerings there is a split in the core design: Should users run the show?&lt;/p&gt;


	&lt;p&gt;The design of &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Second-Life&quot;&gt;Second Life&lt;/a&gt; highlights this model. The creators of Second Life, Linden Labs, seek to be nothing more than platform developers who rent servers to people who want to play on their platform. This means that all content in the second life world is created by users, in a largely unregulated way. Because there is no rules or purpose to using Second Life, Second Life has become a chaotic and risqué collection of people interacting in what is essentially a giant avatar based chat room.&lt;/p&gt;


	&lt;p&gt;The other side of this model is &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/wow&quot;&gt;World of Warcraft&lt;/a&gt;. In WoW, everything in the world is created by Blizzard developers and artists. The experience is scripted and polished, to a perfection that has been the signature of Blizzard products since the first Warcraft was released in 1994. These is not an ounce of content in WoW that wasn&amp;#8217;t created by Blizzard, user interface mods aside. Because Warcraft sticks so closely to focusing on a great game experience, Warcraft is an experience much like Disneyland &amp;#8211; thoughtfully crafted rides, fun for the whole family, carefully tended and managed to help avoid the chaos people usually bring along with them.&lt;/p&gt;


	&lt;p&gt;Other services pretty much fall into one of these two models.&lt;/p&gt;


	&lt;table&gt;
		&lt;tr&gt;
			Control
			Chaos
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;World of Warcraft&lt;/td&gt;
			&lt;td&gt;Second Life&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Amazon&lt;/td&gt;
			&lt;td&gt;eBay&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;eBay&lt;/td&gt;
			&lt;td&gt;craigslist&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Google Video&lt;/td&gt;
			&lt;td&gt;YouTube&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Facebook&lt;/td&gt;
			&lt;td&gt;MySpace&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Digg&lt;/td&gt;
			&lt;td&gt;del.icio.us&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/table&gt;




	&lt;p&gt;This model might suggest that the two models are different segments, but looking closely at the development of all of these successful sites suggests reverse entropy: embracing chaos is not a sustainable way to run a site: the future model for mature social software seems to be Disneyland / World of Warcraft.&lt;/p&gt;


	&lt;p&gt;As usual, Clay Shirky wrote a great paper on this and way before I even thought about it, in &lt;a href=&quot;http://shirky.com/writings/group_enemy.html&quot;&gt;A Group Is Its Own Worst Enemy&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;The problem is that in unmanaged communities, there&amp;#8217;s a power vacuum and eventually someone ends up directing it, typically either spammers or high schoolers with the time and inclination to take over, it&amp;#8217;s often a combination of the two. Clay is not &lt;a href=&quot;http://en.wikipedia.org/wiki/Leviathan_%28book%29&quot;&gt;the first person&lt;/a&gt; to write about this issue.&lt;/p&gt;


	&lt;p&gt;For a while chaos works quite well. &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Digg&quot;&gt;Digg&lt;/a&gt; has rode the wave of &amp;#8220;user controlled&amp;#8221; to the top, all the while introducing algorithmic limits to individual power as well as managing things editorially for quality control. Today&amp;#8217;s Digg, with &lt;a href=&quot;http://news.com.com/Digg+continues+to+battle+phony+stories/2100-1025_3-6144652.html&quot;&gt;bans on top users&lt;/a&gt; to moderate the community as well as algorithmic limitations on vote efficacy is very different from the early Digg versions with a simple set number of votes required to promote a story and a small but loyal following that kept things in line.&lt;/p&gt;


	&lt;p&gt;&lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/del.icio.us&quot;&gt;del.icio.us&lt;/a&gt; manages their chaos as well through putting limits on user interactivity. Joshua Schachter has been quoted on many occasions that he does not want to build a community, but rather a social tool &amp;#8211; because of the management problems community brings.&lt;/p&gt;


	&lt;p&gt;A good example of the promise of chaos and the problems it brings can be seen in a recent patch to World of Warcraft the other day. Although Warcraft is mostly static with a window dressing war that doesn&amp;#8217;t change, for holidays and other occasions Blizzard will introduce a seasonal patch with goodies for the time of year.&lt;/p&gt;


	&lt;p&gt;For Christmas (Winterveil) this year Blizzard introduced reindeer, fruitcake, Father &amp;#8220;Winterveil&amp;#8221;, and throwable snowballs. Snowball fights abounded. But there was a problem. Players hit with snowballs move back. In Warcraft, only members of the opposing side are supposed to be able to attack each other, but suddenly there was a new game called &amp;#8220;snowball your team mates off of the cliff&amp;#8221;. Pretty soon the forums exploded with people complaining about their fun being ruined by mean kids with snowballs. Quickly, Blizzard issued a hotfix to end the snowball fights: no more snowball fights with your friends.&lt;/p&gt;


	&lt;p&gt;This small change highlights the process that all of these social sites go through. Whether it&amp;#8217;s Google YouTube turning to &lt;a href=&quot;http://newteevee.com/2006/12/11/youtube-cbs-censoring-comments/&quot;&gt;censoring comments&lt;/a&gt; or it&amp;#8217;s del.icio.us blocking my &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/priv.at&quot;&gt;private bookmarking service&lt;/a&gt;, control over the community is taken away from the users and put in the hands of the host.&lt;/p&gt;


	&lt;p&gt;This is not the wrong decision. The impulse is to say Warcraft should have let the snowball fights go on. But World of Warcraft is a great game, a fun game and safe for kids to play, and it&amp;#8217;s because of a thousand decisions like this: it&amp;#8217;s a constant battle to keep it that way. Disneyland might not be a very interesting place, but I liked it when I was a kid and they have to cope with an enormous scale of visitors, offering a consistent and satisfying experience to each paying customer. The alternative is Second Life, with 1/3 of its player economy devoted to pornography, and an explosive &lt;a href=&quot;http://news.com.com/2100-1043_3-6135699.html&quot;&gt;item cloning&lt;/a&gt; issue, it&amp;#8217;s not something I&amp;#8217;d buy someone for Christmas.&lt;/p&gt;


	&lt;p&gt;There&amp;#8217;s a lot to be said for a controlled experience. In &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/SWiK&quot;&gt;SWiK&lt;/a&gt; we see spam every single day. People are trying to take control over our pages, abusing our open system. The temptation will always be to close it, to require registration to edit, to put up captchas and email verification and other lockouts. And it&amp;#8217;s not a bad impulse. The bad impulse is to stop innovating in the face of chaos. I&amp;#8217;m glad Blizzard tried the snowballs, and I&amp;#8217;m glad they took them out quickly. The key is the focus on the experience. For experiments and new services, chaos works well and is a lot more interesting, but as things mature people want something that just works rather than something that has promise and flexibility.&lt;/p&gt;
</description>
            
            <pubDate>Tue, 19 Dec 2006 19:05:27 -0800</pubDate>
        </item>
            
        <item>
            <title>Session Security</title>
            <link>http://swik.net/User:alex/Alex+Bosworth%27s+Weblog/Session+Security/q5tn</link>
            <description>&lt;p&gt;&lt;a href=&quot;http://brianellin.com/blog/&quot;&gt;Brian Ellin&lt;/a&gt; wrote an interesting blog post about session security today, but for some reason it&amp;#8217;s gone,  so I&amp;#8217;m going to similarly post on session security.&lt;/p&gt;


	&lt;p&gt;It&amp;#8217;s a tendency of most web developers nowadays who are building interactive websites to put a global login that triggers a long running session cookie, so users don&amp;#8217;t need to constantly verify their password to do things associated with their accounts.&lt;/p&gt;


	&lt;p&gt;This however can be a big time security issue.&lt;/p&gt;


	&lt;p&gt;Why? A session cookie is something that is sent in &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/HTTP&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;&lt;/a&gt; headers, and the &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; request can come from anywhere and your browser will happily send along the session cookies too.&lt;/p&gt;


	&lt;p&gt;Ok enough of this talk. Want to see an actual factual exploit?&lt;/p&gt;


	&lt;p&gt;Go to &lt;a href=&quot;http://sandbox.sourcelabs.com/wikiality/session_security&quot;&gt;this page&lt;/a&gt; &amp;#8211; if you have logged in to Netflix recently, the movie &amp;#8220;Hackers&amp;#8221; will be added to the end of your Netflix queue.&lt;/p&gt;


	&lt;p&gt;How was this done? Not by a cookie monster virus I assure you.&lt;/p&gt;


	&lt;p&gt;It&amp;#8217;s only 1 line of &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/HTML&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;&lt;/a&gt;.&lt;br&gt;
&lt;code&gt;&amp;lt;iframe src=&#039;http://www.netflix.com/AddToQueue?movieid=567905&#039; style=&#039;display:none;&#039;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;This is an example of &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; method misuse, it&amp;#8217;s 1 line because Netflix doesn&amp;#8217;t pay attention to the &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; standard of not making stateful changes through &lt;span class=&quot;caps&quot;&gt;GET&lt;/span&gt; requests.&lt;/p&gt;


	&lt;p&gt;But even if they had used a &lt;span class=&quot;caps&quot;&gt;POST&lt;/span&gt; instead of a &lt;span class=&quot;caps&quot;&gt;GET&lt;/span&gt; to add a blog to your homepage, session security would still apply. Through Javascript triggering of forms, it&amp;#8217;s also easy to create a form like &lt;code&gt;&amp;lt;form action=&#039;http://netflix.com&#039;&amp;gt;&lt;/code&gt;, make it hidden and then trigger the submit() method on the form with the target an invisible iframe.&lt;/p&gt;


	&lt;h2&gt;How to avoid this?&lt;/h2&gt;


	&lt;p&gt;Include in submission forms a random hidden value that is checked against the session variable. Browser security does include measures to avoid snooping on the contents of remote iframes, or javascript interference with the contents of said frames.&lt;/p&gt;


	&lt;p&gt;&lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/del.icio.us&quot;&gt;del.icio.us&lt;/a&gt; uses this method &amp;#8211; on the post pages, a random number is generated and appended to the post. Initially I thought that Google Homepage was vulnerable to this attack, but they use a similar type of defense &amp;#8211; setting a random variable on the server and checking for it on the client before taking action.&lt;/p&gt;


	&lt;h2&gt;Issues with Ajax&lt;/h2&gt;


	&lt;p&gt;With Ajax requests and stateless web frameworks like &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/PHP&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;&lt;/a&gt;, session security checking can be complicated by race conditions.&lt;/p&gt;


	&lt;p&gt;Imagine if your Ajax requests were required to be scoped by a random session variable. To be safe, like del.icio.us does, you randomized the variable every page load.&lt;/p&gt;


	&lt;p&gt;But now you&amp;#8217;ve rewritten your web todo list application to use Ajax. What used to be a simple application flow of adding a new task, reloading the page and editing some more, is now a more complicated one: tasks can be edited and added from various endpoints, and simultaneously.&lt;/p&gt;


	&lt;p&gt;If you&amp;#8217;ve kept your application&amp;#8217;s logic for session security the same, you might check on each todo list edit for the random session variable, and then send back the new variable in the Ajax response, updating the token on the client side when it receives the response.&lt;/p&gt;


	&lt;p&gt;But what if the user edits two entries in their todo list before before the first one has had a chance to return a response from the server? Well what happens is that your server receives the second todo list request, sees that its token is not matching, and discards it &amp;#8211; an error.&lt;/p&gt;


	&lt;p&gt;This case would result in obvious errors, but there are a thousand ways it can be less obvious, so be careful.&lt;/p&gt;


	&lt;p&gt;A good resource for reading more about problems with asynchronous requests and sessions can be found in &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/User:marc&quot;&gt;Marc&lt;/a&gt;&amp;#8217;s article on &lt;a href=&quot;http://www.chipmunkninja.com/article/asyncsessions&quot;&gt;Trouble with Ajax and Sessions&lt;/a&gt;&lt;/p&gt;
</description>
            
            <pubDate>Mon, 11 Dec 2006 18:50:27 -0800</pubDate>
        </item>
            
        <item>
            <title>Del.icio.us Tools</title>
            <link>http://swik.net/User:alex/Alex+Bosworth%27s+Weblog/Del.icio.us+Tools/qlp1</link>
            <description>&lt;p&gt;Even though I&amp;#8217;ve moved off of &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/del.icio.us&quot;&gt;del.icio.us&lt;/a&gt; and onto my encrypted web bookmarks manager &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/boz&quot;&gt;boz&lt;/a&gt;, I still have hundreds of bookmarks saved on del.icio.us, and I use the site for other things like a handful of projects that use the site&amp;#8217;s api to do some interesting stuff.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m adding a new one to the list today, and updating an old one to start &lt;a href=&quot;http://sandbox.sourcelabs.com/delicious-tools/&quot;&gt;Delicious Tools&lt;/a&gt;.&lt;/p&gt;


&lt;a href=&quot;http://sandbox.sourcelabs.com/delicious-tools/&quot;&gt;Delicious Tools&lt;/a&gt; includes:
	&lt;ul&gt;
	&lt;li&gt;A dead link checker &amp;#8211; lots of your urls are out of date or broken: check that your bookmarks are still valid.&lt;/li&gt;
		&lt;li&gt;&lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Google&quot;&gt;Google&lt;/a&gt; sync &amp;#8211; synchronize del.icio.us with your Google search results.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;&lt;img src=&quot;http://static.flickr.com/116/298315238_42e97db747_o.png&quot; alt/&gt;&lt;/p&gt;


	&lt;p&gt;(thx &lt;a href=&quot;http://www.flickr.com/photos/fsse-info/298315238/&quot;&gt;osde-info&lt;/a&gt; for the screenshot and braving &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Flickr&quot;&gt;Flickr&lt;/a&gt;&amp;#8217;s policies against them)&lt;/p&gt;


Other del.icio.us projects:
	&lt;ul&gt;
	&lt;li&gt;&lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/LiveMarks&quot;&gt;LiveMarks&lt;/a&gt; &amp;#8211; streams social bookmarks from various services and does some frequency analysis as well to highlight new and interesting stuff.&lt;/li&gt;
		&lt;li&gt;&lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Delimages&quot;&gt;Delimages&lt;/a&gt; &amp;#8211; hotlinks images from del.icio.us image streams.&lt;/li&gt;
	&lt;/ul&gt;


&lt;hr&gt;

	&lt;h2&gt;Notes&lt;/h2&gt;


	&lt;h3&gt;Fixing my database&lt;/h3&gt;


	&lt;p&gt;Over my Thanksgiving vacation I stopped checking on my projects for a week or so and that&amp;#8217;s when everything decided to go to hell. The MySQL database dedicated to the del.icio.us projects ran out of space, and when I tried to fix it I wiped it :/ I&amp;#8217;m pretty lax with these projects and I don&amp;#8217;t do sensible things like use a &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/VCS&quot;&gt;&lt;span class=&quot;caps&quot;&gt;VCS&lt;/span&gt;&lt;/a&gt; or make comprehensive backups, so it took a bit of work just to get things back to normal. There was also some code rewriting required, and I revisited a lot of queries in various services to bring them back online, such as in &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/LiveMarks&quot;&gt;LiveMarks&lt;/a&gt; which now has a different popularity query and for &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/delimages&quot;&gt;delimages&lt;/a&gt; which now has a simpler tag query. Things should be back to normal though, so if you use any of these services, send me mail if you don&amp;#8217;t like the changes or something is broken.&lt;/p&gt;


	&lt;h3&gt;Making the dead link checker&lt;/h3&gt;


	&lt;p&gt;The dead link checker turned out to be a little bit annoying, given that a lot of servers don&amp;#8217;t respond properly to &lt;span class=&quot;caps&quot;&gt;HTTP HEAD&lt;/span&gt; requests.&lt;/p&gt;


	&lt;p&gt;The checker works by making a bunch of &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/prototype&quot;&gt;prototype&lt;/a&gt;-driven Ajax calls to a little &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/JSON&quot;&gt;&lt;span class=&quot;caps&quot;&gt;JSON&lt;/span&gt;&lt;/a&gt; outputting &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/PHP&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;&lt;/a&gt; script that makes a socket connection to the server to do a &lt;span class=&quot;caps&quot;&gt;HEAD&lt;/span&gt; request for the &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt;.&lt;/p&gt;


This was fairly straightforward, however there were some tricky bits in that there are a range of weird responses to &lt;span class=&quot;caps&quot;&gt;HEAD&lt;/span&gt; requests:
	&lt;ul&gt;
	&lt;li&gt;Server just hangs on Connection: close&lt;/li&gt;
		&lt;li&gt;Server decides to put the entire page &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; in the &lt;span class=&quot;caps&quot;&gt;HEAD&lt;/span&gt; response (i&amp;#8217;m looking at you &lt;span class=&quot;caps&quot;&gt;IIS 6&lt;/span&gt;.0)&lt;/li&gt;
		&lt;li&gt;Server always returns a wrong response code for the page (&lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Wikipedia&quot;&gt;Wikipedia&lt;/a&gt; and &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Google-Video&quot;&gt;Google Video&lt;/a&gt;)&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;I didn&amp;#8217;t do that much about special-casing completely wrong codes, so you&amp;#8217;ll have to verify some yourself.&lt;/p&gt;


	&lt;h3&gt;Updates to &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Kibbutz&quot;&gt;Kibbutz&lt;/a&gt;&lt;/h3&gt;


	&lt;p&gt;I already had a Google sync project called &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Kibbutz&quot;&gt;Kibbutz&lt;/a&gt; which drives the &lt;span class=&quot;caps&quot;&gt;XML&lt;/span&gt; translation of del.icio.us bookmarks to Google Co-op search results.&lt;/p&gt;


	&lt;p&gt;One thing you might have noticed however if you used it &amp;#8211; it didn&amp;#8217;t index all of your posts. Del.icio.us has a purposely limited &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; that requires login credentials to access your full list of public bookmarks, and I didn&amp;#8217;t feel like writing an importer. Well I finally wrote one, and now you should be able to get all of your bookmarks indexed.&lt;/p&gt;


	&lt;p&gt;Now that I&amp;#8217;ve written the importer script, it should be straightforward to write some more tools for working with your bookmarks &amp;#8211; these will go under delicious-tools, watch that space.&lt;/p&gt;
</description>
            
            <pubDate>Mon, 04 Dec 2006 18:11:21 -0800</pubDate>
        </item>
            
        <item>
            <title>Google: In your business, taking your money.</title>
            <link>http://swik.net/User:alex/Alex+Bosworth%27s+Weblog/Google%3A+In+your+business%2C+taking+your+money./o9hk</link>
            <description>&lt;p&gt;Jacob Nielsen&amp;#8217;s Alertbox published &lt;a href=&quot;http://www.useit.com/alertbox/search_engines.html&quot;&gt;an article&lt;/a&gt; at the beginning of this year in which he put forth an argument that said:&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;Search engines extract too much of the Web&amp;#8217;s value, leaving too little for the websites that actually create the content. Liberation from search dependency is a strategic imperative for both websites and software vendors.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;This provocative thesis is backed by a compelling analysis of &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Google&quot;&gt;Google&lt;/a&gt;&amp;#8217;s business model.&lt;/p&gt;


	&lt;p&gt;Basically, if you are a company that produces widgets at $5 a hogshead, it&amp;#8217;s worth it to you to pay $4.99 in commissions to Google for each sale they deliver. And because you are in competition for who gets the advertising with other companies that produce widgets &amp;#8211; if you pay less than $4.99, you won&amp;#8217;t get an ad at all.&lt;/p&gt;


	&lt;p&gt;Google thus profits from a situation where online business turn over all their profits to the gatekeeper of the web &amp;#8211; so that they can make the penny of profit over their competitors.&lt;/p&gt;


	&lt;p&gt;This is an interesting argument. Basically he advises you to develop more cost effective channels of marketing, where you can the same amount of click through activity for a lower cost. Despite this being easier said than done, this is good advice.&lt;/p&gt;


	&lt;p&gt;But what about the impact on the consumer. &amp;#8220;When companies compete, you win&amp;#8221; is the mantra of the capitalist. The idea being that competition drives prices down and quality up.&lt;/p&gt;


	&lt;p&gt;Unfortunately, this idea doesn&amp;#8217;t work very well with Google&amp;#8217;s marketplace. The reason is: Google has no pricing or quality information in their ads. If you search for widgets: you don&amp;#8217;t know that although the top result charges $9 for crappy widgets, the bottom result charges $3 for great widgets and good service.&lt;/p&gt;


	&lt;p&gt;Let&amp;#8217;s back up a minute to you and your widget company. You are happily producing widgets at $5 a hogshead, your competitors realize this and pay $4.99 to wipe you off the map, so you pay $4.99 to stay in the running.&lt;/p&gt;


	&lt;p&gt;Here&amp;#8217;s where it gets bad for the consumer. (In other words, there&amp;#8217;s a reason if you know what you are doing on the net, you&amp;#8217;ll rarely buy via a &amp;#8216;Google&amp;#8217; Adwords ad).&lt;/p&gt;


	&lt;p&gt;Your competitors think for a while and realize that if they raised their prices and charged $9 for widgets, they could pay Google $8.99 for ads and wipe you off the map again. Now if you want traffic, you are going to have to pay the gatekeeper $8.99 a sale and raise your price to keep up with it.&lt;/p&gt;


	&lt;p&gt;Uh oh, now Google is causing raised prices across the board, bad news for the consumer. This is a natural trend for advertising, which is always competitive &amp;#8211; the reason for $12+ ticket prices at the movie theater are not so as much bigger budget flicks, as much as huge &lt;a href=&quot;http://www.slate.com/id/2120335/&quot;&gt;movie advertising&lt;/a&gt; costs. (&amp;#8220;Disney, Warner Bros., Sony, 20th Century Fox, Universal, and Paramount—spent, on average, $34.8 million to advertise a movie and earned, on average, just $20.6 million per title.&amp;#8221;)&lt;/p&gt;


	&lt;p&gt;This is not to say the prices of advertisement on Google will trend ever skyward. Although Google has a monopoly on web search, as Jacob points out: they don&amp;#8217;t control all channels. Brick and mortar prices can have memorable prices or offer &amp;#8216;lowest cost&amp;#8217; deals &amp;#8211; Very strong brands like Amazon and Newegg can create stores where they gain a reputation for generally low prices and go there and do at least a price check, if they don&amp;#8217;t go there first.&lt;/p&gt;


	&lt;p&gt;And that&amp;#8217;s how I do my purchasing through trusted brands or recommended sellers &amp;#8211; not through Google Adwords, a system that rewards and promotes vendors for not offering a quality product, but rather for giving up profits to Google and writing misleading advertisements.&lt;/p&gt;


	&lt;p&gt;Another alternative is Craigslist or Ebay. Both of these have models for real markets, where people compare prices and quality of goods / sellers, rather than just catchy advertisements.&lt;/p&gt;
</description>
            
            <pubDate>Mon, 13 Nov 2006 16:48:45 -0800</pubDate>
        </item>
            
        <item>
            <title>Announcing SWiK-Source</title>
            <link>http://swik.net/User:alex/Alex+Bosworth%27s+Weblog/Announcing+SWiK-Source/lqvq</link>
            <description>&lt;p&gt;I&amp;#8217;m happy to announce that &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/SourceLabs&quot;&gt;SourceLabs&lt;/a&gt; has decided to release &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/SWiK-Source&quot;&gt;SWiK-Source&lt;/a&gt; &amp;#8211; the code that drives &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/SWiK&quot;&gt;swik.net&lt;/a&gt;, under an open source license (&lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/License:GPL&quot;&gt;&lt;span class=&quot;caps&quot;&gt;GPL&lt;/span&gt; v2&lt;/a&gt;).&lt;/p&gt;


	&lt;p&gt;Although we didn&amp;#8217;t want to make any promises, open sourcing the code to the wiki has been something we intended to do from the start of the project. Personally, in designing SWiK as an &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Ajax&quot;&gt;Ajax&lt;/a&gt; powered &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/wiki&quot;&gt;wiki&lt;/a&gt;, I don&amp;#8217;t think there&amp;#8217;s any reason it can&amp;#8217;t be used for various purposes beyond driving swik.net, and in fact for the past 6 months internally at SourceLabs we&amp;#8217;ve repurposed SWiK-Source to run as our internal wiki to help organize our internal projects. People write weekly status reports in the blog pages, describe design policies in wiki pages, and use tags to avoid a disorganized wiki.&lt;/p&gt;


	&lt;p&gt;It&amp;#8217;s been the single biggest demand by far since we started the project, that we go beyond licensing the wiki pages under an open license, but that the entire engine driving the site be open as well. Designing and building a web service however isn&amp;#8217;t exactly the same as building a software product: we didn&amp;#8217;t design for environments that aren&amp;#8217;t our own production servers.&lt;/p&gt;


	&lt;p&gt;That will not change, with the release of SWiK Source &amp;#8211; it&amp;#8217;s still designed to be run on production servers. We&amp;#8217;ve abstracted to a configuration file everything that might be specific to a wiki install, such as the desired wiki name and the paths to libraries, but the code is still written for a server environment. While the code is open, setting it up and installing it is not for the faint of heart, and we haven&amp;#8217;t tested it in settings too far beyond the servers we run.&lt;/p&gt;


	&lt;p&gt;The documentation for the project will live entirely on SWiK and be collaborative. If you want to help with the SWiK-Source distribution, that&amp;#8217;s what we need: better docs on using SWiK-Source in different settings and for different purposes, or fixing any problems with the current docs. The installer script could use some love too.&lt;/p&gt;


	&lt;p&gt;All that being said, I&amp;#8217;m excited to finally be able to offer &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/SWiK-Source&quot;&gt;SWiK-Source&lt;/a&gt; as free software, and at the very least feel free to poke around and see how it all works.&lt;/p&gt;
</description>
            
            <pubDate>Wed, 20 Sep 2006 16:44:31 -0700</pubDate>
        </item>
            
        <item>
            <title>Boz, Videobookmarks upgrades</title>
            <link>http://swik.net/User:alex/Alex+Bosworth%27s+Weblog/Boz%2C+Videobookmarks+upgrades/kz41</link>
            <description>&lt;p class=&quot;notice&quot;&gt;First, an important update: if you are not subscribed to my feedburner &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt; that I switched to a long time ago, please switch your subscription to &lt;a href=&quot;http://feeds.feedburner.com/AlexBosworth&quot;&gt;http://feeds.feedburner.com/AlexBosworth&lt;/a&gt;. I am moving my blog to &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/SWiK&quot;&gt;SWiK&lt;/a&gt;: increased growth of SWiK traffic over the past few months has meant that we have needed to switch our setup to a more load-balanced setup across more webservers. Rather than struggle with MovableType, which has been having a series of problems, I&amp;#8217;m just going to blog solely on this blog, which I was only cross posting to before. If you are subscribed to the &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; feed, you shouldn&amp;#8217;t even notice the difference though.&lt;/p&gt;


	&lt;h2&gt;Boz news&lt;/h2&gt;


	&lt;p&gt;It&amp;#8217;s been a month since I released &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/boz&quot;&gt;boz&lt;/a&gt; &amp;#8211; an aes encrypted, (&lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/open-source&quot;&gt;open source&lt;/a&gt;) private bookmarking service. Today I rolled out the latest update, adding bookmarks export, &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/rss&quot;&gt;rss&lt;/a&gt; support, and n-way tagging, as well as a tag search box.&lt;/p&gt;


	&lt;p&gt;&lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; support was a tricky problem from the encryption standpoint. I use &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Firefox&quot;&gt;Firefox&lt;/a&gt; RSS integration with my &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/del.icio.us&quot;&gt;del.icio.us&lt;/a&gt; bookmarks, and I really wanted the same functionality in boz. There are a &lt;a href=&quot;http://sandbox.sourcelabs.com/boz/rss/alexbosworth&quot;&gt;handful of bookmarks&lt;/a&gt; that are sensitive and certainly not &amp;#8216;social&amp;#8217;, that I still want to have in my firefox livebookmarks. But Firefox can&amp;#8217;t decrypt an encrypted &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; feed. The solution is to attach labels to bookmarks that should be included in an &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; feed. The labels can be generic if I don&amp;#8217;t want to give away the purpose of the link, but in any case the real title and link of the bookmark is protected by the encryption.&lt;/p&gt;


	&lt;p&gt;&lt;img src=&quot;http://sandbox.sourcelabs.com/images/bozpic.png&quot; alt/&gt;&lt;/p&gt;


So far the features upgraded since the release of boz have been:
	&lt;ul&gt;
	&lt;li&gt;Encrypted tagging
	&lt;ul&gt;
	&lt;li&gt;tag cloud&lt;/li&gt;
		&lt;li&gt;tag autocompletion&lt;/li&gt;
		&lt;li&gt;tag search&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
		&lt;li&gt;Starred bookmarks &amp;#8211; ala gmail&lt;/li&gt;
		&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; feed &amp;#8211; add cleartext labels to bookmarks to have them appear in an rss feed. The link address and title remain encrypted.&lt;/li&gt;
		&lt;li&gt;export: pull out an encrypted stream of bookmarks&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;I&amp;#8217;m biased, but I have to take back what I said earlier about private and public bookmarks not mixing. I&amp;#8217;ve found that they do, because I&amp;#8217;ve found myself only bookmarking encrypted bookmarks on boz and not really anything more on del.icio.us. I like to bookmark stupid stuff as well as internal intranet urls, and I am too lazy to figure out if it should be posted to del.icio.us or boz, so sorry if you are one of my network buddies on del.icio.us but this is part of the reason for the rash of updates to boz this month.&lt;/p&gt;


	&lt;p&gt;boz was originally written to replace a previous project that del.icio.us put the kibosh on called &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/priv.at&quot;&gt;priv.at&lt;/a&gt;, and I wrote an importer for people who wanted to migrate bookmarks they saved there that were wiped by del.icio.us, but some have asked for a migration tool to encrypt their existing normal del.icio.us bookmarks in boz. I&amp;#8217;m not sure if this is a big demand, but if people want to migrate their bookmarks to boz, let me know, it wouldn&amp;#8217;t be too hard to adjust my existing migration script.&lt;/p&gt;


	&lt;h2&gt;VideoBookmarks&lt;/h2&gt;


	&lt;p&gt;I&amp;#8217;ve updated &lt;a href=&quot;http://sandbox.sourcelabs.com/wikiality/videobookmarks&quot;&gt;VideoBookmarks&lt;/a&gt;, the application I built on &lt;a href=&quot;http://sandbox.sourcelabs.com/wikiality/&quot;&gt;wikiality&lt;/a&gt; to display the most recently bookmarked videos. The most recent update deals with a problem that I&amp;#8217;ve had to deal with with &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/delimages&quot;&gt;delimages&lt;/a&gt;&amp;#8212;people bookmark the same thing over and over.&lt;/p&gt;


	&lt;p&gt;VideoBookmarks now tries to only show the same video once.&lt;/p&gt;
</description>
            
            <pubDate>Fri, 08 Sep 2006 19:20:16 -0700</pubDate>
        </item>
            
        <item>
            <title>Ajax: A Throbber For All Seasons</title>
            <link>http://swik.net/User:alex/Alex+Bosworth%27s+Weblog/Ajax%3A+A+Throbber+For+All+Seasons/kz10</link>
            <description>&lt;p&gt;If you are using &lt;a href=&quot;http://swik.net/Ajax&quot;&gt;Ajax&lt;/a&gt;, and by Ajax I meant XMLHttpRequest, and you are using it intensively, you may have noticed you want to give people an indication that requests are being sent to the server.&lt;/p&gt;


	&lt;p&gt;The browser does this by making something called the &amp;#8216;throbber&amp;#8217; move. This takes various shapes, from stars flying across a giant N, to a windows flag waving, to small dots rotating. In &lt;a href=&quot;http://swik.net/FireFox&quot;&gt;FireFox&lt;/a&gt;, or other tabbed browsers, the throbber also acts as a helpful indicator on a tab to indicate whether a tab has finished loading.&lt;/p&gt;


	&lt;p&gt;As a heavy internet user, I have become attuned to the signal that a webpage is still loading, and in an application that uses XMLHttpRequest, it can be confusing as to what is going on.&lt;/p&gt;


	&lt;p&gt;So I&amp;#8217;ve developed a technique to fake the browser throbbing, by launching a dumb parallel request to the &lt;span class=&quot;caps&quot;&gt;XHR&lt;/span&gt; request. The parallel request merely creates an iframe to a page that will load for a long time, triggering the throbber. When I want to stop the throbber, I just destroy the iframe.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;ve rigged up &lt;a href=&quot;http://sandbox.sourcelabs.com/wikiality/throbber&quot;&gt;a demo page on wikiality&lt;/a&gt;, so you can see the technique in action and the source code behind it.&lt;/p&gt;


&lt;hr&gt;

	&lt;p&gt;PS: Btw to all the word police and wordinistas who wrote in to say that wikiality is the exclusive province of Steven Colbert: If Steven Colbert wants me not to use it, he can ask me himself, and if he doesn&amp;#8217;t come over to my office to demand it back, well then he&amp;#8217;s a coward and he doesn&amp;#8217;t deserve it anyways.&lt;/p&gt;
</description>
            
            <pubDate>Tue, 05 Sep 2006 15:25:50 -0700</pubDate>
        </item>
            
        <item>
            <title>Wikiality</title>
            <link>http://swik.net/User:alex/Alex+Bosworth%27s+Weblog/Wikiality/kype</link>
            <description>&lt;p&gt;I&amp;#8217;ve been working on a wiki project as an experiment for the next generation of &lt;a href=&quot;http://swik.net/SWiK&quot;&gt;SWiK&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;The concept is that the web isn&amp;#8217;t just a lot of static webpages anymore, it&amp;#8217;s Ajax widgetry, Flash videos, fancy stylesheets, etc. Wikis however are dragging behind, stuck in static webpage land, there either isn&amp;#8217;t a model for extending the wiki, or if there is it&amp;#8217;s too complicated to really be &amp;#8216;wiki&amp;#8217;.&lt;/p&gt;


	&lt;p&gt;The wikiality concept tries to play a balance between these worlds. It&amp;#8217;s a very experimental concept, but I&amp;#8217;ve started using it personally and I think it&amp;#8217;s started to be interesting. The way it works is via two types of pages: wiki pages and wiki templates.&lt;/p&gt;


	&lt;p&gt;The templating language is straight JavaScript. Templates are wiki pages that contain an eponymous Javascript class. When templates are embedded in a wiki page, the page then incorporates any referenced templates.&lt;/p&gt;


I like building applications in wiki form because:
	&lt;ul&gt;
	&lt;li&gt;It&amp;#8217;s faster to develop, about two times as fast as a regular application&lt;/li&gt;
		&lt;li&gt;More customization. If I don&amp;#8217;t like how something works in a widget, I can clone the widget, change it subtley, and now I have it working both ways. You can also build your own interface from top to bottom, there&amp;#8217;s no constraints of the standard application ui.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;I&amp;#8217;ve written some applications in &lt;a href=&quot;http://sandbox.sourcelabs.com/wikiality/&quot;&gt;wikiality&lt;/a&gt;:&lt;/p&gt;


&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://sandbox.sourcelabs.com/wikiality/bozpages&quot;&gt;Bozpages 2.0&lt;/a&gt; &amp;#8211; This is the successor to Bozpages (simple rss feed pages). 
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://sandbox.sourcelabs.com/wikiality/web2.0&quot;&gt;bozpage web2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://sandbox.sourcelabs.com/wikiality/tech_news&quot;&gt;bozpage tech news&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://sandbox.sourcelabs.com/wikiality/videobookmarks&quot;&gt;Video Bookmarks&lt;/a&gt; &amp;#8211; Like &lt;a href=&quot;http://swik.net/delimages&quot;&gt;delimages&lt;/a&gt; shows you the most recently bookmarked image feeds from del.icio.us, Video Bookmarks shows the most recently bookmarked videos from YouTube and Google Video.&lt;/li&gt;
&lt;/ul&gt;

	&lt;p&gt;I&amp;#8217;m still thinking about how the concept works and it&amp;#8217;s very experimental and in flux, but I thought I&amp;#8217;d share just the basic idea: I think wikis and widgets can work together.&lt;/p&gt;


	&lt;p&gt;PS. I&amp;#8217;ve been looking more into how Digg works, and how the user ecology is evolving, I posted this on my other blog, but I think it might be interesting to people who just read this one, It&amp;#8217;s called &lt;a href=&quot;http://swik.net/User:alex/Alex+Bosworth+-+The+Races/The+Prisoner%27s+Dilemma+in+Digg+Story+Promotion/jy3o&quot;&gt;&amp;#8220;The Prisoner&amp;#8217;s Dilemma In Digg Story Promotion&amp;#8221;&lt;/a&gt;. It talks about a theory I&amp;#8217;m working on that there might be a weakness in Digg&amp;#8217;s story promotion scheme wherein you can get your stories front-paged by entering into a cooperative game with other people trying for the same thing.&lt;/p&gt;
</description>
            
            <pubDate>Tue, 05 Sep 2006 01:55:06 -0700</pubDate>
        </item>
            
        <item>
            <title>How To Provide A Web API</title>
            <link>http://swik.net/User:alex/Alex+Bosworth%27s+Weblog/How+To+Provide+A+Web+API/ju9w</link>
            <description>&lt;p&gt;In a world where people are making interdependent webservices, &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; design and maintenance is pretty important. Unfortunately despite rising use and availability of APIs, there are significant problems with the way even big &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; vendors are deploying and maintaining their APIs.&lt;/p&gt;


	&lt;p&gt;What are a few simple rules for providing a web &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;?&lt;/p&gt;


	&lt;ol&gt;
	&lt;li&gt;Keep it clean and simple&lt;/li&gt;
		&lt;li&gt;Stick to standards&lt;/li&gt;
		&lt;li&gt;Make it about data&lt;/li&gt;
		&lt;li&gt;Keep it working&lt;/li&gt;
		&lt;li&gt;Design for updates&lt;/li&gt;
	&lt;/ol&gt;


	&lt;p&gt;&lt;strong&gt;Keeping it clean and simple&lt;/strong&gt; is subjective and a matter of audience. For most developers a simple &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; is &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/REST&quot;&gt;&lt;span class=&quot;caps&quot;&gt;REST&lt;/span&gt;&lt;/a&gt;/&lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/HTTP&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;&lt;/a&gt; based, with &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/XML&quot;&gt;&lt;span class=&quot;caps&quot;&gt;XML&lt;/span&gt;&lt;/a&gt; delivery of a known or simple schema, &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/RSS&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;&lt;/a&gt; being a good general choice. For &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/JavaScript&quot;&gt;JavaScript&lt;/a&gt; developers or plugin writers &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/JSON&quot;&gt;&lt;span class=&quot;caps&quot;&gt;JSON&lt;/span&gt;&lt;/a&gt; feeds might be preferrable. For enterprise development scenarios, &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/SOAP&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SOAP&lt;/span&gt;&lt;/a&gt; over &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; might be better, but generally it&amp;#8217;s best to stick with just &lt;span class=&quot;caps&quot;&gt;REST&lt;/span&gt; + &lt;span class=&quot;caps&quot;&gt;XML&lt;/span&gt;/RSS.&lt;/p&gt;


	&lt;p&gt;Simple also means don&amp;#8217;t be too abstract. &lt;a href=&quot;http://www.flickr.com/services/api/explore/&quot;&gt;Flickr for example&lt;/a&gt; chooses in its &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; to require the use of its internal ids for all &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; calls. This means for example that every call to find information about a user requires a call first to find the internal id of the user. Del.icio.us on the other hand just requires visible names, in fact internal ids are hidden everywhere.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Sticking to standards&lt;/strong&gt; is a matter of developing APIs that can plug in to accepted norms. Not only does this make development easier, it makes tooling and other peripheral services work better, and generally standards are written for a good reason. Using &lt;span class=&quot;caps&quot;&gt;REST&lt;/span&gt;? Don&amp;#8217;t use &lt;span class=&quot;caps&quot;&gt;GET&lt;/span&gt; requests to update state, such as in del.icio.us&amp;#8217;s urls to delete or add urls like &lt;em&gt;https://api.del.icio.us/v1/posts/add?&lt;/em&gt;. Using &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;? Try to stick to mainstream semantically appropriate elements rather than new namespaces, provide well formed &lt;span class=&quot;caps&quot;&gt;XML&lt;/span&gt;, don&amp;#8217;t stick &lt;a href=&quot;http://www-128.ibm.com/developerworks/xml/library/x-eleatt.html&quot;&gt;data in &lt;span class=&quot;caps&quot;&gt;XML&lt;/span&gt; attributes&lt;/a&gt;, etc.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Make it about data.&lt;/strong&gt; Leave application design to the application developer. Google&amp;#8217;s &lt;a href=&quot;http://code.google.com/apis/ajaxsearch/documentation/&quot;&gt;new Ajax search results &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt; is a good example of an &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; that isn&amp;#8217;t about data, which makes less flexible to build upon. Instead of providing &lt;span class=&quot;caps&quot;&gt;JSON&lt;/span&gt; feeds for plugin developers, Google has chosen to build out their own little search results box, with controls and results that cannot be styled, instead of leaving the interface and logic up to the Javascript developer or plugin writer. A better design would have been a simple &lt;span class=&quot;caps&quot;&gt;JSON&lt;/span&gt; feed of &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Google&quot;&gt;Google&lt;/a&gt; service search results, and a reference object to build an embedded results box.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Keep it working&lt;/strong&gt;. An application developer working with remote web services should design with the consideration that the remote service can malfunction or die, but that doesnt&amp;#8217; mean that service providers shouldn&amp;#8217;t prioritize keeping reliable service high on their list. On &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/SWiK&quot;&gt;SWiK&lt;/a&gt; and other development projects &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/User:alex&quot;&gt;I&amp;#8217;ve done&lt;/a&gt;, every one of the APIs we use (del.icio.us, sourceforge, google, etc) have gone down or had problems, and I learned the hard way not to depend on any of them.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Make a clean upgrade path&lt;/strong&gt;. There&amp;#8217;s no permanent APIs: add a version number and keep developers informed. &lt;a href=&quot;http://api.flickr.com/services/rest/?method=flickr.people.getInfo&amp;#38;api_key=4fdc83ca16104208791af3e57f7c0e11&amp;#38;user_id=65248125%40N00&amp;#38;api_sig=dcd9ac9c5709f8656ffaef06dacabb23&quot;&gt;Flickr calls don&amp;#8217;t have a version number&lt;/a&gt; but they should. In del.icio.us &lt;a href=&quot;http://del.icio.us/help/buttons&quot;&gt;even browser bookmarklets have versions&lt;/a&gt;. &lt;a href=&quot;http://salesforce.com&quot;&gt;Salesforce.com&lt;/a&gt;, whose bottom line depends on web service APIs, uses versioned WSDLs. Each new rev of Salesforce.com&amp;#8217;s APIs are given a unique &lt;span class=&quot;caps&quot;&gt;WSDL&lt;/span&gt; and the backend from that point is kept stable once the &lt;span class=&quot;caps&quot;&gt;WSDL&lt;/span&gt; has been issued. This has come into practice because just like native APIs, customers started to build code against buggy behavior, and when the server logic was updated to fix bugs, their code broke. Now if there&amp;#8217;s broken code it stays in place, and developers migrate to new services at regular and scheduled intervals.&lt;/p&gt;


	&lt;p&gt;Recently &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/del.icio.us&quot;&gt;del.icio.us&lt;/a&gt; updated their post &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; to use a secure encrypted &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt;, so as not to betray passwords or bookmarks in cleartext if they were posted using the &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;. A good move, especially as developers are using &lt;span class=&quot;caps&quot;&gt;GET&lt;/span&gt; requests to post bookmarks, which may be prompting some routers to cache sensitive user data. &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Yahoo&quot;&gt;Yahoo&lt;/a&gt; was nice enough to provide clear documentation and &lt;a href=&quot;http://blog.del.icio.us/blog/2006/05/feel_secure.html&quot;&gt;plenty of warning&lt;/a&gt; about the change though. After a few months of warning, the old insecure &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt; was turned off, and legacy requests are redirected to the secure &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt;, all in all a very good update.&lt;/p&gt;


	&lt;p&gt;On the other hand, del.icio.us recently updated their rss feed of recent bookmarks: &lt;a href=&quot;http://del.icio.us/rss&quot;&gt;http://del.icio.us/rss&lt;/a&gt; to be a bit more &amp;#8216;&lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/digg&quot;&gt;digg&lt;/a&gt;-esque&amp;#8217;. Instead of showing the steady stream of users adding bookmarks to their accounts, it now aggregates the popular urls, showing you something that is currently being bookmarked quite a bit. Well guess what? &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/LiveMarks&quot;&gt;LiveMarks&lt;/a&gt; uses those front page rss feeds to aggregate del.icio.us bookmarking activity. The &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; feed change, which was completely unannounced, significantly impacted that application, and I wish they had given some warning that the &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt; was going to change, instead of silently changing it. (If you are hosting a mirror for LiveMarks and I haven&amp;#8217;t contacted you, please change the aggregation url to http://del.icio.us/rss/recent instead of http://del.icio.us/rss/).&lt;/p&gt;


	&lt;p&gt;As a sidenote, a personal annoyance is the reluctance of service providers to provide APIs against what they consider to be their most important property: public user data.&lt;/p&gt;


	&lt;p&gt;Even though many times the data is made public in various forms, such as through &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; feeds or &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; pages, data like my favorites on &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Flickr&quot;&gt;Flickr&lt;/a&gt; or my older bookmarks on &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/del.icio.us&quot;&gt;del.icio.us&lt;/a&gt; require authorization to access, which means as a developer the interface and code needs to be more complicated to use these APIs. The new Google Ajax Search &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; for example requires a separate &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; key I must apply for, I can&amp;#8217;t use the Google search &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; key I use normally.&lt;/p&gt;


	&lt;p&gt;If I want to build an application for del.icio.us for example to offer a cool visualization of all your bookmarks, and you in context of other people who are close to your bookmarking activities, it&amp;#8217;s essentially impossible without everyone volunteering their username and password in the clear to me, data about your bookmarks in del.icio.us is behind a firewall unless you sit on the &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; feed and store the aggregation. It&amp;#8217;s the same with last.fm, who don&amp;#8217;t even offer an &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; to recover your listening data (which is why I built &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/musika&quot;&gt;a last.fm proxy&lt;/a&gt;). It&amp;#8217;s up to del.icio.us or the service provider as to what they want to offer, but from the developer perspective, a lot of gratuitous authorization and api keys are essentially just another barrier to building the application I am interested in building.&lt;/p&gt;
</description>
            
            <pubDate>Mon, 21 Aug 2006 17:25:08 -0700</pubDate>
        </item>
            
        <item>
            <title>Encrypted Tagging</title>
            <link>http://swik.net/User:alex/Alex+Bosworth%27s+Weblog/Encrypted+Tagging/is6s</link>
            <description>&lt;p&gt;They said it couldn&amp;#8217;t be done! OK &amp;#8211; I said it would be a pain in my last post on releasing &lt;a href=&quot;http://sandbox.sourcelabs.com/boz/&quot;&gt;boz: encrypted web bookmarks&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;To me, encrypted tagging seemed like a complicated problem, how can you keep track of tags if the database can&amp;#8217;t be trusted to know what the tags are? If you encrypt the same tag word twice it results in different words, so you can&amp;#8217;t search the encrypted text for a tag.&lt;/p&gt;


	&lt;p&gt;Well that actually seemed like fun to work around, so this weekend I rolled out an implementation of tagging into &lt;a href=&quot;http://sandbox.sourcelabs.com/boz/&quot;&gt;boz&lt;/a&gt; that allows for encrypted tags.&lt;/p&gt;


	&lt;p&gt;This is actually the third release for boz, the second being the &amp;#8216;stars&amp;#8217; feature. I like the Gmail concept of starring something to make sure you don&amp;#8217;t forget it, and I have missed this feature from &lt;a href=&quot;http://swik.net/del.icio.us&quot;&gt;del.icio.us&lt;/a&gt;. There are a variety of important internal addresses to &lt;a href=&quot;http://swik.net/SourceLabs&quot;&gt;SourceLabs&lt;/a&gt; and to &lt;a href=&quot;http://swik.net/&quot;&gt;SWiK&lt;/a&gt; that I&amp;#8217;d rather not put on my del.icio.us bookmarks.&lt;/p&gt;


	&lt;p&gt;The stars feature lets me keep a short list of bookmarks that I hit more frequently, or ones that I need to do something with in the near future.&lt;/p&gt;


	&lt;p&gt;Tags is just a feature I&amp;#8217;ve copied from del.icio.us, and really it&amp;#8217;s essential for a bookmarks manager, and a much better model than folders.&lt;/p&gt;


	&lt;p&gt;The way that it&amp;#8217;s implemented to keep things secure is that the client receives a tag dictionary from the server of all the tags that have been used in the past. When new bookmarks are posted, the client consults the dictionary to see if they should flag it with an existing tag from the dictionary, if not, they post an encrypted request to create a new tag.&lt;/p&gt;


	&lt;p&gt;Now that I&amp;#8217;ve started playing around with encryption, I am starting to think it&amp;#8217;s a good idea for a lot more applications. Maybe &amp;#8216;private&amp;#8217; isn&amp;#8217;t the new &amp;#8216;social&amp;#8217;, but in migrating to pure web apps off of desktop apps, encrypting content does away with one of the major reservations in leaving the desktop &amp;#8211; giving your security over to some third party server.&lt;/p&gt;
</description>
            
            <pubDate>Mon, 07 Aug 2006 18:04:13 -0700</pubDate>
        </item>
            
        <item>
            <title>Private Bookmarks Web Service</title>
            <link>http://swik.net/User:alex/Alex+Bosworth%27s+Weblog/Private+Bookmarks+Web+Service/igka</link>
            <description>&lt;p&gt;It seems to be a trend: if you&amp;#8217;re using web applications, forget about privacy. Forget about owning your own data.&lt;/p&gt;


	&lt;p&gt;A while ago, &lt;a href=&quot;http://www.sourcelabs.com/blogs/ajb/2005/10/fixing_up_some_loose_ends.html&quot;&gt;I had an issue&lt;/a&gt; with this aspect of &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/del.icio.us&quot;&gt;del.icio.us&lt;/a&gt;. Once upon a time, there was no way to save private bookmarks: it&amp;#8217;s still pretty obtuse. Well, I hacked up something to get around the limitation and create bookmarks anonymously or semi-privately if not privately.&lt;/p&gt;


	&lt;p&gt;It was just meant to be something to bookmark for myself and maybe something to blog about, but people took to it, and over 11k private bookmarks were saved using it in the space of 8 months. However a short time ago, Yahoo/del.icio.us blocked the service: not only could I not post new private bookmarks for myself, all the ones I and everyone else had saved were wiped out.&lt;/p&gt;


	&lt;p&gt;Well ok, lesson learned. But I still want to bookmark privately, and I don&amp;#8217;t like the way del.icio.us does it: public and private bookmarks are not chocolate and peanut butter, they should be separate. And private bookmarks should be really private, I don&amp;#8217;t even want to trust the servers with them.&lt;/p&gt;


	&lt;p&gt;So I&amp;#8217;ve coded up an open source solution: &lt;a href=&quot;http://sandbox.sourcelabs.com/boz/&quot;&gt;a web service that lets you post bookmarks that even the server doesn&amp;#8217;t know about&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;How it works is that just before you post a bookmark, your browser encrypts the data and sends the bookmark information encrypted with your private key to the server. To browse your bookmarks, the server sends them back encrypted and your browser then decrypts them.&lt;/p&gt;


	&lt;p&gt;A special bookmarklet can be used on remote web pages to post, or you can post directly via the interface.&lt;/p&gt;


	&lt;p&gt;Because of the heavy use of browser encryption and decryption, the entire application is written in &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/JavaScript&quot;&gt;JavaScript&lt;/a&gt;/&lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Ajax&quot;&gt;Ajax&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Also, if you have used my previous private bookmarks solution, please email me at alex.bosworth+projects at gmail &amp;#8211; I&amp;#8217;ve set aside your username and I&amp;#8217;ll import your bookmarks that were blanked into the new service.&lt;/p&gt;


&lt;hr/&gt;


	&lt;p&gt;For those interested, I&amp;#8217;ll go into some details on how the application was developed:&lt;/p&gt;


	&lt;h2&gt;Developing an encrypted bookmarks web application&lt;/h2&gt;


	&lt;p&gt;I&amp;#8217;ve been working on this project in my spare time since a few months ago when Yahoo/del.icio.us gave me the final word that priv.at was blocked for good. There are several challenges to an encrypted bookmarks service that needed to be overcome:&lt;/p&gt;


	&lt;ol&gt;
	&lt;li&gt;Paucity of quality open source web browser encryption and decryption libraries&lt;/li&gt;
		&lt;li&gt;Developing a bookmarklet that doesn&amp;#8217;t betray the url to the server&lt;/li&gt;
		&lt;li&gt;Storing an encryption key on the browser beyond a single page load, without persisting it to the server&lt;/li&gt;
		&lt;li&gt;Ensuring that encrypted data doesn&amp;#8217;t become corrupted&lt;/li&gt;
		&lt;li&gt;Keeping a javascript application fast&lt;/li&gt;
		&lt;li&gt;Dealing with pages with content that all has to be decrypted&lt;/li&gt;
		&lt;li&gt;Search and tagging without the database knowing what it&amp;#8217;s searching for&lt;/li&gt;
	&lt;/ol&gt;


	&lt;p&gt;The first problem of finding a suitable library was just a matter of going through various libraries, looking at the code and running them through unit tests. Most javascript encryption libraries however were designed as proof of concepts, or coded in very ugly ways, or not for any kind of performance and are therefore very difficult to adapt. This just took methodical testing to find one I liked. I then extended the string object with a .encrypt and a .decrypt method, this allows for encryption to be a simple component of the application.&lt;/p&gt;


	&lt;p&gt;The problem of developing a bookmarklet is that traditionally you encode the url in a get parameter, and then the server echoes what you asked it to &amp;#8216;get&amp;#8217; when you hit the post screen. But that implies that the server knows what urls you are interested in. I wanted to avoid that, so my bookmarklet uses the only part of a url that is not passed to the server: the hash.&lt;/p&gt;


	&lt;p&gt;Storing an encryption key on the browser was another issue that I didn&amp;#8217;t really anticipate. It is quite annoying to have to type in your encryption key every time you want to see your bookmarks or post a new one, you get used to being just logged in and having the server remember that you authenticated and it can send you privileged information. But that doesn&amp;#8217;t work in this case, you must never tell the server what your private key is, but somehow have JavaScript remember it from page load to page load, which is not something that JavaScript seems to have been designed for. Luckily, the &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/dojo&quot;&gt;dojo&lt;/a&gt; toolkit provides a JavaScript to &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Flash&quot;&gt;Flash&lt;/a&gt; bridge that allows for permanent storage on the browser, something normally of limited use, but perfect for my purposes.&lt;/p&gt;


	&lt;p&gt;This was my first practical use of the dojo javascript toolkit, and I have had a mixed experience. I have found on the one hand it&amp;#8217;s fairly elegant as an &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;, provides the functionality I need, and is generally very powerful. On the other hand, it doesn&amp;#8217;t always work quite like it should and it creates problems for &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Safari&quot;&gt;Safari&lt;/a&gt; and &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/Opera&quot;&gt;Opera&lt;/a&gt;: I haven&amp;#8217;t even tried IE yet. I decided the tradeoff of having to type your key in over and over was worth losing the minority browsers temporarily, and I&amp;#8217;ll look at fixing that at a later stage.&lt;/p&gt;


	&lt;p&gt;Another problem that I ran into during development of the project was the fact that strange corruptions were taking place in some posts of bookmarks. I would post a bookmark, and it would sometimes return from the server garbled. I could post something 5 times in a row, and 4 could return fine and the fifth would be corrupt. This made it one of the more frustrating issues to pin down. One issue that was obvious is that I had forgotten that encrypting the strings would make them too large for &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/MySQL&quot;&gt;MySQL&lt;/a&gt;&amp;#8217;s maximum varchar space of 255 characters, which is usually ok for a title and a url.&lt;/p&gt;


	&lt;p&gt;Another issue is that the encryption library I use doesn&amp;#8217;t encode to hex, so it makes data transmission and application design a little more complicated. My normal style of writing JavaScript is to keep everything in the document. Building web applications, you might have various stages of data representation: a database schema, an object schema, a javascript object schema, and finally a document schema. A bookmark is one thing in the database, another as a server object, another as a javascript object, and another as an html node. Because of this, my practice is to generally avoid JavaScript variables and store everything right in the html. I also try to avoid generating html in JavaScript, I prefer to keep things simple and leave all the html generation to &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/PHP&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Except that I discovered that storing the encrypted bookmarks in the document would corrupt them. This meant that &lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt; had to become a generator of &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/JSON&quot;&gt;&lt;span class=&quot;caps&quot;&gt;JSON&lt;/span&gt;&lt;/a&gt; instead of &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;, and JavaScript would then take over the job of generating the pages. The data transmission issue was solved by tracking down the appropriate escape functions in JavaScript and storing the bookmarks in the database escaped for JavaScript.&lt;/p&gt;


	&lt;p&gt;Finally, all this JavaScript made the application slow, encryption is a processor intensive business and Firefox&amp;#8217;s JavaScript engine is sluggish at best, so I&amp;#8217;ve limited the number of bookmarks on a page to 15 and tuned the JavaScript to avoid excessive &lt;span class=&quot;caps&quot;&gt;DOM&lt;/span&gt; manipulation, which is the biggest &lt;span class=&quot;caps&quot;&gt;CPU&lt;/span&gt; killer out there.&lt;/p&gt;


	&lt;p&gt;Oh yes, lest I forget: tagging. I decided to leave that out for the time being. The server can&amp;#8217;t search for a tag, because the encrypted text is different even for the same word encrypted with the same key. Even the same word encrypted twice in a row is not the same. This of course means that I can&amp;#8217;t prevent users from posting the same bookmark twice.&lt;/p&gt;


	&lt;p&gt;If I wanted to implement tagging/search, I would need to either use a different type of encryption that gave back the same result for the same input, or I would need to burn &lt;span class=&quot;caps&quot;&gt;CPU&lt;/span&gt; on maintaining a dictionary on the browser side. The original &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/priv.at&quot;&gt;priv.at&lt;/a&gt; del.icio.us bookmarks didn&amp;#8217;t have tagging, I can still look through dates and page quickly through my bookmarks, so I have left that feature out as being too &lt;span class=&quot;caps&quot;&gt;CPU&lt;/span&gt; intensive for a first pass at creating a quick bookmarking application.&lt;/p&gt;


	&lt;p&gt;Of course I have also published &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/boz&quot;&gt;the project&lt;/a&gt; source as &lt;a class=&quot;wikilink&quot; href=&quot;http://swik.net/License:GPL&quot;&gt;&lt;span class=&quot;caps&quot;&gt;GPL&lt;/span&gt; v2&lt;/a&gt; for those interested.&lt;/p&gt;
</description>
            
            <pubDate>Wed, 02 Aug 2006 15:18:35 -0700</pubDate>
        </item>
            
    </channel>
</rss>
