Ejemplo de regex de vim: Obtención de títulos de imágenes

Como parte de una tarea me pidieron enlistar todos los miembros del Khronos Group en las diferentes áreas. Al entrar a la página vi que no había una lista definida de nombres, más bien el grupo de logos y luego una pequeña descripción de cada miembro.

Por ejemplo, la página de “contributors” es la siguiente: http://www.khronos.org/members/contributors/

Para bien o para mal, da flojera copiar los nombres a mano, más sabiendo que el asunto se puede automatizar. En este caso noté que en los “title” de los logos venía el nombre de la compañía. Viendo el código fuente, a partir de la línea 374 hay etiquetas como esta:

<div class=”member_logo”><a href=”#3d_inc1″ title=”3D Inc.” class=”scroll_to”><img src=”/assets/uploads/sized/assets/uploads/member_logos/3D_logo_Mark_shadow-155×163.png” width=”155″ height=”162″ alt=”speaker” /></a></div>

Así para los 92 contribuidores (contados con wc -l contributors donde contributors fue el archivo donde guardé la lista depurada… pero me estoy adelantando)

El problema entonces es quitar todo el código y dejar simplemente el contenido del campo “title”. Es un buen uso de las regex de vim (o de lo que sea, pero en vim viene cómodo).

Para este caso usé lo siguiente

:%s:^.\+title=”\(.\+\)” class.\+$:\1:g

Donde:

  • :%s: indica que se hará un search y replace (s) en todo el documento (%)
  • ^ Busca el inicio de la línea
  • .\+ Busca uno o más (\+) caracteres del que sea menos newline (.)
  • title=” Busca exactamente esa cadena de caracteres
  • \( Agrupa los caracteres entre ese símbolo y el \), que vendrían siendo el contenido entre las comillas y por tanto el nombre de la compañía
  • .\+ Busca uno o más (\+) caracteres del que sea menos newline (.), es decir el nombre de la compañía
  • ” class Busca exactamente esa cadena de caracteres. Es necesario especificarla porque los comandos son “greedy” y \(.\+\)”.\+$ haría el match hasta las últimas comillas que encontrara, en vez de las primeras que son las de interés
  • .\+ Busca uno o más (\+) caracteres del que sea menos newline (.), es decir todo el código restante
  • $ Busca el final de la línea
  • :\1: El replace pattern, que en este caso solo es el contenido del primer (y único grupo), es decir el nombre de la compañía
  • g Aplica todas las veces que haga match en la línea (aquí no sería necesario)

Por último, como hay newlines entre los nombres, podemos quitarlas con

:g:^$:d

(Esto último apenas lo aprendí acá porque no sabía y me dio flojera borrar las líneas a mano, más sabiendo que también debería ser automatizable jejeje)

Y ya, el resultado lo guardé en un documento de texto (contributors que mencioné arriba) del cual luego se puede copiar el contenido a la tarea.

La página de la que he aprendido sobre los regex de vim:

http://www.softpanorama.org/Editors/Vimorama/vim_regular_expressions.shtml

Texto autodescriptivo, prueba 1 (y 0)

Este párrafo habla sobre este párrafo. ¿Qué puede decir un texto sobre sí mismo? Puede describirse. Por ejemplo, aquí en total hay 455 caracteres, de los cuales 79 son espacios. Están escritas 333 letras: 149 vocales y 184 consonantes. El caracter más repetido es “e” porque aparece 55 veces, y hay 27 dígitos que sumados dan 100. Este texto fue escrito por Sejo el 18 de febrero de 2012 con ayuda de una computadora. Sí, toda la información es verdadera.

Digamos que la prueba 0 fue:

Este tuit tiene doce vocales.

Todo empezó hace rato en el coche cuando generaba de esas frases que me gustan, “Nunca encontrará la respuesta a la pregunta de por qué nunca le encontrará respuesta”, “Solo tiene un tema de interés: El hecho de que solo tenga un tema de interés”.

Pensé que estaría rifado tener una tesis doctoral cuyo tema fuera ella misma, un texto autoreferente que además explicara cómo se logró esa autoreferencia, algo así.

Pero bueno, decidí empezar por lo simple. La prueba 0 la hice escribiendo a mano, para la prueba 1 decidí ayudarme de un programa.

