jueves, 24 de septiembre de 2009

La (mini) biblia de VIm


Ir a linea al iniciar: vim +36 foo.c
Ir a linea en insercion: :14
Buscar: /cadena , con n la siguiente
SHITF-N para atrás
Numeros de linea: :set number
Moverse hasta el fin de la línea - $
Moverse hasta el principio de la línea - 0
Moverse hasta la siguiente palabra - w
Moverse hasta la anterior palabra - b
Moverse hasta la siguiente palabra* - W
Moverse hasta la anterior palabra* - B
Moverse a la línea n*** - nG
Moverse hasta el final de la siguiente palabra - e
Moverse hasta el final de la siguiente palabra* - E
Encontrar el siguiente caracter c en la línea actual - fc
Encontrar el anterior caracter c en la línea actual - Fc
Llegar hasta justo antes del siguiente caracter c - t
Llegar hasta justo después del anterior caracter c - T
Encontrar el paréntesis contrario** - %
Moverse hasta la siguiente frase - (
Moverse hasta la anterior frase - )
Moverse hasta el anterior párrafo - {
Moverse hasta el siguiente párrafo - }
Moverse hasta la parte superior de la pantalla - H
Moverse hasta la parte media de la pantalla - M
Moverse hasta la parte inferior de la pantalla - L
Avanzar página - ^F
Retroceder página - ^B
Deshacer el último cambio - u
Deshacer todos los cambios de la línea actual - U
Redibujar la pantalla - ^L
Ver información del archivo actual - ^G
Reemplazar un caracter - r
Sobreescribir texto - R
Borrar el caracter actual y entrar en modo inserción - s
Cambiar la línea actual* - S
Cambiar entre mayúsculas y minúsculas - ~
Borrar texto (como el BackSpace) - X
(Sólo en vim) marcar bloque - v, V, ^V
uscar texto - /texto
epetir última búsqueda - n
Repetir última búsqueda en dirección contraria - N
Repetir última búsqueda hacia abajo - /
Repetir última búsqueda hacia arriba - ?
Repetir último cambio - .
Siguiente palabra (Modo inserción) ** - ^N
Anterior palabra (Modo inserción) ** - ^P

VI CiberEncontro Kernel 2009 - Mugardos - II

Pasados ya unos días desde que finalizó el Kernel 2009, toca reflexionar. Esta edición, a mi modo de ver, a mantenido el nivel de las anteriores, pero será cuestión de pensar para el próximo año, actividades y charlas que puedan mejorar aún más el evento.
La verdad es que la edición de 2009 ha sido la edición más Linuxera de todas. Pude contar a Pablo,Evaristo,Amador,Kutus,Iñaki Quenerapu,Alberto,Carola,Rodrigo,Keko y Aaron como usuarios de GNU/Linux durante la Party, bueno e Iván a última hora del sábado,claro. Hablo sólo de la planta baja, por que en la de arriba algún Linuxero había, y por supuesto algún MacOSX user. Digo por supuesto, por que siempre se suelen pasar algunos. Lejos de pretender ser una Linux Party, no deja de llenarme de satisfacción que la gente pueda usar su cerebro, huír del "sendero de los borregos" y decidir libremente qué software correr en su máquina. Enhorabuena a tod@s!

Todos los servicios de red: http,ftp,proxy-fw,dns,dhcp y demás, corrían en dos máquinas Debian GNU/Linux 5.0.3 stable. Los resultados fueron más que satisfactorios. La características de la máquina principal son: Procesador Intel Pentium 4 3,0 Ghz, 1 GB RAM, 1 HD SATA 200Gb, 1 Interfaz Gb Ethernet, 1 Interfaz 10/100 Mb Ethernet. Para 60 usuarios, corriendo Squid 2.7, Bind 9.5 , Cherokee 0.9 y dhcp3-server, por momentos se quedaba casi si RAM pero nunca se notó en el calidad del servicio. Ni un sólo reinicio en 3 días. En la segunda máquina, instalamos un Bind 9.5 esclavo del primero, con vsfptd y cherokee. Esta máquina alojaba la web interna del evento, así cómo el servicio ftp,para subir las fotos, vídeos y concursos. Con un procesador Intel Celeron 1 Ghz y 256Mb de RAM, los resultados fueron excelentes.

Si os interesan los ficheros de configuración, a mi modo de ver los más interesante son el squid.conf(post) y el script de iptables del proxy-firewall,ningún problema en facilitarlos.

Saludos.

sábado, 19 de septiembre de 2009

VI CiberEncontro Kernel 2009 - Mugardos

Son las 04:22, a mi derecha un Macbook "pinchando" Matrix Reloaded; ante mi, 38TB de información, y una de las interfaces de red de mi máquina pinchadas a un switch gigabit. Conclusión: esto va a ser, si no lo es ya, una auténtica jauría de GB y TB.

