Community Collaboration Chat

I have an active interest in collaboration within the ColdFusion community, particularly between projects. On Sunday, I'd like to talk about ways that we can foster more integration between various projects.

For example, there's Mango Blog that Laura Arguello did an excellent job with, there's Ray Camden's Galleon Forums and there's Codex Wiki written in ColdBox and Transfer. And I might like to run all of these, but they're written on different frameworks (or no framework) and generally built as stand-alone apps. So how do I integrate these seamlessly into a single website or extranet, without having to make wholesale changes to the code that would make upgrading later a major challenge?

Some of us have already done some work in this arena. For example, Laura did an excellent job with Mango Blog in creating a delegated login option. But these great innovative integration features aren't widely known and for many challenges it seems that none exist at least in common usage within the community.

This chat is an open invitation for anyone in the community who's interested in improving collaboration between projects, to discuss the projects we've worked on, the challenges we've faced and solutions we've created or potential solutions we'd like to see.

I hope you'll join us. :)

Time: 3PM CST Sunday, Nov 15th (1PM Pacific, 4PM Eastern)

Mango Blog Plugin 1.0 beta Released

Okay! There's finally a working plugin for Mango Blog. :)

It did take a bit longer to get this done than I'd hoped, but I'm glad to have a first release available.

It's on the webservice for plugins, so if you've already downloaded a copy of the onTap framework, just go to your Plugin Manager, select the "more" tab and type "mango" into the search form. From there press the install button and it will walk you through the rest of the installation. This version uses the Members onTap user/security plugin to manage users, roles and permissions, instead of the Mango Blog user system. So if you haven't already installed Members onTap, it will walk you through that first (including the DataFaucet installation it needs).


Mango Blog

Over the course of the past week I've been working on a new onTap framework plugin that will download and install Mango Blog into an onTap framework application.


CacheBox Presentation Recording

We had a great time with today's presentation of the new CacheBox framework!

We had an even dozen show up and a pleasant surprise at the end. There's a poll at the end of these presentations so the people who attended can anonymously rate the presentation. It asks "was this information useful?" and the options range from 1-star (it was a waste of time) to 5-stars (yes, very much). In this case 50%, an even half of the guys who came gave me 5 stars. So I feel really good about the presentation. :) There is certainly still room for improvement in my presentation skills, but I think this is great progress.

I've also used some of the feedback from this presentation and updated the intro to the documentation for the CacheBox project to clarify the benefits of using it.

Here's the presentation recording for anyone who missed it:

CacheBox Presentation

The latest version of the onTap framework includes integration of the new CacheBox project, the hot-swappable caching framework for ColdFusion. That's a great thing for DataFaucet because it means the framework cache is now much more configurable and you've got a handy management application that lets you look right into it, which wasn't there before.

Honestly the framework is still incomplete, but it is in a working state. We could use input into the management application, features (did we cover everything?), and in particular I'm really hoping to get some folks to provide some additional insight to help me finish writing the intelligence portion -- the methods that will allow CacheBox to auto-configure the cache based on usage patterns.

I hope you will all come join us for the discussion tomorrow at 6pm EST at the Online ColdFusion Meetup group.

ColdFusion 9 and the onTap Framework

I'd like to say that every upgrade is as seamless as the upgrade from ColdFusion 7 to 8, where I didn't have to do anything (that I remember). But of course they don't always turn out that way. Back when Macromedia released ColdFusion MX, myself and a number of other developers had to do a fair amount of work to remove references to structure variables named "this". It turns out that they've added a "local" scope in ColdFusion 9 and wouldn't you know, about the time I stopped using "this", I started using "local" instead. ;)

Ryan McIlmoyl gave me the heads up on the issue on the DataFaucet list. About a day and a half later, I've just finished up the basic modifications for CF9. (There were 3.5-thousand references to "local" in the core code, plus another 500 or so in the Members onTap plugin, with plenty of false-positives.) I don't actually know if the onTap framework is still working on CF9 yet, because I haven't installed it to test with yet. If you give it a shot, let me know how it goes for you.

One thing I'm glad of though, is the way I designed the ontap.cfc. This is a component with some basic functionality that was created before onMissingMethod() was added to the language, otherwise it might have looked a bit different. But in essence, the lack of onMissingMethod() is why the ontap.cfc has generic getters and setters (or accessors and mutators for you lingophiles out there). These are two private methods name getProperty() and setProperty() and two public methods named getValue() and setValue() instead of having loads of individual functions named getBlahBlah() and setYaddaYadda(). What's cool about this arrangement is that in all my CFCs, nowhere to I directly reference the structure that holds property values, which was named (you guessed it), "variables.local". Well, nowhere except in about 3 private methods in ontap.cfc. And because all my other CFCs faithfully relied on getProperty() and setProperty() instead of simply referencing local.x or local.y, that means I only had to change "variables.local" in about 3 places. This saved me HUGE headache. If I'd gone the other way and used all hard-coded (or more to the point hand-coded) getters and setters, I'd have had easily another couple thousand references to replace and another day's work on this update for CF9. I love it when a plan comes together! :)

