Pintar texto de abajo a arriba, un posible bug y un workaround

Pues eso.


Para pintar texto en vertical, es necesario pasar al método DrawString un último parámetro, una instancia de StringFormat con lo siguiente:



m_stringFormat=gcnew StringFormat();
m_stringFormat->FormatFlags=StringFormatFlags::DirectionVertical;



Pero esto nos dibuja el texto de arriba hacia abajo y mirando hacia la izquierda. Si nosotros queremos hacerlo justo al revés, de abajo hacia arriba, y mirando hacia la derecha, hasta donde he podido llegar, no se puede hacer directamente.

La solución obvia consiste en cambiar las coordenadas del dispositivo, rotándolas 180 grados, y pintar. En mi caso, sobre la propia ficha. Pero no he conseguido que funcione, si toco las rotaciones o las traslaciones, pese a lo que dice la documentación y el Petzold, no se pinta nada (y no porque me salga de la superficie, no).


Así que debemos optar por la solución más compleja, que consiste en pintar sobre un bitmap oculto y luego copiarlo a la superficie de la ficha:



Bitmap ^bmp=gcnew Bitmap(m_editNumberRect[m_idxCurrentEditing].Width,m_editNumberRect[m_idxCurrentEditing].Height,e->Graphics);
Graphics ^g=Graphics::FromImage(bmp);
g->TranslateTransform((
float)(m_editNumberRect[m_idxCurrentEditing].Width+15),(float)m_editNumberRect[m_idxCurrentEditing].Height);
g
->ScaleTransform(-1,-1);
g->DrawString(m_editNumber[m_idxCurrentEditing],m_textFont,Brushes::Black,0,0,m_stringFormat);
e->Graphics->DrawImage(bmp,m_editNumberRect[m_idxCurrentEditing]);


Creamos un bitmap de las dimensiones deseadas compatible con la pantalla actual. Luego obtenemos la superficie para pintar sobre el propio bitmap. La tercera línea (TranslateTransform) desplaza el origen de coordenadas para que al hacer la inversión mediante ScaleTransform pintemos el texto mediante DrawString en el mismo sitio que antes de rotar. De este modo, hemos pintado el texto rotado 180 grados.



Hacerlo de la forma fácil, es decir:


g->TranslateTransform(…);
e->Graphics->ScaleTransform(-1,-1);
e->Graphics->DrawString(m_editNumber[m_idxCurrentEditing],m_textFont,Brushes::Black,m_editNumberRect[m_idxCurrentEditing],m_stringFormat);


simplemente no funciona, quizás porque se me escape algo.


En el código de ejemplo, el que el ancho esté desplazado 15 píxeles no es otra cosa que el desplazamiento causado por la altura de la letra; como la aplicación va a ir en un ordenador replicado, no es necesario liarse con las métricas de las fuentes.


Y eso es todo, que no siempre es cuestión de despotricar. 😛

Arreglo unas, rompo otras

De veras que lo siento, de veras. 🙁


Me molesta mucho ser tan mosca cojonera, tan impertinente y tan combativo, pero es que se lo merecen.


¿Recuerdan que han publicado el SP1 del Visual Studio 2005? ¿Sí?


Hagamos un expermiento en C++/CLI.


Creemos un proyecto vacío Windows Forms.


A la ficha principal, en las opciones de propiedades, asignamos FormBoderStyle a None.


Cambiamos el valor Size a 800;600.


En el constructor, debajo de InitializeComponent(), añadimos una línea como la siguiente:



BackgroundImage=Bitmap::FromFile(“<ruta>\debug\img\MENU_PRINCIPAL.bmp”);


En donde el fichero MENU_PRINCIPAL.bmp es una imagen bmp normal del mimso tamaño que la ficha, en nuestro caso, 600×800


Ejecutemos el ejemplo.


Vemos que el fondo de la ficha muestra nuestra imagen. Esperemos unos segundos sin ocultarla.


¿Qué ocurre?


