Cómo descargar nuestros datos de Whatsapp

En su momento habíamos visto cómo descargar nuestros datos de Facebook, Twitter y Linkedin o como ver todas nuestras búsquedas por voz en Google. Hoy vamos a ver cómo descargar los datos que Whatsapp tiene sobre nosotros.

El primer paso será abrir Whatsapp en nuestro teléfono, ir a Ajustes pulsando el icono de menú (tres puntos que están situados en la parte superior derecha de la pantalla principal de Whatsapp) y allí a Cuenta. Una vez estemos en esa pantalla pulsamos Solicitar info. de mi cuenta.

Una vez estemos en esta pantalla pusamos en Solicitar Informe. Esa pantalla ya nos informará de que el envío tardará un tiempo que oscila entre varias horas y un par de días, además no incluirá las conversaciones o imágenes (eso está en la copia de seguridad) sino los datos que ha acumulado sobre nosotros.

Cuando nuestro informe esté listo recibiremos una notificación de Whatsapp diciendo «El informe ya está disponible» y volviendo a Ajustes->Cuenta->Solicitar Info. De Mi Cuenta podremos ver ahora una opción que es Descargar Informe. Pulsando ahí podremos bajarnos un fichero comprimido en formato zip que incuirá archivos html y json con nuestros datos. Estos ficheros tendremos que abrirlos con otra aplicación, por ejemplo descargándolos en nuestro pc, ya que no podremos verlos dentro de la propia aplicación de Whatsapp.

Operadores de búsqueda en DuckDuckGo

Que Google sigue siendo el buscador más utilizado hoy por hoy es algo que no vamos a discutir, como tampoco discutiré que habitualmente es el que nos ofrece los resultados más relevantes para nuestra búsqueda, en gran parte por la cantidad de datos que ha recopilado durante años sobre nuestros hábitos de navegación, ubicación geográfica, etc. Esto no quiere decir que el resto de buscadores no sean útiles o válidos: ya sea por privacidad en algunos casos, porque estemos investigando a una persona u organización, porque Google no nos haya dado un resultado satisfactorio en nuestra búsqueda… muchos veces echamos mano de otros buscadores como Bing, DuckDuckGo, Yandex, Startpage o Baidu.

Si eres una persona habituada a hacer un uso de Google avanzado sabrás que hay ciertos operadores que te permitirán afinar más tu búsqueda. La mayoría de estos operadores funcionan igual en Bing, Yandex, Baidu y, lógicamente, Startpage (ya que este buscador lo que hace es buscar en Google enmascarando al usuario). En DuckDuckGo en cambio la cosa es un poco distinta. Veamos unos ejemplos:

  • Coches motos: si buscamos estos dos términos así, tal cual, nos dará resultados sobre coches y sobre motos.
  • «coches y motos»: en cambio si buscamos así entre comillas, al igual que pasaría en Google nos devuelve resultados que contengan la frase exacta «coches y motos».
  • Coches +motos: con el operador + junto a uno de los términos lo que haremos será dar más peso a ese término en la búsqueda. Eeste ejemplo devolvería más resultados sobre motos que sobre coches.
  • Coches -motos: con el operador junto a uno de los términos lo que haremos será excluir o dar menos peso a ese término en la búsqueda. Este ejemplo principalmente devolverá resultados sobre coches obviando las motos.
  • Alumnos filetype:pdf : en este caso nos devuelve todos los ficheros PDF que encuentre relativos al término de búsqueda (para el ejemplo, Alumnos). Podemos buscar ficheros con extensión PDF, doc, docx, xls, xlsx, ppt, pptx, html
  • Alumnos site:webdelinstituto.com : busca el término Alumnos, pero solo dentro del dominio que le hemos definido.
  • Alumnos -site:webdelinstituto.com : busca el término Alumnos, pero en este caso excluye los que pertenezcan al dominio que le definamos.
  • intitle:Alumnos : busca páginas que tengan el término Alumnos en el título.
  • inurl:Alumnos : busca páginas que tengan el término Alumnos en su URL.
  • !a camiseta: el operador ! nos permite invocar lo que DuckDuckGo llama «bang«, básicamente lo que hace es devolvernos los resultados de un motor de búsqueda externo directamente. En el ejemplo hemos usado !a, en ese caso devolverá los resultados del motor de búsqueda de Amazon para ese término (es decir, camisetas que estén a la venta en amazon). Si por ejemplo buscamos !w Tesla nos devolverá los resultados del motor de búsqueda de Wikipedia para el término Tesla. También podríamos usar !yelp, !ebay o !wa (este último para Wolfram Alpha). Hay como 13.000 términos de búsqueda, que podéis consultar aquí (he solicitado que hubiera un !donnierock… pero no les ha convencido de momento).
  • !safeon o !safeoff: añadiendo esto al final de tu búsqueda puedes habilitar o deshabilitar el modo de búsqueda segura.

