Archivo de Febrero 2007

Como ser un programador

Jueves, 22 de Febrero de 2007
   Autocompletar
       | |
        V
    codificar >>> compilar >>>>  ejecutar >>> éxito ;-)
        ^^              | |               | |
        ^^               V                 V
        ^^            errores      errores
        ^^               ||             ||
        ^^               ||             ||
        ^^                --> google < --
        ^^                      | |
        ^^                       V
         <<<<<<<<<<<<<<  copiar y pegar

Visto en secret geek

UT8 cheat sheet

Martes, 20 de Febrero de 2007

O como hacer que tus aplicaciones web Java sean internacionales con UTF-8 sin morir en el intento.

  1. Páginas html (y jsps). Es necesario indicarle al navegador en que codificación van nuestras páginas. Para esto utilizaremos la etiqueta meta:
    <html>
        <head>
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        </head>
    </html>
    
  2. Ficheros xml. Estos ficheros no soportan la etiqueta meta, así que es necesario la siguiente etiqueta especial que debe ir en la primera línea del fichero.
    <?xml version="1.0" encoding="UTF-8"?>
    
  3. Páginas jsps. Podemos utilizar diferentes maneras de indicar que el contenido de las mismas es utf8. Con la directiva @page pageEncoding le estamos indicando al compilador en que codificación se está guardando la página jsp en disco. Es importante que esta codificación sea la misma que hemos establecido en nuestro entorno de desarrollo.
    <%@page pageEncoding="UTF-8"%>
    

    Luego podemos añadir la directiva page contentType para que al servir la página se envíe la cabecera http contentType que le indica al navegador en que codificación va el contenido a enviar y así cambiar el juego de caracteres. Esta cabecera http y la etiqueta html meta que se ha descrito en el punto anterior son equivalentes, pero no está de más enviar las dos (por si acaso)

    <%@page contentType="text/html;charset=UTF-8"%>
    
  4. Leer parámetros desde servlets y jsps. Dado que ya le hemos indicado al navegador que el contenido de las páginas (jsps o html) están en utf8, el navegador enviará los parámetros de los formularios codificados en utf 8 también. Por esta razón, tenemos que establecer en nuestro Serlvet (o jsp) esta codificación antes de leer cualquier parámetro enviado desde estas páginas para que puede ser interpretado correctamente. Una vez establecida la codificación, ya no podemos cambiarla durante esta petición, por lo tanto, es lo primero que tenemos que hacer nada más empezar a trabajar.
    request.setCharacterEncoding("UTF-8");
    String parametro = request.getParameter("parametro");
    // Esta parametro ya esta codificado correctamente y podemos leerlo
    
  5. Escribir datos desde servlets. Primero es necesario establecer la codificación de los caraceteres a escribir. Para escribir la salida, el objeto OutputStream de la petición actual nos permite enviar bytes directamente sin ningún tipo de codificación, lo cual lo convierte en el candidato ideal para enviar información en bruto como imágenes u otros ficheros. Pero si lo que queremos es utilizar nuestra codificación utf8 para imprimir texto, debemos utilizar el objeto Writer del HttpServletResponse de nuestra petición.
    response.setCharacterEncoding("UTF-8");
    response.getWriter().print("Codificando con utf8: ñáéíóú");
    

    Si por alguna razón necesitáramos escribir la información a través del OutStream de la petición actual, debemos convertira la cadena de texto a UTF-8 antes:

    String cadenaUtf = new String(cadenaDistinta.getBytes("UTF-8"));
    response.getOutputStream().print(cadenaUtf);
    
  6. Si usas base de datos, crear tu instancia y las tablas en UTF-8.
    Por ejemplo, en MySql se hace así:

    CREATE DATABASE nombreBaseDeDatos CHARACTER SET utf8;
    
    CREATE TABLE nombreTabla (
    	... campos ...
    ) CHARSET=utf8;
    

    De todas formas, consulta la documentación de MySql (o de la base de datos que utilices) para asegurarte de que estás creando todo en utf8.

  7. Escribir ficheros de texto (o sobre cualquier fuente de datos) codificando la salida en un juego de caracteres concreto. En este caso, necesitaremos utilizar un Writer el cual nos permite hacer esta conversión. Para este caso, crearemos un OutputStreamWriter a partir de un FileOutputStream, aunque se podría haber utilizado cualquier otra clase que heredase de OutputStream. El PrintWriter es solo una capa más que nos permite escribir cualquier tipo de objeto o dato sin tener que convertirlo a texto, lo cual es más comodo que si utilizamos el Writer directamente.

    Este ejemplo escribe un fichero información codificada en ISO-8859-15

    OutputStream os = new FileOutputStream(new File("prueba.txt"));
    Printer p = new PrintWriter(new OutputStreamWriter(os, "ISO-8859-15"));
    p.print("Codificando con utf8: ñáéíóú");
    p.flush();
    p.close();
    
  8. Leer ficheros de texto (o cualquier fuente de datos) codificados en otro juego de caracteres y volcarlos desde un Servlet. Siempre que necesitemos leer algo en una codificación concreta, necesitaremos un Reader. Para este caso, crearemos un InputStreamReader a partir de un FileInputStream, aunque se podría haber utilizado cualquier otra clase que heredase de InputStream. El BufferedReader es solo una capa más que nos permitirá acelerar la lectura utiliznado un buffer intermedio.

    Este ejemplo lee el fichero del ejemplo anterior codificado en ISO-8859-15 y lo escribe desde un Serlvet codificado en UTF-8

    response.setCharacterEncoding("UTF-8");
    
    InputStream is = new FileInputStream(new File("prueba.txt"));
    
    Reader br = new BufferedReader(new InputStreamReader(is, "ISO-8859-15"));
    String line = br.readLine();
    while (line != null) {
    	response.getWriter().print(line);
        line = br.readLine();
    }
    br.close();
    

