martes, 1 de abril de 2014

Emerald Sprint 2014

I had the chance to attend to another awesome sprint... Winter is ending and the 2014 edition of the Emerald Sprint is on! Another fantastic location, plonistas, designers, hot tub, beer and spirits... what else can you ask for ?

This year, I was able to attend to the sprint, sponsored by the Plone experts at

The trip

After a long 33 hour trip from Argentina, I made it to Seattle, where I was kindly hosted by a very good friend, Fulvio Casali, in his sailboat, which, we used at the next day to get to the sprint location.

The location

The location for the 2013 edition of the Emerald sprint was incredible, and the 2014 one, did not fall behind. An amazing house in beautiful Whidbey Island, where 15 Plone developers and 2 designers can relax and create !

Also, why not, excercise

Fantastic food by Sally Kleinfeldt, a lot of bunny ears and even a fire pit! Indeed a nice place to enjoy the great drinks by our own Ross Patterson and Gin-Apocrypha

The Sprint

This year's topic was improving the login story for Plone 5, coming soon to a download server near you.
The first day we did some brainstorming, with sticky notes that didn't stick that much... nothing that a bit of duct tape couldn't solve.

Groups formed into different tasks. I decided to work on rewriting all the old forms that were based on cpt, vpy, and cpy, to modernize them using z3c.form

Some mockups by the designers that joined us

Log in
Sign up
Need help?
Pretty nice, huh ?
So, we (AndyChrisCrisEricGilLiz, Trish, and me) started working in a new package that eventually will be merged with, called plone.login.

A lot of work was made, and we managed to push 180 commits in 3 days!

The strategy was to start with basic forms first, and then start adding additional functionality.

Registration form

Registering to the site works, and it will validate proper email and username were entered. It will also check if a user is already registered with that username.
After successfuly registering, it will automatically log you in.
Federated login and password strength are there only as placeholders.
It is still not wired to the "Let users select their own password" option in the security tab.

Login form

Loggin in to the site works. In the case you are asked to login because you don't have permissions to access a specific page, it will redirect to it after loggin in.
Federated login is also left here as placeholder, and it doesn't yet provide the "Remember me" kind of checkbox.
Also the came_from needs a bit of love handling some specific scenarios, and to allow to easily customize it ;)

Login help

This view will allow you to recover your username and/or password, in case you forgot any of them.
It's not yet functional, and also needs options from the control panel to control which of them are allowed, or maybe even neither.

Insufficient privileges

This view asks you to login, if you are not, and you are trying to access a private page. If you are logged in already, it will clearly state that you are logged in, but you don't have permission to access it.
It is not there yet, but eventually, it will allow you to "Ask access", in which case, a person with proper permissions will get notified and decide to give that person access.

Complete your profile

This is a new view introduced now. Plone 5 will allow you to customize the fields the users of the site will have, by using a through-the-web tool, very similar to the one used for managing dexterity fields. Steve wrote a nice blog post about the work done in the sprint, where you can read more about this.
This tool will allow you to choose which fields are required, so, after registering to the site, a user will get redirected to this view, which will ask to complete his profile, as opposed to having a huge register form.
I'm not sure, but I think this functionality needs further discussion, and the view, further work.

That's it folks!

Even that a lot was done during the sprint, this still needs a lot of work, adding more and more functionality and finishing up others... also tests, tests, and more tests!

Want to help? great! clone plone.login, run the buildout and commit changes! By the way, the product works in Plone 4 ( wink, wink... )

See you in the next Emerald Sprint !

Bonus Track

A great video made by Trish about the event here

More mockups by Cal Doval

Users profile in "Edit mode"
Users profile in "Public mode"
The "Add-ons" panel
The "Site security" panel
The "User settings" panel

jueves, 10 de octubre de 2013

Including Plone Mockup in your own project ( Part 2 )

2 months ago, I wrote a blog post: Including Plone Mockup in your own project, and now, after some feedback from people trying it, and work done in the sprints after PloneConf 2013, I'm writing this new entry with changes from the recent version (0.0.4) of the package.

Version Bugfix

The generator allowed to use any format for versioning, and 'npm install' complains if the version is not in the X.Y.Z format. So now, if you specify a version shorter, the generator will add ".0" as necessary at the end. If it is longer, it will remove the extra ones. For example:
  • "1" -> "1.0.0"
  • "1.2" -> "1.2.0"
  • "" -> "0.2.0"

