electroduendes.com

bitácora de un desarrollador interactivo

electroduendes.com header image 1

Portafolitis - be honest my friend

September 28th, 2008 · No Comments

Gran post de mis queridos colegas de [Q] acerca del fenómeno de la portafolitis, en el que desarrollan la manía de compañeros de profesión y de agencias de engrosar su portfolio con grandes marcas sin apenas detallar el trabajo realizado. Me he reído bastante, y me suscribo a sus palabras.

Al césar lo que es del César

→ No CommentsTags: Actionscript

Innovación? mucho lirili y poco lerele (2 de 2)

September 23rd, 2008 · No Comments

Genius is 1% inspiration, 99% perspiration

Thomas Alva Edison

Algo así como: Un genio es 1% inspiración y 99% de sudor…

→ No CommentsTags: Actionscript

Innovación? mucho lirili y poco lerele (1 de 2)

September 23rd, 2008 · No Comments

Como gestor de proyectos, nunca tuve problemas para encontrar gente con ideas alocadas, pero tuve problemas para encontrar gente que las ejecutara (…) así que no creo que necesite más innovación.

Linus Torvalds.

Para los profanos, Linus Torvalds es un Ingeniero de Software conocido por crear el primer kernel para GNU/Linux, sistema operativo que actualmente usa el servidor que te da esta página, y el de tu periódico favorito, y el de tu red social, y …. Además, Linus Torvalds es una de las personas más influyentes del mundo por la revista Time en 2004. También fué galardonado como uno de los mejores administradores empresariales por la revista BussinesWeek. Es muy conocido por sus citas ácidas e irónicas, bastante famosas en la escena geek.

→ No CommentsTags: Actionscript

Los megaproyectos

September 18th, 2008 · 1 Comment

Los megaproyectos son iniciativas con gran presupuesto, costes de ejecución y notoriedad en su entorno. Se trata por lo tanto, de un proyecto con una inversión de gran envergadura y esfuerzo en todos los sentidos. Generalmente son apuestas muy ambiciosas, y con frecuencia sufren la sobreestimación del resultado de los mismos, además de un sobrecoste debido a una falta de previsión de los recursos necesarios.

Muchos de los megaproyectos, independientemente del área empresarial sobre la que se gestan, son sinónimo de chapuza. Todos además, se hacen eco en la sociedad que les rodea. Las obras del ave, el soterramiento de la m-30, la presa de las tres gargantas… son ejemplos que a todos nos suenan porque llegan a los periódicos por tratarse de obras civiles de dinero público. Pero hay miles de proyectos acometidos cada año por las empresas, que sufren los mismos síntomas en muy diferentes áreas: automoción, Ingeniería del Software, publicidad… y todos ellos captan la atención de los compañeros de su gremio.

Los megaproyectos se basan en un principio muy sencillo: la tendencia del ser humano de magnificar los beneficios reales, sin pensar en las posibles consecuencias negativas de un sobrecoste, o de las repercusiones ocasionadas por la falta de dimensionamiento. Pero seamos francos, a todo el mundo le seduce el megaproyecto. Llegar a la luna, invadir un país enemigo, hacer un puente entre dos continentes… son proyectos que gustan hasta al más avispado.

Dicen los expertos, que el sobrecoste en megaproyectos ronda el 20% - 50% de media de los recursos iniciales.

Y ahora es cuando puedo hablaros del síndrome “kitchen sink“, que se suele cebar sobre estos megaproyectos.

El síndrome “kitchen sink” (” o “scope creep”) en gestión de proyectos, habla de cambios incontrolables sobre el ámbito de un proyecto, causados generalmente por falta de definición de los objetivos del mismo, y control adecuado sobre él.

Sin poder identificar los objetivos de nuestro megaproyecto, podemos encontrarnos en la cómica situación de pretender lanzar un transbordador al espacio, sin un objetivo claro… aunque se rumoree que el objetivo es tomar muestras de un planeta del sistema solar,