Entrando en materia, decir que he configurado un "clásico" proxy-firewall con Debian GNU/Linux 5.0.3 Stable, nada de historias. He instalado todo el software vía apt-build y de momento el resultado es más que aceptable. Esta es la primera edición en la que durante todo el evento los routers adsl está n balanceados, y se puede decir que la conexión hacia Internet ha mejorado con respecto a años anteriores.Iptables con DROP, Bind9 cacheando las consultas DNS y Squid ayudan bastante. Ni que decir tiene que el direccionamiento es vía DHCP, y claro, necesitabamos (Organización) "algo" que nos diese un "canuto extra" de salida a Internet. ¿Cómo? Facil! Asignando las direcciones ips fijas vía DHCP y con un script que se ejecuta cada 300 segundos, inserte estas direcciones en un ACL ede Squid que nos llame a un Delay Pool. Suena un poco enrevesado, pero con este script...

#!/bin/bash
FICHERO_SQUID=/etc/squid/canuto
rm -rf $FICHERO_SQUID
touch $FICHERO_SQUID
for ip in `cat /etc/dhcp3/dhcpd.conf|grep fixed-address|awk '{ print $2 }'|cut -d ";" -f1`
do
echo $ip >> $FICHERO_SQUID
done
/etc/init.d/squid reload 2>&1 > /dev/null






#################################################
#
#FICHERO CONFIGURACION SQUID KERNEL 2009
#
#################################################
#Parametros basicos
visible_hostname sauron.kernel2009
http_port 3128 transparent
httpd_suppress_version_string on
#
#
#Pametros de la cache
cache_mem 256 MB
cache_dir aufs /cache 2048 512 128
cache_mgr info@comunidadeozulo.org
coredump_dir /var/spool/squid/coredumpdir
acl manager proto cache_object
maximum_object_size 65535 KB
cache_access_log /var/log/squid/access.log
#
#
#Parametros varios
half_closed_clients off
ftp_user anonymous@nospam.com
error_directory /usr/share/squid/errors/Spanish
#
#
##############################################
# #
#TUNNIG DE TIEMPOS DE REFRESCO DE FICHEROS #
# #
##############################################
#Refresco de la cache MIN PORCENTAJE MAX(MIN)
#
#1440 = 1 dia
#2880 = 2 dias
#10080 = 7 dias
#20160 = 14 dias
#30240 = 21 dias
#
#Ficheros comunes en parties
refresh_pattern \.iso$ 2880 80% 10080
refresh_pattern \.deb$ 2880 80% 10080
refresh_pattern \.tar.gz$ 2880 80% 10080
refresh_pattern \.gz$ 2880 80% 10080
refresh_pattern \.bz2$ 2880 80% 10080
refresh_pattern \.exe$ 2880 80% 10080
#
#
#Ficheros de imagenes
refresh_pattern \.jpg$ 1440 50% 2880
refresh_pattern \.jpeg$ 1440 50% 2880
refresh_pattern \.gif$ 1440 50% 2880
refresh_pattern \.bmp$ 1440 50% 2880
refresh_pattern \.png$ 1440 50% 2880
refresh_pattern \.svg$ 1440 50% 2880
refresh_pattern \.tif$ 1440 50% 2880
refresh_pattern \.tiff$ 1440 50% 2880
#
#
#Documentos
refresh_pattern \.xls$ 1440 80% 2880
refresh_pattern \.doc$ 1440 80% 2880
refresh_pattern \.odt$ 1440 80% 2880
refresh_pattern \.rtf$ 1440 80% 2880
refresh_pattern \.jpeg$ 1440 80% 2880
refresh_pattern \.pdf$ 1440 80% 2880
#
#
#Ficheros comprimidos
refresh_pattern \.zip$ 2880 80% 10080
refresh_pattern \.rar$ 2880 80% 10080
refresh_pattern \.arj$ 2880 80% 10080
####################################
#
#LISTAS CONTROL ACCESO -ACLs
#
####################################
#Definicion de puertos seguros
acl SSL_ports port 443 563 8080
acl Safe_ports port 80
acl Safe_ports port 21
acl Safe_ports port 20
acl Safe_ports port 443
acl Safe_ports port 563
acl Safe_ports port 777
acl Safe_ports port 1024-65535
acl CONNECT method CONNECT
#############################
acl all src 0.0.0.0/0.0.0.0
acl localhost src 127.0.0.1/255.255.255.255
acl lan src 192.168.2.0/255.255.255.0
acl canuto src "/etc/squid/canuto"
acl denywords url_regex "/etc/squid/denywords"
acl denydomains dstdom_regex "/etc/squid/denydomains"
acl sincache dstdom_regex "/etc/squid/sincache"
####################################
#
#CONTROL ANCHO BANDA
#
####################################
delay_pools 2
#
#
#Para otros
delay_class 2 1
delay_parameters 2 407000/1048576
delay_access 2 allow canuto
#Para todos
delay_class 1 1
delay_parameters 1 256000/1048576
delay_access 1 allow lan !canuto
#
#
#
#
http_access deny denydomains
http_access deny denywords
http_access allow localhost
http_access allow manager localhost
http_access allow lan
http_access deny CONNECT !SSL_Ports
http_access deny CONNECT !Safe_Ports
http_access deny all

miércoles, 9 de septiembre de 2009

No sólo de Apache2 vive el hombre...




