Speed up Google Analytics js by caching it locally

Written on June 3rd, 2010
.

rect2818 Speed up Google Analytics js by caching it locally

The big problem of use Google Analytics is that you have to get its javascript to get to work statistics. For me this causes that my sites takes a lot of time to end the load. For this reason I always recommend put the GAnalytics code at the bottom of the page, but for me this is not enought.

One solution to this is to cache the external javascript locally but what if the external javascript changes? Here I go to explain how to store GAnalytics javascript locally and peridiocally check that is the lastest version.
Read the rest of this entry »

Automatic upgrades on Ubuntu with apt and cron

Written on January 22nd, 2010
.

If you want to get automatic upgrades of your personal repositories I haven’t find a way to get managed with unattended-upgrades so I have done the next wordarround.

This way is to use apt-get and crontab together, so open your crontab editor:

sudo crontab -e

And type the next line to execute our upgrade every night at 1AM:

0 1 * * * (/usr/bin/aptitude -y update && /usr/bin/aptitude -y safe-upgrade) 2>&1 >> /var/log/auto_update.log

Save and exit your editor, and you are all set! You could check the logfile: /var/log/auto_update.log every once in a while to see if everything is still running smoothly.

Note: If you have a solution to get to work unattended-upgrades package with custom repositories please fill a comment below.

Block Grub2 entries with user/pass auth

Written on January 20th, 2010
.

As I wrote on tittle since grub’s 2529 svn revision we can use “Basic authentication” on entries. One of the huge regression bugs that grub2 introduces since is replacing grub on main distribution, like Ubuntu. This bug impedes me to implement on the hostile environments where I have deployed GNU/Linux boxes (university community).

This solution is still on initial development but after probe it I have to say that works perfectly for me. Here I’ll explain how to activate authentication support on grub2 and with this avoid that unprivileged users change grub entries or boot from memory sticks or similar.

Just edit file /boot/grub/grub.cfg and prepend the next text:

set superusers="user1"
password user1 password1
password user2 password2

menuentry "GNU/Linux" {
        set root=(hd0,1)
        linux /vmlinuz
}

menuentry "Windows" --users user2 {
        set root=(hd0,2)
        chainloader +1
}

as you can see this syntax is very simple and self-explainable. Take a lot at second menu entry, with that only user2 can boot on “Windows”  and only user1 and user2 can edit grub entries..

By other side, this introduces a huge security bug ’cause password is written on plain text. At this moment password command only has  support for pain passwords so if we want encrypted passwords we have to create a config file at /etc/grub.d/ and using

grub-mkpasswd-pbkdf2

we can generate a block with user and pass like the next one (trimmed ’cause brakes the layout page):

password_pbkdf2 user3 grub.pbkdf2.sha512.10000.9290F727ED06C....38BA45

For more, and possibly more actualized, information go to http://grub.enbug.org/Authentication

Búsqueda avanzada de archivos con find, locate y grep

Written on December 8th, 2008
.

Todos los que trabajamos asiduamente con un terminal no podemos evitar en algún momento lidiar con la tarea de búsqueda de archivos por nombre o incluso por contenido, incluso podemos querer ejecutar comandos con los resultados obtenidos.

Utilizaremos estos dos comandos: find, locate, grep.

Find

Busca en un directorio seleccionado segun unos modificadores proporcionados entre los que podemos destacar

  • -iregex para buscar con una expresión regular sin tener en cuenta las mayusculas/minúsculas
  • -regex para buscar con unha expresión regular teniendo en cuenta las mayusculas/minúsculas
  • -name para buscar segun un nombre dado se puede proporcionar una expresión regular
  • -empty para buscar ficheros vacíos
  • -user para buscar arquivos que pertenecen a un usuario determinado
  • -group para buscar arquivos que pertenecen a un grupo de sistema determinado
  • -atime -mtime etc. utiliza el tiempo de modificación, acceso, creación… de los archivos
  • -executable para buscar archivos con el flag de ejecutable
  • -type [letra] para buscar archivos [letra]=f , directorio [letra]=d, enlaces simbólicos [letra]=l, ficheros socket [letra]=s

además también proporciona modificadores de acción, esto es, modificadores que le dicen al comando que hacer con los resultados

  • -print imprime el nombre de archivo completo en la salida estándar
  • -exec {} ejecuta el comando seleccionado en {}
  • -delete borra el archivo

Ejemplos prácticos:
find . -exec grep “www.athabasca” ‘{}’ \; -print
#busca la cadena “www.athabasca” dentro del contenido de los archivos del directorio actual y los imprime

find . -name "rc.conf" -exec chmod o+r '{}' \;
#le cambia el modo a o+r a los archivos con nombre rc.conf en el directorio actual
find . -perm -g+w,u+w ! -perm -o+w
#busca los archivos que son escribibles por el propietario o su grupo, pero no el resto

Locate

Locate supone un salto en el rendimiento respecto al comando find siempre y cuando busquemos los archivos por su nombre. La razón del rendimiento de locate es que utiliza un índice de nombres de archivos normalmente ubicado en /var/lib/mlocate/mlocate.db. Normalmente tódolos los sistemas UNIX tienen una tarea de cron que actualiza dicha base de datos, aún así si queremos actualizarla manualmente podemos ejecutar el comando updatedb.

Podemos destacar varios modificadores de dicho comando:

  • –limit limita el número de resultados
  • –count imprime el número de resultados en vez de los resultados mismos.
  • –regex busca en la base de datos según una expresión regular

En la siguiente imagen podemos ver la diferencia de rendimiento entre find y locate, encontrado aquí:
Find locate comparison performance

Grep

Muy utilizado comando sobre todo utilizando tuberías ( | ), se utilza principalmente para buscar ficheros según el contenido de los mismos. La mejor forma de observar su comportamiento es mediante ejemplos:

grep 'string' *.txt
#busca la cadena "string" en todos los archivos .txt
grep 'main(' *.c
#busca la cadena "main(" enn todos los archivos .c
grep -i 'ultra' *.conf
#busca la cadena ultra (sin tener en cuenta mayusculas/minúsculas) en los ficheros .conf
grep -iR 'ultra' *.conf
#busca la cadena ultra (sin tener en cuenta mayusculas/minúsculas) en los
  ficheros .conf en el directorio actual y subdirectorios del mismo

Y ahora unos truquillos:

$ grep --color=auto -iR 'getChar();' *.c
#resalta los resultados para ver mejor el texto
$ grep --color=auto -iRnH 'getChar();' *.c
#muestra el nombre de archivo y número de línea donde se encontró la cadena

Y ahora combinando find y grep:

$ find . -name "*.c" -print | xargs grep "main("
#busca en tódos los ficheros .c la cadena "main)"

Como acabamos de ver tenemos diversas posibilidadades, que luego de estudiarnos un poco la sintaxis de los comandos nos harán abandonar las lentas y a veces podo intuitivas GUIs.