… y necesitamos diseñar el transbordador, los cálculos de trayectorias, y un vehículo explorador que se adapte a las condiciones del planeta destino….

Y bien avanzado el desarrollo es cuando los megaproyectos ofrecen su peor expresión. Las nuevas mejoras o productos que cubren estas incontingencias, provocan incrementos en presupuestos, retrasos, nuevos recursos a contratar, tareas extra a acometer por la plantilla inicial, desviaciones en el rumbo del proyecto completo… un reto de difícil superación incluso para los más experimentados directores de proyecto.

Nadie tiene la fórmula del éxito, y atrincherarse contra la idea de que los megaproyectos son el demonio, habría privado a la humanidad de muchos de sus grandes logros. Una definición clara de los objetivos del proyecto que permita centrarse en la consecución de los mismos es la clave del éxito. Y es entonces cuando descubres que un proyecto pequeño obtiene mejores resultados que el megaproyecto por el simple hecho de saber qué pez queremos pescar y adecuar el cebo para dicho pez.

→ 1 CommentTags: Actionscript · Personal

Redes sociales for dummies

August 25th, 2008 · No Comments

Explicar el concepto de red social a un profano puede llevarte a garabatear un folio con pelotillas de los nombres de tus amigos con un nivel de “ininteligencia” proporcional al conocimiento de internet de tu amigo o familiar. Mucho más claro y conciso el vídeo que me apunto por si me vuelve a pasar.

→ No CommentsTags: Redes Sociales

Nueva página - alexsanchez.info

January 28th, 2008 · 4 Comments

Hace poco compré un dominio, alexsanchez.info, donde últimamente he estado escribiendo, con la idea de ofrecer allí un escaparate de mis trabajos, y vía de contacto para mis negocios, compuesto de una bitácora estrictamente profesional y un portfolio experimental. Pensaba entonces, redirigir todos los post de código y experimentos de este blog al nuevo, y separar un poco, y de paso, la parte profesional de la parte de ocio o personal en mis entradas.

La razón es que últimamente este blog era un popurrí de temas muy personales, entradas “ociosas” y paridas y entradas muy técnicas acerca de mis trabajos como profesional de Internet. Lo había orientado más como un blog al uso, para mis amigos y colegas de profesión y no como un escaparate para mí. Pero cuando captaba algún cliente, o me presentaba en alguna empresa, me daba bastante apuro pasarle el enlace al blog, puesto que había ciertos aspectos del mismo que no me apetecía mostrar a clientes, y sin embargo, había otro tipo de entradas muy interesantes para ellos.

¿vosotros qué opináis? Agradeceré mucho vuestras opiniones, queridos lectores. Por cierto, ya funcionan los comentarios. ^_^

→ 4 CommentsTags: Personal

intenneeeee

October 24th, 2007 · 1 Comment

Me he mudado de casa, y por desgracia he tenido que estar sin internet unos días como el pobre Enjuto. Menos mal que ya vuelvo a tener…

→ 1 CommentTags: Personal

Vendo Monitor CRT 19 pulgadas

September 14th, 2007 · 2 Comments

Pues eso, que tengo publicada una subasta en eBay de mi monitor de 19 pulgadas Hitachi.
Está impecable, tiene 4 años y no me ha dado nunca ningun problema. Me costó en su día 400€. Os pongo el enlace por si estáis interesados en pujar por él. El precio de salida de la subasta es 30€.

Monitor 19 pulgadas, barato, barato

También tengo una tarjeta de memoria Compact Flash de 512Mb, con un precio de salida de 5€

La tarjeta de memoria, que me la quitan de las manos, que me la quitan de las manos…

Que me lo quitan de las manos!

→ 2 CommentsTags: Personal

Luchando contra el fenómeno HOYGAN

September 12th, 2007 · 5 Comments

Hace tiempo, un compañero de trabajo me comentó que le encantaba participar en foros y escribir correos, porque había recuperado el hábito de escritura. Además le servía para aprender a expresarse correctamente y le ayudaba a reflexionar sobre lo que estaba escribiendo…

