Entradas de la categoría ‘Desarrollo’

El algoritmo de Tomohiko Sakamoto para torpes (o no)

Calculando el día de la semana

Calculando el día de la semana

Ayer nos íbamos a la cama con la noticia de la aparición de un nuevo algoritmo informático que devuelve el día de la semana de una fecha dada. Lo curioso es que no es cualquier algoritmo, si no que es el más corto, eficaz, simple y optimizado que se conoce hasta ahora. En sólo unas pocas líneas de código (en lenguaje C), su autor, Tomohiko Sakamoto, concentra toda la esencia de la algoritmia más genial para realizar un cálculo que siempre ha tenido un encanto especial para los programadores.

Intentaremos explicar de forma clara y concisa cómo funciona este algoritmo, aunque tampoco es fácil, pero lo intentaremos. Simplemente abstrayéndonos un poco y relajando nuestras neuronas, creemos que es bastante evidente y cristalino (o no).

Vemos primero el código de Tomohiko Sakamoto. Después la explicación.

#include <stdio.h>
 
 
int dow(int y, int m, int d) {
	static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
	y -= m < 3;
	return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}
 
int main(void) {
	const char *days[] = {"Sunday", "Monday", "Tuesday", "Wednesday",
				"Thursday", "Friday", "Saturday"};
	printf("%s\n", days[dow(2013, 5, 13)]);
	return 0;
}

El 1 de enero del año 1 después de Cristo, considerado el inicio de la era cristiana, es (fue) un lunes en el calendario gregoriano, calendario originario de Europa y actualmente utilizado de manera oficial en casi todo el mundo. Por lo tanto, el 0 de enero de ese año 1 fue domingo (este día técnicamente no existe, pero Sakamoto lo tiene en cuenta porque, aunque el estándar ISO 8601 del año 2004 estableció que la semana comienza en lunes, en Estados Unidos y en muchos otros países anglófonos el primer día es el domingo).

Cada cuatro años tenemos un año bisiesto con un día más en el calendario. Años bisiestos, pues, son todos aquellos divisibles entre 4 (con resto 0), salvo los años seculares (los últimos de cada siglo; los terminados en dos ceros [00]), excepto los divisibles entre 400. Por lo tanto, un año terminado en 00, tal que xx00, no puede ser bisiesto a menos que xx sea divisible entre 4.

Con estas premisas claras, Tomohiko Sakamoto determina que la fórmula y/4 - y/100 + y/400 devuelve el número de años bisiestos que hay desde el año 1 después de Cristo hasta el año dado.

La parte más difícil de entender es y -= m < 3. Esta sentencia especifica que si el mes en menor de 3 (enero o febrero), el año se hace igual al año menos 1 (y = y - 1) ; si es mayor de tres, el año se queda igual, o lo que es lo mismo que el año es igual al año menos cero (y = y - 0). Se entiende pues que, si el mes no es ni enero ni febrero, no podemos contar el 29 de febrero (si existe) del año dado.

Así pues, y + y/4 - y/100 + y/400 devuelve el día 0 de enero (realmente el 31 de diciembre del año anterior) del año dado. Además, como cada año tiene 365 días, es decir, es divisible entre 7 (días por semana) con un resto de 1 (día), a no ser que sea bisiesto, al día de la fecha dada se le incrementa ese resto de 1; en caso de ser bisiesto se incrementa en 2 (días).

