<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Crossbrowser</title>
	
	<link>http://www.crossbrowser.net</link>
	<description>Web engineering and software development</description>
	<lastBuildDate>Wed, 04 Aug 2010 17:42:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/crossbrowser" /><feedburner:info uri="crossbrowser" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>crossbrowser</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>How to print a Google Wave</title>
		<link>http://feedproxy.google.com/~r/crossbrowser/~3/W-uayUiqYbc/</link>
		<comments>http://www.crossbrowser.net/405/how-to-print-a-google-wave/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 17:39:07 +0000</pubDate>
		<dc:creator>Michel Billard</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[bookmarklet]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Wave]]></category>
		<category><![CDATA[print]]></category>
		<category><![CDATA[printing]]></category>
		<category><![CDATA[wave]]></category>

		<guid isPermaLink="false">http://www.crossbrowser.net/?p=405</guid>
		<description><![CDATA[Google Wave is not for everyone, but it's definitely a decent tool for collaborating on documents and for planning vacations or other events. One important thing missing from the standard set of features is the ability to print.

There's no way to print a Google Wave by default!]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="#tldr"><em>(click to go directly to the solution if you&#8217;re not interested in the story)</em></a></p>
<p>Google Wave is not for everyone, but it&#8217;s definitely a decent tool for collaborating on documents and for planning vacations or other events. One important thing missing from the standard set of features is the <strong>ability to print</strong>.</p>
<p>There&#8217;s no way to print a Google Wave by default!<span id="more-405"></span></p>
<h3>Looking for existing solutions</h3>
<p>That&#8217;s when<a title="Link to my question in a web application community" href="http://webapps.stackexchange.com/questions/2055/how-can-i-print-a-google-wave"> I started looking for a solution</a> and here are the options I found:</p>
<ul>
<li>Use the <em>PDF Wave Exporter </em>extension for Google Wave</li>
<li>Use the <em>Ferry </em>bot to export the wave to a Google document and print it from there</li>
<li><a title="Link to how to print from Google Wave" href="http://www.googlewaveinfo.com/200910/how-to-print-from-google-wave/">Make Google Wave think you&#8217;re an iPhone</a> (using a User Agent Switcher extension for Firefox for example)
<ul>
<li>This one didn&#8217;t work for me</li>
</ul>
</li>
<li>Use the <a title="Link to Readability bookmarklet page" href="http://lab.arc90.com/experiments/readability/"><em>Readability </em></a>bookmarklet</li>
</ul>
<p>None of these solutions were particularly satisfying: most of them lose quite a bit of formatting and some require too many steps to be considered practical.</p>
<p>After waiting for about a month for a decent solution, I decided to do it myself.</p>
<h3>Do it yourself</h3>
<p>My original idea was to do it via a bookmarklet. If you are not familiar with bookmarklets, they are <strong>bookmarks that execute client-side code</strong> when clicked on. So I started looking for tutorials on making bookmarklets. I know JavaScript (and if you don&#8217;t, don&#8217;t even try building a bookmarklet) so this path looked promising. I found the excellent <a title="Link to the Bookmarklet Builder" href="http://subsimple.com/bookmarklets/jsbuilder.htm">Bookmarklet Builder</a> tool that lets you make a bookmarklet from the ground-up and iterate very quickly. I then needed to know what to extract from the HTML. Using <a title="Firebug extension page" href="http://getfirebug.com/">Firebug</a> I explored the document&#8217;s structure and found out that all the important text was located inside divs with the class &#8220;<em>document</em>&#8220;. So I gathered the content of each of those <em>document </em>containers and appended each of them to a new window created in a pop-up. I end the script by telling the pop-up to print its content.<br />
<a name="tldr"></a></p>
<h3>The ultimate Google wave printing solution (until Google builds the feature itself)</h3>
<p>The result is this bookmarklet which makes printing a Google wave as easy as opening the wave and clicking on the bookmarklet.</p>
<p><div id="attachment_406" class="wp-caption aligncenter" style="width: 153px"><a href="javascript:if(document.getElementsByClassName==undefined){document.getElementsByClassName=function(className){var hasClassName=new RegExp(&quot;(?:^|\\s)&quot;+className+&quot;(?:$|\\s)&quot;);var allElements=document.getElementsByTagName(&quot;*&quot;);var results=[];var element;for(var i=0;(element=allElements[i])!=null;i++){var elementClass=element.className;if(elementClass&amp;&amp;elementClass.indexOf(className)!=-1&amp;&amp;hasClassName.test(elementClass))results.push(element);}return results;}}var replies=document.getElementsByClassName('document');var repliesHTML=&quot;&quot;;for(var i=0;i&lt;replies.length;i++){repliesHTML+=replies[i].innerHTML;repliesHTML+=&quot;&lt;hr/&gt;&quot;;}printwindow=window.open(&quot;&quot;,&quot;Wave Printer&quot;,&quot;width=320,height=210,scrollbars=yes&quot;);printwindow.document.writeln(repliesHTML);printwindow.print();"><img class="size-full wp-image-406" title="Print Wave" src="http://www.crossbrowser.net/wp-content/uploads/2010/08/PrintWaveButton.png" alt="Print Wave" width="143" height="28" /></a><p class="wp-caption-text">Drag and drop in your bookmarks</p></div><br />
Leave any question/suggestion/comment below.</p>
<img src="http://feeds.feedburner.com/~r/crossbrowser/~4/W-uayUiqYbc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.crossbrowser.net/405/how-to-print-a-google-wave/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.crossbrowser.net/405/how-to-print-a-google-wave/</feedburner:origLink></item>
		<item>
		<title>Ideas are worthless</title>
		<link>http://feedproxy.google.com/~r/crossbrowser/~3/1YlBYzxBNXk/</link>
		<comments>http://www.crossbrowser.net/401/ideas-are-worthless/#comments</comments>
		<pubDate>Fri, 23 Jul 2010 06:40:27 +0000</pubDate>
		<dc:creator>Michel Billard</dc:creator>
				<category><![CDATA[Brainstorming]]></category>
		<category><![CDATA[37signals]]></category>
		<category><![CDATA[Diaspora]]></category>
		<category><![CDATA[distributed]]></category>
		<category><![CDATA[execution]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Getting Real]]></category>
		<category><![CDATA[ideas]]></category>
		<category><![CDATA[Kickstarter]]></category>
		<category><![CDATA[OneSocialWeb]]></category>
		<category><![CDATA[open]]></category>
		<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[privacy]]></category>
		<category><![CDATA[social networks]]></category>

		<guid isPermaLink="false">http://www.crossbrowser.net/?p=401</guid>
		<description><![CDATA[Back in May, I had an idea for a killer web application. It would revolutionize the world and bring me fame. If you don't remember, Facebook was getting a lot of heat about privacy concerns  at the time and many users were starting to feel the need to leave. I didn't like the alternatives, mostly because my friends were simply not using them, rendering them useless.

My idea was to build an open version of a social network that anyone could host. Each hosted version of the app would be referred to as a node and would be able to communicate with all the other nodes. You could install it like Wordpress, but you would be hosting a social network instead. All the nodes would only need to share a common API, other than that each node could be programmed in any language.]]></description>
			<content:encoded><![CDATA[<p>Back in May, I had an idea for a killer web application. It would revolutionize the world and bring me fame. If you don&#8217;t remember, <a title="Wired's article about Facebook's privacy issues" href="http://www.wired.com/epicenter/2010/05/facebook-rogue/">Facebook was getting a lot of heat about privacy concerns</a> at the time and many users were starting to feel the need to leave. I wanted to leave to, but I didn&#8217;t like the alternatives, mostly because my friends were simply not using them, rendering them useless.</p>
<h3>The big idea</h3>
<p>My idea was to build an open distributed social network that anyone could host. Each hosted version of the app would be referred to as a node and would be able to communicate with all the other nodes. You would have been able to install it like WordPress, but you would be hosting a social network instead. The nodes would only need to share a common API, other than that each node could be programmed in any language.<span id="more-401"></span></p>
<h3>Reality check</h3>
<p>In the following days, I was refining my idea, thinking about the kind of work it would need, which features had to be built first, what to name the project (I actually had a great name), etc. I was getting pretty excited about the project and wanted to start talking about it publicly when I heard about <a title="Diaspora project on Kickstarter" href="http://www.kickstarter.com/projects/196017994/diaspora-the-personally-controlled-do-it-all-distr">Diaspora via Kickstarter</a>. That was pretty much the exact same project, they had already started and were being backed by other people like me who were tired of being Facebook&#8217;s toys.</p>
<p>Then I saw Wired&#8217;s article that I mentioned at the beginning of this post, the author also wanted an open alternative to Facebook. In shock, I kept searching the Web for &#8220;open social network&#8221; and &#8220;distributed social network&#8221; and found out about <a title="OpenSocial information" href="http://code.google.com/apis/opensocial/">OpenSocial </a>(a common API for social networks proposed by Google) and <a title="OneSocialWeb's website" href="http://onesocialweb.org/">OneSocialWeb</a> (a direct competitor to Diaspora).</p>
<h3>How much is an idea worth</h3>
<p>There I was with my big idea and already dozens of people had been at work on similar projects. That got me thinking about a quote from Derek Sivers I had read in the excellent book <a title="Getting Real by 37signals" href="http://gettingreal.37signals.com/">Getting Real by 37signals</a> (which you can <a title="Read 37signals' Getting Real book for free" href="http://gettingreal.37signals.com/toc.php">read for free online</a>).</p>
<blockquote><p>It&#8217;s so funny when I hear people being so protective of ideas.  (People who want me to sign an NDA to tell me the simplest idea.)</p>
<p>To me, ideas are worth nothing unless executed. They are just a multiplier. Execution is worth millions.</p>
<p>[...]</p>
<p>The most brilliant idea, with no execution, is worth $20.</p>
<p>The most brilliant idea takes great execution to be worth $20,000,000.</p>
<p>That&#8217;s why I don&#8217;t want to hear people&#8217;s ideas.</p>
<p>I&#8217;m not interested until I see their execution.</p>
<p><a title="Derek Sivers' post about ideas and execution" href="http://sivers.org/multiply">source</a></p></blockquote>
<h3>The birth of an idea</h3>
<p>I like to think of myself as a perpetual thinking machine, constantly juggling ideas about new projects. Each time, someone else had the same idea. The more I have ideas, the more I find out that no matter how good the idea is, someone else had the same idea too and for every person trying to bring an idea to life, I&#8217;d bet there are dozens of other people that just didn&#8217;t put the effort or didn&#8217;t have the capabilities to do so.</p>
<p><strong>Ideas are worthless unless you execute them well enough.</strong></p>
<p>More on this topic:</p>
<ul>
<li><a title="Techdirt's article about ideas and execution" href="http://www.techdirt.com/articles/20080514/0336421112.shtml">Ideas are easy&#8230; execution is difficult</a></li>
<li><a title="Techdirt's article about innovation vs invention" href="http://www.techdirt.com/articles/20050322/1528251_F.shtml">The difference between innovation and invention</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/crossbrowser/~4/1YlBYzxBNXk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.crossbrowser.net/401/ideas-are-worthless/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.crossbrowser.net/401/ideas-are-worthless/</feedburner:origLink></item>
		<item>
		<title>Embracing users with multiple personality disorder</title>
		<link>http://feedproxy.google.com/~r/crossbrowser/~3/dvGEULoQ_TY/</link>
		<comments>http://www.crossbrowser.net/394/embracing-users-with-multiple-personality-disorder/#comments</comments>
		<pubDate>Sat, 15 May 2010 15:48:27 +0000</pubDate>
		<dc:creator>Michel Billard</dc:creator>
				<category><![CDATA[Web Engineering]]></category>
		<category><![CDATA[37signals]]></category>
		<category><![CDATA[accounts]]></category>
		<category><![CDATA[Gmail]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[multiple]]></category>
		<category><![CDATA[persona]]></category>
		<category><![CDATA[personality]]></category>
		<category><![CDATA[profiles]]></category>
		<category><![CDATA[reddit]]></category>

		<guid isPermaLink="false">http://www.crossbrowser.net/?p=394</guid>
		<description><![CDATA[As people use the web and all its services more and more, some users sometimes need more than one account for a single service. However, switching between two accounts for a single service is annoying: first, the service's "remember me" functionnality is useless. Second you have to log out and log back in, re-entering your password everytime (unless you don't mind saving your passwords in plain text on your computer via the browser's "remember passwords" feature). Third, there's an easier way and all it costs is some developer time and a rethinking of the traditional account.]]></description>
			<content:encoded><![CDATA[<p>As people use the web and the available services more and more, some users sometimes need more than one account for a single service. However, switching between two accounts is annoying: first, the service&#8217;s &#8220;remember me&#8221; functionnality is useless. Second you have to log out and sign back in, re-entering your password everytime (unless you don&#8217;t mind saving your passwords in plain text on your computer via the browser&#8217;s &#8220;remember passwords&#8221; feature). Third, there&#8217;s an easier way and all it costs is some developer time and a rethinking of the traditional account.</p>
<h3>One account, multiple profiles</h3>
<p>What I suggest is that upon registering on a website, one account is created. The only information associated with the account would be what is needed to contact that person and to login, so a name and an email adress (or the OpenID account used to open the account for example) would sufice.</p>
<p>Then the user needs to create at least one profile (or persona/personality/&#8230;) to start using the service. Of course, the first profile creation could (and probably should) be created at the same time of the account so that the user can start using the service as soon as possible.</p>
<p>The user should then be able to create as many profile as wanted and switch between them easily (see mockup further down). Ideally, the account would be invisible to other users, only the information in the profile would be visible.</p>
<h3>Which services?</h3>
<p>Of course, not all services would benefit from having such a feature, but I feel like most would. I know of one company that manages the accounts in a way that is similar to what I&#8217;m suggesting and it&#8217;s <a title="37signals website" href="http://37signals.com/">37signals</a>. At the end of 2009, they noticed (and probably experienced first-hand too) that users needed multiple accounts for their services and had to log out then sign back in to switch between them. So they did what I&#8217;m suggesting now and introduced <a title="Explanation about 37signals single sign-in called 37signals ID" href="http://37signals.com/accounts">a single sign-in across all their products</a>.</p>
<p>Other websites that would be great with this feature include Gmail/Google, reddit, Twitter and your favorite social networking site. Imagine being able to switch between your real profile and a number of other novelty/fun/secret profiles on which you wish to remain anonymous.</p>
<div id="attachment_395" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.crossbrowser.net/wp-content/uploads/2010/05/changepersonality.png"><img class="size-medium wp-image-395" title="Change personality mockup" src="http://www.crossbrowser.net/wp-content/uploads/2010/05/changepersonality-300x194.png" alt="A mockup of what the feature to change personality could look like" width="300" height="194" /></a><p class="wp-caption-text">A mockup of how it could be implemented (mockup made using Balsamiq Mockups)</p></div>
<img src="http://feeds.feedburner.com/~r/crossbrowser/~4/dvGEULoQ_TY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.crossbrowser.net/394/embracing-users-with-multiple-personality-disorder/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.crossbrowser.net/394/embracing-users-with-multiple-personality-disorder/</feedburner:origLink></item>
		<item>
		<title>How to save Subversion (SVN)</title>
		<link>http://feedproxy.google.com/~r/crossbrowser/~3/yGnFi3hJu5s/</link>
		<comments>http://www.crossbrowser.net/385/how-to-save-subversion-svn/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 12:00:58 +0000</pubDate>
		<dc:creator>Michel Billard</dc:creator>
				<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[distributed version control system]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[hg]]></category>
		<category><![CDATA[Mercurial]]></category>
		<category><![CDATA[source control]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[SVN]]></category>
		<category><![CDATA[version control system]]></category>
		<category><![CDATA[versioning]]></category>

		<guid isPermaLink="false">http://www.crossbrowser.net/?p=385</guid>
		<description><![CDATA[In the last few months, Subversion has been heavily criticized by the software development community, with reason. While Subversion was a great replacement to the old versioning systems like CVS and Visual Source Safe, the newer alternatives are really starting to demonstrate how bad Subversion really is. Merging This is probably the single most problematic [...]]]></description>
			<content:encoded><![CDATA[<p>In the last few months, Subversion has been heavily criticized by the software development community, with reason. While Subversion was a great replacement to the old versioning systems like CVS and Visual Source Safe, the newer alternatives are really starting to demonstrate how bad Subversion really is.<span id="more-385"></span></p>
<h3>Merging</h3>
<p>This is probably the single most problematic issue with Subversion. Merging often causes headaches, errors and wastes a lot of precious time that could&#8217;ve been spent on development. Merging is so bad that many teams avoid branching so that they don&#8217;t have to deal with the merge later on. Mercurial (hg) and Git have both improved this aspect tremendously and I&#8217;m pretty sure its the reason why most people are moving away from Subversion.</p>
<p>The reason why Subversion has trouble with merging has to do with the way it stores the version history.</p>
<blockquote><p>Subversion likes to think about <em>revisions</em>. A revision is  what the entire file system looked like at some particular point in  time.</p>
<p>In Mercurial, you think about <em>changesets.</em> A changeset is a  concise list of the changes between one revision and the next revision.<em><strong></strong></em></p>
<p><em><strong>Source: </strong><a title="Subversion re-education" href="http://hginit.com/00.html">HgInit: Subversion Re-education</a> (an excellent tutorial and guide to Mercurial or other distributed version control systems)</em></p></blockquote>
<p>So Subversion compares whole files when merging while Mercurial (or Git) compares each change set individually. Conflicts occur far less frequently when dealing with changesets.</p>
<h3>Improving SVN</h3>
<h4>Use changesets</h4>
<p>As I said earlier, the biggest difference between Subversion and Mercurial/Git is the way they each deal with modifications to files. If Subversion started using changesets instead of revisions, a lot of the headaches and problems would disappear.</p>
<h4>Local commits</h4>
<p>Another advantage of Mercurial and Git over Subversion is their distributed nature. With Mercurial and Git, you can commit changes locally on your drive whenever you want (while you&#8217;re offline too) and commit all those local changes to a central repository at the time of your choosing. This improves commit logs since the developers don&#8217;t have to worry about breaking anything until they actually commit to the central repository (or push their changes if we use the distributed version control system terminology). You can even have multiple intermediate repositories between the developers and the central repository. For example, all developers could commit to a team lead repository which would review every changes and then commit the reviewed modifications to the central repository.</p>
<p>So, to improve Subversion, I don&#8217;t think the multi-stage distributed system is necessary. The real value is in local commits, the rest can be easily emulated by using a simple branching process.</p>
<h3>Subversion&#8217;s future</h3>
<p>Unless Subversion works on these two issues, I don&#8217;t think Subversion stands a chance against the newcomers. Slowly but surely, teams will migrate to alternative version control systems because they make branching fun again.</p>
<h4>Bonus: Move all the repository information at the root</h4>
<p>This one is not as bad as the others, it&#8217;s just a regular annoyance  that could be improved. Instead of having Subversion meta-data in every  single versioned folder, Subversion should keep all the info in a single  meta-data folder at the root of the checked out repository.</p>
<img src="http://feeds.feedburner.com/~r/crossbrowser/~4/yGnFi3hJu5s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.crossbrowser.net/385/how-to-save-subversion-svn/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://www.crossbrowser.net/385/how-to-save-subversion-svn/</feedburner:origLink></item>
		<item>
		<title>What is Dropbox?</title>
		<link>http://feedproxy.google.com/~r/crossbrowser/~3/zn-9trbhfUo/</link>
		<comments>http://www.crossbrowser.net/376/what-is-dropbox/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 01:24:40 +0000</pubDate>
		<dc:creator>Michel Billard</dc:creator>
				<category><![CDATA[Tools of the Trade]]></category>
		<category><![CDATA[Dropbox]]></category>
		<category><![CDATA[self-hosted]]></category>

		<guid isPermaLink="false">http://www.crossbrowser.net/?p=376</guid>
		<description><![CDATA[If you haven&#8217;t heard of Dropbox yet, I strongly encourage you to go check out their website immediately. Essentially, Dropbox transforms a normal folder on your computer into one that syncs automatically online. If you install Dropbox on multiple computers, all those computers will share the folder and you&#8217;ll have access to everything in that [...]]]></description>
			<content:encoded><![CDATA[<p>If you haven&#8217;t heard of <a title="Dropbox website" href="https://www.dropbox.com/referrals/NTM4MDgyOQ">Dropbox</a> yet, I strongly encourage you to go check out their website immediately. Essentially, Dropbox transforms a normal folder on your computer into one that syncs automatically online. If you install Dropbox on multiple computers, all those computers will share the folder and you&#8217;ll have access to everything in that folder anywhere. It can even be used to <a title="Post about how to manage passwords" href="http://www.crossbrowser.net/121/password-management-101/">take your passwords with you</a>.<span id="more-376"></span></p>
<p style="text-align: center;"><a href="https://www.dropbox.com/referrals/NTM4MDgyOQ"><img class="size-full wp-image-377  aligncenter" title="Dropbox logo" src="http://www.crossbrowser.net/wp-content/uploads/2010/03/dropbox-logo.png" alt="" width="231" height="60" /></a></p>
<p>From a programmer&#8217;s point of view, it behaves like a folder under version control that automatically syncs any time something new is added or modified. It takes care of merging and conflicts without ever bothering you (in case of conflicts, it just shows both files and renames one of them appropriately).</p>
<p>Dropbox doesn&#8217;t currently offer a self-hosted solution and I think there&#8217;s an opportunity here for someone to fill a small part of the market. Companies could offer accounts to their employees and/or share folders among all the employees. An open-source solution would certainly be doable, there&#8217;s no need for a fancy web interface (although it&#8217;s pretty useful), the core of the application isn&#8217;t too big. <a title="HOWTO build your own open source Dropbox clone" href="http://fak3r.com/2009/09/14/howto-build-your-own-open-source-dropbox-clone/">Someone even managed to get something running</a> that offers the basic functionnalities of Dropbox.</p>
<img src="http://feeds.feedburner.com/~r/crossbrowser/~4/zn-9trbhfUo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.crossbrowser.net/376/what-is-dropbox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.crossbrowser.net/376/what-is-dropbox/</feedburner:origLink></item>
		<item>
		<title>Blaming never solved anything</title>
		<link>http://feedproxy.google.com/~r/crossbrowser/~3/RAmIP32109E/</link>
		<comments>http://www.crossbrowser.net/370/blaming-never-solved-anything/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 12:50:12 +0000</pubDate>
		<dc:creator>Michel Billard</dc:creator>
				<category><![CDATA[Self Improvement Tips]]></category>
		<category><![CDATA[errors]]></category>
		<category><![CDATA[mistakes]]></category>
		<category><![CDATA[problems]]></category>

		<guid isPermaLink="false">http://www.crossbrowser.net/?p=370</guid>
		<description><![CDATA[Many individuals make the mistake of trying to find the culprit before fixing the error whenever a problem arises. There are several ways to deal with a problem when it comes up and the first step is always to fix it. Maybe you can fix it yourself or maybe you can ask someone else. If [...]]]></description>
			<content:encoded><![CDATA[<p>Many individuals make the mistake of trying to find the culprit before fixing the error whenever a problem arises. There are several ways to deal with a problem when it comes up and the first step is always to fix it. Maybe you can fix it yourself or maybe you can ask someone else. If finding the perpetrator is quick, go ahead and ask him to fix the problem himself, but don&#8217;t get mad at him yet, it will only put additional pressure on his shoulders and make him more likely to make more mistakes.</p>
<p>Once the problem is fixed, it&#8217;s time to review the problem and find out what went wrong so that it doesn&#8217;t happen again. Every mistake is an opportunity to learn. Maybe a single person was responsible for the error, but no one else caught it either. Is there some way to make it impossible to repeat the error? Do you do enough testing (automatic or manual)? Do you do any kind of reviewing? Or do you simply tell your people to be extra careful?</p>
<p><strong>Don&#8217;t let people the opportunity of making mistakes</strong> and they won&#8217;t, otherwise you&#8217;re just as guilty.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-371" title="Quote about making mistakes" src="http://www.crossbrowser.net/wp-content/uploads/2010/02/making-mistakes.jpg" alt="" width="360" height="230" /></p>
<img src="http://feeds.feedburner.com/~r/crossbrowser/~4/RAmIP32109E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.crossbrowser.net/370/blaming-never-solved-anything/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.crossbrowser.net/370/blaming-never-solved-anything/</feedburner:origLink></item>
		<item>
		<title>Persisting information across requests</title>
		<link>http://feedproxy.google.com/~r/crossbrowser/~3/xt4TlmoUmJQ/</link>
		<comments>http://www.crossbrowser.net/363/persisting-information-across-requests/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 13:00:48 +0000</pubDate>
		<dc:creator>Michel Billard</dc:creator>
				<category><![CDATA[Web Engineering]]></category>

		<guid isPermaLink="false">http://www.crossbrowser.net/?p=363</guid>
		<description><![CDATA[Fact: The web is stateless. The World Wide Web, on the other hand, is intrinsically stateless because each request for a new Web page is processed without any knowledge of previous pages requested. This is one of the chief drawbacks to the HTTP protocol. Because maintaining state is extremely useful, programmers have developed a number [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Fact:</strong> The web is stateless.</p>
<blockquote><p>The World Wide Web, on the other hand, is intrinsically stateless because each request for a new Web page is processed without any knowledge of previous pages requested. This is one of the chief drawbacks to the HTTP protocol. Because maintaining state is extremely useful, programmers have developed a number of techniques to add state to the World Wide Web. These include server APIs, such as NSAPI and ISAPI, and the use of cookies.</p>
<p>Source: <a title="Definition of stateless at Webopedia" href="http://www.webopedia.com/TERM/S/stateless.html">Webopedia</a></p></blockquote>
<p>As &#8220;maintaining state is extremely useful&#8221;, there are plenty of ways to maintain the state across requests.</p>
<h3>An introduction to states in a web environment</h3>
<p>However, you have to be careful how you do it because there are many ways that a request can be done. The most common are:</p>
<ul>
<li>A direct GET request through a bookmark or an URL entered directly in the address bar</li>
<li>A GET request coming from an external web site (this is essentially the same as a direct request in terms of state: there&#8217;s no previous state)</li>
<li>A GET request coming from an internal page of your web site</li>
<li>A POST request. These usually come from an internal page of your web site, but <a title="Wikipedia's article about cross-site request forgery" href="http://en.wikipedia.org/wiki/Cross-site_request_forgery">you can&#8217;t count on it</a></li>
</ul>
<p>In the case of a GET request coming from an internal page, there&#8217;s also the possibility that a new tab was requested, making the originating tab a valid state. If you&#8217;ve ever seen a revision graph (<a title="My post about revision control" href="http://www.crossbrowser.net/42/learn-revision-control-its-good-for-you/">I sure hope you have</a>), a state graph would be quite similar.</p>
<div id="attachment_364" class="wp-caption aligncenter" style="width: 442px"><a href="http://www.crossbrowser.net/wp-content/uploads/2010/02/StateGraph.gif"><img class="size-full wp-image-364" title="State Graph" src="http://www.crossbrowser.net/wp-content/uploads/2010/02/StateGraph.gif" alt="" width="432" height="145" /></a><p class="wp-caption-text">Taken from the Branching and Merging Primer at MSDN</p></div>
<div id="attachment_365" class="wp-caption aligncenter" style="width: 442px"><img class="size-full wp-image-365  " title="State Graph" src="http://www.crossbrowser.net/wp-content/uploads/2010/02/StateGraph.png" alt="" width="432" height="145" /><p class="wp-caption-text">The same graph adapted for a state graph</p></div>
<p>The merging is not exactly present as in the revision graph, but it&#8217;s there. In fact, an opened tab/window could have an effect on any other tab, not only its parent. Let&#8217;s say the user opened a tab from a listing of items to edit a particular item. It modifies the item and saves it. The next state in the listing would reflect (ideally) the modifications to the item.</p>
<h3>Maintaining the state</h3>
<p>Now that you are more familiar with the state in a web environment, let&#8217;s get to the point: how to persist information across requests. From the discussion above, we can extract two key points:</p>
<ul>
<li>Never assume the request comes from an existing state, always check if a state existed before</li>
<li>Never modify a state directly, always make a copy (in case of tabs)</li>
</ul>
<p>Most web frameworks (if not all) offer one or more ways of maintaining the state. Most of them rely on the good old cookies, but you have to be careful with those because you don&#8217;t want to change an existing valid state.</p>
<p>You could also use a session identifier, but you can&#8217;t always rely on them because different browsers treat sessions differently. Firefox and IE both consider that each tab is in the same session as the originating tab while Chrome considers them differently, it treats each tab as a new window (which is a different session for every browser).</p>
<p>Another (very ugly) way, is to simply pass an identifier (usually a Guid) in the URL all the time. However, you can&#8217;t assume that the user just won&#8217;t delete the <em>?SessionID=&#8230; </em>part from your URL before performing a request.</p>
<p>Finally, the Asp.Net WebForms framework simulates a stateful application by wrapping everything in a single form field and doing everything by using post backs (POST requests). A post back does not allow new tabs so it&#8217;s safe to just change the originating state.  It also makes something clear, every GET request is considered a new entry point and does not rely on the previous state to perform the actions.</p>
<h3>Cleaning unused states</h3>
<p>Persisting all those states can make a dent on your memory usage, that&#8217;s why you&#8217;d want to remove unused (closed tabs/windows) states from the graph. To do so, I suggest that you implement some sort of keep-alive object that sends Ajax request to keep the state of the page alive every <em>x</em> seconds. Once the requests stop coming, you can safely delete a state*.</p>
<p>* I haven&#8217;t explored the possibility of resurrecting a tab (via undo close tab), this might be an issue and a reason to never delete a state until the user session is dead.</p>
<h3>Conclusion</h3>
<p>Stateless programming is not a problem easily solved and thoughtful thinking is required before using any of the solutions presented above.</p>
<img src="http://feeds.feedburner.com/~r/crossbrowser/~4/xt4TlmoUmJQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.crossbrowser.net/363/persisting-information-across-requests/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.crossbrowser.net/363/persisting-information-across-requests/</feedburner:origLink></item>
		<item>
		<title>My experience with web hosting</title>
		<link>http://feedproxy.google.com/~r/crossbrowser/~3/wmyVt6XmhIc/</link>
		<comments>http://www.crossbrowser.net/357/my-experience-with-web-hosting/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 13:00:43 +0000</pubDate>
		<dc:creator>Michel Billard</dc:creator>
				<category><![CDATA[Out of Scope]]></category>
		<category><![CDATA[A Small Orange]]></category>
		<category><![CDATA[DreamHost]]></category>
		<category><![CDATA[FatCow]]></category>
		<category><![CDATA[GoDaddy]]></category>
		<category><![CDATA[NearlyFreeSpeech.NET]]></category>
		<category><![CDATA[web host]]></category>
		<category><![CDATA[web hosting]]></category>
		<category><![CDATA[WebFaction]]></category>

		<guid isPermaLink="false">http://www.crossbrowser.net/?p=357</guid>
		<description><![CDATA[I recently decided to change my hosting provider. I didn&#8217;t really need to move, but as with everything, you don&#8217;t really know if something better is out there until you actually go search for it. I first noticed how saturated the hosting market is, there are tons of available hosting and you never know which [...]]]></description>
			<content:encoded><![CDATA[<p>I recently decided to change my hosting provider. I didn&#8217;t really need to move, but as with everything, you don&#8217;t really know if something better is out there until you actually go search for it. I first noticed how saturated the hosting market is, there are tons of available hosting and you never know which reviews you can trust and which are simply marketing attempts.</p>
<h3>My needs</h3>
<p>The first thing to do when looking for a web host is identifying your own needs. Some hosts are better for low traffic web sites while others are better for high traffic/bandwidth requirements. I only need to host a couple of blogs with very little traffic.</p>
<p>Among the plethora of options available, a few seemed a bit better (and more trustworthy):</p>
<ul>
<li>A Small Orange</li>
<li>DreamHost</li>
<li>FatCow</li>
<li>GoDaddy</li>
<li>NearlyFreeSpeech</li>
<li>WebFaction</li>
</ul>
<h3>My experience with the hosts</h3>
<h4>GoDaddy</h4>
<p>I used to be with GoDaddy because I didn&#8217;t know any better. The price is definitely on the lower end and offered everything I need. The administration panel is also one of the best I&#8217;ve seen. The only complain I had was the performance; Loading any of my blogs was too slow for my taste.</p>
<h4>FatCow</h4>
<p><a href="http://www.fatcow.com"><img class="alignright size-full wp-image-358" title="FatCow logo" src="http://www.crossbrowser.net/wp-content/uploads/2010/02/logo_fatcow.gif" alt="" width="123" height="70" /></a>The first contender I seriously considered was FatCow, it was recommended to me and they claim that they are 100% wind powered (they actually buy Renewable Energy Certificates (RECs) to offset their energy use. The reviews online were more positive than for the average hosting company so I went with it.</p>
<p>I&#8217;ll just start with saying that I didn&#8217;t even last a day. In fact, I couldn&#8217;t even purchase a hosting account on my own, I had to go through a support agent via a live chat (nice!) to set-up my account (first red flag). The whole administration admin is a mess, the options are not always shown for no reason, the navigation menu won&#8217;t load most of the time, etc. (second red flag). I decided to still go through and try to set-up one of my blogs to see how FatCow performs. Well, I couldn&#8217;t even import my data, their phpMyAdmin installation wouldn&#8217;t even run my SQL import scripts and wouldn&#8217;t tell me why. That&#8217;s when I pulled the plug and cancelled my account.</p>
<p>They have excellent support (even though I suspect they use bots for most support tasks), but they lack a decent hosting service.</p>
<h4>A Small Orange, DreamHost and WebFaction</h4>
<p><a href="http://www.asmallorange.com"><img class="alignright size-full wp-image-359" title="A Small Orange logo" src="http://www.crossbrowser.net/wp-content/uploads/2010/02/asmallorangelogo.png" alt="" width="263" height="50" /></a>I didn&#8217;t try those three because they didn&#8217;t match my needs, but they all were highly recommended to me. <a title="A Small Orange homepage" href="http://www.asmallorange.com/">A Small Orange</a> has a unique 25$/year plan for very small hosting needs (perfect if you have just one or two small websites). <a title="DreamHost homepage" href="http://www.dreamhost.com/">DreamHost</a> offers something quite similar to GoDaddy without being GoDaddy. Finally, <a title="WebFaction hosting homepage" href="http://www.webfaction.com/">WebFaction</a> costs a little more than others but seems to offer much better quality hosting. The only reason I didn&#8217;t go with them is because they offer more than what I need and I didn&#8217;t want to pay for something I don&#8217;t need. If my needs ever grow, I&#8217;ll definitely consider them.</p>
<h4>NearlyFreeSpeech</h4>
<p><a href="http://www.nearlyfreespeech.net"><img class="alignright size-full wp-image-360" title="NearlyFreeSpeech logo" src="http://www.crossbrowser.net/wp-content/uploads/2010/02/NearlyFreeSpeechLogo.gif" alt="" width="278" height="80" /></a>I just said that I didn&#8217;t want to pay for something I don&#8217;t need, well NearlyFreeSpeech was the perfect choice for me and was very highly recommended by many. Unlike most web hosting company, there is no contract, you simply <a title="Hosting services by NearlyFreeSpeech.NET" href="https://www.nearlyfreespeech.net/services/hosting">pay for what you use</a> (there&#8217;s even a <a title="NearlyFreeSpeech.NET price estimator" href="https://www.nearlyfreespeech.net/estimate">pricing estimator</a>). If your needs are small, it&#8217;s going to cost you a lot less than at GoDaddy for a much better host. They don&#8217;t offer free support, but their FAQs are well written and I haven&#8217;t needed more than what was in there. I wouldn&#8217;t recommend this to someone not familiar with hosting, but for anyone who has a little knowledge of hosting, this is a great host. You can even play around their administration panels for free because you don&#8217;t have to purchase anything to create an account.</p>
<p>The way they charge you for your usage is that they take money from a bucket of money that you set up. For example, you could add 10$ to your account and NearlyFreeSpeech will substract the money from that amount. You can set-up alerts at certain amounts to be notified when you need to add more money.</p>
<p>They are missing one feature that I would&#8217;ve liked: support for Ruby applications. I don&#8217;t actually know Ruby, but it&#8217;s something I&#8217;m interested in learning. If I ever decide to do so, then it&#8217;ll be time to look for a new host which is going to be easy since I&#8217;m not on contract with anyone.</p>
<h3>Wrap up</h3>
<p>I&#8217;m a little saddened that the search for a reliable web host is so difficult. I would&#8217;ve thought that by now a few web hosts would have made their mark, but this is still a field where there are mostly small players and none of them is standing way above the crowd.</p>
<p>Identify your needs and do your research.</p>
<p><strong>Read more:</strong></p>
<ul>
<li><a title="Reddit discussion about web hosts" href="http://www.reddit.com/r/web_design/comments/asmjr/everyone_says_godaddy_sucks_but_i_cant_seem_to_be/">The reddit discussion that helped me choose my host</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/crossbrowser/~4/wmyVt6XmhIc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.crossbrowser.net/357/my-experience-with-web-hosting/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.crossbrowser.net/357/my-experience-with-web-hosting/</feedburner:origLink></item>
		<item>
		<title>Synergy in software</title>
		<link>http://feedproxy.google.com/~r/crossbrowser/~3/ytyGh6MtBrc/</link>
		<comments>http://www.crossbrowser.net/352/synergy-in-software/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 13:00:21 +0000</pubDate>
		<dc:creator>Michel Billard</dc:creator>
				<category><![CDATA[Software Engineering]]></category>

		<guid isPermaLink="false">http://www.crossbrowser.net/?p=352</guid>
		<description><![CDATA[synergy is when different entities cooperate advantageously for a final outcome. Simply defined, it means that the effect of the whole is greater than the sum of the effects of the individual parts. In software, that means that multiple programs or tools work together to accomplish something that wouldn&#8217;t have been possible if each program [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><a title="Synergy article on Wikipedia" href="http://en.wikipedia.org/wiki/Synergy" target="_blank"><strong>synergy</strong></a> is when different entities cooperate advantageously for a final outcome. Simply defined, it means that the effect of the whole is greater than the <em>sum</em> of the effects of the individual parts.</p></blockquote>
<p>In software, that means that multiple programs or tools work together to accomplish something that wouldn&#8217;t have been possible if each program had been used individually.</p>
<h3>My experience with synergy</h3>
<p>For the past few days, I&#8217;ve been working on tools to simplify our release process and help us trouble shoot eventual issues. First, I implemented a system diagnostics page: a page giving us information about the current state of the application. One important thing it gives us is the version of every assembly used by our application. This brings me to the second tool: a version updater. This tool automatically updates the version number after a commit in subversion. So whenever we release some code, it has its own unique version number.</p>
<p>The two used together give us an always up-to-date diagnostics page that we can really use. Without the automatic version updater, the diagnostics page would always tell us the same versions are loaded even though the assemblies would be different. And without the diagnostics page, the version number wouldn&#8217;t have been as useful. Now that we have both, they&#8217;re immensely useful.</p>
<p>On top of those two, we also have an automatic build system. We really believe in the second point of <a title="The Joel Test: 12 Steps to Better Code" href="http://www.joelonsoftware.com/articles/fog0000000043.html" target="_blank">The Joel Test</a>:</p>
<blockquote><p>2. Can you make a build in one step?</p></blockquote>
<p>We can in zero steps (simply committing in the right branch which is part of our normal process anyway) and we even have a release package built automatically ready to be sent to the client.</p>
<h3>Synergy is everywhere</h3>
<p>You may not be aware, but software synergy is omnipresent. Every day you use a multitude of applications that you use for one goal: creating software. You use an OS, one or more browsers, an IDE, a versioning system, a database manager, a text editor, etc. Without one or the other, making software would be much more difficult and a lot more boring.</p>
<img src="http://feeds.feedburner.com/~r/crossbrowser/~4/ytyGh6MtBrc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.crossbrowser.net/352/synergy-in-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.crossbrowser.net/352/synergy-in-software/</feedburner:origLink></item>
		<item>
		<title>Analyze what you read, never assume it’s the truth</title>
		<link>http://feedproxy.google.com/~r/crossbrowser/~3/PI93Wh-rHkU/</link>
		<comments>http://www.crossbrowser.net/348/analyze-what-you-read-never-assume-its-the-truth/#comments</comments>
		<pubDate>Sun, 13 Dec 2009 13:33:24 +0000</pubDate>
		<dc:creator>Michel Billard</dc:creator>
				<category><![CDATA[Self Improvement Tips]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[blogging]]></category>
		<category><![CDATA[Coding Horror]]></category>
		<category><![CDATA[Jeff Atwood]]></category>
		<category><![CDATA[Joel Spolsky]]></category>
		<category><![CDATA[Stack Overflow]]></category>

		<guid isPermaLink="false">http://www.crossbrowser.net/?p=348</guid>
		<description><![CDATA[A recent event which lead to the loss of ALL the data for the popular programming blog Coding Horror and Stack Overflow blog brought up an interesting discussion over at reddit. The discussion talks about whether Jeff Atwood and Joel Spolsky (co-founder of Stack Overflow) really are the gurus some people think they are or [...]]]></description>
			<content:encoded><![CDATA[<p>A recent event which lead to the loss of ALL the data for the popular programming blog <a title="The Coding Horror blog" href="http://www.codinghorror.com/blog/" target="_blank">Coding Horror</a> and <a title="The Stack Overflow blog" href="http://blog.stackoverflow.com/" target="_blank">Stack Overflow blog</a> brought up an <a title="Reddit discussion about whether Jeff Atwood and Joel Spolsky are really the gurus people think they are" href="http://www.reddit.com/r/programming/comments/adwkq/is_it_just_me_or_do_people_think_gurus_jeff/" target="_blank">interesting discussion over at reddit</a>. The discussion talks about whether Jeff Atwood and Joel Spolsky (co-founder of Stack Overflow) really are the gurus some people think they are or if they are just average people talking like they&#8217;re the best. The idea behind this question is that since those two &#8220;gurus&#8221; <a title="Post about the backup policies for the blogs" href="http://blog.stackoverflow.com/2009/12/blog-outage-backup-policies/" target="_blank">failed to have a working backup strategy</a> for those two blogs (Spolsky hardly has anything to do with any of that though, it&#8217;s all Jeff Atwood&#8217;s fault in this case) how can they be considered gurus.</p>
<p>If you&#8217;ve been reading Coding Horror for a little while, you might remember that the blog had been labeled &#8220;<a title="Post about the world's most dangerous blog" href="http://www.codinghorror.com/blog/archives/001178.html" target="_blank">the world&#8217;s most dangerous programming blog</a>&#8221; by some reddit commenter (I couldn&#8217;t find the link). Jeff responded by saying that you should always read critically. That&#8217;s easy to say, but Jeff has the bad habit of taking one side and rejecting the alternatives, <strong>he&#8217;s always black or white</strong>, he has no middle ground. This is one way of blogging and it has worked wonderfully for him, it provokes reactions all the times and he likes that.</p>
<h3>So, is Jeff Atwood really incompetent?</h3>
<p>I don&#8217;t think so, I just think his blogging style is not understood by many. Jeff Atwood (and Joel Spolsky) are both highly experienced professionals in the programming world (though Spolsky hardly has anything to do with programming anymore) and they have something to show for it: Stack Overflow (while suffering from the programmer interface syndrome) is a wonderful web site that has helped millions of programmers already (including myself, Jeff himself and most likely you too).</p>
<p>So why did he experience the data loss and how can he write things that mislead fellow programmers? First of all, he&#8217;s human, so he&#8217;s prone to make mistakes. Secondly, as I said earlier, Jeff has no middle ground because he understands that if everyone agrees with you, you&#8217;re boring and not worth reading.</p>
<p>Blog post after blog post, he manages to pass through the filter in his brain that stops most of us from posting, he dares post an unfinished/under-researched post. Then, his hundreds of thousands of readers analyze his post and correct him, making him learn a lot more than if he had refrained himself from posting. Both him and Joel Spolsky are really good at sharing their experiences and we all got better at our profession by reading those articles.</p>
<p>So <strong>don&#8217;t follow blindly, always keep a critical eye open for flaws</strong> in any blogger&#8217;s judgment. Take what&#8217;s useful for you and forget the rest, never assume someone&#8217;s right without actually thinking about what&#8217;s written and why it was written.</p>
<img src="http://feeds.feedburner.com/~r/crossbrowser/~4/PI93Wh-rHkU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.crossbrowser.net/348/analyze-what-you-read-never-assume-its-the-truth/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.crossbrowser.net/348/analyze-what-you-read-never-assume-its-the-truth/</feedburner:origLink></item>
	</channel>
</rss><!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
