<?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>Solutoire.com &#187; Other</title>
	<atom:link href="http://solutoire.com/category/other/feed/" rel="self" type="application/rss+xml" />
	<link>http://solutoire.com</link>
	<description>Publicing platform</description>
	<lastBuildDate>Thu, 26 Feb 2009 17:07:57 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Django Series 1: A custom login page</title>
		<link>http://solutoire.com/2009/02/26/django-series-1-a-custom-login-page/</link>
		<comments>http://solutoire.com/2009/02/26/django-series-1-a-custom-login-page/#comments</comments>
		<pubDate>Thu, 26 Feb 2009 17:07:57 +0000</pubDate>
		<dc:creator>Bas Wenneker</dc:creator>
				<category><![CDATA[Other]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[django series]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://solutoire.com/?p=217</guid>
		<description><![CDATA[
This is the first post in the Django series published on solutoire.com. In the series I&#8217;ll discuss and solve some of the problems I ran across while struggling with Python and Django in particular. The subjects are handled in a fast pace and the posts in this series will get you up and running quickly. [...]]]></description>
			<content:encoded><![CDATA[<p>
This is the first post in the <a href="http://www.djangoproject.com/" title="The Django project">Django</a> series published on solutoire.com. In the series I&#8217;ll discuss and solve some of the problems I ran across while struggling with Python and Django in particular. The subjects are handled in a fast pace and the posts in this series will get you up and running quickly. The posts will mainly consist of code examples and a few explanations. Most of the time I&#8217;ll refer to other websites for thorough explanations.
</p>
<p>
In this post I&#8217;ll explain how to create a custom log in page. We&#8217;ll write our own view function and form that handles the authentication. In the next post I&#8217;ll explain how to create a custom authentication backend, that lets you log in users by their email addresses instead of their username.
</p>
<h1>Setting Up The Project</h1>
<p>
I assume you&#8217;ve already <a href="http://docs.djangoproject.com/en/dev/intro/install/#intro-install" title="Install Django">installed Django</a> and that you have a database. First step is to create a new project (in my case called &#8217;solutoire&#8217;). Then, create an <a href="http://docs.djangoproject.com/en/dev/intro/tutorial01/#id3" title="Django: Projects vs Apps">app</a> in the project called &#8216;auth&#8217;. Of course you can name both whatever you like. Fire the following commands on your command line:
</p>
<pre><code>// Create a new project:
# django-admin.py startproject solutoire
// Create the authentication app:
# manage.py startapp auth
</code></pre>
<p>
Now set up your project as described in the <a href="http://docs.djangoproject.com/en/dev/intro/tutorial01/" title="Django Tutorial Step 1">Django Tutorial</a>. Make sure you&#8217;ve added the database settings in <code>settings.py</code>.
</p>
<p>
Next thing you need to do is to sync the database. Make sure you create a superuser and write down the credentials (especially the email address and the password). Run the following commands:
</p>
<pre><code>// Sync the database, create a superuser
# manage.py syncdb
// Start the development server at http://127.0.0.1:8080
# manage.py runserver 8080
</code></pre>
<h2>Creating A Log in Page</h2>
<p>
Django already has built in User authentication. To start using it, make sure <code>django.contrib.auth</code> is in the <a href="http://docs.djangoproject.com/en/dev/ref/settings/#installed-apps" title="INSTALLED_APPS setting description"><code>INSTALLED_APPS</code></a> tuple. If you don&#8217;t have it yet, add it, and run the <code>manage.py syncdb</code> again, this creates the tables in the database that you&#8217;ll need for authentication. Django also comes with <a href="http://docs.djangoproject.com/en/dev/topics/auth/?from=olddocs#built-in-forms" title="Django builtin Authentication Views">several authentication views</a>, but for now, we&#8217;ll write our own.
</p>
<p>
To facilitate a log in page, create a new directory &#8216;templates&#8217; in project folder and create a file called <code>auth.html</code> inside it. In settings.py, add the absolute path to template directory to the <a href="http://docs.djangoproject.com/en/dev/ref/settings/#template-dirs" title="TEMPLATE_DIRS setting description"><code>TEMPLATE_DIRS</code></a> setting. In my case, it looked like:
</p>
<pre><code>TEMPLATE_DIRS = (
    'E:/Django/Projects/solutoire/templates'
)
</code></pre>
<p>
We also need a view function and a template. Open up <code>auth/views.py</code> and paste the
</p>
<pre><code>// auth/views.py
from django.shortcuts import render_to_response
from django.contrib.auth import authenticate, login

def login_user(request):
    state = "Please log in below..."
    username = password = ''
    if request.POST:
        username = request.POST.get('username')
        password = request.POST.get('password')

        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                state = "You're successfully logged in!"
            else:
                state = "Your account is not active, please contact the site admin."
        else:
            state = "Your username and/or password were incorrect."

    return render_to_response('auth.html',{'state':state, 'username': username})</code></pre>
<p>
Now, copy &#038; paste the following HTML to the <code>auth.html</code> file. This is the template for the log in view. To read more about Django templates, go read <a href="http://docs.djangoproject.com/en/dev/ref/templates/api/" title="Django Template Language">Django Template Language</a> and <a href="http://docs.djangoproject.com/en/dev/ref/templates/builtins/" title="Django Built-in template tags and filters">Built-in template tags and filters</a>.
</p>
<pre><code>// templates/auth.html
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&gt;
&lt;head&gt;
&lt;title&gt;Log in&lt;/title&gt;
&lt;meta http-equiv="Content-type" content="text/html; charset=utf-8" /&gt;
&lt;style&gt;
body{
	font-family:Arial,Helvetica,sans-serif;
	font-size: 12px;
}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
	{{ state }}
	&lt;form action="/login/" method="post"&gt;
		{% if next %}
		&lt;input type="hidden" name="next" value="{{ next }}" /&gt;
		{% endif %}
		username: 
		&lt;input type="text" name="username" value="{{ username}}" /&gt;&lt;br /&gt;
		password:
		&lt;input type="password" name="password" value="" /&gt;&lt;br /&gt;

		&lt;input type="submit" value="Log In" /&gt;
	&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>
In order to see the form with your browser, the <code>urlpatterns</code> variable in <code>urls.py</code> in the project root should have an entry that points to the <code>login_user</code> function defined in auth/views.py:
</p>
<pre><code>from django.conf.urls.defaults import *

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns('',
    (r'^login/$', 'auth.views.login_user'),
)</code></pre>
<p>
The form looks like this when you&#8217;re not logged in:
</p>
<div class="img">
<img src="http://solutoire.com/blog/wp-content/uploads/2009/02/login_form1.png" alt="login_form1" title="login_form1" width="238" height="110" class="alignnone size-full wp-image-240" /><br />
<i>The log in form.</i>
</div>
<p>
As you can see, the <code>render_to_response</code> function passes two variables to the auth.html template we&#8217;ve just created. Now we have everything in place for logging in users. Try it yourself, use the credentials you just wrote down when you ran the <code>manage.py syncdb</code> command (to log in, point your browser to <a href="http://127.0.0.1:8080/login" title="Your log in page">http://127.0.0.1:8080/login</a>). This code is everything you need with Django to have your own log in page. However, Django also comes with some predefined log in views. You can read more about those default templates at the <a href="http://docs.djangoproject.com/en/dev/topics/auth/?from=olddocs#other-built-in-views" title="Built-In Authentication views">Django Documentation</a>
</p>
<h2>What&#8217;s next</h2>
<p>
In the next post in the Django series we&#8217;ll will write our own authentication backend. The custom backend enables us to let users log in by their email address, instead of their username. Of course you can change the backend to your likings, for example, let users log in by their first name, email address and their password.
</p>
<h2>Download</h2>
<p>You can download all the code above in a <a href="http://www.solutoire.com/download/solutoire.django.series.1.zip">zip file</a>. When you use this code, make sure you change paths and credentials.</p>
]]></content:encoded>
			<wfw:commentRss>http://solutoire.com/2009/02/26/django-series-1-a-custom-login-page/feed/</wfw:commentRss>
		<slash:comments>107</slash:comments>
		</item>
		<item>
		<title>Upcoming Django Series</title>
		<link>http://solutoire.com/2009/02/09/upcoming-django-series/</link>
		<comments>http://solutoire.com/2009/02/09/upcoming-django-series/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 19:15:45 +0000</pubDate>
		<dc:creator>Bas Wenneker</dc:creator>
				<category><![CDATA[Other]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[django series]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://solutoire.com/?p=210</guid>
		<description><![CDATA[
I&#8217;m currently working with Django for a personal project. Django is a web framework written in Python that encourages rapid development and clean, pragmatic design. The Django website says it is &#8220;The Web framework for perfectionists with deadlines. Django makes it easier to build better Web apps more quickly and with better code.&#8221;. That&#8217;s exactly [...]]]></description>
			<content:encoded><![CDATA[<p>
I&#8217;m currently working with <a href="http://www.djangoproject.com/" title="Django">Django</a> for a personal project. Django is a web framework written in <a href="http://www.python.org/" title="Python Programming Language">Python</a> that encourages rapid development and clean, pragmatic design. The Django website says it is &#8220;The Web framework for perfectionists with deadlines. Django makes it easier to build better Web apps more quickly and with better code.&#8221;. That&#8217;s exactly the reason I decided to fool around with Django and Python. While I&#8217;m an experienced PHP programmer, Python is not as hard to learn like I thought it would be.
</p>
<p>In the next few weeks I&#8217;ll be releasing a series of posts in which I&#8217;ll discuss and solve some of the problems I ran across while struggling with Python and Django in particular. The first post covers writing a custom authentication backend. The second post will learn you everything about extending the default Django User object and how to combine it with the custom authentication backend. If you have special requests for explanation of topics related to Django (that are hardly documented), please let me know by leaving a comment.</p>
]]></content:encoded>
			<wfw:commentRss>http://solutoire.com/2009/02/09/upcoming-django-series/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>HTML Conditional Comments</title>
		<link>http://solutoire.com/2008/03/23/html-conditional-comments/</link>
		<comments>http://solutoire.com/2008/03/23/html-conditional-comments/#comments</comments>
		<pubDate>Sun, 23 Mar 2008 19:12:17 +0000</pubDate>
		<dc:creator>Bas Wenneker</dc:creator>
				<category><![CDATA[Other]]></category>
		<category><![CDATA[conditional comments]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[internet explorer]]></category>

		<guid isPermaLink="false">http://solutoire.com/2008/03/23/html-conditional-comments/</guid>
		<description><![CDATA[
Ever used conditional statements/comments in your html? I do, actually, use the technique quite a lot (this site, Flotr). With HTML conditional comments you can detect browser type and version. Now don&#8217;t get too excited, because it&#8217;s only supported by Internet Explorer 5+ on Windows. Nevertheless, this way of browser detection is really elegant compared [...]]]></description>
			<content:encoded><![CDATA[<p>
Ever used conditional statements/comments in your html? I do, actually, use the technique quite a lot (this site, <a href="http://www.solutoire.com/flotr" title="Flotr Project Page">Flotr</a>). With HTML conditional comments you can detect browser type and version. Now don&#8217;t get too excited, because it&#8217;s only supported by Internet Explorer 5+ on Windows. Nevertheless, this way of browser detection is really elegant compared to nasty css hacks or javascript user agent detection. This article is shows you how you can use the conditional comments for several handy purposes.
</p>
<h2>Different types of statements</h2>
<p>
There are two types of conditional statements. The first type is the so-called <strong><i>downlevel-hidden</i></strong> statement, which hides the statement from browsers that don&#8217;t support conditional comments:
</p>
<pre><code class="html">&lt;!-- This is a regular HTML comment --&gt;
&lt;!--[if IE]&gt;
&lt;p&gt;This is a downlevel-hidden conditional statement.
Browsers that don't support conditional comments,
think this is a HTML comment.&lt;/p&gt;
&lt;![endif]--&gt;</code></pre>
<p>
IE browsers will render the paragraph, but others &#8216;ll omit it, because they think it&#8217;s a HTML comment.
</p>
<p>The next type of conditional comment is the <strong><i>downlevel-revealed</i></strong> statement. The statement is rendered by browsers that don&#8217;t support conditional statements, and of course, IE 5+ browsers only render the statement when they pass the condition.</p>
<pre><code class="html">&lt;![if (gte IE 6)&amp;(lt IE 8)]&gt;
&lt;p&gt;This paragraph is shown by IE6, IE7 and all browsers
that don't support conditional comments.&lt;/p&gt;
&lt;![endif]&gt;</code></pre>
<h2>The conditions</h2>
<p>
<abbr title="Microsoft Developer Network">MSDN</abbr> has a nice list of <a href="http://msdn2.microsoft.com/en-us/library/ms537512.aspx#syntax" title="MSDN Conditional Comments">possible conditions</a>, so I&#8217;m not going to repeat that, I&#8217;ll just give some examples with an explanation.
</p>
<pre><code class="html">&lt;!--[if IE 5]&gt;&lt;p&gt;IE 5&lt;/p&gt;&lt;![endif]--&gt;
&lt;!--[if gte IE 5]&gt;&lt;p&gt;IE 5+&lt;/p&gt;&lt;![endif]--&gt;
&lt;!--[if gt IE 5]&gt;&lt;p&gt;IE 6+&lt;/p&gt;&lt;![endif]--&gt;
&lt;!--[if !(IE)]&gt;&lt;p&gt;Never shown&lt;/p&gt;&lt;![endif]--&gt;
&lt;!--[if (IE 6)|(IE 7)]&gt;&lt;p&gt;IE6 and IE7&lt;/p&gt;&lt;![endif]--&gt;
&lt;!--[if (gte IE 5)&amp;!(IE 5.5)]&gt;&lt;p&gt;IE5+ except IE5.5&lt;/p&gt;&lt;![endif]--&gt;
&lt;!--[if true]&gt;
&lt;![if IE 6]&gt;&lt;p&gt;IE6&lt;/p&gt;&lt;![endif]&gt;
&lt;![if IE 7]&gt;&lt;p&gt;IE7&lt;/p&gt;&lt;![endif]&gt;
&lt;![endif]--&gt;
&lt;![if !(IE)]&gt;&lt;p&gt;All non IE browsers&lt;/p&gt;&lt;![endif]&gt;
</code></pre>
<h2>The uses</h2>
<p>
If you take a look in the source of this page you can see the following conditional tag in between the <code>header</code> tags.
</p>
<pre><code class="html">&lt;!--[if lt IE 7]&gt;
&lt;link type=&quot;text/css&quot; rel=&quot;stylesheet&quot; href=&quot;http://solutoire.com/blog/wp-content/themes/v8.gene/styles/ie6.css&quot; /&gt;
&lt;![endif]--&gt;
</code></pre>
<p>
This conditional comment helps me with keeping my original css file free of hacks. This means that all non-IE browsers render this page just fine, but IE6- messes up most of the positioned elements. Non IE and IE7+ browsers think it&#8217;s just a HTML comment, so the css file is not loaded, but IE6- browsers load the css file that corrects the css styles.
</p>
<p>The same thing can be done for javascript files. My javascript plotting library <a href="http://solutoire.com/flotr/" title="Flotr Project Page">Flotr</a> needs <a href="http://excanvas.sourceforge.net/" title="Excanvas Project Page">Excanvas</a> to treat <a href="http://en.wikipedia.org/wiki/Vector_Markup_Language" title="Wikipedia Vector Markup Language">VML</a> as a canvas element. Excanvas is only needed for IE browsers, because most popular non IE browsers support the canvas element.</p>
<pre><code class="html">&lt;!--[if IE]&gt;&lt;script language=&quot;javascript&quot; type=&quot;text/javascript&quot; src=&quot;path/to/excanvas.js&quot;&gt;&lt;/script&gt;&lt;![endif]--&gt;
&lt;script language=&quot;javascript&quot; type=&quot;text/javascript&quot; src=&quot;path/to/prototype-x.x.x.x.js&quot;&gt;&lt;/script&gt;
&lt;script language=&quot;javascript&quot; type=&quot;text/javascript&quot; src=&quot;path/to/flotr.js&quot;&gt;&lt;/script&gt;
</code></pre>
<h2>Further reading</h2>
<p>
I recommend reading the article on MSDN about <a href="http://msdn2.microsoft.com/en-us/library/ms537512.aspx">conditional statements</a> if this post didn&#8217;t make any sense to you. Also, Peter-Paul Koch wrote a <a href="http://www.quirksmode.org/css/condcom.html">nice roundup</a> on conditional comments at his website <a href="http://www.quirksmode.org/" title="QuirksMode">quirksmode.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://solutoire.com/2008/03/23/html-conditional-comments/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>What&#8217;s in your feed reader?</title>
		<link>http://solutoire.com/2008/03/21/whats-in-your-feed-reader/</link>
		<comments>http://solutoire.com/2008/03/21/whats-in-your-feed-reader/#comments</comments>
		<pubDate>Fri, 21 Mar 2008 19:01:00 +0000</pubDate>
		<dc:creator>Bas Wenneker</dc:creator>
				<category><![CDATA[Other]]></category>
		<category><![CDATA[feeds]]></category>

		<guid isPermaLink="false">http://solutoire.com/2008/03/21/whats-in-your-feed-reader/</guid>
		<description><![CDATA[
Despite of the fact I&#8217;m always hungry for new feeds with interesting articles, I&#8217;m not able to find any new feeds lately. I asked for help from Google Alerts, which notifies me when the GoogleBot hits something I defined an alert for. Though it doesn&#8217;t come up with great content I&#8217;m looking for. That&#8217;s the [...]]]></description>
			<content:encoded><![CDATA[<p>
Despite of the fact I&#8217;m always hungry for new feeds with interesting articles, I&#8217;m not able to find any new feeds lately. I asked for help from Google Alerts, which notifies me when the GoogleBot hits something I defined an alert for. Though it doesn&#8217;t come up with great content I&#8217;m looking for. That&#8217;s the reason I&#8217;d like to ask you for helping me out, because obviously I&#8217;m looking at the wrong spot. In exchange I show you 10 of my favorite feeds.
</p>
<div class="img">
<a style="border: 0px; background:#D2E8FF;" href="http://feeds.feedburner.com/solutoire" title="Grab the Solutoire.com feed"><img  style="border: 0px;" src='http://solutoire.com/blog/wp-content/uploads/2008/03/feed-icon.png' alt='Feed icon' /></a><br />
<a href="http://feeds.feedburner.com/solutoire" title="Grab the Solutoire.com feed">Grab the Solutoire.com feed!</a>
</div>
<h2>My Feeds</h2>
<p>
I use Google Reader as my feed reader (never tried something else). I never read all feed entries, most of the time I&#8217;ve more than 1000 unread articles. Here&#8217;s an unordered list of the ones I&#8217;m dedicated to:
</p>
<h2><a href="http://www.thinkvitamin.com/" title="Vitamin">Vitamin</a> (<a href="http://feeds.feedburner.com/vitaminmasterfeed" title="Vitamin feed">feed</a>)</h2>
<p>
Vitamin is a resource for web designers, developers and entrepreneurs. The online magazine serves great content written by top authors from the web industry.</p>
<h2><a href="http://www.shauninman.com/" title="ShaunInman.com">ShaunInman.com</a> (<a href="http://www.shauninman.com/feeds/plus" title="ShaunInman.com feed">feed</a>)</h2>
<p>
Shaun Inman is a successful designer and developer. He&#8217;s also the founder of <a href="http://haveamint.com/" title="Mint">Mint</a>, the web site analytics program.</p>
<h2><a href="http://ajaxian.com/" title="Ajaxian">Ajaxian</a> (<a href="http://feeds.feedburner.com/ajaxian" title="Ajaxian feed">feed</a>)</h2>
<p>My daily piece of Ajax.</p>
<h2><a href="http://www.devlounge.net/" title="Devlounge">Devlounge</a> (<a href="http://www.devlounge.net/" title="Devlounge feed">feed</a>)</h2>
<p>Online magazine for designers and developers.</p>
<h2><a href="http://www.lifehack.org/" title="Lifehack.org">Lifehack.org</a> (<a href="http://feeds.lifehack.org/Lifehack" title="Lifehack.org feed">feed</a>)</h2>
<p>Daily digest and pointers on productivity, getting things done and lifehacks.</p>
<h2><a href="http://lifehacker.com/" title="Lifehacker">Lifehacker</a> (<a href="http://feeds.gawker.com/lifehacker/full" title="Lifehacker feed">feed</a>)</h2>
<p>Tech tricks, tips and downloads for getting things done. This site delivers up to 10 articles a day!</p>
<h2><a href="http://www.simplebits.com/" title="SimpleBits">SimpleBits</a> (<a href="http://www.simplebits.com/xml/rss.xml" title="SimpleBits feed">feed</a>)</h2>
<p>The blog/company website of designer and author Dan Cederholm.</p>
<h2><a href="http://snook.ca/jonathan/" title="Snook.ca">Snook.ca</a> (<a href="http://feeds.feedburner.com/snookca" title="Snook.ca feed">feed</a>)</h2>
<p>
Snook.ca is the site of web designer, developer, writer and speaker, Jonathan Snook. The articles on the site focus on web development, design, and freelance.
</p>
<h2><a href="http://andrewdupont.net/" title="Painfully Obvious">Painfully Obvious</a>  (<a href="http://andrewdupont.net/feed/atom/" title="Painfully Obvious feed">feed</a>)</h2>
<p>The weblog of Andrew Dupont, web interface developer and writer.</p>
<h2><a href="http://web20show.com/episodes" title="The Web 2.0 Show">The Web 2.0 Show</a> (<a href="http://feeds.feedburner.com/web20Show" title="The Web 2.0 Show feed">feed</a>)</h2>
<p>The Web 2.0 Show is a podcast about emerging technologies commonly referred to as &#8220;Web 2.0&#8243;, and is hosted by Adam Stacoviak and Josh Owens.</p>
<p style="font-size: 1.5em;font-weight:bold; text-align:center">Now, the crucial question is, what&#8217;s in your feed reader?</p>
]]></content:encoded>
			<wfw:commentRss>http://solutoire.com/2008/03/21/whats-in-your-feed-reader/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Top 3 website speed up tips</title>
		<link>http://solutoire.com/2008/02/18/top-3-website-speed-up-tips/</link>
		<comments>http://solutoire.com/2008/02/18/top-3-website-speed-up-tips/#comments</comments>
		<pubDate>Mon, 18 Feb 2008 21:03:12 +0000</pubDate>
		<dc:creator>Bas Wenneker</dc:creator>
				<category><![CDATA[Other]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[yslow]]></category>

		<guid isPermaLink="false">http://solutoire.com/2008/02/18/top-3-website-speed-up-tips/</guid>
		<description><![CDATA[
I&#8217;m optimizing this blog at the moment, and I&#8217;m learning quite some new things about compression, gzipping and other optimization techniques. I&#8217;m using the Yahoo! YSlow extension for Firefox to see if I&#8217;m heading in the right direction. In this article I&#8217;ll explain the three best techniques I used to speed up solutoire.com.

Setting up a [...]]]></description>
			<content:encoded><![CDATA[<p>
I&#8217;m optimizing this blog at the moment, and I&#8217;m learning quite some new things about compression, gzipping and other optimization techniques. I&#8217;m using the <a href="http://developer.yahoo.com/yslow/" title="Yahoo! YSlow extionsion">Yahoo! YSlow extension</a> for Firefox to see if I&#8217;m heading in the right direction. In this article I&#8217;ll explain the three best techniques I used to speed up solutoire.com.
</p>
<h2>Setting up a CDN</h2>
<p>
First thing I created a <abbr title="Content Delivery Network">CDN</abbr>. Most browsers support only a few persistent requests to the same domain. By placing static files (css/js/images) to a cdn subdomain, visitors can load content with twice the allowed amount of persistent requests. I asked my hosting provider (and employer) <a href="http://solware.nl/en/uk/cases/testimonials/stichting-opleidingsfonds-groothandel" title="Solware, my hosting provider">Solware</a> to create a new subdomain called &#8220;cdn&#8221; (cdn.solutoire.com). Then I moved all static files to the cdn subdomain. Without configuring YSlow, it doesn&#8217;t have impact on the score, but by adding the <a href="http://developer.yahoo.com/yslow/faq.html#faq_cdn" title="YSlow FAQ">cdn domain to your YSlow configuration</a>, the score should be higher, and the YSlow rule 2 should be graded &#8216;A&#8217;.
</p>
<p>
<b>Note 1</b>: the .htaccess file that&#8217;s in the root of your domain doesn&#8217;t configure Apache in for the subdomain, so create an other .htaccess for your cdn.
</p>
<p>
When you have a large site with lots of visitors and/or a huge amount of static files, a nice alternative is moving your files to <a href="http://www.amazon.com/gp/browse.html?node=16427261" title="Amazon S3 Service">Amazon S3</a>. Amazon S3 is a paid (but cheap) storage provider service. I&#8217;m a big fan of their initiative:
</p>
<blockquote><p>
Amazon S3 provides a simple web services interface that can be used to store and retrieve any amount of data, at any time, from anywhere on the web. It gives any developer access to the same highly scalable, reliable, fast, inexpensive data storage infrastructure that Amazon uses to run its own global network of web sites. The service aims to maximize benefits of scale and to pass those benefits on to developers.
</p></blockquote>
<p>
<b>Note 2</b>: having to many cdn domains results in more DNS lookups. According to Yahoo! a DNS lookup approximately takes 20-120 ms. DNS lookups are cached by most browsers, so there&#8217;s a delay only for first-time visitors.
</p>
<h2>Compressing *.js and *.css using the YUI Compressor</h2>
<p>
A week ago John Resig posted a very interesting article called <a href="http://ejohn.org/blog/library-loading-speed/" title="John Resig: Javascript Library Loading Speed">&#8220;JavaScript Library Loading Speed&#8221;</a> in which he wrote the following:
</p>
<blockquote><p>When distributing a piece of JavaScript code it&#8217;s traditional to think that the smallest (byte-size) code will download and load the fastest. This is not true &#8211; and is a fascinating result of this survey. Looking at the speed of loading jQuery in three forms: normal, minified (using Yahoo Min), and packed (using Packer). By order of file size, packed is the smallest, then minifed, then normal. However, the packed version has an overhead: It must be uncompressed, on the client-side, using a JavaScript decompression algorithm. This unpacking has a tangible cost in load time. This means, in the end, that using a minifed version of the code is much faster than the packed one &#8211; even though its file size is quite larger.</p></blockquote>
<p>
While I knew about the fact that <a href="http://dean.edwards.name/packer/" title="Dean Edwards: Javascript Packer">packed</a> files had a delay because of the evaluation time, I never thought it took a significant amount of time. Anyway, I stopped packing my files, and started minifying them, using the <a href="http://developer.yahoo.com/yui/compressor/" title="Yahoo! YUI Compressor">YUI Compressor</a>. A great thing about this tool is that it&#8217;s able to compress both javascript files and css files. The downside of using this compressor is that it&#8217;s written in Java, and there doesn&#8217;t seem to be a decent online YUI Compressor service. So I started looking around for <a href="http://ant.apache.org/" title="Apache Ant Project Page">Apache Ant</a> build scripts. I found an excellent explanation about <a href="http://www.julienlecomte.net/blog/2007/09/16/" title="Julien Lecomte about compressing files using YUI Compressor and Ant">compressing files using the YUI Compressor and Ant</a>, written by the Yahoo! engineer <a href="http://www.julienlecomte.net/" title="Julien Lecomte">Julien Lecomte</a>. I&#8217;m not going to explain how to do this, because I would tell you the same as Julien. I can push you in the right direction by referring to a previous post on this blog called <a href="http://solutoire.com/2007/05/31/automate-aptana-with-ant/" title="Automating the Aptana IDE with Apache Ant">&#8220;Automate builds with Ant&#8221;</a> in which I explain how to set up the <a href="http://www.aptana.com/" title="Aptana Webdevelopment IDE">Aptana IDE</a> to use Apache Ant.
</p>
<h2>Configuring the .htaccess file</h2>
<p>
The <a href="http://en.wikipedia.org/wiki/Htaccess" title="Wikipedia .htaccess">.htaccess file</a> is the Apache configuration file for the folder the file resides in. It&#8217;s better to change the httpd.conf file, but most of you won&#8217;t have access to that file (because of shared hosting).
</p>
<p><b>Removing ETags and Last-Modified headers</b></p>
<p>ETags, or Entity tags, are a mechanism used by servers and browsers to compare cached files with files from the server. Yahoo! explains <a href="http://developer.yahoo.com/performance/rules.html#etags" title="Yahoo! about ETags">the problem</a> with ETags:</p>
<blockquote><p>The problem with ETags is that they typically are constructed using attributes that make them unique to a specific server hosting a site. ETags won&#8217;t match when a browser gets the original component from one server and later tries to validate that component on a different server, a situation that is all too common on Web sites that use a cluster of servers to handle requests.</p></blockquote>
<p>
When the ETags and Last-Modified headers are removed, files will stay in cache till the header expires, and there are no checks performed to see if the file on the server-side has changed. So I also remove the Last-Modified header in my .htaccess.
</p>
<p><b>Gzipping content</b></p>
<p>
Gzipping your content before it&#8217;s sent to the browser, may reduce the filesizes with 70%. Almost 90% of internet traffic goes through browsers that support gzipped content. This speeds up your website quite a bit and saves bandwidth, especially when you have serve a lot of javascript and css files. Gzip doesn&#8217;t compress images.
</p>
<p><b>Add Expire headers</b></p>
<p>
When expire headers are set, the browser caches content from the server on the clientside. First-time visitors make lots of requests, the second time visitors visit the page, the browser uses the cached content. So when you set the expire headers for files, the browser knows when to throw away the cached files, and fetch new ones. I use different expire headers for different filetypes.
</p>
<p>
<b>Note</b>: it should be obvious you should only set expire headers for static content. Because the browser caches dynamic content, it&#8217;s only refreshed when the header expires. When you do set headers for dynamic content, make sure the expire period is small.
</p>
<p>
My .htaccess looks something like this, it&#8217;s made from examples from <a href="http://www.askapache.com/htaccess/apache-htaccess.html">several articles at AskApache.com</a>:
</p>
<pre><code>Header unset ETag
FileETag None

# Cache for quite some time
&lt;FilesMatch &quot;\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$&quot;&gt;
Header set Cache-Control &quot;public&quot;
Header set Expires &quot;Thu, 15 Apr 2010 20:00:00 GMT&quot;
Header unset Pragma
Header unset Last-Modified
&lt;/FilesMatch&gt;

# Cache for 2 days
&lt;FilesMatch &quot;\.(xml|txt)$&quot;&gt;
Header set Cache-Control &quot;max-age=172800, public, must-revalidate&quot;
Header unset Pragma
Header unset Last-Modified
&lt;/FilesMatch&gt;

# Cache for 2 hours
&lt;FilesMatch &quot;\.(html|htm)$&quot;&gt;
Header set Cache-Control &quot;max-age=7200, must-revalidate&quot;
Header unset Pragma
&lt;/FilesMatch&gt;

# Gzip compression
&lt;FilesMatch &quot;\.(js|css)$&quot;&gt;
SetOutputFilter DEFLATE
&lt;/FilesMatch&gt;
</code></pre>
<h2>YSlow gives me grade D</h2>
<p>
While I can notice the speed increase after the optimization steps, YSlow still gives me grade D (67). This is because of the ads I added to my site. I use Google Adsense to generate some income from this blog, but the javascript that&#8217;s served from the Google servers aren&#8217;t cached and it causes the low grade from YSlow. <strike>I did everything that&#8217;s within my power</strike> (see comment by <a href="http://solutoire.com/2008/02/18/top-3-website-speed-up-tips/#comments-0" title="Comment by Nicolash">nicolash</a>), but for now, Google is the bottleneck. I can&#8217;t do anything about it, because changing the ads code from Adsense would make me violate the <a href="http://www.google.com/adsense/terms" title="Google Adsense TOS">Adsense TOS</a>. Bummer&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://solutoire.com/2008/02/18/top-3-website-speed-up-tips/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>My Roadmap 2008</title>
		<link>http://solutoire.com/2008/01/03/my-roadmap-2008/</link>
		<comments>http://solutoire.com/2008/01/03/my-roadmap-2008/#comments</comments>
		<pubDate>Thu, 03 Jan 2008 07:19:37 +0000</pubDate>
		<dc:creator>Bas Wenneker</dc:creator>
				<category><![CDATA[Other]]></category>
		<category><![CDATA[2008]]></category>
		<category><![CDATA[Plotr]]></category>
		<category><![CDATA[roadmap]]></category>
		<category><![CDATA[tagstention]]></category>

		<guid isPermaLink="false">http://solutoire.com/2008/01/03/my-roadmap-2008/</guid>
		<description><![CDATA[Well, I&#8217;m a bit late, but happy new year to all! A new year has begun, so it&#8217;s time to write some sort of roadmap, to get straight what I want to accomplish the coming year. I&#8221;m not going to bother you with the complete list, but there are a few points that might be [...]]]></description>
			<content:encoded><![CDATA[<p>Well, I&#8217;m a bit late, but happy new year to all! A new year has begun, so it&#8217;s time to write some sort of roadmap, to get straight what I want to accomplish the coming year. I&#8221;m not going to bother you with the complete list, but there are a few points that might be interesting for you.</p>
<p><h2>Project: TAGStention</h2>
<p>
In February 2008 I&#8217;ll release the source code of my Dreamweaver extension, <a href="http://www.solutoire.com/tagstention" title="TAGStention Dreamweaver Extension">TAGStention</a>. It&#8217;s adds a toolbar to Dreamweaver that enables webdevelopers to make WordPress templates just by filling in wizards or pressing a button. I didn&#8217;t update it for a while, and I&#8217;m not interested in putting more effort in a new release, so that&#8217;s the reason it&#8217;s going opensource. In the following weeks I&#8217;ll think about the license. If you&#8217;re interested in taking over development and maintainance, please let me know.
</p>
<h2>Project: Plotr</h2>
<p>
I&#8217;m stoppping the development of <a href="http://www.solutoire.com/plotr" title="Plotr Charting Toolkit">Plotr</a>. It just takes so much of my precious time I can&#8217;t keep on writing bug fixes/documentation/new features for it. There are great other charting libraries that can do the job, so it&#8217;s time for you to switch. If anyone is interested in taking over development and maintenance, just let me know. I just don&#8217;t have the time to give any support for the product.
</p>
<h2>New projects</h2>
<p>
There are some projects in the pipeline that will be released in the next year. I&#8217;ve been playing around with <a href="www.extjs.com" title="Ext Javascript Library">ExtJS</a> and I&#8217;ve created a very nice javascript benchmark app. It should be ready in February or March. There are some other things I&#8217;ll be doing in 2008 but I&#8217;m not going to tell you about those yet.</p>
]]></content:encoded>
			<wfw:commentRss>http://solutoire.com/2008/01/03/my-roadmap-2008/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Firefox Reminder Plugin</title>
		<link>http://solutoire.com/2007/08/03/firefox-reminder-plugin/</link>
		<comments>http://solutoire.com/2007/08/03/firefox-reminder-plugin/#comments</comments>
		<pubDate>Fri, 03 Aug 2007 18:23:22 +0000</pubDate>
		<dc:creator>Bas Wenneker</dc:creator>
				<category><![CDATA[Other]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[ical]]></category>
		<category><![CDATA[productivity]]></category>

		<guid isPermaLink="false">http://solutoire.com/2007/08/03/firefox-reminder-plugin/</guid>
		<description><![CDATA[
Today I came across a great Firefox plugin called ReminderFox. This plug in adds a reminder list and a todolist to our favorite browser. Just what I needed, and I&#8217;m sharing this because this might come in handy for you too.


ReminderFox is an extension for Firefox and Thunderbird that displays and manages lists of date-based [...]]]></description>
			<content:encoded><![CDATA[<p>
Today I came across a great Firefox plugin called ReminderFox. This plug in adds a reminder list and a todolist to our favorite browser. Just what I needed, and I&#8217;m sharing this because this might come in handy for you too.
</p>
<blockquote><p>
ReminderFox is an extension for Firefox and Thunderbird that displays and manages lists of date-based reminders and ToDo&#8217;s. ReminderFox does not seek to be a full-fledged calendar system.
</p></blockquote>
<div class="img">
<img src='http://solutoire.com/blog/wp-content/uploads/2007/08/reminderfox.gif' alt='Reminderfox' /></p>
<p><i>Reminderfox plugin.</i></p>
</div>
<p>
What I like the most about it, is the fact you can sync your reminders/todo items online. You can host your own &#8216;reminder.ics&#8217; file, but you can also use the free .ics file hosting from <a href="http://www.icalx.com" title="icalx.com calendar hosting">icalx.com</a>. In this way you can have your reminders on every connected computer.</p>
]]></content:encoded>
			<wfw:commentRss>http://solutoire.com/2007/08/03/firefox-reminder-plugin/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Automating builds with Ant</title>
		<link>http://solutoire.com/2007/05/31/automate-aptana-with-ant/</link>
		<comments>http://solutoire.com/2007/05/31/automate-aptana-with-ant/#comments</comments>
		<pubDate>Thu, 31 May 2007 20:34:24 +0000</pubDate>
		<dc:creator>Bas Wenneker</dc:creator>
				<category><![CDATA[Other]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[aptana]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[packer]]></category>

		<guid isPermaLink="false">http://solutoire.com/2007/05/31/automate-aptana-with-ant/</guid>
		<description><![CDATA[
I started working on Plotr again and I needed a simple way to automate tasks like concatenating files,replacing some variables and packing with Dean Edwards packer. Then I found Apache Ant, which was already integrated in Aptana (which is my favorite javascript IDE). Well, Ant isn&#8217;t integrated in Aptana but in Eclipse, and because I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p>
I started working on <a href="http://solutoire.com/plotr" title="Plotr Charting Framework">Plotr</a> again and I needed a simple way to automate tasks like concatenating files,replacing some variables and packing with <a href="http://dean.edwards.name/packer/" title="Javascript compressor and obfuscator">Dean Edwards packer</a>. Then I found Apache Ant, which was already integrated in <a href="http://www.aptana.com">Aptana</a> (which is my favorite javascript IDE). Well, Ant isn&#8217;t integrated in Aptana but in <a href="http://www.eclipse.org/">Eclipse</a>, and because I&#8217;ve installed Aptana as a plugin for Eclipse, Ant is already installed. Anyway, I just wanted to share this info, because it&#8217;s saving me so much time. In this article I&#8217;ll explain how to write a simple Ant build-file.
</p>
<h2>Setting up the environment</h2>
<p>
To start working with Aptana and Ant you need to install Eclipse (which needs Java). I&#8217;ll assume you know how to do this. After that go to <a href="http://aptana.com/docs/index.php/Plugging_Aptana_into_an_existing_Eclipse_configuration">www.aptana.com</a> and read how to install Aptana as an Eclipse plugin.
</p>
<p>
Now you&#8217;ve got everything up and running, <a href="http://aptana.com/docs/index.php/Creating_your_first_Aptana_project" title="Aptana Wiki">create a new (Web) Project</a>. Let&#8217;s say our project looks like this:
</p>
<div class="img">
<img src='http://solutoire.com/blog/wp-content/uploads/2007/05/ant_project.gif' alt='Aptana Project' /></p>
<p><i>Screenshot of the Aptana project.</i></p>
</div>
<p>
Ant takes a XML file. In <code>build.xml</code> we define a set of tasks, and Ant is going to execute these tasks. Let&#8217;s say we want to build our project by concatenating the three files in the <code>js</code> folder. We also want to pack the concatenation and store the result in another file. Ant comes with a set of built-in tasks. Before we can use these tasks we need to define our project.
</p>
<h2>The Ant build file</h2>
<p>
We define our project in the buildfile. First this is what the <a href="http://ant.apache.org/manual/index.html" title="Ant manual">Ant manual</a> has to say about build files.
</p>
<blockquote><p>
Ant&#8217;s buildfiles are written in XML. Each buildfile contains one project and at least one (default) target. Targets contain task elements. Each task element of the buildfile can have an id attribute and can later be referred to by the value supplied to this. The value has to be unique.
</p></blockquote>
<p>
Ok, so we need to define a project, and some targets. Well, our project is called &#8216;AutomationProject&#8217; and our targets are concatenating files and packing the result afterwards. Here&#8217;s what I came up with:
</p>
<pre><code class="html">&lt;project name=\&quot;AutomationProject\&quot; default=\&quot;pack\&quot;&gt;

	&lt;property name=\&quot;packer_dir\&quot; location=\&quot;${basedir}\\packer\&quot; /&gt;
	&lt;property name=\&quot;js_dir\&quot; location=\&quot;${basedir}\\js\&quot; /&gt;

	&lt;target name=\&quot;concat_file\&quot;&gt;
		&lt;!-- Concatenate three file in the following order: file0.js, file1.js, file2.js. --&gt;
		&lt;concat destfile=\&quot;${js_dir}\\sol_uncompressed.js\&quot;&gt;
			&lt;filelist dir=\&quot;${js_dir}\&quot; files=\&quot;file0.js,file1.js,file2.js\&quot; /&gt;
		&lt;/concat&gt;

		&lt;echo&gt;file0.js, file1.js, file2.js concatenated.&lt;/echo&gt;
	&lt;/target&gt;	

	&lt;target name=\&quot;version\&quot; depends=\&quot;concat_file\&quot;&gt;
		&lt;!-- Replace \'__version__\' with \'0.1.1\' in the sol_uncompressed.js file. --&gt;
		&lt;replace file=\&quot;${js_dir}\\sol_uncompressed.js\&quot; token=\&quot;__version__\&quot; value=\&quot;0.1.1\&quot; /&gt; 

		&lt;echo&gt;\'__version__\' replaced with \'0.1.1\' in the sol_uncompressed.js file.&lt;/echo&gt;
	&lt;/target&gt;

	&lt;target name=\&quot;pack\&quot; depends=\&quot;version\&quot;&gt;
		&lt;!-- Pack the sol_uncompressed.js file. --&gt;
		&lt;exec dir=\&quot;${packer_dir}\&quot; executable=\&quot;cmd\&quot;&gt;
			&lt;arg line=\&quot;/c CScript /nologo pack.wsf ${js_dir}\\sol_uncompressed.js 62 1 1 &gt; ${js_dir}\\sol_packed.js\&quot;/&gt;
		&lt;/exec&gt;

		&lt;echo&gt;File sol_uncompressed.js packed to sol_packed.js&lt;/echo&gt;
	&lt;/target&gt;

&lt;/project&gt;</code></pre>
<p>
So basically, this <code>build.xml</code> does the following:
</p>
<ul>
<li>Concatenate the three files in the js folder and save the result as <code>sol_uncompressed.js</code>.</li>
<li>Replace &#8216;__version__&#8217; with &#8216;0.1.1&#8242; in the <code>sol_uncompressed.js</code> file.</li>
<li>Pack <code>sol_uncompressed.js</code> with Dean Edwards packer and save it as <code>sol_packed.js</code></li>
</ul>
<p>
You can run the build file by left clicking the file in the Project View and do <em>Run as</em> > <em>Ant Build</em>.
</p>
<div class="img">
<img src='http://solutoire.com/blog/wp-content/uploads/2007/05/ant_build.gif' alt='Ant Build' /></p>
<p><em>Running build.xml to build the project using Ant.</em></p>
</div>
<p>
As you can see in the build file I&#8217;m executing &#8216;cmd&#8217; with some parameters to pack the sol_uncompressed.js file. I used the <a href="http://dean.edwards.name/download/#packer">WSH version</a> of packer. This version can be executed from the commandline. It seems this WSH port of packer is not yet version 3.0, but <a href="http://dean.edwards.name/weblog/2007/04/packer3b2/#comment86443">Dean said on his blog</a> the ports of the latest version are ready to be released.
</p>
<h2>Download</h2>
<p>
If you want to try it yourself make sure you grab <a href="http://www.solutoire.com/download/AutomationProject.zip">the zipped Project folder</a> of the Project above. I recommend you read the <a href="http://ant.apache.org/manual/index.html">Ant manual</a>. It has lots of code examples that get you up and running in no time. If you have any questions, don&#8217;t hesitate to ask!</p>
]]></content:encoded>
			<wfw:commentRss>http://solutoire.com/2007/05/31/automate-aptana-with-ant/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>I like podcasts</title>
		<link>http://solutoire.com/2007/05/25/i-like-podcasts/</link>
		<comments>http://solutoire.com/2007/05/25/i-like-podcasts/#comments</comments>
		<pubDate>Fri, 25 May 2007 05:59:24 +0000</pubDate>
		<dc:creator>Bas Wenneker</dc:creator>
				<category><![CDATA[Other]]></category>
		<category><![CDATA[podcast]]></category>
		<category><![CDATA[web2.0]]></category>

		<guid isPermaLink="false">http://solutoire.com/2007/05/25/i-like-podcasts/</guid>
		<description><![CDATA[
Hi there, this is the first post since the new design of solutoire.com. I&#8217;m writing about web2.0 podcasts. I find myself listening lots of podcasts the last few months and I thought maybe I should share my opinions about them, and show you where to find good podcasts.

Ajaxian: Audible Ajax (20 podcasts)

If you don&#8217;t know [...]]]></description>
			<content:encoded><![CDATA[<p>
Hi there, this is the first post since the new design of solutoire.com. I&#8217;m writing about web2.0 podcasts. I find myself listening lots of podcasts the last few months and I thought maybe I should share my opinions about them, and show you where to find good podcasts.
</p>
<h2>Ajaxian: Audible Ajax (20 podcasts)</h2>
<p>
If you don&#8217;t know this one you&#8217;d better go and download some <a href="http://ajaxian.com/podcast/" title="Download Audible Ajax from Ajaxian.com">episodes from Ajaxian</a>. <a href="http://www.almaer.com/blog/">Dion Almaer</a> and <a href="http://www.galbraiths.org/blog/">Ben Galbraith</a> are producing by far the best podcasts around. Every release they share the latest thoughts on all kinds of web applications, ajax libraries etc. So far they released 20 episodes of (average) 30 minutes, the overall sound quality is ok.
</p>
<h2>Web 2.0 Show (35 podcasts)</h2>
<p>
<a href="http://www.web20show.com/" title="Web2.0 Show Podcasts">Web20show.com</a> is another great source for podcasts about, you&#8217;ll never guess, web2.0! Here&#8217;s what <a href="http://www.justhack.com/">Chris</a> and <a href="http://josh.the-owens.com/">Josh</a> say about their broadcasts:
</p>
<blockquote><p>The Web 2.0 Show is a podcast about emerging technologies commonly referred to as &#8220;Web 2.0&#8243;. We focus on interviewing the developers and entrepreneurs who are creating the next generation of web services and media delivery. Our goal is to help you figure out where the web is headed. Like you, we are hard at work developing our own cool projects. Maybe we can learn something together.</p></blockquote>
<p>
The stuff they&#8217;re talking about and the interviews they do are really exciting. It&#8217;s definitely worth trying.
</p>
<h2>Software As She’s Developed (26 podcasts)</h2>
<p>
Another great podcaster is <a href="http://softwareas.com/category/podcast/" title="Software As She’s Developed">Michael Mahemoff</a>, a freelance software architect based in London. He has some great podcasts about web2.0 usability, ajax patterns and javascript unit testing. The content is great, a downside is the Australian accent of Michael, which start to annoy me after a while.</p>
]]></content:encoded>
			<wfw:commentRss>http://solutoire.com/2007/05/25/i-like-podcasts/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ajax Resources</title>
		<link>http://solutoire.com/2006/12/06/ajax-resources/</link>
		<comments>http://solutoire.com/2006/12/06/ajax-resources/#comments</comments>
		<pubDate>Wed, 06 Dec 2006 20:10:50 +0000</pubDate>
		<dc:creator>Bas Wenneker</dc:creator>
				<category><![CDATA[Other]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[resources]]></category>

		<guid isPermaLink="false">http://solutoire.com/2006/12/06/ajax-resources/</guid>
		<description><![CDATA[I haven&#8217;t updated ajax.solutoire.com for a while, but lately I had some time to work on it. So I rewrote the page from scratch. It&#8217;s more lightweight than before. I also added like 100 new resources. I&#8217;ll promise to keep it more up-to-date now&#8230; Please take a visit and see it yourself.
]]></description>
			<content:encoded><![CDATA[<p>I haven&#8217;t updated ajax.solutoire.com for a while, but lately I had some time to work on it. So I rewrote the page from scratch. It&#8217;s more lightweight than before. I also added like 100 new resources. I&#8217;ll promise to keep it more up-to-date now&#8230; <a href="http://ajax.solutoire.com" title="ajax.solutoire.com ajax resources">Please take a visit</a> and see it yourself.</p>
]]></content:encoded>
			<wfw:commentRss>http://solutoire.com/2006/12/06/ajax-resources/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
