Habi Hablóg
Declaro:
XML válidoXHTML válido800x600 +
RSS válidoCSS válidoNavegador digno
  Blog   Archivo   Contacto   Administración  

Acerca de

Matemático, informático, aficionado a la electrónica, friki... y otras cosas que no vienen a cuento ni pasan los filtros de palabras.

¿Queríais un blog? Ahí va.

Red antisocial

¡Me van a volver loca! 2.0
La Fragata Portuguesa

Z
¡Me van a volver loca!

Últimos posts

El expediente X que nadie pidió
eNigma
La cuadratura del píxel
Portando desde Spectrum
Inexorable

Últimos comentarios

Habi
NoSupoResolverLaFuncion
Edu
Habi
EnriqueGG

Calendario

No hay fechas.

Categorías

Chorradas
Paranoias
Posts lúcidos
Tecnoesoterismo
Yuyus

Cenas de Abj

Abj debe 7 cenas.

Frase célebre

Zarith dice: o eso, o hago la calle 
 
Zarith dice: que por cierto 
 
Zarith dice: qué frío esta mañana!

The 7th thief

Habi - 09/05/2009 1:23:21 - Posts lúcidos

Volviendo atrás en el tiempo nos encontramos a Habi jugando a un juego en CD-ROM de los primeritos. De cuando no había casi nada en CD y encima no se podían grabar. Ese juego era "The 7th guest", publicado por Virgin (Trilobyte).

Es una historia de miedo (para mayores de 15 años, según la caja), la cual actúa como hilo conductor entre puzle y puzle, que es de lo que realmente va el juego. Está hecho con una mezcla de 3D prerenderizados y videos con actores de verdad, todo en dos CDs con una calidad muy buena para la época (nada de MPEG todavía) y una música muy correcta en onda / pistas de audio.

Los puzles son lo que uno cabría esperar: juegos de palabras, combinatoria, y algunos clásicos como los del ajedrez (caballos, alfiles, 8 reinas, etc). Con esta excepción:

Este juego de aquí se juega contra un adversario (AI), no es un solitario como el resto. Las reglas son simples:

  1. Cada uno en su turno elige una ameba de esas de su color, la cual puede hacer dos cosas: o se reproduce a una casilla adyacente o bien “salta” dos casillas de distancia.
  2. Una vez efectuado el paso anterior, las amebas contrarias que estén tocando a la de la nueva posición se convierten a su color.
  3. Se repite 1 y 2 hasta que no queden casillas libres. Gana quien más amebas de su color tenga.

Y no es fácil, juega bastante bien. De todos los puzles de ese juego, este me pareció siempre el mejor.

Pues bien. Hoy haciendo el tonto por el [archivo de World Of Spectrum], me he encontrado con esto:

Juego no publicado, cuyos autores hicieron para Virgin (Mastertronic) en su día. Y alternativamente para Amstrad CPC:

Y ya tirando de la madeja de esta cadena de fusilamientos descubrimos que a este juego se le llama Ataxx, en honor al primer clon del Infection. Para más detalles, la [página de la Wikipedia al respecto] y esta otra sobre la [versión para Amiga], en la cual descubrimos entre otras cosas que "Binary Magic" era el seudónimo de Craig Galley, el creador original del juego, el cual aparece por nombre en la versión Amiga:

Y aún más: si leéis la página de Spot (DOS) en este último sitio, hallaréis que quien estuvo detrás de esto fue Graeme Devine, quien estuvo en Mastertronic y luego en Trilobyte, Virgin mediante.

De las cosas que se entera uno.

6


Aventura

Habi - 29/04/2009 22:10:55 - Chorradas

Cuando uno se pone a mirar programas por dentro de vez en cuando uno se encuentra cosas. A veces son mensajes del tipo "No deberías estar leyendo esto", otras veces insultos, en algunas ocasiones intentos de ofuscación, cuelgue o incluso formateo del disco duro.

Otras veces uno se encuentra cosas simpáticas, como rutinas de debugeo que mandan mensajes a ventanas inexistentes, escriben la memoria de video monocroma o los mandan vía puerto serie.

Y otras veces lo curioso son las propias tripas, el funcionamiento del programa.

