Instalar el JDK8 y JDK9 de Java en Ubuntu, Mint o Debian

Si en su día ya habíamos visto en este blog cómo hacerlo con la versión 7, el procedimiento para instalar Java 8 o Java 9 es, básicamente, el mismo:

El primer paso, añadir el repositorio, es común:

#Añadir el repositorio
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update

Con él ya añadido, instalamos la versión 8:

#Buscar y descargar
#los paquetes de java 8
$ apt-cache search oracle-java8
$ sudo apt-get install oracle-java8-installer

Para la versión 9:

#Buscar y descargar
#los paquetes de java 9
$ apt-cache search oracle-java9
$ sudo apt-get install oracle-java9-installer

¿Y cómo definimos cual será la versión por defecto si tenemos las dos instaladas?

#Así por defecto la 9:
$ sudo apt-get install oracle-java9-set-default
#Así por defecto la 8:
$ sudo apt-get install oracle-java8-set-default

Exportar estadísticas a Excel desde Basketball Reference

La web Basketball Reference ofrece una buena cantidad de estadísticas relativas a la NBA, tanto a nivel de jugador como de equipos. Incluye estadísticas clásicas, avanzadas, de tiro o de uso. Incluso podemos ver las estadísticas clásicas de un jugador partido a partido y además el sistema dispone de un comparador de jugadores o de un buscador para estadísticas concretas seleccionando los parámetros que queremos pasarle (tipo «Jugadores que han hecho una temporada promediando más de 25 puntos, 10 rebotes y un 40% en triples«). Aquí os dejo unos ejemplos:

Olajuwon estadística

Estadísticas tiro Durant

Carter partidos 2001

Pero si sois tan freaks que no os basta con eso (yo me declaro culpable) desde esta web podéis exportar los datos para trabajar con ellos en una hoja de cálculo de Excel o de LibreOffice Calc. Tenéis dos opciones: exportar directamente como libro de Excel, que en principio es experimental pero a mi no me ha dado problema sacando a Word 2010  o a Word 2007, o convertir en CSV consiguiendo así un formato exportable a diversas aplicaciones.

Bird en CSV

Para exportar basta con que os situéis con el ratón sobre el desplegable que pone Share & more y desde ahí seleccionáis una de las dos opciones que están marcadas en la captura de abajo: Get as Excel Workbook, para que os lo saque como un excel, o Get Table as CSV (For Excel):

Exportar

Script de Linux para controlar el uso de memoria

Una entrada rápida: Un script de linux para controlar el uso de memoria en Linux, que además envía un email a la cuenta que le digamos.

#!/bin/bash
while [ true ] ;do
used=`free -m |awk 'NR==3 {print $4}'`
 
if [ $used -lt 900 ] && [ $used -gt 700 ]; then
echo "Uso elevado de memoria, hay menos de 900 megas libres." | /bin/mail -s "USO ELEVADO DE MEMORIA" micuenta@midominio.com
 
 
fi
sleep 5
done

Instalar Microsoft ODBC 17 para SQL-Server en Ubuntu 17.10

Una entrada rápida ¿Cómo se instala el driver ODBC 17 para SQL-Server de Microsoft en un equipo con Ubuntu? No es algo muy habitual usar SQL-Server en Linux, pero por si os interes la cosa va así:

sudo su 
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -

#PARA OTRA VERSIÓN
#CAMBIA EL 17.10 DE LA URL
#POR LO QUE CORRESPONDA
curl https://packages.microsoft.com/config/ubuntu/17.10/prod.list > /etc/apt/sources.list.d/mssql-release.list

exit
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install msodbcsql
# LO SIGUIENTE ES PARA LOS COMANDOS bcp Y sqlcmd
# ES OPCIONAL PERO MUY RECOMENDABLE
sudo ACCEPT_EULA=Y apt-get install mssql-tools
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc
# PARA LOS ENCABEZADOS unixODBC
# ES OPCIONAL, PERO DE NUEVO RECOMENDABLE
sudo apt-get install unixodbc-dev

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.

Trabajar con porcentajes en SQL-Server: evitar conversión a entero.

