Post-doc contract associated with the H2020 project ElasTest

Position information

  • Organization: Universidad Rey Juan Carlos
  • Department: Computer Science
  • Location: Spain, Madrid
  • Duration: 1 year (can be extended upon funding availability)
  • Salary: 35.000€ – 40.000€

Job description

Universidad Rey Juan Carlos is a young university, founded in 1995, located in the suburban area of Madrid, with very good connection by bus, subway and train. The university has a big campus in Mostoles for all short of Engineering disciplines, including an important School of Software Engineering and Computer Science.

The candidate will be involved in the H2020 project ElasTest (GA 731535), coordinated by the CodeURJC research laboratory. The CodeURJC lab has been involved in more than 20 research and industrial projects, including European projects like Nubomedia (coordinated by URJC), FIWARE, and ElasTest (which we are coordinating right now), and industrial projects with important international companies from the telecommunications and energetic sectors.

The CodeURJC lab is focused on two main areas: real-time communication, where the group leads the open source projects Kurento and OpenVidu, currently running in production in several products developed by third parties; and software testing, where the group is leading the ElasTest open source platform aimed at bringing observability and better management to the testing process and helping companies to improve their CI/CD practices.

The group is seeking for a postdoc researcher, with experience in software testing or software engineering, to be involved in the research work being carried out within the group. The applicant will be integrated into a motivated team, with other developers and researchers, that enjoy building software for the community.

The selected candidate will work in a team with other researchers worldwide, including some of the most influential researchers in software testing. They will attend meetings and could take over tasks the group have in the context of the ElasTest project, being involved in the activities of the project in general.

We offer a range salary between 35,000-40,000€/year depending on the skills of the candidate. We have a good environment, and we work remotely on Fridays.

If you’re passionate about software engineering, research and open source, with a willing for helping the community, we look forward to having you on board!

Contact person

Candidates, please send an email to Dr. Francisco Gortázar (francisco.gortazar@urjc.es), indicating in the subject “ElasTest postdoc position” with a short CV, including the most relevant publications, and a description of the work carried out by the applicant within those articles. We might ask applicants for an online interview. All candidates will be contacted back with information on the results of their application.

 

Arreglando el histórico en git

Si usamos git en el día a día, probablemente nos habremos encontrado alguna vez con que olvidamos configurar nuestro user.name y/o user.email, el sistema coge valores por defecto y acabamos teniendo commits con autor o dirección de correo inválidos para el repositorio remoto (sea Github, Gerrit, BitBucket o cualquier otro). En tal caso hay que arreglar todos los commits incorrectos sí o sí.

Arreglar el último commit

Esta fiesta es la más sencilla. Para arreglar el último commit basta con hacer:

git commit --amend --author "New Author Name <email@address.com>"

Arreglar varios commits o un commit antiguo

Vale. La hemos cagado. Y ahora nos encontramos con miles de líneas de código que hemos ido comiteando sin hacer push, y de pronto tenemos a git rechazando el push porque el commiter es incorrecto para el repositorio remoto, es decir, su dirección de correo  y/o autor no los reconoce.

Podríamos decirnos que estamos jodidos y tratar de endosarle el marrón a otro, pero la verdad es que el problemón tiene solución. Es un poco pesada y usa algunas cosas de git que son peligrosas (puedes cambiar el orden de los commits de todo el repo jodiendo al resto de desarrolladores de tu equipo), pero siguiendo estas instrucciones con cuidado igual salvamos el culo…

En primer lugar hay que encontrar el commit más reciente en el repositorio local anterior a todos los que tienen mal el commiter. Por ejemplo, supón el siguiente histórico:

afffg2 patxi@gmail.com
cdfg34 jorge@gmail.com
3f55a4 patxi@gmail.com
345dg8 pepito@gmail.com
658dff patxi.gortazar@gmail.com
... a partir de aquí todo ok

