Cutler y el mito del “hombre de hierro”

A estas alturas, todos saben acerca de lo que pasó el domingo: Jay Cutler de los Osos de Chicago abandonó el partido en el tercer cuarto del campeonato de conferencia contra los Empacadores de Green Bay, abajo por 14 puntos, y esta salida fue subsecuentemente criticada sin piedad por los medios de comunicación, comentaristas, e incluso propios jugadores (y ex-jugadores) de la NFL.

Mi opinión, en resumen? Cutler no se lo merece. Pero alguien más lo expresa mucho mejor que yo:

http://youcantplayhere.blogspot.com/2011/01/when-lines-get-crossed.html

En esencia… eso del “jugador rudo” que aguanta lesiones y sigue jugando es fabuloso en teoría, pero en la práctica? Puede poner en riesgo tu salud – y en el caso de los jugadores profesionales, su vida, pues es su carrera en juego. *Suena* bonito, pero no es tan sencillo. Y evidentemente, cuando se critica sin saber las condiciones reales (nadie sabía en el momento que Cutler tenía su ligamento MCL roto), simplemente es ignorante…

Acerca de .Net, el manifiesto y los requisitos previos

Pues llevo la mejor parte de la noche (ok, ok, apenas un par de horas, pero es bastante para mí!) lidiando con un problema interesante. Explicaré un poco de los preeliminares, para que todos nos entendamos.

La plataforma de .Net es, para mi gusto, una verdadera maravilla. Si vas a desarrollar para Windows (y no te importa mucho obligar a tus usuarios a que instalen X dependencias que bien pueden ser molestas), te permite utilizar una serie de lenguajes muy parecidos entre sí, sólidos, con una gran base de desarrolladores que pueden ayudarte, código disponible en línea, e incluso bibliotecas listas para ser aprovechadas. Como Java, pues, pero sin la molestia de tener que usar… *eso*. Si tú desarrollaste en Visual Basic, VB.net es prácticamente lo mismo; si trabajaste en Java, C# es un camino bastante directo. Tiene gran versatilidad para desarrollar aplicaciones web, permite redistribución de dependencias (recuerden esto), tiene soporte para actualizaciones automáticas de tu aplicación… bueno, las bondades son demasiadas. En fin, es una plataforma que personalmente, me agrada bastante.

Nosotros, los programadores eventuales (es decir, que en realidad no nos dedicamos a esto para vivir), tenemos muchas malas mañas. Generamos código sucio, no muy organizado ni comentado; nuestra documentación puede catalogarse como garabateadas en servilletas y hojas de papel que acaban tiradas por ahí; y tendemos a vivir en el modo “debug”, nunca preocupándonos por cómo va a quedar la aplicación final cuando el usuario final decida instalarla – digo, podemos dejarlo hasta el final, no? El problema con esto es que cuando llega el famoso final… es una pesadilla.

De entrada, les recomiendo esto: no utilicen acentos para nombrar a su aplicación. No, .Net no truena con eso. Pero si quieren utilizar la funcionalidad de actualizaciones, su servidor web puede darse de topes con ustedes, porque va a buscar archivos y cadenas no fácilmente codificables. Solo… tómenlo como una recomendación amable.

Y por supuesto, el centro del problema: los requisitos previos. .Net corre sobre una máquina virtual (el “Framework”), y mi aplicación en particular utiliza un motor de bases de datos sencillo (SQL Server CE, que es algo así como el primo debilucho de SQL Server Express, que a su vez es el babas a comparación de SQL Server, que a su vez… etc etc), comparable con sqlite. El Framework, para instalarle, utiliza *otro* requisito previo, el Windows Installer (v.3.1 en este caso en particular). Estos requisitos son manejados elegantemente por el instalador generado por .Net: se descargan automáticamente de internet, si el usuario final no los tiene ya instalados. El problema es que, combinados, son alrededor de 100 Mb de descarga: ciertamente no es mucho para un geek, pero un usuario con una conexión de Infinitum a 512 (cuando le va bien) nos va a obligar a visitar a los papás. So… debemos poder incrustarlos con nuestro instalador, cierto?

La respuesta es “sí, pero te va a costar trabajo”. Resulta que estos instaladores (que se pueden bajar bastante fácil de internet) no se ponen en cualquier localidad. Deben ir en el directorio que .Net utiliza para almacenar los instaladores. Suena sencillo… hasta que nos enteramos que cada versión del Framework tiene diferentes localidades (y lo mismo para cada versión del Installer, SQL, etc), y que a su vez, cada versión de la IDE lo pone en directorios ligeramente diferentes. En mi caso?