UglifyJS, CssMin and LESS

Up to now, the package was generating a widgets.min.js, giving the wrong impression that this was a minified Javascript, when it wasn't the case. Now, not only the name was changed to "bundle", but also, you will get, after compiling, a "bundle.js" and a "bundle.min.js", the latter being the uglified version of the first one.

Also, after running "grunt", you will get a "bundle.css", which is generated from "less/bundle.less", and a "bundle.min.css", which is the minified version, of course.
At this point, this file includes everything from the mockup project, you should modify it to include any specific you might need.

Development Mode

Before 0.0.4, you needed to compile your changes to your patterns/bundle, and then with the compiled Javascript file, test it in your project.
This is no longer the case. Now, there's a new folder created, called "dev", where you will find a "dev.html" and a "dev.js" files.
You don't need to pay much attention to dev.js, this is what will include require.js and configure it, to import your bundle with its dependencies.

So, now to develop your pattern, all you need to do is add relevant HTML code to "dev.html" and open the file with your browser.
Any change you do to your patterns/bundle will get reflected in the browser with just a refresh.

Finally, when everything is ready, you can compile as usual and include your compiled Javascript into your project, as usual.

Test Skeleton

From version 0.0.4, all the configuration needed to run tests, and a test skeleton is already included after "yo" finishes. All you need to do is go to the "tests" folder, open the "pattern-[something]-test.js" file, add some tests, save the file, and then from the package, run "grunt test".
If instead of "PhantomJS", you would like tests to be run using Chrome (or Chromium), just run "grunt karma:dev_chrome"

Minor Changes

  • As mentioned before, the bundle file is no longer called "widgets.js", but, "bundle.js".
    Also the compiled files are called "bundle".
  • Now the generator, includes a, so 'npm install' doesn't give a warning about it.

Known Bugs

Do not use spaces for neither your project name, or pattern name.

Happy mock'ing ! :)

lunes, 5 de agosto de 2013

Including Plone Mockup in your own project


Plone Mockup is going to be the future in Javascript development in Plone from version 5.0 and up. If you still don't know what is this all about, here are a couple of links to get you started:

This blogpost, however, is not about an introduction to patterns, mockup, and all that, and assumes you already know the basics.

From July 23rd to the 26th, in the city of Rosario, Argentina, the second edition of the Cafecito Sprint was held, and although working on Mockup is not listed among the primary goals, it was one. And so, I worked on finding an easy way to let people include and develop patterns for their projects.

Let's get started

UPDATE 2013/10/10: There's a follow-up with some stuff that was changed since this write up, please go here and read about them if something here no longer works.

There are 2 major code "locations" to pay attention in Mockup:
The "Patterns" location is where all the different patterns are developed. 
(For the ones getting started with patterns, mockup, etc, as a quick tip, I would suggest to take a look into the "accesibility.js" or the "tablesorter.js" ones, to get started with really easy ones, and then go ahead and check a more complex one, such as "modal.js".)

The "Bundles" location is where bundles are (shocking!). Basically this will be the place to list the patterns you wish to include with your project, and where you will include code you want to get executed prior to the registry scanning the DOM. (Take your time to check how work to get a better understanding of all this...)

After compiling this code, you get the Javascript file you need to include in your project. This should be the only Javascript you need to include, as it contains everything.

Now, what happens if you want to use some patterns, not all of them, and/or you want to keep using your old Plone Javascript (without replacing it with patterns, as does.)?

Say hello to generator-plonemockup (This package is most probably going to be merged into Mockup itself in the future)

This new product, is the result of my research and work in the Cafecito Sprint, and is a generator intended to be used with Yeoman, which is a tool used by Javascript developers to generate new projects, get their dependencies, and build/compile the final product. If you don't know this set of tools, I suggest you read its docs and play around with it for a bit.

Enough introduction, let's get our hands dirty

