Unsplash: fotografías libres para tus webs o proyectos

Ya hace unos años que no tengo que hacer páginas web y solo trabajo en desarollo de aplicaciones, aun así recuerdo que a veces era un suplicio buscar recursos por lo sitios como este Unsplash pueden resultar interesantes.


Photo by Blake Silva on Unsplash

Unsplash es un sitio web donde diversos fotógrafos comparten su trabajo de forma gratuita. Ya sea porque necesites materiales para ilustrar una web corporativa, un artículo en un blog, un trabajo académico, o incluso si solo quieres imprimir una taza bonita para regalar o cambiar el fondo de pantalla de tu escritorio, se trata de un recurso muy útil.

Las fotografías están en una resolución más que decente y aparecen organizadas en categorías bastante intuitivas. Tiene desde patrones y texturas hasta fotografías de eventos.


Photo by Juliana Malta on Unsplash

Aunque no te exijan pago, ni siquiera mención, todas las fotos te darán la oportunidad de copiar un enlace para mencionar la autoría de la foto y reconocer el trabajo de quien está tras la cámara.

Y por si te lo preguntabas, sí, hay fotos de gatos.

Anuncios

Cómo hacer una captura de vídeo en una máquina virtual de Virtual Box

Desde Virtual Box 4.3 existe la opción de realizar una captura de vídeo de la pantalla de la máquina virtual, sin necesidad de software adicional.

Para acceder al menú de captura de vídeo basta con ir al menú de configuración de la máquina, seleccionar Pantalla en el menú de la izquierda e ir a la pestaña de Captura de Vídeo. Ahí marcamos el check de Habilitar Captura de Vídeo.

Un punto importante a tener en cuenta es que hay que configurar el tamaño de fotograma para que sea igual a la resolución de pantalla de la máquina. De no hacerlo de forma correcta los fotogramas saldrán cortados.

Emular el funcionamiento de un operador ternario ?: en ASP clásico con VBScript

Hemos hablado sobre el operador ternario ?: en Java o como emularlo en Python. Pero ¿Existe en el viejo VBScript? Pues no. ¿Qué soluciones tenemos?

Realmente cuando trabajamos en ASP Clásico el VBScript nos permite hacer un if-else en una sola línea tal que así:

If diaDeLaSemana < 6 Then seTrabaja = True Else seTrabaja = false

Por otra parte podríamos crear una función que emule su funcionamiento. Recibiría como parámetros una expresión que nos devuelva un valor booleano, una cadena que devolver en caso de que la expresión sea cierta y otra para el caso de que sea falsa:

Function IfT(bExpr, rVerdadera, rFalsa)
    If CBool(bExpr) Then
        IfT = rVerdadera
    Else 
        IfT = rFalsa
    End If
End Function

Veamos un ejemplo:

HoyQueHago = IfT(diaDeLaSemana < 6, "Currar", "Descansar")

Si el día de la semana es menor que seis (es decir, de lunes a viernes) devolvería “Currar” y si es mayor o igual (sábado o domingo) devolvería “Descansar“.

Common Table Expression (CTE): la sentencia WITH de SQL-Server

Las expresiones de tabla común (common table expression o CTE) fueron añadidas por Microsoft a SQL-Server a partir de la versión 2008. Cuando hablamos de CTE hablamos de un artefacto que nos mantiene en memoria el resultado de una consulta, que podremos llamar luego dentro de esa misma consulta. Esta cláusula también se puede utilizar en una instrucción CREATE VIEW como parte de la instrucción SELECT que la define.

Sintaxis de una CTE

La sintaxis básica de una CTE sería la siguiente:

WITH nombreDeNuestra_CTE (Columna1, Columna2, Columna3)  
AS  
-- Aquí definimos la consulta que la crea.  
(  
    SELECT Columna1, Columna2, Columna3
    FROM BaseDatos.dbo.Tabla
    Where Condicion=Condicion
)  

Por ejemplo, imagina que tenemos una tabla con vendedores y otra con sus ventas, donde el Id del vendedor actúa como clave externa en cada línea de ventas. Podemos usar una CTE para tener un resultado temporal con su total de ventas de 2018. Algo así:

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
)  

Ahora podríamos usar la CTE del ejemplo de arriba en una consulta como si de una tabla normal se tratase. Por ejemplo, podríamos sacar todos los departamentos donde haya vededores que hayan superado los 100.000 euros en ventas haciendo un join contra una tabla de departamentos:

SELECT Distinct
  d.Nombre
FROM
  Departamentos d
inner join
  Departamentos_Vendedores vd
on
  d.Id = vd.Idep
inner join
  Ventas_CTE v
on
  v.IdVendedor = vd.IdVend
where
  vd.TotalVendido > 100000

Hay que recordar que las cláusulas INTO, ORDER BY, FOR BROWSE y OPTION no están permitidas en una consulta de definición de una CTE. Sí permite el uso de operadores de conjuntos como UNION ALL, UNION, INTERSECT o EXCEPT y también permite referencias a tablas externas, e incluso a tablas situadas en servidores remotos.

En el ejemplo hemos usado un SELECT después de crear nuestra CTE, pero podríamos haber usado una instrucción INSERT, DELETE o UPDATE también. Incluso la podemos utilizar para definir un cursor.

¿Por qué usar una CTE?

