Cosas mías

May 31, 2006

Lecturas Varias

0046.-El doctor Centeno, de Galdós. Cuenta las aventuras de un niño, Felipe Centeno, junto a la de los dos amos que tiene durante el período que se narra (apenas unos meses), y la de varios personajes más, algunos de ellos ya conocidos o por conocer dentro del universo Galdosiano. El niño no es otro que el que se escapa de la mina de Ficórbiga en Marianela. La obra es entretenida, divertida, humorísitica algunas veces y triste al final. Concoemos a los personajes de más baja condición económica y en cierta forma la vida estudiantil.

0047.-Tormento, también de Galdós. Continuación más o menos de la anterior (al menos aparecen casi todos los personajes), narra las desavenencias de la Faraona, chica que había tenido amores con el párroco que primero acoge a Filipín (Centeno), ahora finalizados. Aparecen los Bringas, que la tienen como criada, y un primo rico de América que se enamora de nuestra chica y al final se entera de sus anteriores líos, y que al final la perdona y se la lleva a Francia, sino de esposa, sí de querida, alterando en cierta manera el buen devenir de la familia Bringas… Centeno aparece poco, pero sus asomos son proverbiales, y su amigo Ido, el calígrafo, por fin tiene un trabajo estable y no pasa hambre. La verdad es que se trata de una obra bastante intensa pese a lo suave del argumento.

0048.-La de Bringas, continuación de la anterior, pero casi independiente, considerada una gran obra, narra las vicisitudes de Rosalía, esposa de Francisco Bringas que vive en el Palacio Real como otros muchos, nos cuenta la paulatina degradación moral de ésta como consecuencia de sus deudas con los modistos y sus relaciones (summum del quiero y no puedo), hasta el punto de resultar risible. Hay más en la obra, como el contexto histórico e interpersonal.

Respecto a La de Bringas pensaba que era una primera lectura, pero es una segunda… y no me acordaba de nada de la vez anterior, aunque conforme iba leyendo, lo iba recordando todo…

May 29, 2006

¡Al rico helado de C++/CLI!

Filed under: Programación

Como todo en esta vida, las cosas tienen un principio y un fin, y finalmente he terminado de escribir el tutorial sobre C++/CLI que tenía en mente. son unas Son 42 páginas de apretado texto con formato Microsoft Word, y cubre prácticamente todos los aspectos del lenguaje, con las mínimas referencias posibles al .NET Framework. Más que un tutorial, se trata de una especie de guía rápida para programadores de C++, en la que hago cierto hincapié en los temas CLI, citando de pasada los conocimientos que cualquier programador de C++ nativo debería tener. El lector que encuentre difícil el texto, puede antes darse un garbeo por un tutorial de C++ (pues todo le va a servir, puesto que el nuevo lenguaje de Microsoft extiende, no modifica el comportamiento por defecto), y si lo que le resulta abrupto es el .NET, pues existen ya cientos de libros y tutoriales que lo cubren ampliamente. Quisera agradecer a Octavio Hernández, habitual de los grupos de noticias de Microsoft a la vez que MVP, la revisión técnica que ha hecho del texto: gracias, Octavio. Y sin más preámbulos, aquí tienes el texto.

May 21, 2006

Gödel, Turing, Chaitin y la informática

Gregory Chaitin publica el artículo Los límites de la razón en el Investigación y Ciencia de este mes (mayo).

Este hombre, basándose en el teorema de Gödel que dice que la matemática es incompleta –es decir, que siempre habrá algo pendiente por demostrar y que ciertos axiomas no lo serán nunca-, se saca de la manga una nueva teoría informática que, a mi modo de ver, resulta tonta y carente de sentido.

Tras un breve rollo introductorio de autoglorificación y la presentación de su nuevo libro, afirma que él, igual que en su momento Turing, ha conseguido demostrar la incompletitud de la informática y la matemática o, lo que es lo mismo, otra forma de tratar el teorema de Gödel.

Básicamente nos dice que la teoría algorítmica de la información mide la complejidad de un número o un teorema como el tamaño del programa que es capaz de generar dicho número o teorema. Y nos pone ejemplos. Un programa para generar una secuencia infinita de cuadrados es, evidentemente, más corto que la propia secuencia (otra cosa es el tiempo de ejecución). Lo mismo que para el número PI.

