Skip to content
jul 23 13

Valoración deSymfony 2013

by David

Un mes después de deSymfony, y tras haber leído muchas de vuestras opiniones, ya sea vía el cuestionario que pasamos o leyendo los resúmenes por diversos blogs, voy a mostrar mi opinión sobre algunos aspectos del evento. No he entrado en profundidad en todos los temas, si lo hiciese daría para varios posts, simplemente he pretendido dar mi visión como organizador sobre algunos apartados del evento.

Aviso, el post puede ser un poco ladrillo :)

Lugar

Este año teníamos el reto del cambio de lugar, Castellón era un lugar que estaba mas o menos controlado, y el movimiento a Madrid nos hacía volver a empezar en muchos aspectos por lo que reto era mayor, debíamos mantener el nivel de otras ediciones en una ciudad nueva y mucho más grande, con sus correspondientes problemas logísticos.

Hemos de dar las gracias a la Escuela Universitaria de Informática de Madrid y a su dirección porque en todo momento se han mostrado cercanos, creyendo en este tipo de eventos y con ganas de colaborar y solucionar todos los problemas que nos surgiesen.

En mi opinión el lugar era correcto, teníamos un salón de actos grande, cómodo y que era capaz de albergar el número de asistentes que arrastra deSymfony. Las dos salas estaban cerca la una de la otra y los desplazamientos eran cómodos. El salón para las comidas y el coffee-break eran adecuados, y alrededor del edificio había una zona ajardinada donde poder descansar cómodamente.

Las partes negativas, y muchas reportadas por vosotros, eran el coste en tiempo para desplazarse hasta allá, la imposibilidad de quedarse por allí después del evento, lo que iba en perjuicio del networking, la gran diferencia entre las dos salas, el problema puntual con el audio, las colas en las comidas, poca señalética externa, …

Vayamos por partes, respecto a la diferenciación en las salas, matizar que lo que se llamó “sala pequeña” tenía una capacidad para unas 170-180 personas, lo que supone el aforo de la segunda edición. Es difícil encontrar un lugar que proporcione un salón de actos grande y dos salas “pequeñas” (200 personas cada una) exactamente iguales a un precio asequible. Entiendo que eran diferentes, pero se buscó que al menos casi el 50% cupiese en cada una.

Si comparto que el lugar estaba un poco desplazado y que lo ideal hubiese sido estar más céntrico, pero una vez más, temas presupuestarios entran en acción y había que adaptarse, para próximas convocatorias, soy partidario de buscar un lugar que sea hotel+conferencia, cosa que algunos nos habéis planteado y en principio veo acertado.

Respecto al tema del audio, la universidad era un lugar nuevo, y como dije antes, ciertas cosas teníamos que re-aprenderlas, y una de ellas era la grabación de las charlas. En la sala grande existieron una serie de problemas, y creo que los fuimos subsanando rápidamente: audio, iluminación, aunque la infraestructura de audio de la sala grande tenia unos problemas con difícil solución que mejoramos como pudimos. La sala pequeña no ofrecía más alternativas y había que amoldarse a ella, aún así, reconozco que acústicamente a veces era conflictiva.

Comida

Viniendo de Castellón y de ver el tratamiento que dimos a las comidas, el desplazamiento a Madrid era un reto no superable :)

Hay que recordar que somos un evento tecnológico y no gastronómico, por lo que las comidas debería ser algo “secundario” y no la parte más importante. Aquí teníamos dos opciones, dar un menú tal y como hicimos a sabiendas de que se generarían colas, o entregar una bolsa con comida. La primer opción parecía más elegante que la segunda, pero con la problemática de ir todos a la vez y la segunda, tras venir de Castellón podría parecer un poco “pobre”. ¿Qué decisión tomar? pues difícil a priori, preferimos dar el menú, que era más completo.

En favor de la universidad decir que sirvieron bastante rápido, y que incluso a la gente le sobró tiempo para poder descansar antes de empezar la sesión vespertina. Está claro que la cola era un poco fastidioso, pero yo aproveché para hacer networking ;) , el resto del día me era complicado.

En fin, aquí tenemos opiniones para todos los gustos, gente que prefería la bolsa para rápidamente hablar con la gente y aprovechar más el tiempo, gente que la cola no le ha molestado o que ha visto el menú adecuado y gente que no le importa tanto la comida y ve bien cualquier opción.

Respecto a los coffee-breaks, creo que fueron correctos en tiempo y variedad de comida, de todas formas, no pude ni acercarme por temas organizativos.

Charlas

Mi idea siempre ha sido que desymfony sea un lugar donde se hable sobre Symfony pero también de todas aquellas temáticas satélite que nuestro día a día requiere. Hay ediciones donde Symfony debía copar el 100% de las charlas, por ejemplo cuando surgió la versión 2 del framework. Por aquel entonces todo era novedad y la gente quería conocer. Ahora, una vez más asentado el framework, se puede dar paso a charlas sobre control de versiones, testing, buenas prácticas, escalabilidad, etc.

