jQuery: comodines para los selectores

Una de las comodidades de jQuery es la versatilidad que nos da a la hora de trabajar con diversos selectores. Lo que muchos no saben, o lo intuyen pero no lo tienen claro, es que existen diversos comodines para usar los selectores de jQuery. Vamos a verlos:

Seleccionar por un prefijo: Tenemos la posibilidad de usar un selector que actúe sobre los elementos que tengan un atributo cuyo valor sea igual a la cadena que le pasemos, o que empiecen por esa cadena seguida de un guión. La sintaxis sería tal que así: jQuery( “[attribute|=’value’]” )
Lo vemos mejor con un ejemplo:

<div id="pepe">Some text</div>
<div id="pepe-paya">Some other text</div>
<div id="pepote">Some text</div>
 
<script>
//oculturía los dos primeros divs y dejaría el tercero
$( "div[id|='pepe']" ).hide();
</script>

Seleccionar por un fragmento de una cadena: Con esta opción lo que buscaríamos sería un fragmento de texto dentro del valor del atributo, en cualquier posición. La sintaxis sería tal que así: jQuery( “[attribute*=’value’]” )
Lo vemos mejor con un ejemplo:

<div id="casapepe">Some text</div>
<div id="pepepaya">Some other text</div>
<div id="pepote">Some text</div>
 
<script>
//oculturía los dos primeros divs y dejaría el tercero
$( "div[id*='pepe']" ).hide();
</script>

Seleccionar por una palabra aislada concreta: El título es un pelín confuso, lo se, pero te lo explico. Con esta opción buscaríamos dentro del atributo una palabra concreta, que puede estar delimitada por espacios o ser el valor único del atributo. La sintaxis sería tal que así: jQuery( “[attribute~=’value’]” )
Lo vemos mejor con un ejemplo:

<div id="casa pepe">Some text</div>
<div id="pepe">Some other text</div>
<div id="pepepaya">Some text</div>
 
<script>
//oculturía los dos primeros divs y dejaría el tercero
$( "div[id~='pepe']" ).hide();
</script>

Seleccionar por el final del atributo: En este caso lo que hacemos es buscar los elementos con un atributo cuyo valor termine con la cadena que le pasamos. La sintaxis sería tal que así: jQuery( “[attribute$=’value’]” )
Lo vemos mejor con un ejemplo:

<div id="casapepe">Some text</div>
<div id="pepemola">Some other text</div>
<div id="elpepepaya">Some text</div>
 
<script>
//oculturía el primer div y dejaría los otros dos
$( "div[id$='pepe']" ).hide();
</script>

Seleccionar por el principio del atributo: En este caso lo que hacemos es buscar los elementos con un atributo cuyo valor comience con la cadena que le pasamos. La sintaxis sería tal que así: jQuery( “[attribute^=’value’]” )
Lo vemos mejor con un ejemplo:

<div id="casapepe">Some text</div>
<div id="pepemola">Some other text</div>
<div id="elpepepaya">Some text</div>
 
<script>
//oculturía el segundo div y dejaría los otros dos
$( "div[id^='pepe']" ).hide();
</script>
Anuncios

SQL: Formas Normales

Recuperados ya del fin de semana de rock and roll vamos a volver al código con algo de SQL teórico: la normalización de datos. El diseño lógico de las tablas y sus relaciones es fundamental para la optimización de una base de datos. Existen cinco reglas de normalización que debemos cumplir para aseverar que nuestra base de datos SQL está normalizada, aunque es cierto que hay quien considera que la cuarta y la quinta son rizar el rizo y que con cumplir la tres primeras generalmente ya tenemos una base de datos normalizada. Estas son las cinco formas normales:

  1. Primera Forma Normal: La primera forma requiere la eliminación de todas las columnas duplicadas de una tabla, la separación en otras tablas de esos datos que se duplicarían y la identificación de cada tabla con una atributo de clave primaria. Por ejemplo, si tenemos una tabla donde registramos ventas no guardamos el nombre y el precio del producto vendido en ella varias veces, sino que tendremos una tabla de productos con esos datos separado de la tabla de ventas, y ambas tendrían claves primarias que identifican a cada fila.
  2. Segunda forma Normal: Implica que se cumpla lo dicho en la primera forma normal y que, además, se creen relaciones entre tablas a través de claves externas. Es decir, la tabla Ventas del ejemplo anterior incluye como Clave Externa un valor único que lo relaciona con la tabla Productos, generalmente su clave primaria.
  3. Tercera Forma Normal: Esta norma implica que se cumplan las dos anteriores y que, además, todas las columnas de un registro deben hacer referencia únicamente a la clave primaria, y además elimina todos los atributos derivados. Volvemos al ejemplo: la tabla Productos nos dará el nombre del producto, su precio, en qué almacén se guarda y su fecha de caducidad. No tendremos, por ejemplo, un registro para decir en qué piso del almacén se guarda, ya que ese dato sería de la tabla Almacén. Tampoco tendríamos una columna con los días que faltan hasta que caduque, ya que ese sería un atributo derivado que podemos calcular con la fecha de caducidad.
  4. Cuarta Forma Normal: Agrega un requisito adicional, que es la eliminación de cualquier dependencia multivaluada en las relaciones. Una tabla con una dependencia multivaluada es una donde la existencia de dos o más relaciones independientes muchos a muchos causa redundancia.
  5. Quinta Forma Normal: Rizando el rizo, vendría a decir que sólo se podrían realizar relaciones entre tablas utilizando claves candidatas, con la idea de reducir la redundancia de datos entre múltiples tablas.