Luego nos dice que el programa capaz de generar un número aleatorio específico es el propio programa más el número guardado en él. Decimos, pues, que dicho número es incomprensible. Hasta aquí vamos bien.

Luego nos introduce omega, que es un número probabilístico generado al indicar con 1 o 0 si el programa n se detendrá o no, tomando como base la máquina de Turing, y nos dice que ese número es, de nuevo, incomprensible. Vale. Hasta aquí todo es correcto y no nos hemos salido de Gödel ni de Turing.

A partir de ahí el artículo dice que eso demuestra de una nueva forma la incompletitud de la matemática y, por extensión, de la física; a partir de ese momento, el autor vuelve a irse por los cerros de Úbeda o más allá.

Pero yo tengo mis dudas, unas dudas muy serias.

Tomemos el citado número omega para el primer millón de programas y metámoslo en un archivo de texto. Este fichero ocupará 1 MByte. Pasémosle un compresor de los buenos, un bzip o similar. Casi me atrevería a decir que de los 100K de tamaño no pasa. Ahora tomemos el código de descompresión y el citado fichero comprimido y creemos un programa que en ejecución expanda nuestro número.

¿Qué ocuparía? ¿150K? Aunque ocupara 950K, hemos conseguido demostrar que el número omega sí es comprensible, no mediante un método matemático, sino mediante y gracias a la representación tomada (una secuencia de códigos ascii que difiere en gran medida del propio número).

Imagino que representando el número bit a bit en el archivo de texto como si fuera binario también podría comprimirse, aunque fuera un poco. Si se comprime un sólo bit, estamos tirando por tierra las teorías del señor Chaitin.

¿Qué quiere decir esto? Desde mi punto de vista dos cosas bien diferenciadas, aunque la segunda podría no ser cierta.

La primera consiste en que la informática no sirve para medir estas cosas, pues dependiendo de la representación que le demos puede tener una conclusión u otra, y principalmente que este tío se equivoca de medio a medio y ha perdido una buena parte de su vida y del dinero de su universidad investigando tonterías.

La segunda, más racional y cercana a Turing y Gödel: si tenemos en cuenta que realmente el teorema de Gödel es cierto –yo al menos no lo pongo en duda-, la matemática es incompleta, pero quizás, y sólo quizás, podría haber una metamatemática que no lo fuera; bajando un poco el registro, diremos que ciertos problemas podrían ser resolubles si se cambiara el marco, la forma o la dimensión al tratarlos. El programa que genera el número omega es al menos tan largo como el propio omega, pero resulta que si lo cogemos y le aplicamos un punto de vista lateral, podemos comprimirlo y hacer que ocupe menos.

A eso me refería.

May 20, 2006

Jules Verne: Las tribulaciones de un chino en China (1879)

Filed under: Lecturas, Verne, Jules

RBA Coleccionables, S.A., 2002
84-473-2734-5
Les tribulations d’un chinois en Chine

Otra traducción basura. Esta no la he leído, sino que la he hojeado para recordar algo.

Aquí, aquí, y aquí varios comentarios sobre la novela.

Jules Verne: Los quinientos millones de la Begun (1879)

Filed under: Lecturas, Verne, Jules

RBA Coleccionables, S.A., 2002
84-473-2733-7
Les cinq cents millions de la Bégum

Lectura número 0045/2006

Aquí un buen comentario al libro.

Añado que tanto la edición de Alianza como la de RBA son bastantes malas, aunque la primera respeta algo más el texto original. La segunda seguro procede de la Editorial Molino. Decir que también he visto la obra con el título Los quinientos millones de la princiesa india y que de puro mal traducida, hasta el título es incorrecto, pues en la versión original Bengun es Bégum. Juzgad vosotros mismos.

Quien quiera un buen análisis que lea el capítulo correspondiente a la obra en Julio Verne, ese desconocido, de Miguel Salabert.

May 19, 2006

Las cosas del NET (o cómo controlar las teclas en un DataGrid)

Filed under: Programación

