Libre Office Writer: crear un PDF híbrido, editable por cualquiera.

Un fichero PDF híbrido de Libre Office consiste en un fichero que por un lado puede ser abierto por cualquier lector de PDF y por otro lleva incrustado el documento ODF para que pueda ser editado con Libre Office por el receptor.

¿Cómo hacemos esto? Pues nos vamos a Archivo->Exportar a… y elegimos en el selector Exportar a PDF. Eso nos abre un diálogo de exportación, en la sección General de dicho diálogo tenemos que marcar la opción PDF Híbrido (Incrustar archivo ODF) como en la imagen de ejemplo. Con esto obtendríamos nuestro PDF híbrido.

Common Table Expression (CTE): la sentencia WITH en PostgreSQL.

Hace tiempo escribí una entrada sobre el uso de CTE en SQL-Server de Microsoft y no hace mucho en dicha entrada me preguntaron si podría usarse también una CTE en PostgreSQL. La respuesta es que sí, existe este recurso también en ese sistema gestor de bases de datos.

Sintaxis básica de una CTE

Recuerda, una CTE es un artefacto que nos permite mantener en memoria el resultado de una consulta para poder utilizarlo como si se tratase de una tabla o vista más.

En PostgreSQL usaría la misma sintaxis que en SQL-Server: tras la instrucción WITH definimos el nombre de la CTE y podemos opcionalmente agregar también los nombres que queramos dar a las columnas de la tabla que devolverá como resultado (si no lo hacemos entonces se usarán por defecto los nombres de las columnas que traigamos en la consulta). Dentro del cuerpo de la instrucción WITH definimos la consulta que queramos usar en la CTE. Finalmente ya podremos usar nuestra CTE dentro de una consulta. En fin, que lo básico sería tal que así:

WITH cte_name (column_list) AS (
    Select * from TablaQueNecesitemos
)

El mismo ejemplo que usé en la entrada sobre SQL-Server nos vale para aquí, una CTE sobre dos tablas (vendedores y ventas) para ver el total de ventas de cada uno ese año:

WITH Ventas_CTE (IdVendedor, NombreVendedor, TotalVendido)  
AS  
(  
    SELECT 
      v.Id as IdVendedor, 
      v.Nombre as NombreVendedor, 
      SUM(vt.Importe) AS TotalVentas 
    FROM Vendedores v inner join ventas vt on v.Id = vt.IdVendedor
    WHERE YEAR(vt.Fecha)=2018
)  

Después podríamos usar esa CTE como una tabla más en cualquier consulta de SELECT, INSERT,UPDATE o DELETE. Recordad que como en SQL-Server no podremos usar cláusulas coo ORDER BY o FOR BROWSE, algo que tampoco tendría mucho sentido por otra parte.

¿Por qué usar una CTE?

La misma pregunta que nos hacíamos en el primer artículo. Hay motivos varios para usar una CTE con PostrgreSQL:

  • Hacer más legible y más entendible una consulta compleja, permitiéndonos prescindir de variables de tabla y subconsultas, consiguiendo un código más ordenado y limpio sin penalizar el rendimiento.
  • La posibilidad de crear consultas recursivas (un tema del que prometí escribir hace dos años y se me pasó)
  • La posibilidad de usar funciones de agregado o funciones ventana y poder operar con ellas después.

Privacidad: cómo crear alertas de Google sobre nuestros datos de forma efectiva

Hace años que Google lanzó su servicio de alertas, un servicio pensado para que podamos solicitar que nos envíen a nuestro correo un aviso cada vez que se publique algo sobre un tema que nos interese. Esta herramienta se vuelve interesante no tanto para estar informados de nuestras aficiones como para poder saber si se ha publicado algo sobre nosotros, por ejemplo para que un grupo musical pueda saber qué se publica sobre su último disco, para que una empresa de fontanería pueda ver si alguien ha dicho algo sobre su servicio, etc… y también a nivel individual nos permite saber si hay nueva información accesible públicamente relativa a nuestra persona.