Supongamos que hay que apañar el mail de patxi@gmail.com y cambiarlo por patxi.gortazar@gmail.com. El commit más reciente anterior a los que tienen el email patxi@gmail.com que hay que cambiar es el 345dg8 de pepito@gmail.com.

Ahora hacemos un git rebase con este commit como referencia:

git rebase -i -p 345dg8

Se abre un editor de texto que nos muestra todos los commits desde el 345dg8 en adelante. Cada commit está en una línea y comienza por «pick». Tenemos que ver cuáles queremos cambiar y sustituir «pick» por «edit» y guardar. La cosa debería quedar tal que así:

edit afffg2 patxi@gmail.com
pick cdfg34 jorge@gmail.com
edit 3f55a4 patxi@gmail.com
pick 345dg8 pepito@gmail.com

Guardamos y salimos. Git nos informa de cómo proceder, básicamente vamos a ir avanzando haciendo commits parando en cada uno de los commits que le hemos dicho que queremos editar. Estos commits los apañaremos y seguiremos adelante con el proceso hasta el final.

Vamos paso por paso. En primer lugar, git habrá avanzado por defecto hasta el primer commit: 3f55a4. Vamos a arreglar este commit. Para ello usamos «git commit –amend» indicando el nuevo autor y correo electrónico:

git commit --amend --author "Patxi Gortázar <patxi.gortazar@gmail.com>"

Se abre un editor por si queremos cambiar el mensaje del commit. No tocamos nada, simplemente guardamos y salimos.

Ahora avanzamos hasta el siguiente commit que queremos arreglar:

git rebase --continue

Git se para en el commit afffg2. Arreglar este commit de la misma forma:

git commit --amend --author "Patxi Gortázar <patxi.gortazar@gmail.com>"

Aunque hemos arreglado todos los commits, aún le tenemos que decir a git que avance hasta el final, dejando el repo con los mismos commits que tenía antes de comenzar:


git rebase --continue

Listo. Prueba a hacer un pull (por si acaso) y un push.

EclipseGavab 2.0

EclipseGavab es una distribución de Eclipse que desarrollamos en Sidelab y venimos usando desde hace más de 5 años en la Universidad Rey Juan Carlos como el IDE de referencia en asignaturas de paradigmas y programación. El principal valor de EclipseGavab es que integra soporte para diferentes de lenguajes de programación permitiendo que los alumnos se familiaricen con un único entorno y se puedan centrar en el lenguaje concreto. En aquellos casos en que ha sido posible, incluye también los correspondientes compiladores/intérpretes/máquinas virtuales de dichos lenguajes.

Lenguajes soportados:

  • Java
  • C/C++ (en Windows incluye compilador basado en cygwin)
  • Pascal y ObjectPascal (en Windows incluye el compilador FreePascal)
  • PascalFC (incluye compilador e intérprete en Windows y Linux)
  • Ruby (en Windows incluye intérprete Ruby)
  • Haskell (en Windows incluye ghc)

Puedes descargar EclipseGavab de los siguientes enlaces:

  • EclipseGavab 2.0 Windows Installer (300Mb). Windows XP and Windows Vista installer. Requires 660 Mb.
  • EclipseGavab 2.0 tar.gz for Linux. A tar.gz Linux distribution. It requires the installation of the following tools: Java SE 6 for executing EclipseGavab and Java programming; gcc for C/C++ programming; FreePascal for Pascal programming; ghc for Haskell programming; and Ruby for Ruby programming.

En Ubuntu, los paquetes necesarios son: build-essential, fp-compiler, fp-units-base, fp-units-rtl, ghc6, ruby, sun-java6-jre, y se pueden instalar con el siguiente comando:

sudo apt-get install build-essential fp-compiler fp-units-base fp-units-rtl ghc6 ruby sun-java6-jre

[Editado el 7/2/2014]