Hay un juego que me gusta, el Seiklus. Tengo por costumbre terminármelo en una horilla de vez en cuando. Pero en esta ocasión algo fue mal.
Podría haber sido por el Vista, por la arquitectura x64, por los nuevos DX, por los drivers de video... pero no, fue por la chapuza que es ese programa llamado Game Maker con el cual está hecho que no me funcionó del todo bien. Marcos negros alrededor de algunos de los sprites, y en cierto punto se me quedó colgado.

Me fastidió bastante la situación, así que me puse a hacer algo. Los ejecutables de ese programa son un pequeño runtime con el archivo del propio juego pegado (aunque encriptado). Es decir, una vez extraído, puede cargarse de nuevo en el Game Maker y tener acceso a todo el juego. Pantallas, personajes, scripts... todo.

Me bajé una versión 7, lo importé, y me puse a parchearlo, pues está hecho para una versión anterior (la 5): rehice la función draw_text_sprite, corregí las transiciones, las funciones de texto, las de viewport... y voila, un Seiklus compilado con la última versión que (medio-) funciona bien.

Mi descubrimiento, en la línea anterior del post, es que su creador ha definido sprites para objetos (personajes) que se encuentra en cada pantalla para recibir eventos. Como veis en la imagen, esos de la luna nunca aparecen en el juego. El de la corona está presente para coger las teclas durante el juego.
Junto con eso, notas internas para acordarse de cosas, un modo con trucos, fases de animación no usadas, repetidas para enlentecer (ya le vale) y una programación francamente mala. Tampoco es que el Game Maker de para mucho más, pero aún así.

Y con esto me despido, pues voy a jugarme por fin mi merecida partida.

0


Conversión funcional

Habi - 24/04/2009 13:06:17 - Tecnoesoterismo

A veces ocurre que es preferible expresar una determinada propiedad como condición sobre una expresión en vez de una sucesión de sentencias.

Veamos un ejemplo simple. Queremos comprobar que un cierto número X se encuentre entre otros dos cualesquiera A y B.

La forma normal de hacerlo sería ver cuál de los dos números A y B es el mínimo (y por tanto cuál el máximo, pudiendo ser iguales). A continuación se comprueba que X>=Min(A, B) y que X<=Max(A, B).

Sin embargo, esto puede expresarse con una simple fórmula y sin averiguar siquiera quién es el mínimo o el máximo. X está entre A y B si y solamente si (A-X)*(B-X)<=0. Esto bien puede ir como condición de un IF, al contrario que una sucesión de sentencias (en la mayoría de lenguajes imperativos).

Sea F(X)=(A-X)*(B-X). Es obvio que F(A)=F(B)=0. Y que para todo X entre medias, es mayor que uno y menor que el otro (+*- o -*+), luego el signo es siempre negativo. En el caso que sea mayor o menor que ambos, siempre será positivo (+*+ y -*- siempre es +).

Así pues tenemos una expresión booleana aplicable directamente en un IF, si estamos conformes con el coste de la multiplicación (respecto al de la llamada a una función, comparaciones e intercambio) y el resultado no desborda en rango. Si desborda, se usa Signo(A-X)*Signo(B-X) y arreglado.

Una función por el estilo más útil es Signo(A-X)+Signo(B-X), la cual nos devuelve 5 valores según el número sea menor que el mínimo, mayor que el máximo, el mínimo, el máximo o algo intermedio. Esto se deja como ejercicio para el lector.

Aplicado al caso anterior, X está entre A y B si y solamente si Abs(Signo(A-X)+Signo(B-X))<=1, lo cual es obvio si has hecho el ejercicio anterior.


Empecé a practicar este arte en mis tiempos con el Spectrum y su BASIC. Por aquel entonces el BASIC no tenía sutilezas como construcciones WHILE, REPEAT, ENDs para el IF y mucho menos procedimientos y funciones. Ni siquiera había etiquetas, pues cada línea iba numerada.

Y en concreto este dialecto no tenía ni un triste ELSE, mucho menos algo como un ON GOTO ni nada parecido. Sin embargo, tanto el GOTO como el GOSUB esperaban una expresión numérica. Así pues podía hacer por ejemplo un GOSUB 5000+500*A y saltaba a la subrutina adecuada, a partir de 5000 cada 500 lineas.

