Calcular el IMC con Javascript

Esta semana en el trabajo me encontraba con una petición de un cliente. En un formulario donde insertaba peso y talla de una persona quería que hubiera un campo con el índice de masa corporal, que debía rellenarse solo. ¿Esto cómo va? Pues lo arreglamos con una función de javascript:

function calculaIMC(){
  //declaramos las variables
  var peso, altura, imc;
  //recogemos los datos.
  //Suponemos que los campos
  //tienen esos Id.
  //El peso en KG y la altura en cm
  //para operar mejor
  peso=document.getElementById("peso").value;
  altura=document.getElementById("altura").value;
  //comprobamos que los campos
  //no vengan vacíos
  if(peso!="" && altura!=""){
    //aplicamos la fórmula
    altura = parseInt(altura)/100;
    imc=peso/(altura*altura);
    document.getElementById("imc").value=imc.toFixed(2);
  }
}

Recuerda que queremos que los datos se introduzcan como tipos enteros: puedes poner una validación por javascript para que no metan comas, usar un campo numeric de HTML5 (hoy por hoy ya todos los navegadores modernos lo soportan) o hasta tirar de una vieja librería de jQuery (que servía para asegurarnos el funcionamiento en navegadores viejos, aunque hoy por hoy ya no tenga mucho sentido).

Anuncios

Javascript: convertir Array en CSV

Vamos con un tip rápido de javascript ¿cómo convertimos un array en una cadena de valores separados por comas? Es bastante sencillo lograrlo, y así obtener un formato válido para crear un fichero CSV más adelante:

var sabbath = ['ozzy', 'iommi', 'bill', 'geezer'];

var sabbathCsv = sabbath.valueOf();

Si lo que queremos son comas como separador el método valueOf() ya nos hace el trabajo, pero ¿si queremos otro separador? Entonces recurriremos a join().

var icada = ['drogas', 'boni', 'alf', 'fer'];

var icadaCsv = icada.join("#");

En el ejemplo de arriba usará el caracter # como separador en lugar de las comas.

Siete comandos de Linux básicos para la configuración de redes

Vamos con un articulillo técnico que os había prometido. Recopilamos una serie de comandos de Linux básicos para el trabajo y la configuración de redes. Nada complicado en exceso pero herramientas básicas y funcionales que son de uso habitual para quien ande trasteando en temas de redes.

  1. Ping: Envía un mensaje ICMP incrustado en un paquete IP, comprobando la conectividad entre dos nodos. El comando se ejecuta hasta que pulsemos las teclas Ctrl + c. ping ejemplo
  2. Netstat:  Es una herramienta que nos muestra las conexiones activas de un equipo. Esta herramienta acepta muchos parámetros: -r muestra la tabla de enrutamiento, netstat -r-p nos saca el nombre del programa para cada socket,netstat -p -a todos los puertos a la escuchanetstat -a
  3. Tcpdump: Es una herramienta que permite monitorizar el tráfico de red, mostrando en tiempo real los paquetes transmitidos y recibidos.tcpdump
  4. Tracepath: Traza los nodos a través de los que viajan nuestros paquetes en su camino hacia el destino que le definamos. tracepath
  5. Route: Es una herramienta que nos permite manipular las tablas de enrutamiento del sistema.
    #añadir ruta a la tabla
    route add -net 8.8.8.8/24 gw 192.168.100.1
    #eliminar ruta de la tabla
    route del -net 8.8.8.8/24 gw 192.168.100.1
    #definir puerta de enlace por defecto
    route add default gw 192.168.100.1
    
  6. Dhclient: Si lo ejecutamos con -r y con permisos lo que hace es “liberar” nuestra IP y solicitar otra al servidor DHCP.dhclient
  7. Ifconfig: Configuración de interfaz. Nos permite configurar o desplegar diversos parámetros de las interfaces de red como la máscara o la dirección IP. Acepta varios parámetros, y si lo ejecutamos sin pasarle ninguno nos dará información sobre las distintas interfaces. Los más usados son:
    • up: Marca la interfaz como disponible. Por ejemplo ifconfig eth0 up.
    • down: Marca la interfaz como no disponible. Por ejemplo ifconfig eth0 down.
    • dirección ip: Si ponemos una ip esta le será asignada a esa interfaz, teniendo de esta forma una ip estática (para DHCP está Dhclient). Por ejemplo ifconfig eth0 192.168.100.2.
    • netmask: Para definir una máscara de red. Por ejemplo ifconfig eth0 netmask 255.255.255.0 .
    • broadcast: Nos permite definir una ip como dirección de difusión. Por ejemplo sudo ifconfig etho broadcast 172.16.25.98.
    • promisc: Pone la interfaz en modo promiscuo, de forma que captura todos los paquetes, vayan dirigidos a ella o no. Por ejemplo ifconfig eth0 promisc.