En Ubuntu 64 bits es necesario usar una versión Java de 32 bits. En Windows esto no es necesario porque EclipseGavab lleva una versión de java de 32 bits embebida. Se puede descargar el jdk 7 de 32 bits de esta url, pulsando en «Java Download» y seleccionando después la versión «linux x86» de extensión tar.gz.

Una vez descargado Java, se descomprime (tar -xvzf jdk-7-xx.tar.gz) en el home del usuario y se edita el fichero eclipse.ini para que utilice esta versión de Java. Supongamos que la ruta es «/home/user/jdk-7-u51», el fichero eclipse.ini debe incluir las siguientes líneas inmediatamente antes de la opción «-vmargs»:

-vm
/home/user/jdk-7-u51/bin/java

Enjoy programming!

Making Of: Libro de Lenguajes y Procesadores

Como comenté en esta otra entrada, el libro de Lenguajes de Programación y Procesadores lo hemos creado con LaTeX. LaTeX es un sistema de composición de textos que a mí me vendieron (teóricamente) como «céntrate en el contenido, y olvídate del aspecto». Y digo teóricamente entre paréntesis porque la realidad nunca es tan idílica. Al final las imágenes se te van unas páginas más allá de lo que querrías, conseguir que las palabras se corten bien es un problema aparte, hay que configurar un montón de cosas para que el tamaño de página, encabezados, etc queden como tú quieres…

Además, un libro como el que nos ocupa contiene diferentes recursos: listados de código, diagramas en forma de árbol, figuras… Cada uno de estos recursos requiere importar uno o varios paquetes LaTeX y, en ocasiones, configurarlos adecuadamente. Al final, el proceso se parece bastante a programar. De hecho, utilicé Eclipse para escribir mi parte del libro, utilizando para ello el plugin Texlipse, y todo el libro se encuentra en el correspondiente proyecto de SidelabCode.

Total, que al final dejar el libro como quieres es una tarea en la que a veces hay que hilar muy fino. La parte positiva de todo esto es que me he encontrado con algunos paquetes de LaTeX que son extremadamente útiles y versátiles, y quería dejarlos aquí anotados para uso y disfrute de la comunidad.

Código fuente

La inclusión de código fuente en un libro no es algo que se pueda tomar a la ligera. Los siguientes aspectos me parecían fundamentales a la hora de insertar código en el libro:

  • La tipografía del código fuente debe ser diferente de la del resto del libro y monoespaciada.
  • Las líneas deben ir numeradas para poder hacer referencia a una línea concreta del código o a un bloque.
  • Preferiblemente el código debe tener resaltado de sintaxis.
  • A mi personalmente me gusta que el fragmento del código se separe del texto «normal» de alguna manera (por ejemplo recuadrando el código).

Evalué diferentes formas de hacer esto hasta que di con el paquete perfecto: Listings. Añadir código fuente con Listings es tan fácil como esto:


\begin{lstlisting}[style=Haskell]
suma :: Integer -> Integer -> Integer
suma x y = x + y
\end{lstlisting}

Y el resultado queda como en la imagen:

Aspecto de código Haskell usando Listings

Las palabras reservadas aparecen en negrita, el fondo es de un gris claro para distinguirlo fácilmente del resto del texto, la fuente es monoespaciada y las líneas están numeradas.

Listings trae un montón de lenguajes predefinidos y es sumamente versátil. Es posible cambiar el aspecto de prácticamente todo: comentarios, fondo, números de línea, palabras reservadas… Nosotros lo hemos utilizado para código Java, Haskell, C, Ruby, Pascal, XML, PHP, Awk, bash, Prolog y Perl. Puedes usarlo para un lenguaje que Listings no conozca. Evidentemente no reconocerá las palabras reservadas, pero al menos se mostrará con estilo de código fuente.

Árboles