Se pueden ahorrar también de esta manera instrucciones IF, sabiendo que los operadores relacionales evalúan en {0, 1}. Es válido por tanto GOTO 1234*(A=9)+5678*(A=16), un LET A=27*(A AND 1)-42*(B=13) y cualquier expresión numérica que queráis, incluyendo incluso funciones definidas con DEF FN, etc.

El colmo de lo bizarro era generar en tiempo de ejecución una cadena con la expresión a evaluar y saltar a ella con GOTO VAL(A$), pues VAL convierte de cadena a número... pero esperando igualmente una expresión numérica en formato de cadena.

Ah, que tiempos cuando los lenguajes se parecían al ensamblador quisieran o no.

2


Radiollavero

Habi - 07/04/2009 15:10:48 - Chorradas

Radioluminiscencia: Fenómeno por el cual un material produce luminiscencia al ser bombardeado por radiación ionizante, por ejemplo partículas beta.

Espintariscopio: Instrumento para observar desintegraciones nucleares individuales; la imagen se genera por la interacción de radiación ionizante sobre una capa de fósforo.

Tritio: Isótopo radioactivo del hidrógeno, cuyo núcleo contiene un protón y dos neutrones.

Llavero: Utensilio en que se llevan las llaves.


^___^

5


Nigromancia

Habi - 25/02/2009 17:52:21 - Posts lúcidos

Cuando creé este blog hice que sólo pudiesen entrar quienes adivinasen un pequeño jeroglífico e hiciesen cierta operación con la palabra resultante; luego relajé mis criterios y lo abrí al público.

Ahora os propongo lo mismo para entender este post, sólo que sin jeroglífico. Y si por una pista alguien me preguntare, yo le respondiere: inerme zote.

5


Más microondas

Habi - 01/02/2009 20:47:51 - Tecnoesoterismo

Encuentra las diferencias entre:

Y:

Bien. Este es, o mejor dicho era, el microondas que los antiguos propietarios de mi actual piso se dejaron. Medio oxidado, lleno de mierda, sin bandeja, requemado y con un plato para suplir la falta de bandeja (con un borde metálico que causaba unas descargas de la leche, y que por otro lado explica lo quemado y lo oxidado).

No obstante, probándolo bajo circunstancias normales, el micro funciona, y bien. Así que un montón de componentes funcionales para mi colección:

Ahora es cuando debo hacer una advertencia: nunca, Nunca, NUNCA, ***NUNCA*** te pongas a trastear dentro de un microondas sin haber descargado el condensador de alto voltaje. Es esa especie de cilindro de metal aplastado, con dos conectores cubiertos por PVC negro, en el centro de la foto. Aunque algunos como este tienen dentro una resistencia para auto-descargarse, lleva algún tiempo. Salvo que te guste jugar a la ruleta rusa, hazme caso.

Además he conseguido un transformador, diodos e inductores A.V., un sistema de ventilación que reciclaré como extractor de humos, un temporizador / selector con su timbre, sensores de temperatura, una bombilla, motores, relé, interruptores, sensores de temperatura, ... y el magnetrón, por supuesto.

Ya veremos si lo dejo tal cual para algo indecente o lo destripo para quedarme con los imanes toroidales. En cualquier caso, los microondas son una mina de componentes caros.

5


Experimentos (IV)

Habi - 31/01/2009 0:53:12 - Tecnoesoterismo

Hace tiempo solía escuchar música en un lugar de internet de cuyo nombre si quiero acordarme: Pandora.

Ya no lo hago, pues restringieron su uso únicamente para gente de EEUU (debido a las restricciones legales de la música). Se puede entrar usando un proxy estadounidense, pero no es lo mismo.

En cualquier caso, es un lugar en el que te van poniendo música similar a la que escuchas, y tienes la opción de puntuar si te gusta o no la nueva que te sugiere. De esa forma, vas creando un perfil de cada cadena de radio definida de las varias que puedes tener, y vas descubriendo nuevos grupos, etc.

El otro día me acordé de eso, y me acordé de que tengo bastante música sin clasificar en el disco duro. Así que pensé hacerme algo similar a eso, sólo que un poco más... friki.

