Emuladores retro de juegos para tu navegador

Si, como yo, has nacido en la primera mitad de los 80 recordarás el desorbitado precio de la Neo Geo. Todo el mundo tenía un primo/amigo en otra ciudad que conocía a alguien que tenía una… pero yo personalmente no conocí a nadie que la hubiera tenido en sus manos. Hasta había un troll que escribía al correo de la Hobby Consolas, creo que firmaba como Roberto Ajenjo o Asenjo o similar, que decía tener una y que los que tenían SuperNES o MegaDrive eran unos muertos de hambre (para que veáis que ya había trolls antes del advenimiento de Internet). En cualquier caso fue con la llegada de los primeros emuladores que muchos nos quitamos la espinita de no haber podido tener una carísima NeoGeo. Recuerdo el NeoRage con el que en mi viejo Pentium II disfrutaba de largas partidas a Street Hoop, King of Fighters o Metal Slug. Y ya con los años fue dándole a otros emuladores, que me permitieron por ejemplo recuperar las partidas en la NES o en la SuperNES (de eso ya os hablé en el pasado).

En todo caso, si no tenéis interés en buscar y descargar emuladores y ROMS ya que sólo os apetece una partidilla ocasional para recordar viejos tiempos siempre podéis probar con el siguiente listado de webs, que ofrecen emuladores para disfrutar en vuestro navegador sin necesidad de descargar nada (bueno, en algunos casos puede que Flash o Java, cierto, pero que no os romperá la cabeza, vamos):

  • Empezamos con la NeoGeo, la consola prohibida para todos aquellos que no éramos hijos de un directivo de Repsol.
  • La SuperNES para mi es la consola con más valor sentimental (junto a la Hartun Game Master… y ahí hay un proyecto del que ya os hablaré en el futuro si sale). Zelda, Mario, Castlevania, Metroid ¿hay que decir más?
  • La Game Boy Advanced a mi ya me pilla como cosa de una generación más joven, pero tiene juegos muy divertidos.
  • La Megadrive, conocida en otros mercados como Genesis, el asalto de Sega a las 16 bits con clasicazos como Sonic o Golden Axe.
  • Si eras de PC también hay una serie de juegos que se ejecutaban en entornos MS-DOS.
  • La TurboGrafx-16, conocida también como PCEngine, creo que no tuvo distribución en España por parte de su fabricante, NEC, aunque gozó de popularidad en Francia. Si quieres darle un muerdo, ahora puedes.
  • La GameGear de SEGA era muy de comerse las pilas en cuestión de minutos. La ventaja del emulador es que no te deja colgado. También hay juegos de Master System en esta página.
  • La MSX tiene una historia curiosa historia: dominó el mercado en Japón, tuvo repercusión en la Europa Continental e incluso llegó a penetrar en la Unión Soviética por medio del ministerio de Educación. Pero se la pegó en los USA y en Reino Unido, dos de los mercados más grandes. MSX se trataba de un standar sobre el que construían varios fabricantes como Canon, Toshiba, Phillips, Sony, Amstrad… se registraron hasta 122 fabricantes.
  • Y si eres de los retro a muerte vete descargando el Java para darte unas partidas con este emulador del mítico Atari, el primer dominador del mercado americano del videojuego.

En fin, disfrutad con sana nostalgia de estos enlaces, recuperad una parte de vuestra infancia y satisfaced a vuestro niño interior. Lo estáis deseando.

Las funciones setInterval() y setTimeout() en javascript.

Feliz 2017 a todos, esta es la primera entrada del año. Una cuestión sencilla de javascript ¿para qué valen las funciones setInterval() y setTimeout() y en qué se diferencian?

Pues ambas funciones tienen el mismo objetivo: ejecutar otra función pasado un intervalo de tiempo. ¿En qué se diferencian? En que setTimeout() se ejecutará solamente una vez, mientras que setInterval() lo hará en repetidas ocasiones.

Por ejemplo, podríamos usar setInterval() para que se mostrara en pantalla cuántos segundos llevamos desde que se cargó la página:

/*definimos una función que cada ponga en un
cuadro de texto un valor numérico, sumando uno cada
vez que la invocamos*/
function showSeconds(){
 var val = document.getElementById("tiempo").value;
 document.getElementById("tiempo").value = parseInt(val)+1;
}
/*usamos setTimeout() para que se
ejecute cada segundo (1000 milisegundos como parámetro)*/
setInterval(showSeconds,1000);

O podríamos usar setTimeout() para dar un aviso al usuario a los diez segundos de entrar

/*función que sólo hace un alert*/
function funcAvisa(){
 window.alert("Pareces interesado en esta sección");
}
/*se la llama a los 10 segundos*/
setTimeout(funcAvisa,10000);

Así funcionan los dos temporizadores de Javascript.

Solución al error E_FAIL(0x80004005) de Virtual Box

Hoy me encontraba con un problema con VirtualBox, en un equipo no me arrancaba ninguna máquina. Daba igual que fuera una máquina importada desde otro ordenador que que se tratara de una máquina creada desde 0. Al ejecutarla saltaba el error E_FAIL(0x80004005) . Intenté ojear los logs para ver si veía algo claro, pero el tamaño del mismo no lo hacía muy práctico ¿por qué fallaba? Pues no tengo ni idea. ¿Solución? Encontré varias:

Encontré un blog donde se afirma que se arregla desmontando la unidad de cd, pero no me funcionó tras hacerlo.

Encontré otro enlace donde decían que bastaba con ir a C:\Users\COMPUTER_NAME\.VirtualBox\Machines\VM_NAME y allí buscar el archivo VM_NAME.xml-prev para editar su nombre y quitarle el sufijo -prev. Lo probé pero tampoco funcionó.

