Reiniciar el Kindle

Existen 2 formas de reiniciar un Kindle. En cualquiera de ellas es recomendable enchufar el Kindle para que tenga carga: se podría dañar si justo durante el reinicio se queda sin energía.

Reiniciar mediante el botón de Encendido

Presionar y mantener el botón de Encendido, hasta que se reinicie (alrededor de 20 segundos).

Según el modelo del Kindle es posible que aparezca un contador en pantalla: tocarlo para que comience a correr, mientras se mantiene presionado el botón de Encendido.

Reiniciar mediante opción de Menú

  1. Presionar el botón Home (Casita) para ir al listado de libros
  2. Presionar el botón Menu y elegir la opción “Configuración”
  3. Presionar el botón Menu nuevamente y elegir la opción “Reiniciar”

 

Basado en:

https://itstillworks.com/restart-kindle-36235.html

Anuncios

Identificar el modelo de Kindle

Es posible que necesites saber el modelo de tu Kindle para buscarle una funda, accesorios apropiados o evaluar la compatibilidad de alguna aplicación que se conecte al mismo.

De las alternativas disponibles para ello, la que me resultó más práctica es: determinarlo a partir del número de serie.

Obtener el número de serie

  1. En el Kindle, presionar el botón Home (Casita) para ir al listado de libros
  2. Presionar el botón Menu y elegir la opción “Configuración”
  3. Buscar el apartado de “Información del dispositivo”: pasar de página hasta encontrarlo
  4. Tomar nota del número de serie (código de 16 caracteres)

Determinar el modelo a partir del número de serie

Buscar los primero 4 caracteres del número de serie en el siguiente listado y así determinar el modelo:

  • Kindle (2007): Booo
  • Kindle 2 (2009): B002, B003
  • Kindle DX (2010): B004, B005, B009
  • Kindle Keyboard (2010): B006, B008, B00A
  • Kindle 4 (2011): B00E, B023, 9023
  • Kindle 5 / Touch (2012): B00F, B010, B011, B012
  • Kindle Paperwhite (2012): B024, B01B, B01C, B01D, B01F, B020
  • Kindle Paperwhite 2 (2013): B0D4, 90D4, B0D5, 90D5, B0D6, 90D6, B0D7, 90D7, B0D8, 90D8, B0F2, 90F2, B017, 9017, B060, 9060, B062, 9062, B05F, 905F
  • Kindle 7 (2014): B001, B0C6, 90C6, B0DD, 90DD
  • Kindle Voyage (2014): B00I, B013, B053, B054
  • Kindle Paperwhite 3 (2015): G090
  • Kindle 8: B018
  • Kindle Oasis: G0B0G

Reubicar la metadata al ver un video en Youtube

Cada tanto me pasa que al ver un video de Youtube se referencia a su metadata (descripción del video) y me interesa poder verla mientras sigue la reproducción. Actualmente esta información se presenta más abajo (si es extensa, también está colapsada)  y obliga a hacer scroll, perdiendo de vista el video.

Teniendo una pantalla ancha existe el lugar para posicionar este contenido a la derecha del video, pero Youtube lo ocupa con la lista de reproducción o bien los videos relacionados (encabezado por el “A continuación”).

Ajustando con estilos

A continuación les comparto unos estilos CSS que permiten hacer estos ajustes a la hora de reproducir un video:

/* Ubicar la metadata a la derecha */
 #main > #meta {
   position:absolute;
   background-color:white;
   top:65px;
   right:0;
   width:700px !important;
   height:500px;
   overflow:auto;
 }

/* Ubicar videos relacionados y playlist debajo */
 #related, #playlist {
   position:absolute;
   top:565px
 }

/* Forzar que el video quede por encima al agrandarlo */
 #player {
   z-index:2;
 }

Disclaimer: Es posible que existan casos no contemplados y que Youtube cambie la estructura HTML haciendo que lo expuesto anteriormente tenga fallos o no funcione directamente… pero siempre se puede ajustar! Seguramente también existan formas más limpias y apropiadas de reubicar los elementos 🙂

Extensiones para facilitar la tarea

Para evitar tener que agregar estos estilos mediante las herramientas del desarrollador cada vez que se carga la página (algo no deseable) encontré extensiones (complementos o addons) para los principales navegadores que lo resuelven bastante bien. Ambas permiten definir una serie de estilos que quedan asociados al sitio y los podés activar/desactivar desde el botón de la extensión.

  • Chrome: User CSS es muy fácil de usar, con una interfaz sencilla para la configuración
  • Firefox: Custom Style Script requiere acceder a una pestaña de configuración, pero al mismo tiempo permite establecer código javascript

 

Esta publicación fue originada a partir de un pedido de los seguidores del Resumen Semanal de FabioTV.