Así que empecé a programar. Primero le hice al programa el que fuese capaz de extraer audio digital de cualquier medio, usando para tal fin DirectShow; ya se trate de una entrada de línea o micrófono, sintonizadora, CD, ..., archivo mp3, wav, ogg, wma, ..., avi, mpg, wmv, flv, ... En general, cualquier cosa para la que se tengan codecs. Personalmente, tengo codecs que renderizan hasta archivos mod, s3m, it, ...

Para medir cuánto se parecía una canción a otra, pensé hacer un análisis de frecuencias. Para evitar meternos con números complejos, pasé de transformadas de Fourier clásicas e implementé una DCT (discreta de cosenos, que es siempre real).

Divido la canción por segundos y transformo; en otra dimensión, se ponen esas transformadas, lo que nos da una matriz bidimensional. A continuación se escala para todas las canciones por igual, y además los valores se transforman logarítmicamente y reescalan también para estar en las mismas condiciones de energía.

Aquí tenemos un par de ejemplos:

 

El primero pertenece a la canción "Within Temptation - Angels.mp3". Como bien se puede ver, aparecen unas franjas verticales de energía decreciente por bandas. Esto es debido a la compresión mp3, que enmascara rangos de frecuencias según sea su respuesta al oído. El caso extremo es en la derecha del todo, donde ha suprimido todas las frecuencias altas (que el oído ya no oye).

El segundo proviene de una pista de un CD, extraído directamente: "Mozart - Symphonie N°25 in g-Moll - KV 183 Allegro con brio.wav" (sí, también escucho música clásica). Aquí el decrecimiento de los coeficientes de frecuencias es gradual, y no se anulan las altas. También, como se puede ver, es menos monótono (en el tiempo) y más rico (en las frecuencias).

¿Es correcto escalar en el tiempo para poder comparar más fácilmente? Ya os contaré los resultados. De momento, ahora estoy con la última parte; pensaba hacer una matriz de pesos donde cada valor ponderase la diferencia de esa componente, definiendo el error como la suma de todos éstos. Y ajustar estos valores según lo haga de bien o mal (lo cual es equivalente a una red neural de una sola capa).

¿Alguna idea constructiva?

0


Concurso piramidal

Habi - 30/01/2009 21:32:24 - Posts lúcidos

¡Me han invitado a un concurso!