La matriz t simplemente es un juego de números de días pasados desde que comienza el mes m+1. Por lo que t[m-1] + d es el número de días pasados en el año y hasta la fecha dada. La fórmula final (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7 es el resto del número de días desde el 0 de enero del año 1 después de Cristo hasta la fecha dada, lo que realmente es el día de la semana solicitado (teniendo en cuenta que el 0 es el domingo).

La matriz constante days guarda cadenas para sustituir los números devueltos por sus valores textuales.

La verdad es que es una delicia de algoritmo y, además, muy fácil de traducir a otros lenguajes de programación. Nuestro más alto respeto al autor.

Cuando el rover Curiosity llevó un ‘bug’ informático terrestre a Marte

Curiosity en Marte

Curiosity en Marte

Hace un par de años se descubrió un error informático que tenía ya 20 años de edad en el momento y que se localizó en multitud de dispositivos como coches, aviones, teléfonos móviles Android, maquinas que usan código abierto y hasta en el mismísimo Curiosity, el vehículo que la NASA envió a Marte en noviembre del año 2011.

El error se encontraba en el algoritmo de compresión de datos Lempel-Ziv-Oberhumer (LZO), creado por Markus Oberhumer, que fue el que descubrió y dio a conocer el fallo y compiló la nueva versión 2.07 del código corregido.

El algoritmo LZO fue creado en 1994 y, desde entonces, ha sido incluido en infinidad de sistemas, como por ejemplo OpenVPN, FFmpeg y el kernel de Linux. Oberhumer aseguró en su momento que la vulnerabilidad en el antiguo código podría provocar desbordamientos de búfer, denegaciones de servicio y ejecución remota de código bajo las condiciones necesarias, las cuales requieren tamaños de búfer enormes, e infrecuentes, y donde haya que descomprimir más de 16 MiB (224 bytes) dentro de un sola llamada a una función.

El impacto más grave cayó sobre plataformas de medios populares de FFmpeg y Libav, y muchos proyectos dependientes de ellos, como VLC Media Player y Handbrake. Los usuarios no actualizados y afectados pudieron ver comprometidas sus máquinas cuando reproducían películas, o audio, desde sitios maliciosos. El fallo también afectó a microcontroladores Linux utilizados en muchos dispositivos y máquinas, como coches y otros vehículos.

Un bug en toda regla que los humanos llevamos hasta Marte y que podría haber causado un conflicto interplanetario. O no.

Conectando la NES a Internet mediante ConnectedNES

ConnectedNES

ConnectedNES

Ordenadores baratos y diminutos (como el Particle Photon), comunidades de código abierto (como GitHub) y un poquito de imaginación es lo que se necesita hoy día para poner en marcha manufacturas tecnológicas increíbles. Bienvenidas todas las formas de expresión, hasta las que impliquen hacer añadidos a una NES para mostrar Twitter en pantalla.

Esto es, precisamente, lo que ha hecho Rachel Weil (usuaria hxlnt en GitHub), crear una especie de “módem” wireless que conecta la famosa consola ochobitera Nintendo Entertainment System a Internet. El proyecto, conocido como ConnectedNES y publicado en mayo de 2016, hace que tu NES se engache a la Red de redes vía Wi-Fi mediante un aparato que puedes crear tú mismo en casa y un software libre y gratuito que, por ahora, genera un cliente de Twitter en tiempo real, pero que tiene el potencial de ser ampliado a cualquier otro tipo de aplicación.

Pantalla de ConnectedNES

Pantalla de ConnectedNES

ConnectedNES está escrito en tres lenguajes: Javascript, el C/C++ de Arduino y ensamblador del 6502. Se alimenta de los datos enviados por los mandos de la consola a sus puertos correspondientes. Y es que cuando se presiona un botón en el pad, éste envía bits (ceros y unos) a través del cable hasta la NES, bits que indican qué botón ha sido presionado e información que se utiliza para controlar en juego.

La idea de Weil ha consistido en usar los puertos de los mandos controladores para enviar diferentes tipos de datos, los cuales los recoge un videojuego especial encargado de interpretar los comandos y de hacerlos efectivos. El resultado final es un Twitter de 8 bits.

Circuitos de ConnectedNES

Circuitos de ConnectedNES

Seguro que haremos un serio seguimiento de este proyecto y de sus avances.

Aprende a manejar emuladores de ZX Spectrum

'Spectaculator'

‘Spectaculator’

Recuperamos desde teknoPLOF! nuestro primer videotutorial retro publicado en el sitio web de ReadySetClick (¡seguro que habrá más!), casi media hora en la os enseñamos a utilizar emuladores de ZX Spectrum.

Los que dimos nuestros primeros pasos en esto de la informática delante de un ordenador de 8 bits aún recordamos con nostalgia las maneras en las que había que tratar a aquellos arcaicos cacharros y a sus periféricos. En los años ochenta la computación doméstica era todo un propósito de buenas intenciones, parca exactitud y mucho trabajo de campo. No existía Internet, ni amigos expertos en la materia ni, por supuesto, la ingente cantidad de información a la que tenemos alcance hoy día por diversas vías.

Pero hoy es distinto. Aquellos que no pudieron disfrutar de un Spectrum en su infancia, o aquellos nostálgicos que sí lo disfrutaron pero que ya no pueden acceder a él, tienen a su disposición un montón de emuladores, para casi cualquier plataforma, con el fin de retrotraernos a aquellos tiempos y poder manejar una máquina ochobitera como si la tuviéramos físicamente enfrente.

En este tutorial vamos a aprender (un poquito) a dominar un emulador de ZX Spectrum, concretamente Spectaculator, para escribir un pequeño programa y conseguir grabarlo en una cinta de casete virtual, que es el estándar que se utiliza en Internet para distribuir software de aquellos antiguos cacharros. Te recomendamos que lo veas a pantalla completa para no perder ripio.

¡Anímate y vamos a ello!

El juego ‘Flappy Bird’ corriendo en un cigarro electrónico

'Flappy Bird' en un eVic-VTC Mini

‘Flappy Bird’ en un eVic-VTC Mini

¡Más difícil todavía!, como dirían en el circo. Si alguna vez has creído que estabas enganchado a un videojuego, seguro que no era algo tan grave como esto.

Un tal Balázs Bank, ingeniero electrónico de la Universidad de Budapest, es tan aficionado al juego ‘Flappy Bird‘ que ha decidido que, en el caso de no tener su smartphone a mano, tiene que poder jugar en su cigarro electrónico. O, realmente, ha sido un desafío intelectual y tecnológico.

Bank ha hecho uso de su eVic-VTC Mini, un famoso vapeador, porque tiene una característica muy especial, y es que es capaz de recibir actualizaciones de su firmware a través de USB, además de poseer una estupenda pantalla OLED. A continuación, podemos ver el vídeo del juego corriendo en el eVic-VTC Mini.

Honestamente, el juego funciona bastante bien, teniendo en cuenta que se está ejecutando en un cigarrillo electrónico.

Balázs Bank ha colgado en Internet este firmware especial para el vapeador de Joyetech, dejándolo disponible para descargar a través de una cuenta en Mega y de una cuenta en Google Drive. Asimismo, aporta una serie de instrucciones para poder instalar este nicotínico y adictivo divertimento. Transcribimos (traducido) seguidamente ese pequeño manual de usuario.

Descargo de responsabilidades: Utilice este firmware bajo su propio riesgo. No se asume ninguna responsabilidad de daño en el dispositivo.

INSTRUCCIONES

Instalar el juego:

1. Descargue y descomprima el archivo correspondiente.
2. Conecte el eVic-VTC Mini al ordenador vía USB.
3. Abra el software oficial de Joyetech llamado UpdateFirmware.exe (también incluido en el fichero comprimido).
4. Haga clic en el botón Update y, a continuación, seleccione el archivo FlappyBird.bin.
5. Disfrute (o no) del “juego”.

Volver a instalar el firmware original:

1. Desconecte el cable USB y la batería del eVic-VTC Mini.
2. Pulse el botón derecho (y mantenga) en el eVic-VTC Mini, conecte el cable USB de nuevo y suelte el botón.
3. Ahora puede instalar el firmware original (también se encuentra en el archivo descargado) con el programa de actualización.

Por favor, dese cuenta de que hice esto en unas pocas horas, por lo que todavía está en fase beta.

Un pequeño paso para tecnología y un gran paso para los fumadores frikis.

eBook ‘retroPLOF!’

retroPLOF!

Especifica tu dirección de correo electrónico y pulsa 'Comprar ahora'. Puedes pagar con tu cuenta de PayPal o con cualquier tarjeta bancaria.

E-mail envío eBook:

Sigue teknoPLOF! vía…
 
RSS
Twitter
Facebook
Google
 
Ready Set Click!

Utilizamos cookies propias y de terceros para mejorar la experiencia de navegación. Más información.

ACEPTAR
Aviso de cookies