miércoles, 2 de septiembre de 2009

Análisis de textos,USC,examenes...

"Me comenta mi hermana que tiene una asignatura de Linux, una optativa, la ha suspendido y me comentaba si le podrías echar una mano". Así comenzaba una de las mayores sorpresas de este año. La respuesta estaba cantada, "Dile que me llame, tomamos algo y lo hablamos...". Lo dicho, quedamos y me comenta Rosa "Teño unha asignatura de Linux, facemos cousas na consola e non teño nin idea. O exame será oral a comezos de setembro, mira esta páxina web http://gramatica.usc.es/~gamallo/ , que é donde tes a información sobre a Análise Computadorizada de Textos Hispánicos". Mi sopresa es mayúscula cuando reviso el contenido del curso. El docente les ha enseñado Perl, para extraer información de cualquier texto. La frustración de Rosa : ponerse a programar,;y claro, si estudias Hispánicas, comprendo la frustración es más que comprensible.
El examen oral está disponible aquí, y según me comenta, se deben explicar los scripts el día del examen.
¿Cómo analiza un texto? Lo primero que hace es "tokenizar" el texto, es decir, escribir en cada línea una palabra.El docente les ha dejado un script, llamado tokenizer.perl, que realiza esta tarea. Ejemplo con el fichero texto.txt que contiene "Ni nombre Alberto" tendríamos un fichero de salida del tipo:
[alberto@pilarrubio]cat texto.txt|./tokenizer.perl > texto.tokenizado && cat texto.tokenizado.

Mi
nombre
es
Alberto

El contenido del fichero tokenizer.perl es el siguiente:

#!/usr/bin/perl -w


#Tokenizer:
#lê um ficheiro texto linha a linha
#Separa os símbolos especiais
#quebra as linhas cada vez que encontra um espaço em branco
#escreve um tokem ou símbolo por linha

$Separador = "[\.\,\;\:\«\»\&\%\+\=\$\(\)\<\>\!\¡\?\¿\\[\\]]" ;

while ($line=) {
chop($line);

$line =~ s/($Separador)/ $1 /g;
#$line =~ s/\s+/ /g;


@ListaDeTokens = split(" ", $line);
foreach $token (@ListaDeTokens) {

print "$token\n";

}
}


print STDERR "Fim do tokenizer\n";



El problema viene cuando nos pide que en un texto se distinga entre nombres propios, verbos y demás. Para ello, después de tener el texto "tokenizado", debemos "Taggearlo" con una aplicación de análisis morfológio llamada FreeLing, desarrollada por el Centre de Tecnologies i Aplicacions del Llenguatge i la Parla (TALP). He intentado instalarlo en Ubuntu 9.04 y en Debian 5.0 Testing, pero lamentablemente el link de descarga no funcionaban. Decidí ponerme en contacto con la gente del TALP, y tengo que decir, que, aunque no se ha resuelto aún el problema, la respuesta ha sido muy rápida. Así da gusto. Continuamos. Al final, gracias a Dorfun encontré FreeLing empaquetado en .deb en esta URL.
Taggeamos el texto:
[alberto@pilarrubio] cat texto.tokenizado|freeling-es > texto.tagged
cuyo resultado es un texto de nombre texto.tagged con el siguiente contenido.

PRO Mi
NOM nombre
V es
NOM Alberto


A continuación ya tenemos el texto tagged y podemos filtrar por el criterio que nos pida el docente, en este caso, o que el usuario decida.El enunciado del ejericio 4 es el siguiente:

4.-Cuenta y escribe de mayor a menor frecuencia todos los nombres propios.


El comando, después de tener taggeado el texto sería algo así:
[alberto@pilarrubio] cat texto.tagged |.04.perl
Donde 04.perl :

#!/usr/bin/perl
$token="";
while ($linha = ) {
chomp $linha;
if ($linha ne "") {
($token,$etiqueta) = split (" ", $linha) ;



if ($etiqueta =~ m/^NOM/ ) {
$contarNomes++;
$contar{$token}++ ;
}

}


}

