martes, 26 de agosto de 2008

Una de debuggers

Ayer lunes instalé en mi equipo del trabajo el Visual Studio 2008 Professional por aquello de que los productos de M$ hay que instalarlos SOLO cuando ha salido al menos el SP1 y ha ido todo como la seda, de hecho lo noto más fluido que el 2005, aunque debo matizar que lo que yo utilizaba hasta ahora era el VWD Express 2005 y el Visual C# 2005 Express. Es una buena noticia sin duda, quiere decir que se está apoyando oficialmente (aka, "con pasta") el desarrollo para .NET en mi empresa.

Bien, el caso es que ni quiero ni puedo renunciar tampoco a mi vetusto y querido Delphi 7, por lo cual esta mañana lo he arrancado para trabajar con una igualmente vetusta aplicación Win32... y oh sorpresa, me ha salido un mensajito que nunca me había salido usando el VWD o el VC# Express (luego me enteré que era precisamente por ser las versiones Express), un mensajito que hacía referencia al jitter o Just-In-Time Debugger que Windows tenía registrado por defecto.

Pulsa en la imagen para ver la original

El caso es que ante la duda, la más tetuda opté por permitir al debugger de Borland registrarse para que hiciese su trabajo correctamente. Pero claro luego me puse a pensar "y si luego VS se me queja?", "y si luego no va bien la depuración?"... y la pregunta más terrible: "¿¿y ahora cómo hago para volver a registrar el depurador de VS??".

"Bueno, no nos alarmemos, vamos a probar a ver.", pensé. Cerré el Delphi, arranqué Visual Studio... no se quejó (en este punto no sé si habría preferido que lo hiciera). Cargué el proyecto Web en el que trabajo, pulsé F5... Albricias, arrancó majestuosamente. Como sabía que tenia un par de bugs sin corregir que más que bugs parecían cocodrilos, me fui hacia esa parte de la aplicación y la hice petar. Todo perfecto, los mensajes de error eran los que deberian ser, el volcado de pila de llamadas era correcto... OK. Pongamos pues un par de breakpoints y démosle al Paso a paso... Impecable, el debugger funcionaba a la perfección.

¿Habría restaurado VS2008 el setting del debugger que utiliza, él solito? Pues no, porque al volver a arrancar Delphi, no se quejó. Cáspita.

Decidí pues preguntar a la Fuente De Toda Sabiduria. Me encontré con una página en alemán de la que no entendía ni torta, pero que arrojaba luz sobre mis tinieblas. Al parecer, en el Registro de Windows hay DOS entradas relativas al depurador que Visual Studio utiliza, que son éstas:

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger

HKLM\SOFTWARE\Microsoft\.NETFramework\DbgManagedDebugger

... de lo cual deduje, acertadamente como no podía ser de otra manera, que el primero es el relativo al debugger en modo Win32 nativo. Lo cual explicaría que VS me hiciese correctamente la ejecución Paso a Paso del programa, y a su vez Delphi también funcione correctamente, ya que la versión 7 de Delphi compila exclusivamente para Win32 (sí ya sé que en teoría no es del todo cierto pero en la práctica así es, además, ¿quién puede querer compilar para una beta de la version 1.0 de .NET?).

Haciendo una nueva búsqueda llegué a este artículo de la MSDN Library (nunca me cansaré de decirlo: Qué maravilla) en la cual ya se explica todo en detalle, incluido el proceso para habilitar o deshabilitar, desde el propio IDE de Visual Studio, las opciones de depuración Just-In-Time.

Yo he pensado que lo voy a dejar tal como lo tengo ahora mismo: Para código manejado el depurador de .NET, y para código nativo el de Borland CodeGear Embarcadero.

jueves, 21 de agosto de 2008

Tristeza.



A poco más de 24 horas de uno de los peores accidentes aéreos ocurridos en España, quería simplemente enviar desde estas humildes líneas, un afectuoso abrazo y mis más sinceras condolencias a las familias de las víctimas, abrazo que también quiero hacer extensivo, junto con mis mayores deseos de pronta recuperación y mi alegría, a los supervivientes y también a sus familias.

No quería poner aquí fotos ni ningun otro material audiovisual que pudiese contribuir a aumentar el dolor de quien viniese a leer estas líneas, entre otras cosas porque no es el cometido de este blog, y además hay suficiente material gráfico en muchas otras webs, sobretodo de periódicos y otros medios de comunicación. Sin embargo sí quiero poner un link a un vídeo que, sin mostrar víctimas, ni heridos, ni trozos de fuselaje calcinado, ni decenas de camiones de bomberos y ambulancias, sino solamente humo, me ha encogido el corazón y me ha parecido particularmente dramático: aqui. Es un video grabado escasos segundos después del accidente.

Y no voy a decir nada más. No es el momento. Sólo reiterar lo ya escrito en mi primer párrafo.

martes, 8 de julio de 2008

El sambenito de los informáticos