Assuming you have Yeoman tools already installed (globally), all you need to do is the following:
  1. Install plonemockup generator using npm

    $ npm install -g generator-plonemockup

    If you didn't have any network, or "global npm" related issues, you should end up with the generator installed.
    Note: I had problems with "bower" 1.0.0, so I had to downgrade to version 0.10.0
  2. Create your project

    $ yo plonemockup

    Note: Bear in mind that "yo" assumes your project's directory is the current directory, so all files and folders will be generated in the current path, instead of a new folder with the project name.

    You will be presented with some questions, that if you answer them correctly, you shouldn't need to manually rename, move, etc any files or configuration options.
    I recommend you generate some test projects just to see what each option will result in the generated project.
  3. Make sure that when the process ends, you didn't get any errors, and that you do, in fact, have a folder in the current directory named "bower_components". If you don't, then you may need to downgrade "bower", and re-run "bower install" to get dependencies.
  4. (optional) Install additional dependencies your pattern may need.
If you reached this far, you should now have a bunch of files in your current directory, and you are ready to start coding your own pattern, bundle, or both.
Take a look at config.js, as here are listed the paths for getting each component when compiling the final Javascript that you will use in your project.

Let's go ahead and open "js/bundles/widgets.js" "js/bundles/bundle.js" file. And let's say, all you want is the "tablesorter" pattern in your project and nothing else. Where it says "<!~~ Add patterns below this line ~~!>", you should see the pattern that the generator created, listed below, named "[project_name]-patterns-[pattern_name]", so this name will depend on the names you used when answering the questions up there.
Since we are not developing a new pattern, then just replace this with "mockup-patterns-tablesorter", which is the name for the tablesorter pattern (check config.js file).

Save the file, and go to the project directory and run "grunt". You should see the directory paths for the dependencies, and an ending message saying: "Done, without errors.".
If this is the case, then you should get a "build/widgets.min.js" (which, at the moment of this writing, is not automatically minified, as the filename suggests) "build/bundle.js" and a minified version "build/bundle.min.js".

In order to test that everything worked fine, you can create a test html including this generated Javascript (along with the jquery you intend to use, since that is the only dependency not included with the result Javascript), and a table:

Check this example, which includes the compiled Javascript, the jquery and a table as defined in the tablesorter example

Of course, this bundle *only* includes this pattern, but you get the idea... you should list all the patterns you wish to use, and if you plan to develop your own, then do not remove the line we removed initially, and go to the js file that was created inside "js/patterns" to do the development.

If you want to develop additional patterns, then all you need to do is copy the same "skeleton" of this js file with a new name, and make sure you update the config.js accordingly.

If you want to include everything the Plone Mockup brings, and code "on top" of it, all you need to do is remove the comment from "mockup-bundles-widgets". This will cause everything (including the bundle) from Mockup to be included.

Finally, as does, everything you put into "transform", will be executed before having the registry to scan the DOM, so you can make any changes you need here.

What remains to be done

At this moment, the generator is at version 0.0.2, and what I would like to have in future versions:
  • Tests for the generator
  • Generate proper test skeleton with the resulting project (after running the generator) (Done as of version 0.0.4, read here)
  • Have a subgenerator to genereate patterns (provided we can get the project name when running the subgenerator)

So, start using it, report bugs, enhancements, and (preferably :P) pull requests.

viernes, 17 de diciembre de 2010

El adiós a un grande

En el día de ayer (Jueves 16 de Diciembre del 2010) se despidieron los restos de una de las personas más grandes que tuve el gusto de conocer, el Dr. Julio César Salazar.
Yo lo conocía desde poco menos de un año, y en ese tiempo, pude ver lo excelente persona que era. Que se vio evidenciado en su despedida. Muy emotiva, repleta de gente, familiares, amigos y mucho más.

Son estos momentos, los que a uno le hacen pensar y darse cuenta, cuales son las cosas que hacen "grande" a una persona. Cuales son las acciones que marcan una huella profunda en la vida de los que nos rodean. Qué es una verdadera "riqueza"... y ésta no es tener millones de dolares, casas, vehículos, etc. Es que miles de personas te lleven en sus memorias y en sus corazones, gracias a tus buenas acciones completamente desinteresadas.

Que vale más? haber amasado una fortuna monetaria o una fortuna sentimental? que a tu velorio vayan un puñado de interesados por obtener tajada en lo que dejaste o que vaya todo un pueblo porque sienten profundamente que te hayas ido ?

Una de las cosas que dijo el padre en el velatorio fue "Quien no le debe algo a julito?", evidenciando así la completa entrega de Julio por ayudar a quien lo necesitara, recibiendo cualquier cosa a cambio de atención medica, inclusive a veces nada... lo cual me trajo instantáneamente a mi cabeza al Dr. René Favaloro. Quizás Julio no fue tan conocido, o no realizó una obra tan significativa como Favaloro, pero considero que su entrega, dedicación, pasión por lo que hacía, instinto de ayudar sin importar nada, ética, moral, y sus valores personales, fueron iguales.