I was actually thinking about this the other day too, because I was looking at a small application someone else wrote (I won't mention any names), where they used all hand-coded getters and setters in their code and I was trying to figure out how to use it for configuration. After about an hour or two of looking through the code for documentation of one of the features I realized that said feature was never completed. There were just 23 references to it hanging out in the code, not doing anything at all (other than passing a useless variable around). All those 23 references were mostly hand-coded getters and setters, plus a couple of form fields and param tags. And I was thinking to myself, how nice it is to know that, for the most part, that sort of thing doesn't happen in my applications. Sure I make mistakes, everyone does, but the point here is, if I'm writing config for an app, there's not going to be 23-lines of code hanging around for a single config value, there's probably going to be about 3 or 5 and that means not only less maintenance, but less work up-front as well. :)

So new zip archives of the core framework and of the Members onTap plugin are up on RIAForge.

Transfer ORM Plugin and ColdBox Importer Released

Building on the previous article where I announced the release of a Fusebox importer, I've now released a similar ColdBox importer that allows you to run ColdBox applications within the context of an onTap framework application as well as a Transfer ORM plugin that downloads, configures and installs Mark Mandel's ORM framework.

I think this is really starting to show how the onTap framework accomplishes one of my long-term goals of encouraging greater collaboration within the community.

In one way ColdBox turned out to be slightly less helpful than Fusebox in creating this integration, because there's no programmatic way for me to set the "AppMapping" setting in the Application.cfc, which means that the installer can't actually do everything for you, you have to set the AppMapping setting yourself in the ColdBox config xml. Bummer. Maybe a future version of ColdBox will allow that.

In another way, ColdBox turned out to be slightly more helpful in creating integration. In both cases the primary method of integration is by a combination of executing the events from the Application.cfc (onApplicationStart, onSessionStart, etc.) and by calling the framework methods that launch and execute an individual request for each page of the application and then scraping the result content for the content elements we want in our onTap framework application. Although this is a less than ideal solution, it is far superior to simply scraping an http request for several reasons, including the fact that all the application and session variables are shared within our new onTap framework application, it's more efficient than an additional http request, and the onTap framework structure allows us to seamlessly modify the CSS or JavaScript without touching the original Fusebox or ColdBox application. The little bit of extra goodness that ColdBox offers in this respect is that the framework gives me a handy RunEvent() method that can be used for further integration.

So for example if I installed a forum written in ColdBox and I wanted to sync-up the user database from the forum with my own user management in the onTap framework (check out the Members onTap plugin) I can look in my user management directories in my own application and I can slip in a handy little call to the ColdBox RunEvent() method any time I create a new user or update a user, to keep the two systems in-sync for a single-sign-on application.

On a similar note, I've also just published a new Transfer ORM Plugin. I found a handy little Transfer Config project on RIAForge from Rolando Lopez, which uses the new CFDBINFO tag in CF8 to introspect your database and generate the required XML config file for the Transfer ORM.

What's really neat about this is that now you can get Transfer all set up and running in your onTap framework application with zero coding (and very little downloading). You just head over to your handy plugin manager, search for new plugins on the webservice, select the Transfer plugin and press the install button. After you've accepted the license agreement, the plugin will optionally download the latest version of Transfer and install it for you. Then it presents you with a small form with some options for how you'd like to generate your transfer config file and viola! You're ready to get transfer objects in your onTap application. :)

Kudos to Rolando for helping to make this possible, and of course to Mark Mandel for giving us Transfer.

Fusebox Importer Plugin