Esta tarde, a un compañero le ha sonado varias veces el teléfono móvil, y cuando iba ya por la cuarta llamada (no ha cogido ninguna, se limitaba a silenciarlo) tira el móvil encima de la mesa, mascullando "pero qué tio más pesao". Intrigados hemos preguntado que quién era, y nos ha respondido "No, no es de la empresa, es uno que me tiene frito".

Instantáneamente le he dicho "a que sé quien es: Un amigo/conocido/familiar/(ponga aqui el vínculo) que quiere que hagas de soporte técnico informático gratuito de Microsoft" (AKA "oye esto no va"). Y efectivamente, cómo no, se trataba de una persona que respondia a esas características.

Lo cual me hizo recordar que el otro día se casó una pareja de amigos nuestros (realmente de mi mujer, vaya) y tras la ceremonia y mientras llegaba la hora de asistir a la pantagruélica posterior comilona, nos sentamos en una terracita a tomar unas 'birricas'. Y el caso es que estando ya sentados, el marido de otra amiga de mi mujer se gira hacia mí y me dice: "Oye, esto, a ver si me puedes ayudar, es que resulta que el portátil se me ha muerto..."

Sí, sé que todos, TODOS los que nos dedicamos a la informática, somos víctimas de amigos, parientes, conocidos, vecinos y demás categorías humanas, y TODOS acabamos "arreglando", o como mínimo guiando y asesorando a esos pobres seres infelices. Seguro que todos tenemos en la memoria alguna (o algo más que sólo "alguna") tarde en la que hemos ido a casa de alguien para hacer cualquier "tontería que no va a llevar más de 10 minutos"... y nos han dado las 3 de la mañana. Por lo menos en muchos casos se nos "pagaba" invitándonos a cenar una Telepizza, pero eso está bien cuando eres soltero... Cuando tienes mujer y crío la cosa cambia y los "desplazamientos al cliente" se hacen más complicados aparte de que ya no tienes ganas de tener que ir a la otra punta de la ciudad (dicho sea de paso, no sé hasta qué punto hay que dar las gracias a quien inventó el VNC y herramientas similares... ahora ya no tenemos que desplazarnos, pero es que ello implica que ya no tienes excusa para no "ayudar"). Pero bueno, que da igual; cada vez que te cruzas con alguien que sabe a qué te dedicas, te toca escuchar. Hemos de aceptarlo. Es nuestro sino, es nuestra cruz. Un momento: ¿Nuestra cruz? ¿Pero, qué hemos hecho para tener que cargar con ella? Es más, ¿Por qué aceptamos cargar con ella? ¿Acaso si fueses médico te dirian "Oye tú sabes qué son estas manchas que me han salido aqui debajo del escroto"? ¿Será verdad lo que nos dicen cuando intentamos resistirnos: "Venga, pero si a ti esto te mola, que disfrutas como un enano"? ¿Y por qué siempre acabamos accediendo? ¿Somos masoquistas? ¿Somos demasiado buenos, o demasiado inocentes? ¿Somos gilipollas (y los demás lo saben)?

Si tú, hipotético lector, tienes alguna anécdota al respecto que piensas que vale la pena, coméntala. Desahógate. :)

jueves, 3 de abril de 2008

To Bug || !To Bug

Me acaba de ocurrir una cosa un tanto extraña: Estaba trabajando con una hoja Excel (2007) y en esto que me llega un correo al Outlook (2007), con un adjunto que era otro Excel. Bien, lo abro...

Y espero...

Y sigo esperando...

Pasa un minuto...

Qué raro. Bueno a ver si es que no le he dado bien el doble clic, pero no porque me ha salido el diálogo preguntando si quería Abrir o Guardar. En fin igual se me ha ido la olla y le he dado donde no debía. Vuelvo a abrirlo.

Y vuelvo a esperar...

Pasa otro minuto...

Se queda el PC "pajarito"...

Ya mosqueado empiezo a mascullar entre dientes, "Este antivirus de las pe*otas, cuando tendremos un antivirus decente en la empresa, no espera esto va a ser el Desktop Search este nuevo..."

Total que me fijo, no sé por qué, que la Hoja Excel en la que estaba trabajando, está en edición en una celda. No sé cómo se me enciende la bombilla y pienso: "No puede ser". ¿Que no puede ser? Al instante siguiente que salí del modo Edición, se abrió como un rayo el fichero del correo.

Realmente, me parece que esto no es de recibo. ¿Cuánta gente habrá que le pase lo mismo? ¿Y cuántos no acertarán a imaginarse que la culpa de que su equipo entero se quede "trinchado" (vamos, que ni el Explorer -el shell- responde) al abrir dos hojas de cálculo, la tiene una simple celda de una de ellas, que está en edición?

Lo que no recuerdo, es si usando las versiones anteriores de Office, me habrá pasado alguna vez lo mismo... ¿Alguien tiene por ahí instalado aún el 2003, o el 2000, y lo puede comprobar?

miércoles, 5 de marzo de 2008

Patterns & Practices

Hacía ya tiempo que no me pasaba por la seccion de Patterns & Practices de la MSDN, y la verdad me he sorprendido gratamente. Empezando por la propia portada, mejorada estéticamente y con mucho contenido añadido, como videos por ejemplo.