C:Program Files (x86)Microsoft SDKsWindowsv7.0ABootstrapperPackages

¬¬ Sí te iba a encontrar, no?

Pero gracias a un valiente y hermoso post:

http://social.msdn.microsoft.com/forums/en-US/Vsexpressvb/thread/56584721-3064-46c2-81f4-6c29c01e1895/

Tuvo solución el problema. La moraleja, como siempre, es no fiarse de M$.

😀

A veces se me olvida lo lindo que es Visual Studio…

private void algunTextbox_KeyPress(object sender, KeyPressEventArgs e)
{
const char Delete = (char)8;
e.Handled = !Char.IsDigit(e.KeyChar) && e.KeyChar != Delete;
}

🙂

P.D.: Esto sirve para que, con C# (o bien, C sharp), podamos limitar el contenido de un textbox a solo digitos. En esencia, estamos aceptando teclazos si y solo si son digitos (o estamos borrando).

iOS 4.2 está bastante chido…

Pues acabo de actualizar mi iPhone a la versión 4.2 del sistema operativo. He de decir… wow. Apple acaba de hacer que mi teléfono cuente con muchísima mayor funcionalidad. Veámoslo a detalle.

1. Primero que nada, el nuevo AirPrint. Resulta que ahora puedes imprimir a cualquier impresora soportada (que tristemente, no son muchas… pero la mía sí :D) desde el mugroso iPhone. Esto incluye Fotos, Safari, Mail y Notas, así como una cantidad de aplicaciones adicionales. O sea, que la próxima vez que quiera imprimir un correo, solo debo hacer dos clicks… y voilà. Realmente de siglo 21 😀

2. Find My Iphone. Esta es probablemente la característica más payasa. Resulta que este servicio, que anteriormente tenía un costo de $100 USD al año, ahora es gratuito para todos los usuarios de iPhone 4. Y está… impresionante. En esencia es un servicio push que permite posicionar al iPhone en cuestión desde web (o incluso otro dispositivo iP*)… pero eso no es todo. Permite enviarle un mensaje (que se despliega en la pantalla del iPhone), deshabilitarlo (para que no lo puedan utilizar), o incluso, borrarle toda la información que contiene, de manera remota y confiable.

Es decir, que ya no me tienen que presumir nada los que usan su BlackBerry. Este dispositivo también tiene su remoteWipe. 😀

3. Por último, pero no menos importante… el Tethering. O sea, compartir internet. Disponible en el menú “Red” de la sección de configuración, ahora podemos compartir internet con otro dispositivo (ej. Laptop) a través de la conexión 3G del teléfono, sin necesidad del jailbreak. Ya lo probé y funciona de maravilla. Ahora, a ver si Telcel no se mancha y quiere cobrar de más por esta funcionalidad… Pero de momento, es una fantástica adición.

Creo que tiene otro par de mejoras más, pero estas fueron las que me vendieron la actualización. Gracias, Apple!

De verdad que no te entiendo, Axtel

Allá en la fuente, había un chorrito…

Ok, figúrense este problema: su navegación por internet es, a todas luces, buena. La velocidad es decente, o al menos no es notoriamente lenta. Al menos, así parece en el buen puerto 80. SSH tampoco reporta lentitudes. Todo marcha bien. De pronto, se les ocurre hacer una descarga (digamos, para actualizar los paquetes de su *Nix). La velocidad los tira al piso: alrededor de 30 KBps. Caray, hasta Infiernitum da más! OK, esto es probablemente un problema con el servidor de Linux, cierto? Veamos, tengo por aquí un archivito de MegaUpload que puedo probar…

…a unos notables 25 KBps. W. T. F?!

He hecho 4 llamadas al soporte técnico de Axtel (por cierto, ajúa con el acento, chavos!). Las 4 llamadas han resultado en lo mismo: “Sí señor, prometemos resolverlo. [2 días después] A ver señor, pruébelo. [Funciona aparentemente bien]. Gracias por su preferencia. [30 minutos después… cuerno.]” Qué pedo, Axtel? Estamos jugando, o qué demonios? Ah, pero eso sí: cada vez que me piden utilizar un medidor de velocidad en línea, “casualmente” me reporta un ancho de banda normal. Dammit!

Se hacía grandote…