En un libro donde hay un capítulo dedicado a los compiladores, abundan los árboles de análisis sintáctico. Habíamos pensado hacer estos árboles con algún programa externo, generar la imagen correspondiente y después insertar la imagen en el documento. El problema de este enfoque es que la tipografía de la imagen puede variar mucho respecto a la del texto del libro. Además, hay que tener mucho cuidado con el escalado, para que el tamaño del texto de unas figuras no difiera del de otras.

Buceando un poco por la web, vi el paquete qtree. Con este paquete es sumamente sencillo definir árboles, siempre que se tenga un poco de cuidado con el balanceado de los corchetes que sirven para delimitar los diferentes niveles. El punto indica cuál es la raiz del subárbol correspondiente:

\Tree [.S [.A a b ] [.B a b a ] ]

La sintaxis es sencilla, pero desagradable a la vista. Ahora bien los resultados son espectaculares:

Un árbol generado con Qtree

Diagramas sintácticos

Otro de los recursos que contiene el libro son diagramas sintácticos. Estos diagramas se utilizan en el Capítulo 1 y para generarlos utilizamos el paquete syntax. Syntax forma parte de mdwtools, que incluye también paquetes para formatear gramáticas BNF. He aquí un ejemplo de definición de diagrama sintáctico con syntax:

\begin{figure}
\begin{syntdiag}
<termino>
\begin{stack}\\
\begin{rep}
\begin{stack}
'+'\\
'-'
\end{stack}
<termino>
\end{rep}
\end{stack}
\end{syntdiag}
\caption{\small \emph{Diagrama sintáctico correspondiente a la gramática \ref{gram:termino}}}
\label{fig:diagrama-sintactico-termino}
\end{figure}

Y el resultado (en nuestro caso escogimos diagramas con bordes cuadrados en lugar de redondeados):

Resultado de syntax

Encabezados en versales

Esta es una de las cosas que más fastidiosa resultó. Una vez que teníamos terminado el libro, el editor, con buen criterio, nos señaló que los encabezados de los índices aparecían en mayúsculas, mientras que en el resto del libro los encabezados de las páginas aparecen en versales.

Estuve intentando cambiar el estilo de las páginas de los índices, pero no era capaz. El estilo por defecto para los capítulos no se aplicaba a los índices. Al final opté por particularizar el estilo de los capítulos para cada uno de los índices (hay un índice general, un índice de figuras y un índice de tablas):

\newcommand{\ps@indexheadings}{%
\renewcommand{\@oddhead}{% encabezamiento páginas impares %
\parbox{\textwidth}{
\hfill \textsc{Índice} \hfill \thepage}}
\renewcommand{\@evenhead}{% encabezamiento páginas pares %
\parbox{\textwidth}{
\thepage \hfill \textsc{Índice} \hspace*{\fill}}}}

Ahora, poniendo lo siguiente:

\pagestyle{indexheadings}
\tableofcontents

El encabezado del índice aparece correctamente en versales.

Bibliografía

El último de los temas (que yo recuerde) de interés en la composición del libro fue el estilo de la bibliografía. El estilo bibliográfico normal añade un and entre el penúltimo autor y el último en las publicaciones. Queríamos que apareciera un y. Intentamos cambiar al estilo castellano (con el fichero de estilo spain.bst), pero el estilo era muy diferente y no nos gustaba.

Al final opté por modificar a mano el fichero plain.bst con el estilo normal (renombrándolo) y cambiar el and por y. Sólo hay que cambiar la línea 201:

{ " y " * t * }

Os dejo el diff:

201c201
< { " and " * t * }
---
> { " y " * t * }

Y este es el resultado:

Bibliografía en castellano

Sidelab Commons

SidelabCode tiene un nuevo proyecto, liberado bajo una licencia de código abierto. Se trata de Sidelab Commons. El objetivo de Sidelab Commons es exportar pequeñas librerías de utilidad para que puedan ser utilizadas desde otros proyectos.