Otro punto por el cual apoyo charlas no puramente Symfony, es por la propia “historia del desarrollador PHP”, ¿y qué quiero decir con esto?, por todos es sabido que a PHP nunca se le ha considerado un bueno lenguaje OOP, o que PHP “es una comunidad sin buenos hábitos/prácticas”.

Más allá de debatir sobre PHP, creo que en la comunidad se están haciendo grandes cosas para traer buenos hábitos al mundo PHP: composer, inyección de dependencias, etc, de hecho Fabien Potencier, en su charla de Beyond PHP hablaba de no reinventar la rueda y que si otros lenguajes tenían buenas ideas porque no adoptarlas e incorporarlas al mundo PHP. Entonces, como decía, deSymfony me gustaría que fuese un lugar donde se “enseñe a programar” más allá del lenguaje que utilicemos.

En cuanto a la elección de las charlas, tened en cuenta que partimos de un título y una descripción, acorde a eso nos tenemos que hacer una idea de que va a contar un ponente durante los 40 minutos, y escoger entre muchas, muchas propuestas. Por ello es de vital importancia que el ponente narre correctamente su propuesta, tiene a penas unos párrafos para desgranar su idea.

Otro debate es el número de tracks, mi opinión es que tres son muchos y uno puede quedar corto sino se complementa con más cosas, quizá una medida justa sea “track y medio”, es decir, tener dos tracks pero con varias keynotes por día.

Llega un momento en el que contar cosas nuevas es difícil, y los ponentes cada vez tienen una exigencia mayor por parte de los asistentes, y por consiguiente los organizadores. Una propuesta de agenda que hago para futuras ediciones sería reducir el numero de charlas en favor de debates u Open Spaces. Muchos asistentes seguro que ven enriquecedor poder conversar sobre los problemas diarios a los que se enfrentan y ver como han sido solucionados por otros, o crear grupos para hablar de Doctrine, Twig, … En resumen, menos charlas y más espacio a debates, talleres y networking. La cuestión sería como articular todo eso porque 400 personas son muchas personas :)

Ah! solo apuntar una cosa más por la que algunos os habéis quejado. Aunque en la agenda ponga que las charlas tienen de duración una hora, tened en cuenta que esa hora incluía (y así lo notificamos a los ponentes), 40 minutos para la charla, más 10 de preguntas, más 10 para facilitar el cambio de sala de la gente y preparación del nuevo ponente.

Unconference

Todos los años surge el debate sobre el unconference y nunca encontramos la fórmula adecuada, que si el domingo es tarde y la gente se quiere marchar, que si tres días son muchos, que si es mucho esfuerzo para lo que implica, etc, en fin, un conjuntos de preguntas a las que muchas veces no encontramos respuesta y por ello preferimos no hacerlo.

Este año es la segunda edición que lo hemos llevado a cabo, y al contrario que la otra vez, lo hemos celebrado la tarde de antes, con la fórmula de pequeñas charlas más un taller. Las opiniones han sido positivas, pero cometimos el fallo de avisarlo tarde, y por ello pedimos disculpas, pero como siempre no encontrábamos el modo, y cuando nos decidimos tuvimos que acelerar para poder llevarlo adelante. Además dar las gracias a los 5 ponentes que aceptaron el reto pese al tiempo disponible: Alfonso Alba, Adán Lobato, Daniel González, Unai Roldán y Asier Marqués.

Networking

Es un tema que siempre queremos fomentar, cierto es que esta edición podemos haber flojeado con el, y en eso hago autocrítica, para próximas ediciones pondremos el foco en el para no perderlo, ya que, en mi opinión, es una de las grandezas de deSymfony.

Castellón es una ciudad pequeña donde el moverse juntos de un lado a otro es mas fácil que en Madrid. En Castellón casi todos convivíamos en el mismo hotel lo que ayudaba a ir y volver juntos a la conferencia, quedar después de las charlas para cenar y tomar unas cervezas. En Madrid, la gente estaba repartida por diversas partes de la ciudad, y a pesar de que proponíamos punto de encuentro tras el evento, las distancias y el cansancio no ayudaban a la gente a acercarse.

Habrá que pensar fórmulas para próximas ediciones, y pensar que el networking es una track más al que buscarle ubicación. Cualquier idea que tengáis será bienvenida.

Otros aspectos

Hay muchos más temas que se pueden poner encima de la mesa, y no por ello menos importantes, pero como digo, el post quedaría muy largo. Por ejemplo, cantidad de charlas en inglés, marcar el nivel de las ponencias, …

A título personal

