Expresiones regulares en Javascript para validar fecha u hora.

Vamos con una entrada rápida en Javascript. Ya hace años que revisamos el tema de las expresiones regulares, pero hoy vamos a ver un ejemplo concreto ¿Cómo hago una expresión regular que me valide un formato de fecha dd/mm/aaaa?

Pues sería esta:
/^\d{1,2}\/\d{1,2}\/\d{2,4}$/

Ok ¿Y como valido un formato de hora tipo hh:mm:ss? Pues con esta:
/^(0[1-9]|1\d|2[0-3]):([0-5]\d):([0-5]\d)$/

Premios Simpson NBA 2018

Hasta que no acabe la temporada la NBA no repartirá sus premios oficiales, pero ya sabéis que este blog durante los playoff reparte los PREMIOS SIMPSON NBA 2018!!!! En este enlace podéis ver a los ganadores del año pasado… y aquí van los de esta temporada regular:

  • Premio anual Montgomery Burns por su sobresaliente labor en el campo de la Excelencia: El año pasado le veía un poco perdido tras abandonar Atlanta, donde había discurrido toda su carrera. Pero este año Al Horford se ha reconvertido en un jugador clave para los Celtics similar a lo que ha sido Draymond Green en los Warriors: defiende posiciones interiores y exteriores, es el Celtic que más tiros sale a defender, cierra a los rivales para permitir el rebote de sus compañeros, en ataque es capaz de generar juego y situaciones de ventaja como si de un base se tratara… Dejo de lado los números clásicos, para mi Horford ha sido el jugador de la campaña.

  • Premio Matlock: Va a cumplir 41 años en julio y nos volvemos a preguntar ¿Habrá visto esta temporada su último Maaaaatlock Manu Ginobili? Pues esperemos que no, porque a pesar de los años y la pérdida de físico que implican él sigue siendo un jugador productivo en ambos lados de la cancha: por su técnica, por su inteligencia táctica, por su intensidad. El propio Kerr se lo pidió en los Play off, queremos un año más de Manu.

  • Premio Hank Scorpio: Danny Ainge. Personalmente, creo que lo que le hizo a Isaiah Thomas estuvo mal viéndolo desde el punto de vista personal, pero desde el punto de vista del negocio le salió redondo: se hizo con una estrella de la liga como Irving sacrificando a un Thomas muy tocado físicamente y a un buen jugador como Crowder,  en el mercado de agentes libres también pescó bien con Hayward (aunque se lesionara en el primer partido, pero eso ya escapa del control de la dirección deportiva), apostó por Rozier y Smart para no hipotecarse con la renovación de Avery Bradley y le traspasó por un Morris que ha rendido bien, y finalmente la jugada de intercambiar puestos en el draft con los Sixers también parece que de momento ha sido muy inteligente (Tatum liderando en anotación al equipo en playoff vs un Fultz que se pasó más de medio año con problemas de espalda y que ha sembrado dudas).
  • Premio yo me llamo Ralph: En este vídeo hay un pase de Julius Randle que… en fin, judgad vosotros mismos.

  • Premio a la persona que menos se ha esforzado para llegar hasta aquí: John-Blair «J. B.» Bickerstaff se encontró con un equipo plagado de lesiones y un proyecto que se caía a pedazos tras la destitución del mediocre Fizdale. ¿Qué se le exigía al joven JB? Perder todo lo posible de cara al draft. Y así lo hizo, presión 0.
  • Premio Tiborowski: Repite el ganador del año pasado, Giannis Antetokounmpo ha firmado otro año para estar en las quinielas por el MVP y ha sido el jugador nacido fuera de los EEUU con mejor rendimiento, una bestia capaz de finalizar (el mejor anotador hoy por hoy cerca del aro), generar juego, rebotear y defender. Un jugador de impacto en ambos lados de la pista. Parece que sus Bucks no acaban de despegar ¿Acabará cambiando de aires o llegará algún entrenador (o entrenadora) que cambie el rumbo mediocre y desencantado que marcó la era Kidd para este joven equipo?

  • Premio Nelson Muntz: Todavía está fresca en mi retina la imagen de Marcus Smart echándose al cuello de JR Smith tras una falta flagrante muy fea del jugador de Cavs sobre Al Horford. Ramón trecet llama a Smart «el centurión de los Celtics», siempre presto a defender a sus compañeros y con una actitud irreprochable en defensa. Es cierto que como finalizador en ataque es muy flojo pero ¿se acuerda alguien de sus bajos porcentajes cuando salta a intentar un tapón a dos manos? ¿cuando maltrata su propio cuerpo para defender a jugadores más altos y pesados en situaciones de pick&roll? ¿cuando persigue como un perro de presa a su rival? Smart no es un estilista, pero es un tío cuyo juego se basa en la entrega y la dureza, como lo fueron en el pasado gente como Dennis Rodman o un Tony Allen de quien sería justo sucesor cuando se retire.

  • Premio Bombardeo: Dos años seguidos el premio se lo ha llevado Brad Stevens, pero esta temporada dejamos Boston para irnos a Utah a reconocer el trabajo del coach Quin Snyder. Un alumno aventajado de leyendas como Mike Krzyzewski, a quien asistió en Duke, Ettore Messina, con quien trabajó en el CSKA, o Greg Popovich, de quien no fue asistente pero sí aprendió sus métodos durante su paso por la liga de desarrollo entrenando a los Austin Spurs. Este año el papel era complicado, tras la marcha de Hayward y Georghe Hill había quien decía que no tenían potencial para alcanzar los playoff en el Oeste… y al final no solo entraron sino que se cargaron a Oklahoma. Un equipo donde la estrella es un pivot especialista en defensa, el peso anotador recae sobre un novato y donde la manija ha caído en la mano de un Ricky Rubio que ha tenido que reconvertir su juego de forma exitosa.
  • Premio Homero: Cambiaba de aires Ricky Rubio en un fichaje no exento de polémica, era un jugador muy querido en Minneapolis por su trabajo comunitario, y en ese traslado a Salt Lake City veía un cambio de filosofía al jugar para un entrenador muy distinto a Thibodeau. Este cambio nos ha mostrado a un Ricky que ha firmado sus peores números en asistencias y robos, dos categorías donde acostumbraba a estar entre los cinco mejores de la liga, pero que a su vez ha logrado sus mejores dígitos en anotación y porcentaje de tiro. Y que la bajada numérica en asistencias y robos no resulte engañosa: ha estado mejor tanto a la hora de manejar el ritmo de los partidos y distribuir juego como en defensa, más agresivo y sólido (recordemos aquí lo que hablábamos en el artículo sobre el porcentaje de robos.)

  • Los Excitantes de Springfield: Hemos quitado este año el premio Qué Homer he Tenido a la canasta más afortunada y añadimos el quinteto que formará Los Excitantes de Springfield. Este año es evidente que empezamos con el ganador del Premio anual Montgomery Burns por su sobresaliente labor en el campo de la Excelencia: Al Horford, que sería el pivot e iría acompañado en mi quinteto por Giannis Antetokounmpo y Kevin Durant en los aleros y por el rejuvenecido Chris Paul y el salto de calidad de Victor Oladipo en las posiciones exteriores.

