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

Habi dice: y yo que no estoy acostumbrado, ¡noto que algo se mueve en mi bolsillo!

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


Reyezuelos

Habi - 07/01/2009 13:22:23 - Chorradas

Con todos ustedes, el regalo estrella de este año:

^____^


Por otro lado, parece que este blog ha recibido también un regalo de reyes. El día 5 detecté un nuevo lector, o al menos algo parecido.

Ese día me dio el punto y miré los logs de los accesos que había habido desde el último reset, y localicé una araña que no conocía. Se identificaba como "Bloglines/3.1 (http://www.bloglines.com; 1 subscriber)".

Tras ir a bloglines y ver que es un sitio de seguimiento (tipo la página personalizada de Google, menos bonito pero más poderoso), localicé la ficha que tenían del blog, y a partir de ahí quién me tenía añadido; llamémosle Y.

Mirando su lista de suscripciones, mirado los blogs con menos suscriptores para simplificar y aumentar la posibilidad de comentarios y buscando éstos a su nombre, pude localizar su propio blog (llamémoslo NSE) en Blogspot y por tanto su perfil (señorita barcelonesa), coherente con el lenguaje de algunos comentarios, y con el IP de acceso que tengo registrado en el blog (Telefónica de Barcelona, usando Opera/9.23 (Windows NT 5.1; U; es-es) (léase: Windows XP, navegador configurado en castellano), siendo el primer acceso y añadido a Bloglines el 16-11-08 a las 12:17, si no me equivoco. De reyes poco, pero puede valer.

Hay algo que me asusta: ver un enlace a mi blog entre enlaces a BULMA, Microsiervos, Geek in love, Kirai, Pixel y Dixel, Tecnorantes, ...

NOTA: Si lees esto, Y, no te asustes; es mi forma de decir "Hola".

5


Malkari

Habi - 06/01/2009 3:15:04 - Tecnoesoterismo

Hace poco descubrí un juego antiguo de estrategia espacial para Windows que no conocía: el Malkari; así que me dispuse a probarlo de inmediato.

(NOTA: Esto no es lo que parece... no es una reseña.)

No obstante, este juego no funciona en Vista, ni con modos de compatibilidad ni nada, así que me puse a experimentar con él. Haciendo pruebas, comprobé que tampoco era posible hacerlo funcionar en XP, y claro está tampoco en 2000. Sin embargo, en 98 y ME iba perfecto.

¿Por qué no funcionaba en núcleos NT? ¿Qué operación no válida era la que causaba su cierre?

Movido por la curiosidad, le metí un depurador. Cuando se produjo el error vi exactamente qué estaba ocurriendo: estaba accediendo (escribiendo) a una dirección de memoria en el proceso un poco más allá de 0x000B0000.

Por si no lo saben, el Windows mantiene cada proceso en un espacio de direcciones separado. Lo normal es que por la parte baja estén algunas tablas del SO, la aplicación empiece sobre los 16MB y de los 2GB (3GB si se usa cierta opción) en adelante esté el monitor de Windows, con gran parte del código y datos compartidos entre todos los procesos.

Una diferencia fundamental y poco conocida entre los núcleos 9x y NT es que los primeros además mapean la mayor parte de la memoria DOS por debajo del primer MB, compartida además entre todos los procesos. Así es más fácil y exacta la emulación del DOS y además proporciona una cierta capa de compatibilidad para aplicaciones de 16 bits y algunas de 32 antiguas. Por eso este acceso a la memoria no falla en núcleos 9x.

¿Y qué hay en esas direcciones? Pues ese el rango de direcciones de la memoria de video de texto monocromo, una MDA, para la cual no hay drivers de Windows y por tanto los accesos no se virtualizan; ni tampoco se bloquean, por estar mapeada la memoria.

En los tiempos del DOS era una práctica común usar una MDA junto con otra tarjeta gráfica para depurar una aplicación, ya que el rango de monocromo era siempre ignorado por la misma y quedaba libre para el depurador. Es la primera vez que veo esto en Windows, por parte de una aplicación, para sacar sus mensajes de depuración; con lo simple que es usar OutputDebugString o escribir los resultados a un fichero.

La solución es trivial, bien parchear el ejecutable o crear un lanzador que tras crear suspendido el hilo primario del proceso mapee la memoria con VirtualAllocEx. Sigue fallando tras eso por otras causas triviales y fácilmente corregibles, pero eso... es otra historia, como bien dijo el narrador de Conan.

0


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