Únicamente Software Libre
Invitación WHYFLOSS Conference Madrid 08 - 8 y 9 de Mayo en Campus Sur de EUI de UPM

Conferencias gratuitas de tecnologías abiertas de IT en Madrid.

En los días 8 y 9 del mes de mayo se celebrará la 4ta edición de la WhyFLOSS Conference, con entrada libre y graguita y con certificados de asistencia y ponencias de negocio y técnicas orientadas a CIOs, empresas públicas y privadas, emprendedores, estudiantes y profesionales de IT. Un evento internacional organizado por Neurowork que se realiza en España y Argentina y que esta vez se realizará por segunda vez en la ciudad de Madrid.

Con un importante apoyo de la Escuela de Informática de la Universidad Politécnica de Madrid, Campus Sur se presentarán conferencias variadas entorno a las tecnologías abiertas de IT.

La entrada es gratuita y puede registrarse via Web en:

http://www.whyfloss.com/es/conference/madrid08/register

En este evento compañí­as como SUN, Red Hat, OpenBravo, Andago, SIE, Liferay, Opentia, Monolabs, Accenture, Avanzada7 y universidades como la UPM y la URJC, así­ como comunidades de proyectos como LibreSoft, OpenSolaris y FFII estarán colaborando en la IV edición del evento.

Si desea colaborar en la difusión del evento puede dirigirse a:

http://www.whyfloss.com/es/conference/madrid08/help
Agenda de actividades y presentaciones

[ DIA 1 - BUSINESS DAY ]

Aula Magna

9:30: Inauguración WHYFLOSS Conference 08
Alejandro Sánchez Acosta, Director de Desarrollo de Negocio en Europa de Neurowork

10:00: Open-Cities: el reto de la administración electrónica
Guillermo Pastor, Gerente de Soluciones de Ándago Ingeniería S.L.

11:00: VII Programa Marco en la UE: FLOSS Include y FLOSS Metrics
Jesús Gonzalez Barahona, Investigador en LibreSoft

12:00: Modelos de negocio utilizando Asterisk (la plataforma de VoIP basada en Software Libre)
Juan Ignacio Cabrera, Director de Avanzada 7

13:00: Clustering Computacional en CSIC
Raul Diaz Medina, Director Técnico en Sistemas Informáticos Europeos S.L.

14:00: Lunch break

16:00: La implicación de la FFII en los estándares abiertos en Europa
Alberto Barrionuevo, Presidente de Foundation for a Free Information Infrastructure (FFII) / OPENTIA, S.L.

17:00: Caso de exito OpenSolaris en Accenture
David Galan Ortiz, Responsable IT en Accenture Outsourcing

18:00: ¿Es viable el software Open Source en la Industria? El caso de Red Hat Linux y JBoss
Jesús González de Buitrago, Director de Ventas de Canal en Red-Hat

19:00: Networking

[ DIA 2 - TECH DAY ]

Aula Magna

10:00: Evolución e influencia del Software Libre en los 10 últimos años
Juantomás García, Director de Monolabs

11:00: Liferay Enterprise Portal: The project, the product, the community and how to extend it
Alvaro del Castillo San Félix, Ingeniero de Desarrollo y Responsable de Comunidad de Liferay Inc.

12:00: Openbravo: las claves del éxito del desarrollo en las aplicaciones en software libre
Eugeni Vives, Director de operaciones de Consultoria en Openbravo S.L.
Adrián Romero, Arquitecto de software y fundador de Openbravo POS en Openbravo S.L.

13:00: SIMDE: El Sistema de Información y Documentación sobre Migración y Desarrollo en México
Maximino Gerardo Luna Estrada, Doctor de Universidad Autónoma de Zacatecas en México
Oscar Pérez Veyna, Universidad
Universidad Autónoma de Zacatecas en México

14:00: Lunch break

16:00: Proyecto PROAIRESIS: Software Libre al servicio de la comunidad educativa.
Máximo Martín Molina, Director de Fundación de I+D de Software Libre

17:00: Seguridad en OpenSolaris
Victor M. Fernandez, Coordinador Técnico SIA / OpenSolaris Hispano

18:00: Django: Framework MVC en Python
Jesús Espino García, Sistemas Informaticos Europeos

19:00: Networking	

Puede consultar el programa definitivo en: http://www.whyfloss.com/es/conference/madrid08/program
Para conocer más sobre Neurowork visite: http://www.neurowork.net


AWK al rescate

El potente AWK, no podía ser otro :)