Linux: script para crear usuarios automáticamente con contraseñas aleatorias desde una lista dada en CSV.

Vamos con un script para automatizar tareas. Tenemos un CSV, le llamaremos user.csv, con los siguientes datos: Nombre, Primer Apellido y Usuario. Algo tal que así

Manuel,Garcia,ManuG1
Pedro,Rodriguez,PredroR2
Maria,Abalo,MariaA45
Josefa,Perez,JosefP21
Marta,Rios,MartaR91

La idea del script es la siguiente: recorre el fichero csv y crea a los usuarios con ese nombre y apellido y ese código de usuario. Asigna una contraseña generada de forma aleatoria y redirige la salida a un fichero para poder notificar a los usuarios creados su usuario y contraseña.

#!/bin/bash

OLDIFS=$IFS
IFS=","

while read firstname lastname userid 
do 
     PS=$(openssl rand -base64 12)   
     useradd -c "${firstname} ${lastname}" -p $PS -d /home/"${userid}" -s /bin/bash "${userid}"            
     echo "Usuario: ${userid} - Contraseña: $PS ....." >> resultado.txt 
done < user.csv

La opción de crear los usuarios con contraseña no es recomendable en todos los ámbitos por temas de seguridad, lo he hecho en este caso porque el ejemplo real en el que lo hice lo había requerido así el cliente, pero según la política y el contexto de seguridad no es algo recomendable en todos los casos porque podrían ser vistas por algún usuario no autorizado, así que aunque la generes así es mejor obligar a los usuarios a cambiarla. Para crearlo sin contraseña en la instrucción useradd quita el parámetro -p $PS, la línea de encima que genera el password (que ya sería inútil) y el $PS en la salida.