Esta mañana mi amigo Peni y yo hemos entablado un sesudo diálogo sobre el tema del título. La idea básica consiste en controlar todas las pulsaciones de teclas cuando un usuario trabaje dentro de un DataGrid. Lo que en un principio iba a ser una cosa sencilla se ha convertido en un buen jaleo y bastantes mensajes cruzados entre los dos.

La primera idea fue la de capturar el evento KeyPress del grid y actuar en consecuencia. Pues no funciona, o funciona sólo cuando no haya ninguna celda en él. Vale. Pues entonces controlemos el KeyPress de las celdas, pero resulta que no existe tal evento para ellas. Bien empezamos. Si un control Text lo tiene, ¿como es que un control Text dentro del grid no? Misterios del .NET Framework, de Microsoft y de sus by design, pero lo cierto es que dicho evento debería estar disponible.

Otra opción es la de comprobar si el grid tiene la posibilidad de activar un modo KeyPreview igual que tienen las fichas. Pues no, no lo tiene. Desde mi punto de vista, y seguro que desde el de Peni, es una jodida limitación bastante evidente.

Como se dijo en cierta película del siglo anterior, “siempre nos quedará París” o, lo que es lo mismo, “utilicemos el KeyPress y el KeyPreview de la ficha”, que para algo están. Asignando true a KeyPreview en una ficha, todas las pulsaciones de tecla pasan por ella antes de ser reenviadas al control correspondiente, siempre y cuando nosotros así lo queramos.

Capturamos el evento KeyPress de la ficha, evento que se disparará para todas y cada una de las teclas que se pulsen dentro de ella. En dicho evento recibimos un objeto del tipo Object llamado sender y una referencia a un objeto de la clase KeyPressEventArgs. Si asignamos true a la propiedad Handled de esta clase, la tecla se perderá para el control que estuviera destinada (otra cosa es que funcione, que no lo hace para la mayoría de los controles hijo, pasándose por el forro de donde ya sabemos la funcionalidad).

El objeto sender es el que nos interesa, pues es una instancia polimórfica del control que genera el envento, en nuestro caso, presuntamente y hasta que no se demuestre lo contrario, nuestro control grid. O eso se deja entrever en la documentación. Sólo nos queda promover dicho objeto a su clase exacta, previa comprobación de que se trata del grid y no de otro control cualquiera presente en la ficha. Para ello utilizamos un código parecido a este:

Type tipo=sender.GetType();
if(tipo.ToString()=="DataGrid") //Así no funciona, pero para efectos de demo nos vale
...

¿Qué suponemos que valdrá tipo.ToString()? Aquí es donde la presuntez pierde su valor y se convierte en certeza… ¡Vale “Form1″, que es el nombre de la ficha! Esto me lleva a preguntarme: ¿Para qué cojones sirve entonces el objeto sender? Evidentemente se trata de un absurdo más, porque ya sabemos que estamos en la ficha. En otras herramientas RAD, no voy a decir el nombre, sender vale lo que tiene que valer.

En fin, otro by design más.

Pero aquí no acaba la cosa, “aún hay más”, que diría cierto ratón volador sin alas. Vamos a por la tercera. ¿No dicen que a la tercera? Veremos. Nos queda una última técnica, la de comprobar en el evento quién tiene el foco, y si se trata del grid, lo tenemos hecho. Presuntamente hecho, porque el foco no lo tiene el grid, sino el control de edición que está dentro del grid. Para verlo deberíamos recorrer todos los subcontroles del mismo, comprobar mediante reflexión si tienen la propiedad Focused y luego consultarla. Eso o meter el código dentro de un try/catch y jugar a ver lo rápido que va… No se rían, por favor, eso de picar una tecla cada cuarto de hora es lo habitual.

Descartada esta opción, nos vamos a por la cuarta, que vamos a adelantar, funciona, es sencilla, evidente por sí misma y carente de cafeína, destrozos de teclado y gritos de frustación… Si el grid está en modo de edición, por cojones ha de tener el foco, así que, en vb, nuestra duda/problema queda, felizmente y tras casi una mañana de peleas, resuelta:

Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
If DataGridView1.IsCurrentCellInEditMode Then
MsgBox(e.KeyChar.ToString)
End If
End Sub