Crear una tabla HTML con cabecera fija, usando CSS3

Si bien los elementos table suenan a cosa del pasado, a aquellos tiempos en los que todo se hacía con tablas y de vez en cuando algo de flash o similar, todavía siguen utilizándose tablas en el mundo de la programación y diseño web, ya no como elemento central y básico de la maquetación, pero sí para por ejemplo presentar datos en ese formato de filas/columnas.

Si tenemos una tabla muy larga la solución tradicional ha sido siempre la paginación, que con el tiempo fue sustituída por elementos que van insertando nuevas filas de forma asíncrona mientras hacemos scroll. En estos casos puede pasar que hayamos bajado mucho, la cabecera ya no esté visible y no tengamos muy claro a qué corresponde cada columna. Una solución podría ser repetir la cabecera cada x filas, pero se puede hacer visualmente incómodo. Otra posibilidad es hacer fijas estas cabeceras de forma que siempre estén visibles en pantalla y bajen mientras hacemos scroll.

Parece que lo lo lógico sería que pudiésemos hacer fijos los elementos thead o tr, ya que queremos que toda la línea quede fijada, pero aunque nos parezca lo elemental no será posible. Para fijar un elemento de esta forma tenemos que ponerle position:relative y esta característica no se aplica a esos elementos, esto implica que tendremos que usarlo obligatoriamente sobre las celdas, sobre los elementos th o td.

Supongamos que tenemos una tabla como esta (bueno, con cientos de registros para que tenga sentido la cabecera fija):

<table>
  <thead>
    <tr>
       <th>Nombre</th>
       <th>Edad</th>
       <th>Salario</th>
       <th>Rango</th>
       <th>Area</th>
     </tr>
    </thead>
   <tbody>
    <tr>
       <td>Manuela Z.</td>
       <td>43</td>
       <td>24000</td>
       <td>Analista</td>
       <td>Big Data</td>
     </tr>
  </tbody>
</table>

Si queremos fijar la cabecera el CSS, lo más básico posible, sería tal que así:

table {
  position: relative;
  border-collapse: collapse; 
}
th, td {
  padding: 6%;
}

th {  
  position: sticky;
  top: 0; 
}

Hay tres puntos clave en ese CSS: el position:relative de la tabla, el position:sticky del elemento th y la posición top:0 también del elemento th. De esta forma le decimos que todas las celdas de la cabecera se queden fijas en la parte superior de la tabla, así al bajar el scroll estas bajarán con él.

Linux: matar procesos usando Kill, Pkill y Killall

Linux nos da tres opciones para matar procesos desde el terminal: kill, pkill y killall.

Antes de ver los tres comandos es importante recordad un punto: un usuario normal solo puede matar sus procesos, no los procesos del sistema o los de otro usuario. Un usuario root en cambio sí puede matar cualquier proceso, tanto del sistema como de otro. Realmente, a pesar de sus nombres, estos tres comandos no están pensados exclusivamente para matar procesos, sino que les pueden enviar todo tipo de señales, aunque sí es cierto que matar procesos es el comportamiento por defecto.

El comando kill nos permite matar un proceso identificándolo por su número identificador (PID), la sintaxis básica es kill -señal PID. El valor de la señal varía entre 64 posibilidades, siendo las que permiten matar procesos estas tres: SIGHUP (que se abrevia también con el valor numerico 1), SIGKILL(que se abrevia con el valor numérico 9) o SIGTERM(que se abrevia con el valor numérico 15). Si no ponemos ningún valor el tomado por defecto será 15, que es el más seguro pues no permite que se mate un proceso que esté en ejecución sino que espera a que termine y lo mata en ese momento, mientras que el valor 9 sería el más inseguro y contundente, mata al proceso incluso aunque esté ocupado. En el ejemplo siguiente veremos como matar un proceso que, por ejemplo, tenga el id 2015, primero con el valor por defecto y luego con la opción -9 o SIGKILL (las dos últimas sería la misma instrucción pero con distinta sintaxis):

kill 2015
kill -SIGKILL 2015
kill -9 2015

También podemos matar varios procesos en la misma instrucción. Imaginemos que queremos matar los procesos 2015, 2022 y 3049, solo tenemos que listarlos tras la instrucción kill separados por un espacio:

kill 2015 2022 3049

Si no queremos estar listando los procesos para poder ver sus PID podemos también matar un proceso por su nombre. Eso lo puedes hacer con el comando killall, que lo que hará será matar todos los procesos que coincidan con el nombre del comando. Imagina que quieres matar el proceso de mysql en tu servidor Linux, de esta forma lo harías, pero ojo porque si tienes varias instancias las mataría todas. Las señales para killall son distintas de las de kill, puedes listarlas ejecutando killall -l aunque coincide que el valor -9 también es el que podemos usar para matar el proceso de forma forzosa.

killall -9 mysql

Finalmente nos queda pkill, un comando que fue creado originalmente para el sistema operativo Solaris y cuyo funcionamiento es similar al de killall, la diferencia es que en este caso no necesitamos saber todo el nombre del proceso pues podemos usar exprexiones regulares para definir qué proceso queremos parar. Igual que en el ejemplo anterior veamos cómo terminaríamos el proceso de mysql, con el parámetro -e para que la consola nos informe de que lo ha eliminado.

pkill -e mysql

Exportar datos de PostgreSQL a un fichero CSV

En algún momento ya habíamos hablado por aquí del formato CSV (comma separated values), un estándar para compartir información mecánicamente legible que, a pesar de algunas limitaciones con la codificación de caracteres, es bastante popular pues, por ejemplo, nos permite pasar datos de un sistema gestor de bases de datos a una hoja de cálculo o viceversa.

El sistema gestor de bases de datos PostgreSQL nos permite exportar datos a CSV de forma muy sencilla, y además tenemos dos posibilidades: Exportar una tabla entera o exportar el resultado de una consulta.

El comando básicamente sería COPY loquesea TO ficherodesalida DELIMITER ‘caracterdelimitador’ CSV HEADER; siendo el caracter delimitador generalmente una coma, pero puedes cambiarlo por otro si lo necesitas para tu exportación (puede darse el caso de que los datos que exportes tengan textos con coma, por lo que igual te interesa un caracter más exótico). El loquesea del ejemplo sería o el nombre de una tabla o una consulta, mientras que ficherodesalida sería la ruta donde queremos que se cree nuestro CSV.

Veamos dos ejemplos. Imaginemos que queremos expotar todos los datos de una tabla que se llama Pacientes:

COPY Pacientes TO 'Users/Donato/Documents/Pacientes.csv' DELIMITER ',' CSV HEADER;

Esa instrucción generaría un fichero con el nombre que le hemos definido en la ruta que le hemos ordenado, conteniendo todos los valores de la tabla pacientes separados por comas. Ahora imaginemos que solo queremos los nombres y apellidos de los pacientes del año 2021 (tenemos un campo con el año en el que se dieron de alta), podríamos exportarlos usando una consulta:

COPY (Select Nombre, Apellidos from Pacientes where Alta = 2021) TO 'Users/Donato/Documents/Pacientes.csv' DELIMITER ',' CSV HEADER;

De esta forma exportaríamos solo esos datos que nos interesan, filtrados a través de esa consulta. Ahora podríamos abrir esos datos en Excel, Googl Sheet o LibreOffice Math, por ejemplo.

Generar un fichero de EXCEL con ASP

Una entrada rápida: queremos que una página ASP en lugar de mostrarnos la información en el navegador lo que haga sea generar un fichero de EXCEL y que se descargue en nuestro equipo ¿Es posible? Sí.

Solo necesitamos añadir dos cabeceras al inicio del documento:

Response.ContentType="application/vnd.ms-excel"
Response.AddHeader "Content-Disposition", "attachment; filename=NombreFichero.xls"

Añadir un selector desplegable de valores en una celda de la hoja de cálculo de Google Drive.

Si no hace mucho veíamos cómo obtener una lista de valores únicos en la hoja de cálculo de Google Drive hoy vamos a ver cómo crear un selector de valores desplegable en una celda.

Lo primero es ir al menú de la cabecera, pulsar sobre Datos y en el menú que desplegará elegir Validación de Datos. Eso nos abrirá una ventana como esta:

En criterios tenemos varias opciones: fecha, números… pero en este caso nos interesan dos: Lista a partir de un intervalo y Lista de Elementos, ya que ambas nos darán como resultado el selector desplegable de valores que queremos.