Para explicar en más detalle el objetivo del proyecto, aunque muchos ya habrán realizado una asociación con el proyecto Apache Commons, nos centraremos en un caso particular. En varias ocasiones nos hemos encontrado con la necesidad de invocar comandos, a través de la API Runtime (más concretamente Runtime.exec), desde java. Además, esta funcionalidad la hemos requerido desde proyectos muy diferentes:

  • En Optsicom Remote Experiment System (Optsicom RES) se utiliza para ejecutar en una máquina remota un programa Java arrancando una nueva VM.
  • En Optsicom Framework se utiliza para ejecutar un experimento en una VM diferente.
  • En Pascaline, un plugin de Eclipse para Pascal, se utiliza para invocar el compilador de FreePascal.
  • SidelabCode Stack, el instalador de la forja de SidelabCode, se utiliza para invocar apt-gets y todo tipo de comandos que permiten configurar adecuadamente los servicios de la forja.
  • En proyectos que hemos desarrollado para empresas también hemos necesitado invocar comandos externos a menudo.

El uso de Runtime.exec no es trivial. Además de las diferentes versiones disponibles, hay que tener en cuenta la captura de la salida estándar y la salida de error del proceso que se está lanzando. Normalmente, para cerciorarnos de que el proceso ha terminado correctamente es necesario:

  • Al terminar el proceso comprobar el código de salida
  • Recuperar la salida estándar
  • Recuperar la salida de error

La recuperación de las salidas del proceso requiere la creación de un hilo para la salida estándar y otro para la salida de error que consumen los datos de los respectivos InputStreams hasta que el proceso los cierra. Básicamente, el código tiene este aspecto:

new Runnable() {
  public void run() {
    try {
      byte[] buffer = new byte[1024];
      int leidos = 0;
      while ((leidos = System.in.read(buffer)) != 0) {
        out.write(buffer, 0, leidos);
      }
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }
}

Como esto es tedioso de hacer cada vez, en su día lo factorizamos en una pequeña librería que llamamos commandline. Ahora, hemos abierto el proyecto Sidelab Commons para alojar este tipo de recursos. Actualmente, cualquier proyecto puede hacer uso de commandline, y obtener de forma sencilla la salida de un proceso:

CommandLine cl = new CommandLine(); // Opcionalmente podríamos especificar el dir de trabajo en el constructor.
CommandOutput co = cl.syncExec("tail /etc/apache2/sites-enabled/default");
System.out.println(co.getStandardOutput());
System.out.println(co.getErrorOutput());

Puedes descargar commandline o añadirlo como dependencia a tu pom. Echa un vistazo a nuestro archiva.

Por cierto, recuerda que cuando invocas comandos desde Java, no estás ejecutando el comando dentro de una shell, y por tanto no funcionan los wildcards (cosas como ls *.java). Si necesitas realmente ejecutar tu comando desde una shell para que te interprete adecuadamente este tipo de comodines usa bash -c ‘ls *.java’ o mira la documentación de la shell que soporte tu sistema. Nosotros, por ejemplo, hemos tenido problemas ejecutando un proceso en Windows y tuvimos que utilizar «cmd /c» para correrlo dentro de la shell de Windows en modo no interactivo. Puedes echar un vistazo a esto en el proyecto Pascaline.

Jenkins, Subversion y los certificados SSL

Trando de automatizar la release de un proyecto Maven, nos hemos encontrado con un problema con los certificados y Subversion. El problema es que Subversion no acepta el certificado de SidelabCode. Concretamente el error es el siguiente:

Error validating server certificate for 'https://code.sidelab.es:443':
- The certificate is not issued by a trusted authority. Use the
fingerprint to validate the certificate manually!
Certificate information:
- Hostname: code.sidelab.es
- Valid: from Fri, 09 Sep 2011 13:42:29 GMT until Mon, 06 Sep 2021 13:42:29 GMT
- Issuer: Web, Sidelab, ES, Madrid
- Fingerprint: 59:6f:56:07:f5:a8:bf:fe:7a:57:75:37:a8:57:76:8c:0f:9f:6f:9d
(R)eject, accept (t)emporarily or accept (p)ermanently? svn: Commit failed (details follow):
svn: OPTIONS of 'https://code.sidelab.es/svn/optsicomres/res/trunk': Server certificate verification failed: issuer is not trusted (https://code.sidelab.es)
Error validating server certificate for 'https://code.sidelab.es:443':
- The certificate is not issued by a trusted authority. Use the
fingerprint to validate the certificate manually!
Certificate information:
- Hostname: code.sidelab.es
- Valid: from Fri, 09 Sep 2011 13:42:29 GMT until Mon, 06 Sep 2021 13:42:29 GMT
- Issuer: Web, Sidelab, ES, Madrid
- Fingerprint: 59:6f:56:07:f5:a8:bf:fe:7a:57:75:37:a8:57:76:8c:0f:9f:6f:9d
(R)eject, accept (t)emporarily or accept (p)ermanently? svn: OPTIONS of 'https://code.sidelab.es/svn/optsicomres/res': Server certificate verification failed: issuer is not trusted (https://code.sidelab.es)

En principio el problema se soluciona accediendo a la máquina y haciendo cualquier operación a mano con subversion desde el mismo usuario con el que se ejecuta svn desde Jenkins. Sin embargo, la cosa no es tan sencilla en ocasiones, porque es posible que no podamos utilizar directamente el usuario para esto de forma interactiva. Esto se da cuando el usuario que ejecuta Jenkins es un usuario sin login como por ejemplo el usuario tomcat o www-data. Así que voy a dejar aquí un método genérico que debería funcionar en (casi) cualquier caso:

  • Conéctate a la máquina con un usuario cualquiera.
  • Ejecuta alguna operación sobre el repositorio, por ejemplo svn info https://miservidor/path/repo.
  • Acepta permanentemente el certificado pulsando «p».
  • Copia el fichero generado en la carpeta .subversion/auth/svn.ssl.servers/ dentro del home del usuario a la misma estructura de carpetas dentro del home del usuario con el que se ejecuta Jenkins.

Con este mecanismo he sido capaz de solucionar el problema, y ahora se pueden hacer commits y cualquier tipo de operación sobre el repositorio de forma automática desde Jenkins sin problemas.

Sidelab colabora con los campeonatos del mundo de ultraligeros y paramotor

Sidelab es entidad colaboradora de los Campeonatos del Mundo de Ultraligeros y Paramotor que se celebrarán en Marugán, Segovia. El Campeonato del Mundo de Ultraligeros tendrá lugar entre el 7 y el 18 de agosto de 2012, y el Campeonato del Mundo de Paramotor se celebrará entre el 21 de agosto y el 1 de septiembre.

Microlight Championship

Hace unos meses un antiguo compañero que estuvo dando clases aquí en la universidad nos pidió un poco de soporte de IT para la gestión de los campeonatos del mundo de ultraligeros y paramotor 2012, que le había tocado organizar este año. Básicamente, necesitaban un proyecto en SidelabCode (la forja de Sidelab) para gestionarse ellos internamente y organizar el campeonato. Pues nada, les creamos el proyecto y les dimos soporte.

Campeonato del Mundo de Paramotor

Sidelab, sponsor del evento

Parece que la cosa les ha ido bien, y además al comité organizador le ha gustado la experiencia de usar Redmine (el sistema de gestión de proyectos que tenemos en SidelabCode). Como agradecimiento, aparecemos entre los sponsors del evento. La verdad es que la experiencia ha estado muy bien, y esperamos que los campeonatos vayan aún mejor.

La colaboración no se ha terminado, porque están tratando de gestionar el campeonato (equipos, puntuaciones, reclamaciones, etc.) a través de una web montada con Drupal detrás, donde estamos hemos dado un poco de asistencia también, desde nuestra experiencia de varios años trabajando con este CMS.

Libro de Lenguajes de Programación y Procesadores

Cuando comencé mi andadura en la universidad, me ofrecieron escoger entre dar dos asignaturas: Web para Usuarios y Procesadores de Lenguajes. Web para Usuarios era una asignatura de libre elección de los planes de estudio de Ingeniería Química, Ciencias Ambientales y otras afines. Procesadores de Lenguajes era una asignatura troncal de cuarto curso de Ingeniería Informática, y para muchos, entre los que me incluyo, el monstruo de las galletas del ciclo superior. Bueno, pues me metí de lleno con Procesadores de Lenguajes, y estuve dos años impartiendo la parte de análisis semántico y un tercero dando la parte de análisis sintáctico.

Posteriormente, cambié mi docencia por motivos varios (incluyendo un cambio de departamento), y acabé dando diferentes paradigmas en una asignatura que se llamaba Lenguajes Informáticos. Me encantó dar esta asignatura, donde veíamos, organizados en tres módulos, programación concurrente, programación funcional y lenguajes dinámicos. Actualmente, imparto parte de esta docencia en una asignatura de grado denominada Lenguajes de Programación. Lo interesante de la asignatura de Lenguajes Informáticos es que me permitió dar un buen repaso, con la excusa de los lenguajes dinámicos, a las diferencias entre compiladores/intérpretes/máquinas virtuales, y presentar de forma introductoria todo el tema de los compiladores Just in Time.

Siempre había pensado que estaría bien escribir un libro sobre paradigmas, con una visión general de cada uno de ellos, ejercicios que pusieran de manifiesto las principales diferencias y las diferentes formas de resolver el mismo problema, etc. La oportunidad me llegó de casualidad cuando, en enero de 2011, Raquel Martínez, profesora de la Universidad Nacional de Educación a Distancia, me llamó para proponerme participar en la redacción de un libro para una asignatura que ella iba a impartir en el curso 2011-2012. Me comentó que la asignatura debía cubrir tanto la parte de procesadores de lenguajes como la parte de paradigmas.

El resultado es el libro «Lenguajes de Programación y Procesadores«, de la editorial Ramón Areces, que es la referencia bibliográfica básica de la asignatura del mismo nombre del grado de Ingeniería en Tecnología de la Información. El libro, escrito por Raquel Martínez, Víctor Fresno y un servidor, se presenta una introducción al procesamiento de lenguajes, incluyendo un Tema 2 que profundiza un poco en el tema del análisis sintáctico ascendente y descendente; una panorámica general de diferentes paradigmas de programación (lógico, funcional, orientado a objetos y concurrente); se dedica un tema a los lenguajes de marcado (principalmente XML); y finalmente, hay un capítulo dedicado a los lenguajes de script, o lenguajes dinámicos.

No sé cómo se estará vendiendo el libro, que cuesta 36,10€ en El Corte Inglés, pero la editorial nos acaba de contactar por si queremos preparar la segunda edición de cara a publicarla para el curso académico 2012-2013. Así que ahí seguimos, a vueltas con el libro, corrigiendo las erratas que han detectado los estudiantes más aplicados de este año.

Como no podía faltar un toque tecnológico en este tema, me siento obligado a comentar que el libro está escrito en LaTeX de pe a pa. La composición final la he centralizado yo, y para ello he utilizado Texlipse, un plugin de LaTeX para Eclipse. Tengo el libro en un proyecto en SidelabCode, subido en un repositorio svn. Cada nueva versión que nos intercambiamos lleva asociada la creación de un tag en el repositorio para poder recuperar en cualquier momento una versión concreta del libro.

La edición del libro con LaTeX merece una entrada aparte, pero baste decir que hemos penado un poco con el tema de los listados de código (aunque ha quedado al final muy bien) y algunos detalles que, aunque parecen nimios, imposiciones de la editorial nos han obligado a dedicarles un esfuerzo considerable.

Panic mode: Apache no reinicia!


Hay muchos problemas que pueden llevarte a que no puedas iniciar Apache una vez que se te ha caído. Pero me parece interesante comentar aquí uno de estos problemas porque nos ha traído bastante de cabeza este último par de días.

Un poquito de contexto: tenemos un instalador en Java que te instala en la máquina SidelabCode Stack, la forja de desarrollo software de Sidelab de la que puedes ver un ejemplo funcionando aquí. Este instalador se encarga de montar toda la forja sobre una Ubuntu 10.04 (estamos actualizando a 12.04, pero antes queremos estabilizar el instalador). Entre otras cosas, el instalador monta Apache con módulos para php, svn, y otras cosillas. Para el caso que nos ocupa, lo que nos interesa es que el instalador configura la forja según se indica en un fichero de configuración. Ese fichero contiene, entre otras cosas, las IPs donde hay que poner a escuchar a Apache.

Y aquí viene el problema. El instalador, por su cuenta y riesgo, añade en /etc/hosts lo siguiente siempre:

Listen 127.0.0.1:80

Entonces, si en el fichero de configuración le indicamos como IP pública del servicio 127.0.0.1, acabamos con dos líneas iguales:


Listen 127.0.0.1:80
Listen 127.0.0.1:80

Y Apache nos escupe este bonito mensaje de error, donde no sabes si los palos te vienen por el binding al puerto 80, por los permisos para acceder a los logs, o por cualquier otra razón…


httpd not running, trying to start
(98)Address already in use: make_sock: could not bind to address 127.0.0.1:80
no listening sockets available, shutting down
Unable to open logs

El problema es que intenta atarse dos veces al puerto 80 en 127.0.0.1, fallando la segunda vez, lo que produce como resultado que termine el proceso completamente. En el caso de nuestro instalador, la solución pasa por comprobar que la IP que te configuran no es la 127.0.0.1, para evitar poner dos veces la misma combinación de IP y puerto en el fichero.

Jornada de presentación de trabajos fin de grado

Este año es el primero que se ofertan Trabajos Fin de Grado en la Universidad Rey Juan Carlos. Las cosas han cambiado un poco respecto a lo que era el Proyecto Fin de Carrera en las titulaciones del antiguo plan de estudios. Uno de los cambios principales es que hay que hacer una oferta oficial de TFGs por parte de los profesores a través de una aplicación corporativa, y los alumnos a su vez tienen que «apuntarse» en las ofertas que más les atraigan.

Como consecuencia, esto ha traído un continuado goteo de emails de alumnos pidiendo reuniones con nosotros para informarse de los TFGs que tanto Mica como yo hemos ofertado a través de la herramienta a la que me refería antes. Para facilitar un poco las cosas (en la medida en que podemos hacerlo), hemos decidido hacer una presentación conjunta de los proyectos que ambos hemos propuesto. Puedes ver las ofertas, y una breve descripción (que sabemos que no tenéis disponible en la herramienta), en esta página web en el wiki de Sidelab.

Además, hablaremos también de la normativa relativa al Trabajo Fin de Grado, tratando de aclarar algunos puntos al respecto. Mica se ha currado un breve resumen que va directamente al grano al que quizá te interese echar un vistazo. Hay cosas que aún están por decidir desde la escuela (como la forma de defensa de las prácticas, si se podrá presentar el proyecto en cualquier momento del curso académico, etc), pero daremos toda la información de la que dispongamos.

Así que ya lo sabes, si quieres enterarte de qué van esas propuestas de TFGs que te intrigan, vente el jueves 24 de mayo, a las 17:30 a la presentación de ofertas de TFGs de Sidelab, en el seminario 270 del edificio Departamental II (según se sube a la izquierda).

Te esperamos.