Last year I posted an entry about a CMS plugin for the onTap framework (and I'm still surprised at how much traffic it got). Unfortunately that particular project hasn't become a reality yet, but after having just finished up a revision of the onTap framework and the DataFaucet ORM that both now include integration with the new CacheBox cache-management framework, I decided to start working on plugins again.

Something that came up in that talk about a CMS plugin was how the Sava CMS has managed to create integration with a variety of other ColdFusion frameworks, including Fusebox, ColdBox and Mach-II. I think that shows marked resourcefulness and is a direction I'd like to see the ColdFusion community move more toward. And it's something I've thought about off and on over the past year, but I've not gotten around to doing anything practical about it until now.

Amazingly it's only taken me two days to put together a first release of a Fusebox Importer plugin. Tony Garcia mentioned before that integration between apps in the PHP world actually has a name, they call it "bridging". And that's a fairly good description of what I'm doing here. You install the Importer plugin and from that point, you can then manage fusebox applications that are imported into your onTap framework application through the importer, which acts as a kind of bridge between the Fusebox framework and the onTap framework.

I was hoping that I might be able to find a full-fledged application to test this with, but unfortunately didn't actually find that. I thought maybe there would be a blog or a forum or something available that was written in FB5, but couldn't find one. I did of course find examples of both of those things, but only in older versions of Fusebox (4.1 or 3). So I ended up testing this with a copy of the CatClub sample application that Sean provided when he was lead on the Fusebox project.

I did have to make a few small, yet important modifications to the framework core to get this bridge to work. So if you're interested in trying it out, you'll have to download the latest framework core release (which I just uploaded a few minutes ago). Then use the search form in the plugin manager to find and download the Fusebox Importer.

I'll probably have a look at ColdBox and Mach-II soon for the same thing. If they're similarly easy to integrate, I'll be a very happy man indeed. :)

New Google Analytics Plugin

Thanks to Grant Copley for inspiring this update. He published a Google Analytics plugin for the ColdFusion on Wheels framework and announced it on the Wheels google group. I noticed as I was looking at his description of the plugin that as plugins go, it doesn't do a whole lot. It just outputs the javascript for Google Analytics. And it got me thinking actually that it was a perfect candidate for the onTap framework, precisely because it does so little.

The reason I say this is a perfect candidate is because until now there hadn't been a complete, simplified example of a plugin installer. There have been plugins certainly. There's the DataFaucet plugin and the Members onTap plugin and now there's a CacheBox plugin, but all of those plugins are whole frameworks in their own right. That's been a problem because although the plugin system is documented, there wasn't a complete example of a plugin that you could use as a point of reference for what a plugin should look like. You had to guess about whether or not you were reading the documentation correctly. And looking at the DataFaucet plugin or the Members onTap plugin might not have been terribly helpful, because both of those are larger systems with relatively sophisticated installers, so it would have been easy to get lost in the code and have difficulty separating the installer from the application as you're looking at it. So by creating a plugin from something that arguably doesn't actually need a plugin, I've been able to provide a complete, simplified example that shows you just how to write an installer and nothing much else. ;)

Rather than publishing it separately, I've included it in the Plugin Manager project, which is now part of the core framework download. I also made a few very minor changes to the Plugin Manager itself - I don't think you'll notice any functional differences. But if you just want to see the plugin example, I'm attaching the zip archive of the Google Analytics plugin to this blog as well. Look for the download link in the stats below this entry.

Ask an Autistic

Hi all,

This is an open invitation to ask me whatever you'd like to ask, anonymously. It doesn't actually have to be about life with autism, it could be anything. I put that up there because I know that I talk about autism a lot and it's possible that some folks might have questions that they're hesitant to ask. So I created this anonymous form so that you can ask whatever you'd like without having to worry about me or anyone else criticizing you for it.

Speaking of Asperger Syndrome and Autism, I also recently discovered this case study that was published by Harvard Business School in early 2008 highlighting the benefits of the business model of the Danish software company Specialisterne, who hire mostly people with Asperger Syndrome and other ASDs. And I only discovered that after having published my own article about the Autelligent Laboratories project, darnit! I'll have to go back and edit my article once I've had a chance to read the case study. :) The article there isn't actually the case study, it's an article about the case study. But either way, it's very good news! If you haven't read it yet, my article about the AutLabs business model can be found here:

Plugin Manager Fix and CacheBox Update

I just realized that there was a small issue with the Plugin Manager that was causing a problem for an upgrade install for CacheBox. When you go into the plugin manager and you select a new plugin to install, it was reporting the information for the installed plugin instead of the new plugin version waiting to be installed. So for example, if you already had CacheBox 0.9.1 installed and then you downloaded the plugin to install 0.9.8, it would say "Installing CacheBox 0.9.1" despite the fact that you were actually installing 0.9.8. And because of that also when it finished installing, it wasn't recording the new version in the plugin manifest, so it would still show as the upgrade having not yet been installed.

So I fixed this in the Plugin Manager and uploaded a new copy of the framework core.

This version of the core also includes a new version of the CacheBox Agent that was required to fix a small bug with the CacheBox service. Unless you have the CacheBox service already installed, it shouldn't affect you. If you've installed it, you might get an error from the onTap framework until you update your core files. So I would update the onTap framework first and then CacheBox.

More Entries

BlogCFC was created by Raymond Camden. This blog is running version 5.5.006. | Protected by Akismet | Blog with WordPress