King Kong vs. Godzilla

Mañana comienza la batalla entre los dueños de la NFL y los jugadores. Ambos bandos cuentan con impresionantes equipos de abogados, un amplio repertorio de maniobras legales, y por supuesto el odio total e incondicional de los fans. Porque estos dos nos están quitando el deporte que adoramos, porque no pueden ponerse de acuerdo en cómo repartirse 7 mil millones de dólares al año.

Iba a hacer un laaaargo post acerca de cómo está el problema, pero es muy sencillo: todos quieren más dinero. Y todos asumen que nosotros, los pendejos fanáticos, vamos a seguir ahí en 20xx, cuando sea que regrese el espectáculo. No importa si es el 2011, créanme… a muchos ya nos está afectando. Y algunos, pues ya casi nos vamos.

Como en la película, en realidad no quieres que gane ninguno. Finalmente, cualquiera de los dos nos va a comer.

Cómo utilizar DLLs externos en un programa de C#

…Después de la catarsis…

Hace poquito escribí acerca de mi alegría en obtener una rápida y eficiente solución a un problema que me estaba preocupando, específicamente de cómo copiar de manera segura archivos utilizando C#. Me encontré una biblioteca que hace justamente eso, utilizando el buen y viejo SCP. En pruebas todo estaba bien, terminé otras actualizaciones al proyecto, y como siempre, lo subí a un servidor donde la versión más nueva es descargable por los usuarios del sistema (o en resumen: “actualicé el servidor de actualizaciones”).

…Y que me avisan – esto no sirve. Terriblemente apenado, revisé inmediatamente la situación (ERT: 10 mins) y descubrí que C# me mostraba un error horrible a la hora de querer actualizar:

"[...]El archivo XXXX ya existe."

Mmm… huh? Pues claro que ya existe, babas. Era uno de los archivos .DLL que agregué para utilizar su funcionamiento. Pero… porqué se quejaba el instalador de ello?

La moraleja en versión breve es: lo agregué dos veces. Primero lo agregué como archivo al proyecto (Proyecto | | Incluir recurso existente) y luego agregué la referencia (Referencias | Agregar referencia). El manifiesto se confundió y chilló sin tregua.

Lección aprendida: Si vas a agregar un DLL externo, solo tienes que agregarlo como referencia. No es necesario agregarlo como archivo – Visual Studio se encarga de incluirlo con tu proyecto en el deployment.

Fuck you, NFL

Nunca pensé que llegaría el día que renegara de la liga que tanto entretenimiento me ha dado a lo largo de los años.

Durante ya casi dos décadas he sido un ferviente fan del futbol americano, y la NFL sin duda es la liga que más sigo, como la mayoría de los fans de este deporte. No hay comparación: el futbol americano colegial no es tan atractivo a menos que seas (ex-)alumno de alguna escuela, y francamente la situación en la ONEFA es terrible – con todos los problemas que los TECs y su inhabilidad de jugar bajo las mismas reglas que todos los demás clubes han causado. Incluso siendo fan de uno de los grandes equipos de la historia, los Pumas de CU, el ambiente es increíble pero dentro sé que no es el mismo nivel de habilidad, y probablemente nunca lo será, que en la National Football League.

Aún cuando mi equipo no me ha proveído de las alegrías de un campeonato, he seguido fiel al equipo y a la liga. He gastado muchos miles de pesos (al principio no míos, últimamente ya) en mercancía, balones, boletos, paquetes de televisión, etc. He dedicado incontables domingos – olvídense de las horas – a seguir religiosamente la jornada de partidos: el de las 12 – que casi siempre era de mi equipo – para empezar el día, el de las 3 con un ojo a los resultados de la mañana y otro al partido en curso, y el de la noche, con sus gloriosas estrellas y (usualmente) fantástico equipo comentarista. Me sé el nombre de cada jugador de mi equipo; carajo, me sé hasta el nombre de los coaches asistentes que nadie recuerda porque están presentes un año y al siguiente se van a no sé donde chingados. Me peleé numerosas veces con mi ex-novia porque el americano era parte crucial de mi vida, y nadie – ni siquiera ella, con sus 9 años de experiencia veterana a mi lado – me iba a desprender de mi gusto por las tackleadas. Bueno, hasta rechacé sexo con tal de ver mis partidos.

