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

Archivos

MadeInFlex

Formación Flex en el CEV

Febrero 8th, 2010

Hace unos días el CEV, Escuela Superior de Comunicación, Imagen y Sonido, ha anunciado su acuerdo con Codeoscopic para la ofrecer formación especializada en Adobe Flex. Os dejo el comunicado oficial.

A su vez es de esperar que Made In Flex y CEV aprovechen los conocimientos del equipo de MIF en estas tecnologías y las estupendas instalaciones del CEV para ofrecer nuevos eventos para beneficio de toda la comunidad.

Os dejo la nota de prensa:

CEV Y CODEOSCOPIC: ACUERDO DE COLABORACIÓN

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

Picando Código

Afiches minimalistas de la galaxia de Star Wars

Febrero 8th, 2010

Dagobah

Dagobah

Justin Van Genderen creó una serie de afiches de distintos sistemas en la galaxia de Star Wars. Hay afiches de: Dagobah, Endor, Tatooine, Hoth y Bespine. Están muy buenos, particularmente en mi caso uso el nombre de alguno de estos sistemas para cada una de mis computadoras, para algo los usaré:

fernando@dagobah
fernando@hoth
fernando@tatooine

Pueden ver el resto de la galería en Flickr. Visiten el sitio del autor para ver más diseños de su creación.

Hoth

Hoth

Vía: Laughing Squid

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

Fetishcode...Thinking in objects

Acceder a métodos del AppModule desde el backing bean

Febrero 7th, 2010

A

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

Fetishcode...Thinking in objects

Obtener la conexión actual de nuestro AppModule

Febrero 7th, 2010

A

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

MonoCaffe

Wooops… Fallo en MCM 0.9

Febrero 7th, 2010

Gracias a mis beta testers :) he arreglado un par de fallos en la nueva versión de MCM 0.9. Por una parte, el script de instalación no copia el fichero "tips.json" al directorio del usuario, el script de arranque no añadía una nueva linea de configuración "buffer.size" al fichero mcm.conf y finalmente, por alguna razón mágica, Glade dejo de escribir las señales de los eventos para las acciones de importar y exportar. Todos estos fallos has sido resueltos, así que si habéis tenido estos problemas, descargad los ficheros nuevamente y todo debería funcionar sin problemas.

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

Sergio Guerrero | Desarrollo web y Tiendas virtuales

Webinar sobre Desarrollo en Magento

Febrero 7th, 2010

Seminario para desarrolladores de MagentoEl equipo de Magento nos ofrecerá, el próximo miércoles día 10 de febrero de 2010 a la 18:00 horas (hora Española; 9:00 AM hora de San Francisco), un seminario web para desarrolladores de Magento. Esta sesión estará dirigida a aquellos desarrolladores que quieran ampliar sus conocimientos sobre programación en Magento.

Bajo el título "Las mejores prácticas para el desarrollo en Magento", el equipo de desarrollo de Magento junto con la compañía Zend (creadores de PHP, PHP Zend Framework, etc) nos ilustrarán con los siguientes temas:

No te lo puedes perder. Registrate al seminario para desarrolladores de Magento

Fuente: Blog Oficial de Magento

Entradas relacionadas

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

Sergio Guerrero | Desarrollo web y Tiendas virtuales

SEO Magento – Guía SEO para Magento

Febrero 6th, 2010

SEO MagentoDesde que se presentó la primera versión de Magento, ha pasado ya más de un año y seguimos sin tener un "guía definitiva" de SEO para Magento en español. Durante todo este tiempo, se ha escrito mucho sobre el posicionamiento en buscadores, pero siempre en los foros, en algunos blogs, etc. Nunca se ha mostrado una visión completa de este tema y es hora de recopilar todo ese conocimiento en un sólo artículo: la guía SEO Magento.

Conforme las búsquedas, el SEO y Magento vaya evolucionando esta guía se irá actualizando con nuevos consejos, trucos y con las mejores prácticas. Es muy recomendable mantenerse actualizado a la última versión de Magento, siempre que sea posible, para, de esta forma, beneficiarse de las mejoras y de las correcciones de errores que se vayan incorporando.

Para ir haciendo un seguimiento de las correcciones que se van incorporando en cada versión de Magento, podemos consultar su Hoja de Ruta.

Índice de contenidos

1. Optimización técnica básica

1.1 Configuración general

Magento es una de las plataformas de comercio electrónico mejor preparada para los motores de búsqueda, sin necesidad de instalar extensiones adicionales, pero existen algunos errores conocidos, que deben ser corregidos a la hora de optimizar el SEO de nuestra tienda virtual con Magento. El primer paso debería ser siempre utilizar la última versión estable de Magento. A continuación deberemos activar la reescritura de las direcciones URL. Para activar esta opción, accederemos a la configuración de la siguiente forma: Administración -> Sistema -> Configuración -> Configuración-> Web -> Optimización para motores de búsqueda: Usar reescrituras del servidor web (Sí). Otra buena opción a configurar dentro de esta misma pantalla es "Añadir el código de tienda a las URLs", que será recomendable establecer a Sí en caso que tengamos configurada varias vistas de la tienda.

Activando la reescritura y la opción Añadir el código de tienda a las URLs, tendremos URLs com por ejemplo:

1.1 Con WWW o Sin WWW

