domingo, 4 de noviembre de 2012

Funcion javascript para calcular la distancia entre dos puntos

Ésta función espera dos objetos que tengan la propieadd lat y lon como grados.


var distanceBetween = function(lonlatA, lonlatB) {
var lat1 = lonlatA.lat.toRad();
var lat2 = lonlatB.lat.toRad();
var lon1 = lonlatA.lon.toRad();
var lon2 = lonlatB.lon.toRad();
var R = 6371; // earth radius (Km)
return Math.acos(Math.sin(lat1)*Math.sin(lat2) + Math.cos(lat1)*Math.cos(lat2) * Math.cos(lon2-lon1)) * R;
}


La funcion toRad se puede definir para todo número de JS así:

if (typeof Number.prototype.toRad == 'undefined') {
Number.prototype.toRad = function() {
return this * Math.PI / 180;
}
}

La formula utilizada es ésta
http://en.wikipedia.org/wiki/Spherical_law_of_cosines

jueves, 1 de noviembre de 2012

Optimizando multiples imagenes PNG recursivamente

Utilizando la herramienta pngcrush disponible con apt-get y creando un pequeño shell script podemos optimizar todas las imagenes .png que queramos dentro de un árbol de directorios recursivamente.

El script requiere como parámetro el path a partir del cual se buscarán los ficheros y por seguridad no permite especificar el path raíz de nuestro linux.
Ojo que sobreescribe los ficheros, así que tener cuidado y haceros copia de seguridad por si acaso :)

Aquí os dejo el script para optimizar recursivamente todas vuestras imagenes png.



#!/bin/sh

if [ $# -lt 1 ]
then
        echo "Missing path parameter to search into"
        exit 2
fi

if [ "$1" = "/" ]
then
        echo "root folder is not allowed"
        exit 2
fi

read -p "Crush all PNG files under $1 folder? yes / no ?" answer
if [ "$answer" != "yes" ]
then
        echo "Cancelled"
        exit 2
fi

echo "Looping inside $1"
for png in `find $1 -name "*.png"`
do
        echo "crushing $png"
        pngcrush "$png" temp.png
        mv -f temp.png $png
done;


Nota:  la linea pngcrush podeis personalizarla a vuestro gusto, por ejemplo añadiendo -brute para que la compresion sea superior (aunque mucho más lento).

He conseguido aproximadamente un 10% de reducción sin usar brute básicamente porque no me apetece esperar varias horas (eran cientos de ficheros)

Espero que os sirva :)


Montar samba share de Ubuntu a Ubuntu con smbmount

Habitualmente utilizo máquinas virtuales a las cuales me conecto desde mi host (en éste caso ambas son Ubuntu 12, el host es la version client y el guest es la version server).

En la máquina guest, debemos tener instalado samba y configurado al menos un recurso compartido

$ sudo vim /etc/samba/smb.conf


[www]
        comment = www folder
        read only = no
        path = /var/www
        writeable = yes
        guest ok = no
        create mask = 644
        directory mask = 644

$ sudo service smbd restart

En la máquina host, ejecutamos a mano o nos preparamos un script para lanzarlo cada vez que queramos montar el shared folder (también lo podemos poner en fstab con opción noauto, ya que recordemos que en éste caso estamos hablando de una máquina virtual que debe ser lanzada antes de montar el share)


#!/bin/bash
sudo smbmount //192.168.1.xxx/www /mnt/www -o rw,user=myuser,uid=1000,gid=1000

Y ya está, con ésto tendremos montado el shared con permisos de leer, escribir y borrar.
La parte de uid y gid es importante para que no se nos monte con otro usuario y nos de problemas de escritura o borrado.