Pues el fondo se desplaza solo, como si nos hubiéramos equivocado al pintar.


Cuando ocultamos y volvemos a mostrar la ficha, la imagen aparece de forma correcta, hasta que al poco se vuelve a desplazar.


Con otras fichas hijas, esto no ocurre, solo con la padre y, por supuesto, con el Visual Studio 2005 sin SP1, tampoco.


¿Tengo o no razón para quejarme amargamente, en despotricar contra el hatajo de chapuzas, mierdaprogramadores, tontoslaba de la gente de Microsoft?


Pues eso.

Deploy con Visual Studio 2005 SP1

Por todos lados están anunciando que ha salido el Service Pack 1 del Visual Studio. Casi todos los post de Geeks tienen su entrada correspondiente, y yo no voy a ser menos. 🙂


Pero en lugar de anunciar que ha salido, voy a comentar algo sobre las mejoras observadas y sobre otros temas. Como estoy hasta las cejas de faena -en este momento estoy programando, aunque ya lo dejo hasta el lunes (bueno, hasta el miércoles, mañana salgo de viaje a Barcelona)- voy a ser bastante sincrético.


Creo que en mi otro blog ya he comentado algo cuando el SP estaba en fase beta, y más o menos la situación es la misma. De momento me voy a referir al C++/CLI, puesto que de momento es lo que estoy utilizando -y hasta mediados de enero, eso y el C++ tradicional, cosas de faenas con urgencia-.


En general ha mejorado algo el rendimiento, ahora la transición ficha/código es algo -sólo algo- más rápida. Tampoco estoy con un proyecto con fichas complejas, más que nada porque la superficie la relleno en tiempo de ejecución, por lo que no he podido verificar si se ha solucionado el bug del doble clic. En el editor visual, a veces, si hacías clic demasiado rápido sobre un componente, en lugar de seleccionarlo, el entorno entendía que habías hecho doble clic y te lanzaba el evento por defecto. Creo que está solucionado, porque ahora cuesta más seleccionar el componente, como si hubieran puesto un retardo entre que pones el ratón encima y te acepta el clic (que personalmente considero es una chapuza, pero bueno). Ya comentaré mas sobre eso, seguro que la semana que viene.


Otra pifia bien gorda que seguro han solucionado, es el tema de la compilación de los CPP. Unas veces raramente, otras casi siempre, al IDE se le olvidaba que habías modificado el cpp y no lo compilaba, creando verdaderos maremagnums de errores que se solucionaban con un Build All. A veces hasta se caía el IDE entero.


Lo que no han solucionado es el IntelliSense en C++/CLI. Sigue fallando más que una escopeta de feria, esperemos que el problema con los proyectos grandes sí que lo hayan solventado.


Y ahora viene lo interesante. Esta mañana, tras instalar el SP1, como siempre, he lanzado la aplicación en la máquina remota para descubrir que no se ejecutaba. Me daba un error algo así como que tenía que instalarla, igual que cuando ejecutas un EXE generado en Debug y no encuentra las DLLs (uis, perdón, ensamblado) de depuración. Lo mismo pero con la Release.


Efectivamente, han cambiado el runtime del C++, por lo que la solución pasa por realizar un proyecto de instalación con tu aplicación y marcar en propiedades que es necesaria la dependencia del Runtime del Visual Studio. En la carpeta del instalador, una vez construido el proyecto, residirá el citado instalador, que debemos trasladar al otro PC e instalar.


Lo que me llama mucho la atención es la necesidad que tiene un aplication .NET pura del runtime de C++. ¿No es el .NET independiente de la plataforma? En fin.


Si os pasa, avisados estais.

Windows CE (II). Diferencias con un PC

Protección de Procesos
Quizá a simple vista pueda parecer un paso hacia atrás, a los tiempos del Windows 3.1, pero en Windows CE el sistema de protección entre tareas es muy débil, de modo que una aplicación puede, si no desestabilizar el sistema, sí detenerlo por completo.