Dentro de la opción: "Optimización para motores de búsqueda", mencionada en el apartado anterior, y bajo las etiquetas: "Inseguro" y "Seguro", se pueden encontrar las URLs base, donde podemos fijar el dominio de nuestra tienda y escoger entre un dominio con www o sin www. Realizando esta configuración solo estaremos indicando cual es nuestra URL preferida, pero no estaremos realizando ninguna redirección desde la versión con www a la versión sin, ni viceversa. Por lo tanto, será buena idea crear una redirección 301 mediante el mod_rewrite de htaccess, que además de resolver el problema entre URLs con www y sin, impide que Magento añada el identificador de sesiones (SID) en nuestras URLs. A la hora de realizar dicha redirección, debemos asegurarnos de indicar el mismo dominio, tanto en Magento, como en el archivo .htaccess.

El siguiente ejemplo .htaccess servirá para redireccionar desde index.php a la raiz de la tienda:

RewriteBase / RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://www.mitiendamagento.com/ [R=301,L]

En caso que nuestra tienda se encuentre en un subdirectorio (http://www.mitiendamagento.com/tienda), utilizaremos el siguiente código:

RewriteBase /tienda/ RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /magento/index\.php\ HTTP/
RewriteRule ^index\.php$ http://www.mitiendamagento.com/tienda/ [R=301,L]

1.2 Ajustes de la cabecera

Por defecto, nuestra instalación de Magento trae como título: "Magento Commerce", título poco adecuado para que nuestra tienda obtenga el tráfico que se merece. A la hora de redactar los títulos de nuestra tienda (productos, categorías, etc), deberemos tener en cuenta los siguientes aspectos:

En primer lugar, cambiaremos el título principal de nuestra tienda. Iremos a Sistema -> Configuración -> Cabecera HTML y dentro de "Título por defecto" introduciremos un buen título que describa perfectamente nuestra web. Este título aparecerá en varias páginas además de la página principal, por ejemplo, en la página de Contacto, en Términos de búsqueda más utilizados…

Para agregar el nombre de la tienda a todos los títulos, incluyendo las categorías y los productos, deberemos poner dicho nombre dentro del campo sufijo del título (Title Suffix), siendo buena idea mantener en blanco el prefijo (Title Prefix) para que los títulos de cada página queden siempre al comienzo (por importancia de las primeras palabras), y que justo después aparezca el nombre de la tienda. Mantendremos también en blanco tanto la "Descripción por defecto" como las "Palabras Clave por defecto". Para evitar que nuestra tienda sea indexada por los buscadores, mientras esta no esté en producción, puede ser útil fijar a "NOINDEX, NOFOLLOW" el parámetro robots (Default Robots). En el resto de casos, deberemos asegurarnos que este parámetro sea "INDEX, FOLLOW".

Ahora que estamos optimizando las cabeceras de las páginas, puede ser una buena idea agregar el nuevo tag canonical que nos ayudará a eliminar el contenido duplicado de los índices de los buscadores, mejorando así nuestro SEO. Actualmente existe un módulo para gestionar las URLs Canónicas en Magento y lo podemos instalar mediante Magento Connect.

Podemos encontrar más información sobre este tag en las siguientes direcciones:

1.3. Páginas adicionales (Páginas del CMS)

A primera vista, el sistema de administración de contenidos o CMS de Magento puede parecer carente de ciertas funcionalidades, pero es lo suficientemente potente y flexible para la mayoría de usos. Una de las ventajas de este CMS es que podemos controlar cada uno de los aspectos relacionados con las páginas (estado, vista, título, contenido, diseños, meta datos…). Una vez que hayamos introducido el contenido de cada página, deberemos escoger una URL Amigable (SEF URL; Search Engine Friendly URL), un título para la página (teniendo en cuenta los consejos del apartado 1.2), e ir a la pestaña de Meta Datos para escribir la descripción de la página (descripción o snippet que aparecerá en los buscadores).

Las palabras clave (Keywords) pueden dejarse en blanco, pero no está de más cumplimentar este campo si dicha página tiene cierta importancia. La descripción de la página tiene una función muy relevante: motivar a los usuarios para que la visiten, por lo tanto, deberemos redactarla concienzudamente describiendo lo que el usuario encontrará y de forma que llamemos su atención. Por eso, las buenas descripciones deben ser redactadas manualmente, y si preferimos que estas sean "generadas" de forma automática, lo mejor será dejarlas en blanco y ceder el control a los motores de búsqueda.

Si no utilizamos la meta descripción, el motor de búsqueda intentará encontrar los términos de la búsqueda dentro de nuestra página y automáticamente obtendrá un fragmento de texto alrededor de dichos términos. Esto nos proporcionará una o dos palabras en negrita dentro de la página de resultados y seguramente, una descripción poco llamativa.

1.4. Optimización de las categorías

Magento nos ofrece la posibilidad de añadir el nombre de las categorías en las URL de los productos, pero en las versiones actuales de Magento, esta funcionalidad no está muy bien desarrollada y genera contenido duplicado (por lo menos, hasta la versión 1.3.4.2). Al activar esta opción, el contenido de un producto podrá ser consultado desde varias URLs:

Mientras el funcionamiento de esta opción sea el mencionado, será buena idea deshabilitarla o aplicar alguna modificación del Core de Magento para poder utilizar los nombres de las categorías en las URLs de los productos sin generar contenido duplicado.

Para activar/desactivar esta opción, accederemos al siguiente apartado: Sistema -> Configuración -> Catálogo -> Catálogo -> Optimizaciones para el motor de búsqueda: Usar rutas de categorías para la URL de los productos (SI/NO).

Es el momento de establecer los detalles de cada una de nuestras categorías (Admin -> Catálogo -> Gestionar las Categorías). Los campos más importantes de las categorías en relación con el posicionamiento web son:

Magento permite indicar, para cada una de las vistas, un Nombre, una Descripción, un Título de Página y unos Meta Datos distintos. Esto supone una gran ventaja a la hora de posicionar nuestros contenidos en los buscadores.

1.5. Optimización de los productos

La optimización de las páginas de los Productos es similar a la de las Categorías.

En tiendas muy grandes puede suponer un enorme trabajo adicional el hecho de tener que indicar todos los Meta Datos, pero Magento ofrece la opción de generarlos automáticamente para cada una de las Vistas del producto, marcando la casilla: "Usar Valor por defecto". Como ya se ha comentado en los puntos anteriores, lo más recomendable, para conseguir buenos resultados, es redactar manualmente los Meta Datos. Si indicamos el Meta Título, deberemos tener en cuenta que estaremos sobreescribiendo el título por defecto (este contiene el nombre de las categorías, el nombre del producto, el prefijo y el sufijo), pero se mantendrá tanto el prefijo como el sufijo establecidos en la configuración global de la tienda.

Uno de los aspectos relacionados con el SEO, que con frecuencia se pasa por alto, es la forma como gestionamos nuestras imágenes. Por ejemplo, si escribimos buenos textos alternativos y pensamos bien los nombres que le ponemos a los archivos, podemos conseguir un incremento de nuestras visitas gracias a los motores de búsqueda de imágenes. Además, estaremos mejorando la accesibilidad de nuestra página, y por lo tanto, ayudando a aquellas personas con dificultades, que utilizan lectores de pantalla y que sin los textos alternativos serán incapaces de entender el contenido de dichas imágenes.

Por defecto, las imágenes serán renombradas con el título del producto, y lo mismo sucederá con los títulos y textos alternativos. Con un poco de esfuerzo adicional, podremos indicar buenos títulos y textos alternativos para cada una de las imágenes. Bajo la pestaña "Imágenes", dentro de la información del producto, podemos definir las etiquetas para cada una de las imágenes, este valor será utilizado tanto para el texto alternativo, como para el título de la imagen. Por supuesto, podemos indicar dichas etiquetas para cada una de las vistas de la tienda.

2. Optimización de la plantilla de Magento

2.1. Plantilla optimizada (Blank Template)

Las plantillas que trae Magento, como por ejemplo: "Default Theme", "Blue Skin" o la "Modern Theme", no hacen un buen trabajo en relación con los encabezados, desde el punto de vista del posicionamiento web. Para hacernos la vida más fácil, el equipo de Yoast ha creado una nueva plantilla que toma como base la plantilla "Magento Blank Theme" y que incorpora todas las mejorar mencionadas en esta guía de SEO para Magento. Esta plantilla la podemos encontrar entre las contribuciones de Magento con el nombre: Blank Magento SEO Theme.

2.2. Encabezados

Por defecto, el logotipo de la página suele ser un

,pero sólo debería serlo en la página principal. En el resto de páginas, el logo debería ser, como mucho, un

. Lo más importante es conseguir que el título de cada página tenga una etiqueta

, por ejemplo, en la página de una categoría el título más importante o

debería se el nombre de dicha categoría y de igual forma, en la página de un producto.

El siguiente paso consiste en limpiar el exceso de etiquetas de encabezado que restan importancia a las que realmente lo son o deberían serlo. Por ejemplo, podría ser buena idea deshacerse de los encabezados de las columnas laterales, o dar relevancia a los textos de la tienda (incluyendo palabras clave). No existe ninguna razón por la que las palabras clave deban estar dentro de un

, por lo tanto, será mejor que cambiemos todas las etiquetas

que aparecen dentro de
> por etiquetas .

Ahora pasaremos a optimizar nuestro contenido. En las páginas de las categorías pondremos los nombres de los productos dentro de etiquetas

y el nombre de la categoría dentro de una

. En las páginas de los productos, debemos poner el nombre del producto dentro de una

.

Para obtener más información acerca de porqué es importante tener buenos encabezados, podemos leer este artículo sobre el HTML semántico y el SEO.

2.3. Limpiar nuestro código

Todo el código javascript y CSS que tengamos directamente dentro de los ficheros de nuestra plantilla deberían ser movidos a archivos externos (archivos js y CSS) para mantener limpia nuestra plantilla y mejorar el SEO de Magento. Con estos cambios, nos aseguraremos de que los usuarios podrán almacenar estos archivos en caché en la primera carga de la página, y de que los motores de búsqueda no tienen que descargar el mismo código la mayoría de las veces.

2.4. La velocidad como objetivo

Un factor muy importante, en relación con el número de páginas que un motor de búsqueda puede indexar dentro de nuestra tienda en un sólo día, es la velocidad de carga.

Podemos realizar varias acciones para mejorar la velocidad de carga de nuestro Magento:

  1. Activar el almacenamiento en caché. Activaremos esta opción desde Sistema -> Gestor de la caché, marcando todas las opciones de almacenamiento en caché
  2. La importancia de un buen alojamiento y de una buena configuración del servidor. Con MySQL y una herramienta opcode caché de PHP (APC, eAccelerator, XCache), podemos conseguir una mejora drástica en la velocidad de Magento.

Otro aspecto que debemos tener en cuenta es el número de archivos externos que se cargan en cada petición de página. Por cada archivo que el usuario descarga desde nuestra página web, el navegador tiene que crear una nueva conexión con el servidor y esto supone que necesitaremos más tiempo para descargar la página completa. Por eso, será buena idea reducir el número de archivos externos combinándolos en uno solo. Por defecto, Magento permite combinar casi todos los archivos Javascript en uno sólo, mediante la opción: Sistema -> Configuración -> Avanzado -> Desarrollador -> Ajustes de Javascript -> Combinar archivos Javascript (Sí).

Magento no realiza esta tarea con las hojas de estilo y, por ejemplo, la plantilla por defecto trae 6 hojas de estilo diferentes. Nosotros podemos combinar el contenido de estas hojas de estilo en un solo archivo, exceptuando el contenido del archivo print.css, que debe mantenerse por separado. Podemos realizar esta combinación manualmente o podemos utilizar el módulo Fooman Speedster module, que además de hacer el trabajo de fusión por nosotros, se encargará de comprimir y cachear tanto los archivos javascript como los css. Antes de instalar el módulo Speedster, deberemos tener en cuenta sus requisitos, como, por ejemplo, que el mod_rewrite esté activado y que nuestro servidor soporte archivos .htaccess. En caso que utilicemos URLs Canónicas en Magento junto con las extensión Fooman Speedster, deberemos reemplazar el módulo de URLs Canónicas por esta otra versión.

3. SEO Avanzado en Magento y el Contenido Duplicado

Una vez que hayamos revisado todos los aspectos básicos, podríamos reducir toda la problemática restante a un único tema: el contenido duplicado. Para los productos de nuestro catálogo, al menos, las siguientes URLs muestran exactamente el mismo contenido:

  • http://www.mitiendamagento.com/producto.html
  • http://www.mitiendamagento.com/categoria/producto.html
  • http://www.mitiendamagento.com/categoria/product/view/id/1/
  • http://www.mitiendamagento.com/catalog/product/view/id/1/category/1/

Además de estas URLs, también tendremos las páginas de comentarios donde Magento muestra casi el mismo contenido que en la ficha de los productos. Otro problema de este tipo lo encontraremos en las categorías, donde podemos llegar a tener contenido duplicado a causa de la navegación por capas (filtros) y/o las opciones de ordenación. Esto significa, que en el peor de los casos, un producto puede estar disponible, al menos, en 4 páginas además de la página donde realmente debería mostrarse.

Para evitar esta problemática, vamos a deshacernos de todos los grupos de contenido duplicado, permitiendo que estos sean rastreados por los motores de búsqueda (follow), pero evitando que sean indexados (noindex). También corregiremos los problemas mencionados para las categorías en relación con la navegación por capas y la ordenación de los resultados.

3.1. Noindex, Follow para páginas sin contenido

Las páginas sin contenido como pueden ser la URLs de las imágenes, la página de contacto, etc, son páginas para las que debemos realizar ajustes, de forma que los motores de búsqueda no las indexen, pero que rastreen todos los enlaces que puedan encontrar dentro. Para realizar dichos ajustes, existe la extensión: Yoast robots meta module, que nos permitirá ajustar el tag meta robots para cada una de las páginas sin contenido.

3.2. Nofollow, para enlaces innecesarios o sin relevancia

Otro ajuste que deberemos realizar a la hora de optimizar nuestro SEO en Magento, consistirá en evitar que las arañas sigan aquellos enlaces poco relevantes para nuestro negocio, como por ejemplo, la página de login, el proceso de compra, la lista de productos deseados y otras páginas sin contenido. Los mismo sucede con los enlaces hacia nuestros feeds RSS, la navegación por capas, enlaces como agregar a la lista de productos deseados, agregar a la comparación, etc. Actualmente no existen extensiones para agregar el parámetro: rel="nofollow" en dichos enlaces, por lo que deberemos realizarlo manualmente y directamente sobre la plantilla.

3.3. URLs Canónicas

Para ayudar a los motores de búsqueda a entender el contenido duplicado de nuestra tienda, tenemos la posibilidad de indicar, en cada una de nuestras páginas, la URL principal utilizando el nuevo tag para URLs Canónicas. Para aplicar este tag disponemos de un módulo sencillo de instalar: URLs Canónicas para Magento (Canonical URLs for Magento).

3.4. Sitemaps en XML

Los Sitemaps en XML són una forma sencilla de ayudar a que los motores de búsqueda localicen nuestro contenido. Los Sitemaps no nos ayudarán a posicionar mejor, pero si que conseguirán que nuestro contenido quede indexado de forma más rápida. Podemos crear un Sitemap XML manualmente de la siguiente forma: Admin -> Sistema -> Configuración -> Google Sitemap -> Agregar un Sitemap, indicamos el nombre del archivo resultante, la ruta donde se almacenará y la vista o vistas que queremos incluir, presionaremos sobre el botón: Generar y Guarda y ya tendremos nuestro Sitemap creado.

A continuación deberemos indicar a los buscadores donde se encuentra ubicado nuestro Sitemap XML y para eso disponemos de varias opciones:

  • Utilizar las herramientas para webmasters de algunos buscadores como: Google Webmaster tools, Yahoo! Site Explorer, Bing Webmaster Center…
  • Indicar la ruta del Sitemap en el archivo robots.txt

Siempre que sea posible, puede ser buena idea utilizar ambas opciones y en caso de no ser así, por lo menos utilizaremos la opción del robots.txt de la siguiente forma:

Sitemap: /sitemap.xml

El proceso de regeneración del Sitemap no se realiza de forma periódica y automatizada. Para asegurarnos de que este archivo se encuentra actualizado cuando los motores de búsqueda lo consulten, es buena idea utilizar un tarea programada en el servidor (cron job), que se encargue de actualizar el contenido del Sitemap. Para informarnos sobre la creación de tareas programadas o cron jobs en Magento, podemos consultar la siguiente dirección: http://www.magentocommerce.com/wiki/how_to/how_to_setup_a_cron_job.

Conclusión

Esta guía de SEO para Magento cubre los aspectos más importantes que debemos tener en cuenta a la hora de optimizar nuestra tienda. La versión que aquí se expone es una traducción personal del artículo original escrito por Joachim Houtman, que podemos encontrar en la web de Yoast.

Entradas relacionadas

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

Picando Código

Nuevo blog sobre Navegadores Web

Febrero 5th, 2010

Muchas veces por Picando Código postié sobre Navegadores Web. Es un tema que personalmente me interesa mucho, seguirles el desarrollo y ver las variaciones de cada uno, conocer cómo surgieron, etc. Incluso generalmente tengo al menos 5 o 6 navegadores web diferentes instalados en cada computadora. Si navegan por la categoría Browsers del blog, sabrán lo que les digo…

Por eso, tuve que canalizar todo eso por otro lado, para no saturar Picando Código con ese tema en particular, en un nuevo blog: Navegadores Web. Si les interesa, dense una vuelta por el primer post: Hola mundo de los navegadores web y dejen su comentario.

Y de bonus, dejo las noticias de navegadores web de esta semana:

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

Picando Código

Enlaces sobre Scrum

Febrero 5th, 2010

Esta semana publiqué varios posts sobre Scrum en el otro blog, las comparto por acá ya que les pueden interesar:

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

Picando Código

Entregadas las primeras 5.000 firmas en contra del DRM en el iPad a Steve Jobs

Febrero 5th, 2010

DefectiveByDesign reporta que la respuesta a la protesta y petición sobre el iPad ha sido tremenda: 5.000 personas firmaron en las primeras 24 horas, con cobertura en la presa técnica, Digg, Slashdot, Reddit, The Guardian, NPR, y más. La petición sigue juntando firmas, pueden firmarla y compartirla para ayudar a alcanzar las 10.000 firmas.

Petición iPad

Petición iPad

Se entregó la carta con las primeras 5.000 firmas en una tableta iPad gigante, directamente a Steve Jobs. Por cada bloque de 5.000 firmas se entregará una tableta nueva.

En una postal acompañada de una tableta, le están diciendo a Steve Jobs que todavía tiene una oportunidad de hacer lo correcto, “5.000 personas en 24 horas se tomaron el tiempo de su día para llamarle la atención sobre esto, y demandan un cambio. Todavía hay tiempo para que haga lo correcto en los próximos 60 días, antes que el iPad salga a la venta. Puede retirar todo el DRM del dispositivo y la App Store, y abrazar los ideales que clama defender — creatividad, libertad e individualidad.”

La tableta incluye una cabeza de Steve Jobs “malvado” de la publicidad paródica de 1984 de Apple, y se tomó prestado un sello de Apple :)

