Puertos por defecto más habituales

Vamos con un tip rápido sobre redes. Estos son los puertos de uso más habitual que uno suele tener que configurar

  • FTP -> Puerto 21
  • SSH -> Puerto 22
  • Telnet -> Puerto 23
  • SMTP -> Puerto  25 o Puerto 587
  • DNS -> Puerto  53
  • HTTP -> Puerto 80, aunque Tomcat por defecto usa el 8080
  • Kerberos -> Puerto 88
  • Telnet Remoto -> Puerto 107
  • POP3 -> Puerto 110
  • IMAP -> Puerto 143
  • HTTPS -> Puerto 443
  • Xbox Live -> Puerto 3074
  • RDP -> Puerto 3389
  • Configuración de routers de Movistar: Puerto 8000 (no en todos los modelos)

Javascript: Generar números aleatorios.

¿Cómo se generan números aleatorios en Javascript? Pues con la función random() del objeto Math. Vamos a ver cómo generar números aleatorios entre 1 y 10, 1 y 100 y 1 y 1000.

//de 1 al 10
var lenumero = Math.floor(Math.random() * 10 + 1);

//de 1 a 100
var lenumero = Math.floor(Math.random() * 100 + 1);

//de 1 a 1000
var lenumero = Math.floor(Math.random() * 1000 + 1);

En fin, viendo el ejemplo arriba ya puedes ver que generar un número aleatorio entre 1 y N se hace siguiendo la siguiente fórmula:

//de 1 a un número N
var lenumero = Math.floor(Math.random() * N + 1);

Ejecutando ActiveX en Chrome

Tenía estos días un cliente que quería ver el streaming de su cámara de seguridad ip en el Google Chrome. La aplicación web de la cámara requiere ActiveX así que el Chrome decía que nanai, y el cliente que nanai a lo de usar el Explorer. ¿Hay solución? Pues yo encontré un complemento que me ha salvado la papeleta: IE Tab. También puede ser útil para testear webs en distintas versiones de Explorer sin tener que andar abriendo varios navegadores.

Se trata de un complemento que emula Internet Explorer en una pestaña de Google Chrome. Ojo, que tampoco es Jauja, no te permtirá ejecutar ActiveX en Linux o Mac, por si estabas pensando en eso. Se necesitan las librerías de ActiveX instaladas en el equipo para que este funcione, así que sólo te será útil si lo instalas en Chrome para Windows.

Lo dicho, IETab no es gran cosa porque sólo te permitirá ejecutar ActiveX en Windows, donde ya tendrías en IE para lo mismo, pero como curiosidad o como una forma de testear webs sin cambiar de navegador puede ser útil. O para los haters a muerte del Explorer, claro.

Cambiar el puerto de escucha para escritorio remoto en Windows 2k12

Si tienes un servidor Windows al que accedes a través del escritorio remoto es buena cosa cambiar el puerto de escucha para conexiones al escritorio remoto. Muchos ataques van contra el puerto 3389 y sobre el usuario Administrador, así que cambiar el nombre a dicho usuario y el puerto pondrá la cosa un poco más difícil al atacante. No es una garantía de seguridad, pero dificulta un poco la cosa.

Los pasos son los siguienes, válidos para Windows 2k12 y Windows 2k8:

  • Abrir el regedit (el editor de registro)
  • Navegar por él hasta llegar a esta ruta: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TerminalServer\WinStations\RDP-Tcp\PortNumber
  • Editar esa entrada y poner el puerto deseado (por defecto estará el número del puerto en formato hexadecimal, pero lo puedes poner en decimal marcando esa opción). Microsoft recomienda usar uno comprendido entre el 1025 y el 65535, y hay que fijarse que no sea uno que ya esté siendo usado por otra aplicación.
  • Reiniciar, como siempre en sistemas Windows.

Creo haber leído que cambiar el puerto puede dar problemas a los usuarios que intenten conectarse con el cliente de escritorio remoto para Mac, ya que este sólo permite usar el puerto por defecto.

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).

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.