Hace un par de días, estaba yo feliz trabajando en una sesión ssh en la valiente jusanet (a eso de las 3 de la mañana), cuando de repente, mi vi estaba mas menso con mis comandos que de costumbre. Supuse que era la jusanet, y aventé 40 maldiciones en arameo antiguo al cielo (lo cual no suele solucionar nada en la conexión, pero se siente tan bien… ahem, pero me desvío del tema), hasta que volteé a ver mi monitor de uso de red… al pico. Hhmm…. esto se ve raro. Ah, pero está abierto JDownloader! Será? Será?? Ya tengo buena velocidad?

Efectivamente. Mis dulces, adorados y muy extrañados 240 KB/s. Pero… ¿cómo llegaron ahí? ¿Qué agradable duende del ancho de banda me los trajo? (No fue el gnomo, eso es seguro) Será que… nahhh… Axtel tiene problemas de mucho uso???

Se hacía chiquito…

Pues que me pongo a investigar. Hice una ligera “auditoría de seguridad” en las redes de los alrededores; supuse que podría identificar a mis vecinos con Axtel por el nombre de la red, la dirección IP pública, y el tipo de autenticación solicitada por el modem, si existe. Rápidamente encontré 3 aquí cerca (copiones). Estaba apenas apuntando nombres de red, cuando de pronto, oh tristeza… de vuelta a los 25 KBps. No, esto no podía quedar así.

Estaba de mal humor… el sysadmin.

Pues que saco la Alfa. Y que disparo el Beini. Un frontend de kismet a prueba de imbéciles (inserte broma acerca del autor aquí), me permitió en 15 minutos, como dicen los americanos, estar kicking ass and taking names. De redes, evidentemente. Efectivamente: uno de mis vecinos, en su eterna sabiduría, está descargando a lo baboso algún contenido (no, no me interesa investigar *qué* es). Lo estuve monitoreando por casi 2 horas; a punto de quedarme dormido, ví que su tráfico disminuyó. Y, sorpresa, mi monitor de tráfico subió de nuevo.

Un simple problema de recursos, evidentemente.

Pero algo sigue sin cuadrar: mi enlace, para aquellos que no lo conocen, es de 2 Mbps. 2 tristes megas. Y cuando alguien en la zona, con un enlace de 1 Mbps, comienza a descargar, esto me pasa? WTF, Axtel? Digo, somos 3 en una zona de como 16 cuadras (… cuadradas?). En serio, no somos muchos. CUando alguien se acapara tantito ancho de banda, esto pasa? Que servicio tan pinchurriento tienen, que un usuario le puede dar en la madre a todos los demás? Fuck, estoy no es cable! Y además, estamos hablando de 2 Mbps! Imagínense, si así se pone MI red, cómo se pondrá la del pobre tercero, o cuarto, con mi amigo el descargador y yo? Seguro que no pueden abrir ni Google.

No se vale, mis amigos. Cada vez me convenzo más que, para tener un enlace decente en este país, hay que estar dispuesto a pagar muuuucho dinero. Digo, si contrato un T3, seguro que no tengo estos problemas, verdad?

En fin. Mejor me consigo unas latitas y un cablecito…

Migración, v. 2.0: Nos vamos a Amazon!

Estaba yo bien tranquilo el fin de semana, trabajando, como dios Yopas manda… Ok, ok, me estaba rascando la panza, cuando jusafing me comentó que el servicio de EC2 (Elastic Cloud Computing) de Amazon, por alguna extraña razón, estaba siendo gratuito (con sus respectivas limitantes) para clientes nuevos. Interesado, traté de activarlo con mi cuenta existente, pero – oh sorpresa – me comenzaron a cobrar. $1.04 USD después, me desanimé (no queriendo crear otra cuenta en Amazon) y dejé las cosas hasta ahí, en parte porque había mucha chamba que sacar.

Pero hace un par de días se me ocurrió darle otro intento. Y esta vez… voilá! Sin problemas. Así que decidí empacar el itacate de sergiob.org y migrarlo a este nuevo servidor. Debo decir… funciona bastante bien. Al menos tan rápido (en procesamiento) como sergiob 2.0, y ciertamente con mucho mejor enlace de red (digo… mínimo, no? Está en la fucking cloud!) Así que… nos mudamos!

Beneficios inmediatos: mejor conexión de red, disponible en puerto 80 (y el puerto 800 todavía, por cuestiones de compatibilidad), mejor seguridad, menor costo (nulo, de hecho).

Beneficios a futuro: … déjenme pensarlo…

Desventajas: Pues nada, en realidad. Todavía conservo el viejo servidor, y lo tengo ruteado para usos (más) personales.

Algo que me preocupa es la privacidad de mis datos. Pero bueno, sergiob nunca ha tenido información confidencial, y no pienso comenzar ahora. Posiblemente mude este blog a un subdominio dentro de poco, pero no hay nada seguro aún.

