Noticias Weblogs Foros Wiki Código

Meta-Info

¿Que es?

Planeta Código es un agregador de weblogs sobre programación y desarrollo en castellano. Si eres lector te permite seguirlos de modo cómodo en esta misma página o mediante el fichero de subscripción.

rss subscripción

Sponsors

Puedes utilizar las siguientes imagenes para enlazar PlanetaCodigo:
planetacodigo

planetacodigo

Si tienes un weblog de programación y quieres ser añadido aquí, envíame un email solicitándolo.

Idea: Juanjo Navarro

Diseño: Albin

carlosrovira.com

eFirmatic – Nuevo Producto AIR 2.0

Junio 30th, 2010 - [Enlace local]

Por fin el producto que terminamos poco antes del lanzamiento de Adobe AIR 2.0 está ya disponible para todo el público. Se trata de eFirmatic-Desktop, un producto de escritorio pensado para firmar documentos PDF y Facturae. Esta aplicación ha sido creada para la marca eFirmatic y Motor de Firma, partners de Codeoscopic.

eFirmaticDesktop1

La aplicación hace uso intensivo de las nuevas capacidades de AIR 2.0 para comunicarse de forma nativa con procesos del sistema operativo (NativeProcess API). Además ha sido diseñada pensando en la sencillez máxima: Simplemente basta con arrastrar los documentos que queremos firmar a la aplicación y hacer “click” en el botón firmar para tener todos los documentos firmados en pocos segundos.

Puedes descargar una versión de evaluación de 30 días del producto para Windows o Mac desde aquí.

» Leer más, comentarios, etc...

Blog del grupo SQUaC

“Haz fácil lo imposible”, de Steve Krug

Junio 30th, 2010 - [Enlace local]

"Haz fácil lo imposible" es la discutible traducción (casi de manual de autoayuda) del título del libro "Rocket Surgery Made Easy", la última obra de Steve Krug, anteriormente autor del popular libro de introducción a la usabilidad "No me hagas pensar" ("Don't Make Me Think ").

Portada del libro

A diferencia del primer libro, que trataba sobre cómo pensar sobre usabilidad, en este Krug se ha centrado en cómo hacerla, poniéndose como objetivo conseguir que personas no expertas en usabilidad pueda hacer sus propias pruebas... [sigue ...]

» Leer más, comentarios, etc...

Variable not found

Saltarse las validaciones del lado cliente en ASP.NET MVC

Junio 29th, 2010 - [Enlace local]

Las validaciones automáticas de ASP.NET MVC son una fórmula muy útil y productiva de comprobar los datos introducidos por nuestros usuarios. Como sabemos, basta decorar las propiedades de las entidades del Modelo con atributos que indiquen las restricciones a aplicar en cada caso, y el framework MVC se encargará del resto, incluso en la capa cliente.



Como sabemos, el sistema de validación es capaz de generar scripts capaces de comprobar en cliente que los datos introducidos encajan con las restricciones introducidas en el modelo mediante anotaciones de datos.



Básicamente, el script comprueba los datos durante la pérdida de foco de los controles, y justo antes de realizar el submit de datos al servidor, no permitiendo el envío hasta que los campos contengan información correcta. Este automatismo, válido y conveniente la mayor parte de las veces, complica algunos escenarios.



Mirando el código del script MicrosoftMvcValidation.js he descubierto un pequeño truco para poder enviar los datos de un formulario omitiendo las validaciones en cliente, es decir, forzar el submit sean cuales sean los datos introducidos en los controles.



La cuestión está en indicar en el botón de envío que no debe realizar las validaciones, estableciéndole una propiedad llamada disableValidation. A lo bestia, bastaría con añadirle el atributo al botón como se muestra en el siguiente código:



disableValidation
De esta forma, en la pulsación del botón “atrás” (en este caso se trata de un asistente) se saltaría los controles en cliente y podríamos volver al paso anterior.



Obviamente con el método anterior estaríamos introduciendo marcado incorrecto en la página. Si queremos pasar las validaciones W3C podemos conseguir lo mismo desde script, lo que haría innecesaria la aparición del atributo disableValidation en el tag <button>:



<script type="text/javascript">
    document.getElementById("atras").disableValidation = true;
</script>


Publicado en: Variable not found



» Leer más, comentarios, etc...

Picando Código

Picando Código cumplió 3 años

Junio 29th, 2010 - [Enlace local]

El pasado 21 de junio (¡¡se me pasó!!) hicieron 3 años del “Hola mundo” de Picando Código que tanto ha evolucionado en el tiempo. El primer aniversario lo festejé, me saltié el segundo, y acá vamos por el tercero.

Hay gente que desde ese momento todavía sigue el blog y comenta cada tanto. Y a veces aparecen comentarios de usuarios que no veía en años. Creo que eso es lo más interesante de tener el blog, el intercambio. También a través de Twitter o Identi.ca, la conversación sigue por ahí y como que todo se hace parte de una sub red de contactos y conocimiento esparcido.

El panorama es bastante distinto en relación a hace 3 años… En primer lugar el uso y abuso de servicios de redes sociales como Facebook o Twitter, hacen que la conversación se haga cada vez más centralizada (en dichos servicios), y alejada de los nichos que solían formarse. Eso me da la impresión al menos.

Cambio de imagen

Después de 2 años con el primer tema hecho por mí, cambiamos la imagen totalmente, esta vez con ayuda profesional en la parte gráfica:

Picando Código 4.0

Picando Código 4.0

Por fin puedo decir que estoy orgulloso del diseño :)
Digamos que el blog ahora sí tiene una imagen definida, con logo y mascota.

Por otro lado en lo personal quiero comprarme esta remera:

Logro desbloqueado: Dejó la casa

Logro desbloqueado: Dejó la casa

Desde el año pasado estoy emancipado, lo que implica más responsabilidad y todo lo que implica vivir solo. Siguen habiendo muchas ideas de proyectos, trabajos, estudios, pero siempre con poco tiempo o poca organización.

En fin, el blog ha pasado por meses de práctico abandono, pero nunca dejo de escribir aunque sea algo para que vean que sigue acá.

Foro de Picando Código