Los sitios web están plagados de comentarios. A veces son más interesantes incluso que las noticias. En los foros, los comentarios lo son todo, en realidad, un foro se puede entender como un sitio de comentarios organizados. Soy un asiduo visitante de los foros, de muy diferente índole. Motor, tecnología, economía, política… “le meto” a todos.

En ellos puedo encontrar cierta información que tarda tiempo en ser publicada, u opiniones muy específicas sobre muy diversos temas que sólo puedo encontrar en ellos.

En un foro, es fácil encontrar lo que busco, la información está bien categorizada, y existen potentes buscadores que me permiten encontrar hilos con temática similar a la que busco.
Peero…en contrapartida, un foro es abierto, y no todas las opiniones tienen el mismo interés. Generalmente, alguien formula una pregunta, y varias personas ofrecen un amplio abanico de respuestas. Y pasa lo de siempre:

Hay grandes expertos en la materia, personas que hacen buen uso de la palabra, utilizando frases no demasiado extensas, mediante un lenguaje llano y fácil de leer, usando adecuadamente los puntos y aparte, las comas, el punto y coma, evitando en gran medida faltas de ortografía …Vamos, sin pretender ser un pedante del bolígrafo, pero escribiendo de manera que se facilite la lectura.

Y hay otros que en vez de escribir, parece que rebuznan. Párrafos enormes sin un solo punto y aparte, “penalties ortográficos”, la maldita costumbre de escribir con “k” en vez de “q”… realmente leer este tipo de comentarios se me hace complicado. ¡es cansino y dificulta la comunicación y comprensión! Hasta se ha acuñado un término para ellos. Los temidos HOYGAN.

Bueno, pues últimamente me sucede que, navegando por foros, si encuentro un mensaje con síntomas de haber sido escrito por un “HOYGANERO”, directamente paso al siguiente mensaje, porque sé a ciencia cierta que el comentario va a tener nula o poca importancia.

Bueno pues hoy he encontrado alguien que ha implementado un sistema anti-HOYGAN. La gente de nopuedocreer.com, no permite la publicación en su blog, de comentarios que porten palabras potencialmente “hoyganeras”, tales como “hoygan”, “hoigan”, “plis”, “weno”, “grasias”, “fabor”….

La idea es bastante interesante. Lo que no entiendo es como nadie le ha sacado partido a este problema antes: si Akismetha abierto nicho en el tratamiento del spam para los comentarios, está más que cantado que poco nos queda para los servicios de corrección ortográfica de comentarios en sitios web.

Pero es una evolución que debería avanzar con cuidado, ya que puede convertirse en una táctica que quizá coarte la evolución del lenguaje: si estoy imitando a un cateto, escribiré “fabor” encerrado entre comillas, y por ello mi comentario no debería ser rechazado. También si utilizo “jerga” en mi lenguaje, no debería estar obligado a corregirlo. Además, el lenguaje evoluciona y prueba de ello son la gran cantidad de palabras aceptadas por la RAE que provienen del lenguaje de la calle. Por ejemplo, “cocreta” ya está aceptada por el diccionario: muchas de las palabras del Castellano que ahora pueden denominarse “cultismos”, siglos atrás formaban parte de la jerga del populacho.

Pensando en mi propio comportamiento (omitir los mensajes con gran cantidad de faltas de ortografía), y en base a la implementación que han realizado la gente de nopuedocreer.com, se me ha ocurrido, que sería muy útil portar dicha idea para un sistema de relevancia de mensajes automatizado en base al número de faltas de ortografía que porte el mensaje. Actuaría de forma conjunta con el sistema de votación participativo, que ya podemos ver en youtube o menéame, por el cual la gente puede promocionar los comentarios positivos y penalizar los irrelevantes.

Imaginemos que alguien escribe un mensaje, y supongamos que comete no más de 5 faltas de ortografía en 2 ó 3 párrafos. Bien pues esa persona recibirá un peso mayor en las búsquedas de los foros, y su comentario aparecerá en texto más grande. Lo contrario pasaría con el hoyganero. en función de sus faltas de ortografía, se podría dar menos relevancia a su comentario.