Conscientes de todo esto, quiero que quede muy claro mi mensaje:

Vete mucho a la chingada, NFL

Digo, ni siquiera se trata del pinche problema que traen con sus dueños y los jugadores. Creo que es estúpido (como la mayoría de los fans lo cree) que un puñado de multimillonarios no se puedan poner de acuerdo con un puñado de cuasimillonarios (salario anual promedio de un jugador de la NFL $770,000 USD; algo así como 7,000,000 MXN, aún quitándole un 33% de impuestos. Fuckers.) en como dividir el chingado botín de… mmm déjenme buscar… como 7,000,000,000 USD. Esto es, 7 MIL PUTOS MILLONES DE CHINGADOS DÓLARES. Fuckers.) porque aquellos quieren el 55.3% y estos quieren el 55.8% y cómo jodidos voy a aceptar un 0.5% menos. Repito: FUCKERS.

Pero no, no es eso. Y tampoco es que por esas mamadas estos imbéciles estén poniendo en riesgo la viabilidad de la temporada que viene. Digo, no es como si la mayoría de los fans de la liga viven y mueren por estos jodidos jueguitos entre mastodontes atléticamente extraterrestres; para nada se va a escuchar que haya gente que no sepa que demonios va a hacer en su vida si la NFL no va a operar, porque después de todo el dinero no viene de fans dedicados en tiempo, alma y cartera a los juegos, sino seguramente de hadas mágicas que depositan cientos de millones de dólares por día en las carteras de los dueños. Sí, así ha de ocurrir. Pero de veras; no es por eso. Finalmente, estaba dispuesto a tolerar que llegara septiembre y estos hijos de la chingada me dejaran todo adrenalinado y sin un equipo a quien desearle la muerte lenta y dolorosa, o rápida y dolorosa, o de tiempo libre y dolorosa. De verdad, estaba bien dispuesto a eso (FUCKERS), no porque me gustara la idea, sino porque siquiera entretener mentalmente la idea de un año sin futbol americano de la NFL era equivalente a la idea de pasarme 6 meses sin sexo – lo cual no quiere decir que sepa como es eso, claro. Porque nunca he sufrido sequías de ese tipo (FUCKERS, aunque dirigido a otras personas – pero mejor no me desvío).

Ni siquiera es que mi pinche equipo no puede ganar ni un puto campeonato de división sin que sea una hazaña heroica y extraordinaria que por supuesto ocurre una vez cada década desde que el gran Dan Marino decidió retirarse – o mejor dicho, desde que el imbécil de Dave “tengo mostacho de pornstar” Wannstedt lo corrió, demostrando enteramente el tremendo gasto de oxígeno que él – junto con su protecto Jimmy Johnson – son. No es que no haya probado la gloria del Lombardi en mi vida, ni que mis conceptos de “gloria” sean victorias a los verdaderos titanes del momento, equipos que odio con desesperación y desdén en parte por su éxito y en parte porque son putos (sí, todos los involucrados. Sí, sí creo que Tom Brady es homosexual de la peor clase, con disculpas tremendas a todos los homosexuales honestos y rectos del mundo que no se merecen dicha asociación en su vida). FUCKERS.

Tampoco es que SKY se enorgullece de ser el único proveedor en México del NFL Sunday Ticket (única manera de ver a mis Delfines, gracias a que no son el equipo “chic” del momento y que los pasan una vez por año al parecer – gracias, por cierto, Televisa y TV Azteca. Por supuesto que con estos comportamientos seguro los apoyo en su “lucha campal” contra una institución exactamente igual de monopólica, cerrada y con el mismo gusto de joder a sus clientes como ustedes. FUCKERS) y que por este mini monopolio se ve terriblemente forzado a cobrarme más de $1,000 MXN al año por sus transmisiones de la NFL, más el costo base de su suite de programación – que como es en HD, porque no quiero vivir en el siglo pasado, merece el costo de $600 MXN mensuales… FUCKERS. No, no no. Tampoco fue esto.