Entre los 5.000 nombres está el mío, si todavía no han firmado, todavía pueden hacerlo, y si ya lo hicieron, busquen su nombre en la foto:

iPad CloseUp

iPad CloseUp

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

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

enlaces 05.febrero.2010

Febrero 5th, 2010

Un par de enlaces sobre Java:

  • El traje nuevo del emperador un post al que llegué via Javahispano donde el autor cuenta sus impresiones de la adquisición de Sun por parte de Oracle tras el webcast de esta donde explicaban su estrategia a seguir tras la adquisición. En Javahispano también se ha escrito sobre esta webcast pero en tono mas neutro.
  • El blog de Jonathan Giles es un sitio que publica semanalmente enlaces a post relacionados con Swing y JavaFx principalmente. Muy interesante para ir viendo lo que se mueve en estas dos partes integrantes del entorno Java.

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

Picando Código

Debian: mount.nfs: Operation not permitted

Febrero 5th, 2010

Debian GNU/Linux

Hace unos días, aparentemente tras una actualización en Debian Squeeze, obtuve un error al intentar montar por NFS un directorio compartido en el servidor Ubuntu del trabajo:

mount.nfs: Operation not permitted

Fue algo raro, ya que antes funcionaba automáticamente, y no encontraba errores en el fstab ni nada. Así que buscando un poco me encontré con este artículo cuyo autor sufría el mismo problema. Incluso usando la opción mount -v (modo verbo) la información provista no es demasiado específica:

fernando@dagobah~/ $ mount -v server01
mount.nfs: timeout set for Fri Feb  5 10:56:10 2010
mount.nfs: trying text-based options 'intr,addr=192.168.1.10,vers=4,clientaddr=192.168.1.163'
mount.nfs: mount(2): Operation not permitted
mount.nfs: Operation not permitted

Al igual que en el post en cuestión, mi computadora intenta usar NFS versión 4 para montar el directorio. Sin embargo el servidor usa NFS versión 3.

La solución es agregar el parámetros nfsvers=3 en el fstab:

root@dagobah:~# emacs /etc/fstab
*.*.*.*:/shared        /home/fernando/server01     nfs     noauto,user,nfsvers=3,intr  0 0

Con esto quedó funcionando correctamente.

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

MadeInFlex

#flex101 SWF más ligeros, bin-release

Febrero 5th, 2010

Con este post comenzamos una serie de recomendaciones, tips y tutoriales enfocados a cubrir aquellos temas básicos de la tecnología Flex que esperamos sean de utilidad para los entusiastas de la plataforma.

Uno de los primeros tips que es importante conocer cuando hacemos aplicaciones con Flex utilizando Flex/Flash Builder es el manejo de los archivos de salida. De forma automática cuando generamos un proyecto nuevo con la herramienta se crean varias carpetas: bin-debug, html-template, src y libs.

