Cómo alejarse de Facebook

Ya me harté de la adicción por Facebook, esa obsesiva necesidad de entrar a ver qué pasa cada vez que hay la mínima sensación de aburrimiento. El semestre pasado probé desactivar la cuenta, mas reactivarla es tan fácil como iniciar sesión. Intenté usar algo como Chrome Nanny, que si bien es una gran idea que limita el tiempo u horario que pasas en páginas, se puede evadir fácilmente desactivando la extensión.

Se me ocurrió entonces cambiar mi password por algo que no recuerde pero que sea [difícilmente] recuperable para poder regresar en las siguientes vacaciones, si es que todavía lo considero necesario. Además, desactivar la cuenta para quitar la tentación a la gente de interactuar conmigo a través de esa red.

Propongo el siguiente procedimiento (barroco, muy de mí) para lograrlo:

  • * En la terminal conectar a través de pipes un número arbitrario de funciones hash arbitrarias en un orden arbitrario. Por ejemplo: $ sha256sum | md5sum | sha512sum | md5sum (esto ingresará el standard input de la terminal a la función sha256sum, cuyo standard output se redirecciona como standard input del primet md5sum, y así sucesivamente. Recomiendo terminar con md5sum porque el output es más pequeño). Dar enter para ejecutar el comando.
  • *  Buscar un texto arbitrario y colocar un fragmento arbitrario como standard input del comando descrito en el paso anterior. También funciona escribir lo que les venga en mente, entre más arbitrario mejor. Terminar con Enter y luego Ctrl + D (EOF). El resultado será la nueva contraseña, por ejemplo algo como 916f4c31aaa35d6b867dae9a7f54270d. La idea de estos dos pasos es generar una contraseña de una forma casi imposible de reproducir.
  • * Anotar a mano la nueva contraseña en un papel que se pueda esconder fácilmente. Cerrar o limpiar la terminal que se usó.
  • * Entrar a Facebook y cambiar la contraseña por la recién generada.
  • * Desactivar la cuenta en Account -> Account settings -> Security -> Deactivate your account. Dar la razón que se desee.
  • * Esconder el papel con la contraseña en un lugar difícil de alcanzar pero que no sea fácilmente destruible o extraviable.
  • * Listo, ya te alejaste de Facebook.

Si tienen más ideas colóquenlas en los comments 🙂

Saludos

Cómo acceder al “roster” de los grupos de Blackboard aunque no esté habilitado

Este es un post para mis amiguitas y amiguitos stalkers del Tec.

Generalmente, para ver en Blackboard el roster de los grupos donde estamos inscritos -es decir la lista de alumnos que conforman el grupo- hay que ir dentro de la página de la materia, a Tools -> Roster y ahí hacer click al botón de Go. Como sea, hay ocasiones donde el profesor deshabilita esa opción (me ha pasado), o como ahora, donde si bien tenemos los grupos inscritos no tenemos ninguna herramienta o enlace habilitado.

UPDATE (2012-01-15, aunque debió haber sido antes) : Tona propone esta solución que es mucho más fácil. En el inicio de Blackboard ve a Send Mail, elige el grupo que quieres revisar, y luego ve a All Users. ¡Gracias Tona!

Aquí está un procedimiento que les permitirá acceder a la lista a pesar de las situaciones descritas arriba:

  • * En la página de inicio de Blackboard, haz click en el nombre del grupo que quieres revisar o copia la dirección del link (Click derecho -> Copy Link address) y luego pégala en otro lugar.
  • * Mira la URL de la página ya sea en la barra de direcciones o en el lugar donde la hayas pegado. Busca un fragmento como el que sigue, y copia el número que aquí marco en negritas: Course%26id%3D_123456_1%26url%3D
  • * Entra a la siguiente dirección, sustituyendo el número en negritas con el que copiaste en el paso anterior: http://cursos.itesm.mx/webapps/blackboard/execute/searchRoster?course_id=_123456_1
  • * Así accederás al Roster y ya solo tienes que hacer click a Go como sabes hacerlo

¡Saludos! 🙂

Nyan Cat 4’33” version: detrás de cámaras

Pues sí, me surgió la idea de unir en un video al Nyan Cat con 4’33” de John Cage.

El video se puede ver a continuación: Nyan Cat: 4’33” version

Para lograrlo no usé un editor de video gráfico, hice lo siguiente:

1) Obtener los 12 frames del GIF animado del Nyan Cat que está aquí. Para eso usé GIMP (consejo de @Mini0n) y nombré los archivos con el formato nyancat%02d.jpg (por ejemplo nyancat01.jpg para el primer frame)

2) Después usé FFMPEG para unir los frames en un video de acuerdo a esta página (el método que dice ahí para exportar las frames del GIF no me funcionó con este en particular). Específicamente el comando que usé fue:

$ ffmpeg -r 12 -i nyancat%02d.jpg -y -an sec.avi

(Le puse sec.avi al archivo porque al ser 12 frames corriendo a 12 frames/segundo, el archivo resultante dura un segundo)

3) Finalmente lo que hice fue concatenar el video 272 veces a sí mismo para obtener un video de 273 segundos (4 minutos y 33 segundos) de duración. Me basé en esta página y escribí este script:

#!/bin/bash
for i in {1..272}
do
    echo Pass $i #Imprime el número de concatenación
    cat nyan.avi sec.avi > out.avi # Concatena el video acumulado (nyan.avi) con el video de un segundo y lo guarda en out.avi
    mv out.avi nyan.avi # Renombra out.avi como nyan.avi
done
ffmpeg -f avi -i nyan.avi -vcodec copy -acodec copy nyan4_33.avi # Procesa y corrige el archivo concatenado

(antes de correrlo hay que haber copiado a sec.avi con el nombre nyan.avi, el video acumulado que empieza durando 1 segundo)

😀

Brainfuck Microcomputer

Brainfuck implemented in hardware 😀

Download it here:

brainfuckmicrocomputer.zip

Extract from README.txt:


The brainfuck Microcomputer is a VHDL-designed computer that uses
a VHDL-designed microprocessor with brainfuck programming language
as its assembly language.

With a proper suite of software, the hardware described by these
files can be configured in a FPGA in order to make the brainfuck
Microcomputer ‘come alive’.

What does the computer contains
Internally, the brainfuck Microcomputer has the following components:
* User-configurable brainfuck Microprocessor
* Program memory with an user-defined size
* User-configurable RS-232 UART
* Hardware to assist in memory programming

Externally, the brainfuck Microcomputer has the following pins:
* System clock input
* Mode Switch input
* Reset Button input
* UART receiving input
* UART transmitting output

Modes of operation
The computer described has two modes of operation: Programming Mode
(Mode Switch on) and Normal Mode (Mode Switch off). The first one allows
the user to download a program into the computer’s memory and the second
one executes it.
If the Reset Button and/or the Mode Switch is on, brainfuck
microprocessor is reset: the program counter, stack pointer and
registers are all set to zero.

Input / Output
Communication with the brainfuck Microcomputer happens through its
user-configurable RS-232 UART.
If the computer is in Programming Mode, bytes received by the UART
will be sequentially stored in program memory starting from the first
address.
If the computer is in Normal Mode, the UART will be used as the
input/output device required by the brainfuck programming language.
Note: the only UART parameter that can be configured is its baud rate.
The other parameters are 8/N/1
(8 bits of data, no parity bits, 1 stop bit).

User configuration
The brainfuck Microcomputer has some user-configurable parameters in
the GENERIC section of the main file:
* CLK_FREQ: The frequency (in Hz) of the clock that will run the computer
* BAUD_RATE: The baud rate of the UART
* D: Number of bits of the Program Memory Address
(i.e. program memory will have 2^ D words)
* P: Number of bits of Microprocessor Register Pointer
(i.e. there will be 2^ P registers to use by the program)
* S: Number of bits of Microprocessor Stack Pointer
(i.e. stack for nested loops will have 2^ S locations).

Brainfuck compilation
The brainfuck Microprocessor needs a compiled version of brainfuck
programming language. The binary file format is just a sequence of
compiled instructions.
The brainfuck commands are translated into instructions according to the
following rules:
* > becomes 0x80
* < becomes 0x81
* + becomes 0x82
* – becomes 0x83
* . becomes 0x84
* , becomes 0x85
* ] becomes 0x87
* [ becomes the offset-1 of the matching ].

As an example, let’s consider the following program:
++++ > , < [ > ++ < – ] > . ,

It has to be sent to brainfuck Microcomputer as the following sequence:
0x82 0x82 0x82 0x82 0x80 0x85 0x81 0x05
0x80 0x82 0x82 0x81 0x83 0x87 0x80 0x84
0x85

