Cliente VNC no refresca

Hoy me ha ocurrido un efecto curioso. Conectaba al portatil de mi casa por VNC y solo me mostraba el primer pantallazo inicial, no refrescaba nada …

Volví a casa y haciendo pruebas vi que me ocurre desde que active el compiz (solo lo utilizo por el scale). Entonces la solución aunque no es la mejor, es buena, desactivar el composite/compiz.

Por cierto si vais mal de subida, el visor de escritorio remoto va a Full Color y realmente se toma su tiempo cada frame. Instalar “xvnc4viewer”, y simplemente con “vncviewer xx.xx.xx.xx” conectamos en 8 bits, funciona muy fluido, y para administración es más que suficiente. No obstante si quereis 24 bits (Full Color) añadir el parametro “-FullColor”.

Pasar secuencia de imagenes a video

En concreto lo estoy utilizando para las animaciones generadas por blender en archivos png:

ffmpeg -y -f image2 -i %4d.png -b 10800k render.avi && gnome-open render.avi

Obtener información de Binarios y librerías compartidas (nm/objdump)

nm – Listado de funciones de un objeto

Si queremos obtener un listado de funciones que tiene un código objeto o una librería compartida se utiliza “nm”, que lo descubrí de casualidad.
Este comando lista todos los símbolos que contiene el código objeto o la librería dinámica.
Por ejemplo vamos a crear una librería dinámica con solo una función llamada “factorial”.
Este es el código:

#include <stdio.h>

int factorial(int n)
{
    return n == 0 ? 1 : n * factorial(n-1);
}

Lo compilo así:

gcc factorial.c -o libfactorial.so -shared -fPIC

Ahora analizamos la librería con el comando “nm”:

nm -D libfactorial.so

Obtenemos esto:

         w _Jv_RegisterClasses
00002010 A __bss_start
         w __cxa_finalize
         w __gmon_start__
00002010 A _edata
00002018 A _end
000004c8 T _fini
00000314 T _init
0000044c T factorial

Vemos que nuestro función en código maquina esta en el offset del archivo 0x44c.
Si leemos el man, obtenemos el significado de los símbolos:

Symbol Type Description
A The symbol’s value is absolute, and will not be changed by further linking.
B Un-initialized data section
D Initialized data section
T Normal code section
U Undefined symbol used but not defined. Dependency on another library.
W Doubly defined symbol. If found, allow definition in another library to resolve dependency.

Las funciones T son las linkables, exceptuando “_fini” y “_init” que son funciones comunes a cualquier librería dinámica. (Esto es una suposición mía, aunque muy lógica por otra parte).

Un ejemplo de código de linkado típico:

#include <stdio.h>

int factorial(int n);

int main()
{
 printf("5! = %d\n", factorial(5));
 return 0;
}

Se compila así:

gcc link.c -o link -L. -lfactorial

Y como la librería no esta en una ruta estándar, se ejecutaría así:

export LD_LIBRARY_PATH="." && ./link
5! = 120

Vamos a probar un código que linke dinamicamente, pero en lugar de el fácil “-lname”, lo haré con el dload, que nos sirve de ejercicio para entender como funcionan las librerías dinámicas. El código es el siguiente:

#include <stdio.h> // para fprintf
#include <stdlib.h> // para exit
#include <dlfcn.h>  // para dlopen, dlsym, dlerror, dlclose

int factorial(int n);

int main(int argc, char **argv)
{
 void *lib_handle;
 int (*factorial)(int);
 int x;
 char *error;

 lib_handle = dlopen("libfactorial.so", RTLD_LAZY);
 if (!lib_handle)
 {
 fprintf(stderr, "%s\n", dlerror());
 exit(1);
 }

 factorial = dlsym(lib_handle, "factorial");
 if ((error = dlerror()) != NULL)
 {
 fprintf(stderr, "%s\n", error);
 exit(1);
 }

 x = factorial(5);
 printf("5! = %d\n",x);

 dlclose(lib_handle);
 return 0;
}

El código hay que mirarlo detenidamente, especialmente el puntero a función, pero por lo demás, es sencillo y se autocomenta.
Se compila así:

gcc -rdynamic -o dlopen dlopen.c -ldl

Probamos el ejecutable:

export LD_LIBRARY_PATH="." && ./dlopen
5! = 120

objdump – Desensamblando de binarios

Con este comando podemos obtener el código en ensamblador a partir del código maquina. El comando es el siguiente:

objdump -d libfactorial.so

Si además lo compilamos introduciendo los símbolos de debugeo (parámetro -g), podemos ver el código en ensamblador combinado con el código fuente. Se añadiría el parametro -S:

objdump -d -S libfactorial.so

Ya sabíamos que nuestra función “factorial” estaba en el offset 0x44c, por tanto lo busco en la salida de objdump y pasteo la salida (en este caso, con símbolos de debugeo):

0000044c <factorial>:
#include <stdio.h>

int factorial(int n)
{
 44c:	55                   	push   %ebp
 44d:	89 e5                	mov    %esp,%ebp
 44f:	53                   	push   %ebx
 450:	83 ec 14             	sub    $0x14,%esp
 453:	e8 ef ff ff ff       	call   447 <__i686.get_pc_thunk.bx>
 458:	81 c3 9c 1b 00 00    	add    $0x1b9c,%ebx
    return n == 0 ? 1 : n * factorial(n-1);
 45e:	83 7d 08 00          	cmpl   $0x0,0x8(%ebp)
 462:	74 14                	je     478 <factorial+0x2c>
 464:	8b 45 08             	mov    0x8(%ebp),%eax
 467:	83 e8 01             	sub    $0x1,%eax
 46a:	89 04 24             	mov    %eax,(%esp)
 46d:	e8 f2 fe ff ff       	call   364 <factorial@plt>
 472:	0f af 45 08          	imul   0x8(%ebp),%eax
 476:	eb 05                	jmp    47d <factorial+0x31>
 478:	b8 01 00 00 00       	mov    $0x1,%eax
}
 47d:	83 c4 14             	add    $0x14,%esp
 480:	5b                   	pop    %ebx
 481:	5d                   	pop    %ebp
 482:	c3                   	ret

Con el poco ensamblador que me enseñan en la uni, puedo deducir los siguientes offsets:

45e: Es la comparación de n con 0
462: Si la igualdad anterior se cumple, salta a la línea 44c + 2c = 478
478: Es el interior del IF, iguala el parámetro que viene de la pila con 1. Definiendo 0! = 1
464: Se ejecutaría si la comparación de 45e no se da. Se asigna la vuelta de la recursión
467: Se resta 1 a n
46a: Se prepara e parámetro n-1 en eax, previo a una llamada.
46d: Se hace la llamada recursiva a si mismo.
472: Se multiplica por 8 la vuelta de la recursión.
476: Estamos en el else, por tanto esta jmp se salta el interior del if. 44c + 31 = 47d
47d: De aquí en adelante prepara el return, deja la pila como estaba antes de la llamada y se restaura el IP.

Vamos a hacer algo fácil “crackear”(si se le puede llamar crackeo a esto xD) el programa para cambiar la asignación de:
0!=1 por 0!=4

Por tanto el 5! en lugar de dar 120 va dar 4 veces más, 480.

Para hello abrimos con algún editor de hexadecimal:

ghex2 libfactorial.so

Vamos al OFFSET 479 (478 + 1) y cambiamos el 01 por 04.

Hacemos la prueba de fuego:

export LD_LIBRARY_PATH="." && ./dlopen

Y efectivamente:

5! = 480

OuYeah!


Bueno con esto acabo, este articulo es sobre todo didáctico por lo que si alguno puede completar más el articulo con sus comentarios, se le agradeceremos todos.

Fuentes:
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
http://unixhelp.ed.ac.uk/CGI/man-cgi?nm
http://node1.yo-linux.com/cgi-bin/man2html?cgi_command=ld
http://node1.yo-linux.com/cgi-bin/man2html?cgi_command=ldconfig

Espacio en disco ocupado por un directorio