No se trata de un fallo, sino de una limitación de los microprocesadores que se utilizan en entornos embebidos, de modo que, efectivamente, un proceso inestable puede llegar a hacer necesario un reinicio del dispositivo.

Pero debemos tener en cuenta el hecho de que el destino de estos aparatos no es el mismo que el de un PC, sino que el número de aplicaciones que van a ejecutar es conocido y está determinado en tiempo de desarrollo.

Habrá dispositivos que ejecuten como máquinas cerradas, por ejemplo un sistema de parking con la típica pantallita táctil; en este tipo de desarrollos dentro del dispositivo se va a ejecutar el sistema operativo y la aplicación, de forma que el comportamiento de ésta va a estar perfectamente prefijado desde un principio, por lo que en teoría cualquier problema, y sobre todo cualquier problema que bloqueen el equipo, va a estar solventado en origen.

Otros elementos serán más versátiles, como los puntos de información, o las máquinas de venta de productos variados, o incluso un videojuego; aquí el software entraña mayor complicación, por lo que se requieren más validaciones, pero al final se trata de lo mismo: un sistema completamente cerrado, por lo que el tema de protección de procesos pierde interés frente a una mayor seguridad del hardware o simplemente al coste del dispositivo…

Tamaño de la pantalla

Esta diferencia sí que puede ser rompedora a más no poder. En un dispositivo embebido no podemos asumir ni siquiera un rango de tamaños de pantalla… Podemos tener aparatos sin pantalla de ningún tipo -un router, una impresora-, otros con un simple display alfanumérico, y entre ellos desde uno de una línea de caracteres fijos hasta los de varias, o gráficos, o mixtos, o de 7 segmentos…

También podríamos disponer de una pequeña pantalla tipo PDA más o menos estándar, o una que no lo sea, de, por ejemplo, 1000×10 píxeles (un rótulo), o incluso varias pantallas, unas con chip 3D, otras con framebuffer, o con acelerador 2D… Incluso dispositivos a los que no se les haya incluído el soporte de vídeo dentro del CE pero que tengan pantalla con una biblioteca propia…

Por eso no se puede asumir nada sobre la salida de gráficos… Cada dispositivo tendrá sus características, y un aplicativo realizado para un modelo podría no servir para otro idéntico pero con diferente soporte de vídeo…

Periféricos extra, exóticos… o ninguno
Otra diferencia son los periféricos. Aquí tampoco podemos asumir nada. Habrá aparatos que lleven disco duro, o lectores de CD, otros quizás un sistema de lectura en Compact Flash, o Secure Digital, o simplemente una ROM en chip sin más.

Los habrá con USB, o con cinco o diez puertos serie, o SPI, con sonido o sin él, con una impresora típica o algo más extraño, como una térmica o incluso un elemento impresor de seguridad.

Podrían tener dispositivos para pagar dinero, o aceptarlo…

Incluso podrían tener una batería de relés o comutadores para comandar cualquier cosa…

Velocidad y rendimiento
Tampoco podemos asumir nada respecto al posible rendimiento. Habrá aplicaciones que apenas requieran recursos, y las habrá que necesiten uno o varios procesadores SIMD o MIMD asociados…


Por ello no debemos ser conscientes de la optimización y del consumo de memora y recursos. No estamos ante un PC, sino antes algo mucho más pequeño y más limitado, aunque a simple vista, por la forma de desarrollo, parezca que trabajamos con un PC. Y debemos ser enormemente cuidadosos a la hora de hacer nuestros programas, pues aparte de lo habitual, debemos poner especial cuidado en el optimizar el consumo de memoria y el tamaño de nuestro código.


Depuración remota
Generalmente, y salvo que estemos trabajando con los emuladores, el proceso de depuración suele diferir algo respecto al tradicional. Quzás la mayor diferencia sea que ahora la máquina sobre la que ejecutamos nuestro programa es diferente a la que compila y contiene el entorno de desarrollo, y generalmente se trata de arquitecturas diferentes. Pero MIcrosoft soluciona todo eso de forma elegante y casi transparente para el programador.