Proyecto Flex

Es común encontrar por la red aplicaciones Flex de desarrolladores que al compilar sus proyectos por descuido o desconocimiento suben las aplicaciones SWF generadas en la carpeta bin-debug, esta versión contiene información adicional que es utilizada cuando utilizamos el comando debug de la herramienta.

La forma correcta de subir nuestras aplicaciones al servidor sería aprovechando las versiones generadas a partir del comando “Export Release Build”, ya que al no incluir esa información adicional su peso es considerablemente menor que la versión de depuración.

Export Release Build

Tomemos como ejemplo una aplicación sencilla que contiene 3 componentes: Button, TextInput y DataGrid. Al compilar estar aplicación el SWF generado en la carpeta bin-debug tiene un peso de 449 kb.

Debug Version

Ahora ejecutemos el comando Project > Export Release Build, el tamaño de la aplicación generada es de tan solo 276 kb, siendo el ancho de banda uno de los recursos más preciados en las aplicaciones de Internet es importante tener cuidado con estos pequeños detalles.

Debug Version

Hace tiempo en algún taller de Flex recuerdo que utilicé el hashtag #flex101 para hablar de los fundamentos de la tecnología, por lo que los invito a compartir sus mejores tips en Twitter a la cuenta de @madeinflex no duden que en una entrada posterior merecerá que hagamos una compilación de los mejores.

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