Y a pesar de haber sido una persona excepcional, la vida lo trató de la peor forma... dándole una terrible enfermedad que lo mantuvo sufriendo durante meses. Una asquerosa injusticia de la cual no existe libro de quejas para reclamar.

El mundo perdió a una persona excelente, a un flor de tipo, de esos que hay pocos.

Querido Julito, para concluir este breve escrito, me despido hasta siempre, con las mismas últimas palabras que me dijiste:
"Te voy a extrañar mucho"

Q.E.P.D - Dr. Julio César Salazar (09/07/1951 - 15/12/2010)

martes, 8 de junio de 2010

Problema con StoneageHTML y cssutils

Si has llegado a este post por realizar una busqueda en tu buscador favorito, lo mas probable que sea porque te has topado con el mismo problema que me hizo renegar unas buenas horas. Y es ese el motivo por el cual agrego esta entrada a mi blog, quizas a alguien mas le ahorra un par de horas.

Time 2010/05/31 14:28:38.352 GMT-3
User Name (User Id) xxxxxxxx (xxxxxxxx)
Request URL
Exception Type AttributeError
Exception Value 'list' object attribute 'append' is read-only

Traceback (innermost last):

* Module ZPublisher.Publish, line 119, in publish
* Module ZPublisher.mapply, line 88, in mapply
* Module ZPublisher.Publish, line 42, in call_object
* Module plone.z3cform.layout, line 49, in __call__
* Module Shared.DC.Scripts.Bindings, line 313, in __call__
* Module Shared.DC.Scripts.Bindings, line 350, in _bindAndExec
* Module Products.PageTemplates.PageTemplateFile, line 129, in _exec
* Module Products.PageTemplates.PageTemplate, line 89, in pt_render
* Module zope.pagetemplate.pagetemplate, line 117, in pt_render
* Module zope.tal.talinterpreter, line 271, in __call__
* Module zope.tal.talinterpreter, line 346, in interpret
* Module zope.tal.talinterpreter, line 891, in do_useMacro
* Module zope.tal.talinterpreter, line 346, in interpret
* Module zope.tal.talinterpreter, line 536, in do_optTag_tal
* Module zope.tal.talinterpreter, line 521, in do_optTag
* Module zope.tal.talinterpreter, line 516, in no_tag
* Module zope.tal.talinterpreter, line 346, in interpret
* Module zope.tal.talinterpreter, line 891, in do_useMacro
* Module zope.tal.talinterpreter, line 346, in interpret
* Module zope.tal.talinterpreter, line 536, in do_optTag_tal
* Module zope.tal.talinterpreter, line 521, in do_optTag
* Module zope.tal.talinterpreter, line 516, in no_tag
* Module zope.tal.talinterpreter, line 346, in interpret
* Module zope.tal.talinterpreter, line 949, in do_defineSlot
* Module zope.tal.talinterpreter, line 346, in interpret
* Module zope.tal.talinterpreter, line 536, in do_optTag_tal
* Module zope.tal.talinterpreter, line 521, in do_optTag
* Module zope.tal.talinterpreter, line 516, in no_tag
* Module zope.tal.talinterpreter, line 346, in interpret
* Module zope.tal.talinterpreter, line 957, in do_defineSlot
* Module zope.tal.talinterpreter, line 346, in interpret
* Module zope.tal.talinterpreter, line 536, in do_optTag_tal
* Module zope.tal.talinterpreter, line 521, in do_optTag
* Module zope.tal.talinterpreter, line 516, in no_tag
* Module zope.tal.talinterpreter, line 346, in interpret
* Module zope.tal.talinterpreter, line 891, in do_useMacro
* Module zope.tal.talinterpreter, line 346, in interpret
* Module zope.tal.talinterpreter, line 957, in do_defineSlot
* Module zope.tal.talinterpreter, line 346, in interpret
* Module zope.tal.talinterpreter, line 536, in do_optTag_tal
* Module zope.tal.talinterpreter, line 521, in do_optTag
* Module zope.tal.talinterpreter, line 516, in no_tag
* Module zope.tal.talinterpreter, line 346, in interpret
* Module zope.tal.talinterpreter, line 534, in do_optTag_tal
* Module zope.tal.talinterpreter, line 516, in no_tag
* Module zope.tal.talinterpreter, line 346, in interpret
* Module zope.tal.talinterpreter, line 949, in do_defineSlot
* Module zope.tal.talinterpreter, line 346, in interpret
* Module zope.tal.talinterpreter, line 536, in do_optTag_tal
* Module zope.tal.talinterpreter, line 521, in do_optTag
* Module zope.tal.talinterpreter, line 516, in no_tag
* Module zope.tal.talinterpreter, line 346, in interpret
* Module zope.tal.talinterpreter, line 949, in do_defineSlot
* Module zope.tal.talinterpreter, line 346, in interpret
* Module zope.tal.talinterpreter, line 586, in do_setLocal_tal
* Module zope.tales.tales, line 696, in evaluate
URL: controlpanel
Line 10, Column 4
Expression: Names: {'container': , 'context': , 'default':


'here': ,
'loop': {},
'nothing': None,
'options': {'args': ()},
'repeat': ,
'request': URL=http://xxxxxxxxxxxxxxxx:8080/[…]/newsletter-stats.html>,
'root': ,
'template': ,
'traverse_subpath': [],
'user': ,
'view': ,
'views': 0xb0e04a8c>}