Lo más difícil de todo es que tengamos que preparar nosotros todo el sistema de desarrollo, incluyendo en el Platform Builder los elementos necesarios para generar nuestro sistema operativo. A veces la tarea puede ser bastante dificultosa, sobre todo si vamos a desarrollar con el Visual Studio 2005 y con una plataforma construida con el Platform Builder 5. Pero si utilizamos el sistema tradicional, el asunto es trivial.


Generalmente será el proveedor de la placa de evaluación o el que suministre el kit quien monte y prepare todo eso. A no ser que seas tu el proveedor, y entonces te tengas que currar todo, que es mi caso.


El proceso para lanzar un ejecutable es bastante sencillo. Desde el IDE, previa conexión con la placa (“Tools” -> “Connect to Device”, aunque esto a veces es automático), tu programa se compila y genera el ejecutable válido para el ordenador remoto. Cuando lances la depuración, el IDE enviará el ejecutable junto a todo lo necesario a la placa destino, y lanzará la aplicación allí.


Cuando pongas un punto de interrupción, o detengas la ejecución, verás el resultado y la parada del programa en la ventana de tu IDE, pero todo lo demás -salida de video, acciones, etcétera-, se ejecutará en el dispositivo. Como es una conexión remota, todo esto es bastante más lento que programando directamente con el PC, aparte de que la aplicación se ejecutará en destino bastante más lenta de lo que lo haría si no estuviera el depurador anexado.


Formas de conectar hay muchas, desde el ActiveSync por canal serie o USB, hasta una conexión Ethernet, que suele ser la más rápida. Depurar a través de un puerto RS-232 puede ser una tarea desesperante, sobre todo si el programa es grande.


Generalmente dispondremos de un canal de comunicación unidireccional desde el dispositivo hacia el Visual Studio, que aparecerá en la ventana de registro correspondiente. Estas llamadas se suelen hacer mediante la macro RETAILMSG, que se encuentra ampliamente documentada.


Pero no estamos limitados al Visual Studio. Podremos ver el sistema de ficheros remoto, así como el registro, o la lista de procesos. Tenemos hasta un medidor de rendimiento. Todo ello se puede ejecutar desde el menú “Microsoft Visual Studio 2005” -> “Microsoft Visual Studio 2005 Remote Tools”. La idea es la misma que con el IDE, en tu ordenador verás lo que hay en el remoto, previa conexión con el dispositivo.


Limitación de APIs
Quizás lo que más moleste a un programador hecho y derecho que se acerque al mundo embebido, o que tenga que desarrollar tanto para PC como para éste, es el hecho de la limitación de las APIs.


La de Win32 no está muy capada, y casi se permiten las mismas cosas, lo único que por lo general sólo hay un camino viable, y lo que se ha eliminado es porque no tiene mucho sentido dentro del mundo embebido, pero otras limitaciones pueden llegar a ser algo desesperantes.


Y este es el caso del .NET. Mientras que para el PC cuenta con un richo conjunto de elementos, el Compact .NET se encuentra bastante -por no decir mucho- limitado, por lo que hay que tener un cuidado exquisito a la hora de diseñar nuestra aplicación, porque seguro que muchas cosas con las que contábamos como evidentes, no están disponibles y te toca o hacer interop al mundo nativo o buscarle tres pies al gato o, simplemente, no hacerlas.


Y una cosa que personalmente me repatea es que no haya C++/CLI para dispositivos embebidos.

"Están locos estos romanos", o "Un asunto de licencias" (II)

¿Qué oyó mi amigo Saltatrampas en el teléfono? Pues lo siguiente:



  • Windows no se puede reinstalar, debes comprar una licencia nueva.

  • Si una actualización te pide reactivar, tienes que comprar una licencia nueva.

  • Windows no se puede reinstalar, ni siquiera si se ha estropeado a causa de un driver defectuoso o por programas de terceros (incluída la propia Microsoft).

  • No se puede tener instalada en el mismo equipo más de una copia de Windows con la misma licencia, ni siquiera para evitar el punto anterior.

  • No puedes tener replicados en máquinas virtuales diferentes Windows con una misma licencia, ni siquiera si no los tienes cargados simultaneamente, aunque la propia Microsoft te suministra una utilidad para hacerlo.

