Bichología

Ayer platicaba con Elena acerca del servicio social que está realizando en la FES Zaragoza, en el área de Microbiología… aparentemente le apasiona mucho eso de los bichitos. Total que me comentaba que estaba subiendo sus fotos a Facebook, y en aras de mantener el control sobre las fotos, así como una facilidad sobre su administración, decidí configurarle un blog…

http://bichologia.sergiob.org

Sugiero ampliamente visitarlo. Apenas va empezando, pero tengo entendido que en breve será llenado profusamente de fotos interesantes.

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();
}

🙂

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…