Yearly Archives: 2008

Char curiosidad de IsLetter e IsDigit

El otro día, nos disponíamos mi jefe y yo a realizar un control sobre un campo de texto de una aplicación web. La idea era que en este campo solo se pudiera incluir texto o números, pero en ningún caso debería de poderse incluir caracteres raros. Seamos sinceros y siempre que hemos necesitado usar esto en lenguajes donde su framework no estaba preparado para diferenciar que tipo de carácter era, acabamos o bien creando un array diccionario y comparando los caracteres o bien usando expresiones regulares. Como no, desde el salto a tecnología de Microsoft (en este caso Visual Basic .Net) me propuse buscar alguna clase o método que hiciera solo lo que quería hacer, y la encontré.

En .Net existe la clase Char, que tiene el método Char.IsLetterOrDigit (boleano) donde le indicas un char o carácter y este te devuelve true o false si es un número o letra y false si no lo es. Monto una función para recorrer carácter a carácter del campo de texto comprobando si es alfanumérico o no, con la idea de borrar los caracteres que no sean alfanuméricos. Una vez montada la función, la pruebo unas cuantas veces y todo funciona estupendamente. Cuando nos vamos a disponer a subir a producción... sorpresa, la última prueba a fallado (pero es imposible), se nos deslizo el dedo y por poner un "1", pusimos un "º". Cuando nos ponemos a investigar (ha probar con jabatos) nos damos cuenta de que esta función, establece que los caracteres "º" y "ª" son alfanuméricos, vamos que son letras, supongo que la "o" y la "a".

Por supuesto esto lo controlamos y listo, pero si alguien se encuentra en nuestra misma situación y conoce alguna función que si trabaje correctamente que lo comente. Y si alguien buscando por internet se encuentra bloqueado y se ve encuentra con este post, ya puede respirar tranquilo, porque no es que funcione mal, es que no funciona del todo bien. (Si, ya se que para algunos "º" y "ª" son letras, pero realmente son caracteres especiales)

Como estropear un proyecto

Bueno, este post va dedicado a mis queridos jefes (JL, tu te salvas porque eres el único jefe sensato de la empresa). Supongamos que tenemos un proyecto, digamos por ejemplo.... un buscador. Digamos que el buscador es algo primitivo en cuanto a metodología de programación se refiere. Digamos que con el paso de los años, vamos añadiendo nuevas funcionalidades a nuestro buscador (que no, que no, que no son nuevas funcionalidades, son ñapas sin relación ni estudio previo que no hace mas que ensuciar y joder el proyecto). Supongamos que nuestro querido buscador se hace famoso y llega una compañía que lo quiere utilizar, pero claro, esta quiere que aparezca su logotipo, estilos y demás y como no, vamos a crear nuestra primera marca blanca. Como no, seguimos suponiendo, ya que hemos creado nuestra primera marca blanca, por que no crear 4 o 5 mas, y como es costumbre en España, para que vamos ha realizar un estudio previo.... nooooo, vamos a guarrear al máximo el código para joder al que venga detrás nuestra. Ahora que ya tenemos un proyecto gualtrapa, con código guarro guarro guarro, vamos a poner orden, para esto, le pedimos opinión al tío con el que desayunamos, al vecino del 4º y a la limpiadora. Ahora que ya tenemos la opinión de cada uno, unas opiniones mas acertadas y otras menos, vamos a proceder a emarañar todas esas opiniones obteniendo un batido o un brain tifón, ya que todas las ideas son arrasadas y se apilan en escombros. Bueno, y que falta para terminar de "maquear" nuestro proyecto..... pues llevar a cabo esas ideas, para ello cogemos ese popurrí de ideas que hasta nuestra madre nos apoyo dandonos su versión y las llevamos a cabo (ni que decir tiene sin estudio ninguno). Para darle ese toque Español, vamos a decir que para hacer todo esto con 2 semanas de microondas es suficiente y como es superimportante, no se puede retrasar ni un día bajo pena de........

Resumiendo,

Base: proyecto guarro, feo, desordenado

Objetivo: proyecto limpio, bonito, eficaz

Final: proyecto guarro, feo, desordenado, caótico

Para hacer la limpieza de nuestro proyecto hemos utilizado:

300.000 lineas de código, cuanto mas desordenado e indocumentado mejor.

50.000 lineas de nuevo código mr. proper con un toque de pintura, para dejar huella

Lo dejamos de 2 a 3 semanas de cocción en el departamento y obtendremos una rica y suculenta ñapa, y con fundamento.

La verdad es que si no lo suelto, reviento.

100 visitas diarias

Bueno, aunque por trabajo llevo mas de un mes sin escribir (manda huevos y no tengo excusa) he conseguido, o mejor dicho el blog solito ha conseguido superar durante los últimos 15 días la barrera de las 100 visitas diarias, incluyendo fines de semana que son mas flojitos. Esto "me llena de orgullo y satisfacción" ya que poco a poco el blog va creciendo. A ver si me tomo menos en serio mi trabajo y mas enserio mi blog y escribo más, porque tengo "chicha" como para escribir mas de 40 artí­culos, pero me tengo que sentar a escribir. Bueno, espero que aunque un poco chorra, pueda escribir al menos 1 post al día, a ver si lo consigo.