Si accedemos al enlace de http://google.es/alerts nos encontraremos un cuadro de búsqueda en el que meter el término sobre el que queremos crear la alerta y podremos un desplegar un cuadro de detalles para acotar más nuestra búsqueda. Podéis verlo en la captura que viene a continuación

Como podéis ver podréis elegir la frecuencia de la notificación (diaria, semanal o al momento), las fuentes en la que revisar (todas, solo blogs, solo noticias, solo webs oficiales), el idioma y la región (todo el mundo o solo un país en concreto), además de poder definir si queréis ver todos los resultados o solo los más destacados. La combinación de estos parámetros bien usados con unos términos de búsqueda adecuados será lo que nos permite usarlo de forma eficiente. Pero ¿qué términos de búsqueda serían los adecuados?

  • Nuestro nombre. Yo recomendaría buscar nombre y apellidos entre comillas (para que busque esa combinación exacta) y hacer dos alarmas, uno para el formato “Nombre Apellido1 Apellido2” y otra para el formato “Apellido1 Apellido2, Nombre” que se usa en muchas comunicaciones oficiales. Por jemplo “María Martínez Martínez” y “Martínez Martínez, María“.
  • El número de nuestro documento de identidad también entre comillas, en el caso de España sería el DNI o el NIE para residentes extranjeros (en otros países pues ya no sé, cada cual tiene su sistema). Creo que para evitar contaminaciones en esta alerta sería mejor acotar la búsqueda a la región de la que es oficial el documento (por ejemplo España si ponemos el DNI).
  • Nuestro número de teléfono, también entre comillas y también tres formatos: sin separación, separando con espacios en bloques de tres en tres dígitios y separando los tres primeros dígitos en un bloque de tres y el resto de dos en dos, por ser los formatos más habituales. Por ejemplo, usando un número que imagino que será ficticio: “900000000”, “900 000 000” y “900 00 00 00”. De nuevo en este caso recomendaría acotar por región.
  • Nuestro correo electrónico.

De esta forma recibiríamos un aviso cuando se publique cualquier cosa en la red en la que aparezca la coincidencia

Abrir la carpeta inicio de Windows en Widows 10

Otro pequeño truquito: en las versiones antiguas de Windows la carpeta Inicio, donde podemos meter los programas y scripts que queremos que se ejecuten al arrancar el sistema operativo, estaba muy accesible: en el menú de Windows aparecía ya una sección “Inicio” y bastaba con un click derecho para navegar hasta ella. Pero en algún momento algún ingeniro a sueldo de Bill Gates decidió que tendría que estar más a desmano, porque patatas traigo. ¿Cómo encontrar la carpeta con facilidad en Windows 10?

Por defecto la carpeta de inicio común estaría en la ruta “C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp” y la de usuario en “C:\Users\Username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup“, pero es bastante complejo acordarse de toda esta ruta de memoria, tranquilidad que existe un atajo.

Pulsando la tecla de windows y a la vez la tecla R se abrirá el menú para ejecutar un comando, en ese ventana debemos ejecutar la orden shell:startup si queremos abrir la carpeta de inicio del usuario o shell:common startup si queremos abrir la carpeta de inicio común.

Windows 10: Quitar de la barra de tareas el widget con la información meteorológica

La última actualización de Windows 10 ha activado un widget que nos muestra en la barra de tareas la información meteorológica y que, al pasar sobre él, nos despliega un menú con noticias con una selección basada en las preferencias que puedan inferirse de lo que hayamos visitado con nuestra cuenta de Microsoft conectada. Dicho widget resulta incómodo a mucha gente y ya son varios los que han llamado a mi trabajo preguntando cómo se desactiva, algo que realmente solo requiere de un par de clicks si se sabe a ciencia cierta dónde buscarlo.