Hay cantidad de material nuevo, incluyendo Software Factories para Web Clients y Web Services ya orientados específicamente a VS2008... y la documentacion es, al menos por lo que he podido ver, de buena calidad y extensa. Sin embargo la verdadera sorpresa me la he llevado al entrar en el Catálogo completo y encontrar, en un prometedor apartado titulado Improving .NET Application Performance and Scalability que el documento que acompaña al tema y que es de libre descarga (como la práctica totalidad de documentacion de P&P), tiene la friolera de ¡¡MIL CIENTO CINCUENTA PÁGINAS!!

Es decir un "libraco" enorme, GRATIS y lleno de información útil, como Checklists y How-Tos destinados a que mejoremos de la mejor manera posible la Escalabilidad y el Rendimiento de nuestras aplicaciones.

Hay cosas de Microsoft que me gustan más, otras menos, otras mucho menos... pero ésta que os cuento hoy, es de aquellas que me hacen exclamar un sincero: Chapeau, Microsoft!

lunes, 7 de enero de 2008

¿Es esto legal?

O como mínimo, ¿es esto ético?

Resulta que quería yo mirar si había alguna actualización para mi cliente de correo, Thunderbird (anda! ¿Pero qué hace un fan de Micro$oft utilizando software Libre? Pa que veáis xD) y no recordaba el enlace a la página (si, si, mozilla.org, ya, pero yo quería algo más "directo") y me dije "bueno, a ver si tiene esta gente dominio .es" y...

Bueno mejor será que veais vosotros mismos lo que ocurre al irnos a mozilla.es.

Mi pregunta, para quien entienda de estos temas y tenga a bien responder, es la siguiente: ¿Es esto denunciable ante algún organismo? ... pero aún más intrigante sería preguntarse ¿la fundación Mozilla sabe esto? ¿Han hecho algo al respecto?

viernes, 28 de diciembre de 2007

Microsoft ficha a Richard Stallman

Aunque hace varias semanas que el rumor saltó a la blogosfera, hoy han confirmado la noticia en una rueda de prensa conjunta: a partir del próximo 1 de enero Stallman formará parte de la plantilla de Microsoft en Redmond.

La nota de prensa publicada por Microsoft recoge, textualmente, los siguientes párrafos:

"Microsoft siempre apuesta por el talento, y Richard Stallman es uno de los más reputados ideólogos del mundo del desarrollo del software."
[...]
"Sin duda, se trata de una de las incorporaciones más importantes a la compañía de los últimos años, por lo que no hemos escatimado en recursos. Las negociaciones las han llevado a cabo directamente Gates y Ballmer, los dos máximos directivos, lo que demuestra la magnitud de la apuesta estratégica que se está llevando a cabo"

Por su parte, Richard Stallman, que nunca ha destacado por su aprecio a la multinacional, justifica la decisión en su blog:

"En realidad nuestras posturas nunca han estado muy alejadas, aunque veíamos las cosas desde perspectivas diferentes. Microsoft, al igual que GNU y el conjunto del movimiento Open Source, pretende hacer llegar el software a todo el mundo y hacer que sea un bien universal."
[...]
"Hay más puntos en común que diferencias, sólo era cuestión de sentarnos y dialogar sobre hacia dónde podíamos caminar juntos"

En principio Stallman encabezará una nueva división en Microsoft destinada al análisis y evaluación de soluciones de software libre para el segmento SOHO (Small Office, Home Office) y grandes corporaciones, así como a dirigir la adaptación de ciertos componentes del microkernel de Linux a Windows Server 2012 (codename "MindBreaker"), que se lanzará al mercado en unos años y del que ya están disponibles vía MSDN algunos whitepapers y documentos muy muy preliminares.

Este movimiento forma parte de la estrategia de acercamiento de Microsoft al mundo del software libre, como se lleva viendo algún tiempo. Los acuerdos entre Microsft y Novell, la publicación del código fuente de .NET Framework y la gran cantidad de líneas de actuación que están promoviendo así lo demuestran.

Y por cierto, se dice que el próximo en la lista de Most Wanted People de Microsoft y con el que hay conversaciones bastante avanzadas (de nuevo, pues ya las hubo hace tiempo) es Miguel de Icaza, líder del proyecto Mono, aunque él todavía no ha declarado nada al respecto. Otros en la lista son el mismísimo Linus Torvalds, creador del primer núcleo de Linux, firme candidato a liderar el área de arquitectura de servidores y servicios, y Vinton Cerf, considerado el padre de internet, para el puesto de Technical Chief Developer de la línea de productos Internet Explorer.

Habrá que esperar para ver a qué conduce esta reorientación en la estrategia que se viene observando desde hace unos meses, y sobre todo en qué se traduce la fiebre por los fichajes de figuras del mundillo. El tiempo lo dirá.

Publicado en: http://www.variablenotfound.com/.

lunes, 19 de noviembre de 2007

Descarga VISUAL STUDIO 2008 YA!

Por fin ha llegado el día. Ya es oficial:

¡Visual Studio 2008 ya está aquí!

