Mostrando entradas con la etiqueta desarrollo. Mostrar todas las entradas
Mostrando entradas con la etiqueta desarrollo. Mostrar todas las entradas

6/11/08

swaprun

Últimamente los micro-cortes en la red de la oficina son frecuentes. Como consecuencia de esto tuvimos unos problemas con el servidor web que ya contaré. Pero también con las aplicaciones cliente / servidor: y es que cuando se ejecutan en red (lo normal aquí) y falla la red simplemente se "evaporan", se cierra la aplicación sin decir ni mu.

Ayer me encontré con esto:

Windows loads your program into RAM lazily, on-demand. When it loses the connection to the network drive, and your application tries to load a page that wasn't already in RAM, Windows has no choice but to throw an exception. Note that Windows also discards pages that haven't been touched recently if you're above your minimum working set size.

To force an image launched from across the network to be loaded into RAM before being executed, pass the /SWAPRUN:NET option to the linker


Lo activé en el vs2008, recompilé y ya he puesto la nueva versión. Espero que ya no haya tortazos similares.

15/4/08

Cococrash


El otro día haciendo limpieza de bits en el disco me encontré con una mini aplicación que hice para la asignatura de laboratorio de sistemas expertos el último año de carrera. Y aprovechando que hace mucho tiempo (pero mucho, mucho) que no publico nada voy a aprovechar para sacar a la luz este pequeño programita para resolver el cococrash (no voy a escribir nada que no haya escrito ya alguien, incluso en varios idiomas)

A pesar de ser un trabajo para una clase de sistemas expertos no se aplica ninguna técnica muy sofisticada de inteligencia artificial, como he podido ver que han hecho otros. En mi caso si no recuerdo mal aplico fuerza bruta con una pequeña comprobación previa para evitar el caso en el que se unen dos piezas, pero queda un hueco en una esquina imposible de rellenar. De todas formas hace 7 años que hice esto, así que tendría que revisar el código para ver qué burradas hacía por aquel entonces.

Ahí van unas instrucciones esquemáticas:

  • La ventana principal se divide en dos partes. En la parte de arriba se muestra el cubo a solucionar y en la parte de abajo se muestran las piezas que se van a usar para encajar en el cubo.

  • Para cargar un cubo se puede usar o bien el icono de abrir o bien se puede arrastrar el fichero con la definición del cubo a la zona superior de la ventana

  • Para cargar un conjunto de piezas basta con arrastrar el fichero de piezas a la barra inferior donde se muestran las piezas. También se puede usar el icono correspondiente

  • Una vez que está cargado el cubo y las piezas se puede obtener la solución pinchando en el icono de la varita mágica. Si se desactiva la vista previa irá más rápido pero no se verá el proceso de encaje las piezas.

  • Para cargar otro conjunto de piezas quitando el existente hay que pinchar en el icono de "Borrar piezas"

  • Si tarda demasiado en resolver el cubo siempre se puede parar, sacudir las piezas y volver a empezar, para cubos complicados recuerdo que dependía mucho de la posición en que estuvieran cargadas las piezas


Cococrash 1.0 - Incluye el ejecutable (para windows) y las dos carpetas de piezas y de cubos.

¡Disfrútalo!

19/2/07

escribir código

Cualquier tonto puede escribir código que un ordenador pueda comprender. Los buenos programadores escriben código que los humanos pueden comprender

Martin Fowler

Vía versión cero

11/1/07

csv

Los ficheros CSV están muy bien. Son de lo más simple que hay: están en texto plano, sin codificaciones extrañas, son fáciles de entender para cualquier persona y cómodos de interpretar por la máquina.

Sin embargo tienen un problema al tratar con los números. En Estados Unidos y en muchos otros países angloparlantes utilizan el "." como separador de decimales y la "," como separador de miles. En Europa lo hacemos al revés.
Así un americano diría que un euro equivale a 166.386 pesetas, mientras que un europeo diría que son 166,386

esto en un csv clásico se plasmaría de la siguiente manera:

€,pta
1,166.386

o bien

€,pta
1,"166,386"

El problema viene cuando un editor de hojas de cálculo intenta abrir el fichero. En nuestro caso, el excel 2003 mira en el sistema qué caracteres tenemos definidos para separar las listas, los decimales, y los miles. En mi caso tengo: ";" para separar las listas, "," para los decimales y "." para los miles. Resultado: ninguno de los dos ficheros csv de arriba me los abriría correctamente.

