electroduendes.com

bitácora de un desarrollador interactivo

electroduendes.com header image 1

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 · 5 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. ^_^

→ 5 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

Talleres de verano subflash 07

July 17th, 2007 · 3 Comments

Un año más la gente de Subflash organiza unos Talleres abiertos de verano el 25 y 26 de Agosto, donde flasheros de todos los lugares de España y Latinoamérica se juntan para asistir a las ponencias, compartir experiencias, conocimientos y disfrutar del comer y beber del lugar. Tras Teruel, Madrid, Barcelona y Oviedo, este año toca Málaga.
Este evento sin ánimo de lucro está dirigido a todos los desarrolladores web. La convocatoria es abierta, con lo que cualquier persona podrá inscribirse en el sitio web para asistir a las ponencias, bien como oyente si se encuentra en Málaga, o bien mediante opción completa, con alojamiento y pensión completa.
Personalmente solo puedo escribir alabanzas hacia este evento, que... no sólo me ha servido en el plano profesional, sino también en el plano personal, forjando grandes amistades con muchos de los asistentes durante los cuatro años que llevo asistiendo al evento.
Este año no va a poder ser por temas académicos y no podré asistir. Solo les deseo que lo pasen tan bien como yo lo hice en los años anteriores, y animo a todo aquel que habite en el mundillo del desarrollo web y Flash a que se inscriba para este año. La experiencia es única!

Más información:
http://www.subflash.com/talleres/2007/

→ 3 CommentsTags: Actionscript

calculadora de madera

June 26th, 2007 · No Comments

Un poco de madera, unas canicas y la gravedad es lo único que necesita este sujeto para explicar la manera en la que suma un computador. Muy didáctico para los que siempre se lo preguntaron.

[calculadora de bolsillo]

→ No CommentsTags: Actionscript

Cuando un gato ataca

June 16th, 2007 · No Comments

[ instinto felino ]

→ No CommentsTags: Actionscript

Árbol de actionscript.es

May 14th, 2007 · No Comments

Por aquí dejo un prototipo de experimento que empecé hace como un año y medio. Se trata de un sistema de visualización gráfica en forma de árbol del rss del sitio web Actionscript.es. Para los que no lo conozcan, actionscript.es es un portal de enlaces y recursos del lenguaje de programación Actionscript para su plataforma Flash, donde podemos encontrar los sitios web de obligada visita para cualquier desarrollador y diseñador de esta plataforma, así como añadir nuevos enlaces al portal. Dicha página, pone a dominio público, un feed RSS de los enlaces de la misma, de manera que cualquiera (en este caso, yo) pueda acceder a los recursos que allí se brindan, y representarlos a su antojo.

La idea del experimento era presentar el directorio de enlaces del portal mediante un juguete visual y dar una vuelta de tuerca al árbol de datos de la web, además de servirme como "sparring" para el desarrollo de un conjunto de clases para el tratamiento de sistemas de representación de redes y datos complejos.

Es curioso, pero con muchos de mis experimentos personales, me pasa como con los pantalones de mi armario. Al principio, como son nuevos, los pongo casi todos los días (equivale a cuando se me ocurre alguna idea y me pongo a desarrollarla). Pero pasado un tiempo, los pantalones se van rompiendo y desgastando (problemas, bugs) , y cada vez me los pongo menos (dedico menos tiempo al desarrollo), me compro unos nuevos (nuevas ideas), y aquellos pantalones quedan olvidados en el fondo del armario (mi repositorio). De vez en cuando, me topo con ellos, y pienso para mí "cómo los voy a regalar, si todavía están nuevos..." (regalar= liberar ó publicar) y aquellos pantalones, aguantan una temporada más en el fondo del armario esperando para nada.
Hasta que por fin, un día, me armo de valor y lo publico, a medias, y dos años después de haberlo parido. Más vale un experimento a medias que un no-experimento, ¿no es así?

→ No CommentsTags: Actionscript · Experimental · Eye candy UI · Flash · mis experimentos