Gracias por leernos y no olviden mineralizarse y supervitaminarse.

May 18, 2006

Ficheros INI al estilo clásico con diccionarios

Filed under: Programación

De todos es conocido que el registro es una castaña para guardar la configuración de un programa, y más aún si el programa va a permitr que el propio usuario la toque a mano sin que el programa esté cargado, como es el caso de Opera y de otro mucho software, generalmente OpenSource.

El .NET Framework dispone de dos sistemas para guardar la configuración de una aplicación. El sistema más sencillo es colocar un archivo con el mismo nombre del ensamblado y con la extensión .config. La limitación de este sistema es que es de sólo lectura y compartido entre todos los usuarios. Otra castaña, vamos.

El segundo es bastante más poderoso. Consiste en utilizar flujos y guardar en ellos los componentes que queramos. También tiene sus limitaciones, algunas de ellas desesperantes. No se pueden guardar fichas (o al menos yo no he podido), toda clase/componente ha de tener la propiedad [Serializable] (que automáticamente hereda de Iformatter añadiendo bastante tamaño a los objetos instanciados), y sólo se pueden guardar en serie como si de una pila corriente y moliente se tratara. Si queremos sacar el tercer componente guardado, hemos de sacar los dos anteriores, y si una vez extraído ese queremos obtener el anterior, debemos cerrar y volver a abrir el flujo. Otra pasada castañera, vamos.

Pero las limitaciones no terminan ahí, no. Los ficheros en donde se almacenan los datos pueden ser binarios o XML. Los binarios no tienen ninguna limitación si no es la de que nadie sabe qué hay dentro (que para el propósito que nos ocupa no nos sirven), y los XML son incapaces de almacenar la mitad de cosas… Vamos, otra castaña más.

¿Cuál es la solución? Pues volver al tradicional fichero INI de toda la vida, el mayor invento en archivos de configuración. Podríamos treabajar con fichero XML, pero son bastante complejos de leer a mano por un ser humano y encima los sistemas para acceder a ellos son enormemente lentos.

Por eso acabo de terminar de codificar una clase para trabajar con ficheros INI de texto para mi programa. La he realizado utilizando un diccionario que contiene otro diccionario, de la forma que a la hora de acceder a un elemento de una sección es enormemente sencilla:

String ^elem=iniFile[seccion][nombre];

De esta forma, si accedemos a un elemento inexistente, el objeto devolverá una cadena vacía, y si asignamos algo nuevo, se crearán las secciones correspondientes automáticamente.

También he creado los métodos tradicionales del API de Win16, ReadString, etc. Bueno, aunque de momento sólo tengo implementados la obtención de una cadena y de un entero, fijándose en el código se puede implementar trivialmente casi cualquier otro tipo de dato básico.

Lo curioso del tema es que una vez que la he terminado me he dado cuenta de que mediante diccionarios es imposible mantener los comentarios, pues una vez que se escribe de nuevo el fichero, éstos se pierden, pero aun así todavía es útil. Quizás más adelante implemente una nueva clase con otro tipo de estructura de datos que permita mantener los comentarios.

Los ficheros de código fuente se pueden bajar de aquí.

May 16, 2006

Jules Verne: Las historias de Jean-Marie Cabidoulin (1901)

Filed under: Lecturas, Verne, Jules

RBA Coleccionables, S.A., 2002
84-473-3099-0
Les Histories de Jean-Marie Cabidoulin
Edición de Saenz de Jubera

Lectura número 0044/2006

Obra muy menor, quizás escrita en su juventud y adaptada en su madurez (tiene ciertos paralelismos con Una invernada entre los hielos, protoplasma de lo que será el Hatteras); tampoco se puede englobar en su tercera época puesto que aquí se nos narra la vida diaria de un barco ballenero, con sus vicisitudes, sus alegrías y sus penas, de forma acrítica y sin aspectos negativos.

No podemos descartar que el pobre argumento, lo carente de aliciente y de ciencia se deba ya a las crisis finales del autor, afectado de cataratas, cojo de un pie y diabético perdido, así como desengañado de todo y de todos.

