miércoles, 8 de febrero de 2012

Monitorización Linux

Quien está conectado y que está haciendo
w [user_name]
17:24:24 up 88 days, 17:12, 5 users, load average: 0,09, 0,07, 0,08
USER TTY   FROM         LOGIN@ IDLE   JCPU  PCPU  WHAT
gme  pts/0 paco.bit.mad 09:35  0.00s  0.61s 0.00s w
wdev pts/1 fe.bit.mad   Fri10  5days  0.01s 0.01s -bash
gme  pts/2 fe.bit.mad   Fri11  27:06m 6.31s 6.28s ./gmeser
wdev pts/5 paco.bit.mad 09:35  7:48m  0.01s 0.01s -bash
gme  pts/7 fe.bit.mad   12:23  4:58m  0.04s 0.04s -bash

Otras herramientas de monitorización de actividad, memoria, uso de disco, cpu... http://www.cyberciti.biz/tips/top-linux-monitoring-tools.html

Llamadas repetitivas a Web Services con wget

Necesitaba hacer multiples llamadas a webservices, y luego verificar los resultados devueltos. En lugar de hacerlo enlace a enlace, preparé un fichero llamadas.url donde almacene las llamadas a realizar en forma de proceso por lotes:
wget -S -i llamadas.url -O resultados_http.txt -a info_llamadas.txt
Los resultados de las llamadas se guardarán en resultados_http.txt La información de errores y tiempos se guardará en: info_llamadas.txt

martes, 7 de febrero de 2012

Vacuum de tablas con muchas actualizaciones

Si revisando los logs de tu Base de datos postgres, te encuentras a menudo con la siguiente entrada:
2012-02-06 18:44:20 CETLOG: vacuum automático de la tabla «esquema.tabla»: recorridos de índice: 1
Esto se debe a que esa tabla tiene muchas inserciones o updates y constantemente tiene que aprovisionar nuevas páginas, el proceso de vacuum autoático se lanza para liberar las páginas inservibles, etc. Para solucionar este problema lo mejor es indicar un Factor de relleno (Fillfactor) para la tabla. Este factor representa cuanto espacio se deja en una página para el alojamiento de nuevas inserciones o actualizaciones de tuplas de esa página. Por defecto este valor es 100, por lo que todas la actualizaciones/inserciones irán a páginas nuevas y no se modificará la página actual. Para empezar un buen valor es 80, pero si la tabla tiene un ínidice muy alto de actualización tendrás que probar con valores por debajo de 50. Despues de hacer la modificación, no tendrá efecto hasta que hagas un Vacuum full (Ojo esta operación bloqueará la tabla, por lo que es mejor que no haya conexiones a la base de datos):
ALTER TABLE rankings.ranking SET ( fillfactor = 80 ); VACUUM FULL rankings.ranking;
Este factor también afecta a los índices que sean modificados con mucha frecuencia, la sintaxis para modificarlos es:
ALTER INDEX "tabla_idx" ON "esquema"."tabla" USING btree ("campo_a_indexar"); DROP INDEX.tabla_idx; CREATE INDEX "tabla_idx" ON "esquema"."tabla" USING btree ("campo_a_indexar") WITH (fillfactor = 80);
Referencias: http://www.postgresql.org/docs/9.0/static/sql-createtable.html

lunes, 6 de febrero de 2012

Update basado en select

Si un día necesitas guardar algunos campos de una tabla antes de que la tabla sea machacada por un proceso, puedes guardar los datos en una tabla auxiliar:
drop table if exists aux_coleccion; create table aux_coleccion as select * from coleccion;
Despues de que hayamos guardado una copia de la tabla podemos machacar su contenido. Ahora podemos recuperar el contenido original de los campos que queramos:
update coleccion set precio=a.precio,nivel=a.nivel,puntos=a.puntos,estado=a.estado, nombre=a.nombre,descripcion=a.descripcion, from aux_coleccion a where a.id=coleccion.id;

Extraer permisos de un usuario

Si tienes una base de datos con un usuario y quieres copiar sus permisos en otro lugar, puedes utilizar la siguiente consulta, el resultado puedes ejecutarlo en otro lugar:

select 'grant ' || privilege_type || ' on table ' || table_schema || '.' || table_name || ' to ' || grantee || ';' from information_schema.role_table_grants where grantee='';

martes, 19 de julio de 2011

Navegación Encriptada por tunel ssh

Si normalmente os conectáis por wifi, si utilizais puntos de acceso de aeropuertos, cafeterías, universidades, etc. estáis expuestos a que puedan espiar vuestro tráfico.

Para evitarlo instalaros una versión de Mozilla Firefox superior a la 5.0 que es gratis.

También necesitamos un programa que haga de tunel encriptado nuestra conexión, aunque se puede hacer con Putty y otros clientes ssh, para que todo sea más sencillo os recomiendo Tunnelier con licencia gratuita para uso personal.

Una vez instalados ambos programas el primer paso es en la pestaña Login, configurar la dirección de un servidor de vuestra confianza con un servicio ssh ejecutandose. Estableceis el campo Host, Port, Username y al conectaros os pedirá contraseña. Guardad el perfil "Save Profile".

Probad que funciona correctamente la conexión al servidor remoto que hará de proxy.

Una vez comprobado, en la pestaña Services, marcar la casilla SOCKS/HTTP Proxy Forwarding y elegid un puerto, por defecto el 1080.


Ahora tenemos establecido el tunel entre nuestra máquina (portatil con wifi) y la máquina remota (servidor) que hace proxy y por el cual saldremos a Internet.

Para navegar a través del tunel encriptado, arrancamos Firefox y vamos a Opciones->Avanzado. En la pestaña Red opción "Configurar como Firefox se conecta a Internet".


Y en la configuración de conexión, seleccionamos "Configuración manual del proxy", Servidor SOCKS 127.0.0.1 puerto 1080 y SOCKS5


Con esto habríamos finalizado. Para comprobar que estamos navegando desde la dirección del servidor remoto nos podemos conectar a alguna de las páginas que nos muestran la ip actual de la conexión. En dicha página tendría que mostrarnos la ip del servidor remoto en lugar de nuestra ip.

Para que la peticiones dns se envíen también a través del proxy, tecleamos en la barra de direcciones de Mozilla about:config, no saldrá un mensaje de advertencia que aceptamos y en el recuadro de filtro buscamos la entrada:  network.proxy.socks_remote_dns y con el botón derecho seleccionamos la opción "Modificar" y establecemos el valor true.



Con todos estos pasos habremos conseguido una navegación mucho más segura cuando no estemos en casa, y se lo pondremos más difícil a los que espían tráfico de Internet. Por contra la navegación será más lenta puesto que habrá que encriptar y desencriptar el tráfico, así que no lo uses para ver peliculas online o hacer grandes descargas.

Tutorial para tunelizar usando Putty:

tutorial putty

domingo, 17 de abril de 2011

Invalid argument supplied for foreach()

Si utilizamos foreach para iterar por los resultados de una consulta en un array, y dicho array está vacío, nos encontraremos con el error:

foreach ( $mi_array as $mi_elemento ) {
   echo $mi_elemento
}

ERROR: Invalid argument supplied for foreach()

Para evitarlo es tan sencillo como "castear" como array la variable sobre la que iteramos:

foreach ( (array)$mi_array as $mi_elemento ) {
   echo $mi_elemento
}

Con este sencillo truco ya no aparecerá más el error en el log.