“¡De panzazo!” y otras ideas sobre la educación en México

Pues hoy, mientras navegaba los intertubes, ví un link a un video, avance de un documental muy interesante llamado “¡De panzazo!”, producción de Loret de Mola y con dirección de Juan Carlos Rulfo (Del olvido al no me acuerdo). Interesante propuesta… por decir poco.

La idea del documental (disponible en el buen youtube) es plasmar una imagen fehaciente del estado de la educación mexicana actual. De lo poco que se ve en el promo (dura 7:33), se ven duras entrevistas a muchos personajes importantes en el tema, así como grabaciones ocultas realizadas por alumnos durante sus propias clases, y el voiceover del Sr. de Mola con comentarios acerca del tema. Debo decir… es algo triste, y en mi opinión más importante que “el narco”, tema que por supuesto domina los titulares nacionales al momento.

La verdad es que esta opinión está basada completamente en experiencia personal; en mi vida me ha pasado algo criminal, pero sí he tenido contacto directo con los efectos que una mala educación (estrictamente hablando del ámbito académico) puede tener en la vida de una persona por demás capaz y con gran potencial. Y por supuesto, en el hecho de que una buena educación permite plantarse firme ante esas (y otras) tentaciones…

En cuanto al contenido… qué puedo decir. Francamente, me dan ganas de abandonar todo y largarme a dar clases a algún lugar. Triste, decepcionante y muy encabronante la actitud que algunos maestros tienen ante su profesión. Sobre todo porque tuve la fortuna de ver muy de cerca lo que verdaderamente es un maestro de calidad.

Terrible, en fin. Tal vez tenga más cosas que decir después, pero… por ahora solo se resume en 🙁

Calaverita

Mi hermosa, adorada, y amada novia me escribió esto… debo decir que todos mis posts se quedan cortos: si me quieren conocer, esta es la mejor manera.

Y cito:

“Un día la muerte decidió llevarse a Andrés,
visitó su cuarto y lo encontró con la cabeza entre los pies.

Dijo: ‘No me lleves, aún no termino de trabajar.
Si quieres hasta tú me puedes ayudar…
no decido entre el cuadrado o el circular.
¡Ves cómo me desespero, y tú ya me quieres llevar!’

La muerte contestó: ‘Ya eso no importa, es hora de tu partida.
Tú decides si ahora o al rato en la comida.’

Andrés respondió ‘¿No podrá ser hasta el lunes?
Es que al rato juegan mis delfines, y después me echaré unos atunes…’

‘¡Noooo! Responde la inmunda calavera,
‘Te llevaré hoy no importa la manera’
‘¡O me llevas a las memorables! A mí y a mis carnales’
‘Si te llevaré por una delicia de hamburguesa,
aunque no podrás despreciarme un buen trago de cerveza’

Ya lo hecho, hecho estaba.
La calaca ya ni en levantarse reparaba.
Sergio logró su cometido:
atragantar a la catrina
para que no se lo llevara a su nido
y así poder seguir trabajando,
sin recordar lo acontecido…”

Debo decir… wow.

Te amo, Elena!

Tómbola

¿Cómo va aquella canción?

“Yo soñaba con tu nombre,
Esperaba conocerte.
Y la tómbola del mundo,
Me premió con tu querer.”

Han sido dos tres semanas increíbles, llenas de cambios… no solo en actividades, sino también de paradigmas. Estuve releyendo mi blog hace unas horas y hay tantos posts que me parecen tan lejanos… como si los hubiera escrito otra persona, en una galaxia muy, muy lejana… que apenas reconozco y cuyos pensamientos me parecen lógicos, pero a la vez inentendibles.

No lo digo por la UNAM. Verdaderamente voy a extrañar mi casa, la que fue más mi primera casa que el lugar donde duermo. No… mis sentimientos por la UNAM no han cambiado, y no creo que cambien en ningún momento. La decisión de abandonarla (aún cuando podría ser temporal) es meramente cuestión de resolver aquello que he dejado pendiente. Aunque hayan dudas… vamos, las adversidades no nos van a dejar nunca. Así que voy con todo… y espero no defraudar. Sé bien que no soy el mejor en el mundo, pero espero ser lo suficientemente bueno. Haré mi mejor esfuerzo. Lo prometo. Lo demás… lo dejaré en manos del destino.

En cuanto a lo demás… lo dejaré en tres palabras:

Te amo, Elena.

A triunfar!

od, y la importancia de los saltos de línea

