Cosas mías

April 27, 2005

zxFortunes, codificación e indexado (y III)

Filed under: Programación

El primer problema que se me presentó al hacer el proyecto consistía en cómo iba a leer los ficheros de texto procedentes del mundo Linux. De entrada, una de los primeros problemas es que mientras en Windows, un final de línea viene acompañado por CR/LF, en Linux sólo lleva uno de ellos. Sabido es que con el acceso E/S estándar de C (me refiero a la familia de funciones fread/fopen/fgets), siempre que el fichero se abra en modo texto, las traducciones a cadenas se realizan automáticamente. Pero en el mundo .NET no pude encontrar algo parecido; es más, dadas las diferentes codificaciones, el .NET lleva toda una rica variedad (y complejidad) de formas de leer un fichero. Son los Encoding, que se encuentran dentro del espacio de nombre System.Text. Tenemos cinco formas de leer un fichero, a saber:

  • ASCII
  • Unicode
  • UTF7
  • UTF8
  • Bueno, pues tras mucho batallar leyendo los ficheros, determiné que el formato era el ASCII. Parece una perogrullada pero no lo es. Me llevó bastante tiempo averiguarlo, porque la primera vez que probé con el formato ASCII falló y leyó mal. El problema estaba en los acentos y la ñ, que no había forma de que se leyeran bien. También tuve otro problema que casi me vuelve loco. Una vez procesados y copiados al formato nativo de Windows, al leerlos de nuevo para sacar la cita aleatoriamente, la cantidad de bytes leída no se correspondía con la contada. Me explico. Iba a la posición 100 del archivo. Leía 50 caracteres. Pues realmente había ido a la 80 y había leído 30. Y no era un problema de tamaños dobles de caracteres ni nada de eso (en un editor hexadecimal, lo guardado en el disco estaba perfectamente almacenado en caracteres unicode), sino de algo interno a Windows. También, en el trabajo, tuve un problema similar con otras herramientas y otros menesteres, al almacenar relativamente grandes ficheros binarios con información más o menos codificadas. Tras mucho batallar y repetir cosas una y otra vez, de repente, la cosa comenzó a funcionar mágicamente cuando antes no lo había hecho… Porque publicaron el SP1 del NET 1.1. En fin. La lata que les di a los pobres de microsoft.public.es.vcsharp.

    Indexar sin base de datos

    ¿Cómo obtener una cita de entre miles de ellas, quizás repartidas entre docenas de archivos diferentes, sin tener ningún motor de bases de datos? ¿Hacerme yo uno? Pues casi, pero no. La idea es generar un archivo de índice, independiente de los ficheros y con registros de tamaño fijo (¿a alguien le suenan los ntx, ndx, px?). Y desde luego no cargarlo en memoria. Ni árboles-b ni ninguna estructura de datos compleja. Un simple par de elementos para cada cita, almacenados consecutivamente, todo en disco. Un primer elemento, una cadena de ancho fijo que almacena el nombre del fichero en donde está almacenada la cita. El siguiente valor contiene la posición de comienzo de la cita dentro del fichero. Ahora sólo queda echar los dados, obtener un valor situado entre cero y el número total de citas (que se almacena al principio del fichero índice), y calcular en base a ese número la posición en el fichero índice del registro:

    int posInIndex=2*iFortune*System.Runtime.InteropServices.Marshal.SizeOf(nFile);

    Nos vamos a esa posición del fichero, leemos el nombre del fichero de la cita y la posición de inicio. Abrimos el fichero donde realmente se encuentra la cita, nos vamos a la posición indicada, y leemos hasta encotrar un “%” o el final del fichero. Sencillo y extremadamente rápido.

    April 18, 2005

    Visual Studio .NET Beta 2

    Filed under: Programación

    Microsoft acaba de poner en la Web la beta 2 de toda la familia de productos Visual Studio. El punto de entrada está en http://lab.msdn.microsoft.com/vs2005/default.aspx. Lo interesante del asunto no es que el Visual Studio 2005 haya entrado en fase beta 2, sino que las versiones Express también lo han hecho.

    Para quien no lo sepa, en argot de Microsoft, una versión beta 2 está muy cercana a la final en características y es un software que, salvo excepciones, es casi completamente usable. Y también para quien no lo sepa, las versiones Express son una variación streamlined de las versiones serias, completamente funcionales pero con menos opciones y características. Eso no quiere decir que sean pobres, sino que, por ejemplo, no tienen perfiladores de código, pero las facilidades para la refactorización están presentes, y los compiladores son los mismos que los de las versiones más altas.

    Nueva Web
    Pero lo verdaderamente interesante sigue sin ser nada de eso. Conjuntamente con el lanzamiento del producto, también han estrenado Web, que ellos llaman Coding4fun. Esta Web es una especie de revista dedicada al programador amateur, en la que se van a ir desgranando artículos con ejemplos de programación, realizados con las versiones Express.

    Lo curioso del tema no es que creen uno de tantos espacios dedicados a la programación, no. Lo llamativo es que está destinada al programador aficionado, que a fin de cuentas pocos beneficios le va a reportar a Microsoft; más bien problemas y más tráfico, porque en los artículos se citan los grupos de news de Microsoft, y explícitamente a que los MVP estarán encantados de responder a sus dudas…

    Considero que es una inteligente patada en los bajos a una parte de la comunidad del software libre, pero esta vez las armas que utiliza son un tanto más refinadas. He probado las versiones Express (casi todas hasta la CTP de Febrero del 2005) y son una delicia en cuanto a manejo y funcionamiento, salvo los bugs, claro está. Este párrafo no deja de ser una opinión personalísima, pero no veo otra explicación al asunto de dedicar toda una serie de recursos a algo que no les va a reportar ningún beneficio directo si no es retrasar un poco lo inevitable.

    April 8, 2005

    zxFortune, programador de tareas y seguridad (II)

    Filed under: Programación

    Una de las últimas cosas que implementé en el programa fue la interactuación con las tareas programadas. Lo que en principio iba a ser una faena sencilla se convirtió en algo bastante complicado. Me explico.

    La primera en la frente. El .NET 1.1 no tiene soporte directo para la gestión de tareas, como no lo tiene para otras muchas cosas, y en la versión 2.0, tampoco. Veremos cómo se las arregla Longhorn. La segunda, igual que la primera. La gestión de tareas operando directamente con el API de Win32 es toda una odisea, pues se realiza a través de COM y las realización es bastante complicada… Menos mal que en CodeProject alguien ya se había enfrentado al problema y había creado un conjunto de clases para .NET que convierten el infierno en el paraíso.

    El creador es Dennos Austin, y la biblioteca se puede descargar de aquí. Te tienes que registrar para poder descargar, pero para leer el artículo no es necesario. La forma de trabajar con las tareas programadas es todo un placer con estos elementos; es tan sencillo que con echar un vistazo al código de ejemplo de la página es suficiente, así que no voy a decir nada más sobre el tema.

    Cuestiones sobre seguridad

    El siguiente problema una vez solucionado el tema del programador de tareas fue la seguridad. Si el programa se ejecuta como usuario restringido, es necesario que la tarea se programe como administrador para que pueda ser ejecutada globalmente, por lo que se debe introducir un usuario y una clave. Otra situación es que por políticas de grupo, el acceso al programador requiera también una cuenta.

    Si mi programa ha de ser capaz de reprogramarse a sí mismo, ha de almacenar el citado usuario y su clave en algún lugar. Como no existe ningún método seguro para guardar eso, pues cada vez que el programa tenga que modificar el programador, se pedirán los datos de la cuenta. Algo de este tema se discutió en su momento aquí.

    April 6, 2005

    zxFortune, pon un fortune en tu vida (I)

    Filed under: Programación

    Cualquiera que esté medio metido dentro del mundo Linux conocerá la aplicación fortune-mod, que casi todas las distribuciones incorporan; para los que no sepan de qué va, diré que se trata de un pequeño programa que es capaz de poner una cita aleatoria sacada de una base de datos de citas. Existen en internet una cantidad casi infinita de ficheros de citas para el programa. Las hay de todos los tipos y tamaños, desde frases sacadas de Los Simpson o de Star Trek hasta otras más ofensivas y de peor gusto. Por haber hay hasta en castellano.

    El formato de la cita es muy sencillo a priori: se trata de un fichero de texto ASCII con las citas separadas por el símbolo del tanto por ciento (%). Ignoro el funcionamiento concreto del programa de unix relativo a cómo se organizan los diferentes ficheros que se pueden ir añadiendo.

    Existen para linux varios entornos gráficos que toman la salida de la consola del programa y lo redireccionan a una ventana, pero para Windows sólo he podido encontrar uno, y bastante malillo, así que hace un tiempo decidí implementar yo algo más usable y bonito. Fue mi primer proyecto bajo .NET, es OpenSource y se puede bajar de http://sourceforge.net/projects/zxfortune.

    El programa en sí no lleva demasiado trabajo, pero como fue mi proyecto de inicio me llevó bastante más tiempo del deseado, porque muchas veces no encontraba lo que buscaba aunque lo tuviera delante de las narices.

    Con él puedes:

  • Abrir una cita cuando se abra la sesión.
  • Abrir una cita periódicamente.
  • Generar una cita pulsando un botón.
  • Generar un fichero de texto con la cita para insertar en el correo electrónico.
  • La ventana se puede abrir como tal o al estilo del Messenger, en una esquina sin molestar
  • .

  • El programa se puede acoplar a la zona de los iconos, quedando residente, o programar una tarea y que se lance cada cierto tiempo.
  • Ya sé que esto parece más publicidad del programa que otra cosa, pero era necesario para, en siguientes entradas, explicar ciertas decisiones y elementos que contiene el programa; como se trata de un proyecto terminado hace tiempo, voy a poner pocas cosas, pero en siguientes proyectos me expandiré conforme los vaya haciendo.

    April 4, 2005

    Presentación

    Filed under: Varios

    En contra de la mayoría de los programadores, mi labor no se basa en el PC (o programación para PC), sino que me especialización son los microprocesadores y el hardware vertical (esto es, placas diseñadas y programadas específicamente para algo en concreto), por lo que mis conocimientos y experiencia están más cerca del hierro que de lo otro; mi lenguaje de cabecera es el C, aunque no le hago ascos al ensamblador o al C++.

    Como soy uno de esos bichos raros a los que les gusta su trabajo, y disfrutan con él, pues en mi tiempo libre programo, o estudio temas relacionados, aunque mis inquietudes son más amplias.

    Mis conocimientos no sólo se centran en plataformas verticales, sino que le doy al PC también, por motivos laborales (tener que haber hecho proyectos mixtos o emuladores/simuladores) y personales por las facilidades que ofrece la programación de escritorio. Más adelante contaré algo sobre lo que significa, y significaba hace unos años, programar a veces en mi sector.

    Especificaciones técnicas del blog… Digo… Declaración de intenciones.

    La idea de todo esto es ir anotando incidencias, ideas, problemas y soluciones, proyectos personales llevados a cabo y terminados o no, y todo lo relacionado con la programación que tenga a bien escribir. Espero mantener una racha de, al menos, un post semanal, aunque tengo ya tres o cuatro preparados que quizás suelte esta misma tarde.

    Dado que mis proyectos personales van a estar muy relacionados con la tecnología .NET de Microsoft, no he dudado en dar el nombre de Nación .NET a este diario; nación porque va a consistir en un conglomerado de elementos más o menos dispersos, pero siempre, o casi, dedicados a la segunda palabra del blog: .NET.

    Y dado también que odio el Visual Basic casi más que odiaba a cierto jefe, y dado que el C++ como lenguaje .NET deja algo que desear, pues mis primeros proyectos están hechos en C#, aunque mi intención futura es terminar con C++ bajo .NET, pero eso será cuando salga la versión 2.0 de la plataforma.

    Un soleado día de abril.

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