Obtener edad desde una fecha en Javascript

Hace un tiempo habíamos visto cómo obtener una edad desde una fecha de nacimiento en PostgreSQL, en MySQL y en MS SQL-Server. ¿Y en javascript? Vamos a ver tres funciones:

En la primera función el parámetro que recibiremos será una cadena con una fecha en formato YYYYMMDD (por ejemplo 20180211 para hoy):

function terIdade(cadeaData) {
    var hoxe = new Date();
    var nacemento = new Date(cadeaData);
    var idade = hoxe.getFullYear() - nacemento.getFullYear();
    var m = hoxe.getMonth() - nacemento.getMonth();
    if (m < 0 || (m === 0 && hoxe.getDate() < nacemento.getDate())) {
        idade--;
    }
    return idade;
}

Otra opción, pasando el mismo parámetro, es conseguir el resultado el milisengundos y operar con él para obtener la edad. Para eso dividiremos la diferencia entre fechas entre 1000*60*60*24*365.25:

function terIdade(cadeaData) {
    var nacemento = new Date(cadeaData);
    var data = new Date();
    var dif = data-birthdate;
    var idade = Math.floor(dif/31536000000);
    return idade;
}

La tercera opción sería no mandar a la función una cadena con la fecha, sino separados el año, el mes y el día (pasándoselos como enteros, no como cadenas). Y para el resto haríamos más o menos la misma operación que en el ejemplo.

function terIdade(ano,mes,dia) {
    var hoxe = new Date();   
    var idade = hoxe.getFullYear() - ano;
    var m = hoxe.getMonth() - mes;
    if (m < 0 || (m === 0 && hoxe.getDate() < dia)) {
        idade--;
    }
    return idade;
}

Libre Office 6 ya está disponible

Viene cargadito de cambios LibreOffice 6. Ayer, 31 de enero de 2018, The Document Foundation liberó la última versión de la conocida suite ofimática libre para sistemas operativos Windows, MacOS y Linux.

Si tenéis una manzanita necesitaréis al menos la versión 10.9 del sistema operativo instalada en vuestro equipo. En caso de usuarios de Windows ya no hay soporte en esta versión para Windows XP o para Vista, siendo Windows 7 SP1 el sistema operativo mínimo requerido. En el caso de Linux os puedo dar una lista de requisitos más detallada:

  • Kernel 2.6.18 o superior.
  • glibc2 versión 2.5 o superior.
  • gtk versión 2.10.4 o superior.
  • 256 MB de RAM como mínimo.
  • Al menos 1.55 gigas de espacio en disco duro.
  • Entorno de escritorio (GNOME o KDE).

Entre las múltiples novedades, aparte de la interfaz y de las mejoras en la integración de LibreOffice Online (la versión cloud de LibreOffice), encontramos nuevas plantillas para Impress, nuevas tipografías, mejoras en el corrector gramatical, nuevos estilos para tablas y formularios en Writer, la posibilidad de exportar directamente a ePUB los documentos o la posibilidad de firmarlos con OpenPGP.

Ya puedes descargarlo desde la página del proyecto.

Utilizar sudo sin contraseña

Arracamos 2018 con más Linux ¿Se puede configurar el sistema para no tener que poner la contraseña cuando invoquemos un comando precedido de sudo? Sí, se puede. ¿Se debe? No, eso debilita la seguridad y no es nada recomendable. ¿Entonces no se puede? Sí, se puede pero no se debe.

La cosa es editar el fichero /etc/sudoers utilizando el siguiente comando:

sudo visudo

Una vez lo estemos editando buscamos la línea que pone root ALL=(ALL) ALL y debajo añadimos la siguiente, cambiando nuestro_usuario por el nombre de usuario que corresponda.

nuestro_usuario ALL=(ALL) NOPASSWD: ALL

También podemos aplicarlo a grupos, para ello debemos poner el símbolo % seguido del nombre del grupo:

%nuestro_grupo ALL=(ALL) NOPASSWD: ALL

Y otra opción es permitirlo sólo a un comando, o serie de comandos. En ese caso cambiamos el ALL que va después de NOPASSWD por el comando en cuestión. En el ejemplo veremos como hacerlo para /bin/kill:

nuestro_usuario ALL=(ALL) NOPASSWD: /bin/kill

Y una vez guardados los cambios el sistema nos permitirá usar sudo sin contraseña. Y vuelvo a repetir: NO SE DEBE HACER. Pero si queréis hacerlo, ahí tenéis el cómo.