Cuando uno se dedica al negocio de la computación, a veces se nos olvida que lo que nosotros vemos no es exactamente lo que las computadoras procesan. Lo que para nosotros son frases, imágenes o sonido, las computadoras interpretan como señales: análogas (como cuando hablamos por micrófono) y digitales (casi todo lo demás), también llamadas discretas.

Este punto salió a colación hace apenas unos minutos, mientras trabajaba en una rutina de firmado. Para quienes no lo conozcan, el proceso de firmado digital funciona de la siguiente manera:

– Obtener los datos a firmar
– Calcular una suma (también conocido como hash) de los datos — un valor único y (supuestamente) irrepetible que identifica dichos datos.
– Cifrar esta suma obtenida, con alguna llave privada.

El proceso es probablemente mejor explicado por Wikipedia, pero el concepto es sencillo. Particularmente para aquellos que entienden criptografía de llave pública… pero creo que me desvío del tema. Ligeramente.

El problema de este tipo de firmados es que las sumas son extremadamente sensibles a cambios en los datos. Para ejemplo, vean los resultados de dos cadenas ligeramente diferentes. La cadena “hola”, calculando su MD5 (un tipo de suma), nos entrega:

916f4c31aaa35d6b867dae9a7f54270d

La cadena “hola.” (nótese: idéntica, excepto por el punto al final) nos entrega un MD5 completamente diferente:

296366cea89e11cdc7999e42463575fe

De hecho, esta es la (supuesta y desde hace años demostrativamente falsa, en algunos casos) fortaleza de las sumas de seguridad. La idea que una combinación de datos diferente nos entregue, siempre, necesariamente, resultados diferentes, es la raison d’être de las sumas de seguridad.

Bueno, pues todo suena fabuloso, excepto cuando no te sale. Resulta que el proceso de firmado que estabamos realizando (un proyecto del cual hablaré más después) no estaba funcionando como debe. Y después de varios días de estarme peleando mentalmente con el problema (‘debe ser un problema con el algoritmo’, pensaba) me decidí a adentrarme en el problema a fondo.

Revisé el RFC respectivo; busqué soluciones alternativas; visité blogs extraños en busca de respuestas. Nadie supo darme razón de lo ocurrido, aunque para ser franco no *consulté* con nadie, más bien busqué y no encontré. De pronto, y por pura suerte, encontré una alusión al estándar de codificación (UTF-8, en caso de que alguien esté interesado), y eso me hizo pensar — los estándares de codificación solo son diferentes representaciones binarias de lo mismo. Binarias… binarias…

Seguramente algún problema había con la representación binaria. Si cambiamos una letra, las sumas cambias – es evidente, porque cambiamos el bloque de bits. Una codificación diferente seguramente causaría un efecto desastroso en las sumas. Y me dí a la tarea de investigar como buscar la representación binaria de algo, en linux (siendo este mi plataforma de preferencia para lo que estamos haciendo).

Me topé con un viejo amigo: hexdump. Este comando permite la salida hexadecimal de información. Nada del otro mundo, y aparentemente no encontré nada. Pero persistió la búsqueda. Me fuí a topar con este post (casualmente, una mezcla de problemas con MD5 y visualización binaria). Y discuten un punto sencillo: la salida de una función de cálculo MD5 y la salida del comando clásico de linux, md5sum, no son las mismas. Pero… ¿porque?

Un vistazo con od (un comando de salida octal, así como de otros formatos – según su manpage) dió la respuesta:

io@maquina:~$ echo “hola” | od -c
0000000 h o l a n
0000005

Nótese el molesto, maligno y nada bien recibido salto de línea, al final de “hola”. Yo no lo puse. ¿Quién diablos se atreve a modificar mi cadena?

El sistema, aparentemente. Linux es muy servicial, y se dispone a agregar saltos de línea a cualquier “echo” que yo realice. De hecho, debo especificar explícitamente que no se den estos saltos. Y eso hace, por supuesto, toda la diferencia a la hora de calcular una suma – esos bits adicionales para señalizar el salto de línea son tomados en cuenta para el cálculo.

Basta comparar las salidas:

io@maquina:~$ echo “hola” | md5sum
916f4c31aaa35d6b867dae9a7f54270d –
io@maquina:~$ echo -n “hola” | md5sum
4d186321c1a7f0f354b297e8914ab240 –

Donde, por supuesto, “echo -n” especifica a echo que NO incluya un salto de línea al final.

Regreso a mis actividades, por el momento. Pero el día de hoy no se me olvida… y en el futuro, tendré más cuidado con estas salidas. Detalles que uno va aprendiendo poco a poco… 😉