Interview with Joel Moss creator of Codaset
Earlier this week Codaset.com, a software project management and code hosting site, officially left beta. Joel Moss (@joelmoss), the creator of Codaset, agreed to answer some questions and absolutely carried this interview.
Is there anyone else on the Codaset team?
Nope! Just little ole' me! I developed and designed everything you see and don't see.
What's your education and background?
I actually started out in sales straight from school, selling ads on the back of hospital appointment cards! I hated sales, and I was absolutely shit at it. But I manged to wing it for a few years until I discovered the internet. At that point I was hooked and taught myself how to build a site. That quickly turned into a $10,000 a month ad-supported business. But that was at the height of the dot-com boom, so didn't last too long. So I then turned to domain names and web hosting. I ran a successful web hosting business for 7 years, until I sold it a few years back. Since then I've been working freelance, and developing Codaset. I never completed any higher education, and am completely self taught, but I'm passionate about what I do, as I love doing what I do. I am very lucky that my job is my hobby.
What were the motivation and goals for this project when you first started?
I've used all sorts of source code and issue tracking tools in the past, but eventually settled on a mix of Trac and Github. Trac is probably one of the best open source bug tracking tools available, but is not particularly user friendly. It also doesn't support Git (not out of the box anyway). Github is great at source control and social coding, but their issue management leaves a lot to be desired. There is a reason why a lot of projects that are hosted on Github tend to go elsewhere for their bug tracking. Both of these tools are great at what they do, but that is usually just one thing. I got fed up with using several different tools. As Hannah Montana once said, I wanted the best of both worlds ;). And so Codaset was born. A software project management tool that I want, and that I use myself. Just this evening I deployed a small change to provide support for video embedding, simply because I needed to embed a Youtube video in a Codaset blog post.
What tools were used to make it happen?
The entire site is built with Ruby on Rails, with a selection of popular plugins. And obviously - as with Github - it revolves around Git. Data is stored in a MySQL database, and I wrote a bunch of other backend tools in Ruby. Ruby is definately my language of choice these days.
How long did it take to get where you are now? Did you take any funding on the way or is it entirely bootstrapped?
The idea really came to me in January of 2009, and I began coding it a month or two later. And if I remember rightly, I opened up a private beta sometime in August. And of course, it finally left beta just this past Monday (March 1st 2010). The entire project is bootstrapped, and to be honest, I'm not in this for the money. Codaset came out of a need that I had. An itch that needed scratching, and I'm loving it even now.
What type of success have you achieved to this point?
The project is still relatively unknown, although you can find Codaset on the official Git site http://git-scm.com/tools. The only mentions of Codaset have been on my blog (http://developwithstyle.com) and on Twitter. And that is pretty much how it will stay for the foreseeable future. I don't want to let this run away with itself, or for it to go too fast. Right now there are a little over 2000 registered users and they have created over 2000 projects. Maybe small, but I am really proud of that. I think my biggest success, has been how open I have kept the project. Yes, the code is all private, but from the start, Codaset's tickets have been completely public. Anyone can come along and create or update a ticket at any time. I use Codaset to build Codaset, which I think is brilliant. I've also tried to be as honest as I could, which has resulted in a few blog posts where lively discussions have taken place by the users of Codaset. And that is the best feedback any business owner could want.
Github is probably the most well known competitor. Name one reason that open source devs should use Codaset instead. What's the best argument to get a company to host use a private repo on Codaset over Github or their own setup?
As I already mentioned, Github is great at what they do, but they only do one thing great. Developers and designers have several projects that need more than just code hosting, and they don't want to visit or use several different tools to do that. That is just an avoidable inconvenience, and can also get very expensive. We want one tool for the job, and that is what Codaset aims to be.
Github has had some issues with downtime. What makes you confident that Codaset would be able to handle the growth if it receives the same type of interest?
Github has grown very fast, and I think that caught them by surprise, so they never had the right setup from the start. I was very aware of that when I started Codaset, so unusually for me, infrastructure has been one of my top priorities. Codaset was designed with scalability in mind. Whenever I need more space for git repos, all I have to do i plug in another server. And if I need the site to handle more traffic, again, I just need to add another server. The system has been designed to run across several different machines, and it is intelligent enough to recognise and work with that.
What is your plan to lure open source projects to Codaset? Do you have any ideas on how to market the site?
Open source or public projects will always be free on Codaset. I use open source software, and have contributed to several open source projects over the years, and love the open source community. So I don't want to charge you a penny to host and manage your open source projects at Codaset. Anyone can come along and create as many as they want. I also recognise the social aspect that Git and distributed source control encourages, so will be building on that in the coming months. I think developers have a natural desire to help other developers, and to be a part of a larger community. I want to help them with that.
As for marketing, I'm not going overboard as I need to stay in control. I'll keep blogging and tweeting, and talking about it to good people like yourself, and hope that it slowly builds from there.
Again, thanks to Joel. I found his answers tremendously open and engaging. I hope you take a few minutes to check out Codaset.com because it is amazing that one person could design and code that whole site.
CakePHP Digest #24 - Drama Free
News
CakePHP Drama
Note: I wrote this last week before the latest incident, but it mostly still applies. And I'm too lazy to write a new intro. Besides in the time it takes to write a new one something else would happen and then that one would be shot.
If you stalk the Cake devs (and former Cake devs) on Twitter you might have caught some disagreements lately. Mostly related to the new navigation bar on the top of cakephp.org. I'm not going to link to the disputes here, since that isn't what this digest is all about.
Instead I wanted to comment on the thought that these "discussions" are bad for the framework. Whenever an internal dispute spills into the IRC channel or Twitter someone always complains that these public spats reflect badly on Cake.
I disagree (wanna fight about it?). Apart from the entertainment aspect (who doesn't love a internet cat fight?), I would argue that something like 1% (now that the bakery is involved this number is more like 25%) of the people who use Cake even know about the spats . Most developers just use Cake, without following it religiously.
Take jQuery for example - I use it all the time. I keep updated with the latest news. I even contributed (although you could barely call it a contribution) to the latest release (it was a good thing I was already in the bathroom when I was reading that or I would have pooped myself). But if @jeresig got into a Twitter-fight (need a good word for this - anyone?) with a former jQuery developer (who split to start the next generation JavaScript framework lQuery), I wouldn't know anything about it. In fact I can't even name anyone else on the jQuery team.
My point is that unless your virtually stalking a project you'll never even know about these little Twit-fits (nah...that doesn't work) .
Update: Thankfully everything worked out in the end (well at least for the latest incident) and all parties involved had tremendous internet make up sex.
CakePHP 1.2.6
On to the good news: There was a new bug fix release for the 1.2 branch (1.2.6).
As usual I didn't rush to upgrade - mostly because I have absolutely zero issues with 1.2.5 (and prior 1.2.x versions). Kudos to anyone who actually found a bug. You must be doing some really crazy and experimental things. Kind of like what happened in the aforementioned internet make up sex...uh...I heard.
CakePHP 1.3 Beta
There is also new beta release of the 1.3 branch. I probably shouldn't be saying this but the 1.2 release kind of pissed off the 1.3 branch for releasing so soon after. 1.3 was like "bitch, why you stealing my spotlight" and 1.2 was all like "you're stable you can hang in my league, deck officer". They haven't talked since. Kind of sad really.
In The Wild
RentUpdate.com
This one is from Marc Grabanski and is a rental listing site. Might come in handy during messy split-ups.
Almost Musique
From Guillaum comes Almost Musique. I'm not going to look this up on the 1% chance I'm wrong - I'm going to assume the name translates to Almost Music, which is completely hilarious when you think about it. It's not quite music. Close. It has instruments and people singing, but something's missing. Can't put my finger on it.
I think I'm going to change the title on my resume to "Almost Developer". This will really get expectations in line.
DecalCat
From @voidet come DecalCat.com. For whatever reason (probably cause they're too tough to ship) the cat isn't actually included - just the decals. But I found one in my neighbors house and let me tell you: those decals stuck on that cat like Tiger Woods on a cocktail waitress.
Copify
The @cakephp account tweeted about copify.com. For a site about copywriting it's a bit embarrassing that they spelled "organisations" wrong. FOOLS! HAHA!
PRManna
Thanks to @savant for pointing out this Hacker News posting about PRManna.com which is running CakePHP.
In The Blogs
File Upload and Migrations Posts
From the CakeDC blog a post describing file handling in CakePHP and a guide to the migrations plugins, which is now available without mandatory donation.
Custom Routes in CakePHP 1.3
From the always awesome Mark Story - custom route classes in Cake 1.3
Firing Behavior Callbacks in UpdateAll
From Teknoid a snippet on firing behavior callbacks when using UpdateAll.
Croogo Switching to 1.3
Fahad19 announced the migration of Croogo CMS to CakePHP 1.3. Cake 1.3 didn't handle it very maturely, posting numerous Twitter updates taunting Cake 1.2.
Code
Zend Search Lucene Datasource
From Jamie Nay a datasource for Zend's search Lucene class.
MongoDB Datasource
From ichikaway a MongoDB datasource.
Capistrano Integration
From jadb Capcake - a capistrano integration thingy.
Permissionable Behavior
From @jmcneese an updated to his permissionable behavior and a new metadata plugin (also a blog post), which looks really hot.
Facebook Super Plugin
From Nick - a Facebook connect + API + lots of other stuff plugin.
Bakery Clustfuck
A bunch of new stuff in the bakery. As always it's a mixed bad. Here's a few I thought were interesting: Salesforce datasouce, Excel spreadsheet helper, and More tree stuff.
I'm Out!
Don't forget to subscribe to my feed or follow me on twitter. As always if you think I missed something leave a comment. Or if you do something interesting and want it included in the next digest, send me an email.
Improved JavaScript Validation (repost)
This article was written by me and originally published on February 12, 2008 on PHP Architect's C7Y site. Since that site is no longer around (meaning this article is currently homeless) and their one year exclusive rights expired long ago, I figured why not re-post it here. The concepts and code in this article eventually evolved into my CakePHP JS Validation Plugin.
Your social video ad widget mashup is ready to be unleashed to the public. Conscious of all the latest SQL injection and cross scripting attacks, you've locked down every form field. Before the big launch, you enlist your buddy/co-worker/significant to do some user testing.
After being impressed with your innovated use of a gradient within a gradient, they manage to find the user registration form. It's just two fields, username and password. What could go wrong here?
Your tester is feeling spunky and enters the username "D'shiz" and clicks the Join button. The submission is whisked off across the internet to your co-located server where your stringent validation catches the disallowed apostrophe in the username.
You give a small fist pump when you see the form returned. Across the top is a concise, highlighted error message detailing the problem. To make sure there is absolutely no confusion you also mark the username label red. Your tester has no trouble figuring out the issue and changes their username to "Dshiz". Again the form is sent and again it is returned. This time with the error "Your username must be at least 6 characters long". Your tester changes their identity to "Dshiz49" and re-re-submits. Ooops. They forget to re-enter their password. Your app had been clearing it out every time as part of your uber-security approach.
Finally the fourth submit gets it right, but in the process you wasted three page loads and the precious time of your test user. So how can we improve this scenario? Ajax validation is one option, but that can be overkill for many tests. None of the rules used in this example need the server or database to validate. If you were checking the availability of a username, that would be another story.
JavaScript validation has been around for years, but it's often poorly done to the point where it detracts, rather than add, value.
Let's lay out some requirements for good JavaScript validation.
Seamless To The Developer
First, keep the programmers happy. It doesn't make sense to maintain two sets of validation rules. Instead pull the rules from the same source that is used for server side validation and convert them to JavaScript for the client side. Obviously not all rules can be applied with JavaScript, so you'll need to filter them. If your rules are a mix of functions and regular expressions, you can use PHP's function_exists function to get just the regular expressions.
Seamless To The User
JavaScript alerts are not seamless. They are annoying. To be seamless, the feedback to the user must look the same as if the user submitted the form and the server responded. In this scenario, we'll assume you're using an unordered list with the id "errors" to display the messages.The first step to building re-useable client side validation is organizing your validation rules. Regular expressions are great, since they can handle many different validations and work in both PHP and JavaScript. Here a couple that will help us in the example above.
define('RULE_NOT_EMPTY', '.{1,}');
define('RULE_ALPHANUMERIC', '^[\w\d]{0,}$');
Hopefully you have a model class with all your rules defined or some other method of keeping them organized. Unfortunately, everyone's system will be different, so for this article we'll want to get the rules in a keyed array with the format RULE => MESSAGE, such as:
$validation = array(
'username' => array(
RULE_NOT_EMPTY => 'You must enter a username.',
RULE_ALPHANUMERIC => 'You may only use letters and numbers in your username.',
'.{6,}' => 'Your username must be at least 6 characters.'
),
'password' => array(
RULE_NOT_EMPTY => 'You must enter a password',
RULE_ALPHANUMERIC => 'You may only use letters and numbers in your username.',
'.{6,}' => 'You password must be at least 6 characters'
)
);
Don't worry if your validation scheme doesn't match, you can always write a function to convert from your format. Notice that in addition to the shared rules, we can add a custom rule created just for a particular field. To simplify the JavaScript and handle cross browser issues, I'll use the jQuery library. The JavaScript part works in two pieces. First, a static JavaScript function that will take in the form and the rules and do the validation. This will live in an external js file, such as common.js.
function validateForm(form, rules) {
//clear out any old errors
$("#errors").html("");
$("label").removeClass("error");
//loop through the validation rules and check for errors
$.each(rules, function(field) {
$.each(this, function(rule) {
var val = $.trim($("#" + field).val());
var exp = new RegExp(rule);
//check if the input exists and violates rule
if ($("#" + field).attr("id") != undefined && !val.match(exp)) {
//add the error message
$("#errors").append("The second JavaScript part is the rules for the form that is being displayed. This code is generated by a PHP function and included directly in the html output of your page.The form described above is pretty basic. It could look something like this:
<form id="appFrom" action="#" method="post">
<div>
<label for="username">Username</label>
<input id="username" name="username" type="text" />
</div>
<div>
<label for="password">Password</label>
<input id="password" name="password" type="password" />
</div>
<div class="submit">
<input name="submitForm" type="submit" value="Submit" />
</div>
</form>
We want to apply the rules described above to this form, in a way that is unobtrusive to the original code. First thing we'll need to do is convert the PHP rules array to JavaScript. This can be done with the PHP function json_encode. PHP's JSON functions are included as of version 5.2. For older versions you can use the JSON PECL extension or code your own version of the function.
The other critical part is to trap the submit of the form. You could do that by altering the form tag with an onsubmit, but instead we'll use jQuery's "submit" function, which can be placed anywhere in the html. Using JavaScript validation does not require the user to have JavaScript on their browsers. User's without JavaScript support will simply submit the form as normal and the server will handle the validation.
These two requirements can be encapsulated in a single PHP function.
function clientValidation($rules, $formId) {
$output = array();
$output[] = '<script type="text/javascript">';
//convert the rules array into javascript
if (function_exists('json_encode')) {
$output[] = 'var rules = eval(' . json_encode($rules) . ');';
} else {
exit('This code requires PHP JSON support');
}
//catch the form submission
$output[] = '$(document).ready(function() {';
$output[] = '$("#' . $formId . '").submit( function() {';
$output[] = 'return validateForm($(this), rules)';
$output[] = '});';
$output[] = '});';
$output[] = '</script>';
echo implode("\n", $output);
}
To use the JavaScript validation on our form we only need to include the external JavaScript file and call the function above.
clientValidation($validation, 'appFrom');
On the client side, when the user submits the form, it is intercepted by the new validation routine. The supplied rules are looped through, and if there was a matching input field the rules are applied. Fields that fail a particular test have their labels assigned the CSS class "error". The message is also added as a <li> element to the errors list.
At the end of the validation, if any of the fields failed, the form is stopped from being submitted. The user can then fix the errors and attempt to re-submit, which is the same process as presented in the original scenario. Now however the advantages are that the errors are shown instantaneously, as there is no longer any server interaction or page loads.
We now have a powerful, re-usable client side validation system that can be included in single PHP scripts or converted for MVC frameworks.
This type of validation should be used in addition to server side validation. This code does not protect against users without JavaScript support or users who are attempting malicious attacks.
How Much Money I Made From Side Projects In 2009
Last years version of this post was the most read post on this site for 2009. It got 6500 views on Jan 7th, when it was featured on Hacker News and 11k views for the year. Let's see if we can make magic again!
Gone Fishing
All the sites listed as "The Losers" last year are gone. I put them in a boat with Al Neri, sent them fishing on the lake and they never came back. No one noticed or cared. I probably would have just let them be, but I switched hosting from DreamHost to SliceHost and couldn't even be bothered to move them.
Hanging Around
music.rsstalker.com
music.rsstalker.com is a site that generates a custom RSS feed for new album releases. Yes, I know iTunes probably already does this, but some of us don't use iTunes. Oh and it doesn't work at the moment (I'll explain below, but the short explanation: I suck and I'm lazy). I had hoped this site would make a little bit of money - the links in the feeds are affiliate links to Amazon. Since $33 qualifies as "a little" I guess you could say I reached my goal. Also I spent no time marketing or promoting it, so it's not like people will magically start knowing about it (although that would be awesome).
later.rsstalker.com
later.rsstalker.com is a bookmarklet that adds the page you're currently viewing to a RSS feed so that you can remember to go back later. Frankly this is the awesomest thing I've ever done. And it's retardedly simply to boot. I use it multiple times per day, which alone makes it a winner. Although now I realize that the "Recently Saved" section could be renamed "Recently Saved by Matt", since I'm the only one that uses it. That could get embarrassing if I start saving links to porn or Java sites.
The Winners - Still Mostly Winning
rsstalker.com
rsstalker.com generates a custom RSS feed to track price changes on Amazon. I make money when people click the links and buy shit from Amazon.
Here's the story of why this site was broken for a month and music.rsstalker.com is still broken. On August 15th Amazon flipped a switch that made all requests to their Product Advertising API require authentication. They announced the change on May 8th, giving sites that depend on the API (like mine) plenty of time to adjust. That is if they saw the announcement. I lived in blissful ignorance of the change until Sept 12th, when I came to realization: "Hey, why the fuck haven't I gotten any price change notifications for the Amazon wishlist that I'm tracking through that awesome site rsstalker.com?"
I fixed it that day (SVN log message: "FU Amazon"), but the damage had been done. Or had it? Oddly, one of the reasons I didn't notice anything was wrong was because it was still getting orders. Check this out: Aug 15th to Sept 12, 2009: 30 items, $1031 Amazon revenue, $58 referral fees. Now check out the same time period for 2008: 32 items, $1178 Amazon revenue, $76 referral fees. Not all that different.
What about the rest of the year? Uh, not that great. Here's a table of the last three years:
| Year | # of Items | Amazon Revenue | Referral Fees |
|---|---|---|---|
| 2007 | 1048 | $68,351 |
$3,357 |
| 2008 | 1029 | $73,203 |
$3,444 |
| 2009 | 1293 | $51,860 |
$2,833 |
The two things that jump out are the nice boost in number of items sold (+264) and the drop in how much they sold for. In 2008 the average item was $71 giving me a referral fee of $3.34. In 2009 that dropped to $40 for a referral fee of $2.91. You can see this reflected in the type of items ordered. We used to get a lot of HDTV and digital camera sales, but hardly had any over the last few months of last year. Maybe it's a reflection of the economy or maybe it's just that everyone already has 17 HDTVs.
Either way, I'm enthused by the growth in items ordered after being stagnant from 2007 to 2008. I don't promote this site much and the maintenance is minimal (when Amazon isn't fucking with their API), so it's pretty much all gravy. Gravy that I use to fill my bath tub and swim around in like Scrooge McDuck. But then I have to shower immediately after, because it isn't socially acceptable to walk around smelling like gravy.
planbookedu.com
Now for the ruler of my tiny web kingdom. PlanbookEdu.com is a web based lesson planner. There is a free version which has basic functionality and a premium version for $20/year. In 2008 I completely re-built the site, which was a large effort leaving me little time to do much in terms of marketing or sales. Last year I was able to add features, and still have time to take a shot at building the user base. Here's a table of numbers since 2006:
| Year | Signups | Renewals | New Orders | Earnings |
|---|---|---|---|---|
| 2006 | 401 | 0 |
28 |
$560 |
| 2007 | 1360 | 21 | 66 |
$1,740 |
| 2008 | 1218 | 49 |
88 |
$2,740 |
| 2009 | 2970 | 88 | 286 |
$7,480 |
A couple things I'm proud of in that chart. Obviously, the huge jump in orders from 2008 to 2009. But, also the renewal rate. From 2007 to 2008: 49 of 87 (56%) of people renewed. From 2008 to 2009: 88 of 137 (64%) people renewed. If 60% renew next year I'm looking at around 224 orders as a base.
The jump in earnings didn't come free. I spent some cash this year doing promotion. Note: when I say "signup" I'm talking about the free version, "order" I mean the paid version.
Here's what I tried:
StumbleUpon
I paid $50 for 1000 stumbles ($.05 each). According Google Analytics the actual result was 887 visits (I'll assume the others had JavaScript off or GA blocked). This resulted in 5 signups - a .56% rate. The site average is 9.24%. At the time I wasn't tracking the original referrer of people who went on to pay for the premium version (a user gets 30 days free to start), so I don't know if I made my money back, but it's doubtful. Even though StumbleUpon has categories to target (I went with "Education"), the traffic wasn't very good.
Google Ads
Note: As I write this post it's the first time I'm really looking at these numbers. I'm super nervous.
I started a campaign on August 19th and ran it off and on for the rest of the year. In total I spent $762 for 2,696 clicks. That works out to $0.28 per click. Of the 2,696 clicks 409 signed up according to AdWords conversion tracking. My numbers have it at 390. I didn't start the conversion tracking right away on AdWords or in my system, so that probably explains the number differences. I'll use the 390 here, but the actual count is likely higher (425-450 range). Of the 390 that signed up 86 (again this number is likely higher since I wasn't tracking originally) eventually upgraded to paid accounts. That's $1720 in earnings on $762 of ads for a difference of +$958. Win!
Contests
I ran a cheesy Twitter contest to build followers for the @planbookedu Twitter account. Prizes totaled $150. We ended up with a little over 400 followers (probably mostly spam). The contest also resulted in 3 signups, but no orders. Considering I'm not really utilizing the twitter account, this was probably a waste.
Blog
I started a PlanbookEdu Blog, with all the content bought through elance.com. In total I bought 10 posts for $180. I think the quality of the posts is solid and I still have a few left to publish. Actual traffic has been minimal - the 10 Twitter Tips for Teachers post received the most views (320). I don't have any stats for signups/orders referred from the blog, but I suspect it's low to none. I look at this as a longer term play, helping to build search traffic.
New Feature - Sharing
Again, I don't have hard numbers on this one, but in my heart I know this is one of the top reasons for the past year's growth. I added the ability for teachers to share parts or all of their planbooks with anyone or everyone. This has led to two behaviors: 1) Teachers sending links to their plans to other teachers, who are introduced to PlanbookEdu for the first time. It's a little viraly when you think about it. 2) Teachers posting links to their plans on their websites. The intent is for parents to be able to see what's going on in the classroom, but the win for me is another inbound link, usually from a .edu or .k12.us domain (which I believe are weighted stronger by Google).
New Homepage
As part of 2008's rebuild I didn't spend much time optimizing the homepage. As a result it looked like this:

Not great. I spent some time reworking it to make it more conversion friendly. You can visit the live site to see it in action, but I'll warn you: you probably won't be able to resist signing up.
I know what you're thinking, "Hey, I've seen that design before". I won't argue. It's heavily influenced from some well known web apps. Design isn't my strong suit.
What's Next?
I have a kinda secret project I've been working on that I have no idea what to do with. I'll definitely continue plugging away with PlanbookEdu. I started sending automated emails a week after a person signs up asking for feedback and have gotten some great responses that pointed out weaknesses that need to be fixed.
In terms of advertising AdWords did the best for me. I've scaled the campaign way back at the moment, because even though school is in session, teacher's aren't really looking to change their habits mid-year. I'll turn it back on in full force next August to October.
In some ways it sucks having a seasonal app that's quiet 10 months of the year, but at the same time I hardly get any support requests those months and barely have to pay attention to it. Although it does use Amazon's S3 service, so I can't let it auto-pilot too much or next thing I'll know they'll switch up the API and nothing will work :)
CakePHP Digest #23 - Moving Day
News
Before We Get Going
I've accumulated a lot of links since the last digest (two months between posts will do that). As a result some links that would normally be included didn't make the cut. The good news is you'll never know if your blog post/code snippet was cut, so don't feel bad. Although if you posted something CakePHP related since Thanksgiving then you can assume I saw it. And if it's not included then you can assume I didn't deem it worthwhile. So maybe you should feel bad...
GitHub and Lighthouse
CakePHP development moved to GitHub (Yea!) and Lighthouse (Lightwhat?). Plus new plugins (localized and datasources), which are already on version 0.2 (that puts them on target for 1.0 around Jan 2024).
Cake Prayer
Via @predominant: A CakePHP Prayer
New CakeDC
Cake's parent company CakeDC got a fancy new design (via @PhpNut). Also you can support CakePHP by grabbing the new migrations plugin for a $15 "donation".
New Default CSS
@mark_story posted a couple screenshots of what could be the new default style sheet. HAWT!
Sites
validcake.com
I actually don't think this a Cake site, but it does generate the validation array for Cake models.
checkoutmygarage.net
From @modethirteen: checkoutmygarage.net - Yes, it is pretty much what you would think it is: A site for uploading pics of your garage. I might post some shots of my garage - boxes of old baby cloths/toys piled on unused exercise equipment. Although I don't think that's what they're going for.
vegasorange.com
From @mgiglesias: A site for Vegas real estate. I used to love Vegas, but haven't been in years. I hear it's kind of lame now and Montreal is the hip gambling spot. Hey, speaking of Canada...
harbourstation.ca
From @???? (I got this from twitter, but didn't note who posted it. I suck): A Canadian arena that hosts Canada's two most popular forms of entertainment: hockey and Gordon Lightfoot. I'll leave it as an exercise to the reader to determine which is the most popular.
iqlink.com.au
From @predominant: iqlink.com.au - A product info site for sweet looking ATM that dispenses documents instead of cash (or something like that).
In The Blogs
Loading Helpers As Needed
Jeremy Burns has a great tip on how to load a helper for a specific action rather then the whole controller. This is nothing new, but it's worth mentioning again.
Better Zip Code Validation
Jamie Nay posted a short validation routine for handling various international postal codes. This is mostly for 1.2 as the localized plugin mentioned above handles these in 1.3.
Bye-bye $cakeDebug
Teknoid has a post marking then of the $cakeDebug variable and some bits on how the new system works.
Code
Fixture Factory
I'm going to screw up the description on this one, but here we go: Fixture Factory is a CakePHP plugin for programatically creating fixture at the top of your unit tests, rather then relying on database records or _fixture files.
CakePHP to LI3 Bridge
This is more of a LI3 plugin for porting Cake apps bit by bit. Here's the official descprition:
The li3_cake plugin allows you to develop applications that use CakePHP and Lithium together, leveraging classes and exposing resources using both frameworks in unison.
Be honest: you threw up a bit in your mouth reading that. That description is a "synergy" away from qualifying for the enterprisey buzzword hall of fame.
Trees
If you're into trees then last month must have been like Christmas for you. Also if you're into Christmas, then last month must have been like Christmas for you. First we have Neil Crookes TreeCounterCacheBehavior plugin. If you're smart you're probably asking:
@AD7six: why have a (total)child_count field at all. no-of-children = (rght - lft -1)/2 .
And obviously the answer is:
@neilcrookes: ah, I remember now, it's for when I add scope functionality
@neilcrookes: when I say remember, I mean, that's the excuse I just came up with for being too dumb to realise no-of-children = (rght - lft -1)/2
Also from Jamie Nay is his post "Adding Better Scope Limiting to CakePHP 1.2’s Tree Behavior". One more: BTree Behavior from jas osborne, which claims to be faster then the Cake Tree Behavior when dealing with overgrown trees.
I'm Out!
And on that note don't forget to subscribe to my feed or follow me on twitter. As always if you think I missed something leave a comment. Or if you do something interesting and want it included in the next digest, send me an email.
