I figured it was about time I made some comments on
webDU now that the dust has
settled (and I'm finally over the gastro I've had all week, including at the
conference).
Overall, I have to say I have an absolute blast, and it was
brilliant to put some real faces to people who were just names on a mail list,
IM or irc chat room.
There is a huge amount of kudos that needs to go to Geoff, Julie and the rest of
the
Daemon team for
putting on webDU, it was well organised, professional, and not to mention a
whole lot of fun.
The only criticism on the conference was that with the Flex heavy presentations,
there seemed to be a fair amount of overlap in terms of content covered. I
went to a few Flex presentations, and many of them covered that very beginning
level of introduction into Flex. While I am not a Flex user by any means,
I like to keep my eye on the Flex space, and was often looking for something
more than just another 'here is how to say 'Hello World' in Flex', especially
when the title of the presentation lends itself to make you believe it is
something more.
Otherwise, the presentations where very good, and on the whole insightful. My favourites included the
Keynote:
Flash Bang, Apollo,
FarCry 4.0: The Application Framework,
Seeding,
Developing and Growing an online Community, and
Using the IM gateway in ColdFusion .
I felt that my
Transfer presentation went very well, although I'm still not sure how I managed to get through all
39 slides in just over half an hour without someone telling me to speak slower ;o). I did have to laugh when I got the webDU booklet and my presentation slides took up something like 4 or 5 pages, compared to other presenters usual 2 or 3.
Speaking
to people after the session, the feedback was generally positive, and
people seemed to have walked away feeling like they had learnt
something. Mind you, if anyone has any extra feedback they wish to
give me on the presentation, I'm all ears, so fire away. I'm always
looking to do a better job.
Charlie Arehart and I did a
BOF: ColdFusion Componentry
session together, which, in all honestly, I didn't think anyone would
show up to, being 8am after the night of the banquet. But people did,
and we had a good chat about Object Oriented development, from a
variety of angles. I apologise if I wasn't making any sense, as I may
have possibly had my fair share of the Microsoft tab at the bar the
night before.
Speaking of which, the Banquet was great as well,
including the Kath and Kim impersonators. I think the most enjoyable
part was watching the American visitors try and work out who Kath and
Kim were. ;o)
The drinks at the bar after the banquet were also
lots of fun, but I am wondering where everyone went around 11pm. It
seemed like the place was packed, and then suddenly it was empty. Go
figure. I did get a definite giggle out of a Microsoft representative
asking me why I didn't program in .Net. All I know is that at around
2am they kicked us out, so I ended up going back to my room to crash.
The
definite highlight of the whole thing, I have to say, was the people.
It was such a good opportunity to run around and actually
physically
talk to a variety of people who worked with Adobe technologies.
(Especially to one guy who couldn't quite believe that I thought
manipulating a huge amount of financial data was really cool... I
didn't really care about the Flex part). To those of you I talked to,
and there were way to many to mention, was great to chat to you all,
and I'm glad to have (finally?) met you.
A brilliant conference,
and I hope that those of you who didn't come, will show up next year,
and those that I met this year, I will see again.
Nope, you're not going crazy, I have some posts that weren't showing up on aggregates. This was because my
RSS
feeds were being compressed by the web server they were on, and coming
back as a weird Content Type. That's all been fixed, so you should now
see all my posts as per usual.
Compound Theory will now continue its usual broadcasts...
webDU has been off
to a great start! The national Adobe user group meeting was an
absolute blast, and I had a great time last night chatting to
Jeff Coughlin last night when we went for dinner at 10:30 in the evening.
In case anyone has no idea what I look like - look for the guy in the
Black Autobots t-shirt. You can't miss me ;o) So if you see me, feel
free to say Hi!
I'm off to partake in some breakfast.
Wow. I have been pushing like crazy the next release of
Transfer finished before I fly out for
webDU, and I actually made it. I leave this afternoon for Sydney at 4:00pm, so I am cutting it fine.
This release has 2 great new features, as well as several critical bug
fixes, not to mention a greatly expanded documentation, including a new
Overview and FAQ.
Rather than try and explain these features all over again, I'm simply going to show off some of the Overview and FAQ:
From the Overview Section:
Transfer Query Language
There
is also a scripting language that allows you to perform database
queries based on the information and naming scheme that you set up in
your transfer configuration file called Transfer Query Language (TQL). TQL is very similar to SQL,
however since Transfer already knows about the relationships in your
system, you don't have to write as much code to perform complicated
queries against your database.
For example, if we
wanted to perform a query to list all Posts in my Blog System, with
their Author, and all the Categories they belonged to, ordered by the
post date we would write this in TQL:
<cfsavecontent variable="tql">
from
post.Post as Post
join system.Category
join user.User
order by
Post.dateTime desc
</cfsavecontent>
And then we would create a Transfer Query Object by passing the TQL to transfer.createQuery(), and then create the actual query we need by passing the Transfer Query Object to transfer.listByQuery(), as in the example below.
<cfscript>
query = transfer.createQuery(tql);
qPosts = transfer.listByQuery(query);
</cfscript>
Since Transfer already has the relationships between the Post, Category and User, it can intelligently create the SQL joins for you! Saving you even more time!
There's another Database Management Method you can use with TQL besides transfer.listByQuery(), and that's transfer.readByQuery(). readByQuery returns a Transfer Object, whereas listByQuery() returns a query. readByQuery() requires TQL
that will return only "one row" - if more than one row is returned, an
exception is thrown - and it also requires that you specify the class,
like all the otherreadBy* methods.
Basically, readByQuery()
is a way to create a Transfer Object when you don't want to use the
primary key, but specify some other condition that will return only one
record.
For more information on these Transfer methods, see
Using The Data Management Methods .
From the FAQ:
How do I inject dependencies into a TransferObject?
To inject dependencies into a TransferObject, the 'afterNew' event must be used.
To register an Observer for the afterNew event:
observer = createObject("component", "InjectorObserver").init();
getTransfer().addAfterNewObserver(observer);
The observer must have a method on it that looks like, which is run when the event is fired:
<cffunction name="actionAfterNewTransferEvent" hint="Do something on the new object" access="public" returntype="void" output="false">
<cfargument name="event" hint="" type="transfer.com.events.TransferEvent" required="Yes">
<!--- do stuff here --->
</cffunction>
The event is then fired *after* the TransferObject is init()'d and the configure() method is run.
So if you now want to inject something into a TransferObject, you will need to write a setter/getter on it - and you can do it something like this:
<cffunction name="actionAfterNewTransferEvent" hint="Do something on the new object" access="public" returntype="void" output="false">
<cfargument name="event" hint="" type="transfer.com.events.TransferEvent" required="Yes">
<cfif arguments.event.getTransferObject().getClassName() eq "user.User">
<cfset arguments.event.getTransferObject().setService(getService()) />
</cfif>
</cffunction>
A <cfcase> statement could be used instead of an <cfif> depending on your needs.
You could put this event directly on a Factory of some description if
you wanted to, or have it on a specific object whose only task is to
inject new
TransferObjects with dependencies, depending on your application design.
Full changelog.
A *HUGE* amount of thanks to
Nando, Jaime Metcher, and Aaron Roberson for all the hard work they put into the documentation. It was greatly appreciated.
You may have also noticed a skip in version numbers. It's okay, you're
not going totally crazy. That was just a decision that I made, to
evenly space out all the major feature releases between 0.6.1 and 0.7.
So now the release road map looks like:
0.6.3 : TQL
0.6.6 : Composite Keys
0.6.9 : Soft Deletes
0.7 : All the other small pieces I wanted to fit into 0.7
It also gives me some wiggle room in case I need/want to do a maintenance release between.
Now, I'm off to webDU, and if you are attending, I hope you come and hear me speak!
You can download Transfer from here.
I did a quick interview via IM with Judith Dinowitz on travelling over to the USA for
cf.Objective() 2007, and the talks I'll be doing on
Transfer, and some of the new features that Transfer will have in the next release. If you want to have a read,
check it over here.
Travelling
to cf.Objective() this year is going to be so much fun, I can't tell
you how excited I am to finally meet a whole heap of people that I've
only ever known online, not to mention all the great presentations.
Definitely well worth the over 24 hours of travel that I have to do to
get to Minneapolis.
Damon Gentry has started
blogging about Transfer over at his website
www.dagen.net.
He's done three articles so far as he logs his journey with
Transfer, and it is a very interesting read as he learns about the framework.
So, if you are interested in Transfer, or are looking to learn
something new, have a look at Dan's blog, it's got some good content.