si lo hubiera puesto de la siguiente manera:
€;pta
1;166,386

hubiera funcionado a la perfección.

Si tenemos un sistema que exporta datos en csv habría que preguntarle al usuario qué separadores usa en su sistema para que todo funcione correctamente, lo cual es un engorro.

Si permitimos al usuario cargar datos a partir de ficheros csv nos ocurre lo mismo, aunque aquí podemos hacer la siguiente comprobación, que funciona en la mayor parte de los casos. Comparamos el número de "," y de ";" que hay en la primera fila. Si es superior el número de "," nos encontramos en un sistema anglosajón y si hay más ";" asumimos que es europeo. Evidentemente es una comprobación muy burda, pero eficaz en la mayoría de los casos.

Subir ficheros con AJAX

De lo que he visto por ahí la mejor biblioteca de javascript es prototype. La llevo usando desde la versión 1.3 y la verdad es que va de lujo. Es cierto que en las siguientes versiones ha crecido quizá por encima de lo deseable, pero sigue siendo la mejor.

Para enviar datos de formularios utiliza la función encodeURIComponent, que es perfecta para todos los tipos de campo, excepto para los ficheros. Estaría bien que codificara el fichero, pero supongo que por razones de seguridad no lo hace.

Para poder hacerlo tenemos que recurrir a otra "versión de AJAX", que no es con el objeto XMLHttpRequest, sino con el tradicional uso de IFRAMES ocultos.

Aquí van los pasos a seguir

1. Creamos un IFRAME oculto que va a ser nuestro "objeto de entrada / salida":

var frameId='frameId',f;
if(window.ActiveXObject) //en IE hay que hacerlo así
{
f=document.createElement('<iframe id="' + frameId + '" name="' + frameId + '">');
f.src='javascript:false';
}
else
{
f=document.createElement('iframe');
f.id=frameId;
f.name=frameId;
}
f.style.position = 'absolute';
f.style.top = '-1000px';
f.style.left = '-1000px';
document.body.appendChild(f);


2. Creamos un FORM, redirigiendo la salida al IFRAME y le añadimos el input de tipo FILE

var f=document.createElement('form');
f.action=url;
f.method='POST';
f.target=frameId;
if(f.encoding)
f.encoding='multipart/form-data';
else
f.enctype='multipart/form-data';
f.style.position = 'absolute';
f.style.top = '-1000px';
f.style.left = '-1000px';

input.name='file';
f.appendChild(input);
document.body.appendChild(f);


3. Disparamos el método submit() del FORM
f.submit();

Si queremos comprobar qué nos devuelve el servidor cuando le enviamos el fichero tendríamos que añadir una función de respuesta cuando se cargara el IFRAME.

Haciéndolo un poco más orientado a objetos me he creado una clase Ajax.FileUpload para usarla como si fuera parte de la biblioteca prototype

Hay que tener en cuenta que uso un input que ya tengo en la página y que cuando envíe el fichero ya no lo voy a usar para nada más. El problema es que los inputs de tipo file tienen una serie de limitaciones de seguridad. Por ejemplo, en IE no se les puede asignar el atributo value, con lo cual estás vendido, además cuando los intentas clonar, no te copia el value del input original. Sólo te quedan dos opciones: o lo que hago yo que es usar el input original, o bien como se hace en el google page creator y en el correo yahoo, que es crear el form al generar la página, y posicionarlo donde te interesa.

27/11/06

be a pointer my friend


empty your memory,
with a free()…
like a pointer!
if you cast a pointer to a integer,
it becomes the integer,
if you cast a pointer to a struct,

it becomes the struct…

the pointer can crash…,
and can overflow…

be a pointer my friend…

bjarne stroustrup
Con esta genial parodia del anuncio de BMW trasladado al mundo de la programación me estreno como blogger. En principio trataré temas relacionados con mi trabajo: desarrollo de software, aunque aviso que tengo licencia para desvariar cuando se me antoje. ¡Para eso es mi blog!

La foto es de Bjarne Stroustrup, el creador del lenguaje C++, y es que cuando leí la cita inmediatamente me lo imaginé a él en plan Bruce Lee diciendo eso de: "be a pointer my friend..."