Arragonán

Video de BDD con easyb

Febrero 5th, 2010

Leo en el blog de Andrew Glover, que el equipo de easyb ha publicado un pequeño videotutorial de introducción a cómo utilizar este framework de testing para hacer Behaviour Driven Development en la JVM, tanto para escribir specifications como stories.

Aquí ya toqué el tema de easyb junto a grails, eso sí, no he llegado a utilizarlo de verdad.

Otras alternativas que pueden ser interesantes para practicar BDD, y que pueden correr en la JVM son Spock, RSpec, JBehave… y unos cuantos más cuyos nombres no recuerdo :P

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

Picando Código

Bruce Eckel – Screencasts First Steps in Flex

Febrero 4th, 2010

Screencasts Flex

Screencasts Flex

Bruce Eckel (autor de Thinking in Java) publicó junto a James Ward el libro First Steps in Flex (Primeros pasos en Flex).

El libro intenta enseñar Flex creando ejemplos y capítulos cortos, suficiente como para introducirse en cada tema. El asunto es que decidieron lanzar Screencasts gratuitos de cada capítulo del libro. En teoría, se obtiene la misma información de los seminarios online que del libro. Están en inglés, hablados y comentados por sus dos autores quienes van discutiendo el código.

Pueden verlos en el sitio web: First Steps in Flex

Un recurso interesante para quienes quieran comenzar con Flex.

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

Ingenieria de Software / Software Engineering

El ciclo virtuoso de Business Intelligence

Febrero 4th, 2010

Inicio este post con la estupenda frase utilizada BI Fácil en el post Datos, información y conocimiento, si recuerdan sus clases de Base de datos encontramos que es muy común que se toque el tema de que los datos por si solos no nos dicen nada pero si los unimos nos dan información pero seguramente pocos saben como termina la historia, bueno si esa información la utilizamos para tomar decisiones estamos accionando, acciones de las cuales esperamos un resultado, y resultados de los cuales esperamos obtener valor, todo esto es sinónimo de empresa exitosa!!!.

Excelente post, Datos, información y conocimiento

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

MonoCaffe

Monocaffe Connections Manager 0.9

Febrero 4th, 2010

Nueva versión de Monocaffe Connections Manager con una gran adición de la que estoy muy contento. Un widget al estilo breadcrumb para acceder a referencias a comandos, tal que el usuario no tenga que recordar cada opción, comando o conjunto de teclas de cada aplicación que usa.





Este widget además permite añadir nuevos "Tips" y compartirlos con el mundo. Aun hay que desarrollar un poco más éste widget, pero es 95% funcional y espero os guste la idea.



Tambien se han resulto algunos fallos y molestias que mis compañeros de trabajo han ido encontrando al utilizar mcm y es que tengo un equipo de beta-testers de elite.



Screenshot!





Descargad desde aquí:

http://launchpad.net/mcm/+download

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

Fetishcode...Thinking in objects

Target blank en commandLink

Febrero 3rd, 2010

A

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

Arragonán

El código y la presentación del taller

Febrero 3rd, 2010

Ya he subido a github el código que añadimos el viernes en el taller de Grails(con algunos arreglillos que tenía pendientes) que hicimos en la sede de hispalinux Zaragoza.

Aún siendo un día festivo, finalmente vinieron 10 personas, y eso que se despistaron un par de la hora(mea culpa por no mandar un email de recordatorio el día de antes :S). Creo que durante las casi 3 horas que duró, llegamos a ver bastante del framework y algunos detalles de lo que puede aportar groovy en casos prácticos.

Antes de ponernos a trabajar sobre el código, también hice una pequeña presentación de introducción, para situar a la gente que no conociera demasiado acerca de groovy y grails.

Al terminar el taller estuvimos charlando de varias cosas, lo más interesante:

  • Montar más talleres/charlas de temática técnica para aprender unos de otros, vernos las caras… y seguro que todo el mundo puede aportar algo o hablar sobre un tema.
  • Retomar las quedadas del ZaragozaJUG, aproximadamente una vez al mes. Y aunque tenga el nombre de Java User Group, jamás se ha hablado exclusivamente de Java o programación; es simplemente una reunión de gente del gremio(sin importancia del lenguaje) para charlar sobre lo que surja alrededor de unas cervezas, y obviamente alguna vez toca hablar de temas relacionados con el desarrollo de software :)

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

MadeInFlex

Adobe AIR 2 beta 2

Febrero 2nd, 2010