No, la gota que derramó el vaso no tiene nada – nadita – que ver con los resultados, o falta de ellos, en el campo o en la mesa de negociaciones. No, la cosa estuvo así:

Llevo como 5 años con la misma chamarra de Delfines, un casi uniforme que me encanta porque es fresca con el calor, cálida con el frío, no muy pesada ni bultosa, y versátil: en sus bolsas le cabe todo. Esa chamarra la compré porque antes de ella, llevaba como 10 años (!) con otra chamarra de delfines, de las mismas características. Evidentemente, cuando tengo una prenda que me gusta y se acomoda a mis necesidades, me aferro a ella como garrapata. El punto es que ya estuvo bueno, y decidí comprarme otra. Ví precios (evidentemente de chamarras de Delfines, no iba a cambiar ahora verdad?) y seleccione dos: una linda chamarra de doble vista, y otra más “cachetona” de gamuza microfibra y no sé que tantas monadas. Casi $4,000 MXN entre las dos, pero qué demonios: me gustaron y eran de mi equipo. De mi liga. Por supuesto que voy a gastarlo sin broncas.

Dispuesto a vender mi alma – sin mencionar mi habilidad de comer como gente decente durante unos meses – me puse listo a sacar mi tarjeta y poner mis datos. Primero, me pedían mis datos de facturación, así que obedientemente apunté mi dirección, teléfono, etc etc que piden a uno cuando quiere comprar algo en línea. Súper! Cansado pero listo, le dí “continuar” y me preparé a pagar, cuando… WTF? Error? “La orden no puede continuar porque algún producto [por cierto, gracias por decirme cuál. FUCKERS] de su carrito no puede ser exportado fuera de los Estados Unidos”. Hmmm… ok, revisé y era la chamarra de gamuza. Puta, me dije. Bueno, ni pedo. Pidamos solo la otra. “Continuar” de nuevo. Y… WTF?? “Resumen de subtotal: $144 USD. Resumen de gastos de envío: $267 USD”.

What. The. Fuck.

Hasta revisé el total, porque dije “no, igual me están diciendo que esos $267 son el total total. Es mucho de envío, pero no creo que me estén cobrando casi el doble de envío que el subtotal, verdad? Verdá, apá???” Ja. Jaja. Jajaja. Pues CLARO que me estaban cobrando eso de envío. Y completando el “huevos” que la pantalla me estaba enviando simbólicamente, la página me indicó amablemente que todavía no se contemplaban los impuestos que probablemente tendría que pagar.

Ah, pero ahí no acaba la cosa. No, no no no no. Decidido a encontrar una mejor opción busqué (y encontré) 3 tiendas diferentes que vendieran productos oficiales de la NFL. Todas en inglés y basadas en E.U., pero bueno, ahí está el pedo, no? Ok, seguro alguna tiene envíos a México… mmm… no, ninguna. Wiiiii! Pero como pendejo, ahí voy a buscar otra opción, porque carajo… es mi equipo! Es mi deporte! Tengo que encontrar algo, en algún lugar, no?

Sí, seguro: hay una tienda de NFL para México, en línea. Y tienen una gran variedad de 1 modelo (no, no es typo. Es UN modelo) de chamarra, por el módico precio de $1,700 MXN – más impuestos, más envíos. Ah, y por supuesto, tengo que esperarme 25 días HÁBILES. Para que estos weyes me hagan llegar su jodida chamarra (que ni siquiera es la que quería, ni se parece, ni hay de mi talla, ni me gustó) que seguro está hecha de plumas de pegaso* y piel de dragón, porque cómo chingados más explicas que algo tarde 25 días hábiles en esta época. Creo que ni los bebés tardan tanto en llegar, y a ellos sí los hacemos sobre pedido y a la medida.