Tras haber leído varias licencias de Microsoft, no encuentro dónde pone todo eso, aunque se podría interpretar así. Pero sigamos con nuestra discusión.


¿Qué es un sistema operativo? Una definición entendible por todos es: una pieza de software que se situa entre las aplicaciones de usuario y la electrónica del equipo, y que permite y facilita la interactuación de un ser humano con el ordenador en el que se encuentra instalado. Windows es un sistema operativo.


Si yo compro un ordenador con un sistema operativo incluído, ese ordenador está asociado a esa licencia, y lo podré poner y quitar las veces que me de la gana, siempre que lo haga sobre el propio hardware. No lo voy a poner en una tostadora, ni en un equipo de música. Lo voy a poner en el ordenador para el que fue comprado. Si compro una tostadora y le quito la bandeja que recoge las migas de pan para limpiarla, no tengo que ir a la tienda a comprar otra. Lo mismo que con las lejas de un frigo.


Cuando se me estropea la tele la llevo al taller, me la reparan y me la devuelven. Pero no me obligan a pagar de nuevo el impuesto de lujo, ni la licencia del softwre que la hace funcionar.


Si al equipo de música le añado un nuevo módulo, no tengo que volver a pagar el equipo entero. Tampoco tengo que volver a pagar el impuesto de matriculación si le saco el motor al coche, lo reparo y lo vuelvo a poner. Incluso si lo hago yo.


Puedo tener 10 coches sin matricular siempre y cuando no los saque a la calle. Pero los puedo poner en marcha, revisarlos y quizás correrlos en circuitos de pruebas.


Creo que los paralelismos están lo suficientemente claros


Pero prosigamos.


Desde mi punto de vista es un completo absurdo, un absurdo que raya en lo estotérico, más allá de cualquier explicacion lógica. La única explicación es la prepotencia de Microsoft. ¿Pero qué cojones se han creído? Que miren las historia y que le echen un vistazo al caso Bell Telephone y el día en que el ejército tomó todas sus sedes.


Partimos del principio de que Windows es ilegal en España. Porque lleva la licencia dentro y no puedes leer las condiciones de uso hasta que no has abierto el paquete. Y eso está prohibido. Sería igual a que te tuvieras que comer un yogur para ver la fecha de caducidad, porque ésta está en el fondo por el lado de dentro.


El siguiente punto es que el software, si no se está ejecutando, no es software. Por lo que podré tener cuantas copias e instalaciones me de la gana de Windows en el mismo ordenador, mientras que solo tenga una en ejecución. Esto es así por mero sentido común. Aparte de que cuando lees esa licencia ilegal te están diciendo que puedes EJECUTAR UNA copia del software.


Si el reinstalar un Windows ya activado no es legal, ¿por qué Windows Update te deja? ¿Y por qué pasas la validación de software original? ¿Está Microsoft fomentando la piratería de forma encubierta? ¿Espera a que todos tengamos nuestros Windows instalados de forma ilegal para lanzar a sus perros sabuesos?


Personalmente pienso que ni ellos mismo saben lo que se llevan entre manos, pero que se anden con ojo…


Pero sí que tengo clara una cosa:


 Estoy bastante harto de ese aire de prepotencia y de ordeno y mando que rezuma últimamente Microsoft, máxime cuando llevan varios años sacando productos que no son más que betas encubiertas con miles de bugs que nunca se solucionan.


Por lo menos yo rechazo esas condiciones de licencia, y seguiré utilizando mis Windows (legalmente comprados), y los instalaré las veces que me de la gana y tendré las copias que quiera en un mismo ordenador, y asímismo me gustaría realizar un llamamiento público para que todos nos concienciemos del tema y hagamos llegar a Microsoft nuestro rotundo desacuerdo.