El día de hoy se anunció en Adobe Labs, AIR 2 beta 2. Es importante darle un vistazo puesto que las aplicaciones compiladas con beta 1 ya no podrán ejecutarse con el runtime de AIR 2 beta 2, así mismo hay algunas características importantes en esta versión entre las que destacan…

  • Interacción Mejorada con la Impresora: Nuevo soporte de impresión que permite un control más fino sobre la manera en que el contenido se imprime desde una aplicación AIR, incluyendo la elección de impresora, tamaño del papel y número de copias.
    Una nueva API que permite recuperar información adicional de la impresión, como el área a imprimir, los colores y status de actividad. También es posible mandar a imprimir sin mostrar el diálogo de imprimir.
  • Soporte para comunicación de sockets TLS/SSL: Ahora es posible conectarse a un servidor que requiere comunicaciones por socket tipo TLSv1 o SSLv3.
  • API IME y Mejoras en la Entrada de Texto: Interesantes mejoras para soportar la entrada de texto con software IME mediante un API diseñada para utilizar el Flash Text Engine.

También hay algunas aplicaciones de ejemplo que podemos ir descargando para revisar a detalle estas características.

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

Picando Código

Java: An internal LaunchAnywhere application error has occurred and this application cannot proceed. (LAX)

Febrero 2nd, 2010

Java Bugs

Java Bugs

Otro problemita a la hora de instalar el entorno de desarrollo para Flex Builder en Debian. Buscando encontré que este error también se daba en otras aplicaciones basadas en Eclipse, en Ubuntu y Debian. El error:

fernando@dagobah~/software/Flex $ ./flexbuilder_linux_install_a5_112409.bin
Preparing to install...
Extracting the installation resources from the installer archive...
Configuring the installer for this system's environment...

Launching installer...

An internal LaunchAnywhere application error has occured and this application cannot proceed. (LAX)

Stack Trace:
java.lang.IllegalArgumentException: Malformed \uxxxx encoding.
at java.util.Properties.loadConvert(Properties.java:552)
at java.util.Properties.load0(Properties.java:375)
at java.util.Properties.load(Properties.java:325)
at com.zerog.common.java.util.PropertiesUtil.loadProperties(DashoA8113)
at com.zerog.lax.LAX.(DashoA8113)
at com.zerog.lax.LAX.main(DashoA8113)

En mi caso se daba cuando intentaba ejecutar el instalador de Flex Builder. Aparentemente puede venir por el lado del shell que usemos, o alguna propiedad. El asunto es que pude ejecutarlo corriéndolo desde Bash, y haciendo un unset antes de correrlo:

#!/bin/bash
unset
./flexbuilder_linux_install_a5_112409.bin

Otra solución corta para tener de referencia…

La solución que encontré en este link:

Problema:
El error descrito arriba

Causa:
Los valores seteados para las variables del shell TITLEBAR y PSI están causando problemas con InstallAnywhere, el cual se usa para instalar 2 productos de la empresa.

Este es un bug conocido de InstallAnywhere.

Solución
Ejecutar ‘unset’ en las variables TITLEBAR y PSI antes de instalar.

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

jordisan.net blog: sobre lo humano, lo divino... y lo técnico: desarrollo

Lo que diseñadores y desarrolladores deberíamos aprender de Supernanny

Febrero 1st, 2010

Parecería que el popular programa de TV tiene poco que ver con el desarrollo de software y el diseño de interfaces… pero algo sí que podemos aprender de él (y no es que los desarrolladores seamos como niños).

Seguro que recuerdas Supernanny, ese programa de TV en el que una psicóloga aconsejaba a diferentes padres (habitalmente al borde de la desesperación) en cuanto a la educación de sus hijos.

http://www.youtube.com/watch?v=_d35AeoGpY4

Quizás te sorprenda, pero podemos extraer algunas lecciones de su modo de actuar aplicables al desarrollo de software. Y si no, veamos cuál es la estrategia de Supernanny:

  • Observar el funcionamiento actual, sin intervenir en él.
  • Anotar los problemas detectados y su posible solución.
  • Exponer y aplicar esas soluciones al caso real.
  • Comprobar la efectividad de las soluciones.

¿Creéis que Supernanny sería tan efectiva si, en vez de proceder así, esperara a que los padres acudieran a su despacho, le expusieran el problema, y ella les diera una solución sin ni siquiera conocer a sus hijos? Parece obvio que no.

Entonces ¿por qué no seguimos el mismo esquema en el desarrollo de software? Habitualmente esperamos que el cliente nos cuente sus problemas, y nosotros desarrollamos la solución, muchas veces sin conocer en entorno de trabajo ni a los usuarios.

La técnica equivalente a lo que hace Supernanny en el ámbito del Diseño Centrado en el Usuario (y en otras muchas disciplinas) suele ser conocida como "estudio de campo".

Y es que, si bien es cierto que no hay dos niños iguales, lo mismo ocurre con los usuarios y sus situaciones. Y sí, seguro que Supernanny nos ayudaría con muchos clientes. :)

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

MadeInFlex

Object Pool and Caching

Febrero 1st, 2010

Seguramente alguna vez hemos oído o leído sobre los conceptos de “pool de objetos” o “cache de objetos”. En este artículo quiero darles un vistazo en profundidad. Son conceptos que pueden confundirse, es por esto que intentaré resaltar las diferencias entre ambos conceptos después de haber investigado un poco.

Definiciones

Son patrones orientados a objetos muy potentes y muy usados en diferentes tecnologías, sobre todo en J2EE.

Cuando hablamos de pool, ésta se concibe como una colección de objetos sin estado. Algunos ejemplos serían una pool de conexiones a base de datos o una pool de item renderers.

En cambio, la cache se define como una colección de objetos con estado definido, por ejemplo, cuando trabajamos con servicios con una capa como puede ser Spring, los servicios se cachean.

