<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
 <title>Developing with Style</title>
 
 <link href="http://developingwithstyle.com/" />
 <updated>2009-10-28T16:31:45+00:00</updated>
 <id>http://developingwithstyle.com/</id>
 <author>
   <name>Joel Moss</name>
   <email>joel@developwithstyle.com</email>
 </author>

 
 <link rel="self" href="http://feeds.feedburner.com/DevelopingWithStyle" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry>
   <title>Concerned with Rails</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/zB_5xZZc3yI/concerned-with-rails.html" />
   <updated>2009-10-13T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2009/10/13/concerned-with-rails</id>
   <content type="html">&lt;p&gt;&lt;a href="http://codaset.com/joelmoss/rails-concerns"&gt;Concerns&lt;/a&gt; is a simple Rails plugin that provides you with a simple way to organise your Controllers, Models and Mailers, and split them into smaller chunks of logic. It is especially useful when you have lengthly models, and get fed up with having to scroll through several hundred lines of code.&lt;/p&gt;

&lt;h3&gt;How does it work?&lt;/h3&gt;

&lt;p&gt;So let's say we have a Post model (doesn't everyone?!) which is getting a bit lengthy, and frankly not very nice to look at. With the Concerns plugin, we can split it up into nice little chunks. Because we have lots of validations, let's start by pulling them out and placing them within a concern file.&lt;/p&gt;

&lt;h3&gt;Let's get going then...&lt;/h3&gt;

&lt;p&gt;First of all, install the plugin:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;
script/plugin install git://codaset.com/joelmoss/rails-concerns.git
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then, create a new directory in your app/models drectory and call it "post", which is the same name as your model.&lt;/p&gt;

&lt;p&gt;Within this new directory, create a new file at app/models/post/validations.rb. Now all this should do is reopen your Post model, and define your validations like this:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;
  &lt;span class="n"&gt;validates_presence_of&lt;/span&gt; &lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:body&lt;/span&gt;
  &lt;span class="n"&gt;validates_uniqueness_of&lt;/span&gt; &lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:scope&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:project_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:case_sensitive&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
  &lt;span class="n"&gt;validates_exclusion_of&lt;/span&gt; &lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:in&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sx"&gt;%w(edit new blog delete destroy create update post posts)&lt;/span&gt;
  &lt;span class="n"&gt;validates_inclusion_of&lt;/span&gt; &lt;span class="ss"&gt;:markup_language&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:in&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sx"&gt;%w( markdown textile wikitext )&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:allow_nil&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;It's just like writing your model again.&lt;/p&gt;

&lt;p&gt;Now within your main Post model; right at the top, we simply call:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;concerned_with&lt;/span&gt; &lt;span class="ss"&gt;:validations&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Multiple concerns can be called like so:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;concerned_with&lt;/span&gt; &lt;span class="ss"&gt;:validations&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:class_methods&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;And we're done!&lt;/p&gt;

&lt;p&gt;You can do this as many times as you wish, and with as many concerns as you want. And it works with models, controllers and mailers.
Need help?&lt;/p&gt;

&lt;p&gt;Grab and/or fork the code from the &lt;a href="http://codaset.com/joelmoss/rails-concerns"&gt;Codaset project&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/zB_5xZZc3yI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2009/10/13/concerned-with-rails.html</feedburner:origLink></entry>
 
 <entry>
   <title>Codaset Opens up its Beta to Everyone.</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/R_BmXHZzloA/codaset-opens-up-its-beta-to-everyone.html" />
   <updated>2009-10-06T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2009/10/06/codaset-opens-up-its-beta-to-everyone</id>
   <content type="html">
&lt;p&gt;This is a reprint of an announcement made a few minutes ago at &lt;a href="http://codaset.com"&gt;Codaset.com&lt;/a&gt;...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I am very pleased to announce that Codaset has ended it's private beta phase, and is now open to all. The beta tag is still in place, so the site is effectively in public beta. This means that no invite is needed to register and create an account. Anyone can create projects, and anyone can take part in any activity on the site.&lt;/p&gt;

&lt;p&gt;Along with this announcement, also brings with it a few bug fixes, and minor improvements. Nothing huge, but you should find that browsing the site in Safari is much improved, and several styling bugs have been fixed. I also added URL slugs to milestones, which means your Milestones look prettier and are more familiar to browse.&lt;/p&gt;

&lt;p&gt;So I am hoping that with this announcement and release, we will start to see an increase in the number of registered users, and active users. And of course, Codaset is one step closer to a final release. So if there are any features you want to see in the final release; and if there is not already a ticket for it, please create one now. If there is a ticket already created for your requested feature, please vote it up. Voting for tickets is the best way for me to see what you want.&lt;/p&gt;

&lt;p&gt;You can see Codaset's tickets at &lt;a href="http://codaset.com/tickets"&gt;http://codaset.com/tickets&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/R_BmXHZzloA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2009/10/06/codaset-opens-up-its-beta-to-everyone.html</feedburner:origLink></entry>
 
 <entry>
   <title>Railings: A full featured Ruby on Rails template</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/BBeFu25TF3M/railings-a-full-featured-ruby-on-rails-template.html" />
   <updated>2009-09-23T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2009/09/23/railings-a-full-featured-ruby-on-rails-template</id>
   <content type="html">
&lt;p&gt;I've found myself creating a number of new Rails apps as of late, and found it very cumbersome to set each one up with my favoured list of gems and plugins. So I created my own Rails Template.&lt;/p&gt;
&lt;p&gt;Rails templates are single ruby scripts which contain a few commands that help you setup any new Rails app in a snap. So you can specify a list of Gems to have installed and part of your environment.rb, and also install a bunch of plugins, amongst other things.&lt;/p&gt;
&lt;p&gt;You should take a look at &lt;a href="http://m.onkey.org/2008/12/4/rails-templates"&gt;Pratik Naik's blog post&lt;/a&gt; for full details on what Rails templates can do.&lt;/p&gt;
&lt;p&gt;So my default Rails template is called &lt;a href="http://codaset.com/joelmoss/railings"&gt;Railings&lt;/a&gt;, and is available now on &lt;a href="http://codaset.com/joelmoss/railings"&gt;Codaset&lt;/a&gt;. It is sure to grow by the day, but for now, this is what you get:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;jQuery 1.3.2&lt;/li&gt;
  &lt;li&gt;Blueprint CSS Framework&lt;/li&gt;
  &lt;li&gt;Initializes as a Git repo and creates .gitignore&lt;/li&gt;
  &lt;li&gt;Creates staging environment&lt;/li&gt;
  &lt;li&gt;Creates application layout&lt;/li&gt;
  &lt;li&gt;A default database.yml, and a modified database.example.yml which is ued with the 'Wheres my database.yml dude?' rake task&lt;/li&gt;
  &lt;li&gt;Creates Vlad the Deployer deploy.rb config file&lt;/li&gt;
  &lt;li&gt;Time formats initializer&lt;/li&gt;
  &lt;li&gt;The following gems:
    &lt;ul&gt;
      &lt;li&gt;thoughtbot-factory_girl&lt;/li&gt;
      &lt;li&gt;rubyist-aasm&lt;/li&gt;
      &lt;li&gt;mislav-will_paginate&lt;/li&gt;
      &lt;li&gt;hpricot&lt;/li&gt;
      &lt;li&gt;RedCloth&lt;/li&gt;
      &lt;li&gt;emk-safe_erb&lt;/li&gt;
      &lt;li&gt;settingslogic&lt;/li&gt;
      &lt;li&gt;vlad&lt;/li&gt;
      &lt;li&gt;vlad-git&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;The following plugins setup as Git submodules:
    &lt;ul&gt;
      &lt;li&gt;limerick_rake&lt;/li&gt;
      &lt;li&gt;mile_marker&lt;/li&gt;
      &lt;li&gt;squirrel&lt;/li&gt;
      &lt;li&gt;rspec&lt;/li&gt;
      &lt;li&gt;rspec-rails&lt;/li&gt;
      &lt;li&gt;exception_notifier&lt;/li&gt;
      &lt;li&gt;monkey-magic&lt;/li&gt;
      &lt;li&gt;gravatar&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the next time you start a new rails app, run this command and you will have the world at your fingertips:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;
rails -m http://codaset.com/joelmoss/railings/source/master/raw/railings.rb /path/to/mynewapp
&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/BBeFu25TF3M" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2009/09/23/railings-a-full-featured-ruby-on-rails-template.html</feedburner:origLink></entry>
 
 <entry>
   <title>CSS Pick and Mix Classes</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/_GEUl0yTMS4/css-pick-and-mix-classes.html" />
   <updated>2009-09-16T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2009/09/16/css-pick-and-mix-classes</id>
   <content type="html">&lt;p&gt;
  I was just browsing through my tweets and came across this little gem as put forward my Nate Abele; he of CakePHP lead developer fame...
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://twitter.com/nateabele/statuses/4031886580"&gt;&lt;img src="http://twictur.es/i/4031886580.gif" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
  It got me thinking about how I organise my CSS files and code, and as I have been writing a lot of CSS recently when developing &lt;a href="http://codaset.com"&gt;Codaset&lt;/a&gt;, it made me realise that I have developed a bit of a habit with my own CSS. So I thought I'd share it all with you.
&lt;/p&gt;

&lt;p&gt;
  Over the last year or so, there seems to have been an explosion of CSS frameworks. I suppose it was inevitable really, as it happened with Javascript, so why not CSS. ANd to be honest, I would say that is a good thing, and there are some decent ones out there. But my CSS framework of choice is the excellent &lt;a href="http://www.blueprintcss.org/"&gt;Blueprint framework&lt;/a&gt;. It's a great starting point for all your CSS, and sets some good reset points. It's also very lite-weight.
&lt;/p&gt;

&lt;p&gt;Before I continue, I just want to say that I will not be telling you how to use Blueprint or indeed, how to write CSS. I use Blueprint's grid classes, but again, I won't be talking about them. This post is more about how I use a class based system for my CSS.&lt;/p&gt;

&lt;p&gt;
  First, if I don't already have one, I create a &lt;code&gt;css&lt;/code&gt; directory within my public root, the place Blueprint's three CSS base files within a sub-directory. I usually call that &lt;code&gt;blueprint&lt;/code&gt;. (surprise, surprise). Then I create two files within my &lt;code&gt;css&lt;/code&gt; directory called &lt;code&gt;base.css&lt;/code&gt; and &lt;code&gt;site.css&lt;/code&gt;.
&lt;/p&gt;

&lt;p&gt;I've used this structure for this site:&lt;/p&gt;

&lt;p&gt;&lt;img src="/img/wpuploads/2009/09/one.png" /&gt;&lt;/p&gt;

&lt;p&gt;
  Pretty obvious so far! Now let me explain what I do with the &lt;code&gt;base.css&lt;/code&gt; and &lt;code&gt;site.css&lt;/code&gt; file.
&lt;/p&gt;

&lt;h3&gt;&lt;code&gt;base.css&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;
  Blueprint has a great set of resets or default styles, but sometimes, I want to overwrite these. I also find myself writing my own default styles, so I put all these within the &lt;code&gt;base.css&lt;/code&gt; file. A simple rule of thumb is that only classes are allowed in the &lt;code&gt;base.css&lt;/code&gt; file.
&lt;/p&gt;
&lt;p&gt;
  Since I started using Blueprint, I've started using it's default classes a lot. Classes such as &lt;code&gt;.quiet&lt;/code&gt; and &lt;code&gt;.small&lt;/code&gt; make it very obvious what I am doing to a particular element. So if I want told make a line of text a little smaller, I can simply wrap the text with a &lt;code&gt;div&lt;/code&gt; or a &lt;code&gt;span&lt;/code&gt;, and give that &lt;code&gt;div&lt;/code&gt; or a &lt;code&gt;span&lt;/code&gt; a class of &lt;code&gt;small&lt;/code&gt;:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;small&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Here is some text I made a little smaller than the rest.
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;If I wanted it to be colored a little lighter too, then I can add another class to the &lt;code&gt;div&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;small quiet&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Here is some text I made a little smaller than the rest, and it&amp;#39;s quieter.
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
  Both those classes and more are all ready to go as part of Blueprint. But I know also want to make this text bold. So I could either give this &lt;code&gt;div&lt;/code&gt; an &lt;code&gt;id&lt;/code&gt; and create a CSS rule for that new ID like this:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nf"&gt;#myNewDiv&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;small quiet&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;myNewDiv&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Here is some text I made a little smaller than the rest, and it&amp;#39;s quieter and now bolded.
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;But that's a bit daft, as I am likely to want to make other elements bold. So a new class would be better:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nc"&gt;.bold&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;small quiet bold&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Here is some text I made a little smaller than the rest, and it&amp;#39;s quieter and now bolded.
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Now I could easily have given this &lt;code&gt;div&lt;/code&gt; an ID instead and done away with all the classes completely. But again, that isn't reusable. Another thing I like about the above, is that is very readable and obvious what the classes are doing. It's very expressive, and even makes it very easy and fast to style, as all I need to do is assign a few classes, rather than creating any new CSS styles. It's like a pick and mix for CSS!&lt;/p&gt;

&lt;p&gt;So I'm now finding that my HTML is full of classes, and I'm seeing less and less ID's. I only tend to use an ID to style an element if that element is more complex, or has specific needs that are not used elsewhere.&lt;/p&gt;

&lt;h3&gt;site.css&lt;/h3&gt;
&lt;p&gt;So the &lt;code&gt;site.css&lt;/code&gt; file is therefore used for element specific styling. So any CSS styles that are defined with an ID, are placed in this file. Not much more to say about that actually.&lt;/p&gt;

&lt;p&gt;For more about how it all fits in, check out the source and CSS of this site and of &lt;a href="http://codaset.com"&gt;&lt;/a&gt;. I would love to know your thoughts and feedback on this. Comment away...&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/_GEUl0yTMS4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2009/09/16/css-pick-and-mix-classes.html</feedburner:origLink></entry>
 
 <entry>
   <title>A sexy, ajax based jQuery dialog window, with a one track mind.</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/kK5roF8WzMk/a-sexy-ajax-based-jquery-dialog-window-with-a-one-track-mind.html" />
   <updated>2009-08-19T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2009/08/19/a-sexy-ajax-based-jquery-dialog-window-with-a-one-track-mind</id>
   <content type="html">So I had a need when developing the beginnings of &lt;a href="http://codaset.com"&gt;Codaset&lt;/a&gt;, for a nice looking javascript modal/dialog window implementation. I wanted to be able to easily and quickly open up any link in a great looking dialog. I had no shortage of options, as there are tons and tons of jQuery lightbox scripts, or thickbox inspired plugins. But they all seem to want to be the best at absolutely everything.

All I wanted was a simple way to open up a link via ajax into a nice looking dialog window. I didn't need to show a slideshow or open up the contents of a div. And I really couldn't find one that did just that and did it well.

So like all good developers, &lt;a href="http://codaset.com/joelmoss/codaset-dialog"&gt;I created one myself!&lt;/a&gt;

It's been in use on &lt;a href="http://codaset.com"&gt;&lt;img class="alignleft size-medium wp-image-390" style="border: 0pt none;" title="Codaset Dialog" src="/img/wpuploads/2009/08/picture-1-300x123.png" alt="Codaset Dialog" width="300" height="123" /&gt;Codaset&lt;/a&gt; since the private beta launched a month ago, and is running nicely. So I thought it was about time I &lt;a href="http://codaset.com/joelmoss/codaset-dialog"&gt;open sourced it and released it to the unsuspecting public&lt;/a&gt;. So if you want a sexy, ajax based jQuery dialog window, that is extremely easy to use, does exactly what it says on the tin, then please &lt;a href="http://codaset.com/joelmoss/codaset-dialog"&gt;checkout the project now&lt;/a&gt; on Codaset, and feel free to &lt;a href="http://codaset.com/joelmoss/codaset-dialog/source"&gt;clone and/or fork the source&lt;/a&gt;.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/kK5roF8WzMk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2009/08/19/a-sexy-ajax-based-jquery-dialog-window-with-a-one-track-mind.html</feedburner:origLink></entry>
 
 <entry>
   <title>Codaset is alive!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/aO-Gp6Wza0c/codaset-is-alive.html" />
   <updated>2009-07-19T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2009/07/19/codaset-is-alive</id>
   <content type="html">Yes I know it's been quite around here, and yes I know I've only written five of the 10 reasons why Ruby is better than PHP, but I've been really, really busy! And now I have something to show for my busy-ness. Codaset went live about 30 minutes ago, and is now up at http://Codaset.com. You can only get an account if you apply for the beta, but you can still do loads more on the site without one.

Here's a reprint of the official blog post from the new &lt;a href="http://codaset.com/codaset/codaset/blog"&gt;Codaset Blog&lt;/a&gt;...

&lt;strong&gt;Phew!! I did it!&lt;/strong&gt; Codaset beta just went live about 10 minutes ago, and if you are reading this, then you are already using the beta.

What started as a genuine need and a desire to create a software development management platform that is actually useful, has turned into what you see right here. Codaset is and will be a tool that I use personally, simply because I am always having to use several different tools or services, to achieve what I need and want. Tools and services such as Github, Trac and Campfire all have pride of place in my browsers bookmarks. They are excellent at what they do, but of course they only do certain things. I want a tool that will gather everything that is good about these three services (and others), and present them to me in an easy, but very useful way.

Right now, Codaset is beta software, which means nothing is complete, and there maybe (and probably will be) bugs. So any bugs you do find should be reported to me as soon as you see them. And what better place to do that, than Codaset itself! &lt;a href="http://codaset.com/codaset/codaset/tickets/new"&gt;Create a ticket&lt;/a&gt; for any bugs you find, and any features, or enhancements that you think would rock yours - or anyone elses - world.

There are still so many, many more things that will be added during the beta, and I will be blogging about them all right here. You can also keep up to date with Codaset via &lt;a href="http://twitter.com/codaset"&gt;Twitter&lt;/a&gt;.

Even though this is a beta, parts of the site are open to non beta and anonymous users. But you can only create an account, create and fork projects if you have applied for the beta, and have since been approved. So all of you who applied to the beta prior to us going live today, will be receiving an email within the next few days. This will contain instructions on how you can get your account created, and your first project started on Codaset.

Everyone else can still get a beta account, by applying from the homepage at &lt;a href="http://codaset.com"&gt;Codaset.com&lt;/a&gt;, and I will try my best to get you an account.