* Module zope.tales.expressions, line 217, in __call__
* Module Products.PageTemplates.Expressions, line 161, in _eval
* Module Products.PageTemplates.Expressions, line 123, in render
* Module plone.z3cform.layout, line 58, in contents
* Module plone.z3cform.layout, line 66, in render_form
* Module z3c.form.form, line 189, in __call__
* Module plone.z3cform.crud.crud, line 381, in update
* Module plone.z3cform.crud.crud, line 229, in update
* Module z3c.form.form, line 186, in update
* Module z3c.form.action, line 99, in execute
* Module z3c.form.button, line 302, in __call__
* Module z3c.form.button, line 170, in __call__
* Module collective.dancing.browser.stats, line 124, in handle_process_jobs
* Module collective.singing.async, line 22, in process
* Module collective.singing.async, line 37, in __call__
* Module collective.dancing.browser.sendnewsletter, line 51, in _assemble_messages
* Module collective.singing.scheduler, line 117, in __call__
* Module collective.singing.scheduler, line 109, in render_message
* Module collective.dancing.composer, line 307, in render
* Module plone.memoize.volatile, line 272, in replacement
* Module collective.dancing.composer, line 297, in _render
* Module stoneagehtml.stoneagehtml, line 91, in compactify
* Module stoneagehtml.stoneagehtml, line 208, in compactify
* Module cssutils.css.cssstylesheet, line 106, in _setCssRules

AttributeError: 'list' object attribute 'append' is read-only

Bien, ahora, a que se debe esto ? bueno, basicamente, en las ultimas versiones del producto cssutils[0] (yo me tope con el problema en la version 0.9.7a4) en el archivo cssutils/css/ linea 104, se sobre-escribe el metodo setter del campo cssRules (atributo de la clase), en donde se intenta reemplazar el metodo 'append' de cssRules (parametro de entrada del metodo).

El problema radica, cuando en lugar de que cssRules (parametro del metodo) sea un cssutils.css.CSSRuleList, sea una lista (tipo built-in de python), lo que provoca que dicha excepcion se levante.

Esto ultimo, es provocado por la linea 208 del archivo stoneagehtml/ del producto StoneageHTML[1]:

sheet.cssRules = self.filterCSSDeclarations(sheet.cssRules)

ya que filterCSSDeclarations devuelve una lista (la cual se pasa al setter del cssRules, provocando el crash descripto arriba).

La solucion, seria que stoneageHTML se actualizara, para funcionar con las ultimas versiones de cssutils, pero al momento de escribir esto, dicha solcion no existe, con lo cual la siguiente solucion es hacer un downgrade de cssutils. En mi caso, lo hice a la 0.9.5 ya que es la que en fechas esta mas cerca del lanzamiento de stoneageHTML 0.1.5, luego de lo cual, el crash desaparecio y todo funciona bien de nuevo.

Ya me puse en contacto con el desarrollador de StoneageHTML para informarle de este bug, y ver si puede especificar la dependencia de cssutils para que su producto funcione, o que en su defecto saque una version mas nueva de StoneageHTML. Tratare de actualizar la entrada con la informacion que obtenga de el.