A nivel personal, cada año me voy con la misma sensación, no disponer de más tiempo para hacer networking y hablar con la gente. Hay muchas personas con las que me gustaría conversar más tiempo, pero las labores organizativas quitan mucho tiempo, y hay que estar pendiente de muchos aspectos que pueden pasar desapercibidos al asistente: atención a ponentes, patrocinadores, catering, tiempos, … Cada vez que empiezo el evento me digo a mi mismo, eres organizador y no asistente, así es la forma de no perder el foco.

Es un evento que lleva mucho tiempo organizarlo (empezamos en septiembre/octubre), y que lo organizas tal y como te gustaría que fuese si fueses asistente, pero que luego lo disfrutas como organizador,  y que la satisfacción llega por otros canales diferentes a los del asistente.

En fin, seguiré buscando formulas para poder disfrutar más de la comunidad y de la gente que veo año en año.

Gracias a todos por participar en deSymfony 2013!

 

ene 4 13

Generando metatags para todas las vistas mediante eventos en Symfony2

by David

Estos días, junto a Rodrigo (@menrod), hemos tratado de dar una solución a una cuestión que se nos ha planteado en el trabajo. Os la contamos para ver si tenéis una mejor solución o si queréis aportar algún comentario.

Status

Nuestro cliente necesitaba poder personalizar los metas de cada página: title, description, keywords, etc. Debido a que teníamos un gran cantidad de acciones y controladores, queríamos evitar ir por cada acción de cada controlador agregando la lógica que generaría las variables “meta” a pasar a la vista.

Solución aplicada

Una vez descartada la posibilidad de agregar la lógica a todos los controladores, lo siguiente que pensamos fue interferir en el proceso de RequestResponse, y hacer uso del componente EventDispatcher que trae Symfony2, para introducir nuestra lógica justo antes de que se ejecute cualquier controlador. Symfony2 trae unos filtros (Before, After) que nos ayudan en esta labor.

Nuestro objetivo fue, por tanto, que todas las vistas tuviesen unas variables por defecto, los metatags, cuyos valores dependían de la petición, de ahí que no nos valiese simplemente utilizar el config.yml, aunque puede ser un lugar donde predefinir unos valores por defecto.

La vista era fácilmente actualizable, simplemente implicaba agregar unas lineas al layout base.

Explotando kernel.controller event

Este evento es disparado por el core de Symfony2 (FilterControllerEvent) justo antes de actuar cualquier controlador, por lo que creemos que es el lugar idóneo para inicializar todos los metatags que queríamos pasar a las vistas.

De la idea al código

Decidimos crear un controlador base (BaseController.php) el cual extiende del controlador que trae Symfony2 (Controller.php). Este controlador base tiene un atributo nuevo, metatags, el cual es un array que contiene todos los metas necesarios (title, description, etc). Estos metatags son los que se inicializan desde MetadataListener. Además, sobre-escribimos los métodos render y renderView para que todas las vistas reciviesen por defecto nuestra variable metatags.

Pasos que seguimos:

  1. Creamos una tabla llamada medata cuyos columnas son: name, slug, y los metatags, title, description, etc.
  2. Creamos un listener MetadataListener al cual inyectamos EntityManager para obtener e inicializar los metatags de la base de datos. Este listener escucha a kernel.controller
  3. Agregamos el nuevo listener a services.yml
  4. Extendimos el Controller, incorporamos la variable metatags, y sobre-escribimos los métodos renderrenderView. Obviamente, todos los controladores implicados extendían de BaseController en lugar de Controller
  5. Actualizamos nuestro layout

Tabla Metadata

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Tu\Namespace\A\Entity\Metadata:
  type: entity
  repositoryClass: Tu\Namespace\A\Entity\MetadataRepository
  table: metadata
  fields:
    id:
      type: integer
      id: true
      generator:
        strategy: AUTO
    name:
      type: string
      length: 500
    slug:
      type: string
      length: 500
    metatitle:
      type: text
      length: null
    metadescription:
      type: text
      length: null
    metakeywords:
      type: text
      length: null

  indexes:
    slug_index:
      columns: [slug]
      type: unique

Clase MetadataListener

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
namespace Tu\Namespace\A\Listener;
 
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Doctrine\ORM\EntityManager;
use Tu\Namespace\A\Controller\BaseController;
 
class MetadataListener
{
    private $entityManager;
 
    function __construct(EntityManager $entityManager)
    {
        $this->entityManager = $entityManager;
    }
 
    public function onKernelController(FilterControllerEvent $event)
    {
        $controller = $event->getController();
        if (!is_array($controller)) {
            return;
        }
 
        if ($controller[0] instanceof BaseController) {
            $myController = $controller[0];
 
            // Nosotros nos basamos en la URL solicitada para obtener la info
            $slug = $event->getRequest()->getPathInfo();
            $metadata = $this->entityManager->getRepository('TuBundle:Metadata')->findOneBy(array('slug' => $slug));
 
            if ($metadata) {
                $myController->setMetas(array(
                    'metadescription' => $metadata->getMetadescription(),
                    'metatitle' => $metadata->getMetatitle(),
                    'metakeywords' => $metadata->getMetaKeywords()
                ));
            }
        }
    }
}