En fin, he visto mal servicio al cliente. OH VAYA, que si he visto mal servicio al cliente. He visto completo desinterés en que seas cliente de algo, en una total indiferencia de si estás bien o no con el servicio que alguien ofrece. Tengo muchos ejemplos, y ya he escrito de algunos de ellos. Pero este, sin pedos, se lleva la corona. Sí, soy un “fan”. Pero también soy un CLIENTE, NFL. Soy uno de los millones que llenan esas arcas de tantos billetitos verdes que te encantan; que alimenta a los jugadores, ayuda a financiar sus contratos, permite la construcción de estadios y ha ayudado a esparcir el gusto por tu jodido negocio a rincones donde antes no había llegado. CHINGADA MADRE, HASTA MI EX YA TIENE GUSTO POR TÍ GRACIAS A QUE LA CHINGUE DURANTE CASI UNA DÉCADA.

Pero sabes? Ya me cansé. Dejé a Telmex, estoy dejando a Axtel, en poco tiempo dejaré a Telcel, y aunque me cueste un huevo y tenga un severo síndrome de abstinencia durante algún tiempo, te juro que nada es imposible. Me ahogaré en ONEFA. Saldré a más bares. Tendré más sexo (yay!). Chingaos, veré futbol soccer si es necesario. He llegado a ese punto. Acabas de perder a un fan, sí claro. Pero más importante para tu cartera: acabas de perder a un cliente.

Mejor gastaré mi dinero en chamarras de la UNAM. Más baratas, mejores materiales, y al menos ellos sí envían a México. Porque ellos – nosotros – SON/SOMOS MÉXICO.

So long, fuckers. And no, I won’t thank you for the fucking, undearchieving, soul-sucking, ever-dissapointing, and lame, lame-ass fish. They can get fucked too.

*Sí, ya sé que los pegasos no tienen plumas. Pero si vas a criticar eso, seriously – FUCK YOU TOO.

Scp y C#

Hay veces que la vida te hace sentir inseguro, triste, alicaído, dolido y débil…

Then again, hay veces que… bueno, un video dice más que 1M palabras:

El código relevante:

Scp bule = new Scp(servidor, user, pass);
bule.Connect(puerto);
bule.Put(archivo origen, archivo destino);

Y la biblioteca relevante:

http://www.tamirgal.com/blog/page/SharpSSH.aspx

😀

Extraer nombres de rutinas en códigos fuente tipo C

Bien dicen que la necesidad es la madre de la invención.

Tenía que extraer todos los nombres de rutinas de las diferentes clases de C# que he estado trabajando. Después de buscar en Visual Studio por alguna opción que me permitiera hacer esto de manera sencilla – y vaya que busqué – me desesperé y pensé… finalmente son texto plano, no? Las clases, esto es.

Pues, ¡claro que lo son! Y entonces awk viene muy al caso. El siguiente script sirve para cualquier código fuente tipo C (rutinas con parámetros entre paréntesis, código de la rutina entre llaves) – siempre y cuando las llaves no estén nunca en la misma línea que el nombre de la rutina (una práctica relativamente común). Ejemplo de lo que sirve:

modificador modificador RUTINA(parámetros si los hay)
{
...
}

o también

modificador modificador RUTINA(parámetros si los hay)
{...}

o cualquier combinación entre ellas. Luego entonces, el script:

awk 'BEGIN{x=0;} {if($0 ~ /{/) x=x+1; if($0 ~ /}/) x=x-1; if(x==0 && $0 !~ /}/) print $0;}'

Nótese que esto no nos quita los modificadores, solo el código intermedio. Si queremos quitar todo lo demás, podemos utilizar sed – pero después de 10 minutos de jugar con él me doy cuenta que no es trivial (al menos ahorita ¬¬) y lo dejo para otro post – o como dijeran mis libros de la prepa: “Queda como ejercicio para el lector”.

🙂

Yujú!

Misión: rotar una imagen para su impresión en C# (counter-clockwise 90º)

Tiempo estimado de completado: 1-3 horas (dependiendo de lo que Dios Google me dijera)

Resultados preeliminares de búsqueda (re: Google):

Already done

Tiempo real de completado: 5 minutos

YUJU!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Y… me hackearon

Pues… qué puedo decir? Me descuidé, y me descuidé horriblemente.

