Plone

published Nov 03, 2021

This is here to serve as contents for the atom/rss feed for Plone, also read by planet.plone.org.

Lightning talks Friday

published Oct 12, 2012

Lightning talks during the Plone Conference 2012.

Lightning talks on Friday during the Plone conference 2012.

Paul J Stevens - BlobStorage improvement

We had a site with PloneMultiSite. Content items end up in multiple sites. The blobs are then also duplicated. So this takes up more hard-disk space than needed. Whether you use PloneMultiSite or not, this can happen. So I created a tool to compress the blob storage with a script. It deduplicated the blobs using hard links. So with this, you use less disk-space and get faster copy and move actions. A few patches need to be updated. I want to talk with collective.recipe.backup authors too [that would be me, welcome!].

Code: https://github.com/pjstevns/bscompress

Philip Bauer - Theme Editor

You can have a Theme Editor, started by David Glick. As Starzel we want to make this a company-sponsored PLIP. I propose a new process for plips: everything that David creates should be plipped and he should get gittipped, so we have a Glick-PLIP-Git-tip.

Johannes Raggam - plone.app.event

I have made a better version op plone.app.event for the PLIP. Please read the README.rst file for usage info. It supports recurring events. Please test it and use it.

Code: https://github.com/collective/plone.app.event

Eric Steele, Elizabeth Leddy - teams

If you run a team, for example the UI team, please come on stage so we can see you and know how you look. If you want to get involved, these are the people to talk to.

Lucas Graf - ftw.tabbedview

I work for 4teamwork (ftw). ftw.tabbedview integrates collective.js.extjs, collective.quickupload and ftw.table. You can filter content listings, sort tables client side, group things, manage columns, batching support, flexible sources (catalog, SQLAlchemy, etc), data transformations (you have a user name in the table but want to show the fullname) and lots more.

Code: https://github.com/4teamwork/ftw.tabbedview

Philip Bauer - Plone Konferenz

I helped organize the Plone Konferenz 2012 in Munich, Germany. Lots of visitors. Most were long-time users, but not yet part of the community. We wanted to attract decision makers and people new to Plone. We had great success and a lot of fun. How can you do that yourself? Get your local usergroup drunk and have them say yes. Organize a sprint. Have a party at the first day so people get to know each other faster. Spend money and effort on marketing. You get (local) visibility, new community members, a great party, you give large tips. We have 3,000 euros that we donate to the Plone Foundation.

Mikko Ohtamaa - Solving problems

