Ir al contenido principal

Entradas

Mostrando las entradas de 2008

Si los lenguajes de programación fueran religiones

Vía http://www.pragprog.com , encuentro un articulo que comenta los lenguajes como si fueran religiones, realmente es muy divertido, me gusta en especial la definición de Perl (sangre de cabra y trabajos un Viernes a las 21 h), el de Ruby, C# y VB también están muy buenos. Hecheles un OjO y que se diviertan!

Guía de supervivencia para Maven

Maven Guía rápida Este documento no pretende ser una guía completa a Maven, solo una guía rápida para poder iniciarse en Maven y consecuentemente, continuar por cuenta propia hacia características más avanzadas. Que es maven? Maven es una herramienta open source, mediante la cual podemos administrar ciertas etapas del ciclo de vida de nuestros proyectos, entre variadas cosas más. Para darnos un ejemplo, con maven podemos compilar nuestros componentes, deployarlos, correr nuestros casos de pruebas, etc. Pero acaso no puedo hacerlo con Ant? Correcto, gran parte de las cosas que se pueden realizar con Maven, pueden implementarse con Ant, sin embargo podemos pensar en Ant como una herramienta de más bajo nivel, solo por citar un breve ejemplo, con maven podemos ejecutar la siguiente instrucción: mvn clear Esta simple instrucción elimina los directorios donde tenemos deployado nuestro proyecto, muy útil por ejemplo cuando queremos deployar desde cero nuestro proyecto nuevamente. En A

La fábula del pastor y el PM

Interesante y reflexivo cuento, acerca de un pastor y un PM .. Personalmente opino que el role, de los Manager hoy por hoy, es el de facilitadores, negociantes y reconciliadores. Al final lo importante es sacar un buen producto y no que cumplas un horario o vistas saco y corbata. Muchos PM me parece, pierden las perspectiva creyéndose los dueños de la compañía y olvidan que su labor es llevar los proyectos a buen fin y no maximizar las ganancias de la compañía mediante la aplicación de despotas policitas pasadas de moda. Una compañía que tiene proyectos exitosos, va tener mas demanda de proyectos por parte de los clientes y por ende maximizará de mejor manera su capital, a través de tarifas mas favorables, por trabajo de mayor calidad o la producción de proyecto en mayores cantidades.

Labor de mantenimiento Upd# 2

En esta nueva actualización del blog a parte de los comunes post, se han agregado mas links y blogs, también se han adherido soporte para Google analytics , para llevar las estadísticas del sitio. También se ha agregado el primer álbum de fotos, como parte de la entrega de arte del CowParade , en la provincia de Heredia , específicamente en el parque Central del Cantón, por si deseas checkarla . Saludos

El gallito ingles

Hoy me puse a pensar acerca varios hechos que me hacen mucha gracia acerca de nuestra cultura y el uso del idioma ingles. El primer punto que deseo comentar es relativo a los extranjeros, en nuestro país se tiene la costumbre de pensar que todo gringo o europeo es turista y debemos hablar, ingles, chino o portugués a la hora de dirigirnos a él, por ejemplo; si nos encontramos un gringo en la calle que no logra ni sincronizar los labios para decir "hola", la gente le habla en ingles (si puede hacerlo), mas en cambio si vamos a U.S.A, en calidad de turistas y entramos por ejemplo al aeropuerto o a una tienda de comida rápida como Subway, o BK y no hablamos ingles o no entendemos el rápido ingles de un empleado de color negro de Atlanta por dar un ejemplo, el mismo empleado al que se le esta pagando para que nos de un servicio, se molesta y se estresa que no sepamos perfecto ingles, será que los ticos somos muy buena nota o de lo contrario por que no aplicar la misma regla, se m

Lectura en progreso

En este post, solo quiero comentarles acerca de algunos libros que estoy leyendo y mis impresiones acerca de los mismos: Java Persistance with hibernate , a mi parecer es el mejor libro para aprender hibernate desde el punto de vista de JPA. El libro a pesar de ser muy denso, no deja de ser interesante y muy útil. Si deseas aprender, JPA implementado con Hibernate, este es tu libro. Java, Como programar de Deitel y Deitel es un clásico, para aprender a programar basándose en Java, el libro me parece muy básico, aunque tiene temas muy interesantes como Java NIO y Java Image, entre otros, lo uso como material de referencia para un curso de Java básico que estoy dando en avVenta . MySQL para Windows y Linux , es un interesante libro, tanto para aprender las nociones básicas de SQL como para aprender tópicos intermedios de MySQL, lo llevo bastante avanzado y me parece bastante bien. Groovy Recipes , en mi afán por aprender Groovy, este libro ha sido una excelente herramientas para conocer