Note that the ] offset relative to the [ is 6, so [ has to be compiled
as 0x05.
Note also that if the ‘,’ at the end is ommited, program execution will
continue throughout the memory, overflowing the program counter and
returning to the beginning.

Brainfuck Microprocessor operation
The brainfuck Microprocessor is a physical implementation of the machine
model required by the language. It has a register bank that can
increment, decrement, output and store the register addressed by
a register pointer, which in turn can be incremented and decremented.
It also has a program counter with increment and load capabilities and
a stack that is used for return addresses of a loop.
The microprocessor has also a control unit and an instruction decoder.

The machine cycle of the processor consists of four clock cycles,
each with a corresponding state:
1) Output Program Counter to read program memory
2) Read, register and decode instruction
3) Execute instruction
4) Continue with instruction execution and update Program Counter

A summary of how the brainfuck instructions are executed:
(‘PC’ is ‘Program Counter’ and ‘current register’ is used to refer to
‘register pointed by Register Pointer’)
(0) > Increment Register Pointer and increment PC
(1) < Decrement Register Pointer and increment PC
(2) + Increment current register and increment PC
(3) – Decrement current register and increment PC
(4) . Ouput current register and assert activation signal
of output device.
If done signal is returned, increment PC, else do not modify PC
(stay here until done signal is returned – until data has been sent)
(5) , Assert activation signal of input device.
If done signal is returned, increment PC and save data to current
register, else do not modify PC
(stay here until done signal is returned – until data has been received)
(6) [ If current register is zero, add to PC the value of the
instruction (offset-1 of matching bracket) plus two in order to make
PC point to the instruction following the matching bracket.
Else, push PC into stack and then increment it.
(7) ] Pop stack. If current register is zero, increment PC.
If current register is not zero, load value from stack into PC.

Other
Any questions, improvements, comments are welcome 🙂

Amazing sounds of nature

Mi último programa, Amazing Sounds of nature (solo para GNU/Linux, hasta donde sé).

Lo pueden descargar de aquí: amazing.c

Para compilar:

$ gcc -o amazing amazing.c

Para ejecutar lo más probable es que tengan que hacer lo siguiente:

$ padsp ./amazing

(Para generar sonido, el programa escribe a /dev/dsp, dispositivo que probablmente no tengan. Usando padsp se “wrappea” el programa y se redirige la escritura a /dev/dsp al dispositivo de audio adecuado según PulseAudio)

Espero les agrade 🙂

[El detrás de cámaras]

Amazing sounds of nature: detrás de cámaras

Lo que hice para lograr a Amazing sound of nature fue lo siguiente:

  1. Encontrar un wav de Never Gonna Give You Up – Rick Astley. Realmente usé el OGG de Wikipedia y lo convertí a wav
  2. Leer el wav para obtener datos relevantes (canales, número de muestras, tamaño de la muestra, frecuencua de muestreo) y los datos de sonido.
  3. Escribir el fragmento relevante de datos de sonido como números en un arreglo. (Todo esto se deja como ejercicio para el estudiante, usando la especificación del formato WAV, yo use esta)
  4. Escribir el programa que reprodujera el arreglo. Para eso me basé en este tutorial

🙂

SejoProyectos: Verano 2011

Ahora que empezaron las vacaciones, no hay que desaprovechar la gran oportunidad que se nos está dando para realizar proyectos sin presiones y distracciones de la escuela.

En este post describo varios proyectos que tengo ganas de realizar este verano, los publico porque pienso que estaría muy bien que colaboráramos entre varias personas para desarrollarlos.

Cada proyecto tiene su título, una pequeña descripción, y una lista de actividades generales que el proyecto implica. Cuando dice diseño de hardware digital se refiere a usar VHDL e implementarlo en FPGA. Las actividades que contienen la palabra software están pensadas para ser realizadas principalmente en C o en Python, aunque también se aceptaría Java. Diseño y elaboración de PCBs implica hacer esquemáticos y plantillas de PCBs (Printed Circuit Boards), además de armarlos físicamente.

Si están interesados en trabajar en alguno de ellos o si tienen otras propuestas, no duden en contactarme a través de los comentarios de este post, de Twitter (@SrSejo) o de Facebook.

Redes neuronales en hardware: reconocimiento de imágenes

Aprovechando la flexibilidad y paralelismo de las FPGAs, en este proyecto se implementarán redes neuronales en ellas. La idea es tener una respuesta inmediata al recibir un estímulo nuevo, lo que le permitiría un funcionamiento óptimo en aplicaciones donde se requiere velocidad. Tengo interés en usarlas para reconocimiento de imágenes, especialmente en reconocimiento de caracteres escritos.