if (defined $contarNomes) {
print "Ocorrencias de nomes: $contarNomes\n";
}
foreach $tokenDiff (sort {$contar{$b} <=>
$contar{$a} }
keys %contar ) {

print "$tokenDiff\t$contar{$tokenDiff}\n";
}



Si tenéis curiosidad por el tema , os remito a la web de Pablo Gamallo, el docente del curso. La casualidad me lleva a leer vía RSS una noticia que anuncia un curso de verano de la USC : "O Software Libre e a Lingüistica".
Para finalizar el post, dar mi enhorabuena al docente, que , en mi modesta opinión, se ha currado mucho el temario del curso, no tanto por la calidad de los scripts, que sí la tiene, sino por la aplicación de un lenguaje de programación, Perl, en este caso, al análisis lingüístico de textos. En segundo lugar agradecer a Rosa la oportunidad de poder ayudarla a, por lo menos, intentar aprobar la asignatura. Ahora mismo la deben de estar examinando. No suelo desear suerte a nadie en ningún examen, sólo justicia, y si se hace justicia debe aprobar: el esfuerzo (casi) siempre tiene recompensa.

Cambios en el blog

En la vida hay que ser justos, por eso he decidido quitar el logo de GNU. No sería justo "alardear" de gnuismo y demás, si uso MacOSX,FreeBSD,Debian GNU/Linux y Ubuntu.Por eso ha cambiado el Ñu por el clásico Live Free or Die de Unix. Esto no cambia mi modo de pensar ni de actuar, simplemente hablamos de ser justos.

miércoles, 19 de agosto de 2009

Nmap 5.0, actualízate si puedes.

No es la primera vez en este blog que hablo sobre Nmap. En la oficina uso Ubuntu 9.04, he tenido que aparcar Debian Testing/Unstable por haber metido la pata mezclando repositorios y compilando y recompilando kernels. El caso es que necesitaba usar nmap para hacer "unas cosillas". Todo correcto; ya conocía este software desde hace muchos años. No sé por qué, me daba la impresión de que el tiempo de espera para los escaneos era demasiado. Comprobemos la versión instalada.

root@alberto:/# /usr/bin/nmap -V