Juegos de escape y soluciones

He creado una seccion (pagina) en la cual voy a ir apuntando los juegos de escape que vaya encontrando y cuando tenga las soluciones, las mismas o mejor dicho, la direccion del post donde se encuentra. Ya que he decidido a dar un giro al blog, aunque seguire con temas tecnicos, tambien ire poniendo soluciones a estos pequeños comecocos que tanto me gustan y que los tengo abandonados desde hace algunos años, he rebuscado entre las paginas antiguas (un foro que tenia hace años) donde tengo o tenia unas 30 soluciones de juegos flash de hace algunos años. Al rescatar con existo de un backup la base de datos donde los tenia almacenados, ahora aparte de los que vaya jugando, rejugare a estos clasicos y si me quedo atrancado echare un ojillo a las soluciones y reescribire o readaptare las soluciones para publicarlas.

La dirección de la pagina de soluciones de los juegos de escapar de la habitacion es:

http://www.indalcasa.com/juegos-de-escape-y-soluciones/

Juegos de escapar de la habitacion

Quien no ha jugado alguna vez a algun juego de escapar de la habitación. Estos juegos flash, convertidos ya en clasicos, nos encontramos con una trama mas o menos currada en la que deberemos de salir de una habitación o varias con la ayuda de nuestro ingenio y de cosas que nos encontremos por las habitaciones, a veces, haciendonos sentir como McGyver.

Hace algunos años, en un foro que tenia y que abandone, tenia una sección de juegos de este estilo en el que tenia los juegos y las soluciones a los mismos y como siempre me han apasionado, voy a escribir sobre los juegos y sus soluciones ya que a muchos le es de gran ayuda y a mi me encanta el revanarme el coco para encontrarles solucion.

Apache y directorios de usuarios (UserDir)

Recuerdo que en un trabajo en el que estube, cada uno tenia un usuario de Unix (era FreeBSD) y cada usuario tenia en su home una carpeta public_html para que no tuvieramos que usar todos y darnos permisos en /var/www.

Ahora al instalar Ubuntu en el portatil, quiero volver a poner todas las webs que tenia en local pero claro, no le voy a dar permisos a /var/www y aunque solo yo usare el portatil, no estaria de mas tener un sistema para que en la home de cada usuario exista una carpeta public_html en la cual cada usuario ponga las webs que quiera.

Este sistema que era desconocido para mi, se llama UserDir. Para instalarlo si estamos en Ubuntu, lo unico que tendremos que hacer es buscar en el Synaptic un paquete llamado libapache2-mod-ldap-userdir, o mas facil, buscar directamente "UserDir" y nos aparecera el paquete en cuestion. Una vez instalado, deberemos de ir a la carpeta /etc/apache2/mods-available y copiaremos o moveremos los archivos userdir.conf y userdir.load a la carepta /etc/apache2/mods-enabled. Una vez copiados los archivos, abriremos una consola y ejecutaremos el comando "/etc/init.d/apache2 restart" para reiniciar apache.

Una vez reiniciado apache, y copiados las configuraciones, ya lo tenemos todo listo. Ahora toca probarlo, asi que iremos a la home de nuestro usuario /home/nombreusuario y creamos una nueva carpeta public_html, una vez hecho esto, creamos un index.html de prueba, abrimos nuestro navegador y escribimos http://localhost/~nombreusuario y deberia de aparecernos nuestra pagina de inicio que creamos.

Asi de sopeton puede parecer algo complicado, pero luego son 2 tonterias que no nos llevara mas de 2 minutos configurarlo.

Aparte de esto, si abrimos el archivo userdir.conf, podremos modificar las reglas para cambiar el directorio public_html de la home y ponerlo en otro lugar.

Bucle do-while en VisualBasic

