<?xml version="1.0"?>
<rdf:RDF
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:foaf="http://xmlns.com/foaf/0.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns="http://purl.org/rss/1.0/"
>
<channel rdf:about="http://www.planetmvc.com/catalyst">
	<title>Planet MVC / Catalyst</title>
	<link>http://www.planetmvc.com/catalyst</link>
	<description>Planet MVC / Catalyst - http://www.planetmvc.com/catalyst</description>

	<items>
		<rdf:Seq>
			<rdf:li rdf:resource="http://marcusramberg.livejournal.com/41163.html" />
			<rdf:li rdf:resource="http://marcusramberg.livejournal.com/40267.html" />
			<rdf:li rdf:resource="http://www.onemogin.com/blog/554-profile-your-catalystdbixclass-app-with-querylog.html" />
			<rdf:li rdf:resource="urn:uuid:0db478a3-00e3-4679-a5d2-8b8f648bca0c" />
		</rdf:Seq>
	</items>
</channel>

<item rdf:about="http://marcusramberg.livejournal.com/41163.html">
	<title>Marcus Ramberg: New maintenance release of Catalyst-Runtime.</title>
	<link>http://marcusramberg.livejournal.com/41163.html</link>
	<content:encoded>This week we pushed a new Catalyst release to cpan. While it doesn't contain any revolutionary news, it has some neat performance improvements and bug fixes that makes it well worth the upgrade. Check out the release announcement &lt;a href=&quot;http://www.mail-archive.com/catalyst@lists.rawmode.org/msg04347.html&quot;&gt;here&lt;/a&gt;.</content:encoded>
	<dc:date>2007-03-15T13:36:08+00:00</dc:date>
</item>
<item rdf:about="http://marcusramberg.livejournal.com/40267.html">
	<title>Marcus Ramberg: How to update your primary key with current DBIx::Class CPAN release</title>
	<link>http://marcusramberg.livejournal.com/40267.html</link>
	<content:encoded>&lt;pre&gt;10:41 &amp;lt;@mst&amp;gt; marcus: 
    $obj-&amp;gt;result_source
        -&amp;gt;resultset
        -&amp;gt;search($obj-&amp;gt;ident_condition)
        -&amp;gt;update({ id =&amp;gt; $new_id })
&lt;/pre&gt;&lt;br /&gt;&lt;em&gt;From the #dbix-class channel on irc.perl.org&lt;/em&gt;</content:encoded>
	<dc:date>2007-03-08T12:58:38+00:00</dc:date>
</item>
<item rdf:about="http://www.onemogin.com/blog/554-profile-your-catalystdbixclass-app-with-querylog.html">
	<title>Cory 'G' Watson: Profile Your Catalyst/DBIC App with QueryLog</title>
	<link>http://www.onemogin.com/blog/554-profile-your-catalystdbixclass-app-with-querylog.html</link>
	<content:encoded>&lt;p&gt;Months ago I implemented DBIx::Class::Storage::Statistics with the intent of making some sort of profiling tool.  I finally got off my ass and did it.  DBIx::Class::QueryLog should be on CPAN this weekend.&lt;/p&gt;

&lt;p&gt;At $work we are replacing a legacy system with one based on Catalyst.  One of the deliverables for this year is a new order entry application.  Since our customer service folks are used to working in a terminal based system speed is of great concern to us.&lt;/p&gt;

&lt;p&gt;So I installed DBIx::Class::QueryLog as the debugobj as described in it&amp;#8217;s documentation, dropped it in the stash and added some code to our wrapper.tmpl:&lt;/p&gt;