Generar contraseñas seguras en Linux con APG

Ya vimos en el pasado cómo generar contraseñas en linux con mkpasswd, hoy veremos otro método. APG, abreviatura de Automatic Password Generator, viene instalado en Ubuntu y sus derivados. Es un programa pensado para generar contraseñas «memorizables«. Si lo ejecutas a secas te pedirá una «raíz«, una serie de datos con los que trabajar, y en base a eso creará una contraseña «memorizable«, y con «memorizable» quiero decir que junto a la contraseña te mostrará una transcripción fonética para que la recuerdes mejor.

APG Ejemplo
Ejemplo de APG

También puedes generar contraseñas totalmente aleatorias usando el comando apg a -1, que ofrece resultados de entre 8 y 10 caracteres.

Ejemplo APG 2
Ejemplo de APG con a -1

SQL-Server: Hacer un anti-join con EXCEPT

El otro día os comentaba cómo hacer un anti-join en SQL-Server (a decir verdad con un método que valdría para cualquier SGBD), pero me dejé fuera otra forma de hacerlo en SQL-Server: con el operador EXCEPT.

La definción de EXCEPT vendría a ser la siguiente: Devuelve los valores distintos de la consulta situada a la izquierda del operando EXCEPT que no se devuelven desde la consulta derecha.

Vamos con un ejemplo: Tenemos la tabla Productos y tenemos la tabla Ventas, y el campo IdProducto existe en ambas, siendo la clave primaria de la tabla Productos y figurando como clave externa en tabla Ventas. Entonces ¿Podemos con EXCEPT sacar los Id de todos los Productos que no existen en la tabla Ventas? Podemos. Tal que así:

Select IdProducto from Productos
EXCEPT
Select IdProducto from Ventas

Al igual que ocurren con el operador UNION, el operador EXCEPT nos obliga a tener las mismas columnas, con tipos de datos compatibles, en cada una de las consultas.

SQL-Server: Rendimiento de los operadores en el WHERE

Un tip rápido sobre SQL-Server. De cara a mejorar el rendimiento de las queries es importante considerar qué operadores dentro del WHERE tienen mejor rendimiento:

  • La mejor respuesta siempre la conseguiremos usando el operador =
  • Después vendrían los operadores >, >=, <, <=
  • Tras esos estaría el LIKE
  • Finalmente tendríamos con el peor rendimiento el <> o los operadores !=, !>,!< que no forman parte de la especificación de TSQL.

Por eso recuerda que es importante construir las consultas de forma correcta para usarlos de la forma más optimizada posible.

 

Acceder a los atributos data de HTML5 desde javascript

Si eres lector habitual de este blog recordarás que no hace mucho vimos cómo hacer esto con jQuery. Vamos ahora a ver cómo hacerlo con javascript a pelo, sin tirar de esas librerías. Repitamos los mismos ejemplos pero sólo con javascript:

<div id='fruta' data-fruta='fresa'></div>

En el div con Idfruta” vamos a guardar un dato: que es una fresa (mismo ejemplo que en artículo anterior). ¿Cómo accedo a este valor usando javascript?

//opción A. A lo bruto
//funciona, pero no es elegante
window.alert(document.getElementById("fruta").getAttribute('data-fruta'));
//opción B. La buena
window.alert(document.getElementById("fruta").dataset.fruta);

Ahí tienes dos ejemplos en los que hacemos un alert() de los datos guardados en el atributo data. El primero, usando getAttribute(), en teoría es la opción «bruta» ya que en principio debería accederse a estos datos como en el segundo ejemplo, que se supone que sería el método correcto. El problema es que el acceso a dataset no está bien implementado en todos los navegadores, así que la opción de usar getAttribute() hoy por hoy, aunque no sea la correcta en la teoría, es la funcional.

¿Y cómo queda el tema de los guiones que habíamos visto en el ejemplo en jQuery? Bueno. Si usamos getAttribute() ponemos el nombre del atributo tal cual, si usamos dataset hacemos como en jQuery y quitamos los guiones (y el prefijo data) usando también notación camelCase:

<div id='fruta' data-fruta-oferta='pera'></div>
<script type="javascript">
//con getAttribtue
window.alert(document.getElementById("fruta").getAttribute("data-fruta-oferta"));
//mediante dataset
window.alert(document.getElementById("fruta").dataset.frutaOferta);
</script>