El foro fue una idea bastante interesante en un principio, lleva más de dos años en línea. En un comienzo, tuvo bastante popularidad, muchos usuarios y muchos temas en poco tiempo, pero fue decayendo de a poco. Actualmente recibe algún tema cada tanto, pero su uso principal es como soporte para los usuarios de los plugins que he programado para WordPress. Si se les ocurre una idea para reflotarlo, o una utilidad más para darle, bienvenida sea. Los usuarios pueden darse una vuelta a mencionar que leyeron este post :P

Esto último puede haber sido influenciado también por la centralización de la que les comentaba antes, pero esto no son más que apreciaciones.

Otros blogs

Tengo otros dos blogs donde trato temas relacionados a los que se hablan en Picando Código, pero más específicos:

Conclusión

Ninguna, seguiré escribiendo por acá como referencia para mi mismo, compartiendo lo que aprendo, comentando lo que leo, etc. Espero ver algún olvidado del blog en los comentarios.

¡Saludos a todos y gracias por ayudarme con este proyecto!

3 años Picando Código

3 años Picando Código

Comparte: Print del.icio.us Facebook Google Bookmarks BarraPunto Bitacoras.com Tumblr Twitter

» Leer más, comentarios, etc...

Arragonán

Collejeros viajeros

Junio 28th, 2010 - [Enlace local]

Porque alguien tiene que poner en su sitio a tanto gurú 2.0…

Collejeros viajeros

Tira cómica de Sinergia sin control, por supuesto.

» Leer más, comentarios, etc...

programania

¿PHP 5.4?

Junio 28th, 2010 - [Enlace local]

Tanto hablar de PHP 6… y puede que al final tengamos antes PHP 5.4. Y es que los problemas para hacer PHP 6 totalmente unicode han debido de ser demasiado grandes, y ahora se plantean separar la implementación de nuevas funcionalidades de la conversión a unicode. El reseteo también lo explican por aquí y por allá, los propios perpetradores.

Creo que, de la misma manera que PHP ha triunfado e irrumpido en la empresa porque ha conseguido copiar correctamente muchas de las ventajas de otros lenguajes sin perder las suyas propias, ha fracasado en dos aspectos:

  1. implementación de closures: nadie las está usando en PHP apenas porque no tienen las ventajas que tiene, por ejemplo, en Ruby.
  2. Avance iterativo e incremental de su propio producto, esto es: el propio PHP. Parece que se han marcado un escalón demasiado alto, y no han sido capaces de subirse a él…

Espero que se pongan las pilas pronto.


» Leer más, comentarios, etc...

programania

Algunos apuntes sobre NoSql

Junio 28th, 2010 - [Enlace local]

Puede que no-sql sólo sea una moda. Quizá no-sql, para los que no tenemos un problema de rendimiento extremo, suponga el avance que esperábamos de las bases de datos orientadas a objetos. Es lo que opina más de uno. No-Sql es una buena solución a alguno de los retos del almacenamiento de datos en la empresa. Quizá haya que combinar soluciones tradicionales de sql con otras no-sql. Para The Guardian es Not Only Sql.  No-SQL no sería un sustituto, sino un complemento.

Enlaces generales:

Opciones más populares:

CouchDB

Cassandra

MongoDB

Guardar clave-valor


» Leer más, comentarios, etc...

Bitácora de Javier Gutiérrez Chamorro (Guti)

JS Noise

Junio 26th, 2010 - [Enlace local]

Como hice en 2007 con AS3 Fire, he reimplementando un algoritmo de los usados en las clásicas demos. El caso escogido esta vez es el efecto de ruido blanco, típico de las televisiones analógicas desintonizadas. El lenguaje, Javascript, haciendo uso del objeto canvas de HTML 5.

Para ser sinceros, la implementación es realmente más sencilla que el del fuego, lo cual he hecho a propósito por problemas de tiempo.

El código en cuestión, es especialmente cuidadoso a la hora de acceder a canvas, para ser compatible con las diferentes implementaciones, y tiene ciertas optimizaciones en cuanto a velocidad como es el uso de FastRandom. Por lo demás, no es un buen ejemplo en cuanto a optimización del código, ya que podría hacerse mucho más, y sobretodo, lo es menos en cuanto a elegancia.

Para verlo en acción, vas a necesitar un navegador que soporte canvas, entre otros, se ha probado con funcionará con al menos Opera 9, Safari 4, Firefox 3, Chrome 4, y supuestamente también con el futuro Internet Explorer 9.

Lo más sorprendente es que el desempeño que consigue es más que aceptable, sobretodo si hablamos de las versiones en desarrollo de Opera 10.60 y Chromium 6.

Lo puedes ver y descargar aquí (2 Kb. en formato HTML).

» Leer más, comentarios, etc...

Fetishcode

Groovy en ADF

Junio 25th, 2010 - [Enlace local]

A

» Leer más, comentarios, etc...

Arragonán

Conocer el próximo valor de un id AUTO_INCREMENT

Junio 24th, 2010 - [Enlace local]

Estoy con un pequeño trabajillo entre manos, una migración de una base de datos, y necesitaba conocer el próximo valor de un identificador AUTO_INCREMENT de MySQL. Por si a alguien le sirve(o tengo que echar mano en el futuro :P ), es tan sencillo como hacer una consulta a la tabla tables de information_schema.

select AUTO_INCREMENT from information_schema.TABLES where TABLE_SCHEMA='soy_la_db' and TABLE_NAME='y_yo_la_tabla';

» Leer más, comentarios, etc...

Bitácora de Javier Gutiérrez Chamorro (Guti)

GIMP

Junio 23rd, 2010 - [Enlace local]

GIMP (GNU Image Manipulation Program), es un programa de retoque fotográfico y de imágenes gratuito y de código abierto, disponible para la mayoría de plataformas *NIX, MacOS así como Windows, tanto en 32 como en 64 bits.

La cantidad de características que dispone es grandísima, aunque tampoco penséis en un Photoshop, y si más bien en un Fireworks o Paintshop Pro. Su apariencia es bastante cuidada, sobretodo en plataformas Linux GNOME.

Personalmente, lo encuentro muy sencillo de utilizar, y más rápido de cargar que otros productos, superando a alternativas más limitadas como Paint.NET. La interfaz SDI es más extraña al verla de lo que luego notaremos al trabajar con ella.