Y con esto creo que se cubren todos los puntos clave que una aplicación realizada en JSP/Servlets debe cumplir para que sea utf8: desde la codificación del navegador en los html, el envío y recepción de parámetros y la escritura/lectura de los mismos, ya sea en base de datos o en ficheros de texto con otra codificación más cómoda para trabajar localmente como pudiera sera ISO-8859-15.

Descargate la versión imprimible: ut8-cheat-sheet.htm

Macho programming

Viernes, 16 de Febrero de 2007
  1. Si tienes tiempo para comentar tu código, entonces tienes tiempo para refactorizar.
  2. Si tienes tiempo para refactorizar, tienes tiempo para hacer pruebas.
  3. Si tienes tiempo para hacer pruebas, tienes tiempo para rediseñar el sistema.
  4. Si tienes tiempo para rediseñar el sistema, tienes tiempo para beber.
  5. Tómate una cerveza: los comentarios son para lloricas.

El original (en ingles) en secretgeek

Un buen momento para recordar la vieja frase: los verdaderos programadores programan en binario.

macho.jpg

Vidas binarias

Jueves, 15 de Febrero de 2007

Vidas binarias no es un blog (más) de informática (como pudiera ser este que lees), sino sobre informáticos.
En su último post habla sobre los informáticos sin asignar, esos programadores o administradores (o lo que sea) que no tienen proyecto y que cobran por no hacer nada, a la espera de ser asignados o, quien sabe, despedidos.

Hace unos días, me sorprendió ver a un viejo amigo conectado en el messenger en pleno horario laboral. Cuando le pregunte al respecto me explicó que estaba “sin asignar”, es decir, aparcado en su empresa, sin ninguna tarea asignada, hasta que sus responsables encontraran algún proyecto para el.

Sigue leyendo a Dabiz en Informaticos sin asignar

Feliz día de San Valentín

Miércoles, 14 de Febrero de 2007

4-s.png

Mushihimesama Futari