A la hora de normalizar bases de datos hay una frase en inglés que lo resume todo: “The key, the whole key, and nothing but the key.” En la propia web de Microsoft la primera recomendación que dan para mejorar el rendimiento de SQL-Server y tener un diseño eficiente de la base de datos es usar un índice autonumérico como clave primaria de cada tabla, identificando así de forma unívoca cada registro y facilitando la relación entre ellos.

Eliminar un elemento de un array dando su valor en Javascript

Vamos con una función de Javascript, en la cual le pasaremos un array y una cadena con el valor que queremos eliminar. De esta forma podremos eliminar dicho valor sin saber el índice en el que está almacenado en el array.

//le pasamos a la función el array
//y el valor
function borraItemValor(array, valor){
    for(var i in array){
        if(array[i]==valor){
            array.splice(i,1);
            break;
        }
    }
}

Puedes probarla con algo como esto:

var unarray = ["uno", "dos", "tres", "cuatro"];
borraItemValor(unarray, "dos");

Redirección de datos en Bash

La redirección de datos es un elemento básico de Bash ya que nos permite controlar hacia dónde se volcarán los datos de salida de un comando o script, o de dónde obtenemos los datos de entrada.

Tenemos tres descriptores:

  • stdin: Entrada estándar.
  • stdout: Salida estándar. También se abrevia con el número 1.
  • stderr: Error estándar. También se abrevia con el número 2.

Esto nos dará varias opciones. La primera, redirigir la salida estándar a un fichero, para lo que usamos el operador >:

ls -l > fichero.txt

En el ejemplo de arriba ejecutamos el comando ls -l pero le decimos que nos guarde el resultado en un fichero. Ahora vamos a redirigir el error estándar a un fichero, usando el operador 2>:

grep pri * 2> error.txt

En este caso ejecutamos el comando grep pri * y lo que sacamos al fichero son los errores. Luego podemos combinar la salida y sacar la salida el estándar por el error estándar o viceversa:

#Sacamos el error estándar por la salida estándar
grep pri * 2>&1
#Sacamos la salida estándar por el error estándar
grep pri * 1>&2

Finalmente vamos a ver cómo sacar la salida y el error estándar juntos a un fichero:

grep pri * &> todo.txt

Esto es muy útil si queremos ejecutar un comando o un script en silencio, por ejemplo uno que se ejecute en una tarea programada con cron, ya que no veremos nada en pantalla pero tendremos nuestro propio log con los datos de lo ejecutado.

¿Cómo hacer que sudo te insulte cuando te equivocas con el password?

Vamos con una entrada de sistemas completamente inútil. Sí, porque como humanos nos divierten las cosas inútiles pero chocantes. También puede valer como troleo de oficina, si gustáis: Hacer que sudo insulte al usuario cuando se equivoque introduciendo su password. Esto en principio funciona en los sistemas basados en Ubuntu, posteriores a Ubuntu 12.04 y que tengan sudo 1.8.3 instalado.

La cuestión es que tenéis que editar el fichero /etc/sudoers y buscar la línea que pone:

Defaults                env_reset

Y cambiáis esa línea por:

Defaults env_reset,insults

Tras eso, si queréis comprobar su funcionamiento, invocáis una instrucción con sudo y ponéis mal la contraseña. Recibiréis respuestas tan ingeniosas como: It can only be attributed to human error, Ying Tong Iddle I Po, Take a stress pill and think things over, He has fallen in the water, Have a gorilla…,The more you drive — the dumber you get, … and it used to be so popular… o BOB says: You seem to have forgotten your passwd, enter another!

Como ya dije, inútil pero divertido.

Contar las palabras de un documento de Google Docs

Ok, os debo una crítica de un disco de este finde todavía… lo se. Pero mientras, minientrada ¿cómo se cuentan las palabras en un documento de Google Docs?

Navegador del ordenador:

  • Pulsa en Herramientas en el menú superior del documento
  • Pulsa en la opción Contar Palabras
  • También puedes pulsar Ctrl+Shift+C

App de Android o App de iOS:

  • Despliega las opciones del menú pulsando el icono de los tres puntos de la parte superior
  • Selecciona la opción Recuento de Palabras

Si no tienes texto seleccionado dará la cuenta de palabras de todo el documento, en caso contrario hará la de la selección.

PostgreSQL: Obtener todas las fechas que existen entre dos fechas dadas

El otro día veíamos cómo crear en SQL-Server una tabla con todas las fechas entre dos fechas dadas. Hoy vamos a ver cómo hacer un simple select valiéndonos de la función generate_series() para obtener todas las fechas comprendidas entre dos fechas dadas con PostgreSQL

select i::date from generate_series('2017-06-01', 
  '2017-07-31', '1 day'::interval) i