<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Claus Conrad &#187; Development</title>
	<atom:link href="http://www.clausconrad.com/blog/category/howto/development/feed" rel="self" type="application/rss+xml" />
	<link>http://www.clausconrad.com</link>
	<description></description>
	<lastBuildDate>Sat, 15 Oct 2011 10:50:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Why don&#8217;t browsers ship with jQuery?</title>
		<link>http://www.clausconrad.com/blog/why-dont-browsers-ship-with-jquery</link>
		<comments>http://www.clausconrad.com/blog/why-dont-browsers-ship-with-jquery#comments</comments>
		<pubDate>Fri, 18 Mar 2011 11:21:52 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.clausconrad.com/?p=403</guid>
		<description><![CDATA[This is really not so much a blog entry as it is a question&#8230; why don&#8217;t browsers &#8220;ship&#8221; with jQuery and other common frameworks? Years ago, browser vendors competed over JavaScript engine features, nowadays they compete over JavaScript engine performance. Thanks to cross-browser frameworks (with jQuery being the most prominent) features and compatibility are no [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>This is really not so much a blog entry as it is a question&#8230; why don&#8217;t browsers &#8220;ship&#8221; with jQuery and other common frameworks?</p>
<p>Years ago, browser vendors competed over JavaScript engine features, nowadays they compete over JavaScript engine performance. Thanks to cross-browser frameworks (with jQuery being the most prominent) features and compatibility are no longer an issue. Isn&#8217;t it time for browser vendors to compete on features such as pre-loading different JS framework versions and replacing remote loads of these with already cached versions?</p>
<p>In the meantime, I hope every web developer sticks to a CDN-hosted version of these libraries. The <a href="http://code.google.com/apis/libraries/devguide.html">Google Libraries API</a> is a well-known jQuery host by now, but Microsoft also hosts a couple of libraries for you at their <a href="http://www.asp.net/ajaxLibrary/CDN.ashx">ASP.NET CDN</a>. Beware though that using one of these CDN&#8217;s just for one or two requests might result in yet another DNS query upon loading your site. To me, the caching advantage is worth it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.clausconrad.com/blog/why-dont-browsers-ship-with-jquery/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>List of source code hosting services</title>
		<link>http://www.clausconrad.com/blog/list-of-source-code-hosting-services</link>
		<comments>http://www.clausconrad.com/blog/list-of-source-code-hosting-services#comments</comments>
		<pubDate>Mon, 28 Feb 2011 20:04:48 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[lists]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[services]]></category>

		<guid isPermaLink="false">http://www.clausconrad.com/?p=396</guid>
		<description><![CDATA[All services in this list offer free source code hosting to open-source projects, and some also have free starter plans available. Name Supported VCS Other features Notes Assembla Subversion, Git, Mercurial Wiki, Issue tracking Bitbucket Mercurial Wiki, Issue tracking CodePlex Mercurial, Subversion, Team Foundation Server Wiki, Issue tracking Open-source only Github Git Wiki, Issue tracking, [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>All services in this list offer free source code hosting to open-source projects, and some also have free starter plans available.</p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Supported VCS</th>
<th>Other features</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="http://www.assembla.com/">Assembla</a></td>
<td>Subversion, Git, Mercurial</td>
<td>Wiki, Issue tracking</td>
<td></td>
</tr>
<tr>
<td><a href="http://www.bitbucket.org/">Bitbucket</a></td>
<td>Mercurial</td>
<td>Wiki, Issue tracking</td>
<td></td>
</tr>
<tr>
<td><a href="http://www.codeplex.com/">CodePlex</a></td>
<td>Mercurial, Subversion, Team Foundation Server</td>
<td>Wiki, Issue tracking</td>
<td>Open-source only</td>
</tr>
<tr>
<td><a href="http://www.github.com/">Github</a></td>
<td>Git</td>
<td>Wiki, Issue tracking, Code review</td>
<td></td>
</tr>
<tr>
<td><a href="http://code.google.com/hosting/">Google Code</a></td>
<td>Subversion, Mercurial</td>
<td>Wiki, Issue tracking</td>
<td>Open-source only</td>
</tr>
<tr>
<td><a href="http://www.kilnhg.com/">Kiln</a></td>
<td>Mercurial</td>
<td>Wiki*, Issue tracking*, Code review*</td>
<td>* through integration with FogBugz</td>
</tr>
<tr>
<td><a href="http://sourceforge.net/">SourceForge</a></td>
<td>Subversion, Git, Mercurial</td>
<td>Wiki, Issue tracking, Forums</td>
<td>Open-source only</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.clausconrad.com/blog/list-of-source-code-hosting-services/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Debugging Pyramid with PyCharm</title>
		<link>http://www.clausconrad.com/blog/debugging-pyramid-with-pycharm</link>
		<comments>http://www.clausconrad.com/blog/debugging-pyramid-with-pycharm#comments</comments>
		<pubDate>Sun, 30 Jan 2011 18:45:10 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[pycharm]]></category>
		<category><![CDATA[pyramid]]></category>

		<guid isPermaLink="false">http://www.clausconrad.com/?p=373</guid>
		<description><![CDATA[I recently came across the PyCharm IDE and almost instantly fell in love. PyCharm is made by JetBrains, the developers of IntelliJ IDEA and ReSharper &#8211; these guys have proven their ability to create full-featured, developer-friendly IDEs in the past and its obvious they used their knowledge to create PyCharm, too. While PyCharm supports Django [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>I recently came across the PyCharm IDE and almost instantly fell in love.</p>
<p>PyCharm is made by JetBrains, the developers of IntelliJ IDEA and ReSharper &#8211; these guys have proven their ability to create full-featured, developer-friendly IDEs in the past and its obvious they used their knowledge to create PyCharm, too.</p>
<p>While PyCharm supports Django and GAE out of the box, it can certainly be used for other frameworks. Sean has written some excellent <a href="http://byatool.com/python/how-to-debug-pylons-with-pycharm/">instructions to debug Pylons with PyCharm</a> and the steps required to debug Pyramid are exactly the same:</p>
<ol>
<li>Click &#8220;Run&#8221; &gt; &#8220;Edit Configurations&#8221;</li>
<li>Press &#8220;Insert&#8221; and choose &#8220;Python&#8221;</li>
<li>Give the configuration a name, e. g. <em>Pyramid</em></li>
<li>Insert the script to <em>paster</em>:<br /><code>C:\Python27\Scripts\paster-script.py</code></li>
<li>Insert the script parameters WITHOUT <em>&#8211;reload</em>:<br /><code>serve C:\path\to\development.ini</code></li>
<li>Choose the right Python interpreter from the dropdown</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.clausconrad.com/blog/debugging-pyramid-with-pycharm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CommunityServer 2008.5 Blogs API reference</title>
		<link>http://www.clausconrad.com/blog/communityserver-2008-5-blogs-api-reference</link>
		<comments>http://www.clausconrad.com/blog/communityserver-2008-5-blogs-api-reference#comments</comments>
		<pubDate>Mon, 18 Oct 2010 16:39:10 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[communityserver]]></category>

		<guid isPermaLink="false">http://www.clausconrad.com/?p=332</guid>
		<description><![CDATA[Some details about the blog API in CommunityServer 2008. Blogs GET /api/blogs.ashx/blogs/ Returns a paged list of all blogs visible to the current user. Response Status: 200 OK &#60;BlogList&#62; &#60;Blog&#62; ... &#60;/Blog&#62; ...&#60;/BlogList&#62; Parameters PageSize Integer Number of blogs per page Optional PageIndex Integer Page number Optional GET /api/blogs.ashx/blogs/{blogId} Returns data about a specific blog. [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Some details about the blog API in CommunityServer 2008.</p>
<h3>Blogs</h3>
<h4><strong>GET /api/blogs.ashx/blogs/</strong></h4>
<p>Returns a paged list of all blogs visible to the current user.</p>
<h4>Response</h4>
<pre>Status: 200 OK &lt;BlogList&gt;  &lt;Blog&gt;    ...   &lt;/Blog&gt;  ...&lt;/BlogList&gt;</pre>
<h4>Parameters</h4>
<table border="1">
<tr>
<td>PageSize</td>
<td>Integer</td>
<td>Number of blogs per page</td>
<td>Optional</td>
</tr>
<tr>
<td>PageIndex</td>
<td>Integer</td>
<td>Page number</td>
<td>Optional</td>
</tr>
</table>
<h4><strong>GET /api/blogs.ashx/blogs/</strong>{blogId}</h4>
<p>Returns data about a specific blog.</p>
<h4>Response</h4>
<pre>Status: 200 OK  &lt;Blog&gt;    ...   &lt;/Blog&gt;
</pre>
<h4><strong>GET /api/blogs.ashx/blogs/</strong>{blogKey}</h4>
<p>Returns data about a specific blog.</p>
<h4>Response</h4>
<pre>Status: 200 OK  &lt;Blog&gt;    ...   &lt;/Blog&gt;
</pre>
<h4><strong>GET /api/blogs.ashx/blogs/</strong>{blogQuery}</h4>
<p>Returns a paged list of blogs matching the query parameter(s) visible to the current user.</p>
<h4>Response</h4>
<pre>Status: 200 OK &lt;BlogList&gt;  &lt;Blog&gt;    ...   &lt;/Blog&gt;  ...&lt;/BlogList&gt;
</pre>
<h4>Parameters</h4>
<table border="1">
<tr>
<td>Name</td>
<td>String</td>
<td>Name or part of the name of the blog. Wildcard character is &quot;%&quot;.</td>
<td>Optional</td>
</tr>
<tr>
<td>IsActive</td>
<td>Boolean</td>
<td>Whether the blog is active</td>
<td>Optional</td>
</tr>
<tr>
<td>AccessLevel</td>
<td>Enum</td>
<td>&quot;View&quot;, &quot;Post&quot;</td>
<td>Optional</td>
</tr>
<tr>
<td>Ids</td>
<td>Integer[]</td>
<td>Comma-separated list of blog IDs.</td>
<td>Optional</td>
</tr>
<tr>
<td>Keys</td>
<td>String[]</td>
<td>Comma-separated list of blog keys.</td>
<td>Optional</td>
</tr>
<tr>
<td>GroupIDs</td>
<td>Integer[]</td>
<td>Comma-separated list of blog group IDs</td>
<td>Optional</td>
</tr>
<tr>
<td>SortBy</td>
<td>String</td>
<td>Can be set to &quot;Name&quot;, &quot;LastPost&quot;, &quot;Post&quot;, &quot;SortOrder&quot; or &quot;Thread&quot;</td>
<td>Optional</td>
</tr>
<tr>
<td>Order</td>
<td>String</td>
<td>The sort order for the &quot;SortBy&quot; parameter. Can be set to &quot;Ascending&quot; or &quot;Descending&quot;.</td>
<td>Optional</td>
</tr>
<tr>
<td>PageSize</td>
<td>Integer</td>
<td>Number of blogs per page</td>
<td>Optional</td>
</tr>
<tr>
<td>PageIndex</td>
<td>Integer</td>
<td>Page number</td>
<td>Optional</td>
</tr>
</table>
<h4><strong>GET /api/blogs.ashx/blogs/</strong>{blogId}/members</h4>
<p>Returns a list of members of the specified blog.</p>
<h4>Response</h4>
<pre>Status: 200 OK &lt;MembershipList&gt;  &lt;Member&gt;    ...   &lt;/Member&gt;  ...&lt;/MembershipList&gt;
</pre>
<h4>GET /api/blogs.ashx/blogs/{blogId}/members/{userId}</h4>
<p>Returns the specified member of the specified blog.</p>
<h4>Response</h4>
<pre>Status: 200 OK  &lt;Member&gt;    ...   &lt;/Member&gt;</pre>
<h4>GET /api/blogs.ashx/blogs/{blogId}/posts</h4>
<p>Returns a paged list of posts in the specified blog.</p>
<h4>Response</h4>
<pre>Status: 200 OK &lt;BlogPostList&gt;  &lt;BlogPost&gt;    ...   &lt;/BlogPost&gt;  ...&lt;/BlogPostList&gt;
</pre>
<h4>Parameters</h4>
<table border="1">
<tr>
<td>PageSize</td>
<td>Integer</td>
<td>Number of posts per page</td>
<td>Optional</td>
</tr>
<tr>
<td>PageIndex</td>
<td>Integer</td>
<td>Page number</td>
<td>Optional</td>
</tr>
</table>
<h4>GET /api/blogs.ashx/blogs/{blogId}/posts/{blogPostId}</h4>
<p>Returns the specified post in the specified blog.</p>
<h4>Response</h4>
<pre>Status: 200 OK  &lt;BlogPost&gt;    ...   &lt;/BlogPost&gt;
</pre>
<h4>GET /api/blogs.ashx/blogs/{blogId}/posts/{blogPostId}/comments</h4>
<p>Returns a paged list of comments for the specified post in the specified blog.</p>
<h4>Response</h4>
<pre>Status: 200 OK &lt;CommentList&gt;  &lt;Comment&gt;    ...   &lt;/Comment&gt;  ...&lt;/CommentList&gt;
</pre>
<h4>Parameters</h4>
<table border="1">
<tr>
<td>PageSize</td>
<td>Integer</td>
<td>Number of comments per page</td>
<td>Optional</td>
</tr>
<tr>
<td>PageIndex</td>
<td>Integer</td>
<td>Page number</td>
<td>Optional</td>
</tr>
</table>
<h4>GET /api/blogs.ashx/blogs/{blogId}/posts/{blogPostId}/comments/{blogPostCommentId}</h4>
<p>Returns the specified comment for the specified post in the specified blog.</p>
<h4>Response</h4>
<pre>Status: 200 OK  &lt;Comment&gt;    ...   &lt;/Comment&gt;
</pre>
<h4>GET /api/blogs.ashx/blogs/{blogId}/posts/{blogPostId}/trackbacks</h4>
<p>Returns a paged list of trackbacks for the specified post in the specified blog.</p>
<h4>Response</h4>
<pre>Status: 200 OK &lt;TrackbackList&gt;  &lt;Trackback&gt;    ...   &lt;/Trackback&gt;  ...&lt;/TrackbackList&gt;
</pre>
<h4>Parameters</h4>
<table border="1">
<tr>
<td>PageSize</td>
<td>Integer</td>
<td>Number of trackbacks per page</td>
<td>Optional</td>
</tr>
<tr>
<td>PageIndex</td>
<td>Integer</td>
<td>Page number</td>
<td>Optional</td>
</tr>
</table>
<h4>GET /api/blogs.ashx/blogs/{blogId}/posts/{blogPostId}/trackbacks/{trackbackId}</h4>
<p>Returns the specified trackback for the specified post in the specified blog.</p>
<h4>Response</h4>
<pre>Status: 200 OK  &lt;Trackback&gt;    ...   &lt;/Trackback&gt;
</pre>
<h4>GET /api/blogs.ashx/blogs/{blogId}/posts/{blogPostId}/ratings</h4>
<p>Returns a list of ratings for the specified post in the specified blog.</p>
<h4>Response</h4>
<pre>Status: 200 OK &lt;RatingList Sum=&quot;X&quot; Average=&quot;Y&quot;&gt;  &lt;Rating&gt;    ...   &lt;/Rating&gt;  ...&lt;/RatingList&gt;
</pre>
<h4>GET /api/blogs.ashx/blogs/{blogId}/posts/{blogPostId}/ratings/{username}</h4>
<p>Returns rating by user with {username} for the specified post in the specified blog.</p>
<p>If the user doesn&#8217;t exist or didn&#8217;t rate the post, the whole list of ratings for the specified post is returned!</p>
<h4>Response</h4>
<pre>Status: 200 OK &lt;int&gt;  X&lt;/int&gt;
</pre>
<h3>Blog Posts</h3>
<h4>GET /api/blogs.ashx/posts/{blogPostId}</h4>
<p>Returns the specified post.</p>
<h4>Response</h4>
<pre>Status: 200 OK  &lt;BlogPost&gt;    ...   &lt;/BlogPost&gt;</pre>
<h4><strong>GET /api/blogs.ashx/posts/{blogPostQuery}</strong></h4>
<p>Returns a paged list of posts matching the query parameter(s) visible to the current user.</p>
<h4>Response</h4>
<pre>Status: 200 OK &lt;BlogPostList&gt;  &lt;BlogPost&gt;    ...   &lt;/BlogPost&gt;  ...&lt;/BlogPostList&gt;
</pre>
<h4>Parameters</h4>
<table border="1">
<tr>
<td>IsActive</td>
<td>Boolean</td>
<td>Whether the post is active</td>
<td>Optional</td>
</tr>
<tr>
<td>BlogIds</td>
<td>Integer[]</td>
<td>Comma-separated list of blog IDs.</td>
<td>Optional</td>
</tr>
<tr>
<td>Keywords</td>
<td>String[]</td>
<td>Comma-separated list of keywords. All keywords must be matched.</td>
<td>Optional</td>
</tr>
<tr>
<td>SortBy</td>
<td>String</td>
<td>Can be set to &quot;MostComments&quot;, &quot;MostRecent&quot; or &quot;MostViewed&quot;</td>
<td>Optional</td>
</tr>
<tr>
<td>Order</td>
<td>String</td>
<td>The sort order for the &quot;SortBy&quot; parameter. Can be set to &quot;Ascending&quot; or &quot;Descending&quot;.</td>
<td>Optional</td>
</tr>
<tr>
<td>PageSize</td>
<td>Integer</td>
<td>Number of posts per page</td>
<td>Optional</td>
</tr>
<tr>
<td>PageIndex</td>
<td>Integer</td>
<td>Page number</td>
<td>Optional</td>
</tr>
</table>
<h4>GET /api/blogs.ashx/posts/{blogPostId}/comments</h4>
<p>Returns a paged list of comments for the specified post.</p>
<h4>Response</h4>
<pre>Status: 200 OK &lt;CommentList&gt;  &lt;Comment&gt;    ...   &lt;/Comment&gt;  ...&lt;/CommentList&gt;
</pre>
<h4>Parameters</h4>
<table border="1">
<tr>
<td>PageSize</td>
<td>Integer</td>
<td>Number of comments per page</td>
<td>Optional</td>
</tr>
<tr>
<td>PageIndex</td>
<td>Integer</td>
<td>Page number</td>
<td>Optional</td>
</tr>
</table>
<h4>GET /api/blogs.ashx/posts/{blogPostId}/trackbacks</h4>
<p>Returns a paged list of trackbacks for the specified post.</p>
<h4>Response</h4>
<pre>Status: 200 OK &lt;TrackbackList&gt;  &lt;Trackback&gt;    ...   &lt;/Trackback&gt;  ...&lt;/TrackbackList&gt;
</pre>
<h4>Parameters</h4>
<table border="1">
<tr>
<td>PageSize</td>
<td>Integer</td>
<td>Number of trackbacks per page</td>
<td>Optional</td>
</tr>
<tr>
<td>PageIndex</td>
<td>Integer</td>
<td>Page number</td>
<td>Optional</td>
</tr>
</table>
<h3>Blog Comments</h3>
<h4>GET /api/blogs.ashx/comments/{blogPostCommentId}</h4>
<p>Returns the specified comment.</p>
<h4>Response</h4>
<pre>Status: 200 OK  &lt;Comment&gt;    ...   &lt;/Comment&gt;
</pre>
<h4>
  PUT /api/blogs.ashx/comments/</h4>
<p>Creates the sent comment.</p>
<h4>Request</h4>
<pre>  &lt;Comment&gt;    ...   &lt;/Comment&gt;</pre>
<h4><strong>GET /api/blogs.ashx/comments/{blogPostCommentQuery}</strong></h4>
<p>Returns a paged list of comments matching the query parameter(s) visible to the current user.</p>
<h4>Response</h4>
<pre>Status: 200 OK &lt;CommentList&gt;  &lt;Comment&gt;    ...   &lt;/Comment&gt;  ...&lt;/CommentList&gt;
</pre>
<h4>Parameters</h4>
<table border="1">
<tr>
<td>IsActive</td>
<td>Boolean</td>
<td>Whether the comment is active</td>
<td>Optional</td>
</tr>
<tr>
<td>PostId</td>
<td>Integer</td>
<td>ID of a blog post. If specified, only comments for that post are shown.</td>
<td>Optional</td>
</tr>
<tr>
<td>Keywords</td>
<td>String[]</td>
<td>Comma-separated list of keywords. All keywords must be matched.</td>
<td>Optional</td>
</tr>
<tr>
<td>PageSize</td>
<td>Integer</td>
<td>Number of comments per page</td>
<td>Optional</td>
</tr>
<tr>
<td>PageIndex</td>
<td>Integer</td>
<td>Page number</td>
<td>Optional</td>
</tr>
</table>
<h3>Blog Trackbacks</h3>
<h4>GET /api/blogs.ashx/trackbacks/{trackbackId}</h4>
<p>Returns the specified trackback.</p>
<h4>Response</h4>
<pre>Status: 200 OK  &lt;Trackback&gt;    ...   &lt;/Trackback&gt;</pre>
<h4><strong>GET /api/blogs.ashx/trackbacks/{trackbackQuery}</strong></h4>
<p>Returns a paged list of trackbacks matching the query parameter(s) visible to the current user.</p>
<h4>Response</h4>
<pre>Status: 200 OK &lt;TrackbackList&gt;  &lt;Trackback&gt;    ...   &lt;/Trackback&gt;  ...&lt;/TrackbackList&gt;
</pre>
<h4>Parameters</h4>
<table border="1">
<tr>
<td>PostId</td>
<td>Integer</td>
<td>ID of a blog post. If specified, only trackbacks for that post are shown.</td>
<td>Optional</td>
</tr>
<tr>
<td>Keywords</td>
<td>String[]</td>
<td>Comma-separated list of keywords. All keywords must be matched.</td>
<td>Optional</td>
</tr>
<tr>
<td>PageSize</td>
<td>Integer</td>
<td>Number of trackbacks per page</td>
<td>Optional</td>
</tr>
<tr>
<td>PageIndex</td>
<td>Integer</td>
<td>Page number</td>
<td>Optional</td>
</tr>
</table>
<h3>Blog Groups</h3>
<p><strong>GET /api/blogs.ashx/bloggroups/</strong></p>
<p>Returns a list of all blog groups visible to the current user.</p>
<h4>Response</h4>
<pre>Status: 200 OK &lt;BlogGroupList&gt;  &lt;BlogGroup&gt;    ...   &lt;/BlogGroup&gt;  ...&lt;/BlogGroupList&gt;</pre>
<p><strong>GET /api/blogs.ashx/bloggroups/{blogGroupId}</strong></p>
<p>Returns data about the specified blog group.</p>
<h4>Response</h4>
<pre>Status: 200 OK  &lt;BlogGroup&gt;    ...   &lt;/BlogGroup&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.clausconrad.com/blog/communityserver-2008-5-blogs-api-reference/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lease .NET development tools</title>
		<link>http://www.clausconrad.com/blog/lease-net-development-tools</link>
		<comments>http://www.clausconrad.com/blog/lease-net-development-tools#comments</comments>
		<pubDate>Wed, 02 Jun 2010 13:29:50 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[microsoft]]></category>

		<guid isPermaLink="false">http://www.clausconrad.com/blog/lease-net-development-tools</guid>
		<description><![CDATA[The Microsoft Action Pack Subscription (MAPS) has been a cheap way for very small businesses and self-employed technicians as well as students to get their hands on many of Microsoft&#8217;s software offerings for a small yearly fee. Now the software giant introduced a similar discount for self-employed developers, featuring some of the same software that [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>The Microsoft Action Pack Subscription (MAPS) has been a cheap way for very small businesses and self-employed technicians as well as students to get their hands on many of Microsoft&#8217;s software offerings for a small yearly fee.</p>
<p>Now the software giant introduced a similar discount for self-employed developers, featuring some of the same software that makes up the regular MAPS subscription as well as valuable MSDN subscriptions with Visual Studio and other pricey development tools. The new program called &#8220;Action Pack Development and Design&#8221; is available immediately for web development and design companies through <a href="https://partner.microsoft.com/global/program/40132997">https://partner.microsoft.com/global/program/40132997</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.clausconrad.com/blog/lease-net-development-tools/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thesis customizations I like</title>
		<link>http://www.clausconrad.com/blog/thesis-customizations-i-like</link>
		<comments>http://www.clausconrad.com/blog/thesis-customizations-i-like#comments</comments>
		<pubDate>Mon, 17 May 2010 21:08:29 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[thesis]]></category>

		<guid isPermaLink="false">http://www.clausconrad.com/blog/thesis-customizations-i-like</guid>
		<description><![CDATA[This list contains all the customizations I have made to the Thesis theme, in order to ease upgrading later on. Putting categories before pages in Thesis menu Using Thesis with a WordPress multi-site installation Making post images work with my multi-site installation /wp-content/themes/thesis_17/lib/functions/post_images.php: // BEGIN Claus 20100609 Multi-site // if (@getimagesize($image_path)) { // END Claus [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>This list contains all the customizations I have made to the Thesis theme, in order to ease upgrading later on.</p>
<p><a href="http://fourblogger.com/how-to-put-categories-before-pages-in-thesis-navigation-menu/">Putting categories before pages in Thesis menu</a></p>
<p><a href="http://www.binaryturf.com/using-thesis-theme-with-a-wordpress-multisite-installation">Using Thesis with a WordPress multi-site installation</a></p>
<h2>Making post images work with my multi-site installation</h2>
<p><em>/wp-content/themes/thesis_17/lib/functions/post_images.php</em>:</p>
<p><code>                // BEGIN Claus 20100609 Multi-site<br />
                // if (@getimagesize($image_path)) {<br />
                // END Claus 20100609 Multi-site</p>
<p>                $image['class'] = thesis_get_image_classes($post_image);<br />
                $image['attributes'] = thesis_image_attributes($post_image);</p>
<p>                if ($post_image['alt'] != '')<br />
                        $image['alt'] = $post_image['alt'];<br />
                elseif ($type == 'thumb')<br />
                        $image['alt'] = 'Thumbnail image for ' . get_the_title();<br />
                else<br />
                        $image['alt'] = 'Post image for ' . get_the_title();</p>
<p>                if (is_single() || is_page()) {<br />
                        $open_link = '';<br />
                        $close_link = '';<br />
                }<br />
                else {<br />
                        $open_link = '&lt;a class="post_image_link" href="' . get_permalink() . '" title="Permanent link to ' . get_the_title() . '"&gt;';<br />
                        $close_link = '&lt;/a&gt;';<br />
                }</p>
<p>                $post_image['output'] = $open_link . '&lt;img ' . $image['class'] . $image['attributes'] . ' alt="' . $image['alt'] . '" /&gt;' . $close_link . "\n";<br />
                // BEGIN Claus 20100609 Multi-site<br />
                // }<br />
                // END Claus 20100609 Multi-site</code></p>
<p><em>/wp-content/themes/thesis_17/lib/scripts/thumb.php</em>:</p>
<p><code>// BEGIN Claus 20100610 Multi-site<br />
function cleanSource($src) {<br />
        // remove http/ https/ ftp<br />
        $src = preg_replace("/^((ht|f)tp(s|):\/\/)/i", "", $src);<br />
        // remove domain name from the source url<br />
        $host = $_SERVER["HTTP_HOST"];<br />
        $src = str_replace($host, "", $src);<br />
        $host = str_replace("www.", "", $host);<br />
        $src = str_replace($host, "", $src);</p>
<p>        // don't allow users the ability to use '../'<br />
        // in order to gain access to files below document root<br />
        $src = preg_replace("/\.\.+\//", "", $src);</p>
<p>        // remove slash from start of string<br />
        if (strpos($src, "/") == 0)<br />
                $src = substr($src, -(strlen($src) - 1));</p>
<p>        // remove "files/" from start of string<br />
        if (strpos($src, "files/") == 0)<br />
                $src = substr($src, -(strlen($src) - 6));</p>
<p>        if( !is_multisite() )<br />
                die( 'Multisite support not enabled' );<br />
        ms_file_constants();<br />
        error_reporting( 0 );<br />
        if ( $current_blog->archived == '1' || $current_blog->spam == '1' || $current_blog->deleted == '1' ) {<br />
                // status_header( 404 );<br />
                die( '404 &#8212; File not found.' );<br />
        }<br />
        $src = BLOGUPLOADDIR . str_replace( '..', '', $src);</p>
<p>        return $src;<br />
}<br />
// END Claus 20100610 Multi-site</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.clausconrad.com/blog/thesis-customizations-i-like/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Drop caps in Thesis</title>
		<link>http://www.clausconrad.com/blog/drop-caps-in-thesis</link>
		<comments>http://www.clausconrad.com/blog/drop-caps-in-thesis#comments</comments>
		<pubDate>Mon, 17 May 2010 20:36:14 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[thesis]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.clausconrad.com/?p=258</guid>
		<description><![CDATA[Reading Asnio inspired me to implement drop caps on this blog, and searching for an easy way to add them I came across Miguel&#8217;s post on adding drop caps to all posts in Thesis at once. Apparently, Thesis has a built-in CSS class called &#8220;drop_cap&#8221; that can be manually added to posts. Adding this class [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Reading <a href="http://asnio.com/create-colored-widget-boxes-thesis/">Asnio</a> inspired me to implement drop caps on this blog, and searching for an easy way to add them I came across Miguel&#8217;s post on <a href="http://webhole.net/2009/11/03/thesis-theme-tip-how-to-add-drop-caps-to-all-posts/">adding drop caps to all posts  in Thesis</a> at once.</p>
<p>Apparently, Thesis has a built-in CSS class called &#8220;drop_cap&#8221; that can be manually added to posts. Adding this class to the first letter of posts manually isn&#8217;t a viable solution, Miguel writes, and I couldn&#8217;t agree more &#8211; it&#8217;s prone to be forgotten as well as ugly, because it violates the rule of separation of content and layout.</p>
<p>Miguel&#8217;s suggested solution has the advantage of requiring only a single change and can even be done through the web (assuming one uses the fabulous Thesis theme and OpenHook plugin). I don&#8217;t like the fact that it increases bandwidth on each page though. This could be remedied by including an external CSS file instead of inline CSS in Miguel&#8217;s code, but doing so would increase frontpage loading time and &#8211; unless properly cached &#8211; probably use up even more bandwidth on subsequent page loads.</p>
<p>What I would suggest instead is to add a CSS class such as &#8220;single&#8221; to the <em>&lt;body&gt;</em> element in the hook code (see Miguel&#8217;s post for that) and then target these pages from the regular <em>custom.css</em> file, like this:</p>
<p><code>body.single div.entry-content > p:first-child:first-letter { /* ... */ }</code></p>
<p>Unfortunately I don&#8217;t know how to add a class to the body element programmatically in WordPress, I just assume it is possible judging from my knowledge of other CMS. Thus I came up with this alternate CSS-only solution instead, which works for me:</p>
<p><code>.custom .post:not(.teaser) .entry-content > p:first-child:first-letter{font-size:3.3em;line-height:.76em;padding:.05em .12em 0 0;color:#ccc;float:left}</code></p>
<p>While this snippet has the advantage of not requiring any PHP, it has some other shortcomings one needs to be aware of. Unlike Miguel&#8217;s solution it targets all posts that aren&#8217;t teasers, whether these are on single post pages or not. Second, it uses the CSS3 <em>:not</em> selector, which isn&#8217;t supported in Internet Explorer 8, but works in the current versions of the other 4 major browsers (Firefox, Safari, Chrome and Opera). That&#8217;s okay for my purposes, there&#8217;s no rush (to support IE users), but your mileage may vary.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.clausconrad.com/blog/drop-caps-in-thesis/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Display title and meta description length in Thesis</title>
		<link>http://www.clausconrad.com/blog/display-title-and-meta-description-length-in-thesis</link>
		<comments>http://www.clausconrad.com/blog/display-title-and-meta-description-length-in-thesis#comments</comments>
		<pubDate>Fri, 02 Apr 2010 19:50:23 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[thesis]]></category>

		<guid isPermaLink="false">http://www.clausconrad2.com/?p=65</guid>
		<description><![CDATA[Are you using WordPress, Thesis and Chrome and wish there was a way to count the characters in the title and meta description fields, so you don&#8217;t type more than the search engines will display? Here&#8217;s a quick hack that worked for me: Please note! This requires a current version of Chrome, or Firefox with [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Are you using WordPress, Thesis and Chrome and wish there was a way to count the characters in the title and meta description fields, so you don&#8217;t type more than the search engines will display?</p>
<p>Here&#8217;s a quick hack that worked for me:<br />
<img src="/wp-content/uploads/2010/05/wptmdc1.png" alt="Screenshot" /></p>
<p><strong>Please note!</strong> This requires a current version of Chrome, or Firefox with the Greasemonkey extension. Please leave a comment whether it works for you.</p>
<p>If you want to try it, click the following link:<br />
<a href="/wp-content/uploads/2010/05/wpthesismetadesccounter.user.js">Install user script</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.clausconrad.com/blog/display-title-and-meta-description-length-in-thesis/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Meta description do&#8217;s and don&#8217;ts</title>
		<link>http://www.clausconrad.com/blog/meta-description-dos-and-donts</link>
		<comments>http://www.clausconrad.com/blog/meta-description-dos-and-donts#comments</comments>
		<pubDate>Fri, 02 Apr 2010 16:26:49 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[seo]]></category>

		<guid isPermaLink="false">http://www.clausconrad2.com/?p=70</guid>
		<description><![CDATA[Do: Include your keywords. Write compelling, informative and concise. Describe your content honestly. If there are different sections in the description, identify and separate them clearly. Don&#8217;t: Reuse the same &#8220;boilerplate&#8221; description on several pages. Duplicate information from the page title. Use more than 160 characters. Simply reuse AdWords ads. Write a meta description in [...]]]></description>
			<content:encoded><![CDATA[<p></p><h3>Do:</h3>
<ul>
<li>Include your keywords.</li>
<li>Write compelling, informative and concise.</li>
<li>Describe your content honestly.</li>
<li>If there are different sections in the description, identify and separate them clearly.</li>
</ul>
<h3>Don&#8217;t:</h3>
<ul>
<li>Reuse the same &#8220;boilerplate&#8221; description on several pages.</li>
<li>Duplicate information from the page title.</li>
<li>Use more than 160 characters.</li>
<li>Simply reuse AdWords ads.</li>
<li>Write a meta description in every case. For example, a page listing dozens of blog entries targeting many different keywords might be better of with the SE-generated snippet of text surrounding the users search phrase.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.clausconrad.com/blog/meta-description-dos-and-donts/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Get metadata about MySQL databases</title>
		<link>http://www.clausconrad.com/blog/get-metadata-about-mysql-databases</link>
		<comments>http://www.clausconrad.com/blog/get-metadata-about-mysql-databases#comments</comments>
		<pubDate>Sat, 05 Dec 2009 08:06:07 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.clausconrad2.com/?p=98</guid>
		<description><![CDATA[Just a short reminder for myself&#8230; SHOW DATABASES; SHOW TABLES; SHOW CREATE TRIGGER &#60;trigger-name&#62; SHOW CREATE PROCEDURE &#60;procedure-name&#62;]]></description>
			<content:encoded><![CDATA[<p></p><p>Just a short reminder for myself&#8230;</p>
<p><code>SHOW DATABASES;<br />
SHOW TABLES;<br />
SHOW CREATE TRIGGER &lt;trigger-name&gt;<br />
SHOW CREATE PROCEDURE &lt;procedure-name&gt;</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.clausconrad.com/blog/get-metadata-about-mysql-databases/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Does your CommunityServer have spam profiles?</title>
		<link>http://www.clausconrad.com/blog/does-your-communityserver-have-spam-profiles</link>
		<comments>http://www.clausconrad.com/blog/does-your-communityserver-have-spam-profiles#comments</comments>
		<pubDate>Thu, 03 Dec 2009 19:25:17 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[communityserver]]></category>

		<guid isPermaLink="false">http://www.clausconrad2.com/?p=100</guid>
		<description><![CDATA[If you run a popular web community based on Telligents CommunityServer platform and allow everyone to register without e-mail verification for convenience, spammers are likely to know this too. These user profiles pollute your authority and you probably want to delete them, but first you have to identify them. I found the following query helpful [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>If you run a popular web community based on Telligents CommunityServer platform and allow everyone to register without e-mail verification for convenience, spammers are likely to know this too.</p>
<p>These user profiles pollute your authority and you probably want to delete them, but first you have to identify them. I found the following query helpful for this purpose:</p>
<p><code>SELECT<br />
	U.UserName<br />
FROM<br />
	aspnet_users U<br />
JOIN<br />
	aspnet_profile P<br />
ON<br />
	U.UserID = P.UserID<br />
JOIN<br />
	CS_Users CSU<br />
ON<br />
	CSU.MembershipID = U.UserID<br />
WHERE (<br />
	P.PropertyValuesString LIKE '%&lt;a %&lt;a %&lt;a %&lt;a %&lt;a %&lt;a %&lt;a %&lt;a %&lt;a %&lt;a %&lt;a %&lt;a %&lt;a %&lt;a %&lt;a %&lt;a %&lt;a %&lt;a %&lt;a %&lt;a %'<br />
OR<br />
	P.PropertyValuesString LIKE '%position:absolute%'<br />
OR<br />
	P.PropertyValuesString LIKE '%overflow:hidden%'<br />
)<br />
AND<br />
	(SELECT COUNT(*) FROM CS_Posts P WHERE P.UserID = CSU.UserID) = 0</code></p>
<p><strong>Make sure to check your results for false positives!</strong> Once you are sure you got all the culprits and nobody else, iterate over it and delete each spammer e. g. by running</p>
<p><code>CommunityServer.Users.DeleteUser(CommunityServer.Users.GetUser(userName));</code></p>
<p>While the code is simple the reason I don&#8217;t include it here is because I want you to think about what you are doing and not blindly copy/paste it and accidentally delete &#8220;real&#8221; users &#8211; you will likely have to customize the above SQL snippet to achieve this.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.clausconrad.com/blog/does-your-communityserver-have-spam-profiles/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ERROR 1307 (HY000): Failed to CREATE PROCEDURE</title>
		<link>http://www.clausconrad.com/blog/error-1307-hy000-failed-to-create-procedure</link>
		<comments>http://www.clausconrad.com/blog/error-1307-hy000-failed-to-create-procedure#comments</comments>
		<pubDate>Sat, 28 Nov 2009 18:07:18 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.clausconrad2.com/?p=104</guid>
		<description><![CDATA[This error can occur in MySQL 5.1 when the database files were created on a previous version of MySQL. To resolve it, run &#8220;mysql_upgrade&#8221; as Administrator/root.]]></description>
			<content:encoded><![CDATA[<p></p><p>This error can occur in MySQL 5.1 when the database files were created on a previous version of MySQL.</p>
<p>To resolve it, run &#8220;mysql_upgrade&#8221; as Administrator/root.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.clausconrad.com/blog/error-1307-hy000-failed-to-create-procedure/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;The application cannot start&#8221; running Visual Studio as Administrator</title>
		<link>http://www.clausconrad.com/blog/the-application-cannot-start-running-visual-studio-as-administrator</link>
		<comments>http://www.clausconrad.com/blog/the-application-cannot-start-running-visual-studio-as-administrator#comments</comments>
		<pubDate>Thu, 12 Nov 2009 15:39:55 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[dotnet]]></category>

		<guid isPermaLink="false">http://www.clausconrad2.com/?p=106</guid>
		<description><![CDATA[Copy dte*.olb from C:\Program Files (X86)\Common Files\Microsoft Shared\MSEnv to C:\Program Files X86\Microsoft Visual Studio 9.0\Common7\IDE. Thanks to Howard Little.]]></description>
			<content:encoded><![CDATA[<p></p><p>Copy <em>dte*.olb</em> from <em>C:\Program Files (X86)\Common Files\Microsoft Shared\MSEnv</em> to <em>C:\Program Files X86\Microsoft Visual Studio 9.0\Common7\IDE</em>.</p>
<p>Thanks to <a href="https://www.21concepts.com/Blog/EntryId/10/Visual-Studio-2005-2008-The-application-cannot-start.aspx">Howard Little</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.clausconrad.com/blog/the-application-cannot-start-running-visual-studio-as-administrator/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>File copy error after activating Drupal translation</title>
		<link>http://www.clausconrad.com/blog/file-copy-error-after-activating-drupal-translation</link>
		<comments>http://www.clausconrad.com/blog/file-copy-error-after-activating-drupal-translation#comments</comments>
		<pubDate>Fri, 11 Sep 2009 14:34:44 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[drupal]]></category>

		<guid isPermaLink="false">http://www.clausconrad2.com/?p=122</guid>
		<description><![CDATA[Getting the error &#8220;Filen kan ikke kopieres, fordi filen med det angivne navn ikke eksisterer. UndersÃ¸g venligst om du har angivet det korrekte filnavn.&#8221; after you install and activate the Danish translation of Drupal? If you are on Windows: check the temporary folder setting under admin/settings/file-system. If it is set to /tmp, change it to [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Getting the error &#8220;Filen kan ikke kopieres, fordi filen med det angivne navn ikke eksisterer. UndersÃ¸g venligst om du har angivet det korrekte filnavn.&#8221; after you install and activate the Danish translation of Drupal?</p>
<ul>
<li>If you are on Windows: check the temporary folder setting under <em>admin/settings/file-system</em>. If it is set to <em>/tmp</em>, change it to an existing path.</li>
<li>If it is set to a valid path, make sure the PHP/web server user can write to it.</li>
</ul>
<p>Thanks to <a href="http://www.drupaldanmark.dk/forum/spoerg-om-hjaelp/generelle-spoergsmaal/mappe-indstilling">Andreas Haugstrup</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.clausconrad.com/blog/file-copy-error-after-activating-drupal-translation/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comparing Content Delivery Networks</title>
		<link>http://www.clausconrad.com/blog/comparing-content-delivery-networks</link>
		<comments>http://www.clausconrad.com/blog/comparing-content-delivery-networks#comments</comments>
		<pubDate>Mon, 07 Sep 2009 14:56:33 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://www.clausconrad2.com/?p=124</guid>
		<description><![CDATA[Comparison of some popular Content Delivery Networks (CDN) targeting SMB customers. Network Type Origin Edges Storage$/GB/mo. Delivery$/GB Support $/mo. CNAME Amazon S3 - EU 1 0.18 0.17 400 no Amazon S3 with CloudFront Edge cache EU 14 0.18 0.17 &#8211; 0.221 400 yes Amazon S3 - US 1 0.15 0.17 400 no Amazon S3 with [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Comparison of some popular Content Delivery Networks (CDN) targeting SMB customers.</p>
<table border="1" cellpadding="3" cellspacing="3">
<tr>
<th><strong>Network</strong></th>
<th><strong>Type</strong></th>
<th><strong>Origin</strong></th>
<th><strong>Edges</strong></th>
<th><strong>Storage<br />$/GB/mo.</strong></th>
<th><strong>Delivery<br />$/GB</strong></th>
<th><strong>Support<br />    $/mo.</strong></th>
<th><strong>CNAME</strong></th>
</tr>
<tr>
<td>Amazon S3</td>
<td>-</td>
<td>EU</td>
<td>1</td>
<td>0.18</td>
<td>0.17</td>
<td>    400</td>
<td>no</td>
</tr>
<tr>
<td>Amazon S3<br />    with CloudFront</td>
<td>Edge cache</td>
<td>EU</td>
<td>14</td>
<td>0.18</td>
<td>    0.17 &#8211; 0.221</td>
<td>400</td>
<td>yes</td>
</tr>
<tr>
<td>Amazon S3</td>
<td>-</td>
<td>US</td>
<td>1</td>
<td>0.15</td>
<td>0.17</td>
<td>    400</td>
<td>no</td>
</tr>
<tr>
<td>Amazon S3<br />    with CloudFront</td>
<td>Edge cache</td>
<td>US</td>
<td>14</td>
<td>0.15</td>
<td>    0.17 &#8211; 0.221</td>
<td>400</td>
<td>yes</td>
</tr>
<tr>
<td>CacheFly</td>
<td>Edge mirror</td>
<td>US</td>
<td>14</td>
<td>15.00</td>
<td>0.49</td>
<td>0</td>
<td>    ?</td>
</tr>
<tr>
<td>Rackspace Cloud Files</td>
<td>-</td>
<td>US</td>
<td>1</td>
<td>0.15</td>
<td>    0.22</td>
<td>0</td>
<td>no</td>
</tr>
<tr>
<td>Rackspace Cloud Files<br />    with Limelight</td>
<td>Edge delivery</td>
<td>US</td>
<td>17</td>
<td>0.15</td>
<td>    0.22</td>
<td>0</td>
<td>no</td>
</tr>
<tr>
<td>SimpleCDN</td>
<td>Edge cache</td>
<td>US/<br />    own</td>
<td>13</td>
<td>0.75</td>
<td>0.039</td>
<td>    ?</td>
<td>$5</td>
</tr>
</table>
<p>    Please note:</p>
<ul>
<li>Prices are based on the lowest usage range or contract, and might be         significantly cheaper with higher commitment and/or usage.</li>
<li>Prices do not include upload bandwidth/bandwidth to pull from origin server or         requests or other fees (where applicable).</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.clausconrad.com/blog/comparing-content-delivery-networks/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using apc
Database Caching 11/22 queries in 0.014 seconds using apc

Served from: www.clausconrad.com @ 2012-02-05 15:08:42 -->