Aquellos afortunados que disponen de una cuenta de suscripción, pueden ya descargarse la RTM de VS2008 (por lo visto hay algunos problemas de disponibilidad porque básicamente la gente está masacrando los servidores (si es que somos unos ansias xD).

El común de los mortales podemos conformarnos con las versiones Express (que salvo algunos detalles nos permiten desarrollar prácticamente las mismas aplicaciones que haríamos con la version Professional) o bien evaluar alguna de las versiones de prueba.

Eso sí, si nos descargamos hoy alguno de estos productos, tiene que ser, de momento, en inglés. De todas maneras es una noticia muy esperada por la comunidad de desarrolladores.

Así que como dirian en un conocido programa: ¡¡AL TURRON!!

martes, 16 de octubre de 2007

Código fuente de .NET, disponible!

Pero, como comprenderá el lector, no todo iba a ser la presentación de 'Junior'. Cierto, por sí solo es un acontecimiento muy digno. Pero hay que llenar el blog con 'chicha', que ha pasado muucho tiempo. Pues... érase que se era, hace cosa de dos semanas, en el blog de Scott Guthrie (ScottGu para los amigos), se publicaba una noticia bomba:

¡El código fuente de las librerías de .NET va a ser liberado!

¡Sí, es cierto! ¡Microsoft, la Innombrable, la Encarnación del Mal, la Personificación del Lado Oscuro, dejándonos ver "sus tripas"!

Aunque claro, aquí viene la particularidad (es que si no, no sería Microsoft xD): El código fuente nos lo ceden bajo el precepto "mirar es bueno, tocar es malo". Es decir, NO podemos, en principio, modificar el código fuente, sólo podemos verlo para, por ejemplo, facilitarnos el debugging de nuestro código. No parece probable, de todas maneras, que un fragmento de código te vaya a 'petar' dentro de un método de la propia librería de clases, pero sí puede servir, supongo, para saber por qué realmente nos peta a nosotros ese fragmento de código, para ver qué hace ese método con el parámetro que le hemos pasado y por qué nos lo ha devuelto hecho unos zorros, el muy cabr*.

Esto tiene además una ventaja adicional, que es la misma que tienen los desarrollos basados en código abierto: al haber miles, o millones, de ojos que van a poder ver tu código, va a ser muchísimo más fácil (y rápido) cazar los (pocos) bugs que aún queden en el código de la Librería, así como ayudar a mejorarla proponiendo algún cambio u optimización en apartados concretos.

Ah y no es por ser pesadito, pero con Delphi ya teníamos los fuentes de toda la Librería de Clases (BCL/VCL) a nuestra disposición para consulta. Y modificación (JEJEJE) pero la aventura que representaba recompilar TODA la VCL (y no morir en el intento), daría para un blog entero. ;-)

Re-Reloaded (pero con motivo)

Casi un año. Prácticamente nueve meses, para ser exactos.

El 19 de enero publicaba mi, hasta hoy, último 'post' en este blog. Demasiado tiempo. Las estadísticas de StatCounter indican, no obstante y para mi sorpresa, que se ha mantenido un mínimo número de visitas. Espero que, al menos, esas visitas hayan encontrado lo que buscaban, y que les haya sido de utilidad.

El responsable máximo de esta mi prolongada ausencia, no es otro que este personajillo:




Sí señores, aquí presento "en sociedad" a mi primer vástago (biológico al menos, como buen desarrollador yo casi considero "hijos" a mis programas, jeje), el cual nació exactamente 6 días antes del mencionado último post, es decir, el 13 de enero. Podrán imaginarse mis hipotéticos lectores que dicho personajillo ha mantenido copados los recursos y el tiempo de proceso de este servidor a un 100% casi constantemente (estuve prácticamente a punto de alcanzar el don de la ubicuidad, o dicho en "nuestro" lenguaje, la multitarea real, pero desgraciada o afortunadamente, no lo he llegado a conseguir).

Pero como la parte más dura ya ha pasado y ahora el chiquitin ya casi es "independiente" (en el sentido de que no hay que estar con él las 24 horas, por ejemplo ya es capaz de entretenerse él solo durante un buen rato) puedo arañar tiempo para dedicarme a otros menesteres: Este fin de semana me he echado un par de partidillas a la 'demo' del FIFA 2008 por ejemplo. Vuelvo a saber lo que es el OCIO! :-)

viernes, 19 de enero de 2007

Eficiencia y eficacia en el código

O bien, ¿Qué es más rápido (y eficiente): Te llamo por tu nombre, o busco de qué familia eres?

Tengo un antiguo proyecto que comencé en .NET 1.1 y que tenía abandonado. Ahora que ya sé más cosas de la plataforma, quiero retomarlo y forrarme como un cerdo cuando lo venda. Pero lo voy haciendo con calma y mirando con cariño el código.

Una de las cosas que he mirado es la creación y gestión de ventanas MDI. Yo provengo del mundillo de Delphi y seguramente haga muchas cosas en .NET como las haría o hacía en Delphi (igual de bien o igual de mal xD). El caso es que para la gestión de los MDIChild, una de las formas de controlar que no creas más de una instancia de un form determinado, es recorrerte los forms abiertos comprobando a qué clase pertenecen sus instancias. En .NET se puede hacer así, o se puede hacer comprobando el nombre que se le dió a la instancia cuando se creó (lo cual se me antoja mucho más sencillo y más "lógico").