Beta testers will receive full and unrestricted access to the entire site during the beta. Once the beta ends (don't ask, as I have no idea when that might be) you will continue to receive access to those same features at no cost. However, I cannot guarantee that any new features introduced after the beta ends, will be provided to you at no cost. Hey, but I will definately try.

That's all I wanna say for now, because I'm completely knackered. So I'm off to play a little xbox. Oh yeah, and I suppose it might be a good idea to eat ;)

Thank you to all of you, and please play with it all! Enjoy!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/aO-Gp6Wza0c" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2009/07/19/codaset-is-alive.html</feedburner:origLink></entry>
 
 <entry>
   <title>10 Reasons why Ruby is better than PHP - Reason #5</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/jAf3Ej5SX1Y/10-reasons-why-ruby-is-better-than-php-reason-5.html" />
   <updated>2009-06-09T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2009/06/09/10-reasons-why-ruby-is-better-than-php-reason-5</id>
   <content type="html">It's been a while I know, and I am aware that some of you are chomping at the bit to read reason #5. Apologies for the wait, but some of us have work to do, and a &lt;a href="http://codaset.com"&gt;mammoth side project&lt;/a&gt; to complete, which by the way, is coming along nicely.

Before I start on reason #5, I want to mention a couple of posts in a similar vein to my series.

Andy Jeffries "&lt;a href="http://andyjeffries.co.uk/articles/4-reasons-why-ruby-syntax-is-better-than-phps-"&gt;4 Reasons why Ruby syntax is better than PHP's&lt;/a&gt;" is a straight to the point article all about the strengths of Ruby's syntax over PHP. If after reading his post, you still think syntax doesn't matter, then you are a lost cause, and beyond help of any kind!

Another post I actually read a while ago, but forgot all about until I was &lt;a href="http://twitter.com/m3nt0r/status/2091044381"&gt;pleasantly reminded of&lt;/a&gt;, is Bitcetera's "&lt;a href="http://www.bitcetera.com/en/techblog/2009/04/07/10-reasons-why-php-is-still-better-than-ruby�/"&gt;10 Reasons why PHP is still better than Ruby&lt;/a&gt;". Read it carefully all the way through, as it is a great read.

Now, we get to Modules in Ruby, again, a feature that has no direct equivalent in PHP. Modules are very similar to classes, in fact they are written in much the same way:

&lt;code&gt;&lt;pre lang="ruby"&gt;RUBY
module Animal
  def name
    "Dog"
  end
end&lt;/pre&gt;&lt;/code&gt;

So what are they used for? Well, modules are generally used for two purposes; creating namespaces and mixins. I'm sure (and I hope) that you all know what namespaces are. But you probably have no idea what a mixin is. Well I'll get to that in a bit. Let's quickly talk about how Ruby uses namespaces.

Let us imagine that we have been charged with cleaning up and re-organizing our code, and we have a lot of it. Normally in PHP you might simply stick this code in a file and include it wherever you need it, but what if you have two methods or constants that are named the same? Some developers have worked around this by separating different class package names with underscores. This solution solves the immediate problem and also works conveniently with autoloading in PHP. It can, however, leave us with some really long class names.

Let's imagine we have two classes that define a &lt;code&gt;Document&lt;/code&gt; class. In PHP we would probably prefix each class name with the document type:

&lt;code&gt;&lt;pre lang="php"&gt;PHP
class XML_Document {
  public function __construct() {
    print "new xml document\n";
  }
}
class PDF_Document {
  public function __construct() {
    print "new pdf document\n";
  }
}
$xml = new XML_Document; 
$pdf = new PDF_Document;&lt;/pre&gt;&lt;/code&gt;

Ruby would achieve the same thing like this:

&lt;code&gt;&lt;pre lang="ruby"&gt;RUBY
module XML 
  class Document 
    def initialize 
      puts 'new xml document' 
    end 
  end 
end 
module PDF 
  class Document 
    def initialize 
      puts 'new pdf document' 
    end 
  end 
end 
xml = XML::Document.new 
pdf = PDF::Document.new&lt;/pre&gt;&lt;/code&gt;

Now I know that the as-yet-to-be-released PHP 5.3 will introduce namespaces, but come on! &lt;a href="http://php.net/manual/language.namespaces.rationale.php"&gt;Have you actually seen how PHP namespaces are created and written?!&lt;/a&gt; WTF!? Using slashes just looks wrong! Slashes are used in directory paths, and that is where they should stay. And why should I have to declare my namespace at the very top of the file and no where else?

But the best thing about Ruby's modules, is the ability to mix them into my classes, as if it was part of the original class code. Think of it as inheritance, but better. Everyone knows that in PHP and Ruby, a class can only inherit from one class at a time. To inherit from another class would involve you having to create a complicated chain of inheritance. Mixins eliminate that need. Just create a class, inherit from another class, and then mixin as many modules as you want.

&lt;code&gt;&lt;pre lang="ruby"&gt;RUBY
module Movement 
  def run 
    puts "I'm running!" 
  end 
  def walk 
    puts "I'm walking a bit briskly!" 
  end 
  def crawl 
    puts "I'm so slowwww!" 
  end 
end

class Man 
  include Movement 
  def jump 
    puts "I'm bipedal and I can jump like a fool!" 
  end 
end

class Sloth 
  include Movement 
  def flop 
    puts "It's all a lie...all I can do is flop around." 
  end 
end

mister_man = Man.new 
mister_man.run 
?  I'm running!

mister_slothy = Sloth.new 
mister_slothy.flop 
?  It's all a lie...all I can do is flop around.&lt;/pre&gt;&lt;/code&gt;

As you can see, this mechanism is very similar to inheritance in that you can use all of the mixin's code.  To use a mixin, simply define a module and then use the include keyword followed by the module's name (note I said module; the include keyword has nothing to do with files or libraries like in PHP); from then on the class has access to all of that module's constants and methods.

The above example really doesn't do mixins justice, but it's a very simple example to help demonstrate how they work. Modules are a very versatile tool in Ruby and allow us to extract and share common behavior in objects, and are another reason why Ruby is better than PHP (in my opinion).
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/jAf3Ej5SX1Y" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2009/06/09/10-reasons-why-ruby-is-better-than-php-reason-5.html</feedburner:origLink></entry>
 
 <entry>
   <title>10 Reasons why Ruby is better than PHP - Reason #4</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/FFckQsiaXwU/10-reasons-why-ruby-is-better-than-php-reason-4.html" />
   <updated>2009-06-01T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2009/06/01/10-reasons-why-ruby-is-better-than-php-reason-4</id>
   <content type="html">I bet you thought I'd never get any more reasons out did ya? Well, today, I'm going to tell you all about IRB and the Rails command line debugger, both of which I use religiously.

One of the great pleasures of using Ruby, apart from the &lt;a href="http://developingwithstyle.com/2009/05/20/10-reasons-why-ruby-is-better-than-php-reason-1/"&gt;previous&lt;/a&gt; &lt;a href="http://developingwithstyle.com/2009/05/21/10-reasons-why-ruby-is-better-than-php-reason-2/"&gt;three&lt;/a&gt; &lt;a href="http://developingwithstyle.com/2009/05/27/10-reasons-why-ruby-is-better-than-php-reason-3/"&gt;reasons&lt;/a&gt;, and of course the following five reasons, is the wonder that is the Interactive Ruby console, or IRB. IRB is an interactive interpreter; which means that instead of processing a file, it processes what you type in during a session. It's a great tool for testing Ruby code, and a great tool for learning Ruby. 

Once you have Ruby installed on your computer, you will notice that the &lt;code&gt;ruby&lt;/code&gt; command will do the same thing as PHP - it silently waits for a script to be streamed in on &lt;code&gt;stdin&lt;/code&gt;. On it's own, that's not particularly friendly, or even that useful. But another command that is installed alongside Ruby, is the &lt;code&gt;irb&lt;/code&gt; command. Start up your command line tool of choice, and simply enter these three immortal letters: &lt;code&gt;irb&lt;/code&gt;. Then you will see this:

&lt;code&gt;&lt;pre&gt;irb&gt;&lt;/pre&gt;&lt;/code&gt;

This is the &lt;code&gt;irb&lt;/code&gt; prompt. Now all you do is simply type any ruby code, and it will show you the result of each and every expression as it is evaluated. Not sure how a method works, or can't remember the output of a method? Then test it with IRB.

IRB lets you do things without having to fake out your controller. For example, in PHP, I'm forever using &lt;code&gt;echo&lt;/code&gt; or CakePHP's &lt;code&gt;debug&lt;/code&gt; function to print out some useful info to the browser when debugging my code. But when developing with Ruby, I simply have my trusty IRB prompt ready and waiting for me to inflict world domination.

&lt;code&gt;&lt;pre&gt;&gt;&gt; @george = Person.find_by_name('George')
&gt;&gt; @bob = Person.find_by_name('Bob')
&gt;&gt; @bob.friends &lt;&lt; @george&lt;/pre&gt;&lt;/code&gt;

Each of the above lines will be following by IRB echoing the result. So I can see exactly what is going on, and without me having to echo out data all through my code and to the browser.

This is actually very, very useful, and is a great way to test your code, or in fact any code at all. It's even better if you are a command line freak like me.

What is even better, better (!?) is that Rails also has its own command line interpreter, which is basically an extension of IRB. What makes it a little different, is that when it is started up, it also loads all your Rails code. So you have instant access to your Rails models, which is also very handy. Just cd to your Rails app root, and run:

&lt;code&gt;&lt;pre&gt;script/console&lt;/pre&gt;&lt;/code&gt;

You are then shown a similar command line prompt to IRB, and can run any part of your Rails app code.

To wrap up reason #4, I want to tell you about one of the best things about developing with Ruby on Rails. It's another extension of IRB, similar to Rails &lt;code&gt;script/console&lt;/code&gt;, but is simply genius when debugging your Rails code.

There are several ways in which you can run your Rails app, but the traditional method is by using the the &lt;code&gt;script/server&lt;/code&gt; script within your app. When run on the command line, this will start up a small web server, usually run by Webrick or Mongrel. Now I wouldn't recommend this method when running your app in production, as &lt;a href="http://www.modrails.com/"&gt;there are much better, and more efficient ways to do so&lt;/a&gt;, but I use this all the time when developing or testing my app code.

Just &lt;code&gt;cd&lt;/code&gt; to your Rails app root and run this on the command line:

&lt;code&gt;&lt;pre&gt;script/server -u&lt;/pre&gt;&lt;/code&gt;

Notice I appended a command line flag; &lt;code&gt;-u&lt;/code&gt;. This tells the Rails server to start up in Debug mode. If you use Mongrel, this is what you will see:

&lt;code&gt;&lt;pre&gt;=&gt; Booting Mongrel
=&gt; Rails 2.3.2 application starting on http://0.0.0.0:3000
=&gt; Debugger enabled
=&gt; Call with -d to detach
=&gt; Ctrl-C to shutdown server&lt;/pre&gt;&lt;/code&gt;

And the command line prompt will sit there blinking at you, waiting for you to load your app in your browser. So don't keep it waiting, open up your browser, and go to &lt;code&gt;http://localhost:3000&lt;/code&gt;, and you will be shown your Rails app in all its glory.

Now we get to the good bit. Open up the code of any of your controllers in your favourite IDE or &lt;a href="http://macromates.com"&gt;text editor&lt;/a&gt;. Then type the word &lt;code&gt;debugger&lt;/code&gt; within one of your actions. Then go back your browser and navigate to that page. You should the notice that the page does not appear to finish loading. That is because your &lt;code&gt;debugger&lt;/code&gt; keyword within the action method, has paused the server until you tell it to continue.

Go back to your command line when you started the Rails server, and you will see a bunch of log data, following by what looks like an IRB prompt. That is effectively what it is. You can now type any Ruby code at that prompt, just like you would with IRB or &lt;code&gt;script/console&lt;/code&gt;. But the beauty of this, is that you have access to all the variables and methods at exactly the same point in your code where you placed the &lt;code&gt;debugger&lt;/code&gt; keyword.

So instead of having to type echo or print statements throughout your code, and running them through your browser to see the results. You can add the debugger keywork at the point where you want to debug, and use the command line to access your code in real time.

I really hope you got all that, as this feature has saved me hours and hours of time when debugging my code. I can honestly say that it is a life saver. You really should try it out now, or if you're a little impatient, &lt;a href="http://tryruby.hobix.com/"&gt;try it out in your browser for instant gratification&lt;/a&gt;. You should also check out Amy Hoy's "&lt;em&gt;&lt;a href="http://slash7.com/articles/2006/12/21/secrets-of-the-rails-console-ninjas"&gt;Secrets of the Rails Console Ninja's&lt;/a&gt;&lt;/em&gt;".

Thanks again for sticking with me, and hold on to your pants for reason #5 where I will be talking about Modules; Ruby's answer to namespaces. Which will lead me nicely onto another Ruby exclusive: Mixins!

P.S. I really appreciate everyone's comments. Keep them coming.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/FFckQsiaXwU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2009/06/01/10-reasons-why-ruby-is-better-than-php-reason-4.html</feedburner:origLink></entry>
 
 <entry>
   <title>10 Reasons why Ruby is better than PHP - Reason #3</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/L-ZpyWp6XZs/10-reasons-why-ruby-is-better-than-php-reason-3.html" />
   <updated>2009-05-27T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2009/05/27/10-reasons-why-ruby-is-better-than-php-reason-3</id>
   <content type="html">So onwards and upwards! It appears that I still have a little work to do to convince you non-believers, so lets try again...

As &lt;a href="http://developingwithstyle.com/2009/05/21/10-reasons-why-ruby-is-better-than-php-reason-2"&gt;previously mentioned&lt;/a&gt;, Ruby has some features that simply cannot be found in many other languages, let alone PHP. So here I introduce yet another one, and this is a biggie. But, please be warned that this one is a little harder to explain, so please be bear with me as I attempt to enlighten you.

Some of you may have heard of a language feature known in computer science as &lt;em&gt;closures&lt;/em&gt;. If you have done any Javascript development, you should be familiar with closures, but may not know them by name. Ruby uses closures extensively, but refers to them simply as &lt;em&gt;blocks&lt;/em&gt;. Which is actually easier to understand.

Many developers seem to think that blocks are somewhat of an obscure language feature, as they are pretty hard to find an equivalent in other languages. PHP is not the only language without support for blocks, but you should understand them, as they can be very useful, and quite powerful.

Although there is no direct translation of blocks in PHP, we can make some analogies to PHP that will help us understand and become familiar with blocks, and how they are useful. Lets use PHP to start a family:

&lt;code&gt;&lt;pre lang="php"&gt;PHP
function start_family($num) {
  echo "There are now $num kids in my family"
}&lt;/pre&gt;&lt;/code&gt;

&lt;code&gt;&lt;pre lang="php"&gt;PHP
for ($kids = 99; $kids &amp;gt; 0; $kids--) {
  start_family($kids);
}&lt;/pre&gt;&lt;/code&gt;

When the above code is executed, PHP evaluates the condition in the for loop, which calls the &lt;code&gt;start_family&lt;/code&gt; function on each iteration.

The &lt;code&gt;for&lt;/code&gt; and &lt;code&gt;function&lt;/code&gt; keywords are built-in constructs of PHP, in the same way that semi-colons and curly braces are built-in. But there are very few control constructs in PHP that allow code to be attached to them within the curly braces. It's not actually possible to add or create new control constructs in PHP, unless of course you fancy whipping up a PHP extension in C. (eurghh!)

To be fair, we could condense the above into the following, as there really would be no need to use a function within the for loop.

&lt;code&gt;&lt;pre lang="php"&gt;PHP
for ($num = 99; $num &amp;gt; 0; $num--) {
  echo "There are now $num kids in my family"
}&lt;/pre&gt;&lt;/code&gt;

So now lets do the same thing in Ruby:

&lt;code&gt;&lt;pre lang="ruby"&gt;RUBY
99.downto(1) { |num| puts "There are now #{$num} kids in my family" }&lt;/pre&gt;&lt;/code&gt;

Slightly unfamilar syntax, but that's nothing new when comparing Ruby with PHP. But the above is actually quite declarative. Lets break this down a little.

Hopefully, if you read &lt;a href="http://developingwithstyle.com/2009/05/20/10-reasons-why-ruby-is-better-than-php-reason-1/"&gt;reason #1&lt;/a&gt; you will now know that &lt;code&gt;99&lt;/code&gt; is an object, which has a method called &lt;code&gt;downto&lt;/code&gt;. It's pretty obvious that this method simply counts down from 99 to 1, and iterates through each number. It serves roughly the same purpose as the &lt;code&gt;for&lt;/code&gt; construct in our PHP example. The odd looking bit between the curly braces, with the goalposts, is the block.

There are many similarities between the Ruby block and the PHP &lt;code&gt;for&lt;/code&gt; loop. This is because the Ruby block is actually just a function in another form. A block is a function without a name, or an anonymous function. Yes I know PHP 5.3 will include some sort of support for anonymous functions, but again, it's an afterthought.

A Ruby block can receive parameters in much the same way a method or PHP function can, but they are placed within the goalposts of the block. In our case, we place the number (&lt;code&gt;num&lt;/code&gt;) of kids between the goal posts, and this becomes our one and only parameter. We can pass more parameters to the block, by simply separating them with a comma. If we don't want to pass any parameters, then we leave off the goalposts completely. The rest of the block is executable code, just like any other Ruby method.

Every method in Ruby, whether it be a built-in one, or one that you create, can be passed a block. And that one simple fact is what makes blocks so powerful. In fact, if the &lt;code&gt;downto&lt;/code&gt; method were written in pure ruby, it could look something like this:

&lt;code&gt;&lt;pre lang="ruby"&gt;RUBY
class Integer
  def downto(value, &amp;block)
    n = self
    while n &gt;= value
      block.call n
      n -= 1
    end
    return self
  end
end&lt;/pre&gt;&lt;/code&gt;

So we &lt;a href="http://developingwithstyle.com/2009/05/21/10-reasons-why-ruby-is-better-than-php-reason-2/"&gt;reopen&lt;/a&gt; the &lt;code&gt;Integer&lt;/code&gt; class, and redeclare the &lt;code&gt;downto&lt;/code&gt; method. We then pass two parameters to that method. Pay particular attention to the second parameter: &lt;code&gt;&amp;block&lt;/code&gt;, as it is very important.

When a block is passed to a Ruby method, it can be captured in a variable. In fact, the code that we pass within the block to &lt;code&gt;downto&lt;/code&gt; is converted into an object, and then stored inside a variable. The ampersand &lt;code&gt;&amp;block&lt;/code&gt; tells Ruby to store this block in a variable called &lt;code&gt;block&lt;/code&gt;. The keyword &lt;code&gt;self&lt;/code&gt; in this example refers to the object itself, which in this case is the integer &lt;code&gt;99&lt;/code&gt;.

Still with me? Good! Lets take our earlier example again, and apply it to the &lt;code&gt;downto&lt;/code&gt; method that we just created:

&lt;code&gt;&lt;pre lang="ruby"&gt;RUBY
99.downto(1) do |num|
  puts "There are now #{$num} kids in my family"
end&lt;/pre&gt;&lt;/code&gt;

Hold a second, the above code is different to our first example isn't it? Yes it is, well spotted! Just as in everything in Ruby, you don't need the curly braces. The use of the &lt;code&gt;do&lt;/code&gt; keyword is usually used for larger blocks, that need to span multiple lines. But it does exactly the same thing.

When the &lt;code&gt;downto&lt;/code&gt; method is called, it receives two parameters: &lt;code&gt;value&lt;/code&gt; contains the number of kids we have, and &lt;code&gt;block&lt;/code&gt; contains the block of code that will be run on each iteration.

The inside of our &lt;code&gt;downto&lt;/code&gt; method should look familiar to you, as it is effectively doing the same thing as our PHP &lt;code&gt;for&lt;/code&gt; loop. It just counts down from 99 to 1, using a &lt;code&gt;while&lt;/code&gt; loop. Then on each iteration of the &lt;code&gt;while&lt;/code&gt; loop, it yields control to the code that is passed in the &lt;code&gt;block&lt;/code&gt; variable, by calling the &lt;code&gt;block.call&lt;/code&gt; method. Any parameters passed to &lt;code&gt;block.call&lt;/code&gt;, are passed in the same way to the goalposts in the block.

A little confusing I know, but I really wanted to explain how blocks work as well as I could, as they are becoming ever more useful to me, the more that I develop with Ruby.

To finish off, I really want to show you an awesome way that Ruby's blocks are used. I won't go into it too much though, as it leads on to another of my reasons. There is a Ruby library (Gem) called &lt;em&gt;&lt;a href="http://www.thoughtbot.com/projects/shoulda/"&gt;Shoulda&lt;/a&gt;&lt;/em&gt; which improves the &lt;em&gt;Test:Unit&lt;/em&gt; unit testing library that is supported as standard in Ruby on Rails. Shoulda improves the language of your unit tests, and turns them into an almost human readable form. So here we have a test:

&lt;code&gt;&lt;pre lang="ruby"&gt;RUBY
context "a User instance" do
  should "return its full name"
    assert_equal 'John Doe', user.full_name
  end
end&lt;/pre&gt;&lt;/code&gt;

Now start from the beginning of that code and just read it out load. It may end up something like this "&lt;em&gt;a User instance should return its full name&lt;/em&gt;". Of course there is more in between, but what I am trying to convey is how expressive and readable the above code is. And that is because of the power of blocks.

Hope that helps a little. Keep the comments coming guys, and thanks for reading.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/L-ZpyWp6XZs" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2009/05/27/10-reasons-why-ruby-is-better-than-php-reason-3.html</feedburner:origLink></entry>
 
 <entry>
   <title>10 Reasons why Ruby is better than PHP - Reason #2</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/u_ft0qKENv4/10-reasons-why-ruby-is-better-than-php-reason-2.html" />
   <updated>2009-05-21T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2009/05/21/10-reasons-why-ruby-is-better-than-php-reason-2</id>
   <content type="html">Well now then. &lt;a href="http://developingwithstyle.com/2009/05/20/10-reasons-why-ruby-is-better-than-php-reason-1/"&gt;My last post&lt;/a&gt;, or the comments in it, seemed to have stirred up a little hornets nest. I had my fair share of supporters and my fair share of thanks for my writings, but I also received a little criticism. I think I've covered most of those in the &lt;a href="http://developingwithstyle.com/2009/05/20/10-reasons-why-ruby-is-better-than-php-reason-1/#comments"&gt;comments&lt;/a&gt; and also on &lt;a href="http://twitter.com/joelmoss"&gt;Twitter&lt;/a&gt;, so I won't say much more, other than to simply remind you all what I am trying to do.

In this little series of blog posts, my objective was to be as fair as possible when explaining my reasons why I think Ruby is better than PHP. But at the same time, this is not a comparison. Which means I won't be pointing out PHP's strong points - of which there are many. Also, this is my opinion, and no one elses, and I am entitled to that. And so to, are you guys.

And one last thing before I start reason #2. I want to say thanks to &lt;a href="http://www.littlehart.net/atthekeyboard/2009/05/21/laziness-vs-efficiency/"&gt;Chris Hartjes for his blog post&lt;/a&gt; earlier today. I made a comment on Twitter about lazy coders, being good coders, and he basically put me to rights, and explained what I was saying in much better terms, than I could ever do. But also, I do think he was a little harsh on me. Hear my other reasons first Chris. No hard feelings though.

Back to business. In todays post, I wanted to give more of a solid reason why I think Ruby excels over PHP. So I picked one that simply cannot be matched in any way by PHP. Add probably won't ever be. But I would love to see this being made possible.

&lt;strong&gt;Re-opening in Classes is soooo Useful!&lt;/strong&gt;

Both languages support the creation of classes as part of their object-oriented design. And they do so in much the same way. Both languages allow you to set method visibility with the use of &lt;code&gt;public&lt;/code&gt;, &lt;code&gt;protected&lt;/code&gt; and &lt;code&gt;private&lt;/code&gt; declarations, and behave accordingly. Classes are written in a similar fashion:

&lt;code&gt;&lt;pre lang="php"&gt;PHP
class Person {
  public function greeting() {
    return 'Hello you!';
  }
}&lt;/pre&gt;&lt;/code&gt;

&lt;code&gt;&lt;pre lang="ruby"&gt;RUBY
class Person
  def greeting
    'Hello you!'
  end
end&lt;/pre&gt;&lt;/code&gt;

Very similar, but let me explain one thing. In the PHP example above, I returned the string "&lt;code&gt;Hello you!&lt;/code&gt;" by prefixing it with the &lt;code&gt;return&lt;/code&gt; keyword. Like this:

&lt;code&gt;&lt;pre lang="php"&gt;PHP
return 'Hello you!';&lt;/pre&gt;&lt;/code&gt;

But in the Ruby example, you may have noticed that there is no &lt;code&gt;return&lt;/code&gt; keyword before the "&lt;code&gt;Hello you!&lt;/code&gt;" string. It was just this:

&lt;code&gt;&lt;pre lang="ruby"&gt;RUBY
'Hello you!'&lt;/pre&gt;&lt;/code&gt;

That works perfectly fine, and the "&lt;code&gt;Hello you!&lt;/code&gt;" string will still be returned when calling the &lt;code&gt;greeting&lt;/code&gt; method of the &lt;code&gt;Person&lt;/code&gt; class. That is because Ruby will return the value from the last line of the method. You can use &lt;code&gt;return&lt;/code&gt; if you want to, but you don't have to.

So we've determined that writing classes is pretty much on the par in both PHP and Ruby. But, you may have accidentally redeclared a class in PHP, and received a nasty error:

&lt;code&gt;&lt;pre lang="php"&gt;PHP
class Person {
  public function greeting() {
    return 'Hello you!';
  }
}

class Person {
  public function greeting() {
    return 'Hey, hey, hey!';
  }
}&lt;/pre&gt;&lt;/code&gt;

Doing the above will give tell you &lt;code&gt;PHP Fatal error: Cannot redeclare class Person&lt;/code&gt;. Everyone knows that you just cannot do that with PHP. And to be honest it seems to make sense for it to prevent this from happening. But Ruby actually allows you to do this. In fact, you are almost encouraged to reopen classes if and when needed.

&lt;code&gt;&lt;pre lang="ruby"&gt;RUBY
class Person
  def greeting
    'Hello you!'
  end
end

class Person
  def greeting
    'Hey, hey, hey!'
  end
end&lt;/pre&gt;&lt;/code&gt;

In the above case, no error will be returned. Instead, Ruby will simply redefine the &lt;code&gt;greeting&lt;/code&gt; method in the first class, with the same method from the second class. So you get this:

&lt;code&gt;&lt;pre lang="ruby"&gt;RUBY
p = Person.new
puts p.greeting&lt;/pre&gt;&lt;/code&gt;

Which returns "&lt;code&gt;Hey, hey, hey!&lt;/code&gt;" and not "&lt;code&gt;Hello you!&lt;/code&gt;"

Oh no, here it comes. I can hear the cries now: "But that's gonna cause untold problems and bugs in my code!". Not if you use it wisely! Part of Ruby's philosophy is to provide you with all the tools you need, then entrusting you to use that power with care. What was it Uncle Ben said to Peter? "With great power comes great responsibility."

This type of feature may seem a little dodgy, but in practice it becomes extremely useful. It means that I can reopen any class that I want, at any time, which often leads to more manageable code.

But I'm not just limited to reopening my own classes. I can even reopen Ruby's base classes. This is referred to as "Monkey patching", and is usually frowned upon, as it is not very wise to be overriding the core of the language. But if used carefully and sparingly, we are able to add a little extra functionality to our app by extending a base class or two.

When it comes to Rails, Ruby's base classes are extended quite a bit, especially within its ActiveSupport library, which reopens the String, Integer, and many other base classes. But it does so to add a lot of extra, and very useful functionality. It's done so with care and attention.

For example, I want to know if an integer is odd or even, but Ruby provides no such method for doing so, so I write my own. But instead of writing a standalone function within my class, I can reopen Ruby's Integer class like so:

&lt;code&gt;&lt;pre lang="ruby"&gt;RUBY
class Integer
  def odd?
    self % 2 == 1
  end
end&lt;/pre&gt;&lt;/code&gt;

and now I can call:

&lt;code&gt;&lt;pre lang="ruby"&gt;RUBY
3.odd?&lt;/pre&gt;&lt;/code&gt;

which would of course return true. All I am doing is reopening the Integer class, and adding a new method.

"But what's that question mark doing there? Is that part of the method name?" Actually, yes it is. In PHP, you can only use letters, number, and underscores in method and function names. But Ruby lets be a little more expressive, and use other characters such as &lt;code&gt;?&lt;/code&gt;, &lt;code&gt;!&lt;/code&gt;, and even &lt;code&gt;/&lt;/code&gt;. So in the &lt;code&gt;odd&lt;/code&gt; example above, I ended the method name with a question mark, because what I am doing is effectively asking a question of the number. "Are you an odd integer?". Which it replies with a true or false value. Neat hey?

One of the most powerful uses of reopening classes, is the plugin system available in Rails. We can use Rails plugins to extend and override nearly every part of Rails. Which is why there are thousands of Rails plugins. You can do pretty much anything you want.

So I hope I have provided a good, solid reason why Ruby is better than PHP, with a feature that simply cannot be achieved with PHP. It really is very powerful, that when used carefully, can save you a lot of time, and make coding with Ruby lots of fun. Which after all, that's why we're here isn't it?!

Next time, I think I'll talk about Blocks; yet another feature of Ruby that PHP cannot emulate.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/u_ft0qKENv4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2009/05/21/10-reasons-why-ruby-is-better-than-php-reason-2.html</feedburner:origLink></entry>
 
 <entry>
   <title>10 Reasons why Ruby is better than PHP - Reason #1</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/I9qRtFBvxxw/10-reasons-why-ruby-is-better-than-php-reason-1.html" />
   <updated>2009-05-20T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2009/05/20/10-reasons-why-ruby-is-better-than-php-reason-1</id>
   <content type="html">So it seems that I didn't provide the best of examples in &lt;a href="http://developingwithstyle.com/2009/05/19/why-i-chose-ruby-on-rails-instead-of-cakephp-for-codaset/"&gt;my last post&lt;/a&gt;, when explaining &lt;a href="http://developingwithstyle.com/2009/05/19/why-i-chose-ruby-on-rails-instead-of-cakephp-for-codaset/"&gt;why I chose Ruby on Rails instead of CakePHP&lt;/a&gt; for developing &lt;a href="http://codaset.com"&gt;Codaset&lt;/a&gt;. So I decided that I will write 10 [solid] reasons, why Ruby is better than PHP. After all, that is why I chose it.

I already explained a little bit about the aesthetics of Ruby, and how you can write a method without the need for any curly braces or even parenthesis. So I think I will leave the aesthetics alone for a little bit.

&lt;strong&gt;What a wonderful Objectified world!&lt;/strong&gt;

I think one of the most significant differences between Ruby and PHP, and perhaps the basis for a lot of other features of Ruby, is that everything in Ruby is an object. Even though PHP supports Object Oriented Programming, OOP was not even thought of when PHP started out. OOP was simply hacked into the language, and so is not a pure object-oriented language. That is because it uses primitive types; things that are not objects. We use primitive types all the time in PHP. Things like integers, floats and strings are all primitive types. Pretty much all we can do with them, is store data in them and pass them around. On their own, they do very little.

Ruby is a pure object-oriented language, and it was built like that from the start.

So why should I care? I hear you say. Well, because everything in Ruby is an object, everything accepts method calls, even &lt;code&gt;nil&lt;/code&gt;. (&lt;code&gt;nil&lt;/code&gt; is Ruby's equivalent to PHP's &lt;code&gt;null&lt;/code&gt;.)� In PHP, a string isn't smart enough to do anything on its own. If we want to get the length of a string, we would have to call a separate function, and pass the string to it:

&lt;pre lang="php"&gt;PHP
$my_string = 'Just another string';
echo strlen($my_string);&lt;/pre&gt;

With Ruby, we can ask the string directly, to tell us its length:

&lt;pre lang="ruby"&gt;RUBY
my_string = "Just another string"
puts my_string.length&lt;/pre&gt;

FYI: PHP variables always start with a dollar sign &lt;code&gt;$&lt;/code&gt;, but Ruby doesn't have this requirement. Yet another keystroke saved. Yay! You also may have noticed that we also don't need to type the semi-colon &lt;code&gt;;&lt;/code&gt; at the end of each line in Ruby. You can, but you don't have to, unless of course the above two lines are placed on the same line. In which case, the semi-colon will be needed to separate the two.

We could also write the above ruby code like this:

&lt;pre lang="ruby"&gt;RUBY
puts "Just another string".length&lt;/pre&gt;

&lt;strong&gt;Chicken or Egg?&lt;/strong&gt;

One of the biggest frustrations for me when it comes to coding in PHP, is the need to memorise the order of arguments to the language's many global functions. I've been coding in PHP for over 10 years now, and I still have trouble remembering which argument comes first in a function call. Was it the chicken or was it the egg?

For example, let's take the &lt;code&gt;in_array&lt;/code&gt; function:

&lt;pre lang="php"&gt;PHP
in_array($chicken, $egg);&lt;/pre&gt;

And then lets compare that with the &lt;code&gt;array_push&lt;/code&gt; function, which takes its arguments in the reverse order:

&lt;pre lang="php"&gt;PHP
array_push($egg, $chicken);&lt;/pre&gt;

Most of PHP's array functions take an array as the first argument, but there are a few exceptions. Inconsistencies such as this can get very frustrating, and PHP is riddled with them. When you don't know any differently, you tend to overlook these. But ever since I started working with Ruby, these little annoyances actually become big annoyances.

But this is the nature of PHP and it's procedural programming design. Fortunately, Ruby solves this problem with object orientation. Lets look at Ruby's equivalents to &lt;code&gt;in_array&lt;/code&gt; and &lt;code&gt;array_push&lt;/code&gt;.

First we create an array and assign it to the &lt;code&gt;fruit&lt;/code&gt; variable:

&lt;pre lang="ruby"&gt;RUBY
fruit = ['apple', 'orange']&lt;/pre&gt;

Then we check to see if &lt;code&gt;'banana'&lt;/code&gt; is in the fruit array. This is the same as PHP's &lt;code&gt;in_array&lt;/code&gt; function:

&lt;pre lang="ruby"&gt;RUBY
fruit.include? 'banana'&lt;/pre&gt;

So the above obviously returns &lt;code&gt;false&lt;/code&gt;, as &lt;code&gt;'banana'&lt;/code&gt; does not exist, or is not included in the &lt;code&gt;fruit&lt;/code&gt; array. So lets push it in:

&lt;pre lang="ruby"&gt;RUBY
fruit.push 'banana'&lt;/pre&gt;

And now &lt;code&gt;fruit&lt;/code&gt; equals &lt;code&gt;['apple', 'orange', 'banana']&lt;/code&gt;

In Ruby, an array is an object, so if we want to push a variable into the array, we simply take that array and just call &lt;code&gt;push&lt;/code&gt;. It needs only one argument, since the method is attached to the object on which it will operate. And we now have no source of confusion.

Not only does this help with remembering arguments, it also helps to organize the Ruby code space. Instead of having many procedural functions in a global space like PHP, Ruby packages all its methods nice and neatly into the objects that actually need them.

Of course, there are many more reasons why objectifying everything can help you, but these are some of the most notable. But I hope you can see that Ruby's object-oriented nature actually makes life simpler.

In my next post where I explain reason #2 as to why Ruby is better than PHP, I will attempt to explain and show you one of the biggest differences, and the reason why developing plugins in Rails is so powerful.

Thanks for tuning in guys, and don't forget to leave your comments. I'd love to know your thoughts and opinions.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/I9qRtFBvxxw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2009/05/20/10-reasons-why-ruby-is-better-than-php-reason-1.html</feedburner:origLink></entry>
 
 <entry>
   <title>Why I chose Ruby on Rails instead of CakePHP for Codaset</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/0suDo4kDCmg/why-i-chose-ruby-on-rails-instead-of-cakephp-for-codaset.html" />
   <updated>2009-05-19T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2009/05/19/why-i-chose-ruby-on-rails-instead-of-cakephp-for-codaset</id>
   <content type="html">So &lt;a href="http://codaset.com"&gt;Codaset&lt;/a&gt; is being written in Ruby on Rails and not CakePHP. A bold decision I think, but a decision backed up by years of sitting on the fence when it came to Ruby and Rails, but also a little controversial, since I have been working with PHP and Cake for a long time now. So I wanted to lay out my reasons for going with Rails for the development of Codaset.

CakePHP is and probably always will be, the best PHP framework out there. I like to think that it has its head screwed on. Of course, that is all about the heads of the core team leading it, but as long as they stay focused on what Cake is there for, then it should stay like that. I continue to use Cake extensively with my day job at &lt;a href="http://shermanstravel.com"&gt;ShermansTravel&lt;/a&gt;, and will do so for while to come. But, ever since I discovered Ruby on Rails a few years ago, I've been constantly teased by it's power - due largely in part by the Ruby language it is written in. A power that PHP simply does not have, and probably never will. Cake is severely limited by PHP, and makes the most of a language that is probably a little inadaquet at times. Unfortunately PHP has bad design decisions written all over it.

In fact, there is not a day goes by, that PHP does not frustrate me with its design. A task completed in PHP, is - most of the time - completed so much more elegantly if done in Ruby. Ruby is just so damn expressive, and actually, very, very natural. PHP is not! I mean, why the hell should I have to write curly braces around every single expression, or wrap things in parenthesis? In Ruby, parentheses are optional in method calls, except to clarify which parameters go to which method calls.

This is PHP:
&lt;pre lang="php"&gt;class Parrot {
  public function say($word) {
    // say it here
  }
}&lt;/pre&gt;
And this is Ruby:
&lt;pre lang="ruby"&gt;class Parrot
  def say(word)
    # say it here
  end
end&lt;/pre&gt;
Now isn't that so much nicer?

Yes, I know that's all about aesthetics, but I like my code to look good. It makes looking at it and working with it, much more pleasant. But also this is just one of the hundreds of reasons why I chose Ruby and Rails. I suppose you could name this post "Why I chose Rails instead of Cake: &lt;strong&gt;Reason #1&lt;/strong&gt;".

The bottom line, is that I have played around with Rails for years now, but never took the plunge and wrote an entire - completed - application with it. I started a few times, but then went back to using Cake. But this was because I didn't know Ruby well enough, and because of that, it was taking a long time to do something that I could have done much quicker in PHP. But because of all that tinkering, I can confidently say that I now know the basics of Ruby and can quite easily write a Ruby script, or a full Rails app.

So writing Codaset in Rails was the right decision. Every time I open it up in Textmate, I'm excited by what I see. Everytime I see another Rails plugin or Ruby gem, I want to install it. The thought of developing the next feature of Codaset exites me in ways that PHP almost never has. And because of all that, I'm learning a new programming language at an incredible rate. Once you get past the learning curve, you really start zooming through any app.

I'm even considering open sourcing Codaset! I want the world to see what I've done, and how I did it.

Lovin' it!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/0suDo4kDCmg" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2009/05/19/why-i-chose-ruby-on-rails-instead-of-cakephp-for-codaset.html</feedburner:origLink></entry>
 
 <entry>
   <title>So what the hell is Codaset?</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/4jySCgcYqdE/so-what-the-hell-is-codaset.html" />
   <updated>2009-05-13T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2009/05/13/so-what-the-hell-is-codaset</id>
   <content type="html">&lt;a href="http://codaset.com"&gt;&lt;img class="alignleft size-full wp-image-343" title="Codaset Logo" src="/img/wpuploads/2009/05/00000002_r4_c2.jpg" alt="Codaset Logo" width="181" height="53" /&gt;&lt;/a&gt;Ever since I began working for &lt;a href="http://www.shermanstravel.com"&gt;ShermansTravel&lt;/a&gt;, and in particular, since I became more involved with &lt;a href="http://cakephp.org"&gt;CakePHP&lt;/a&gt; and open source software, I've spent a LOT of time using &lt;a href="http://trac.edgewall.org/"&gt;Trac&lt;/a&gt; and &lt;a href="http://github.com/joelmoss"&gt;Github&lt;/a&gt;. Trac is somewhat of a defacto standard for managing software projects, and is what we use at work. Github is what I use for my personal and open source projects; and is also what I wish I could use at work. Both are great at what they do, but in most cases, each does something better than the other.

Trac has a kickass issue tracking system, which is very customisable, and integrates very neatly with Subversion. Unfortunately it's not especially user friendly, and doesn't support Git. (there is a git plugin, but it's alpha code). It's also self hosted and written in Python, which means it's not the easiest to get up and running.

Github is so hot right now! And for good reason too. It's built entirely around the excellent Git, and implements it's features all around the ideal's of Git. But that's about all it does. Only up until recently has it been given an issue tracking system, and to be honest... that sucks!

So basically, both Trac and Github have their strengths and their weaknesses. But each is missing a part or parts of the other.

So that is why I am creating &lt;a href="http://codaset.com"&gt;Codaset&lt;/a&gt;. Codaset aims to be all that Trac and Github are good at, in one nice, neat package. It will be based on Git, allowing it to offer great social features, but it will also have a kickass issue tracking

system that will integrate perfectly with your source control.

But I don't intend to make this a Github/Trac clone. It's gonna be sooo much more... eventually! Things that you cannot find on any other web based software project management system.

&lt;a href="/img/wpuploads/2009/05/picture-2.png"&gt;&lt;img class="size-medium wp-image-335 alignleft" title="Git Tree screenshot" src="/img/wpuploads/2009/05/picture-2-300x229.png" alt="Git Tree screenshot" width="300" height="229" /&gt;&lt;/a&gt;

So this was just a little teaser, and an &lt;a href="http://codaset.com"&gt;invite&lt;/a&gt; for you all to &lt;a href="http://codaset.com"&gt;join in the private beta&lt;/a&gt;, which I hope to start soon. Take a look over at &lt;a href="http://codaset.com"&gt;Codaset.com&lt;/a&gt;, and signup now. I'll be posting more about what to expect as and when I can. In the meantime, here's a quick screen shot to wet your appetite.

Oh and don't forget to &lt;a href="http://twitter.com/joelmoss"&gt;follow me on Twitter&lt;/a&gt;.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/4jySCgcYqdE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2009/05/13/so-what-the-hell-is-codaset.html</feedburner:origLink></entry>
 
 <entry>
   <title>Enhanced Controller Callbacks for CakePHP</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/NXlxgi2wnpc/enhanced-controller-callbacks-for-cakephp.html" />
   <updated>2009-03-23T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2009/03/23/enhanced-controller-callbacks-for-cakephp</id>
   <content type="html">I had this idea a while ago, and actually implemented it into a Cake project, but it was a bit hacky and required hacking the core. So I didn't like it. But today, I had a need for this same functionality, so I had a little think about how I could implement it without hacking the core, and thus was born the &lt;a href="http://github.com/joelmoss/cakephp-callback"&gt;Callback plugin&lt;/a&gt; for CakePHP.

If any of you have ever used Ruby on Rails, you should be familiar with its callback system. Well, it was this system that I needed.� I just started fleshing out a new Cake app, and needed to run a &lt;em&gt;beforeFilter&lt;/em&gt; callback on a couple of specific controller actions. Of course, I could do this:

&lt;pre lang="php"&gt;
class MyController extends AppController {
    function beforeFilter() {
        if ($this-&gt;params['action'] == 'index' || $this-&gt;params['action'] == 'view') {
            # do something here that only the 'index' and 'view' actions need
        }
    }
}
&lt;/pre&gt;

But that's just not very elegant, and will get pretty messy the more you do it. So I came up with the Callback plugin, which is basically a simple component that provides some sweetly fine grained control over your callbacks. So now I can do this instead:

&lt;pre lang="php"&gt;
  class MyController extends AppController {
      var $beforeFilter = array('myCallback');

      function _myCallback() {
          # do something here
      }
  }
&lt;/pre&gt;

and I can even call several callbacks, each with their own methods:

&lt;pre lang="php"&gt;
  class MyController extends AppController {
      var $beforeFilter = array('myCallback', 'anotherCallback', 'andAnotherOne');

      function _myCallback() {
          # do something here
      }

      function _anotherCallback() {
          # do something here
      }

      function _andAnotherOne() {
          # do something here
      }
&lt;/pre&gt;

Now the above is lovely and all, but it doesn't really provide any extra functionality above what Cake already provides. So far, my code just looks cleaner. What I really want to do is only run the &lt;em&gt;anotherCallback&lt;/em&gt; when calling the &lt;em&gt;index&lt;/em&gt; action. So I change the $beforeFilter param:

&lt;pre lang="php"&gt;
  class MyController extends AppController {
      var $beforeFilter = array(
          'myCallback',
          'anotherCallback' =&gt; array(
              'only' =&gt; 'index'
          )
          'andAnotherOne'
      );
&lt;/pre&gt;

Much better! I can also specify to run a callback on all actions, except the 'delete' action:

&lt;pre lang="php"&gt;
  class MyController extends AppController {
      var $beforeFilter = array(
          'anotherCallback' =&gt; array(
              'except' =&gt; 'delete'
          )
      );
&lt;/pre&gt;

Even better! But still I wanted more!

I wanted to be able to add even more control, and only run a callback if a certain condition is/not met:

&lt;pre lang="php"&gt;
  class MyController extends AppController {
      var $beforeFilter = array(
          'anotherCallback' =&gt; array(
              'if' =&gt; 'ifTrue'
          )
      );

      function _ifTrue() {
          # do something here and return true for the callback to run
          return true;
      }
&lt;/pre&gt;

So the &lt;em&gt;anotherCallback&lt;/em&gt; callback will now only run if the &lt;em&gt;_ifTrue&lt;/em&gt; method returns true. Lovely!

Right now it supports the three main controller callbacks: beforeFilter, beforeRender and afterFilter. The plan is to provide the same functionality to Models.

You can checkout the code from Github repo at &lt;a href="http://github.com/joelmoss/cakephp-callback"&gt;http://github.com/joelmoss/cakephp-callback&lt;/a&gt;. Feel free to fork away!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/NXlxgi2wnpc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2009/03/23/enhanced-controller-callbacks-for-cakephp.html</feedburner:origLink></entry>
 
 <entry>
   <title>Cake Nibbles #4</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/HjnjPULV_kY/cake-nibbles-4.html" />
   <updated>2009-02-09T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2009/02/09/cake-nibbles-4</id>
   <content type="html">It's been too long, but here's another handful of nibbles for your CakePHP applications and development.

&lt;strong&gt;Plugin Server&lt;/strong&gt;

After some great improved support for re-usable plugins in Cake 1.2, and Gwoo's &lt;span style="text-decoration: line-through;"&gt;announcement&lt;/span&gt; mention at last years CakeFest in Florida; we are now starting to see some evidence of a fabled plugin server. The idea, is that after installing a small Cake shell in your vendors directory, you would be able to install a selection of official and unoffical Cake plugins into your application via the command line. So no need to manually download, unzip and copy files into your plugins directory, as the shell would do it for you. The actual server code is also planning on becoming publicly available, so that we can all host our own CakePHP plugin server.

You can test the first release at &lt;a href="http://plugins.thoughtglade.com"&gt;http://plugins.thoughtglade.com&lt;/a&gt;

I gotta say, that I love this idea, and would really help in spreading the word. Not to mention, make it easier to use Cake and its increasing selection of plugins. I just wish that there would be a similar way to install Cake. There are some great things to be said about systems such as Pear, which would allow you to install the Cake core in a central place on your machine. Then create apps anywhere else on the same machine.

&lt;strong&gt;CakePHP 1.2.1&lt;/strong&gt;

Hot on the heals on the final release of CakePHP 1.2, comes a bug fix and security release. 1.2.1 includes a few bug fixes, but most importantly, fixes a nasty security risk in 1.2. So please &lt;a href="http://cakephp.org/"&gt;upgrade&lt;/a&gt; as soon as you can.

&lt;strong&gt;API Viewer&lt;/strong&gt;

Up until now, the Cake API left a lot to be desired. But after some frustrations with Doxygen, Core developer Mark Story led the charge to create a Cake based API generator. And man did he do a great job. Check out the new API viewer now at &lt;a href="http://api.cakephp.org"&gt;http://api.cakephp.org&lt;/a&gt;, or check out and use the code at &lt;a href="http://thechaw.com/api_generator"&gt;http://thechaw.com/api_generator&lt;/a&gt;

&lt;strong&gt;DebugKit Moves home&lt;/strong&gt;

And just a quick reminder that the excellent DebugKit plugin has moved to a new home at The Chaw: &lt;a href="http://thechaw.com/debug_kit"&gt;http://thechaw.com/debug_kit&lt;/a&gt; - Don't leave home without it!

&lt;strong&gt;CakePHP Twitter Timeline&lt;/strong&gt;

This just in, you can now see all the buzz and twitterrings about Cake in a very pleasing way: &lt;a href="http://cakealot.com/cakephp-timeline.html"&gt;http://cakealot.com/cakephp-timeline.html&lt;/a&gt;

&lt;strong&gt;BedPosted&lt;/strong&gt;

And this is just great. A web app which you can use to keep track of your sex life. Haven't you always wondered how often you scored this past month, or would like to see a rolling sex history of your life? Well worry no more, coz some bright spark has done just that, and it's all done with CakePHP. Check out &lt;a href="http://www.bedposted.com/"&gt;BedPost&lt;/a&gt;.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/HjnjPULV_kY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2009/02/09/cake-nibbles-4.html</feedburner:origLink></entry>
 
 <entry>
   <title>And finally... CakePHP 1.2 is stable and final!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/8g4gIobWZJo/and-finally-cakephp-12-is-stable-and-final.html" />
   <updated>2008-12-27T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/12/27/and-finally-cakephp-12-is-stable-and-final</id>
   <content type="html">Just a quick one, as I am sure that you have already &lt;a href="http://bakery.cakephp.org/articles/view/the-gift-of-1-2-final"&gt;read&lt;/a&gt;, but I am extremely pleased to tell you all that CakePHP has been released as a final and stable release. This means no more alpha's, beta's or release candidates. &lt;a href="http://cakephp.org"&gt;Get it while it is hot&lt;/a&gt;, as it is very HOT!

Big congrats go to Nate, Gwoo and all the core team. Well done guys! On to 1.3...
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/8g4gIobWZJo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/12/27/and-finally-cakephp-12-is-stable-and-final.html</feedburner:origLink></entry>
 
 <entry>
   <title>Cake Nibbles #3</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/6kHtb8XDueE/cake-nibbles-3.html" />
   <updated>2008-12-19T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/12/19/cake-nibbles-3</id>
   <content type="html">This will be a short edition of Cake Nibbles, and I suppose, a bit of a Christmas special.

&lt;strong&gt;CakePHP RC4 Released&lt;/strong&gt;

First up, and the reason for this short, but special edition, is that last nights &lt;a href="http://bakery.cakephp.org/articles/view/rc4-close"&gt;announcement&lt;/a&gt; of release candidate 4. Even though RC3 was announced as being the last RC before a stable version of CakePHP 1.2, it seems that this new release is actually the last RC. I've mentioned this before, but I really wish that the core team would adhere more to the &lt;em&gt;"release often, release early"&lt;/em&gt; principle. I really don't see how Cake could become any more stable, and unfortunately don't think we have any chance of seeing a final stable release by Christmas. But I am encouraged by Nate's promise of a final release "very soon" after this release. We shall see...

&lt;strong&gt;CakeBattles&lt;/strong&gt;

&lt;a href="http://www.jamesfairhurst.co.uk"&gt;James Fairhurst&lt;/a&gt; continues to impress. He just &lt;a href="http://www.jamesfairhurst.co.uk/posts/view/introducing_cakebattles"&gt;announced&lt;/a&gt; and released another fun application built with Cake.
&lt;blockquote&gt;&lt;a href="http://cakebattles.jamesfairhurst.co.uk/"&gt;CakeBattles&lt;/a&gt; is an online application that allows Contenders to be pitted against each and allows users to vote on who/what would win. Each Contender can be assigned to multiple Tags which are used to create battles with similar Contenders. Each Contender can also have multiple images and these are displayed at random to keep the battles fresh.&lt;/blockquote&gt;
I wish I could just write a fun little app, But instead I find myself drawn to very large and complex apps, that I never seem to get finished. Fun to do, but all a little pointless if they never get finished. So hats off to James.

And that's about it for now. All that remains for me to do now, is to wish and yours a very Merry Christmas and a happy new year. Have a good one!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/6kHtb8XDueE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/12/19/cake-nibbles-3.html</feedburner:origLink></entry>
 
 <entry>
   <title>CakePHP plugins that love Git</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/_P2_dppTS_M/cakephp-plugins-that-love-git.html" />
   <updated>2008-12-04T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/12/04/cakephp-plugins-that-love-git</id>
   <content type="html">Since the announcement of the &lt;a href="http://github.com/cakephp/debug_kit"&gt;DebugKit plugin&lt;/a&gt;, and its source control taking place on &lt;a href="http://github.com"&gt;Github&lt;/a&gt;, there have been a slew of Cake users placing their code under Git control, in particular, on Github. So I thought I would give you all a run down of the great and good in Cake/Git land.

&lt;a href="https://github.com/joelmoss/cakephp-db-migrations"&gt;&lt;strong&gt;DB Migrations&lt;/strong&gt;&lt;/a&gt;

Oh come on! You didn't really think I wouldn't mention this one did ya? The easiest and best way to manage your database schema has been Gittified for a few months now. And already the new wiki has received contributions from people other than me.

&lt;a href="http://github.com/joelmoss/cakephp-namedscope"&gt;&lt;strong&gt;Named Scope&lt;/strong&gt;&lt;/a&gt;

Last one of mine - I promise! Inspired by a Ruby on Rails feature, Named Scope is actually a very powerful and useful addition to Cake. I've started to use it extensively in my Cake apps. You really should check it out. You'll wonder how you ever got by without it.

&lt;a href="http://github.com/cakephp/debug_kit"&gt;&lt;strong&gt;Debug Kit&lt;/strong&gt;&lt;/a&gt;

Probably the most popular Cake repo controlled by Git and Github, this extremely useful plugin places a small bar at the top right of your app's pages, presenting you with debugging data, such as your DB log, view variables, and params. This should be part of the core, and is the best example of how Git can really help with developing open source code, and encouraging others to contribute. It has already been forked several times.

&lt;a href="http://github.com/rafaelbandeira3/cakephp-plugins"&gt;&lt;strong&gt;Rafael Bandeira's Plugins&lt;/strong&gt;&lt;/a&gt;

&lt;em&gt;Rafael Bandeira&lt;/em&gt; created a couple of model behaviors, and has made them available on Github for all to see. One in particular sticks out and impresses, and that is the &lt;a href="http://github.com/rafaelbandeira3/cakephp-plugins/tree/master/behaviors%2Flazy_loader.php"&gt;Lazy Loader behavior&lt;/a&gt;. This will allow you to get related model data with simple, readable and nice method calls. &lt;a href="http://rafaelbandeira3.wordpress.com/2008/11/21/lazy-loader-behavior-what-you-need-when-you-need-the-way-you-want/"&gt;His blog&lt;/a&gt; explains more.

&lt;a href="http://github.com/klevo/wildflower"&gt;&lt;strong&gt;Wildflower&lt;/strong&gt;&lt;/a&gt;

Wildflower is a very promising "Content management system and application platform built on the CakePHP framework and jQuery Javascript library". I actually discovered this after a tip from Nate. If handled well, this could mean good things for Cake.

&lt;a href="http://github.com/markstory/story-scribbles/tree/master/cakephp"&gt;&lt;strong&gt;Story Scribbles&lt;/strong&gt;&lt;/a&gt;

Cake's very own &lt;em&gt;Mark Story&lt;/em&gt; now has a Github repo full of lovely little Cake 'scribbles'. Enjoy things such as his ACL based Menu component, web service behavior and his Geshi helper.

&lt;a href="http://github.com/felixge/debuggable-scraps/tree/master/cakephp"&gt;&lt;strong&gt;Felix's Scraps&lt;/strong&gt;&lt;/a&gt;

Another bunch of Cake bits and bobs, but this time from &lt;em&gt;Felix Geisend�rfer&lt;/em&gt;, he of &lt;a href="http://debuggable.com/"&gt;Debuggable&lt;/a&gt; fame. What interests me the most is his collection of datasources, allowing you to connect your Cake apps to external services such as Akismet, Amazon and Google.

These are just what I feel are the pick of the crop, but there is &lt;a href="http://github.com/search?q=cakephp"&gt;a lot more&lt;/a&gt; than I originally thought on Github, including an &lt;a href="http://github.com/georgious/cakephp-yaml-migrations-and-fixtures"&gt;alternative migrations shell&lt;/a&gt;, that doesn't rely on Pear, and that just might spur me on to get rid of my reliance on the MDB2 library.

The Cake community seems to be loving Git right now. I only wish the powers that be will make that decision to switch.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/_P2_dppTS_M" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/12/04/cakephp-plugins-that-love-git.html</feedburner:origLink></entry>
 
 <entry>
   <title>Cake Nibbles #2</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/Q_8mXPM-4D8/cake-nibbles-2.html" />
   <updated>2008-11-26T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/11/26/cake-nibbles-2</id>
   <content type="html">Welcome to the second edition of Cake Nibbles; where I tell you all about the latest goings-on in the world of CakePHP.

&lt;strong&gt;Cook Book goes open source&lt;/strong&gt;

First up is the news that the &lt;a href="http://book.cakephp.org/"&gt;Cake Cook Book&lt;/a&gt; has been &lt;a href="http://thechaw.com/cakebook"&gt;open sourced&lt;/a&gt;. The best part of this news is that it uses Git and not Subversion for its source control. This is great news for the Cake community, and what is even greater is mentioned next...

&lt;strong&gt;Chew on The Chaw&lt;/strong&gt;

I was a little puzzled at that one as well, and to be honest I still am. But as you may have noticed, the CookBook was released on a new service called &lt;a href="http://thechaw.com/"&gt;The Chaw&lt;/a&gt;. The Chaw is similar to &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt;, in that it lets you host your Git repositories, and manage them online. But what sets The Chaw apart from Github, is that it also provides a ticketing/issue management system, which is something that Github sorely lacks. So apart from the name (what the hell is a Chaw?), this is great news.

&lt;strong&gt;CakeFest #2&lt;/strong&gt;

December 2nd, will see the start of &lt;a href="http://cakefest.org/"&gt;CakeFest #2&lt;/a&gt;. The second official CakePHP conference will take place in Buenos Aires, Argentina between December 2nd and 5th, and is looking every bit as promising as the first CakeFest was in Orlando earlier this year.

&lt;strong&gt;New release of ModelBaker and appearance at MacWorld&lt;/strong&gt;

A few months ago I &lt;a href="http://developingwithstyle.com/2008/09/06/modelbaker-a-desktop-application-for-building-cakephp-applications/"&gt;blogged&lt;/a&gt; about a promising new Mac application called &lt;a href="http://www.widgetpress.com/"&gt;ModelBaker&lt;/a&gt;. Well, a new release has just been announced, as well as news that ModelBaker will be in attendance at MacWorld Conference in January. Of course, it is still in closed Beta, but I do have access to that, and still intend to provide a short review and more info on that as soon as I can.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/Q_8mXPM-4D8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/11/26/cake-nibbles-2.html</feedburner:origLink></entry>
 
 <entry>
   <title>NamedScope for CakePHP</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/uXaH9J2SrAU/namedscope-or-cakephp.html" />
   <updated>2008-11-20T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/11/20/namedscope-or-cakephp</id>
   <content type="html">I discovered the joys of NamedScope for Ruby on Rails quite a while ago now, and have always been an admirer. Its makes performing finds on models very elegant and convenient, by automagically creating model methods based on your pased scope params. Just like this:
&lt;pre lang="ruby"&gt;Named Scope in Rails
class User &lt; ActiveRecord::Base
  named_scope :active, :conditions =&gt; {:active =&gt; true}
  named_scope :inactive, :conditions =&gt; {:active =&gt; false}
end

# Standard usage
User.active    # same as User.find(:all, :conditions =&gt; {:active =&gt; true})
User.inactive # same as User.find(:all, :conditions =&gt; {:active =&gt; false})&lt;/pre&gt;
Then a few months ago I read &lt;a href="http://codetunes.com/2008/09/05/named-scope-in-cakephp/"&gt;this blog post&lt;/a&gt; and discovered that someone had created similar functionality for CakePHP, in the form of a model behavior. Although it's not quite as powerful as it's Rails cousin, it does let you define named scopes for any model quite easily. However, I wasn't crazy about a few things.

Named Scopes are defined like this:
&lt;pre lang="php"&gt;Don't like this:
class User extends AppModel {
  var $actsAs = array(
    'NamedScope' =&gt; array(
      'activated' =&gt; array('User.activated in not null'),
      'online' =&gt; array('date_add(User.last_activity, interval 5 minute) &gt; now()')
    )
  );
}&lt;/pre&gt;
The above format means we can only pass find conditions to a named scope, and cannot pass any other params, such as ORDER and FIELDS.

Then a named scope is then called like this:
&lt;pre lang="php"&gt;this is not nice either
$this-&gt;User-&gt;find('all', array('scope' =&gt; 'activated'));
$this-&gt;User-&gt;find('all',
  array('conditions' =&gt; 'points &gt; 10', 'scope' =&gt; array('activated', 'online')))&lt;/pre&gt;
I have to pass enough params to a find call as it is, so I don't want anymore.

What I want to do is this:
&lt;pre lang="php"&gt;This is better
class User extends AppModel {
  var $actsAs = array(
    'NamedScope' =&gt; array(
      'active' =&gt; array(
        'conditions' =&gt; array(
          'User.is_active' =&gt; true
        ),
        'order' =&gt; 'User.name ASC'
      )
    )
  );
};&lt;/pre&gt;
and this
&lt;pre lang="php"&gt;Easy peasy!
$active_users = $this-&gt;User-&gt;active('all');&lt;/pre&gt;
I can even do this:
&lt;pre lang="php"&gt;This is just lovely
$active_users = $this-&gt;User-&gt;active('all', array(
    'conditions' =&gt; array(
        'User.created' =&gt; '2008-01-01'
    ),
    'order' =&gt; 'User.name ASC'
));&lt;/pre&gt;
Much improved I think, and so much more powerful. &lt;a href="http://github.com/joelmoss/cakephp-namedscope"&gt;So I've only gone and coded the damn thing&lt;/a&gt;! You can find my version of Named Scope for Cake on Github at &lt;a href="http://github.com/joelmoss/cakephp-namedscope"&gt;http://github.com/joelmoss/cakephp-namedscope&lt;/a&gt;.

And you know what? Thanks to the power of CakePHP, the actual code is seven lines shorter than the aforementioned version.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/uXaH9J2SrAU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/11/20/namedscope-or-cakephp.html</feedburner:origLink></entry>
 
 <entry>
   <title>The power of plugins</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/hVcEMcUekZc/the-power-of-plugins.html" />
   <updated>2008-11-13T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/11/13/the-power-of-plugins</id>
   <content type="html">Since I discovered the &lt;a href="http://github.com/cakephp/debug_kit"&gt;DebugKit plugin&lt;/a&gt; for CakePHP that is currently in early development by Mark Story and others (including me. well, one commit still means I helped ;)), I have been left rocked about the power of plugins. I always thought that plugins were simply a way to create a Cake app that can be plugged in to an existing application. But It seems I underestimated their power.

So I began to think about how I could refactor Migrations into a plugin, rather than a bunch of files that you drop into your vendors directory. And that took me all of 20 seconds! I didn't have to change a thing. Thanks to &lt;a href="https://trac.cakephp.org/changeset/7871"&gt;this latest commit&lt;/a&gt;, you can now use a shell script from any plugin.

So I just drop the migrations directory directly into my plugins directory, and wham bam thank you maam! I created my first Cake plugin.

Of course, I can still drop the migrations shells into my global vendors/shells directory, but I just like the way I can plug it in.

So a plugin is now the recommended way to use Migrations.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/hVcEMcUekZc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/11/13/the-power-of-plugins.html</feedburner:origLink></entry>
 
 <entry>
   <title>Keeping your core.php DRY</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/4cLu81fL9hc/keeping-your-corephp-dry.html" />
   <updated>2008-11-05T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/11/05/keeping-your-corephp-dry</id>
   <content type="html">Something that I have been taking advantage of in my Cake 1.2 apps for quite a while now, is the ability to separate your custom config options from your app's core.php file. And I am pretty sure that it is one of those lesser know features in 1.2.

The core.php file within your app's config directory is used to store application wide configuration variables. Things like your debug level, cache settings and sessions store are set here using Cake's very useful Configure class. This file can start to get quite large and unruly as the development of your app progresses. So one of the first things I do when I start a new app, is to separate my custom application config variable into another file within the config directory. This then keeps the core Cake configure settings separate from your custom ones, and keeps things a little dry.

Just create a new file in your app/config directory. You can name this anything you want, but I usually go with something like 'config.php' or 'app.php'. As long as it ends with '.php', it doesn't matter.

Then in your app/config/core.php file, add the following line to the top of the file:

&lt;code&gt;Configure::load('config');&lt;/code&gt;

As long as you pass the name of your newly created file, then it will be fine. So the above will work if I created a file called app/config/config.php.

Then within your new config file, you can set any config variables you wish. However, you don't use the familar &lt;code&gt;Configure::write('name', 'value');&lt;/code&gt; convention. The variables that you set within your custom config file should be specified using arrays. Like this:

&lt;code&gt;$config['name'] = 'value';&lt;/code&gt;

All variables in this file only, should set within the &lt;code&gt;$config&lt;/code&gt; array as array name/value pairs. If your custom config file is called 'app.php', then the array name would be &lt;code&gt;$app&lt;/code&gt;. So effectively, you could create as many of these custom config files as you wish. Perhaps if you had distinct sections of the app. I usually just create one, so I can easily access my custom config vars, without worrying about Cake's built in config vars.

You access these custom config variables in the exact same way as you would any of the other built in core config vars.

&lt;code&gt;Configure::read('name');&lt;/code&gt;

Enjoy!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/4cLu81fL9hc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/11/05/keeping-your-corephp-dry.html</feedburner:origLink></entry>
 
 <entry>
   <title>DB Migrations moves home</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/2Ze9dk_87zw/db-migrations-moves-home.html" />
   <updated>2008-11-02T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/11/02/db-migrations-moves-home</id>
   <content type="html">I've been slowly moving all my public and private projects over to Git and Github whenever, and whereever I can. I've already created a mirror of the &lt;a href="http://github.com/joelmoss/cakephp"&gt;CakePHP 1.2 branch at Github&lt;/a&gt;, and I have a number of my private projects up too.

So I just completed the switch for CakePHP DB Migrations. The source is now available on &lt;a href="http://github.com/joelmoss/cakephp-db-migrations/tree"&gt;Github&lt;/a&gt; and is open to any pull requests. If you have any funky new features, or really need a bug fixed quickly, please feel free to fork the project. But please remember to send me a pull request.

I also moved the Google Code wiki into Github, and enhanced it a little. The &lt;a href="http://github.com/joelmoss/cakephp-db-migrations/wikis"&gt;wiki&lt;/a&gt; now includes some YAML migration examples, and will be expanded with more info and tutorials as and when I can.

The final step of the move, are the tickets/issues. And because it works so nicely with Github, I decided upon using &lt;a href="http://devws.lighthouseapp.com/projects/19133-cakephp-db-migrations"&gt;Lighthouse&lt;/a&gt;. So any bug reports, and/or feature requests should now be sent to &lt;a href="http://devws.lighthouseapp.com/projects/19133-cakephp-db-migrations"&gt;Lighthouse&lt;/a&gt;.

Thanks again for all the support. My hope in moving to Github, is that I can enhance the community aspect of this project, and to encourage more involvement from those of you who use it. I'm all ears!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/2Ze9dk_87zw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/11/02/db-migrations-moves-home.html</feedburner:origLink></entry>
 
 <entry>
   <title>Cake Nibbles: PHPShop, Debug Toolbar and Google No.1</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/0kWgOu_zhpc/cake-nibbles-phpshop-debug-toolbar-and-google-no1.html" />
   <updated>2008-10-23T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/10/23/cake-nibbles-phpshop-debug-toolbar-and-google-no1</id>
   <content type="html">Not posted much here recently, so It's great that all of a sudden I have lots of Cake related news and tidbits to share with you all. So hopefully, this will be post number one in a long series of posts covering CakPHP related news and items, entitled Cake Nibbles. Enjoy!

&lt;strong&gt;PHPShop&lt;/strong&gt;

The &lt;a href="http://groups.google.com/group/cake-php/browse_thread/thread/6e648259fb875997/99c99b1c28f5788a?show_docid=99c99b1c28f5788a"&gt;Google Group revealed some interesting news&lt;/a&gt; about a well know open source PHP shopping cart application. It appears that the next version of &lt;a href="http://www.phpshop.org/"&gt;PHPShop&lt;/a&gt; will be built with CakePHP 1.2. That can be nothing but positive for Cake Land.

&lt;strong&gt;Google No. 1&lt;/strong&gt;

Search for "PHP framework" on Google, and guess what? &lt;a href="http://www.google.com/search?q=php+framework"&gt;Cake is now number one!&lt;/a&gt; Oh yes, NUMBER 1! Top of the pops!

&lt;strong&gt;Debug Kit&lt;/strong&gt;

Not content with being one of the biggest contributors to the core, Mark Story has created a plugin for CakePHP to help with debugging your applications. &lt;a href="http://github.com/cakephp/debug_kit/tree/master"&gt;The Cake DebugKit&lt;/a&gt;, which is now publicly available at GitHub, is similar to the extremely helpful Debug Bar that can be found in the Symfony framework. It displays at the top right of your screen, and shows you info about your app, such as load time and SQL queries.

It's early days, but its a great start, and is something that is sorely needed in Cake. I hope to help out with it myself. And the idea of including it in a plugin is genius, and has made me realise how powerful the plugin architecture has become in 1.2

&lt;strong&gt;TextMate Bundle&lt;/strong&gt;

Also on GitHub, you can now find another version of the &lt;a href="http://github.com/cakephp/tm_bundle/tree/master"&gt;Cake TextMate bundle&lt;/a&gt;. But this one is somewhat official, in that it is being maintained by Nate; Cake's Lead Dev.

So thats it for this issue of Cake Nibbles, but I hope to post again soon.

If you have any interesting, or non-interesting news in Cake land, please let me know.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/0kWgOu_zhpc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/10/23/cake-nibbles-phpshop-debug-toolbar-and-google-no1.html</feedburner:origLink></entry>
 
 <entry>
   <title>CakePHP DB Migrations v4.0 is now Stable</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/N-ZmZOXuHx8/cakephp-db-migrations-v40-is-now-stable.html" />
   <updated>2008-10-07T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/10/07/cakephp-db-migrations-v40-is-now-stable</id>
   <content type="html">After months and months of delays due to work constraints, and other crap, I decided that I needed to get my head down and release v4.0 of CakePHP DB Migrations. So that is exactly what I just did!

v4.0 is now available in all its glory at the Google Code repo at &lt;a href="http://code.google.com/p/cakephp-migrations"&gt;http://code.google.com/p/cakephp-migrations&lt;/a&gt; so get it while it is hot.

You can &lt;a href="http://code.google.com/p/cakephp-migrations/downloads/list"&gt;download it here&lt;/a&gt;.

I plan on creating a new screencast soon(ish), that will include all the updated features and shortcuts, and will also be easier to hear me and will hopefully be a little shorter and concise. But until then, please play around and let me know if you have any questions at all.

Here's the changes taken directly from the changelog:

&lt;code&gt;
[*] errr... lots of fixes
[*] Fixed bug with old style version numbers
[*] Fixed bug where fkeys were trying to be created with auto_increment
[+] Can now specify whether to use Cake's UUID for the ID column within migration files. Example: "id: uuid"
[+] Can now pass "id: false" within migration file, and no ID column will be created.
[-] Deprecated "no_id: true" in favour of "id: false"
[*] ID column is now correctly set as Primary Key when using UUID type.
[+] Added support for MySQL specific table options (comments, engine/type, collate and charset)
[+] Version numbers now use timestamps so as to minimize conflicts
[+] Now supports interleaved migrations;
when migrating up, will run migrations that have not yet been run, and will ignore any non-run migrations when running down.
[+] Added info option (cake migrate info), which shows information on migrations
[+] Can now specify version number when running up/down, thus allowing you to only run the up/down block of a specific migration
[+] Schema table name is now customizable
[+] Now supports PHP arrays in migration files&lt;/code&gt;

I hope to write more about these when I don't have so much decorating on the house to do.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/N-ZmZOXuHx8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/10/07/cakephp-db-migrations-v40-is-now-stable.html</feedburner:origLink></entry>
 
 <entry>
   <title>CakePHP 1.2 RC3 is Released</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/Tcsp7o9gzPc/cakephp-12-rc3-is-released.html" />
   <updated>2008-10-02T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/10/02/cakephp-12-rc3-is-released</id>
   <content type="html">Just woke up to find I missed two exciting events in CakePHP land. First and most important is the release of Release Candidate 3 for 1.2. This release cannot be understated, although I think considering the amount of work that has been done on this release, we should be seeing a stable release of 1.2. I know it was only released a few hours ago, but right now there are a grand total of ONE bug. And that one bug will be fixed in 3 second, when I commit the fix ;). Go over to the Bakery and &lt;a href="http://bakery.cakephp.org/articles/view/release-cakephp-rc3-the-rc-of-triumph"&gt;read the announcement&lt;/a&gt; from Nate, and you will understand the amount of work that has been done.

Although I have been a small part of this, and helped by committing some fixes and enhancements, constraints on my time and family life have kept a some what tight lid on my commitment to contributing. But I hope to change that once 1.2 goes stable. As some of you know, I already have some cool new features waiting in my &lt;a href="http://github.com/joelmoss/cakephp"&gt;unofficial CakePHP Github repo&lt;/a&gt;. So hopefully these will appear in the core of 1.3, or maybe even 2.0!

Oh and by the way, a little bird tells me that Cake will be ditching SVN after 1.2 is released, and will be embracing Git and Github in all its glory. Watch this space!

Second exciting piece of news was the release of a new episode of &lt;a href="http://live.cakephp.org/"&gt;The Show&lt;/a&gt;. It's been a long period of quiet since the last show aired, so this episode is well worth the wait. Well, I am assuming it is, as we only got a one hour heads up &lt;a href="http://twitter.com/nateabele/statuses/942894584"&gt;from Nate, on Twitter&lt;/a&gt;. And that was when I was fast asleep. So I will will have to wait for the episode to be put online.

So congrats to all. I would also have to agree with Nate, on naming Mark Story, the man who has contributed the most to this release than any other person. So everyone please enjoy Mark Story Day!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/Tcsp7o9gzPc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/10/02/cakephp-12-rc3-is-released.html</feedburner:origLink></entry>
 
 <entry>
   <title>ModelBaker: A desktop application for building CakePHP applications</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/IrIiaWyY0UI/modelbaker-a-desktop-application-for-building-cakephp-applications.html" />
   <updated>2008-09-06T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/09/06/modelbaker-a-desktop-application-for-building-cakephp-applications</id>
   <content type="html">Today I received an email informing me of a new &lt;a href="http://twitter.com/joelmoss"&gt;Twitter&lt;/a&gt; follower called &lt;a href="http://twitter.com/widgetpress"&gt;widgetpress&lt;/a&gt; . So I clicked on the users Twitter profile to check 'em out - as I usually do - and saw this post, which happened to be the users only post at the time:
&lt;blockquote&gt;Just released ModelBaker this week and going to private beta this weekend. Getting some real nice feedback.&lt;/blockquote&gt;
Naturally this piqued my interest, and as most of my Twitter followers do so because of my work with CakePHP, I Googled Modelbaker and Widgetpress and found a site at &lt;a href="http://www.widgetpress.com/"&gt;WidgetPress.com&lt;/a&gt;, and ultimately the following video...

&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="src" value="http://www.youtube.com/v/PGqi0pWgEhk&amp;amp;hl=en&amp;amp;fs=1" /&gt;&lt;embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/PGqi0pWgEhk&amp;amp;hl=en&amp;amp;fs=1" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;

So basically, someone has created a Mac application, that can build a CakePHP web application without any coding knowledge at all. It lets you build your models, views and controllers, and even builds helpers for you. I also saw something about a template system, that lets you create a new Cake app based on a predefined application template.

Now this is not really something that I would use, as I'm one of them hard core developers who use a &lt;a href="http://macromates.com/"&gt;text editor&lt;/a&gt; (and enjoy doing so), but it is a great idea for beginners, and could do wonders for CakePHP and its community. I wish I could tell you more, but I want to reserve judgement and any further comments until I have actually tried this out. As soon as I do, I will be sure to let you all know.

You can see a bigger and &lt;a href="http://www.widgetpress.com/modelbaker.mov"&gt;better quality version of this screencast&lt;/a&gt; on the WidgetPress website, but needless to say it is very, very interesting, and testament to how powerful and easy to use CakePHP really is.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/IrIiaWyY0UI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/09/06/modelbaker-a-desktop-application-for-building-cakephp-applications.html</feedburner:origLink></entry>
 
 <entry>
   <title>Let me show you Discovered Genius</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/F8SKmdqqypY/let-me-show-you-discovered-genius.html" />
   <updated>2008-08-31T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/08/31/let-me-show-you-discovered-genius</id>
   <content type="html">The reason why I love the internet soooo much, and why I spend so much time working and playing online is exactly why this blog was created. It's all about those moments when I find a site or online service/software, that simply blows me away with it's genius, and proves everything about what is so great about this thing we like to call the world wide web.

&lt;a href="http://discoveredgenius.com"&gt;&lt;img class="alignright size-medium wp-image-251" title="DiscoveredGenius.com" src="/img/wpuploads/2008/08/discoveredgenius.gif" alt="" width="136" height="73" /&gt;&lt;/a&gt;

A few days ago, I found another one of those Discovered Genius', and wrote a quick &lt;a href="http://twitter.com/joelmoss/statuses/900801152"&gt;Twitter post&lt;/a&gt; on it. A few moments later, I wrote &lt;a href="http://twitter.com/joelmoss/statuses/900802951"&gt;another&lt;/a&gt;, using that &lt;a href="http://labs.mozilla.com/2008/08/introducing-ubiquity/"&gt;Discovered Genius&lt;/a&gt; that I had just found. And thus, a new blog was born at &lt;a href="http://discoveredgenius.com"&gt;DiscoveredGenius.com&lt;/a&gt;.

I downloaded the latest copy of Wordpress, installed it on my Mac, then proceeded to create a theme and add my favourite plugins. I uploaded it to my server, and began to write the &lt;a href="http://discoveredgenius.com/2008/08/31/this-is-discovered-genius/"&gt;first post&lt;/a&gt;.

So...

The idea is simple; every time I discover any sort of Genius that is in any way or form related to the Internet, or indeed, anything at all, I will write about here. It not only means I have a quick and easy way to keep tabs on the best stuff that I discover, but it lets me share it all with you, my dear reader.

&lt;a href="http://discoveredgenius.com/2008/08/31/mozillas-ubiquity-brings-genius-to-firefox/"&gt;The first Discovered Genius&lt;/a&gt; has already arrived, so head on over there. If you discover any that I may have missed, or simply overlooked, please drop me a line at joel [at] discoveredgenius [dot] com. I'm all ears!

And let me know your thoughts.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/F8SKmdqqypY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/08/31/let-me-show-you-discovered-genius.html</feedburner:origLink></entry>
 
 <entry>
   <title>CakePHP now available at Github</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/OT6J3rpmMd8/cakephp-now-available-at-github.html" />
   <updated>2008-08-18T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/08/18/cakephp-now-available-at-github</id>
   <content type="html">&lt;em&gt;&lt;strong&gt;Update:&lt;/strong&gt; The Github repository I created now has an untouched clone of the CakePHP 1.2 SVN branch as the master. I then created a branch of this called 'pimped', which contains my own custom code. This means that you can choose to use the official Cake core, or my pimped copy. I'll try to write a little more about my pimped branch in a future post.&lt;/em&gt;

For the last few months, I've been developing an application which I hope to release to the unsuspecting public very soon. So I wanted to get it on my server and tested remotely, which I promptly did by checking out a copy from my SVN repository. I also did the same for the Cake core, by checking out &lt;a href="https://svn.cakephp.org/repo/branches/1.2.x.x/cake"&gt;https://svn.cakephp.org/repo/branches/1.2.x.x/cake&lt;/a&gt;.

Great, all worked fine... until I spotted loads of errors in the app. I then remembered that I made some local changes to the Cake core. I know, I know, it's a cardinal sin. But I really needed these changes for this app, and it was doing nobody any harm, as they stayed on my local machine. But now, I also needed them on my remote copy on the server, but want to be able to 'svn up' the cake core, whenever there are updates.

So I figured the best way would actually be to use a different SCM just for this purpose. I'd played with &lt;a href="http://git.or.cz/"&gt;Git&lt;/a&gt; a little, and have been really impressed at &lt;a href="http://github.com"&gt;Github&lt;/a&gt;. So I created a public repo at Github, and proceeded to create a clone of the Cake SVN repo, which I then pushed to the public repo at Github. I then applied my custom changes, and now we have a mirror of the CakePHP 1.2 branch at &lt;a href="https://github.com/joelmoss/cakephp/tree"&gt;https://github.com/joelmoss/cakephp/tree&lt;/a&gt;.

I can now clone the new git repo on my remote server, and I have a copy of CakePHP with all my custom changes, which I can update as and when I need to. This is all assuming of course, that I regulalry update the repo from the Cake SVN repo.

So things have actually turned out quite well. Please feel free to push and pull to/from the new &lt;a href="http://github.com/joelmoss/cakephp/tree/master"&gt;git repo&lt;/a&gt;, and let me know your thoughts.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/OT6J3rpmMd8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/08/18/cakephp-now-available-at-github.html</feedburner:origLink></entry>
 
 <entry>
   <title>Captcha or Tic-Tac-Toe?</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/ZGGjfqvVCHM/captcha-or-tic-tac-toe.html" />
   <updated>2008-08-16T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/08/16/captcha-or-tic-tac-toe</id>
   <content type="html">I have a confession to make. I hate Captcha's!

Those stupid little images that are displayed to you during or after you register on a site, that display a set of almost completely unreadable letters and/or numbers. It simply infuriates me when I see them. I live and breathe the internet, but even I can't tell what I am supposed to be entering into the Captcha sometimes. Just imagine what it's like for non-technical types!

So today I stumbled across &lt;a href="http://www.xero.com/"&gt;Xero&lt;/a&gt;, and it picqued my interest enough for me to signup for the free trial. I completed the short signup form, and immediately after I see this:

&lt;a href="/img/wpuploads/2008/08/picture-3.png"&gt;&lt;img class="size-full wp-image-228 alignnone" title="Xero Captcha" src="/img/wpuploads/2008/08/picture-3.png" alt="" width="493" height="367" /&gt;&lt;/a&gt;

No obsure image with a bunch letters that you can't see. I just get to finish a game of Tic-Tac-Toe! As long as I click on the correct square to finish the line with crosses, I'm in and registered.

Now that I might have to steal. Genius!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/ZGGjfqvVCHM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/08/16/captcha-or-tic-tac-toe.html</feedburner:origLink></entry>
 
 <entry>
   <title>Cake's first english language Books</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/IKGuVLT6pkI/cakes-first-english-language-books.html" />
   <updated>2008-07-17T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/07/17/cakes-first-english-language-books</id>
   <content type="html">It's been a long time coming, but finally we have not one, but two books on the CakePHP framework about to be released.

The first from &lt;a href="http://www.packtpub.com"&gt;Packt Publishing&lt;/a&gt;, entitled "&lt;a href="http://www.packtpub.com/cakephp-application-development/book"&gt;CakePHP Application Development&lt;/a&gt;" was recently announced on the &lt;a href="http://groups.google.com/group/cake-php/browse_thread/thread/b33b85c9792a9d12?hl=en"&gt;Cake Google group&lt;/a&gt; and is out now.
&lt;blockquote&gt;This book offers step-by-step instructions to learn the CakePHP framework and to quickly develop and deploy web-based applications. It introduces the MVC pattern and coding styles using practical examples. It takes the developer through setting up a CakePHP development and deployment environment, and develops an example application to illustrate all of the techniques you need to write a complete, non-trivial application in PHP. It aims to assist PHP programmers to rapidly develop and deploy well-crafted and robust web-based applications with CakePHP.&lt;/blockquote&gt;
The second, which is due to be published this month, is from Apress and is called "Beginning CakePHP: From Novice to Professional".
&lt;blockquote&gt;Leads you from a basic setup of CakePHP to building a couple applications that will highlight CakePHP�s functionality and capabilities without delving too deeply into the PHP language, but rather what the CakePHP framework can offer the developer. Targets beginners of CakePHP or web frameworks in general as well as experienced developers with limited exposure to CakePHP. A secondary audience may include developers undecided on adopting CakePHP or business managers trying to assess the value of incorporating CakePHP into their toolbox.&lt;/blockquote&gt;
Both books can be purchased and downloaded in PDF format, or in posted to you in paper form.

This is good news for Cake and its community, as good quality books can really help an open source project grow and mature. And of course, it helps those who aren't familar with how the framework works.

So get buying and tell everyone.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/IKGuVLT6pkI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/07/17/cakes-first-english-language-books.html</feedburner:origLink></entry>
 
 <entry>
   <title>It cost over $1.4 million to develop CakePHP</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/n1veCxX5ljI/it-cost-over-14-million-to-develop-cakephp.html" />
   <updated>2008-06-05T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/06/05/it-cost-over-14-million-to-develop-cakephp</id>
   <content type="html">In todays &lt;a href="http://bakery.cakephp.org/articles/view/release-pure-cake-power-in-rc1"&gt;announcement&lt;/a&gt; on the release of CakePHP RC1, Gwoo mentioned the use of &lt;a href="http://www.ohloh.net"&gt;Ohlo&lt;/a&gt; and in particular, their Journalling feature. I hadn't heard of Ohlo before, so I took a look. Seems a great idea, and touches along the lines of &lt;a href="http://github.com"&gt;Github&lt;/a&gt; (but nowhere near as well). It's basically somewhat of a social networking site for open source projects, and taps into each projects source control system to display changesets and activity. You can rate developers and users, and discover other projects of a similar nature, or with similar tags.

Anyway, I tried registering, but got an error when trying to login, and I have yet to receive my validation email. I was about to give up when I found this curious little box near the bottom of the &lt;a href="http://www.ohloh.net/projects/cakephp"&gt;CakePHP project page&lt;/a&gt;:

&lt;a href="/img/wpuploads/2008/06/picture-2.png"&gt;&lt;img class="alignnone size-medium wp-image-180" title="CakePHP Project Cost - According to Ohlo" src="/img/wpuploads/2008/06/picture-2-300x242.png" alt="CakePHP Project Cost - According to Ohlo" width="300" height="242" /&gt;&lt;/a&gt;

So according to Ohlo, if you wanted to recreate CakePHP in its entirity and copy everything it has, it woul take one person 24 years to complete, and cost nearly $1.4 million!

Now, I'm not taking away from the huge amount of work that has gone into the core by umpteen members of the community, but doesn't that sound a little bit off to you? It seems they use some sort of mathematical calculation based on lines of code etc. But to be honest I really felt that that made a mockery of both Ohlo as a viable service, and CakePHP as a very successful open source project.

Anyway, I just really felt the need to let you all know about that one. I thought it was funny.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/n1veCxX5ljI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/06/05/it-cost-over-14-million-to-develop-cakephp.html</feedburner:origLink></entry>
 
 <entry>
   <title>CakePHP RC1</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/gKhlsIV3XnA/cakephp-rc1.html" />
   <updated>2008-06-05T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/06/05/cakephp-rc1</id>
   <content type="html">Today marks the &lt;a href="http://bakery.cakephp.org/articles/view/release-pure-cake-power-in-rc1"&gt;release&lt;/a&gt; of the long awaited first release candidate of CakePHP. Hopefully this will mean a final release will be close behind.

Congrats to all involved. Keep up the hard work.

On a side note, Cake now has an &lt;a href="http://cakephp.org/jobs"&gt;official jobs board&lt;/a&gt;. Nothing on there right now, but hopefully we will see more activity on there soon. So if you are looking for bakers, please post on there.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/gKhlsIV3XnA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/06/05/cakephp-rc1.html</feedburner:origLink></entry>
 
 <entry>
   <title>Let Google host your Javascript</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/W0EmF5cgfTY/let-google-host-your-javascript.html" />
   <updated>2008-05-27T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/05/27/let-google-host-your-javascript</id>
   <content type="html">Google has just released yet another API. But this time, the API is not interfacing with any of Google's own services.

The &lt;a href="http://code.google.com/apis/ajaxlibs/"&gt;Google Ajax Libraries API&lt;/a&gt;, is a content delivery option and loading architecture for the most popular open source Javascript libraries. It means that with just one line of code, you can load your favourite Javascript library into your web app, and not have to worry about keeping the library up to date. It also means the files are gzipped and minified for you, and takes advantage of any caching. This should mean faster loading JS includes.

&lt;!--more--&gt;

As announced on &lt;a href="http://ajaxian.com/archives/announcing-ajax-libraries-api-speed-up-your-ajax-apps-with-googles-infrastructure"&gt;Ajaxian&lt;/a&gt;, the API is available now, and supports the following open source javascript libraries:
&lt;ul&gt;
	&lt;li&gt;Prototype&lt;/li&gt;
	&lt;li&gt;Scriptaculous&lt;/li&gt;
	&lt;li&gt;JQuery&lt;/li&gt;
	&lt;li&gt;MooTools&lt;/li&gt;
	&lt;li&gt;DoJo&lt;/li&gt;
&lt;/ul&gt;
The simplest way to load any of the above JS libraries, is as follows:
&lt;pre lang="html"&gt;&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.js"&gt;&lt;!--mce:0--&gt;&lt;/script&gt;&lt;/pre&gt;
Or you can use this nifty little snippet, which will always load the latest and greatest version of the library:
&lt;pre lang="javascript"&gt;&lt;script src="http://www.google.com/jsapi"&gt;&lt;!--mce:1--&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;&lt;!--mce:2--&gt;&lt;/script&gt;&lt;/pre&gt;
Take a look at the &lt;a href="http://code.google.com/apis/ajaxlibs/documentation/"&gt;docs&lt;/a&gt; and play. We like!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/W0EmF5cgfTY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/05/27/let-google-host-your-javascript.html</feedburner:origLink></entry>
 
 <entry>
   <title>CakePHP Migrations v4.0 Release Candidate</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/UYHYr8rogDw/cakephp-migrations-v40-release-candidate.html" />
   <updated>2008-05-25T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/05/25/cakephp-migrations-v40-release-candidate</id>
   <content type="html">OK boys and girls; I just posted the first and hopefully only release candidate of Migrations v4.0. &lt;strong&gt;&lt;a href="http://code.google.com/p/cakephp-migrations/downloads/list"&gt;Get it while it's hot&lt;/a&gt;&lt;/strong&gt;.

This release includes a few bug fixes. In fact, it fixes most known bugs, and allowed me to close a lot of the bug tickets. There are only &lt;a href="http://code.google.com/p/cakephp-migrations/issues/list"&gt;three or four left&lt;/a&gt;, which I hope to eradicate by the time the stable release comes around.

&lt;!--more--&gt;

Here's the changes since the beta...

&lt;strong&gt;UUID Switch&lt;/strong&gt;

Migrations have supported Cake's UUID columns as of v3.7, but in that release you could only use them if you had enabled the appropriate variable within the script itself. This obviously meant that you couldn't enable UUID's on a per migration basis. No more I tell you, no more!

If you want your ID column to use UUID's, just use this in your migration:
&lt;pre lang="yaml"&gt;up:
  create_table:
    users:
      id: uuid
&lt;/pre&gt;
And now when you run that migration,the id column will be created with the correct type and length for using UUID's.

&lt;strong&gt;No ID Syntax Change&lt;/strong&gt;

Following on from the above, and to make things just a little easier; using the following will create a table with no ID column:
&lt;pre lang="yaml"&gt;up:
  create_table:
    users:
      id: false
      name: text
      age: int
&lt;/pre&gt;
This replaces the &lt;code&gt;no_id&lt;/code&gt; syntax.

MySQL Specific Commands

And because we all use MySQL right? You can now use some extra commands when creating tables:
&lt;pre lang="yaml"&gt;up:
  create_table:
    users:
      id: false
      name: text
      age: int
      mysql_charset: UTF8
      mysql_engine: innodb
      mysql_collate: utf8_general_ci
      mysql_comments: Oooh, this is really fantastic!
&lt;/pre&gt;
Pretty much self-explanatory right?

So as I said, I hope this will be the only release candidate, so please &lt;a href="http://code.google.com/p/cakephp-migrations/issues/entry"&gt;submit your bug reports&lt;/a&gt;, so I can push out a perfect stable release.

Enjoy!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/UYHYr8rogDw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/05/25/cakephp-migrations-v40-release-candidate.html</feedburner:origLink></entry>
 
 <entry>
   <title>CakePHP Migrations v4.0 Beta</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/zBSC5grDZ1Q/cakephp-migrations-v40-beta.html" />
   <updated>2008-05-20T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/05/20/cakephp-migrations-v40-beta</id>
   <content type="html">I am excited to announce the a beta of the next version of the popular database Migrations shell for CakePHP 1.2. It's a little later than expected (I wanted a release candidate out by now) due to a certain muppet who didn't commit his changes to SVN!

&lt;strong&gt;&lt;a href="http://code.google.com/p/cakephp-migrations/downloads/list"&gt;Get it now!&lt;/a&gt;&lt;/strong&gt;

Take a look at the &lt;a href="http://code.google.com/p/cakephp-migrations/source/browse/trunk/CHANGELOG"&gt;ChangeLog&lt;/a&gt;, and you will see a few long needed changes. The most notable being the ones discussed &lt;a href="http://developingwithstyle.com/2008/05/05/the-problem-with-migrations/"&gt;earlier&lt;/a&gt;. Here's the rundown of what you can find in the beta...

&lt;!--more--&gt;

&lt;strong&gt;Timestamped Migrations&lt;/strong&gt;

All migration files now use the current GMT timestamp of when they were generated. This has been added to almost eradicate any chance of conflicts when working as part of a team.

&lt;strong&gt;Interleaved Migrations&lt;/strong&gt;

This helps solve the problem of migrating out of order or missed migration files. So when you migrate up, it will now run any migrations that have not been run, and when you migrate down, it will ignore migrations that have not been run. To help with this feature, the table that Migrations uses to keep track of the current version has been replaced with one that keeps a record of every migration that has been run.

&lt;strong&gt;Migrations love Arrays too&lt;/strong&gt;

OK, so not everyone likes YAML, so I gave in. Migrations now supports native PHP arrays within your migration files. Something like this:

&lt;pre lang="php"&gt;
$migration = array(
    'up' =&gt; array(
        'create_table' =&gt; array(
            'rooms' =&gt; array(
                'name' =&gt; array(
                    'type' =&gt; 'string'
                ),
                'topic' =&gt; array(
                    'type' =&gt; 'text'
                )
            )
        )
    ),
    'down' =&gt; array(
        'drop_table' =&gt; 'rooms'
    )
);
&lt;/pre&gt;
In fact, this now means you can use any old PHP code within your migrations. Opens up some nice possibilities.

&lt;strong&gt;New command: "migrate info"&lt;/strong&gt;

A new command has been added that shows you the full list of migration files, along with some really useful info, such as what migrations have been run, and when.

&lt;strong&gt;Migrating Specific files&lt;/strong&gt;

You can now also migrate a specific UP or DOWN section from any migration file. How specific is that?

Those are the changes so far, there may well be one or two more to come before the release candidate, but I am still looking into those and will be posting on them very soon. You can also expect to see some bug fixes by the time the release candidate arrives.

So please &lt;a href="http://code.google.com/p/cakephp-migrations/downloads/list"&gt;download&lt;/a&gt; and play to your hearts content. If you discover any bugs, or if you have any ideas for enhancements and want to see them included in this release, please &lt;a href="http://code.google.com/p/cakephp-migrations/issues/list"&gt;create an issue&lt;/a&gt;. If you just want to leave a comment and talk to me about this, leave your comment below.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/zBSC5grDZ1Q" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/05/20/cakephp-migrations-v40-beta.html</feedburner:origLink></entry>
 
 <entry>
   <title>Stable release of CakePHP 1.2 is very, very near</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/3Q3L-Wlgfk8/stable-release-of-cakephp-12-is-very-very-near.html" />
   <updated>2008-05-13T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/05/13/stable-release-of-cakephp-12-is-very-very-near</id>
   <content type="html">As expected since the the changes that were made within the core team a few weeks ago, a final release candidate of CakePHP 1.2 is very imminent. It has just been &lt;a href="http://bakery.cakephp.org/articles/view/cakephp-1-2-stable-coming-soon"&gt;announced on the Bakery&lt;/a&gt;, that a stable version will be arriving very soon. In fact, I have it on good authority that the first release candidate could be available as early as next week.

There has been a lot more activity on IRC and within the &lt;a href="https://trac.cakephp.org/timeline"&gt;Changesets&lt;/a&gt; recently, so hats off to all involved, and the &lt;a href="http://book.cakephp.org/"&gt;Cake Book&lt;/a&gt; is becoming so much better every time I see it.

&lt;em&gt;&lt;strong&gt;But&lt;/strong&gt;&lt;/em&gt;, as emphasized in the official announcement on &lt;a href="http://www.debuggable.com/posts/cakephp-1.2-stable-come-and-help:4829b3ac-903c-4f56-94dc-27af4834cda3"&gt;Tim and Felix's blog&lt;/a&gt;, we need help to squash those remaining bugs. Please join us in the newly created IRC room: #cakephp-dv on freenode.net and offer your assistance however you can.

Here's to a bright future.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/3Q3L-Wlgfk8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/05/13/stable-release-of-cakephp-12-is-very-very-near.html</feedburner:origLink></entry>
 
 <entry>
   <title>The problem with Migrations</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/gGR2e0Rq7p0/the-problem-with-migrations.html" />
   <updated>2008-05-05T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/05/05/the-problem-with-migrations</id>
   <content type="html">Back in February in sunny Orlando, I gave a presention on why and how�one should use CakePHP Migrations. I think the presentation went down well, but when it came to the Q&amp;amp;A at the end of the session, a few issues were raised that - quite honestly - I hadn't actually thought about. It's not that I didn't know about them, it's just that I never came across them to make them a problem for me. But since I began to actually use Migrations in a team of developers, I have come to understand some issues that could potentially be a deal breaker for some teams and users.

&lt;!--more--&gt;

The main issues are related to the use of a version control system such as Subversion, when managing your applications source code and migration files, and it only really applies when using migrations as part of a team. Basically when more than one member of the team creates a migration file and checks it into SVN�near the same time, you could end up with an SVN conflict and two migration files that have the same name, but consist of different migration code. Of course you won't see this problem until you SVN update, but when you do, and you try running those migrations, not all will be run. If they are, they could be run in the completely wrong order.

The other issue is that of file naming. You may come across times when migration files have been given the same name. So combine this issue with the first one above, we have a potential for all out world war three!

Let me give you an example...

We have a team of top notch CakePHP developers; Harry, Ron and Hermione (excuse the sad Harry Potter conventions for a second). They all use CakePHP Migrations as part of this new spangly Blog application that they are building. They have already baked the application, so have their skel setup and ready to use, and they have checked in the code into Subversion.

Now Harry starts off by creating a migration file called�"001_create_users.yml"�so he can create the users table. He modifies the file as he sees fit, creating a few columns etc. He then runs that migration and the users table is created perfectly. So no problems so far and all works great.

However... Ron, being the half-wit he can sometimes be, has gone ahead and created another migration file so he can start work on the posts table. So he creates "001_create_posts.yml" migration file, edits it and runs it. He now has the posts table created, and we still have no problems - yet!

So along skips the team leader; Hermione who wants to check out what Harry and Ron have done so far and maike sure all works. So Ron and Harry go ahead and commit the code they have created so far, along with their migration files, then Hermione updates her working copy. Again, all is fine.

But now we come across problems, because Hermione wants to run the migrations. Dun, dun, derrr!

She now sees two migration files:
&lt;ul&gt;
	&lt;li&gt;001_create_users.yml&lt;/li&gt;
	&lt;li&gt;001_create_posts.yml&lt;/li&gt;
&lt;/ul&gt;
She goes ahead and runs these migrations, which work, but because we have two files with a version number of 001, only the first one is run, and the second is ignored.

And there my friends, is the crux of the problem.

So a few weeks ago, I sat down and started thinking about how I could get around these issues. But then all of a sudden, Rails came along and solved it for me.

I still have a great interest in Ruby on Rails. After all, Cake Migrations was inspired greatly by Rails implementation of the same system. I therefore keep a close eye on the Rails changesets. A few weeks ago, I saw quite a large change to the way Migrations are handled in Rails. It seems quite a few people have come across the same problem I just described so elloqently. ;)

So they introduced timestamped migrations. Now why didn't I think of that?

So now instead of using incremental version numbers for each migration file (i.e. 001 or 002), migration files in Rails now use a UTC timestamp indicating the time that the file was created. So now they look something like 12345678_create_users.yml.

This slap in the face simple change now means that all migration files are unique, and conflicts are never experienced. It means that all�Migration files can now be run in the correct order.�That is, as long as each member of the team has the correct time set!

This change also introduces a nice little extra called Interleaved Migrations. Meaning that any missed migrations can still be caught and run at any time. We will also be able to migrate down and ignore any migrations that have not yet been run. After all, we don't to drop a table that has not yet been created.

So as long as I haven't confused you too much, you now know when is coming in the next version of CakePHP migrations. You can also expect to see support for native PHP arrays in migration files, aswell as the YAML. This will mean that you can use your Cake Schema migration files with CakePHP Migrations.

I already started work on this before I left for my holidays, and will continue when I return. Expect a release by the end of May.�So hopefully, these changes will make Migrations a non-blocker for all your guys working on Cake apps�as�part of a team. Hey, but if you think it won't, please let me know. I appreciate any comments and questions any of you may have.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/gGR2e0Rq7p0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/05/05/the-problem-with-migrations.html</feedburner:origLink></entry>
 
 <entry>
   <title>Cake is officially moving on with 1.2 coming very soon!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/PfyjRm9l8ng/cake-is-officially-moving-on-with-12-coming-very-soon.html" />
   <updated>2008-04-22T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/04/22/cake-is-officially-moving-on-with-12-coming-very-soon</id>
   <content type="html">If you haven't already read, Gwoo has just made an &lt;a href="http://bakery.cakephp.org/articles/view/after-3-years-looking-back-and-moving-ahead"&gt;official announcement&lt;/a&gt; on the state of the CakePHP project and when we can expect a 1.2 final release.

As mentioned in &lt;a href="http://developingwithstyle.com/2008/04/20/cakephp-goes-on-the-offensive/"&gt;my last post&lt;/a&gt;, the management has changed slightly:
&lt;blockquote&gt;The evolving team will still include the core team, with me as Project Manager helping to usher in new developers and provide opportunity for more people to get involved, PhpNut acting in an advisor's role, ensuring that the right code gets implemented and more people learn the magic of CakePHP, Nate taking the lead role in the implementation of the core code, and John continuing to lead the documentation efforts.&lt;/blockquote&gt;
So things are looking very promising in terms of a 1.2 release happening within a matter of weeks.

But the best thing about this announcement, is that I am now &lt;a href="https://trac.cakephp.org/wiki/Contributors"&gt;listed as an official contributor&lt;/a&gt; to the core framework. So expect some code from people!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/PfyjRm9l8ng" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/04/22/cake-is-officially-moving-on-with-12-coming-very-soon.html</feedburner:origLink></entry>
 
 <entry>
   <title>Look Ma! I've moved the blog and given it a new name</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/-4l-HL2k4U8/look-ma-ive-moved-the-blog-and-given-it-a-new-name.html" />
   <updated>2008-04-20T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/04/20/look-ma-ive-moved-the-blog-and-given-it-a-new-name</id>
   <content type="html">Well, I got fed up of waiting for myself to finish the new Cake powered Switchboard, and this blog needed a desperate refresh, so I got a copy of Wordpress 2.5 and created all that you see right here.

&lt;!--more--&gt;

I've ditched the joelmoss.info domain (it was a bit boring after all) and now use something a little fresher; "Developed With Style". And as you can see, everything is new and ties in nicely with my new company name; "Develop With Style". I even created a nice little temporary splash page on that domain. You can see it at &lt;a title="developwithstyle.com" href="http://developwithstyle.com"&gt;developwithstyle.com.&lt;/a&gt;

Check out the links at the top of the page. I have created a &lt;a href="http://developingwithstyle.com/scraps"&gt;Scraps&lt;/a&gt; section, which will include some nice little distraction from your daily lives. They're basically tiny little posts that don't really need an entire article devoted to them.

I've also included my &lt;a href="http://del.icio.us/joelmoss" target="_blank"&gt;Del.icio.us links&lt;/a&gt; directly into the sidebar and a link that goes directly to them. They need a good cleanup and refreshing, but you should find some interesting and useful links in there.

FYI: The old feed should still work, as it will simply redirect to the new FeedBurner powered feed. If you haven't already, &lt;a href="http://feeds.feedburner.com/DevelopingWithStyle"&gt;please subscribe now&lt;/a&gt;.

I plan to use this new blog as a bit of a sandbox; a way of playing with new ideas and code, so expect to see plenty of changes. I also plan on blogging more, so what this space.

So for now, that is all, although I hope to post a few more times before I leave for my holidays on friday. And stand by for details on a new CakePHP project.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/-4l-HL2k4U8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/04/20/look-ma-ive-moved-the-blog-and-given-it-a-new-name.html</feedburner:origLink></entry>
 
 <entry>
   <title>CakePHP goes on the offensive</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/gIXl9c3NeeA/cakephp-goes-on-the-offensive.html" />
   <updated>2008-04-20T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/04/20/cakephp-goes-on-the-offensive</id>
   <content type="html">It's all go in Cake land! This past week has seen some big changes in management [style] at the open source project, which has seen PHPNut temporarily step down as the lead developer of the project. And as a result, we've witnessed an increase on the amount of developers actually contributing to the core, including little ol' me! I committed &lt;a href="https://trac.cakephp.org/changeset/6698" target="_blank"&gt;one&lt;/a&gt; or &lt;a href="https://trac.cakephp.org/changeset/6699" target="_blank"&gt;two&lt;/a&gt; test cases over the weekend, and have seen two of my contributed patches become applied to the 1.2 branch.

&lt;!--more--&gt;

This all means that we can expect to see a release candidate, or possibly even a final release of CakePHP 1.2 within the next month or two. Everyone now seems to be concentrating on fixing bugs, rather than adding more enhancements to a release that is already heaving with new features. And that's good news.

Of course, I could write a whole post or two on the reasons for these developments, but needless to say, if you have been active in the IRC channel over the last week, you will know what has been happening. I think we can expect some official post from Gwoo about what exactly has changed, which is better than me babbling on about it and possibly saying the wrong thing. You may have to wait a day or two, though, as apparently Gwoo is in Hawaii!

Anyway, I am off to see what other &lt;a href="https://trac.cakephp.org/report/1" target="_blank"&gt;bugs&lt;/a&gt; I can squash. I would love to see a final release in May. May 2008 that is!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/gIXl9c3NeeA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/04/20/cakephp-goes-on-the-offensive.html</feedburner:origLink></entry>
 
 <entry>
   <title>Cake Migrations 3.7 and Fixtures 3.5</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/eP5B7o93g_A/cake-migrations-37-and-fixtures-35.html" />
   <updated>2008-02-29T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/02/29/cake-migrations-37-and-fixtures-35</id>
   <content type="html">Yes, it's another release, but just a small one. Grab it from its &lt;a href="http://code.google.com/p/cakephp-migrations"&gt;Google code repo&lt;/a&gt;

The main change is the support of Cake's UUID column naming. By default Migrations will use normal auto-increment ID columns. If you want to use the UUID columns, then you just need to set $use_uuid = true.

&lt;!--more--&gt;

Here's the changelog:

Migrations v 3.7
&lt;ul&gt;
	&lt;li&gt;[*] Removed backticks from table name when changing migration version, as they caused errors when using SQLITE.&lt;/li&gt;
	&lt;li&gt;[+] Now supports Cake's UUID columns&lt;/li&gt;
&lt;/ul&gt;
Fixtures v 3.5
&lt;ul&gt;
	&lt;li&gt;[+] Fixtures can now be named, and referenced in foreign keys&lt;/li&gt;
	&lt;li&gt;[+] If 'created' column exists in model, and it is not referenced in fixture, then the current datetime will automatically be entered.&lt;/li&gt;
	&lt;li&gt;[+] Now supports Cake's UUID columns&lt;/li&gt;
	&lt;li&gt;[*] Fixed instantiation of fixture helpers.&lt;/li&gt;
&lt;/ul&gt;
Enjoy!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/eP5B7o93g_A" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/02/29/cake-migrations-37-and-fixtures-35.html</feedburner:origLink></entry>
 
 <entry>
   <title>Cake Migrations 3.6 and Project home</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/h62krmX_fOk/cake-migrations-36-and-project-home.html" />
   <updated>2008-01-31T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/01/31/cake-migrations-36-and-project-home</id>
   <content type="html">In anticipation of &lt;a href="http://cakefest.org"&gt;CakeFest&lt;/a&gt; and my pending presentation at the event, I am releasing version 3.6 of Migrations and 3.4 of the Fixtures shell.

We got some nice new features in this release and I will be showcasing all of them in my presentation on Wednesday afternoon. The main change is the integration of &lt;a href="http://www.4webby.com"&gt;Daniel Vecchiato's&lt;/a&gt; &lt;a href="http://www.4webby.com/blog/posts/view/3/yammy_db_to_yaml_shell_migrations_made_easy_in_cakephp"&gt;YAMMY shell&lt;/a&gt;.

As well as this new release, I thought it would be a good idea to give Migrations a proper home, so I have created a Google Code project at &lt;a href="http://code.google.com/p/cakephp-migrations/"&gt;http://code.google.com/p/cakephp-migrations/&lt;/a&gt;

All new releases will now be available from there. I also added some more documentation both within the download package and on the &lt;a href="http://code.google.com/p/cakephp-migrations/w/list"&gt;wiki&lt;/a&gt;. I will continue to post here.

So now onwards and upwards with the presentation. Any body got any tips for a good one?
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/h62krmX_fOk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/01/31/cake-migrations-36-and-project-home.html</feedburner:origLink></entry>
 
 <entry>
   <title>I will be presenting at Cakefest</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/JKMQvLq7vd0/i-will-be-presenting-at-cakefest.html" />
   <updated>2008-01-22T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/01/22/i-will-be-presenting-at-cakefest</id>
   <content type="html">Well, it's official, I have been invited to give a presentation at &lt;a href="http://cakephp.org"&gt;CakeFest&lt;/a&gt; over the pond in Orlando, Florida in February. And I just sent an email back to Gwoo to confirm my attendance.

My presentation will be called "Cleaner development with database migrations" and will be totally wicked! ;)

So let me know if any of you are planning on attending. I would love to meet you all and catch up.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/JKMQvLq7vd0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/01/22/i-will-be-presenting-at-cakefest.html</feedburner:origLink></entry>
 
 <entry>
   <title>CakePHP Official Beta and CakeFest</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/8Hp2KEMPy90/cakephp-official-beta-and-cakefest.html" />
   <updated>2008-01-03T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2008/01/03/cakephp-official-beta-and-cakefest</id>
   <content type="html">So it finally happenned! After a year of development, today marks the release of the very first Beta of CakePHP 1.2. While it is great to see, I just can't help thinking how many beta's we will have to endure before we see a final production release.

Also in the news, is the announcement that Florida will be hosting the first CakePHP conference. &lt;a href="http://www.cakefest.org"&gt;CakeFest&lt;/a&gt; will take place over three days between February 6th and 8th 2008, and will feature "tutorials, talks, and fun". It sounds so good, I decided to take a shot at submitting a proposal to speak. My subject is obviously about Migrations, so who knows? It would be quite cool to be accepted.

I'll keep ya posted.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/8Hp2KEMPy90" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2008/01/03/cakephp-official-beta-and-cakefest.html</feedburner:origLink></entry>
 
 <entry>
   <title>My first accepted CakePHP patch</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/nvhW0aTQXHM/my-first-accepted-cakephp-patch.html" />
   <updated>2007-12-26T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/12/26/my-first-accepted-cakephp-patch</id>
   <content type="html">A few weeks ago, I submitted a &lt;a href="https://trac.cakephp.org/ticket/3587"&gt;patch and test&lt;/a&gt; to the CakePHP trac, that added support for multiple resource routes. It was something I needed for my use, but was such an easy fix, I thought I would create a ticket and see if the Cake core team decide to add it to the core.

To be honest, I wasn't hopeful. But yesterday, my patch was added right into the core and is &lt;a href="https://trac.cakephp.org/changeset/6257"&gt;now available&lt;/a&gt; in the 1.2 branch. Woohoo!

I didn't have any plans to submit any more patches or tickets, but this little piece of news just might spur me on to do more.

Another good thing to come out of this, was my first taste of unit testing. The path I submitted, also included a test case which worked perfectly. I am pretty sure that the inclusion of that test, helped my patch become included in the core.

So I think I feel more testing coming along. I might even contemplate writing a patch for migrations. But I wouldn't expect that to appear in the core, as I have been told that the core team don't like YAML.

But ya never know ;)
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/nvhW0aTQXHM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/12/26/my-first-accepted-cakephp-patch.html</feedburner:origLink></entry>
 
 <entry>
   <title>Cake no longer uses its own shortcuts</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/omAxLV-x2RY/cake-no-longer-uses-its-own-shortcuts.html" />
   <updated>2007-12-09T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/12/09/cake-no-longer-uses-its-own-shortcuts</id>
   <content type="html">Well it appears that Cake no longer uses its own function shortcuts within the core. As of &lt;a href="https://trac.cakephp.org/changeset/6128"&gt;changeset 6128&lt;/a&gt; all usage of the good old low/up, am, r and friends, are no longer used within the core. However, these functions still exist for you to use in your own code.

So the question I ask is; why are these functions no longer good enough for the core? Are they soon to be deprecated? (I hope not).

It's an interesting move nevertheless.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/omAxLV-x2RY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/12/09/cake-no-longer-uses-its-own-shortcuts.html</feedburner:origLink></entry>
 
 <entry>
   <title>CakePHP 1.2 Pre-Beta!?</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/7cahrkNaeG0/cakephp-12-pre-beta.html" />
   <updated>2007-10-23T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/10/23/cakephp-12-pre-beta</id>
   <content type="html">Well &lt;a href="http://joelmoss.info/switchboard/blog/3079:Is_CakePHP_12_Beta_on_the_horizon"&gt;I was almost right&lt;/a&gt;. Yesterday saw &lt;a href="http://bakery.cakephp.org/articles/view/new-cakephp-releases"&gt;another release of CakePHP 1.2&lt;/a&gt;, but instead of being another alpha, or even a beta that I was expecting, this release has been marked as a "Pre-Beta". Which really means it's another Alpha release. But, according to the CakePHP site and Nate - one of Cake's core devs ...
&lt;blockquote&gt;At this point we're done adding new features, but we do still have a couple of features which I consider critical to this release that still need a little clean-up.  So, rather than have that hold us up any longer, we decided to do a quick push on the bug fixes and get a release out.&lt;/blockquote&gt;
Some of the changes are really nice and much better that before. I am loving the REST support and resources. And you can now see the beginnings of the new 1.2 Manual at &lt;a href="http://tempdocs.cakephp.org/"&gt;http://tempdocs.cakephp.org/&lt;/a&gt;.

So even though we are not quite at the Beta stage, things are still looking up, and I am hoping to see the first beta released some time in November - but don't quote me on that! Hey, we might even see a release candidate by Christmas!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/7cahrkNaeG0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/10/23/cakephp-12-pre-beta.html</feedburner:origLink></entry>
 
 <entry>
   <title>Is CakePHP 1.2 Beta on the horizon?</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/t6I92FnpFeQ/is-cakephp-12-beta-on-the-horizon.html" />
   <updated>2007-10-21T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/10/21/is-cakephp-12-beta-on-the-horizon</id>
   <content type="html">There has been a flurry of activity in the CakePHP Subversion repository these last few days, including a whole bunch of changes merged into the 1.2 trunk. So the question I am asking myself is, can we expect to see the appearance of a solid beta version sometime soon?  I certainly hope so! I'll keep you posted.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/t6I92FnpFeQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/10/21/is-cakephp-12-beta-on-the-horizon.html</feedburner:origLink></entry>
 
 <entry>
   <title>Are you any good at PHP and Cake?</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/qBrE3K5a4M4/are-you-any-good-at-php-and-cake.html" />
   <updated>2007-10-14T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/10/14/are-you-any-good-at-php-and-cake</id>
   <content type="html">Over at ShermansTravel.com, we are desperate for help, and are looking to employ a few more quality tech's. So if you meet the following requirements and want to work in the heart of Manhattan, as part of a great team, in a well established company, then please email me directly at jmoss [at] shermanstravel [dot] com

Here are the job qualifications, we have a couple of spots open:
&lt;ul&gt;
	&lt;li&gt;In-depth knowledge of front-end and back-end technologies.&lt;/li&gt;
	&lt;li&gt;Advanced understanding of PHP 5, object-oriented design principles, and
database design.&lt;/li&gt;
	&lt;li&gt;Expert understanding of JavaScript, HTML, CSS, and the DOM (AJAX).&lt;/li&gt;
	&lt;li&gt;Experience with PHP frameworks (Cake) is a plus.&lt;/li&gt;
	&lt;li&gt;Experience with Ruby on Rails is a plus.&lt;/li&gt;
	&lt;li&gt;Experience with test driven development is a plus.&lt;/li&gt;
	&lt;li&gt;Love of open source development and standards-based development.&lt;/li&gt;
	&lt;li&gt;Strong communication skills and attention to detail.&lt;/li&gt;
	&lt;li&gt;Able to multi-task and project manage well.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/qBrE3K5a4M4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/10/14/are-you-any-good-at-php-and-cake.html</feedburner:origLink></entry>
 
 <entry>
   <title>Integrating Subversion into Basecamp and Campfire</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/wJY4jlMeBis/integrating-subversion-into-basecamp-and-campfire.html" />
   <updated>2007-10-05T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/10/05/integrating-subversion-into-basecamp-and-campfire</id>
   <content type="html">For the last few days, I have been thinking about how me and the team around me can improve productivity and communications when developing. Currently, the system we use is a little disjointed, and utilizes several different systems and solutions. Fortunately one such solution is &lt;a href="http://basecamphq.com"&gt;Basecamp&lt;/a&gt;, which happens to be one of the best around and has been in use by the company for a while now. So after spending a little time with the web based application, I realised that it should be able to do, or at least manage everything we do.

So last night I sat down and played with the &lt;a href="http://developer.37signals.com/basecamp"&gt;Basecamp API&lt;/a&gt;, to see what could be done with it. And I came up with a post-commit hook for &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt;, that posts a message for each subversion commit. This message tells me the change log, what files were changed, and who made the commit. So now we can all see and receive Basecamp notices for every single changeset.

We have also started using &lt;a href="http://www.campfirenow.com/"&gt;Campfire&lt;/a&gt;, so I then had a little play with &lt;a href="http://opensoul.org/2006/12/8/tinder-campfire-api"&gt;Tinder&lt;/a&gt;; Campfire's unofficial API, and added some more code to the Subversion hook. So as well as creating a message in Basecamp detailing each Changeset, the same changeset is also posted in the appropriate Campfire room. So we have a real time view of our development progress.

So here is the code. It's all in Ruby, as it was easy peasy. And it utilises the Basecamp API Wrapper.
&lt;pre lang="ruby"&gt;&lt;code&gt;
%w( rubygems tinder basecamp ).each { |f| require f }

config = {
:subdomain =&amp;gt; 'My-Subdomain', # Campfire and Basecamp subdomain
:email =&amp;gt; 'user@mydomain.com', # Campfire email login
:username =&amp;gt; 'username', # Basecamp username
:pass =&amp;gt; 'password',
:room =&amp;gt; 'Development', # Campfire room
:project_id =&amp;gt; 12345, # Basecamp project id
:category_id =&amp;gt; 678910, # Basecamp message category ID
:ssl =&amp;gt; true
}

svnlook = '/usr/bin/svnlook' # full path to the svnlook command
repo_path = ARGV[0]
revision = ARGV[1]
project = repo_path.split('/').last

commit_author = `#{svnlook} author #{repo_path} -r #{revision}`.chop
commit_log = `#{svnlook} log #{repo_path} -r #{revision}`
commit_files = `#{svnlook} changed #{repo_path} -r #{revision}`

# create a message in basecamp
basecamp = Basecamp.new("#{config[:subdomain]}.projectpath.com", config[:username], config[:pass], true)
basecamp.post_message config[:project_id], {
:title =&amp;gt; "Changeset ##{revision}",
:body =&amp;gt; "#{commit_author} just committed changeset ##{revision}...\n\n&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;#{commit_log}\n#{commit_files}&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;",
:category_id =&amp;gt; config[:category_id]
}

# create a message in campfire
campfire = Tinder::Campfire.new(config[:subdomain], :ssl =&amp;gt; config[:ssl])
campfire.login config[:email], config[:pass]
room = campfire.find_room_by_name config[:room]
room.speak "#{commit_author} just committed changeset ##{revision}..."
room.paste "#{commit_log}\n#{commit_files}"
&lt;/code&gt;&lt;/pre&gt;
Simply copy and paste this into a file called 'post-commit.rb' and save that in your subversion repository's hooks directory. Don't forget to set its permissions as required (chmod 755 on linux/unix). Then create another file in your hooks directory and call it 'post-commit' and do the same with the permissions. In the 'post-commit' file, paste the following code:
&lt;pre lang="sh"&gt;&lt;code&gt;#!/bin/sh

REPOS="$1"
REV="$2"

ruby /Users/joelmoss/dev/src/testing/hooks/campfire.rb "$REPOS" "$REV"
&lt;/code&gt;&lt;/pre&gt;
If 'post-commit' already exists, just append the last line above to the end of the file.

You will then need to install a few Ruby Gems. Namely Tinder and XML-Simple. So just run the following command:
&lt;pre&gt;&lt;code&gt;sudo gem install tinder xml-simple --include-dependencies
&lt;/code&gt;&lt;/pre&gt;
And finally, you will need the &lt;a href="http://developer.37signals.com/basecamp/basecamp.rb"&gt;Basecamp API wrapper&lt;/a&gt;. You can get that at &lt;a href="http://developer.37signals.com/basecamp/basecamp.rb"&gt;http://www.basecamphq.com/api/basecamp.rb&lt;/a&gt;. Save that in somewhere in your Ruby path. Ideally, that would be in your 'site&lt;em&gt;ruby' directly. On my Mac, that is at '/usr/local/lib/ruby/site&lt;/em&gt;ruby/1.8/'.

And now you should be good to go. As long as you have enabled the API in your Basecamp and your settings are correct, whenever anyone makes a commit to Subversion, you will all be able to see it in Basecamp and Campfire.

I plan to do more with this, as we will need a better bug management system, as Bugzilla is just so damn ugly. But I will leave that to another post.

Enjoy!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/wJY4jlMeBis" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/10/05/integrating-subversion-into-basecamp-and-campfire.html</feedburner:origLink></entry>
 
 <entry>
   <title>All's Quiet on the Western Front</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/Cazt4esUq8I/alls-quiet-on-the-western-front.html" />
   <updated>2007-10-03T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/10/03/alls-quiet-on-the-western-front</id>
   <content type="html">&lt;p&gt;I just want to apologise to you all and to myself for my lack of activity here. Since I sold HPU, it's all been a bit of a blur. And since I started working for ShermansTravel a few months ago, its been even more of a blur. I just haven't had the time for any extra curricular activities.&lt;/p&gt;

&lt;p&gt;But in terms of my CakePHP development - especially with 1.2 - I think that will be a good thing. I am reluctant to code anything more in 1.2 until I see some form of beta release. And I honestly don't see that happenning anytime soon. Cake 1.2 has been in development for too long, and I think PHPNut and co. need to put a feature freeze on it and work on what they have. Otherwise 1.2 will never see the light of day.&lt;/p&gt;

&lt;p&gt;Since I started my new job, I have realised that using 1.2 in production and mission critical environments just isn't an option. But I really don't want to waste my time coding in 1.1, as the changes between the two version are just too huge. For example, there is a real need for me and my team to migrate ST's QuickSearch product onto Cake, but I am very reluctant to start now, as it would mean having to do it in 1.1. And if I did so, it would mean a lot of code changes when 1.2 becomes production ready.&lt;/p&gt;

&lt;p&gt;So I suppose this is heartened plea to the CakePHP core dev team. Please put aside any new features, leave them till the next release, and just finish off what you have already got. Lets get 1.2 out to the masses. Besides helping me out, it would also do wonders for the CakePHP community and its uptake. And it would inspire me to start writing more addons and articles about it.&lt;/p&gt;

&lt;p&gt;Cake Migrations is not forgotten, even though it looks like Migrations will be included in 1.2, albeit completely different to my implementation. I am still commited to making DB migrations easier and faster than ever to use and run. And I fully expect my Migrations to be exactly that, even when the official migrations appear in core.&lt;/p&gt;

&lt;p&gt;So that's the western front. How about the east side and Tooum / Switchboard? Well, again that has been neglected somewhat, although I have made one solid decision. And that is to rewrite it all in Ruby on Rails. I really think that it will do wonders for the the service and really help me in my learning of Ruby and the framework. Every time I see a blog post about some aspect of Rails, just stirs up the fire in my belly to master Ruby and Rails. So hopefully, I can spend a little spare time pushing out Tooum v2.0.&lt;/p&gt;

&lt;p&gt;One or two more ideas have also popped into my head over the last few months. One of which I want to follow up on as soon as possible. Fans of CakePHP and Ruby on Rails should love it.&lt;/p&gt;

&lt;p&gt;Watch this space and enjoy ;)&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/Cazt4esUq8I" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/10/03/alls-quiet-on-the-western-front.html</feedburner:origLink></entry>
 
 <entry>
   <title>Is CakePHP, Ruby on Rails' biggest fan?</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/kbeDHMK3GZY/is-cakephp-ruby-on-rails-biggest-fan.html" />
   <updated>2007-08-26T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/08/26/is-cakephp-ruby-on-rails-biggest-fan</id>
   <content type="html">Just watched &lt;a href="http://www.railsenvy.com/2007/8/24/rails-vs-php"&gt;Ruby on Rails Commercial #6&lt;/a&gt; from the guys at &lt;a href="http://www.railsenvy.com"&gt;RailsEnvy&lt;/a&gt; today, and I gotta admit, it really does come very close to the truth.

