Desactivar la opción “Upload open files” en el plugin SFTP de Sublime Text 3

Una de las cosas que me encanta de Sublime Text es la cantidad de plugins que tiene. Uno de ellos es Sublime SFTP, que permite subir y bajar ficheros por FTP directamente desde el Sublime Text.

Sin embargo hay una cosa que no me gusta de este plugin: en el menú contextual las opciones de subir fichero (que sube al servidor el fichero actual) y subir los ficheros abiertos (que sube todos los ficheros que tengamos abiertos) están seguidas, lo que hace que a veces seleccionemos la segunda en vez de la primera. Esto me ha pasado ya un par de veces y por suerte sin consecuencias, pero puede haber ocasiones en las que subir todos los ficheros que estamos editando pueda causar problemas.

Para solucionar esto lo más sencillo es modificar el menú contextual y mover la opción de subir los ficheros abiertos más abajo. Abrimos la carpeta de los paquetes (Preferences -> Browse Packages) y entramos en la carpeta SFTP. Allí encontraremos el fichero Context.sublime-menu, en el que simplemente moveremos la línea

{ "caption": "Upload Open Files", "command": "sftp_upload_open_files" },

a cualquier otra parte. Yo la he puesto debajo de la opción Browse remote.

SiteInfo – Una clase para obtener información de una web

Trabajando en la sección de links de hive.ly necesitábamos obtener una imagen de los enlaces que suben los usuarios. He hecho una pequeña clase de PHP que obtiene algunos datos de una URL que se le proporcione, entre ellos una imagen. Primero se buscan imágenes grandes (como las de las etiquetas OpenGraph) y si no imágenes de MS, Twitter o iconos de Apple.

La clase es gratuita y está disponible en Github.

Efecto de bote para iconos

Hace mucho tiempo probé una distribución de GNU Linux (no recuerdo cuál) que usaba KDE como entorno de escritorio, y me hizo mucha gracia que al iniciar un programa aparecía al lado del cursor el icono de la aplicación botando.

Lo implementé en su momento en mi entorno de ventanas para aplicaciones web, para indicar al usuario que la aplicación se estaba cargando, y ahora como he visto que llevaba un tiempo sin publicar nada de código libre he decidido subirlo a GitHub.

Así que presento al mundo bouncingIcon, una función muy sencilla que permite poner a botar un icono (bien fijo en una esquina, bien siguiendo al cursor como hacía KDE) que le indique al usuario que se está realizando una operación en la página. El repositorio de GitHub es https://github.com/koas/bouncingIcon y la página de demo para verlo funcionar es http://koas.github.io/bouncingIcon/

Espero que le resulte útil a alguien.

Mi experiencia con un teclado ciego: Das Keyboard 4 Ultimate

Hace un par de meses me compré un teclado ciego (un teclado que no tiene símbolos en las teclas), el Das Keyboard 4 Ultimate, y voy a contar aquí mi experiencia con él por si le puede resultar útil a alguien.

Antes de nada, un poco de historia. Mi teclado anterior, un Corsair Vengeance K70, me dio bastantes problemas. Después de unos meses usándolo empezó a fallar, había teclas que aparecían dos veces al pulsarlas, otras que no aparecían al pulsarlas pero que aparecían después… un sindiós, vaya. Lo devolví a la tienda donde lo compré, PC Componentes, que tuvieron un comportamiento impecable: me enviaron una pegatina con el código para el transportista, lo vinieron a buscar a casa y en menos de una semana tenía el nuevo. No me pagan por hacerles publicidad, pero no puedo más que recomendar a todo el mundo que compre cualquier cacharrito con ellos, porque el precio es bueno pero el servicio es excelente.

Para mi sorpresa, el teclado nuevo volvió a dar los mismos problemas un par de meses después. Ya estaba un poco harto y le había cogido manía, así que decidí pasar de él y comprarme el mejor teclado mecánico que hubiera en el mundo.

Los únicos requisitos eran que fuera mecánico, con teclado numérico, que tuviera control de volumen y que no pareciera una nave espacial (hay teclados mecánicos que son la auténtica horridez, con colorines y lucecitas y  formas absurdas de nave espacial).

Después de mucho buscar y descartar todo apuntaba a Das Keyboard. El único problema era que no tenían distribución en español, solo distribuciones bárbaras como US, UK, NO y DE. Pero salvo eso lo tenía todo: cuerpo de aluminio negro precioso, sobrio, casi espartano, teclas multimedia ultradiscretas, hub de puertos USB 3.0 y una rosca para el volumen chulísima. Además de una reputación bastante unánime en todas las páginas que consulté como uno de los mejores teclados existentes, si no el mejor.