Lo organiza Araque [http://www.araquebelagua.com/2009/01/15/concurso-el-fuego/], y el premio es nada menos que un ejemplar de "El fuego" de Katherine Neville, una secuela de su libro anterior "El ocho", firmada por la propia autora.

Yanara [http://nosoloenlaces.blogspot.com/2009/01/el-fuego-de-katherine-neville.html] ha tenido a bien informarme de su existencia e invitarme; y he decidido participar.

Así pues, mis candidatos son:

Zarith -> http://zloca.blogspot.com/

Levtos -> http://fragataportuguesa.blogspot.com/

Tina -> http://tinaymag.spaces.live.com/

¡Suerte para todos! Y para mí, también.

2


Termografía barata

Habi - 11/01/2009 0:35:58 - Chorradas

Alguna vez me ha parecido raro el tipo de papel que daban los cajeros automáticos y los tiques (aunque parezca mentira es una palabra reconocida por la R.A.E.) de ciertos sitios. Me refiero a esos papeles finos, satinados y brillantes.

Pero ahí quedó la cosa. Sin embargo, hoy por accidente he descubierto qué tipo de papel es:

Es papel térmico, utilizan impresoras térmicas. Por si os interesan los patrones, diré que el tique estaba completamente estirado sobre una superficie plana (mi encimera de granito pulido) uniforme a temperatura constante. Sobre él puse un plato de fondo liso con una pizza caliente. Interesante la forma de propagación del calor, no todos los días puede verse en acción una solución explícita de la ecuación del calor (E.D.P.) bidimensional.

Hice otras pruebas, como acercarlo a una lámpara sujetando con un dedo, y vi como se ponía negro excepto donde se encontraba el dedo (se absorbía parte del calor), y como se marcaban las huellas dactilares en el borde (condiciones de contorno casi fractales).

En fin... nunca te acostarás... sin abrir la cama.

4


Adiós, Floppy, adiós

Habi - 10/01/2009 2:18:13 - Tecnoesoterismo

Finalmente he decidido quitar la disquetera de mi ordenador, y poner un lector de tarjetas en su lugar. Como despedida, este post.

No os hablaré de la vida y milagros de Alan Shugart, pero sí diré que al tipo de interfaz de disco que se encuentra en los PCs se le llama Shugart. Aunque tiene un poco de modificación con respecto al interfaz SA400 original como ahora veremos, es prácticamente la misma cosa.

Originalmente, en la norma había provisión para 4 unidades de disco, y el cable era una cinta plana de 34 conectores, con todos sus conectores IDC. La unidad lógica de cada unidad de disco se elegía con unos puentes en la propia unidad. IBM en su implementación redujo el número de unidades a 2, separó la señal del motor para cada unidad y dispuso las líneas pares de forma que si se invirtiesen (cruzando parte del cable, pines 10-16) se seleccionase el disco sin tener que hacer puentes.

Por eso vienen todos los discos configurados por defecto como DS1 (unidad B), y para que sean DS0 (unidad A) deben ser conectados al extremo tras el cruce. Como cultura general añadiré que todas las líneas impares están conectadas a masa, como en un cable ATA de 80 pines (existe un mecanismo para detectar unidades con los pines 3 y 5, pero en la práctica casi nunca se ha usado).

Diferencias:

Pin

SA400

IBM

6 DS3 Nada (o ED, 2.88 MB)
10 DS0 Motor DS0
12 DS1 DS1
14 DS2 DS0
16 Motor (¡todas!) Motor DS1

Ahora llega la frikada; la hice hace algún tiempo, antes de las fiestas. Esta vez no hay fotos, pero es fácil de seguir. Hay par de pines interesantes, son el 30 (los datos tal cual los lee la unidad) y el 8 (marca índice). Esos pines son que usa el autor del Disk2FDI para hacer su cable, con el cual se pueden leer ambos a través del puerto de la impresora. No obstante, no todo puerto paralelo vale para eso, y bajo Windows o Linux es imposible al no ser SOs en tiempo real.

La idea es esta: hacemos una operación de lectura, pero pasamos de los datos (o fallos) que nos dé el controlador de disco. Lo que hacemos es capturar a una determinada frecuencia los datos a través del puerto de la impresora, y luego tranquilamente según sea la modulación separar los datos de la señal de los de reloj y listo. Pista leída a bajo nivel. Después resta leer el formato lógico de la pista, localizar sectores, volcar información de cada uno, etc.

Yo pensé hacer una interfaz Shugart completa controlada por un PIC y que volcase los datos vía USB, pero al final fui más cutre: usé los 3 puertos B, C y D de un 16F877A como un contador, para generar las direcciones A0-A23 de una memoria (usadas realmente A0-A19); usé una memoria estática de 100ns que tenía, una DS1265W, convirtiendo a 3.3V usando 2 resistencias como divisor de tensión, y conectando I0 así a la salida de datos la disquetera (tras pasar por un 1N4148, y lo conecto también al PIC; de esa forma puedo leer luego los resultados). Desperdicia 7 bits de cada byte, pero es muy simple. También para simplificar leo desde el PIC hasta llenar el Mb (independientemente de la velocidad a la que leo o de si la disquetera ha dejado de leer) e ignoro (ni conecté) la señal de índice.

Después basta usar de nuevo el PIC para mandar los datos por el puerto serie (software, puerto A; el UART hardware está en el puerto C, conectado a la memoria) y listo.

Dado lo cutre del invento, los resultados fueron bastante buenos. Pude leer los datos en crudo y vi que se correspondían a los datos que debería tener esa pista del disco (si bien al final no hice ningún programa que separase los datos leídos de la señal de reloj y reconstruyese la estructura del disco).

Y es que YA hay al menos un programa que hace eso; y que los disquetes están obsoletos; y que tengo proyectos más interesantes (bajo mi punto de vista). Supongo que esa es la lección de este post.

0


Reglas del 10:
10 últimos   10 después   10 antes   10 primeros