Estuve a punto de encontrarme en la misma situación que la vez anterior, escribir código con mis sentencias for, if, ... en lugar de aprovechar la maravilla de herramientas que tenemos a nuestra disposición, pero esta vez no ha sido así ñe ñe ñe.

Tenía un archivo con varios miles de líneas, cada una de las cuales contenía la clave primaria de la tabla perteneciente a una base de datos.

El problema: Contar el número de ocurrencias de cada clave primaria en el fichero.

Lo primero que se me vino a la cabeza, un contador que cada vez que encontrase una ocurrencia, se incrementase para esa clave concreta.

El problema en sí es algo más o menos fácil de resolver, pero existen varios problemas, es necesario hacerlo rápida y eficientemente. Un número excesivo de comparaciones, accesos a disco o el consumo elevado de memoria podría penalizar bastante, así que no podía hacerse a la ligera.

Tenía una pequeña idea de que AWK podría servirme, pero mis conocimientos no eran demasiado profundos como para resolverlo por mi mismo, así que me puse a buscar por Internet, un poco por aquí, otro poco por allá, hasta que di con ello. Además me llevé una muy grata sorpresa ya que encontré la solución en la página de uno de los profesores más brillantes que he tenido a lo largo de mi carrera, Kostadin Korutchev. Aquí os muestro el código adaptado para el problema particular que tenía entre manos, contar el número de veces que aparece una cadena en un fichero:

#!/bin/sh

cat $1  \
	| awk '{for(i=1;i<=NF;i++) print $i;}' \
	| awk '{n[$1]++;}END{for(i in n) print n[i], i;}' | sort -nr
						

Y problema solucionado :)

Destacar también que el script funciona si aparece más de una clave primaria por línea gracias al primer bucle. Una vez terminado el problema, podría haber parado aquí, pero yo no soy así, por lo tanto me he hecho el script a mano para comparar y ver el tiempo que me he ahorrado al aprender un poquito más de AWK (tal vez ahora no, pero para el futuro seguro que sí :) )

Decir que el fichero con las claves primarias estaba ordenado, y por lo tanto todas las ocurrencias de una misma clave estaban agrupadas. De no haber sido así, este segundo script no habría servido y la lógica hubiese tenido que ser mucho más compleja. Resaltar que el primer script funciona tanto para ficheros ordenados como desordenados. Después veremos unas pruebas donde os sorprenderéis de la velocidad a la que lo procesa.

Me interesaban sólo aquellas claves primarias que apareciesen 1 o 2 veces, las demás se descartan, así que un script más o menos así me hubiese servido:
#!/bin/sh

o1=0
o2=0
sel_o=1
c=0

for i in `cat colas_obsoletas.dat`
do
	# Almacena la clave actual y diferencia la clave seleccionada
	if [ $sel_o -eq 1 ]
	then
		o1=$i
		sel_o=2
	else
		o2=$i
		sel_o=1
	fi

	# Si las claves son distintas quiere decir que se han terminado de
	# contar las ocurrencias.
	# Si además el contador es 1 o 2, se muestra esa clave.
	if [ $o1 -ne $o2 ] && [ $c -eq 1 -o $c -eq 2 ]
	then
		if [ $sel_o -eq 1 ]
		then
			echo $o1
		else
			echo $o2
		fi
	fi

	# Si la clave anterior es distinta de la clave actual, inicializar el contador
	# sino, aumentar el contador porque se está contando la siguiente ocurrencia
	# de la clave primaria
	if [ $o1 -ne $o2 ]
	then
		c=1
	else
		c=`expr $c + 1`
	fi
done

Está claro que AWK es mucho más potente y fácil de utilizar. Ahora voy a hacer una prueba para ver cuánto tardaría el script AWK en darme la salida que necesito. Para empezar me genero un archivo con 4000 líneas y un número aleatorio entre 1 y 100 en cada una de ellas, después lanzo mi script y redirijo la salida a un fichero:

Pruebas de velocidad:

$ for i in `seq 1 2000`; do echo -e "`expr $RANDOM % 100`\n`expr $RANDOM % 100`" >> fichero.out; done

$ time ./colas_awk.sh fichero.out > fichero_awk.out

real	0m0.022s
user	0m0.024s
sys	0m0.008s

Con 8000 líneas tarda más o menos lo mismo. Si tengo un rato me hago una gráfica de cómo crece el tiempo en función de las líneas del fichero y así aprovecho para mostraros lo útil que es el programa gnuplot.