Nmap version 4.76 ( http://nmap.org )

Ahora toca visitar la web de nmap[ http://insecure.org/nmap ] , para comprobar cual es la última versión. Efectivamente, han liberado la versión 5.0, que como es de esperar se puede descargar desde la propia web. Llegados a este punto, la pregunta es: ¿Debo instalar la versión 5.0? ¿Qué mejoras existen respecto a la versión 4.x? Nmap está muy bien documentado, y podéis ver más información acerca de la versión 5.0 aquí. Todo esto está muy bien, pero en la práctica...
He realizado unas pruebas muy sencillas para comprobar en persona, las diferencias en la versión 5.0 y 4.76-0ubuntu4, que básicamente han consistido en:
  • Descargar fuentes y compilar nmap 5.0
  • Escaneo gateway(nmap sin parámetros)
  • Escaneo Sistema Operativo del gateway (nmap -O)
  • Escaneo Sistema Operativo y version del software del gateway (nmap -A -T4)
Compilando nmap.
Muy sencillo. Los pasos son los siguientes:
  • Descargamos fuentes:

[root@alberto] wget http://nmap.org/dist/nmap-5.00.tar.bz2

  • Descomprimimos y desempaquetamos

[root@alberto] tar -xjpf nmap-5.00.tar.bz2

  • Compilamos e instalamos

[root@localhost]./configure && make && make install


Llegados a este punto, tenemos el binario de la version 5.00 en /usr/local/bin/nmap y el de la version 4.76 en /usr/bin/nmap.

root@alberto:/# /usr/bin/nmap -V

Nmap version 4.76 ( http://nmap.org )

root@alberto:/home/alberto# /usr/local/bin/nmap -V

Nmap version 5.00 ( http://nmap.org )


Ya podemos comenzar...

Escaneo gateway(nmap sin parámetros)

Resultados con la versión 4.76:

root@alberto:/# time /usr/bin/nmap -e eth0 100.100.100.100

Starting Nmap 4.76 ( http://nmap.org ) at 2009-08-19 13:37 CEST
Interesting ports on 100.100.100.100:
Not shown: 998 filtered ports
PORT STATE SERVICE
113/tcp closed auth
541/tcp open uucp-rlogin
MAC Address: 00:09:0F:37:F0:C6 (Fortinet)

Nmap done: 1 IP address (1 host up) scanned in 4.18 seconds

real 0m4.194s
user 0m0.236s
sys 0m0.036s

Resultados con la versión 5.00:
root@alberto:/# time nmap -e eth0 100.100.100.100

Starting Nmap 5.00 ( http://nmap.org ) at 2009-08-19 13:36 CEST
Interesting ports on 100.100.100.100:
Not shown: 998 filtered ports
PORT STATE SERVICE
113/tcp closed auth
541/tcp open uucp-rlogin
MAC Address: 00:09:0F:37:F0:C6 (Fortinet)

Nmap done: 1 IP address (1 host up) scanned in 4.95 seconds

real 0m4.956s
user 0m0.224s
sys 0m0.032s

Llama la atención que la versión 5.00 ha tardado 0,77 segundos más que la 4.76. En principio la 4.76 se anotaría el primer punto. Personalmente creo que no, ya lo explicaré más adelante.Vemos que ha identificado bien el modelo del gateway y poco más podemos extraer(si buscarle los tres pies al gato, claro).

Escaneo Sistema Operativo del gateway (nmap -O)
Resultados con la versión 4.76:

root@alberto:/# time /usr/bin/nmap -e eth0 -O 100.100.100.100

Starting Nmap 4.76 ( http://nmap.org ) at 2009-08-19 13:38 CEST
Insufficient responses for TCP sequencing (2), OS detection may be less accurate
Interesting ports on 100.100.100.100:
Not shown: 998 filtered ports
PORT STATE SERVICE
113/tcp closed auth
541/tcp open uucp-rlogin
MAC Address: 00:09:0F:37:F0:C6 (Fortinet)
Aggressive OS guesses: Check Point ZoneAlarm Z100G firewall (88%), Actiontec GT701 DSL modem (87%), HP Brocade 4100 switch; or Actiontec MI-424-WR, Linksys WRVS4400N, or Netgear WNR834B wireless broadband router (87%), F5 BIG-IP Local Traffic Manager load balancer (87%), HP 4200 PSA (Print Server Appliance) model J4117A (87%), DD-WRT v23 (Linux 2.4.34) (87%), MontaVista Linux 2.4.17 (87%), Telkom Mega 100 WR DSL modem (Linux 2.4.17_mvl21-malta-mips_fp_le) (87%), FreeBSD 6.2-RELEASE (87%), OpenBSD 4.3 (87%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 1 hop

OS detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 8.96 seconds

real 0m8.979s
user 0m0.388s
sys 0m0.064s


Resultados con la versión 5.00

root@alberto:/# time /usr/local/bin/nmap -e eth0 -O 100.100.100.100

Starting Nmap 5.00 ( http://nmap.org ) at 2009-08-19 13:38 CEST
Interesting ports on 100.100.100.100:
Not shown: 998 filtered ports
PORT STATE SERVICE
113/tcp closed auth
541/tcp open uucp-rlogin
MAC Address: 00:09:0F:37:F0:C6 (Fortinet)
Device type: firewall
Running: Fortinet embedded
OS details: Fortinet FortiGate-100A firewall
Network Distance: 1 hop

OS detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.30 seconds

real 0m6.319s
user 0m0.432s
sys 0m0.104s


Primer punto para la versión 5.00. En realidad, a mi modo de ver, este vale por dos. 2,66 segundos menos en detectar la versión del S.O! Aún encima la ha clavado:

OS details: Fortinet FortiGate-100A firewall

Esto no es mérito sólo de Fyodor(programador principal del proyecto), sino de la gente que se ha currado libpcap. Libpcap es una librería que capturar paquetes en redes de datos para plataformas tipo Unix(también en Sistemas Windows). La versión de esta librería en nmap 4.76 es la 0.8:

root@alberto:/tmp# ldd /usr/bin/nmap
linux-gate.so.1 => (0xb80dd000)
libpcre.so.3 => /lib/libpcre.so.3 (0xb8097000)
libpcap.so.0.8 => /usr/lib/libpcap.so.0.8 (0xb8066000)
libssl.so.0.9.8 => /lib/i686/cmov/libssl.so.0.9.8 (0xb801e000)
libcrypto.so.0.9.8 => /lib/i686/cmov/libcrypto.so.0.9.8 (0xb7ed2000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7ece000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7ddf000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7db9000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7da9000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7c46000)
libz.so.1 => /lib/libz.so.1 (0xb7c30000)
/lib/ld-linux.so.2 (0xb80de000)

, mientras que en la versión de nmap 5.00 es la 0.97:

root@alberto:/media/bodega/misc/nmap-5.00/libpcap# cat CHANGES |head
@(#) $Header: /tcpdump/master/libpcap/CHANGES,v 1.59.2.11 2007/07/24 02:27:32 mcr Exp $ (LBL)

Wed. July 23, 2007. mcr@xelerance.com. Summary for 0.9.7 libpcap release
(...)

Es de suponer que las mejoras, a parte de los bug-fix, son considerables. Enhorabuena a la gente de TCPDUMP.

Escaneo S.O y versión del software del gateway (nmap -A -T4)
Resultados con la versión 4.76:

root@alberto:/# time /usr/bin/nmap -e eth0 -sP 100.100.100.0/24

Starting Nmap 4.76 ( http://nmap.org ) at 2009-08-19 13:43 CEST
Host 100.100.100.5 appears to be up.
MAC Address: 00:09:0F:37:F0:C6 (Fortinet)
Host 100.100.100.12 appears to be up.
MAC Address: 00:50:56:A9:4D:AB (VMWare)
Host 100.100.100.19 appears to be up.
MAC Address: 00:0B:CD:1B:85:4D (Sun)
Host 100.100.100.61 appears to be up.
MAC Address: 00:50:AA:20:61:83 (Konica Minolta Holdings)
Host 100.100.100.64 appears to be up.
MAC Address: 00:00:74:93:DA:76 (Ricoh Company)
Host 100.100.100.118 appears to be up.
MAC Address: 00:33:64:B9:8A:C8 (Sun)
Host 100.100.100.153 appears to be up.
MAC Address: 00:50:56:A9:59:98 (VMWare)
Host 100.100.100.202 appears to be up.
MAC Address: 00:33:64:B9:9A:E9 (Unknow)
Host 100.100.100.204 appears to be up.
MAC Address: 00:33:64:B9:96:96 (Unknow)
Host 100.100.100.212 appears to be up.
MAC Address: 00:33:64:B9:94:1A (Unknow)
Host 100.100.100.214 appears to be up.
MAC Address: 00:33:64:B9:9A:E8 (Unknow)
Host 100.100.100.225 appears to be up.
MAC Address: 00:33:64:B9:91:91 (Unknow)
Host 100.100.100.239 appears to be up.
MAC Address: 00:50:56:A9:1A:B8 (VMWare)
Nmap done: 256 IP addresses (13 hosts up) scanned in 12.07 seconds

real 0m12.087s
user 0m0.212s
sys 0m0.016s

Resultados versión 5.00:

root@alberto:/# time /usr/local/bin/nmap -e eth0 -sP 100.100.100.0/24

Starting Nmap 5.00 ( http://nmap.org ) at 2009-08-19 13:43 CEST
Host 100.100.100.5 is up (0.00033s latency).
MAC Address: 00:09:0F:37:F0:C6 (Fortinet)
Host 100.100.100.12 is up (0.00054s latency).
MAC Address: 00:50:56:A9:4D:AB (VMWare)
Host 100.100.100.19 is up (0.00023s latency).
MAC Address: 00:0B:CD:1B:85:4D (Hewlett Packard)
Host 100.100.100.61 is up (0.0090s latency).
MAC Address: 00:50:AA:20:61:83 (Konica Minolta Holdings)
Host 100.100.100.64 is up (0.00041s latency).
MAC Address: 00:00:74:93:DA:76 (Ricoh Company)
Host 100.100.100.118 is up (0.00022s latency).
MAC Address: 00:33:64:B9:8A:C8 (Hewlett Packard)
Host 100.100.100.153 is up (0.00056s latency).
MAC Address: 00:50:56:A9:59:98 (VMWare)
Host 100.100.100.202 is up (0.00028s latency).
MAC Address: 00:33:64:B9:9A:E9 (Hewlett Packard)
Host 100.100.100.204 is up (0.00023s latency).
MAC Address: 00:33:64:B9:96:96 (Hewlett Packard)
Host 100.100.100.212 is up (0.00018s latency).
MAC Address: 00:33:64:B9:94:1A (Hewlett Packard)
Host 100.100.100.214 is up (0.00017s latency).
MAC Address: 00:33:64:B9:9A:E8 (Hewlett Packard)
Host 100.100.100.225 is up (0.00025s latency).
MAC Address: 00:33:64:B9:91:91 (Hewlett Packard)
Host 100.100.100.239 is up (0.0097s latency).
MAC Address: 00:50:56:A9:1A:B8 (VMWare)
Nmap done: 256 IP addresses (13 hosts up) scanned in 12.40 seconds

real 0m12.401s
user 0m0.140s
sys 0m0.008s


Apenas 0,37 segundos más a tardado la versión 5.00 en realizar el escaneo. Sí ha dado en el clavo.La mayoría de las máquinas son HP, y no Unknow con no "dice" la versión 4.76.

Resumiendo, me quedo con la versión 5.00. Usar repositorios, a veces, es lo que tiene, puedes seguir con una versión obsoleta de un software, que aparentemente funciona bien, tiempo y tiempo. Todos(o casi todos) sabemos, conocemos o hemos oído hablar de las ramas experimentales en Debian; pero nunca tendremos software "tan fresco" como si lo descargamos y compilamos de la web de los desarrolladores. Bondades y maldades del software libre.

lunes, 17 de agosto de 2009

Mis Feeds

He actualizado mis feeds. Si os interesa podéis descargarlos de esta URL.

miércoles, 12 de agosto de 2009

Pendrives y NTFS

Aún no sé bien por qué uso NTFS como sistema de ficheros en mis pendrives. En Mac OSX tengo soporte para EXT3; entonces, no debería utilizarlo. Supongo que será por si tengo que llevar algún documento a la copistería, o intercambiar ficheros con lusers. El caso es que un pendrive que uso a menudo, al intentar montarlo en Debian GNU/Linux o Ubuntu, Gnome me invita amablemente a que lo inserte en una máquina Windows y ejecute el famoso chkdsk(Checkdisk). Cómo no me parecía una solución demasiado ética, por cuestiones obvias, me puse a buscar información y encontre la herramienta ntfsfix. No estoy seguro, pero supongo que esta herramienta forma parte de ntfsprogs. Como dice en su página del manual, ntfsfix corrige errores comunes en NTFS, pero no es una versión para Linux de chkdsk. Sólo repara inconsistencias.
Ejemplo de uso:

root@alberto:/home/alberto# ntfsfix /dev/sdf1
Mounting volume... FAILED
Attempting to correct errors...
Processing $MFT and $MFTMirr...
Reading $MFT... OK
Reading $MFTMirr... OK
Comparing $MFTMirr to $MFT... FAILED
Correcting differences in $MFTMirr record 0...OK
Processing of $MFT and $MFTMirr completed successfully.
Setting required flags on partition... OK
Going to empty the journal ($LogFile)... OK
NTFS volume version is 3.1.
NTFS partition /dev/sdf1 was processed successfully.


Por cierto, sí forma parte de ntfsprogs, al final de la página del manual indica: ntfsfix is part of the ntfsprogs package(...)