Está disponible en castellano de manera completa, y con buena calidad. La cantidad de formatos de imágen que soporta es aceptable, aunque podría ser mejor. El algoritmo de compresión PNG, no es tan bueno como el de Irfanview, XnView o Fireworks, pero es aceptable.

El consumo de recursos es contenido para lo que nos tiene acostumbrados este tipo de software. GIMP 2.6.8 x64 consume vacío 31 Mb. de memoria y 114 Mb. en disco, tardando en ejecutarse 3 segundos. Como comparación, Photoshop 12/CS5 x64 consume vacío 84 Mb. de memoria y 417 mb. en disco, necesitando para ejecutarse 7 segundos.




Si queremos todavía mayor rendimiento, todavía podemos mejorarlo eliminando pinceles, paletas, módulos, intérpretes y sobretodo plugins que vienen de serie y no necesitemos; no obstante esto no sería jugar limpio a la hora de compararlo, ya que de igual modo podríamos hacerlo con los otros.

Dispone de bastantes plugins, que aunque la mayoría de usuarios no necesitemos, expanden sus posibilidades.

En resumen, creo que GIMP es un producto que servirá para cubrir las necesidades en cuanto a edición de imágenes del 90% de los usuarios, sin importar su plataforma o el idioma que hablen, de forma totalmente gratuita. Vendría a ser como OpenOffice en el terreno ofimático, aunque en el caso de GIMP, menos posibilidades, no signifiquen menos rendimiento.

» Leer más, comentarios, etc...

Picando Código

A descargar Eclipse Helios

Junio 23rd, 2010 - [Enlace local]

Como les comentaba en el post anterior sobre Eclipse Helios, hoy 23 de junio ya podemos descargar Eclipse Helios. La versión estable de Eclipse 3.6 está disponible en un lanzamiento que incluye 39 proyectos diferentes. Entre ellos se encuentran 12 paquetes de Eclipse orientados a distintos perfiles de desarrollo como Java EE, PHP, C/C++ y otros.

Eclipse Helios

Eclipse Helios

Algunas de las nuevas características destacadas son soporte para Git, desarrollo en GNU/Linux y JavaScript:

Pueden encontrar más información en Eclipse Helios,  o dirigirse a los links de descarga.

Descargas Eclipse

Descargas Eclipse

Ya estoy descargando por Torrent la versión para Java EE, para probarla en el desarrollo diario. Desde ahí estrenaré la característica del Eclipse Marketplace a ver si logo instalar Subclipse y JBoss Tools. Después probaré el Eclipse clásico con Aptana Studio y PDT para desarrollos web con PHP, XHTML y CSS, o a lo mejor le instalo esos mismos plugins a la nueva versión para desarrolladores JavaScript.

Ya comentaré sobre las nuevas características que vaya descubriendo.

JavaScript Development Tools
Comparte: Print del.icio.us Facebook Google Bookmarks BarraPunto Bitacoras.com Tumblr Twitter

» Leer más, comentarios, etc...

Picando Código

Lanzamiento del 5to Concurso Nacional de Videojuegos – Uruguay

Junio 23rd, 2010 - [Enlace local]

Uruguay Gamer anunció el lanzamiento del 5to Concurso Nacional de Videojuegos. A ver si este año nos presentamos con nuestra producción y el mundo conoce al Carpincho Mutante. Les dejo la noticia:

5to concurso nacional de Videojuegos

5to concurso nacional de Videojuegos

La espera fue corta y oficialmente fue lanzado el 5to Concurso Nacional de Videojuegos .

Ingenio y Proanima nuevamente auspician el concurso y Uruguay Gamer será el foro para responder consultas y mantener a los participantes informados de todos los eventos.

Como todos los años habrá una charla para presentar el concurso. Será el 14 de Julio a las 18:30 en las oficinas de Ingenio, dentro del LATU, de la mano de Gonzalo Frasca, co-fundador de Powerful Robot Games.

Para más información pueden visitar el sitio oficial y seguirnos a nosotros y al concurso en facebook para enterarse de todo.

Comparte: Print del.icio.us Facebook Google Bookmarks BarraPunto Bitacoras.com Tumblr Twitter

» Leer más, comentarios, etc...

programania

sfGuard – Filtrar con campos del perfil de usuario

Junio 23rd, 2010 - [Enlace local]

Advertencia: Lo que cuento en este post sirve solo para la versión de sfGuard para Propel y usando su versión 1.5 que incluye clases Query.

Debo confesar que aun soy novatillo con el plugin sfGuard de Symfony. Este plugin aporta el modelo de datos y las herramientas necesarias para implementar y gestionar en cualquier proyecto Symfony una capa de usuarios bastante maja.

El plugin no se preocupa de los perfiles de usuario y si queremos manejar datos como nombre, emails, fechas de nacimiento, etc. tendremos que crear una estructura de datos para alojarlos y relacionarlos con nuestros usuarios. Con un poco de integridad referencial y un pequeño cambio de configuración en el archivo app.yml de vuestra aplicación sfGuard será capaz de vincular un perfil con un usuario del sistema (más info).

Además, tendremos a nuestra disposición una serie de CRUDs automágicos para realizar operaciones de alta, baja, modificación y gestión de privilegios y grupos. Sin embargo, las capacidades de filtrado de resultados del listado de usuario se limitan a los campos de la tabla de usuarios, excluyendo los del perfil que hayamos construido encima de ella.

Es una pena, porque al final siempre querremos poder buscar filtrar por campos como el nombre, email, etc. Vamos, igual que cuando se edita un usuario se pueden modificar estos datos del perfil, es de esperar que también se pueda filtrar el listado por ellos, pero no.

Después de buscar por ahí, no he visto a nadie quejándose de esto en particular (¿tan raro es?) y he deducido que podría ser por:

  1. Se trata de un comportamiento por defecto que, debido a alguna metedura de pata por mi parte, no me funciona (muy probable)
  2. sfGuard no soporta esta funcionalidad en el filtrado

Tras buscar un poquito más en el código del plugin he descartado la primera opción aunque, hey, no sería la primera vez que uno mete la pata, así que si alguien me corrige, yo agradecido.

