<?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>esoTalk Blog</title>
	<atom:link href="http://esotalk.org/blog/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://esotalk.org/blog</link>
	<description></description>
	<lastBuildDate>Wed, 18 Jan 2012 13:07:32 +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>The Future of esoTalk</title>
		<link>http://esotalk.org/blog/index.php/2012/01/18/the-future-of-esotalk/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=the-future-of-esotalk</link>
		<comments>http://esotalk.org/blog/index.php/2012/01/18/the-future-of-esotalk/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 13:07:32 +0000</pubDate>
		<dc:creator>Toby</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://esotalk.org/blog/?p=30</guid>
		<description><![CDATA[A couple of months ago, I released the &#8220;new version of esoTalk&#8221;, known as esoTalk gamma. It was relatively well-received by esoTalk&#8217;s small community; I was quite confident in the product, and excited to keep developing and see where it &#8230; <a href="http://esotalk.org/blog/index.php/2012/01/18/the-future-of-esotalk/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A couple of months ago, I <a href="http://esotalk.org/forum/3-esotalk-1-0-0g1-released">released the &#8220;new version of esoTalk&#8221;</a>, known as esoTalk gamma. It was relatively well-received by esoTalk&#8217;s small community; I was quite confident in the product, and excited to keep developing and see where it went.</p>
<p>A short time later, I <a href="http://esotalk.org/forum/35-conversion-to-laravel-framework">realised that I had made a huge mistake</a>, and had wasted months of development on a product that would ultimately need to be rewritten—again.</p>
<h1>Fatal Error: $coding_ego too large</h1>
<p>So, what did I do wrong? To summarise it in a few words: I reinvented the wheel. Many times.</p>
<p>When I rewrote esoTalk, I wrote it from scratch, using no frameworks and no libraries. I wrote all of my own code to do things—database, MVC, session, JavaScript, etc.—when there was already code out there that was free, open-source, actively maintained, and most importantly, <em>better</em>.</p>
<p>Why did I do this? I had some kind of prejudice or bias against frameworks and code that other people wrote. I shallowly assumed that <em>all </em>PHP frameworks were big and clunky like CakePHP, and I didn&#8217;t want to have anything to do with them.</p>
<p>Stupid preconceptions aside, I started to discover the power of frameworks and libraries, and the amount of time it would save. I mean, you get all this stuff for free! Code, development, documentation—a whole bunch of stuff taken off your hands that you don&#8217;t have to worry about anymore.</p>
<h1>Cair Paravel&#8230; er, Laravel</h1>
<p>Then I discovered <a href="http://laravel.com">Laravel</a>. Laravel took all my concerns about frameworks being slow, complex, and clunky, and threw them out the window. It is beautifully easy. I immediately decided that I wanted to rewrite esoTalk upon Laravel.</p>
<p>Since then, I made a <a href="https://github.com/esotalk/esoTalk/tree/feature/laravel">small start on the conversion to Laravel</a>, but it&#8217;s unfortunately quite a mammoth task at hand and I wasn&#8217;t getting very far. I decided to take a break from esoTalk and dedicate my time to other projects I&#8217;m working on, including ones that use Laravel to increase my experience with it.</p>
<p>Through these projects, I also discovered <a href="http://twitter.github.com/bootstrap/">Twitter Bootstrap</a> which I think will work very well for esoTalk. I&#8217;m sure I&#8217;ll discover more handy libraries now that I know that I <em>should </em>be looking<em>.</em></p>
<p>Now, as I wrap these other projects up, I&#8217;m approaching the start of my university course. This quite simply means I will have very little time to work on esoTalk.</p>
<h1>Inactive Development</h1>
<p>I&#8217;m sorry to say this, but&#8230; <strong>Consider esoTalk on hold, indefinitely. </strong>Again.</p>
<p>Note, though, that I said &#8220;on hold&#8221; instead of &#8220;abandoned&#8221; or &#8220;given up.&#8221; And I said &#8220;indefinitely&#8221; instead of &#8220;forever&#8221; or &#8220;for 20 years.&#8221;</p>
<p>I think esoTalk is an amazing, unique piece of discussion software. It throws out all of the archaic forum conventions and provides a modern solution for discussion on the web. Rest assured that one day—perhaps a year from now, perhaps more—I will release an esoTalk that will blow all other forum software out of the water.</p>
<p>I will continue work on esoTalk as a hobby whenever I get the chance. I&#8217;ll still be around on the <a href="http://esotalk.com/forum">support forums</a>. Just don&#8217;t expect any releases or updates anytime soon.</p>
<p>Of course, feel free to <a href="http://git.io/esotalk">fork the project on GitHub</a> and make your own improvements. The current version isn&#8217;t horrible, it&#8217;s just not what I want esoTalk to be in the long-term.</p>
]]></content:encoded>
			<wfw:commentRss>http://esotalk.org/blog/index.php/2012/01/18/the-future-of-esotalk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>An Introduction to esoTalk&#8217;s Code</title>
		<link>http://esotalk.org/blog/index.php/2011/11/16/an-introduction-to-esotalks-code/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=an-introduction-to-esotalks-code</link>
		<comments>http://esotalk.org/blog/index.php/2011/11/16/an-introduction-to-esotalks-code/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 11:22:57 +0000</pubDate>
		<dc:creator>Toby</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://esotalk.org/blog/?p=22</guid>
		<description><![CDATA[When rewriting esoTalk, I had two goals in mind: to make the code straightforward and easy to understand, and to make the code easily extensible. Achieving these things would encourage developers to contribute and collaborate on the core code, and &#8230; <a href="http://esotalk.org/blog/index.php/2011/11/16/an-introduction-to-esotalks-code/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>When rewriting esoTalk, I had two goals in mind: to make the code straightforward and easy to understand, and to make the code easily extensible. Achieving these things would encourage developers to contribute and collaborate on the core code, and extend the software by writing plugins and skins.</p>
<p>I&#8217;m not a big fan of dependencies. When I make software, I like to have complete control and understanding over everything I&#8217;m working with—that&#8217;s just the way I work as a programmer, I guess. Perhaps it&#8217;s a flaw. Perhaps not. But for this reason, I chose not to use an existing PHP framework.</p>
<p>Every framework makes assumptions about the applications that will be built upon it, and therefore you&#8217;re likely to lose a layer of control and efficiency when building upon one. With an application like esoTalk, which has a very specific purpose, I wanted to keep the code focused and concise. Instead of using a framework, I built my own pseudo-framework specifically for esoTalk. I planned everything out in a way I thought was logical, and only included components that esoTalk needs.</p>
<p>I&#8217;m pretty happy with the result. While it may not be as robust, powerful, or proven as existing frameworks, it can be and is tailored specifically to esoTalk&#8217;s needs—and that&#8217;s an advantage.</p>
<p>Since it might be a little while before proper documentation is out (although it is a high priority!), I thought I&#8217;d write a blog post about the basics of the esoTalk &#8220;framework&#8221;. Most of this can be learned by reading inline documentation (in code comments), but I thought it would be good to lay it all out together in a more understandable way.</p>
<h1>ET</h1>
<p>&#8220;ET&#8221; is used as a prefix for every class in esoTalk, and obviously stands for &#8220;esoTalk&#8221;.</p>
<p>There is a static class named &#8220;ET&#8221;. This class serves as a central means of access to various services and functions which are needed around the application, including:</p>
<ul>
<li>the database object (ET::$database)</li>
<li>the session object (ET::$session)</li>
<li>configuration reading &amp; writing (ET::config() and ET::writeConfig())</li>
<li>language translation (ET::translate(), ET::define(), ET::loadLanguage())</li>
<li>lazy instantiation of various classes (ET::memberModel(), ET::formatter(), etc.)</li>
<li>loaded plugins (ET::$plugins)</li>
<li>the loaded skin (ET::$skin)</li>
<li>event triggering (ET::trigger())</li>
<li>error rendering (ET::pageNotFound() and ET::fatalError())</li>
</ul>
<h1>ETFactory</h1>
<p>ETFactory is a static class which simply allows classes to be instantiated without having to know what the real name of the class is. For example, the database object could be created using ETFactory::make(&#8220;database&#8221;), whatever class that may refer to, be it the default ETDatabase or some class that a plugin may want to override the default with.</p>
<h1>Anatomy of a Request</h1>
<p>The only point of entry to esoTalk is index.php. Every request goes through this file. The process that takes place in index.php is as follows:</p>
<ol>
<li>Set up the environment. Define constants, set up error handling, etc.</li>
<li>Include the configuration files. config.defaults.php is included first, and then anything in config/config.php takes precedence.</li>
<li>Register default classes with ETFactory, including helpers, models, and controllers.</li>
<li>Include plugins.</li>
<li>Instantiate the cache, session, and database objects, and set them as properties of the static ET class.</li>
<li>Include the skin and language.</li>
<li>Parse the request string (The &#8220;conversation/lock/123&#8243; part of &#8220;http://esotalk.org/forum/conversation/lock/123&#8243;):</li>
<ul>
<li>The first part maps to the controller.</li>
<li>The second part maps to the controller method, if it exists as a non-inherited public method of the controller class. Otherwise, we default to the &#8220;index&#8221; method.</li>
<li>Any subsequent parts map to arguments which are passed to the controller method.</li>
</ul>
<li>Dispatch the method and arguments to the controller. For &#8220;conversation/lock/123&#8243;, we will essentially be calling the &#8220;lock&#8221; method of the &#8220;conversation&#8221; controller, passing &#8220;123&#8243; as a function argument.</li>
</ol>
<h1>Controllers</h1>
<p>A controller takes user input from a request, handles it, and responds by rendering content/data.</p>
<p>Controllers inherit a bunch of methods to do things common to the esoTalk web interface, including methods to:</p>
<ul>
<li>Respond by rendering views or redirecting ($this-&gt;render(), $this-&gt;redirect())</li>
<li>Set data to be passed to a view before it is rendered ($this-&gt;data())</li>
<li>Add messages to be displayed when the page is rendered ($this-&gt;message())</li>
<li>Add JS/CSS files to be included on the page ($this-&gt;addJSFile(), $this-&gt;addCSSFile())</li>
</ul>
<p>Let&#8217;s take a look at what a controller method could look like:</p>
<pre>public function index($memberId)
{
    // Insert code to get member data for the $memberId.
    // Let's assume that we get this data and set it to $member.

    // Pass along the $member data to the view.
    $this-&gt;data("member", $member);

    // Show a message in the bottom-left of the screen, because we can.
    $this-&gt;message("Hi, this is a message.", "warning");

    // Render the page, specifying what view we want to use.
    $this-&gt;render("member/profile");
}</pre>
<h1>Views</h1>
<p>Views are simply files that output HTML code. Following along from the previous example, our &#8220;member/profile&#8221; view might look like:</p>
<pre>&lt;?php
$member = $data["member"];
?&gt;
&lt;h1&gt;&lt;?php echo $member["username"]; ?&gt;'s Profile&lt;/h1&gt;</pre>
<h1>Response Types</h1>
<p>The response type specifies the type of content that we want the controller to respond with. The response type can be specified in the request by putting a period following the method name, followed by the response type we want. For example, &#8220;conversation/lock.json/123&#8243; would set the controller&#8217;s response type to &#8220;json&#8221; and call the &#8220;lock&#8221; method.</p>
<p>By default, the response type is &#8220;default&#8221;, which instructs the controller&#8217;s render() method to render the content inside the master view (the HTML wrapper.) Other response types include:</p>
<ul>
<li>&#8220;view&#8221;, which will render just the inner view without the HTML wrapper.</li>
<li>&#8220;json&#8221;, which will output a JSON object using data collected with the $this-&gt;json() method in a controller.</li>
<li>&#8220;ajax&#8221;, which is the same as &#8220;json&#8221;, but will render the inner view into the &#8220;view&#8221; key of the JSON object.</li>
</ul>
<h1>Models</h1>
<p>Models handle data. A model contains methods to read and write data specific to a type of record. For example, some of the methods in the conversation controller are getById, getMembersAllowed, addReply, and setSticky.</p>
<p>Data should almost always be read and written using models. This allows models to enforce data integrity and keeps everything consistent between controllers.</p>
<h1>Conclusion</h1>
<p>I think that covers all of the basic parts of code that make up esoTalk. Of course, there are other helper classes and functions (to help with building SQL queries, URLs, forms, uploading files, formatting text, and rendering common assets), but I won&#8217;t go into detail about them right now. All functions and methods are documented, and I&#8217;ve made sure to write plenty of inline comments, so you can discover a lot just by looking through the source code. Don&#8217;t hesitate to ask questions on the <a href="http://esotalk.org/forum">esoTalk support forum</a>!</p>
<p>Again, I&#8217;m pretty happy with the code structure of esoTalk. It&#8217;s simple, efficient, and extensible. But, of course, there&#8217;s always room for improvement—what are your thoughts, and how could esoTalk&#8217;s code structure be made better?</p>
]]></content:encoded>
			<wfw:commentRss>http://esotalk.org/blog/index.php/2011/11/16/an-introduction-to-esotalks-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The State of esoTalk: Roadmap</title>
		<link>http://esotalk.org/blog/index.php/2011/11/14/the-state-of-esotalk-roadmap/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=the-state-of-esotalk-roadmap</link>
		<comments>http://esotalk.org/blog/index.php/2011/11/14/the-state-of-esotalk-roadmap/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 04:31:38 +0000</pubDate>
		<dc:creator>Toby</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://esotalk.org/blog/?p=17</guid>
		<description><![CDATA[Today, esoTalk 1.0.0g1 was released. This version is very much a beta—it&#8217;s unfinished, unstable, and buggy. Nevertheless, I&#8217;m glad to finally get the new version out into the open, especially in a state where things should be able to move &#8230; <a href="http://esotalk.org/blog/index.php/2011/11/14/the-state-of-esotalk-roadmap/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Today, <a href="http://esotalk.org/forum/index.php/3-esotalk-1-0-0g1-released" target="_blank">esoTalk 1.0.0g1 was released</a>. This version is very much a beta—it&#8217;s unfinished, unstable, and buggy. Nevertheless, I&#8217;m glad to finally get the new version out into the open, especially in a state where things should be able to move forward quite quickly. This is where I&#8217;ll hopefully see my months and months of hard work start to pay off!</p>
<p>So, what about this &#8220;moving forward&#8221;? What happens now? In simplest terms, development continues, until we get something feature-complete and stable, and we work towards building an infrastructure that encourages active development of plugins and skins. In more detail (and with loose time goals in parenthesis)&#8230;</p>
<h1>Feature-Complete (End of November)</h1>
<p>The version of esoTalk released today is missing a bunch of essential features. Atom Feeds, XML Sitemaps, Emoticons, CAPTCHA, and IE7 support are the main ones. It also need a thorough security review and many additional plugin hooks. Over the next month or so, I&#8217;ll be aiming to implement all of this and have esoTalk in a relatively stable state, sans a few minor bugs and issues. Also high on my priority list will be writing extensive documentation and working on a few more plugins.</p>
<h1>Ecosystem (Mid-December)</h1>
<p>After esoTalk&#8217;s development is wrapping up (and hopefully the community has come on board with helping out!) I&#8217;ll begin working on developing an ecosystem for plugins, skins, and languages. This will encourage active development, enabling developers to easily distribute and update their esoTalk extensions. I also want to streamline the process for installing plugins, skins, and languages.</p>
<h1>Stable Launch (January)</h1>
<p>Once the above things come together, and the issues list calms down, I&#8217;ll prepare for a stable launch of the esoTalk software. I&#8217;ll do a bunch of promotion to try and spread the use of esoTalk and build up a nice, healthy community of our own. And then I&#8217;ll party!</p>
<p>After that, I&#8217;ll go down to my secret lair to begin work on a secret project.</p>
]]></content:encoded>
			<wfw:commentRss>http://esotalk.org/blog/index.php/2011/11/14/the-state-of-esotalk-roadmap/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Aggregating JavaScript &amp; CSS</title>
		<link>http://esotalk.org/blog/index.php/2011/11/05/aggregating-javascript-css/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=aggregating-javascript-css</link>
		<comments>http://esotalk.org/blog/index.php/2011/11/05/aggregating-javascript-css/#comments</comments>
		<pubDate>Sat, 05 Nov 2011 13:01:48 +0000</pubDate>
		<dc:creator>Toby</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://esotalk.org/blog/?p=4</guid>
		<description><![CDATA[Welcome to the new and not-so-improved esoTalk blog! For anyone reading who doesn&#8217;t know, esoTalk is free, open-source forum software which is currently in development. I&#8217;m Toby, the person developing it. This blog is about my experiences doing so. It &#8230; <a href="http://esotalk.org/blog/index.php/2011/11/05/aggregating-javascript-css/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Welcome to the new and not-so-improved esoTalk blog! For anyone reading who doesn&#8217;t know, <a href="http://esotalk.org">esoTalk</a> is free, open-source forum software which is currently in development. I&#8217;m Toby, the person developing it. This blog is about my experiences doing so. It will also probably end up being a place where I go to vent my frustration with Internet Explorer. But I&#8217;m sure that&#8217;s interesting enough, right?</p>
<p>At this stage, development is starting to wrap up. I&#8217;m working on some more minor &#8220;clean-up&#8221; kind of tasks which might not be viewed as essential features, but will add that extra bit of polish to esoTalk and bring it a cut above the rest. One of these features is automatic, built-in aggregation and minification of JavaScript and CSS files.</p>
<h1>The Tale of Too Many Files</h1>
<p>It&#8217;s pretty common knowledge among the web development community that more HTTP requests equals slower page load times. Especially when CSS and JavaScript requests are <a href="http://code.google.com/speed/page-speed/docs/rtt.html#CombineExternalJS">page-blocking</a>, meaning that the page will only be rendered in the browser when they&#8217;ve completed, it&#8217;s essential for this aspect of a web site to be optimised.</p>
<p>With a basic web site, you could just throw all of your JavaScript and CSS in one file each and be done with it. But the task is made a bit more difficult with an application like esoTalk. Each page may require a different set of JavaScript code and CSS styles, and it would be inefficient to put every page&#8217;s code in one huge global file of several hundred kilobytes. Furthermore, with assorted jQuery plugins being used selectively by each page, the number of HTTP requests can get unacceptably large.</p>
<h1>Aggregation, the Right Way</h1>
<p>So, we need to aggregate our resources, but we don&#8217;t want to aggregate them all at once or the file will be ridiculously large. What an <em>aggravating</em> problem!</p>
<p>The solution is to aggregate files based on their usage around the different interfaces of the application: globally, and locally. This keeps the global code consistent across pages so it can be effectively cached by the user&#8217;s browser, and then anything on top of that is generally just a single HTTP request.</p>
<p>esoTalk&#8217;s API implements this functionality by allowing JavaScript and CSS files to be added to the controller in groups:</p>
<pre>$controller-&gt;addJSFile(array("jquery.plugin.js", "conversation.js"));</pre>
<p>&#8230;or to the global aggregation:</p>
<pre>$controller-&gt;addJSFile("jquery.js", true);</pre>
<h1>Short and Static</h1>
<p>An obvious way to go from here, now that we have lists of all of the files we want to aggregate together, might be to output &lt;script&gt; and &lt;link&gt; tags referencing a PHP script that will get the contents of the specified files and serve them all up together in a nice minified clump. Of course, we can implement a caching solution to get rid of the overhead of reading each individual JavaScript or CSS file and running the minifier, and we can send headers with our response to encourage the browser to cache the result.</p>
<p>This is the approach that <a href="http://code.google.com/p/minify/">Minify</a>, a PHP app that aggregates JS/CSS files, seems to take. However, as Minify even mentions itself, this can be a bit dangerous:</p>
<blockquote><p>Minify is designed for efficiency, but, for very high traffic sites, Minify may serve files slower than your HTTPd due to the CGI overhead of PHP.</p></blockquote>
<p>It&#8217;d be much safer to be able to serve up a static file, scrap the CGI overhead, and let the web server handle things like caching headers and gzipping on its own. That is, after all, what web servers are good at!</p>
<p>This is what esoTalk does. When the page is finally outputted, esoTalk checks its cache folder for these aggregations, or if they haven&#8217;t been created, it concatenates the contents of all the files in the aggregation, minifies the result, and writes it out to a static file.</p>
<p>These static aggregation files are then used as the source for our JavaScript and CSS, so we get something like:</p>
<pre>&lt;link rel='stylesheet' href='/esoTalk/esotalk/cache/css/base,styles,debug.css'&gt;
&lt;script src='/esoTalk/esotalk/cache/js/jquery,jquery.misc,jquery.history,jquery.scrollTo,global.js'&gt;&lt;/script&gt;
&lt;script src='/esoTalk/esotalk/cache/js/jquery.cookie,autocomplete,search.js'&gt;&lt;/script&gt;</pre>
<p>That&#8217;s aggre-<em>great</em>!</p>
<h1>Pitfalls</h1>
<p>There are a couple of pitfalls with this kind of aggregation, but nothing that should prevent us from still using it.</p>
<p>The first is over-caching. We generate these aggregation files at one point in time, and then they remain the same until we delete the cached files. Naturally, we&#8217;d do this whenever the software is upgraded to a new version, and maybe even once every 24 hours or so, just to be safe. Regardless, this can still make development a bit of a pain—needing to delete the cached files every time you make a change to a JavaScript or CSS file is just a little bit too tedious for my liking!</p>
<p>My quick and dirty solution for esoTalk is to disable aggregation/caching all together if the &#8220;debug&#8221; option is turned on in esoTalk&#8217;s configuration. Most plugin and skin development should be done with the debug setting turned on anyway.</p>
<p>The other pitfall is that use of a CDN (Content Delivery Network) would be tricky. esoTalk does offer an option to serve all explicitly-defined static resources from a different URL, but since our aggregation files are stored in the &#8220;cache&#8221; folder, and the exact scripts and stylesheets included will vary from page to user, we can&#8217;t really rely on a CDN to serve these files. I don&#8217;t currently have a solution for this, but I&#8217;ll definitely keep on thinking about it.</p>
<h1>Conclusion</h1>
<p>This is by far the most efficient form of JavaScript + CSS aggregation I can think of, and it&#8217;s built right into the core of the new version of esoTalk. We get a significantly reduced number of HTTP requests with consistent and cacheable aggregation, the size-reduction of minification, and optimisation and compression from the web server, all without the overhead of PHP/CGI.</p>
]]></content:encoded>
			<wfw:commentRss>http://esotalk.org/blog/index.php/2011/11/05/aggregating-javascript-css/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