Veamos dos fragmentos de código:


... código anterior...

// Verificaremos si está creado el formulario.
bool vExist = false;
int i = 0;
// Recorremos la lista de MDIs a ver si alguno es el que buscamos.
while ((i < this.MdiChildren.Length) & (!vExist)) {
if ((Form)this.MdiChildren[i] is AfrmRejillaClientes) {
vExist = true;
((AfrmRejillaClientes)this.MdiChildren[i]).WindowState = FormWindowState.Normal;
}
i++;
}
// Si NO lo hemos encontrado...
if (!vExist) {
AfrmRejillaClientes frmRejClientes = new AfrmRejillaClientes();
frmRejClientes.MdiParent = this;
frmRejClientes.Show();
}

... código posterior...


Como se puede ver, estamos utilizando el comprobador 'is' para verificar que el tipo del formulario que estamos comprobando (nótese el cast al tipo Form sobre el objeto 'this') sea el que hemos indicado. La otra forma de hacerlo es comprobando el nombre de la instancia:


... código anterior...

// Verificaremos si está creado el formulario.
bool vExist = false;
int i = 0;
// Recorremos la lista de MDIs a ver si alguno es el que buscamos.
while ((i < this.MdiChildren.Length) & (!vExist)) {
if (((Form)this.MdiChildren[i]).Name == "AfrmRejillaClientes") {
vExist = true;
((AfrmRejillaClientes)this.MdiChildren[i]).WindowState = FormWindowState.Normal;
}
i++;
}
// Si NO lo hemos encontrado...
if (!vExist) {
AfrmRejillaClientes frmRejClientes = new AfrmRejillaClientes();
frmRejClientes.MdiParent = this;
frmRejClientes.Show();
}

... código posterior...


Una cosa curiosa es que yo pensaba que había que utilizar el método '.ToString()' y no la propiedad '.Name'. Pero bueno la cuestión es otra: ¿Cuál de las dos formas de escribir este código es más eficiente? Mi primer pensamiento fue que la más eficiente es la que comprueba el nombre. ¿Será cierto? Veamos pues...

MSIL correspondiente al primer código:

IL_0000: ldc.i4.0
IL_0001: stloc.0
IL_0002: ldc.i4.0
IL_0003: stloc.1
IL_0004: br.s IL_002e
IL_0006: ldarg.0
IL_0007: call instance class [System.Windows.Forms]System.Windows.Forms.Form[] [System.Windows.Forms]System.Windows.Forms.Form::get_MdiChildren()
IL_000c: ldloc.1
IL_000d: ldelem.ref
IL_000e: isinst ProgramaGestion.Forms.AfrmRejillaClientes
IL_0013: brfalse.s IL_002a


MSIL correspondiente al segundo código:

IL_0000: ldc.i4.0
IL_0001: stloc.0
IL_0002: ldc.i4.0
IL_0003: stloc.1
IL_0004: br.s IL_0038
IL_0006: ldarg.0
IL_0007: call instance class [System.Windows.Forms]System.Windows.Forms.Form[] [System.Windows.Forms]System.Windows.Forms.Form::get_MdiChildren()
IL_000c: ldloc.1
IL_000d: ldelem.ref
IL_000e: callvirt instance string [System.Windows.Forms]System.Windows.Forms.Control::get_Name()
IL_0013: ldstr "AfrmRejillaClientes"
IL_0018: call bool [mscorlib]System.String::op_Equality(string,
string)
IL_001d: brfalse.s IL_0034

Como se puede apreciar, evidentemente me equivocaba. La segunda opción es mucho menos eficiente que la primera. La llamada a la función 'isinst' del MSIL ocupa 4 bytes; y todo el tinglado que se monta en el segundo listado, para hacer una comparación de cadenas, es mucho más pesado (15 bytes). No me he puesto a mirar cuantos ciclos de reloj supondrían, pero seguro que gana en eficiencia y eficacia la comprobación del Tipo. De calle, además.

Que sí, que en estos tiempos de PCs con Gigabytes de memoria, Gigahertzios de frecuencia y cientos de Gigabytes de capacidad de almacenamiento, ahorrarse 15 miserables bytes puede parecer una soberana chorrada, pero mira de 15 en 15 bytes te puedes evitar que un programa te ocupe 100 Megas en memoria al ejecutarse (habéis mirado alguna vez en el administrador de tareas, el proceso 'devenv.exe'? Yo me horrorizo casi siempre). Y además es sana costumbre de buen programador el optimizar tu código hasta donde te sea posible... ¿no?

viernes, 5 de enero de 2007

Novias y esposas, Arquitectos y Programadores...

Estaba leyendo este simpático post del blog de Luis Du Solier en geeks.ms, donde habla de la actualización de Novia 6.0 a Esposa 1.0. El texto tiene sus añitos pero es buenísimo.