De todos modos no me ha gustado la solución a la que he llegado que es correcta pero no del todo elegante, porque he tenido que tocar las clases del plugin. Aunque he tocado las clases “tocables” (las que extienden de las clases base) el hecho de que éstas estén en la estructura de ficheros del plugin, denota que algo falla en el modelo de plugins de Symfony (al menos con este).

Es decir, bajo mi punto de vista no se debería tocar el plugin sino extenderlo fuera de él. Sin embargo, me cuesta pensar la manera de hacer esto en el contexto y la arquitectura actual de plugins (por lo menos con sfGuard). Espero que con los bundles de Symfony 2 la cosa cambie a mejor.

Para conseguir filtar por los campos del perfil de usuario, primero me he fijado cómo lo hace Propel en el formulario de edición que, al fin y al cabo, hace precisamente esto:

plugins/sfGuardPlugin/lib/form/sfGuardUserAdminForm.class.php

class sfGuardUserAdminForm extends BasesfGuardUserForm
{
  protected
    $pkName = null;
 
  public function configure()
  {
 
    [...]
 
    // profile form?
    $profileFormClass = sfConfig::get('app_sf_guard_plugin_profile_class', 'sfGuardUserProfile').'Form';
    if (class_exists($profileFormClass))
    {
      $profileForm = new $profileFormClass();
      unset($profileForm[$this->getPrimaryKey()]);
      unset($profileForm[sfConfig::get('app_sf_guard_plugin_profile_field_name', 'user_id')]);
 
      $this->mergeForm($profileForm);
    }
  }
 
  [...]
 
  protected function getPrimaryKey()
  {
    if (!is_null($this->pkName))
    {
      return $this->pkName;
    }
 
    $profileClass = sfConfig::get('app_sf_guard_plugin_profile_class', 'sfGuardUserProfile');
    if (class_exists($profileClass))
    {
      $tableMap = call_user_func(array($profileClass.'Peer', 'getTableMap'));
      foreach ($tableMap->getColumns() as $column)
      {
        if ($column->isPrimaryKey())
        {
          return $this->pkName = call_user_func(array($profileClass.'Peer', 'translateFieldname'), $column->getPhpName(), BasePeer::TYPE_PHPNAME, BasePeer::TYPE_FIELDNAME);
        }
      }
    }
  }
}

¿Qué estamos viendo aquí? Pues muy fácil: El método configure() busca en nuestro app.yml si hay referencia a una clase de perfil de usuario o si la de por defecto (sfGuardUserProfile) existe. Si es así, mergea su formulario y desactiva sus campos correspondientes al identificador de registro en ambas tablas. Sin más.

Si le echáis un vistazo a sfGuardUserFormFilter.class.php veréis que no hay nada de eso. Incorporando estos métodos y propiedades nuevas a nuestra clase sfGuardUserFormFilter bastaría para que los campos aparecieran en el formulario. La clase quedaría así:

plugins/sfGuardPlugin/lib/filter/sfGuardUserFormFilter.class.php

class sfGuardUserFormFilter extends BasesfGuardUserFormFilter {
 
    protected $pkName = null;
 
    public function configure() {
        unset($this['algorithm'], $this['salt'], $this['password']);
 
        // profile form?
        $profileFormClass = sfConfig::get('app_sf_guard_plugin_profile_class', 'sfGuardUserProfile') . 'FormFilter';
        if (class_exists($profileFormClass)) {
            $profileForm = new $profileFormClass();
            unset($profileForm[$this->getPrimaryKey()]);
            unset($profileForm[sfConfig::get('app_sf_guard_plugin_profile_field_name', 'user_id')]);
 
            $this->mergeForm($profileForm);
        }
 
        $this->widgetSchema['sf_guard_user_group_list']->setLabel('Groups');
        $this->widgetSchema['sf_guard_user_permission_list']->setLabel('Permissions');
    }
 
    protected function getPrimaryKey() {
        if (!is_null($this->pkName)) {
            return $this->pkName;
        }
 
        $profileClass = sfConfig::get('app_sf_guard_plugin_profile_class', 'sfGuardUserProfile');
        if (class_exists($profileClass)) {
            $tableMap = call_user_func(array($profileClass . 'Peer', 'getTableMap'));
            foreach ($tableMap->getColumns() as $column) {
                if ($column->isPrimaryKey()) {
                    return $this->pkName = call_user_func(array($profileClass . 'Peer', 'translateFieldname'), $column->getPhpName(), BasePeer::TYPE_PHPNAME, BasePeer::TYPE_FIELDNAME);
                }
            }
        }
    }
}

Como veis, me paso por el forro las convenciones de estilo de Symfony. Me parecen una aberración y además no me preguntaron cuando las impusieron, así que a mi plim. Además, con un ctrl+alt+f, cada cual que lo ponga a su manera.

Con esto ya podemos tener los campos en el formulario. Recomiendo un repaso a la sección filter del fichero generator.yml para retocar la presentación del formulario de filtrado. Por ahora el formulario provocará una excepción al procesarse porque Propel no sabrá aun cómo filtrar por los nuevos campos que hemos incluido.

Aquí es donde más dudas tengo, por que al igual que con sfGuard, soy novato aun con Propel 1.5. Seguramente haya alguna manera de hacer lo que voy a poner a continuación de algún modo más “nativo” de Propel 1.5 o elegante. Lo que tenemos que hacer es añadir una serie de métodos a la clase Query de sfGuardUser.

plugin/sfGuardPlugin/lib/model/sfGuardUserQuery.php

class sfGuardUserQuery extends BasesfGuardUserQuery {
    public function filterByFirstName($firstName) {
        if ($firstName['text'] != null) {
            $this->useUserProfileQuery()->filterByFirstName($firstName['text'])->endUse();
        }
    }
    public function filterByLastName($lastName) {
        if ($lastName['text'] != null) {
            $this->useUserProfileQuery()->filterByLastName($lastName['text'])->endUse();
        }
    }
    public function filterByEmail($email) {
        if ($email['text'] != null) {
            $this->useUserProfileQuery()->filterByEmail($email['text'])->endUse();
        }
    }
}

Gracias a la magia del método useUserProfileQuery() nuestro formulario de filtrado podrá procesarse y además aceptará wildcards como * y %.

