Muchas aplicaciones web usan el favicon para notificar
eventos, como nuevos mensajes o nueva actividad. Uno de los ejemplos más claros es Gmail, aunque también otros como Facebook o Pinterest lo usan.
Hace poco encontré una clase Javascript que permite implementar esta funcionalidad en una web: Notificon. Con esta clase, el notificar al usuario, por ejemplo, que tiene un nuevo mensaje en nuestra aplicación web es coser y cantar.
Nota rápida para que no se me olvide: si se supone que hay un puerto ocupado por un proceso, pero no se sabe qué proceso, podemos identificarlo fácilmente:
$ sudo nc -l $PUERTO # Esto es para confirmar que el puerto está ocupado
$ sudo lsof -Pnl +M -i6 | grep $PUERTO
Esto nos devuelve, por ejemplo:
java 13983 0 52u IPv6 456646354 TCP *:8080 (LISTEN)
Y de ahí podemos sacar toda la información del proceso usando su PID (el primer número):
$ sudo ps aux | grep $PID
Una de las grandes ventajas de Git es su potencia para el trabajo en grupo. Para poder usar Git de esta forma basta con un par de comandos para configurar el repositorio de forma que permita escribir a los usuarios autorizados.
Lo primero es crear los usuarios autorizados para que puedan conectar por SSH (es el método de conexión que utilizo en mis repositorios, por comodidad de configuración), y añadirlos a un grupo que será el que esté autorizado para escribir en el repositorio. Yo utilizo el grupo git-user para ello.
Después, ya sólo nos falta configurar el repositorio para permitir el acceso compartido. Para ello basta con cambiar el contenido del repositorio al grupo autorizado, y configurar el parámetro adecuado del repositorio:
$ cd /var/git/mirepositorio.git
$ sudo chmod -R g+ws *
$ sudo chgrp -R git-user *
$ git repo-config core.sharedRepository group
El último comando configura el repositor para el uso compartido por varios usuarios pertenecientes a un mismo grupo. Este grupo es el tienen asignados los objetos del repositorio, y hay que asegurarse de que todos los archivos y objetos pueden ser escritos por ese grupo (los dos comandos anteriores).
También se podría haber usado el parámetro world:
$ git repo-config core.sharedRepository world
Esto haría el repositorio visible a todo el mundo, lo cual es mucho más inseguro y sólo debe usarse cuando el sistema operativo no permita que los nuevos directorios creados tengan el grupo adecuado (NetBSD por ejemplo).
Cuando ya tenemos un repositorio personal, y queremos dar acceso a otros usuarios, lo más probable es que los usuarios vean este error al hacer un push:
Insufficient permission for adding an object to repository database
La forma de solucionarlo es ejecutando los comandos indicados anteriormente, ya que por defecto el repositorio de Git está configurado para no ser compartido (core.sharedRepository = false).
Una técnica CSS muy extendida, casi básica, es la de reemplazar un texto por una imagen usando text-indent. Con esta técnica podemos transformar un enlace en un botón, o un aburrido título en un título con fuentes especiales o con un bonito diseño. Esto último es cada vez menos necesario ya que podemos usar fuentes propias con CSS3, pero para muchas otras situaciones el reemplazar texto por imagen sigue siendo una labor del día a día.
Hasta ahora usábamos la identación negativa del texto, a la vez que dábamos una imagen de fondo al elemento; así, conseguimos que se muestre la imagen pero el texto se desplaza fuera de la pantalla, siendo "invisible":
background: url("../images/boton.png") 0 0 no-repeat;
text-indent: -9999px;
Esto conlleva dos pequeños detalles, uno de rendimiento y otro de diseño:
Un nuevo planteamiento para resolver esta situación, propuesto por Scott Kellum en Zeldman.com, identa el texto al mismo tamaño que la caja contenedora, pero al no hacer wrapping y esconder el overflow, el texto no aparece ni cambia el tamaño de la caja:
text-indent: 100%; white-space: nowrap; overflow: hidden;
Esta solución evita los dos problemas del clásico -9999px, siendo una solución mucho más elegante y limpia.
Una de las partes más aburridas de cualquier web son los contenidos de ayuda o de términos de uso. Suelen ser bloques de texto intragable, con un índice en la parte de arriba si hay suerte. No se puede hacer mucho para mejorar esto, ya que tanto la ayuda como sobre todo los términos de uso, políticas legales, etc. requieren de mucho texto.
Lo que sí podemos hacer es tratar de que la experiencia de usuario sea más agradable a la hora de leer estos contenidos. Y lo podemos hacer usando únicamente CSS, gracias al nuevo selector target de CSS3.
Fantástico truco de Steve Adams. Con cron podemos programar tareas por horas, días, semanalmente, mensualmente... pero, ¿cómo programar una tarea para que se ejecute cada dos semanas?
#----+-----+-----+-----+-----+------------------------------------------------- #min |hour |day |month|day |command # | |of mn| |of wk| #----+-----+-----+-----+-----+------------------------------------------------- 03 04 * * 4 expr `date +%W` % 2 >/dev/null || script_a_ejecutar
El comando comprueba si la semana actual es par o impar, y ejecuta el comando en caso de ser par.
En caso de querer ejecutar el comando sólo en las semanas impares, para evitar el error de cron por un valor de retorno distinto a cero, se debe usar:
expr `date +%W` % 2 >/dev/null && run_my_script || true
Me acaba de ocurrir: tengo un listado de ficheros en un archivo, un fichero por línea, y debo hacer un paquete con ellos. Así que pruebo lo obvio:
$ tar zcf fichero.tgz < lista_ficheros tar: Rechazo cobarde a crear un archivo vacío
Sorpresa, a tar no le gusta recibir la lista de ficheros a empaquetar "en columna", sino que los espera "en fila". Parecía trivial fusionar todas las líneas del listado de ficheros en una sola, pero al final me llevó un rato, así que lo anoto aquí para futuras referencias:
$ echo `cat lista_ficheros` >> lista_ficheros_linea $ tar zcf fichero.tgz `cat lista_ficheros_linea`
Esto funcionará si el fichero con la lista de archivos no contiene líneas en blanco. Si es el caso, basta con filtrar caracteres:
$ echo `cat lista_ficheros | cut -f2 | grep ".${X}"` >> lista_ficheros_linea
$ tar zcf fichero.tgz `cat lista_ficheros_linea`
A veces tenemos un equipo que se cuelga frecuentemente o que tiene errores extraños y que no podemos aislar. En estos casos hay que mirar con sospecha a la RAM, ya que es probable que sea la causa del problema. Soluciones como Memtest86+ son de sobra conocidas, pero, ¿y si no podemos arrancar con un disco de inicio para ejecutar Memtest? ¿Por ejemplo, en un servidor VPS?
Esta web
http://alvaroremesal.net
, su contenido, texto e imágenes está licenciado bajo una
Licencia Creative Commons Reconocimiento-Compartir bajo la misma licencia 3.0 España.