A raíz de una serie de problemas en el servidor VPS que aloja www.permuy.org, www.comunidadeozulo.org y demás, decido prescindir de Apache2. La máquina no está sobrada de RAM, y Apache2 se encarga de contribuir a ello, consumiendo nada más arrancas el servicio hasta 60Mb! Si no lo veo no lo creo!

Me habían recomendado lighttpd, pero en realidad, siempre había leído mejores críticas en cuanto a velocidad se refiere de cherokee. Por lo que he podido comprobar(a ojo) el consumo de memoria cherokee es mas bajo que el de Apache. Pero en velocidad, ni punto de comparación. Al final sigo con Apache en www.permuy.org, pero en casa y en la oficina he migrado ya ha cherokee.

¿Qué me ha gustado del Cherokee Project?
  • Facilidad de instalación: wget, configure, make y make install.
  • No tiene dependencias externas, salvo las librerías de C, claro.
  • Soporta: FastCGI, SCGI, PHP, CGI, SSI, TLS and SSL.
  • Muy rápido, tanto para servir páginas como para reiniciar el servicio.
  • Administración muy sencilla vía web a través de cherokee-admin.
  • La documentación está muy bien estructurada y muy bien redactada.
  • En GNU/Linux funciona de maravilla.
Pruebas de rendimiento.

He realizado dos pruebas con ab en Apache 2.2.x y Cherokee 0.99.24 y la verdad es que el segundo "se come" al primero. La máquina en cuestión es:
S.O : Ubuntu 9.04
Kernel : Linux alberto 2.6.28-15-generic
RAM: 1GB DDR2 533
Procesador: Intel(R) Core(TM)2 Duo CPU E4600 @ 2.40GHz

Prueba 1
Criterio: 1000 peticiones y concurrencia = 10
Resultados para Apache 2.2.11

Server Software: Apache/2.2.11
Server Hostname: localhost
Server Port: 80

Document Path: /drupal2
Document Length: 354 bytes

Concurrency Level: 10
Time taken for tests: 0.272 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Non-2xx responses: 1002
Total transferred: 649296 bytes
HTML transferred: 354708 bytes
Requests per second: 3670.06 [#/sec] (mean)
Time per request: 2.725 [ms] (mean)
Time per request: 0.272 [ms] (mean, across all concurrent requests)
Transfer rate: 2327.11 [Kbytes/sec] received

Resultados para Cherokee 0.99.24

Server Software: Cherokee/0.99.24
Server Hostname: localhost
Server Port: 80

Document Path: /drupal2
Document Length: 293 bytes

Concurrency Level: 10
Time taken for tests: 0.219 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Non-2xx responses: 1004
Total transferred: 544168 bytes
HTML transferred: 294172 bytes
Requests per second: 4557.68 [#/sec] (mean)
Time per request: 2.194 [ms] (mean)
Time per request: 0.219 [ms] (mean, across all concurrent requests)
Transfer rate: 2422.01 [Kbytes/sec] received


Tanto la tasa de transferencia con el tiempo empleado en realizar las peticiones son menores, si bien es cierto que con 1000 peticiones pocas conclusiones se pueden sacar, de momento Apache 0 - 1 Cherokee. Ahora vamos con la prueba 2, con 100000 peticiones y concurrencia = 10.

Prueba 2
Criterio: 100000 peticiones y concurrencia = 10
Resultados para Apache 2.2.11

Server Software: Apache/2.2.11
Server Hostname: localhost
Server Port: 80

Document Path: /drupal2
Document Length: 354 bytes

Concurrency Level: 10
Time taken for tests: 19.781 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Non-2xx responses: 100003
Total transferred: 64801944 bytes
HTML transferred: 35401062 bytes
Requests per second: 5055.42 [#/sec] (mean)
Time per request: 1.978 [ms] (mean)
Time per request: 0.198 [ms] (mean, across all concurrent requests)
Transfer rate: 3199.23 [Kbytes/sec] received

Resultados para Cherokee 0.99.24

Server Software: Cherokee/0.99.24
Server Hostname: localhost
Server Port: 80
Document Path: /drupal2
Document Length: 293 bytes
Concurrency Level: 10
Time taken for tests: 7.734 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Non-2xx responses: 100000
Total transferred: 54200000 bytes
HTML transferred: 29300000 bytes
Requests per second: 12930.18 [#/sec] (mean)
Time per request: 0.773 [ms] (mean)
Time per request: 0.077 [ms] (mean, across all concurrent requests)
Transfer rate: 6843.90 [Kbytes/sec] received

Llama mucho la atención que mientras Apache2 es capaz de "responder" poco más de 5000 peticiones por segundo, cherokee llega casi a las 13.000. Ni hablar del tiempo empleado, Apache a tardado más de 11 segundos! 11 segundo es mucho tiempo, pero mucho mucho! ¿Algo más?
Enhorabuena a Alvaro Lopez, por su gran trabajo realizado desde 2001.

miércoles, 2 de septiembre de 2009

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

Acabo de hablar con Rosa. Ha salido del examen oral. No sabe aún la nota, pero sí le han dicho que ha aprobado. Enhorabuena! Se ha hecho justicia!

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.