Eso es todo. Tampoco es que sea la pera limonera, por que al final solo he copiado lo que hace el formulario de edición de manera nativa y lo he portado al de filtrado. La moraleja quizá es que cuando Google no te da la respuesta que buscas, puedes tener la suerte de tenerla a mano en tu propio código :)

Happy coding!


» Leer más, comentarios, etc...

avemundi, blog de un micro-isv » Desarrollo de software

enlaces 23.junio.2010

Junio 23rd, 2010 - [Enlace local]

En el último año he sufrido un cambio en mi trabajo de día. He pasado de dedicarme básicamente a programar a pasar a dirigir un grupo de programadores. La verdad es que la tarea no es fácil, pues supone un cambio de mentalidad grande, así que me llaman la atención post dedicados a gestionar grupos de trabajo. Como estos:

En otra temática, pero para mi relacionada, me ha gustado mucho este post de David Bonilla sobre gestión de información, sobre todo el párrafo que dice “Mi primera labor como CEO de una empresa siempre sería la misma: prohibir el Excel y derivados. El Excel puede ser una de las herramientas más dañinas para la actividad de una empresa y debería utilizarse únicamente como última solución y como herramienta de apoyo, nunca de trabajo “. Aunque suene un poco rádical, estoy completamente de acuerdo con el planteamiento.

» Leer más, comentarios, etc...

Picando Código

Walter Bender – fundador de SugarLabs – brinda charla en Montevideo

Junio 22nd, 2010 - [Enlace local]

Walter Bender

Walter Bender

Esta semana hay dos buenos eventos en la Facultad de Ingeniería en Montevideo. Además de la charla sobre Scrum, tenemos la siguiente:

Walter Bender, fundador de SugarLabs, estará dando una charla en Montevideo este Miércoles.

La charla será en inglés. En sus palabras:

In learning applications, it is not enough to be open, but we need to build affordances for the learner to understand the code.

Por supuesto que también hablará de las últimas versiones de Sugar y las novedades de la comunidad.

Miércoles 23 de Junio. 19:30hs. Salón de Actos, Facultad de Ingeniería (UdelaR).

Organiza: ceibalJAM!

¡Ahí estaré!

Comparte: Print del.icio.us Facebook Google Bookmarks BarraPunto Bitacoras.com Tumblr Twitter

» Leer más, comentarios, etc...

Picando Código

Driver Radeon en Debian Squeeze y KMS

Junio 22nd, 2010 - [Enlace local]

Ati Radeon en Debian

Ati Radeon en Debian

A pesar de haberme pasado a ArchLinux en mi PC de escritorio, sigo usando Debian Squeeze a diario en mi laptop de trabajo. En ella estoy usando linux en su versión 2.6.32-trunk-686. La placa de video es una ATI Mobility Radeon:

01:00.0 VGA compatible controller: ATI Technologies Inc Radeon Mobility X1400

Hasta hace un tiempo usaba el driver fglrx en Debian. Pero ATI dejó de dar soporte a placas antiguas en las versiones más nuevas del driver, y el driver libre Radeon viene mejorando mucho en los últimos tiempos. Así que en algún momento decidí probar Radeon y quedarme con él en vez de usar versiones antiguas de Fglrx.

El fin de semana hice una actualización del sistema con un apt-get dist-upgrade. Cuando prendí la PC el lunes, noté que la aceleración de video 2D andaba demasiado lenta, igual que si el driver no existiera. KDE se volvió inusable, la decoración de ventanas era inservible, no había forma de trabajar así.

Por un rato me pasé a Openbox. Estaba instalado en mi computadora como recurso para usar Flex Builder para GNU/Linux, ya que éste consume todos los recursos de la máquina. Así que opté por usar un entorno de escritorio sumamente liviano para estas ocasiones. En Openbox podía usar más fluidamente las aplicaciones gráficas, pero aún tenía problemas. Así que mientras esperaba que mi código compilara, busqúe solución a mi problema.

Me fijé el log del servidor X, para ver si algo andaba mal:

cat /var/log/Xorg.0.log | grep EE

Las entradas del log que comiencen con “(EE)” significan error, por lo que filtramos las entradas con “EE” con el comando grep.  Fue así que encontré el siguiente mensaje respecto al driver Radeon:

RADEON(0): [dri] RADEONDRIGetVersion failed because of a version mismatch.

Busqué un poco por los foros de Debian y me encontré con este post. Estoy usando la versión trunk del kernel 2.6.32, lo que según tengo entendido, sería la versión más reciente. (Trunk es la rama de desarrollo de un proyecto de software bajo control de versiones con Subversion). A partir de la versión 2.6.32-5 del kernel en Squeeze, se introduce el Kernel Mode Setting (KMS).

Esto implica que el código para establecer el modo (resolución y profundidad de color) de la pantalla en la tarjeta gráfica de la computadora pasa a estar dentro del núcleo Linux. Alguna de las ventajas que esto supone son una secuencia de booteo más limpia y rápida, soporte mejorado para suspender y resumir, y más.

Bastante lo nuevo que aprendí cuando me tocó arreglarlo. Algunas fuentes para leer más: Phoronix, WikiPedia

En fin, si bien para algunos la transición es transparente, y no notan cambio alguno, en mi caso fue caótico. En ese mismo post del foro de Debian encontré la solución: deshabilitar KMS para el driver Radeon. Para esto, editar el archivo /etc/modprobe.d/radeon-kms.conf y cambiar el valor a 0.

Al reiniciar las cosas volvieron a la normalidad, con aceleración gráfica y demás. Uno de los comentarios que hacen en el foro de Debian que me pareció interesante:

Cada tanto, Linux toma un gran paso como hacer el cambio de XF86 a Xorg y de Grub a Grub2. Estas cosas siempre se acompañan de una buena cantidad de “dolores de crecimiento”. KMS parece ser uno de esos grandes cambios. Ha llegado para quedarse y necesitamos ajustarnos. A la larga, KMS parece ser una mejora mayor y necesitamos aprender cómo aprovecharlo.

Por ahora lo he desactivado, estaré atento a futuras versiones del kernel donde el driver Radeon funcione mejor con KMS. Eso si no migro a ArchLinux en la laptop también…  o a Sid. Cuando Squeeze pase a ser la versión estable de Debian, pasaré a usar la versión de Debian 7, la que siga siendo testing. Pero últimamente me he venido cuestionando si pasar a Sid, o pegar el salto a ArchLinux…

