Friday, November 14, 2008

getting down to business on my plone PLIP to fix the INavigationRoot issues

Sunday, October 19, 2008

"Menu du Jour" for 6th Plone Tune-Up - Oct. 24, 2008

You all enjoyed the lightening talk, now is the time to act my friends!


6TH PLONE TUNE-UP
Friday, Oct. 24th, 2008
7am-6pm (US ET)/ 13h-Midnight (GMT +1)
At #plone-tuneup on irc.freenode.net


This week, the Plone Tune-Up Team is pleased to announce an appetizing list of tickets that comes with a good amount of "newbie" and "greenbelt" issues. One "blackbelt" ticket has also been included for those who like it hot.

Here's the menu for this coming Friday, Oct. 24th:

#6960 Collection criteria XMLHttpRequest calls are broken

#6991 Full review list | Select: All | selection is improper...

#7248 auth_cookie_length doesn't take affect in Plone 3.0

#7559 Cannot add form validators because of button name

#7580 validators don't work on reference fields

#7581 FileField.getIndexable() returns 'None' if empty

#7707 Specific permissions created for iterate not being implemented...

#7949 Headings containing '@' display as URL in table of contents (ie7)

#8228 ATReferenceBrowserWidget batch may not work with IE6 and IE7

#8371 Search on @@sharing caused UnicodeDecodeError when full name...

#8417 My Folder link missing from personal toolbar (workaround included)

#8425 Error when must_change_password set to true

#8435 nuplone.css: "ul.portletNavigationTree" should be "dl.portletNavi...

#8438 member.css: syntax error

#8614 event_view.pt: Category name containing an ampersand not found...

You can get the full list of ingredients at: http://tinyurl.com/6g77wh

If you have any question, please feel free to contact gabrielle@sixfeetup.com.

ABOUT PLONE TUNE-UPS:
Plone Tune-Ups are regular online events that aim at addressing tickets in the Plone issue tracker and advancing Plone in general. It is a great opportunity for all to work together and discuss development tricks with influential Plonistas.

We look forward to seeing you all on irc this coming Friday!

Wednesday, October 15, 2008

Coming to terms with the 1000 horsepower Plone CMS

Sometimes I have to admit I don't put myself in the shoes of the folks that are new to Plone. Today I was helping someone get started and got a full dose of what approaching Plone from the outside looks like. For the traditional LAMP stack developer, moving to the Plone stack is like upgrading from a Honda Civic to a Bugatti Veyron. Once you make that leap you have 10 radiators under the hood versus just one in the Civic. Not only that, you are getting nearly 1000 horsepower to deal with too. Try keeping that on the road.

The typical LAMP developer has few moving parts, but just to get started with Plone there is a huge stack to wade through. Once you get past just the software stack alone, you still have the application server, potentially a cluster, load balancers, reverse HTTP accelerators, SSIs and rewrite rules to wade through if you are going to do the deployment on a large scale. Luckily there are some new tools out there to help simplify that like buildout and setuptools. Unfortunately there isn't enough good documentation about all the options available.

So what on the outset may look like a kludgy way to set things up, really is an enterprise solution which has nearly endless complexity. How do we bring new developers into the fold when getting started requires you to learn ZPT, DTML, ZCML, Python, Archetypes, Zope's Component Architecture and then all the technologies to deploy it. The upside is that you have the equivalent of that 1000 horsepower available to you for managing content and delivering it on a large scale. Once you get to that scale, Plone is very comfortable solving problems, then the LAMP stack probably starts to look very daunting as well. We just start addressing these issues earlier in the process. Luckily you don't need to pay the Veyron price tag to do it.

In an effort to help with the mystical deployment art of a Plone server, Six Feet Up is presenting the Plone Deployment Workshop. We will be tackling many of these tough questions during the two days of the workshop on November 20th and 21st here in Indianapolis. We are keeping it inexpensive so we can help reach more folks and the early bird is ending this week so get out there and sign up!

More information about the conference along with the full schedule of presentations, speakers bios, and social events is available online at: http://www.sixfeetup.com/dw08

Thursday, July 31, 2008

XULRunner --install-app command line options

Sometimes command line options are a bit hard to "get". They are even worse when the help is vague. I just ran into this and couldn't find anyplace online that described how this command actually worked. I'm posting this here just as a quick ref for me and anyone else how has wondered about the --install-app flag of the xulrunner-bin.

Here is the help that comes with the XULRunner:

chimera-lite% /Library/Frameworks/XUL.framework/xulrunner-bin
Mozilla XULRunner 1.9

Usage: xulrunner [OPTIONS]
xulrunner APP-FILE [APP-OPTIONS...]

OPTIONS
--app specify APP-FILE (optional)
-h, --help show this message
-v, --version show version
--gre-version print the GRE version string on stdout
--register-global register this GRE in the machine registry
--register-user register this GRE in the user registry
--unregister-global unregister this GRE formerly registered with
--register-global
--unregister-user unregister this GRE formely registered with
--register-user
--find-gre Find a GRE with version and print
the path on stdout
--install-app [ []]
Install a XUL application.