Un comando muy útil es du. Sirve para calcular el espacio que ocupa un disco un diretorio. Para ello calcula todo lo que tiene dentro del directorio, (recursivamente para el caso de los directorios). El uso simple es pasando el directorio como primer y único parámetro. Por ejemplo:

makiolo@blog:~$ du /home/makiolo/videos/The\ Big\ bang\ Theory/temp2
3048960    /home/makiolo/videos/The Big bang Theory/temp2

Para poner las unidades comprensibles añadimos el parametro -h:

makiolo@blog:~$ du -h /home/makiolo/videos/The\ Big\ bang\ Theory/temp2
3,0G    /home/makiolo/videos/The Big bang Theory/temp2

Mostrando solo los GB libres:

makiolo@blog:~$ du -h /home/makiolo/videos/The\ Big\ bang\ Theory/temp2 | tail -n1 | cut -f1
3,0G

Jugando más con las tuberías:

makiolo@blog:~$ du -h /home/makiolo/videos/The\ Big\ bang\ Theory/temp2 | tail -n1 | awk ‘{print “El directorio “$2” ocupa “$1}’
El directorio /home/makiolo/videos/The Big bang Theory/temp2 ocupa 3,0G

Me hago un script final que es el que usaré, gedit espacioLibre.sh y pasteamos:

#!/bin/sh