La historia, horriblemente, es como sigue: hace un mes me ví en la necesidad de configurar un servicio de correo express, por cuestiones profesionales. Y como buen debianero, dije “pues el exim, he escuchado que es muy práctico!” Y entonces hice un sencillo apt-get, configuré algunos parámetros… y listo. No configuré un open relay (digo, tampoco soy un completo idiota) pero sí dejé muchos parámetros de manera insegura. Aún peor, y a diferencia del resto de mis servicios, no lo puse en una jaula, ni le cambié el usuario predeterminado. Total que bueno, hay cosas que uno mismo se busca…

Un par de semanas después, Javier tuvo una plática (de botnets) y lo acompañé. Durante la plática, comencé a recibir un montón de correos de sergiob, informándome que habían nuevos comentarios en el blog. Como esto es tremendamente raro (considerando que nadie *jamás* pone comentarios – vamos, casi nadie lee el blog para empezar) inmediatamente verifiqué… y ciertamente, era puro spam. Cambié la configuración predeterminada del wordpress, de manera que todos los comentarios requirieran aprobación previa, y cerré capítulo. Ni volví a pensar en ello…

…hasta hoy.

Amazon (mi amable proveedor de nubecitas) me mandó mi factura mensual, como todos los meses. Apenas y volteo a ver los correos: las cuentas suelen ser ridículamente bajas. Excepto hoy. Hoy, la cuenta reportada excedía en 10,000% (y no, no exagero) lo que normalmente pago. Lo que es… bueno, es bastante. Mi reacción fue inmediata: verifiqué el reporte de uso de Enero, observé con horror que la cuenta era correcta, bajé los reportes para un análisis posterior, y abrí una terminal para corregir los problemas. Los hallazgos fueron… terribles.

Los atacantes consiguieron acceso a través de una vulnerabilidad de exim (específicamente esta) y tomaron control del sistema. Se acomodaron felices, pusieron su bot, y descargaron… y descargaron…

860 Gigabytes.

El problema ya está controlado, y no hay hueco de exim por donde puedan volverse a colar. Al menos me llevo conmigo dos lecciones: la primera, dolorosa porque la repito (y suelo vivirla), no hagas las cosas mal, ni siquiera por hacerlas rápido. La segunda, y más importante en mi opinión, monitorea, maldita sea!. No porque sea tu servidor personal, y no un equipo de producción, te da derecho a olvidarlo a la buena de Dios. Pero en fin… echando a perder se aprende.

Al menos ya estamos de regreso. A ver que tal sale el servicio de correo de Amazon.

(Con disculpas a los profesionistas del tema, pero “me explotaron una vulnerabilidad” no tiene el mismo sonidito, o sí?)

Messenger 2011, Tweetdeck, y mi CPU: el asesino (no tan) silencioso

Como aquellos que me conocen saben, tengo una cierta costumbre de trabajar de noche. Es fabuloso para mí: nadie me molesta, no molesto a nadie (salvo por el ruido del teclado), avanzo muy rápido, la red está especialmente fluida… todo conspira para que sea mi horario de facto. Evidentemente, como me encanta la música, suelo traer puestos mis audífonos – los muy fantásticos MDR-NC7 de Sony, altamente recomendados por cierto – y evidentemente no escucho absolutamente nada de lo ocurre afuera.

Por ello, no me dí cuenta del problema inmediatamente.

Hoy en la tarde noté que tenía mucho calor. Esto es anormal en mi cuarto: desde que sergiob se mudó a Amazon, no existe un equipo de cómputo con su CPU al 100% todo el tiempo (y por ende, con ventiladores a máximo), lo que reduce muchísimo la temperatura – sin mencionar el gasto de luz eléctrica. Pero recuerdo bien la sensación… total que encontré las mismas condiciones, y me sorprendió mucho. Tenía la televisión prendida, y bueno, no me dí cuenta al inicio que los ventiladores zumbaban al máximo, prácticamente gritando “wey! Pon atención!” Llegó la noche y el calor continuaba. Con los audífonos, el ruido hubiera sido evidente – pero, afortunadamente, Elena marcó por teléfono. Y esto me forzó a quitarme los audífonos, a escuchar el ambiente… y a notar el tremendo ruido que causaba mi compu. Windows no viene con un monitor de recursos incrustable en la barra de tareas – como lo permite GNOME – de manera que no puedo echarle un ojo permanente a los recursos. OK, pero no es culpa de Windows, enteramente.