&lt;p&gt;&lt;pre class=&quot;html4strict&quot;&gt;[% IF querylog %]
      &lt;span&gt;&lt;a href=&quot;http://december.com/html/4/element/div.html&quot;&gt;&lt;span&gt;&amp;lt;div&lt;/span&gt;&lt;/a&gt; &lt;span&gt;class&lt;/span&gt;=&lt;span&gt;&amp;quot;featurebox&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span&gt;&lt;a href=&quot;http://december.com/html/4/element/h3.html&quot;&gt;&lt;span&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;Query Log Report&lt;span&gt;&lt;span&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;&lt;/span&gt;
        [% SET total = querylog.time_elapsed | format('%0.6f') %]
        &lt;span&gt;&lt;a href=&quot;http://december.com/html/4/element/div.html&quot;&gt;&lt;span&gt;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;Total SQL Time: [% total | format('%0.6f') %] seconds&lt;span&gt;&lt;span&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;
        [% SET qcount = querylog.count %]
        &lt;span&gt;&lt;a href=&quot;http://december.com/html/4/element/div.html&quot;&gt;&lt;span&gt;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;Total Queries: [% qcount %]&lt;span&gt;&lt;span&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;
        [% IF qcount %]
        &lt;span&gt;&lt;a href=&quot;http://december.com/html/4/element/div.html&quot;&gt;&lt;span&gt;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;Avg Statement Time: [% (querylog.time_elapsed / qcount) | format('%0.6f') %] seconds.&lt;span&gt;&lt;span&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span&gt;&lt;a href=&quot;http://december.com/html/4/element/div.html&quot;&gt;&lt;span&gt;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;
         &lt;span&gt;&lt;a href=&quot;http://december.com/html/4/element/table.html&quot;&gt;&lt;span&gt;&amp;lt;table&lt;/span&gt;&lt;/a&gt; &lt;span&gt;class&lt;/span&gt;=&lt;span&gt;&amp;quot;table1&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span&gt;&lt;a href=&quot;http://december.com/html/4/element/thead.html&quot;&gt;&lt;span&gt;&amp;lt;thead&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;
           &lt;span&gt;&lt;a href=&quot;http://december.com/html/4/element/tr.html&quot;&gt;&lt;span&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;
            &lt;span&gt;&lt;a href=&quot;http://december.com/html/4/element/th.html&quot;&gt;&lt;span&gt;&amp;lt;th&lt;/span&gt;&lt;/a&gt; &lt;span&gt;colspan&lt;/span&gt;=&lt;span&gt;&amp;quot;3&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;5 Slowest Queries&lt;span&gt;&lt;span&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;&lt;/span&gt;
           &lt;span&gt;&lt;span&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;/thead&amp;gt;
          &lt;span&gt;&lt;a href=&quot;http://december.com/html/4/element/tbody.html&quot;&gt;&lt;span&gt;&amp;lt;tbody&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;
           &lt;span&gt;&lt;a href=&quot;http://december.com/html/4/element/tr.html&quot;&gt;&lt;span&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;
            &lt;span&gt;&lt;a href=&quot;http://december.com/html/4/element/th.html&quot;&gt;&lt;span&gt;&amp;lt;th&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;Time&lt;span&gt;&lt;span&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span&gt;&lt;a href=&quot;http://december.com/html/4/element/th.html&quot;&gt;&lt;span&gt;&amp;lt;th&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;%&lt;span&gt;&lt;span&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span&gt;&lt;a href=&quot;http://december.com/html/4/element/th.html&quot;&gt;&lt;span&gt;&amp;lt;th&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;SQL&lt;span&gt;&lt;span&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;&lt;/span&gt;
           &lt;span&gt;&lt;span&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;&lt;/span&gt;
           [% SET i = 0 %]
           [% FOREACH q = querylog.get_sorted_queries %]
           &lt;span&gt;&lt;a href=&quot;http://december.com/html/4/element/tr.html&quot;&gt;&lt;span&gt;&amp;lt;tr&lt;/span&gt;&lt;/a&gt; &lt;span&gt;class&lt;/span&gt;=&lt;span&gt;&amp;quot;[% IF loop.count % 2 %]odd[% END %]&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span&gt;&lt;a href=&quot;http://december.com/html/4/element/th.html&quot;&gt;&lt;span&gt;&amp;lt;th&lt;/span&gt;&lt;/a&gt; &lt;span&gt;class&lt;/span&gt;=&lt;span&gt;&amp;quot;sub&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;[% q.time_elapsed | format('%0.6f') %]
            &lt;span&gt;&lt;a href=&quot;http://december.com/html/4/element/td.html&quot;&gt;&lt;span&gt;&amp;lt;td&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;[% ((q.time_elapsed / total ) * 100 ) | format('%i') %]%&lt;span&gt;&lt;span&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span&gt;&lt;a href=&quot;http://december.com/html/4/element/td.html&quot;&gt;&lt;span&gt;&amp;lt;td&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;[% q.sql %]&lt;span&gt;&lt;span&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&lt;/span&gt;
           &lt;span&gt;&lt;span&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;&lt;/span&gt;
           [% IF i == 5 %]
            [% LAST %]
           [% END %]
           [% SET i = i + 1 %]
           [% END %]
          &lt;span&gt;&lt;span&gt;&amp;lt;/tbody&amp;gt;&lt;/span&gt;&lt;/span&gt;
         &lt;span&gt;&lt;span&gt;&amp;lt;/table&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span&gt;&lt;span&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;
        [% END %]
      &lt;span&gt;&lt;span&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;
      [% END %]

&lt;p&gt;The first run yielded this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.onemogin.com/blog/stuff/querylog1.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Well.  That select from users could use an index on username, eh?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.onemogin.com/blog/stuff/querylog2.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Weee!  That one disappeared.  What are all these role selections?  We use Catalyst::Plugin::Authorization::Roles but this looks fishy.  We might could use an index on the role name but there are only 6 rows in that table.  A bit more investigation finds a loop in our Root controller that iterates over a set of roles calling check_user_roles() to try and find out where we should redirect the user.  So lets swap that out for creating an array of roles and using grep&amp;#8230;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.onemogin.com/blog/stuff/querylog3.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Kick ass!  We are down to two measly queries.  We reduced the number of queries by about 75% and decreased the time spent executing SQL by about 75% as well.  These queries were being executed on &lt;strong&gt;every&lt;/strong&gt; page load.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt;Yeah, the average statement time was broken during that.  Oops.&lt;/p&gt;</content:encoded>
	<dc:date>2007-03-01T20:37:01+00:00</dc:date>