Y entonces me he acordado de éste otro:

Parecidos entre el lenguaje de los servidores y las mujeres

100 Continue ==== Sigue intentándolo vas por buen camino
101 Switching Protocols ==== Si no te decides...
303 See Other ==== Pruebalo con otra
400 Bad Request ==== Dímelo con flores
401 Unathorized ==== Estoy casada
402 Payment Required === Son 10.000 y la cama
403 Forbidden/Access Required === ZZZZZZZAS! (bofetón)
404 Not Found === He quedado con las amigas
405 Method Not Allowed === No, por detrás no...
406 Method Not Acceptable === ... y en la boca menos
407 Proxy Auth. Required === Lo hablaré con mi madre
408 Request Timeout === ¿Sabes cuánto hace que no me llamas?
409 Conflict === ¿Quien era ESA?
410 Document Removed === Quiero el D-I-V-O-R-C-I-O
411 Lenght Required === ¿A eso llamas 'pedazo polla'?
412 Precondition Failed === ¿Que no has traido condones?
413 Request Entity Too Large === Eso no me va a caber ahí dentro
414 Request URL Too Large === Eso tampoco me va a caber ahí dentro
415 Unsupported Media Type === A cuatro patas no me gusta
500 Internal Server Error === Tengo la regla
501 Not Implemented === Nunca haría *eso*
502 Bad Gateway === ...y por ahí, menos todavía
503 Service Unavailable === Me duele la cabeza
504 Gateway Timeout === ¿Ya está?

Y no hay que olvidar el raro e infrecuente
200 OK === Chica facilona

lunes, 1 de enero de 2007

¡¡ FELIZ AÑO 2007 !!

Hemos dejado atrás el 2006. Personalmente ha sido un año que recordaré por varios motivos, pero sobretodo por dos muy concretos: Uno, mi pareja y yo decidimos casarnos; y Dos, tuvimos la feliz noticia de que íbamos a ser padres. :)

Estaréis de acuerdo conmigo en que son dos muy buenas razones para recordar el 2006. Sin embargo el 2007 tiene que ser aún mejor, ya que en el año que acaba de comenzar es cuando las dos noticias anteriores se harán realidad.

Así que como véis este año comienza bien... y con cambios en el Blog (he actualizado a la nueva versión de Blogger, no está mal, el diseño del formato del blog se puede hacer ya utilizando "drag & drop" al más puro estilo Web 2.0).

En otro orden de cosas, hablando ya del plano profesional, espero que el 2007 sea, además, el año de mi perseguida certificación MCSD. Evidentemente también aspiro a conseguir las nuevas MCTS... ;)

Espero que para todos los que leéis esta humilde bitácora, seáis asiduos o eventuales, este 2007 sea el MEJOR año de vuestra vida, en todos los sentidos, y podáis compartir todas esas cosas buenas con aquellos que os importan y a quienes importáis.

FELIZ AÑO NUEVO!!

martes, 28 de noviembre de 2006

Seguridad en SQL: Truncamiento (MSDN)

En el número de Noviembre de la excelente revista MSDN Magazine, hay un artículo dedicado a la prevención de un nuevo tipo de ataques de intrusión a Bases de Datos, la inyección de SQL por truncamiento. Es curioso que, cuando parecía que ya teníamos superados estos inconvenientes, resulta que aparecen otros nuevos. Y además, provocados por actualizaciones que se le efectúan al software.

Un ejemplo de esto, es éste párrafo del artículo: "una función REPLACE en cada variable de 25 caracteres puede devolver 50 caracteres cuando todos los caracteres son comillas simples. SP4 de SQL Server 2000 y SP1 de SQL Server 2005 truncan de forma silenciosa los datos si la variable no tiene búferes lo suficientemente grandes. Esto proporciona a los posibles atacantes la posibilidad de truncar la cadena de comando."

Supongo que estarán de acuerdo conmigo en que no es precisamente tranquilizador. De todas formas, lo más importante es que se nos muestra cómo identificar, y también cómo evitar, estos ataques. Además está traducido al cristiano. ;)

Enlace al artículo, aquí.

martes, 21 de noviembre de 2006

Boxing y Unboxing

Pues como ya hacía tiempo que no posteaba nada 'útil' en el blog, vamos a arrancarnos por peteneras con un didáctico articulillo sobre esta característica de .NET.