Actualizando el services.yml

1
2
3
4
5
miproyecto.listener.metadata:
    class: Tu\Nampespace\A\Listener\MetadataListener
    arguments: [ '@doctrine.orm.entity_manager' ]
    tags:
      - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }

Clase BaseController.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
namespace Tu\Namespace\A\Controller;
 
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
 
class BaseController extends Controller {
 
    private $metatags = array();
 
    public function getMetas() {
        return $this->metatags;
    }
 
    public function setMetas($metas) {
        $this->metatags = $metas;
    }
 
    public function renderView($view, array $parameters = array())
    {
        return parent::renderView($view, \array_merge($this->metatags, $parameters));
    }
 
    public function render($view, array $parameters = array(), Response $response = null)
    {
        return parent::render($view, \array_merge($this->metatags, $parameters), $response);
    }
 
}

Pros

  • Unificamos toda la lógica de gestión de los metatags en un solo método

No se me ocurre mucho más a parte de lo citado antes, lo cual nos provoca también un “thin controller“. (Thin Controller 1Thin Controller 2)

Contras

  • Como siempre se pregunta uno en Symfony2, ¿es el lugar más correcto?
  • Rendimiento: ¿realmente afecta al rendimiento? Cada petición pasará por nuestro Listener ejecutando nuestra lógica, aunque si la petición no debe ser atendida por nuestros controllers es descartada.
  • Estamos provocando una consulta a la base de datos por cada Request que precise los metatags: Esto puede ser una sobrecarga innecesaria, aunque si el cliente desea poder editar esta información desde el backend no tenemos muchas alternativas.
  • Nuestra solución se basa en la URL (Slug) para obtener los metatags, por lo que ¿nos hacemos vulnerables o difícilmente sostenibles antes continuos cambios en la estructura de rutas (routing)?

Parece que todo son contras, pero el hecho de centralizar la lógica y abstraer a todos los controladores lo veo una ventaja.

jul 11 11

deSymfony 2011 un grupo de gente inquieta

by David

deSymfony 2011Ha pasado una semana desde las Jornadas Symfony 2011 en deSymfony y la verdad es que desde la organización estamos muy contentos por el “feedback” recibido. En ninguna de nuestras predicciones nos imaginábamos la buena acogida que ha tenido y la respuesta positiva de la gente.

La verdad que podría enfocar el post desde un punto de vista organizativo, que si retraso por aquí …, que si problemas con no se que …, pero prefiero enfocarlo desde un punto de vista más humano y la agradable sorpresa que fue poder conversar con tanta gente que no conocía y que ese día tuve el placer de conocer y “desvirtualizar”.

He visto muchas cosas que me han gustado, por ejemplo he visto gente que ha vuelto con las pilas cargadas y enseguida se han puesto a programar con Symfony2, con Git, con Twig, u otros lenguajes y tecnologías que se iban comentando en pequeños círculos que se hacían durante los descansos, comidas o cenas: Erlang es un claro ejemplo.

read more…

jun 16 11

Jornadas Symfony 2011

by David

Este año volvemos a la carga, parece que fue ayer cuando nos embarcamos en las primeras Jornadas Symfony. Ha pasado un año y la segunda edición está a punto de comenzar.

Es de agradecer el empeño e ilusión de gente como, Javier Eguiluz, Nacho Martín, Javier López, Marcos Labad, Albert Jessurum. Todos ellos han puesto su empeño no sólo en la organización del evento, sino preparando la aplicación deSymfony que se mostrará el primer día.
Tened en cuenta que Symfony2 todavía no tiene versión estable, y que la documentación cambia constantemente y supone un esfuerzo mantenerse al día. A pesar de estos handicaps nos van a impartir unas charlas magistrales sobre nuestro framework favorito para que todos podamos empezar a trabajar con la última versión de éste.

read more…

oct 21 10

IV Encuentro de programadores Java: RIA (Cliente Rico)

by David

Tras unos meses de inactividad, se activa el ciclo de jornadas técnicas gratuitas con el IV Encuentro de Programadores Java organizado por Oscar Belmonte (profesor del Departamento de Lenguajes y Sistemas Informáticos) y decharlas.com. En esta ocasión, la temática de las jornadas girará entorno al desarrollo de aplicaciones con interfaz de cliente rico.

El evento se realizará el 28 y 29 de Octubre en la Universitat Jaume I de Castellón, tienes toda la información del evento: horarios, ponentes y formulario de inscripción, en la web de decharlas.