Aparte del potencial que tienen las CTE por permitir crear una CTE recursiva, cosa de la que ya hablaremos más adelante en otro artículo, las CTE principalmente nos permiten sustituir a subconsultas y a variables de tabla.

En el caso de las subconsultas realmente la CTE no nos da ninguna ventaja en el rendimiento, pero sí nos permitirá tener un código más ordenado y más manejable, lo que facilita la legibilidad del mismo y las tareas de mantenimiento.

En el caso de la variables de tipo tabla ahí sí que las CTE nos dan un rendimiento mejor en la consulta, por lo que siempre serán una opción más recomendable.

También uno podría pensar en cambiar una Vista por una CTE. Si se trata de conjuntos de datos muy grandes, con muchas líneas, la Vista tendrá un rendimiento mayor por tratarse de un objeto creado en la base de datos que no permite definir índices (ya hablamos aquí sobre cuándo esto es recomendable y cuándo no).

Javascript: funciones querySelector() y querySelectorAll()

Las funciones querySelector() y querySelectorAll() existen en Javascript como métodos del objeto document. Ambas nos permiten acceder a elementos del DOM utilizando un selector de CSS.

La función querySelector() nos devolverá el primer elemento que coincida con el selector que le pasemos. Si es un id no habría problema puesto que deberían ser únicos en el documento, pero si se tratase de una clase o un elemento HTML entonces nos devolvería solo la primera ocurrencia:

//Si es un id nos devolverá ese elemento
var i = document.querySelector('#Contenedor');

//pero si es un elemento que existe varias veces
//entonces solo tendremos la primera ocurrencia
var x = document.querySelector('p');

//esto pondría el fondo gris al primer p que haya 
//en nuestro documento
x.style.backgroundColor = "#d9d9d9";

¿Y si queremos todos los elementos?

En ese caso tenemos que usar querySelectorAll(). El funcionamiento es igual que el de querySelector(), pero en este caso nos devolverá un objeto Nodelist que contiene todos los elementos que coincidan con el selector que hemos buscado. En este caso no tendría sentido usarlo con id, ya que debería ser un elemento único.

//Aquí tendríamos una lista estática con todos los elementos p
var x = document.querySelector('p');

¿Y cómo accedemos a los elementos del Nodelist?

Al ser una lista podemos acceder a los elementos contenidos en el Nodelist que nos devuele querySelectorAll() mediante un índice. Podemos conocer el tamaño de la lista accediendo a la propiedad length e iterar todos los elementos dentro de un bucle:

//Aquí tendríamos una lista estática con todos los elementos p
var x = document.querySelector('p');

//ahora los recorremos y, para el ejemplo, cambiaremos el color
//de fondo por un gris
var i;
for (i = 0; i < x.length; i++) {
  x[i].style.backgroundColor = "#d9d9d9";
}

Configurar una contraseña maestra en Firefox para proteger las contraseñas guardadas

El navegador Firefox incluye de serie una interesante herramienta llamada Contraseña Maestra (o Master Password) . Si eres de esos que no quieren memorizar un montón de contraseñas de distintos servicios y las almacena en la memoria del navegador puede resultar muy útil.

Imagina que tienes guardada en la memoria del navegador tus usuarios y contraseñas de Facebook, Twitter, Amazon, Netflix… hasta de la web del banco o de Paypal. Si le dejas a alguien ese ordenador podrá acceder a todas estas cuentas. Para eso sirve esta configuración: proteges con una contraseña única todas esas cuentas, de forma que solo tienes que recordar una.

Para activarlo tienes que pulsar el botón de Menú en Firefox, irte a opciones y ahí, en el menú de la izquierda, ir a Privacidad & Seguridad.

Ahora cargará las configuraciones a la derecha del menú. Ahí buscas la cabecera Usuarios y Contraseñas y marcas Usar una contraseña maestra. Eso abrirá un gestor para añadir tu nueva contraseña.

Tras configurarlo tendrás que cerrar y volver a abrir Firefox para que la configuración haga efecto.

Desde esa misma pantalla podrás también modificar la contraseña cuando lo creas necesario.

Crear tablas dinámicas (pivot tables) en la hoja de cálculo de Google Drive

Las tablas dinámicas en un software de hojas de cálculo nos permiten ver relaciones entre datos o delimitar grandes conjuntos de datos. Vamos a ver un ejemplo: yo en mi Google Drive tengo una tabla donde guardo los datos de la lista de discos del artículo de Mis 1001 discos indispensables, donde añado algunos datos extra que son los que utilizo para elaborar las gráficas. Voy a generar una tabla dinámica muy simple, que me va a sacar cuántos discos de cada década hay por cada país.

Veamos los pasos a seguir:

Datos de origen
  • Primero seleccionamos las celdas con los datos de origen. Lo recomendable es poner un encabezado a las columnas para trabajar de forma más clara.
  • En el menú superior hacemos click en Datos -> Tabla dinámica.
  • En el panel derecho (el de la imagen) hacemos click en Añadir junto a Filas seleccionamos el valor que queramos tener, repetimos la opreación con Columnas.
  • En el panel lateral hacemos click en Añadir junto a Valores y escogemos el valor que queremos ver en las columnas, junto a las opciones sobre como queremos que se traten dichos datos.
Resultado final

En cualquier momento puedes desplegar el menú de la derecha para agregar o quitar campos y valores. Para ver los detalles de una celda basta también con hacer doble click sobre ella, esto abrirá una visualización detalla de los valores que contiene.