El Boxing no es otra cosa que convertir un tipo "valor" (Int, Double, Structs...) en un tipo "referencia". La utilidad de esto, se puede encontrar si en alguna ocasión necesitamos pasarle un parámetro, que por definición sería "por valor", a un método que requiere parámetros que son tipos por Referencia (esto puede ocurrir con más frecuencia de lo que pensamos, y entonces nos vemos obligados a sobrecargar nuestras funciones, o a crear nuevas -OJO no confundir con el modificador ref de C#, ByRef de VB.NET).

¿Cómo se hace el Box? Muy sencillo, tenemos la siguiente variable:


int i = 35; // Esas rimas fáciles...

Y queremos utilizarla en un método, que podría ser por ejemplo éste:

static void ManejaUnObjeto(object o)
{
...
}

Primer problema: el método recibe un objeto (un tipo por Referencia), y nosotros queremos pasarle un entero (tipo por valor)... Evidentemente no podemos incluir un ref en la llamada al método puesto que no está declarado para aceptarlo. ¿Solución? Nada mejor que "convertir" esa variable, precisamente en un objeto (la Madre De Todos los tipos por Referencia). Así conseguimos pasarle la variable al método:

object objEntero = i;
ManejaUnObjeto(objEntero);

Segundo problema: Ya tengo la variable (o algo parecido) dentro del método. ¿Cómo demonios la utilizo?

static void ManejaUnObjeto(object Objeto)
{
int j = int(Objeto);
}

Para poder utilizar el valor correctamente, debemos hacer el "Unboxing" del parámetro, que no es otra cosa que un Cast al tipo de dato correspondiente. Pero ojo, porque el tipo DEBE ser el mismo de la variable original:

static void ManejaUnObjeto(object Objeto)
{
double j = double(Objeto); // Esto pega un petardazo.
}

Tenemos dos soluciones para ésto: O bien interceptamos la excepción con un try...catch(InvalidCastException) o bien nos aseguramos de que el tipo sea el esperado (es más elegante esta opción, por supuesto):

static void ManejaUnObjeto(object Objeto)
{
if(Objeto is int)
{ int j = int(Objeto); }
}

Otro aspecto a tener en cuenta es cuando le pasamos a ese método un tipo definido por nosotros:

// Definimos esta estructura (recordar que es tipo por VALOR,
// al contrario que la Clase)

struct Estructura
{
public int i, j;
}

// Definimos dentro del Main una variable de ese tipo y la
// pasamos a un método

static void Main(string[] args)
{
Estructura struc;
struc.i = 10;
struc.j = 20;
MetodoEstructura(struc);
}

Vemos aquí que no hemos hecho el Box, es decir, no hemos convertido la estructura en objeto. Esto es perfectamente válido y no es mucho problema, en principio. Por regla general, .NET hace el Boxing automáticamente cuando se encuentra que pasamos un tipo por Valor a un método que espera un objeto ("vaya, ¿entonces para qué lo explicas?" Pues porque nunca está de más saber las cosas :P ).

Proseguimos con el código anterior. Vamos ahora a escribir el método que recibe y utiliza esta estructura:

static void MetodoEstructura(object Objeto)
{
Console.WriteLine("Valor 0 {0}, Valor 1 {1}", Objeto.i,
Objeto.j);
}

Este método ni siquiera compila. ¿Motivo? Que la clase System.Object no tiene ningún miembro llamado 'i' o 'j', y aunque el compilador es capaz de hacer el Box automático del parámetro de entrada, NO hace la acción inversa. Hemos pues de proceder al Unbox manual:

static void MetodoEstructura(object Objeto)
{
// Ahora si...
if(Objeto is Estructura)
{
Estructura s = (Estructura)Objeto;
Console.WriteLine("Valor 0 {0}, Valor 1 {1}", s.i, s.j);
}
else
Console.WriteLine("No has enviado una Estructura!");
}

Una cuestión a tener en cuenta es que las operaciones de Box y Unbox, como cualquier Cast, consumen algo de tiempo de proceso y si se utilizan con demasiada frecuencia, el rendimiento de nuestra Aplicación podría verse afectado (podría). Sin embargo desde la versión 2.0 de la plataforma hay una posible solución a esto, y es el uso de los "nuevos" tipos genéricos (parecido al Variant de toda la vida de los que conocemos Delphi, jeje :P ... Sólo que en principio el uso del tipo Variant en Delphi SI penaliza el rendimiento, y los genéricos en .NET, al parecer, no lo hacen).

miércoles, 15 de noviembre de 2006

CodeGear?? Sí hombre, los del Delphi...

Acabo de leer en el Blog de Rafael Ontivero, que al final en Borland se han tomado al pie de la letra aquello de: "Ni lo uno ni lo otro, sino todo lo contrario". Que de lo de vender la División de Herramientas de Desarrollo, nada de nada (no encontraron un "comprador adecuado", dicen). Pero que tampoco se la quedan, y crean esa "nueva empresa", con ese "nuevo nombre" (y la web es... escueta, por decir algo).

O sea, que había que hacerlo como fuese, pero si de paso se llevaban unos milloncejos pues mejor que mejor. Con lo cual uno de mis temores desde hace tiempo, se confirma: A Borland le "sobraba" su división de Desarrollo. Borland prescinde de quien hizo de Borland lo que hoy es: Los desarrolladores. Borland ha visto una posible gallina de los huevos de oro en dirigir sus productos a gente que por lo general no tiene ni peregrina idea de software (Directivos, etc). Vale, yo entiendo que es más factible cobrar muchísimos miles de dólares por un producto diseñado para que un stakeholder piense que controla la información, o crea que sabe diseñar una aplicación de Software (ah, bendito UML...), que "sólo" unos pocos miles por una herramienta de desarrollo que lleva ya varios años caduca, obsoleta y que la han superado por todas partes... y que encima tus clientes lo saben, porque saben de qué va el tema.

Una cosa que no termino de entender, es ese empecinamiento en mantener la marca Borland para herramientas que no tienen nada que ver con el mundo del desarrollo, cuando PRECISAMENTE toda la vida de Borland como empresa ha sido para y por los desarrolladores. Desde hace más de 15 años, decir "Borland" equivalía a decir "Herramientas de Desarrollo". O mejor dicho: "Las MEJORES Herramientas de Desarrollo". Tirar ésto por la borda, y ningunear a los MILLONES de fieles desarrolladores que con orgullo nos definíamos como "Borlanders", tildándolos como bien dice Rafael de "mierdecillas, ínfimos seres privilegiados capaces de usar sus fantásticas herramientas", a mí me parece el mayor error de esta empresa. Y ha cometido unos cuantos, y gordos, en estos últimos años (¿Alguien recuerda aquello de Inprise?).

Pues, y ésta es sólo mi humilde opinión, podrían haberse quedado con el nombre Inprise para nombrar a la división de Herramientas de gestión de Proyectos (ALM); que ya les venía MUY bien para el lema que tenía Inprise (Integrating the enterprise), y "cederle" el nombre Borland a lo que SIEMPRE había sido Borland. Habría sido sencillamente perfecto.

Pero no, tenían que hacerlo de esta manera, que sólo se me ocurre calificar de... triste.

martes, 14 de noviembre de 2006

The .NETrix ya es la Nº 11 en Google!!

Hoy me he llevado una gran alegría: Resulta que se me ha ocurrido buscar en Google "Netrix", así tal cual... y cuál no sería mi sorpresa que este blog sale en el número 11 de la lista de resultados. O dicho de otra manera (que suena aún mejor :P), el Primero de la segunda página. El total de resultados que devuelve Google para la palabra "Netrix" es de más de 480.000 y hace no mucho (tres o cuatro meses) no figuraba ni en los 500 primeros... así que, creo que tengo muchas razones para estar tan contento :)