Me animo a hacer esta entrada porque habla sobre algo simple pero que por un detalle me rompió la cabeza.

Vamos con el caso/ejemplo, tenemos una tabla Precios con tres columnas: descripción, precio y descuento. La primera es de tipo varchar, la segunda del tipo money y la tercera del tipo numeric, ya que almacena el porcentaje que descontamos sobre el precio. En la consulta queremos sacar esos tres campos y un cuarto campo calculado, el importe con el descuento aplicado. Parece que bastaría con una consulta así:

Select 
  Descripcion,
  Precio,
  Descuento
  Precio * (1-Descuento/100) as ImporteConDescuento
from
  Precios

Y ya estaría, ya tenemos nuestro importe con descuento… Pero ejecutas la consulta y ves algo raro ¿los decimales? ¿dónde están? Se está redondeando el cálculo para que devuelva un valor entero. ¿Por qué? Porque al haber operado con dos enteros en el cálculo del porcentaje el motor que realiza la consulta ha convertido el resultado a entero. Sí, así es, si operas con enteros hace una conversión a ese tipo (al menos SQL-Server 2008). Para obtener el resultado correcto tendrías que hacer así la consulta:

Select 
  Descripcion,
  Precio,
  Descuento
  Precio * (1.00-Descuento/100.00) as ImporteConDescuento
from
  Precios

Así que acuérdate de los tipos cuando uses una constante en una operación: si el resultado tiene que ser decimal usa decimales.

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;
}

Hacer que un fichero en Linux no pueda ser borrado ni modificado.

A veces nos interesa que en nuestro sistema Linux haya algún fichero inmutable, que no pueda ser borrado o modificado incluso aunque se intente con permisos de superusuario. ¿Es posible? Sí, con el comando chattr y usando la opción +i. Por ejemplo:

chattr +i nombre_del_fichero

Si lo aplicamos a una carpeta esto haría no solo que la carpeta no pueda ser borrado o editada sino que tampoco se puedan añadir nuevos ficheros a la misma o borrarlos, pero sí se podrían editar estos ficheros. ¿Se puede hacer que estos tampoco puedan ser editados? Sí, habría que aplicar el comando de forma recursiva sobre la carpeta para que afecte a todo lo que esta contiene:

chattr +i -RV nombre_de_carpeta

¿Y para quitar este flag y poder borrarlo o editarlo? En lugar de +i se usa -i:

chattr -i nombre_del_fichero

¿Esto tiene alguna utilidad? Pues sí. Por ejemplo podéis hacer que el fichero de usuarios o de contraseñas del sistema sea inmutable, de forma que nadie podría darse de alta sin antes modificar los permisos del fichero para ello, dando un punto extra a la seguridad.

Recursividad en Javascript

Ya hace años hablábamos por aquí sobre la recursividad con ejemplos para C y C++. Es un buen momento para hacer otra entrada, pero ejemplificada en Javascript.

Pero antes de los ejemplos refresquemos la memoria ¿Qué es la recursividad? Se trata de un potente (y a veces peligroso) recurso en la programación. Como aquella primera vez os dejo la definición de la wikipedia:

“…la forma en la cual se especifica un proceso basado en su propia definición.”

“Un problema que pueda ser definido en función de su tamaño, sea este N, pueda ser dividido en instancias más pequeñas (< N) del mismo problema y se conozca la solución explícita a las instancias más simples, lo que se conoce como casos base, se puede aplicar inducción sobre las llamadas más pequeñas y suponer que estas quedan resueltas."

Esto dicho así puede sonar confuso o denso, por lo que podríamos resumirlo como que es una técnica de programación donde una función se llama a si misma.

En la publicación original os ponía dos ejemplos en C, aquí nos vamos a quedar solo con uno para javascript ¿Cómo se calcula el factorial de un número? La operación es la siguiente:

function factorial(num)
{
    // No acepta menores que cero.
    if (num < 0) {
        return 0;
    }
    // Si recibe 0 entonces devuelve 1.
    else if (num == 0) {
        return 1;
    }
    // Si es mayor que cero se llama a si misma.
    else {
        return (num * factorial(num - 1));
    }
}

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.