Lo primero que tenemos que hacer es click derecho sobre la barra de tareas, acción que mostrará un menú en el que debemos situarnos sobre la opción Noticias e Intereses. Al posarnos en esa sección desplegará otro menú con tres opciones: “Mostrar Icono y texto“, “Mostrar solo el icono” y “Desconectar“. Por defecto estará marcada la primera, ahí ya podemos optar por “Desconectar” si no queremos ver nada o por la opción de “Mostrar solo el icono” si queremos verlo más reducido. Si queréis tenerlo visible pero lo que os molesta es que se abra automáticamente al situar el ratón encima basta con que desmarquéis la opción “Abrir al mantener el puntero“. Adjunto una imagen para que veáis de qué menú os hablo:

Protección de datos: Derecho a la portabilidad ¿Qué es?

Creo que ya comenté por ahí atrás que estaba estudiando algo de protección de datos y que habría alguna entrada sobre eso. Hoy vamos a hablar del derecho a la portabilidad.

¿En qué consiste? Bueno, como ya sabéis el RGPD recogía que tenemos derecho a acceder a los datos que hemos proporcionado a un proveedor de servicios de la información, que esto debemos poder hacerlo de una forma sencilla y que nos los deben proporcionar en un formato estructurado de uso común y lectura mecánica (por lo que he comprobado suelen enviarlos en formatos HTML, XML y alguna vez he visto algún JSON o CSV). Este derecho de acceso es complementado y ampliado por el derecho a la portabilidad, que implica que podamos solicitar al responsable del tratamiento de nuestros datos que estos sean transmitidos a otro proveedor de servicios. ¿Sabes cuándo entras en Spotify usando tu cuenta de Facebook o de Google? A nivel legal se estaría aplicando este derecho, aunque en ese ejemplo se haría de forma transparente para el usuario. De forma más directa podríamos pensar en cuando cambiamos de compañía telefónica y esta tiene que pasar no solo nuestro número sino varios de nuestros datos a nuestro nuevo proveedor.

La idea de este derecho era dar mayor capacidad a los usuarios “para trasladar, copiar o transmitir sus datos de un entorno informático a otro” (citando a la AEPD) buscando de esta forma reforzar la competencia entre servicios y facilitar los cambios de proveedores de servicios, permitiendo reutilizar los datos que ya hemos facilitado previamente a otro proveedor de servicios.

Este derecho puede ejercerse cuando el tratamiento de datos se realice por métodos automatizados, este esté basado en un contrato o en un consentimiento informado y cuando lo solicitemos con respecto a datos que nosotros, como usuarios, hayamos proporcionado a quien los esté tratando y que nos conciernan, incluídos datos derivados de su propia actividad de tratamiento. Por otra parte no hay que olvidar que este derecho no es aplicable a los datos que hayamos proporcionado sobre terceras personas o que hayan sido proporcionados al responsable del tratamiento de datos por terceras personas. El responsable del tratamiento de datos no podría en ningún caso poner trabas o impedimentos legales, técnicos o financieros siempre que la transmisión de los datos de proveedor a proveedor sea posible técnicamente y siempre que el derecho de la Unión Europea lo permita. Además, el responsable del tratamiento deberá garantizar la seguridad en la entrega de los datos. Debemos recordar que la solicitud de portabilidad de nuestros datos no implica su borrado.

Si tienes una empresa que realice tratamientos de datos la AEPD recomienda que desarrolles una interfaz de descarga para estas peticiones de tus usuarios... Y ojito con incumplir esta norma, porque las sanciones pueden llegar a los 20 millones de euros.

¿Qué es el “smishing” y cómo protegerse?

Si os digo “Smishing” es posible que penséis que es un sonido onomatopéyico para llamar la atención de un gatete, pero aunque me encanten los felinos hoy de lo que hablamos es de ciberseguridad y cibercrimen. La palabra “smishing” nace al mezclar los términos “sms” y “phishing” y, como te puedes imaginar tras esta explicación, hace referencia a las estafas informáticas que se sirven de mensajes sms para engañar a sus víctimas.

¿Qué puede conseguir el delincuente a través de estos mensajes? Pues desde engañar a la víctima para que llame a un número de tarificación especial pasando por suscribir a su objetivo a servicios de sms premium y llegando a cosas tan graves como robarle las credenciales de acceso a alguna aplicación (como la del banco).