Con todo esto lo único que van a conseguir es que mucha gente termine instalando Linux en sus ordenadores, o que simplemente usen copias piratas sin tantas mierdas de activaciones, verificaciones y mariconadas varias.


Dixit.

"Están locos estos romanos", o "Un asunto de licencias" (I)

El otro día, hablando con mi tío Saltatrampas de esto y de aquello, y de lo de más allá, le surgió una duda bastante seria, duda que inmediatamente me contagió. Y como yo no puedo vivir con una espada de Damocles pendiendo sobre mi cabeza, me decidí a investigar sobre el tema.


Dada mi tendencia a divagar y a irme por los cerros de Úbeda, y aparte escribir con cierto afán demagógico y floriturado, no puedo evitar el hecho de envolver todo este asunto en flores odoríferas y fragantes (no diremos si el aroma es agradable o desagradable), aunque intentaré centrarme en los hechos. Vamos allá.


Una mañana te levantas alegre y dicharachero y decides ir a la tienda a comprarte un ordenador nuevo, puesto que el que ahora posees empieza a emitir tufillos de humo negro cada vez que escuchas a la Lola Flores (tampoco vamos a entrar a discutir si el hecho de que tu ordenador humee se debe al hecho de que no le guste reproducir a tan insigne cantante o a que ya tiene sus años y le cuesta eso de mover los bits). En nuestro mundo ideal, el tendero te atiende con una amplia sonrisa, tu eliges tu cacharro, lo pagas, y vuelves a casa con él bajo el brazo. En el mundo real habría ligeras variaciones. Como que te vas a gastar casi el doble de tu presupuesto (“total, por 10 euros más tengo esto que es mejor”), o que habrás de esperar casi una semana a llevártelo. Pero bueno, estamos en un mundo ideal.


Ya en tu casa, contento y emocionado, desempaquetas, enciendes y descubres un ya olvidado “C:” con una cosita parpadeante. “¿Ein?”, te dices.Joder, claro, se te ha olvidado comprar el sistema operativo. “Estás tonto, macho”. Así que vuelves a la tienda.


Y es aquí donde las partículas subatómicas nos juegan una mala pasada y escinden el universo en dos sub-universos, cada uno de ellos con su línea temporal independiente. Como nosotros no somos dual core,pero tenemos la posibilidad de usar tablas, vamos a ver la secuencia en pseudoparalelo.












El de la tienda, que es un jodío de cuidado, te dice que ya no puede meterte una licencia OEM en la factura, que ésta ya está cerrada, por lo que tienes que pasar por caja comprando una Reail, que vale aproximadamente el doble. El tendero, que es una buena persona y entiende el tema (“Pensaba que ibas a meter Linix”, te dijo), modifica la factura y te vende una licencia del XP OEM, asociada a tu ordenador recién comprado.
Vuelves a tu casa emocionado con tu caja del XP, que sólo contiene un CD y un librito diminuto, aparte de unos papelajos en cartón que dicen “License”. Como eres un prisas, despegas la pegatina del número de serie y la adhieres a la caja del PC. Vuelves a tu casa emocionada con tu sobrecito transpartente del XP, que sólo contiene un CD y un librito diminuto, aparte de otro más que dice “License”. Como eres un prisas, despegas la pegatina del número de serie y la adhieres a la caja del PC.

Dado que los quarcks no son tontos, deciden volver a juntar las funciones de onda de las dos líneas espaciotemporales, para ahorrar tiempo de proceso y espacio en el continuum. 


Sacas el CD, lo metes en el lector, y reinicias. Mientras, te vas leyendo la licencia. Tu cara va cambiando de una amplia sonrisa a una no tan amplia para terminar bajando la comisura de los labios hasta conseguir un rictus de mala leche.


Bueno, no importa, te dices, todo eso son palabrerías de abogaduchos de mala muerte.