Jean-Marie Cabidoulin es tonelero retirado y se ve embarcado en un ballenero muy a su pesar, convencido por el médico de a bordo. El inicio de la campaña comienza bien, y venden un buen cargamento de aceite y de otros elementos extraídos de la caza de la ballena; esta primera parte sirve al autor para expresar el día a día y los trabajos que se llevan a cabo en este tipo de embarcaciones.

Dado que todavía no ha terminado la temporada, deciden repetir, pero esta vez los animales escasean. Aquí nos muestra los aspectos menos bonitos del oficio, así como las peleas y discusiones entre los diferentes barcos cuando se enfrentan a un mismo animal, que a veces termina en violencia.

En medio de una de estas reyertas, el barco de Cabidoulin encalla en un pecio desconocido, mientras que el otro barco es destruido por completo. Rescatados los náufragos, no se llevan muy bien dado que son ingleses y nuestros personajes franceses.
Posteriormente el barco es arrojado por una ola gigante hacia el norte, encallando en un campo de hielo. Finalmente son rescatados por otro barco, esta vez inglés.

En esta novela no hay ciencia, ni grandes descripciones, ni explicaciones, ni motivaciones; los hechos simplemente ocurren, y no son meros elementos para divulgar ni educar… Lo único interesante es la predicción de que en un futuro la caza de ballenas se tecnificará (Verne no se imaginó hasta qué punto), y que la navaja de Occam está presente en toda explicación, aunque el lector avezado leerá entre líneas que sí, que esos monstruos marinos existen en la realidad.

May 15, 2006

Jules Verne: Miguel Strogoff (1876)

Filed under: Lecturas, Verne, Jules

Este no lo he leído, sólo hojeado, dado que ya lo hice por enésima vez no hace mucho tiempo. Simplemente recordando el argumento y viendo los grabados. Poco que decir, salvo que se publicó originalmente en dos volúmenes y que generalmente ediciones posteriores lo han hecho en uno solo, omitiendo la división en dos partes tradicional. La segunda comienza en el capítulo XVIII, un campamento tártaro, justo tras ser capturado el correo Miguel.

Recuerdo haber jugado en mis años tiernos con un amigo a ser los periodistas Jolivet y Blount, compitiendo por cualquier tontería.

Jules Verne: Los hijos del capitán Grant (1867/68)

Filed under: Lecturas, Verne, Jules

RBA Coleccionables, 2002
84-473-26354-9
Les enfants du capitaine Grant
Traductor desconocido

Lectura número 0043/2006

Tres son las ediciones consultadas. La que cito en tres volúmenes, otra casi idéntica publicada por Ediciones Nauta en dos volúmenes junto a otras obras, y la de Molino de cubierta amarilla, mal llamada “textos íntegros”, pues aparte de tratarse de una traducción más moderna (en las expresiones y dicción), me da la impresión de estar algo cortada, con ciertas liberalidades tomadas por el traductor.

La edición leída tiene en su primer volumen varios errores de saltos de páginas, quizás una o dos planchas incorrectamente maquetadas.

Interesante relectura, con un par de fallos argumentales bastante serios: al final de la segunda parte, Mac Nabbs conoce desde hace un día el secreto de Ayrton y se espera al lugar correcto para hacer la revelación, en lugar de secretear con Glenarvan y tender una trampa. El segundo, quizás disculpable al autor por cuestiones geográficas de la época, consiste en que la isla de María Teresa está a más de quinientas millas de Nueva Zelanda, y desde luego esa distancia no se recorre en un rato.

Por lo demás, obra positivista, de la primera etapa, llena de viajes y de geografía, así como de aventuras, con la apoteosis final cuando huyen de los maorís (recuerdo haber estado con el alma en un puño en mi primera lectura allá por mis años mozos), seguida de otras de menor intensidad.

Comentar que originalmente la novela se publicó en tres volúmenes independientes con los títulos de: Los hijos de capitán Grant en América del Sur, Los hijos del capitán Grant en Australia y Los hijos del capitán Grant en el océano Pacífico.

Get free blog up and running in minutes with Blogsome
Theme designed by Gary Rogers