A lot of the features in CakePHP have been influenced by those features already found in Rails, r simply copied from Rails. Of course I am not part of the Cake core team, so I don't know how or why such features were included. But you know what? Does it really matter? DHH and Rails should really be very flattered. Why reinvent the wheel, when someone has already done it for you?

What do you think?
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/kbeDHMK3GZY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/08/26/is-cakephp-ruby-on-rails-biggest-fan.html</feedburner:origLink></entry>
 
 <entry>
   <title>Whats new in Cake 1.2: Routing and Config</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/y4jPklVbW3s/whats-new-in-cake-12-routing-and-config.html" />
   <updated>2007-08-21T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/08/21/whats-new-in-cake-12-routing-and-config</id>
   <content type="html">Haven't done one of these in a while, probably because there haven't been many feature changes in the 1.2 branch. But the last month or so have seen a few small feature changes that I think could be very useful.
&lt;h4&gt;No more global constants&lt;/h4&gt;
The first of these changes is the transitioning of the configuration away from global constants. I am sure you are fully aware of the plethora of constants within the core.php file. Well, the final release of 1.2 will see these replaced with singleton calls to the Configure class.

So instead of
&lt;pre&gt;&lt;code&gt;define('DEBUG', 2);
&lt;/code&gt;&lt;/pre&gt;
you get...
&lt;pre&gt;&lt;code&gt;Configure::write('debug', 2);
&lt;/code&gt;&lt;/pre&gt;
Good move, as any sort of globals can cause issues.
&lt;h4&gt;RESTful Routes&lt;/h4&gt;
Now this is one feature that I really loved when I played with Ruby on Rails. I really got to love the simplicity and the 'that makes sense' mentality of RESTful routes. If you have no idea what I am on about, I highly recommend that you take a little time to watch and listen to &lt;a href="http://www.scribemedia.org/2006/07/09/dhh/"&gt;DHH's keynote presentation&lt;/a&gt; at last years RailsConf.