If you just run it like this:

/Library/Frameworks/XUL.framework/xulrunner-bin --install-app .

It is going to drop your app in a folder in /Applications with an id of "Vendor" as specified in your application.ini. What do you do if you want it to create your app in another place or even create the installed app with a difference name other than the "Name" configured in application.ini.

Here is an example:

chimera-lite% /Library/Frameworks/XUL.framework/xulrunner-bin --install-app . ../../xul foo.app

This will create the program as foo.app in a folder 2 levels up called xul. There you have it, it is as easy as that.

Friday, March 07, 2008

How to locally change a remote RDF datasource loaded from a HTTP URL

So I've struggled with this problem a while back and forgot completely about it and struggled again with it. You can't do anything with a nsIRDFRemoteDataSource loaded via HTTP. It is printed as plain as day on this page.

RDF/XML datasources may be loaded from any type of URL. Currently, only those loaded from file URLs (URLs that begin with 'file:') may be modified with the RDF modification APIs. One possible workaround for modifying remote RDF sources is to load the RDF and then add the data into a separate in-memory-datasource.
But of course it doesn't give an example of doing this workaround.

Here is what I came up with based on some snippets I found on the web and put them together to basically take the data source and serialize it to a string and the parse it into an in-memory-datasource.

function getInMemoryDataSource(url) {
var outputStream = {
data: "",
close : function(){},
flush : function(){},
write : function (buffer,count){
this.data += buffer;
return count;
},
writeFrom : function (stream,count){},
isNonBlocking: false
};
var mem = '@mozilla.org/rdf/datasource;1?name=in-memory-datasource';
var datasource = Components.classes[mem].createInstance(Components.interfaces.nsIRDFDataSource);
var ds = LOCAL_RDF.GetDataSourceBlocking(url);
ds.QueryInterface(Components.interfaces.nsIRDFXMLSource);
ds.Serialize(outputStream);
// Used to create a URI below
var ios = Components.classes["@mozilla.org/network/io-service;1"].
getService(Components.interfaces.nsIIOService);
var xmlParser = '@mozilla.org/rdf/xml-parser;1';
var parser = Components.classes[xmlParser].
createInstance(Components.interfaces.nsIRDFXMLParser);
var uri = ios.newURI(url, null, null);
// Entire RDF File stored in a string
parser.parseString(datasource,uri,outputStream.data);
return datasource;
}
This will take in the URL you wanted to load and give you back a nsIRDFDataSource that you can now manipulate. If it is attached to a XUL template it will now update the template as it notices changes in the datasource like it should.

It really shouldn't be this hard, but when it works it is nice.

Friday, February 15, 2008

Using HTML CSS Selectors in XUL

When messing with XUL and you are using an alternate namespace for your elements, you need to define that name space in your CSS or nothing will happen. For example when using html:a in your XUL make sure your style sheet has this at the top: @namespace html url("http://www.w3.org/1999/xhtml");.

Wednesday, February 13, 2008

Plone Planning Summit 2008 Wrapup

The Plone Community is an outstanding one and an amazing entity to be a part of. As many people know the Plone Strategic Planning Summit was this last weekend at the Googleplex. It was an amazing event, but you may not have heard much from the participants while we were there. This was because that from the time I landed until the time I took off on Monday morning, I was surrounded by Plone folks for every waking minute except for the 2 hours I got to go see my friends new baby in Redwood City.

Almost by design, the room we were holding the summit in had no tables, no chairs and almost no outlets. This meant we were able to very effectively disconnect from our laptops for 3 full days of putting it all out on this thing people call "paper". Then in the evenings we would gather in various establishments, hotel rooms or by the pool and get down to enjoying just being present with the rest of the participants.

Jon Stahl did an amazing job of keeping us 100% engaged for nearly 12 hours the first day, 8 hours the second and for a good 6 hours on the last day. I can't image that is an easy job to do and required a tremendous amount of planning. This has been huge. We were able to harness the thoughts and insight of each person who was there. Due to the amount of discussion leading up to the event, even the people not present were represented through their blog postings, email posts or lists sent with the attendees. There wasn't much left out in my opinion.

The first two days were spent completely framing the state of things and what people thought about moving forward. We carefully made no "decisions" during these days or spoke of any implementation details. That really helped keeping the group from bogging down on the small stuff. Instead, the ideas were flowing easily between the participants and made their way effortlessly to the hundreds of flip chart pages that were stuck to the wall over the course of the weekend.

The last day was about actually doing something. Through the process of extracting and distilling down the massive scrawling on the wall, we turned these ideas into concrete tasks that we can put a single person in charge of. Then, we did just that. Each task got a champion and off we went to get things done.

The old adage is true with this group. When we work, we work hard, but when we play, we play hard too. For all of the intense work we put in, we also had a great time playing together until 3:00 AM most evenings. I look forward to the next gathering, so the rest of you had better get in training so you can keep up!