La principal complicación surgió cuando quise agregar el dato de cuánto sumaban los dígitos presentes. Fue bonito (?) observar oscilaciones, i.e. la suma daba cierto número que hacía que la suma diera otro número que hacía que diera otro número que en algún momento era el número que ya había dado al principio. Hubo que echarle un poco de reflexión. (Como dato curioso, el 100 que quedó en la versión final puede cambiarse por cualquier entero entre 100 y 109 y sigue siendo verdadero)

Las siguientes pruebas deben incluir la complicación de expresar las cantidades de letras usando palabras, para que suceda lo mismo que sucede en la prueba 1 con el número de caracteres, el número de dígitos, la suma de esos dígitos, y el caracter más repetido (su presencia hace que ellos mismos cambien).

No pongo el código que usé porque no quiero spoilearlos. Pero más o menos hace lo mismo que yo hice en la Prueba 0: escribir la frase, medir la(s) variable(s) requeridas para actualizar la frase, y repetir hasta que se estabilice (ya sea solo o con ayuda externa). Extra hint: usé C y la función sprintf de stdio.h (claro que eso solo concierne a la implementación del algoritmo y es para nada fundamental…)

Por último, el comic de XKCD al respecto del tema: http://xkcd.com/688/

:)

Sistema de hombre en la isla (así juego a los Sims jaja)

Todo empezó por estar pensando en qué tanta energía consumiría pensar intensamente jaja.

Imaginé una situación donde una persona estuviera en un lugar con recursos alimenticios limitados (una isla), requiriera pensar para conseguirlos, pero a la vez el pensar le hiciera consumir la energía de esos recursos…

Aprovechando la clase de Modelación de Sistemas Fisiológicos, me sonó que podía modelar esa situación con un sistema de ecuaciones diferenciales y simularla jaja…

Planteo tres variables:

  • A: Cantidad de comida almacenada en la casa (o refugio) de la persona. Es la que puede consumir inmediatamente.
  • B: Cantidad de comida disponible en la isla. Hay que recolectarla
  • C: Cantidad de “conocimiento” de la persona (jaja)

Luego planteo algunas condiciones:

  • La cantidad de conocimiento va a crecer proporcionalmente a la cantidad de comida almacenada (se motiva, no sé jaja).
  • La cantidad de comida disponible en la isla va a decrecer proporcionalmente a la cantidad de conocimiento de la persona, pero también entre menos comida haya más difícil será obtenerla.
  • La cantidad de comida almacenada en la casa se consumirá a una razón proporcional a la cantidad de conocimiento de la persona (entre más sabe y más piensa más tiene que comer) y crecerá conforme se obtenga comida de la isla.

En ecuaciones diferenciales, quedaría así:

  • dC/dt = k1*A
  • dB/dt = -k2*C + k3/B
  • dA/dt = -k4*C – dB/dt

Y pues ya, como vimos en clase, usé la función de MATLAB/Octave “ode45” para simular y jugar con el sistema, cambiando las condiciones iniciales y los diferentes factores, estuvo entretenido jaja. Aquí hay una de las gráficas resultantes:

(Sí, ahí el hombre no dura mucho en la isla jajaja)

Claramente el modelo está incompleto (¿qué pasa con la conciencia ambiental y propia conforme el conocimiento crece? ¿qué otras motivaciones habrían para el crecimiento de este conocimiento? ¿cómo trata el ambiente a la comida almacenada? etc…) pero bueno, solo quería resolverme la duda de si podía aplicar lo visto en clase en esta situación “propia”.

Y bueno, lo importante, aquí están los archivos de MATLAB/Octave (yo usé Octave, para MATLAB habrá que revisar que la sintaxis sí sirva así como está). Hay que ejecutar el que se llama “simulacion”, el otro lo que hace es definir las ecuaciones para que la función ode45 (o cualquier otra de la familia) pueda resolverlas numéricamente.

SimHombreIslaComidaConocimiento

Debería haber usado este tiempo en resolver el examen de esa materia… pero bueno

😛

Another, Other, Others

Una página que hice para unos puntos extras en mi clase de inglés

😛

http://sejomagno.org/english/anothers/

Javascript + CSS, nada del otro mundo pero lo publico para documentar su existencia.

Cómo descargar la foto de credencial del Tec usando la nómina

 

Ahora la iniciativa fue de mi amigo Óscar Dávila.

Consiguió la URL para descargar la foto de una nómina dada, así que la agregué a mi programita:

http://sejomagno.org/foto/?nomina=L0XXXXXXX

Como referencia, el comando con curl sería:

curl -o foto.jpg --header "Referer: http://info0.mty.itesm.mx" https://alsvcft01.itesm.mx/empleados_img/L0XXXXXXX.jpg

Y bueno, si bien con eso ahora la cuestión podrían buscar quién tiene la nómina equivalente a su matrícula (?), lo importante sería cómo conseguir la nómina de una persona determinada.

Al parecer los alumnos no tenemos una forma sistematizada de lograrlo. Como sea, existe Google y la falta de cuidado en el Tec. Por ejemplo, buscando una nómina conocida, encontré este archivo:

http://www.ccm.itesm.mx/dse/sei/archivos/registro_listas.xls

LOL

Have fun!

Disclaimer: esto lo hago con mentalidad geek y/o white hat hacker, no tengo intenciones malignas

:)

Cómo descargar la foto de credencial del Tec usando la matrícula

(UPDATE: Ahora pueden usar la siguiente URL: http://sejomagno.org/foto/?matricula=A0XXXXXXX )

Esto se podía hacer hace tiempo con una URL en la que cambiabas la matrícula y veías la foto de la credencial de la persona en cuestión. Ese método fue deshabilitado, y nada, ya no me acordaba.

Hace rato mi amigo Mario Recio me hizo ver que en el Portal de Alumnos, en la parte de Historia Académica, se descarga la foto propia. Como sea, si usas la URL que viene ahí para intentar bajarla por separado, te sale que el acceso está prohibido…

La curiosidad fue enorme, el no poder resolver el reto me picó el orgullo y me hizo intensear (positive feedback!)… y ya, después de un rato de reverse engineering, de muchas pruebas e ideas fallidas, llegué a la solución. Busqué qué tanto podía simplificarse, y finalmente resultó ser algo muy estúpido.

Basta de introducción

Necesitan el programa “curl“. En GNU/Linux y Mac OS X lo deben tener por default, en Windows no sé pero creo que lo pueden descargar.

Abran una terminal (Mac users: en Applications->Utilities o Cmd+space “Terminal” enter, GNU/Linux users: deberían saberlo, y si no, googléenlo para el caso de su distribución específica) y escriban o copien lo siguiente:

curl -o foto.jpg --header "Referer: http://info0.mty.itesm.mx" https://rzncal.itesm.mx/alumnos_img/A0XXXXXXX.jpg

UPDATE (2012-02-03) gracias Óscar Dávila por informarme que el servicio ya no funcionaba. Volví a revisar el Portal de Alumnos y vi que la URL de las fotos cambió. No sé si tenga que ver con la existencia de esto, pero bueno. Ahora es:

curl -o foto.jpg --header "Referer: http://info0.mty.itesm.mx" https://alsvcft01.itesm.mx/alumnos_img/A0XXXXXXX.jpg

Y ya, eso guardará la foto de la matrícula A0XXXXXXX.jpg en “foto.jpg” dentro de la carpeta en la que ejecutaron el comando (por default será su carpeta home)

Si alguien gusta hacer un web service para acceder más fácil, debería hacerlo (¡y compartirlo!) Ok, ya lo hice yo en PHP, usa el mismo principio jaja.  http://sejomagno.org/foto/?matricula=A0XXXXXXX

Let the stalking begin! (or continue!)

Programador de ATmega16 en Arduino

Después de buscar sin resultados durante la semana un ATmega16, ayer viernes lo compré para poder probar este proyecto…

El código se descarga de la siguiente dirección y ahí trae documentación sobre cómo usarlo y cómo funciona.

ATmega16_programmer

En resumen es un programador en Arduino para el microcontrolador ATmega16 usando SPI.

😀

Una foto de mi setup de pruebas donde trata de apreciarse lo sencillo del sistema:

Desde que llevé Microcontroladores (TE2023) me surgió con Dante la inquietud de hacer un programador, en ese entonces para un 8051. De proyecto final terminé haciendo más bien un ensamblador del lenguaje ensamblador de ese micro (veo que no lo he subido por acá), pero bueno, siguió la idea.

El semestre pasado la materia cambió a usar el ATmega16, y bueno, en estos días pensé que estaría bien hacer un programador en Arduino porque es una herramienta que se ha hecho popular y ubicua. Así los nuevos alumnos de la materia, en vez de usar el TopMax del laboratorio o de comprar un programador propio, pueden usar la tarjeta Arduino que probablemente ya tengan.

El lunes programé las funciones de SPI, dejé pausado el proyecto hasta tener un micro donde probarlo, y ya que el viernes lo conseguí, escribí el parseo de los archivos HEX. Ahorita estuve asegurándome de que funcionara bien (escribiéndole al micro archivos HEX que tengo por aquí y revisando la memoria de programa), escribiendo la documentación que está en el código, y agregándole la licencia de Software Libre (¡los invito a mejorarlo!).

No sé (todavía) escribir código para ese microcontrolador, así que agradeceré que me avisen cuando le pongan un programa funcional usando esta herramienta.

¡Feliz inicio de semestre!

:)

 