Llevo tiempo currando con Visual Basic .Net, pero como persona formada desde hace años en lenguajes tipo C (C, C++, Java, C#, PHP, etc) el paso a programar en Visual Basic, cuesta mucho y cosas tan cotidianas como hacer un bucle, un switch o similares pueden convertirse en una peligrosa trampa que nos consumira muchos minutos muy valiosos.

La ultima que me he topado ha sido el bucle do while. En cualquier lenguaje tipo C, practicamente independiente del lenguaje estos bucles son iguales:

  do {
    sentencias
  } while(condicion);

Pero como no, estamos con Visual Basic y aqui todo funciona de manera diferente, es como nuestro tipico amigo que siempre lleva la contraria a todo. Por ejemplo para hacer un bucle do-while (me sorprende que en 9 meses sea la primera vez que me vea obligado a hacerlo, el bucle es do-loop-while, siendo su sintaxis

  Do
    sentencias
  Loop While condicionn

Puede que la gente que conozca o programe en Visual Basic lo vea una tonteria, pero para gente como yo que por razones laborales se ven obligadas a programar en dicho lenguaje y que por muchos meses se que lleve sigan prefiriendo C# a VB.Net, cosas tan cotidianas pueden convertirse en un minimundo.

Ya de paso y para aprovechar el post, explico que los bucles do while, son bucles que se recorreran igual que los while, en funcion de una condicion que de ser cierta dara una vuelta mas al bucle y que la principal diferencia entre los bucles while y do while, radica en que el while, primero comprueba la condicion antes de hacer una iteracion al bucle, mientras que los do while primero dara una iteracion al bucle y al final comprobara si debe de seguir haciendo iteraciones. Dicho de otro modo, el el while, primero comprobamos que debemos entrar al bucle y de ser cierto, entramos, en los do while, primero entramos al bucle y al final de este comprobamos si debemos dar una vuelta mas.

Nueva etapa Linux

Hace ya un año, arregle un viejo ordenador que tenia en casa de mi madre y que abandone al independizarme. Cuando me puse a mirar cosas para arreglarlo empece a cambiar y cambiar y al final le cambie casi todo menos la caja de la torre, los 2 cd's y un cacharrito que es un cenicero con mechero como el de los coches que va en un slot de cd que me regalo la parienta hace unos 5 años o asi.

Cuando me encontre con un ordenador la poya de pontente y como ya tenía el portatil con Windows XP y yo era feliz, decidí meterle primero PCLinuxOS y luego Ubuntu. El problema vino de mano de Microsoft (que sinverguenzas, siempre igual xD) ya que me pasaron un Windows Vista y la verdad queria verlo y juguetear con el (como me arrepiento) así que lo instale machacando lo que habia por pequeños problemas que tuve con Ubuntu. Al relativemente poco tiempo me cambie de trabajo y empece a programar con tecnologias de Microsoft por lo que entre el curro, el poco tiempo, las pocas ganas o pereza y que me venia bien tener el Windows con el Visual Studio y como no para hecharme un vicio de vez en cuando, abandone la idea de instalar Linux de nuevo.

Durante este año, mi portatil con unos 4 años va acumulando toda la mierda que puede acumular un Windows con actualizaciones, programas, bases de datos, mugres, mugres y mas mugres. Al final he decidido aplicarle la eutanasia a mi portatil para no verlo sufrir asi y lo he formateado. El formateo fue un cachondeo y ya prepare el post de como lo hice porque es digno de ver la que tuve que liar.

Al final consegui instalar un Ubuntu 7.10 y actualizar a Ubuntu 8.04 por internet. Todavia tengo que configurar muchas cosas, pero tiene todas las papeletas de que lo desinstale e instale un PCLinuxOS ya que me va mas rapdio y mejor.

La parte positiva es que vuelvo al mundo Linux de nuevo y no vuelvo solo ya que mi querida novia si quiere ver el correo y navegar por internet tendra que usar Linux y usar Firefox o WillyFox como lo llama ella. Soy perverso.

Escapar texto en una transformada XSLT

Hace poco escribí como escribir el símbolo del euro en una transformada XSLT. Para completar lo que ya comenté en su momento, explicaré como se escapan caracteres en una transformada para no tener que recurrir a buscar códigos especiales de HTML tal como el €.

Para escapar texto dentro de una transformada existe un parámetro llamado disable-output-escaping que toma los valores yes|no, en función de si queremos o no deshabilitar que se escapen caracteres. Este atributo se aplica a 2 etiquetas de XSL, la etiqueta xsl:text y la etiqueta xsl:value-of, aunque seguramente se aplique ha alguno más.

Ejemplo de como funciona:

  
     
  

Cuando aplicamos disable-output-escaping sobre xsl:value-of, este deshabilitara el escapado si así se lo indicamos sobre el contenido de la variable. Por el contrario, al aplicarlo sobre el xsl:text, necesitamos poner el texto a escapar encerrado entre CDATA, ya que sino, puede dar errores.

Division y resto (modulo) con XSLT

Cuando queremos hacer alguna operación sobre un par de número en una transformada (XSLT) lo hacemos con el símbolo + o *, la cuestión esta en cuando queremos dividir o calcular el resto o módulo de una división, los caracteres tradicionales para estas operaciones / y % entran en conflicto con XPath, por lo que no se pueden usar tal cual, por lo que usaremos las siguientes instrucciones.

Usaremos la palabra reservada div para realizar la división de 2 números, siendo el código.

<xsl:value-of select="9 div 3"/>

Para realizar el calculo del módulo o resto de una división, usaremos la palabra reservada mod siendo su sintaxis igual que la del div.

<xsl:value-of select="5 mod 2"/>

Espero que este articulo pueda ayudar a mucha gente ya que estube horas hasta dar con la solucion de como hacer una division en una transformada XSLT.