Algo que he aprendido también, es que junto al programa gawk (GNU awk) se instala pgawk (Profiling gawk), que nos permite ver las trazas de por dónde ha ido pasando nuestro script. Si ahora lo ejecutamos con pgawk:
#!/bin/sh

cat $1  \
	| pgawk '{for(i=1;i<=NF;i++) print $i;}' \
	| pgawk '{n[$1]++;}END{for(i in n) print n[i], i;}' | sort -nr

el resultado será el mismo, pero además genera el fichero awkprof.out, en el cuál podemos ver lo qué ha ido ocurriendo en la ejecución:
        # perfil de gawk, creado Sun Mar  2 14:25:34 2008

        # Regla(s)

  4000  {
  4000          n[$1]++
        }

        # bloque(s) END

        END {
   100          for (i in n) {
   100                  print n[i], i
                }
        }
Vemos que el contador se ha incrementado tantas veces como líneas hay y que ha hecho un print de todos los números que van del 1 al 100 (ya que la generación de los números aleatorios ha creado todos los posibles).

Me he comprado seis libros en Amazon, así que espero seguir aprendiendo y poder escribir a menudo. Ojalá os guste.


Shell Scripting (entre otras cosas)

Últimamente estoy teniendo la suerte de tocar muchas máquinas UNIX, sobre todo Solaris, pero también HP-UX y AIX. Antes solía hacerme mis scripts para automatizar algunas tareas del día a día y para las prácticas de la facultad, ahora, por fortuna, tengo que usarlo para trabajar.

No tengo pensado hacer un manual sobre Shell Scripting ya que por la Red podemos encontrar muchos y muy buenos, por ejemplo http://tldp.org/LDP/abs/html/, lo que pretendo es dar una visión general (o muy detallada) sobre sistemas UNIX, sus diferencias, virtudes, defectos... iré hablando de Shell Scripting, sistemas, monitorización, seguridad... sin restricciones.

Normalmente escribiré artículos pequeñitos o experiencias que me hayan llamado la atención. Cuanto más voy aprendiendo, más cuenta me doy de lo poco que sé, pero también de la gran potencia que me brindan todos estos conocimientos.

Como primer apunte me gustaría hablar de una situación con la que me encontré hace poco desarrollando un script para una Korn Shell encargado de procesar una serie de situaciones en una base de datos, que se ejecuta automáticamente cada noche y lo almacena con el nombre Envio + la fecha de ejecucion. El mayor problema fue el de saber cómo borrar todos aquellos envíos que tuviesen más de un mes de antigüedad.

Si por ejemplo hoy nos encontramos a 24 de febrero, debería borrarse el envío relativo al 24 de enero. Lo interesante viene cuando hay que borrar por ejemplo desde el 1 de marzo, ya que se deben limpiar, además del 1 de febrero, también los del 29 y 30 de enero que no se borraron en febrero. Otro caso extra, si febrero es bisiesto, sólo debe borrarse el 30 de enero porque desde el 29 de febrero ya se habrá hecho. Lo veréis más claro si os lo muestro aquí. Al final terminé implementando tres clases diferentes de borrados, dependiendo de si me encontraba en alguno de los bloques:
if [ $strdia -eq 01 -a $strmes -eq 03 ]
then
   #Si es dia 1 y el mes 3 (marzo), borrar los dias 29, 30 y 31 de enero que no se borran en febrero
   #En el caso de que febrero sea bisiesto, borrar solo el 30 y 31


   #Si es bisiesto
   if [ $stranio%4 -eq -0 ] && [ $stranio%100 -ne 0 -o $stranio%400 -eq 0 ]
   then
      ...
   else
      ...
   fi
elif [ $strdia -eq 01 ] && [ $strmes -eq 5 -o $strmes -eq 7 -o $strmes -eq 10 -o $strmes -eq 12 ]
then
   #Si es dia 1 y es el mes siguiente a alguno de los que tienen 30 dias
   #(abril, junio, septiembre y noviembre), borrar el dia 31 de hace dos meses

   ...
else
   #Borrar todos los de hace un mes
   ...
fi
en total 102 líneas de código contando comentarios.

Yo sabía que debía existir una forma más sencilla de hacerlo, pero busqué y no logré encontrar nada que me hiciese poder alejarme de la idea de dividir el código con esa estructura para borrar cada envío correspondiente en función del día y mes en que me encontrase.