Cambiar de directorio en la línea de comandos en Linux

Continuamente cambiamos de directorio para ubicarnos donde necesitamos trabajar. El comando cd es uno de los más utilizados en la consola.

Una situación particularmente común es cambiar entre un par de directorios, o bien ir a uno temporalmente para volver a donde estábamos ubicados.

Volver al directorio anterior

Para posicionarnos en el directorio donde nos encontrábamos antes del último cambio:

cd -

Ejemplo 1:

$ cd /var/www
$ cd /tmp
$ cd -
/var/www
Quedamos posicionados en /var/www

$ cd -
/tmp
Quedamos posicionados en /tmp

Si seguimos haciendo cd – volveremos a alternar entre ambos directorios.

Guardar directorio actual y poder volver a él

Sin conocer con precisión el directorio al que queremos acceder, es posible que usemos muchas veces cd hasta alcanzarlo. Es posible guardar nuestra ubicación actual para poder volver rápidamente a ella.

$ cd /tmp
$ pushd /var
/var /tmp
Guardamos la posición actual /tmp y quedamos posicionados en /var

$ cd lib
$ cd mysql
$ popd
/tmp
Quedamos posicionados en /tmp

Si en lugar de popd hubiéramos ejecutado cd -, nos habría posicionado en /var/lib.

 

Obs: Cada vez que se ejecuta pushd, se agrega el directorio actual a una pila. Cada vez que se ejecuta popd, se quita el último directorio de esa pila.

Formas de ejecutar comandos en secuencia

Cuando se desea ejecutar una serie de comandos en cierto orden y consecutivamente, es común ingresar uno y según el resultado obtenido ejecutar o no el siguiente.

Para simplificar esta acción hay varias alternativas según lo que deseemos que suceda según el éxito o fallo del anterior:

1. Ejecutar cada comando sin importar el resultado del anterior

Se separan los comandos por ; (punto y coma) y se ejecutan TODOS.

mkdir temp; tar -cvzf temp/app1.tar.gz app1

Se crea el directorio y luego se genera un tar.gz dentro. Si el directorio existe, el primer comando falla pero no importa.

2. Ejecutar cada comando si el anterior fue exitoso

Se separan los comandos por && (operador Y) y se ejecutan hasta que uno falle.

tar -cvzf backup/docs.tar.gz docs_dir && rm -r docs_dir/

Se crea un tar.gz y solo si esta acción es exitosa, se elimina el directorio.

3. Ejecutar cada comando si el anterior falló

Se separan los comandos por || (operador O) y en este caso se detiene en el primer comando que se se ejecute con éxito.

wget http://server1/data.txt || wget http://server1/data.bkp || date >> failed_data.log

Se intenta obtener data.txt, si no es posible, se intenta con data.bkp. Si también falla, en última instancia se agrega a un log la fecha y hora del (doble) intento fallido.

 

Por supuesto, se pueden hacer combinaciones entre los casos:

mkdir check; cd check; wget http://server1/data.txt || wget http://server1/data.bkp && mv data.txt || date >> failed_data.log
  • Se crea el directorio y se lo accede. Si el directorio existe, el primer comando falla pero sigue la ejecución.
  • Se intenta obtener data.txt. Si esta descarga se completa, se detiene la ejecución de comandos.
  • De lo contrario, se intenta obtener data.bkp. Si esta descarga se completa se renombra el archivo a data.txt. Si esta última acción puede realizarse, se detiene la ejecución de comandos.
  • Si no se pudo descargar data.bkp o bien no se lo pudo renombrar, se agrega a un log la fecha y hora del (doble) intento fallido.

 

Importante: en lo casos mencionados, un comando no utiliza la salida del anterior como su entrada.

Tratar los registros duplicados en un INSERT de MySQL

Es un sentimiento desagradable el hacer una sentencia INSERT y recibir una respuesta del estilo:

ERROR 1062 (23000): Duplicate entry '123' for key 'PRIMARY'

Los registros se consideran duplicados cuando se intenta insertar un registro que tiene un valor igual a uno existente en un campo que posee una PRIMARY KEY o un índice UNIQUE.

Existen 3 alternativas para controlar la forma en que se resolverá la inserción de registros ante la existencia de duplicados. La elección depende de las reglas de negocio principalmente.

INSERT IGNORE

Todos los errores que ocurran durante la inserción serán ignorados y se presentarán como warnings. Se puede decir que se “mantiene el registro existente”.

IGNORE tiene mayor precedencia que el modo estricto, por lo que si ambos aplican y ocurriera un error, se ignoraría.

Ejemplo

Si la tabla de usuarios tiene un índice UNIQUE por el campo login y ya existe el usuario con login jstock:

mysql> INSERT IGNORE INTO usuarios (login, nombre, apellido, estado) VALUES('jstock', 'Juan', 'Stock', 1);
-> Query OK, 0 rows affected (0.00 sec)

se ignora el duplicado, manteniendo los valores previos del registro.

INSERT ON DUPLICATE KEY UPDATE

Si una fila a insertar fuera a causar un error de duplicación, en su lugar se realiza un UPDATE del registro que existía previamente, modificando uno o más campos a la vez (separando con coma cada asignación) según se indique.

La cantidad de filas afectadas que devuelve Mysql es:

  • 1 si se inserta la nueva fila
  • 2 si la fila existente se modifica
  • 0 si la fila existente se modifica a los valores que ya poseía

Ejemplo

Suponiendo que la tabla hits posee la cantidad de veces que se accedió a una página y tiene un índice UNIQUE por el campo pagina, al agregar un registro más para index.html:

mysql> INSERT INTO paginas (pagina,hits) VALUES ('index.hml',1) ON DUPLICATE KEY UPDATE hits=hits+1;

como ya existe un registro previo identificado, lo que sucede es que se actualiza incrementando en uno la cantidad de hits.

Si existe un campo con AUTO_INCREMENT…

al hacer este tipo de INSERT si efectivamente se crea un registro, se genera un nuevo valor para el campo en cuestión. Este se puede obtener a partir de la función LAST_INSERT_ID().

Si el resultado de la sentencia es hacer una actualización del registro, entonces no se puede obtener el id correspondiente con LAST_INSERT_ID(). Para lograr que esta función tenga sentido en este caso, agregamos en el UPDATE para el campo con AUTO_INCREMENT (supongamos que sea id):

id=LAST_INSERT_ID(id)

Así se logra que la función devuelva el mismo valor que se le pasa como argumento y sea recordado y devuelto por la siguiente invocación de LAST_INSERT_ID().

Ejemplo

mysql> INSERT INTO paginas (pagina,hits) VALUES ('index.hml',1) ON DUPLICATE KEY UPDATE id_pagina=LAST_INSERT_ID(id_pagina), hits=hits+1;

REPLACE

Funciona como INSERT, pero si se detecta un duplicado, se borra el registro existente en la tabla y se realiza la nueva inserción. Se puede decir que se “establece el registro nuevo”, quitando el previo. Al realizar un borrado se desencadenan los triggers asociados al DELETE y los registros vinculados por FOREIGN KEYS podrían borrarse también!

Los pasos que sigue esta sentencia al ejecutarse son:

  1. Intenta insertar el registro
  2. Si falla por duplicate entry de una key
    1. Borra el registro conflictivo de la tabla
    2. Intentar insertar el registro nuevamente

entonces, en caso de fallo por duplicado realiza la secuencia INSERT – DELETE – INSERT.

La cantidad de filas afectadas que devuelve Mysql es:

  • 1 si se inserta la nueva fila (no existía duplicado)
  • 2 si se detecta un duplicado: un registro borrado y uno insertado en su lugar
  • N>2 si hay duplicados debido a múltiples índices UNIQUE por ejemplo

Ejemplo

Si la tabla de usuarios tiene un índice UNIQUE por el campo login y ya existe el usuario con login jstock:

mysql> REPLACE INTO usuarios (login, nombre, apellido, estado) VALUES('jstock', 'Juan', 'Stock', 1);
-> Query OK, 2 rows affected (0.00 sec)

se borra el registro previo y se inserta el nuevo, con los valores indicados.

Si existe un campo con AUTO_INCREMENT…

al hacer el REPLACE en caso de que se detecte un duplicado, se genera un nuevo valor para el campo en cuestión en el registro insertado. Este se puede obtener a partir de la función LAST_INSERT_ID().

Palabras reservadas en MySQL

Particulamente cuando deseamos utilizar ciertas palabras para nombrar tablas y campos, recibimos un mensaje de error del estilo

ERROR 1064 (42000): You have an error in your SQL syntax

esto se debe a que esas palabras son reservadas para Mysql por lo que no se pueden utilizar directamente y deben ser indicadas entre comillas del tipo backticks `.

Las palabras reservadas van cambiando con las versiones de Mysql por lo que deberán investigar cuales aplican a la versión que poseen.

Ejemplo:

mysql > CREATE TABLE schemas (id INT, name VARCHAR(50) );

producirá un error de sintaxis.

Para evitarlo debemos indicar el nombre de tabla entre `

mysql > CREATE TABLE `schemas` (id INT, name VARCHAR(50) );

 

Cuando se trata de campos también es viable utilizar nombres calificados, indicando:

nombre_tabla.nombre_campo