27 agosto 2004

De vuelta...

... pero poco a poco. Acabo de aterrizar en mi casa después de una semanita de vacaciones en Lanzarote, y después de revisar unos 300+ correos estoy listo para seguir.

El planning incluye dedicar la semana que me queda de vacaciones en trabajar para RaC: la conversión de un antiguo proyecto a .NET que os he comentado. Me ha dado tiempo a comenzarla en Lanzarote (sí, soy un workaholic, ¿qué pasa?) pero tendré que darme cera para tenerla a punto para el quince de septiembre, fecha que me he delimitado como de fin de proyecto. Seguro que me paso, como siempre, pero este cliente parece comprensivo y sin prisas.

En cuanto a este blog, pues deciros que seguirá un tiempo (espero corto) parado mientras sigo traduciéndolo y publicándolo en inglés en Blogger. En cuanto tenga ambos blogs al día, seguiremos hablando de código .NET,... y muy pronto de Java, aunque en ese caso desde la perspectiva de un novato total. Espero no decir muchas burradas.

Un par de fotillos:
Playa Blanca, Lanzarote

La maravillosa Playa Blanca de Lanzarote. Volveré, seguro.

Código de retorno 0

Yo, disfrutando (no me emociona el alcohol, precisamente) de un Tequila Sunrise.

09 agosto 2004

Timado

Pues sí: se confirman mis peores presentimientos y el mamón de Bryan (mi cliente de RaC) se escaquea de pagarme los míseros $250 dólares de mierda que le pedía por el pedazo de aplicación web que se ha llevado, y se queda con él pastel por unos míseros $75. Eso sí, le he puesto a caer de un burro en el rating. Como no tengo ganas de seguir encendiéndome la sangre con esta soplapollez, copypasteo:


This buyer has, quite simply, deceived me. My initial bid for him was $150, but he told me it was too high. I told him that I really wanted to do the job and that I was willing to make a bid of $75, but that he was going to give me an aditional $75 bonus when the web application was up, running and giving him some money. My fatal mistake was to propose this via a MSN chat, instead of Rent a Coder's bidding system.
After that, he made a lot of modifications to the interface design, database design, and what the application can do: from a simple candle selling website it became a full-fledged application with email sending capability, rich text editing, users handling, database and content manipulation and so on.
After all that modifications were done or in the works (not before making it, I'm that dumb) I asked him for an aditional $100, to make the total $250. He didn't reply anything, so I thought it was okay with him. I finished the application, uploaded and set it on his server, gave him the source code and helped him with a configuration problem on his computer. And then I waited for him to accept the work as 100% complete, to no avail. I waited for a month.
On another previous project, this guy put me a '1' rating because he couldn't contact me for a week. In this very project, this guy started an arbitration because I told him that I was moving to another country because of work and maybe it was impossible for me to finish it, after all it was only 98% completed. And he put this in arbitration a whole day after I told him the news. Really patient.
And after a month of waiting for him to accept the project (and after seeing him evade me on MSN, and knowing he was logging to RaC and attending other bids except mine), I can't stand it anymore and I put it on arbitration. His response? to accept the work as 100% complete and pay me... my initial bid of $75. When I remind him of our arrangement, he doesn't even take the time to reply me. So this guy now has a full-fledged, complete and working web application for the money I spent in cigarettes last week.
Yes, it's my fault and I've learned my lesson. Learn from my experience, guys, and never, ever make an arrangement with any customer (it doesn't matter how well you think you know them) outside RaC's site. If you do and things go wrong, it's their word against yours, and RaC's facilitators and arbitrators cannot do anything about it. It's that simple.


Qué hijo de puta.

Por cierto, perdonad mi francés, pero es que estoy cabreado como una mona.

¿Hacia un cambio de rumbo?

Hoy me ha cogido mi director técnico por banda y me ha llevado a una reunión, así, un lunes de buena mañana y sin avisar.

El caso es que no me había visto trabajar antes (siempre he estado en clientes), pero dice que le gusta mi forma de trabajar, de investigar y de desarrollar, que soy proactivo, lo que viene a decir que curro como un negro, pero en palabras bonitas. Y supongo que eso es lo que quieren: un tío dispuesto a currar en horas de oficina, fuera de horas de oficina, en fines de semana, hasta dormido. Hay que joderse. Proactivo.

El caso es que lo que me ha ofrecido no está mal: puesto fijo en la oficina, me sacan del rooster de técnicos destinables a clientes y paso a formar parte del equipo de desarrollo in-house para proyectos externos e internos, pero sin ir a cliente.

¿Y haciendo qué? Pues si salen proyectos en .NET, pues eso. Si no (y por ahora es que no, cosa que no entiendo), pues tengo que ir migrando a Java. De momento me voy de vacaciones el viernes que viene y para cuando vuelva en septiembre me degradan a programador junior, porque en Java es lo que soy (bueno, más bien soy un becario) y hala!, embarcado en un proyecto de ocho meses.

Así que no os asustéis si de aquí a unos meses empiezo a hablaros también de JDKs, y del Eclipse, y de JDBCs y demás rollos.

Virgencita, virgencita,...

08 agosto 2004

Varias cosas

Aquí tenéis el blog de LukeH, uno de los desarrolladores del C# Express Edition. No tiene muchos posts, de momento, pero para irnos enterando de qué tenemos disponible y de qué no tenemos disponible en esta edición, es suficiente.

Sobre lo del precio, la verdad es que no sé qué pensar: he leído a personas diciendo que iba a ser gratix total y he leído a otras diciendo que va a ser fácil de comprar, lo que viene a decir que serán las nuevas licencias de estudiante que solía vender Microsoft de sus programas. En cuanto sepa algo os lo digo.

En otro orden de cosas, al final he tenido que ponerle un arbitrio a mi penúltimo cliente en RentACoder: el tío se está haciendo el sueco de manera descarada. El viernes entré un momento en MSN Messenger, lo ví como en línea y cuando iba a abrir una ventana para hablar con él, ya se había largado. Cuando pregunté a uno de los trabajadores de RaC qué pasaba con este tío, me dijo que se había logado al sistema ese mismo día y había estado haciendo otras movidas. Vamos, que desaparecido no está: no es que haya naufragado, o su ordenador se haya jodido, o que se haya vuelto monje budista. Se está escaqueando para no pagar.

06 agosto 2004

VS 2005 Express Betas

Aquí os podéis descargar las versiones Beta Express de los distintos lenguajes de la próxima edición de Visual Studio, la .NET 2005. Según Alex Yakhnin en su blog, el IDE Express puede que sea completamente gratuito. Lo que honraría a Microsoft hasta extremos insospechados,... y quitaría muchas razones a mucho bocazas.

05 agosto 2004

Resaca

Bueno, hoy ha sido un día interesante en el trabajo. Por un lado, y a pesar de estar todavía de resaca por los excesos mencionados en el anterior post, he descubierto algo interesante y he usado algo que hasta ahora no había tenido oportunidad de hacer. Os explico.

El programa para el cliente PDAs requiere que ciertas funcionalidades se realicen después de girar el escritorio: al ser una aplicación móvil, a alguien más inteligente que yo se le ocurrió durante el diseño el poder girar el escritorio para poder ver las aplicaciones en formato horizontal o vertical. Hacer esto con un monitor es complicado, pero con la PDA es un simple giro de muñeca. El caso es que el fabricante de las PDAs que estamos utilizando (Gotive) nos ha proporcionado (no es para menos, teniendo en cuenta el precio de cada uno de los cacharritos y la cantidad que hemos comprado) amablemente el SDK, en forma de un sólo archivo DLL, que han desarrollado para sus clientes.

Echándole un vistazo a la ayuda de ese SDK, me doy cuenta de que es poco más que un wrapper para las funciones de la API de Windows CE. Un wrapper bastante completo, la verdad, porque incluye funciones para manejar la orientación de pantalla, la retroiluminación de la misma, la lectura de códigos de barras mediante el lector integrado, etc. De todas esas funciones, yo sólo quería usar la que cambia la orientación de pantalla y la que obtiene la orientación de pantalla actual. ¿Cómo podría yo llamar sólo a esas funciones y obviar el resto del wrapper? La respuesta: ILDASM.

El ILDASM es una herramienta de Microsoft, incluida en VS .NET 2003 (aunque creo que también estaba incluida en .NET 2002) que nos permite descompilar un fichero .EXE, .DLL, .OBJ o .LIB creado con .NET. Ojo, todos quietos. No os va a proporcionar el código fuente de nada. Lo que hace es extraer de un archivo compilado el lenguaje intermedio de Microsoft, o MSIL, y mostrarlo en pantalla o en un archivo.

Pongamos un ejemplo: éste es un código vergonzantemente simple, para escribir en la pantalla "Hola, Mundo!" 5 veces:



namespace Prueba
{
class HolaPesao
{
[STAThread]
static void Main(string[] args)
{
for(int i=0; i<5; i++)
{
Console.Write("Hola, mundo!!\n");
}
Console.Write("Pulse cualquier tecla para terminar\n");
Console.ReadLine();
}
}
}


Generamos la solución para obtener un fichero .EXE, en este caso, y luego abrimos la consola de .NET. Nos dirigimos al directorio donde tengamos el exe y escribimos ildasm <nombre_archivo> donde nombre_archivo será el nombre de nuestro compilado. Obtenemos la siguiente ventana:







En ella podemos apreciar cómo a partir de un prueba.exe, tenemos un espacio de nombres llamado Prueba, que a su vez contiene una clase llamada HolaPesao, con un método Main() que es el que nos interesa. Si hacemos doble clic en el método Main() obtenemos una ventana con el siguiente chorro de código:



.method private hidebysig static void Main(string[] args)
cil managed
{
.entrypoint
.custom instance void
[mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// Code size 39 (0x27)
.maxstack 2
.locals init ([0] int32 i)
IL_0000: ldc.i4.0
IL_0001: stloc.0
IL_0002: br.s IL_0012
IL_0004: ldstr "Hola, mundo!!\n"
IL_0009: call void [mscorlib]System.Console::Write(string)
IL_000e: ldloc.0
IL_000f: ldc.i4.1
IL_0010: add
IL_0011: stloc.0
IL_0012: ldloc.0
IL_0013: ldc.i4.5
IL_0014: blt.s IL_0004
IL_0016: ldstr "Pulse cualquier tecla para terminar\n"
IL_001b: call void [mscorlib]System.Console::Write(string)
IL_0020: call string [mscorlib]System.Console::ReadLine()
IL_0025: pop
IL_0026: ret
} // end of method HolaPesao::Main

Como veréis no es que sea un código muy claro pero algo se puede averiguar.

Bueno, teniendo en cuenta esta breve disgresión sobre el des-ensamblador de Microsoft, vuelvo a lo mío. Abrí el fichero DLL que contiene el SDK de nuestra PDA (os acordáis, ¿verdad?) y hago doble-clic sobre el método SetRotation pues mi intuición ;-) me dice que ese método puede tener algo que ver con lo que quiero hacer, que es rotar la pantalla. Y me encuentro con que el código MSIL hace una obvia llamada P/Invoke a una función API contenida en la DLL lcdapi.dll. API que, por cierto, no sale en Google; pero por suerte su firma es bastante sencilla, y el P/Invoke viene a ser algo como sigue:



[DllImport("lcdapi.dll")]
static extern bool GLCDSetRotation(int Degrees);

Muy sencilla. Y voilá, gracias a esto me he ahorrado 52 Kbs de fichero DLL superfluo, extrayendo la función que necesito mediante el des-ensamblado de una DLL de fabricante que es un wrapper y nada más. La función me ha dado algún problema muy curioso (¿y qué funcion no da problemas en .NET CF?), pero de eso os hablaré mañana, cuando lo haya solucionado.

Nota importante: este artículo, y los venideros que tengan código fuente, ha quedado así de bonito gracias a Jean-Claude Manoli y su estupenda herramienta on-line para formato de código fuente en C#, el c# code format. Al César lo que es del César.

De vuelta al tajo...

Después de unos días sin publicar nada, heme aquí de nuevo en el tajo.

El proyecto de la PDA está finalizado al 90%, ya está implantado en el cliente y sólo quedan ciertos retoques por hacer. Eso sí, su trabajo ha costado. Mi parte de horas este mes va a ser la risa: el pasado lunes trabajé trece horas y media y el martes la friolera de 24, como la serie de TV. A cambio y como compensación, no trabajé ayer: más que nada porque no creo que hubiera sido muy útil para nadie roncando encima del teclado o deambulando como un zombie por los pasillos.

En fin, el caso es que ahora puedo dedicarme a este tema con más tranquilidad: el cliente ya tiene soft (y hard, nosotros les proporcionamos también las PDAs de combate) con las que trabajar. Por cierto, he terminado por cogerles cierto cariño a estos mamotretos: y sobre todo mucho, pero que mucho agradecimiento a que vengan de serie con el Windows CE .NET, lo que hace que traigan el Compact Framework (CF, para los amigos) de serie. Por lo tanto, se permiten las instalaciones estilo XCopy: sencillamente, se copia el ejecutable (y las DLLs que se puedan necesitar que no sean parte del Framework) al directorio destino en la PDA y listo.

La espina que tengo clavada es el tema del login: dos semanas dedicado a ello (sin resultados visibles) para que al final no hiciera tanta falta porque resulta que cada usuario tendrá su propia PDA, lo que significa que pueden personalizar los aparatos con su identificación de red y todo el pastel. Si hubiera dedicado mucho más tiempo al resto de la aplicación hubiera quedado mucho mejor. Del resto, lo destacable es la rutina que se encarga de rotar la orientación de la PDA, la rutina que carga desde un XML los botones que cada usuario tendrá disponibles en la aplicación, y los propios botones: tuve que hacerlos como controles de usuario personalizados porque la versión actual del CF no permite controles con cambios de color, ni de apariencia, ni de nada. Me ha comentado Paul Yao que la próxima versión del CF traerá muchas características mejoradas, los controles una de ellas y otra de ellas la mejora del P/Invoke.

Que ya iba haciendo falta, por cierto. Pongámonos en situación: el P/Invoke (o Platform Invoke del que ya he hablado en entradas anteriores es como se llama al conjunto de técnicas para manejar código no administrado desde el código administrado; o en otras palabras llamar a la API. Es decir, lo que se lleva haciendo de toda la vida en Visual Basic pero más complicado.

Generalmente, cuando se programa una aplicación de escritorio en Windows llamaremos a la API en contadas ocasiones para que nuestro programa realice funciones muy concretas. En cambio, en aplicaciones de Compact Framework descubriremos muy pronto que hay que llamar a la API de la máquina para hacer casi cualquier cosa. Por ejemplo, si queremos que nuestra aplicación ejecute otras aplicaciones o procesos: API. Si queremos que nuestra aplicación se ejecute siempre la primera en el orden-z y nunca sea tapada por otra aplicación: API. Si queremos destruir una aplicación: API. Y un largo y doloroso etcétera de ejemplos.

Es lógico, si nos paramos a pensarlo. Hay un montón de funcionalidades del Framework normal que no están incluidas en el Compact Framework, por una razón muy simple: espacio. Entonces, realizar funciones que serían muy sencillas de realizar en Framework se convierte en una tarea muy complicada con CF, ya que esas funciones no están incluidas.

Por lo tanto, parece lo más lógico del mundo pensar que los programadores de .NET CF estarán mucho tiempo llamando a APIs.

Por lo tanto, parece lo más lógico del mundo pensar que los programadores de .NET CF estarán mucho más tiempo realizando código P/Invoke.

Por lo tanto, parece lo más lógico del mundo dejar las funcionalidades de P/Invoke en el Framework intactas en el CF, o incluso mejoradas para .NET CF. Al fin y al cabo, hacen más falta.

Pues no.

Estás también recortadas. Y esto es lo que no entiendo: no creo que ocuparan tanto como para hacer que su inclusión completa engordara tanto el peso final del .NET CF. Es otra de las decisiones de diseño de Microsoft que no se entienden. Pero en fin, me ha asegurado Paul Yao (y él está en el ajo) que dicha funcionalidad P/Invoke aparece completa (o, al menos, muy mejorada) para la próxima versión de Visual Studio .NET, la 2005. Ya veremos que entienden los muchachos de MS por muy mejorada.