I will show some packages: visualtitle, imageportlet, silvuple (it's French) which shows untranslated items, plomobile, sevabot (irc bot). Low let's party.

Sprint at the end of the world

World is going to end December 21st. So go to the end of the world to sprint. Come to the South of Argentina on 1 December 2012. We will see what we will sprint on.

Jukka Ojaniemi - Whiskers

Whiskers is a Pyramid application. It collects all the packages you use in your buildouts. You need a buildout extension called buildout.sendpickedversions that sends info to the whiskers server.

[Mark van Lent blogged about it earlier this year.]

Érico Andrei - Desk surfing

We need you in Brazil. We are lonely. Please visit us, otherwise we need to drink. If you need to travel to Sao Paulo, we have a place for you where you can work on Plone. Keep calm and Plone in Brazil.

Calvin Hendryx-Parker - Playing with blocks

We have a desk in Fortville as well: welcome!

Choose good building blocks:

  • Use APIs versus embedded iframes. Get the content in your site.
  • Evaluate your options: are mailing lists taken over by spam, what is the activity in version control?
  • Try out Single Sign On.
  • Supercharge your search with Solr. Index external content. Fix spelling.
  • Beware of over customization.
  • Testing, testing, testing.

See my talk from earlier today.

Radek Jankiewicz - stxnext.greyscale

Transforms the content of the page into grey scale colors. We use it when a website needs a mourning color after a national incident. There is a filter attribute in css, but is only supported by IE. Javascript also not really an option. Images are cached in filestorage.

See: http://pypi.python.org/pypi/stxnext.grayscale

Johannes Raggam - amplify.cc

This provides a framework for old php/postnuke based community portals. One content type for everything, using dexterity and behaviors. I gave a talk about this.

Maurizio Delmonte - Plone in your country

Your country may have a national Plone site. Italy: http://plone.it. Netherlands: http://plone.nl. You can now see a link to national Plone sites in other countries in the right hand corner of your own site: we are world wide! Thank you for being here.

Maarten Kling

Thanks to all our sponsors, gold, silver, bronze, personal, supporting. Rita from RebelX: thanks a lot for all the designs. Guido Stevens created the Plone awards. The Brazilian Plone community has won the Plone Awards 2012 for their PloneGov.br community building efforts! Thanks Wyn Williams for the Wifi. Thanks to Musis for their support here at the Musis Sacrum location.

Crowd: "Thank you, Four Digits!"

Lennart Regebro - Blame it on Ceasar: A rant on calendaring

published Oct 12, 2012

Talk during the Plone Conference 2012.

Lennart Regebro blames it on Ceasar when giving a rant on calendaring during the Plone conference 2012.

I live in Krakow, Poland, and can be hired. I ended up doing a lot with calendaring support.

We have the day, the month and the year. These cycles do not fit into each other nicely, which causes problems. Rome has seen all kinds of problems for this. Rome had 10 months per year. For lunar months you may need twelve or thirteen months in a year. So several days did not actually exist. With lunar months you get out of sync with about 12 days. So you get leap months. The roman calendar went out of sync about four months compared to what the season should have been.

Julius Caesar wanted to fix this. Solar calendars let the year follow the solstices and seasons. They got months of 29 or 31 days, because even numbers were unlucky. The new calendar was probably the worst ever made, but it was forced on an unsuspecting world because Rome was the boss.

Several calendars had ten days per week, but seven is a good cycle. The week is now a cycle that has nothing to do with months or years. That makes it difficult to calculate the day of the week for a certain day of the month.

momentjs.com looks best now for javascript.

http://www.date4j.net is promising for date handling in Java.

What day is the start of the week. Sunday? Monday? The isoweekday function is the correct function to use. Monday=1, Sunday=0 or 7.

The world is not split into 24 time zones. Every country decides which standard time or times are used. But we call them time zones even though they do not exist. Some time zones used to be for example one hour and fourteen seconds before GMT.

William Willett thought other people were lazy so he invented the Daylight Savings Time.

Some time zones get abbreviated the same, which is obvious as most of them end with Standard Time:

  • BST: 5 different zones
  • CST: 4 different zones
  • IST: 4 different zones

So you can name them America/Chicago, Australia/Canberra, etcetera. Daylight savings has started at various dates and times for the same zone.

Javascript: new Date(2011, 1, 29) can give 1 March, as February=1. For date checking it is better to check a date at 12:00 at the middle of the day.

Now Python. The datetime library supports timezones, but no zoneinfo is included. So there is pytz, which is always up to date. dateutil uses what the OS gives, which is probably also up to date. There are more advantages and disadvantages. "Which half past three do you mean?" is a hard question in Daylight Savings. You can tell pytz to break when no information for DST is given. I have recently created http://pypi.python.org/pypi/tzlocal that helps pytz a bit more here.

Parsing timezones. POSIX has a number and a sign wrong here.

Recurring events: repeat every third Monday, except when it is the first of the month and not the third year. You can come up with really ridiculous rules here. It got simplified luckily. dateutil has good support. With dateutil.easter you can say things like: get the third Sunday after Easter. Other crazy stuff is in dateutil.rrule. The icalendar module helps for creating and parsing calendar files.

So what happens when you mix timezoned and timezone-naive events? plone.app.event does not allow this. Timezones do not make sense for conferences on boats. Do you use an end-date or a duration? plone.app.event supports whole day events.

With a datepicker popup you can pick a date with javascript. That is fine. But you want a fallback for non-javascript too. A dropdown box for hours is okay. For sixty minutes this is a long list. Plone limits it to five minute steps. That is a decision you need to make. An end date and time should not always be needed.

Solgema.fullcalendar is good, with hardly drawbacks and it pretty. Plone4Artists calender is good too, without javascript. Think twice before you create something new yourself. And if you do, you should limit yourself.

In calendaring you can luckily ignore leap seconds.

My blog: http://regebro.wordpress.com/

Guido Stevens - Plone goes social

published Oct 12, 2012

Talk during the Plone Conference 2012.

Guido Stevens talks about Plone goes social at the Plone conference 2012.

A Mckinsey study value social business at 1.3 trillion dollars per year. You can get a 25 percent productivity increase by replacing email with social tools.

Social business chooses:

  • people over documents
  • flow over structure
  • network over hierarchy

It is about

  • read/write instead of publish/read
  • social activity instead of CMS
  • activity stream instead of a document tree

Plone out of the box is good at the old stuff. The new stuff is there in bits and pieces.

We have created a set of social components, as basis: plonesocial.suite. Just add that to the eggs in your buildout and install it. You add status updates in an activity stream on your front page. Comments added in the site also end up in the activity stream. You can filter what ends up on the home page. So there are microblog status updates that get stored in the ZODB, and you see content creation and plone.app.discussion comments.

There is social networking, like following people and seeing who they follow and who their followers are.

plonesocial.suite is the one-click installer, which installs these separate packages:

  • plonesocial.microblog
  • plonesocial.activitystream
  • plonesocial.network

Out of the box you could get about ten to twenty commits per second like this. So we developed some extra stuff. We dropped some ACID: we batch commits to once per second. We skip ZCatalog indexing. This makes more than 1000 commits per seconds possible. Storing is done in BTrees (thanks for the assistence during the Plone Open Garden, Maurits). This is an optimized dictionary interface made available by Zope. Also using itertools.chain to combine status updates and results from the catalog.

The PloneSocial philosophy is:

  • Use native Plone stuff. Do it the Plone way.
  • A full social experience
  • Pre-integrated one-click install
  • Flexible components
  • Scale down for small sites
  • Scale up for large sites

Get it from PyPI: http://pypi.python.org/pypi/plonesocial.suite

The source code of the packages is at https://github.com/cosent

There is an Open Space about this at 15:45 here in the Anniversary Hall.

We override the author.cpt template to show the status updates of the user there.

It would be nice to get a notification when someone starts following you.

It is used in production.

We can do more with liking content and following content.

Jan-Carel Brand - Instant messaging and real-time functionality with XMPP and backbone.js

published Oct 12, 2012

Talk during the Plone Conference 2012.

Jan-Carel Brand talks about instant messaging and real-time functionality with XMPP and backbone.js, at the Plone conference 2012.

This is about real-time, collaborative applications in Plone. The obvious example is instant messaging. The roots of XMPP are in there, especially Jabber. You can with XMPP have voice and video conferencing. There is an extension for that: jingle. You can use that to tranfer any data, so sending files to another. You can do feeds and notifications, with a publication/subscription (PubSub) setup. Collaborative editing is possible and that is what blew me away.

collective.xmpp.chat is a chat client. See the code on github: https://github.com/collective/collective.xmpp.chat

There is hardly anything that actually accesses the Plone server during the chatting. We only get the full name, otherwise you could keep chatting even when the server is down.

Building blocks are:

  • An XMPP Server and connection manager. Your browser makes a connection to the connection manager. Recommended is ejabberd, written in Erlang, which seems like a good language to use for this.
  • Nginx or Apache does the reverse proxy for the connection manager.
  • Plone add-ons:
    • collective.xmpp.core maps your Plone users to XMPP users. Thanks to Yiorgis Gozadinos for this!
    • collective.xmpp.collaboration
    • collective.xmpp.chat
    • collective.xmpp.pubsub

How does XMPP work?

  • It is the eXtensible Messaging and Presence Protocol
  • You need a Universal Unique Identifier (JID), like jcbrand@jabber.plone.org/sprint
  • Some data exchanged as XML stanzas: presence (status), messages, information or query.
  • A roster and a social graph: list/graph of contacts.

Stroph.js is your XMPP library for connecting to the server. It connects via BOSH to the XMPP server. You can add handlers for the stanzas with this or build your own stanzas. There are several plugins for it.

Backbone.js enables structured Javascript. You use this for example to show a chat box. The models have key/value bindings, custom events when a model has changed. You have a collection of models. Views: declarative event handling, templates (from underscore.js). Sync it with JSON if needed, like if you want to save the conversations in Plone.

I want everyone to be excited about what we can do real-time in Plone. Some ideas, with some that are already available:

  • Messaging:
    • multi/single user chat
    • file sharing
  • Collaboration:
    • documents, whiteborads, UML, mind maps
    • translations
    • pair programming in the Plone IDE or the Theme Editor
  • Continuous feedback:
    • system status messages
    • user feeds (twitter inside your intranet)
  • Audio or video conferencing

My website http://opkode.com

There is a buildout on github that you can clone:

https://github.com/collective/collective.xmpp.buildout

Ask me during the sprint if you want some assistence setting this up.

Martijn Faassen - Obviel: a client-side web framework

published Oct 12, 2012 , last modified Nov 09, 2012

Talk during the Plone Conference 2012.

Martijn Faassen talks about Obviel, a client-side web framework, during the Plone conference 2012.

I am Martijn Faassen. I have a company called Startifact, doing freelance work. We may know me from Formulator, Five, lxml, Grok, Fanstatic and Silva. You should use Silva CMS, not Plone, so I will talk about that now instead of Javascript. Well, okay, if you insist I will talk about Javascript.

Comparison in Javascript can have unexpected, or at least unpythonic results. Javascript is like badly broken Python, which is a compliment for Javascript.

Obviel can be used to build web applications. It runs on the client side. It is best used on a page that needs to be updated all the time. It helps you exploit 'modern' browser features like CSS, the DOM and AJAX.

What does a web framework need? What do they almost all have? Templates. Sometimes they think this is all you need (php). I have not written a server side template for years, only client side. Obviel is a template implementation. Obviel first used JSON-Template, but there was no i18n support and other things could be nicer too. With Obviel Template and JSON you get rendered HTML. The template language is minimalistic and logic-less.

{variable2}

foo

{name}

Rendering into the DOM:

$(el).render(obj)

Obviel somehow finds the template belonging to an object. Each obj should have an iface property. It is just a string. Templates are associated with ifaces too. You declare a view with obviel.view.

Obviel = OBject + VIew + ELement

What changes? The server doesn't need to do the work of rendering. The clients do that for you. The templates tend to be small snippets that can be rendered individually. Obviel Template is not text-based, but DOM-based. It directly manipulates the DOM. The effect is the same.

{name}

You define evenOdd as a javascript function in the view.

Click here!

clicked is again a javascript function you define to do nice things.

@. is the current list element. Here we use the view of that element:

i18n:

This will be translated

The starship .

In the i18n we can have pluralization:

There is {amount} light! || There are {amount} lights!

obviel.i18n is gettext based. You can use Babel to extract strings. Also works for Javascript using jsgettext. It works, has features and is documented.

Routing on the client side. Browser has history, links, back button. Hard to do on a single page, but we still want to support it. There is the url fragment hack, like http://example.org/app#state. Or use the HTML5 history API to directly manipulate the URL. The application state can be a path, like app/animals or app/animals/djangopony. The path points to view and/or model.

Thesis, antitheses and synthesis. Thesis is traversal, its antithesis is routing, the synthesis is traject, hopefully the best of both worlds. We use that. Traject has a Python implementation, so you should look into it for the server as well.

Join us. See http://obviel.org

Oh, I have created a form library for Obviel, otherwise it would not be a web framework. obviel.forms. Since it is client side, a round-trip for validation is not needed. You do not post multipart/form data to the server, just JSON. This is much nicer for nested and repeated fields.

It is extensively documented, did I mention that?

Oh, we have obviel.sync under development. Goal: keep a set of client-side models in sync with a backend, like ZODB or a relational database. The idea is that the backends are pluggable: HTTP/REST, websockets, localstorage. Your model and view code do not need to know about the backend details. You mark changes in a session and commit it. You configure declaratively how the backend is used. Automatically send events when models change, so the UI can be updated.

It fits your Plone brain already. It needs more users. It works on IE8, I do not guarantee it for earlier versions of IE.