La diferencia más importante entre estos dos conceptos está en lo que contienen, es decir, usaremos una cache cuando nos interese guardar un estado de un objeto concreto. En cambio usaremos una pool cuando necesitamos guardar objetos de los cuales no nos importa perder su estado.

Otras consideraciones importantes son:

  • Cuando pedimos un objeto de una pool, se nos puede servir cualquier objeto de esta pool.
  • En cambio, cuando pedimos un objeto de una cache, esperamos un objeto específico de esta cache.
  • Si todos los objetos de la pool están en uso cuando pedimos un elemento, esperaremos hasta que se libere cualquier objeto o se cree uno, si es necesario.
  • Si todos los objetos de la cache están en uso cuando se pide uno, tocará esperar hasta que el objeto deseado esté libre, aunque hubiera muchos elementos disponibles en la cache, ya que nos interesa uno concreto.
  • El tamaño de una pool puede variar según el número de recursos que necesitemos en un momento determinado.
  • El tamaño de una cache suele ser fijo.

Implementación

Podemos decir que la manera más habitual una cache se representa como un diccionario, es decir, como una colección de parejas id-value, de manera que cuando necesitamos un recurso determinado, éste es buscado en el diccionario y se devuelve el valor.

Para representar una pool, también podemos hacerlo con un diccionario, pero se suele crear una clase que controle los recursos, con una lógica no tan sencilla como la de una cache.

Sobre las pools

Una pool de objetos puede ofrecer una mejora de rendimiento en una aplicación. Es adecuada en aquellas situaciones en la que nos puede penalizar el proceso de creación de objetos o en las que el número de objetos de un determinado tipo puede hacer degradar el rendimiento la aplicación.

En la siguiente imagen se muestra un ejemplo típico de Pool:

pool

La pool está implementada como un singleton, el cual nos permite pedir un elemento, liberar un elemento o settear el valor máximo de elementos que la pool puede albergar.

Las pools se diferencian en tres tipos:

  • Pool sin límite: tiene un tamaño ilimitado, de manera que nos asegura que siempre devolverá un objeto cuando lo necesitemos.
  • Pool nivelada: tiene un tamaño constante. La pool se rellena durante su construcción, de manera que la carga de memoria la tenemos en tiempo de creación de la pool y no cuando se piden elementos.
  • Pool en cola: La pool tiene un tamaño mínimo y se rellena durante la construcción. No tiene límite, lo que le permite crecer. La diferencia está en que cuando pedimos un recurso de la pool y éstos están todos ocupados, la petición se pone en cola.
  • Cada aproximación de las anteriores expuestas tiene sus beneficios y depende del contexto, el uso de una o de otra.

    Conclusión

    Espero que este post haya servido para aclarar ambos conceptos. A continuación os dejo unos links interesantes sobre este tema:
    http://elromdesign.com/blog/2009/11/05/object-pooling-in-flex-actionsctipt/
    http://www.lostinactionscript.com/blog/index.php/2008/10/30/object-pooling-in-as3/

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

    Buayacorp

    Emergencia en Cusco y el Sur del Perú

    Enero 30th, 2010

    La Ciudad del Cusco (mi ciudad) y los alrededores han venido sufriendo desde hace una semana atrás grandes precipitaciones pluviales, las cuales han inundado parte y en otros casos toda una ciudad. Esta tragedia ya ha cobrado al menos 10 víctimas.

    La región del Cusco ha sido declarada en emergencia desde el martes pasado, este periodo será por 60 días.

    Un amigo me comenta que en el extranjero se cree que la tragedia es sólo en Machupicchu, pero desde aquí decimos que aparte de Machupicchu y Aguas calientes hay otras ciudades que han sufrido mucho más y están necesitando nuestra ayuda. Tenemos algunas fotos:

    Yucay por Daniel Nakasone

    Yucay

    Urubamba por Daniel Nakasone

    Urubamba

    Huacarpay por Marco Moscoso

    Huacarpay

    Zurite por Marco Moscoso

    Zurite

    Aguas Calientes por Alfredo Velarde

    Aguas Calientes

    Las ciudades que necesitan ayuda se pueden ver en el siguiente mapa realizado por @elcaminerito:


    Ver Cusco en Emergencia en un mapa más grande

    ¿Cómo ayudar?

    En el mapa arriba también se muestran en verde los puntos de apoyo en Cusco. Además, podemos ayudar donando frazadas, alimentos no perecibles, agua, etc. Podemos ver la lista completa en el Blog de El caminerito.

    En Lima: Hoy y mañana se recibirán donativos en Almirante Guisse 934, Jesus Maria. A la altura de la pre de la Agraria en avenida Cuba.

    En Cusco: HOY antes de las 10am para realizar catastro de la gente damnificada en Cusco. Llamar al teléfono 984750101

    Puedes seguir también mediante Twitter a @elcaminerito, @achachau, @Apu_Rimak, @VOXURUBAMBA y o los trends #cusco, #machupicchu y #lluvias.

    Estaremos actualizando para más información.

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

    programania

    Programania en Twitter

    Enero 30th, 2010

    Programanía lleva teniendo cuenta en Twitter mucho tiempo. David se encargó de llevar este humilde blog al mundo de las redes sociales. Lo que pasa es que lo anuncio ahora porque me he decidido a reactivar este blog (ya era hora, me daba mucha pena tenerlo parado) y a empezar a utilizarla. Pienso postear lo que vaya leyendo de artículos del Google Reader y los artículos que vayamos escribiendo….

    Con ustedes, PROGRAMANIA EN TWITTER. ¡Bienvenidos al 2009!  :-P


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