Finalmente este vídeo me trajo la solución: en lugar de pulsar en la flecha inicio para arrancar la máquina hay que darle al botón que tiene al lado para desplegar el menú y allí elegir Inicio Desacoplable.

¿Por qué funcionó esta y el resto no? Bueno, a estas alturas no conozco todavía la causa del error, pero mirando con detenimiento el mensaje de error veo que en la solución que me funcionó el fallo era en el componente Machine Wrap. Asumo que el código de error puede ser el mismo para diversos componentes y que cada uno tiene una solución. Fíjate en el ejemplo que viene en el blog donde recomiendan desmontar la unidad de cd, podrás ver que el componente que falla simplemente es descrito como Machine mientras que en el que implica modificar el nombre del fichero de configuración xml el fallo era en el componente VirtualBox. Por tanto no hay una única solución a este error, todo depende de qué componente sea el afectado.

Declarar una función en Javascript

Hemos hablado mucho de javascript en este blog, pero a veces nos dejamos por explicar cosas básicas ¿Cómo se declara una función? y ya puestos ¿para qué sirve hacerlo?

Bueno, la utilidad de una función es no tener que repetir el mismo bloque de código varias veces. Nos permite agrupar externamente una serie de instrucciones para luego llamarla desde cualquier parte del código.

Para declarar una función debemos usar la palabra reservada function. Tras ella, separada por un espacio, ponemos el nombre que queremos darle seguido de los párametros que recibirá ,si es que recibe alguno, que pondremos entre paréntesis. Abriremos unas llaves y dentro insertaremos el código de la función. Si la función debe devolver un valor esto lo definiremos con la palabra return, que además finalizará la función. Vamos con un ejemplo práctico, una función que calcula un precio final aplicándole unos valores fijos al que recibe:

function precioFinal(precio,descuento){
  var ivaCultural = 1.21;
  var gastosEnvio = 10;
  var precioFinal = (precio*ivaCultural*(100-descuento/100))+10;
  return precioFinal.toFixed(2);
}

La función recibiría un precio y un descuento en porcentaje, le añadiría el IVA, le aplicaría el descuento, le sumaria los gastos de envío y devolvería el resultado rendondeado a dos decimales. En el código llamaríamos así a la función:

var precio = precioFinal(449.99,10);

Como el intérprete de javascript de los navegadores busca en primer lugar la declaración de variables y de funciones una función puede aparecer en el código antes de ser declarada.

SQL Server: Obtener la primera o la última palabra de una cadena.

El caso: tenemos una cadena de caracteres en SQL-Server (2008 R2 para más señas), donde las palabras están separadas por un caracter concreto. ¿Cómo obtenemos la primera palabra mediante una consulta? ¿Y la última?

La primera es fácil, sólo tenemos que hacer un SUBSTRING() que llegue hasta la primera aparición del caracter separador, que en este caso es un espacio:

DECLARE @test NVARCHAR(255)
SET @test = 'Esto es una frase'
Select SUBSTRING(@test, 1, CHARINDEX(' ', @test, 1) - 1)

¿Y la última? La cosa se torna compleja en SQL-Server 2008 (no se si en versiones posteriores es más sencillo). Y es que tenemos CHARINDEX(), que nos localiza la primera aparición del caracter empezando a contar desde una posición fija, pero no algo similar a LASTINDEX que nos diga la última posición. Entonces ¿cómo vamos a sacar esta última palabra? Pues sirviéndonos de la función REVERSE() para poder encontrar la última aparición del espacio a base de darle la vuelta a la cadena:

DECLARE @test NVARCHAR(255)
SET @test = 'Esto es una frase'
SELECT REVERSE(LEFT(REVERSE(@test), CHARINDEX(' ', REVERSE(@test))-1 ))

Usando el comando find para encontrar varias extensiones de archivo en Linux

Vamos con una entradilla sobre comandos en Linux para celebrar que hoy Microsoft se ha unido a la Linux Foundation. Sabemos que con el comando find seguido de una cadena de caracteres podemos encontrar todos los ficheros con esa extensión dentro de un directorio, veamos cómo sería la sintaxis más simplificada:

# find *.zip

La instrucción de arriba nos mostraría todos los ficheros cuyo nombre termine en .zip que estén situados en la carpeta en la que nos encontremos.

Ok, ¿y si quiero buscar varias extensiones?. Veamos ¿cómo sería el comando para buscar tanto los zip como los txt?

# find . -type f \( -name "*.zip" -o -name "*.txt" \)

Aquí ya tenemos una sintaxis un pelín más compleja, expliquemos paso a paso todo:

El . indica que queremos buscar en el directorio actual. Con -type f decimos que queremos buscar por tipo de fichero y que queremos archivos simples, no carpetas u ocultos. Entre paréntesis metemos la condición de lo que queremos buscar: con el -name indicamos que queremos buscar un patrón, que lo definimos a continuación entre comillas (el “*.zip” y el “*.txt”, que vendrían a decir que queremos todo lo que acabe en esas extensiones) y el -o nos serviría como un operador lógico or. Si te fijas antes de cada paréntesis se ha introducido el carácter de escape \ para evitar posibles problemas de sintaxis.

Es decir, toda la clave es usar el -o para añadir más condiciones a la función de búsqueda, pudiendo así definir varios patrones.

PHP: ¿Cómo saber si una variable existe?

Situación clásica en PHP: En una página tengo que mostar tal o cual resultado si una variable tiene un valor concreto, pero además existe la posibilidad de que dicha variable no exista. ¿Cómo evito que me salte un mensaje de error si esta viene vacía? Pues usando el método isset().

Un ejemplo

if (isset($_GET["id"])){
     //carga los datos asociados al id
}else{
     //no carga nada
}

Ya hace tiempo explicamos aquí la diferencia entre isset(), is_null() y empty().