Anyway, at the end of July, I noticed &lt;a href="https://trac.cakephp.org/changeset/5454"&gt;changeset 5454&lt;/a&gt;, which made changes to the Router. More importantly it added support for RESTful routes, which take advantage of the hidden beauty of the HTTP GET, POST, PUT and DELETE verbs.

I have yet to play with this fully, so not 100% sure of how it works, but I would like to thank the core team for including it. And I hope to write more about it in a future article.
&lt;h4&gt;Prefixed Routing&lt;/h4&gt;
A recent changeset also introduced prefix based routing. Which lets you specify a prefix in any route, which is then prepended to the action called.

For example, with the prefix variable set to admin in your route, you could access the following URL:
&lt;pre&gt;&lt;code&gt;/admin/posts/create
&lt;/code&gt;&lt;/pre&gt;
which would then call the admin_create action within the posts controller.

So we still have some new things to look forward to in 1.2. In fact I am beginning to think that CakePHP 1.2 would be best refered to as CakePHP 2.0.

Enjoy!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/y4jPklVbW3s" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/08/21/whats-new-in-cake-12-routing-and-config.html</feedburner:origLink></entry>
 
 <entry>
   <title>Migrations v3.3</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/a0WoZ1awSqo/migrations-v33.html" />
   <updated>2007-07-29T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/07/29/migrations-v33</id>
   <content type="html">I just pushed out a pretty good update of Migrations today. Version 3.3 includes some cool updates that make migrations even easier and even faster to use. (didn't I say that last time?)

The biggest change is the introduction of migration file generation within the Migrate shell itself. This functionality used to be included within the accompanying Generator shell. But I decided that this was a little unnecessary, so as soon as Fixtures is updated (later this week) the Generator shell will be phased out and deprecated.

I also cleaned up the code a little and documented some more. There is now a help command that will help you with how to use it.

So, you can get v3.3 of Migrate.php from &lt;a href="http://cakeforge.org/snippet/detail.php?type=snippet&amp;amp;id=165"&gt;CakeForge&lt;/a&gt;.

Here are the other changes:
&lt;ul&gt;
	&lt;li&gt;[*] a little cleanup and refactoring, including more detailed and friendly output&lt;/li&gt;
	&lt;li&gt;[*] added more comments and documentation&lt;/li&gt;
	&lt;li&gt;[+] migration file numbering now uses three digits starting from 001&lt;/li&gt;
	&lt;li&gt;[+] added new 'version' and 'v' method as an alternative to the '-v' switch&lt;/li&gt;
	&lt;li&gt;[+] can now generate migration files as generator shell is now deprecated.&lt;/li&gt;
	&lt;li&gt;[+] can now run all migrations from the current version down, up to the latest version&lt;/li&gt;
	&lt;li&gt;[+] can now use shortened YAML when specifying column properties&lt;/li&gt;
&lt;/ul&gt;
Examples:
&lt;pre&gt;&lt;code&gt;name: [string, 32, not_null]  # will create a string(varchar) column with length 32 and not null
- no_dates   # no date columns will be created (don't forget the hyphen)
- [no_dates, no_id]   # no date or ID columns will be created (don't forget the hyphen)
&lt;/code&gt;&lt;/pre&gt;
Enjoy one and all!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/a0WoZ1awSqo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/07/29/migrations-v33.html</feedburner:origLink></entry>
 
 <entry>
   <title>Migrations making their way into the CakePHP core</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/lD4rTnau9Pw/migrations-making-their-way-into-the-cakephp-core.html" />
   <updated>2007-07-19T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/07/19/migrations-making-their-way-into-the-cakephp-core</id>
   <content type="html">A few months ago, I discovered that the CakePHP core team had decided to include migrations into the core of the framework. Of course, I was quite chuffed that Nut and his colleagues found the idea and my code good enough to include in the actual framework. However, I soon discovered that they had no intention of using my code and were going it alone to produce their own version of Migrations. I was a bit gutted, but so be it.

Now finally the first traces of the CakePHP migrations shell have appeared on the &lt;a href="https://trac.cakephp.org/changeset/5443"&gt;SVN sandbox&lt;/a&gt;. It's early days, but so far so not so good. As already expected, there is no sign of YAML in the migration files. It seems that the core team don't like YAML, and so are sticking with bog standard PHP arrays. So instead of specifying your migration instructions in simple, easy to read and fast to type YAML, you will have to write them all in long winded, a pain to type and slow to type arrays!

&lt;strong&gt;WHY?&lt;/strong&gt;

Now I know I have never really been in line with PHPNut's thinking and the ideals of the CakePHP project, but why do they feel the need to complicate things too much. As soon as the sandbox code is more fleshed out, I will show you what I mean. But I guarentee that YAML is faster and easier to use than arrays? Correct me if I am wrong, but a framework, by nature is supposed to make developing applications easier and faster.

So I am excited to see migrations finally appearing in the core, but why are they making it harder to use?

Let me put it this way, don't expect my migrations to disappear any time soon. I am still planning to develop and support them for as long as I feel they are needed, which certainly looks that way if arrays are used in the official migrations code.

PS: sorry for my rant, but don't you agree with me?
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/lD4rTnau9Pw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/07/19/migrations-making-their-way-into-the-cakephp-core.html</feedburner:origLink></entry>
 
 <entry>
   <title>PHP4 is dead! Long live PHP5</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/loAgdkModOA/php4-is-dead-long-live-php5.html" />
   <updated>2007-07-13T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/07/13/php4-is-dead-long-live-php5</id>
   <content type="html">Well it finally happened and it is loooong overdue. as &lt;a href="http://www.php.net/index.php#2007-07-13-1"&gt;announced&lt;/a&gt; on the the official PHP site, PHP4 will reach its end of life n 2007-12-31. After which no more work will be done on PHP4, except critical security fixes.

So maybe we can start to see PHPNut and crew start to think about pushing CakePHP v2 with PHP5 only support?!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/loAgdkModOA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/07/13/php4-is-dead-long-live-php5.html</feedburner:origLink></entry>
 
 <entry>
   <title>Screencast: How to use CakePHP Database Migrations</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/RgJVTdEOf3A/screencast-how-to-use-cakephp-database-migrations.html" />
   <updated>2007-07-12T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/07/12/screencast-how-to-use-cakephp-database-migrations</id>
   <content type="html">YAY!  did it!!

After umpteen attempts at creating my very first screencast, I finally completed one that I was happy with. At 20 minutes, it is a little longer than I wanted, but hopefully future casts will shorten with experience. This is planned to be the first of a series of screencasts, not just about Migrations, but about life with Cake.

So without further ado, I proudly present Screencast Episode 1: How to use CakePHP Database Migrat
ions.

&lt;a href="http://www.box.net/shared/static/cmk1de6b9c.mov"&gt;DOWNLOAD&lt;/a&gt; (32mb Quicktime Movie)
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/RgJVTdEOf3A" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/07/12/screencast-how-to-use-cakephp-database-migrations.html</feedburner:origLink></entry>
 
 <entry>
   <title>Screencast hell!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/fg9bY4BjbCI/screencast-hell.html" />
   <updated>2007-07-04T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/07/04/screencast-hell</id>
   <content type="html">&lt;p&gt;As promised, I am attempting to create a screencast all about Cake migrations, and the joys of using it. But man is it hard! So far I am on attempt number 10 and counting. I just keeping messing up, or forgetting something. But I am determined to get this done and posted here before I go to sleep tonight, so I am prepared for long night.&lt;/p&gt;

&lt;p&gt;Stand by Houston...&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/fg9bY4BjbCI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/07/04/screencast-hell.html</feedburner:origLink></entry>
 
 <entry>
   <title>Contain my excitement!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/h-P5622LMvI/contain-my-excitement.html" />
   <updated>2007-06-25T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/06/25/contain-my-excitement</id>
   <content type="html">Last month I read - more like scanned - over a &lt;a href="http://www.thinkingphp.org/2007/05/13/bringing-the-cold-war-to-cakephp-12-the-containable-behavior/"&gt;post&lt;/a&gt; on Felix Geisend�rfer's (the_undefined) &lt;a href="http://www.thinkingphp.org"&gt;blog&lt;/a&gt; all about a new behaviour he had just written for CakePHP. At the time I didn't really get it and so didn't see its value. But today while progressing with my Cake rewrite of Switchboard, I had a need to limit the associations that Cake was returning. The most obvious way was to play with the $recursive variable in my models, but that just isn't fine grained enough. So I hopped on over to the Cake IRC channel and asked how others were doing it. Luckily for me, Felix had also hopped on over and suggested I take a look at his containable behaviour. He had just released &lt;a href="http://www.thinkingphp.org/2007/06/14/containable-20-beta/"&gt;version 2.0&lt;/a&gt;, so I grabbed the code and started playing.

Why the hell didn't I ever use this before? It has solved all my association problems and is so damn easy to use. Just stop what you are doing right now and get his code and add the behaviour to your cake apps. I promise you that you will never look back.

Core team, if you are reading this then you have to put this in the core.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/h-P5622LMvI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/06/25/contain-my-excitement.html</feedburner:origLink></entry>
 
 <entry>
   <title>Cake Migrations 3.2</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/_HMq5cPdQ6U/cake-migrations-32.html" />
   <updated>2007-06-22T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/06/22/cake-migrations-32</id>
   <content type="html">Cake DB Migrations has now been updated to work with the very latest version of CakePHP 1.2 and the new (hopefully final) console/shells system. I have also added a few extra goodies to make life a little easier.

The new features and changes are as follows:
&lt;ul&gt;
	&lt;li&gt;You can now specify a column without the need to specify the column type. Type is set to string, which is simply a varchar(255) column.&lt;/li&gt;
	&lt;li&gt;Ability to add user definable foreign keys by simply specifying the 'fkey' as a column name, followed by the name(s) of the foreign key(s).&lt;/li&gt;
	&lt;li&gt;You can now include PHP code within the YAML migration files&lt;/li&gt;
&lt;/ul&gt;
Because the console system in Cake 1.2 has changed a bit, you now have to place the below script in a slightly different place. Within your main 'vendors' directory above your app and cake core directories, paste the below code into a file called 'migrate.php' and place that file in a directory called 'shells'.

Now just bring up your favourite command line tool and cd into your cake applications root directory and run the following:
&lt;pre&gt;&lt;code&gt;./cake migrate
&lt;/code&gt;&lt;/pre&gt;
And that is it! That will migrate to the lastest version. You can specify the version like this:
&lt;pre&gt;&lt;code&gt;./cake migrate -v 3
&lt;/code&gt;&lt;/pre&gt;
As promised, I hope to create a screencast going through all aspects of migrations and how they can save your life.

You can find the script in &lt;a href="http://cakeforge.org/snippet/detail.php?type=snippet&amp;amp;id=165"&gt;CakeForge&lt;/a&gt;, aswell as new versions of the &lt;a href="http://cakeforge.org/snippet/detail.php?type=snippet&amp;amp;id=166"&gt;Fixtures&lt;/a&gt; and &lt;a href="http://cakeforge.org/snippet/detail.php?type=snippet&amp;amp;id=167"&gt;Generator&lt;/a&gt; shells.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/_HMq5cPdQ6U" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/06/22/cake-migrations-32.html</feedburner:origLink></entry>
 
 <entry>
   <title>Closer to greatness!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/0_uIOOf4Kp8/closer-to-greatness.html" />
   <updated>2007-05-20T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/05/20/closer-to-greatness</id>
   <content type="html">If you keep an eye on the &lt;a href="http://trac.cakephp.org"&gt;CakePHP trac&lt;/a&gt; or the &lt;a href="http://bakery.cakephp.org"&gt;Bakery&lt;/a&gt;, you should have noticed that PHPNut and friends have just pushed out the latest alpha release of CakePHP 1.2.

Version 1.2.0.5137alpha introduces an all new caching system that supports multiple cache backends, including apc, memcache, xcache, file, and models. I have yet to explore this, but I intend to when I get a need for it.

Another major change/addition, is the old scripts system. This is now known as Cake's console shells and is a step in the right direction. It is now even easier to create console scripts (sorry; shells) when working with your app in Cake. I have already refactored my various tasks to work with this new system. So watch out for a new version of Cake Migrations and Fixtures.

A couple of other changes include a translation behaviour and improvements to the Security component. And according to PHPNut, this should be the last alpha release before beta is reached:
&lt;blockquote&gt;We have some more changes before we can release the Beta. The most major change will be the transition from defines in core.php to the $config array used by the Configure class. This will be the last release that allows for defines inside of core.php. Moving away from defines provides much greater flexibility. The next release will also see the inclusion of a Session model, which will allow easier access to the database session handling.&lt;/blockquote&gt;
So as you may recognise, I have decided to leave Rails alone for a while and concentrate on developing with CakePHP, and perhaps helping out a bit in the community. I also have a few more scripts that I hope to make available to the public, that are currently making my life even easier with Cake.

And finally, I will soon be launching a really exciting new project that I hope will help the Cake community grow even more. If you know of Ryan Bates and his excellent &lt;a href="http://railscasts.com"&gt;Railscasts&lt;/a&gt; site, then you will like what I have planned.

Keep it here! ;)
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/0_uIOOf4Kp8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/05/20/closer-to-greatness.html</feedburner:origLink></entry>
 
 <entry>
   <title>You want me! You need me!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/vQ5DDIbdm0I/you-want-me-you-need-me.html" />
   <updated>2007-05-04T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/05/04/you-want-me-you-need-me</id>
   <content type="html">&lt;p&gt;Well, it finally happened. On April 12th, I sold HomepageUniverse and permanently left the web hosting company I started over seven years ago. And you know what? It feels good, and man am I excited?!&lt;/p&gt;