La necesidad está creada, y las herramientas comienzan a desarrollarse. ¿Conseguiremos minimizar el problema sin coartar el lenguaje?… próximamente en nuestras bitácoras.

→ 5 CommentsTags: Redes Sociales

Procesado de imágenes en Java II

July 24th, 2007 · 4 Comments

Javier Murillo me manda una mejora para la clase ImageUtils que publiqué en la entrada procesado de imágenes en Java. Es una alegría saber que otros desarrolladores trabajen con el código que publico, y que, como en este caso, se interesan por mejorarlo y reenviarlo. Gracias Javier!

JAVA:
  1. package es.gaea.utils;
  2.  
  3. import java.awt.RenderingHints;
  4. import java.awt.geom.AffineTransform;
  5. import java.awt.image.AffineTransformOp;
  6. import java.awt.image.BufferedImage;
  7. import java.io.File;
  8. import java.io.IOException;
  9. import javax.imageio.ImageIO;
  10. import org.apache.log4j.Logger;
  11.  
  12. /** Clase que implementa un procesador para imagenes y juguetear con ellas */
  13. public class ProcesadorImagenes {
  14.  
  15.         /** Logger de la clase */
  16.         private static Logger logger = Logger.getLogger(ProcesadorImagenes.class);
  17.        
  18.         /** Opciones de renderizado para las imagenes */
  19.         private RenderingHints opciones = new RenderingHints(null);
  20.        
  21.         /** Constructor de la clase */
  22.         public ProcesadorImagenes() {
  23.                
  24.                 // Cargo las opciones de renderizado que me apetezcan   
  25.                 opciones.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  26.                 opciones.put(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
  27.                 opciones.put(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE);
  28.                 opciones.put(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
  29.                 opciones.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
  30.                 opciones.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
  31.                 opciones.put(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE);
  32.                 opciones.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
  33.         }
  34.        
  35.         /** Devuelve la lista de formatos disponibles a leer por ImageIO       
  36.          * @return un array de strings con los mismos. 
  37.          */
  38.         public String[] dameFormatosUsables(){
  39.        
  40.                 return ImageIO.getReaderFormatNames();
  41.         }
  42.  
  43.  
  44.         /** Calcula el factor de escala minimo y en base a eso
  45.          * escala la imagen segun dicho factor. 
  46.         * @param nMaxWidth maximo tamaño para el ancho
  47.         * @param nMaxHeight nmaximo tamaño para el alto       
  48.         * @param imagen Imagen que vamos a escalar
  49.         * @return Devuelve la imagen escalada para poderla trastocar o null si hay error
  50.         */
  51.         public BufferedImage escalarATamanyo(final BufferedImage imagen,
  52.                         final int maximoAncho, final int maximoAlto) {
  53.  
  54.                 // Comprobacion de parametros
  55.                 if (imagen == null || maximoAlto == 0 || maximoAncho == 0) {
  56.                         return null;
  57.                 }
  58.                
  59.                 // Capturo ancho y alto de la imagen
  60.                 int anchoImagen = imagen.getHeight();
  61.                 int altoImagen = imagen.getWidth();
  62.  
  63.                 // Calculo la relacion entre anchos y altos de la imagen
  64.                 double escalaX = (double)maximoAncho / (double)anchoImagen;
  65.                 double escalaY = (double)maximoAlto / (double)altoImagen;
  66.                
  67.                 // Tomo como referencia el minimo de las escalas
  68.                 double fEscala = Math.min(escalaX, escalaY);
  69.                
  70.                 // Devuelvo el resultado de aplicar esa escala a la imagen
  71.                 return escalar(fEscala, imagen);
  72.         }
  73.  
  74.  
  75.         /** Escala una imagen en porcentaje.
  76.         * @param factorEscala ejemplo: factorEscala=0.6 (escala la imagen al 60%)
  77.         * @param srcImg una imagen BufferedImage
  78.         * @return un BufferedImage escalado
  79.         */
  80.         public BufferedImage escalar(final double factorEscala, final BufferedImage srcImg) {
  81.  
  82.                 // Comprobacion de parametros
  83.                 if (srcImg == null) {
  84.                         return null;
  85.                 }
  86.                
  87.                 // Compruebo escala nula
  88.                 if (factorEscala == 1 ) {
  89.  
  90.                         return srcImg;
  91.                 }
  92.                
  93.                 // La creo con esas opciones
  94.                 AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(factorEscala, factorEscala), opciones);
  95.                
  96.                 // Devuelve el resultado de aplicar el filro sobre la imagen
  97.                 return op.filter(srcImg, null);
  98.         }
  99.  
  100.        
  101.         /** Metodo que guarda una imagen en disco
  102.          * @param imagen Imagen a almacenar en disco
  103.          * @param rutaFichero Ruta de la imagen donde vamos a salvar la imagen
  104.          * @param formato Formato de la imagen al almacenarla en disco
  105.          * @return Booleano indicando si se consiguio salvar con exito la imagen
  106.          */
  107.         public boolean salvarImagen(final BufferedImage imagen,
  108.                         final String rutaFichero, final String formato) {
  109.                
  110.                 // Comprobacion de parametros
  111.                 if (imagen != null && rutaFichero != null && formato != null) {
  112.        
  113.                         try {
  114.                                 ImageIO.write( imagen, formato, new File( rutaFichero ));
  115.                                 return true;
  116.                         } catch (Exception e){
  117.                                 // Fallo al guardar
  118.                                 if (logger.isDebugEnabled() == true) {
  119.                                         String CODIGO_MENSAJE_ERROR_GUARDADO_FICHERO =
  120.                                                 "No se pudo guardar correctamente la imagen en " +
  121.                                                 rutaFichero;
  122.                                         logger.debug(CODIGO_MENSAJE_ERROR_GUARDADO_FICHERO);
  123.                                 }
  124.                                 return false;
  125.                         }
  126.                 } else {
  127.                         // Fallo en los parametros
  128.                         return false;
  129.                 }
  130.         }
  131.  
  132.  
  133.         /** Metodo principal de la clase. Usado como prueba
  134.          * @param args Argumentos del metodo
  135.          */
  136.         public static void main(String args[]) {
  137.        
  138.                 // Variables locales
  139.                 BufferedImage imagen;
  140.                
  141.                 try {
  142.                         imagen = ImageIO.read( new File( "prueba.jpg" ) );
  143.                         ProcesadorImagenes pi = new ProcesadorImagenes();
  144.                        
  145.                         // Escalo algunas imagenes como pruebas
  146.                         BufferedImage imagen800_600 = pi.escalarATamanyo(imagen,800, 600);
  147.                         BufferedImage imagenSnap_Shot = pi.escalarATamanyo(imagen,96, 96);
  148.                         BufferedImage imagenMediana = pi.escalarATamanyo(imagen,500, 500);
  149.                        
  150.                         //      Las salvo en disco
  151.                         pi.salvarImagen(imagen800_600,"imagenG.jpg","jpg");
  152.                         pi.salvarImagen(imagenSnap_Shot,"imagenP.jpg","jpg");
  153.                         pi.salvarImagen(imagenSnap_Shot,"imagenE.png","PNG");
  154.                         pi.salvarImagen(imagenMediana,"imagenA.gif","gif");
  155.                        
  156.                         // Extraigo la lista de formatos capaces de leer
  157.                         String[] formatos = pi.dameFormatosUsables();
  158.                        
  159.                         // los voy mostrando
  160.                         for (int i=0; i <formatos.length; i++) {
  161.                                 System.out.println(formatos[i].toString());
  162.                         }
  163.                        
  164.                         // Final del metodo con exito
  165.                         System.exit(0);
  166.                 } catch (IOException e) {
  167.                         e.printStackTrace();
  168.                 }
  169.         }
  170. } 

→ 4 CommentsTags: Java