Y si encima busco sólo los resultados en español... ¡¡el cuarto lugar absoluto!! uff! Lo dejo ya, que me estoy poniendo burro xDD

Saludos y GRACIAS a los lectores y visitantes de esta humilde página. :)

lunes, 13 de noviembre de 2006

Internet Explorer 7, descarga ya en castellano

Bueno, pues algunos días después de la liberación oficial de la versión final de IE7 en inglés, nos llega hoy la oportunidad por fin de descargárnoslo en español.

Por cierto no quisiera hacer leña del árbol caído, pero es que a veces no sé si lo hacen aposta o qué. Me refiero a la frase que puede leerse en la home de Microsoft Ibérica al respecto de esta noticia: "Actualice sin miedo".

De verdad, yo creo que a alguien dentro del Departamento de Márketing, o Comunicación o lo que corresponda, de ésta empresa, deberían cuando menos "recomendarle" que escoja mejor las palabras...

En fin. Ah otra cosita, recordad que sólo se pueden actualizar los usuarios de Windows XP SP2 y Windows Server 2003 SP1.

martes, 7 de noviembre de 2006

Liberada oficialmente la versión 3.0 de .NET Framework

Hoy 7 de noviembre ha sido oficialmente liberada la versión 3.0 (anteriormente conocida como WinFX) de la plataforma .NET, y se puede descargar, en inglés de momento, desde este enlace (el Runtime) y este otro (el SDK).

Podéis también visitar la página principal de la Plataforma, hay más enlaces, por ejemplo a las extensiones para VS2005 de WWF (Windows Workflow Foundation), información sobre las nuevas tecnologías como CardSpace, y otros.

miércoles, 25 de octubre de 2006

Windows para automóviles...

Hace poco me enteré de que existe una versión de Windows destinada a vehículos. Y no puedo resistirme a publicar aquí una serie de mensajes que dicha versión de Windows muestra (según las malas lenguas, eso sí :P ) de tanto en tanto:

- (Te acabas de dar un leñazo a 120 KMh): Windows ha detectado una colisión. ¿Desea activar el airbag? [Aceptar] [Cancelar]

- (Tras otro leñazo): Se ha detectado un error al activar el airbag. [Reintentar] [Cancelar]

- Windows ha encontrado un problema y ha apagado el vehículo para evitar daños (y ha tenido que hacerlo en medio de una autopista de 6 carriles...)

- Windows Update: Encontrados e instalados nuevos controladores para los frenos. Reinicie el vehículo para que los frenos vuelvan a funcionar. (éste me encanta xDDDD)

- (Te equivocas de camino o bien no sigues las instrucciones del navegador): GPS Explorer ha encontrado un problema en la ruta. Pulse Aceptar para reiniciar (y entonces el coche coge y regresa al punto de origen).

- (Este hay que ponerlo en inglés para entenderlo): Windows has found new drivers for the vehicle. Do you want to replace the current drivers? Al pulsar OK salen, de no sabes dónde, unos hombres estilo Men in Black pero con polos de Microsoft que te sacan del coche, te apalean y luego cogen al primero que pasa y le meten en tu coche.


Saludos