Consejos

  • Antes de abrir un enlace plantéate si tiene sentido que hayas recibido ese mensaje ¿es un notificación de un premio y no recuerdas haber participado en ningún sorteo? ¿Te informan de una oferta de trabajo de la que no sabías nada? ¿Te quieren cobrar una multa de tráfico y tú no tienes coche? ¿te llega una cita médica de un centro del que no eres paciente? Si suena sospechoso lo mejor es no abrir el enlace.
  • Un familiar que hoy por hoy siempre te escribe por Whatsapp o Facebook te manda un sms con un enlace digiéndote a una oferta en uan tienda online o similar… Sospecha y pregúntale siempre qué es lo que te envía antes de abrirlo, por si fuera un envío automatizado tras secuestrar su cuenta o teléfono (esto de hecho es aplicable a toda mensajería, no solo a los sms).
  • Tu banco a veces usará sms para confirmar operaciones, por ejemplo enviado un código para que teclees en la web, pero si el banco te manda un sms con un enlace para hacer algo y tú no estabas realizando ninguna operación en ese momento mejor desconfía, ignora ese enlace y abre el app oficial del banco o la web del mismo por tu propia cuenta, puede que te quieran dirigir a un portal falso para copiar tu usuario y contraseña y acceder a tu cuenta.
  • Si te informan de que te has suscrito a un serivicio premium y que tienes que contestar a ese sms para darte de baja, desconfía también. Contacta con tu compañía telefónica para ver si tienes algo contratado que no debería estar dado de alta o con la supuesta empresa que te envía el sms a través de su teléfono.

Principios para el tratamiento de datos personales

Bueno, llevaba tiempo sin escribir por aquí. Como estoy estudiando temas sobre protección de datos y la RGPD creo que caerán algunas entradas sobre ese tema que así me valen también para repasar los conceptos y hacerme pequeños apuntes/resumen del material.

Vamos hoy con uno de los puntos básicos ¿cuales son los principios fundamentales para el tratamiento de datos según la legislación europea?

  1. Licitud del tratamiento: se debe obtener siempre el consentimiento explícito del interesado para obtener y tratar los datos, aunque existen una serie de supuestos en los que no será necesario, como que el tratamiento de datos sea totalmente necesario para un procedimiento de ejecución de un contrato, que venga impuesto por una norma con rango de ley, que se de el caso de que sea necesario para salvaguardar los intereses vitales de alguna persona física o que sea para desempeñar alguna misión de interés público. En esos casos excepcionales debe fundamentarse bien la finalidad del tratamiento de datos para asegurar que sea lícita. En caso de los tratamientos de datos a posteriori debe haber una relación entre los fines originales de la obtención de datos y los fines del nuevo tratamiento.
  2. Lealtad: el interesado deberá conocer siempre el hecho de que se están recogiendo, utilizando, consultando o tratando de otra manera datos personales que le conciernen, así como la forma en que dichos datos va a ser tratados para poder determinar el alcance y las consecuencias del tratamiento de antemano. La obligación de informar a las personas interesadas sobre las circunstancias relativas al tratamiento de sus datos recae sobre el responsable del tratamiento, si se diese el caso de que los datos no se hubieran obtenido directamente del interesado, sino que procediesen de alguna cesión o de fuentes de acceso público, el responsable informará a las personas interesadas dentro de un plazo razonable, siempre antes de un mes desde su recolección y antes de enviarlos al destinatario.
  3. Transparencia: obliga a que toda información relativa al tratamiento de datos personales sea accesible de una manera sencilla (se pide que no requiere búsqueda y esfuerzo, que sea evidente dónde ejercer ese derecho y sobre todo que sea gratuita) y fácil de entender, utilizando un lenguaje claro y simple, refiriéndose en particular a la información de los interesados sobre la identidad del responsable del tratamiento, los fines del tratamiento y la información añadida para garantizar un tratamiento leal y transparente con respecto a las personas físicas afectas garantizando sus derechos.
  4. Limitación de la finalidad: los datos personales deben ser recogidos con un fin explícito, determinado y legítimo y, como ya hemos comentado en el primer punto, los tratamientos posteriores deben terner una relación con el fin original de la obtención de los mismos.
  5. Minimización: los datos recodigos deben ser pertinentes, adecuados y limitados a los fines que legitiman el tratamiento. En ningún caso se pueden recoger y tratar datos simplemente por considerar que podrían ser útiles en un futuro.
  6. Exactitud: los datos almacenados debe de ser no solo exactos sino también deben estar actualizados si fuese necesario. El responsable del tratamiento deberá observar todas las medidas razonables para completar los datos que estén incompletos y para manternerlos actualizados, pues habrá ocasiones en las que dichos datos sean fundamentales para el ejercicio de los derechos del interesado.
  7. Confidencialidad: se exige garantizar una adecuada seguridad de los datos personales almacenados y tratados, incluyedo en esto la protección contra acceso y tratamiento ilícito y la pérdida, destrucción o daño de los datos ya sea de forma accidental o ilícita. Se pondrán las medidas técnicas u organizativas necesarias para garantizar la integridad y confidencialidad de dichos datos.
  8. Conservación: los datos deberán mantenerse solo durante el tiempo necesario para los fines del tratamiento, estableciéndose datos para la supresión o revisión periódico. En los supuestos en los que se puedan conservar para uso estadístico o histórico estos deberían ser convenientemente anonimizados.