Terminas de instalar todas las cosas de tu ordenador. Te bajas las actualizaciones, metes todos los drivers, en fin, haces todo lo necesario para tener tu ordenador listo para funcionar. Y lo activas.


1.- Al cabo de dos días descubres que no va todo lo fino que debiera, de vez en cuando tienes una pantalla azul… Investigas y llegas a la conclusión de que te has instalado unos drivers del chipset de la placa base defectuosos… ¡Pero si eran los que venían en el CD! Pues nada, te bajas una nueva versión de la Web del fabricante, la instalas y detectas que hay algunos archivos que no se actualizan. La única opción que te queda es reinstalar Windows. Lo haces y ahora sí, ahora todo va como la seda.


2.- Pasan los meses y cambias la tarjeta de video por una más potente y mejor. Y te vuelve a ocurrir lo mismo que la vez anterior, teniendo que volver a instalarlo todo de nuevo.


3.- Te compras una PDA, instalas el ActiveSync y todo va como la seda, pero un día, mientras estás sincronizando se va la luz y ya no puedes volver a conectar, el ActiveSync se ha ido al garete nadie sabe por qué, y las reinstalaciones del programa no consiguen que éste funcione (es un caso real muy común). La solución es volver a reinstalar Windows.


4.- Compras un programa de terceros que te deja el ordenador echo unos zorros (léase Norton, Panda y similares). La única solución viable es la reinstalación.


5.- Como estás harto de que te pasen todas esas cosas, decides tener dos instalaciones del mismo Windows en el mismo ordenador, una en la que sabes que todo funciona correctamente y otra más en la que haces tus pruebas antes de tocar la anterior. Efectivamente, el sistema de Windows Update te deja tener dos copias instaladas de Windows en el mismo ordenador con el mismo número de serie, y el sistema de validación que determina si tu Windows es original funciona perfectamente.


6.- Ahora tus conocimentos de informática son bastante serios, tanto, que decides instalarte el Virtual PC o el Virtual Server, que Microsoft ofrece gratuitamente. Los instalas, y entonces te surge la duda sobre cómo van las licencias dentro de una máquina virtual. Buscas tu papel en el que está la licencia de uso de tu Windows y te lo vuelves a leer. Y descubres algo sobre instalaciones en equipos físicos, derchos de uso y garantías, pero nada sobre máquinas virtuales, equipos corriendo simultáneamente y cosas de esas, así que instalas tu copia de Windows en una máquina virtual, la activas (el sistema te deja), y luego la replicas todas las veces que quieras.


Y entonces llega Windows Vista. ¡Oh, qué bonito! Pero cobran una pasta por una licencia, aparte de que empiezas a leer por ahí cosas extrañas sobre el nuevo formato, que si sólo te van a dejar activar dos veces sobre el mismo equipo, o que si actualizas algo tendrás que volver a pasar por caja con el Sistema Operativo, y cosas así. Personalmente piensas que se trata de FUD (Fear Uncertainty Doubt), así que pasas de todo eso y esperas ardientemente que salga a la venta.


Pero en el ínterin tienes tus dudas, así que coges el teléfono, marcas el número de atención al cliente de Microsoft, y haces tus preguntas pertinentes… lo que te pone los pelos como escarpias. Tu preguntas y ellos responden… Las respuestas las veremos en el siguiente post de este blog.

Desarrollar bajo Linux y no morir en el intento (IV). Resumen y plataforma cruzada

Tras varios días trabajando con linux, y normalmente realizando tareas previas al propio desarrollo, he llegado a la conclusión de que este entorno, pese a las versiones y revisiones habidas y por haber, se encuentra verde, muy verde en cuanto a usabilidad y a facilitar las tareas de desarrollo.


Voy a resumir una serie de problemas sin resolver y luego explicaré mis pinitos en la instalación de un compilador para arm.