Opinión Servlet 3.0

Leo en el sitio The Server Side , un articulo que da un pequeño recorrido a través de la nueva especificación de Servlets que esta por salir. Como se había escuchado y era de esperar, los Servlets podrán ser creados como Pojos, digamos: @Servlet(urlMapping={"/myServlet"}, name="MyServlet") class MyServlet { @GET @POST public void handleRequest(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { .... } } Yo le encuentro algunos problemas a esto: No se desacopla del WebContainer o de los objectos Mock para hacer testing, por que se sigue recibiendo el objeto request y response. En caso que ocupe los "init" parámetros o algún método del HTTPServlet, no veo ninguna alternativa Como dice el articulo de ServerSide , un usuario puede anotar dos veces un método con GET o POST, provocando una posible confusión al WebContainer La primera característica comentada en el articulo, me parece cool, en el sentido q

Las patentes - un problema legendario

En este mundo, donde las personas que tienen el suficiente dinero quieren patentarnos hasta las ganas de comer (o descomer), donde el dinero y las leyes, se ponen a servicio de los milenarios millonarios, nos podemos remontar a un caso legendario; Mucha gente atribuye a Alexander Graham Bell el revolucionario invento del teléfono y por ende las telecomunicaciones, sin embargo y de forma muy injusta la historia olvido entre laureles la existencia del verdadero inventor del teléfono; el Italiano Antonio Meucci, quien por preocupaciones económicas, nunca pudo patentar el aparato. Sin duda, esto nos da una pequeña idea de como, las personas que tienen dinero siempre han intentado patentar la creatividad e imaginación, de los economicamente menos afortunados, cuantos pequeños pero revolucionarios científicos habrán hecho mas ricos, a IBM, Microsoft y Apple, a cambio de migajas comparandolas con las ganancias que estos gigantes obtienen. En fin, creo que las patentes fueron diseñadas para d

Ley contra el SPAM

Leo en el periodo la Nación ( http://www.nacion.com/ln_ee/2008/noviembre/28/pais1788837.html ) la divulgación acerca de una ley para castigar a las entidades o personas que realicen SPAM, ya sea mediante llamadas telefónicas, mensajes de texto (SMS), etc. Una buena practica, cuando recibimos un correo electrónico basura, es rastrear la IP y enviársela a Racsa detallando el delito, en el caso de mensajes de texto o llamadas no deseadas, se puede notificar al ICE. Por otro lado, sería interesante crear un "black list", para denunciar y exponer a los sitios, números de teléfono o personas que se dedican a este tipo de actividades.

Impensando acerca de las referencias en Java

Fue hace ya algún tiempo que pase un rato discutiendo con algunos compañeros acerca de si existe o no el paso por referencia; el discurso fue mucho hacia que en Java el comportamiento, en el supuestamente pasamos por referencia un objeto y por valor los objetos primitivos creo mucha polémica. Para ubicarnos en contexto veamos el siguiente ejemplo. public static void main(String[] args) { int value = 10; changeValue(value); System.out.println("value = " + value); User user = new User(); Name name = new Name(); user.setName(name); name.setName("jsanca"); name.setLastName("XXX"); user.setPassword("123queso"); System.out.println("user: " + user.getName().getName() + ", " + user.getName().getLastName() + ", " + user.getPassword()); changeValue1(user); System.out.println("user: " + user.getName().getName() + ", " + user.getName().getLastName() + ", " + user.ge

Labor de mantenimiento

Como parte mi labor de mantenimiento, se han adherido nuevos elementos al blog; Se agrego un icono para el usuario de debugmodeon y mi perfil de linkedin . Se cambio el "look & feel" y la estrategia adSense . Se agrego un nuevo elemento llamado: Que hay de nuevo en blogger, el mismo tiene las actualizaciones mis blogs. La sección de visitalos fue actualizada y refactorizada. La sección de foto fue eliminada, por no contar con ninguna hasta el momento. Del primer punto, solo decir que ambos iconos los tome del sitio debugmodeon y los agregue como un nuevo elemento HTML/JavaScript. El segundo punto fue cambiado después de leer algunos artículos en adsense en español ; este sitio además fue agregado a que hay de nuevo y les recomiendo visitarlo regularmente, pues contiene información y artículos muy interesantes acerca de Google AdSense . El tercer elemento me gusta bastante y muestra de una manera muy agradable los blog con las entradas mas recientes. Mi ultimo y cuart

Utilizando expresiones regulares en Java

A continuación muestro un ejemplo de como utilizar expresiones, no se pretende cubrir extensivamente ni mucho menos, el uso de expresiones regulares. Nuestro ejemplo, simplemente muestra como buscar los matches, de una cadena dentro de otra. Nota: Tanto el objeto Pattern como Matcher, se encuentra alojados en el paquete java.util.regex del SDK Java Standard. public static int countMatches (String string, String patternToFind) { Pattern pattern = null; Matcher matcher = null; int countMatches = 0; pattern = Pattern.compile(patternToFind); matcher = pattern.matcher(string); while (matcher.find()) { countMatches +=1; } matcher = null; pattern = null; return countMatches; } // countMatches System.out.println(countMatches("hola ?,?,?,?,?)", "\\?")); System.out.println(countMatches("hola)", "\\?")); Resultado: 5 0 El ejemplo simplemente compila una cadena, una vez compilado y siendo valido, solicitamos los matches

Open CSV

http://opencsv.sourceforge.net/ trata de un framework muy simple y sin mas dependencias de acople que el mismo SDK, a continuación muestro como encapsular mediante Spring, la librería y a su vez leer un archivo csv. import java.io.Closeable; import java.io.IOException; /** * Common interface to read CSV file extension. * @author jsanca * */ public interface CsvReaderGenericDAO extends Closeable { /** * Return the next row in the CSV file, * null if not has next. * @return String [] */ String [] next () throws IOException; } // E:O:F:CsvReaderGenericDAO. Esta clase será nuestra interface común para el lector de Csv. Como puedes ver, simplemente lee la siguiente fila y retorna un vector de cadenas, null en caso que ya no existan mas filas. import java.io.IOException; import au.com.bytecode.opencsv.CSVReader; /** * http://opencsv.sourceforge.net/ implementation wrapper. * @author jsanca * */ public class OpenCsvReaderGenericDAOImpl implements CsvReaderGenericDAO { private CSV

Revisa tu ortografía

En los últimos días y como todos los blogueros se darán cuenta, el corrector ortográfico de blogger, no esta funcionando de la manera correcta, encontré este otro sitio donde puedes checar en línea tu ortografía; http://revisor.com.ar/ , funciona bastante bien y es mejor que tener que abrir el open office o el Abi.

http://portableapps.com/

http://portableapps.com/ es un sitio Web, donde puedes conseguir gran cantidad de software en principio portable (i.e no ocupa instalarse) y entre sus filas milita mucho software free o open, yo lo estoy evaluando el sitio y hasta el momento me parece muy completo.

My Cow parade

http://www.mycowparade.net Full recomendado, este sitio conserva una de las más grandes colecciones de las vaquitas que se formaron parte de la muestra de arte, del cowparade, San José y que si mas no me equivoco, ahora se encuentran en las ruinas de Cartago. Excelente recopilación y sin mas, mis sinceras felicitaciones al creador!

Algunas cosas acerca de Herencia, sobre escritura y métodos estaticos

A continuación vamos a realizar un pequeño estudio, acerca de dos cosas, la primera de ellas es probar que pasa cuando ponemos los keywords, final y static al mismo tiempo en una clase, la segunda es determinar el comportamiento de las clases cuando se sobre escribe un método estático. 1) Tomando en cuenta que una clase final no puede ser extendida y una clase abstract debe ser extendida, cuando intentamos hacer: public final abstract class ImposibleAbstractClass { public abstract void doSomething (); } El compilador nos muestra el siguiente error de compilación: "The class ImposibleAbstractClass can be either abstract or final, not both" Osea, no se puede hacer. 2) Que pasa cuando sobre cargamos un método estático: Veamos el siguiente código: public class A { public static void a () { System.out.println("A"); } public void b () { System.out.println("a"); } } public class B extends A { public static

Test de eficiencia en concatenación de Java String.

El siguiente código resulta muy interesante, en el grado que nos permite experimentar con diferentes implementaciones de CharSequence, para concatenar caracteres (string con +, string utilizando el método concat, StringBuilder, StringBuffer y una biblioteca de terceros que implementa un nuevo objeto llamado Ropes, el cual asegura ser mas rápido y eficiente que el StringBuffer y el simple String (+ info: http://ahmadsoft.org/ropes/). Los resultados a la vista son muy interesantes, el StringBuilder gana la lucha en eficiencia y eficacia. Y la razón del resultado recae en la estrategia de bufereo y que el objeto no sea sincronizado, muy cerca le sigue el StringBuffer el cual utiliza la misma estrategia de buffering, sin embargo es un objeto sincronizado, seguido por la biblioteca propietaria Ropes, la utilizaron del método String.concat() se encuentra de penúltima, la ultima y altamente no recomendable es la utilización del operador + para concatenar; esta operación no solo es lenta, tamb

Comparación de cadenas en Java

El siguiente código nos muestra diferentes formas y métodos para realizar comparaciones de cadenas. La primera comparación con el operador (==), se realiza simplemente a nivel de referencia de memoria. El método (equals) permite realizar una comparación carácter a carácter de dos strings. (equalsIgnoreCase) funciona igual que (equals) descartando las diferencias entre mayúsculas y minúsculas. (CompareTo) permite comparar dos cadenas, con la diferencias que si la clase es igual retorna 0, si la primera cadena es mayor retorna la diferencia (un numero positivo), si la cadena es menor retorna también la diferencia (un numero negativo). Por ultimo se utilizan métodos para realizar comparaciones de pre y pos cadenas, obtener un índice, etc. public void comparisonEqual () { String s1 = "Hello Word"; String s2 = "Hello Word"; String s3 = s1; // Equal examples... System.out.println((s1 == s2)?s1 + " = " + s3: s1 + " != " + s3); System.out

String en Java

Ahora nos centraremos en objetos CharSequence, esta interface es implementada por varios objetos, tales como; String, StringBuilder, StringBuffer, CharBuffer. Ahora nos centraremos en los primeros 3 objetos, pero tomando más importancia al objeto String. String s = "Hello Word"; System.out.println("chartAt: " + s.charAt((s.length() - 1) / 2)); System.out.println("codePointAt: " + s.codePointAt((s.length() - 1) / 2)); System.out.println("isEmpty: " + s.isEmpty()); System.out.println("split: " + java.util.Arrays.toString(s.split("o"))); System.out.println("toCharArray: " + java.util.Arrays.toString(s.toCharArray())); System.out.println("toCharArray: " + s.replace('o', 'a') ); System.out.println("toCharArray: " + s.replace("Hello", "Good bye") ); El método CharAt, nos permite obtener el carácter en una posición determinada. El método codePointAt,

Transformando fechas a diferentes zonas horarias (TimeZone)

Ya es sabido por todo programador Java, que uno de los puntos mas bajos, recae en el uso de las fechas, las mismas se encuentran super mal diseñadas y algunos objetos como el caso de Date, practicamente no son usables, pues toda su API esta deprecada (cosa que siento debería de dejar de ponerla deprecada, pues van por la versión 6 y aun la conservan). Recientemente me encontré con el siguiente problema; resulta que al poner un sistema en otro servidor, el cual aparentemente tiene una diferencia horaria configurada, obtenemos como seria de esperar resultados no esperados, cuando realizamos consultas con fechas a la base de datos. La primera solución que se nos ha ocurrido es implementar un convertidor de fechas a diferentes zonas horarias, a continuación coloco el método necesario para realizar la operación: public static Date convertToTimeZoneDate(Date date, TimeZone timeZone) { Date newTimeZoneDate = null; Calendar foreignCalendar = null; // Create a Calendar object with the local ti

Un viaje a través de los Vectores en Java

import java.util.ArrayList; import java.util.List; public class Arrays { public void example1() { int i = 0; // Diferentes formas de declarar un array. Object[] objectArray = null; String[] stringArray = new String[10]; int[] intArray = new int[] { i++, i++, i++, i++, i++, i++, i++, i++, i++, i++ }; Character[] characterArray = { 'a', 'b', 'c' }; char[] charArray = new char[26]; for (int j = 0; j < stringArray.length; j++) { stringArray[j] = String.valueOf(j); } List listString = java.util.Arrays.asList(stringArray); System.out.println("listString = " + listString); System.out .println("java.util.Arrays.binarySearch(characterArray, 'c') = " + java.util.Arrays.binarySearch(characterArray, 'c')); System.out .println("java.util.Arrays.binarySearch(characterArray, 'd') = " + java.util.Arrays.binarySearch(characterArray, 'd')); System.out .println("java.util.Arrays.equals(characterArray, new char [

Creando un TLD dinamicamente con tobago apt plugin y Struts

Una de las tareas tediosas en JEE, es la de mantener nuestros TLD (definición de  librerías de Tag), cada vez que se cambia o agrega algo. Hace poco publique un post donde se explicaba como realizar taglibs utilizando el API de componentes de Struts , pues ahora se mostrara un plugin para Maven, mediante el cual podemos generar automáticamente un TLD, como observación interesante, cuando el TLD se almacena bajo el “META-INF”, no hay necesidad de agregarlo al “web.xml”, ni necesidad de tenerlo en bajo la estructura de directorios del WEB-INF. Lo primero que debemos hacer, es agregar la carpeta “META-INF”, bajo main/resources, una nota al pie; Maven filtra cualquier directorio que no tenga ningún archivo, por lo tanto puedes agregar bajo “META-INF”, un archivo “README.txt”, con un mensaje como este (yo lo copie de Struts 2) TLD file is generated inside META-INF after compilation. If META-INF is empty, Maven will not copy it to the "target/classes" folder. Please do not remove M

Uso aplicado de la instrucción "For"

A continuación se presenta una pequeña aplicación, donde se utiliza la instrucción de control " For ". Este ejemplo muestra como construir un Applet y como dibujar sobre ella (utilizando para ello la instrucción " For "), una seria de rombos, existen dos prototipos (métodos), el primer " paintRomboLine ", resulta mas fácil de entender, pero necesita mas código para funcionar (4 instrucciones " for "), el segundo prototipo solo ocupa una instrucción " for ", y realiza una serie de cálculos por cuadrantes. import java.awt.Dimension; import java.awt.Graphics; import java.awt.HeadlessException; import javax.swing.JApplet; /**  * Simple class to paint a rombo based in lines.  *   * @author jsanca  *   */ public class DrawRombo extends JApplet { private static final long serialVersionUID = 7677516509658561962L; public DrawRombo() throws HeadlessException { super(); setSize(new Dimension(1200, 1200)); } // DrawCircularLine. @Overrid

Al fin MTV reconoce el potencial de la Internet

Después de mucha lucha y denuncias públicas y demás pleitos para llamar la atención, la cadena mundial de música por televisión mas grande el mundo MTV , abren toda su biblioteca (bueno casi toda, el material en ingles por el momento), al publico. Aseguran tener conciertos, espectáculos acústicos , más todos sus vídeos y a diferencia de YouTube (que es mantenida por una comunidad en buena parte), esta es soportada por MTV , lo que le proporciona idéntica calidad a cada uno de sus temas ( vídeos ), el sitio en donde han publicado el contenido le llaman MTV Music , y yo debo reconocer que estoy como chiquito con juguete nuevo, jejeje . El sitio ofrece una gran cantidad de música , como señale anteriormente y además realiza sugerencias acerca de música o vídeos relacionados, en las búsquedas , te de la oportunidad de ir a un perfil del artista o directamente a los vídeos . Buena noticia y supongo que a MTV le paso como dicta el viejo adajio , " si no puedes vencerlos, unet

Creando e integrando "custom taglibs" con Struts 2.x, Spring y FreeMarker

Creando un taglib, extendido de los componentes de Struts. Recientemente surgió la necesidad de crear un “taglib”, para un proyecto en el cual estoy trabajando, hasta ahí todo bien. El problema inicia cuando deseamos reutilizar los componentes de Struts (utilizamos la versión 2.x). Después de investigar un poco, nos encontramos con el “tag” (“<s:component />”), este permite pasarle un nombre de plantilla (de Velocity o FreeMaker) y renderizar el resultado en nuestro Html, por ejemplo, si tenemos: <component template="/my/custom/component.vm”>     <s:param name="key1" value="value1"/>     <s:param name="key2" value="value2"/> </s:component> Esto invocará una plantilla de Velocity e introduce al contexto de Velocity, un Mapa llamado “parameters”, del cual podemos obtener los parámetros que anteriormente insertamos en el JSP. Más o menos, algo así: ${parameters.key1} Este enfoque esta bastante bien, sin