if [ $# = 0 ]; then
DIRECTORIO=`pwd`
else
DIRECTORIO=$1
fi;

du -h $DIRECTORIO | tail -n 1 | awk ‘{print “El directorio ” $2 ” ocupa ” $1}’

Procesar y borrar elementos de una lista en O(n)

Voy a explicar que elección de diseño he elegido en mi juego para la gestión de la lista de entidades.

En todo videojuego hay una lista de entidades que necesitan hacer en su máximo nivel de abstracción 2 cosas:

  1. Procesar todos los elementos. Esto es que cada elemente tiene un metodo, tipicamente refrescar() o update() que abstrae toda la secuencia de proceso que tiene que hacer.
  2. Borrar los elementos que han muerto o a terminado su ciclo de vida.

Poder borrar el elemento de lista me dificulta la implementación, asi que he optado por que el nodo tenga un método en el que solicita la liberación. Cuando llege su turno será eliminado. Esto tambien lo hago así por que physX exige borrar sus entidades en puntos muy concretos de muy código. Cuando no lo hacía así cada 5 min de juego tenía un “segmentation fault” que me crasheaba el juego.

Hay infinitos ejemplos por los que hay que borrar una entidad. Un bot que ha cumplido su objetivo.
Por ejemplo, suponer que una entidad (un proyectil en concreto) que se mueve, esto lo hace durante el refresco, se sale del mapa, cuando se salga queremos borrarlo. Por tanto en pseucódigo será.

if(estoyDentroDeLimites())
	avanzar();
else
	pedirLiberacion();

Cuando a otro nivel llamamos al proceso de las entidades, el proceso debería quedar algo así.

void procesarSeleccionados ( list<Nodo*> * lista )
{
	Nodo * aux = NULL;
	list::iterator it = lista->begin();
	while(it != lista->end())
	{
		aux = *it;
		if(aux->getPedirLiberacion() && aux->liberar())
		{
			delete aux;
			it = lista->erase(it);
		}
		else
		{
			aux->refrescar();
			i++;
		}
	}
}

Estoy utilizando una lista del STD.  Comentar:

  • El if() podríamos sustituirlo por la condición de borrado. En este ejemplo significa:
    • si quieres que te borren. getPedirLiberacion()
    • Y te has borrado correctamente. && aux->liberar()
  • La función erase() borra a lo que apunta el iterador y automaticamente te avanza el iterador, teniendo siempre un iterador válido. Por eso el i++ esta en el else, si lo pusioramos fuera nos saltariamos un elemento de la lista cada vez que borremos.

Compactar BDD sqlite de Firefox 3

Bueno por fin he acabado los examenes y tengo bastantes posts acumulados(en mi cabeza) y que iré publicando cuando tenga tiempo.

Lei en Barrapunto que compactando la BDD de sqlite de Firefox 3 teóricamente debería acelerar las consultas, inserciones, borrados y todas las operaciones que conlleva una base de datos. Si esto es cierto, deberíamos ejecutar este script de vez en cuando. Hablo de teóricamente por que no he hecho benchmarkings pero tener más que fe que esto acelera un cierto tipo de consultas, y si no al menos reducimos el espacio en disco. Creaamos con gedit compactarFirefox.sh y pasteamos:

#!/bin/sh

for f in ~/.mozilla/firefox/*/*.sqlite; do sqlite3 $f 'VACUUM;'; done

Realmente espero que en  futuras versiones de firefox, el mismo se automantenga cada cierto tiempo, ya que estas cosas a las que ya hace años nos mal acostumbro M*cro**ft con al access. Y pienso que el aumantenimiento de las base de datos incrustadas debería ser un proceso totalmente transparente al usuario.

sed – stream editor for filtering and transforming text

Este comando junto con awk(que uso más todavía que este) es obligatorio que aprendais a usarlos poco a poco. En concreto sed permite cosas como borrar líneas, registros o sustituir cadenas de caracteres dentro de las líneas. Típicamente se usa en tuberías, aunque es un programa totalemente autónomo.

* Para borrar una línea hacemos lo siguiente:

sed ‘nº_de_línead’ fichero

* Podemos indicar un número de línea concreto. Por ejemplo:

sed ‘1d’ fichero

* Podemos indicar un intervalo de líneas a borrar. Por ejemplo:

sed ‘3,5d’ fichero

* También podemos indicar que queremos borrar desde una determinada línea en adelante:

sed ‘3,$d’ fichero

* Otro ejemplo útil es borrar las líneas en blanco de un fichero:

sed ‘/^$/d’ fichero

A la hora de borrar, también podemos especificar una cadena, de tal forma que el comando borrará todas las líneas que contengan esa cadena. Ejemplo:

cat fichero | sed ‘/^[ ]*$/d’ > ficherodestino

Lo anterior borrará todas las líneas en blanco de fichero.

Otro de los usos más interesantes de sed es sustituir cadenas. Podemos sustituir una cadena por otra de la siguiente manera:

sed ‘s/cadena1/cadena2/’ fichero

Al ejecutar el comando anterior, se sustituye la primera cadena que encuentra por la segunda. Pero, si lo que queremos es sustituir todas las cadenas que encuentre, en cada una de las líneas, añadimos el parámetro g :

sed ‘s/cadena1/cadena2/g’ fichero

De aqui podemos encontrar una aplicación particular que me ha sido útil. Es un poco confuso pero no es más que la sustitución de todos los espacios por “\ “(contrabarra+espacio). Es es muy util en bash cuando a veces pasas por parametro ficheros y por algún motivo no sirve mterlo entre comillas.

sed ‘s/\ /\\ /g’

Por otra parte, también podemos hacer que sustituya la cadena1 por la cadena2 en un número de línea concreto:

sed ‘5 s/USUARIO/usuario/g’ fichero

Con cadenas de texto normales la cosa es sencilla, pero al que más y al que menos le resulta complicado cuando lo que hay que sustituir son caracteres especiales como el tabulador: \t o el caracter de nueva línea: \n. Pero veamos como tampoco es complicado: Imaginemos que tenemos un fichero con campos en los que el separador es el tabulador y queremos sustuir este caracter separador por otro caracter separador, como por ejemplo el punto y coma (;). Lo haremos de la siguiente manera:

sed ‘s/\t/;/g’ fichero

Fuente:
http://enavas.blogspot.com/2008/03/el-shell-de-linux-comando-sed.html

Convertir PDF a Texto plano en Linux

Convertir texto en pdf es muy facil con el uso de impresoras de PDF o utilizando openoffice por ejemplo. Para la operación inversa tenemos este comando:

  • pdftotext -layout servidor.pdf servidor.c

-layout : Es imprescindible ponerlo, ya que con él guarda la maquetación del pdf original, si no lo poneis se comera todos los saltos de linea, tabuladores y seguramente no sea lo que buscais.
servidor.pdf : Archivo pdf = origen
servidor.c : Archivo texto plano o txt = destino

Aqui pongo este tip, que me ha sido muy util para una práctica que me han dado en pdf, y por copy paste me salía mal. La conversión la hace perfecta excepo en los saltos de página que mete algún caracter utf extraño. Corregirlo no es más que buscar y reemplazar.

Sockets : Timeout en Send() y Recv()

Bueno he encontrado una forma más fácil de hacer un timeout en los socket(anteriormente usaba la técnica de las alarmas, en total hay 3 técnicas para evitar el cuelgue indefinido), para evitar que se queden colgados en los send() y en los recv().

Tras crear el socket ponemos(para un timeout de 15 segundos por ejemplo):

//Si es TCP
if ((descriptor=socket(AF_INET, SOCK_STREAM, 0))==-1) throw Excepcion(“Error al crear el socket TCP”);
//Si es UDP
//if ((descriptor=socket(AF_INET, SOCK_DGRAM, 0))==-1) throw Excepcion(“Error al crear el socket UDP”);

//Definimos el timeout
struct timeval tv;
tv.tv_sec = 15;
tv.tv_usec = 0;
setsockopt(descriptor, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
setsockopt(descriptor, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv));

Poner Firefox 3.0.3 en español

Me he encontrado unas cuantas instalaciones de ubuntu que tienen el firefox en ingles, a pesar que he probado a instalar/desinstalar paquetes de lenguaje(como mozilla-firefox-locale-es-es o language-support-es) y buscar otras soluciones, realmente no iba encontrado una buena solución hasta ahora.

El motivo pienso que es algún bug de firefox en el repositorio de Ubuntu de backported. Ya que todas las instalaciones que he visto este comportamiento tenían activado dicho repositorio.

Buscando en google he ecnontrado la única solución que me ha funcianado, y es simplemente instalar una extensión de firefox que pone el firefox en español.

Descargar extensión para Firefox 3.0.3 en Español

Fuente: http://www.ubuntu-es.org/index.php?q=node/101099

Recuperar / Restaurar GRUB pisado por “otro” SO

Cada disco duro tiene un espacio reservado para el MBR. El MBR es el primer mini-programa que arranca la BIOS y objetivo de virus en la época de DOS. Cuando instalamos sistemas operativos egoístas como Windows nos pisa nuestro MBR y pone su gestor de arranque que solo sirve para arrancar particiones FAT32 y NTFS.

  1. Nos metemos en la BIOS y preparamos el ordena para arrancar por LIVE y ya que estamos aqui nos aseguramos en el caso de tener más de 1 disco duro, poner el disco duro que va arrancar linux por delante en la secuencia de arranque.
  2. Arrancamos con un live de ubuntu 8.04 (por ejemplo), ya que aún faltan 10 días para la 8.10.
  3. Montamos la partición que tiene el grub (es decir, la partición que tiene la carpeta /boot). Montamos por interfaz gráfica, por el hecho de entrar a visualizar datos, se automonta. Es importante montar.
  4. Necesitamos saber 2 variables:
    • X = el número de nuestro disco duro
    • Y = el número de partición (la que tiene el grub)
  5. Podemos ejecutar el gparted ( sudo gparted ) para ver en que posición de la lista pone el disco duro (X) y en que posición esta la partición. También nos podemos apoyar de df, analizamos el nombre lógico que asigna Linux a la partición. Por ejemplo /dev/sda2 . La letra “a” indica el primer disco duro y el 2 que es la segunda partición.
  6. Teniendo nuestro X y nuestro Y le restamos 1 a ambos, debido a que la numeración de GRUB empieza por 0. Algunos ejemplos de como quedaría la cosa:
    • X=0,Y=0: es la primera partición del primer disco duro, al igual que hda1 o sda1
    • X=0,Y=1: es la segunda partición del primer disco duro, al igual que hda2 o sda2
    • X=1,Y=2: es la tercera partición del segundo disco duro, al igual que hdb3 o sdb3
  7. Sabiendo eso el resto es fácil, abrimos un terminal y escribimos.
    • sudo grub para entrar en el intérprete del GRUB
    • En los 2 siguientes comandos os recuerdo que hay tener en cuenta el punto 6.
    • Indicamos en que partición esta ubuntu escribiendo (importante el espacio despúes del root): root (hdX,Y)
    • Finalmente instalamos GRUB en el MBR del disco X, para ello escribimos (importante el espacio despúes del setup) : setup (hdX)
    • Salimos de grub escribiendo : quit y reiniciamos : sudo reboot

Fuentes:
http://www.guia-ubuntu.org/index.php?title=Recuperar_GRUB

Freeze en linux

Aunque es improbable que ocurra un cuelgue en Linux puede ocurrir por varios motivos.
Los programas pueden ejecutarse en el espacio de usuario(con restricción de instrucciones) o en espacio del sistema (acceso total a todo el conjunto de instrucciones).
A diferencia de windows(un cuelgue de calculadora te podría matar el sistema) un cuelgue es el espacio de usuario no cuelga el sistema aunque puede hacerte estragos, especialmente si consume el 100% de la CPU, a pesar de estar en el espacio de usuario.
Cuando un proceso en el espacio de usuario se comporta erráticamente y es proceso “manifestado” en una ventana usaremos “forzar el cierre” o simplemente cerramos y GNOME debería proponer un forzar cierre. Si esto no nos sirve ya sea por que no cierra o es un proceso oculto, nos iremos a un terminal con la combinación CTRL + ALT + F1, y desde hay con los comandos: ps aux, kill -9, killall o htop solucionamos el problema, también es útil saber que estando en GNOME con la conbinación CTRL + ALT + BACKSPACE mata e inicia GNOME.

Bueno hasta aqui, no creo a ver dicho nada nuevo para la mayoría. En linux los únicos programas que se ejecutan con todas las instrucciones de ensamblador disponibles son: El kernel de linux y sus modulos adjuntos a este. Sólo estos dos podrían generar un freeze , incluidos el módulo de por ejemplo el virtualbox. Por tanto si hemos recibido algún freeze total(solo soluciona el reinicio) debemos revisar nuevos modulos que hayamos instalado, especialmente los modulos de propietarios que son los que más bugs suelen traer debido a que es dificil integrar una caja negra en un sistema que destaca por su transparencia.

No obstante si alguna vez nos pasara un freeze total, deberiamos realizar lo siguiente en lugar de reiniciar:

Pulsamos las teclas ALT y la de “Imprimir pantalla”, y sin soltar el ALT, el Imprimir pantalla si puedes soltarlo, vamos escribiendo letra a letra REISUB (os podeis formar una memotecnia fácil con REI y SUB, prefiero no decir la mía : D). Con esto logramos reiniciar nuestro sistema de manera segura ya que según vamos pulsando las teclas vamos mandando una orden a nuestro sistema, tales como:

R.- Devuelve el control al teclado (Raw)
E.- Manda todos los procesos al term, es decir, los hace terminar (End)
I.– Manda los procesos al Kill, es decir, los mata.
S.- Sincroniza el disco duro (Sync)
U.- Desmonta todos los sistemas de ficheros (Unmount)
B.- Por último, reinicia el ordenador. (reBoot)

Otra forma que en lugar de reiniciar, lo deja apagado sería en lugar de REISUB, el combo mágico sería REISUO

Fuentes :
http://en.wikipedia.org/wiki/Magic_SysRq_key
http://www.esdebian.org/foro/25034/reisub-yo-que-quiero-apagar

Amarok : Teclas multimedia sobre GNOME

Me han convencido a probar amarok en sustitución a rhythmbox una temporada, la verdad que es muy completo, tiene un mejor soporte de ipod, tiene buen soporte de podcast, radios shoutcast … una maravilla el único problema es que las teclas multimedia no me funcionan en gnome. Buscando plugins para amarok he encontrado este plugin para Amarok que soluciona el problema.

  • Nos bajamos el archivo y lo almacenamos en nuestro pc.
  • En el amarok. Herramientas -> Gestor de scripts -> Instalar el script y seleccionamos el archivo que acabamos de bajar.
  • Si no os funciona comprobar que teneis los paquetes (python-dbus y libdbus-glib)
  • Por último para configurar las teclas que queremos usar solo hay que ir a “Sistema–>Preferencias–>Atajos de teclado” y listo

Fuente : http://www.otrobloggeek.com/blog/2008/02/howto-teclas-multimedia-en-amarok-usando-ubuntu-con-gnome/

Expresiones regulares útiles

En este post ire poniendo algunas expresiones regulares que frecuentemente uso y siempre pierdo el “snippets“. Estos ejemplos estan escritos en PHP, pero son altamente portables estudiando simplemente que función en nuestro lenguaje analiza expresiones regulares. Algunas expresiones regulares no son muy buenas, asi que poner en los comentarios más expresiones regulares y os ire añadiendo.

//Nombre de usuario
//Acepta entre 4 y 28 caracteres de largo, alpha-numérico y acepta guiones_bajos.

$string = "userNaME4234432_";
if (preg_match('/^[a-z\d_]{4,28}$/i', $string))
{
    echo "el patrón coincide con = ".$string."<br />";
}

//Direcciones de email

$string = "first.last@domain.co.uk";
if (preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/',$string))
{
    echo "el patrón coincide con = ".$string."<br />";
}

//Código postal

$string = "55324-4324";
if (preg_match('/^[0-9]{5,5}([- ]?[0-9]{4,4})?$/', $string))
{
    echo "el patrón coincide con = ".$string."<br />";
}

//Dirección IP

$string = "255.255.255.0";
if (preg_match('/^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:[.](?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$/',$string))
{
    echo "el patrón coincide con = ".$string."<br />";
}

//Color hexadecimal

$string = "#666666";
if (preg_match('/^#(?:(?:[a-f\d]{3}){1,2})$/i', $string))
{
    echo "el patrón coincide con = ".$string."<br />";
}

//Fechas

$string = "10/15/2007";
if (preg_match('/^\d{1,2}\/\d{1,2}\/\d{4}$/', $string))
{
    echo "el patrón coincide con = ".$string."<br />";
}

Actualizado(jueves, 11 de diciembre de 2008):

Extraido de Mis Algoritmos:

Bueno, para mi y para todos los programadores (con mucho cariño jeje), hago entrega de mi repositorio de Expresiones Regulares :D ,… para aquellos momentos en los que desesperadamente necesito validar o emparejar una cadena de caracteres y no recuerdo como diablos se hace!… ¡Yuju!, no mas sufrimientos jeje

Link, repositorio de expresiones regulares : http://www.mis-algoritmos.com/ejemplos/regex.php

Fuente : http://www.blogandia.com/uncategorized/8-expresiones-regulares/

netstat : Listado de conexiones

Netstat (network statistics) es una herramienta de línea de comandos que muestra un listado de las conexiones activas de un ordenador, tanto entrantes como salientes. Existen versiones de este comando en varios sistemas, como Unix/Linux, Mac OS X, Windows y BeOS.

Todos conocereis netstat, es casi la unica herramienta para ver la actividad de nuestra red y otras herramientas existentes de más alto nivel se suelen basar en netstat para sacar la información.

Con este post pretendo reflejar el comando netstat que normalmente uso y una breve explicación de cada parametro:

sudo netstat -punta
sudo netstat -putan
sudo netstat -patun
sudo netstat -pantu
sudo netstat -tunpa

Elegir la combinación memotécnica que más os guste, todas son equivalentes, pero la única que tiene sentido es la primera(por si no es evidente xD):

p: Muestra el PID y el nombre del proceso (solo si pones sudo)
u: Muestra sockets UDP
n: Mostrar númericamente, más rápido por que no tiene que resolver las ips y puertos
t: Muestra sockets TCP
a: Muestra todos los sockets(TCP y UDP) en cualquier de sus estados (conectado , en escucha …)

Nota final: La verdad es que windows es más fácil de recordar con su netstat -ano . oaejaejo 0_o

Fuentes: man y Wikipedia