[0] -
[1] -

domingo, 11 de octubre de 2009

Charla de difusión de herramientas de Software Libre para el diseño (3D principalmente)

Disclaimer: Las fotos dan asco, lo se :(

Este sábado asistí a la charla que Martin Eschoyez dio en el Pabellón Argentina en el marco del Anima 09

Si bien yo hace rato que vengo jugueteando con Blender, mi principal motivación para ir fue para ver si aprendía algunas técnicas de modelado, o tips de parte de Martin (el tipo es muy groso, podes ver algo de su laburo aca y aca) ya que cuando avanzo un poco en el modelado de algo medianamente complejo, me trabo en cosas simples que no se hacer, y tengo que empezar de cero :-(

En fin, la cosa es que me sorprendió (muy felizmente por cierto) ver que la charla tuvo un altísimo componente en cuanto a la difusión del Software Libre y contarle un poco a la gente sobre de qué se trata esto, los beneficios que trae a la comunidad, a la sociedad, al aprendizaje, y bueh, todo lo que ya sabemos acerca de las bondades del mismo (si no las sabes, te recomiendo que leas el artículo de la Wikipedia, o que busques en Google al respecto, o de última, cerveza de por medio, te cuento un poco de que se trata ;) )

Desgraciadamente "time's a bitch", y el tiempo se fue volando. Asimismo, tuvo tiempo para mostrar algunas cositas de Blender, también algo de Inkscape (no sabía LO FACIL que puede ser vectorizar una imagen, realmente quedé sorprendido) y solo llegó a mencionar GIMP

En cuanto a Blender, modeló un avioncito en 5 minutos usando un cubo y extrudando sus caras (no recuerdo el nombre de esta técnica, si alguien la sabe deje comentario, pero creo que es Cube Modelling ?) y aprovechó en ese modelo para mostrar lo sencillo que es texturizar usando coordenadas UV
Luego mostró un poco de cómo riggear un modelo, y como animarlo usando key frames y luego ajustando las curvas IPO.

También alcanzó a mostrar así muy velozmente el motor de física integrado, y el de telas (ropa)
Ahh, y tambien mostro unos renders usando el motor de pelo, que estaban realmente increibles.

Lamentablemente no alcanzó a mostrar el (en mi opinión) caballito de batalla, el cual es el motor de fluidos.

Por último modeló y riggeó la mascota del evento (el ñandú) usando solo planos para cada una de sus partes, mostrando aca los efectos de la cinemática directa e inversa, y haciendo cosas interesantes con la luz ya que estos planos se encontraban a distintas profundidades, logrando una imagen en 2D pero con sensación de profundidad (creo que esto se llama 2.5D si mal no recuerdo)

En resumen, me gustó mucho el evento, hubiese estado bueno que durara más tiempo, pero bueno, "e' lo que hay" :-)

aca abajo dejo unos links a videos de YouTube mostrando cosas hechas con blender:






y hay miles más. Ahora si por último, un par de cortos hechos en Blender, y un largometraje que se está haciendo en Argentina usando íntegramente Software Libre, que lamentablemente por (según tengo entendido) problemas de presupuesto, se encuentra parado, pero tengo fe que va a terminarse:

Elephants Dream:

Big Buck Bunny:

Plumiferos (El largometraje argentino):

Como verán esto da para muchísimo más, pero lo dejo acá.

Hasta la próxima

lunes, 7 de septiembre de 2009

Pycon Argentina 2009

El fin de semana estuve en Buenos Aires para la primera PyCon Argentina realizada en la Universidad de Belgrano.

En primer lugar, la conferencia estuvo fabulosamente bien organizada, todo salio espectacular y no hubo problemas (bueno, un pequeñito corte de luz justo cuando dabamos nuestra charla, pero obviamente no tuvo nada que ver con la organizacion del evento) asi que felicitaciones realmente a toda la gente involucrada porque fue un laburo admirable.

Mi dia comenzo el viernes a las 5 AM cuando me levante para ir para el aeropuerto, como veran, una luna fabulosa (no se alcanza a ver bien en la foto, pero creanme, se veia genial)

Emanuel paso a eso de las 6 menos cuarto, y desde mi casa nos tomamos un taxi.
Embarcamos, y 54 minutos despues ya estabamos en Bs As. El vuelo estuvo fabuloso, yo estaba como nene ahi arriba.