&lt;p&gt;So what now?&lt;/p&gt;

&lt;p&gt;Well, I got lots of ideas, including some freelance web design and programming work, as well as a few small projects. I also have a few opportunities for employment that I am exploring. I just want to try it all and find out what else is out there.&lt;/p&gt;

&lt;p&gt;So with that in mind, I would love to know if I am needed! Do you need an experienced programmer, web designer, business consultant, or just a guy who has been there and bought the t-shirt? Whatever you need ad in whatever capacity you need me in, I would love to talk with you about it, as I am sure that  can help you.&lt;/p&gt;

&lt;p&gt;So please get in touch and email me at joel [at] joelmoss [dot] info about anything you want.&lt;/p&gt;

&lt;p&gt;Thanks again to all.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/vQ5DDIbdm0I" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/05/04/you-want-me-you-need-me.html</feedburner:origLink></entry>
 
 <entry>
   <title>Backup, backup, backup!!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/1eWndnYeBM4/backup-backup-backup.html" />
   <updated>2007-05-03T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/05/03/backup-backup-backup</id>
   <content type="html">&lt;p&gt;If you are looking for a good reason why you should run backups and ensure that they are always up to date, then this is it...&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The June issue of Business 2.0 magazine was inadvertantly deleted from the editorial server on April 23, according to a number of sources. And the backup server wasn
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/1eWndnYeBM4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/05/03/backup-backup-backup.html</feedburner:origLink></entry>
 
 <entry>
   <title>Indecisiveness!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/S3QUkBsN8QQ/indecisiveness.html" />
   <updated>2007-04-20T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/04/20/indecisiveness</id>
   <content type="html">&lt;p&gt;(have I spelt that right?)&lt;/p&gt;

&lt;p&gt;Man I am just so damn indecisive! Don't get me wrong, I love Ruby and Rails. I love its expressiveness and  its beauty. I love its power. But for every productive day I have with it, there are another 2-3 that basically involves me banging my head against my shiny new Macbook. The learning curve seems to be too high.&lt;/p&gt;

&lt;p&gt;Back in the day when I developed HomepageTools in Perl, making the switch to PHP was easy as pie. I think maybe that was because Perl had so many things wrong with it, but if Ruby is such a better language, why is it taking me longer to develop in?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HELP ME!!!&lt;/strong&gt; What do I do?&lt;/p&gt;

&lt;p&gt;Shall I go back to PHP; a language that I have already mastered?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OR&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Shall I stick with Ruby on Rails and contend with the learning curve and the time it takes to learn?&lt;/p&gt;

&lt;p&gt;What do you think?&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/S3QUkBsN8QQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/04/20/indecisiveness.html</feedburner:origLink></entry>
 
 <entry>
   <title>Long time no speak...</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/fiUaGA-cB8o/long-time-no-speak.html" />
   <updated>2007-04-06T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/04/06/long-time-no-speak</id>
   <content type="html">&lt;p&gt;Yes I know I have been quiet, but I've been busy... very busy! The fruits of my labours should be revealed shortly.&lt;/p&gt;

&lt;p&gt;This post is to just a quick note to say goodbye. No not goodbye to all of you, my readers, but goodbye to PHP, the long time king of the web. I've used PHP for 7 years now and loved almost every part of that time. Its such an easy language to learn and use, and there is never a problem that cannot be resolved by referring to the PHP site and its excellent documentation.&lt;/p&gt;

&lt;h4&gt;However! Ruby on Rails is just so damn cool!!&lt;/h4&gt;

&lt;p&gt;I started playing around with Ruby on Rails late last year and was immediately impressed. But its severe lack of documentation turned me away from exploring and using it further. So I went back to PHP.&lt;/p&gt;

&lt;p&gt;Hey, but it's not all doom and gloom. Because of my discovery of Rails, I started looking around for an equivalent framework for PHP. I found them all and tried them all, but two stood out above the rest; Symfony and CakePHP. Both are excellent at what they do, but Cake just took the biscuit :)&lt;/p&gt;

&lt;p&gt;So I started refactoring Switchboard in Cake, but then that magnetic field that gathers around Rails grew bigger, and pulled me back in. And so I learned a little more with help from the many Rails and Ruby blogs out there.&lt;/p&gt;

&lt;p&gt;But again, the lack of good documentation for Rails dropped me back to PHP.&lt;/p&gt;

&lt;h4&gt;And rinse and repeat&lt;/h4&gt;

&lt;p&gt;This pattern continued and continued, (I really gotta do something about my indecisiveness) until I actually produced something that worked in Rails. The time was right and it felt good, so off we went, hand in hand into the sunset. Just me, Ruby and Rails.&lt;/p&gt;

&lt;p&gt;So this post is to officially say goodbye to PHP and officially welcome Ruby and Rails into my bosom!&lt;/p&gt;

&lt;h4&gt;I'm converted! Hallelujiah!&lt;/h4&gt;

&lt;p&gt;If you know whats good for you, you will too.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/fiUaGA-cB8o" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/04/06/long-time-no-speak.html</feedburner:origLink></entry>
 
 <entry>
   <title>Notes Task for CakePHP</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/8bPXuHXglEo/notes-task-for-cakephp.html" />
   <updated>2007-02-27T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/02/27/notes-task-for-cakephp</id>
   <content type="html">Just knocked up another bake2 task for CakePHP 1.2 that I think is pretty damn cool.

The Notes Task is a source-annotations extractor! ?!?!

What's that then? I hear you ask. Well, this task is a great way to keep track of your ToDo's and FixMe's that are most likely littering all over your code.

I have started adding annotations to my code to remind me to do, fix or optimise something within the    code. Just add any of the following anywhere in your code - usually at the point that needs attention:
&lt;pre&gt;&lt;code&gt;# TODO: this is my first todo item
# FIXME: please fix this
# OPTIMIZE: this has got to be optimised!
&lt;/code&gt;&lt;/pre&gt;
The problem with this is how to track them all. So that is why I created this Notes Task.

Just get the code from &lt;a href="http://cakeforge.org/snippet/detail.php?type=snippet&amp;amp;id=170"&gt;CakeForge&lt;/a&gt;, save [it as notes_task.php in your vendors/tasks directory and then run:
&lt;pre&gt;&lt;code&gt;php bake2.php notes app_alias
&lt;/code&gt;&lt;/pre&gt;
and the task will check all your PHP scripts in your app for any of the above notes and print them out in a nice readable format, with line numbers, etc.

You can find specific notes like so:
&lt;pre&gt;&lt;code&gt;bake2.php notes app_alias todo
bake2.php notes app_alias fixme
bake2.php notes app_alias optimise
&lt;/code&gt;&lt;/pre&gt;
As a side note, you can now also find my other tasks - including migrations - at CakeForge.
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://cakeforge.org/snippet/detail.php?type=snippet&amp;amp;id=165"&gt;Migration Task&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://cakeforge.org/snippet/detail.php?type=snippet&amp;amp;id=166"&gt;Fixture Task&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://cakeforge.org/snippet/detail.php?type=snippet&amp;amp;id=167"&gt;Generator Task&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/8bPXuHXglEo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/02/27/notes-task-for-cakephp.html</feedburner:origLink></entry>
 
 <entry>
   <title>New in Cake 1.2: Debugger class</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/BH4dAKOs4VM/new-in-cake-12-debugger-class.html" />
   <updated>2007-02-23T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/02/23/new-in-cake-12-debugger-class</id>
   <content type="html">Just checked out the CakePHP 1.2 branch this morning and discovered a shiny new class called Debugger. It's pretty obvious what this is, but it ain't no simple debugging function.

The Debugger replaces the default PHP error handling and "provides enhanced logging, stack traces, and rendering debug views". Basically, if any errors occur, Debugger will print these to your browser and tell you everything you need to know about the problem.

To use it, simply include the Debugger class file into your app. This can be achieved very easily by placing the following line at the top of your app/config/bootstrap.php file:
&lt;pre&gt;&lt;code&gt;uses('debugger');
&lt;/code&gt;&lt;/pre&gt;
And now you get all the data you need when something goes wrong, and right within your browser.

One thing that is lacking though, that I would really like to see, is the option to output the debugging results to a log file instead. As outputting to the browser can be very messy. I have already opened a ticket with this suggestion, so hopefully the core team will add that.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/BH4dAKOs4VM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/02/23/new-in-cake-12-debugger-class.html</feedburner:origLink></entry>
 
 <entry>
   <title>Switchboard is alive!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/0KyUF_DJuPE/switchboard-is-alive.html" />
   <updated>2007-02-22T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/02/22/switchboard-is-alive</id>
   <content type="html">&lt;p&gt;Just a quick post to let you all know that &lt;a href="http://tooum.com"&gt;Tooum&lt;/a&gt; is still alive and kicking, and Switchboard 2.0 is now in development. Take a look at the &lt;a href="http://tooum.net/switchboard/blog//2297:The_state_of_Play_and_Switchboard_2"&gt;Tooum Switchboard for more&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/0KyUF_DJuPE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/02/22/switchboard-is-alive.html</feedburner:origLink></entry>
 
 <entry>
   <title>Migrations Task for CakePHP 1.2</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/_sU2MQOwgTw/migrations-task-for-cakephp-12.html" />
   <updated>2007-02-16T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/02/16/migrations-task-for-cakephp-12</id>
   <content type="html">
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/_sU2MQOwgTw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/02/16/migrations-task-for-cakephp-12.html</feedburner:origLink></entry>
 
 <entry>
   <title>Generate Task for CakePHP 1.2</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/Q0RGc0FBdRU/generate-task-for-cakephp-12.html" />
   <updated>2007-02-16T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/02/16/generate-task-for-cakephp-12</id>
   <content type="html">Following on from my previous posts announcing CakePHP 1.2 compatible versions of Migrations and Fixtures, below you will find another bake2 task that can very quickly generate your models, controllers, migrations and fixtures.

To generate a model called "User" in your "app" application, simply run:
&lt;pre&gt;&lt;code&gt;php bake2.php generate app model User
&lt;/code&gt;&lt;/pre&gt;
Use the exact same syntax to generate controllers and migrations.

If you run "php bake2.php generate app fixtures", a fixture will be created for every table in your database, unless of course fixtures already exists.
&lt;pre&gt;&lt;code&gt;/**
 * The GenerateTask generates various files as specified.
 *
 * PHP versions 4 and 5
 *
 * Licensed under The MIT License
 * Redistributions of files must retain the above copyright notice.
 *
 * @filesource
 * @copyright       Copyright 2006-2007, Joel Moss
 * @link                http://joelmoss.info
 * @package         cake
 * @subpackage      cake.cake.scripts.bake
 * @since           CakePHP(tm) v 1.2
 * @version         $Version: 1.0 $
 * @modifiedby      $LastChangedBy: joelmoss $
 * @lastmodified    $Date: 2007-02-16 09:09:45 +0000 (Fri, 16 Feb 2007) $
 * @license         http://www.opensource.org/licenses/mit-license.php The MIT License
 */ 

uses('file', 'folder', 'inflector');

class GenerateTask extends BakeTask
{

    function execute($params)
    {
        $this-&amp;gt;welcome();

        if ($params[0] == 'help')
        {
            $this-&amp;gt;help();
            exit;
        }

        $this-&amp;gt;initDatabase();
        $this-&amp;gt;initApp();

        define('FIXTURES_PATH', APP_PATH .'config' .DS. 'fixtures');
        define('MIGRATIONS_PATH', APP_PATH .'config' .DS. 'migrations');

        if (count($params) &amp;gt; 0)
        {
            if ($params[0] == 'fixtures')
            {
                $this-&amp;gt;fixtures();
                exit;
            }
            elseif ($params[0] == 'migration')
            {
                $this-&amp;gt;migration($params[1]);
                exit;
            }
            elseif ($params[0] == 'model')
            {
                $this-&amp;gt;model($params[1]);
                exit;
            }
            elseif ($params[0] == 'controller')
            {
                $this-&amp;gt;controller($params[1]);
                exit;
            }
        }

        $this-&amp;gt;help();
    }

    function controller($name)
    {
        if (empty($name)) $this-&amp;gt;err('Controller name not specified.');
        if (!preg_match("/^[a-zA-Z]+$/", $name))
            $this-&amp;gt;err('Controller name ('.$name.') is invalid. It must be CamelCased');

        $filename = Inflector::underscore($name) . '_controller.php';
        if (file_exists(CONTROLLERS . $filename)) $this-&amp;gt;err('Controller ('.$name.') already exists.');

        $data = "";
        $file = new File(CONTROLLERS . $filename, true);
        $file-&amp;gt;write($data);

        $this-&amp;gt;out('');
        $this-&amp;gt;out('Generation of controller: ''.$name.'' completed.');
        $this-&amp;gt;out('Please edit ''.CONTROLLERS . $filename . '' to customise your controller.');

        if (!file_exists(VIEWS.Inflector::underscore($name)))
            new Folder(VIEWS.Inflector::underscore($name), true, 0777);

        $this-&amp;gt;hr();
        exit;
    }

    function model($name)
    {
        if (empty($name)) $this-&amp;gt;err('Model name not specified.');
        if (!preg_match("/^[a-zA-Z]+$/", $name))
            $this-&amp;gt;err('Model name ('.$name.') is invalid. It must be CamelCased');

        $filename = Inflector::underscore($name) . '.php';
        if (file_exists(MODELS . $filename)) $this-&amp;gt;err('Model ('.$name.') already exists.');

        $data = "";
        $file = new File(MODELS . $filename, true);
        $file-&amp;gt;write($data);

        $this-&amp;gt;out('');
        $this-&amp;gt;out('Generation of model: ''.$name.'' completed.');
        $this-&amp;gt;out('Please edit ''.MODELS . $filename . '' to customise your model.');

        $this-&amp;gt;migration('create_'.Inflector::tableize($name));
        exit;
    }

    function migration($name)
    {
        if (empty($name)) $this-&amp;gt;err('Migration name not specified.');
        if (!preg_match("/^([a-z0-9]+|_)+$/", $name)) $this-&amp;gt;err('Migration name ('.$name.') is invalid');

        $this-&amp;gt;getMigrations();
        $new_migration_count = $this-&amp;gt;migration_count+1;
        $data = "#n# migration YAML filen#nUP: nullnDOWN: null";
        $file = new File(MIGRATIONS_PATH . DS .$new_migration_count . '_' . $name . '.yml', true);
        $file-&amp;gt;write($data);

        $this-&amp;gt;out('');
        $this-&amp;gt;out('Generation of migration file: ''.$name.'' completed.');
        $this-&amp;gt;out('Please edit ''.MIGRATIONS_PATH . DS .$new_migration_count . '_' . $name . '.yml' to customise your migration.');
        $this-&amp;gt;hr();
        exit;
    }

    function getMigrations()
    {
        $folder = new Folder(MIGRATIONS_PATH, true, 0777);
        $this-&amp;gt;migrations = $folder-&amp;gt;find("[0-9]+_.+.yml");
        usort($this-&amp;gt;migrations, array('GenerateTask', '_upMigrations'));
        $this-&amp;gt;migration_count = count($this-&amp;gt;migrations);
    }

    function _upMigrations($a, $b)
    {
        list($aStr) = explode('_', $a);
        list($bStr) = explode('_', $b);
        $aNum = (int)$aStr;
        $bNum = (int)$bStr;
        if ($aNum == $bNum) {
            return 0;
        }
        return ($aNum &amp;gt; $bNum) ? 1 : -1;
    }

    function fixtures()
    {
        $folder = new Folder(FIXTURES_PATH, true, 0777);
        $tables = $this-&amp;gt;_db-&amp;gt;listTables();
        if (!count($tables))
            $this-&amp;gt;err('Database contains no tables. Please generate and run your migrations before your fixtures.');

        $this-&amp;gt;out();
        $data = "#n# Fixture YAML filen#n#n# Example:-n# -n#  first_name: Bobn#  last_name: Bonesn#n";
        foreach ($tables as $i=&amp;gt;$t)
        {
            if (!file_exists(FIXTURES_PATH .DS. $t . '.yml'))
            {
                $file = new File(FIXTURES_PATH .DS. $t . '.yml', true);
                $file-&amp;gt;write($data);
                $this-&amp;gt;out('  Generating fixture for '.$t.' ... DONE!');
            }
        }
        $this-&amp;gt;out('Generating complete!');
        $this-&amp;gt;hr();
    }

    function initApp()
    {
        $this-&amp;gt;out("Application: '".APP_DIR."' (".APP_PATH.")");
        $this-&amp;gt;hr();
    }

    function initDatabase()
    {
        if (!@include_once('MDB2.php'))
        {
            $this-&amp;gt;err('Task Error: Unable to include PEAR.php and MDB2.php');
        }

        if(!file_exists(APP_PATH.'config'.DS.'database.php'))
        {
            $this-&amp;gt;out('** Checking for database configuration ... NOT FOUND! **');
            $this-&amp;gt;out();
            $this-&amp;gt;out('IMPORTANT!');
            $this-&amp;gt;out('Your database configuration ('.APP_PATH.'config'.DS.'database.php) was not found. Please');
            $this-&amp;gt;out('take a moment to create one by running the 'dbconfig' task:');
            $this-&amp;gt;out('');
            $this-&amp;gt;out('  php bake2.php dbconfig [...]');
            $this-&amp;gt;hr();
            exit;
        }

        require_once (APP_PATH . 'config' .DS. 'database.php');

        $ds = new DATABASE_CONFIG();
        $config = $ds-&amp;gt;default;
        $dsn = array(
            'phptype'   =&amp;gt;  $config['driver'],
            'username'  =&amp;gt;  $config['login'],
            'password'  =&amp;gt;  $config['password'],
            'hostspec'  =&amp;gt;  $config['host'],
            'database'  =&amp;gt;  $config['database']
        );
        $options = array(
            'debug'         =&amp;gt;  DEBUG,
            'portability'   =&amp;gt;  DB_PORTABILITY_ALL
        );
        $this-&amp;gt;_db = &amp;amp;MDB2::connect($dsn, $options);
        if (PEAR::isError($this-&amp;gt;_db)) $this-&amp;gt;err($this-&amp;gt;_db-&amp;gt;getDebugInfo());
        $this-&amp;gt;_db-&amp;gt;setFetchMode(MDB2_FETCHMODE_ASSOC);
        $this-&amp;gt;_db-&amp;gt;loadModule('Manager');
        $this-&amp;gt;_db-&amp;gt;loadModule('Extended');
        $this-&amp;gt;_db-&amp;gt;loadModule('Reverse');
    }

    function help()
    {
        echo "This task generates database migration and fixture files.n";
        echo "Usage: bake2 generate app_alias fixtures|migration [migration_name]n";
    }

    function out($str='', $newline=true)
    {
        $nl = $newline ? "n" : "";
        echo "  $str$nl";
    }
    function hr()
    {
        echo "n  ----------------------------------------------------------------------------n";
    }
    function err($str)
    {
        $this-&amp;gt;out('');
        $this-&amp;gt;out('  ** '.$str.' **');
        $this-&amp;gt;hr();
        exit;
    }
    function welcome()
    {
        $this-&amp;gt;out('');
        $this-&amp;gt;hr();
    $this-&amp;gt;out(' __  __  _  _  __  __  _  _  __     __   __       __  __   __  ___  __   __ ');
    $this-&amp;gt;out('|   |__| |_/  |__ |__] |__| |__]   | _  |__ | | |__ |__] |__|  |  |  | |__]');
    $this-&amp;gt;out('|__ |  | | _ |__ |    |  | |      |__| |__ | | |__ |   |  |  |  |__| |  ');
        $this-&amp;gt;hr();
        $this-&amp;gt;out('');
    }

}
&lt;/code&gt;&lt;/pre&gt;
Its a great way to easily complete a few mudane tasks.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/Q0RGc0FBdRU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/02/16/generate-task-for-cakephp-12.html</feedburner:origLink></entry>
 
 <entry>
   <title>Fixture Task for CakePHP 1.2</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/cqnZVXqjHkI/fixture-task-for-cakephp-12.html" />
   <updated>2007-02-16T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/02/16/fixture-task-for-cakephp-12</id>
   <content type="html">As &lt;a href="http://joelmoss.info/switchboard/blog/2284:Migrations_Task_for_CakePHP_12"&gt;previously mentioned&lt;/a&gt;, I have split out the Fixture part of my migrations script and placed it in its own bake2 task.

The script below is pretty much the same as the previous version of fixtures. Just run the following:
&lt;pre&gt;&lt;code&gt;php bake2.php fixture app users
&lt;/code&gt;&lt;/pre&gt;
Replace "app" with your applications alias (as defined in the apps.ini file). And "users" is the name of the table that you want to run the fixture for.
&lt;pre&gt;&lt;code&gt;/**
 * The FixtureTask runs a specified database fixture.
 *
 * PHP versions 4 and 5
 *
 * Licensed under The MIT License
 * Redistributions of files must retain the above copyright notice.
 *
 * @filesource
 * @copyright       Copyright 2006-2007, Joel Moss
 * @link                http://joelmoss.info
 * @package         cake
 * @subpackage      cake.cake.scripts.bake
 * @since           CakePHP(tm) v 1.2
 * @version         $Version: 3.0 $
 * @modifiedby      $LastChangedBy: joelmoss $
 * @lastmodified    $Date: 2007-02-16 09:09:45 +0000 (Fri, 16 Feb 2007) $
 * @license         http://www.opensource.org/licenses/mit-license.php The MIT License
 */

uses('file', 'folder');

class FixtureTask extends BakeTask
{

    function execute($params)
    {
        $this-&amp;gt;welcome();

        if ($params[0] == 'help')
        {
            $this-&amp;gt;help();
            exit;
        }

        $this-&amp;gt;initDatabase();
        $this-&amp;gt;initApp();

        if (count($params) &amp;gt; 0)
        {
            define('FIXTURES_PATH', APP_PATH .DS. 'config' .DS. 'fixtures');

            $this-&amp;gt;fixture = $params[0];
            $this-&amp;gt;fixtures();
            exit;
        }
        else
        {
            $this-&amp;gt;err('Table name not specified.');
        }

        $this-&amp;gt;help();
    }

    function fixtures()
    {
        if (!file_exists(FIXTURES_PATH)) $folder = new Folder(FIXTURES_PATH, true, 0777);
        $tables = $this-&amp;gt;_db-&amp;gt;listTables();
        if (!count($tables))
            $this-&amp;gt;err('Database contains no tables. Please run your migrations before your fixtures.');

        if (!file_exists(FIXTURES_PATH .DS. $this-&amp;gt;fixture .'.yml'))
        {
            $this-&amp;gt;err('Fixture does not exist for table ''.$this-&amp;gt;fixture.''.');
        }

        $this-&amp;gt;out('');
        $this-&amp;gt;out("  Running fixture for '".$this-&amp;gt;fixture."' ... ", false);
        $this-&amp;gt;startFixture($this-&amp;gt;fixture);
        $this-&amp;gt;out('Fixture completed.');
        $this-&amp;gt;hr();
    }

    function startFixture($name)
    {
        $file = FIXTURES_PATH .DS. $name .'.yml';

        if (function_exists('syck_load'))
        {
            $yml = file_get_contents($file);
            $data = @syck_load($yml);
        }
        else
        {
            vendor('Spyc');
            $data = Spyc::YAMLLoad($file);
        }

        if (!is_array($data) || !count($data))
            $this-&amp;gt;err("Unable to parse YAML Fixture file: '$file'");

        $res = $this-&amp;gt;_db-&amp;gt;query("DELETE FROM `$name`");
        if (PEAR::isError($res)) $this-&amp;gt;err($res-&amp;gt;getDebugInfo());

        $count = 0;
        foreach($data as $ri=&amp;gt;$r)
        {
            #if (!in_array('created', $r)) $data[$ri]['created'] = date('Y-m-d H:i:s');
            foreach($r as $fi=&amp;gt;$f)
                if ($f == 'NOW') $data[$ri][$fi] = date('Y-m-d H:i:s');
            $res = $this-&amp;gt;_db-&amp;gt;autoExecute($name, $data[$ri], MDB2_AUTOQUERY_INSERT);
            if (PEAR::isError($res)) $this-&amp;gt;err($res-&amp;gt;getDebugInfo());
            $count = $count+$res;
        }
        $this-&amp;gt;out("($count rows) ... ", false);
    }

    function initApp()
    {
        $this-&amp;gt;out("Application: '".APP_DIR."' (".APP_PATH.")");
        $this-&amp;gt;hr();
    }

    function initDatabase()
    {
        if (!@include_once('MDB2.php'))
        {
            echo "nnTask Error: Unable to include PEAR.php and MDB2.phpnn";
            exit;
        }

        if(!file_exists(APP_PATH.'config'.DS.'database.php'))
        {
            $this-&amp;gt;out('** Checking for database configuration ... NOT FOUND! **');
            $this-&amp;gt;out();
            $this-&amp;gt;out('IMPORTANT!');
            $this-&amp;gt;out('Your database configuration ('.APP_PATH.'config'.DS.'database.php) was not found. Please');
            $this-&amp;gt;out('take a moment to create one by running the 'dbconfig' task:');
            $this-&amp;gt;out('');
            $this-&amp;gt;out('  php bake2.php dbconfig [...]');
            $this-&amp;gt;hr();
            exit;
        }

        require_once (APP_PATH . 'config' .DS. 'database.php');

        $ds = new DATABASE_CONFIG();
        $config = $ds-&amp;gt;default;
        $dsn = array(
            'phptype'   =&amp;gt;  $config['driver'],
            'username'  =&amp;gt;  $config['login'],
            'password'  =&amp;gt;  $config['password'],
            'hostspec'  =&amp;gt;  $config['host'],
            'database'  =&amp;gt;  $config['database']
        );
        $options = array(
            'debug'         =&amp;gt;  DEBUG,
            'portability'   =&amp;gt;  DB_PORTABILITY_ALL
        );
        $this-&amp;gt;_db = &amp;amp;MDB2::connect($dsn, $options);
        if (PEAR::isError($this-&amp;gt;_db)) $this-&amp;gt;err($this-&amp;gt;_db-&amp;gt;getDebugInfo());
        $this-&amp;gt;_db-&amp;gt;setFetchMode(MDB2_FETCHMODE_ASSOC);
        $this-&amp;gt;_db-&amp;gt;loadModule('Manager');
        $this-&amp;gt;_db-&amp;gt;loadModule('Extended');
        $this-&amp;gt;_db-&amp;gt;loadModule('Reverse');
    }

    function help()
    {
        echo "This task inserts database fixtures.n";
        echo "Usage: bake2 fixture app_alias [table_name]n";
    }

    function out($str='', $newline=true)
    {
        $nl = $newline ? "n" : "";
        echo "  $str$nl";
    }
    function hr()
    {
        echo "n  ----------------------------------------------------------------------------n";
    }
    function err($str)
    {
        $this-&amp;gt;out('');
        $this-&amp;gt;out('  ** '.$str.' **');
        $this-&amp;gt;hr();
        exit;
    }
    function welcome()
    {
        $this-&amp;gt;out('');
        $this-&amp;gt;hr();
    $this-&amp;gt;out(' __  __  _  _  __  __  _  _  __     __      ___      _   __  _ ');
    $this-&amp;gt;out('|   |__| |_/  |__ |__] |__| |__]   |_  | /  |  | | |_] |__ [_ ');
    $this-&amp;gt;out('|__ |  | | _ |__ |    |  | |      |   | /  |  |_| |  |__  _]');
        $this-&amp;gt;hr();
        $this-&amp;gt;out('');
    }

}
&lt;/code&gt;&lt;/pre&gt;
That is pretty much it.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/cqnZVXqjHkI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/02/16/fixture-task-for-cakephp-12.html</feedburner:origLink></entry>
 
 <entry>
   <title>Improve your email productivity</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/_rJ5oJUEQrg/improve-your-email-productivity.html" />
   <updated>2007-01-25T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/01/25/improve-your-email-productivity</id>
   <content type="html">&lt;a href="http://www.carsonified.com"&gt;Ryan Carson&lt;/a&gt; just posted a &lt;a href="http://www.carsonified.com/gtd/improving-your-email-inbox-productivity"&gt;small tip&lt;/a&gt; on his blog about how he improved his email productivity using &lt;a href="http://www.smileonmymac.com/textexpander/index.html"&gt;TextExpander&lt;/a&gt; for the Mac.

Using a mix of keywords and/or keyboard shortcuts, TextExpander slashes the time it takes to write an email, especially if it contains lots of content that you repeatedly use. Perfect for writing support emails.

I didn't need to look for for a Windows alternative. The &lt;a href="http://extensions.hesslow.se/extension/4/Quicktext/"&gt;QuickText&lt;/a&gt; extension for Thunderbird does exactly the same thing.  Just define your shortcut, along with its own keyboard shortcut and keyword. Then write your email - very quickly!

Another &lt;a href="http://joelmoss.info/switchboard/blog/2172:Enso_Its_Genius"&gt;genius&lt;/a&gt; product!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/_rJ5oJUEQrg" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/01/25/improve-your-email-productivity.html</feedburner:origLink></entry>
 
 <entry>
   <title>Enso: Its Genius!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/NRIvOpiOeic/enso-its-genius.html" />
   <updated>2007-01-25T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/01/25/enso-its-genius</id>
   <content type="html">&lt;p&gt;The geniuses at &lt;a href="http://www.humanized.com"&gt;Humanized&lt;/a&gt; just released their first commercial product, entitled Enso. And you know what, it's pure genius!&lt;/p&gt;

&lt;p&gt;I could never do it justice by trying to tell you want it is about and why you should use it, so go to &lt;a href="http://www.humanized.com"&gt;Humanized.com&lt;/a&gt; and watch the demo video on the front page.&lt;/p&gt;

&lt;p&gt;I promise you that you will most definately be impressed with how it can save you countless seconds on every command you perform on your windows computer. CAPS LOCK is my new best friend!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/NRIvOpiOeic" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/01/25/enso-its-genius.html</feedburner:origLink></entry>
 
 <entry>
   <title>Whats new in CakePHP: Asset Sharing</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/uKfisbtK1s4/whats-new-in-cakephp-asset-sharing.html" />
   <updated>2007-01-16T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/01/16/whats-new-in-cakephp-asset-sharing</id>
   <content type="html">Back in November of last year, I wrote a &lt;a href="http://joelmoss.info/switchboard/blog/2028:Cakes_global_CSS_Javascript_and_images"&gt;short article&lt;/a&gt; on how to achieve global CSS, Javascript and Images using CakePHP.  It was and still is a great way of sharing your assets between mutiple Cake applications, but it was only really touched upon slightly and still needed additional tweaking.

Well, CakePHP 1.2 has done just that and made it soooo easy to share your assets between apps.

Simply forget about my &lt;a href="http://joelmoss.info/switchboard/blog/2028:Cakes_global_CSS_Javascript_and_images"&gt;previous method&lt;/a&gt; and make sure you are using the 1.2 pre release of CakePHP. Now in your top Vendors directory you should notice a couple of new directories: css and js. Simply place your shared CSS files in the css directory and do the same for your javascript files, placing them in the js directory.

That my friends, is it!

Whenever you call a CSS or javascript file from within your views, Cake will first look for that file in your app's webroot. If it can't find it, it will look in your top vendors directory and include it if found.

Zero configuration and no hacking!! Enjoy ;)
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/uKfisbtK1s4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/01/16/whats-new-in-cakephp-asset-sharing.html</feedburner:origLink></entry>
 
 <entry>
   <title>inType: A Windows alternative to Textmate?</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/YKH-ycKYmto/intype-a-windows-alternative-to-textmate.html" />
   <updated>2007-01-08T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/01/08/intype-a-windows-alternative-to-textmate</id>
   <content type="html">&lt;p&gt;Ever since I saw the famous &lt;a href="http://media.rubyonrails.org/video/rails_take2_with_sound.mov"&gt;Ruby on Rails screencast&lt;/a&gt;, I was mightily impressed. Not only by the Rails framework the screencast was showing off, but also by the editing environment in which the code was being written.&lt;/p&gt;

&lt;p&gt;It seems that &lt;a href="http://macromates.com/"&gt;Texmate&lt;/a&gt; is the standard for developing Rails apps on the Mac. Unfortunately, me and 95% of the population don't seem to own a Mac, so we're stuck with what Windows has to offer.&lt;/p&gt;

&lt;p&gt;To be honest with you, it ain't so good!&lt;/p&gt;

&lt;p&gt;Now I am pretty sure that I have tried em all. I started using Textpad and CuteFTP during my development efforts. And this worked for quite a while. But then I learned that I could work a little faster with a good code editor. For some reason, this led me to Dreamweaver. I suppose the main reason being that it had built-in FTP and some good HTML auto completion. (this was back in the day when I tested on an external server.)&lt;/p&gt;

&lt;p&gt;Dreamweaver is great at HTML editing, but it ain't really suited for PHP development. So I began my search in earnest. And since then I am pretty confident that I have tried them all. But not one has completely satisfied my hunger for that perfect Windows code editor for web development languages. Each seems to have its annoyances, or is missing one thing that I need.&lt;/p&gt;

&lt;p&gt;By this point, I simply wanted to buy a spangly new iMac just so I could use Textmate. I had never used the software, but it has always looked so damn useful.&lt;/p&gt;

&lt;p&gt;But now I think I found Windows answer to Textmate: &lt;a href="http://intype.info"&gt;inType&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Intype is a powerful and intuitive code editor for Windows with lightning fast response. It is easily extensible and customizable, thanks to support for scripting and native plug-ins. It makes development in any programming or scripting language quick and easy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Although only in Alpha form, this very fast code editor seems to be extremely useful, in that it is very customisable. Something that I think all software should be. It also has support for Textmate snippets.&lt;/p&gt;

&lt;p&gt;Don't believe me? &lt;a href="http://intype.info/screencasts/snippets/"&gt;Watch the screencast&lt;/a&gt; and you will be mightily impressed.&lt;/p&gt;

&lt;p&gt;At the moment I am using Zend Studio for PHP development, and Eclipse - in particular RadRails - for Ruby on Rails dev. I gotta admit that Zend Studio  is the best for PHP, and I the same goes for RadRails, but they still have that little something missing. But I think these may be replaced by inType very soon. It's not really usable at the moment, as the Alpha is still missing basic features, such as muliple file support and undo/redo. But these are coming soon.&lt;/p&gt;

&lt;p&gt;Watch the inType &lt;a href="http://intype.info/blog/category/screencasts/"&gt;screencasts&lt;/a&gt; and &lt;a href="http://intype.info/download/releases/intype-0.2.0.211.exe"&gt;download&lt;/a&gt; the Alpha. I promise you that you will not be dissapointed.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/YKH-ycKYmto" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/01/08/intype-a-windows-alternative-to-textmate.html</feedburner:origLink></entry>
 
 <entry>
   <title>My journey on Rails</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/2qJ2NJmrLfI/my-journey-on-rails.html" />
   <updated>2007-01-06T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/01/06/my-journey-on-rails</id>
   <content type="html">Well this week, after months of "will I won't I?", and "shall I, should I?", I finally sat down and began to write my first app with &lt;a href="http://rubyonrails.com"&gt;Ruby on Rails&lt;/a&gt;. And you know what? It was, and is fun!

Admitedly, I haven't gotten very far, but I do now have a basic understanding of the Ruby language and how Rails works. And I can't yet say whether I will be saying bye to Cake and PHP. I still want to do more with Rails and really see if I can develop faster and easier.

But what I would like to do right now, is give those of you who were in the same boat as me, who want to learn Rails but don't know where to start. The following are a list of resources that I have found invaluable in my learning of Ruby and Rails.
&lt;h3&gt;Walk before you can run&lt;/h3&gt;
Some of you may not know this, but Ruby on Rails is not a programming language, it is a framework, or collection of scripts written in the Ruby programming language, that provide faster and enjoyable development. I could tell you to launch straight into Rails, but that would be foolish, as you gotta learn to walk before you can run.