Javascript: convertir una string en un número.

La función parseFloat() de Javascript nos permite recoger un dato de tipo string y convertirlo en un número con decimales, mientras que la función parseInt() nos devuelve un entero. ¿Así de simple? Sí, pero con matices. Vamos a profundizar un poco:

En el caso de parseInt() se trata de una función que recibe dos valores: el primero es obligatorio y es la cadena que queremos convertir a entero, el segundo sería un entero entre 2 y 36 para definir la base en que queremos que esté representado el entero devuelto, y es un parámetro opcional que por defecto tomará el valor 10 (base decimal). En implementaciones en navegadores antiguos (por ejemplo IE8) si el número empieza por 0 lo devolverá en base octal, así que ojo. Con los navegadores modernos ya no pasa, pero es importante recordarlo. Si le pasamos una cadena con espacios los obviará y devolverá el número (si hay varios números devolverá el primero que se encuentre). Si le pasamos una cadena con letras y números dependerá de la posición del número: si este está al inicio entonces devolverá el número hasta que encuentre un caracter extraño. Si empieza por letras devolverá un valor NaN. Ejemplos:

parseInt("10"); //devuelve 10
parseInt("10 años"); //devuelve 10
parseInt("10 54"); //devuelve 10
parseInt("10.50"); //devuelve 10
parseInt("casi 10"); //devuelve NaN
parseInt("10",16); //devuelve 16

Si quieres evitar problemas y que te devuelva un 0 cuando el resultado sea NaN ya te lo contamos en su día por aquí.

En el caso de parseFloat() la función sólo recibe la cadena que debe convertir a número decimal. Al igual que parseInt() si recibe una cadena con espacios los ignorará para devolver el número, y si recibe una cadena con caracteres actuará también igual que esa función: si este está al inicio entonces devolverá el número hasta que encuentre un caracter extraño. Si empieza por letras devolverá un valor NaN. En este caso ojo al formato numérico, sólo acepta el anglosajón. Es decir, el separador decimal tiene que ser un punto, interpretará la una coma como un caracter extraño.

parseFloat("10"); //devuelve 10
parseFloat("10.5 años"); //devuelve 10.5
parseFloat("10 54"); //devuelve 10
parseFloat("10.50"); //devuelve 10.50
parseFloat("casi 10.4"); //devuelve NaN
parseFloat("1.000,33"); //devuelve 1
parseFloat("10,50"); //devuelve 10

Entonces ¿qué hago si tengo una cadena donde los decimales vienen separados por comas y los miles marcados con puntos? Pues usando la función replace(). Vamos con un ejemplo:

var strEx = "1.000,33";
//primer paso: fuera puntos
strEx = strEx.replace(".","");
//cambiamos la coma por un punto
strEx = strEx.replace(",",".");
//listo
var numFinal = parseFloat(strEx);

Podría ser útil tener una función creada ya para realizar esta operación de conversión.

Y hasta aquí con esta entrada de Javascript básico.

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.