Acceder al último elemento de un array en Javascript

Algunos lenguajes nos permiten acceder al último elemento de un array usando el índice en negativo (es decir, poniendo la posición -1) pero no es el caso de Javascript. En ese caso ¿cómo accedo al último elemento de un array? Bueno, si se trata de un lenguaje donde podamos conocer la longitud del array como es Javascript (y la mayoría de lenguajes modernos realmente) basta con usar dicha longitud como índice. En el caso concreto de Javascript tendríamos que usar la propiedad length del array pero restándole una posición (porque nunca hay que olvidar que los arrays empieza en 0):

var ultimoElemento = myArray[miArray.length - 1];

Convertir texto en inglés a 1337 con Javascript

Si ayer veíamos cómo hacer con javascript una función que codifique/descodifique un simple cifrado ROT13 hoy vamos a con otro ejercicio de javascript simple: un conversor inglés-1337.

1337, leet, leet speak o 1337 5p34k es un tipo de escritura compuesta por caracteres alfanuméricos y relativamente popular en ambientes informáticos. No se trata de ningún tipo de cifrado de mensajes, simplemente se sustituyen las letras por número o por conjuntos de símbolos cuyo aspecto recuerde al de dicho caracter.

La función sería algo así: recibe un texto escrito en el alfabeto latino internacional y lo devuelve en 1337. Creamos un objeto con todos los valores a sustituir llamado leetAlph para que nos facilite el trabajo, luego solo recorremos la cadena que recibimos como si fuese un array (en esencia toda cadena es una array de caracteres) y vamos cambiando en cada posición la letra por el valor que le corresponda.

function textoALeet(texto) { 
  let leetAlph={a:'@', 
    b:'8', 
    c:'(', 
    d:'|)',
    e: '3',
    f:'ph', 
    g:'g',
    h:'#',
    i:'l',
    j:'_|',
    k:'|<', 
    l:'1', 
    m:"|'|'|", 
    n:'/\/', 
    o:'0', 
    p:'|D', 
    q:'(,)', 
    r:'|2', 
    s:'5', 
    t:'+', 
    u:'|_|', 
    v:'|/', 
    w:"|/|/'",
    x:'><', 
    y:'j', 
    z:'2'};

  texto = texto.toLowerCase();
  for (var i = 0; i < texto.length; i++) {
    if (leetAlph[texto[i]]) {
      text = texto.replace(texto[i], leetAlph[texto[i]]);
    }
  }
  return(texto);
}