The best start I can possibly recommend is to run through the &lt;a href="http://tryruby.hobix.com/"&gt;"Try Ruby in 15 minutes"&lt;/a&gt; interactive tutorial. Just sit back and watch and learn.
&lt;h3&gt;Try a Humble Little Ruby Book&lt;/h3&gt;
Although I first started to read &lt;a href="http://www.manning.com/black/"&gt;Ruby for Rails&lt;/a&gt;, I didn't really fully grasp the Ruby language until I read &lt;a href="http://www.humblelittlerubybook.com/"&gt;Mr. Neighborly's Humble Little Ruby Book&lt;/a&gt;.

Readable online and in PDF, this free six chapter ebook is written so well and explains the basics of Ruby.
&lt;blockquote&gt;An up to date book on Ruby programming, written in a style described as "a beautiful display of pragmatically chunky bacon, wrapped in a nutshell." Or something like that.

Mr. Neighborly's Humble Little Ruby Book covers the Ruby language from the very basics of using puts to put naughty phrases on the screen all the way to serving up your favorite web page from WEBrick or connecting to your favorite web service. Written in a conversational narrative rather than like a dry reference book, Mr. Neighborly's Humble Little Ruby Book is an easy to read, easy to follow guide to all things Ruby.&lt;/blockquote&gt;
&lt;h3&gt;Get Agile with Rails&lt;/h3&gt;
By now you should have a basic understanding of Ruby and are probably chewing at the bit to get started with Rails. So read the last book you will every need - &lt;a href="http://www.pragmaticprogrammer.com/title/rails/"&gt; Agile Web Development with Rails&lt;/a&gt;.

This award winning book really explains Rails in a way that will get you started immediately.
&lt;blockquote&gt;With this book, you'll learn how to use ActiveRecord to connect business objects and database tables. No more painful object-relational mapping. Just create your business objects and let Rails do the rest. Need to create and modify your schema? Migrations make it painless (and they're versioned, so you can roll changes backward and forward). You'll learn how to use the Action Pack framework to route incoming requests and render pages using easy-to-write templates and components. See how to exploit the Rails service frameworks to send emails, implement web services, and create dynamic, user-centric web-pages using built-in Javascript and Ajax support. There are extensive chapters on testing, deployment, and scaling.&lt;/blockquote&gt;
&lt;h3&gt;The Official docs&lt;/h3&gt;
The Ruby and Rails community is thriving, and so there are plenty of well written blogs out there that are perfect companion pieces for your journey on Rails. But before I tell you about the best ones, don't forget about the &lt;a href="http://rubyonrails.com"&gt;official Ruby on Rails site&lt;/a&gt;.

The &lt;a href="http://wiki.rubyonrails.com"&gt;API&lt;/a&gt; should always be left open in your browser for quick reference. And although in desperate need of gardening, the &lt;a href="http://wiki.rubyonrails.com"&gt;Rails Wiki&lt;/a&gt; is also a great place to find community generated tips, howto's and tutorials.
&lt;h3&gt;Other Valuable Resources&lt;/h3&gt;
So what else is there? Just take a look at these worthy reads:
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://peepcode.com/"&gt;Peepcode&lt;/a&gt; - Although not strictly a read, the Peepcode screencasts are a great watch.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.invisible.ch/files/rails-reference-1.1.html"&gt;InVisible Ruby On Rails Reference&lt;/a&gt; - A little outdated, but a great quick reference site.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.irintech.com/x1/blogarchive.php?id=463"&gt;Ruby Cheat Sheet&lt;/a&gt; - Similar to the above, but for Ruby.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://ruby-lang.org"&gt;The official Ruby site&lt;/a&gt; - Has some good starting tutorials, aswell as the Ruby API.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.railsweenie.com/"&gt;Rails Weenie&lt;/a&gt; - A forum that contains helpful tips and advise.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Ruby and Rails Blogs&lt;/h3&gt;
Often the best blogs are written by the members of the Rail core team, but I also found some others:
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.loudthinking.com/"&gt;LoudThinking&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://errtheblog.com/"&gt;err.the_blog&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.caboo.se/"&gt;:caboose&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://weblog.rubyonrails.org/"&gt;Riding Rails&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://nubyonrails.com/"&gt;Nuby on Rails&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://weblog.techno-weenie.net/"&gt;Techno Weenie&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://redhanded.hobix.com/"&gt;Redhanded&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.codyfauser.com/"&gt;Cody Fauser&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Go Forth and roll&lt;/h3&gt;
Well I think that just about covers everything I used during my week of rolling with Rails. I hope you will find it helpful. Enjoy and let me know if you have found any great RoR resources.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/2qJ2NJmrLfI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/01/06/my-journey-on-rails.html</feedburner:origLink></entry>
 
 <entry>
   <title>Replicating Rails RJS in CakePHP</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/mT2gViKtakk/replicating-rails-rjs-in-cakephp.html" />
   <updated>2007-01-03T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/01/03/replicating-rails-rjs-in-cakephp</id>
   <content type="html">One of the things that I like so much about the Ruby on Rails framework are its RJS templates. I will let the Rails API tell you more:
&lt;blockquote&gt;Unlike conventional templates which are used to render the results of an action, these templates generate instructions on how to modify an already rendered page. This makes it easy to modify multiple elements on your page in one declarative Ajax response. Actions with these templates are called in the background with Ajax and make updates to the page where the request originated from.&lt;/blockquote&gt;
So when you make an Ajax call, you can return pure javascript and use that to modify the page that you are on. For example, you could create an RJS template that simply hides an element on the page you are on.

Replicating RJS templates in &lt;a href="http://cakephp.org"&gt;CakePHP&lt;/a&gt; is surprisingly easy with the &lt;a href="http://bakery.cakephp.org/articles/view/197"&gt;all new 1.2 version&lt;/a&gt; of the rapid application development framework for PHP.

All you gotta do is add the following function in your AppController:
&lt;pre&gt;&lt;code&gt;function beforeRender()
{
    if (isset($this-&amp;gt;params['url']['ext']) &amp;amp;&amp;amp; $this-&amp;gt;params['url']['ext'] == 'js')
    {
        $this-&amp;gt;layout = false;
        header("Content-type: text/javascript");
    }
}
&lt;/code&gt;&lt;/pre&gt;
What that does is take advantage of the new &lt;a href="http://joelmoss.info/switchboard/blog/2125:New_in_Cake_URL_Extensions"&gt;URL Extensions&lt;/a&gt; introduced in CakePHP 1.2. It looks to see if you are using a JS extension. If you are, it disables the layout and sets the pages Content-Type to "&lt;em&gt;text/javascript&lt;/em&gt;".

Now when you call http://MyCakeApp/controller/action.js it will return your Javascript template from /app/views/controller/js/action.ctp. This view template should contain only javascript, but of course you can still use PHP and your Helpers in there. It will also only work if you are using the Ajax functionality of the &lt;a href="http://prototype.conio.net/"&gt;Prototype javascript library&lt;/a&gt;.

So the following could be the entire contents of your JS view:
&lt;pre&gt;&lt;code&gt;  new Effect.Highlight('');
  Field.activate('');

    $('loading-text').update('Login Successful.');
    window.location.href = '/';
&lt;/code&gt;&lt;/pre&gt;
As you can see, you don't need to use any SCRIPT tags. Just place the javascript directly into it.

Works a treat and does exactly what Rails RJS templates do. Please do try it and play with it some more, as you won't really know its full potential until you do.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/mT2gViKtakk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/01/03/replicating-rails-rjs-in-cakephp.html</feedburner:origLink></entry>
 
 <entry>
   <title>New in Cake: URL Extensions</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/IUF_JCkm22E/new-in-cake-url-extensions.html" />
   <updated>2007-01-03T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2007/01/03/new-in-cake-url-extensions</id>
   <content type="html">Hi all and happy new year. Hope you all had a great Christmas.

I am hoping to increase my activity on this blog in the next year and post more tips and articles as I discover them. Let me start of with the first of a number of articles introducing whats new and changed in &lt;a href="http://bakery.cakephp.org/articles/view/197"&gt;CakePHP 1.2&lt;/a&gt;.

I have found URL Extensions to be extremely valuable when serving differing types of content in my Cake apps. They provide an extremely easy way to serve separate templates/views depending on what you want to see.

Usually when you call &lt;em&gt;http://MyCakeApp/controller/action&lt;/em&gt; the actions view would be pulled from the &lt;em&gt;/app/views/controller/action.ctp&lt;/em&gt; template file. (The .ctp extension is the new standard extension used for view templates in Cake.) Which is fine if all you ever want to do is serve the same type of content all day.

But what happens if you would like to display that same view in XML or RSS? I know there are other ways of doing this, but the use of URL Extensions is by far the easiest and quickest.

So all you would do is call &lt;em&gt;http://MyCakeApp/controller/action.xml&lt;/em&gt;. And instead of &lt;em&gt;/app/views/controller/action.ctp&lt;/em&gt; being rendered, it would look for your view template at &lt;em&gt;/app/views/controller/xml/action.ctp&lt;/em&gt;.

If you want to do something different when the XML view is called, you can use
&lt;pre&gt;&lt;code&gt;$this-&amp;gt;params['url']['ext']
&lt;/code&gt;&lt;/pre&gt;
The above will output the extension name. For example, if &lt;em&gt;http://MyCakeApp/controller/action.xml&lt;/em&gt; were called, the above would equal "&lt;em&gt;xml&lt;/em&gt;".

Hope that helps.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/IUF_JCkm22E" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2007/01/03/new-in-cake-url-extensions.html</feedburner:origLink></entry>
 
 <entry>
   <title>Dear PHP</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/rsjWhhR7jAQ/dear-php.html" />
   <updated>2006-12-19T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/12/19/dear-php</id>
   <content type="html">Just take a look at this &lt;a href="http://blog.rightbrainnetworks.com/2006/12/18/dear-php-i-think-its-time-we-broke-up/"&gt;public letter&lt;/a&gt; and tell me you don't feel the same?
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/rsjWhhR7jAQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/12/19/dear-php.html</feedburner:origLink></entry>
 
 <entry>
   <title>Ruby for PHPers</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/ngAZMPLx1N4/ruby-for-phpers.html" />
   <updated>2006-12-09T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/12/09/ruby-for-phpers</id>
   <content type="html">Just found a great little &lt;a href="http://rsthree.com/2006/12/02/ruby-for-php-programmers/"&gt;article&lt;/a&gt; that introduces Ruby to PHP programmers.
&lt;blockquote&gt;While Ruby�s documentation is at a point now where beginners can start digging in and learning quite rapidly, there appears to be a learning curve with developers coming from other languages. Ruby is a language that took the best ideas from many languages such as Perl, Lisp, Smalltalk, and others, and while some syntax is immediately familiar to a PHP developer, the more you really unlock the power of the language, the less it looks like anything we�ve seen before.&lt;/blockquote&gt;
It's definately &lt;a href="http://rsthree.com/2006/12/02/ruby-for-php-programmers/"&gt;worth a read&lt;/a&gt;.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/ngAZMPLx1N4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/12/09/ruby-for-phpers.html</feedburner:origLink></entry>
 
 <entry>
   <title>Migrations v2.2.4</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/6Xku6rgHfYY/migrations-v224.html" />
   <updated>2006-12-04T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/12/04/migrations-v224</id>
   <content type="html">With thanks to Yar Dmitriev, I just released version 2.2.4.

This version includes just one fix for a problem that arose when migrating more than 9 files.

V2.2.4 can be downloaded from &lt;a href="http://homepageuniverse.com/migrations.zip"&gt;HomepageUniverse&lt;/a&gt; right now.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/6Xku6rgHfYY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/12/04/migrations-v224.html</feedburner:origLink></entry>
 
 <entry>
   <title>HAML into PHAML?</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/kM4PHGGWQFc/haml-into-phaml.html" />
   <updated>2006-12-03T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/12/03/haml-into-phaml</id>
   <content type="html">I discovered &lt;a href="http://haml.hamptoncatlin.com/"&gt;HAML&lt;/a&gt; several months ago and instantly fell in love with it. I can just see how it would increase any developers productivity and speed up development time. Not to mention actually producing nice, clean and great looking XHTML markup.

This is your template:
&lt;pre&gt;&lt;code&gt;!!!
%html{ :xmlns =&amp;gt; "http://www.w3.org/1999/xhtml", :lang =&amp;gt; "en", 'xml:lang' =&amp;gt; "en" }
%head
%title BoBlog
%meta{ 'http-equiv' =&amp;gt; 'Content-Type', :content =&amp;gt; 'text/html; charset=utf-8' }/
= stylesheet_link_tag 'main'
%body
#header
%h1 BoBlog
%h2 Bob's Blog
#content
- @entries.each do |entry|
.entry
%h3.title= entry.title
%p.date= entry.posted.strftime("%A, %B %d, %Y")
%p.body= entry.body
#footer
%p
All content copyright&lt;/code&gt;&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/kM4PHGGWQFc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/12/03/haml-into-phaml.html</feedburner:origLink></entry>
 
 <entry>
   <title>Using separate views for ajax</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/K8f_8in2E5M/using-separate-views-for-ajax.html" />
   <updated>2006-12-01T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/12/01/using-separate-views-for-ajax</id>
   <content type="html">In my current project I needed to have separate views when an action is called via ajax. Even though Cake supports a separate layout for ajax calls by prepending ajax onto your URL's, this not what I wanted. As each action needed its own view file due to the use of JSON in the app.

So I simply added the following method into my app_controller:
&lt;pre&gt;&lt;code&gt;function beforeRender()
{
    if ($this-&amp;gt;RequestHandler-&amp;gt;isAjax())
    {
        $this-&amp;gt;viewPath = $this-&amp;gt;viewPath.'/ajax'; // change the view directory
        # $this-&amp;gt;ext = '.jhtml'; // or change the extension
    }
}
&lt;/code&gt;&lt;/pre&gt;
So now when an action is called by an ajax script, Cake sees this and changes the view path, and calls the following view &lt;em&gt;app/views/controller/ajax/action.thtml&lt;/em&gt;.

Alternatively you can have the extension of your view files changed. So all ajax calls would call views ending in .jhtml for example. Your choice!

So now my ajax views are separated from my normal views.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/K8f_8in2E5M" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/12/01/using-separate-views-for-ajax.html</feedburner:origLink></entry>
 
 <entry>
   <title>Migrations v2.2.3</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/V6d7S_8mwo8/migrations-v223.html" />
   <updated>2006-12-01T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/12/01/migrations-v223</id>
   <content type="html">Another bug fix release. Version 2.2.3 fixes a problem of default value not being set when the value is 0 or 0.0.

&lt;a href="http://homepageuniverse.com/migrations.zip"&gt;Download the new version&lt;/a&gt;.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/V6d7S_8mwo8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/12/01/migrations-v223.html</feedburner:origLink></entry>
 
 <entry>
   <title>Developing faster with Rails?</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/IGiylzT6ZKo/developing-faster-with-rails.html" />
   <updated>2006-12-01T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/12/01/developing-faster-with-rails</id>
   <content type="html">I've lost track of the numerous amount of times that I have sat down and started to learn and build a web application with Ruby on Rails. I get excited about it just by reading any mention of the framework in a blog or tutorial and decide - again - that I want to learn it. But then I give up after a few hours because I figure that PHP can do the same thing, and I don't even have to learn a new language.

But I still keep coming back to the same question; &lt;strong&gt;is developing a web app in Rails faster that developing the same thing in PHP?&lt;/strong&gt;

&lt;a href="http://www.thefutureoftheweb.com"&gt;Jesse Skinner&lt;/a&gt; seems to think it is. He just switched from PHP and wrote an &lt;a href="http://www.thefutureoftheweb.com/blog/2006/11/switch-from-php-to-ruby-on-rails"&gt;article on his blog about his experience&lt;/a&gt;.
&lt;blockquote&gt;So I did it. I've been coding in Rails since the start of the month, and it's been a great time. Sure, there was a learning curve. It took me some time to figure out how to do the simplest of things. But I read through the book, I experimented, I searched the web for answers, and now I'm cruising. I'm about 80% as good in Rails as I am in PHP, except &lt;strong&gt;with Rails everything takes half the time so in the end it's actually faster.&lt;/strong&gt;&lt;/blockquote&gt;
What struck me most about the above quote, is the part in bold. Is it really faster to work with? Can't I achieve the same thing with PHP and a &lt;a href="http://cakephp.org"&gt;good framework&lt;/a&gt;?

I have read a lot of info on Rails and what its advantages are, but I still don't know these answers. So can anyone help me out here?

Shall I switch to Rails and why?
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/IGiylzT6ZKo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/12/01/developing-faster-with-rails.html</feedburner:origLink></entry>
 
 <entry>
   <title>Migrations v2.2.2</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/Qf4zxGN1O74/migrations-v222.html" />
   <updated>2006-11-30T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/11/30/migrations-v222</id>
   <content type="html">Man I think I gotta test my scripts more thoroughly!

Just one small bug fix here. The &lt;em&gt;notnull&lt;/em&gt; parameter was not working. Hey, but it is now! ;)

&lt;a href="http://homepageuniverse.com/migrations.zip"&gt;Download again for the latest&lt;/a&gt;.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/Qf4zxGN1O74" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/11/30/migrations-v222.html</feedburner:origLink></entry>
 
 <entry>
   <title>Migrations v2.2.1</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/tGjizSKWhRI/migrations-v221.html" />
   <updated>2006-11-30T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/11/30/migrations-v221</id>
   <content type="html">Just pushed out another release, but this time with just a few minor bug fixes and improvements.

Thanks go to amigenius.

Changes:
&lt;ul&gt;
	&lt;li&gt;primary_key changed to primary&lt;/li&gt;
	&lt;li&gt;can prevent created and modified from being created with the use of 'no_dates'&lt;/li&gt;
	&lt;li&gt;Multiple primary keys now supported&lt;/li&gt;
	&lt;li&gt;One or two minor bug fixes&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/tGjizSKWhRI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/11/30/migrations-v221.html</feedburner:origLink></entry>
 
 <entry>
   <title>Migrations v2.2</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/GaTGD8V90Oo/migrations-v22.html" />
   <updated>2006-11-29T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/11/29/migrations-v22</id>
   <content type="html">Another day, another Migrations release. Version 2.2 is now available for &lt;a href="http://homepageuniverse.com/migrations.zip"&gt;download&lt;/a&gt;.

This release fixes a few more bugs aswell as the following two minor - but nice - changes:
&lt;h4&gt;'created' &amp;amp; 'modified' fields now optional&lt;/h4&gt;
Creation of &lt;em&gt;created&lt;/em&gt; and &lt;em&gt;modified&lt;/em&gt; fields can now be prevented. Example:
&lt;pre&gt;&lt;code&gt;UP:
  create_table:
    users:
      first_name:
        type: text
        length: 64
        notnull: true
        index: true
      last_name:
        type: text
        length: 64
      created: false
      modified: false
&lt;/code&gt;&lt;/pre&gt;
Note the last two lines. Leave these lines out completely and 'created' and 'modified' fields will be created for you.
&lt;h4&gt;Instant operation&lt;/h4&gt;
Thanks to a comment from &lt;a href="http://cakebaker.42dh.com"&gt;Daniel Hofstetter&lt;/a&gt;, you can now run migrations and fixtures with one command and bypassing all prompts. This makes the whole process very fast and save a bundle of time.

Just do the following to run your latest migrations:
&lt;pre&gt;&lt;code&gt;php vendors/migrations/migrate.php -migrate latest
&lt;/code&gt;&lt;/pre&gt;
or specify the migration version:
&lt;pre&gt;&lt;code&gt;php vendors/migrations/migrate.php -migrate 4
&lt;/code&gt;&lt;/pre&gt;
You can also run any specified fixture in the same way:
&lt;pre&gt;&lt;code&gt;php vendors/migrations/migrate.php -fixture users
&lt;/code&gt;&lt;/pre&gt;
&lt;strong&gt;BE WARNED&lt;/strong&gt; that running the above commands will not prompt you at all, or ask you to confirm the action. So if you mistype a version number of fixture name, and delete all your work, I will not be held responsible.

As usual, play nicely and post away if you have anything to say or request.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/GaTGD8V90Oo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/11/29/migrations-v22.html</feedburner:origLink></entry>
 
 <entry>
   <title>Cake's global CSS, Javascript and images</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/wLK9LkywPlc/cakes-global-css-javascript-and-images.html" />
   <updated>2006-11-29T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/11/29/cakes-global-css-javascript-and-images</id>
   <content type="html">Just perusing through cake's webroot, I noticed a PHP file in the &lt;em&gt;js&lt;/em&gt; directory called &lt;em&gt;vendors.php&lt;/em&gt;. It seems its idea is to allow you to keep a global repository of javascript files in cake's main vendors directory. This is a great idea for those of us who develop multiple apps with one cake install.

So I had a little think and realised I could do the same thing with my CSS files and images. So I set to work modifying this vendors.php file. So now if I want to include a link to a global javascript file located in cake's &lt;em&gt;vendors&lt;/em&gt; directory, I simply do this in my view:
&lt;pre&gt;&lt;code&gt;$javascript-&amp;gt;link('vendors/myjs');
&lt;/code&gt;&lt;/pre&gt;
Adding &lt;em&gt;vendors/&lt;/em&gt; before the filename simply tells the javascript helper that it should look in the global vendors directory for the file. Of course it works normally if &lt;em&gt;vendors/&lt;/em&gt; is not prepended and includes files from your webroot.