Es muy duro encontrar un teclado así y ver que no lo hay para tu idioma. Estaba yo rabiando y maldiciendo a los alemanes por lo bajo cuando vi el enlace a la versión sin símbolos, el Das Keyboard 4 Ultimate. Y entonces pensé: “Maldita sea, ¡esta es la solución, me compro este!”.

Pero después del arrebato inicial me puse a pensar un poco, porque igual era una insensatez gastarme 169 eurazos en un teclado que igual no podía usar. Las letras del alfabeto no eran problema, llevo escribiendo con teclados 30 años y aunque nunca estudié mecanografía escribo bastante rápido sin tener que mirar al teclado. Lo que me echaba para atrás eran los símbolos. Siendo programador uso constantemente símbolos como [] {} % & $ | etc. ¿Sería capaz de manejarme con un teclado ciego en un entorno de programación?

Así que hice la prueba. Me forcé durante una hora a programar sin mirar el teclado y pude comprobar que la memoria muscular de los dedos funcionaba perfectamente con todas las teclas, ya fueran letras o símbolos.

La memoria muscular es básicamente la automatización de movimientos basada en la repetición. Maravillas del cerebro humano: cuando realizas una misma operación muchas veces los músculos aprenden ese patrón y puedes realizarlo sin darte cuenta, sin pensar. En el caso del teclado, el movimiento que hace cada dedo para pulsar una tecla se acaba aprendiendo y se realiza de forma automática. No hace falta pensar dónde tienes que mover cada dedo, simplemente piensas en una palabra y los dedos se mueven “solos” para escribirla. Mientras escribo estas líneas ni siquiera sé qué dedo ha pulsado cada tecla, van ellos solos.

Animado con esta prueba me lancé y compré el teclado. Lo compré con los conmutadores Cherry MX Brown, para que no fuera demasiado ruidoso.

Al abrirlo lo primero que llama la atención es lo bonito que es. La superficie es de aluminio negro anodizado, es precioso. El logo de Das Keyboard va en un negro un poquito más intenso que el del panel, por lo que apenas se ve. Todo es negro salvo el bisel de la rosca del volumen, que es rojo y hace un contraste espectacular.

Cuando lo sacas de la caja notas lo pesado que es. Esto es bueno porque, como no es un periférico que haya que andar moviendo de un lado para otro, el peso le da estabilidad. El cable es largo, dos metros, más que suficiente.

A diferencia de otros teclados con puertos USB integrados, este teclado no tiene dos conectores USB, solamente uno. Es importante, eso sí, enchufarlo en un puerto USB 3.0 del ordenador, para que así cualquier pincho USB que conectemos en el teclado aproveche esa velocidad.

El sonido de las teclas es auténtico porno para los oídos. No es exagerado como aquellos IBM antiguos pero tiene ese clickety click mecánico que es tan gustoso. El tacto de las teclas es maravilloso y solo tiene un problema: que una vez que lo pruebes nunca más podrás escribir a gusto en un teclado que no sea mecánico.

Y ahora al tomate: ¿cómo es la vida diaria con un teclado ciego? Pues los dos o tres primeros días me sorprendía mirando al teclado para escribir algún símbolo, pese a que el dedo estaba pulsando la tecla correcta. Son hábitos producto de la costumbre, y desaparecen pronto, ya que al no haber ningún símbolo deja de tener sentido mirar al teclado. Los caracteres propios de la programación me salían solos, y solo de vez en cuando alguno se me atragantaba.

El único problema que he encontrado ha sido con las contraseñas. Quizá sea psicológico, pero al no ver en pantalla el resultado de la pulsación de las teclas me costaba un poco escribirlas. También influye el hecho de que al no ser palabras del castellano (porque vosotros tampoco usáis como contraseñas palabras del castellano ¿verdad? ¿Verdad?) quizá la memoria muscular no funciona tan bien. Pero en estos casos, y aunque parezca raro, lo que hago es mirar al teclado. No tiene símbolos, de acuerdo, pero de alguna forma el cerebro recuerda dónde está cada tecla y escribe la contraseña perfectamente. Misterios del cerebro.