Actividades / Temas:

  • Diseño de hardware digital.
  • Software de interfaz PC – hardware.

Analizador lógico de múltiples canales

Un analizador lógico es un dispositivo que presenta los estados de una señal digital en función del tiempo. En el laboratorio usamos osciloscopios con este fin, con la gran desventaja de que solo cuentan con dos canales debido a la naturaleza analógica de sus posibles entradas. Este proyecto consiste en diseñar un módulo de hardware digital que al conectarlo a una computadora cumpla la función de analizador lógico de múltiples canales.

Actividades / Temas:

  • Diseño de hardware digital.
  • Software de despliegue (graficación) de señales / datos.
  • Software de interfaz PC – hardware.
  • Diseño y elaboración de PCBs.

Brainfuck microcomputer

Brainfuck es un lenguaje de programación ‘esotérico’ consistente en solo ocho instrucciones de un caracter de longitud cada una. La idea de este proyecto es diseñar un procesador junto con hardware periférico mínimo (e.g. interfaz serial) para obtener una computadora que funcione a base de Brainfuck compilado.

Actividades / Temas:

  • Diseño de hardware digital.
  • Software ensamblador / compilador de Brainfuck.
  • Software de interfaz PC – hardware.

Ropa con LEDs

Inspirado en tendencias actuales, este proyecto interdisciplinario (ingeniería + diseño) tiene como fin desarrollar prendas de vestir con LEDs que se encienden por acción de un microcontrolador.

Actividades / Temas:

  • Programación de microcontroladores.
  • Diseño de modas / gráfico / industrial.
  • Diseño y elaboración de PCBs, arreglos de LEDs e interconexiones.
  • Software de interfaz PC – hardware.

Experimentación con distintos microcontroladores y microprocesadores

Más que un proyecto, quisiera hacer pruebas con las siguientes plataformas: ATmega16 (el microcontrolador que sustituirá al 8051 en la materia de Microcontroladores), MicroBlaze (soft-processor de Xilinx que se puede implementar en una FPGA), x86 y x86_64 en Linux

Actividades / Temas:

  • Programación en lenguaje ensamblador.

Engineering: making your dreams come true 😛

Bash script para respaldar mi primer blog

Por un momento tuve miedo…

Leí que el 16 de marzo de 2011 cerrarían Windows Live Spaces, lugar donde hice mi primer blog. Tengo cierta obsesión por dejar evidencia de mi existencia, por lo que no podía tolerar la idea de que todos esos escritos desparecieran.

El equipo de Windows Live daba la opción de exportar a WordPress.com, para lo cual era necesario iniciar sesión con la cuenta que desde hace varios años no uso y por tanto dejó de existir…

Pensé en descargar la RSS Feed y/o a partir de ella cargar en Google Reader todos los posts, pero vi que estaba incompleta.

Las opciones restantes: buscar una forma de automatizar el respaldo del blog, o manualmente copiar cada uno de los posts. Es conocido mi amor por la automatización y mi simultáneo repudio por hacer manualmente actividades repetitivas, por lo que me decidí por la primera opción.

Busqué y encontré un patrón en las [horribles] URLs de los posts. Procedí a ver scripts de BASH pasados para recordar cómo programar ciclos, vi el manual de wget y de BASH, y programé al siguiente pequeño, que en lo que escribo esto ya terminó de respaldar mi blog :):


#!/bin/bash
echo "Entrando a directorio de archivos..."
cd archivos

for i in $(seq 109 974)
do
  echo "Intentando descargar archivo #$i..."
  wget -O $i.html http://sejomagno.spaces.live.com/blog/cns\!36CDD55860B8D63E\!$i.entry
  if [ ! -s $i.html ]; then
    echo "Archivo no existente, eliminando..."
    rm -v $i.html
  fi
done

echo "Regresando a directorio..."
cd ..
echo "Listo! :)"

Explicación:

Vi que las URLs los posts tenían la siguiente estructura: http://sejomagno.spaces.live.com/blog/cns!36CDD55860B8D63E!NUMERO.entry, donde NUMERO va del 109 al 974. Además, no hay posts en todos los valores intermedios de NUMERO.

La solución obviamente tenía que depender de wget, bendito programa para descargar archivos en URLs. (Random fact: este programa tiene un papel en la película The Social Network; Mark Zuckerberg lo utiliza para descargar fotos de sus compañeros para su página Facemash)