Comparte: Print del.icio.us Facebook Google Bookmarks BarraPunto Bitacoras.com Tumblr Twitter

» Leer más, comentarios, etc...

Arragonán

LipDub – Alaska – A quien le importa

Junio 21st, 2010 - [Enlace local]

Hace unas semanas misstechin hacía un llamamiento para participar en un LipDub en Zaragoza. No tenía muy claro si un domingo por la mañana iba a estar de humor ;) al menos para levantarme de la cama, pero al final hice el esfuerzo de ir y no me arrepiento para nada, me lo pasé muy bien y es otra de esas cosillas que ya he podido tachar de mi To Do-list :)

Por supuesto, que si os mola, no os olvidéis de votar el video para el concurso ese de fanta, el de community manager(se acaba de morir un gatito… social media!! ahí va otro XD).

Y lo dicho, que a quien narices le importa lo que yo haga y lo que yo diga :)

» Leer más, comentarios, etc...

Variable not found

Controladores todavía más automáticos

Junio 21st, 2010 - [Enlace local]

ASP.NET MVCHace unos días experimentábamos con controladores capaces de implementar automáticamente la lógica de acciones cuya misión era únicamente retornar la vista por defecto.



Así, partíamos de un controlador como el siguiente:



public class HomeController: Controller
{
    public ActionResult Index()
    {
        return View();
    }
 
    public ActionResult Company()
    {
        return View();
    }   
 
    public ActionResult Services()
    {
        return View();
    }
    
    public ActionResult Contact()
    {
        return View();
    }
    
}


Y veíamos cómo simplemente heredando de la clase AutoController que definíamos en el mismo post, podíamos omitir la implementación de las acciones anteriores, consiguiendo un código mucho más compacto:



public class HomeController: AutoController
{
}


Está claro que utilizando como base la clase AutoController hemos ahorrado mucha codificación, pero, perezosos como somos, seguro que todavía estamos escribiendo más de la cuenta.



Si el único código que vamos a tener en un controlador es la definición de la propia clase, quizás podamos hacer algo para evitar incluso tener que codificar eso, ¿no? De la misma forma que hicimos con las acciones, seguro que podríamos crear un controlador por defecto para procesar las peticiones entrantes para las que no podamos encontrar un controlador específico.

¡A por la factoría de controladores!

La factoría de controladores es el componente de ASP.NET MVC encargado de localizar e instanciar el controlador apropiado para procesar cada petición entrante. Por defecto, este trabajo lo realiza la clase DefaultControllerFactory, pero como en otras ocasiones, la flexibilidad del framework MVC permite sustituir muy fácilmente este componente por otro que realice la tarea que nos interesa.



Dentro de la factoría de controladores, el método GetControllerType() es utilizado por el framework para localizar el tipo (la clase) de controlador en función del nombre obtenido desde los parámetros de ruta. De hecho, este mismo método es el que utilizamos hace más de un año para saltarnos a la torera la convención de nombrado de controladores del framework.



De hecho, si heredamos de la factoría de controladores por defecto, basta con sobrescribir este método GetControllerType() para conseguir el comportamiento que pretendemos. En primer lugar, ejecutamos la lógica por defecto; sólo en el caso de no encontrar un controlador utilizaremos por defecto el controlador AutoController que creamos en el post anterior, de forma que sea él el que se encargue de proporcionar la implementación automática de sus acciones:



public class AutoControladoresControllerFactory: DefaultControllerFactory
{
    protected override Type GetControllerType(RequestContext requestContext, 
                                              string controllerName)
    {
        return base.GetControllerType(requestContext, controllerName) 
               ?? typeof (AutoController);
    }
}


Ya lo último que necesitamos es indicar al framework la factoría de controladores que debe utilizar, la clase AutoControladoresControllerFactory, introduciendo el siguiente código en el archivo global.asax.cs:



protected void Application_Start()
{
    // Establecemos la nueva factoría de controladores...
    ControllerBuilder.Current.SetControllerFactory(
                                typeof(AutoControladoresControllerFactory)
                              );
 
    // Y el código habitual en el Application_Start()
    AreaRegistration.RegisterAllAreas();
    RegisterRoutes(RouteTable.Routes);
}


Y con eso, hemos terminado. A partir de ese momento, todas las peticiones cuyo controlador sea imposible localizar según el procedimiento estándar, serán procesadas por el controlador automático AutoController, que buscará para cada acción una vista y la retornará mágicamente al usuario.



Así, una petición de tipo GET /Home/Services, que requeriría normalmente la existencia de una clase controlador HomeController y un método de acción Services(), podrá ser resuelta sin implementar ninguno de estos dos elementos, siempre que exista una vista definida en ~/Views/Home/Products.aspx.

Ya en el post anterior comenté algunas contraindicaciones que podía tener la utilización de esta técnica. ¡No dejes de revisarlo si piensas emplearla en producción!
imageA modo de demo, he colgado en Skydrive un ejemplo (para Visual Studio 2010) en el que se ha eliminado directamente el controlador Home, y han sido añadidas diversas vistas a las que se puede acceder utilizando estos automatismos.



Publicado en: Variable not found.



» Leer más, comentarios, etc...

Picando Código

Charla abierta sobre Scrum en la Facultad de Ingeniería

Junio 21st, 2010 - [Enlace local]

Scrum

Scrum

Este jueves voy a participar de una reunión junto a otros Scrum Masters. En ella expondremos varios temas entorno a Scrum, la metodología ágil de desarrollo, y cómo ha cambiado nuestra forma de trabajar.

Si están interesados en aprender un poco sobre Scrum desde la experiencia de otros, tienen dudas respecto al curso, etc. esta es la oportunidad para preguntarlas:

El 24 de junio a las 19.45 horas en el Salón Azul de la Facultad de Ingeniería de la República se desarrollará una charla abierta en donde profesionales de nuestro medio expondrán su experiencia en el uso de Scrum luego de haberse certificado como Scrum Master el año pasado.

El evento es gratuito pero hay cupos limitados, por inscripciones eventoscrum@aquait.com.uy

ACTUALIZACIÓN: La agenda del evento