Miércoles, 14 de Febrero de 2007

Me encantan estos vídeos, ¡me encantan! Es que desde luego, para ser diseñador de juegos hay que tener imaginación. Pero para hacer que un arcade sea más difícil todavía que lo más difícil de lo más difícil hay que ser original, sorprendente y tener un poco de mala idea. ¿cien disparos a la vez? ¿mil disparos? ¿haciendo formas, círculos, ondas y además, en todas direcciones?
Veamos como sufre este experto jugador con el jefe (”boss”) de la fase 5 del juego Mushihimesama Futari, en nivel de dificultad “ultra” (hay que ser masoca). Aún así, tras morir unas cuantas veces, se lo consigue acabar. ¿Serías capaz de tan solo aguantar sin que te maten…. un segundo?




Vídeo en youtube

No sé que es peor: si la cantidad ingente de bolas moradas que te pueden matar o la voz y música que acompaña. Sin duda, el jefe final mas chungo que he visto. Que lo disfruten.

(Otros posts relacionados: ikaruga

Ofuscando emails desde Java

Domingo, 11 de Febrero de 2007

Para evitar el spam, hay muchas maneras de ocultar el email en una página html. Una de las más efectiva podría ser crear una imagen con la dirección como tengo puesto en mi página de contacto: . Puedes crear esta imagen con el photoshop o desde alguna utilidad externa como esta.

Sin embargo, puede que estemos desarrollando una aplicación en Java y tengamos un listado de usuarios público con sus emails. Crear una imagen para cada uno de ellos podría ser muy laborioso, y escribir el email sin ofuscar u ocultar podría ser peligroso.

Obviando los trucos de poner los emails con el formato “nombre ARROBA dominio PUNTO es” o “email@[QUITAESTO]dominio.es” podemos escribir cada carácter ASCII de nuestro email uno por uno en hexadecimal o decimal. Para esto, utilizaremos las entidades html con este formato:

  • &#D; siendo D el número del código ASCII en decimal
  • &#xH; siendo H el número del código ASCII en hexadecimal

Por ejemplo, para pintar la letra a, cuyo código ASCII es 97 en decimal y 61 en hexadecimal podemos utilizar &#97; o &#x61;
(Una tabla completa con todos los caracteres ASCII aqui)

Bueno, ahora lo que queremos es escribir nuestros emails codificados en decimal y hexadecimal. Para eso utilizaremos esta clase Java:

public class HtmlCoder {
   public static final Random r = new Random(System.currentTimeMillis());
   public static String randomHtmlEncode(String data) {
        if (data == null || data.length() == 0) return data;
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < data.length(); i++) {
            switch (r.nextInt(3)) {
            case 0 : // En decimal
                sb.append("&#").append((int)data.charAt(i)).append(";");
                break;
            case 1 : // En hexadecimal
                sb.append("&#x").append(Integer.toHexString(data.charAt(i))).append(";");
                break;
            case 2 : // Tal cual
                sb.append(data.charAt(i));
            }
        }
        return sb.toString();
    }
}

Esta clase crea un texto codificando cada carácter en su equivalente ascii en decimal, hexadecimal o sin codificar de manera aleatoria. De esta manera, un email se quedaría así: &#x73;&#x6f;&#x79;&#x70;ic&#x61;p&#105;&#99;a&#x40;&#x79;&#97;&#x68;o&#x6f;.&#x65;&#115;

Eliminar un servicio de Windows XP

Jueves, 8 de Febrero de 2007

Si has eliminado de tu disco una aplicación sin desinstalarla primero y se te ha quedado un servicio “colgando”, puedes utilizar este comando que elimina servicios:

sc delete nombreDeServicio

Lo he probado con un MySQL que tenia “huérfano” en un Windows XP y me ha funcionado… eso sí, ¡no me hago responsable de sus efectos! :-)

Curriculums

Jueves, 1 de Febrero de 2007

dilbert20070112217827.gif