A eso de las 9 AM. aprox, llegamos a la Universidad, un edificio impactante, y nos registramos

La primer charla que vi fue la de Andres Riancho sobre "Python como un lenguaje de hacking" la cual estuvo muy buena, ya que Andres la tenia bastante clara y pudo mostrar todas las cosas de una manera muy entendible

Despues, vi un poco de la charla de "humitos" sobre Django, que tambien estuvo buena, pero no pude terminar de verla, porque ya venia mi charla que daba con Emanuel y nueces sobre Plone.

La charla nuestra estuvo linda, hubo bastante gente atendiendo, pero se nos corto la luz a los 15 minutos de haber comenzado, asi que seguimos un poco sin luz, y dimos el resto cuando volvio la misma, y lamentablemente muy rapido ya que habiamos perdido mucho tiempo y habia que terminar, pero por suerte creo que la idea general se entendio, asi que podriamos decir que fue un exito.

Aca sin luz :P

Luego del almuerzo, no fui a ver ninguna charla a las 14hs, pero vi la de las 15hs "Hacking Django, mismo framework, distintos paradigmas" que dio Nubis, la cual estuvo MUY interesante porque mostro cosas muy copadas para hacer con Django.

Para terminar con ese dia, se dieron unas Lightning talks bien variadas, y por ultimo una charla de Jacob Kaplan-Moss que me gusto mucho, basicamente rondaba alrededor de "el desarrollo web apesta, que podemos hacer para cambiar eso ?" y digo que me gusto bastante, porque coincido con el y me gustaria que el desarrollo web sea distino (obvio que no se como, pero que lo sea :P)

En el segundo dia de PyCon, nos levantamos tarde con los chicos en el hostel, asi que me perdi por cuarta vez (creo que es la cuarta, ya perdi la cuenta :P), la charla de Facundo sobre Unicode, espero poder verla alguna vez...

La que si pude ver, fue una charla/panel armado entre gente que usaba distintos toolkit graficos (wxPython, PyQT y PyGTK) que estuvo muy interesante, y basicamente todo se resume a que son todos lo mismo, y que uses el que mas te guste esteticamente :)

Luego asisti a la charla de Mariano Guerra sobre como inicio el desarrollo de emesene, un cliente de mensajeria instantanea para MSN y ahora tambien para Jabber. Estuvo muy buena porque comento bastante lo que es estar involucrado en un proyecto de software libre, y de lo facil que resulta, si tenes una buena idea, conseguir gente que te de una mano.

A continuacion, vi la charla de Facundo Batista, sobre Python 3000, que estuvo muy interesante ya que se mostraron los cambios que se introducen a partir de la nueva version de Python, y que hay que ir teniendo en cuenta, realmente son cambios que van a estar bastante buenos.

Luego de nuevo a comer, y no pude llegar temprano para ver ninguna de las charlas, asi que me meti en la charla que estaba dando Lucio Torre sobre Twisted para seres humanos, pero dado que la agarre empezada, no entendi nada :P

Luego, vi la charla del Mati Bordese, sobre el Bytecode de Python, y de como decompilar una aplicacion, inclusive asi haya sido convertida en EXE usando py2exe. Realmente interesantisimo y muy poderoso.

Luego otra sesion de charlas relampagos donde se trataron de los mas diversos temas y por ultimo, cerro la conferencia Collin Winter, un chabon que labura en Google, en un proyecto llamado Unladen Swallow, en donde intentan hacer python 5 veces mas rapido. Se nota que la tiene bastante clara y que sabe MUCHO. La charla fue buenisima, porque se entendia de que estaba hablando, pudo llegar a la gente, por lo menos a mi :)

Y como broche final, el evento de cierre, donde se conto un poco la historia de PyAr en estos 5 años de vida, y se realizo un sorteo de libros, vasos, calcos, etc.
Aca una imagen de la cantidad de gente que asistio.

Y para terminar con el post, una foto con todos los ¨Pitufos" como los llamaba Facundo, que fueron los responsables de que todo saliera espectacular como salio.
Se llevaron un merecidisimo aplauso de toda esa gente en la foto de recien.

En resumidas cuentas, la conferencia estuvo buenisima, la pase genial y conoci gente muy copada (como siempre pasa en este tipo de eventos).

El año que viene (2010) PyCon Argentina es en Cordoba, asi que asistencia obligada ;)