Más tarde estuve con otro script que todas las noches se encarga de obtener información mediante consultas a una base de datos y lo envía a un Datawarehouse. Una noche en mi casa leyendo sobre Shell Scripting me topé con lo siguiente y me llevé las manos a la cabeza:
find . -mtime +30 -exec rm -fr {} \;
El comando find utilizado de esta forma se encarga de borrar aquellos archivos o directorios que fueron modificados hace más de 30 días en el directorio actual. ¡¡¡¡Diosssss!!!! ¡¡¡¡Sabía que existía!!!! Me dio muchísima rabia encontrarlo, pero también una enorme satisfacción. Una línea en lugar de 102... ainssss.

Así que lo único que tuve que hacer fue adaptarlo para mi caso particular y ahora podré usarlo siempre que quiera. Leyendo el man, he visto que con -atime (access time) se puede utilizar la última vez que se ha accedido al archivo y con -ctime (create time) la fecha de creación.
find . -ctime +30 -name 'Envio*' -exec rm -rf {} \;


El conocimiento nos hará libres.


Unos leves consejillos sobre seguridad.

¿Qué es lo primero que hay que tener en cuenta cuando se abre un puerto en nuestro ordenador y se ofrece un servicio?

Fácil, la seguridad.

Hoy he estado montando un servidor SSH y otro FTP (Debian GNU/Linux Sid en este caso) para poder acceder a mi ordenador desde cualquier parte y para compartir algunas cosillas con un amigo.