Bugs sin resolver



  1. Los teclados Microsoft no funcionan bien (hay teclas muertas).

  2. KDE tiene una buena cantidad de ellos, todavía pendientes. Entre los que me afectan personalmente, están:


    1. Cada programa tiene una combinación de teclas diferente para hacer tareas comunes, y en general las operaciones habituales tienen combinaciones complejas y en las más raras las combinaciones son más sencillas, y cuando las inviertes, generalmente la nueva combinación no funciona bien.

    2. Algunos programas desaparecen misteriosamente sin dejar rastro ni logs ni nada, a veces te sale la pantalla del error, y otras, simplemente, desaparece. Entre ellas destaca el K3b, programa destinado a la grabación de CDs y DVDs.

    3. Aunque el DCOP es toda una gozada en cuanto a envío de mensajes y control de aplicaciones, todavía está muy verde en el sentido de que, por ejemplo, las teclas multimedia se pueden asignar a una aplicación, pero no a la que en este momento se encuentre activa, de forma que en ese caso te tienes que casar con un reproductor de medios en concreto.

    4. Otros programas, pese a tener miles de opciones a cual más potente y bonita, son bastante deficientes. Ejemplo es el KNode, que no permite bajar cabeceras y cuerpos a una vez, de forma que en los servidores de noticias lentos es toda una odisea esperar y esperar mientras se baja el mensaje siguiente. Y el Akregator, por ejemplo, repite RSS por un tubo. El Konqueror guarda mal algunas claves de acceso (prueba con www.ogame.com.es). El sistema de cuentas/identidades/servidores del Kmail es una castaña, para cada cuenta tienes que configurar lo mismo en tres sitios diferentes…

  3. CUPS. Mejor no digo nada… Unas veces funciona, otras no. Unas veces te imprime una página con una calidad acojonante aplicando filtros y más filtros, y otras un simple texto se va a la cuarta dimensión. En fin.

  4. KDevelop. ¿Dónde está el equivalente del IntelliSense? Y la búsqueda integrada, je, la búsqueda integrada. Hemos vuelto a los tiempos del MS-DOS con poco más…

En fin, que hay muchas deficiencias y elementos por mejorar si quieren entrar en el mundo del escritorio.


Plataforma Cruzada


Ahora empezamos con lo interesante de verdad.


Voy a desarrollar para una placa ARMV9, un chip de Textas Instruments que ya he probado bajo Windows con unas características muy buenas, veremos cómo va con Linux.


El primer paso consiste en instalar un compilador de plataforma cruzada, lo ideal sería recompilar el gcc que tienes como compilador de sistema, pero eso quizás lo haga cuando la placa ya arranque y funcione, que va a costar. El motivo no es otro que asegurarme de que el compilador va a generar el código correcto y cuando las cosas no funcionen, lo hagan porque es mi código el que está mal y no el propio compilador…


Esto puede parecer ciertamente presuntuoso, pero gato escaldado del agua fŕia huye, y ya tuve mis tejemanejes con el gcc y los ColdFire y otros Motorola 68xxx, así que mejor vale prevenir que curar.


Bueno, como iba diciendo, el primer paso es instalar el compilador certificado… Hecho, en /usr/local/arm todos los binarios, y en /opt/buildroot has herramientas necesarias para crear el propio compilador… Como prueba de mi sistema, he intentado regenerarlo y no he podido por errores en el código fuente (más que nada, incompatibilidades entre mi 4.1.1 y el 3.2.1 del arm). Añado las líneas al path y listo.


Ahora toca bajar e instalar el toolchain y generar un linux que pueda meter en la placa… Tras descomprimir los 180 megas en el directorio src local a mi cuenta… fallamos al compilar porque se intentan cambiar los permisos de ciertos ficheros locales…


Empezamos bien, muy bien. ¿A santo de qué eso de cambiar permisos a los ficheros? Parece ser que quiere hacerlos root para luego pasarlos a una imagen binaria, que será la que se cargará en la placa… Un “su” y un “source .bashrc” solucionan el problema… para entrar en otro… El redboot con compila, me dice que “tail: cannot open `+2′ for reading: No such file or directory”…


De momento en eso estoy.