Resumiendo: estoy feliz con este teclado, quiero casarme con él y darle un montón de bebés teclado todos ciegos. Lo recomiendo sin duda, pero con un aviso: al ser un teclado ciego cómpralo solamente si sabes mecanografía o no la sabes pero llevas tanto tiempo tecleando que eres capaz de escribir sin mirar al teclado. Si no, puedes esperar a ver si a los merluzos de Das Keyboard les da por sacar una distribución en español, que no entiendo por qué no la tienen, porque con la cantidad de personas en el mundo que la usan se harían de oro.

Detectar si una página deja de ser visible: Page Visibility API

Hay veces que nos interesa saber si la página web en la que estamos ha dejado de ser visible. Por ejemplo, si el usuario no está viendo nuestra página quizá queramos notificarle de novedades mediante una notificación o un cambio de título de la pestaña del navegador.

Para esto, y para navegadores relativamente modernos, disponemos de la Page Visibility API. Con esto podremos saber cuándo nuestra página ha dejado de ser visible y cuándo vuelve a serlo, y actuar en consecuencia.

Detectar el ancho de la barra de scroll del navegador con JavaScript

Para detectar el ancho de la barra de scroll del navegador podemos usar este pequeño código:

function anchoBarraNavegador()
{
    var scrollDiv = document.createElement("div");
    scrollDiv.style.cssText = 'width: 99px; height: 99px; overflow: scroll; \
    			       position: absolute; top: -9999px;';
    document.body.appendChild(scrollDiv);

    var scrollbarSize = scrollDiv.offsetWidth - scrollDiv.clientWidth;
	
    document.body.removeChild(scrollDiv);

    return scrollbarSize;
}

Ejecutar código de jQuery cuando todas las imágenes se hayan cargado

En jQuery podemos ejecutar un código cuando la página haya terminado de cargarse de dos formas:

A) Cuando el DOM se haya cargado:

$(document).ready(function() 
{
    // Nuestro código
});

Esto significa que ese código se ejecutará cuando el navegador haya cargado todo el código HTML de la página y lo haya interpretado, teniendo así ya disponible el DOM.

B) Cuando se hayan cargado todos los elementos de la página:

$(window).load(function() 
{
    // Nuestro código
});

Este código se ejecutará cuando todos los elementos de la página se hayan cargado. Es lo que querremos usar si queremos ejecutar nuestro código cuanto todas las imágenes se hayan cargado.

Acceder a un servidor por SSH sin necesidad de meter la clave

En ocasiones querremos poder acceder a un servidor por SSH sin tener que meter la clave, bien porque sea un servidor al que accedemos frecuentemente y nos aburre meter la clave cada vez (porque la hemos hecho larga y complicada, claro) o porque queremos automatizar operaciones de copia de ficheros desde un script o algo parecido.

Hay que recordar que esto solamente debemos hacerlo en nuestro propio ordenador.

El proceso es el siguiente, llamamos a nuestro ordenador A y al servidor al que queremos entrar sin la clave B. Supondremos que nuestro usuario es koas en nuestro ordenador A y queremos entrar en el servidor B como root.

En nuestro ordenador escribimos:

ssh-keygen -t rsa

Cuando nos pida la passphrase la dejamos vacía.

Entramos en el servidor B por SSH, aún tendremos que poner la clave. Nos vamos a la carpeta del usuario con el que queremos entrar (en este caso /root) y creamos (si no existiera ya) la carpeta .ssh:

mkdir .ssh

Salimos de B y desde A escribimos:

cat .ssh/id_rsa.pub | ssh root@B 'cat >> .ssh/authorized_keys'

Nos volverá a pedir la clave de root en B, y con esto el proceso habrá terminado.

Automatizar prefijos CSS con Sublime Text

Hay muchas propiedades CSS que todavía no están implementadas en los navegadores con los nombres que define el estándar, sino que cada navegador las implementa con un prefijo.

Por ejemplo, si queremos que un usuario no pueda seleccionar el texto de un elemento tendremos que escribir este código CSS para asegurarnos de que funciona en todos los navegadores:

-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;

Esto, por supuesto, es un tostón hacerlo a mano. Aquí es donde el plugin AutoPrefixer para Sublime Text nos puede echar una mano. Nos lo instalamos y al seleccionarlo en la paleta de comandos (Ctrl + Shift + P) revisará nuestro fichero (o el texto que tengamos seleccionado) y añadirá todas las propiedades específicas para navegadores allí donde haga falta.

Además se puede configurar indicando el número de versiones anteriores a la actual de los navegadores que queremos soportar.