La primera opción nos permitirá elegir los valores contenidos en un intervalo de celdas, por ejemplo A1:A5, y nos mostrará como opciones en el desplegable los valores únicos (eliminará las duplicaciones) contenidos en ese intervalo. La segunda opcion nos permite definir manualmente una lista de valores, que irán separados por comas. Es importante que marquéis la opción Mostrar la lista desplegable de la Celda para que de esa forma muestre el desplegable, si no lo que hará será dejaros escribir y mostrará un aviso o no permitirá insertar el valor, según lo que elijamos en la opción Si los datos no son válidos. Si queréis que solo puedan elegir valores del desplegable y no poder meterlos manualmente en esa opción debéis marcar el valor Rechazar Entrada.

PostgreSQL: Instrucciones básicas de gestión de tablas

Una entrada básica de SQL ¿Cuáles son las instrucciones básicas de gestión de tablas en el SGBD PostgreSQL? Veámoslas:

Crear tabla (para el ejemplo crearemos una tabla de de tres columnas, con un id autonumérico, una columna de texto que no admite nulos y una columna para números decimales con un valor por defecto de 0):

CREATE TABLE t (
  id SERIAL PRIMARY KEY,
  columna1 VARCHAR NOT NULL,
  columna2 NUMERIC(10,2) DEFAULT 0
);

Para borrar una tabla tenemos dos opciones, la primera de ella será hacerlo con el parámetro RESTRICT o sin ningún parámetro, pues esta es la opción por defecto. Si hay objetos que dependan de esa tabla, como vistas o claves externas, no borrará la tabla y nos devolverá un mensaje de error informándonos:

DROP TABLE laTablaQueSea RESTRICT;

La otra opción es borrar en casacada, con el parámetro CASCADE. En este caso borra la tabla y todos los objetos que dependan de la misma.

DROP TABLE laTablaQueSea CASCADE

Si lo que queremos es añadir una columna entonces tenemos que usar ALTER TABLE seguida de la instrucción ADD COLUMN especificando el nombre de columna, el tipo de datos y las restricciones que se aplicarán sobre la misma.

ALTER TABLE laTablaQueSea
ADD COLUMN nombreDeColumna tipoDeDatos constraint;

Si queremos añadir varias columnas solo tenemos que repetir la instrucción ADD COLUMN separada por comas:

ALTER TABLE laTablaQueSea
ADD COLUMN nombreDeColumna tipoDeDatos constraint,
ADD COLUMN nombreDeColumna2 tipoDeDatos constraint,
ADD COLUMN nombreDeColumna3 tipoDeDatos constraint;

En cambio si queremos borrar una columna tenemos que usar DROP COLUMN seguido del nombre de la columna:

ALTER TABLE laTablaQueSea DROP COLUMN nombreDeColumna;

Para deshabilitar los triggers vinculados a una tabla tenemos que usar también ALTER TABLE:

ALTER TABLE laTablaQueSea DISABLE TRIGGER ALL;

Para volver a habilitar estos triggers sería lo mismo pero con el parámetro ENABLE:

ALTER TABLE laTablaQueSea ENABLE TRIGGER ALL;

Para añadir alguna restricción a la tabla también usamos ALTER TABLE, en ese caso seguido de ADD y de la restricción que sea.

ALTER TABLE laTablaQueSea ADD laRestriccionQueQuieras;

Para borrar una restricción sobre una tabla utilizamos ALTER TABLE, pero ahora con DROP:

ALTER TABLE laTablaQueSea DROP laRestriccionQueQuieras;

Para renombrar una tabla tenemos que usar RENAME después del ALTER TABLE:

ALTER TABLE laTablaQueSea RENAME TO otroNombreDeTabla;

Y para renombrar una columna es similar:

ALTER TABLE laTablaQueSea RENAME columna1 TO columna2 ;

Finalmente si queremos borrar todos los datos de una tabla sin borrar la tabla, nuestra opción es la instrucción TRUNCATE TABLE:

TRUNCATE TABLE laTablaQueSea CASCADE;

Crear un certificado autofirmado con OpenSSL

Ya habíamos hablado anteriormente de OpenSSL, vamos a ver hoy cómo podríamos generar un certificado autofirmado. Vamos a generarlo con cifrado SHA512 y con clave RSA de 4096 bits, que se llamarán micerautofirm.key y micert.pem (el nombre lo podeís poner vosotros).

openssl req -x509 -sha512 -nodes -newkey rsa: 4096 -keyout micerautofirm.key -out micert.pem

Este certificado autofirmado tiene validez por un mes. Si queréis uno para más tiempo podéis utilizar el parámetro -days y pasarle un entero con el número de días. Por ejemplo, para un año:

openssl req -x509 -sha512 -nodes -days 365 -newkey rsa: 4096 -keyout micerautofirm.key -out micert.pem

Privacidad: ¿Por qué no se deben distribuir vídeos de agresiones?

Desde que, como bien dijo Jon Sistiaga en más de una entrevista, «todo dios tiene un móvil» disponemos de muchas más evidencias en vídeo de hechos luctuosos, no solo ya de conflictos bélicos que era lo que él hablaba, sino también de todo tipo de delitos y agresiones más cercanos a nuestro día a día y tristemente habituales. Entre esos vídeos de delitos, como pueden ser robos, hurtos o menudeo de droga, los que más tienden a viralizarse son los que recogen agresiones físicas, normalmente a personas vulnerables como puedan ser personas dependientes, de edad avanzada o menores de edad (generalmente sufriendo abuso o bulling). Vamos a analizar ahora por qué no es bueno difundir este tipo de vídeos.

Generalmente la persona que difunde estos vídeos no lo hacen con mala intención, al contrario, el ánimo de esta gente es el de denunciar una situación abusiva, buscan que a través de la presión social la víctima pueda recibir apoyo y protección contra su agresor, la cuestión es que esa difusión no solo puede no ser la mejor manera de conseguirlo sino que también podríamos estar incurriendo en alguna falta o delito.

Uno de los puntos a tener en cuenta es que aunque creamos estar ayudando a la víctima realmente no tenemos su consentimiento para divulgar su agresión ni conocemos su opinión sobre ello. Las víctimas de estas agresiones en la mayoría de los casos se sienten, además de físicamente heridas, humilladas por su agresor, por lo que difundir el vídeo puede llegar a incrementar ese sentimiento de humillación o indefensión al ponerse al alcance de miles o hasta millones de personas, además de poder perpetuar la situación al dejar un testimonio en vídeo. Tampoco hay que obviar que aunque mucha buena gente se solidarizará con la víctima habrá también personas indeseables que, por desgracia, utilizarán el vídeo para buscar, humillar y acosar más a la víctimas.

Como decía al principio, la difusión descontrolada de una agresión puede ser más dañina para la víctima, peo también recalcaba que incluso podríamos caer en un delito contra la privacidad al hacerlo, pues la imagen de esas personas está protegida por la LOPDGDD. Aquí cito literalmente a la Agencia Española de Protección de Datos:

«Quien difunda ilegítimamente contenidos sensibles de terceros puede incurrir en distintos tipos de responsabilidades:

Responsabilidad en materia de protección de datos: la difusión de datos, especialmente si son sensibles, de una persona física (en contenidos tales como imágenes, audios o vídeos que permitan identificarla), publicados en diferentes servicios de internet sin consentimiento se considera una infracción de la normativa de protección de datos personales. Si los responsables son menores de edad, responderán solidariamente del pago de la multa sus padres o tutores.

Responsabilidad civil: por los daños y perjuicios, materiales y morales, causados. Si los causantes son menores de edad responderán de la indemnización sus padres o tutores.

Responsabilidad penal:  la grabación y difusión de imágenes o vídeos sin consentimiento podrá ser constitutiva de delito, sancionable con penas de hasta 5 años de prisión.»

Además de lo mencionado arriba también habría que destacar que en muchas de estas publicaciones/denuncia se anima a los receptores a intentar identificar a los agresores para que reciban un castigo en represalia. Esto puede llevar a la que la persona que difunde o aporta datos acabe siendo cómplice de una agresión u otra campaña de acoso, esa vez dirigida contra el primer acosador. Aunque uno piense «merecido se lo tendría el agresor» hay que ver más allá, hay que pensar que las cosas pueden salirse de control y acabar derivando en represalias violentas por las que uno podría acabar frente a un juez.

¿Qué hacer en estos casos? Pues si se tienen conocimiento de una agresión recurrir a los tribunales, la fiscalía, las distintas fuerzas policiales o en caso de que sea en un centro escolar, a la dirección del mismo (cierto es que, por desgracia, muchos centros no están a la altura de la situación), aportando las pruebas recibidas. También la AEPD tiene un canal prioritario para solicitar la retirada de este tipos de materiales de las redes. Si alguien quiere usar alguno de estos vídeos como ejemplo de violencia, como material didáctico, yo diría que lo fundamental serían dos cosas: anonimizar a víctimas y agresores para que no puedan ser objeto de identificación y conseguir el consentimiento de la víctima para usarlo, aunque se hayan omitido sus datos, distorsionado su voz y/o emborronado su rostro.