19:40 – Inicio del evento, breve overview de Agile + Scrum (Gabriel Ledesma).
19:50 – Orador: Diego Garagorry
20:15 – Orador: Gabriel Centurión
20:40 – Orador: Fernando Briano
21:05 – Orador: Carlos Acle
21:30 – Cierre del evento, preguntas e intercambio general.

Va a ser algo dinámico, distinto, más parecido a Scrum, menos parecido a una típica conferencia técnica. No se lo pierdan.

Recuerden que en Uruguay, se va a realizar una nueva instancia para certificarse como Scrum Masters en julio. Más información en el enlace:
Nuevo curso de Scrum Master Certificado en Montevideo, Uruguay

Comparte: Print del.icio.us Facebook Google Bookmarks BarraPunto Bitacoras.com Tumblr Twitter

» Leer más, comentarios, etc...

xperiments.es

AS3 Android Flash Components

Junio 21st, 2010 - [Enlace local]

Set de componentes Flash para el desarrollo de aplicaciones sobre la plataforma Android.
El paquete viene con todas las clases y fla para poderlos modificar a nuestro gusto.

Sitio web del autor:Kevin Hoyt
Descarga de los componentes:android-components



» Leer más, comentarios, etc...

Variable not found

Enlaces interesantes 10

Junio 20th, 2010 - [Enlace local]

Estos son los enlaces publicados en Variable not found en Facebook desde el viernes, 09 de abril de 2010 hasta el domingo, 20 de junio de 2010. Espero que te resulten interesantes. :-)

Y no olvides que puedes seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.



Publicado en: Variable not found



» Leer más, comentarios, etc...

xperiments.es

OSX Todos mis contactos Messenger aparecen como no admitidos

Junio 20th, 2010 - [Enlace local]

Una cosa rara le pasaba a mi messenger, resulta que hoy lo ha abierto y mi sorpresa ha sido que todos los contactos que tengo me aparacen como no admitidos. Parece que se le ha ido la cabeza al cielo a MSN y algo no funciona bien.

Buscando por la red he encotrado la solución.

Cerramos MSN y abrimos una ventana de terminal y nos movemos hacia este directorio:

1
/Users/ <- NUESTRO USUARIO ->/Library/Preferences/Microsoft

Alli encontraremos un archivo llamado:

Microsoft Messenger User Cache.plist

Lo que tenemos que hacer es renombrarlo a cualquier otra extension ( ej .bak ) para que una vez MSN reinicie vuelva a crear sus opciones de configuración.

Hacemos este proceso mediante:

1
mv Microsoft\ Messenger\ User\ Cache.plist Microsoft\ Messenger\ User\ Cache.bak

Reiniciamos MSN para ver que todo ha funcionado correctamente

» Leer más, comentarios, etc...

programania

Lo que los gurús nunca te cuentan sobre Kanban y SCRUM

Junio 17th, 2010 - [Enlace local]

A principios de año comencé un nuevo proyecto de migración de una extensa intranet. Un proyecto que me va a llevar todo un año y, por supuesto, una buena oportunidad para aplicar todo lo que he ido leyendo sobre métodos ágiles (y superar la vergüenza del desarrollo de software).

Realizar el Product Backlog no fue algo especialmente complicado. No se trata de un proyecto especulativo con un “escenario siempre cambiante”, las user stories básicamente se sacaban de “lo que hace la vieja intranet que lo haga la nueva”. Por supuesto nada es tan sencillo (cada user story tiene que tener el tamaño adecuado, etc.), pero no me pararé aquí.

La priorización de las user stories se hizo pensando en la mejor forma de ponerlas en marcha. Aquí hay una cosa clave: la puesta en marcha no es “desplegarla en el servidor de producción”, sino que los usuarios realmente se pongan a utilizarla y cumplan sus necesidades. Son dos cosas muy distintas.

Una vez definidas la user stories y priorizadas, solo quedaba decidir la manera de ir poniéndolas en marcha. Aquí teníamos dos posibles filosofías para seguir:

Aquí entra el factor humano. Ir poniendo una a una las user stories en producción introducía mucho ruido en los usuarios (“ahora te quito un botón de aquí y te lo pongo allá”), así que comenzamos haciendo unos sprints de 3 semanas, con un periodo inicial de puesta en marcha del proyecto.

Aquí todo normal. El escenario es bastante favorable para la aplicación de métodos ágiles. Quizá la única característica algo molesta es que el presupuesto era fijo. Pero dado que el alcance también era fijo, no era uno de los principales caballos de batalla: se aplicó un “pos se tienen que poder” y punto:-)

Bueno… ¿y qué es lo que los gurús nunca te cuentan sobre Kanban y SCRUM? Porque hasta ahora todo lo que he escrito es de manual.

Lo que los gurús nunca te cuentan es que para poder hacer todo esto necesitas tener un entorno de desarrollo EXCELENTE y un conocimiento TÉCNICO de ALTO NIVEL.

Detrás de tanta filosofada Lean hace falta que, a nivel técnico muchas cosas funcionen como un reloj:

  1. si quieres poner en marcha nuevas funcionalidades en periodos cortos (primero igual lo haces cada tres semanas, pero luego te das cuenta de que quizá sea mejor cada dos… finalmente y cuando el proyecto ya va como un tiro… ambicionas hacer kanban) necesitas un buen sistema de integración contínua TOTALMENTE AUTOMATIZADO.
  2. para automatizar algo, debes estar haciéndolo de manera manual. Si automatizas la ejecución de pruebas unitarias… pero no estabas haciendo pruebas unitarias… estarás automatizando la nada absoluta. A veces uno se pone como objetivo algo técnico “tener un hudson con un phing, que genere nosecuantas métricas inútiles y lo automatice toro toro toro”…
  3. integración continua implica TDD (o al menos pruebas unitarias), que implican una MUY BUENA orientación a objetos, que implica un buen uso de patrones (sobre todo de inyección de dependencias) y un conocimiento bastante profundo de los frameworks que utilizas (tanto para pruebas como para desarrollar).
  4. integración continua implica el uso de un repositorio de versiones (subversion, git, loquesea…). Pero no vale con hacer unos commits aquí y allá: seguramente vas a necesitar branches y los consiguientes merges. Y seguramente te van a surgir unos maravillosos conflictos que vas a tener que saber solucionar. El conocimiento de tu repositorio de versiones tiene que ser MUY BUENO.
  5. integración continua implica la división entre el servidor de desarrollo (probablemente uno para cada programador), el de pruebas y el de producción. Lo cuál implica una MUY BUENA gestión de configuraciones y que tu aplicación sepa en cada momento si está en pruebas y debe coger la configuración de pruebas o cuál. Esto me remite al punto 1: si tienes un sistema totalmente AUTOMATIZADO de integración continua capaz de desplegar tu aplicación en el servidor de pruebas o en el de producción como si no costara, estás triunfando. En caso contrario, prepárate a perder el tiempo a base de bien.
  6. integración continua implica desarrollo evolutivo del producto, lo cuál implica un MUY BUEN CLIENTE capaz de hacer piña contigo y que cuando los usuarios monten en cólera porque se sienten algo mareados al ver botones aparecer y desaparecer, al verse obligados a dar feedback, etc. esté contigo. También hace falta que tenga fe en que “la versión que hay ahora evolucionará para bien”. Si los puntos del 1 al 4 funcionan como un reloj, es posible que con el tiempo vayas ganando en credibilidad (porque al principio nadie te cree), sino prepárate para perder credibilidad hasta entre tus jefes….