Simulador de Carta de Smith

En este semestre que pasó tomé la materia de Medios de Transmisión (TE3007), donde me interesó mucho la Carta de Smith por ser una solución gráfica ingeniosa.

Me entró la curiosidad de programarla usando Processing.js, del cual había leído y quería usar pero no había tenido la oportunidad. Durante el semestre en un rato libre que tuve programé en sí la plantilla de la Carta, con ciertos problemas para dibujar correctamente las curvas de reactancia (si bien la ecuación que las genera es sencilla, el problema era enmarcarlas en el círculo unitario dado que no hay alguna función para enmascarar: hay que graficar solo los arcos visibles)

En estos días a ratos limpié e hice funciones para graficar las diferentes variables, y ya hoy implementé el uso del mouse. La idea original era hacer un simulador más completo que el del material multimedia del Ulaby (Fundamentals of Applied Electromagnetics) haciendo una interfaz con HTML/Javascript pero a la mera hora se me hizo mucha talacha. Podemos dejar eso como “trabajo a futuro”, al fin estoy liberando el código con GNU GPL.

Ahorita que publico esto, el simulador grafica las curvas de la impedancia normalizada, el vector y círculo de magnitud constante del coeficiente de transmisión, y el círculo del componente resistivo que corresponde al VSWR, además de imprimir sus respectivos valores.

El sitio del simulador es el siguiente: http://sejomagno.org/SmithChart

Árbol de Navidad con displays de 7 segmentos

http://www.youtube.com/watch?v=7SR2s0dW_-M

Hace como dos semanas tuve la idea pero apenas estos días pude llevarla a cabo.

El lunes compré los materiales y hoy acabé, la verdad es que el sistema es muy simple pero armarlo fue más talachudo de lo que pensé.

El circuito consiste en 15 displays de 7 (8) segmentos de cátodo común. Los cátodos de cada lámpara van a un decodificador de 4 a 16, y todos los ánodos están en mismos nodos. Así, se requieren 12 líneas para controlar: 4 para seleccionar la lámpara a encender, y 8 para encender o apagar cada segmento o punto.

El algoritmo de control no es novedad: cada cierto tiempo se selecciona una lámpara y se colocan los valores de encendido / apagado que se desean para esa lámpara, así una por una. Esto se hace a una velocidad tal que para el ojo humano parece que todas están encendidas al mismo tiempo.

Adjunto un archivo que sirve como plantilla para controlar el árbol con un Arduino Uno. Si alguien quisiera probar alguna animación / patrón, puede modificarla y enviármela para que lo pruebe

😛

SevenSeg_XmasTree_Layout

Plantilla de LaTeX para los encabezados de tarea del Tec

Prefiero usar LaTeX en vez de Office u otros similares libres (que no tengo) o de Google Docs. A veces en el Tec piden tareas con cierto encabezado, con el inconveniente de que te lo dan en Word para que lo copies y pegues. Dado que eso está fuera de mis posibilidades, hice esta versión del encabezado para usar con LaTex.

EncabezadoTec.zip

No es exactamente igual pero por el momento me funciona. Mejoras son muy bienvenidas. Además, el header incluye paquetes que he usado en varias ocasiones con diferentes fines (sans-serif, formato APA, texto en ecuaciones, idioma español, etc.)

Para generar el documento PDF (ya incluido como muestra en la carpeta ZIP):

$ pdflatex PlantillaTec.tex

Recomiendo este manual para aprender a usar LaTeX: The Not So Short Introduction to LaTeX – Purdue University