Un rápido vistazo al administrador de recursos dió con 3 aplicaciones que, alternadamente, se jugaban entre el 25% y el %60 de mi procesador. El primero es iTunes: viejo conocido de los problemas de CPU. El segundo fue Tweetdeck: entendible en que es Beta, aunque… qué demonios tiene que ocupar tanto CPU una estúpida aplicación que en resumen es un RSS reader? Ah, las maravillas de Adobe Air. El tercero, sin embargo, me sorprendió tremendamente: Windows Live Messenger.

Así es. El ubicuo mensajero, que solía ser de los programas menos demandantes (algo que contribuyó tremendamente a su adopción generalizada, por cierto – aquellos usuarios de Yahoo! Messenger o ICQ en los viejos días sabrán a lo que me refiero) – ahora resulta que es un hoyo negro para los recursos de mi sistema. Una ligera investigación reportó que, efectivamente, WLM 11 tiene un grave problema de recursos – relacionado con la “Vista completa”, donde permite recabar información de diferentes redes sociales. Al parecer, esta tarea acosa terriblemente al procesador, causando picos constantes que, a la larga, conllevan un aumento de temperatura, y todos los problemas que esto último ocasiona.

La mejor solución? Cambiar a “Vista compacta”. Por supuesto que se pierde el componente de redes sociales: pero francamente, prefiero enterarme de algo por las alertas del correo de Facebook, a que mi compu se muera prematuramente. El calor es un terrible asesino, como cualquier persona involucrada en soporte técnico puede asegurarles. Terriblemente efectivo, y lamentablemente fácil de evitar – si estamos dispuestos a controlarlo. Es por ello que me encanta mi panel de monitoreo en Debian, es por ello que pagaría buen dinero por un panel similar en Windows. Realmente lo vale.

Un último tip: otro posible problema de WLM 11 son los anuncios. Un anuncio mal programado (y créanme, los hay) puede inducir el mismo comportamiento excesivo de recursos. Así que ya lo saben: poco y bueno con el Messenger.

Poniendo colores de fondo diferentes a diferentes elementos de un ComboBox

Los comboBox son un control que permite seleccionar uno (y solo uno) de una lista de elementos. Algunos lenguajes los nombran dropDownBox, en HTMl es una etiqueta SELECT, etc.

En la familia .NET, no existe forma “sencilla” (objeto.propiedad) de cambiar el color de fondo para diferentes elementos. Pero con un poquito de investigación, descubrí que es posible redefiniendo el método que se encarga de dibujar cada elemento de la lista, en el control. Esto se logra:

1. Modificando la propiedad DrawMode del control, de “Normal” a “OwnerDrawFixed” u “OwnerDrawVariable” (este último es útil si se quiere modificar el tamaño de los elementos, de otra forma Fixed nos funciona perfecto).

2. Agregando un método al evento DrawItem del control.

3. Poniendo en ese método algo como:

private void _DrawItem(object sender, DrawItemEventArgs e)
{
e.DrawBackground();
Graphics g = e.Graphics;
switch ()
{
case 0:
g.FillRectangle(new SolidBrush(Color.LightGreen), e.Bounds);
break;
case 4:
g.FillRectangle(new SolidBrush(Color.LightCoral), e.Bounds);
break;
case 8:
g.FillRectangle(new SolidBrush(Color.LightYellow), e.Bounds);
break;
case 12:
g.FillRectangle(new SolidBrush(Color.LightBlue), e.Bounds);
break;
default:
g.FillRectangle(new SolidBrush(Color.LightGray), e.Bounds);
break;
}
string text = ((ComboBox)sender).Items[e.Index].ToString();
Brush brush = Brushes.Black;
e.Graphics.DrawString(text, ((Control)sender).Font, brush, e.Bounds.X, e.Bounds.Y);
e.DrawFocusRectangle();
}

🙂