Muchos días intentan acceder a mi ordenador (seguro que al tuyo también, si sois un poco curiosos podéis echar un vistazo al fichero /var/log/auth.log y ahí tendréis registrado quién ha querido acceder a vuestro ordenador, cúantas veces lo ha hecho y ¡si lo ha conseguido!.

En este caso la conexión por SSH será para mi, y no me hace ni pizca de gracia que alguien pueda colarse por ahí a mi ordenador, así que tomo ciertas precauciones básicas y otras no tanto:

    1. Suelo cambiar regularmente de contraseña.
    2. Utilizo contraseñas fuertes, sobre todo para root.
    3. Me mantengo al día de las actualizaciones de seguridad.
    4. Hago algunos retoques en el firewall y los archivos de configuración según voy aprendiendo cosas nuevas.


Algo muy sencillo y que mucha gente permite que se haga es el acceso por SSH como root. Si fueses un malo malísimo, ¿cuál sería el primer usuario con el que probarías para entrar? Exactamente, con el usuario root.

Dependiendo de las distribuciones, el acceso por SSH como root viene habilitado:
PermitRootLogin yes
Lo que debemos hacer es dirigirnos al fichero /etc/ssh/sshd_config, modificar ese yes por un no y reiniciar el servidor con /etc/init.d/ssh restart. Si alguna vez queremos entrar como root a nuestro ordenador, es mejor entrar como un usuario normal y luego desde dentro cambiar de usuario a root.
Un par de utilidades muy buenas y que nos mostrarán un resumen del estado de la seguridad de nuestro sistema son los programas chkrootkit y rkhunter. Instaladlos y probadlos, tal vez más de uno se lleve una sorpresa.

El otro punto que hoy quería tener controlado es el de la privacidad. No quiero que el amigo al que voy a dar acceso al FTP pueda cotillearme documentos privados o simplemente borrar algo sin querer. Lo que he hecho ha sido instalarme vsftpd - The Very Secure FTP Daemon y elegir en el fichero de configuración /etc/vsftpd.conf alguna de las características que buscaba:

    1. anonymous_enable=NO (No quiero que nadie se conecte sin autenticarse)
    2. write_enable=NO (Los usuarios no podrán escribir)
    3. user_config_dir=/etc/vsftpd/users (directorio con los ficheros de configuración de cada usuario)
    4. chroot_local_user=YES (lo más importante en este caso para mi, el usuario no podrá subir en el árbol de directorios por encima del que se le ha asignado como raíz)

He tocado más elementos de la configuración, pero estos eran los principales que quería tener.


Instalar y configurar un servidor, ya sea SSH o FTP, está ampliamente documentado, así que si estáis interesados en hacerlo sólo tendréis que mirar en cualquier buscador y aprender.

Con la llegada al mundo UNIX, y más concretamente al mal llamado Linux, de usuarios noveles y con poca preparación, tal vez estemos pecando de "buenas personas", de intentar hacer la vida más fácil a esos usuarios que acaban de llegar para captar a más y más. Yo estoy en parte de acuerdo con esa política porque ese impulso vendría muy bien al mundo del Software Libre, pero mucho cuidado con los pasos que se dan. Pongo como ejemplo la intención de incluir drivers propietarios en Ubuntu, un acto deleznable y que espero no se produzca jamás.

Solaris, *BSD, Debian, Ubuntu, Suse, Red Hat... estamos asistiendo a una lucha por hacerse con un mayor trozo del pastel, cada uno a su manera, pero todos sabiendo muy bien el más que posible futuro que nos espera. El fichaje de Ian Murdock o el impulso de OpenSolaris por parte de Sun es una clara muestra.


El elemento más lento decidirá el rendimiento del sistema. (Léase alumnos)

El elemento más lento del sistema
Los torpes no llegarán a nada, se sabe, aunque nos duela.

Cuando hablo con los alumnos o sus padres, cuando me cuentan las ganas que tienen de estudiar para poder ejercer esa profesión que tanto les gusta... me da pena ver y pensar que no están recibiendo la formación adecuada porque todos deben ir al mismo ritmo en clase. Y al decir esto, lo que se hace es que todos deben ir al ritmo de los más lentos o de los que no tienen mayor interés por estudiar.

A los que de verdad quieren estudiar, cuando lleguen a la universidad les exigirán unos conocimientos que en la mayoría de los casos no han recibido en la medida que debiesen. Están poniendo trabas a su futuro por hacer que los que van más lentos puedan aprobar el curso. Cuando el otro día vi a nuestra queridísima Ministra de Educación, Mercedes Cabrera, decir que los alumnos de Bachillerato podrán pasar de curso con cuatro suspensos me dieron ganas de meter la mano por el televisor y darle un cogotazo. ¿Para qué esta medida? ¿Para que haya menos “fracaso escolar” y poder mostrar unas mejores cifras? ¿Para que no abandonen tantos alumnos los institutos y haya menos paro?. Señora ministra, el nivel no debe bajarse, ¡DEBE SUBIRSE!. Los alumnos del presente serán los que en un futuro muy cercano tiren de España hacia delante (o tal vez hacia atrás).

Se está obligando a que los más listos se adapten al ritmo de los más torpes. Aunque suene egoísta, aunque nos duela, existen distintos niveles y la educación debe ir orientada a que todos progresen y se preparen para sus objetivos. En el caso de que no puedan hacerse varios carriles de circulación, deben ser los torpes y los gamberros los que se pongan detrás.

¿Cuáles son los pasos normales de cada tipo de alumno?

  • Los que quieren estudiar, valen y son listos: Estudiar, sacarse una carrera y ser alguien de provecho en el futuro.
  • Los que quieren estudiar y valen: Estudiar, sacarse una carrera y ser alguien de provecho en el futuro. Aunque con más esfuerzo y es posible que no lleguen a ser tan brillantes.
  • Torpes: Terminar los estudios básicos (si es que lo hacen) y trabajar de cualquier cosa que les permita salir adelante.
  • Problemáticos: Seguir molestando a los demás que quieren estudiar, no terminar los estudios, convertirse en personas irrespetuosas, sin objetivos de futuro y posiblemente en delincuentes de poca monta.

Dentro de cada grupo puede haber casos muy distintos y también pasar en ocasiones de uno a otro. Dependiendo de las compañías o la educación familiar, se pueden dar unos vuelcos tremendos.

Soy estudiante y debido a mi trabajo seguro que lo seguiré siendo toda mi vida. Sé muy bien de lo que estoy hablando, en una proporción muy alta de colegios e institutos ocurre. Hasta la universidad, el ritmo de clase se adapta a los torpes, mientras que los problemáticos molestan a los demás, y los listos y normales se aburren en clase y no aprenden más allá de lo básico. ¿Es ese el país que queremos? ¿Esa es la educación que nos enseñan? Una cosa es ser todos iguales en cuanto a derechos y otra muy distinta ésta.

La naturaleza es cruel, los que no son capaces de sobrevivir, caen. Aquí en España no, muchos no pueden correr para que otros puedan andar.

Los que hayáis leído todo pensaréis que soy un egoísta, o que todos deben tener los mismos derechos. Sí, todos deben tener los mismos, pero la libertad de uno termina cuando influye en la de los otros.


www.victorsanchez2.net
victorsanchez2 en gmail.com
victorsanchez2 en jabberes.org
victorsanchez2.asc (Huella digital: 4D05 8831 CB70 5F22 D836 73FF BA0A 5C66 BBB9 AC5A)
Tf: 659 35 74 53

Valid XHTML 1.0 Transitional