miércoles, 29 de abril de 2015

Enigma de los monjes (Solución)

Ya se me había olvidado acabar el enigma de los monjes...

Este problema no es dificil si empezamos por el caso más fácil y lo vamos extrapolando. Sería un poco hacer una demostración por inducción. Es decir, primero se demuestra que un caso concreto es verdad y a continuación se demuestra que si el caso n es verdad, el n+1 también lo es. Así quedaría demostrado para todo n.

Aplicado a nuestro problema primero miramos un caso concreto, el más sencillo.
n=1 >> Solo hay un monje con marca en la frente:
-Esa noche ese monje verá que nadie tiene marcas.
-Los demás solo ven la marca de ese compañero (aún no pueden saber si ellos mismos la tienen o no)
-Alguien ha de tenerla, así que el monje deduce que él mismo la tiene.
-Al día siguiente se va.
-Por la noche cuando los demás monjes ven que falta el compañero entienden que ellos no tienen marca.

Y ahora intentamos ver que a partir de ese caso se pueden deducir inductivamente todos los demás.
n=2 >> Dos monjes con marcas.
-Los que tienen marca ven solo una, la del otro.
-Así que en principio creen que están en el caso n=1 y que mañana faltará el otro.
-Ambos deciden no irse.
-Al día siguiente en la cena siguen viendo una marca y deducen que si el otro no se ha ido es porque no estamos en el caso n=1. Por tanto ha de haber dos (3 no porque estarían viendo 2)
-Ambos deciden irse.
-Los que no tienen marca ven 2, y al cabo de dos días ven que faltan dos compañeros. Ahí entienden que ellos no tienen la marca.

Por si acaso vamos a ver el siguiente caso:
n=3 >> Hay tres marcas.
-Los que tienen marca están viendo 2 y piensan que estamos en n=2.
-Por tanto creeran que los otros dos están viendo una y que creen que están en n=1.
-Al día siguiente nadie se va. Queda descartado n=1.
-A los dos días nadie se va. Tampoco estamos en n=2.
-Ahí los 3 a la vez se dan cuenta que no es cosa de los dos marcados que están viendo sino que ha de haber un tercero y ha de ser él mismo.

Si pasan n días y tú ves que n marcados no se van, es que tú tienes la marca también, estamos en n+1, y nos vamos todos.

Así es como saben si tienen marca o no y en siete días se van siete monjes (o seis dependiendo de si cuentas también el día inicial o no)

Es curioso ponerse en la piel de un monje con marca de un total de 8 marcados. n=8.
Verá 7 y pensará que está en n=7.
Por tanto cree que la cosa no va con él y que el resto de marcados ven 6 y creen que están en n=6.
Por tanto pensarían que el resto de marcados ven 5 y creen que están en n=5.
Por tanto creerían que el resto ven 4 y crerían estar en n=4.
etc.

¡Inception!

lunes, 20 de abril de 2015

sERVER sENT eVENTS

Hola sukarrats... Hace unos días intenté poner la versión web de whatsapp en el iPad y me he encontrado lo siguiente:


Curioso porque el navegador que estaba utilizando era Chrome... He buscado información y me he encontrado con la siguiente noticia de Gizmondo http://es.gizmodo.com/exclusiva-por-que-whatsapp-web-no-esta-en-ios-ni-lo-e-1680954309# donde los ingenieros de iOS en San Francisco responden al problema:

Las APIs de multitarea en iOS sólo nos permiten hacer ciertas funciones concretas cuando una aplicación se encuentra en el background. Para lo que trata de hacer WhatsApp, una aplicación de iOS tendría que ser capaz de mantener una conexión abierta a un servidor, o bien aceptar conexiones entrantes desde el navegador, sin importar que el usuario haya puesto la aplicación en segundo plano.

Ante esto, me pregunto, y qué hay de los Server Side Events de JavaScript, compatibles con el navegador Safari de iOS? http://caniuse.com/#feat=eventsource ... A mi esto me suena a una excusa barata.

Los Server Side Events permiten a una web html5 recibir eventos desde un servidor. Con esto conseguimos que la web que estamos viendo en el navegador pueda interactuar con el servidor y responder dinámicamente a cambios en el servidor sin la interacción del usuario (vamos, sin darle al botón de recargar la página).

En un caso práctico, imaginando una web de noticias, permitiría que nuestra página web nos indicara cuando hay una noticia nueva. Y aplicándolo al desarrollo de aplicaciones híbridas o webapps, implimentar una notificación de aviso.

En cuanto al código, no resulta muy compleja la implementación, veamos:

En el servidor, en nuestro caso PHP, podemos tener un fichero llamado servidor.php con el siguiente código:

header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");

donde hemos dicho que no use el caché y que el tipo de contenido es event-stream.

Luego hacemos un echo de la información que queremos enviar al cliente, precedido por data:

echo "data: Tienes un mensaje nuevo";

finalmente hacemos un flush(); para enviar la información al cliente.


En la parte cliente, usamos JavaScript para implementar el evento que escuche al servidor:

if(typeof(EventSource)!=="undefined" && typeof(source)==="undefined") {
  var source = new EventSource("servidor.php");
  source.onmessage = function(event) {
    // nuestro código donde recuperamos la información enviada por el servidor en event.data
  ...
  };
}

El primer if comprueba si nuestro navegador soporta Server Sent Event.

En un próximo artículo os explicaré como utilizo esta artimaña para implementar avisos en la app que estoy desarrollando. Más información en la página de w3schools, una web muy útil para iniciarse en la programación.

Enigma de los monjes

Ultimamente se ha hecho popular un enigma de lógica que hasta un niño tailandés de 13 podría resolver (a ver... ¿no eran unas olimpiadas matemáticas? Ahí se apunta la juventud más aficionada a rayarse...) Y  siguiendo enlaces a lo loco me he topado con muchos otros del mismo estilo. Aquí os dejo uno que me ha gustado especialmente por el momento Inception que se experimenta al resolverlo.

Unos monjes que estaban en el convento y recibieron un mensaje de que algunos
de ellos despertarían al día siguiente con una marca en forma de mancha
en la frente, y los que la tuvieran deberían salir de peregrinación
cuando tuvieran conocimiento de ello.

El problema estaba en que en el convento no había espejos ni se podían
ver reflejados en ningún sitio, y los monjes tenían voto de silencio y
no hablaban entre ellos, por lo que no podían advertir unos a otros de
que tenían la marca en la frente de ninguna manera. Los monjes se veían todos cuando se
reunían para cenar, pero no hablaban.

Tras siete días (siete reuniones en la cena), los que tenían la marca
salieron de peregrinación a la mañana siguiente, y los que no la tenían
siguieron en el convento, sin que nadie les dijera quienes tenían la
marca y quienes no.

Cómo supieron si les tocaba irse? Cuantos se fueron?


No es excesivamente difícil pero tiene un punto de recursividad en las suposiciones que lo hace interesante. Si no ponéis remedio en los comentarios tendréis segunda parte en breve.

miércoles, 15 de abril de 2015

Pedal para guitarra TS808 - Capítulo NUEVE

En el mundo de la guitarra eléctrica (o cualquier instrumento en realidad) hay mucho espacio para ponernos sibaritas con el sonido. Los semi-expertos catadores como yo notamos la madera con la que se ha construido, el calibre y calidad de las cuerdas, el material y grosor de la púa, las pastillas, el amplificador... Hasta aquí es bastante lógico, pero para mucha gente las sutilezas se extienden hasta la más mínima nimiedad. Los conectores bañados en oro, cables de guitarra de banda ancha, nacionalidad de las maderas...

Pues bien, por supuesto también hay paladares para los componentes electrónicos concretos que se usen en el procesado de la señal. Incluso aunque sean del mismo tipo y con las mismas características y especificaciones.

En concreto para el pedal que estuve haciendo, que ya no sé ni si lo habré perdido, hay una gran mitología con el amplificador operacional utilizado.

Resulta que el integrado JRC4558D que se usaba originalmente era muy común y barato en su época. Se podría decir que era algo imperfecto al no ser de alta calidad. Pero por lo visto sus imperfecciones le daban un toque que ha quedado en la memoria auditiva del sibaritismo más selecto.

La disposición de sus patas es idéntica a la de muchos otros integrados actuales:


Y sus especificaciones son de lo más común. Se pueden encontrar decenas de integrados aparentemente idénticos a éste. Pero aún así la gente paga lo que haga falta por uno de los auténticos, de la serie original.

Explicación en Pisotones con listado de chips alternativos y cómo suena cada uno.

En mi pedal he montado un TL072 simplemente porque era el que había en la tienda de electrónica. Según el enlace anterior tenemos " TL072: Es un doble operacional compatible con el JRC4558, de mucha más calidad. En mi opinión, es demasiado "limpio" para este trabajo. Suena bien y es barato pero es demasiado "estéril" de sonido." No es el chip ideal pero casi seguro que yo no notaría la diferencia.
Así que de momento me quedo con éste pero he sido previsor y no he soldado el chip sino un zócalo para poder cambiarlo si tengo la oportunidad.

Por último os dejo un vídeo en el que testean el sonido del rc4558 pata negra comparado con un integrado equivalente actual.



Dice que el antiguo lo consiguió desmontando algún trasto rebuscado de la basura. En su época eran tan montoneros que es bastante normal encontrarlo en equipos de sonido de principios de los ochenta. ¡Lo mismo tenéis oro en forma de silicio en la típica minicadena olvidada en el mueble del comedor!