</item>
<item rdf:about="urn:uuid:0db478a3-00e3-4679-a5d2-8b8f648bca0c">
	<title>Robby Russell: Meet... Chris, Graeme., and Gary</title>
	<link>http://feeds.feedburner.com/~r/RobbyOnRails/~3/96318858/meet-chris-graeme-and-gary</link>
	<content:encoded>&lt;p&gt;Okay, this is a little overdue&amp;#8230; but better late than never! ;-)&lt;/p&gt;


	&lt;p&gt;We&amp;#8217;ve had several new people start with &lt;a href=&quot;http://www.planetargon.com&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PLANET ARGON&lt;/span&gt;&lt;/a&gt; over the past few months. Some of them are blogging about their experience of working with &lt;a href=&quot;http://www.rubyonrails.org&quot;&gt;Ruby on Rails&lt;/a&gt; and being a part of our team. I wanted to quickly introduce you to a few of them and their blogs, which I hope that you consider subscribing to.&lt;/p&gt;


	&lt;strong&gt;Chris&lt;/strong&gt;


	&lt;p&gt;&lt;a href=&quot;http://flickr.com/photos/gary_blessington/403127674/&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/151/403127674_8449784bae_m.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;For quite some time, we&amp;#8217;ve been needing more design assistance, so late last year&amp;#8230; we hired &lt;strong&gt;Chris Griffin&lt;/strong&gt;, who moved here last year from Florida. He&amp;#8217;s our new User Interface Designer and gets to work within the Rails environment everyday with the rest of us. It seems that &lt;a href=&quot;http://blog.brightredglow.com&quot;&gt;Brian&lt;/a&gt; and Chris worked over the weekend to get &lt;a href=&quot;http://chriszgriffin.com/&quot;&gt;his new blog&lt;/a&gt; up. Chris is &lt;em&gt;self-proclaimed genius&lt;/em&gt;. I suggest that you keep an eye on his blog&amp;#8230; because I&amp;#8217;m sure it&amp;#8217;s going to be a pretty active one. Chris joining our team marks a pivotal point in our teams evolution as we continue to place more emphasis in our Design and Development process on the User Experience.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://chriszgriffin.com/&quot;&gt;http://chriszgriffin.com/&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;strong&gt;Graeme&lt;/strong&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/planetargon/405995782/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/136/405995782_0e67147aee_m.jpg&quot; width=&quot;240&quot; height=&quot;160&quot; alt=&quot;Graeme Nelson&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Our newest hire is &lt;strong&gt;Graeme Nelson&lt;/strong&gt;, who recently moved to Portland from Seattle. He just joined our Design and Development team and if you&amp;#8217;ve been reading the Rails-related blogs, you might have seen his blog already. He&amp;#8217;s been blogging a lot about using &lt;a href=&quot;http://blog.imperialdune.com/2007/2/26/rspec-ing-rails-controllers&quot;&gt;RSpec with Rails&lt;/a&gt; and other fun things. He&amp;#8217;s been contracting with us since the start of the year and I&amp;#8217;m really excited that &lt;a href=&quot;http://blog.imperialdune.com/2007/2/17/announcement&quot;&gt;he&amp;#8217;s accepted a job offer&lt;/a&gt; and joined the team!&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://blog.imperialdune.com/&quot;&gt;http://blog.imperialdune.com/&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;strong&gt;Gary&lt;/strong&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/robbyrussell/336808358/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/152/336808358_07b5cf3236_m.jpg&quot; width=&quot;240&quot; height=&quot;160&quot; alt=&quot;Gary eats sushi&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Last&amp;#8230; but not least is &lt;strong&gt;Gary Blessington&lt;/strong&gt;. I believe that I first offered Gary a job with &lt;a href=&quot;http://www.planetargon.com&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PLANET ARGON&lt;/span&gt;&lt;/a&gt; about 2 1/2 years ago when we were still focused on &lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;/PostgreSQL&amp;#8230;. but &lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt; apparently wasn&amp;#8217;t enough of a catalyst. Gary and I previously worked together at Imark Communications several years ago, when I first started doing web development. He was the senior developer on the team and was an important mentor during my early days of developing in a professional environment. Late last year, he hung up his .NET tool belt to become our Design and Development Director. He started blogging earlier this year and is sharing his experience of &lt;a href=&quot;http://garyblessington.us/2007/2/26/rails-adoption&quot;&gt;switching from .NET to Ruby on Rails&lt;/a&gt;.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://garyblessington.us/&quot;&gt;http://garyblessington.us/&lt;/a&gt;.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;I&amp;#8217;ll introduce the others as they start blogging and such. :-)&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;&lt;a href=&quot;http://feeds.feedburner.com/~f/RobbyOnRails?a=eSUhtKKn&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/RobbyOnRails?i=eSUhtKKn&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/RobbyOnRails?a=1G2yIPUB&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/RobbyOnRails?i=1G2yIPUB&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/RobbyOnRails?a=xmod9I5X&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/RobbyOnRails?i=xmod9I5X&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/RobbyOnRails?a=0Clt9qF2&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/RobbyOnRails?i=0Clt9qF2&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2007-02-26T17:01:00+00:00</dc:date>
</item>

</rdf:RDF>