Lo que hace el programa en primer lugar es entrar a un directorio creado para guardar los posts descargados. Luego, hace que la variable $i tome todos los valores entre 109 y 974, y por cada uno de esos valores hacer cierta acción. La acción consiste en descargar el post en la URL correspondiente a ese valor de $i en un archivo llamado $i.html. En el caso en que el post no exista, se elimina ese archivo. Cuando acaba, se regresa al directorio donde fue llamado

Y listo, después de esta Sejoaventura, puedo sentirme tranquilo de que aunque Microsoft elimine sus Windows Live Spaces, lo que escribí se queda conmigo. Moraleja: procurar no depender de servicios externos para guardar ahí nuestro material multimedia (¿el texto escrito cuenta como multimedia?). Moraleja 2: la programación es bella y poderosa

Se aceptan sugerencias, comentarios y preguntas respecto al código 😀

Corrigiendo código en Javascript con Safari (Parte 1: Sintaxis)

(Este post tiene el propósito de servir de ayuda a los alumnos de TC1002 Fundamentos de Programación de la carrera LCD10)

La programación puede ser una actividad bastante gratificante por todo lo que permite hacer, pero a la vez puede ser muy frustrante cuando no sabemos cómo resolver un problema o cuando no sabemos por qué está mal el código que acabamos de escribir.

En otros lenguajes de programación, un programa no corre hasta que no está escrito correctamente, de lo cual se asegura un programa llamado compilaador. En Javascript, cuando algo está mal escrito, simplemente no pasa nada en el navegador, no sabemos por qué, y nos frustramos bastante… Surge entonces la pregunta

¿Cómo saber qué escribimos mal en Javascript?

La respuesta es bastante sencilla y, en el caso de Safari, está al alcance del navegador. Escribiré sobre Safari porque 1) es el navegador que utilizan las dos personas que hasta ahora me han pedido ayuda, 2) es el navegador qué más probablemente utilizan los estudiantes de LCD 😛

Cómo usar Safari para corregir código en Javascript:

  • Paso 1: Activar el menú de Developer / Desarrollador. Entra a Safari -> Preferences (o Cmd+,) y arriba entra en Advanced. Hasta abajo hay una casilla que hay que activar, dice “Show Develop in menu bar”. La puedes dejar activada siempre para facilitarte la vida. Nota que ahora en la barra de arriba hay una nueva opción
  • Paso 2: Usar la consola de errores cuando algún código no funciona. De ahora en adelante, cuando escribas tu código en un archivo html, abras ese archivo con Safari, y solo veas una pantalla blanca, lo primero que tienes que hacer es abrir la consola de errores. Puedes hacerlo con el nuevo menú Develop -> Show error console, o con “click derecho” -> Inspect Element, y en la ventana que sale apretar el botón que diceConsole. Ahí saldrán enlistados los errores y el número de línea en el que se encuentran

Tipos de errores

La consola nos mostrará principalmente los errores que tienen que ver con sintaxis, es decir los que tienen que ver con la escritura del lenguaje (falta de comillas o paréntesis, llaves de más o de menos, etc.). También dirá si escribimos mal alguna función como alert o prompt.

Como sea, dada la naturaleza de Javascript, no nos dirá si escribimos mal el nombre de las variables. Tampoco nos dirá por qué por ejemplo al final el resultado fue 10 en vez de 11, pues esos son errores semánticos (lo que está mal es la lógica del programa). Próximamente escribiré un post que servirá para corregir ese tipo de errores, pero mientras espero que esto sea útil 🙂

¡No dudes en comentar / preguntar!

PCB para Sistema Mínimo del AT89S51

La práctica 3 del Laboratorio de Microcontroladores consistió en armar (con cablecitos) y soldar una tarjeta con los componentes indispensables para hacer funcionar al microcontrolador AT89S51. Si bien ya se entregó, quise reforzar mis conocimientos de diseño de PCBs (Ver post anterior), por lo que hice este proyecto en KiCad.

En primer lugar tuve que crear el símbolo del microcontrolador para usarse en EESchema (el programa de KiCad para hacer esquemáticos). Aquí está el archivo de la librería que lo contiene: Librería de Kicad con el AT89S51

Luego ya lo usé para crear el esquemático y después la PCB (vuelvo a recomendar este tutorial)

Les dejo un screenshot del resultado

Ya la mandé a hacer, por lo que este post tampoco ha concluido…

De aquí se pueden bajar los archivos del proyecto: Archivos de Kicad para el Sistema Minimo del AT89S51