I can do the same thing with CSS:
&lt;pre&gt;&lt;code&gt;$html-&amp;gt;css('vendors/mycss');
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;So how did I do this?&lt;/h4&gt;
Simply edit the vendors.php file in your &lt;em&gt;webroot/js&lt;/em&gt; directory (or create it if it doesn't exist) and add the following code:
&lt;pre&gt;&lt;code&gt;/**
 * This file includes js vendor-files from /vendor/ directory if they need to
 * be accessible to the public.
 */
$file = $_GET['file'];
if(is_file('../../../../vendors/js/'.$file))
{
    readfile('../../../../vendors/js/'.$file);
}
else
{
    header('HTTP/1.1 404 Not Found');
}
&lt;/code&gt;&lt;/pre&gt;
Now you just need to create an .htaccess file in your &lt;em&gt;webroot/js&lt;/em&gt; directory with the following content:
&lt;pre&gt;&lt;code&gt;&amp;lt;ifmodule&amp;gt;
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^vendors/(.*)$ vendors.php?file=$1 [QSA,L]
&amp;lt;/ifmodule&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
This is required, so this whole thing will obviously only work if you have apache's mod_rewrite enabled.

Now just create a directory called &lt;em&gt;js&lt;/em&gt; in your global &lt;em&gt;vendors&lt;/em&gt; directory and place your javascript files into it. Now you can include your javascript files from a central repository shared by all your apps.

Just rinse and repeat for your CSS and images directories. Not forgetting to edit the file paths, etc.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/wLK9LkywPlc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/11/29/cakes-global-css-javascript-and-images.html</feedburner:origLink></entry>
 
 <entry>
   <title>Feeds on my mobile</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/Gwa4Q3lfaOM/feeds-on-my-mobile.html" />
   <updated>2006-11-28T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/11/28/feeds-on-my-mobile</id>
   <content type="html">&lt;p&gt;Well my one year old daughter decided to drop my PDA phone on the floor last week, and so with one year left on my contract, the damn thing wouldn't turn on. And because repairing it would mean I would have to wait 2-3 weeks, I had no choice but to get myself a new phone.&lt;/p&gt;

&lt;p&gt;To be honest, I was half glad that she dropped it. My old phone weighed about as much as a small car and was becoming SOOOO slow.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://homepageuniverse.com/W850i_xl.gif" align="left" /&gt;&lt;/p&gt;

&lt;p&gt;So I got myself a brand new Sony Ericsson W850i and man am I pleased with it. It has everything I need, including 3G, bluetooth, and lots of stuff I don't, including a camera. But the phones best feature - and one that I didn't know it had - is its ability to show RSS feeds off the internet.&lt;/p&gt;

&lt;p&gt;Now that is just genius!!&lt;/p&gt;

&lt;p&gt;Now when I am out and about (or just plain bored), I can open up my phone, update my feeds and read them on the tiny litte screen.&lt;/p&gt;

&lt;p&gt;Ever since I discovered this, my creative juices have been on overflow. I can think of so many possibilities for this.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/Gwa4Q3lfaOM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/11/28/feeds-on-my-mobile.html</feedburner:origLink></entry>
 
 <entry>
   <title>A brief history of pop music - in four chords!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/gofva4pES5U/a-brief-history-of-pop-music-in-four-chords.html" />
   <updated>2006-11-28T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/11/28/a-brief-history-of-pop-music-in-four-chords</id>
   <content type="html">&lt;p&gt;&lt;embed src="http://www.youtube.com/v/8s13sASS5F4" width="425" height="350" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/gofva4pES5U" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/11/28/a-brief-history-of-pop-music-in-four-chords.html</feedburner:origLink></entry>
 
 <entry>
   <title>Migrations V2.1 - Now with Fixtures</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/GRZ0AnqSpgo/migrations-v21-now-with-fixtures.html" />
   <updated>2006-11-25T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/11/25/migrations-v21-now-with-fixtures</id>
   <content type="html">I have just pushed out a new version of Cake Migrations available for &lt;a href="http://homepageuniverse.com/migrations.zip"&gt;download&lt;/a&gt; right now. Version 2.1 fixes a few bugs here and there, but more significantly, Migrations now come with Fixtures.

Following is a quick rundown of what's new in this release.
&lt;h4&gt;Fixtures&lt;/h4&gt;
Fixtures are pretty much the same thing as migrations, but are only used for inserting test data into your development database. So after you run your migrations, simply create a fixture for each of your tables, which will fill them up with test data you can use to test your apps. Coz if you think about it, it's a bit pointless testing without actual data.

So now when you run the migrate script, you get to choose whether you want to work with your migrations or your fixtures. Select fixtures and presuming you have some tables in your DB, it will ask you which table you want to create fixtures for. Selecting a table will then create a blank fixture file in &lt;em&gt;app/config/fixtures&lt;/em&gt; which you should then place your fixtures into.

Something like this:
&lt;pre&gt;&lt;code&gt;#
# Fixture YAML file
#
-
 name: bob1
 username: bobby1
 password: mypass
 created: NOW
-
 name: bob2
 username: bobby2
 password: mypass
 created: NOW
 modified: NOW
-
 name: bob3
 username: bobby3
 password: mypass
 created: NOW
-
 name: bob4
 username: bobby4
 password: mypass
 created: NOW
-
 name: bob5
 username: bobby5
 password: mypass
 created: NOW
-
 name: bob6
 username: bobby6
 password: mypass
 created: NOW
&lt;/code&gt;&lt;/pre&gt;
After each hyphen a fixture or table row is set. You simply set key:value pairs for the fields you want to fill. Don't forget the hyphen before each fixture and of course the usual YAML indents, etc.

You may notice that I have not specified a date in any of the &lt;em&gt;created&lt;/em&gt; values. I used the &lt;em&gt;NOW&lt;/em&gt; keyword instead, which basically inserts the current datetime for you (and in the right format).

Now all you need to do is run migrate.php again, select fixtures and the table you want to run these fixtures for. It will detect this fixture file and insert your data. And voila! Instant test data for your app.
&lt;h4&gt;Created/Modified fields&lt;/h4&gt;
Previously you had to specify that you wanted the &lt;em&gt;created&lt;/em&gt; and &lt;em&gt;modified&lt;/em&gt; fields created in your migrations. Not anymore! These two fields will be created for you in every table, so just leave them out completely.
&lt;h4&gt;Primary Key auto incremented&lt;/h4&gt;
One thing that I left out in previous versions was to make the primary key field auto increment. This is now added.

As you can see, not many changes there, but I thought it deserved a minor increment in version number because of the addition of Fixtures. Watch out for more changes, including the ability to generate migration files from the structure of an existing database. I also plan on making the Migrations script independant. So it will work with and without Cake.

So as usual, please play around with it and let me if you find any bugs. It would also be great to hear what you all think about it all.

Enjoy!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/GRZ0AnqSpgo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/11/25/migrations-v21-now-with-fixtures.html</feedburner:origLink></entry>
 
 <entry>
   <title>Rails love</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/cWKLWSBd02M/rails-love.html" />
   <updated>2006-11-23T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/11/23/rails-love</id>
   <content type="html">Why is it that no matter how many times I decide to use something else and no matter how hard I try to stear away from Rails when developing a new app, I come across a really cool Rails feature or idiom that just blows me away. Today, DHH and pals just released the eagerly anticipated Ruby on Rails version 1.2 and it includes some extremely impressive updates.

Things like REST support, respond_to and lots of little things that make life easier for a programmer are all included. It all looks so cool and so easy to use.

So why don't I use Rails then? Because it would mean me having to learn Ruby - a whole new language. And that is just time that I do not have.  But on the other hand, will it save me time to actually develop applications over something like PHP?

Oh I just don't know. Do I take the plunge and spend the next few weeks learning Ruby, or do I block it out of my mind for ever and stick with good PHP and Cake???

HELP ME???
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/cWKLWSBd02M" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/11/23/rails-love.html</feedburner:origLink></entry>
 
 <entry>
   <title>Migrations bug fixes</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/sqIvN6KHKfQ/migrations-bug-fixes.html" />
   <updated>2006-11-23T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/11/23/migrations-bug-fixes</id>
   <content type="html">With thanks to kabturek and dhofset in Cake IRC, we discovered a few bugs in Migrations. So I have updated it and released version 2.0.2. You can download it from &lt;a href="http://homepageuniverse.com/migrations.zip"&gt;HomepageUniverse&lt;/a&gt;

Please play around. Oh and don't forget to check out the &lt;a href="http://joelmoss.info/switchboard/blog/1997:The_Joy_of_Cake_Migrations__my_first_tutorial"&gt;tutorial&lt;/a&gt;.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/sqIvN6KHKfQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/11/23/migrations-bug-fixes.html</feedburner:origLink></entry>
 
 <entry>
   <title>The Joy of Cake Migrations - my first tutorial</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/gcYn8_XorwU/the-joy-of-cake-migrations-my-first-tutorial.html" />
   <updated>2006-11-22T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/11/22/the-joy-of-cake-migrations-my-first-tutorial</id>
   <content type="html">As &lt;a href="http://joelmoss.info/switchboard/blog/1992:Cake_DB_Migrations_strikes_back"&gt;promised&lt;/a&gt;, the following is a tutorial on how to use and take advantage of Migrations in your &lt;a href="http://cakephp.org"&gt;CakePHP&lt;/a&gt; development. I suppose you could also call it a basic manual.

This article assumes that you already have an installation of CakePHP which is already configured and ready to go. It also assumes that you know what migrations are and why you need them.  For more information on DB Migrations, please see &lt;a href="http://joelmoss.info/switchboard/blog/1992:Cake_DB_Migrations_strikes_back"&gt;here&lt;/a&gt;.
&lt;h4&gt;Getting started&lt;/h4&gt;
Once you have installed and configured CakePHP, you should download the Migrations package from &lt;a href="http://homepageuniverse.com"&gt;HomepageUniverse&lt;/a&gt; &lt;a href="http://homepageuniverse.com/migrations.zip"&gt;here&lt;/a&gt;. Unzip the archive into your &lt;em&gt;vendors&lt;/em&gt; directory that is above your &lt;em&gt;app&lt;/em&gt; directory.

&lt;strong&gt;Remember&lt;/strong&gt; that you should place the migrations package in your top level &lt;em&gt;vendors&lt;/em&gt; directory, not the &lt;em&gt;vendors&lt;/em&gt; directory within your &lt;em&gt;app&lt;/em&gt; directory.

Within the &lt;em&gt;migrations&lt;/em&gt; directory are a number of files and two more directories. I will explain each here:
&lt;ul&gt;
	&lt;li&gt;migrate.php &lt;em&gt;[file]&lt;/em&gt; - This is the main Migrations script.&lt;/li&gt;
	&lt;li&gt;MDB2.php &lt;em&gt;[file]&lt;/em&gt; - This is Pear's MDB2 database abstraction library.&lt;/li&gt;
	&lt;li&gt;Spyc.php &lt;em&gt;[file]&lt;/em&gt; - The Spyc YAML library (just in case you don't have the PHP Syck extension  installed)&lt;/li&gt;
	&lt;li&gt;MDB2 &lt;em&gt;[directory]&lt;/em&gt; - The included MDB2 library files.&lt;/li&gt;
	&lt;li&gt;Examples &lt;em&gt;[directory]&lt;/em&gt; - A few example YAML migration files&lt;/li&gt;
&lt;/ul&gt;
The main file you should be interested in, is the migrate.php file. This is the script that you need to run on your command line, and helps you generate, run and manage your migrations.

To use it, simply run the following from within your cake root directory and follow the on screen prompts:
&lt;pre&gt;&lt;code&gt;php vendors/migrations/migrate.php
&lt;/code&gt;&lt;/pre&gt;
Read on for more detailed description of its usage.
&lt;h4&gt;Migration Basics&lt;/h4&gt;
I will quickly run through what migrations do and how they do it. This should help you understand how and why you should use them.

&lt;strong&gt;Database Support&lt;/strong&gt;
All migrations let you do is run database queries in a structured and simple manner. Pear's &lt;a href="http://pear.php.net/package/MDB2"&gt;MDB2&lt;/a&gt; library is used to interface with your database, so you can use any database engine that MDB2 supports. Why do I use MDB2 when Cake has a very good database? Because Cake's DB classes do not support the creation of tables, fields, indexes, etc.

&lt;strong&gt;Migration Files&lt;/strong&gt;
Migrations use a selection of migration files that are used to manage your database. You can roll forward and backwards through each file, just as you would with any version control system, such as subversion. The migration files are written in a very simple, human readable language called &lt;a href="http://en.wikipedia.org/wiki/YAML"&gt;YAML&lt;/a&gt;, and do not need to contain any SQL queries at all. This way, migrations are 100% portable and can be used with almost any database engine. You can find some example migration files in the Examples directory of the download.

When you run a migration, the script simply analyses each migration file and converts the YAML into database queries and performs the actions specified in the file. The best way to demonstrate this would be to actually do it. So on we go to the meat of this tutorial.
&lt;h4&gt;The Migration Script&lt;/h4&gt;
Just like Cake's Bake.php script, the migrate.php script must be run via the command line. You can do three things with the migrate.php script:
&lt;ol&gt;
	&lt;li&gt;Generate Migration Files&lt;/li&gt;
	&lt;li&gt;Run Migrations&lt;/li&gt;
	&lt;li&gt;Reset your Migrations&lt;/li&gt;
&lt;/ol&gt;
We will go through each one in turn in the next section.

The migrate.php script also takes some optional command line arguments, but I will not go into them too much here. Just run the following for more help:
&lt;pre&gt;&lt;code&gt;php vendors/migrations/migrate.php -h
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;The Generation Game&lt;/h4&gt;
Before you can do anything else, you need to generate your migration files. You can of course create these manually yourself, but it's much easier and less error prone if you use migrate.php. So go ahead and run the migrate script;
&lt;pre&gt;&lt;code&gt;php vendors/migrations/migrate.php
&lt;/code&gt;&lt;/pre&gt;
Assuming everything is good, you should see a lovely little &lt;em&gt;'CAKEPHP MIGRATIONS'&lt;/em&gt; banner in your command line window.

If you have not already configured your Cake database config, it will help you with that in the same way that bake.php does. So go ahead and follow the prompts if you need to do that.

After that, the script will then check that the 'schema_info' table exists in your database, and creates it if it isn't there. This table is used to keep a record of what migration version your app is currently at. So it is very important and should not be tampered with.

Once all that is done, you should see a few lines of data. The first line tells you which application [dir] you are using. Then it tells you your current migration version, along with the number of migration files previously generated.

Now choose 'Generate' from the three Options menu. Then just follow the prompts and your very first migration file will be created for you and placed in a &lt;em&gt;migrations&lt;/em&gt; directory in your app's &lt;em&gt;config&lt;/em&gt; directory. Take a look and you will see that the script has numbered your file. It will do this for every file generated and simply increment each time. This numerical value is used to determine what order your migrations should be run. It is basically the version number.
&lt;h4&gt;YAML, YAML, YAML&lt;/h4&gt;
Before we get started on editing your migration file, I strongly recommend that you get acquainted with YAML. You should read a brilliant little tutorial called &lt;a href="http://yaml.kwiki.org/?YamlInFiveMinutes"&gt;YAML in Five Minutes&lt;/a&gt;. And of course you can check out the &lt;a href="http://www.yaml.org"&gt;official YAML site&lt;/a&gt;

I am going to try and explain a migration file as best I can. So please bear with me, if I splutter.

A migration file consists of two main parts; an UP and a DOWN. The UP section contains the commands that you would like performed when migrating up to this file. And the contents of the DOWN section are run when you rollback from or through this file to a previous version. So usually, the DOWN section contains an exact opposite of what is in the UP section, as you would usually want it to reverse the changes made in the UP section.

Lets start by creating a table. Enter the following into your migration file;
&lt;pre&gt;&lt;code&gt;#
# migration YAML file
#
UP:
  create_table:
    users:
      first_name:
    type: text
    index: true
      last_name:
    type: text
      email:
    type: text
    unique: true
      age:
    type: integer
    length: 3
    notnull: false
DOWN:
  drop_table: users
&lt;/code&gt;&lt;/pre&gt;
Directly under the UP section name, is the action that should be performed. We are creating a table, so we use 'create_table'. Then you tell the migrate script what we want to call this table. After which we create the fields by specifying each field name and its properties. All properties are optional, apart from the 'type', which is required.

Available field types are:
&lt;ul&gt;
	&lt;li&gt;text&lt;/li&gt;
	&lt;li&gt;integer&lt;/li&gt;
	&lt;li&gt;blob&lt;/li&gt;
	&lt;li&gt;boolean&lt;/li&gt;
	&lt;li&gt;float&lt;/li&gt;
	&lt;li&gt;date&lt;/li&gt;
	&lt;li&gt;time&lt;/li&gt;
	&lt;li&gt;timestamp (datetime)&lt;/li&gt;
&lt;/ul&gt;
You can then set the following optional properties:
&lt;ul&gt;
	&lt;li&gt;length&lt;/li&gt;
	&lt;li&gt;notnull&lt;/li&gt;
	&lt;li&gt;default&lt;/li&gt;
	&lt;li&gt;index&lt;/li&gt;
	&lt;li&gt;unique&lt;/li&gt;
	&lt;li&gt;primary&lt;/li&gt;
&lt;/ul&gt;
If you notice in the example above, I have not specified a primary key on any of the fields, and there is no ID field. That is because the migrate.php script will create an ID field for you and set it as the primary key. You can overide that if you wish. Just add a line directly under the UP line like this:
&lt;pre&gt;&lt;code&gt;UP:
  create_table:
    users:
      no_id: true
      first_name:
    type: text
    index: true
      last_name:
    type: text

....
&lt;/code&gt;&lt;/pre&gt;
If you do use the 'no_id' line, you will need to set the primary key and ID field yourself.

Now we need to define the DOWN section. All we want to do is to reverse the actions of the UP section. So we simply say:
&lt;pre&gt;&lt;code&gt;DOWN:
  drop_table: users
&lt;/code&gt;&lt;/pre&gt;
In both sections, you can create/drop more than one table. To create another table, just create another create_table section starting from the table name. To drop more than one table, do this:
&lt;pre&gt;&lt;code&gt;DOWN:
  drop_table: [users, table2, another_table]
&lt;/code&gt;&lt;/pre&gt;
And that my friends, is your very first migration file. I won't go into the details of all the actions that migrations can do as the Examples are pretty good at doing that, and this tutorial is already pretty long.

Other actions available:
&lt;ul&gt;
	&lt;li&gt;alter_field&lt;/li&gt;
	&lt;li&gt;add_field&lt;/li&gt;
	&lt;li&gt;drop_field&lt;/li&gt;
	&lt;li&gt;query&lt;/li&gt;
&lt;/ul&gt;
Pretty self explanatory really, but the last one; 'query', lets you run a raw SQL query. So you can use it to insert/update data. Something like:
&lt;pre&gt;&lt;code&gt;query: INSERT INTO users SET first_name='Joel'
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Run it!&lt;/h4&gt;
Now we get to the exciting part. We run the migration.

Start the script again and accept the default option: "Migrate". It will then give you a list of migration files along with their version number. You only have one file, so type the number of that file, which should be '1'.

Ta Da!! migrate.php will then fetch and parse the file and run the commands on your database. Now check your database and you should see a spangly new table ready for your app to use.

But what happens if you don't like that table and want to change it. You got two options; roll back the version or generate and run a new migration file with the changes.

To rollback the changes, just run migrate.php, accept the default option and enter the number '0'. This happens to be the version prior to the migration you just made, and is also the base. So choosing that will rollback all migrations back to the beginning. Try it now. You should now notice that your table has been dropped.
&lt;h4&gt;Is that good or wot?&lt;/h4&gt;
That is pretty much it. The last option: 'Reset', will do exactly that. It will reset all your migrations and optionally delete your migrations files. So be careful when using that.

Play around with it and &lt;a href="http://developingwithstyle.com/switchboard/forum/create"&gt;create a forum post&lt;/a&gt; here if you have any questions, bug reports or suggestions.

Thanks again and look out for more [shorter] tutorials and maybe a few screencasts in the near future.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/gcYn8_XorwU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/11/22/the-joy-of-cake-migrations-my-first-tutorial.html</feedburner:origLink></entry>
 
 <entry>
   <title>Morphing with Scriptaculous</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/ZWl9-Jf_wQE/morphing-with-scriptaculous.html" />
   <updated>2006-11-21T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/11/21/morphing-with-scriptaculous</id>
   <content type="html">A new beta version of the Scriptaculous javascript effects library has just been released, and very nice it is too. Version 1.7 features a new effect called morphing, which allows for CSS style effects. Effectively allowing you to change an element based on CSS. But the element doesn't just change. it morphs!

Here's an example;
&lt;pre&gt;&lt;code&gt;new Effect.Morph('error_message',{
    style:'border-width:3px; font-size:15pt; color:#f00'
});`
&lt;/code&gt;&lt;/pre&gt;
Just take a look at the &lt;a href="http://mir.aculo.us/demos/script-aculo-us-1-7-beta-demos"&gt;morphing demo&lt;/a&gt;, then read all the &lt;a href="http://mir.aculo.us/2006/11/21/script-aculo-us-hits-1-7-beta"&gt;details&lt;/a&gt;.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/ZWl9-Jf_wQE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/11/21/morphing-with-scriptaculous.html</feedburner:origLink></entry>
 
 <entry>
   <title>Cake DB Migrations strikes back</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/m6YQbHdQRWM/cake-db-migrations-strikes-back.html" />
   <updated>2006-11-21T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/11/21/cake-db-migrations-strikes-back</id>
   <content type="html">I am proud to announce the immediate availability of Cake DB Migrations V2.0.

This new version has been rewritten with portability in mind and now supports a list of database engines as long as your arm. The new features and changes are as follows:
&lt;ul&gt;
	&lt;li&gt;Now supports mutiple database engines with the help of &lt;a href="http://pear.php.net/package/MDB2"&gt;Pear's MDB2&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Simplified YAML migration files&lt;/li&gt;
	&lt;li&gt;Fully supports adding/dropping and altering fields&lt;/li&gt;
	&lt;li&gt;Supports the following field types: text, integer, blob, boolean, float, date, time, timestamp(datetime)&lt;/li&gt;
	&lt;li&gt;Ability to create primary key and unique indexes on new and existing fields&lt;/li&gt;
	&lt;li&gt;Script moved to the main Cake Vendors directory, so no need to touch your Cake core&lt;/li&gt;
	&lt;li&gt;Supports multiple Cake applications in the same way as Bake.php does&lt;/li&gt;
	&lt;li&gt;Works out of the box&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;What is Cake DB Migrations&lt;/h4&gt;
Cake DB Migrations is a port of the very useful Ruby on Rails Migrations functionaility. Cake Migrations allow you to use Cake to define changes to your database schema, making it possible to use a version control system to keep things synchronised with the actual code.

This has many uses, including:
&lt;ul&gt;
	&lt;li&gt;Teams of developers&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/m6YQbHdQRWM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/11/21/cake-db-migrations-strikes-back.html</feedburner:origLink></entry>
 
 <entry>
   <title>Bye DOS windows, hello Powershell</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/3Vqkn0AKklo/bye-dos-windows-hello-powershell.html" />
   <updated>2006-11-17T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/11/17/bye-dos-windows-hello-powershell</id>
   <content type="html">One of the worst thing I ever have to do while developing on Windows, is to use the windows DOS command window. It has to be one of the most unfriendly pieces of software of the planet. So when I heard that MS had just released version 1.0 of an all new shell command window for Windows entitled &lt;a href="http://www.microsoft.com/powershell"&gt;PowerShell&lt;/a&gt;, I quickly installed it and oh how I love it!
&lt;blockquote&gt;Windows PowerShell&lt;/blockquote&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/3Vqkn0AKklo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/11/17/bye-dos-windows-hello-powershell.html</feedburner:origLink></entry>
 
 <entry>
   <title>Cake's easy-peasy database config</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/_s_trLkxNDc/cakes-easy-peasy-database-config.html" />
   <updated>2006-11-16T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/11/16/cakes-easy-peasy-database-config</id>
   <content type="html">Like a lot of developers out there, I use Subversion to keep control of my code and projects, and I also use a different database for development and production. But when using Cake this can be a problem when checking out my code from development to production. Unless I edit my database.php with my production config, the production code would have problems, as it would be trying to access data from the development database.

What I needed was an easy-peasy way of being able to check in my code to production without having to edit the &lt;em&gt;app/config/database.php&lt;/em&gt; config file. So what I did was very simple and can be found below:
&lt;pre&gt;&lt;code&gt;class DATABASE_CONFIG {

    var $development = array(
        'driver' =&amp;gt; 'mysql',
        'connect' =&amp;gt; 'mysql_connect',
        'host' =&amp;gt; 'localhost',
        'login' =&amp;gt; 'user',
        'password' =&amp;gt; 'passwd',
        'database' =&amp;gt; 'app_devel'
    );
    var $production = array(
        'driver' =&amp;gt; 'mysql',
        'connect' =&amp;gt; 'mysql_connect',
        'host' =&amp;gt; 'localhost',
        'login' =&amp;gt; 'user',
        'password' =&amp;gt; 'passwd',
        'database' =&amp;gt; 'app'
    );
    var $test = array(
        'driver' =&amp;gt; 'mysql',
        'connect' =&amp;gt; 'mysql_connect',
        'host' =&amp;gt; 'localhost',
        'login' =&amp;gt; 'user',
        'password' =&amp;gt; 'passwd',
        'database' =&amp;gt; 'app_test'
    );
    var $default = array();

    function __construct()
    {
        $this-&amp;gt;default = ($_SERVER['SERVER_ADDR'] == '127.0.0.1') ?
            $this-&amp;gt;development : $this-&amp;gt;production;
    }
    function DATABASE_CONFIG()
    {
        $this-&amp;gt;__construct();
    }
}
&lt;/code&gt;&lt;/pre&gt;
What you have here are three arrays for each datasource: development, production and test.  Each one defines the database connection variables for each environment. Nothing special there. Directly underneath that is the &lt;em&gt;$default&lt;/em&gt; array, but it is empty. So all we have to do is fill that with the appropriate datasource.

So we set the &lt;em&gt;construct&lt;/em&gt; method for the &lt;em&gt;DATABASE_CONFIG&lt;/em&gt; class and include simply one line of code. What this code does is to set the &lt;em&gt;$default&lt;/em&gt; datasource to the development datasource if the &lt;em&gt;SERVER_ADDR&lt;/em&gt; is a local IP. As most of us develop the code on our local machines and then push it to a production server, this will do nicely, as the &lt;em&gt;SERVER_ADDR&lt;/em&gt; on your production server will not be a local one.

So now I don't have to edit anything when moving my code to production.

Easy-peasy lemon squeasy ;)
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/_s_trLkxNDc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/11/16/cakes-easy-peasy-database-config.html</feedburner:origLink></entry>
 
 <entry>
   <title>Caked in it!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/NRVOfXVXFpo/caked-in-it.html" />
   <updated>2006-11-16T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/11/16/caked-in-it</id>
   <content type="html">After much deliberation, I have decided to ditch my own framework design in favour of the power of the open source community.

CakePHP is now my preferred choice of PHP framework and my first task is to rebuild Cake Migrations and release it as version 2. I also plan on blogging a lot more, in particular about Cake. CakePHP that is ;)

So stand by for some bad-ass blogging.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/NRVOfXVXFpo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/11/16/caked-in-it.html</feedburner:origLink></entry>
 
 <entry>
   <title>Yahoo Bookmarks uses Symfony PHP Framework</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/xvFSa8WcgUk/yahoo-bookmarks-uses-symfony-php-framework.html" />
   <updated>2006-10-28T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/10/28/yahoo-bookmarks-uses-symfony-php-framework</id>
   <content type="html">The release of the new Yahoo! Bookmarks Beta has been on all the news portals lately. Yahoo! Bookmarks has 20 million users, and is available in 12 languages (and counting). But the real news about the new Yahoo! Bookmarks is that it was built with symfony; one of the most popular PHP frameworks, and one of the many frameworks that I rejected.

Reading news such as this really makes me wonder if I made the right choice.

&lt;a href="http://www.symfony-project.com/weblog/2006/10/28/yahoo-bookmarks-uses-symfony.html"&gt;read more&lt;/a&gt; | &lt;a href="http://digg.com/software/Yahoo_Bookmarks_uses_Symfony_PHP_Framework"&gt;digg story&lt;/a&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/xvFSa8WcgUk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/10/28/yahoo-bookmarks-uses-symfony-php-framework.html</feedburner:origLink></entry>
 
 <entry>
   <title>Bouncing bals in javascript</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/UA4IUIs2j08/bouncing-bals-in-javascript.html" />
   <updated>2006-10-27T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/10/27/bouncing-bals-in-javascript</id>
   <content type="html">Here is a fun example of some of the possibilities of Javascript. &lt;a href="http://wiki.mootools.net/demos/physics"&gt;This MooTools demo&lt;/a&gt; shows how you can grab an object and drag it around and watch it bounce all over the screen. Pretty damn cool!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/UA4IUIs2j08" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/10/27/bouncing-bals-in-javascript.html</feedburner:origLink></entry>
 
 <entry>
   <title>The Pope was just passing on a message</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/GkfZl7i2qns/the-pope-was-just-passing-on-a-message.html" />
   <updated>2006-09-27T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/09/27/the-pope-was-just-passing-on-a-message</id>
   <content type="html">&lt;p&gt;&lt;embed src="http://www.youtube.com/v/16przEWU2MU" width="425" height="350" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/GkfZl7i2qns" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/09/27/the-pope-was-just-passing-on-a-message.html</feedburner:origLink></entry>
 
 <entry>
   <title>Drumming for kids</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/qe0Ilp3pqJw/drumming-for-kids.html" />
   <updated>2006-09-27T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/09/27/drumming-for-kids</id>
   <content type="html">&lt;p&gt;Don't ya just hate it when a 40 year old can do something infinitely better than you can? &lt;embed name="efp" pluginspage="http://www.macromedia.com/go/getflashplayer" align="middle" src="http://www.ifilm.com/efp" width="448" height="365" type="application/x-shockwave-flash" flashvars="flvbaseclip=2772535" bgcolor="000000" quality="high"&gt;&lt;/embed&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/qe0Ilp3pqJw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/09/27/drumming-for-kids.html</feedburner:origLink></entry>
 
 <entry>
   <title>Hamsters recovery by Clarkson</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/yr5Up4s0_eM/hamsters-recovery-by-clarkson.html" />
   <updated>2006-09-26T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/09/26/hamsters-recovery-by-clarkson</id>
   <content type="html">&lt;p&gt;I still can&amp;rsquo;t get my head around all the publicity over the 300mph car crash that nearly killed Richard Hammond; one third of Top Gear&amp;rsquo;s presenting team. But after reading an article &lt;a href="http://www.thesun.co.uk/article/0,,2-2006440317,00.html"&gt;on the Sun newspapers&lt;/a&gt; website by Richard&amp;rsquo;s fellow presenter; Jeremy Clarkson, I can&amp;rsquo;t help but laugh.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/yr5Up4s0_eM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/09/26/hamsters-recovery-by-clarkson.html</feedburner:origLink></entry>
 
 <entry>
   <title>Ajaxified PHPBB</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/y5HUmjRcIWs/ajaxified-phpbb.html" />
   <updated>2006-09-25T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/09/25/ajaxified-phpbb</id>
   <content type="html">If you have not already seen the fruits of &lt;a href="http://www.jackslocum.com/yui"&gt;Jack Slocum�s labours&lt;/a&gt;, then you should take a look at &lt;a href="http://www.jackslocum.com/forum2/"&gt;his impressive attempt&lt;/a&gt; at adding a dash of ajax to the popular � but ever so insecure � PHPBB discussion forum software. Using the &lt;a href="http://developer.yahoo.com/yui/"&gt;Yahoo User Interface library&lt;/a&gt;, it looks and feels just like an email application with the usual three frames of content. Very user friendly. It�s even tempting me to introduce a similar layout to Switchboard (albeit an alternative to the current layout.)
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/y5HUmjRcIWs" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/09/25/ajaxified-phpbb.html</feedburner:origLink></entry>
 
 <entry>
   <title>The funniest TV I have ever seen!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/ur0E7cZ835Y/the-funniest-tv-i-have-ever-seen.html" />
   <updated>2006-09-21T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/09/21/the-funniest-tv-i-have-ever-seen</id>
   <content type="html">&lt;p&gt;No matter how many times I see, it just cracks me up. This clip is taken from the worlds best sitcom; Only Fools and Horses.&amp;nbsp;Enjoy &lt;img src="http://joelmoss.info/images/smile2.gif" /&gt; &lt;/p&gt;

&lt;p&gt;&lt;embed src="http://www.youtube.com/v/KLYvSWJUBb8" width="425" height="350" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/ur0E7cZ835Y" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/09/21/the-funniest-tv-i-have-ever-seen.html</feedburner:origLink></entry>
 
 <entry>
   <title>Is this what Vista can do?</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/LuWiUD0LHzg/is-this-what-vista-can-do.html" />
   <updated>2006-09-15T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/09/15/is-this-what-vista-can-do</id>
   <content type="html">&lt;p&gt;Found this on &lt;a href="http://chris.pirillo.com/"&gt;Chris Pirillo's blog&lt;/a&gt;. Apparantly Windows Vista will be better than this videa shows you using XGL on Linux. Veerrrrry nice! &lt;/p&gt;

&lt;p&gt;&lt;embed src="http://www.youtube.com/v/Cz_2vKq5cZk" width="425" height="350" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/LuWiUD0LHzg" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/09/15/is-this-what-vista-can-do.html</feedburner:origLink></entry>
 
 <entry>
   <title>Ruby gets a site lift</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/8UDUd7hbCPk/ruby-gets-a-site-lift.html" />
   <updated>2006-09-12T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/09/12/ruby-gets-a-site-lift</id>
   <content type="html">Even though I decided to stick with PHP for the foreseeable future, I still keep tabs on Ruby and Rails. This week, the &lt;a href="http://www.ruby-lang.org/"&gt;official Ruby site&lt;/a&gt; got itself a much needed facelift. The old site was very dated and� what�s the word? � red! Well they still use red, but they got some blue aswell now.

It looks good and they have included a nice �Getting Started� section for us Ruby newbies.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/8UDUd7hbCPk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/09/12/ruby-gets-a-site-lift.html</feedburner:origLink></entry>
 
 <entry>
   <title>Rock climbing in your pool</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/dkfBFU723Kw/rock-climbing-in-your-pool.html" />
   <updated>2006-09-12T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/09/12/rock-climbing-in-your-pool</id>
   <content type="html">&lt;p&gt;&lt;img alt="" src="http://blog.scifi.com/tech/pics/iceberg.jpg" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;It&amp;rsquo;s toys like these that really makes you wish you were loaded with cash! But nearly $9000 is a hell of a lot of cash.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/dkfBFU723Kw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/09/12/rock-climbing-in-your-pool.html</feedburner:origLink></entry>
 
 <entry>
   <title>Tooum Switchboard goes live</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/U0OIDwPTs9Y/tooum-switchboard-goes-live.html" />
   <updated>2006-09-08T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/09/08/tooum-switchboard-goes-live</id>
   <content type="html">&lt;p&gt;I am very excited and very proud to announce the immediate launch of &lt;a href="http://tooum.com/"&gt;Tooum&lt;/a&gt; and its very first tool: &lt;a href="http://tooum.com/"&gt;Switchboard&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I won&amp;rsquo;t go into what Switchboard is in this post, but here is a quick excerpt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Switchboard is the world's first fully integrated Blog and Forum solution. It's back-to-basics approach produces a powerful replacement for the hundreds of below par Blog and Forum applications. It's also free and fully hosted!&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Hey it&amp;rsquo;s free and I would love to know what you all think of it. So even if you don&amp;rsquo;t need a forum or blog, or are already happy with what you have, we really would appreciate your feedback. Try it out and let us know on &lt;a href="http://tooum.net/"&gt;Tooum&amp;rsquo;s Switchboard&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/U0OIDwPTs9Y" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/09/08/tooum-switchboard-goes-live.html</feedburner:origLink></entry>
 
 <entry>
   <title>Something a little more sensitive!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/to03X17lGaI/something-a-little-more-sensitive.html" />
   <updated>2006-09-06T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/09/06/something-a-little-more-sensitive</id>
   <content type="html">&lt;p&gt;Me and my wife have been talking about this idea for a few years now, and since the arrival of number three 18 months ago, we decided that three is in fact the magic number.&amp;nbsp; So last week I went to see my doctor about getting a Vasectomy and ending the onslought of the Moss offspring.&lt;/p&gt;

&lt;p&gt;It went quite well, although it was only my GP. He is refering me to the specialist surgeon who apparently spends his every waking hour handling other mens genitals and making the chop!&lt;/p&gt;

&lt;p&gt;So I am awaiting that experience with baited breath. However, I found an article by &lt;a href="http://www.brucelawson.co.uk/"&gt;Bruce Lawson&lt;/a&gt; entitled &lt;a href="http://www.brucelawson.co.uk/index.php/2006/vasectomy"&gt;&amp;ldquo;Would a vasectomy make a vas deferens to me?&amp;rdquo;&lt;/a&gt;&amp;nbsp;and now I am not so sure;&lt;/p&gt;

&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;p&gt;&amp;ldquo;I can see from your wriggling we&amp;rsquo;ll have to put you out with a General&amp;rdquo;, he said, like a Hibernian Dr Mengele, because I flinched as he rolled each of my testicles between his thumb and forefinger. (Incidentally, the fact that the testes hang outside the body encased in paper-thin skin, rather than guarded by closely interlocking bones forming a special subcutaneous scrotal rib-cage, is, in my opinion, the knock-down argument against the theory of &amp;lsquo;&lt;a href="http://en.wikipedia.org/wiki/Intelligent_design"&gt;Intelligent Design&lt;/a&gt;&amp;lsquo;.)&lt;/p&gt;&lt;/blockquote&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/to03X17lGaI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/09/06/something-a-little-more-sensitive.html</feedburner:origLink></entry>
 
 <entry>
   <title>Switchboard delayed by a few days</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/AS6KRJ790as/switchboard-delayed-by-a-few-days.html" />
   <updated>2006-08-30T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/08/30/switchboard-delayed-by-a-few-days</id>
   <content type="html">&lt;p&gt;Tooum Switchboard has been delayed by a few days while we polish of the new Tooum site and the admin interface for Switchboard. We were hoping to go live with it this Friday, but realistically it may well be next week now.&lt;/p&gt;

&lt;p&gt;Anyway, let me give you a quick overview of what will go live for the beta.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It will be a full release with all basic features of all good forum and blog applications.&lt;/li&gt;
&lt;li&gt;It will be free to use now and forever and fully hosted by HPU.&lt;/li&gt;
&lt;li&gt;Customisations and styles will be basic for the beta, but we have some pretty cool customisation ideas for future and&amp;nbsp;final releases.&lt;/li&gt;
&lt;li&gt;Ajax is in heavy use, not because everyone is doing it, but because it makes the user experience much easier and friendly.&lt;/li&gt;
&lt;li&gt;Comments can be made anonymously&lt;/li&gt;
&lt;li&gt;RSS, Atom and other formats will be fully supported. Initially just for new blog and forum posts, but further releases will include feeds for any page.&lt;/li&gt;
&lt;li&gt;Searching across all posts and comments is fully implemented.&lt;/li&gt;
&lt;li&gt;Easy formatting of posts and comments is easily acheived without the need for HTML knowledge. The Markdown format is used and help is provided on how to use it.&lt;/li&gt;
&lt;li&gt;PLUS LOADS MORE&amp;hellip;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;What will be presented in the public beta is a back to basics approach to forum and blog applications. Everything you need to build a highly effective blogging and forum community will be at your fingertips and that is the basis of the service.&lt;/p&gt;

&lt;p&gt;However, plenty more is on the horizon. We will also be releasing some unique and never before seen components for Switchboard, allowing you to extend the functionality of your community beyond the forum and blog. For example, the first component in development that will be ready sometime during the beta, will tie your site directly into your Switchboard. Your visitors will be able to comment and rate any page on your site, and those comments and ratings will be displayed on that page and also within your Switchboard. When you see it, you&amp;rsquo;ll love it.&lt;/p&gt;

&lt;p&gt;So its all go! Expect to see a copy of this post with&amp;nbsp;a few more teasers on the new Tooum.com Switchboard that will go live when the beta launches.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/AS6KRJ790as" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/08/30/switchboard-delayed-by-a-few-days.html</feedburner:origLink></entry>
 
 <entry>
   <title>Darth Vadars New Toy</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/JsoA54tBOVk/darth-vadars-new-toy.html" />
   <updated>2006-08-14T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/08/14/darth-vadars-new-toy</id>
   <content type="html">&lt;p&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/5blbv4WFriM"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/5blbv4WFriM" type="application/x-shockwave-flash" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/JsoA54tBOVk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/08/14/darth-vadars-new-toy.html</feedburner:origLink></entry>
 
 <entry>
   <title>Rebirth</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/nWCaiwLHFSI/rebirth.html" />
   <updated>2006-08-04T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/08/04/rebirth</id>
   <content type="html">&lt;p&gt;Well I suppose you could say that HomepageTools officially became Tooum today. We just replaced the main HPT site with the new Tooum splash page readying for the public beta launch later this month. I have made sure that existing HPT users know what is going on. So if you go to &lt;a href="http://homepagetools.com"&gt;http://homepagetools.com&lt;/a&gt;, you will now see the Tooum splash page, but will also see a short notice about what has happened to HPT.&lt;/p&gt;

&lt;p&gt;The official Tooum Switchboard should also be put online next week, so you can try it out all you want. It will also contain all news and discussions about Tooum and Switchboard. So you won&amp;rsquo;t see many more posts in this Blog about Tooum.&lt;/p&gt;

&lt;p&gt;Until then, don&amp;rsquo;t forget to check out the new &lt;a href="http://switchboard.homepageuniverse.com/"&gt;HomepageUniverse Community&lt;/a&gt; which uses a very early preview version of Switchboard.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/nWCaiwLHFSI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/08/04/rebirth.html</feedburner:origLink></entry>
 
 <entry>
   <title>Switchboard goes live on HPU</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/GvZbtmij388/switchboard-goes-live-on-hpu.html" />
   <updated>2006-08-02T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/08/02/switchboard-goes-live-on-hpu</id>
   <content type="html">&lt;p&gt;The very first release of Switchboard can now be seen in use at &lt;a href="http://switchboard.homepageuniverse.com"&gt;http://switchboard.homepageuniverse.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The HPU:Community will be the exclusive user of Switchboard until the public beta begins later this month (August), and will enable us to run some real world testing and perhaps gauge a little interest and feedback.&lt;/p&gt;

&lt;p&gt;We will also be launching the new Tooum.com site in a few days, which will include all the details about Tooum and Switchboard, aswell as a full public demo of Switchboard.&lt;/p&gt;

&lt;p&gt;So take a sneak peek now &amp;ndash; &lt;a href="http://switchboard.homepageuniverse.com/"&gt;http://switchboard.homepageuniverse.com&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/GvZbtmij388" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/08/02/switchboard-goes-live-on-hpu.html</feedburner:origLink></entry>
 
 <entry>
   <title>New Tooum splash page</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/cycOfUYb-X8/new-tooum-splash-page.html" />
   <updated>2006-08-02T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/08/02/new-tooum-splash-page</id>
   <content type="html">&lt;p&gt;Ok, we&amp;rsquo;ve just put up a new splash page at &lt;a href="http://tooum.com/"&gt;http://tooum.com&lt;/a&gt;&amp;nbsp;with a bit more info on Switchboard. It also features the new and final design of the Tooum logo.&lt;/p&gt;

&lt;p&gt;Don&amp;rsquo;t forget to pre-register!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/cycOfUYb-X8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/08/02/new-tooum-splash-page.html</feedburner:origLink></entry>
 
 <entry>
   <title>Switchboard sneek peak</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/si9a49XaXLA/switchboard-sneek-peak.html" />
   <updated>2006-07-14T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/07/14/switchboard-sneek-peak</id>
   <content type="html">&lt;p&gt;The first tool in Tooum&amp;rsquo;s upcoming arsenal is Switchboard and we hope to replace the current HPU:forums and HPU:Blog with a very early beta version of Switchboard by the end of the month. But until then, I am excited to give you all a sneak peek;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelmoss.info/frontpage.jpg"&gt;&lt;img alt="Switchboard Frontpage" src="http://joelmoss.info/frontpage_thumb.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelmoss.info/forum.jpg"&gt;&lt;img alt="Forum" src="http://joelmoss.info/forum_thumb.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelmoss.info/tags.jpg"&gt;&lt;img alt="Tags" src="http://joelmoss.info/tags_thumb.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelmoss.info/profile.jpg"&gt;&lt;img alt="Profile" src="http://joelmoss.info/profile_thumb.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you haven&amp;rsquo;t already registered your interest of Tooum, wander on over to the splash page at &lt;a href="http://tooum.com/"&gt;http://tooum.com&lt;/a&gt;. We will be updating that page soon with more info on Switchboard.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/si9a49XaXLA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/07/14/switchboard-sneek-peak.html</feedburner:origLink></entry>
 
 <entry>
   <title>MySQL Stored Procedures - We Like!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/7MNpTQkFCmE/mysql-stored-procedures-we-like.html" />
   <updated>2006-07-14T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/07/14/mysql-stored-procedures-we-like</id>
   <content type="html">Just finished reading an &lt;a href="http://hades.phparch.com/ceres/public/article/index.php/art::mysql::sp_programming_mysql_5::part_1/0"&gt;excellent but simple article&lt;/a&gt; all about &lt;a href="http://dev.mysql.com/doc/refman/5.0/en/stored-procedures.html"&gt;MySQL 5�s stored procedures&lt;/a&gt;. Never heard of them prior to reading the article, but I must admit that I am mightily impressed by the simplistic, but powerful nature of stored procedures.
&lt;blockquote&gt;A stored procedure is a set of SQL statements that can be stored in the server. Once this has been done, clients don't need to keep reissuing the individual statements but can refer to the stored procedure instead.&lt;/blockquote&gt;
It�s almost like having all your SQL statements stored in a database table, and being able to run them using a simple function call; CALL HelloWorld&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;; In fact, that is exactly what it is like.

Bit late to use them in &lt;a href="http://tooum.com/"&gt;Switchboard&lt;/a&gt;, but I may use them in some future app.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/7MNpTQkFCmE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/07/14/mysql-stored-procedures-we-like.html</feedburner:origLink></entry>
 
 <entry>
   <title>Cake News</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/_lFJbqeMId8/cake-news.html" />
   <updated>2006-07-10T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/07/10/cake-news</id>
   <content type="html">Just discovered a great resource for bakers of CakePHP. The &lt;a href="http://thinkingphp.org/cakenews/"&gt;CakeNews&lt;/a&gt; site summaries subjects from the latest and greatest sources of news about the CakePHP framework. These include feeds from numerous blogs aswell as the Cake Google Group. It�s a required site for those who use Cake.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/_lFJbqeMId8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/07/10/cake-news.html</feedburner:origLink></entry>
 
 <entry>
   <title>Record Sky TV by sending a text message</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/42QU4rYqC-E/record-sky-tv-by-sending-a-text-message.html" />
   <updated>2006-07-07T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/07/07/record-sky-tv-by-sending-a-text-message</id>
   <content type="html">&lt;p&gt;British satelite television company, Sky has just launched a new service that lets you record any TV program by simply sending a text message with the details of the program you want to watch. They will send a message to your Sky+ PVR and it will record your program. Very nice!&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.stuffmag.co.uk/hotstuffarticlerss.asp?DE_ID=1982"&gt;read more&lt;/a&gt;&amp;nbsp;|&amp;nbsp;&lt;a href="http://digg.com/television/Record_Sky_TV_by_sending_a_text_message"&gt;digg story&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/42QU4rYqC-E" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/07/07/record-sky-tv-by-sending-a-text-message.html</feedburner:origLink></entry>
 
 <entry>
   <title>Carousel display with YUI</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/nSG3hOD_n9k/carousel-display-with-yui.html" />
   <updated>2006-07-07T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/07/07/carousel-display-with-yui</id>
   <content type="html">Yet another fine example of the &lt;a href="http://www.google.co.uk/url?sa=t&amp;amp;ct=res&amp;amp;cd=2&amp;amp;url=http%3A%2F%2Fdeveloper.yahoo.com%2Fyui%2F&amp;amp;ei=qlauRKyHJ6GEiALTsuHoBg&amp;amp;sig2=82DBIb3xHcssLfWrIhTPkw"&gt;Yahoo User Interface&lt;/a&gt; (YUI) has been created by &lt;a href="http://billwscott.com/"&gt;Bill W. Scott&lt;/a&gt;. Knocked out in a weekend, the &lt;a href="http://billwscott.com/carousel/"&gt;Carousel Component&lt;/a&gt; is a scroller than can display selected pictures in a carousel type way. It can be presented vertically or horizontally and can be served client or server side.

Even though I have decided to use Prototype and Scriptaculous for Tooum, seeing things like this keeps tempting me to the other side.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/nSG3hOD_n9k" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/07/07/carousel-display-with-yui.html</feedburner:origLink></entry>
 
 <entry>
   <title>Cake Migrations 1.1</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/iPwzQwi25Uw/cake-migrations-11.html" />
   <updated>2006-07-07T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/07/07/cake-migrations-11</id>
   <content type="html">I have released a new version of Cake Migrations. With thanks to &lt;a href="http://ebroder.net/"&gt;Evan Broder&lt;/a&gt;, Migrations now support additional column types: ENUM and BOOL. It also supports the creation and deltion of Keys and altering columns.

You can get version 1.1 of Cake Migrations from &lt;a href="http://cakeforge.org/snippet/detail.php?type=package&amp;amp;id=15"&gt;CakeForge&lt;/a&gt;. More info on Cake Migrations and what they are can be found in the &lt;a href="http://wiki.cakephp.org/tutorials:cake_migrations"&gt;Cake Wiki&lt;/a&gt;.

Enjoy &lt;img src="http://joelmoss.info/images/smile2.gif" alt="" /&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/iPwzQwi25Uw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/07/07/cake-migrations-11.html</feedburner:origLink></entry>
 
 <entry>
   <title>Ive stumbled upon it all!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/SrEX6PUdPZ0/ive-stumbled-upon-it-all.html" />
   <updated>2006-07-04T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/07/04/ive-stumbled-upon-it-all</id>
   <content type="html">&lt;p&gt;Found a lost &lt;a href="http://www.techcrunch.com/2006/07/03/the-supernova-12/"&gt;article&lt;/a&gt; on Techcrunch just a few minutes ago about 12 up and coming web 2.0 startups. A few interesting ones, but one that caught my eye was a community driven site that pushes sites to you based on your interests. &lt;a href="http://stumbleupon.com/"&gt;StumbleUpon&lt;/a&gt;&amp;nbsp;uses a browser toolbar (currently only available for Firefox) to show you new and interesting sites. Simply click the Stumble button and it takes you to a site that should excite you a little.&lt;/p&gt;

&lt;p&gt;I love it! I just can&amp;rsquo;t stop clicking that little button. And most of the sites it shows me have been exactly what I am interested in, so I clicked the &amp;ldquo;I like it&amp;rdquo; button on the sites I like, which then added it to my &lt;a href="http://joelmoss.stumbleupon.com/"&gt;fave pages&lt;/a&gt; found using StumbleUpon.&lt;/p&gt;

&lt;p&gt;I can then even add this list to my Blog of feed reader using the supplied RSS feeds.&lt;/p&gt;

&lt;p&gt;You really gotta admire the simplicity of this model and it just makes me wish that I had thought of it first.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/SrEX6PUdPZ0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/07/04/ive-stumbled-upon-it-all.html</feedburner:origLink></entry>
 
 <entry>
   <title>Tooum.com splash page</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/zRmO2e-TT5M/tooumcom-splash-page.html" />
   <updated>2006-06-28T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/06/28/tooumcom-splash-page</id>
   <content type="html">&lt;p&gt;The first tool for &lt;a href="http://tooum.com/"&gt;Tooum&lt;/a&gt; is coming along very nicely and we should be ready to start an early public beta test of Switchboard next month. The plan is to replace the current HPU forums and blog with Switchboard, so as to allow real world usage and testing.&lt;/p&gt;

&lt;p&gt;Until then, I have put up a simple splash page&amp;nbsp;at &lt;a href="http://tooum.com/"&gt;toom.com&lt;/a&gt;&amp;nbsp;so you can register your interest.&lt;/p&gt;

&lt;p&gt;I will post more info about Switchboard very soon, including some screenshots.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/zRmO2e-TT5M" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/06/28/tooumcom-splash-page.html</feedburner:origLink></entry>
 
 <entry>
   <title>Easy Peasy Table sorting</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/40kWlQOCE-M/easy-peasy-table-sorting.html" />
   <updated>2006-06-22T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/06/22/easy-peasy-table-sorting</id>
   <content type="html">I love it when all you need to to acheive something, is to simply drop in a couple of javascript files and add a class name to an element. With the &lt;a href="http://www.workingwith.me.uk/articles/scripting/standardista_table_sorting"&gt;Standardista Table Sorting module&lt;/a&gt; you can do just that.

Instant table sorting with very little fuss!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/40kWlQOCE-M" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/06/22/easy-peasy-table-sorting.html</feedburner:origLink></entry>
 
 <entry>
   <title>Javascript World Cup</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/JpQSlTgAqNk/javascript-world-cup.html" />
   <updated>2006-06-20T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/06/20/javascript-world-cup</id>
   <content type="html">Just found an &lt;a href="http://www.sitepoint.com/article/javascript-library"&gt;excellent article&lt;/a&gt; rounding up the 4 main Javascript libraries/frameworks on the as always reliable &lt;a href="http://sitepoint.com/"&gt;SitePoint.com&lt;/a&gt;.

The two page article delves into the nitty gritty of the Prototype, Yahoo User Interface, Mochikit and Dojo libraries, and really does tell you quite a lot about the pros and cons of each. It gives nice little examples of each library�s best bits and adds what maybe missing from each.

I have already tried each of these prior to reading this article and had more or less decided on Prototype/Scriptaculous for &lt;a href="http://tooum.com/"&gt;Tooum&lt;/a&gt; and probably PXP, but now I want to use all of them.

But we shall see.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/JpQSlTgAqNk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/06/20/javascript-world-cup.html</feedburner:origLink></entry>
 
 <entry>
   <title>Tooum is announced</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/pVIaq7jxAN4/tooum-is-announced.html" />
   <updated>2006-06-13T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/06/13/tooum-is-announced</id>
   <content type="html">&lt;p&gt;Finally, we&amp;rsquo;re getting somewhere with the development and rebirth of &lt;a href="http://homepagetools.com/"&gt;HomepageTools&lt;/a&gt;. &lt;a href="http://tooum.com/"&gt;Tooum&lt;/a&gt; has been announced as HPT&amp;rsquo;s successor and is in active development right now.&lt;/p&gt;

&lt;p&gt;Although I have been hailing the might of &lt;a href="http://cakephp.org/"&gt;CakePHP&lt;/a&gt;, we decided to go with our own framework designed to cater for Tooum. Mainly because Tooum is gonna be pretty complicated, so CakePHP will be used for the first time on other apps.&lt;/p&gt;

&lt;p&gt;We have a simple splash page up at &lt;a href="http://tooum.com/"&gt;Tooum.com&lt;/a&gt;&amp;nbsp;and we are working on our first tool; a forum/blog application codenamed Switchboard, and is&amp;nbsp;the replacement for&amp;nbsp;the aging UltraBoard.&lt;/p&gt;

&lt;p&gt;Switchboard is gonna be cool and will be first seen and used as the forum/blog for HomepageUniverse. This will allow us to test it in a real world environment and hopefully gain feedback from real users.&lt;/p&gt;

&lt;p&gt;Ooh it&amp;rsquo;s exciting man. I will post again with more as I have it.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/pVIaq7jxAN4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/06/13/tooum-is-announced.html</feedburner:origLink></entry>
 
 <entry>
   <title>Yahoo and their UI</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/k2GJEe29cl8/yahoo-and-their-ui.html" />
   <updated>2006-05-16T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/05/16/yahoo-and-their-ui</id>
   <content type="html">I am increasingly mindful of the need for the use of Ajax and javascript effects within my upcoming projects. I have used &lt;a href="http://prototype.conio.net/"&gt;Prototype&lt;/a&gt; before, and &lt;a href="http://script.aculo.us/"&gt;Scriptaculous&lt;/a&gt; is just great for the job. But it seems that Yahoo are really doing a good job with their open source and community pushed initiatives.

&lt;a href="http://yuiblog.com/blog/2006/05/15/peeling-back-the-homepage-beta/"&gt;Peeling Back the Interface of the Yahoo! Home Page Beta&lt;/a&gt; explains the extensive use of the &lt;a href="http://developer.yahoo.com/yui/"&gt;Yahoo User Interface library and CSS Tools&lt;/a&gt; within Yahoo's public beta of their homepage. Yahoo's UI Library really is competing to gain favour with us Prototype users and Ajax fans. And to be honest, it's good stiff. Yahoo's new homepage is a great testament to that.

So I may have to rething my usage of Prototype and look at the Yahoo UI, coz it really does have its advantages.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/k2GJEe29cl8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/05/16/yahoo-and-their-ui.html</feedburner:origLink></entry>
 
 <entry>
   <title>Final release (v1.0) of Cake Migrations</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/YgnJJpvbsrw/final-release-v10-of-cake-migrations.html" />
   <updated>2006-05-16T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/05/16/final-release-v10-of-cake-migrations</id>
   <content type="html">Didn't take me too long, so here is the &lt;a href="http://cakeforge.org/snippet/detail.php?type=package&amp;amp;id=15"&gt;final version of Cake Migrations&lt;/a&gt; in all its glory. As well as support for the creation and dropping of tables, the main changes are as follows:
&lt;ul&gt;
	&lt;li&gt;Add/drop columns&lt;/li&gt;
	&lt;li&gt;insert and remove test data (rows)&lt;/li&gt;
	&lt;li&gt;run raw SQL queries&lt;/li&gt;
	&lt;li&gt;rest the migration DB schema and destroy migration files&lt;/li&gt;
&lt;/ul&gt;
I think that pretty much covers all the bases, which is why I have announced it as the final version 1.0.

I have also updated the &lt;a href="http://wiki.cakephp.org/tutorials:cake_migrations"&gt;Wiki&lt;/a&gt; a little and included a few examples of the YAML migration files.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/YgnJJpvbsrw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/05/16/final-release-v10-of-cake-migrations.html</feedburner:origLink></entry>
 
 <entry>
   <title>A taste of Vista: Visual Task tips</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/swRUdf6lz7Y/a-taste-of-vista-visual-task-tips.html" />
   <updated>2006-05-16T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/05/16/a-taste-of-vista-visual-task-tips</id>
   <content type="html">&lt;p&gt;&lt;img border="0" align="left" width="276" src="/images/visual_tasktips.jpg" height="223" style="width: 276px; height: 223px" /&gt;&lt;/p&gt;

&lt;p&gt;A little taster of things to came in the new Windows Vista and a touch of what MAC users have enjoyed for a while.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.visualtasktips.com/"&gt;Visual Task Tips&lt;/a&gt; display a small thumbnail preview of each program running in your task bar. Simply roll over any program in your task bar and you get a great looking screen shot of that application.&lt;/p&gt;

&lt;p&gt;Completely useless, but pretty cool ;)&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/swRUdf6lz7Y" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/05/16/a-taste-of-vista-visual-task-tips.html</feedburner:origLink></entry>
 
 <entry>
   <title>Cake Migrations</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/ADr2e3MOZuI/cake-migrations.html" />
   <updated>2006-05-15T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/05/15/cake-migrations</id>
   <content type="html">Ok, so I do sometimes go headfirst into the deep stuff at times, but it's not always bad! Before I even created a working app with &lt;a href="http://cakephp.org"&gt;CakePHP&lt;/a&gt;, I decided to have a crack at contributing to the project itself. So I created Cake Migrations; a direct port of &lt;a href="http://rubyonrails.com"&gt;Ruby on Rails&lt;/a&gt; database &lt;a href="http://wiki.rubyonrails.org/rails/pages/ActiveRecordMigration"&gt;migrations&lt;/a&gt;.

Migrations are one of the main features I love about RoR, so I wanted to bring them across and use the same functionality with Cake. Migrations are a great way of effectively running a version control system for your database while developing apps in Cake. They really do make a difference, especially when developing as part of a team. To ensure you have the latest database schema, simply run the Migrate CLI script:
&lt;blockquote&gt;php migrate.php&lt;/blockquote&gt;
and it does it for you. Easy peasy!

You can get the snippet from the &lt;a href="http://cakeforge.org/snippet/detail.php?type=package&amp;amp;id=15"&gt;CakeForge package&lt;/a&gt;, and I created a quick &lt;a href="http://wiki.cakephp.org/tutorials:cake_migrations"&gt;Wiki page&lt;/a&gt; to explain how Migrations work.

I hope to create a more informative and permanent page right here in my Blog, so keep watching. Hey and let me know if you use Migrations.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/ADr2e3MOZuI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/05/15/cake-migrations.html</feedburner:origLink></entry>
 
 <entry>
   <title>Dont like that one!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/rd91Fvvr20g/dont-like-that-one.html" />
   <updated>2006-05-14T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/05/14/dont-like-that-one</id>
   <content type="html">&lt;p&gt;I think I just got a little fed up of &lt;a href="http://blogger.com"&gt;Blogger&lt;/a&gt; and its lack of features and customisation (I like customisation). So here we have the all new Blog powered by &lt;a href="http://wordpress.org"&gt;WordPress&lt;/a&gt;. Same colours I know, but I will be playing with that tomorrow. I like the layout a lot better and I have already installed some cool plugins. Oh, and we got tags now too!&lt;/p&gt;

&lt;p&gt;Hope you like it.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/rd91Fvvr20g" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/05/14/dont-like-that-one.html</feedburner:origLink></entry>
 
 <entry>
   <title>If it aint broke</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/5EAiU4xhuJw/if-it-aint-broke.html" />
   <updated>2006-05-13T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/05/13/if-it-aint-broke</id>
   <content type="html">&lt;p&gt;HomepageTools is up for a very long awaited overhaul, so over the last few months, I have been flitting from one rapid development framework to the other, trying to find a solution that would improve, speed up and excite my development experiences.&lt;/p&gt;

&lt;p&gt;I&amp;#39;m a PHP guy at heart, and always have been. &lt;a href="http://homepageuniverse.com"&gt;HPU&lt;/a&gt; and &lt;a href="http://homepagetools.com"&gt;HPT&lt;/a&gt; are coded entirely in PHP and I believe it really has earned its title as the webs most popular scripting language. But when I keep hearing about these new fangled frameworks popping up all over the place, supposedly set to ease my development time in half, etc. etc., well I just gotta take a look. So that is what I have been doing. I am pretty sure I have tried them all; Symfony, CakePHP, BinaryCloud, PHP on Trax, CodeIgniter, QCodo, Seagull and they all have their own strengths and weaknesses. Heck, I even started writing my own framework at one point. Pretty chuffed with it too, but it left me wondering why I was writing a brand new framework from scratch, when there are already some perfectly (almost) good ones out there.&lt;/p&gt;

&lt;p&gt;What really sparked all this off, was my discovery of &lt;a href="http://rubyonrails.com"&gt;Ruby on Rails&lt;/a&gt;. And I have probably spent the most time on RoR than all the others. But the problem (albeit one of the only problems) was that Rails is written in an entirely different language. So I found myself having to learn not only the framework, but an all new alien language.&lt;/p&gt;

&lt;p&gt;What I had to do was figure out whether it was worth doing such a thing. At the end of the day, there is nothing wrong with PHP and it has served me well for a long time. It is constantly developing and has excellent community support (I don&amp;#39;t think I have ever really had a problem that could be solved quickly and easily). Although Rails is also constantly developing, it is still very young and its documentation and community reflects that youthfulness.&lt;/p&gt;

&lt;p&gt;So I am sticking with good old PHP!&lt;/p&gt;

&lt;p&gt;OK. Now what? Oh yeah. I still gotta decide which PHP Framework to use, that is if I decide to actually use one. I could stick to coding everything from scratch using my trusty Textpad; I could carry on writing my own framework, or I could choose one of the many open source frameworks competing for my attention.&lt;/p&gt;

&lt;p&gt;So you know what I decided on? The first PHP framework I found and really played with; &lt;a href="http://cakephp.org"&gt;CakePHP&lt;/a&gt;. And why? It&amp;#39;s got the best community support and docs, and also seems to be more mature than the rest. It&amp;#39;s also still simple and not bloated, yet still has some very useful tools and idioms which could really improve my development.&lt;/p&gt;

&lt;p&gt;So Cake it is, and will be used for most, if not all of my development. The all new HomepageTools (soon to be renamed!?) will be the first to use it.&lt;/p&gt;

&lt;p&gt;I&amp;#39;l be sure to let you all know how it goes.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/5EAiU4xhuJw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/05/13/if-it-aint-broke.html</feedburner:origLink></entry>
 
 <entry>
   <title>Colour Wheel</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/aqnAsl3oZmE/colour-wheel.html" />
   <updated>2006-04-27T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/04/27/colour-wheel</id>
   <content type="html">As you may have noticed, I just added &lt;a href="http://www.webwhirlers.com/colors/spinwheel.asp"&gt;this site&lt;/a&gt; to my Delicious and will officially be making it my most favourite site in the whole wide world.

Just click the button and spin the colour wheel, then marvel at the colourful delights that appear before you. A colour scheme for your next design in seconds!

Simply beautiful!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/aqnAsl3oZmE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/04/27/colour-wheel.html</feedburner:origLink></entry>
 
 <entry>
   <title>Custom Ajax effects with Scriptaculous</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/4oDxrabmew0/custom-ajax-effects-with-scriptaculous.html" />
   <updated>2006-04-19T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/04/19/custom-ajax-effects-with-scriptaculous</id>
   <content type="html">Check out this &lt;a href="http://www.thinkvitamin.com/features/ajax/create-your-own-ajax-effects"&gt;excellent tutorial&lt;/a&gt; from Thomas Fuchs, the man who built &lt;a href="http://script.aculo.us"&gt;Scriptaculous&lt;/a&gt;. It takes you through how to wroite your own custom ajax effect, and ends up producing this really nice &lt;a href="http://www.thinkvitamin.com/downloads/cashregister/cashregister.html"&gt;cash register calculation effect&lt;/a&gt;.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/4oDxrabmew0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/04/19/custom-ajax-effects-with-scriptaculous.html</feedburner:origLink></entry>
 
 <entry>
   <title>..ooh, and one of these</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/MJ2IO4RC50E/ooh-and-one-of-these.html" />
   <updated>2006-04-07T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/04/07/ooh-and-one-of-these</id>
   <content type="html">&lt;p&gt;&lt;a href="http://joelmoss.info/uploaded_images/TTC060005-701046.jpg"&gt;&lt;img border="0" src="http://joelmoss.info/uploaded_images/TTC060005-799122.jpg" /&gt;&lt;/a&gt;
&lt;a href="http://joelmoss.info/uploaded_images/TTC060006-795240.jpg"&gt;&lt;img border="0" src="http://joelmoss.info/uploaded_images/TTC060006-793159.jpg" /&gt;&lt;/a&gt;
&lt;a href="http://joelmoss.info/uploaded_images/TTC060007-788253.jpg"&gt;&lt;img border="0" src="http://joelmoss.info/uploaded_images/TTC060007-786613.jpg" /&gt;&lt;/a&gt;
&lt;a href="http://joelmoss.info/uploaded_images/TTC060004-752180.jpg"&gt;&lt;img border="0" src="http://joelmoss.info/uploaded_images/TTC060004-750595.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/MJ2IO4RC50E" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/04/07/ooh-and-one-of-these.html</feedburner:origLink></entry>
 
 <entry>
   <title>I want one!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/JDPiv0uRnbE/i-want-one.html" />
   <updated>2006-04-07T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/04/07/i-want-one</id>
   <content type="html">&lt;p&gt;Now this is just cool!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelmoss.info/uploaded_images/7350188_f00832699c-756177.jpg"&gt;&lt;img border="0" src="http://joelmoss.info/uploaded_images/7350188_f00832699c-753440.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/JDPiv0uRnbE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/04/07/i-want-one.html</feedburner:origLink></entry>
 
 <entry>
   <title>So glad I did, but gotta find more time for fun</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/unL6vXfCADM/so-glad-i-did-but-gotta-find-more-time-for-fun.html" />
   <updated>2006-03-30T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/03/30/so-glad-i-did-but-gotta-find-more-time-for-fun</id>
   <content type="html">&lt;p&gt;Speaking of gaming. We sold the wife&amp;#39;s car last week, so I thought I would treat myself. So I went out and bought an Xbox 360 and I am so glad I did. Everything about it, from the wireless controllers to the Xbox Live service is wicked. Still waiting for the killer game that can really show off what the box can do, but at the moment I&amp;#39;m happy with Ghost Recon and Burnout Revenge. The only problem I have now is finding the time to play it and tearing my 8 year old son away from it.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/unL6vXfCADM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/03/30/so-glad-i-did-but-gotta-find-more-time-for-fun.html</feedburner:origLink></entry>
 
 <entry>
   <title>PS3 show off!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/2LrssSQ03qQ/ps3-show-off.html" />
   <updated>2006-03-30T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/03/30/ps3-show-off</id>
   <content type="html">&lt;p&gt;Been a while I know, so wanted to come back with &lt;a href="http://www.gametrailers.com/player.php?id=9867&amp;amp;pl=game&amp;amp;type=mov"&gt;this&lt;/a&gt;. It&amp;#39;s an extremely impressive movie of an upcoming game for the PS3. The physics engine it uses are pretty damn cool.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/2LrssSQ03qQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/03/30/ps3-show-off.html</feedburner:origLink></entry>
 
 <entry>
   <title>Lightbox v2.0</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/JBtoJqIY1j0/lightbox-v20.html" />
   <updated>2006-03-30T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/03/30/lightbox-v20</id>
   <content type="html">Every day I find another cool application of using javascript, and in particular the excellent Prototype and equally cool Scriptaculous. Today I found a new implementation of the lightbox concept. &lt;a href="http://www.huddletogether.com/projects/lightbox2/"&gt;This&lt;/a&gt; just looks and feels so nice.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/JBtoJqIY1j0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/03/30/lightbox-v20.html</feedburner:origLink></entry>
 
 <entry>
   <title>DabbleDB Screencast</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/6hjl05Qlu3c/dabbledb-screencast.html" />
   <updated>2006-03-18T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/03/18/dabbledb-screencast</id>
   <content type="html">&lt;p&gt;It&amp;#39;s apps like these that inspire me. &lt;a href="http://dabbledb.com/"&gt;DabbleDB&lt;/a&gt; is an online database/spreadsheet application that is still in private beta, but recently won best of show at &lt;a href="http://undertheradarblog.com"&gt;&amp;#39;Under the Radar: Why Web 2.0 matters&amp;#39;&lt;/a&gt; by simply showing this 7 minute screencast demo. Even though I already heard of these guys, this is the first time that I actually get to see what DabbleDB is. And I gotta tell ya - it&amp;#39;s very impressive!&lt;/p&gt;

&lt;p&gt;So I&amp;#39;m waiting with baited breath for the public release or beta.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/6hjl05Qlu3c" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/03/18/dabbledb-screencast.html</feedburner:origLink></entry>
 
 <entry>
   <title>Heat Mapping</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/f2B2l9VSej8/heat-mapping.html" />
   <updated>2006-03-09T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/03/09/heat-mapping</id>
   <content type="html">&lt;p&gt;Found a very promising site today; &lt;a href="http://crazyegg.com"&gt;CrazyEgg&lt;/a&gt; seems to be an analytics service for sites, but with a twist. It will show you a screenshot of your site, but with heat patterns overlaid. These heat patterns let you know what parts of your site are cliucked on the most. The hotter the area, the more it is clicked. Very nice idea!&lt;/p&gt;

&lt;p&gt;I&amp;#39;ve already registered my interest and await more info.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/f2B2l9VSej8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/03/09/heat-mapping.html</feedburner:origLink></entry>
 
 <entry>
   <title>FarCry - Mollio</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/R_LuIsgAFME/farcry-mollio.html" />
   <updated>2006-03-08T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/03/08/farcry-mollio</id>
   <content type="html">A really nice and very simple CSS style template has been made &lt;a href="http://www.mollio.org/"&gt;available&lt;/a&gt;. It's free and you can download it from their site. They also have full demos.

&lt;a href="http://www.mollio.org/"&gt;FarCry - Mollio&lt;/a&gt;: "Mollio is a simple set of html/css templates. The aim was to create a set of page templates that use css for layout as well as some sample basic content which has also had some css applied. It's definitely a work in progress."

Now that was nce of them wasn't it?
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/R_LuIsgAFME" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/03/08/farcry-mollio.html</feedburner:origLink></entry>
 
 <entry>
   <title>Firefox made $72M last year?!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/bfi8MF6vJjw/firefox-made-72m-last-year.html" />
   <updated>2006-03-07T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/03/07/firefox-made-72m-last-year</id>
   <content type="html">&lt;p&gt;Absolutely unbelievable, but apparantly, Mozilla, the makers of fast growing Firefox browser made $72 million last year. This was mainly collected from Google and other affiliates. If you search using the default search bix on top right of Firefox, you end up at Google and if you click on any of the sponsored ads, Mozilla get 80% of the ads fees.&lt;/p&gt;

&lt;p&gt;So, anyone fancy making a browser and a couple of million?&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/bfi8MF6vJjw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/03/07/firefox-made-72m-last-year.html</feedburner:origLink></entry>
 
 <entry>
   <title>Teenage ignorance</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/_O3b2ZJnCMo/teenage-ignorance.html" />
   <updated>2006-03-03T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/03/03/teenage-ignorance</id>
   <content type="html">&lt;p&gt;&lt;a href="http://news.bbc.co.uk/2/hi/americas/4767888.stm"&gt;You gotta laugh at this one&lt;/a&gt;. A school group visits a museum in Detroit and one of the teenage boys can&amp;#39;t find a bin for his chewing gum, so he decides to stick it to one of the paintings. Turns out that this particular painting is worth over $1.5 million!!&lt;/p&gt;

&lt;p&gt;&amp;quot;The boy, who visited the Detroit Institute of Arts with a school group, has now been suspended by teachers.&amp;quot;&lt;/p&gt;

&lt;p&gt;He&amp;#39;s gotta be kicking himself now.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/_O3b2ZJnCMo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/03/03/teenage-ignorance.html</feedburner:origLink></entry>
 
 <entry>
   <title>Getting Real: The smarter, faster, easier way to build a successful web application</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/CFvD6G6ZMgM/getting-real-the-smarter-faster-easier-way-to-build-a-successful-web-application.html" />
   <updated>2006-03-02T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/03/02/getting-real-the-smarter-faster-easier-way-to-build-a-successful-web-application</id>
   <content type="html">The guys over at &lt;a href="http://www.37signals.com/"&gt;37Signals&lt;/a&gt; really are doing something right. Not content with launching a &lt;a href="http://rubyonrails.com/"&gt;masively popular open-source web application framework&lt;/a&gt;, aswell as five of the web's most popular Web2.0 applications; they have now decided to let us all in on the act and have written a book on how they do it.

&lt;a href="https://gettingreal.37signals.com/"&gt;Getting Real: The smarter, faster, easier way to build a successful web application&lt;/a&gt;; is a 171 page PDF book, detailing "the business, design, programming, and marketing principles of 37signals. The book is packed with keep-it-simple insights, contrarian points of view, and unconventional approaches to software design. This is not a technical book or a design tutorial, it's a book of ideas."

So who am I to knock the in crowd away! I'm about to buy a copy. Keep it here for a review and evidence that your $19 well earned dollars will be put to good use.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/CFvD6G6ZMgM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/03/02/getting-real-the-smarter-faster-easier-way-to-build-a-successful-web-application.html</feedburner:origLink></entry>
 
 <entry>
   <title>Deal done on .com domain future</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/vApPCbtYq6Q/deal-done-on-com-domain-future.html" />
   <updated>2006-03-02T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/03/02/deal-done-on-com-domain-future</id>
   <content type="html">&lt;p&gt;Not good news:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://news.bbc.co.uk/2/hi/technology/4763606.stm"&gt;BBC NEWS Technology Deal done on .com domain future&lt;/a&gt;: &amp;quot;The deal gives US firm Verisign control of .com until 2012 and lets it raise prices in at least four of the next six years.&amp;quot;&lt;/p&gt;

&lt;p&gt;It&amp;#39;s all politics, but I say give control of ICANN to the UN.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/vApPCbtYq6Q" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/03/02/deal-done-on-com-domain-future.html</feedburner:origLink></entry>
 
 <entry>
   <title>Prototype cheat sheet</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/b7o_HOT1zlQ/prototype-cheat-sheet.html" />
   <updated>2006-02-20T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/02/20/prototype-cheat-sheet</id>
   <content type="html">Just found this great little at-a-glance Prototype reference sheet (cheat-sheet). Very useful.

&lt;a href="http://www.snook.ca/archives/prototype1280.png"&gt;&lt;img src="http://www.snook.ca/archives/prototype1280.png" border="0" alt="" /&gt;&lt;/a&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/b7o_HOT1zlQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/02/20/prototype-cheat-sheet.html</feedburner:origLink></entry>
 
 <entry>
   <title>Can you see what it is yet?</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/Woa8DySSADA/can-you-see-what-it-is-yet.html" />
   <updated>2006-02-19T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/02/19/can-you-see-what-it-is-yet</id>
   <content type="html">&lt;p&gt;Now &lt;a href="http://www.christofwagner.com/"&gt;here&lt;/a&gt; is a truly impressive site that could almost fool you into thinking that it was done with Flash. But no! All is achieved with a little (or probably a lot) of help from &lt;a href="http://script.aculo.us/"&gt;Scriptaculous&lt;/a&gt; and &lt;a href="http://prototype.conio.net/"&gt;Prototype&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/Woa8DySSADA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/02/19/can-you-see-what-it-is-yet.html</feedburner:origLink></entry>
 
 <entry>
   <title>Yahoo keeps going into open source and Web2.0</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/TpiH2I66_n8/yahoo-keeps-going-into-open-source-and-web20.html" />
   <updated>2006-02-14T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/02/14/yahoo-keeps-going-into-open-source-and-web20</id>
   <content type="html">&lt;a href="http://joelmoss.info/images/yahoo_devnet.gif"&gt;&lt;img src="http://joelmoss.info/images/yahoo_devnet.gif" border="0" alt="" /&gt;&lt;/a&gt;

This is great news. I knew &lt;a href="http://yahoo.com"&gt;Yahoo&lt;/a&gt; were actively participating in the open source community by proving a whole bunch of &lt;a href="http://developer.yahoo.net/"&gt;API's&lt;/a&gt; for their various services, but when a company the size of Yahoo releases a library of their own in house UI, you know they are doing something right.

Yahoo have really been pushing the whole Web2.0 thing and by opening up the sources to their &lt;a href="http://developer.yahoo.net/yui/index.html"&gt;UI library&lt;/a&gt; (that includes visual effects, connection handlers - think ajax -, dom handlers, and drag-and-drop controls) under a BSD license, they have opened up their company to a lot more users and developers - including me. I found myself really delving deep into their Developer Network pages and found some cool things, including &lt;a href="http://widgets.yahoo.com/"&gt;Yahoo Widgets&lt;/a&gt;. (my brain in racing with ideas for new Widgets already. Watch out HPU users!)

They have even pleased me even more by publishing a list of &lt;a href="http://developer.yahoo.net/ypatterns/index.php"&gt;design patterns&lt;/a&gt; that they use themselves. Briefly explaining the reason and need for the pattern and how it is acheived. Although it doesn't go into any great detail, you clearly get the point.

Yahoo, you've really stepped up to the mark. Thanks!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/TpiH2I66_n8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/02/14/yahoo-keeps-going-into-open-source-and-web20.html</feedburner:origLink></entry>
 
 <entry>
   <title>Mochikit meltdown</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/2pYIbGsFOEc/mochikit-meltdown.html" />
   <updated>2006-02-13T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/02/13/mochikit-meltdown</id>
   <content type="html">During the development of the new PXP hosting system for &lt;a href="http://homepageuniverse.com/ref/joelmoss.info"&gt;HomepageUniverse&lt;/a&gt;, I have been looking into all the many AJAX and javascript toolkits that are out there. We've tested the usual suspects, including &lt;a href="http://prototype.conio.net/"&gt;Prototype&lt;/a&gt;, &lt;a href="http://script.aculo.us/"&gt;Scriptaculous&lt;/a&gt;, &lt;a href="http://moofx.mad4milk.net/"&gt;Moo.FX&lt;/a&gt; and so on, but this morning I discovered &lt;a href="http://mochikit.com"&gt;Mochikit&lt;/a&gt;; another lightweight javascript toolkit.

So why I am piping on about yet another AJAX toolkit? Just take a look at the &lt;a href="http://mochikit.com/screencasts/MochiKit_Intro-1.mov"&gt;screencast/demo&lt;/a&gt; that they have on &lt;a href="http://mochikit.com"&gt;their site&lt;/a&gt;, and you will see why.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/2pYIbGsFOEc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/02/13/mochikit-meltdown.html</feedburner:origLink></entry>
 
 <entry>
   <title>From crop circles to crop words!?</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/yXkMAPCL_W8/from-crop-circles-to-crop-words.html" />
   <updated>2006-02-11T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/02/11/from-crop-circles-to-crop-words</id>
   <content type="html">&lt;p&gt;First of all, &lt;a href="http://maps.google.co.uk/maps?f=q&amp;amp;hl=en&amp;amp;t=k&amp;amp;ll=53.538774,-1.346804&amp;amp;spn=0.000875,0.002626&amp;amp;t=k"&gt;who put that there&lt;/a&gt;, and secondly, who found it?&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/yXkMAPCL_W8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/02/11/from-crop-circles-to-crop-words.html</feedburner:origLink></entry>
 
 <entry>
   <title>Play Lemmings online</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/yya_m1lX07U/play-lemmings-online.html" />
   <updated>2006-02-10T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/02/10/play-lemmings-online</id>
   <content type="html">&lt;p&gt;After I heard about the classic PC puzzler; Lemmings being resurrected for the PSP, I was gutted that I didn&amp;#39;t have a PSP. But I quickly got over that today. I found an &lt;a href="http://www.elizium.nu/scripts/lemmings/"&gt;online version&lt;/a&gt; of it! YIPPEE (as the Lemmings say).&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/yya_m1lX07U" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/02/10/play-lemmings-online.html</feedburner:origLink></entry>
 
 <entry>
   <title>Lists of resources with Listible</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/Rdgqt71RIS0/lists-of-resources-with-listible.html" />
   <updated>2006-02-08T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/02/08/lists-of-resources-with-listible</id>
   <content type="html">&lt;p&gt;This is a nice little idea expanding upon the social bookmarking and &lt;a href="http://digg.com"&gt;Digg&lt;/a&gt; ideas. Listible is a Web2.0 site that lists lists! (well that got you confused didn&amp;#39;t it?). I think we should let the people themselves explain:&lt;/p&gt;

&lt;blockquote&gt;Listible is a new way to get relevant resources quickly.

By using Web 2.0 features such as AJAX, folksonomy (tagging), social elements such as voting/commenting and the listible&amp;#39;s listonomy (listing), resources can be sorted in a way that will be digestible. You can search what you need quick. You can contribute your resources easier.

Why do we need tagging, voting and listing to sort resources?

Tagging is not the full answer. Tags can give you categorization, but it could not give you a destination. If you are trying to find resources on fixing CSS for IE browser&amp;#39;s CSS bugs, usually you go to css tag, and very high chance that you will get millions of resources that is not about anything on IE browser bugs. You can try to find information with css joined with ie tags, but how can we know everyone uses both tags?

Voting cannot be the only answer for relevancy. Even though the most popular resources are on the top, if the system does not have a way to differentiate varies topics, you still wouldn&amp;#39;t find any resources easily.

Listing combined with tagging and voting gives you a greater relevancy. Finding a list called &amp;quot;Resources related to IE browser CSS bugs&amp;quot; tagged with css is easier. In each list, community can provide any relevant URLs. The most relevant and popular resource will be sorted on the top, thanks to the voting system. Is this resource listible? If it is, then you are sharing the resources to the right person. This is listible all about.

There are so many different ways you can use the listible system. The sky is the only limit here.&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://listible.com"&gt;Take a look&lt;/a&gt;, nice idea.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/Rdgqt71RIS0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/02/08/lists-of-resources-with-listible.html</feedburner:origLink></entry>
 
 <entry>
   <title>CSS Page Generator</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/X1bBVzzB9FE/css-page-generator.html" />
   <updated>2006-02-08T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/02/08/css-page-generator</id>
   <content type="html">Want a quick and easy way of creating a 1-3 columned CSS page? Then take a look at the CSS Generator over at &lt;a href="http://www.positioniseverything.net/articles/pie-maker/pagemaker_form.php"&gt;Position Is Everything&lt;/a&gt;. Simply enter your chosen values in each of the form fields and click submit. Up pops a new window with a full CSS only page based on what you entered. It will even insert comments directly into the CSS o explain to you what each part does. Nice!
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/X1bBVzzB9FE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/02/08/css-page-generator.html</feedburner:origLink></entry>
 
 <entry>
   <title>China: my next holiday</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/1uReip-RAE4/china-my-next-holiday.html" />
   <updated>2006-02-08T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/02/08/china-my-next-holiday</id>
   <content type="html">&lt;p&gt;Now here&amp;#39;s something you don&amp;#39;t see everyday...&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelmoss.info/images/pretty_china_05.jpg"&gt;&lt;img border="0" src="http://joelmoss.info/images/pretty_china_05.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;...and another...&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelmoss.info/images/pretty_china_02.jpg"&gt;&lt;img border="0" src="http://joelmoss.info/images/pretty_china_02.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I never knew China was so &lt;a href="http://www.impactlab.com/modules.php?name=News&amp;amp;file=article&amp;amp;sid=7301"&gt;beautiful&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/1uReip-RAE4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/02/08/china-my-next-holiday.html</feedburner:origLink></entry>
 
 <entry>
   <title>Web 2.0 on one page</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/pHxZcECII4Y/web-20-on-one-page.html" />
   <updated>2006-02-07T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/02/07/web-20-on-one-page</id>
   <content type="html">&lt;p&gt;I really do wonder why people take the time to do things like &lt;a href="http://flickr.com/photos/torrez/95124293/"&gt;this&lt;/a&gt;. Yeah its fun and maybe it&amp;#39;s cool, but why? It also makes you wonder how long this Web 2.0 bubble will last, and if it is indeed a bubble.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/pHxZcECII4Y" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/02/07/web-20-on-one-page.html</feedburner:origLink></entry>
 
 <entry>
   <title>View first 2 episodes of the IT Crowd online</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/tvCto3UxxxM/view-first-2-episodes-of-the-it-crowd-online.html" />
   <updated>2006-02-07T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/02/07/view-first-2-episodes-of-the-it-crowd-online</id>
   <content type="html">&lt;p&gt;Lets start things off on a funny note. I saw the first two episodes of &amp;quot;&lt;a href="http://www.channel4.com/entertainment/tv/microsites/I/itcrowd/"&gt;The IT Crowd&lt;/a&gt;&amp;quot; on Friday gone and loved every minute of both (although the first was funnier). I have now found out that you can watch these two episodes online via &lt;a href="http://www.bittorrent.com/"&gt;BitTorrent&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Take a look at the &lt;a href="http://atariboy.wordpress.com/2006/02/03/the-it-crowd-episode-2/"&gt;post on AtariBoy&amp;#39;s site&lt;/a&gt; for the download links and split your sides with laughter.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/tvCto3UxxxM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/02/07/view-first-2-episodes-of-the-it-crowd-online.html</feedburner:origLink></entry>
 
 <entry>
   <title>RSS in Internet Explorer 7</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/qFxE69YrDDI/rss-in-internet-explorer-7.html" />
   <updated>2006-02-07T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/02/07/rss-in-internet-explorer-7</id>
   <content type="html">&lt;p&gt;Dwight Silverman &lt;a href="http://blogs.chron.com/techblog/archives/2006/02/all_about_rss_i.html"&gt;previews RSS reading&lt;/a&gt; in the second beta of Internet Explorer 7.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelmoss.info/images/ie7_feedreader.jpg"&gt;&lt;img border="0" src="http://joelmoss.info/images/ie7_feedreader.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/qFxE69YrDDI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/02/07/rss-in-internet-explorer-7.html</feedburner:origLink></entry>
 
 <entry>
   <title>MI:3 Superbowl adspot</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/bWB-q7aAvfU/mi3-superbowl-adspot.html" />
   <updated>2006-02-07T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/02/07/mi3-superbowl-adspot</id>
   <content type="html">&lt;p&gt;No I didn&amp;#39;t stay up to watch it (I think it was on at about 1 in the morning over in the UK) but I have found the Mission Impossible 3 ad spot that was shown during the Superbowl on Sunday. Enjoy!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.apple.com/trailers/paramount/missionimpossibleiii/"&gt;http://www.apple.com/trailers/paramount/missionimpossibleiii/&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/bWB-q7aAvfU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/02/07/mi3-superbowl-adspot.html</feedburner:origLink></entry>
 
 <entry>
   <title>Lightbox gone wild!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/6i1PjwvAQKY/lightbox-gone-wild.html" />
   <updated>2006-02-07T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/02/07/lightbox-gone-wild</id>
   <content type="html">&lt;a href="http://particletree.com/features/lightbox-gone-wild/"&gt;This&lt;/a&gt; is exactly what I have been looking for while developing the &lt;a href="http://en.wikipedia.org/wiki/Single_Page_Application"&gt;Single Page Interface (SPI)&lt;/a&gt; of the new PXP system at &lt;a href="http://homepageuniverse.com/ref/joelmoss.info"&gt;HomepageUniverse&lt;/a&gt;.
&lt;blockquote&gt;In user interface design, a &lt;a href="http://en.wikipedia.org/wiki/Modal_window"&gt;modal window&lt;/a&gt; (sometimes referred to as a modal dialog) is a window that blocks input to other windows. It has to be closed before the user can continue to operate the application and are frequently an element of Multiple Document Interface (MDI) applications or desktop applications like Windows or OS X. One of their purposes is to prevent the software from being operated in an ambiguous state.&lt;/blockquote&gt;
I needed such a feature to popup quick info and forms, that didn't warrant the need for a new page. A great way of doing it.

Take a look at &lt;a href="http://particletree.com/features/lightbox-gone-wild/"&gt;how it's done&lt;/a&gt;.
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/6i1PjwvAQKY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/02/07/lightbox-gone-wild.html</feedburner:origLink></entry>
 
 <entry>
   <title>JS Usage just gets smarter!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/Srcbq_tiA1I/js-usage-just-gets-smarter.html" />
   <updated>2006-02-07T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/02/07/js-usage-just-gets-smarter</id>
   <content type="html">It's amazing what you never knew you could do with Javascript isn't it? I mean, all this functionality has been around for years and anyone could have done it, but only now are we really getting into the real meat and potatoes of javascript and what it really is capable of.

&lt;a href="http://www.agilepartners.com/blog/2005/12/07/iphoto-image-resizing-using-javascript/"&gt;This article&lt;/a&gt; demonstrates a very cool method of resizing images the iPhoto way, but using only &lt;a href="http://prototype.conio.net/"&gt;Prototype&lt;/a&gt; and &lt;a href="http://script.aculo.us/"&gt;Scriptaculous&lt;/a&gt;. A simple slider above a group of images allows you to resize the images in one mouse move.

I learn something new everyday and that is why I love it so much :)
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/Srcbq_tiA1I" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/02/07/js-usage-just-gets-smarter.html</feedburner:origLink></entry>
 
 <entry>
   <title>Gadgets: Lets park</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/B1x-K8yS27M/gadgets-lets-park.html" />
   <updated>2006-02-07T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/02/07/gadgets-lets-park</id>
   <content type="html">&lt;p&gt;You may find that I reference the &lt;a href="http://www.stuffmag.co.uk"&gt;Stuff Magazine&lt;/a&gt; site quite a bit, as it&amp;#39;s just a geeks paradise. Today I saw this very cool gadget that Siemens have developed that finds an empty parking space for you and your car and then even parks it for you.&lt;/p&gt;

&lt;blockquote&gt;The system theoretically works like this.

Step one: you&amp;rsquo;re cruising down the street that you need to park in, so you engage the Park Mate and it starts mapping the area.

Step two: when it&amp;rsquo;s found a suitable space it chimes, prompting you to stop the car and wait. Step three: the steering wheel turns of its own accord, moves into the space and stops in an inch-perfect position.

Step four: an intense feeling of smugness and an affectionate tap on the roof for your car.

Unfortunately, this is all a little way off yet &amp;ndash; a recent trial by the &lt;a href="http://news.telegraph.co.uk/news/main.jhtml?xml=/news/2005/12/26/wpark26.xml"&gt;Daily Telegraph&lt;/a&gt; resulted in the test car, a BMW Estate, going up the curb twice and nearly shunting the car behind. This was apparently due to cold conditions, and a road-safe version should be with us by 2008.&lt;/blockquote&gt;

&lt;p&gt;You can find the full article &lt;a href="http://www.stuffmag.co.uk/hotstuffarticlerss.asp?DE_ID=1199"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/B1x-K8yS27M" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/02/07/gadgets-lets-park.html</feedburner:origLink></entry>
 
 <entry>
   <title>Fluxiom: now THAT is impressive!</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/q1G74E3LK_g/fluxiom-now-that-is-impressive.html" />
   <updated>2006-02-07T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/02/07/fluxiom-now-that-is-impressive</id>
   <content type="html">&lt;p&gt;Just came across &lt;a href="http://www.fluxiom.com"&gt;Fluxiom&lt;/a&gt;; a new Web2.0 startup currently beta testing and was absolutely amazed at what I saw. Fluxiom is being developed by &lt;a href="http://mir.aculo.us/"&gt;Thomas Fuchs&lt;/a&gt;, the creator of &lt;a href="http://script.aculo.us/"&gt;Scriptaculous&lt;/a&gt; and is basically an asset management application using Ajax extensively. That in itself sounds interesting, but what got me excited was the video that you can view on the site. Just &lt;a href="http://fluxiom.com"&gt;watch&lt;/a&gt; and you will see what I mean.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://fluxiom.com"&gt;&lt;img border="0" src="http://joelmoss.info/images/fluxiom_scr.gif" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/q1G74E3LK_g" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/02/07/fluxiom-now-that-is-impressive.html</feedburner:origLink></entry>
 
 <entry>
   <title>The beginning</title>
   <link href="http://feedproxy.google.com/~r/DevelopingWithStyle/~3/Bm4uWqhBsKU/the-beginning.html" />
   <updated>2006-02-06T00:00:00+00:00</updated>
   <id>http://developingwithstyle.com/articles/2006/02/06/the-beginning</id>
   <content type="html">&lt;p&gt;The start of something new; something cool and something (hopefully) refreshing. This is my first post in my Blog, and I suppose it should be the introduction to &amp;ldquo;The Meaning of Life, the Internet and Everything&amp;rdquo;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So why call it that?&lt;/strong&gt;
It pretty much covers everything that I want this Blog to be about. I also think it sounds pretty cool; long but cool. - hey, no-ones perfect. Mostly it will contain news, articles and info about the web; anything from Ajax to Hosting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who are you?&lt;/strong&gt;
My name is Joel Moss and I am the CEO of &lt;a href="http://homepageuniverse.com/ref/joelmoss.info"&gt;HomepageUniverse&lt;/a&gt;, a well established hosting and internet services company located in Chorley, England. I have been active on the net and with computers for a good nine years or so now, and projects have come and gone, ideas have gestated and died, but HPU has always been there for me.&lt;/p&gt;

&lt;p&gt;I am 29 (only just) and am happily married to Faith, with whom I have 3 gorgeous kids; Ashley (8), Elijah (2) and Eve (10 months). My life involves family and work and that suits me just fine, as I enjoy both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So why are you publishing a blog?&lt;/strong&gt;
Why the hell not? Everyone else is, and besides I thought it was high time I gave something back to the community at large and share with you all my knowledge, ideas and personality (watch out!).&lt;/p&gt;

&lt;p&gt;So all I can say now, is watch out for lots of posts and enjoy!!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/DevelopingWithStyle/~4/Bm4uWqhBsKU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://developingwithstyle.com/articles/2006/02/06/the-beginning.html</feedburner:origLink></entry>
 
 
</feed>