O sea que necesitas un profundo conocimiento de la orientación a objetos, los patrones, las pruebas unitarias, subversion, hudson (y phing en mi caso), gestión de configuraciones, y un buen cliente. ¿Alguien da más?

A lo que voy es a que las metodologías ágiles sólo marcarán la diferencia cuando seas capaz de juntar la filosofía lean, con unas buenas prácticas de SCRUM o KANBAN y con una FORTÍSIMA CAPACIDAD TÉCNICA. Sin TÉCNICA no hay metodologías ágiles que valgan. Si cada iteración de dos semanas, tardas dos días en poner en marcha la nueva iteración, no vas a ningún lado. Tiene que ser algo AUTOMÁTICO y, para que sea automático, tiene que ser algo TÉCNICAMENTE MUY BUENO.

¿Pero entonces los métodos ágiles, la integración contínua, etc.. no valen la pena?
Valen la pena totalmente. Si te quieres a ti mismo como profesional hazlo, porque verás la luz y marcarás la diferencia.

¿Entonces primero debo ser un experto en todo eso que has dicho y luego ya me hago ágil?
No hay esa posibilidad. Intenta aplicar agilismo desde el principio en la manera en que te sea posible.

¿Entonces a dónde vas con este rant?
A que sepas que va a doler. Eso es lo que no te cuentan los gurús. Que el camino es doloroso. Podrás poner los medios para que el dolor se minimice. Vas a pasarte horas y horas pegándote con problemas técnicos porque eres incapaz de hacer un commit por un tree conflict, o porque hudson da un extrañísimo “segmentation error” a un comando de terminal que ejecutas (y que funciona de lujo en la propia terminal), y no te digo ya como te tomes Selenium en serio….

Dolerá aunque repito, vale la pena totalmente.


» Leer más, comentarios, etc...

Picando Código

NetBeans 6.9 y Eclipse Helios

Junio 16th, 2010 - [Enlace local]

Sin duda los dos entornos de desarrollo integrados que más han crecido en los últimos tiempos son Eclipse y NetBeans. Su comunidad de desarrolladores sirve como pilar para su crecimiento y evolución constante. El avance de las nuevas tecnologías, nuevos lenguajes y metodologías en el desarrollo del software hacen que lo nuevo quede viejo en poco tiempo. Esto presiona a los programadores a trabajar de manera más intensa agregando nuevas funcionalidades y perfeccionando sus productos en una competencia por ser el mejor IDE, donde los más beneficiados somos sus usuarios.

Es así que  nos encontramos estos días con una nueva versión de NetBeans, el IDE idóneo para programar GUIs con Swing, y ahora con JavaFX.

Y por chocante que parezca, habrá que acostumbrarse, ahora hablamos de Oracle NetBeans.

NetBeans 6.9

NetBeans 6.9

Disponible NetBeans IDE 6.9

Paso a comentarles algunas de las novedades más destacadas de esta versión de NetBeans:

JavaFX Composer - La característica que más me llama la atención en este momento. Estoy trabajando en el campo de las aplicaciones ricas con tecnología Flex. Me encantaría poder migrar a JavaFX, pero habría que estar seguros que ya está apta para el reto. Han mejorado mucho el editor,y hay mucho por probar.

Otras características:

Ya estoy descargando la versión con JavaFX incluido. Prometo algún post al respecto cuando pruebe algo. Interesante como IDE para desarrollar en PHP al incluir soporte para Zend (no sé si lo hacía en versiones anteriores).

Usé NetBeans por un tiempo como IDE predeterminado para desarrollo PHP pero desde entonces no he hecho ningún desarrollo serio con él. Sigue primero en mi lista Eclipse, aunque a veces me saca un poco  de quicio. Y hablando de Eclipse, para empezar quería compartir unos tips con ustedes que me resultaron bastante útiles. Se trata de una serie de posts de “tips & tricks” para Eclipse que publicaron en DZone y está dividio en tres partes: parte 1, parte 2 y parte 3. Algunos ya los conocía, pero otros veré de implementarlos hoy en el trabajo.

También destacable comentar que desde 2007 a 2010, ha habido un gran crecimiento en la cantidad de usuarios que usan GNU/Linux para desarrollar con Eclipse. Un 20% de usuarios de Eclipse que usaban GNU/Linux subió a 33%, bajando en Windows de un 74% a un 58%. En tanto Eclipse es la plataforma de desarrollo más popular en GNU/Linux con un 46% de usuarios.

Eclipse Helios

Eclipse Helios

Eclipse Helios

Helios es el nombre de la versión 3.6 de Eclipse. Si bien todavía no hay una versión final disponible, ya podemos descargar el RC4 de Eclipse 3.6. Algunas de las novedades que he leído se vienen para esta versión:

Pueden leer más sobre las nuevas características de Eclipse Helios en este enlace. Estén atentos, porque la versión final se espera para el 23 de junio.

Comparte: Print del.icio.us Facebook Google Bookmarks BarraPunto Bitacoras.com Tumblr Twitter

» Leer más, comentarios, etc...

Información legal y técnica